]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
spi: spi-cadence-quadspi: Enable pm runtime earlier to avoid imbalance
authorAnurag Dutta <a-dutta@ti.com>
Wed, 5 Nov 2025 16:11:45 +0000 (21:41 +0530)
committerMark Brown <broonie@kernel.org>
Thu, 13 Nov 2025 18:50:35 +0000 (18:50 +0000)
The "probe_setup_failed" label calls pm_runtime_disable(), but
pm_runtime_enable() was placed after a possible jump to this label.
When cqspi_setup_flash() fails, control jumps to the label without
pm_runtime_enable() being called, leading to unbalanced PM runtime
reference counting.

Move pm_runtime_enable() and associated calls above the first
possible branch to "probe_setup_failed" to ensure balanced
enable/disable calls across all error paths.

Fixes: 30dbc1c8d50f ("spi: cadence-qspi: defer runtime support on socfpga if reset bit is enabled")
Signed-off-by: Anurag Dutta <a-dutta@ti.com>
Link: https://patch.msgid.link/20251105161146.2019090-2-a-dutta@ti.com
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/spi/spi-cadence-quadspi.c

index 81017402bc5661d08ff4e75017db954fda19ba2a..56906dc76b346e75c15f75f142369451ba408c4b 100644 (file)
@@ -1981,6 +1981,13 @@ static int cqspi_probe(struct platform_device *pdev)
        cqspi->current_cs = -1;
        cqspi->sclk = 0;
 
+       if (!(ddata && (ddata->quirks & CQSPI_DISABLE_RUNTIME_PM))) {
+               pm_runtime_enable(dev);
+               pm_runtime_set_autosuspend_delay(dev, CQSPI_AUTOSUSPEND_TIMEOUT);
+               pm_runtime_use_autosuspend(dev);
+               pm_runtime_get_noresume(dev);
+       }
+
        ret = cqspi_setup_flash(cqspi);
        if (ret) {
                dev_err(dev, "failed to setup flash parameters %d\n", ret);
@@ -1998,13 +2005,6 @@ static int cqspi_probe(struct platform_device *pdev)
                        goto probe_dma_failed;
        }
 
-       if (!(ddata && (ddata->quirks & CQSPI_DISABLE_RUNTIME_PM))) {
-               pm_runtime_enable(dev);
-               pm_runtime_set_autosuspend_delay(dev, CQSPI_AUTOSUSPEND_TIMEOUT);
-               pm_runtime_use_autosuspend(dev);
-               pm_runtime_get_noresume(dev);
-       }
-
        ret = spi_register_controller(host);
        if (ret) {
                dev_err(&pdev->dev, "failed to register SPI ctlr %d\n", ret);