From patchwork Fri Mar 6 19:26:57 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: grygorii.strashko@linaro.org X-Patchwork-Id: 447416 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 35BED1400A0 for ; Sat, 7 Mar 2015 06:27:13 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755698AbbCFT1L (ORCPT ); Fri, 6 Mar 2015 14:27:11 -0500 Received: from mail-la0-f41.google.com ([209.85.215.41]:34840 "EHLO mail-la0-f41.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755913AbbCFT1J (ORCPT ); Fri, 6 Mar 2015 14:27:09 -0500 Received: by labmn12 with SMTP id mn12so23442952lab.2 for ; Fri, 06 Mar 2015 11:27:08 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=E3jLQKxKhOgyF0xcdZ1EM/t+kyeYG/8BtaehBrCEs/8=; b=TRyAdMhyVbIkhslwA+8EiN/Ap48Mpf/gCYuT2VnsoFqzFlmA4Q0bcRbmrFZcIt0UrW uLgQb7L9FF5r7CzUQwDwTF2BzwyxjeBGs2K8xYgopc8AGXWVZ3MgAeEkdGlPfSs2PkxG EgxEuYKorxWUqwW/oO5GE3KPkydOO+SNMvpTHwebMIrHLIRvpo7r0vAmOa1OyvwuhyjA kPVJAZqLHNgCa+txROZSZoV9+CUdqXpTeWQ6Db78l7EyYdGmPIlP30f/4bKQzTh/Q1pL IKGGX1hQPn/kzbD5e0Det4//3vSOuwzF52pwrBe1On1tnUIfVETdWEbm3OflQRMbksrt HUBQ== X-Gm-Message-State: ALoCoQl8hJM0biNWB0H6Llh0W2759ciUc3NcAPAgTQeZ7RkNrQ8fj/f77Y0/8P9cbMRSnOwd8s51 X-Received: by 10.152.182.196 with SMTP id eg4mr14406673lac.70.1425670027981; Fri, 06 Mar 2015 11:27:07 -0800 (PST) Received: from localhost ([195.238.92.128]) by mx.google.com with ESMTPSA id lf3sm1972252lbc.2.2015.03.06.11.27.07 (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Fri, 06 Mar 2015 11:27:07 -0800 (PST) From: To: Linus Walleij , ssantosh@kernel.org, Javier Martinez Canillas , tony@atomide.com Cc: Alexandre Courbot , linux-omap@vger.kernel.org, linux-gpio@vger.kernel.org, Grygorii Strashko Subject: [RFC/RFT PATCH 2/2] gpio: omap: ensure that runtime pm will disable unused gpio banks Date: Fri, 6 Mar 2015 21:26:57 +0200 Message-Id: <1425670017-19598-2-git-send-email-grygorii.strashko@linaro.org> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1425670017-19598-1-git-send-email-grygorii.strashko@linaro.org> References: <1425670017-19598-1-git-send-email-grygorii.strashko@linaro.org> Sender: linux-gpio-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-gpio@vger.kernel.org From: Grygorii Strashko Now there are two points related to Runtime PM usage: 1) bank state doesn't need to be checked in places where Rintime PM is used, bacause Runtime PM maintains its own usage counter: if (!BANK_USED(bank)) pm_runtime_get_sync(bank->dev); so, it's safe to drop such checks. 2) There is a call of pm_runtime_get_sync() in omap_gpio_irq_type(), but no corresponding put. As result, GPIO devices could be powered on forever if at least one GPIO was used as IRQ. Hence, allow powering off GPIO banks by adding missed pm_runtime_put(bank->dev) at the end of omap_gpio_irq_type(). Signed-off-by: Grygorii Strashko --- drivers/gpio/gpio-omap.c | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c index 2b2fc4b..b1176c5 100644 --- a/drivers/gpio/gpio-omap.c +++ b/drivers/gpio/gpio-omap.c @@ -497,8 +497,7 @@ static int omap_gpio_irq_type(struct irq_data *d, unsigned type) unsigned long flags; unsigned offset; - if (!BANK_USED(bank)) - pm_runtime_get_sync(bank->dev); + pm_runtime_get_sync(bank->dev); #ifdef CONFIG_ARCH_OMAP1 if (d->irq > IH_MPUIO_BASE) @@ -530,6 +529,8 @@ static int omap_gpio_irq_type(struct irq_data *d, unsigned type) else if (type & (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING)) __irq_set_handler_locked(d->irq, handle_edge_irq); + pm_runtime_put(bank->dev); + return retval; } @@ -680,8 +681,7 @@ static int omap_gpio_request(struct gpio_chip *chip, unsigned offset) * If this is the first gpio_request for the bank, * enable the bank module. */ - if (!BANK_USED(bank)) - pm_runtime_get_sync(bank->dev); + pm_runtime_get_sync(bank->dev); spin_lock_irqsave(&bank->lock, flags); /* Set trigger to none. You need to enable the desired trigger with @@ -713,8 +713,7 @@ static void omap_gpio_free(struct gpio_chip *chip, unsigned offset) * If this is the last gpio to be freed in the bank, * disable the bank module. */ - if (!BANK_USED(bank)) - pm_runtime_put(bank->dev); + pm_runtime_put(bank->dev); } /* @@ -807,8 +806,7 @@ static unsigned int omap_gpio_irq_startup(struct irq_data *d) unsigned long flags; unsigned offset = GPIO_INDEX(bank, gpio); - if (!BANK_USED(bank)) - pm_runtime_get_sync(bank->dev); + pm_runtime_get_sync(bank->dev); spin_lock_irqsave(&bank->lock, flags); omap_gpio_init_irq(bank, gpio, offset); @@ -835,8 +833,7 @@ static void omap_gpio_irq_shutdown(struct irq_data *d) * If this is the last IRQ to be freed in the bank, * disable the bank module. */ - if (!BANK_USED(bank)) - pm_runtime_put(bank->dev); + pm_runtime_put(bank->dev); } static void omap_gpio_ack_irq(struct irq_data *d)