Loading drivers/acpi/bus.c +1 −1 Original line number Diff line number Diff line Loading @@ -200,7 +200,7 @@ int acpi_bus_set_power(acpi_handle handle, int state) * Get device's current power state */ acpi_bus_get_power(device->handle, &device->power.state); if (state == device->power.state) { if ((state == device->power.state) && !device->flags.force_power_state) { ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device is already at D%d\n", state)); return 0; Loading drivers/acpi/fan.c +40 −0 Original line number Diff line number Diff line Loading @@ -47,6 +47,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, pm_message_t state); static int acpi_fan_resume(struct acpi_device *device); static const struct acpi_device_id fan_device_ids[] = { {"PNP0C0B", 0}, Loading @@ -61,6 +63,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 @@ -191,6 +195,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 @@ -216,6 +224,38 @@ static int acpi_fan_remove(struct acpi_device *device, int type) return 0; } static int acpi_fan_suspend(struct acpi_device *device, pm_message_t 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 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 @@ -168,7 +168,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 +1 −1 Original line number Diff line number Diff line Loading @@ -200,7 +200,7 @@ int acpi_bus_set_power(acpi_handle handle, int state) * Get device's current power state */ acpi_bus_get_power(device->handle, &device->power.state); if (state == device->power.state) { if ((state == device->power.state) && !device->flags.force_power_state) { ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device is already at D%d\n", state)); return 0; Loading
drivers/acpi/fan.c +40 −0 Original line number Diff line number Diff line Loading @@ -47,6 +47,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, pm_message_t state); static int acpi_fan_resume(struct acpi_device *device); static const struct acpi_device_id fan_device_ids[] = { {"PNP0C0B", 0}, Loading @@ -61,6 +63,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 @@ -191,6 +195,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 @@ -216,6 +224,38 @@ static int acpi_fan_remove(struct acpi_device *device, int type) return 0; } static int acpi_fan_suspend(struct acpi_device *device, pm_message_t 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 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 @@ -168,7 +168,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