diff options
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/power/Kconfig | 3 | ||||
-rw-r--r-- | kernel/power/hibernate.c | 27 | ||||
-rw-r--r-- | kernel/power/main.c | 33 | ||||
-rw-r--r-- | kernel/power/power.h | 9 | ||||
-rw-r--r-- | kernel/power/suspend.c | 109 | ||||
-rw-r--r-- | kernel/power/suspend_test.c | 24 | ||||
-rw-r--r-- | kernel/power/swap.c | 2 |
7 files changed, 130 insertions, 77 deletions
diff --git a/kernel/power/Kconfig b/kernel/power/Kconfig index 2fac9cc79b3d..9a83d780facd 100644 --- a/kernel/power/Kconfig +++ b/kernel/power/Kconfig | |||
@@ -257,8 +257,7 @@ config ARCH_HAS_OPP | |||
257 | bool | 257 | bool |
258 | 258 | ||
259 | config PM_OPP | 259 | config PM_OPP |
260 | bool "Operating Performance Point (OPP) Layer library" | 260 | bool |
261 | depends on ARCH_HAS_OPP | ||
262 | ---help--- | 261 | ---help--- |
263 | SOCs have a standard set of tuples consisting of frequency and | 262 | SOCs have a standard set of tuples consisting of frequency and |
264 | voltage pairs that the device will support per voltage domain. This | 263 | voltage pairs that the device will support per voltage domain. This |
diff --git a/kernel/power/hibernate.c b/kernel/power/hibernate.c index f4f2073711d3..df88d55dc436 100644 --- a/kernel/power/hibernate.c +++ b/kernel/power/hibernate.c | |||
@@ -35,7 +35,7 @@ | |||
35 | static int nocompress; | 35 | static int nocompress; |
36 | static int noresume; | 36 | static int noresume; |
37 | static int resume_wait; | 37 | static int resume_wait; |
38 | static int resume_delay; | 38 | static unsigned int resume_delay; |
39 | static char resume_file[256] = CONFIG_PM_STD_PARTITION; | 39 | static char resume_file[256] = CONFIG_PM_STD_PARTITION; |
40 | dev_t swsusp_resume_device; | 40 | dev_t swsusp_resume_device; |
41 | sector_t swsusp_resume_block; | 41 | sector_t swsusp_resume_block; |
@@ -228,19 +228,23 @@ static void platform_recover(int platform_mode) | |||
228 | void swsusp_show_speed(struct timeval *start, struct timeval *stop, | 228 | void swsusp_show_speed(struct timeval *start, struct timeval *stop, |
229 | unsigned nr_pages, char *msg) | 229 | unsigned nr_pages, char *msg) |
230 | { | 230 | { |
231 | s64 elapsed_centisecs64; | 231 | u64 elapsed_centisecs64; |
232 | int centisecs; | 232 | unsigned int centisecs; |
233 | int k; | 233 | unsigned int k; |
234 | int kps; | 234 | unsigned int kps; |
235 | 235 | ||
236 | elapsed_centisecs64 = timeval_to_ns(stop) - timeval_to_ns(start); | 236 | elapsed_centisecs64 = timeval_to_ns(stop) - timeval_to_ns(start); |
237 | /* | ||
238 | * If "(s64)elapsed_centisecs64 < 0", it will print long elapsed time, | ||
239 | * it is obvious enough for what went wrong. | ||
240 | */ | ||
237 | do_div(elapsed_centisecs64, NSEC_PER_SEC / 100); | 241 | do_div(elapsed_centisecs64, NSEC_PER_SEC / 100); |
238 | centisecs = elapsed_centisecs64; | 242 | centisecs = elapsed_centisecs64; |
239 | if (centisecs == 0) | 243 | if (centisecs == 0) |
240 | centisecs = 1; /* avoid div-by-zero */ | 244 | centisecs = 1; /* avoid div-by-zero */ |
241 | k = nr_pages * (PAGE_SIZE / 1024); | 245 | k = nr_pages * (PAGE_SIZE / 1024); |
242 | kps = (k * 100) / centisecs; | 246 | kps = (k * 100) / centisecs; |
243 | printk(KERN_INFO "PM: %s %d kbytes in %d.%02d seconds (%d.%02d MB/s)\n", | 247 | printk(KERN_INFO "PM: %s %u kbytes in %u.%02u seconds (%u.%02u MB/s)\n", |
244 | msg, k, | 248 | msg, k, |
245 | centisecs / 100, centisecs % 100, | 249 | centisecs / 100, centisecs % 100, |
246 | kps / 1000, (kps % 1000) / 10); | 250 | kps / 1000, (kps % 1000) / 10); |
@@ -595,7 +599,8 @@ static void power_down(void) | |||
595 | case HIBERNATION_PLATFORM: | 599 | case HIBERNATION_PLATFORM: |
596 | hibernation_platform_enter(); | 600 | hibernation_platform_enter(); |
597 | case HIBERNATION_SHUTDOWN: | 601 | case HIBERNATION_SHUTDOWN: |
598 | kernel_power_off(); | 602 | if (pm_power_off) |
603 | kernel_power_off(); | ||
599 | break; | 604 | break; |
600 | #ifdef CONFIG_SUSPEND | 605 | #ifdef CONFIG_SUSPEND |
601 | case HIBERNATION_SUSPEND: | 606 | case HIBERNATION_SUSPEND: |
@@ -623,7 +628,8 @@ static void power_down(void) | |||
623 | * corruption after resume. | 628 | * corruption after resume. |
624 | */ | 629 | */ |
625 | printk(KERN_CRIT "PM: Please power down manually\n"); | 630 | printk(KERN_CRIT "PM: Please power down manually\n"); |
626 | while(1); | 631 | while (1) |
632 | cpu_relax(); | ||
627 | } | 633 | } |
628 | 634 | ||
629 | /** | 635 | /** |
@@ -1109,7 +1115,10 @@ static int __init resumewait_setup(char *str) | |||
1109 | 1115 | ||
1110 | static int __init resumedelay_setup(char *str) | 1116 | static int __init resumedelay_setup(char *str) |
1111 | { | 1117 | { |
1112 | resume_delay = simple_strtoul(str, NULL, 0); | 1118 | int rc = kstrtouint(str, 0, &resume_delay); |
1119 | |||
1120 | if (rc) | ||
1121 | return rc; | ||
1113 | return 1; | 1122 | return 1; |
1114 | } | 1123 | } |
1115 | 1124 | ||
diff --git a/kernel/power/main.c b/kernel/power/main.c index 6271bc4073ef..573410d6647e 100644 --- a/kernel/power/main.c +++ b/kernel/power/main.c | |||
@@ -279,26 +279,26 @@ static inline void pm_print_times_init(void) {} | |||
279 | struct kobject *power_kobj; | 279 | struct kobject *power_kobj; |
280 | 280 | ||
281 | /** | 281 | /** |
282 | * state - control system power state. | 282 | * state - control system sleep states. |
283 | * | 283 | * |
284 | * show() returns what states are supported, which is hard-coded to | 284 | * show() returns available sleep state labels, which may be "mem", "standby", |
285 | * 'freeze' (Low-Power Idle), 'standby' (Power-On Suspend), | 285 | * "freeze" and "disk" (hibernation). See Documentation/power/states.txt for a |
286 | * 'mem' (Suspend-to-RAM), and 'disk' (Suspend-to-Disk). | 286 | * description of what they mean. |
287 | * | 287 | * |
288 | * store() accepts one of those strings, translates it into the | 288 | * store() accepts one of those strings, translates it into the proper |
289 | * proper enumerated value, and initiates a suspend transition. | 289 | * enumerated value, and initiates a suspend transition. |
290 | */ | 290 | */ |
291 | static ssize_t state_show(struct kobject *kobj, struct kobj_attribute *attr, | 291 | static ssize_t state_show(struct kobject *kobj, struct kobj_attribute *attr, |
292 | char *buf) | 292 | char *buf) |
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 (pm_states[i].state) | ||
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,8 +328,9 @@ 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 (s->state && len == strlen(s->label) |
332 | return state; | 332 | && !strncmp(buf, s->label, len)) |
333 | return s->state; | ||
333 | #endif | 334 | #endif |
334 | 335 | ||
335 | return PM_SUSPEND_ON; | 336 | return PM_SUSPEND_ON; |
@@ -447,8 +448,8 @@ static ssize_t autosleep_show(struct kobject *kobj, | |||
447 | 448 | ||
448 | #ifdef CONFIG_SUSPEND | 449 | #ifdef CONFIG_SUSPEND |
449 | if (state < PM_SUSPEND_MAX) | 450 | if (state < PM_SUSPEND_MAX) |
450 | return sprintf(buf, "%s\n", valid_state(state) ? | 451 | return sprintf(buf, "%s\n", pm_states[state].state ? |
451 | pm_states[state] : "error"); | 452 | pm_states[state].label : "error"); |
452 | #endif | 453 | #endif |
453 | #ifdef CONFIG_HIBERNATION | 454 | #ifdef CONFIG_HIBERNATION |
454 | return sprintf(buf, "disk\n"); | 455 | return sprintf(buf, "disk\n"); |
diff --git a/kernel/power/power.h b/kernel/power/power.h index 15f37ea08719..c60f13b5270a 100644 --- a/kernel/power/power.h +++ b/kernel/power/power.h | |||
@@ -178,17 +178,20 @@ 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); | ||
185 | extern int suspend_devices_and_enter(suspend_state_t state); | 189 | extern int suspend_devices_and_enter(suspend_state_t state); |
186 | #else /* !CONFIG_SUSPEND */ | 190 | #else /* !CONFIG_SUSPEND */ |
187 | static inline int suspend_devices_and_enter(suspend_state_t state) | 191 | static inline int suspend_devices_and_enter(suspend_state_t state) |
188 | { | 192 | { |
189 | return -ENOSYS; | 193 | return -ENOSYS; |
190 | } | 194 | } |
191 | static inline bool valid_state(suspend_state_t state) { return false; } | ||
192 | #endif /* !CONFIG_SUSPEND */ | 195 | #endif /* !CONFIG_SUSPEND */ |
193 | 196 | ||
194 | #ifdef CONFIG_PM_TEST_SUSPEND | 197 | #ifdef CONFIG_PM_TEST_SUSPEND |
diff --git a/kernel/power/suspend.c b/kernel/power/suspend.c index 155721f7f909..963e6d0f050b 100644 --- a/kernel/power/suspend.c +++ b/kernel/power/suspend.c | |||
@@ -31,13 +31,14 @@ | |||
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] = { .label = "freeze", .state = PM_SUSPEND_FREEZE }, |
36 | [PM_SUSPEND_STANDBY] = "standby", | 36 | [PM_SUSPEND_STANDBY] = { .label = "standby", }, |
37 | [PM_SUSPEND_MEM] = "mem", | 37 | [PM_SUSPEND_MEM] = { .label = "mem", }, |
38 | }; | 38 | }; |
39 | 39 | ||
40 | static const struct platform_suspend_ops *suspend_ops; | 40 | static const struct platform_suspend_ops *suspend_ops; |
41 | static const struct platform_freeze_ops *freeze_ops; | ||
41 | 42 | ||
42 | static bool need_suspend_ops(suspend_state_t state) | 43 | static bool need_suspend_ops(suspend_state_t state) |
43 | { | 44 | { |
@@ -47,6 +48,13 @@ static bool need_suspend_ops(suspend_state_t state) | |||
47 | static DECLARE_WAIT_QUEUE_HEAD(suspend_freeze_wait_head); | 48 | static DECLARE_WAIT_QUEUE_HEAD(suspend_freeze_wait_head); |
48 | static bool suspend_freeze_wake; | 49 | static bool suspend_freeze_wake; |
49 | 50 | ||
51 | void freeze_set_ops(const struct platform_freeze_ops *ops) | ||
52 | { | ||
53 | lock_system_sleep(); | ||
54 | freeze_ops = ops; | ||
55 | unlock_system_sleep(); | ||
56 | } | ||
57 | |||
50 | static void freeze_begin(void) | 58 | static void freeze_begin(void) |
51 | { | 59 | { |
52 | suspend_freeze_wake = false; | 60 | suspend_freeze_wake = false; |
@@ -68,42 +76,62 @@ void freeze_wake(void) | |||
68 | } | 76 | } |
69 | EXPORT_SYMBOL_GPL(freeze_wake); | 77 | EXPORT_SYMBOL_GPL(freeze_wake); |
70 | 78 | ||
79 | static bool valid_state(suspend_state_t state) | ||
80 | { | ||
81 | /* | ||
82 | * PM_SUSPEND_STANDBY and PM_SUSPEND_MEM states need low level | ||
83 | * support and need to be valid to the low level | ||
84 | * implementation, no valid callback implies that none are valid. | ||
85 | */ | ||
86 | return suspend_ops && suspend_ops->valid && suspend_ops->valid(state); | ||
87 | } | ||
88 | |||
89 | /* | ||
90 | * If this is set, the "mem" label always corresponds to the deepest sleep state | ||
91 | * available, the "standby" label corresponds to the second deepest sleep state | ||
92 | * available (if any), and the "freeze" label corresponds to the remaining | ||
93 | * available sleep state (if there is one). | ||
94 | */ | ||
95 | static bool relative_states; | ||
96 | |||
97 | static int __init sleep_states_setup(char *str) | ||
98 | { | ||
99 | relative_states = !strncmp(str, "1", 1); | ||
100 | if (relative_states) { | ||
101 | pm_states[PM_SUSPEND_MEM].state = PM_SUSPEND_FREEZE; | ||
102 | pm_states[PM_SUSPEND_FREEZE].state = 0; | ||
103 | } | ||
104 | return 1; | ||
105 | } | ||
106 | |||
107 | __setup("relative_sleep_states=", sleep_states_setup); | ||
108 | |||
71 | /** | 109 | /** |
72 | * suspend_set_ops - Set the global suspend method table. | 110 | * suspend_set_ops - Set the global suspend method table. |
73 | * @ops: Suspend operations to use. | 111 | * @ops: Suspend operations to use. |
74 | */ | 112 | */ |
75 | void suspend_set_ops(const struct platform_suspend_ops *ops) | 113 | void suspend_set_ops(const struct platform_suspend_ops *ops) |
76 | { | 114 | { |
115 | suspend_state_t i; | ||
116 | int j = PM_SUSPEND_MAX - 1; | ||
117 | |||
77 | lock_system_sleep(); | 118 | lock_system_sleep(); |
119 | |||
78 | suspend_ops = ops; | 120 | suspend_ops = ops; |
121 | for (i = PM_SUSPEND_MEM; i >= PM_SUSPEND_STANDBY; i--) | ||
122 | if (valid_state(i)) | ||
123 | pm_states[j--].state = i; | ||
124 | else if (!relative_states) | ||
125 | pm_states[j--].state = 0; | ||
126 | |||
127 | pm_states[j--].state = PM_SUSPEND_FREEZE; | ||
128 | while (j >= PM_SUSPEND_MIN) | ||
129 | pm_states[j--].state = 0; | ||
130 | |||
79 | unlock_system_sleep(); | 131 | unlock_system_sleep(); |
80 | } | 132 | } |
81 | EXPORT_SYMBOL_GPL(suspend_set_ops); | 133 | EXPORT_SYMBOL_GPL(suspend_set_ops); |
82 | 134 | ||
83 | bool valid_state(suspend_state_t state) | ||
84 | { | ||
85 | if (state == PM_SUSPEND_FREEZE) { | ||
86 | #ifdef CONFIG_PM_DEBUG | ||
87 | if (pm_test_level != TEST_NONE && | ||
88 | pm_test_level != TEST_FREEZER && | ||
89 | pm_test_level != TEST_DEVICES && | ||
90 | pm_test_level != TEST_PLATFORM) { | ||
91 | printk(KERN_WARNING "Unsupported pm_test mode for " | ||
92 | "freeze state, please choose " | ||
93 | "none/freezer/devices/platform.\n"); | ||
94 | return false; | ||
95 | } | ||
96 | #endif | ||
97 | return true; | ||
98 | } | ||
99 | /* | ||
100 | * PM_SUSPEND_STANDBY and PM_SUSPEND_MEMORY states need lowlevel | ||
101 | * support and need to be valid to the lowlevel | ||
102 | * implementation, no valid callback implies that none are valid. | ||
103 | */ | ||
104 | return suspend_ops && suspend_ops->valid && suspend_ops->valid(state); | ||
105 | } | ||
106 | |||
107 | /** | 135 | /** |
108 | * suspend_valid_only_mem - Generic memory-only valid callback. | 136 | * suspend_valid_only_mem - Generic memory-only valid callback. |
109 | * | 137 | * |
@@ -271,6 +299,10 @@ int suspend_devices_and_enter(suspend_state_t state) | |||
271 | error = suspend_ops->begin(state); | 299 | error = suspend_ops->begin(state); |
272 | if (error) | 300 | if (error) |
273 | goto Close; | 301 | goto Close; |
302 | } else if (state == PM_SUSPEND_FREEZE && freeze_ops->begin) { | ||
303 | error = freeze_ops->begin(); | ||
304 | if (error) | ||
305 | goto Close; | ||
274 | } | 306 | } |
275 | suspend_console(); | 307 | suspend_console(); |
276 | suspend_test_start(); | 308 | suspend_test_start(); |
@@ -296,6 +328,9 @@ int suspend_devices_and_enter(suspend_state_t state) | |||
296 | Close: | 328 | Close: |
297 | if (need_suspend_ops(state) && suspend_ops->end) | 329 | if (need_suspend_ops(state) && suspend_ops->end) |
298 | suspend_ops->end(); | 330 | suspend_ops->end(); |
331 | else if (state == PM_SUSPEND_FREEZE && freeze_ops->end) | ||
332 | freeze_ops->end(); | ||
333 | |||
299 | trace_machine_suspend(PWR_EVENT_EXIT); | 334 | trace_machine_suspend(PWR_EVENT_EXIT); |
300 | return error; | 335 | return error; |
301 | 336 | ||
@@ -330,9 +365,17 @@ static int enter_state(suspend_state_t state) | |||
330 | { | 365 | { |
331 | int error; | 366 | int error; |
332 | 367 | ||
333 | if (!valid_state(state)) | 368 | if (state == PM_SUSPEND_FREEZE) { |
334 | return -ENODEV; | 369 | #ifdef CONFIG_PM_DEBUG |
335 | 370 | if (pm_test_level != TEST_NONE && pm_test_level <= TEST_CPUS) { | |
371 | pr_warning("PM: Unsupported test mode for freeze state," | ||
372 | "please choose none/freezer/devices/platform.\n"); | ||
373 | return -EAGAIN; | ||
374 | } | ||
375 | #endif | ||
376 | } else if (!valid_state(state)) { | ||
377 | return -EINVAL; | ||
378 | } | ||
336 | if (!mutex_trylock(&pm_mutex)) | 379 | if (!mutex_trylock(&pm_mutex)) |
337 | return -EBUSY; | 380 | return -EBUSY; |
338 | 381 | ||
@@ -343,7 +386,7 @@ static int enter_state(suspend_state_t state) | |||
343 | sys_sync(); | 386 | sys_sync(); |
344 | printk("done.\n"); | 387 | printk("done.\n"); |
345 | 388 | ||
346 | pr_debug("PM: Preparing system for %s sleep\n", pm_states[state]); | 389 | pr_debug("PM: Preparing system for %s sleep\n", pm_states[state].label); |
347 | error = suspend_prepare(state); | 390 | error = suspend_prepare(state); |
348 | if (error) | 391 | if (error) |
349 | goto Unlock; | 392 | goto Unlock; |
@@ -351,7 +394,7 @@ static int enter_state(suspend_state_t state) | |||
351 | if (suspend_test(TEST_FREEZER)) | 394 | if (suspend_test(TEST_FREEZER)) |
352 | goto Finish; | 395 | goto Finish; |
353 | 396 | ||
354 | pr_debug("PM: Entering %s sleep\n", pm_states[state]); | 397 | pr_debug("PM: Entering %s sleep\n", pm_states[state].label); |
355 | pm_restrict_gfp_mask(); | 398 | pm_restrict_gfp_mask(); |
356 | error = suspend_devices_and_enter(state); | 399 | error = suspend_devices_and_enter(state); |
357 | pm_restore_gfp_mask(); | 400 | pm_restore_gfp_mask(); |
diff --git a/kernel/power/suspend_test.c b/kernel/power/suspend_test.c index 9b2a1d58558d..269b097e78ea 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 | } |
@@ -164,8 +162,8 @@ static int __init test_suspend(void) | |||
164 | /* PM is initialized by now; is that state testable? */ | 162 | /* PM is initialized by now; is that state testable? */ |
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 (!pm_states[test_state].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 | ||
diff --git a/kernel/power/swap.c b/kernel/power/swap.c index 8c9a4819f798..aaa3261dea5d 100644 --- a/kernel/power/swap.c +++ b/kernel/power/swap.c | |||
@@ -567,7 +567,7 @@ static int lzo_compress_threadfn(void *data) | |||
567 | 567 | ||
568 | /** | 568 | /** |
569 | * save_image_lzo - Save the suspend image data compressed with LZO. | 569 | * save_image_lzo - Save the suspend image data compressed with LZO. |
570 | * @handle: Swap mam handle to use for saving the image. | 570 | * @handle: Swap map handle to use for saving the image. |
571 | * @snapshot: Image to read data from. | 571 | * @snapshot: Image to read data from. |
572 | * @nr_to_write: Number of pages to save. | 572 | * @nr_to_write: Number of pages to save. |
573 | */ | 573 | */ |