diff options
Diffstat (limited to 'kernel/power/main.c')
| -rw-r--r-- | kernel/power/main.c | 16 | 
1 files changed, 11 insertions, 5 deletions
diff --git a/kernel/power/main.c b/kernel/power/main.c index 6a6d5eb3524..3398f4651aa 100644 --- a/kernel/power/main.c +++ b/kernel/power/main.c @@ -228,6 +228,7 @@ static int suspend_enter(suspend_state_t state)  {  	int error = 0; +	device_pm_lock();  	arch_suspend_disable_irqs();  	BUG_ON(!irqs_disabled()); @@ -239,10 +240,11 @@ static int suspend_enter(suspend_state_t state)  	if (!suspend_test(TEST_CORE))  		error = suspend_ops->enter(state); -	device_power_up(); +	device_power_up(PMSG_RESUME);   Done:  	arch_suspend_enable_irqs();  	BUG_ON(irqs_disabled()); +	device_pm_unlock();  	return error;  } @@ -267,11 +269,11 @@ int suspend_devices_and_enter(suspend_state_t state)  	error = device_suspend(PMSG_SUSPEND);  	if (error) {  		printk(KERN_ERR "PM: Some devices failed to suspend\n"); -		goto Resume_console; +		goto Recover_platform;  	}  	if (suspend_test(TEST_DEVICES)) -		goto Resume_devices; +		goto Recover_platform;  	if (suspend_ops->prepare) {  		error = suspend_ops->prepare(); @@ -291,13 +293,17 @@ int suspend_devices_and_enter(suspend_state_t state)  	if (suspend_ops->finish)  		suspend_ops->finish();   Resume_devices: -	device_resume(); - Resume_console: +	device_resume(PMSG_RESUME);  	resume_console();   Close:  	if (suspend_ops->end)  		suspend_ops->end();  	return error; + + Recover_platform: +	if (suspend_ops->recover) +		suspend_ops->recover(); +	goto Resume_devices;  }  /**  |