aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>2017-10-05 18:24:14 -0400
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2017-10-05 18:24:14 -0400
commitca935f8e769c3e36e1b6339cc527a25c49f4d624 (patch)
tree6c6e0bb614e5ad3054b9c8a9e4eecfbbf8525eb0
parent9e66317d3c92ddaab330c125dfe9d06eee268aff (diff)
parent87cbde8d9081b91df86a21d0d743cd700e04890a (diff)
Merge branch 'pm-sleep'
* pm-sleep: PM / s2idle: Invoke the ->wake() platform callback earlier
-rw-r--r--kernel/power/suspend.c18
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