]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
spi: cadence-quadspi: Fix pm_runtime unbalance on dma EPROBE_DEFER
authorMattijs Korpershoek <mkorpershoek@kernel.org>
Thu, 9 Oct 2025 07:10:38 +0000 (09:10 +0200)
committerMark Brown <broonie@kernel.org>
Mon, 13 Oct 2025 12:34:08 +0000 (13:34 +0100)
In csqspi_probe(), when cqspi_request_mmap_dma() returns -EPROBE_DEFER,
we handle the error by jumping to probe_setup_failed.
In that label, we call pm_runtime_disable(), even if we never called
pm_runtime_enable() before.

Because of this, the driver cannot probe:

[    2.690018] cadence-qspi 47040000.spi: No Rx DMA available
[    2.699735] spi-nor spi0.0: resume failed with -13
[    2.699741] spi-nor: probe of spi0.0 failed with error -13

Only call pm_runtime_disable() if it was enabled by adding a new
label to handle cqspi_request_mmap_dma() failures.

Fixes: b07f349d1864 ("spi: spi-cadence-quadspi: Fix pm runtime unbalance")
Signed-off-by: Mattijs Korpershoek <mkorpershoek@kernel.org>
Reviewed-by: Dan Carpenter <dan.carpenter@linaro.org>
Link: https://patch.msgid.link/20251009-cadence-quadspi-fix-pm-runtime-v2-1-8bdfefc43902@kernel.org
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/spi/spi-cadence-quadspi.c

index 8fb13df8ff8714d2ad5a019f0ae0ec3ee38833bb..81017402bc5661d08ff4e75017db954fda19ba2a 100644 (file)
@@ -1995,7 +1995,7 @@ static int cqspi_probe(struct platform_device *pdev)
        if (cqspi->use_direct_mode) {
                ret = cqspi_request_mmap_dma(cqspi);
                if (ret == -EPROBE_DEFER)
-                       goto probe_setup_failed;
+                       goto probe_dma_failed;
        }
 
        if (!(ddata && (ddata->quirks & CQSPI_DISABLE_RUNTIME_PM))) {
@@ -2019,9 +2019,10 @@ static int cqspi_probe(struct platform_device *pdev)
 
        return 0;
 probe_setup_failed:
-       cqspi_controller_enable(cqspi, 0);
        if (!(ddata && (ddata->quirks & CQSPI_DISABLE_RUNTIME_PM)))
                pm_runtime_disable(dev);
+probe_dma_failed:
+       cqspi_controller_enable(cqspi, 0);
 probe_reset_failed:
        if (cqspi->is_jh7110)
                cqspi_jh7110_disable_clk(pdev, cqspi);