diff options
-rw-r--r-- | kernel/power/main.c | 16 | ||||
-rw-r--r-- | kernel/power/power.h | 7 | ||||
-rw-r--r-- | kernel/power/suspend.c | 12 | ||||
-rw-r--r-- | kernel/power/suspend_test.c | 22 |
4 files changed, 30 insertions, 27 deletions
diff --git a/kernel/power/main.c b/kernel/power/main.c index 6271bc4073ef..8e818432253c 100644 --- a/kernel/power/main.c +++ b/kernel/power/main.c | |||
@@ -293,12 +293,12 @@ static ssize_t state_show(struct kobject *kobj, struct kobj_attribute *attr, | |||
293 | { | 293 | { |
294 | char *s = buf; | 294 | char *s = buf; |
295 | #ifdef CONFIG_SUSPEND | 295 | #ifdef CONFIG_SUSPEND |
296 | int i; | 296 | suspend_state_t i; |
297 | |||
298 | for (i = PM_SUSPEND_MIN; i < PM_SUSPEND_MAX; i++) | ||
299 | if (valid_state(i)) | ||
300 | s += sprintf(s,"%s ", pm_states[i].label); | ||
297 | 301 | ||
298 | for (i = 0; i < PM_SUSPEND_MAX; i++) { | ||
299 | if (pm_states[i] && valid_state(i)) | ||
300 | s += sprintf(s,"%s ", pm_states[i]); | ||
301 | } | ||
302 | #endif | 302 | #endif |
303 | #ifdef CONFIG_HIBERNATION | 303 | #ifdef CONFIG_HIBERNATION |
304 | s += sprintf(s, "%s\n", "disk"); | 304 | s += sprintf(s, "%s\n", "disk"); |
@@ -314,7 +314,7 @@ static suspend_state_t decode_state(const char *buf, size_t n) | |||
314 | { | 314 | { |
315 | #ifdef CONFIG_SUSPEND | 315 | #ifdef CONFIG_SUSPEND |
316 | suspend_state_t state = PM_SUSPEND_MIN; | 316 | suspend_state_t state = PM_SUSPEND_MIN; |
317 | const char * const *s; | 317 | struct pm_sleep_state *s; |
318 | #endif | 318 | #endif |
319 | char *p; | 319 | char *p; |
320 | int len; | 320 | int len; |
@@ -328,7 +328,7 @@ static suspend_state_t decode_state(const char *buf, size_t n) | |||
328 | 328 | ||
329 | #ifdef CONFIG_SUSPEND | 329 | #ifdef CONFIG_SUSPEND |
330 | for (s = &pm_states[state]; state < PM_SUSPEND_MAX; s++, state++) | 330 | for (s = &pm_states[state]; state < PM_SUSPEND_MAX; s++, state++) |
331 | if (*s && len == strlen(*s) && !strncmp(buf, *s, len)) | 331 | if (len == strlen(s->label) && !strncmp(buf, s->label, len)) |
332 | return state; | 332 | return state; |
333 | #endif | 333 | #endif |
334 | 334 | ||
@@ -448,7 +448,7 @@ static ssize_t autosleep_show(struct kobject *kobj, | |||
448 | #ifdef CONFIG_SUSPEND | 448 | #ifdef CONFIG_SUSPEND |
449 | if (state < PM_SUSPEND_MAX) | 449 | if (state < PM_SUSPEND_MAX) |
450 | return sprintf(buf, "%s\n", valid_state(state) ? | 450 | return sprintf(buf, "%s\n", valid_state(state) ? |
451 | pm_states[state] : "error"); | 451 | pm_states[state].label : "error"); |
452 | #endif | 452 | #endif |
453 | #ifdef CONFIG_HIBERNATION | 453 | #ifdef CONFIG_HIBERNATION |
454 | return sprintf(buf, "disk\n"); | 454 | return sprintf(buf, "disk\n"); |
diff --git a/kernel/power/power.h b/kernel/power/power.h index 15f37ea08719..99539c5da844 100644 --- a/kernel/power/power.h +++ b/kernel/power/power.h | |||
@@ -178,8 +178,13 @@ extern void swsusp_show_speed(struct timeval *, struct timeval *, | |||
178 | unsigned int, char *); | 178 | unsigned int, char *); |
179 | 179 | ||
180 | #ifdef CONFIG_SUSPEND | 180 | #ifdef CONFIG_SUSPEND |
181 | struct pm_sleep_state { | ||
182 | const char *label; | ||
183 | suspend_state_t state; | ||
184 | }; | ||
185 | |||
181 | /* kernel/power/suspend.c */ | 186 | /* kernel/power/suspend.c */ |
182 | extern const char *const pm_states[]; | 187 | extern struct pm_sleep_state pm_states[]; |
183 | 188 | ||
184 | extern bool valid_state(suspend_state_t state); | 189 | extern bool valid_state(suspend_state_t state); |
185 | extern int suspend_devices_and_enter(suspend_state_t state); | 190 | extern int suspend_devices_and_enter(suspend_state_t state); |
diff --git a/kernel/power/suspend.c b/kernel/power/suspend.c index 155721f7f909..5d93b138a2d4 100644 --- a/kernel/power/suspend.c +++ b/kernel/power/suspend.c | |||
@@ -31,10 +31,10 @@ | |||
31 | 31 | ||
32 | #include "power.h" | 32 | #include "power.h" |
33 | 33 | ||
34 | const char *const pm_states[PM_SUSPEND_MAX] = { | 34 | struct pm_sleep_state pm_states[PM_SUSPEND_MAX] = { |
35 | [PM_SUSPEND_FREEZE] = "freeze", | 35 | [PM_SUSPEND_FREEZE] = { "freeze", PM_SUSPEND_FREEZE }, |
36 | [PM_SUSPEND_STANDBY] = "standby", | 36 | [PM_SUSPEND_STANDBY] = { "standby", PM_SUSPEND_STANDBY }, |
37 | [PM_SUSPEND_MEM] = "mem", | 37 | [PM_SUSPEND_MEM] = { "mem", PM_SUSPEND_MEM }, |
38 | }; | 38 | }; |
39 | 39 | ||
40 | static const struct platform_suspend_ops *suspend_ops; | 40 | static const struct platform_suspend_ops *suspend_ops; |
@@ -343,7 +343,7 @@ static int enter_state(suspend_state_t state) | |||
343 | sys_sync(); | 343 | sys_sync(); |
344 | printk("done.\n"); | 344 | printk("done.\n"); |
345 | 345 | ||
346 | pr_debug("PM: Preparing system for %s sleep\n", pm_states[state]); | 346 | pr_debug("PM: Preparing system for %s sleep\n", pm_states[state].label); |
347 | error = suspend_prepare(state); | 347 | error = suspend_prepare(state); |
348 | if (error) | 348 | if (error) |
349 | goto Unlock; | 349 | goto Unlock; |
@@ -351,7 +351,7 @@ static int enter_state(suspend_state_t state) | |||
351 | if (suspend_test(TEST_FREEZER)) | 351 | if (suspend_test(TEST_FREEZER)) |
352 | goto Finish; | 352 | goto Finish; |
353 | 353 | ||
354 | pr_debug("PM: Entering %s sleep\n", pm_states[state]); | 354 | pr_debug("PM: Entering %s sleep\n", pm_states[state].label); |
355 | pm_restrict_gfp_mask(); | 355 | pm_restrict_gfp_mask(); |
356 | error = suspend_devices_and_enter(state); | 356 | error = suspend_devices_and_enter(state); |
357 | pm_restore_gfp_mask(); | 357 | pm_restore_gfp_mask(); |
diff --git a/kernel/power/suspend_test.c b/kernel/power/suspend_test.c index 9b2a1d58558d..d4e3ab167a73 100644 --- a/kernel/power/suspend_test.c +++ b/kernel/power/suspend_test.c | |||
@@ -92,13 +92,13 @@ static void __init test_wakealarm(struct rtc_device *rtc, suspend_state_t state) | |||
92 | } | 92 | } |
93 | 93 | ||
94 | if (state == PM_SUSPEND_MEM) { | 94 | if (state == PM_SUSPEND_MEM) { |
95 | printk(info_test, pm_states[state]); | 95 | printk(info_test, pm_states[state].label); |
96 | status = pm_suspend(state); | 96 | status = pm_suspend(state); |
97 | if (status == -ENODEV) | 97 | if (status == -ENODEV) |
98 | state = PM_SUSPEND_STANDBY; | 98 | state = PM_SUSPEND_STANDBY; |
99 | } | 99 | } |
100 | if (state == PM_SUSPEND_STANDBY) { | 100 | if (state == PM_SUSPEND_STANDBY) { |
101 | printk(info_test, pm_states[state]); | 101 | printk(info_test, pm_states[state].label); |
102 | status = pm_suspend(state); | 102 | status = pm_suspend(state); |
103 | } | 103 | } |
104 | if (status < 0) | 104 | if (status < 0) |
@@ -136,18 +136,16 @@ static char warn_bad_state[] __initdata = | |||
136 | 136 | ||
137 | static int __init setup_test_suspend(char *value) | 137 | static int __init setup_test_suspend(char *value) |
138 | { | 138 | { |
139 | unsigned i; | 139 | suspend_state_t i; |
140 | 140 | ||
141 | /* "=mem" ==> "mem" */ | 141 | /* "=mem" ==> "mem" */ |
142 | value++; | 142 | value++; |
143 | for (i = 0; i < PM_SUSPEND_MAX; i++) { | 143 | for (i = PM_SUSPEND_MIN; i < PM_SUSPEND_MAX; i++) |
144 | if (!pm_states[i]) | 144 | if (!strcmp(pm_states[i].label, value)) { |
145 | continue; | 145 | test_state = pm_states[i].state; |
146 | if (strcmp(pm_states[i], value) != 0) | 146 | return 0; |
147 | continue; | 147 | } |
148 | test_state = (__force suspend_state_t) i; | 148 | |
149 | return 0; | ||
150 | } | ||
151 | printk(warn_bad_state, value); | 149 | printk(warn_bad_state, value); |
152 | return 0; | 150 | return 0; |
153 | } | 151 | } |
@@ -165,7 +163,7 @@ static int __init test_suspend(void) | |||
165 | if (test_state == PM_SUSPEND_ON) | 163 | if (test_state == PM_SUSPEND_ON) |
166 | goto done; | 164 | goto done; |
167 | if (!valid_state(test_state)) { | 165 | if (!valid_state(test_state)) { |
168 | printk(warn_bad_state, pm_states[test_state]); | 166 | printk(warn_bad_state, pm_states[test_state].label); |
169 | goto done; | 167 | goto done; |
170 | } | 168 | } |
171 | 169 | ||