Re: [PATCH 1/4] gpio: gpiolib: Allow GPIO IRQs to lazy disable

From: Maulik Shah
Date: Sat May 23 2020 - 13:07:34 EST


Hi,

On 5/23/2020 3:12 PM, Marc Zyngier wrote:
On 2020-05-22 14:19, Maulik Shah wrote:
With 'commit 461c1a7d4733 ("gpiolib: override irq_enable/disable")' gpiolib
overrides irqchip's irq_enable and irq_disable callbacks. If irq_disable
callback is implemented then genirq takes unlazy path to disable irq.

Underlying irqchip may not want to implement irq_disable callback to lazy
disable irq when client drivers invokes disable_irq(). By overriding
irq_disable callback, gpiolib ends up always unlazy disabling IRQ.

Allow gpiolib to lazy disable IRQs by overriding irq_disable callback only
if irqchip implemented irq_disable. In cases where irq_disable is not
implemented irq_mask is overridden. Similarly override irq_enable callback
only if irqchip implemented irq_enable otherwise irq_unmask is overridden.

Fixes: 461c1a7d47 (gpiolib: override irq_enable/disable)
Signed-off-by: Maulik Shah <mkshah@xxxxxxxxxxxxxx>
---
Âdrivers/gpio/gpiolib.cÂÂÂÂÂ | 59 +++++++++++++++++++++++++++++----------------
Âinclude/linux/gpio/driver.h | 13 ++++++++++
Â2 files changed, 51 insertions(+), 21 deletions(-)

diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
index eaa0e20..a8fdc74 100644
--- a/drivers/gpio/gpiolib.c
+++ b/drivers/gpio/gpiolib.c
@@ -2465,33 +2465,38 @@ static void gpiochip_irq_relres(struct irq_data *d)
ÂÂÂÂ gpiochip_relres_irq(gc, d->hwirq);
Â}

+static void gpiochip_irq_mask(struct irq_data *d)
+{
+ÂÂÂ struct gpio_chip *chip = irq_data_get_irq_chip_data(d);
+
+ÂÂÂ if (chip->irq.irq_mask)
+ÂÂÂÂÂÂÂ chip->irq.irq_mask(d);
+ÂÂÂ gpiochip_disable_irq(chip, d->hwirq);
+}
+
+static void gpiochip_irq_unmask(struct irq_data *d)
+{
+ÂÂÂ struct gpio_chip *chip = irq_data_get_irq_chip_data(d);
+
+ÂÂÂ gpiochip_enable_irq(chip, d->hwirq);
+ÂÂÂ if (chip->irq.irq_unmask)
+ÂÂÂÂÂÂÂ chip->irq.irq_unmask(d);
+}
+
Âstatic void gpiochip_irq_enable(struct irq_data *d)
Â{
ÂÂÂÂ struct gpio_chip *gc = irq_data_get_irq_chip_data(d);

-ÂÂÂ gpiochip_enable_irq(gc, d->hwirq);
-ÂÂÂ if (gc->irq.irq_enable)
-ÂÂÂÂÂÂÂ gc->irq.irq_enable(d);
-ÂÂÂ else
-ÂÂÂÂÂÂÂ gc->irq.chip->irq_unmask(d);
+ÂÂÂ gpiochip_enable_irq(chip, d->hwirq);

You really never compiled this, did you?

I've stopped looking at this. Please send something that you will have actually tested.

ÂÂÂÂÂÂÂ M.

Apologies.

I did tested out on internal devices based on kernel 5.4 as well as linux-next with sc7180.

While posting i somehow taken patch from kernel 5.4 and messed up this patch during merge conflicts.

I fixed this in v2 and posted out changes that cleanly applies on latest linux-next tag (next-20200521).

Thanks,
Maulik

--
QUALCOMM INDIA, on behalf of Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by The Linux Foundation