diff options
| -rw-r--r-- | arch/x86/Kconfig | 3 | ||||
| -rw-r--r-- | drivers/cpuidle/cpuidle.c | 13 |
2 files changed, 15 insertions, 1 deletions
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 65a70b777c12..a64d532dff4c 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig | |||
| @@ -102,6 +102,9 @@ config ARCH_HAS_ILOG2_U32 | |||
| 102 | config ARCH_HAS_ILOG2_U64 | 102 | config ARCH_HAS_ILOG2_U64 |
| 103 | def_bool n | 103 | def_bool n |
| 104 | 104 | ||
| 105 | config ARCH_HAS_CPU_IDLE_WAIT | ||
| 106 | def_bool y | ||
| 107 | |||
| 105 | config GENERIC_CALIBRATE_DELAY | 108 | config GENERIC_CALIBRATE_DELAY |
| 106 | def_bool y | 109 | def_bool y |
| 107 | 110 | ||
diff --git a/drivers/cpuidle/cpuidle.c b/drivers/cpuidle/cpuidle.c index 2c4b2d47973e..60f71e6345e3 100644 --- a/drivers/cpuidle/cpuidle.c +++ b/drivers/cpuidle/cpuidle.c | |||
| @@ -27,6 +27,17 @@ static void (*pm_idle_old)(void); | |||
| 27 | 27 | ||
| 28 | static int enabled_devices; | 28 | static int enabled_devices; |
| 29 | 29 | ||
| 30 | #if defined(CONFIG_ARCH_HAS_CPU_IDLE_WAIT) | ||
| 31 | static void cpuidle_kick_cpus(void) | ||
| 32 | { | ||
| 33 | cpu_idle_wait(); | ||
| 34 | } | ||
| 35 | #elif defined(CONFIG_SMP) | ||
| 36 | # error "Arch needs cpu_idle_wait() equivalent here" | ||
| 37 | #else /* !CONFIG_ARCH_HAS_CPU_IDLE_WAIT && !CONFIG_SMP */ | ||
| 38 | static void cpuidle_kick_cpus(void) {} | ||
| 39 | #endif | ||
| 40 | |||
| 30 | /** | 41 | /** |
| 31 | * cpuidle_idle_call - the main idle loop | 42 | * cpuidle_idle_call - the main idle loop |
| 32 | * | 43 | * |
| @@ -83,7 +94,7 @@ void cpuidle_uninstall_idle_handler(void) | |||
| 83 | { | 94 | { |
| 84 | if (enabled_devices && (pm_idle != pm_idle_old)) { | 95 | if (enabled_devices && (pm_idle != pm_idle_old)) { |
| 85 | pm_idle = pm_idle_old; | 96 | pm_idle = pm_idle_old; |
| 86 | cpu_idle_wait(); | 97 | cpuidle_kick_cpus(); |
| 87 | } | 98 | } |
| 88 | } | 99 | } |
| 89 | 100 | ||
