Skip to content

Commit 35700e2

Browse files
pchotardbroonie
authored andcommitted
spi: stm32-qspi: Fix error path in case of -EPROBE_DEFER
In case of -EPROBE_DEFER, stm32_qspi_release() was called in any case which unregistered driver from pm_runtime framework even if it has not been registered yet to it. This leads to: stm32-qspi 58003000.spi: can't setup spi0.0, status -13 spi_master spi0: spi_device register error /soc/spi@58003000/mx66l51235l@0 spi_master spi0: Failed to create SPI device for /soc/spi@58003000/mx66l51235l@0 stm32-qspi 58003000.spi: can't setup spi0.1, status -13 spi_master spi0: spi_device register error /soc/spi@58003000/mx66l51235l@1 spi_master spi0: Failed to create SPI device for /soc/spi@58003000/mx66l51235l@1 On v5.7 kernel,this issue was not "visible", qspi driver was probed successfully. Fixes: 9d282c1 ("spi: stm32-qspi: Add pm_runtime support") Signed-off-by: Patrice Chotard <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Mark Brown <[email protected]>
1 parent 27784a2 commit 35700e2

File tree

1 file changed

+26
-20
lines changed

1 file changed

+26
-20
lines changed

drivers/spi/spi-stm32-qspi.c

Lines changed: 26 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -553,20 +553,6 @@ static const struct spi_controller_mem_ops stm32_qspi_mem_ops = {
553553
.exec_op = stm32_qspi_exec_op,
554554
};
555555

556-
static void stm32_qspi_release(struct stm32_qspi *qspi)
557-
{
558-
pm_runtime_get_sync(qspi->dev);
559-
/* disable qspi */
560-
writel_relaxed(0, qspi->io_base + QSPI_CR);
561-
stm32_qspi_dma_free(qspi);
562-
mutex_destroy(&qspi->lock);
563-
pm_runtime_put_noidle(qspi->dev);
564-
pm_runtime_disable(qspi->dev);
565-
pm_runtime_set_suspended(qspi->dev);
566-
pm_runtime_dont_use_autosuspend(qspi->dev);
567-
clk_disable_unprepare(qspi->clk);
568-
}
569-
570556
static int stm32_qspi_probe(struct platform_device *pdev)
571557
{
572558
struct device *dev = &pdev->dev;
@@ -642,7 +628,7 @@ static int stm32_qspi_probe(struct platform_device *pdev)
642628
if (IS_ERR(rstc)) {
643629
ret = PTR_ERR(rstc);
644630
if (ret == -EPROBE_DEFER)
645-
goto err_qspi_release;
631+
goto err_clk_disable;
646632
} else {
647633
reset_control_assert(rstc);
648634
udelay(2);
@@ -653,7 +639,7 @@ static int stm32_qspi_probe(struct platform_device *pdev)
653639
platform_set_drvdata(pdev, qspi);
654640
ret = stm32_qspi_dma_setup(qspi);
655641
if (ret)
656-
goto err_qspi_release;
642+
goto err_dma_free;
657643

658644
mutex_init(&qspi->lock);
659645

@@ -673,15 +659,26 @@ static int stm32_qspi_probe(struct platform_device *pdev)
673659

674660
ret = devm_spi_register_master(dev, ctrl);
675661
if (ret)
676-
goto err_qspi_release;
662+
goto err_pm_runtime_free;
677663

678664
pm_runtime_mark_last_busy(dev);
679665
pm_runtime_put_autosuspend(dev);
680666

681667
return 0;
682668

683-
err_qspi_release:
684-
stm32_qspi_release(qspi);
669+
err_pm_runtime_free:
670+
pm_runtime_get_sync(qspi->dev);
671+
/* disable qspi */
672+
writel_relaxed(0, qspi->io_base + QSPI_CR);
673+
mutex_destroy(&qspi->lock);
674+
pm_runtime_put_noidle(qspi->dev);
675+
pm_runtime_disable(qspi->dev);
676+
pm_runtime_set_suspended(qspi->dev);
677+
pm_runtime_dont_use_autosuspend(qspi->dev);
678+
err_dma_free:
679+
stm32_qspi_dma_free(qspi);
680+
err_clk_disable:
681+
clk_disable_unprepare(qspi->clk);
685682
err_master_put:
686683
spi_master_put(qspi->ctrl);
687684

@@ -692,7 +689,16 @@ static int stm32_qspi_remove(struct platform_device *pdev)
692689
{
693690
struct stm32_qspi *qspi = platform_get_drvdata(pdev);
694691

695-
stm32_qspi_release(qspi);
692+
pm_runtime_get_sync(qspi->dev);
693+
/* disable qspi */
694+
writel_relaxed(0, qspi->io_base + QSPI_CR);
695+
stm32_qspi_dma_free(qspi);
696+
mutex_destroy(&qspi->lock);
697+
pm_runtime_put_noidle(qspi->dev);
698+
pm_runtime_disable(qspi->dev);
699+
pm_runtime_set_suspended(qspi->dev);
700+
pm_runtime_dont_use_autosuspend(qspi->dev);
701+
clk_disable_unprepare(qspi->clk);
696702

697703
return 0;
698704
}

0 commit comments

Comments
 (0)