mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-10 07:50:04 +00:00
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:
parent
cb08e0353c
commit
8e6bcd9f7e
@ -245,7 +245,11 @@ enum {
|
|||||||
#define TEST_FIRST TEST_NONE
|
#define TEST_FIRST TEST_NONE
|
||||||
#define TEST_MAX (__TEST_AFTER_LAST - 1)
|
#define TEST_MAX (__TEST_AFTER_LAST - 1)
|
||||||
|
|
||||||
|
#ifdef CONFIG_PM_DEBUG
|
||||||
extern int pm_test_level;
|
extern int pm_test_level;
|
||||||
|
#else
|
||||||
|
#define pm_test_level (TEST_NONE)
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_SUSPEND_FREEZER
|
#ifdef CONFIG_SUSPEND_FREEZER
|
||||||
static inline int suspend_freeze_processes(void)
|
static inline int suspend_freeze_processes(void)
|
||||||
|
@ -108,7 +108,13 @@ static void s2idle_loop(void)
|
|||||||
{
|
{
|
||||||
pm_pr_dbg("suspend-to-idle\n");
|
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();
|
freeze_enter();
|
||||||
|
|
||||||
if (freeze_ops && freeze_ops->wake)
|
if (freeze_ops && freeze_ops->wake)
|
||||||
@ -122,7 +128,7 @@ static void s2idle_loop(void)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
pm_wakeup_clear(false);
|
pm_wakeup_clear(false);
|
||||||
} while (!dpm_suspend_noirq(PMSG_SUSPEND));
|
}
|
||||||
|
|
||||||
pm_pr_dbg("resume from suspend-to-idle\n");
|
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)
|
if (error)
|
||||||
goto Devices_early_resume;
|
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);
|
error = dpm_suspend_noirq(PMSG_SUSPEND);
|
||||||
if (error) {
|
if (error) {
|
||||||
pr_err("PM: noirq suspend of devices failed\n");
|
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))
|
if (suspend_test(TEST_PLATFORM))
|
||||||
goto Platform_wake;
|
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();
|
error = disable_nonboot_cpus();
|
||||||
if (error || suspend_test(TEST_CPUS))
|
if (error || suspend_test(TEST_CPUS))
|
||||||
goto Enable_cpus;
|
goto Enable_cpus;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user