Пример #1
0
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;
}
Пример #2
0
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);
}
Пример #3
0
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;
}