File tree Expand file tree Collapse file tree 6 files changed +34
-4
lines changed Expand file tree Collapse file tree 6 files changed +34
-4
lines changed Original file line number Diff line number Diff line change 228
228
#include <linux/kthread.h>
229
229
#include <linux/jiffies.h>
230
230
#include <linux/acpi.h>
231
+ #include <linux/syscore_ops.h>
231
232
232
233
#include <asm/system.h>
233
234
#include <asm/uaccess.h>
@@ -1238,6 +1239,7 @@ static int suspend(int vetoable)
1238
1239
1239
1240
local_irq_disable ();
1240
1241
sysdev_suspend (PMSG_SUSPEND );
1242
+ syscore_suspend ();
1241
1243
1242
1244
local_irq_enable ();
1243
1245
@@ -1255,6 +1257,7 @@ static int suspend(int vetoable)
1255
1257
apm_error ("suspend" , err );
1256
1258
err = (err == APM_SUCCESS ) ? 0 : - EIO ;
1257
1259
1260
+ syscore_resume ();
1258
1261
sysdev_resume ();
1259
1262
local_irq_enable ();
1260
1263
@@ -1280,13 +1283,15 @@ static void standby(void)
1280
1283
1281
1284
local_irq_disable ();
1282
1285
sysdev_suspend (PMSG_SUSPEND );
1286
+ syscore_suspend ();
1283
1287
local_irq_enable ();
1284
1288
1285
1289
err = set_system_power_state (APM_STATE_STANDBY );
1286
1290
if ((err != APM_SUCCESS ) && (err != APM_NO_ERROR ))
1287
1291
apm_error ("standby" , err );
1288
1292
1289
1293
local_irq_disable ();
1294
+ syscore_resume ();
1290
1295
sysdev_resume ();
1291
1296
local_irq_enable ();
1292
1297
Original file line number Diff line number Diff line change @@ -73,6 +73,7 @@ int syscore_suspend(void)
73
73
74
74
return ret ;
75
75
}
76
+ EXPORT_SYMBOL_GPL (syscore_suspend );
76
77
77
78
/**
78
79
* syscore_resume - Execute all the registered system core resume callbacks.
@@ -95,6 +96,7 @@ void syscore_resume(void)
95
96
"Interrupts enabled after %pF\n" , ops -> resume );
96
97
}
97
98
}
99
+ EXPORT_SYMBOL_GPL (syscore_resume );
98
100
#endif /* CONFIG_PM_SLEEP */
99
101
100
102
/**
Original file line number Diff line number Diff line change 8
8
#include <linux/sysrq.h>
9
9
#include <linux/stop_machine.h>
10
10
#include <linux/freezer.h>
11
+ #include <linux/syscore_ops.h>
11
12
12
13
#include <xen/xen.h>
13
14
#include <xen/xenbus.h>
@@ -70,8 +71,13 @@ static int xen_suspend(void *data)
70
71
BUG_ON (!irqs_disabled ());
71
72
72
73
err = sysdev_suspend (PMSG_FREEZE );
74
+ if (!err ) {
75
+ err = syscore_suspend ();
76
+ if (err )
77
+ sysdev_resume ();
78
+ }
73
79
if (err ) {
74
- printk (KERN_ERR "xen_suspend: sysdev_suspend failed: %d\n" ,
80
+ printk (KERN_ERR "xen_suspend: system core suspend failed: %d\n" ,
75
81
err );
76
82
return err ;
77
83
}
@@ -95,6 +101,7 @@ static int xen_suspend(void *data)
95
101
xen_timer_resume ();
96
102
}
97
103
104
+ syscore_resume ();
98
105
sysdev_resume ();
99
106
100
107
return 0 ;
Original file line number Diff line number Diff line change 33
33
#include <linux/vmalloc.h>
34
34
#include <linux/swap.h>
35
35
#include <linux/kmsg_dump.h>
36
+ #include <linux/syscore_ops.h>
36
37
37
38
#include <asm/page.h>
38
39
#include <asm/uaccess.h>
@@ -1532,6 +1533,11 @@ int kernel_kexec(void)
1532
1533
local_irq_disable ();
1533
1534
/* Suspend system devices */
1534
1535
error = sysdev_suspend (PMSG_FREEZE );
1536
+ if (!error ) {
1537
+ error = syscore_suspend ();
1538
+ if (error )
1539
+ sysdev_resume ();
1540
+ }
1535
1541
if (error )
1536
1542
goto Enable_irqs ;
1537
1543
} else
@@ -1546,6 +1552,7 @@ int kernel_kexec(void)
1546
1552
1547
1553
#ifdef CONFIG_KEXEC_JUMP
1548
1554
if (kexec_image -> preserve_context ) {
1555
+ syscore_resume ();
1549
1556
sysdev_resume ();
1550
1557
Enable_irqs :
1551
1558
local_irq_enable ();
Original file line number Diff line number Diff line change @@ -273,8 +273,11 @@ static int create_image(int platform_mode)
273
273
local_irq_disable ();
274
274
275
275
error = sysdev_suspend (PMSG_FREEZE );
276
- if (!error )
276
+ if (!error ) {
277
277
error = syscore_suspend ();
278
+ if (error )
279
+ sysdev_resume ();
280
+ }
278
281
if (error ) {
279
282
printk (KERN_ERR "PM: Some system devices failed to power down, "
280
283
"aborting hibernation\n" );
@@ -407,8 +410,11 @@ static int resume_target_kernel(bool platform_mode)
407
410
local_irq_disable ();
408
411
409
412
error = sysdev_suspend (PMSG_QUIESCE );
410
- if (!error )
413
+ if (!error ) {
411
414
error = syscore_suspend ();
415
+ if (error )
416
+ sysdev_resume ();
417
+ }
412
418
if (error )
413
419
goto Enable_irqs ;
414
420
Original file line number Diff line number Diff line change @@ -164,8 +164,11 @@ static int suspend_enter(suspend_state_t state)
164
164
BUG_ON (!irqs_disabled ());
165
165
166
166
error = sysdev_suspend (PMSG_SUSPEND );
167
- if (!error )
167
+ if (!error ) {
168
168
error = syscore_suspend ();
169
+ if (error )
170
+ sysdev_resume ();
171
+ }
169
172
if (!error ) {
170
173
if (!(suspend_test (TEST_CORE ) || pm_wakeup_pending ())) {
171
174
error = suspend_ops -> enter (state );
You can’t perform that action at this time.
0 commit comments