diff options
author | Arnd Bergmann <arnd@arndb.de> | 2012-03-16 01:05:52 +0400 |
---|---|---|
committer | Arnd Bergmann <arnd@arndb.de> | 2012-03-16 01:05:52 +0400 |
commit | 38abdcd0d0689aaca94e740ac67a952c7918caef (patch) | |
tree | 83051487c15c3a062eb4dbff16c13e517c309a78 /arch/arm/mach-ebsa110/core.c | |
parent | 709baa67c676a187a63c0f0f40efceb3fb1eef72 (diff) | |
parent | 61b80086a525c8a6081257ae40da5dee2bcaee16 (diff) | |
download | linux-38abdcd0d0689aaca94e740ac67a952c7918caef.tar.xz |
Merge branch 'for-armsoc' of http://ftp.arm.linux.org.uk/pub/linux/arm/kernel/git-cur/linux-2.6-arm into next/soc2
Conflicts:
arch/arm/mach-tegra/common.c
arch/arm/mach-ux500/devices-common.c
This resolves two conflicts and lets us merge the exynos5 branch
cleanly.
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Diffstat (limited to 'arch/arm/mach-ebsa110/core.c')
-rw-r--r-- | arch/arm/mach-ebsa110/core.c | 25 |
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)); } |