[PATCH] char: omap-rng: fix runtime PM cleanup
From: Jiawen Liu
Date: Tue Aug 18 2026 - 09:30:47 EST
Clean up runtime PM on deferred probe.
omap_rng_probe leaks runtime PM state if devm_clk_get returns
-EPROBE_DEFER after pm_runtime_resume_and_get succeeds. Direct return
skips put/disable.
Route -EPROBE_DEFER paths through resource-matched runtime PM cleanup in
omap_rng_probe.
Signed-off-by: jiawen <1298662399@xxxxxx>
---
diff --git a/drivers/char/hw_random/omap-rng.c b/drivers/char/hw_random/omap-rng.c
--- a/drivers/char/hw_random/omap-rng.c
+++ b/drivers/char/hw_random/omap-rng.c
@@ -459,8 +459,10 @@
}
priv->clk = devm_clk_get(&pdev->dev, NULL);
- if (PTR_ERR(priv->clk) == -EPROBE_DEFER)
- return -EPROBE_DEFER;
+ if (PTR_ERR(priv->clk) == -EPROBE_DEFER) {
+ ret = -EPROBE_DEFER;
+ goto err_pm_runtime;
+ }
if (!IS_ERR(priv->clk)) {
ret = clk_prepare_enable(priv->clk);
if (ret) {
@@ -471,8 +473,10 @@
}
priv->clk_reg = devm_clk_get(&pdev->dev, "reg");
- if (PTR_ERR(priv->clk_reg) == -EPROBE_DEFER)
- return -EPROBE_DEFER;
+ if (PTR_ERR(priv->clk_reg) == -EPROBE_DEFER) {
+ ret = -EPROBE_DEFER;
+ goto err_pm_runtime_clock_1;
+ }
if (!IS_ERR(priv->clk_reg)) {
ret = clk_prepare_enable(priv->clk_reg);
if (ret) {
@@ -497,6 +501,16 @@
return 0;
+err_pm_runtime_clock_1:
+ if (!IS_ERR(priv->clk))
+ clk_disable_unprepare(priv->clk);
+ goto err_pm_runtime;
+
+err_pm_runtime:
+ pm_runtime_put_sync(&pdev->dev);
+ pm_runtime_disable(&pdev->dev);
+ goto err_ioremap;
+
err_register:
priv->base = NULL;
pm_runtime_put_sync(&pdev->dev);