diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-05-27 17:27:34 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-05-27 17:27:34 -0400 |
| commit | f23a5e1405e47df6cdc86568ea75df266b9e151f (patch) | |
| tree | 788fab831a235ce8f143e8562d832336a595cff7 /kernel | |
| parent | d24c2af42292cb4ad9c829d71fe0d795112ca6e7 (diff) | |
| parent | 0775a60aca2375ea5598741b30d13fe6d3f15617 (diff) | |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/suspend-2.6
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/suspend-2.6:
PM: Fix PM QOS's user mode interface to work with ASCII input
PM / Hibernate: Update kerneldoc comments in hibernate.c
PM / Hibernate: Remove arch_prepare_suspend()
PM / Hibernate: Update some comments in core hibernate code
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/pm_qos_params.c | 33 | ||||
| -rw-r--r-- | kernel/power/hibernate.c | 220 |
2 files changed, 134 insertions, 119 deletions
diff --git a/kernel/pm_qos_params.c b/kernel/pm_qos_params.c index beb184689af9..fd8d1e035df9 100644 --- a/kernel/pm_qos_params.c +++ b/kernel/pm_qos_params.c | |||
| @@ -40,6 +40,7 @@ | |||
| 40 | #include <linux/string.h> | 40 | #include <linux/string.h> |
| 41 | #include <linux/platform_device.h> | 41 | #include <linux/platform_device.h> |
| 42 | #include <linux/init.h> | 42 | #include <linux/init.h> |
| 43 | #include <linux/kernel.h> | ||
| 43 | 44 | ||
| 44 | #include <linux/uaccess.h> | 45 | #include <linux/uaccess.h> |
| 45 | 46 | ||
| @@ -404,24 +405,36 @@ static ssize_t pm_qos_power_write(struct file *filp, const char __user *buf, | |||
| 404 | size_t count, loff_t *f_pos) | 405 | size_t count, loff_t *f_pos) |
| 405 | { | 406 | { |
| 406 | s32 value; | 407 | s32 value; |
| 407 | int x; | ||
| 408 | char ascii_value[11]; | ||
| 409 | struct pm_qos_request_list *pm_qos_req; | 408 | struct pm_qos_request_list *pm_qos_req; |
| 410 | 409 | ||
| 411 | if (count == sizeof(s32)) { | 410 | if (count == sizeof(s32)) { |
| 412 | if (copy_from_user(&value, buf, sizeof(s32))) | 411 | if (copy_from_user(&value, buf, sizeof(s32))) |
| 413 | return -EFAULT; | 412 | return -EFAULT; |
| 414 | } else if (count == 11) { /* len('0x12345678/0') */ | 413 | } else if (count <= 11) { /* ASCII perhaps? */ |
| 415 | if (copy_from_user(ascii_value, buf, 11)) | 414 | char ascii_value[11]; |
| 415 | unsigned long int ulval; | ||
| 416 | int ret; | ||
| 417 | |||
| 418 | if (copy_from_user(ascii_value, buf, count)) | ||
| 416 | return -EFAULT; | 419 | return -EFAULT; |
| 417 | if (strlen(ascii_value) != 10) | 420 | |
| 418 | return -EINVAL; | 421 | if (count > 10) { |
| 419 | x = sscanf(ascii_value, "%x", &value); | 422 | if (ascii_value[10] == '\n') |
| 420 | if (x != 1) | 423 | ascii_value[10] = '\0'; |
| 424 | else | ||
| 425 | return -EINVAL; | ||
| 426 | } else { | ||
| 427 | ascii_value[count] = '\0'; | ||
| 428 | } | ||
| 429 | ret = strict_strtoul(ascii_value, 16, &ulval); | ||
| 430 | if (ret) { | ||
| 431 | pr_debug("%s, 0x%lx, 0x%x\n", ascii_value, ulval, ret); | ||
| 421 | return -EINVAL; | 432 | return -EINVAL; |
| 422 | pr_debug("%s, %d, 0x%x\n", ascii_value, x, value); | 433 | } |
| 423 | } else | 434 | value = (s32)lower_32_bits(ulval); |
| 435 | } else { | ||
| 424 | return -EINVAL; | 436 | return -EINVAL; |
| 437 | } | ||
| 425 | 438 | ||
| 426 | pm_qos_req = filp->private_data; | 439 | pm_qos_req = filp->private_data; |
| 427 | pm_qos_update_request(pm_qos_req, value); | 440 | pm_qos_update_request(pm_qos_req, value); |
diff --git a/kernel/power/hibernate.c b/kernel/power/hibernate.c index f9bec56d8825..8f7b1db1ece1 100644 --- a/kernel/power/hibernate.c +++ b/kernel/power/hibernate.c | |||
| @@ -25,7 +25,6 @@ | |||
| 25 | #include <linux/gfp.h> | 25 | #include <linux/gfp.h> |
| 26 | #include <linux/syscore_ops.h> | 26 | #include <linux/syscore_ops.h> |
| 27 | #include <scsi/scsi_scan.h> | 27 | #include <scsi/scsi_scan.h> |
| 28 | #include <asm/suspend.h> | ||
| 29 | 28 | ||
| 30 | #include "power.h" | 29 | #include "power.h" |
| 31 | 30 | ||
| @@ -55,10 +54,9 @@ static int hibernation_mode = HIBERNATION_SHUTDOWN; | |||
| 55 | static const struct platform_hibernation_ops *hibernation_ops; | 54 | static const struct platform_hibernation_ops *hibernation_ops; |
| 56 | 55 | ||
| 57 | /** | 56 | /** |
| 58 | * hibernation_set_ops - set the global hibernate operations | 57 | * hibernation_set_ops - Set the global hibernate operations. |
| 59 | * @ops: the hibernation operations to use in subsequent hibernation transitions | 58 | * @ops: Hibernation operations to use in subsequent hibernation transitions. |
| 60 | */ | 59 | */ |
| 61 | |||
| 62 | void hibernation_set_ops(const struct platform_hibernation_ops *ops) | 60 | void hibernation_set_ops(const struct platform_hibernation_ops *ops) |
| 63 | { | 61 | { |
| 64 | if (ops && !(ops->begin && ops->end && ops->pre_snapshot | 62 | if (ops && !(ops->begin && ops->end && ops->pre_snapshot |
| @@ -115,10 +113,9 @@ static int hibernation_test(int level) { return 0; } | |||
| 115 | #endif /* !CONFIG_PM_DEBUG */ | 113 | #endif /* !CONFIG_PM_DEBUG */ |
| 116 | 114 | ||
| 117 | /** | 115 | /** |
| 118 | * platform_begin - tell the platform driver that we're starting | 116 | * platform_begin - Call platform to start hibernation. |
| 119 | * hibernation | 117 | * @platform_mode: Whether or not to use the platform driver. |
| 120 | */ | 118 | */ |
| 121 | |||
| 122 | static int platform_begin(int platform_mode) | 119 | static int platform_begin(int platform_mode) |
| 123 | { | 120 | { |
| 124 | return (platform_mode && hibernation_ops) ? | 121 | return (platform_mode && hibernation_ops) ? |
| @@ -126,10 +123,9 @@ static int platform_begin(int platform_mode) | |||
| 126 | } | 123 | } |
| 127 | 124 | ||
| 128 | /** | 125 | /** |
| 129 | * platform_end - tell the platform driver that we've entered the | 126 | * platform_end - Call platform to finish transition to the working state. |
| 130 | * working state | 127 | * @platform_mode: Whether or not to use the platform driver. |
| 131 | */ | 128 | */ |
| 132 | |||
| 133 | static void platform_end(int platform_mode) | 129 | static void platform_end(int platform_mode) |
| 134 | { | 130 | { |
| 135 | if (platform_mode && hibernation_ops) | 131 | if (platform_mode && hibernation_ops) |
| @@ -137,8 +133,11 @@ static void platform_end(int platform_mode) | |||
| 137 | } | 133 | } |
| 138 | 134 | ||
| 139 | /** | 135 | /** |
| 140 | * platform_pre_snapshot - prepare the machine for hibernation using the | 136 | * platform_pre_snapshot - Call platform to prepare the machine for hibernation. |
| 141 | * platform driver if so configured and return an error code if it fails | 137 | * @platform_mode: Whether or not to use the platform driver. |
| 138 | * | ||
| 139 | * Use the platform driver to prepare the system for creating a hibernate image, | ||
| 140 | * if so configured, and return an error code if that fails. | ||
| 142 | */ | 141 | */ |
| 143 | 142 | ||
| 144 | static int platform_pre_snapshot(int platform_mode) | 143 | static int platform_pre_snapshot(int platform_mode) |
| @@ -148,10 +147,14 @@ static int platform_pre_snapshot(int platform_mode) | |||
| 148 | } | 147 | } |
| 149 | 148 | ||
| 150 | /** | 149 | /** |
| 151 | * platform_leave - prepare the machine for switching to the normal mode | 150 | * platform_leave - Call platform to prepare a transition to the working state. |
| 152 | * of operation using the platform driver (called with interrupts disabled) | 151 | * @platform_mode: Whether or not to use the platform driver. |
| 152 | * | ||
| 153 | * Use the platform driver prepare to prepare the machine for switching to the | ||
| 154 | * normal mode of operation. | ||
| 155 | * | ||
| 156 | * This routine is called on one CPU with interrupts disabled. | ||
| 153 | */ | 157 | */ |
| 154 | |||
| 155 | static void platform_leave(int platform_mode) | 158 | static void platform_leave(int platform_mode) |
| 156 | { | 159 | { |
| 157 | if (platform_mode && hibernation_ops) | 160 | if (platform_mode && hibernation_ops) |
| @@ -159,10 +162,14 @@ static void platform_leave(int platform_mode) | |||
| 159 | } | 162 | } |
| 160 | 163 | ||
| 161 | /** | 164 | /** |
| 162 | * platform_finish - switch the machine to the normal mode of operation | 165 | * platform_finish - Call platform to switch the system to the working state. |
| 163 | * using the platform driver (must be called after platform_prepare()) | 166 | * @platform_mode: Whether or not to use the platform driver. |
| 167 | * | ||
| 168 | * Use the platform driver to switch the machine to the normal mode of | ||
| 169 | * operation. | ||
| 170 | * | ||
| 171 | * This routine must be called after platform_prepare(). | ||
| 164 | */ | 172 | */ |
| 165 | |||
| 166 | static void platform_finish(int platform_mode) | 173 | static void platform_finish(int platform_mode) |
| 167 | { | 174 | { |
| 168 | if (platform_mode && hibernation_ops) | 175 | if (platform_mode && hibernation_ops) |
| @@ -170,11 +177,15 @@ static void platform_finish(int platform_mode) | |||
| 170 | } | 177 | } |
| 171 | 178 | ||
| 172 | /** | 179 | /** |
| 173 | * platform_pre_restore - prepare the platform for the restoration from a | 180 | * platform_pre_restore - Prepare for hibernate image restoration. |
| 174 | * hibernation image. If the restore fails after this function has been | 181 | * @platform_mode: Whether or not to use the platform driver. |
| 175 | * called, platform_restore_cleanup() must be called. | 182 | * |
