ARM: tegra: power: implement LP1 suspend/resume for Tegra3
[linux-3.10.git] / arch / arm / mach-tegra / sleep.h
index 832f396..3f103c5 100644 (file)
 
 #include "iomap.h"
 
+#ifdef CONFIG_CACHE_L2X0
+#define USE_TEGRA_CPU_SUSPEND  1
+#else
+#define USE_TEGRA_CPU_SUSPEND  0
+#endif
+/* FIXME: The core associated with this should be removed if our change to
+   save the diagnostic regsiter in the CPU context is accepted. */
+#define USE_TEGRA_DIAG_REG_SAVE        1
+
 #define TEGRA_POWER_SDRAM_SELFREFRESH  (1 << 26) /* SDRAM is in self-refresh */
 #define TEGRA_POWER_HOTPLUG_SHUTDOWN   (1 << 27) /* Hotplug shutdown */
 #define TEGRA_POWER_CLUSTER_G          (1 << 28) /* G CPU */
                                        + IO_PPSB_VIRT)
 
 #ifdef __ASSEMBLY__
+/* waits until the microsecond counter (base) ticks, for exact timing loops */
+.macro  wait_for_us, rd, base, tmp
+       ldr    \rd, [\base]
+1001:   ldr    \tmp, [\base]
+       cmp    \rd, \tmp
+       beq    1001b
+       mov    \tmp, \rd
+.endm
+
 /* waits until the microsecond counter (base) is > rn */
 .macro wait_until, rn, base, tmp
        add     \rn, \rn, #1
        str     \tmp2, [\tmp1]                  @ invalidate SCU tags for CPU
        dsb
 .endm
+
+#define DEBUG_CONTEXT_STACK    0
+
+/* pops a debug check token from the stack */
+.macro pop_stack_token tmp1, tmp2
+#if DEBUG_CONTEXT_STACK
+       mov32   \tmp1, 0xBAB1F00D
+       ldmfd   sp!, {\tmp2}
+       cmp     \tmp1, \tmp2
+       movne   pc, #0
+#endif
+.endm
+
+/* pushes a debug check token onto the stack */
+.macro push_stack_token tmp1
+#if DEBUG_CONTEXT_STACK
+       mov32   \tmp1, 0xBAB1F00D
+       stmfd   sp!, {\tmp1}
+#endif
+.endm
+
+.macro push_ctx_regs, tmp1
+       push_stack_token \tmp1          @ debug check word
+       stmfd   sp!, {r4 - r11, lr}
+#if USE_TEGRA_DIAG_REG_SAVE
+       mrc     p15, 0, r4, c15, c0, 1  @ read diagnostic register
+       stmfd   sp!, {r4}
+#endif
+.endm
+
+.macro pop_ctx_regs, tmp1, tmp2
+#if USE_TEGRA_DIAG_REG_SAVE
+       ldmfd   sp!, {r4}
+       mcr     p15, 0, r4, c15, c0, 1  @ write diagnostic register
+#endif
+       ldmfd   sp!, {r4 - r11, lr}
+       pop_stack_token \tmp1, \tmp2    @ debug stack debug token
+.endm
+
 #else
 
 #ifdef CONFIG_HOTPLUG_CPU
@@ -126,6 +183,7 @@ extern void tegra2_iram_end;
 int  tegra2_cpu_is_resettable_soon(void);
 void tegra2_cpu_reset(int cpu);
 void tegra2_cpu_set_resettable_soon(void);
+void tegra2_cpu_clear_resettable(void);
 void tegra2_sleep_core(unsigned long v2p);
 void tegra2_sleep_wfi(unsigned long v2p);
 #else
@@ -158,8 +216,7 @@ static inline void tegra_sleep_core(unsigned long v2p)
 #ifdef CONFIG_ARCH_TEGRA_2x_SOC
        tegra2_sleep_core(v2p);
 #else
-       /* tegra3_sleep_core(v2p);    !!!FIXME!!! not supported yet */
-       BUG();
+       tegra3_sleep_core(v2p);
 #endif
 }