aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-omap2/omap-hotplug.c
diff options
context:
space:
mode:
authorSantosh Shilimkar <santosh.shilimkar@ti.com>2010-06-16 22:19:49 +0530
committerNishanth Menon <nm@ti.com>2011-06-13 16:36:42 -0500
commitb3b2d3c05a362b41fe309f44d81805ac16ac0fb3 (patch)
treef4f856c7334eaa496d4a99477ffc3685e60f9e3a /arch/arm/mach-omap2/omap-hotplug.c
parentc681b96ee9d934c8646e840e5b4b54d9ac468be5 (diff)
downloadkernel_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.c8
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);