diff options
author | Jeffy Chen <jeffy.chen@rock-chips.com> | 2017-08-07 08:40:20 -0400 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2017-08-07 11:44:13 -0400 |
commit | d38c4ae194bb8a3d8cf7d95378c5b2799cdd0a3b (patch) | |
tree | 995344d86065d6999f2eebf641d42692b47be34f | |
parent | 6a06e895b262621a81b3b08126b4bc5e1b8eef05 (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.c | 21 |
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) { |