diff options
author | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2017-10-05 18:24:14 -0400 |
---|---|---|
committer | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2017-10-05 18:24:14 -0400 |
commit | ca935f8e769c3e36e1b6339cc527a25c49f4d624 (patch) | |
tree | 6c6e0bb614e5ad3054b9c8a9e4eecfbbf8525eb0 | |
parent | 9e66317d3c92ddaab330c125dfe9d06eee268aff (diff) | |
parent | 87cbde8d9081b91df86a21d0d743cd700e04890a (diff) |
Merge branch 'pm-sleep'
* pm-sleep:
PM / s2idle: Invoke the ->wake() platform callback earlier
-rw-r--r-- | kernel/power/suspend.c | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/kernel/power/suspend.c b/kernel/power/suspend.c index 3e2b4f519009..ccd2d20e6b06 100644 --- a/kernel/power/suspend.c +++ b/kernel/power/suspend.c | |||
@@ -120,22 +120,26 @@ static void s2idle_loop(void) | |||
120 | * frozen processes + suspended devices + idle processors. | 120 | * frozen processes + suspended devices + idle processors. |
121 | * Thus s2idle_enter() should be called right after | 121 | * Thus s2idle_enter() should be called right after |
122 | * all devices have been suspended. | 122 | * all devices have been suspended. |
123 | * | ||
124 | * Wakeups during the noirq suspend of devices may be spurious, | ||
125 | * so prevent them from terminating the loop right away. | ||
123 | */ | 126 | */ |
124 | error = dpm_noirq_suspend_devices(PMSG_SUSPEND); | 127 | error = dpm_noirq_suspend_devices(PMSG_SUSPEND); |
125 | if (!error) | 128 | if (!error) |
126 | s2idle_enter(); | 129 | s2idle_enter(); |
130 | else if (error == -EBUSY && pm_wakeup_pending()) | ||
131 | error = 0; | ||
127 | 132 | ||
128 | dpm_noirq_resume_devices(PMSG_RESUME); | 133 | if (!error && s2idle_ops && s2idle_ops->wake) |
129 | if (error && (error != -EBUSY || !pm_wakeup_pending())) { | ||
130 | dpm_noirq_end(); | ||
131 | break; | ||
132 | } | ||
133 | |||
134 | if (s2idle_ops && s2idle_ops->wake) | ||
135 | s2idle_ops->wake(); | 134 | s2idle_ops->wake(); |
136 | 135 | ||
136 | dpm_noirq_resume_devices(PMSG_RESUME); | ||
137 | |||
137 | dpm_noirq_end(); | 138 | dpm_noirq_end(); |
138 | 139 | ||
140 | if (error) | ||
141 | break; | ||
142 | |||
139 | if (s2idle_ops && s2idle_ops->sync) | 143 | if (s2idle_ops && s2idle_ops->sync) |
140 | s2idle_ops->sync(); | 144 | s2idle_ops->sync(); |
141 | 145 | ||