]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
spi: cadence-quadspi: fix runtime pm disable imbalance on probe failure
authorJohan Hovold <johan@kernel.org>
Tue, 21 Apr 2026 12:53:49 +0000 (14:53 +0200)
committerMark Brown <broonie@kernel.org>
Sun, 26 Apr 2026 23:26:35 +0000 (08:26 +0900)
A recent attempt to fix the probe error handling introduced a runtime PM
disable depth imbalance by incorrectly disabling runtime PM on early
failures (e.g. probe deferral).

Fixes: f18c8cfa4f1a ("spi: cadence-qspi: Fix probe error path and remove")
Cc: stable@vger.kernel.org # 7.0
Cc: Miquel Raynal (Schneider Electric) <miquel.raynal@bootlin.com>
Signed-off-by: Johan Hovold <johan@kernel.org>
Link: https://patch.msgid.link/20260421125354.1534871-2-johan@kernel.org
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/spi/spi-cadence-quadspi.c

index 65aff2e70265849bb3d12aaa8f7d9d22d17ddd6b..2ab6d2a818658d4a9531d2d902157e60956fdb7c 100644 (file)
@@ -1867,7 +1867,7 @@ static int cqspi_probe(struct platform_device *pdev)
        ret = clk_bulk_prepare_enable(CLK_QSPI_NUM, cqspi->clks);
        if (ret) {
                dev_err(dev, "Cannot enable QSPI clocks.\n");
-               goto disable_rpm;
+               return ret;
        }
 
        /* Obtain QSPI reset control */
@@ -1977,7 +1977,7 @@ static int cqspi_probe(struct platform_device *pdev)
                ret = cqspi_request_mmap_dma(cqspi);
                if (ret == -EPROBE_DEFER) {
                        dev_err_probe(&pdev->dev, ret, "Failed to request mmap DMA\n");
-                       goto disable_controller;
+                       goto disable_rpm;
                }
        }
 
@@ -1995,14 +1995,13 @@ static int cqspi_probe(struct platform_device *pdev)
 release_dma_chan:
        if (cqspi->rx_chan)
                dma_release_channel(cqspi->rx_chan);
-disable_controller:
+disable_rpm:
+       if (!(ddata && (ddata->quirks & CQSPI_DISABLE_RUNTIME_PM)))
+               pm_runtime_disable(dev);
        cqspi_controller_enable(cqspi, 0);
 disable_clks:
        if (pm_runtime_get_sync(&pdev->dev) >= 0)
                clk_bulk_disable_unprepare(CLK_QSPI_NUM, cqspi->clks);
-disable_rpm:
-       if (!(ddata && (ddata->quirks & CQSPI_DISABLE_RUNTIME_PM)))
-               pm_runtime_disable(dev);
 
        return ret;
 }