Messages in this thread | | | Subject | Re: [PATCH 1/4] gpio: gpiolib: Allow GPIO IRQs to lazy disable | From | Maulik Shah <> | Date | Sat, 23 May 2020 22:36:51 +0530 |
| |
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@codeaurora.org> >> --- >> 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
| |