summaryrefslogtreecommitdiff
path: root/arch/arm/mach-ebsa110/core.c
diff options
context:
space:
mode:
authorKukjin Kim <kgene.kim@samsung.com>2012-03-10 22:21:36 -0800
committerKukjin Kim <kgene.kim@samsung.com>2012-03-10 22:21:36 -0800
commitc15a04338b5a6d4305d107a5b6c0cd43418b7f3e (patch)
tree04d40a3b4fbc0477aa71c11044a20ff2d6666004 /arch/arm/mach-ebsa110/core.c
parent192cfd58774b4d17b2fe8bdc77d89c2ef4e0591d (diff)
parent60571f98d292b74586ff8330d8bc965eb01e8df0 (diff)
downloadlwn-c15a04338b5a6d4305d107a5b6c0cd43418b7f3e.tar.gz
lwn-c15a04338b5a6d4305d107a5b6c0cd43418b7f3e.zip
Merge branch 'next/cleanup-use-static' into next/cleanup-exynos-clock
Diffstat (limited to 'arch/arm/mach-ebsa110/core.c')
-rw-r--r--arch/arm/mach-ebsa110/core.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/arch/arm/mach-ebsa110/core.c b/arch/arm/mach-ebsa110/core.c
index 294aad07f7a0..804c9122b7b3 100644
--- a/arch/arm/mach-ebsa110/core.c
+++ b/arch/arm/mach-ebsa110/core.c
@@ -271,8 +271,33 @@ static struct platform_device *ebsa110_devices[] = {
&am79c961_device,
};
+/*
+ * EBSA110 idling methodology:
+ *
+ * We can not execute the "wait for interrupt" instruction since that
+ * will stop our MCLK signal (which provides the clock for the glue
+ * logic, and therefore the timer interrupt).
+ *
+ * Instead, we spin, polling the IRQ_STAT register for the occurrence
+ * of any interrupt with core clock down to the memory clock.
+ */
+static void ebsa110_idle(void)
+{
+ const char *irq_stat = (char *)0xff000000;
+
+ /* disable clock switching */
+ asm volatile ("mcr p15, 0, ip, c15, c2, 2" : : : "cc");
+
+ /* wait for an interrupt to occur */
+ while (!*irq_stat);
+
+ /* enable clock switching */
+ asm volatile ("mcr p15, 0, ip, c15, c1, 2" : : : "cc");
+}
+
static int __init ebsa110_init(void)
{
+ arm_pm_idle = ebsa110_idle;
return platform_add_devices(ebsa110_devices, ARRAY_SIZE(ebsa110_devices));
}