ARM: tegra: add a flag for tegra_disable_clean_inv_dcache to do LoUIS or ALL
authorJoseph Lo <josephl@nvidia.com>
Wed, 3 Jul 2013 09:50:38 +0000 (17:50 +0800)
committerStephen Warren <swarren@nvidia.com>
Fri, 19 Jul 2013 16:08:05 +0000 (10:08 -0600)
Adding a flag for tegra_disable_clean_inv_dcache to flush cache as LoUIS
or ALL. After this patch, the v7_flush_dcache_louis is used for CPU hotplug
and CPU suspend in CPU power down (e.g. CPU idle power-down mode) case. And
the v7_flush_dcache_all is used for CPU cluster power down (e.g. suspend to
LP2 mode).

Signed-off-by: Joseph Lo <josephl@nvidia.com>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
arch/arm/mach-tegra/hotplug.c
arch/arm/mach-tegra/sleep-tegra20.S
arch/arm/mach-tegra/sleep-tegra30.S
arch/arm/mach-tegra/sleep.S
arch/arm/mach-tegra/sleep.h

index d07f152b275f1cccec7ca37b0bdf42a5426d6ce9..04de2e8609237fbd8133b4e8341a588db47c7a33 100644 (file)
@@ -37,7 +37,7 @@ int tegra_cpu_kill(unsigned cpu)
 void __ref tegra_cpu_die(unsigned int cpu)
 {
        /* Clean L1 data cache */
-       tegra_disable_clean_inv_dcache();
+       tegra_disable_clean_inv_dcache(TEGRA_FLUSH_CACHE_LOUIS);
 
        /* Shut down the current CPU. */
        tegra_hotplug_shutdown();
index e3f2417c420e28df7fb7f2a084387086a7b6e8e5..f87721d6e50d8b9b07a5b305ec9f5b08a40f3880 100644 (file)
@@ -191,6 +191,7 @@ ENTRY(tegra20_sleep_cpu_secondary_finish)
        mrc     p15, 0, r11, c1, c0, 1  @ save actlr before exiting coherency
 
        /* Flush and disable the L1 data cache */
+       mov     r0, #TEGRA_FLUSH_CACHE_LOUIS
        bl      tegra_disable_clean_inv_dcache
 
        mov32   r0, TEGRA_PMC_VIRT + PMC_SCRATCH41
index 5877f268fa9701856dd9309286491131f40a6fc6..6744161475b2c54988da63e675cf91bd5897746b 100644 (file)
@@ -137,6 +137,7 @@ ENTRY(tegra30_sleep_cpu_secondary_finish)
        mov     r7, lr
 
        /* Flush and disable the L1 data cache */
+       mov     r0, #TEGRA_FLUSH_CACHE_LOUIS
        bl      tegra_disable_clean_inv_dcache
 
        /* Powergate this CPU. */
index 9daaef26b0f68e353048a2df80e204cfd57f54f6..6d6600dcbfe229a6aee287e1354dc99f2439b0cb 100644 (file)
@@ -56,7 +56,9 @@ ENTRY(tegra_disable_clean_inv_dcache)
        isb
 
        /* Flush the D-cache */
-       bl      v7_flush_dcache_louis
+       cmp     r0, #TEGRA_FLUSH_CACHE_ALL
+       blne    v7_flush_dcache_louis
+       bleq    v7_flush_dcache_all
 
        /* Trun off coherency */
        exit_smp r4, r5
@@ -73,9 +75,12 @@ ENDPROC(tegra_disable_clean_inv_dcache)
  * tegra?_tear_down_cpu
  */
 ENTRY(tegra_sleep_cpu_finish)
+       mov     r4, r0
        /* Flush and disable the L1 data cache */
+       mov     r0, #TEGRA_FLUSH_CACHE_ALL
        bl      tegra_disable_clean_inv_dcache
 
+       mov     r0, r4
        mov32   r6, tegra_tear_down_cpu
        ldr     r1, [r6]
        add     r1, r1, r0
index 98b7da698f2b1626d891d9db4a5305c13ae695d4..e907e406d129243f2cc7b48fea51d417246d94a0 100644 (file)
 #define CPU_NOT_RESETTABLE     0
 #endif
 
+/* flag of tegra_disable_clean_inv_dcache to do LoUIS or all */
+#define TEGRA_FLUSH_CACHE_LOUIS        0
+#define TEGRA_FLUSH_CACHE_ALL  1
+
 #ifdef __ASSEMBLY__
 /* returns the offset of the flow controller halt register for a cpu */
 .macro cpu_to_halt_reg rd, rcpu
@@ -144,7 +148,7 @@ void tegra_pen_lock(void);
 void tegra_pen_unlock(void);
 void tegra_resume(void);
 int tegra_sleep_cpu_finish(unsigned long);
-void tegra_disable_clean_inv_dcache(void);
+void tegra_disable_clean_inv_dcache(u32 flag);
 
 #ifdef CONFIG_HOTPLUG_CPU
 void tegra20_hotplug_shutdown(void);