lkml.org 
[lkml]   [2020]   [Jan]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.14 062/343] spi: cadence: Correct initialisation of runtime PM
    Date
    From: Charles Keepax <ckeepax@opensource.cirrus.com>

    [ Upstream commit 734882a8bf984c2ac8a57d8ac3ee53230bd0bed8 ]

    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: d36ccd9f7ea4 ("spi: cadence: Runtime pm adaptation")
    Signed-off-by: Charles Keepax <ckeepax@opensource.cirrus.com>
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/spi/spi-cadence.c | 11 ++++-------
    1 file changed, 4 insertions(+), 7 deletions(-)

    diff --git a/drivers/spi/spi-cadence.c b/drivers/spi/spi-cadence.c
    index 02bd1eba045b8..d08ad93d97a15 100644
    --- a/drivers/spi/spi-cadence.c
    +++ b/drivers/spi/spi-cadence.c
    @@ -584,11 +584,6 @@ static int cdns_spi_probe(struct platform_device *pdev)
    goto clk_dis_apb;
    }

    - pm_runtime_use_autosuspend(&pdev->dev);
    - pm_runtime_set_autosuspend_delay(&pdev->dev, SPI_AUTOSUSPEND_TIMEOUT);
    - pm_runtime_set_active(&pdev->dev);
    - pm_runtime_enable(&pdev->dev);
    -
    ret = of_property_read_u32(pdev->dev.of_node, "num-cs", &num_cs);
    if (ret < 0)
    master->num_chipselect = CDNS_SPI_DEFAULT_NUM_CS;
    @@ -603,8 +598,10 @@ static int cdns_spi_probe(struct platform_device *pdev)
    /* SPI controller initializations */
    cdns_spi_init_hw(xspi);

    - pm_runtime_mark_last_busy(&pdev->dev);
    - pm_runtime_put_autosuspend(&pdev->dev);
    + pm_runtime_set_active(&pdev->dev);
    + pm_runtime_enable(&pdev->dev);
    + pm_runtime_use_autosuspend(&pdev->dev);
    + pm_runtime_set_autosuspend_delay(&pdev->dev, SPI_AUTOSUSPEND_TIMEOUT);

    irq = platform_get_irq(pdev, 0);
    if (irq <= 0) {
    --
    2.20.1


    \
     
     \ /
      Last update: 2020-01-24 10:47    [W:4.181 / U:0.152 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site