Commit 8e6bcd9f authored by Rafael J. Wysocki's avatar Rafael J. Wysocki
Browse files

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: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent cb08e035
Loading
Loading
Loading
Loading
+4 −0
Original line number Original line Diff line number Diff line
@@ -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)
+13 −13
Original line number Original line Diff line number Diff line
@@ -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;