diff options
author | Daniel Lezcano <daniel.lezcano@linaro.org> | 2014-05-08 23:55:12 +0200 |
---|---|---|
committer | Kukjin Kim <kgene.kim@samsung.com> | 2014-05-25 22:21:08 +0200 |
commit | 0ebc13e2a2353f76ecdca11cf4d49da0b4e77f09 (patch) | |
tree | 20c5c6accf7376210a502e3edc75cf6a7ac657ec /arch/arm/mach-exynos/pm.c | |
parent | ARM: EXYNOS: Move the AFTR state function into pm.c (diff) | |
download | linux-0ebc13e2a2353f76ecdca11cf4d49da0b4e77f09.tar.xz linux-0ebc13e2a2353f76ecdca11cf4d49da0b4e77f09.zip |
ARM: EXYNOS: Move the power sequence call in the cpu_pm notifier
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>
Diffstat (limited to 'arch/arm/mach-exynos/pm.c')
-rw-r--r-- | arch/arm/mach-exynos/pm.c | 27 |
1 files changed, 22 insertions, 5 deletions
diff --git a/arch/arm/mach-exynos/pm.c b/arch/arm/mach-exynos/pm.c index 179f7e09e20d..8b268b5b42fa 100644 --- a/arch/arm/mach-exynos/pm.c +++ b/arch/arm/mach-exynos/pm.c @@ -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; } |