|
@@ -126,12 +126,13 @@ void __attribute__ ((weak)) arch_suspend_enable_irqs(void)
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * suspend_enter - enter the desired system sleep state.
|
|
|
- * @state: state to enter
|
|
|
+ * suspend_enter - enter the desired system sleep state.
|
|
|
+ * @state: State to enter
|
|
|
+ * @wakeup: Returns information that suspend should not be entered again.
|
|
|
*
|
|
|
- * This function should be called after devices have been suspended.
|
|
|
+ * This function should be called after devices have been suspended.
|
|
|
*/
|
|
|
-static int suspend_enter(suspend_state_t state)
|
|
|
+static int suspend_enter(suspend_state_t state, bool *wakeup)
|
|
|
{
|
|
|
int error;
|
|
|
|
|
@@ -165,7 +166,8 @@ static int suspend_enter(suspend_state_t state)
|
|
|
|
|
|
error = syscore_suspend();
|
|
|
if (!error) {
|
|
|
- if (!(suspend_test(TEST_CORE) || pm_wakeup_pending())) {
|
|
|
+ *wakeup = pm_wakeup_pending();
|
|
|
+ if (!(suspend_test(TEST_CORE) || *wakeup)) {
|
|
|
error = suspend_ops->enter(state);
|
|
|
events_check_enabled = false;
|
|
|
}
|
|
@@ -199,6 +201,7 @@ static int suspend_enter(suspend_state_t state)
|
|
|
int suspend_devices_and_enter(suspend_state_t state)
|
|
|
{
|
|
|
int error;
|
|
|
+ bool wakeup = false;
|
|
|
|
|
|
if (!suspend_ops)
|
|
|
return -ENOSYS;
|
|
@@ -220,7 +223,10 @@ int suspend_devices_and_enter(suspend_state_t state)
|
|
|
if (suspend_test(TEST_DEVICES))
|
|
|
goto Recover_platform;
|
|
|
|
|
|
- error = suspend_enter(state);
|
|
|
+ do {
|
|
|
+ error = suspend_enter(state, &wakeup);
|
|
|
+ } while (!error && !wakeup
|
|
|
+ && suspend_ops->suspend_again && suspend_ops->suspend_again());
|
|
|
|
|
|
Resume_devices:
|
|
|
suspend_test_start();
|