Skip to content

Commit

Permalink
ACPI: create acpi_fan_suspend()/acpi_fan_resume()
Browse files Browse the repository at this point in the history
http://bugzilla.kernel.org/show_bug.cgi?id=5000

Signed-off-by: Len Brown <len.brown@intel.com>
  • Loading branch information
Konstantin Karasyov authored and Len Brown committed May 15, 2006
1 parent 531881d commit 0feabb0
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 7 deletions.
14 changes: 8 additions & 6 deletions drivers/acpi/bus.c
Original file line number Diff line number Diff line change
Expand Up @@ -205,12 +205,14 @@ 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->power.state == ACPI_STATE_UNKNOWN)
acpi_bus_get_power(device->handle, &device->power.state);
if (state == device->power.state) {
ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device is already at D%d\n",
state));
return_VALUE(0);
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) {
ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device is already at D%d\n",
state));
return_VALUE(0);
}
}
if (!device->power.states[state].flags.valid) {
ACPI_DEBUG_PRINT((ACPI_DB_WARN, "Device does not support D%d\n",
Expand Down
40 changes: 40 additions & 0 deletions drivers/acpi/fan.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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,
},
};

Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down
3 changes: 2 additions & 1 deletion include/acpi/acpi_bus.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand Down

0 comments on commit 0feabb0

Please sign in to comment.