| From 23ad06329184e13e239d4ab505784a043a881414 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Fri, 16 Jul 2021 20:21:33 +0200 |
| Subject: spi: cadence: Correct initialisation of runtime PM again |
| |
| 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 |
| |