[PATCH 2/4] dmaengine: ste_dma40: Fix probe runtime PM disable
Linus Walleij <[email protected]>
| Newsgroups | org.kernel.vger.dmaengine |
|---|---|
| Message-ID | <[email protected]> |
d40_probe() can jump to destroy_cache before runtime PM has been enabled for the DMA controller device. Calling pm_runtime_disable() on that path increments disable_depth, which can leave runtime PM disabled after a later successful deferred probe. Track whether this probe attempt enabled runtime PM before disabling it on the error path. Reported-by: [email protected] Closes: https://lore.kernel.org/dmaengine/[email protected]/ Assisted-by: Codex:gpt-5-5 Signed-off-by: Linus Walleij <[email protected]> --- drivers/dma/ste_dma40.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/drivers/dma/ste_dma40.c b/drivers/dma/ste_dma40.c index d5837aa0a789..0c8ff299c2c2 100644 --- a/drivers/dma/ste_dma40.c +++ b/drivers/dma/ste_dma40.c @@ -3502,6 +3502,7 @@ static int __init d40_probe(struct platform_device *pdev) struct resource *res; struct resource res_lcpa; int num_reserved_chans; + bool runtime_pm_enabled = false; u32 val; int ret; @@ -3623,6 +3624,7 @@ static int __init d40_probe(struct platform_device *pdev) pm_runtime_mark_last_busy(base->dev); pm_runtime_set_active(base->dev); pm_runtime_enable(base->dev); + runtime_pm_enabled = true; ret = d40_dmaengine_init(base, num_reserved_chans); if (ret) @@ -3658,7 +3660,8 @@ static int __init d40_probe(struct platform_device *pdev) regulator_disable(base->lcpa_regulator); regulator_put(base->lcpa_regulator); } - pm_runtime_disable(base->dev); + if (runtime_pm_enabled) + pm_runtime_disable(base->dev); report_failure: d40_err(dev, "probe failed\n"); -- 2.55.0