--- linux/drivers/acpi/sleep/main.c 2005-01-15 10:28:32.224204848 +0100 +++ drivers/acpi/sleep/main.c 2004-12-27 13:11:03.000000000 +0100 @@ -130,7 +130,22 @@ return ACPI_SUCCESS(status) ? 0 : -EFAULT; } +/** + * acpi_pm_leave - Make system ready to resume devices. + * @pm_state: State we're coming out of. + * + * This is called after we wake back up and before device + * resume methods are called. + */ + +static int acpi_pm_leave(suspend_state_t pm_state) +{ + u32 acpi_state = acpi_suspend_states[pm_state]; + acpi_leave_sleep_state(acpi_state); + + return 0; +} /** * acpi_pm_finish - Finish up suspend sequence. * @pm_state: State we're coming out of. @@ -142,8 +157,7 @@ static int acpi_pm_finish(suspend_state_t pm_state) { u32 acpi_state = acpi_suspend_states[pm_state]; - - acpi_leave_sleep_state(acpi_state); + acpi_disable_wakeup_device(acpi_state); /* reset firmware waking vector */ @@ -173,6 +187,7 @@ static struct pm_ops acpi_pm_ops = { .prepare = acpi_pm_prepare, .enter = acpi_pm_enter, + .leave = acpi_pm_leave, .finish = acpi_pm_finish, }; --- linux/kernel/power/main.c 2005-01-15 10:28:40.151999640 +0100 +++ kernel/power/main.c 2005-01-15 10:25:55.118088608 +0100 @@ -60,13 +60,14 @@ goto Thaw; } + if ((error = device_suspend(state))) + goto Finish; + if (pm_ops->prepare) { if ((error = pm_ops->prepare(state))) - goto Thaw; + goto Finish; } - - if ((error = device_suspend(state))) - goto Finish; + return 0; Finish: if (pm_ops->finish) @@ -104,6 +105,8 @@ static void suspend_finish(suspend_state_t state) { + if (pm_ops && pm_ops->leave) + pm_ops->leave(state); device_resume(); if (pm_ops && pm_ops->finish) pm_ops->finish(state); --- linux/include/linux/pm.h 2005-01-15 10:28:39.937032320 +0100 +++ include/linux/pm.h 2004-12-26 15:27:10.000000000 +0100 @@ -208,6 +208,7 @@ suspend_disk_method_t pm_disk_mode; int (*prepare)(suspend_state_t state); int (*enter)(suspend_state_t state); + int (*leave)(suspend_state_t state); int (*finish)(suspend_state_t state); };