Skip to content

Commit 295fe84

Browse files
Siddharth-Vadapalli-at-TIbroonie
authored andcommitted
spi: cadence-quadspi: Fix cqspi_probe() error handling for runtime pm
Commit f1eb4e7 ("spi: spi-cadence-quadspi: Enable pm runtime earlier to avoid imbalance") relocated code but missed updating the error handling path associated with it. Prior to the relocation, runtime pm was enabled after the code-block associated with 'cqspi_request_mmap_dma()', due to which, the error handling for the same didn't require invoking 'pm_runtime_disable()'. Post refactoring, runtime pm has been enabled before the code-block and when an error is encountered, jumping to 'probe_dma_failed' doesn't invoke 'pm_runtime_disable()'. This leads to a race condition wherein 'cqspi_runtime_suspend()' is invoked while the error handling path executes in parallel. The resulting error is the following: clk:103:0 already disabled WARNING: drivers/clk/clk.c:1188 at clk_core_disable+0x80/0xa0, CPU#1: kworker/u8:0/12 [TRIMMED] pstate: 600000c5 (nZCv daIF -PAN -UAO -TCO -DIT -SSBS BTYPE=--) pc : clk_core_disable+0x80/0xa0 lr : clk_core_disable+0x80/0xa0 [TRIMMED] Call trace: clk_core_disable+0x80/0xa0 (P) clk_core_disable_lock+0x88/0x10c clk_disable+0x24/0x30 cqspi_probe+0xa3c/0xae8 [TRIMMED] The error is due to the second invocation of 'clk_disable_unprepare()' on 'cqspi->clk' in the error handling within 'cqspi_probe()', with the first invocation being within 'cqspi_runtime_suspend()'. Fix this by correcting the error handling. Fixes: f1eb4e7 ("spi: spi-cadence-quadspi: Enable pm runtime earlier to avoid imbalance") Signed-off-by: Siddharth Vadapalli <s-vadapalli@ti.com> Link: https://patch.msgid.link/20251119152545.2591651-1-s-vadapalli@ti.com Signed-off-by: Mark Brown <broonie@kernel.org>
1 parent fd9862f commit 295fe84

1 file changed

Lines changed: 1 addition & 2 deletions

File tree

drivers/spi/spi-cadence-quadspi.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2002,7 +2002,7 @@ static int cqspi_probe(struct platform_device *pdev)
20022002
if (cqspi->use_direct_mode) {
20032003
ret = cqspi_request_mmap_dma(cqspi);
20042004
if (ret == -EPROBE_DEFER)
2005-
goto probe_dma_failed;
2005+
goto probe_setup_failed;
20062006
}
20072007

20082008
ret = spi_register_controller(host);
@@ -2020,7 +2020,6 @@ static int cqspi_probe(struct platform_device *pdev)
20202020
probe_setup_failed:
20212021
if (!(ddata && (ddata->quirks & CQSPI_DISABLE_RUNTIME_PM)))
20222022
pm_runtime_disable(dev);
2023-
probe_dma_failed:
20242023
cqspi_controller_enable(cqspi, 0);
20252024
probe_reset_failed:
20262025
if (cqspi->is_jh7110)

0 commit comments

Comments
 (0)