[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <CACRpkdYDMRZMb+bDUgK5yiKU1Toy=S_ebo2_4WRasHxCqv+4xw@mail.gmail.com>
Date: Thu, 9 Oct 2025 08:03:23 +0200
From: Linus Walleij <linus.walleij@...aro.org>
To: Francesco Lavra <flavra@...libre.com>, Hugo Villeneuve <hvilleneuve@...onoff.com>,
Maria Garcia <mariagarcia7293@...il.com>, Sascha Hauer <s.hauer@...gutronix.de>,
Emanuele Ghidoli <emanuele.ghidoli@...adex.com>, Potin Lai <potin.lai.pt@...il.com>,
Mark Tomlinson <mark.tomlinson@...iedtelesis.co.nz>, Fabio Estevam <festevam@...x.de>,
Ian Ray <ian.ray@...ealthcare.com>, Martyn Welch <martyn.welch@...labora.com>
Cc: Bartosz Golaszewski <brgl@...ev.pl>, linux-gpio@...r.kernel.org, linux-kernel@...r.kernel.org
Subject: Re: [PATCH] gpio: pca953x: enable latch only on edge-triggered inputs
Hi Francesco,
thanks for your patch!
On Wed, Oct 8, 2025 at 12:43 PM Francesco Lavra <flavra@...libre.com> wrote:
> The latched input feature of the pca953x GPIO controller is useful
> when an input is configured to trigger interrupts on rising or
> falling edges, because it allows retrieving which edge type caused
> a given interrupt even if the pin state changes again before the
> interrupt handler has a chance to run. But for level-triggered
> interrupts, reading the latched input state can cause an active
> interrupt condition to be missed, e.g. if an active-low signal (for
> which an IRQ_TYPE_LEVEL_LOW interrupt has been configured) triggers
> an interrupt when switching to the inactive state, but then becomes
> active again before the interrupt handler has a chance to run: in
> this case, if the interrupt handler reads the latched input state,
> it will wrongly assume that the interrupt is not pending.
> Fix the above issue by enabling the latch only on edge-triggered
> inputs, instead of all interrupt-enabled inputs.
>
> Signed-off-by: Francesco Lavra <flavra@...libre.com>
> ---
> drivers/gpio/gpio-pca953x.c | 7 +++++--
> 1 file changed, 5 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpio/gpio-pca953x.c b/drivers/gpio/gpio-pca953x.c
> index e80a96f39788..e87ef2c3ff82 100644
> --- a/drivers/gpio/gpio-pca953x.c
> +++ b/drivers/gpio/gpio-pca953x.c
> @@ -761,10 +761,13 @@ static void pca953x_irq_bus_sync_unlock(struct irq_data *d)
> int level;
>
> if (chip->driver_data & PCA_PCAL) {
> + DECLARE_BITMAP(latched_inputs, MAX_LINE);
> guard(mutex)(&chip->i2c_lock);
>
> - /* Enable latch on interrupt-enabled inputs */
> - pca953x_write_regs(chip, PCAL953X_IN_LATCH, chip->irq_mask);
> + /* Enable latch on edge-triggered interrupt-enabled inputs */
> + bitmap_or(latched_inputs, chip->irq_trig_fall, chip->irq_trig_raise, gc->ngpio);
> + bitmap_and(latched_inputs, latched_inputs, chip->irq_mask, gc->ngpio);
> + pca953x_write_regs(chip, PCAL953X_IN_LATCH, latched_inputs);
This driver is used by a *lot* of systems and people.
It is maybe the most used GPIO driver in the kernel.
So I added a lot of affected developers to the To: line of
the mail so we can get a wider review and testing.
Yours,
Linus Walleij
Powered by blists - more mailing lists