diff options
-rw-r--r-- | kernel/power/disk.c | 70 | ||||
-rw-r--r-- | kernel/power/power.h | 2 |
2 files changed, 57 insertions, 15 deletions
diff --git a/kernel/power/disk.c b/kernel/power/disk.c index 659736508239..0866b163c6bb 100644 --- a/kernel/power/disk.c +++ b/kernel/power/disk.c | |||
@@ -70,6 +70,35 @@ void hibernation_set_ops(struct platform_hibernation_ops *ops) | |||
70 | mutex_unlock(&pm_mutex); | 70 | mutex_unlock(&pm_mutex); |
71 | } | 71 | } |
72 | 72 | ||
73 | #ifdef CONFIG_PM_DEBUG | ||
74 | static void hibernation_debug_sleep(void) | ||
75 | { | ||
76 | printk(KERN_INFO "hibernation debug: Waiting for 5 seconds.\n"); | ||
77 | mdelay(5000); | ||
78 | } | ||
79 | |||
80 | static int hibernation_testmode(int mode) | ||
81 | { | ||
82 | if (hibernation_mode == mode) { | ||
83 | hibernation_debug_sleep(); | ||
84 | return 1; | ||
85 | } | ||
86 | return 0; | ||
87 | } | ||
88 | |||
89 | static int hibernation_test(int level) | ||
90 | { | ||
91 | if (pm_test_level == level) { | ||
92 | hibernation_debug_sleep(); | ||
93 | return 1; | ||
94 | } | ||
95 | return 0; | ||
96 | } | ||
97 | #else /* !CONFIG_PM_DEBUG */ | ||
98 | static int hibernation_testmode(int mode) { return 0; } | ||
99 | static int hibernation_test(int level) { return 0; } | ||
100 | #endif /* !CONFIG_PM_DEBUG */ | ||
101 | |||
73 | /** | 102 | /** |
74 | * platform_start - tell the platform driver that we're starting | 103 | * platform_start - tell the platform driver that we're starting |
75 | * hibernation | 104 | * hibernation |
@@ -167,6 +196,10 @@ int create_image(int platform_mode) | |||
167 | goto Enable_irqs; | 196 | goto Enable_irqs; |
168 | } | 197 | } |
169 | 198 | ||
199 | if (hibernation_test(TEST_CORE)) | ||
200 | goto Power_up; | ||
201 | |||
202 | in_suspend = 1; | ||
170 | save_processor_state(); | 203 | save_processor_state(); |
171 | error = swsusp_arch_suspend(); | 204 | error = swsusp_arch_suspend(); |
172 | if (error) | 205 | if (error) |
@@ -175,6 +208,7 @@ int create_image(int platform_mode) | |||
175 | restore_processor_state(); | 208 | restore_processor_state(); |
176 | if (!in_suspend) | 209 | if (!in_suspend) |
177 | platform_leave(platform_mode); | 210 | platform_leave(platform_mode); |
211 | Power_up: | ||
178 | /* NOTE: device_power_up() is just a resume() for devices | 212 | /* NOTE: device_power_up() is just a resume() for devices |
179 | * that suspended with irqs off ... no overall powerup. | 213 | * that suspended with irqs off ... no overall powerup. |
180 | */ | 214 | */ |
@@ -211,24 +245,29 @@ int hibernation_snapshot(int platform_mode) | |||
211 | if (error) | 245 | if (error) |
212 | goto Resume_console; | 246 | goto Resume_console; |
213 | 247 | ||
214 | error = platform_pre_snapshot(platform_mode); | 248 | if (hibernation_test(TEST_DEVICES)) |
215 | if (error) | ||
216 | goto Resume_devices; | 249 | goto Resume_devices; |
217 | 250 | ||
251 | error = platform_pre_snapshot(platform_mode); | ||
252 | if (error || hibernation_test(TEST_PLATFORM)) | ||
253 | goto Finish; | ||
254 | |||
218 | error = disable_nonboot_cpus(); | 255 | error = disable_nonboot_cpus(); |
219 | if (!error) { | 256 | if (!error) { |
220 | if (hibernation_mode != HIBERNATION_TEST) { | 257 | if (hibernation_test(TEST_CPUS)) |
221 | in_suspend = 1; | 258 | goto Enable_cpus; |
222 | error = create_image(platform_mode); | 259 | |
223 | /* Control returns here after successful restore */ | 260 | if (hibernation_testmode(HIBERNATION_TEST)) |
224 | } else { | 261 | goto Enable_cpus; |
225 | printk("swsusp debug: Waiting for 5 seconds.\n"); | 262 | |
226 | mdelay(5000); | 263 | error = create_image(platform_mode); |
227 | } | 264 | /* Control returns here after successful restore */ |
228 | } | 265 | } |
266 | Enable_cpus: | ||
229 | enable_nonboot_cpus(); | 267 | enable_nonboot_cpus(); |
230 | Resume_devices: | 268 | Finish: |
231 | platform_finish(platform_mode); | 269 | platform_finish(platform_mode); |
270 | Resume_devices: | ||
232 | device_resume(); | 271 | device_resume(); |
233 | Resume_console: | 272 | Resume_console: |
234 | resume_console(); | 273 | resume_console(); |
@@ -406,11 +445,12 @@ int hibernate(void) | |||
406 | if (error) | 445 | if (error) |
407 | goto Finish; | 446 | goto Finish; |
408 | 447 | ||
409 | if (hibernation_mode == HIBERNATION_TESTPROC) { | 448 | if (hibernation_test(TEST_FREEZER)) |
410 | printk("swsusp debug: Waiting for 5 seconds.\n"); | ||
411 | mdelay(5000); | ||
412 | goto Thaw; | 449 | goto Thaw; |
413 | } | 450 | |
451 | if (hibernation_testmode(HIBERNATION_TESTPROC)) | ||
452 | goto Thaw; | ||
453 | |||
414 | error = hibernation_snapshot(hibernation_mode == HIBERNATION_PLATFORM); | 454 | error = hibernation_snapshot(hibernation_mode == HIBERNATION_PLATFORM); |
415 | if (in_suspend && !error) { | 455 | if (in_suspend && !error) { |
416 | unsigned int flags = 0; | 456 | unsigned int flags = 0; |
diff --git a/kernel/power/power.h b/kernel/power/power.h index 9f9e16e33962..f9f0d4d26c50 100644 --- a/kernel/power/power.h +++ b/kernel/power/power.h | |||
@@ -206,3 +206,5 @@ enum { | |||
206 | 206 | ||
207 | #define TEST_FIRST TEST_NONE | 207 | #define TEST_FIRST TEST_NONE |
208 | #define TEST_MAX (__TEST_AFTER_LAST - 1) | 208 | #define TEST_MAX (__TEST_AFTER_LAST - 1) |
209 | |||
210 | extern int pm_test_level; | ||