static void acpi_power_off (void) { printk("%s called\n",__FUNCTION__); /* Some SMP machines only can poweroff in boot CPU */ set_cpus_allowed(current, cpumask_of_cpu(0)); acpi_enter_sleep_state_prep(ACPI_STATE_S5); ACPI_DISABLE_IRQS(); acpi_enter_sleep_state(ACPI_STATE_S5); }
/** * acpi_suspend - OS-agnostic system suspend/resume support (S? states) * @state: state we're entering * */ acpi_status acpi_suspend ( u32 state) { acpi_status status; /* only support S1 and S5 on kernel 2.4 */ if (state != ACPI_STATE_S1 && state != ACPI_STATE_S4 && state != ACPI_STATE_S5) return AE_ERROR; if (ACPI_STATE_S4 == state) { /* For s4bios, we need a wakeup address. */ if (1 == acpi_gbl_FACS->S4bios_f && 0 != acpi_gbl_FADT->smi_cmd) { if (!acpi_wakeup_address) return AE_ERROR; acpi_set_firmware_waking_vector((acpi_physical_address) acpi_wakeup_address); } else /* We don't support S4 under 2.4. Give up */ return AE_ERROR; } status = acpi_system_save_state(state); if (!ACPI_SUCCESS(status) && state != ACPI_STATE_S5) return status; acpi_enter_sleep_state_prep(state); /* disable interrupts and flush caches */ ACPI_DISABLE_IRQS(); ACPI_FLUSH_CPU_CACHE(); /* perform OS-specific sleep actions */ status = acpi_system_suspend(state); /* Even if we failed to go to sleep, all of the devices are in an suspended * mode. So, we run these unconditionaly to make sure we have a usable system * no matter what. */ acpi_leave_sleep_state(state); acpi_system_restore_state(state); /* make sure interrupts are enabled */ ACPI_ENABLE_IRQS(); /* reset firmware waking vector */ acpi_set_firmware_waking_vector((acpi_physical_address) 0); return status; }
static void acpi_power_off (void) { if (unlikely(in_interrupt())) BUG(); /* Some SMP machines only can poweroff in boot CPU */ set_cpus_allowed(current, 1UL << cpu_logical_map(0)); acpi_enter_sleep_state_prep(ACPI_STATE_S5); ACPI_DISABLE_IRQS(); acpi_enter_sleep_state(ACPI_STATE_S5); printk(KERN_EMERG "ACPI: can not power off machine\n"); }
int acpi_sleep_prepare(u32 acpi_state) { #ifdef CONFIG_ACPI_SLEEP /* do we have a wakeup address for S2 and S3? */ if (acpi_state == ACPI_STATE_S3) { if (!acpi_wakeup_address) { return -EFAULT; } acpi_set_firmware_waking_vector((acpi_physical_address) virt_to_phys((void *) acpi_wakeup_address)); } ACPI_FLUSH_CPU_CACHE(); acpi_enable_wakeup_device_prep(acpi_state); #endif acpi_enter_sleep_state_prep(acpi_state); return 0; }
static int acpi_sleep_prepare(u32 acpi_state) { #ifdef CONFIG_ACPI_SLEEP /* do we have a wakeup address for S2 and S3? */ if (acpi_state == ACPI_STATE_S3) { if (!acpi_wakeup_address) { return -EFAULT; } acpi_set_firmware_waking_vector( (acpi_physical_address)acpi_wakeup_address); } ACPI_FLUSH_CPU_CACHE(); acpi_enable_wakeup_device_prep(acpi_state); #endif printk(KERN_INFO PREFIX "Preparing to enter system sleep state S%d\n", acpi_state); acpi_enter_sleep_state_prep(acpi_state); return 0; }
static void acpi_db_do_one_sleep_state(u8 sleep_state) { acpi_status status; u8 sleep_type_a; u8 sleep_type_b; /* Validate parameter */ if (sleep_state > ACPI_S_STATES_MAX) { acpi_os_printf("Sleep state %d out of range (%d max)\n", sleep_state, ACPI_S_STATES_MAX); return; } acpi_os_printf("\n---- Invoking sleep state S%d (%s):\n", sleep_state, acpi_gbl_sleep_state_names[sleep_state]); /* Get the values for the sleep type registers (for display only) */ status = acpi_get_sleep_type_data(sleep_state, &sleep_type_a, &sleep_type_b); if (ACPI_FAILURE(status)) { acpi_os_printf("Could not evaluate [%s] method, %s\n", acpi_gbl_sleep_state_names[sleep_state], acpi_format_exception(status)); return; } acpi_os_printf ("Register values for sleep state S%d: Sleep-A: %.2X, Sleep-B: %.2X\n", sleep_state, sleep_type_a, sleep_type_b); /* Invoke the various sleep/wake interfaces */ acpi_os_printf("**** Sleep: Prepare to sleep (S%d) ****\n", sleep_state); status = acpi_enter_sleep_state_prep(sleep_state); if (ACPI_FAILURE(status)) { goto error_exit; } acpi_os_printf("**** Sleep: Going to sleep (S%d) ****\n", sleep_state); status = acpi_enter_sleep_state(sleep_state); if (ACPI_FAILURE(status)) { goto error_exit; } acpi_os_printf("**** Wake: Prepare to return from sleep (S%d) ****\n", sleep_state); status = acpi_leave_sleep_state_prep(sleep_state); if (ACPI_FAILURE(status)) { goto error_exit; } acpi_os_printf("**** Wake: Return from sleep (S%d) ****\n", sleep_state); status = acpi_leave_sleep_state(sleep_state); if (ACPI_FAILURE(status)) { goto error_exit; } return; error_exit: ACPI_EXCEPTION((AE_INFO, status, "During invocation of sleep state S%d", sleep_state)); }