]> git.ipfire.org Git - thirdparty/kernel/stable.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)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 17 May 2026 15:16:29 +0000 (17:16 +0200)
commit 5ff4d5d1af0c7517bd8db83c95c4247a9729a548 upstream.

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>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/spi/spi-cadence-quadspi.c

index 50ef65fc5dedec7297a09bdfbfad2ff10a397857..5040e4e1cce03e9bd03cf045e5efb350661a0db5 100644 (file)
@@ -1871,7 +1871,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 */
@@ -1981,7 +1981,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;
                }
        }
 
@@ -1999,14 +1999,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;
 }