Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 377274
b: refs/heads/master
c: b9e95fc
h: refs/heads/master
v: v3
  • Loading branch information
Rafael J. Wysocki committed Jun 19, 2013
1 parent 14d1ea3 commit 429be56
Show file tree
Hide file tree
Showing 4 changed files with 37 additions and 7 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 6ee22e9d59151550a55d370b14109bdae8b58bda
refs/heads/master: b9e95fc65ededbec083aa91b4faa58ad992c0891
21 changes: 15 additions & 6 deletions trunk/drivers/acpi/acpi_lpss.c
Original file line number Diff line number Diff line change
Expand Up @@ -164,15 +164,24 @@ static int acpi_lpss_create_device(struct acpi_device *adev,
if (dev_desc->clk_required) {
ret = register_device_clock(adev, pdata);
if (ret) {
/*
* Skip the device, but don't terminate the namespace
* scan.
*/
kfree(pdata);
return 0;
/* Skip the device, but continue the namespace scan. */
ret = 0;
goto err_out;
}
}

/*
* This works around a known issue in ACPI tables where LPSS devices
* have _PS0 and _PS3 without _PSC (and no power resources), so
* acpi_bus_init_power() will assume that the BIOS has put them into D0.
*/
ret = acpi_device_fix_up_power(adev);
if (ret) {
/* Skip the device, but continue the namespace scan. */
ret = 0;
goto err_out;
}

adev->driver_data = pdata;
ret = acpi_create_platform_device(adev, id);
if (ret > 0)
Expand Down
20 changes: 20 additions & 0 deletions trunk/drivers/acpi/device_pm.c
Original file line number Diff line number Diff line change
Expand Up @@ -290,6 +290,26 @@ int acpi_bus_init_power(struct acpi_device *device)
return 0;
}

/**
* acpi_device_fix_up_power - Force device with missing _PSC into D0.
* @device: Device object whose power state is to be fixed up.
*
* Devices without power resources and _PSC, but having _PS0 and _PS3 defined,
* are assumed to be put into D0 by the BIOS. However, in some cases that may
* not be the case and this function should be used then.
*/
int acpi_device_fix_up_power(struct acpi_device *device)
{
int ret = 0;

if (!device->power.flags.power_resources
&& !device->power.flags.explicit_get
&& device->power.state == ACPI_STATE_D0)
ret = acpi_dev_pm_explicit_set(device, ACPI_STATE_D0);

return ret;
}

int acpi_bus_update_power(acpi_handle handle, int *state_p)
{
struct acpi_device *device;
Expand Down
1 change: 1 addition & 0 deletions trunk/include/acpi/acpi_bus.h
Original file line number Diff line number Diff line change
Expand Up @@ -382,6 +382,7 @@ const char *acpi_power_state_string(int state);
int acpi_device_get_power(struct acpi_device *device, int *state);
int acpi_device_set_power(struct acpi_device *device, int state);
int acpi_bus_init_power(struct acpi_device *device);
int acpi_device_fix_up_power(struct acpi_device *device);
int acpi_bus_update_power(acpi_handle handle, int *state_p);
bool acpi_bus_power_manageable(acpi_handle handle);

Expand Down

0 comments on commit 429be56

Please sign in to comment.