PM / s2idle: Rearrange the main suspend-to-idle loop

As a preparation for subsequent changes, rearrange the core
suspend-to-idle code by moving the initial invocation of
dpm_suspend_noirq() into s2idle_loop().

This also causes debug messages from that code to appear in
a less confusing order.

Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
This commit is contained in:
Rafael J. Wysocki 2017-07-21 02:07:54 +02:00
parent cb08e0353c
commit 8e6bcd9f7e
2 changed files with 17 additions and 13 deletions

View File

@ -245,7 +245,11 @@ enum {
#define TEST_FIRST TEST_NONE
#define TEST_MAX (__TEST_AFTER_LAST - 1)
#ifdef CONFIG_PM_DEBUG
extern int pm_test_level;
#else
#define pm_test_level (TEST_NONE)
#endif
#ifdef CONFIG_SUSPEND_FREEZER
static inline int suspend_freeze_processes(void)

View File

@ -108,7 +108,13 @@ static void s2idle_loop(void)
{
pm_pr_dbg("suspend-to-idle\n");
do {
while (!dpm_suspend_noirq(PMSG_SUSPEND)) {
/*
* Suspend-to-idle equals
* frozen processes + suspended devices + idle processors.
* Thus freeze_enter() should be called right after
* all devices have been suspended.
*/
freeze_enter();
if (freeze_ops && freeze_ops->wake)
@ -122,7 +128,7 @@ static void s2idle_loop(void)
break;
pm_wakeup_clear(false);
} while (!dpm_suspend_noirq(PMSG_SUSPEND));
}
pm_pr_dbg("resume from suspend-to-idle\n");
}
@ -379,6 +385,11 @@ static int suspend_enter(suspend_state_t state, bool *wakeup)
if (error)
goto Devices_early_resume;
if (state == PM_SUSPEND_FREEZE && pm_test_level != TEST_PLATFORM) {
s2idle_loop();
goto Platform_early_resume;
}
error = dpm_suspend_noirq(PMSG_SUSPEND);
if (error) {
pr_err("PM: noirq suspend of devices failed\n");
@ -391,17 +402,6 @@ static int suspend_enter(suspend_state_t state, bool *wakeup)
if (suspend_test(TEST_PLATFORM))
goto Platform_wake;
/*
* PM_SUSPEND_FREEZE equals
* frozen processes + suspended devices + idle processors.
* Thus we should invoke freeze_enter() soon after
* all the devices are suspended.
*/
if (state == PM_SUSPEND_FREEZE) {
s2idle_loop();
goto Platform_early_resume;
}
error = disable_nonboot_cpus();
if (error || suspend_test(TEST_CPUS))
goto Enable_cpus;