From 9ad64eb2bfeb69b70bfb71c65ab7339fbfd8e091 Mon Sep 17 00:00:00 2001 From: Jianhong Chen Date: Mon, 2 Nov 2015 10:10:18 +0800 Subject: [PATCH] ARM: rockchip: support arch32 psci suspend Change-Id: I0341d1c019b8c00376af574cd9f51e87fafa8601 Signed-off-by: Jianhong Chen --- arch/arm/mach-rockchip/rockchip_pm.c | 30 ++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/arch/arm/mach-rockchip/rockchip_pm.c b/arch/arm/mach-rockchip/rockchip_pm.c index 495da280ef47..2ac0c61c44b2 100755 --- a/arch/arm/mach-rockchip/rockchip_pm.c +++ b/arch/arm/mach-rockchip/rockchip_pm.c @@ -7,7 +7,7 @@ #include #include #include - +#include #include #include "pm.h" @@ -403,6 +403,18 @@ void rkpm_ddr_printhex(unsigned int hex) } } +#ifdef CONFIG_ARM_PSCI +static bool psci_suspend_available(void) +{ + return (psci_ops.cpu_suspend != NULL); +} +#else +static inline bool psci_suspend_available(void) +{ + return false; +} +#endif + #ifdef CONFIG_ARM void rk_sram_suspend(void) { @@ -411,9 +423,17 @@ void rk_sram_suspend(void) call_with_stack(p_suspend_pie_cb , &rkpm_jdg_sram_ctrbits, rockchip_sram_stack); } + static int rk_lpmode_enter(unsigned long arg) { +#ifdef CONFIG_ARM_PSCI + const struct psci_power_state ps = { + .type = PSCI_POWER_STATE_TYPE_POWER_DOWN, + }; + if (psci_suspend_available()) + return psci_ops.cpu_suspend(ps, virt_to_phys(cpu_resume)); +#endif //RKPM_DDR_PFUN(slp_setting(rkpm_jdg_sram_ctrbits),slp_setting); RKPM_DDR_FUN(slp_setting); @@ -447,7 +467,13 @@ static int rkpm_enter(suspend_state_t state) // printk(KERN_DEBUG"pm: "); printk("%s:\n",__FUNCTION__); //printk("pm test times=%d\n",++test_count); - + +#ifdef CONFIG_ARM_PSCI + if (psci_suspend_available()) { + cpu_suspend(0, rk_lpmode_enter); + return 0; + } +#endif RKPM_DDR_FUN(prepare); rkpm_ctrbits_prepare(); -- 2.34.1