From 1512cef47070413a175399c73c5f3636e4902162 Mon Sep 17 00:00:00 2001 From: Gary King Date: Wed, 24 Mar 2010 14:46:53 -0700 Subject: [PATCH] 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 --- arch/arm/Kconfig | 8 ++++++++ arch/arm/include/asm/system.h | 2 ++ arch/arm/kernel/process.c | 16 +++++++++++++++- 3 files changed, 25 insertions(+), 1 deletion(-) 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) -- 2.34.1