diff options
Diffstat (limited to 'kernel/power')
| -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/snapshot.c | 2 | ||||
| -rw-r--r-- | kernel/power/suspend.c | 111 | ||||
| -rw-r--r-- | kernel/power/suspend_test.c | 24 | ||||
| -rw-r--r-- | kernel/power/swap.c | 2 |
8 files changed, 133 insertions, 78 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/snapshot.c b/kernel/power/snapshot.c index 18fb7a2fb14b..1ea328aafdc9 100644 --- a/kernel/power/snapshot.c +++ b/kernel/power/snapshot.c | |||
| @@ -1586,7 +1586,7 @@ swsusp_alloc(struct memory_bitmap *orig_bm, struct memory_bitmap *copy_bm, | |||
| 1586 | return -ENOMEM; | 1586 | return -ENOMEM; |
| 1587 | } | 1587 | } |
| 1588 | 1588 | ||
| 1589 | asmlinkage int swsusp_save(void) | 1589 | asmlinkage __visible int swsusp_save(void) |
| 1590 | { | 1590 | { |
| 1591 | unsigned int nr_pages, nr_highmem; | 1591 | unsigned int nr_pages, nr_highmem; |
| 1592 | 1592 | ||
diff --git a/kernel/power/suspend.c b/kernel/power/suspend.c index 8233cd4047d7..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; |
| @@ -54,9 +62,11 @@ static void freeze_begin(void) | |||
| 54 | 62 | ||
| 55 | static void freeze_enter(void) | 63 | static void freeze_enter(void) |
| 56 | { | 64 | { |
| 65 | cpuidle_use_deepest_state(true); | ||
| 57 | cpuidle_resume(); | 66 | cpuidle_resume(); |
| 58 | wait_event(suspend_freeze_wait_head, suspend_freeze_wake); | 67 | wait_event(suspend_freeze_wait_head, suspend_freeze_wake); |
| 59 | cpuidle_pause(); | 68 | cpuidle_pause(); |
| 69 | cpuidle_use_deepest_state(false); | ||
| 60 | } | 70 | } |
| 61 | 71 | ||
| 62 | void freeze_wake(void) | 72 | void freeze_wake(void) |
| @@ -66,42 +76,62 @@ void freeze_wake(void) | |||
| 66 | } | 76 | } |
| 67 | EXPORT_SYMBOL_GPL(freeze_wake); | 77 | EXPORT_SYMBOL_GPL(freeze_wake); |
| 68 | 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 | |||
| 69 | /** | 109 | /** |
| 70 | * suspend_set_ops - Set the global suspend method table. | 110 | * suspend_set_ops - Set the global suspend method table. |
| 71 | * @ops: Suspend operations to use. | 111 | * @ops: Suspend operations to use. |
| 72 | */ | 112 | */ |
| 73 | void suspend_set_ops(const struct platform_suspend_ops *ops) | 113 | void suspend_set_ops(const struct platform_suspend_ops *ops) |
| 74 | { | 114 | { |
| 115 | suspend_state_t i; | ||
| 116 | int j = PM_SUSPEND_MAX - 1; | ||
| 117 | |||
| 75 | lock_system_sleep(); | 118 | lock_system_sleep(); |
| 119 | |||
| 76 | 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 | |||
| 77 | unlock_system_sleep(); | 131 | unlock_system_sleep(); |
| 78 | } | 132 | } |
| 79 | EXPORT_SYMBOL_GPL(suspend_set_ops); | 133 | EXPORT_SYMBOL_GPL(suspend_set_ops); |
| 80 | 134 | ||
| 81 | bool valid_state(suspend_state_t state) | ||
| 82 | { | ||
| 83 | if (state == PM_SUSPEND_FREEZE) { | ||
| 84 | #ifdef CONFIG_PM_DEBUG | ||
| 85 | if (pm_test_level != TEST_NONE && | ||
| 86 | pm_test_level != TEST_FREEZER && | ||
| 87 | pm_test_level != TEST_DEVICES && | ||
| 88 | pm_test_level != TEST_PLATFORM) { | ||
| 89 | printk(KERN_WARNING "Unsupported pm_test mode for " | ||
| 90 | "freeze state, please choose " | ||
| 91 | "none/freezer/devices/platform.\n"); | ||
| 92 | return false; | ||
| 93 | } | ||
| 94 | #endif | ||
| 95 | return true; | ||
| 96 | } | ||
| 97 | /* | ||
| 98 | * PM_SUSPEND_STANDBY and PM_SUSPEND_MEMORY states need lowlevel | ||
| 99 | * support and need to be valid to the lowlevel | ||
| 100 | * implementation, no valid callback implies that none are valid. | ||
| 101 | */ | ||
| 102 | return suspend_ops && suspend_ops->valid && suspend_ops->valid(state); | ||
| 103 | } | ||
| 104 | |||
| 105 | /** | 135 | /** |
| 106 | * suspend_valid_only_mem - Generic memory-only valid callback. | 136 | * suspend_valid_only_mem - Generic memory-only valid callback. |
| 107 | * | 137 | * |
| @@ -269,6 +299,10 @@ int suspend_devices_and_enter(suspend_state_t state) | |||
| 269 | error = suspend_ops->begin(state); | 299 | error = suspend_ops->begin(state); |
| 270 | if (error) | 300 | if (error) |
| 271 | 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; | ||
| 272 | } | 306 | } |
| 273 | suspend_console(); | 307 | suspend_console(); |
| 274 | suspend_test_start(); | 308 | suspend_test_start(); |
| @@ -294,6 +328,9 @@ int suspend_devices_and_enter(suspend_state_t state) | |||
| 294 | Close: | 328 | Close: |
| 295 | if (need_suspend_ops(state) && suspend_ops->end) | 329 | if (need_suspend_ops(state) && suspend_ops->end) |
| 296 | suspend_ops->end(); | 330 | suspend_ops->end(); |
| 331 | else if (state == PM_SUSPEND_FREEZE && freeze_ops->end) | ||
| 332 | freeze_ops->end(); | ||
| 333 | |||
| 297 | trace_machine_suspend(PWR_EVENT_EXIT); | 334 | trace_machine_suspend(PWR_EVENT_EXIT); |
| 298 | return error; | 335 | return error; |
| 299 | 336 | ||
| @@ -328,9 +365,17 @@ static int enter_state(suspend_state_t state) | |||
| 328 | { | 365 | { |
| 329 | int error; | 366 | int error; |
| 330 | 367 | ||
| 331 | if (!valid_state(state)) | 368 | if (state == PM_SUSPEND_FREEZE) { |
| 332 | return -ENODEV; | 369 | #ifdef CONFIG_PM_DEBUG |
| 333 | 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 | } | ||
| 334 | if (!mutex_trylock(&pm_mutex)) | 379 | if (!mutex_trylock(&pm_mutex)) |
| 335 | return -EBUSY; | 380 | return -EBUSY; |
| 336 | 381 | ||
| @@ -341,7 +386,7 @@ static int enter_state(suspend_state_t state) | |||
| 341 | sys_sync(); | 386 | sys_sync(); |
| 342 | printk("done.\n"); | 387 | printk("done.\n"); |
| 343 | 388 | ||
| 344 | 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); |
| 345 | error = suspend_prepare(state); | 390 | error = suspend_prepare(state); |
| 346 | if (error) | 391 | if (error) |
| 347 | goto Unlock; | 392 | goto Unlock; |
| @@ -349,7 +394,7 @@ static int enter_state(suspend_state_t state) | |||
| 349 | if (suspend_test(TEST_FREEZER)) | 394 | if (suspend_test(TEST_FREEZER)) |
| 350 | goto Finish; | 395 | goto Finish; |
| 351 | 396 | ||
| 352 | pr_debug("PM: Entering %s sleep\n", pm_states[state]); | 397 | pr_debug("PM: Entering %s sleep\n", pm_states[state].label); |
| 353 | pm_restrict_gfp_mask(); | 398 | pm_restrict_gfp_mask(); |
| 354 | error = suspend_devices_and_enter(state); | 399 | error = suspend_devices_and_enter(state); |
| 355 | 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 | */ |
