[PATCH 1/2] spi: cadence-quadspi: fix runtime pm cleanup on probe failure/unbind

From: Diogo Ivo (Schneider Electric)

Date: Fri Jul 31 2026 - 07:17:56 EST


Currently the probe cleanup path is imbalanced regarding
pm_runtime_enable() and pm_runtime_disable(). For example, if the probe
defers after calling cqspi_request_mmap_dma() pm_runtime_disable() will
be called without a prior call to pm_runtime_enable(), causing an
imbalance. Furthermore, the cleanup path does not undo all the runtime
calls made while probing.

Fix this by enforcing the correct correspondence between
pm_runtime_enable() and pm_runtime_resume() and add the missing PM
cleanup calls.

As the history of this driver in mainline is convoluted with several
rounds of fixes it includes the fixes from two commits, namely
commit 5ff4d5d1af0c ("spi: cadence-quadspi: fix runtime pm disable
imbalance on probe failure") and commit 5e8bb0cc72f1 ("spi:
cadence-quadspi: fix runtime pm and clock imbalance on unbind").

Fixes: 74b0b4cf13fc ("spi: spi-cadence-quadspi: Fix pm runtime unbalance")
Cc: stable@xxxxxxxxxxxxxxx
Signed-off-by: Diogo Ivo (Schneider Electric) <diogo.ivo@xxxxxxxxxxx>
---
drivers/spi/spi-cadence-quadspi.c | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/drivers/spi/spi-cadence-quadspi.c b/drivers/spi/spi-cadence-quadspi.c
index da8401261bbc..d749dee54015 100644
--- a/drivers/spi/spi-cadence-quadspi.c
+++ b/drivers/spi/spi-cadence-quadspi.c
@@ -1862,7 +1862,6 @@ static int cqspi_probe(struct platform_device *pdev)
if (ret)
return ret;

-
ret = clk_prepare_enable(cqspi->clk);
if (ret) {
dev_err(dev, "Cannot enable QSPI clock.\n");
@@ -1983,16 +1982,19 @@ static int cqspi_probe(struct platform_device *pdev)
ret = spi_register_controller(host);
if (ret) {
dev_err(&pdev->dev, "failed to register SPI ctlr %d\n", ret);
- goto probe_setup_failed;
+ goto disable_rpm;
}

pm_runtime_mark_last_busy(dev);
pm_runtime_put_autosuspend(dev);

return 0;
+disable_rpm:
+ pm_runtime_put_noidle(dev);
+ pm_runtime_dont_use_autosuspend(dev);
+ pm_runtime_disable(dev);
probe_setup_failed:
cqspi_controller_enable(cqspi, 0);
- pm_runtime_disable(dev);
probe_reset_failed:
if (cqspi->is_jh7110)
cqspi_jh7110_disable_clk(pdev, cqspi);
@@ -2026,6 +2028,7 @@ static void cqspi_remove(struct platform_device *pdev)
cqspi_jh7110_disable_clk(pdev, cqspi);

pm_runtime_put_sync(&pdev->dev);
+ pm_runtime_dont_use_autosuspend(&pdev->dev);
pm_runtime_disable(&pdev->dev);
}


--
2.55.0