Skip to content

Commit

Permalink
spi: rockchip: Avoid redundant clock disable in pm operation
Browse files Browse the repository at this point in the history
Fix WARN_ON:
[   22.869352][ T1885] clk_spi0 already unprepared
[   22.869379][ T1885] WARNING: CPU: 3 PID: 1885 at drivers/clk/clk.c:813 clk_core_unprepare+0xbc4
[   22.869380][ T1885] Modules linked in: bcmdhd dhd_static_buf
[   22.869391][ T1885] CPU: 3 PID: 1885 Comm: Binder:355_2 Tainted: G        W         5.10.66 torvalds#59
[   22.869393][ T1885] Hardware name: Rockchip RK3588 EVB1 LP4 V10 Board (DT)
[   22.869397][ T1885] pstate: 60400009 (nZCv daif +PAN -UAO -TCO BTYPE=--)
[   22.869401][ T1885] pc : clk_core_unprepare+0xbc/0x214
[   22.869404][ T1885] lr : clk_core_unprepare+0xbc/0x214

Fixes:  ("spi: rockchip: Suspend and resume the bus during NOIRQ_SYSTEM_SLEEP_PM ops")
Signed-off-by: Jon Lin <[email protected]>
  • Loading branch information
Jon Lin authored and intel-lab-lkp committed Aug 26, 2024
1 parent 4f25a52 commit 37cc74f
Showing 1 changed file with 26 additions and 31 deletions.
57 changes: 26 additions & 31 deletions drivers/spi/spi-rockchip.c
Original file line number Diff line number Diff line change
Expand Up @@ -940,33 +940,24 @@ static void rockchip_spi_remove(struct platform_device *pdev)
spi_controller_put(ctlr);
}

#ifdef CONFIG_PM_SLEEP
static int rockchip_spi_suspend(struct device *dev)
#ifdef CONFIG_PM
static int rockchip_spi_runtime_suspend(struct device *dev)
{
int ret;
struct spi_controller *ctlr = dev_get_drvdata(dev);
struct rockchip_spi *rs = spi_controller_get_devdata(ctlr);

ret = spi_controller_suspend(ctlr);
if (ret < 0)
return ret;

clk_disable_unprepare(rs->spiclk);
clk_disable_unprepare(rs->apb_pclk);

pinctrl_pm_select_sleep_state(dev);

return 0;
}

static int rockchip_spi_resume(struct device *dev)
static int rockchip_spi_runtime_resume(struct device *dev)
{
int ret;
struct spi_controller *ctlr = dev_get_drvdata(dev);
struct rockchip_spi *rs = spi_controller_get_devdata(ctlr);

pinctrl_pm_select_default_state(dev);

ret = clk_prepare_enable(rs->apb_pclk);
if (ret < 0)
return ret;
Expand All @@ -975,41 +966,45 @@ static int rockchip_spi_resume(struct device *dev)
if (ret < 0)
clk_disable_unprepare(rs->apb_pclk);

ret = spi_controller_resume(ctlr);
if (ret < 0) {
clk_disable_unprepare(rs->spiclk);
clk_disable_unprepare(rs->apb_pclk);
}

return 0;
}
#endif /* CONFIG_PM_SLEEP */
#endif /* CONFIG_PM */

#ifdef CONFIG_PM
static int rockchip_spi_runtime_suspend(struct device *dev)
#ifdef CONFIG_PM_SLEEP
static int rockchip_spi_suspend(struct device *dev)
{
int ret;
struct spi_controller *ctlr = dev_get_drvdata(dev);
struct rockchip_spi *rs = spi_controller_get_devdata(ctlr);

clk_disable_unprepare(rs->spiclk);
clk_disable_unprepare(rs->apb_pclk);
ret = spi_controller_suspend(ctlr);
if (ret < 0)
return ret;

/* Avoid redundant clock disable */
if (!pm_runtime_status_suspended(dev))
rockchip_spi_runtime_suspend(dev);

pinctrl_pm_select_sleep_state(dev);

return 0;
}

static int rockchip_spi_runtime_resume(struct device *dev)
static int rockchip_spi_resume(struct device *dev)
{
int ret;
struct spi_controller *ctlr = dev_get_drvdata(dev);
struct rockchip_spi *rs = spi_controller_get_devdata(ctlr);

ret = clk_prepare_enable(rs->apb_pclk);
if (ret < 0)
return ret;
pinctrl_pm_select_default_state(dev);

ret = clk_prepare_enable(rs->spiclk);
if (!pm_runtime_status_suspended(dev)) {
ret = rockchip_spi_runtime_resume(dev);
if (ret < 0)
return ret;
}

ret = spi_controller_resume(ctlr);
if (ret < 0)
clk_disable_unprepare(rs->apb_pclk);
rockchip_spi_runtime_suspend(dev);

return 0;
}
Expand Down

0 comments on commit 37cc74f

Please sign in to comment.