Skip to content

Commit 734882a

Browse files
charleskeepaxbroonie
authored andcommitted
spi: cadence: Correct initialisation of runtime PM
Currently the driver calls pm_runtime_put_autosuspend but without ever having done a pm_runtime_get, this causes the reference count in the pm runtime core to become -1. The bad reference count causes the core to sometimes suspend whilst an active SPI transfer is in progress. arizona spi0.1: SPI transfer timed out spi_master spi0: failed to transfer one message from queue The correct proceedure is to do all the initialisation that requires the hardware to be powered up before enabling the PM runtime, then enable the PM runtime having called pm_runtime_set_active to inform it that the hardware is currently powered up. The core will then power it down at it's leisure and no explicit pm_runtime_put is required. Fixes: d36ccd9 ("spi: cadence: Runtime pm adaptation") Signed-off-by: Charles Keepax <[email protected]> Signed-off-by: Mark Brown <[email protected]>
1 parent de43aff commit 734882a

File tree

1 file changed

+4
-7
lines changed

1 file changed

+4
-7
lines changed

drivers/spi/spi-cadence.c

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -522,11 +522,6 @@ static int cdns_spi_probe(struct platform_device *pdev)
522522
goto clk_dis_apb;
523523
}
524524

525-
pm_runtime_use_autosuspend(&pdev->dev);
526-
pm_runtime_set_autosuspend_delay(&pdev->dev, SPI_AUTOSUSPEND_TIMEOUT);
527-
pm_runtime_set_active(&pdev->dev);
528-
pm_runtime_enable(&pdev->dev);
529-
530525
ret = of_property_read_u32(pdev->dev.of_node, "num-cs", &num_cs);
531526
if (ret < 0)
532527
master->num_chipselect = CDNS_SPI_DEFAULT_NUM_CS;
@@ -541,8 +536,10 @@ static int cdns_spi_probe(struct platform_device *pdev)
541536
/* SPI controller initializations */
542537
cdns_spi_init_hw(xspi);
543538

544-
pm_runtime_mark_last_busy(&pdev->dev);
545-
pm_runtime_put_autosuspend(&pdev->dev);
539+
pm_runtime_set_active(&pdev->dev);
540+
pm_runtime_enable(&pdev->dev);
541+
pm_runtime_use_autosuspend(&pdev->dev);
542+
pm_runtime_set_autosuspend_delay(&pdev->dev, SPI_AUTOSUSPEND_TIMEOUT);
546543

547544
irq = platform_get_irq(pdev, 0);
548545
if (irq <= 0) {

0 commit comments

Comments
 (0)