[PATCH v7 2/4] gpio: mxc: fix both_edges bit operations
Linus Walleij
linusw at kernel.org
Tue Oct 13 09:52:27 PDT 2026
On Tue, Oct 13, 2026 at 8:04 AM Peng Fan (OSS) <peng.fan at oss.nxp.com> wrote:
> From: Peng Fan <peng.fan at nxp.com>
>
> gpio_set_irq_type() can be called concurrently for different pins on
> the same port. The IRQ core serializes per irq descriptor, but
> different pins have different descriptors, so on SMP systems two
> concurrent gpio_set_irq_type() calls for pins on the same port run
> without mutual exclusion.
>
> The read-modify-write of port->both_edges is performed outside the
> port-wide scoped_guard(gpio_generic_lock_irqsave) section, so
> concurrent updates for different pins can overwrite each other,
> causing missed interrupts or stuck IRQ lines on dual-edge triggered
> pins.
>
> The original uniprocessor MXC SoCs were not affected; the race
> became reachable on multi-core i.MX7 and i.MX8 SoCs that reuse this
> driver.
>
> Convert both_edges from u32 to unsigned long and use set_bit(),
> clear_bit(), and test_bit() to make the modifications atomic.
>
> Fixes: 910862ec092c ("mxc: emulate GPIO interrupt on both-edges")
> Reviewed-by: Frank Li <Frank.Li at nxp.com>
> Signed-off-by: Peng Fan <peng.fan at nxp.com>
Reviewed-by: Linus Walleij <linusw at kernel.org>
Yours,
Linus Walleij
More information about the linux-arm-kernel
mailing list