diff options
-rw-r--r-- | arch/x86/Kconfig | 3 | ||||
-rw-r--r-- | drivers/cpuidle/cpuidle.c | 2 | ||||
-rw-r--r-- | include/linux/cpuidle.h | 13 |
3 files changed, 17 insertions, 1 deletions
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 368864dfe6eb..37d1297e6787 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig | |||
@@ -105,6 +105,9 @@ config ARCH_HAS_ILOG2_U32 | |||
105 | config ARCH_HAS_ILOG2_U64 | 105 | config ARCH_HAS_ILOG2_U64 |
106 | def_bool n | 106 | def_bool n |
107 | 107 | ||
108 | config ARCH_HAS_CPU_IDLE_WAIT | ||
109 | def_bool y | ||
110 | |||
108 | config GENERIC_CALIBRATE_DELAY | 111 | config GENERIC_CALIBRATE_DELAY |
109 | def_bool y | 112 | def_bool y |
110 | 113 | ||
diff --git a/drivers/cpuidle/cpuidle.c b/drivers/cpuidle/cpuidle.c index d2fabe7863a9..794962d9f48b 100644 --- a/drivers/cpuidle/cpuidle.c +++ b/drivers/cpuidle/cpuidle.c | |||
@@ -82,7 +82,7 @@ void cpuidle_uninstall_idle_handler(void) | |||
82 | { | 82 | { |
83 | if (enabled_devices && (pm_idle != pm_idle_old)) { | 83 | if (enabled_devices && (pm_idle != pm_idle_old)) { |
84 | pm_idle = pm_idle_old; | 84 | pm_idle = pm_idle_old; |
85 | cpu_idle_wait(); | 85 | cpuidle_kick_cpus(); |
86 | } | 86 | } |
87 | } | 87 | } |
88 | 88 | ||
diff --git a/include/linux/cpuidle.h b/include/linux/cpuidle.h index 16a51546db44..cb95f5a9075a 100644 --- a/include/linux/cpuidle.h +++ b/include/linux/cpuidle.h | |||
@@ -72,6 +72,19 @@ cpuidle_set_statedata(struct cpuidle_state *state, void *data) | |||
72 | state->driver_data = data; | 72 | state->driver_data = data; |
73 | } | 73 | } |
74 | 74 | ||
75 | #ifdef CONFIG_SMP | ||
76 | #ifdef CONFIG_ARCH_HAS_CPU_IDLE_WAIT | ||
77 | static inline void cpuidle_kick_cpus(void) | ||
78 | { | ||
79 | cpu_idle_wait(); | ||
80 | } | ||
81 | #else /* !CONFIG_ARCH_HAS_CPU_IDLE_WAIT */ | ||
82 | #error "Arch needs cpu_idle_wait() equivalent here" | ||
83 | #endif /* !CONFIG_ARCH_HAS_CPU_IDLE_WAIT */ | ||
84 | #else /* !CONFIG_SMP */ | ||
85 | static inline void cpuidle_kick_cpus(void) {} | ||
86 | #endif /* !CONFIG_SMP */ | ||
87 | |||
75 | struct cpuidle_state_kobj { | 88 | struct cpuidle_state_kobj { |
76 | struct cpuidle_state *state; | 89 | struct cpuidle_state *state; |
77 | struct completion kobj_unregister; | 90 | struct completion kobj_unregister; |