aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeffy Chen <jeffy.chen@rock-chips.com>2017-08-07 08:40:20 -0400
committerMark Brown <broonie@kernel.org>2017-08-07 11:44:13 -0400
commitd38c4ae194bb8a3d8cf7d95378c5b2799cdd0a3b (patch)
tree995344d86065d6999f2eebf641d42692b47be34f
parent6a06e895b262621a81b3b08126b4bc5e1b8eef05 (diff)
spi: rockchip: Fix clock handling in suspend/resume
The runtime suspend callback might be called by pm domain framework at suspend_noirq stage. It would try to disable the clocks which already been disabled by rockchip_spi_suspend. Call pm_runtime_force_suspend/pm_runtime_force_resume when suspend/resume to avoid that. Signed-off-by: Jeffy Chen <jeffy.chen@rock-chips.com> Signed-off-by: Mark Brown <broonie@kernel.org>
-rw-r--r--drivers/spi/spi-rockchip.c21
1 files changed, 6 insertions, 15 deletions
diff --git a/drivers/spi/spi-rockchip.c b/drivers/spi/spi-rockchip.c
index a75fd9bb76de..34f6440a5255 100644
--- a/drivers/spi/spi-rockchip.c
+++ b/drivers/spi/spi-rockchip.c
@@ -846,10 +846,9 @@ static int rockchip_spi_suspend(struct device *dev)
846 if (ret < 0) 846 if (ret < 0)
847 return ret; 847 return ret;
848 848
849 if (!pm_runtime_suspended(dev)) { 849 ret = pm_runtime_force_suspend(dev);
850 clk_disable_unprepare(rs->spiclk); 850 if (ret < 0)
851 clk_disable_unprepare(rs->apb_pclk); 851 return ret;
852 }
853 852
854 pinctrl_pm_select_sleep_state(dev); 853 pinctrl_pm_select_sleep_state(dev);
855 854
@@ -864,17 +863,9 @@ static int rockchip_spi_resume(struct device *dev)
864 863
865 pinctrl_pm_select_default_state(dev); 864 pinctrl_pm_select_default_state(dev);
866 865
867 if (!pm_runtime_suspended(dev)) { 866 ret = pm_runtime_force_resume(dev);
868 ret = clk_prepare_enable(rs->apb_pclk); 867 if (ret < 0)
869 if (ret < 0) 868 return ret;
870 return ret;
871
872 ret = clk_prepare_enable(rs->spiclk);
873 if (ret < 0) {
874 clk_disable_unprepare(rs->apb_pclk);
875 return ret;
876 }
877 }
878 869
879 ret = spi_master_resume(rs->master); 870 ret = spi_master_resume(rs->master);
880 if (ret < 0) { 871 if (ret < 0) {