[PATCH] char: omap-rng: fix runtime PM cleanup

Jiawen Liu <[email protected]>
Newsgroups org.kernel.vger.linux-crypto,org.kernel.vger.linux-kernel
Message-ID <[email protected]>
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 <[email protected]>
---
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);
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.