Commit 08e4a10e authored by Len Brown's avatar Len Brown

Pull bugzilla-7570 into release branch

parents 4559b438 b1028c54
...@@ -199,15 +199,14 @@ int acpi_bus_set_power(acpi_handle handle, int state) ...@@ -199,15 +199,14 @@ int acpi_bus_set_power(acpi_handle handle, int state)
* Get device's current power state if it's unknown * Get device's current power state if it's unknown
* This means device power state isn't initialized or previous setting failed * 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) || device->flags.force_power_state)
if (device->power.state == ACPI_STATE_UNKNOWN) acpi_bus_get_power(device->handle, &device->power.state);
acpi_bus_get_power(device->handle, &device->power.state); if ((state == device->power.state) && !device->flags.force_power_state) {
if (state == device->power.state) { ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device is already at D%d\n",
ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device is already at D%d\n", state));
state)); return 0;
return 0;
}
} }
if (!device->power.states[state].flags.valid) { if (!device->power.states[state].flags.valid) {
printk(KERN_WARNING PREFIX "Device does not support D%d\n", state); printk(KERN_WARNING PREFIX "Device does not support D%d\n", state);
return -ENODEV; return -ENODEV;
......
...@@ -455,6 +455,10 @@ int acpi_power_transition(struct acpi_device *device, int state) ...@@ -455,6 +455,10 @@ int acpi_power_transition(struct acpi_device *device, int state)
goto end; goto end;
} }
if (device->power.state == state) {
goto end;
}
/* /*
* Then we dereference all power resources used in the current list. * Then we dereference all power resources used in the current list.
*/ */
......
...@@ -1356,28 +1356,32 @@ static int acpi_thermal_remove(struct acpi_device *device, int type) ...@@ -1356,28 +1356,32 @@ static int acpi_thermal_remove(struct acpi_device *device, int type)
static int acpi_thermal_resume(struct acpi_device *device) static int acpi_thermal_resume(struct acpi_device *device)
{ {
struct acpi_thermal *tz = NULL; struct acpi_thermal *tz = NULL;
int i; int i, j, power_state, result;
if (!device || !acpi_driver_data(device)) if (!device || !acpi_driver_data(device))
return -EINVAL; return -EINVAL;
tz = acpi_driver_data(device); tz = acpi_driver_data(device);
acpi_thermal_get_temperature(tz);
for (i = 0; i < ACPI_THERMAL_MAX_ACTIVE; i++) { for (i = 0; i < ACPI_THERMAL_MAX_ACTIVE; i++) {
if (tz->trips.active[i].flags.valid) { if (!(&tz->trips.active[i]))
tz->temperature = tz->trips.active[i].temperature; break;
tz->trips.active[i].flags.enabled = 0; if (!tz->trips.active[i].flags.valid)
break;
acpi_thermal_active(tz); tz->trips.active[i].flags.enabled = 1;
for (j = 0; j < tz->trips.active[i].devices.count; j++) {
tz->state.active |= tz->trips.active[i].flags.enabled; result = acpi_bus_get_power(tz->trips.active[i].devices.
tz->state.active_index = i; handles[j], &power_state);
if (result || (power_state != ACPI_STATE_D0)) {
tz->trips.active[i].flags.enabled = 0;
break;
}
} }
tz->state.active |= tz->trips.active[i].flags.enabled;
} }
acpi_thermal_check(tz); acpi_thermal_check(tz);
return AE_OK; return AE_OK;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment