Skip to content

Commit

Permalink
spi: rockchip: Suspend and resume the bus during NOIRQ_SYSTEM_SLEEP_P…
Browse files Browse the repository at this point in the history
…M ops

the wakeup interrupt handler which is guaranteed not to run while
@resume noirq() is being executed. the patch can help to avoid the
wakeup source try to access spi when the spi is in suspend mode.

Signed-off-by: shengfei Xu <xsf@rock-chips.com>
Signed-off-by: Jon Lin <jon.lin@rock-chips.com>
Link: https://lore.kernel.org/r/20220216014028.8123-6-jon.lin@rock-chips.com
Signed-off-by: Mark Brown <broonie@kernel.org>
  • Loading branch information
power-xsf authored and broonie committed Feb 17, 2022
1 parent 3a4bf92 commit e882575
Showing 1 changed file with 9 additions and 5 deletions.
14 changes: 9 additions & 5 deletions drivers/spi/spi-rockchip.c
Original file line number Diff line number Diff line change
Expand Up @@ -964,14 +964,14 @@ 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);

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

ret = pm_runtime_force_suspend(dev);
if (ret < 0)
return ret;
clk_disable_unprepare(rs->spiclk);
clk_disable_unprepare(rs->apb_pclk);

pinctrl_pm_select_sleep_state(dev);

Expand All @@ -986,10 +986,14 @@ static int rockchip_spi_resume(struct device *dev)

pinctrl_pm_select_default_state(dev);

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

ret = clk_prepare_enable(rs->spiclk);
if (ret < 0)
clk_disable_unprepare(rs->apb_pclk);

ret = spi_controller_resume(ctlr);
if (ret < 0) {
clk_disable_unprepare(rs->spiclk);
Expand Down Expand Up @@ -1031,7 +1035,7 @@ static int rockchip_spi_runtime_resume(struct device *dev)
#endif /* CONFIG_PM */

static const struct dev_pm_ops rockchip_spi_pm = {
SET_SYSTEM_SLEEP_PM_OPS(rockchip_spi_suspend, rockchip_spi_resume)
SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(rockchip_spi_suspend, rockchip_spi_resume)
SET_RUNTIME_PM_OPS(rockchip_spi_runtime_suspend,
rockchip_spi_runtime_resume, NULL)
};
Expand Down

0 comments on commit e882575

Please sign in to comment.