summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGary King <gking@nvidia.com>2010-03-24 14:46:53 -0700
committerColin Cross <ccross@android.com>2010-10-03 23:08:57 -0700
commit1512cef47070413a175399c73c5f3636e4902162 (patch)
tree7abb75dc9e7a03eb19fe94d7f8635e054f356f56
parentea4fd77392475507475ed141b74fbf0aa690226a (diff)
ARM: enable CONFIG_CPU_IDLE support
add ARCH_HAS_CPU_IDLE_WAIT and ARCH_HAS_DEFAULT_IDLE configuration, and expose default_idle and cpu_idle_wait cpu_idle_wait implementation based on the implementation in the x86 tree Signed-off-by: Gary King <gking@nvidia.com>
-rw-r--r--arch/arm/Kconfig8
-rw-r--r--arch/arm/include/asm/system.h2
-rw-r--r--arch/arm/kernel/process.c16
3 files changed, 25 insertions, 1 deletions
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index 0c33e5aa44cd..6d122de88693 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -132,6 +132,14 @@ config RWSEM_GENERIC_SPINLOCK
config RWSEM_XCHGADD_ALGORITHM
bool
+config ARCH_HAS_CPU_IDLE_WAIT
+ bool
+ default y
+
+config ARCH_HAS_DEFAULT_IDLE
+ bool
+ default y
+
config ARCH_HAS_ILOG2_U32
bool
diff --git a/arch/arm/include/asm/system.h b/arch/arm/include/asm/system.h
index 8ba1ccf82a02..549c9786e0f9 100644
--- a/arch/arm/include/asm/system.h
+++ b/arch/arm/include/asm/system.h
@@ -97,6 +97,8 @@ extern void __show_regs(struct pt_regs *);
extern int cpu_architecture(void);
extern void cpu_init(void);
+extern void cpu_idle_wait(void);
+extern void default_idle(void);
void arm_machine_restart(char mode, const char *cmd);
extern void (*arm_pm_restart)(char str, const char *cmd);
diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c
index 401e38be1f78..69141f0b8388 100644
--- a/arch/arm/kernel/process.c
+++ b/arch/arm/kernel/process.c
@@ -140,12 +140,13 @@ EXPORT_SYMBOL_GPL(arm_pm_restart);
* This is our default idle handler. We need to disable
* interrupts here to ensure we don't miss a wakeup call.
*/
-static void default_idle(void)
+void default_idle(void)
{
if (!need_resched())
arch_idle();
local_irq_enable();
}
+EXPORT_SYMBOL(default_idle);
void (*pm_idle)(void) = default_idle;
EXPORT_SYMBOL(pm_idle);
@@ -195,6 +196,19 @@ void cpu_idle(void)
}
}
+#if defined(CONFIG_ARCH_HAS_CPU_IDLE_WAIT)
+static void do_nothing(void *unused)
+{
+}
+
+void cpu_idle_wait(void)
+{
+ smp_mb();
+ smp_call_function(do_nothing, NULL, 1);
+}
+#endif
+
+
static char reboot_mode = 'h';
int __init reboot_setup(char *str)