ARM: EXYNOS: add AFTR mode support for Exynos3250
authorBartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
Thu, 26 Mar 2015 17:35:48 +0000 (02:35 +0900)
committerKukjin Kim <kgene@kernel.org>
Thu, 26 Mar 2015 17:35:48 +0000 (02:35 +0900)
AFTR mode support brings reduced energy consumption and is
a prerequisite for more advanced W-AFTR/LPA power saving modes.

AFTR mode has been already supported on other Exynos SoCs for
few years and this patch adds its support for Exynos3250 SoC.

The differences in Exynos3250 SoC AFTR mode support when compared
to Exynos4x12 SoCs are:
- different secure firmware calls are used
- different S5P_WAKEUP_MASK wakeup mask is used
- S5P_WAKEUP_MASK2 wakeup mask needs to be set in addition to
  the standard S5P_WAKEUP_MASK one
- C2_STATE BOOT mode flag needs to be set/cleared pre/post AFTR

Cc: Daniel Lezcano <daniel.lezcano@linaro.org>
Signed-off-by: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
Acked-by: Kyungmin Park <kyungmin.park@samsung.com>
Tested-by: Chanwoo Choi <cw00.choi@samsung.com>
Signed-off-by: Kukjin Kim <kgene@kernel.org>
arch/arm/mach-exynos/firmware.c
arch/arm/mach-exynos/pm.c
arch/arm/mach-exynos/regs-pmu.h
arch/arm/mach-exynos/smc.h

index 27b8ae3..1bd3576 100644 (file)
@@ -48,7 +48,13 @@ static int exynos_do_idle(unsigned long mode)
                __raw_writel(virt_to_phys(exynos_cpu_resume_ns),
                             sysram_ns_base_addr + 0x24);
                __raw_writel(EXYNOS_AFTR_MAGIC, sysram_ns_base_addr + 0x20);
-               exynos_smc(SMC_CMD_CPU0AFTR, 0, 0, 0);
+               if (soc_is_exynos3250()) {
+                       exynos_smc(SMC_CMD_SAVE, OP_TYPE_CORE,
+                                  SMC_POWERSTATE_IDLE, 0);
+                       exynos_smc(SMC_CMD_SHUTDOWN, OP_TYPE_CLUSTER,
+                                  SMC_POWERSTATE_IDLE, 0);
+               } else
+                       exynos_smc(SMC_CMD_CPU0AFTR, 0, 0, 0);
                break;
        case FW_DO_IDLE_SLEEP:
                exynos_smc(SMC_CMD_SLEEP, 0, 0, 0);
index e6209da..0a7e3af 100644 (file)
@@ -127,6 +127,8 @@ int exynos_pm_central_resume(void)
 static void exynos_set_wakeupmask(long mask)
 {
        pmu_raw_writel(mask, S5P_WAKEUP_MASK);
+       if (soc_is_exynos3250())
+               pmu_raw_writel(0x0, S5P_WAKEUP_MASK2);
 }
 
 static void exynos_cpu_set_boot_vector(long flags)
@@ -140,7 +142,7 @@ static int exynos_aftr_finisher(unsigned long flags)
 {
        int ret;
 
-       exynos_set_wakeupmask(0x0000ff3e);
+       exynos_set_wakeupmask(soc_is_exynos3250() ? 0x40003ffe : 0x0000ff3e);
        /* Set value of power down register for aftr mode */
        exynos_sys_powerdown_conf(SYS_AFTR);
 
@@ -157,8 +159,13 @@ static int exynos_aftr_finisher(unsigned long flags)
 
 void exynos_enter_aftr(void)
 {
+       unsigned int cpuid = smp_processor_id();
+
        cpu_pm_enter();
 
+       if (soc_is_exynos3250())
+               exynos_set_boot_flag(cpuid, C2_STATE);
+
        exynos_pm_central_suspend();
 
        if (of_machine_is_compatible("samsung,exynos4212") ||
@@ -178,6 +185,9 @@ void exynos_enter_aftr(void)
 
        exynos_pm_central_resume();
 
+       if (soc_is_exynos3250())
+               exynos_clear_boot_flag(cpuid, C2_STATE);
+
        cpu_pm_exit();
 }
 
Simple merge
Simple merge