From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751484AbdITUHl (ORCPT ); Wed, 20 Sep 2017 16:07:41 -0400 Received: from lelnx193.ext.ti.com ([198.47.27.77]:24998 "EHLO lelnx193.ext.ti.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750895AbdITUHj (ORCPT ); Wed, 20 Sep 2017 16:07:39 -0400 Subject: Re: [PATCH] gpio: Wakeup gpio controller when it is used as IRQ controller To: Michal Simek , , CC: Borsodi Petr , Linus Walleij , , Jon Hunter References: <09258550e475aa7135db7b91bb96deeaf900f8c2.1505891674.git.michal.simek@xilinx.com> From: Grygorii Strashko Message-ID: <2cf9c866-5ace-b056-c80b-a7354fb951fc@ti.com> Date: Wed, 20 Sep 2017 15:07:17 -0500 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.3.0 MIME-Version: 1.0 In-Reply-To: <09258550e475aa7135db7b91bb96deeaf900f8c2.1505891674.git.michal.simek@xilinx.com> Content-Type: text/plain; charset="utf-8" Content-Language: en-US Content-Transfer-Encoding: 7bit X-Originating-IP: [128.247.59.147] Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 09/20/2017 02:14 AM, Michal Simek wrote: > From: Borsodi Petr > > There is a problem with GPIO driver when used as IRQ controller. > It is not working because the module is sleeping (clock is disabled). > The patch enables clocks when IP is used as IRQ controller. I think, it should be solved already in genirq core. commit be45beb "genirq: Add runtime power management support for IRQ chips" > > Signed-off-by: Borsodi Petr > Signed-off-by: Michal Simek > --- > > Based on discussion with Linus here https://lkml.org/lkml/2017/8/22/400 > --- > drivers/gpio/gpiolib.c | 9 +++++++++ > 1 file changed, 9 insertions(+) > > diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c > index eb80dac4e26a..17258ad1fadb 100644 > --- a/drivers/gpio/gpiolib.c > +++ b/drivers/gpio/gpiolib.c > @@ -1676,14 +1676,22 @@ static void gpiochip_irq_unmap(struct irq_domain *d, unsigned int irq) > static int gpiochip_irq_reqres(struct irq_data *d) > { > struct gpio_chip *chip = irq_data_get_irq_chip_data(d); > + int ret; > > if (!try_module_get(chip->gpiodev->owner)) > return -ENODEV; > > + ret = pm_runtime_get_sync(chip->parent); > + if (ret < 0) { > + module_put(chip->gpiodev->owner); > + return ret; > + } > + > if (gpiochip_lock_as_irq(chip, d->hwirq)) { > chip_err(chip, > "unable to lock HW IRQ %lu for IRQ\n", > d->hwirq); > + pm_runtime_put(chip->parent); > module_put(chip->gpiodev->owner); > return -EINVAL; > } > @@ -1695,6 +1703,7 @@ static void gpiochip_irq_relres(struct irq_data *d) > struct gpio_chip *chip = irq_data_get_irq_chip_data(d); > > gpiochip_unlock_as_irq(chip, d->hwirq); > + pm_runtime_put(chip->parent); > module_put(chip->gpiodev->owner); > } > > -- regards, -grygorii