diff options
author | Santosh Shilimkar <santosh.shilimkar@ti.com> | 2010-06-16 22:19:49 +0530 |
---|---|---|
committer | Nishanth Menon <nm@ti.com> | 2011-06-13 16:36:42 -0500 |
commit | b3b2d3c05a362b41fe309f44d81805ac16ac0fb3 (patch) | |
tree | f4f856c7334eaa496d4a99477ffc3685e60f9e3a /arch/arm/mach-omap2/omap-hotplug.c | |
parent | c681b96ee9d934c8646e840e5b4b54d9ac468be5 (diff) | |
download | kernel_samsung_tuna-b3b2d3c05a362b41fe309f44d81805ac16ac0fb3.zip kernel_samsung_tuna-b3b2d3c05a362b41fe309f44d81805ac16ac0fb3.tar.gz kernel_samsung_tuna-b3b2d3c05a362b41fe309f44d81805ac16ac0fb3.tar.bz2 |
OMAP4: PM: CPU1 wakeup workaround from Low power modes
The SGI(Software Generated Interrupts) are not wakeup capable from
low power states. This is known limitation on OMAP4 and needs to be
worked around by using software forced clockdomain wake-up. CPU0 forces
the CPU1 clockdomain to software force wakeup. After the wakeup, CPU1
restores its clockdomain hardware supervised mode.
More details can be found in OMAP4430 TRM - Version J
Section :
4.3.4.2 Power States of CPU0 and CPU1
Signed-off-by: Santosh Shilimkar <santosh.shilimkar@ti.com>
Cc: Kevin Hilman <khilman@ti.com>
Diffstat (limited to 'arch/arm/mach-omap2/omap-hotplug.c')
-rw-r--r-- | arch/arm/mach-omap2/omap-hotplug.c | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/arch/arm/mach-omap2/omap-hotplug.c b/arch/arm/mach-omap2/omap-hotplug.c index 9f8f097..fe2dae1 100644 --- a/arch/arm/mach-omap2/omap-hotplug.c +++ b/arch/arm/mach-omap2/omap-hotplug.c @@ -23,6 +23,7 @@ #include <mach/omap-wakeupgen.h> #include "powerdomain.h" +#include "clockdomain.h" int platform_cpu_kill(unsigned int cpu) { @@ -36,6 +37,10 @@ int platform_cpu_kill(unsigned int cpu) void platform_cpu_die(unsigned int cpu) { unsigned int this_cpu; + static struct clockdomain *cpu1_clkdm; + + if (!cpu1_clkdm) + cpu1_clkdm = clkdm_lookup("mpu1_clkdm"); flush_cache_all(); dsb(); @@ -59,6 +64,9 @@ void platform_cpu_die(unsigned int cpu) * OK, proper wakeup, we're done */ omap_wakeupgen_irqmask_all(this_cpu, 0); + + /* Restore clockdomain to hardware supervised */ + clkdm_allow_idle(cpu1_clkdm); break; } pr_debug("CPU%u: spurious wakeup call\n", cpu); |