ARM: rockchip: support arch32 psci suspend
authorJianhong Chen <chenjh@rock-chips.com>
Mon, 2 Nov 2015 02:10:18 +0000 (10:10 +0800)
committerJianhong Chen <chenjh@rock-chips.com>
Mon, 2 Nov 2015 06:56:03 +0000 (14:56 +0800)
Change-Id: I0341d1c019b8c00376af574cd9f51e87fafa8601
Signed-off-by: Jianhong Chen <chenjh@rock-chips.com>
arch/arm/mach-rockchip/rockchip_pm.c

index 495da28..2ac0c61 100755 (executable)
@@ -7,7 +7,7 @@
 #include <linux/delay.h>
 #include <linux/moduleparam.h>
 #include <linux/rockchip/common.h>
-
+#include <asm/psci.h>
 #include <asm/io.h>
 #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();