aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/power/user.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/power/user.c')
-rw-r--r--kernel/power/user.c96
1 files changed, 7 insertions, 89 deletions
diff --git a/kernel/power/user.c b/kernel/power/user.c
index 09468ec61124..bfed3b924093 100644
--- a/kernel/power/user.c
+++ b/kernel/power/user.c
@@ -128,83 +128,6 @@ static ssize_t snapshot_write(struct file *filp, const char __user *buf,
128 return res; 128 return res;
129} 129}
130 130
131static inline int platform_prepare(void)
132{
133 int error = 0;
134
135 if (hibernation_ops)
136 error = hibernation_ops->prepare();
137
138 return error;
139}
140
141static inline void platform_finish(void)
142{
143 if (hibernation_ops)
144 hibernation_ops->finish();
145}
146
147static inline int snapshot_suspend(int platform_suspend)
148{
149 int error;
150
151 mutex_lock(&pm_mutex);
152 /* Free memory before shutting down devices. */
153 error = swsusp_shrink_memory();
154 if (error)
155 goto Finish;
156
157 if (platform_suspend) {
158 error = platform_prepare();
159 if (error)
160 goto Finish;
161 }
162 suspend_console();
163 error = device_suspend(PMSG_FREEZE);
164 if (error)
165 goto Resume_devices;
166
167 error = disable_nonboot_cpus();
168 if (!error) {
169 in_suspend = 1;
170 error = swsusp_suspend();
171 }
172 enable_nonboot_cpus();
173 Resume_devices:
174 if (platform_suspend)
175 platform_finish();
176
177 device_resume();
178 resume_console();
179 Finish:
180 mutex_unlock(&pm_mutex);
181 return error;
182}
183
184static inline int snapshot_restore(void)
185{
186 int error;
187
188 mutex_lock(&pm_mutex);
189 pm_prepare_console();
190 suspend_console();
191 error = device_suspend(PMSG_PRETHAW);
192 if (error)
193 goto Finish;
194
195 error = disable_nonboot_cpus();
196 if (!error)
197 error = swsusp_resume();
198
199 enable_nonboot_cpus();
200 Finish:
201 device_resume();
202 resume_console();
203 pm_restore_console();
204 mutex_unlock(&pm_mutex);
205 return error;
206}
207
208static int snapshot_ioctl(struct inode *inode, struct file *filp, 131static int snapshot_ioctl(struct inode *inode, struct file *filp,
209 unsigned int cmd, unsigned long arg) 132 unsigned int cmd, unsigned long arg)
210{ 133{
@@ -251,7 +174,7 @@ static int snapshot_ioctl(struct inode *inode, struct file *filp,
251 error = -EPERM; 174 error = -EPERM;
252 break; 175 break;
253 } 176 }
254 error = snapshot_suspend(data->platform_suspend); 177 error = hibernation_snapshot(data->platform_suspend);
255 if (!error) 178 if (!error)
256 error = put_user(in_suspend, (unsigned int __user *)arg); 179 error = put_user(in_suspend, (unsigned int __user *)arg);
257 if (!error) 180 if (!error)
@@ -265,7 +188,7 @@ static int snapshot_ioctl(struct inode *inode, struct file *filp,
265 error = -EPERM; 188 error = -EPERM;
266 break; 189 break;
267 } 190 }
268 error = snapshot_restore(); 191 error = hibernation_restore();
269 break; 192 break;
270 193
271 case SNAPSHOT_FREE: 194 case SNAPSHOT_FREE:
@@ -377,19 +300,14 @@ static int snapshot_ioctl(struct inode *inode, struct file *filp,
377 switch (arg) { 300 switch (arg) {
378 301
379 case PMOPS_PREPARE: 302 case PMOPS_PREPARE:
380 if (hibernation_ops) { 303 data->platform_suspend = 1;
381 data->platform_suspend = 1; 304 error = 0;
382 error = 0;
383 } else {
384 error = -ENOSYS;
385 }
386 break; 305 break;
387 306
388 case PMOPS_ENTER: 307 case PMOPS_ENTER:
389 if (data->platform_suspend) { 308 if (data->platform_suspend)
390 kernel_shutdown_prepare(SYSTEM_SUSPEND_DISK); 309 error = hibernation_platform_enter();
391 error = hibernation_ops->enter(); 310
392 }
393 break; 311 break;
394 312
395 case PMOPS_FINISH: 313 case PMOPS_FINISH: