diff options
Diffstat (limited to 'drivers/cpuidle')
-rw-r--r-- | drivers/cpuidle/cpuidle-pseries.c | 28 |
1 files changed, 10 insertions, 18 deletions
diff --git a/drivers/cpuidle/cpuidle-pseries.c b/drivers/cpuidle/cpuidle-pseries.c index 5e13f6ce2271..bb56091685d3 100644 --- a/drivers/cpuidle/cpuidle-pseries.c +++ b/drivers/cpuidle/cpuidle-pseries.c | |||
@@ -24,9 +24,7 @@ struct cpuidle_driver pseries_idle_driver = { | |||
24 | .owner = THIS_MODULE, | 24 | .owner = THIS_MODULE, |
25 | }; | 25 | }; |
26 | 26 | ||
27 | #define MAX_IDLE_STATE_COUNT 2 | 27 | static int max_idle_state; |
28 | |||
29 | static int max_idle_state = MAX_IDLE_STATE_COUNT - 1; | ||
30 | static struct cpuidle_state *cpuidle_state_table; | 28 | static struct cpuidle_state *cpuidle_state_table; |
31 | 29 | ||
32 | static inline void idle_loop_prolog(unsigned long *in_purr) | 30 | static inline void idle_loop_prolog(unsigned long *in_purr) |
@@ -134,7 +132,7 @@ static int shared_cede_loop(struct cpuidle_device *dev, | |||
134 | /* | 132 | /* |
135 | * States for dedicated partition case. | 133 | * States for dedicated partition case. |
136 | */ | 134 | */ |
137 | static struct cpuidle_state dedicated_states[MAX_IDLE_STATE_COUNT] = { | 135 | static struct cpuidle_state dedicated_states[] = { |
138 | { /* Snooze */ | 136 | { /* Snooze */ |
139 | .name = "snooze", | 137 | .name = "snooze", |
140 | .desc = "snooze", | 138 | .desc = "snooze", |
@@ -154,7 +152,7 @@ static struct cpuidle_state dedicated_states[MAX_IDLE_STATE_COUNT] = { | |||
154 | /* | 152 | /* |
155 | * States for shared partition case. | 153 | * States for shared partition case. |
156 | */ | 154 | */ |
157 | static struct cpuidle_state shared_states[MAX_IDLE_STATE_COUNT] = { | 155 | static struct cpuidle_state shared_states[] = { |
158 | { /* Shared Cede */ | 156 | { /* Shared Cede */ |
159 | .name = "Shared Cede", | 157 | .name = "Shared Cede", |
160 | .desc = "Shared Cede", | 158 | .desc = "Shared Cede", |
@@ -225,12 +223,8 @@ static int pseries_cpuidle_driver_init(void) | |||
225 | 223 | ||
226 | drv->state_count = 0; | 224 | drv->state_count = 0; |
227 | 225 | ||
228 | for (idle_state = 0; idle_state < MAX_IDLE_STATE_COUNT; ++idle_state) { | 226 | for (idle_state = 0; idle_state < max_idle_state; ++idle_state) { |
229 | 227 | /* Is the state not enabled? */ | |
230 | if (idle_state > max_idle_state) | ||
231 | break; | ||
232 | |||
233 | /* is the state not enabled? */ | ||
234 | if (cpuidle_state_table[idle_state].enter == NULL) | 228 | if (cpuidle_state_table[idle_state].enter == NULL) |
235 | continue; | 229 | continue; |
236 | 230 | ||
@@ -253,16 +247,14 @@ static int pseries_idle_probe(void) | |||
253 | if (cpuidle_disable != IDLE_NO_OVERRIDE) | 247 | if (cpuidle_disable != IDLE_NO_OVERRIDE) |
254 | return -ENODEV; | 248 | return -ENODEV; |
255 | 249 | ||
256 | if (max_idle_state == 0) { | ||
257 | printk(KERN_DEBUG "pseries processor idle disabled.\n"); | ||
258 | return -EPERM; | ||
259 | } | ||
260 | |||
261 | if (firmware_has_feature(FW_FEATURE_SPLPAR)) { | 250 | if (firmware_has_feature(FW_FEATURE_SPLPAR)) { |
262 | if (lppaca_shared_proc(get_lppaca())) | 251 | if (lppaca_shared_proc(get_lppaca())) { |
263 | cpuidle_state_table = shared_states; | 252 | cpuidle_state_table = shared_states; |
264 | else | 253 | max_idle_state = ARRAY_SIZE(shared_states); |
254 | } else { | ||
265 | cpuidle_state_table = dedicated_states; | 255 | cpuidle_state_table = dedicated_states; |
256 | max_idle_state = ARRAY_SIZE(dedicated_states); | ||
257 | } | ||
266 | } else | 258 | } else |
267 | return -ENODEV; | 259 | return -ENODEV; |
268 | 260 | ||