ARM: EXYNOS: Move the power sequence call in the cpu_pm notifier
authorDaniel Lezcano <daniel.lezcano@linaro.org>
Thu, 8 May 2014 21:55:12 +0000 (06:55 +0900)
committerKukjin Kim <kgene.kim@samsung.com>
Sun, 25 May 2014 20:21:08 +0000 (05:21 +0900)
The code to initiate and exit the powerdown sequence is the same in
pm.c and cpuidle.c.

Let's split the common part in the pm.c and reuse it from the cpu_pm notifier.

That is one more step forward to make the cpuidle driver arch indenpendant.

Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
Reviewed-by: Viresh Kumar <viresh.kumar@linaro.org>
Reviewed-by: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
Reviewed-by: Tomasz Figa <t.figa@samsung.com>
Signed-off-by: Kukjin Kim <kgene.kim@samsung.com>
arch/arm/mach-exynos/cpuidle.c
arch/arm/mach-exynos/pm.c

index eea3eb9cecefb4be933b3b4ba8d3e223ba9c4108..cac51d852605b81258900e5f155d890722b0eb3d 100644 (file)
@@ -29,7 +29,6 @@
 #include <mach/map.h>
 
 #include "common.h"
-#include "regs-pmu.h"
 
 static int idle_finisher(unsigned long flags)
 {
@@ -43,31 +42,10 @@ static int exynos_enter_core0_aftr(struct cpuidle_device *dev,
                                struct cpuidle_driver *drv,
                                int index)
 {
-       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);
-
        cpu_pm_enter();
        cpu_suspend(0, idle_finisher);
        cpu_pm_exit();
 
-       /*
-        * If PMU failed while entering sleep mode, WFI will be
-        * ignored by PMU and then exiting cpu_do_idle().
-        * S5P_CENTRAL_LOWPWR_CFG bit will not be set automatically
-        * in this situation.
-        */
-       tmp = __raw_readl(S5P_CENTRAL_SEQ_CONFIGURATION);
-       if (!(tmp & S5P_CENTRAL_LOWPWR_CFG)) {
-               tmp |= S5P_CENTRAL_LOWPWR_CFG;
-               __raw_writel(tmp, S5P_CENTRAL_SEQ_CONFIGURATION);
-               /* Clear wakeup state register */
-               __raw_writel(0x0, S5P_WAKEUP_STAT);
-       }
-
        return index;
 }
 
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;
        }