OSDN Git Service

ARM: OMAP2+: powerdomain: Introduce cpu_pm notifiers for context save/restore
authorKeerthy <j-keerthy@ti.com>
Wed, 16 May 2018 15:17:01 +0000 (20:47 +0530)
committerTony Lindgren <tony@atomide.com>
Fri, 18 May 2018 13:56:36 +0000 (06:56 -0700)
Inroduce cpu_pm notifiers for context save/restore. This is
needed for am43xx family during rtc only mode with ddr in
self-refresh.

Signed-off-by: Keerthy <j-keerthy@ti.com>
Signed-off-by: Tony Lindgren <tony@atomide.com>
arch/arm/mach-omap2/powerdomain.c

index ee693f6..27fdef6 100644 (file)
@@ -14,6 +14,7 @@
  */
 #undef DEBUG
 
+#include <linux/cpu_pm.h>
 #include <linux/kernel.h>
 #include <linux/types.h>
 #include <linux/list.h>
@@ -39,6 +40,9 @@
 
 #define PWRDM_TRACE_STATES_FLAG        (1<<31)
 
+void pwrdms_save_context(void);
+void pwrdms_restore_context(void);
+
 enum {
        PWRDM_STATE_NOW = 0,
        PWRDM_STATE_PREV,
@@ -333,6 +337,22 @@ int pwrdm_register_pwrdms(struct powerdomain **ps)
        return 0;
 }
 
+static int cpu_notifier(struct notifier_block *nb, unsigned long cmd, void *v)
+{
+       switch (cmd) {
+       case CPU_CLUSTER_PM_ENTER:
+               if (enable_off_mode)
+                       pwrdms_save_context();
+               break;
+       case CPU_CLUSTER_PM_EXIT:
+               if (enable_off_mode)
+                       pwrdms_restore_context();
+               break;
+       }
+
+       return NOTIFY_OK;
+}
+
 /**
  * pwrdm_complete_init - set up the powerdomain layer
  *
@@ -347,6 +367,7 @@ int pwrdm_register_pwrdms(struct powerdomain **ps)
 int pwrdm_complete_init(void)
 {
        struct powerdomain *temp_p;
+       static struct notifier_block nb;
 
        if (list_empty(&pwrdm_list))
                return -EACCES;
@@ -354,6 +375,12 @@ int pwrdm_complete_init(void)
        list_for_each_entry(temp_p, &pwrdm_list, node)
                pwrdm_set_next_pwrst(temp_p, PWRDM_POWER_ON);
 
+       /* Only AM43XX can lose pwrdm context during rtc-ddr suspend */
+       if (soc_is_am43xx()) {
+               nb.notifier_call = cpu_notifier;
+               cpu_pm_register_notifier(&nb);
+       }
+
        return 0;
 }