Merge branch 'acpi-pm'
* acpi-pm: ACPI / PM: Add state information to error message in acpi_device_set_power() ACPI / PM: Remove redundant power manageable check from acpi_bus_set_power() ACPI / PM: Use ACPI_STATE_D3_COLD instead of ACPI_STATE_D3 everywhere ACPI / PM: Make messages in acpi_device_set_power() print device names ACPI / PM: Only set power states of devices that are power manageable
This commit is contained in:
commit
0ad4c9a984
8 changed files with 29 additions and 33 deletions
|
@ -159,26 +159,29 @@ int acpi_device_set_power(struct acpi_device *device, int state)
|
||||||
int result = 0;
|
int result = 0;
|
||||||
bool cut_power = false;
|
bool cut_power = false;
|
||||||
|
|
||||||
if (!device || (state < ACPI_STATE_D0) || (state > ACPI_STATE_D3_COLD))
|
if (!device || !device->flags.power_manageable
|
||||||
|
|| (state < ACPI_STATE_D0) || (state > ACPI_STATE_D3_COLD))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
/* Make sure this is a valid target state */
|
/* Make sure this is a valid target state */
|
||||||
|
|
||||||
if (state == device->power.state) {
|
if (state == device->power.state) {
|
||||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device is already at %s\n",
|
ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device [%s] already in %s\n",
|
||||||
|
device->pnp.bus_id,
|
||||||
acpi_power_state_string(state)));
|
acpi_power_state_string(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 %s\n",
|
dev_warn(&device->dev, "Power state %s not supported\n",
|
||||||
acpi_power_state_string(state));
|
acpi_power_state_string(state));
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
if (device->parent && (state < device->parent->power.state)) {
|
if (device->parent && (state < device->parent->power.state)) {
|
||||||
printk(KERN_WARNING PREFIX
|
dev_warn(&device->dev,
|
||||||
"Cannot set device to a higher-powered"
|
"Cannot transition to power state %s for parent in %s\n",
|
||||||
" state than parent\n");
|
acpi_power_state_string(state),
|
||||||
|
acpi_power_state_string(device->parent->power.state));
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -191,8 +194,8 @@ int acpi_device_set_power(struct acpi_device *device, int state)
|
||||||
|
|
||||||
if (state < device->power.state && state != ACPI_STATE_D0
|
if (state < device->power.state && state != ACPI_STATE_D0
|
||||||
&& device->power.state >= ACPI_STATE_D3_HOT) {
|
&& device->power.state >= ACPI_STATE_D3_HOT) {
|
||||||
printk(KERN_WARNING PREFIX
|
dev_warn(&device->dev,
|
||||||
"Cannot transition to non-D0 state from D3\n");
|
"Cannot transition to non-D0 state from D3\n");
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -219,10 +222,8 @@ int acpi_device_set_power(struct acpi_device *device, int state)
|
||||||
|
|
||||||
end:
|
end:
|
||||||
if (result) {
|
if (result) {
|
||||||
printk(KERN_WARNING PREFIX
|
dev_warn(&device->dev, "Failed to change power state to %s\n",
|
||||||
"Device [%s] failed to transition to %s\n",
|
acpi_power_state_string(state));
|
||||||
device->pnp.bus_id,
|
|
||||||
acpi_power_state_string(state));
|
|
||||||
} else {
|
} else {
|
||||||
device->power.state = state;
|
device->power.state = state;
|
||||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
|
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
|
||||||
|
@ -244,13 +245,6 @@ int acpi_bus_set_power(acpi_handle handle, int state)
|
||||||
if (result)
|
if (result)
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
if (!device->flags.power_manageable) {
|
|
||||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
|
|
||||||
"Device [%s] is not power manageable\n",
|
|
||||||
dev_name(&device->dev)));
|
|
||||||
return -ENODEV;
|
|
||||||
}
|
|
||||||
|
|
||||||
return acpi_device_set_power(device, state);
|
return acpi_device_set_power(device, state);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(acpi_bus_set_power);
|
EXPORT_SYMBOL(acpi_bus_set_power);
|
||||||
|
|
|
@ -93,7 +93,7 @@ static int fan_get_cur_state(struct thermal_cooling_device *cdev, unsigned long
|
||||||
if (result)
|
if (result)
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
*state = (acpi_state == ACPI_STATE_D3 ? 0 :
|
*state = (acpi_state == ACPI_STATE_D3_COLD ? 0 :
|
||||||
(acpi_state == ACPI_STATE_D0 ? 1 : -1));
|
(acpi_state == ACPI_STATE_D0 ? 1 : -1));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -108,7 +108,7 @@ fan_set_cur_state(struct thermal_cooling_device *cdev, unsigned long state)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
result = acpi_bus_set_power(device->handle,
|
result = acpi_bus_set_power(device->handle,
|
||||||
state ? ACPI_STATE_D0 : ACPI_STATE_D3);
|
state ? ACPI_STATE_D0 : ACPI_STATE_D3_COLD);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
|
@ -784,7 +784,7 @@ int acpi_power_get_inferred_state(struct acpi_device *device, int *state)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
*state = ACPI_STATE_D3;
|
*state = ACPI_STATE_D3_COLD;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1409,8 +1409,8 @@ static void acpi_bus_get_power_flags(struct acpi_device *device)
|
||||||
/* Set defaults for D0 and D3 states (always valid) */
|
/* Set defaults for D0 and D3 states (always valid) */
|
||||||
device->power.states[ACPI_STATE_D0].flags.valid = 1;
|
device->power.states[ACPI_STATE_D0].flags.valid = 1;
|
||||||
device->power.states[ACPI_STATE_D0].power = 100;
|
device->power.states[ACPI_STATE_D0].power = 100;
|
||||||
device->power.states[ACPI_STATE_D3].flags.valid = 1;
|
device->power.states[ACPI_STATE_D3_COLD].flags.valid = 1;
|
||||||
device->power.states[ACPI_STATE_D3].power = 0;
|
device->power.states[ACPI_STATE_D3_COLD].power = 0;
|
||||||
|
|
||||||
/* Set D3cold's explicit_set flag if _PS3 exists. */
|
/* Set D3cold's explicit_set flag if _PS3 exists. */
|
||||||
if (device->power.states[ACPI_STATE_D3_HOT].flags.explicit_set)
|
if (device->power.states[ACPI_STATE_D3_HOT].flags.explicit_set)
|
||||||
|
|
|
@ -947,11 +947,11 @@ static void pata_acpi_set_state(struct ata_port *ap, pm_message_t state)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
acpi_bus_set_power(dev_handle, state.event & PM_EVENT_RESUME ?
|
acpi_bus_set_power(dev_handle, state.event & PM_EVENT_RESUME ?
|
||||||
ACPI_STATE_D0 : ACPI_STATE_D3);
|
ACPI_STATE_D0 : ACPI_STATE_D3_COLD);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(state.event & PM_EVENT_RESUME))
|
if (!(state.event & PM_EVENT_RESUME))
|
||||||
acpi_bus_set_power(port_handle, ACPI_STATE_D3);
|
acpi_bus_set_power(port_handle, ACPI_STATE_D3_COLD);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -520,11 +520,12 @@ void ide_acpi_set_state(ide_hwif_t *hwif, int on)
|
||||||
ide_port_for_each_present_dev(i, drive, hwif) {
|
ide_port_for_each_present_dev(i, drive, hwif) {
|
||||||
if (drive->acpidata->obj_handle)
|
if (drive->acpidata->obj_handle)
|
||||||
acpi_bus_set_power(drive->acpidata->obj_handle,
|
acpi_bus_set_power(drive->acpidata->obj_handle,
|
||||||
on ? ACPI_STATE_D0 : ACPI_STATE_D3);
|
on ? ACPI_STATE_D0 : ACPI_STATE_D3_COLD);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!on)
|
if (!on)
|
||||||
acpi_bus_set_power(hwif->acpidata->obj_handle, ACPI_STATE_D3);
|
acpi_bus_set_power(hwif->acpidata->obj_handle,
|
||||||
|
ACPI_STATE_D3_COLD);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -131,7 +131,7 @@ static int pnpacpi_disable_resources(struct pnp_dev *dev)
|
||||||
/* acpi_unregister_gsi(pnp_irq(dev, 0)); */
|
/* acpi_unregister_gsi(pnp_irq(dev, 0)); */
|
||||||
ret = 0;
|
ret = 0;
|
||||||
if (acpi_bus_power_manageable(handle))
|
if (acpi_bus_power_manageable(handle))
|
||||||
acpi_bus_set_power(handle, ACPI_STATE_D3);
|
acpi_bus_set_power(handle, ACPI_STATE_D3_COLD);
|
||||||
/* continue even if acpi_bus_set_power() fails */
|
/* continue even if acpi_bus_set_power() fails */
|
||||||
if (ACPI_FAILURE(acpi_evaluate_object(handle, "_DIS", NULL, NULL)))
|
if (ACPI_FAILURE(acpi_evaluate_object(handle, "_DIS", NULL, NULL)))
|
||||||
ret = -ENODEV;
|
ret = -ENODEV;
|
||||||
|
@ -174,10 +174,10 @@ static int pnpacpi_suspend(struct pnp_dev *dev, pm_message_t state)
|
||||||
|
|
||||||
if (acpi_bus_power_manageable(handle)) {
|
if (acpi_bus_power_manageable(handle)) {
|
||||||
int power_state = acpi_pm_device_sleep_state(&dev->dev, NULL,
|
int power_state = acpi_pm_device_sleep_state(&dev->dev, NULL,
|
||||||
ACPI_STATE_D3);
|
ACPI_STATE_D3_COLD);
|
||||||
if (power_state < 0)
|
if (power_state < 0)
|
||||||
power_state = (state.event == PM_EVENT_ON) ?
|
power_state = (state.event == PM_EVENT_ON) ?
|
||||||
ACPI_STATE_D0 : ACPI_STATE_D3;
|
ACPI_STATE_D0 : ACPI_STATE_D3_COLD;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* acpi_bus_set_power() often fails (keyboard port can't be
|
* acpi_bus_set_power() often fails (keyboard port can't be
|
||||||
|
|
|
@ -486,7 +486,8 @@ static inline int acpi_pm_device_sleep_state(struct device *d, int *p, int m)
|
||||||
if (p)
|
if (p)
|
||||||
*p = ACPI_STATE_D0;
|
*p = ACPI_STATE_D0;
|
||||||
|
|
||||||
return (m >= ACPI_STATE_D0 && m <= ACPI_STATE_D3) ? m : ACPI_STATE_D0;
|
return (m >= ACPI_STATE_D0 && m <= ACPI_STATE_D3_COLD) ?
|
||||||
|
m : ACPI_STATE_D0;
|
||||||
}
|
}
|
||||||
static inline void acpi_dev_pm_add_dependent(acpi_handle handle,
|
static inline void acpi_dev_pm_add_dependent(acpi_handle handle,
|
||||||
struct device *depdev) {}
|
struct device *depdev) {}
|
||||||
|
|
Loading…
Add table
Reference in a new issue