[PATCH v7 07/12] gpio: mxc: use __free guard for runtime PM cleanup
Peng Fan (OSS)
peng.fan at oss.nxp.com
Tue Oct 27 05:09:34 PDT 2026
From: Peng Fan <peng.fan at nxp.com>
Use a scope-based cleanup guard to disable runtime PM and drop the
probe-scoped pm_runtime_get_noresume() reference on error paths. Disarm
it with retain_and_null_ptr() before the success-path
pm_runtime_put_autosuspend().
The guard keeps the required order: pm_runtime_disable() runs before
pm_runtime_put_noidle(), so dropping the reference cannot trigger a
runtime suspend callback while probe is still unwinding.
Signed-off-by: Peng Fan <peng.fan at nxp.com>
---
drivers/gpio/gpio-mxc.c | 21 +++++++++++++++++++--
1 file changed, 19 insertions(+), 2 deletions(-)
diff --git a/drivers/gpio/gpio-mxc.c b/drivers/gpio/gpio-mxc.c
index 21c74b244c1f..68857730b5e3 100644
--- a/drivers/gpio/gpio-mxc.c
+++ b/drivers/gpio/gpio-mxc.c
@@ -28,6 +28,20 @@
#include <linux/of.h>
#include <linux/bug.h>
+static void mxc_gpio_pm_release(struct device *dev)
+{
+ if (!dev)
+ return;
+
+ if (pm_runtime_enabled(dev))
+ pm_runtime_disable(dev);
+
+ pm_runtime_put_noidle(dev);
+}
+
+DEFINE_FREE(mxc_gpio_pm_cleanup, struct device *,
+ mxc_gpio_pm_release(_T))
+
#define IMX_SCU_WAKEUP_OFF 0
#define IMX_SCU_WAKEUP_LOW_LVL 4
#define IMX_SCU_WAKEUP_FALL_EDGE 5
@@ -487,6 +501,9 @@ static int mxc_gpio_probe(struct platform_device *pdev)
return PTR_ERR(port->clk);
pm_runtime_get_noresume(dev);
+
+ struct device *pm_guard __free(mxc_gpio_pm_cleanup) = dev;
+
pm_runtime_set_active(dev);
pm_runtime_enable(dev);
@@ -562,6 +579,8 @@ static int mxc_gpio_probe(struct platform_device *pdev)
mxc_update_irq_chained_handler(port, true);
platform_set_drvdata(pdev, port);
+
+ retain_and_null_ptr(pm_guard);
pm_runtime_put_autosuspend(dev);
return 0;
@@ -569,8 +588,6 @@ static int mxc_gpio_probe(struct platform_device *pdev)
out_irqdomain_remove:
irq_domain_remove(port->domain);
out_bgio:
- pm_runtime_disable(dev);
- pm_runtime_put_noidle(dev);
dev_info(dev, "%s failed with errno %d\n", __func__, err);
return err;
}
--
2.51.0
More information about the linux-arm-kernel
mailing list