Loading drivers/acpi/bus.c +8 −6 Original line number Diff line number Diff line Loading @@ -205,6 +205,7 @@ int acpi_bus_set_power(acpi_handle handle, int state) * Get device's current power state if it's unknown * This means device power state isn't initialized or previous setting failed */ if (!device->flags.force_power_state) { if (device->power.state == ACPI_STATE_UNKNOWN) acpi_bus_get_power(device->handle, &device->power.state); if (state == device->power.state) { Loading @@ -212,6 +213,7 @@ int acpi_bus_set_power(acpi_handle handle, int state) state)); return_VALUE(0); } } if (!device->power.states[state].flags.valid) { ACPI_DEBUG_PRINT((ACPI_DB_WARN, "Device does not support D%d\n", state)); Loading drivers/acpi/fan.c +40 −0 Original line number Diff line number Diff line Loading @@ -48,6 +48,8 @@ MODULE_LICENSE("GPL"); static int acpi_fan_add(struct acpi_device *device); static int acpi_fan_remove(struct acpi_device *device, int type); static int acpi_fan_suspend(struct acpi_device *device, int state); static int acpi_fan_resume(struct acpi_device *device, int state); static struct acpi_driver acpi_fan_driver = { .name = ACPI_FAN_DRIVER_NAME, Loading @@ -56,6 +58,8 @@ static struct acpi_driver acpi_fan_driver = { .ops = { .add = acpi_fan_add, .remove = acpi_fan_remove, .suspend = acpi_fan_suspend, .resume = acpi_fan_resume, }, }; Loading Loading @@ -206,6 +210,10 @@ static int acpi_fan_add(struct acpi_device *device) goto end; } device->flags.force_power_state = 1; acpi_bus_set_power(device->handle, state); device->flags.force_power_state = 0; result = acpi_fan_add_fs(device); if (result) goto end; Loading Loading @@ -239,6 +247,38 @@ static int acpi_fan_remove(struct acpi_device *device, int type) return_VALUE(0); } static int acpi_fan_suspend(struct acpi_device *device, int state) { if (!device) return -EINVAL; acpi_bus_set_power(device->handle, ACPI_STATE_D0); return AE_OK; } static int acpi_fan_resume(struct acpi_device *device, int state) { int result = 0; int power_state = 0; if (!device) return -EINVAL; result = acpi_bus_get_power(device->handle, &power_state); if (result) { ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Error reading fan power state\n")); return result; } device->flags.force_power_state = 1; acpi_bus_set_power(device->handle, power_state); device->flags.force_power_state = 0; return result; } static int __init acpi_fan_init(void) { int result = 0; Loading include/acpi/acpi_bus.h +2 −1 Original line number Diff line number Diff line Loading @@ -169,7 +169,8 @@ struct acpi_device_flags { u32 power_manageable:1; u32 performance_manageable:1; u32 wake_capable:1; /* Wakeup(_PRW) supported? */ u32 reserved:20; u32 force_power_state:1; u32 reserved:19; }; /* File System */ Loading Loading
drivers/acpi/bus.c +8 −6 Original line number Diff line number Diff line Loading @@ -205,6 +205,7 @@ int acpi_bus_set_power(acpi_handle handle, int state) * Get device's current power state if it's unknown * This means device power state isn't initialized or previous setting failed */ if (!device->flags.force_power_state) { if (device->power.state == ACPI_STATE_UNKNOWN) acpi_bus_get_power(device->handle, &device->power.state); if (state == device->power.state) { Loading @@ -212,6 +213,7 @@ int acpi_bus_set_power(acpi_handle handle, int state) state)); return_VALUE(0); } } if (!device->power.states[state].flags.valid) { ACPI_DEBUG_PRINT((ACPI_DB_WARN, "Device does not support D%d\n", state)); Loading
drivers/acpi/fan.c +40 −0 Original line number Diff line number Diff line Loading @@ -48,6 +48,8 @@ MODULE_LICENSE("GPL"); static int acpi_fan_add(struct acpi_device *device); static int acpi_fan_remove(struct acpi_device *device, int type); static int acpi_fan_suspend(struct acpi_device *device, int state); static int acpi_fan_resume(struct acpi_device *device, int state); static struct acpi_driver acpi_fan_driver = { .name = ACPI_FAN_DRIVER_NAME, Loading @@ -56,6 +58,8 @@ static struct acpi_driver acpi_fan_driver = { .ops = { .add = acpi_fan_add, .remove = acpi_fan_remove, .suspend = acpi_fan_suspend, .resume = acpi_fan_resume, }, }; Loading Loading @@ -206,6 +210,10 @@ static int acpi_fan_add(struct acpi_device *device) goto end; } device->flags.force_power_state = 1; acpi_bus_set_power(device->handle, state); device->flags.force_power_state = 0; result = acpi_fan_add_fs(device); if (result) goto end; Loading Loading @@ -239,6 +247,38 @@ static int acpi_fan_remove(struct acpi_device *device, int type) return_VALUE(0); } static int acpi_fan_suspend(struct acpi_device *device, int state) { if (!device) return -EINVAL; acpi_bus_set_power(device->handle, ACPI_STATE_D0); return AE_OK; } static int acpi_fan_resume(struct acpi_device *device, int state) { int result = 0; int power_state = 0; if (!device) return -EINVAL; result = acpi_bus_get_power(device->handle, &power_state); if (result) { ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Error reading fan power state\n")); return result; } device->flags.force_power_state = 1; acpi_bus_set_power(device->handle, power_state); device->flags.force_power_state = 0; return result; } static int __init acpi_fan_init(void) { int result = 0; Loading
include/acpi/acpi_bus.h +2 −1 Original line number Diff line number Diff line Loading @@ -169,7 +169,8 @@ struct acpi_device_flags { u32 power_manageable:1; u32 performance_manageable:1; u32 wake_capable:1; /* Wakeup(_PRW) supported? */ u32 reserved:20; u32 force_power_state:1; u32 reserved:19; }; /* File System */ Loading