spi: rockchip: Suspend and resume the bus during NOIRQ_SYSTEM_SLEEP_PM ops
authorshengfei Xu <xsf@rock-chips.com>
Wed, 16 Feb 2022 01:40:27 +0000 (09:40 +0800)
committerMark Brown <broonie@kernel.org>
Thu, 17 Feb 2022 17:15:10 +0000 (17:15 +0000)
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>
drivers/spi/spi-rockchip.c

index 83da8fd..8b4d56e 100644 (file)
@@ -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);
 
@@ -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);
@@ -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)
 };