ARM: tegra: add hotplug support
Colin Cross [Sun, 3 Apr 2011 07:57:28 +0000 (00:57 -0700)]
Hotplug uses the same CPU wfi code as cpuidle to put either cpu
into a slightly lower power mode (clock gated, but still powered).
If the remaining cpu enters LP2, the hotplugged cpu will be power
gated until the remaining cpu is active.

Change-Id: Ib7428709043415dc759136cf91668f6f63fe5a5c
Signed-off-by: Colin Cross <ccross@android.com>

Rebase-Id: Ra4e0a44869bdb7af87404b02bb506f88389f3cc6

arch/arm/mach-tegra/common.h
arch/arm/mach-tegra/hotplug.c
arch/arm/mach-tegra/platsmp.c

index 301b35e..d84559f 100644 (file)
@@ -1,3 +1,4 @@
 extern struct smp_operations tegra_smp_ops;
 
 extern void tegra_cpu_die(unsigned int cpu);
+extern int tegra_cpu_kill(unsigned int cpu);
index 6fc3cd2..8a02bc4 100644 (file)
@@ -11,6 +11,7 @@
 #include <linux/kernel.h>
 #include <linux/smp.h>
 #include <linux/clk/tegra.h>
+#include <linux/cpu_pm.h>
 
 #include <asm/cacheflush.h>
 #include <asm/smp_plat.h>
 
 static void (*tegra_hotplug_shutdown)(void);
 
+int tegra_cpu_kill(unsigned int cpu)
+{
+       cpu = cpu_logical_map(cpu);
+
+       tegra_wait_cpu_in_reset(cpu);
+
+       tegra_disable_cpu_clock(cpu);
+
+       return 1;
+}
+
 /*
  * platform-specific code to shutdown a CPU
  *
  * Called with IRQs disabled
  */
-void __ref tegra_cpu_die(unsigned int cpu)
+void tegra_cpu_die(unsigned int cpu)
 {
        cpu = cpu_logical_map(cpu);
 
index 6f55dd8..5511fd2 100644 (file)
@@ -169,6 +169,7 @@ struct smp_operations tegra_smp_ops __initdata = {
        .smp_secondary_init     = tegra_secondary_init,
        .smp_boot_secondary     = tegra_boot_secondary,
 #ifdef CONFIG_HOTPLUG_CPU
+       .cpu_kill               = tegra_cpu_kill,
        .cpu_die                = tegra_cpu_die,
 #endif
 };