|
@@ -25,13 +25,28 @@
|
|
|
#include "smc.h"
|
|
|
|
|
|
#define EXYNOS_SLEEP_MAGIC 0x00000bad
|
|
|
+#define EXYNOS_AFTR_MAGIC 0xfcba0d10
|
|
|
#define EXYNOS_BOOT_ADDR 0x8
|
|
|
#define EXYNOS_BOOT_FLAG 0xc
|
|
|
|
|
|
+static void exynos_save_cp15(void)
|
|
|
+{
|
|
|
+ /* Save Power control and Diagnostic registers */
|
|
|
+ asm ("mrc p15, 0, %0, c15, c0, 0\n"
|
|
|
+ "mrc p15, 0, %1, c15, c0, 1\n"
|
|
|
+ : "=r" (cp15_save_power), "=r" (cp15_save_diag)
|
|
|
+ : : "cc");
|
|
|
+}
|
|
|
+
|
|
|
static int exynos_do_idle(unsigned long mode)
|
|
|
{
|
|
|
switch (mode) {
|
|
|
case FW_DO_IDLE_AFTR:
|
|
|
+ if (read_cpuid_part() == ARM_CPU_PART_CORTEX_A9)
|
|
|
+ exynos_save_cp15();
|
|
|
+ __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);
|
|
|
break;
|
|
|
case FW_DO_IDLE_SLEEP:
|
|
@@ -96,13 +111,8 @@ static int exynos_cpu_suspend(unsigned long arg)
|
|
|
|
|
|
static int exynos_suspend(void)
|
|
|
{
|
|
|
- if (read_cpuid_part() == ARM_CPU_PART_CORTEX_A9) {
|
|
|
- /* Save Power control and Diagnostic registers */
|
|
|
- asm ("mrc p15, 0, %0, c15, c0, 0\n"
|
|
|
- "mrc p15, 0, %1, c15, c0, 1\n"
|
|
|
- : "=r" (cp15_save_power), "=r" (cp15_save_diag)
|
|
|
- : : "cc");
|
|
|
- }
|
|
|
+ if (read_cpuid_part() == ARM_CPU_PART_CORTEX_A9)
|
|
|
+ exynos_save_cp15();
|
|
|
|
|
|
writel(EXYNOS_SLEEP_MAGIC, sysram_ns_base_addr + EXYNOS_BOOT_FLAG);
|
|
|
writel(virt_to_phys(exynos_cpu_resume_ns),
|