[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);