aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'kernel')
-rw-r--r--kernel/power/suspend.c21
1 files changed, 20 insertions, 1 deletions
diff --git a/kernel/power/suspend.c b/kernel/power/suspend.c
index a25e768d92b5..4ca9a33ff620 100644
--- a/kernel/power/suspend.c
+++ b/kernel/power/suspend.c
@@ -144,6 +144,12 @@ static int platform_suspend_prepare(suspend_state_t state)
144 suspend_ops->prepare() : 0; 144 suspend_ops->prepare() : 0;
145} 145}
146 146
147static int platform_suspend_prepare_late(suspend_state_t state)
148{
149 return state == PM_SUSPEND_FREEZE && freeze_ops->prepare ?
150 freeze_ops->prepare() : 0;
151}
152
147static int platform_suspend_prepare_noirq(suspend_state_t state) 153static int platform_suspend_prepare_noirq(suspend_state_t state)
148{ 154{
149 return state != PM_SUSPEND_FREEZE && suspend_ops->prepare_late ? 155 return state != PM_SUSPEND_FREEZE && suspend_ops->prepare_late ?
@@ -156,6 +162,12 @@ static void platform_resume_noirq(suspend_state_t state)
156 suspend_ops->wake(); 162 suspend_ops->wake();
157} 163}
158 164
165static void platform_resume_early(suspend_state_t state)
166{
167 if (state == PM_SUSPEND_FREEZE && freeze_ops->restore)
168 freeze_ops->restore();
169}
170
159static void platform_resume_finish(suspend_state_t state) 171static void platform_resume_finish(suspend_state_t state)
160{ 172{
161 if (state != PM_SUSPEND_FREEZE && suspend_ops->finish) 173 if (state != PM_SUSPEND_FREEZE && suspend_ops->finish)
@@ -270,10 +282,14 @@ static int suspend_enter(suspend_state_t state, bool *wakeup)
270 printk(KERN_ERR "PM: late suspend of devices failed\n"); 282 printk(KERN_ERR "PM: late suspend of devices failed\n");
271 goto Platform_finish; 283 goto Platform_finish;
272 } 284 }
285 error = platform_suspend_prepare_late(state);
286 if (error)
287 goto Devices_early_resume;
288
273 error = dpm_suspend_noirq(PMSG_SUSPEND); 289 error = dpm_suspend_noirq(PMSG_SUSPEND);
274 if (error) { 290 if (error) {
275 printk(KERN_ERR "PM: noirq suspend of devices failed\n"); 291 printk(KERN_ERR "PM: noirq suspend of devices failed\n");
276 goto Devices_early_resume; 292 goto Platform_early_resume;
277 } 293 }
278 error = platform_suspend_prepare_noirq(state); 294 error = platform_suspend_prepare_noirq(state);
279 if (error) 295 if (error)
@@ -326,6 +342,9 @@ static int suspend_enter(suspend_state_t state, bool *wakeup)
326 platform_resume_noirq(state); 342 platform_resume_noirq(state);
327 dpm_resume_noirq(PMSG_RESUME); 343 dpm_resume_noirq(PMSG_RESUME);
328 344
345 Platform_early_resume:
346 platform_resume_early(state);
347
329 Devices_early_resume: 348 Devices_early_resume:
330 dpm_resume_early(PMSG_RESUME); 349 dpm_resume_early(PMSG_RESUME);
331 350