ARM: tegra: power: implement LP1 suspend/resume for Tegra3
[linux-3.10.git] / arch / arm / mach-tegra / sleep.h
index cba062e..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
 .macro push_ctx_regs, tmp1
        push_stack_token \tmp1          @ debug check word
        stmfd   sp!, {r4 - r11, lr}
-       /* FIXME: The next two instructions should be removed if our change to
-          save the diagnostic regsiter in the CPU context is accepted. */
+#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
-       /* FIXME: The next two instructions should be removed if our change to
-          save the diagnostic regsiter in the CPU context is accepted. */
+#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
@@ -165,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
@@ -197,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
 }