]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - arch/arm/mach-exynos/pm.c
ARM: EXYNOS: Move the power sequence call in the cpu_pm notifier
[karo-tx-linux.git] / arch / arm / mach-exynos / pm.c
index 179f7e09e20d0ceb40774130e891427931b6970c..8b268b5b42fa8eb5e52ab82521258908ea3ef299 100644 (file)
@@ -279,15 +279,21 @@ static void exynos_pm_prepare(void)
        __raw_writel(virt_to_phys(exynos_cpu_resume), S5P_INFORM0);
 }
 
-static int exynos_pm_suspend(void)
+static void exynos_pm_central_suspend(void)
 {
        unsigned long tmp;
 
        /* Setting Central Sequence Register for power down mode */
-
        tmp = __raw_readl(S5P_CENTRAL_SEQ_CONFIGURATION);
        tmp &= ~S5P_CENTRAL_LOWPWR_CFG;
        __raw_writel(tmp, S5P_CENTRAL_SEQ_CONFIGURATION);
+}
+
+static int exynos_pm_suspend(void)
+{
+       unsigned long tmp;
+
+       exynos_pm_central_suspend();
 
        /* Setting SEQ_OPTION register */
 
@@ -300,7 +306,7 @@ static int exynos_pm_suspend(void)
        return 0;
 }
 
-static void exynos_pm_resume(void)
+static int exynos_pm_central_resume(void)
 {
        unsigned long tmp;
 
@@ -317,9 +323,17 @@ static void exynos_pm_resume(void)
                /* clear the wakeup state register */
                __raw_writel(0x0, S5P_WAKEUP_STAT);
                /* No need to perform below restore code */
-               goto early_wakeup;
+               return -1;
        }
 
+       return 0;
+}
+
+static void exynos_pm_resume(void)
+{
+       if (exynos_pm_central_resume())
+               goto early_wakeup;
+
        if (!soc_is_exynos5250())
                exynos_cpu_restore_register();
 
@@ -424,8 +438,10 @@ static int exynos_cpu_pm_notifier(struct notifier_block *self,
 
        switch (cmd) {
        case CPU_PM_ENTER:
-               if (cpu == 0)
+               if (cpu == 0) {
+                       exynos_pm_central_suspend();
                        exynos_cpu_save_register();
+               }
                break;
 
        case CPU_PM_EXIT:
@@ -433,6 +449,7 @@ static int exynos_cpu_pm_notifier(struct notifier_block *self,
                        if (!soc_is_exynos5250())
                                scu_enable(S5P_VA_SCU);
                        exynos_cpu_restore_register();
+                       exynos_pm_central_resume();
                }
                break;
        }