lkml.org 
[lkml]   [2021]   [Jul]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.13 100/223] spi: cadence: Correct initialisation of runtime PM again
    Date
    From: Marek Vasut <marex@denx.de>

    [ Upstream commit 56912da7a68c8356df6a6740476237441b0b792a ]

    The original implementation of RPM handling in probe() was mostly
    correct, except it failed to call pm_runtime_get_*() to activate the
    hardware. The subsequent fix, 734882a8bf98 ("spi: cadence: Correct
    initialisation of runtime PM"), breaks the implementation further,
    to the point where the system using this hard IP on ZynqMP hangs on
    boot, because it accesses hardware which is gated off.

    Undo 734882a8bf98 ("spi: cadence: Correct initialisation of runtime
    PM") and instead add missing pm_runtime_get_noresume() and move the
    RPM disabling all the way to the end of probe(). That makes ZynqMP
    not hang on boot yet again.

    Fixes: 734882a8bf98 ("spi: cadence: Correct initialisation of runtime PM")
    Signed-off-by: Marek Vasut <marex@denx.de>
    Cc: Charles Keepax <ckeepax@opensource.cirrus.com>
    Cc: Mark Brown <broonie@kernel.org>
    Link: https://lore.kernel.org/r/20210716182133.218640-1-marex@denx.de
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/spi/spi-cadence.c | 14 +++++++++-----
    1 file changed, 9 insertions(+), 5 deletions(-)

    diff --git a/drivers/spi/spi-cadence.c b/drivers/spi/spi-cadence.c
    index a3afd1b9ac56..ceb16e70d235 100644
    --- a/drivers/spi/spi-cadence.c
    +++ b/drivers/spi/spi-cadence.c
    @@ -517,6 +517,12 @@ 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_get_noresume(&pdev->dev);
    + 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;
    @@ -531,11 +537,6 @@ static int cdns_spi_probe(struct platform_device *pdev)
    /* SPI controller initializations */
    cdns_spi_init_hw(xspi);

    - 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) {
    ret = -ENXIO;
    @@ -566,6 +567,9 @@ static int cdns_spi_probe(struct platform_device *pdev)

    master->bits_per_word_mask = SPI_BPW_MASK(8);

    + pm_runtime_mark_last_busy(&pdev->dev);
    + pm_runtime_put_autosuspend(&pdev->dev);
    +
    ret = spi_register_master(master);
    if (ret) {
    dev_err(&pdev->dev, "spi_register_master failed\n");
    --
    2.30.2


    \
     
     \ /
      Last update: 2021-07-26 18:33    [W:4.948 / U:0.656 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site