acpi_status acpi_system_suspend( u32 state) { acpi_status status = AE_ERROR; unsigned long flags = 0; local_irq_save(flags); /* kernel_fpu_begin(); */ switch (state) { case ACPI_STATE_S1: case ACPI_STATE_S5: barrier(); status = acpi_enter_sleep_state(state); break; case ACPI_STATE_S4: do_suspend_lowlevel_s4bios(0); break; } /* kernel_fpu_end(); */ local_irq_restore(flags); return status; }
static int acpi_pm_enter(suspend_state_t pm_state) { acpi_status status = AE_OK; unsigned long flags = 0; u32 acpi_state = acpi_suspend_states[pm_state]; ACPI_FLUSH_CPU_CACHE(); /* Do arch specific saving of state. */ if (pm_state > PM_SUSPEND_STANDBY) { int error = acpi_save_state_mem(); if (error) return error; } local_irq_save(flags); acpi_enable_wakeup_device(acpi_state); switch (pm_state) { case PM_SUSPEND_STANDBY: barrier(); status = acpi_enter_sleep_state(acpi_state); break; case PM_SUSPEND_MEM: do_suspend_lowlevel(); break; case PM_SUSPEND_DISK: if (acpi_pm_ops.pm_disk_mode == PM_DISK_PLATFORM) status = acpi_enter_sleep_state(acpi_state); else do_suspend_lowlevel_s4bios(); break; case PM_SUSPEND_MAX: acpi_power_off(); break; default: return -EINVAL; } local_irq_restore(flags); printk(KERN_DEBUG "Back to C!\n"); /* restore processor state * We should only be here if we're coming back from STR or STD. * And, in the case of the latter, the memory image should have already * been loaded from disk. */ if (pm_state > PM_SUSPEND_STANDBY) acpi_restore_state_mem(); return ACPI_SUCCESS(status) ? 0 : -EFAULT; }