Re: [PATCH 2/8] gpio: zynq: Wakeup gpio controller when it is used as IRQ controller
From: Linus Walleij <hidden>
Date: 2017-08-22 12:58:03
Also in:
linux-arm-kernel, lkml
On Mon, Aug 14, 2017 at 4:33 PM, Michal Simek [off-list ref] wrote:
I have checked 4.13-rc1 and none is doing anything with clock in these irq routines. It means it is a question if they have the same issue when device is sleeping or we do something wrong.
No but they may get in the future and new drivers may have the issue.
It is not a problem to move these calls to core (patch is quite simple) but validate that if this is correct on others SoC. Do you know if we can validate this on different SoC?
pm_runtime_get() etc are only utilized if the driver explicitly enable runtime PM, and if they do, they should have their semantics right for this or their code would be broken severely.
quoted hunk ↗ jump to hunk
diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index 9568708a550b..a08a044fa4aa 100644 --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c@@ -1647,14 +1647,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; }@@ -1666,6 +1674,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);
This looks fine, I'm happy to apply that early for v4.15 after the merge window (now it is a bit late for radical changes). Yours, Linus Walleij