static ssize_t acpi_system_write_sleep ( struct file *file, const char __user *buffer, size_t count, loff_t *ppos) { char str[12]; u32 state = 0; int error = 0; if (count > sizeof(str) - 1) goto Done; memset(str,0,sizeof(str)); if (copy_from_user(str, buffer, count)) return -EFAULT; /* Check for S4 bios request */ if (!strcmp(str,"4b")) { error = acpi_suspend(4); goto Done; } state = simple_strtoul(str, NULL, 0); #ifdef CONFIG_SOFTWARE_SUSPEND if (state == 4) { software_suspend(); goto Done; } #endif error = acpi_suspend(state); Done: return error ? error : count; }
static int acpi_system_write_sleep ( struct file *file, const char *buffer, unsigned long count, void *data) { acpi_status status = AE_OK; struct acpi_system *system = (struct acpi_system *) data; char state_string[12] = {'\0'}; u32 state = 0; ACPI_FUNCTION_TRACE("acpi_system_write_sleep"); if (!system || (count > sizeof(state_string) - 1)) return_VALUE(-EINVAL); if (copy_from_user(state_string, buffer, count)) return_VALUE(-EFAULT); state_string[count] = '\0'; state = simple_strtoul(state_string, NULL, 0); if (!system->states[state]) return_VALUE(-ENODEV); /* * If S4 is supported by the OS, then we should assume that * echo 4b > /proc/acpi/sleep is for s4bios. * Since we have only s4bios, we assume that acpi_suspend failed * if no s4bios support. */ status = acpi_suspend(state); if (ACPI_FAILURE(status)) return_VALUE(-ENODEV); return_VALUE(count); }
NTSTATUS Bus_FDO_Power ( PFDO_DEVICE_DATA Data, PIRP Irp ) { NTSTATUS status = STATUS_SUCCESS; POWER_STATE powerState; POWER_STATE_TYPE powerType; PIO_STACK_LOCATION stack; ULONG AcpiState; ACPI_STATUS AcpiStatus; SYSTEM_POWER_STATE oldPowerState; stack = IoGetCurrentIrpStackLocation (Irp); powerType = stack->Parameters.Power.Type; powerState = stack->Parameters.Power.State; if (stack->MinorFunction == IRP_MN_SET_POWER) { DPRINT("\tRequest to set %s state to %s\n", ((powerType == SystemPowerState) ? "System" : "Device"), ((powerType == SystemPowerState) ? \ DbgSystemPowerString(powerState.SystemState) :\ DbgDevicePowerString(powerState.DeviceState))); } if (powerType == SystemPowerState) { switch (powerState.SystemState) { case PowerSystemSleeping1: AcpiState = ACPI_STATE_S1; break; case PowerSystemSleeping2: AcpiState = ACPI_STATE_S2; break; case PowerSystemSleeping3: AcpiState = ACPI_STATE_S3; break; case PowerSystemHibernate: AcpiState = ACPI_STATE_S4; break; case PowerSystemShutdown: AcpiState = ACPI_STATE_S5; break; default: AcpiState = ACPI_STATE_UNKNOWN; ASSERT(FALSE); break; } oldPowerState = Data->Common.SystemPowerState; Data->Common.SystemPowerState = powerState.SystemState; AcpiStatus = acpi_suspend(AcpiState); if (!ACPI_SUCCESS(AcpiStatus)) { DPRINT1("Failed to enter sleep state %d (Status 0x%X)\n", AcpiState, AcpiStatus); Data->Common.SystemPowerState = oldPowerState; status = STATUS_UNSUCCESSFUL; } } PoStartNextPowerIrp (Irp); IoSkipCurrentIrpStackLocation(Irp); status = PoCallDriver (Data->NextLowerDriver, Irp); return status; }