[PATCH v7 0/4] gpio: mxc: misc bug fixes
Peng Fan (OSS)
peng.fan at oss.nxp.com
Mon Oct 12 23:01:08 PDT 2026
This is a subset focusing on bug fixes, that separated from thread [1]
1. Fix a race where the chained IRQ handler is installed before the IRQ
domain, generic IRQ chip, and port list entry are ready. An interrupt
arriving in that window dereferences port->domain while still NULL
(mx3 path) or walks an incomplete list (mx2 path). Move the handler
install after all dependencies are set up.
2. Fix non-atomic read-modify-write on both_edges. gpio_set_irq_type()
can run concurrently for different pins on the same port (different
irq descriptors = different locks), so the old |=/&= on a u32 is a
data race on SMP. Switch to set_bit()/clear_bit()/test_bit() on
unsigned long.
3. Fix non-atomic read-modify-write on wakeup_pads, same class of bug
as both_edges. Switch to assign_bit() on unsigned long. Also fix
the bit being updated unconditionally even when irq_set_irq_wake()
fails.
4. Fix a race where devm_gpiochip_add_data() makes the chip visible
to consumers before the IRQ domain and generic irq chip are set up.
A to_irq() call in that window hits a NULL port->domain. Move
gpiochip registration after IRQ setup is complete.
[1] https://lore.kernel.org/linux-gpio/20261011-gpio-mxc-cleanup-v6-0-cb47ce2ad758@nxp.com/T/#m49d6a5a14a64774eda299bb711c8d316681e652b
Signed-off-by: Peng Fan <peng.fan at nxp.com>
---
Changes in v7:
- Only keep four bug fixes, split cleanup patches into a separate series.
- New patch 4: fix race between gpiochip registration and IRQ domain
setup by moving devm_gpiochip_add_data() after the IRQ domain and
generic irq chip are fully initialized.
- Patch 3: rewrite commit message to clarify the writer-vs-writer race
and explain that reader-side atomicity is not needed (Andy Shevchenko).
- Link to v6: https://patch.msgid.link/20261011-gpio-mxc-cleanup-v6-0-cb47ce2ad758@nxp.com
Changes in v6:
- Patch 9: use retain_and_null_ptr() instead of no_free_ptr() to disarm
the pm_runtime cleanup guard, as the return value is unused (Frank Li).
- Minor commit message rewording for patches 10-12.
- Collect R-b from Frank Li.
- Link to v5: https://patch.msgid.link/20261010-gpio-mxc-cleanup-v5-0-1e59e6ddfa00@nxp.com
Changes in v5:
- New patch 2: fix both_edges race using atomic bitops (set_bit/
clear_bit/test_bit), prompted by review feedback on the BIT() patch.
- Patch 3 (wakeup_pads fix): split the irq_set_irq_wake()
consolidation and for_each_set_bit() conversion into separate cleanup
patches (4-5) for bisectability.
- Patch 7 (pad wakeup hwdata): renamed MXC_GPIO_IS_IMX8QM to
MXC_GPIO_FALL_EDGE_WAKEUP_BROKEN to describe the property, not the
SoC.
- Patch 9 (new): use __free cleanup guard for pm_runtime_get_noresume()
balance instead of devm_pm_runtime_get_noresume(), which would cause a
usage counter underflow on unbind due to the double put (devres +
success-path pm_runtime_put_autosuspend).
- Patch 10 (devres): dropped devm_pm_runtime_get_noresume(); the __free
guard from patch 9 handles the usage counter balance. Fixed stale
&pdev->dev references that should use the local dev variable.
- Patch 11 (dev_err_probe): fixed &pdev->dev references to use dev.
- Reordered series: moved "use local dev variable" before the devres
and dev_err_probe patches so the local variable is available.
- Link to v4: https://patch.msgid.link/20261007-gpio-mxc-cleanup-v4-0-c9f5a8b50df9@nxp.com
Changes in v4:
- Just a resend of V3 with below changes.
Add R-b from Linus for patch 10.
Update commit for patch 2 and drop empty line and separate
for_each_set_bit changes into a new patch Per Andy.
- Link to v3: https://lore.kernel.org/all/20261006-gpio-mxc-cleanup-v3-0-129f93302a90@nxp.com/
Changes in v3:
- Patch ("gpio: mxc: convert probe error handling to devres"):
Replaced pm_runtime_get_noresume() with
devm_pm_runtime_get_noresume() to fix a PM usage counter leak on
probe error paths. The non-devm pm_runtime_get_noresume() was not
balanced by any devres action, so any probe failure after the PM
block (e.g. -EPROBE_DEFER from devm_gpiochip_add_data()) would
leave usage_count permanently elevated, preventing runtime suspend
on re-probe.
Dropped the explicit pm_runtime_put_noidle() on
devm_pm_runtime_set_active_enabled() failure - the devres
registered by devm_pm_runtime_get_noresume() handles the balance
automatically during probe unwind.
- Patch ("gpio: mxc: use local dev variable"):
Keep of_device_is_compatible(), only focus on switching &pdev->dev to
dev.
- Link to v2: https://patch.msgid.link/20261005-gpio-mxc-cleanup-v2-0-bdc3afbb35e2@nxp.com
Changes in V2:
- Reworked compatible-string caching (V1 patch 3) from probe-time bools
in mxc_gpio_port to static hwdata flags with per-compatible data
instances. Split into two patches: one introducing the flags scheme
with MXC_GPIO_HW_DATA_COMMON macro for power_off (patch 3), one
extending it to pad_wakeup and imx8qm (patch 4). (Frank, bot review)
- Replaced devm_pm_runtime_get_noresume() + pm_runtime_set_active() +
devm_pm_runtime_enable() with devm_pm_runtime_set_active_enabled().
Keep plain pm_runtime_get_noresume() (non-devm) for the probe-scoped
reference to avoid usage_count underflow on unbind. (Frank, bot review)
- Replaced irq_domain_create_legacy() + devm_add_action_or_reset() with
devm_irq_domain_instantiate(). Squashed with the PM runtime devres
conversion (V1 patches 4+5) into a single patch (patch 5), since the
goto labels cannot be removed until both resources are devres-managed.
- Split dev_err_probe() conversion into its own patch (patch 6) for
bisectability — patch 5 uses bare returns with correct error values.
- Folded gpio_set_wake_irq() assign_bit simplification (V1 patch 9) into
the wakeup_pads fix (patch 2) where it belongs.
- Used 0x3U (unsigned) in MXC_ICR_MASK() to avoid implementation-defined
behavior when shifting by 30 bits.
- Replaced linux/of.h with linux/property.h to match the
of_device_is_compatible() → device_is_compatible() API change (patch 7).
- Added return-value checks for devm_pm_runtime_set_active_enabled().
- Fixed stale error code returns after devm_irq_alloc_descs() and
devm_irq_domain_instantiate() in the devres conversion patch.
- Link to v1: https://patch.msgid.link/20261003-gpio-mxc-cleanup-v1-0-dad728ce27f2@nxp.com
---
Peng Fan (4):
gpio: mxc: fix race between chained IRQ handler install and probe completion
gpio: mxc: fix both_edges bit operations
gpio: mxc: fix wakeup_pads bit operations
gpio: mxc: fix race between gpiochip registration and IRQ domain setup
drivers/gpio/gpio-mxc.c | 36 ++++++++++++++++++++++--------------
1 file changed, 22 insertions(+), 14 deletions(-)
---
base-commit: ef2a32fc6a059affb32848b8beb27a05d79b9856
change-id: 20261003-gpio-mxc-cleanup-e49cc626c51e
Best regards,
--
Peng Fan <peng.fan at nxp.com>
More information about the linux-arm-kernel
mailing list