| From: "Rafael J. Wysocki" <rafael.j.wysocki@intel.com> |
| Date: Wed, 4 Dec 2019 02:54:27 +0100 |
| Subject: ACPI: PM: Avoid attaching ACPI PM domain to certain devices |
| |
| commit b9ea0bae260f6aae546db224daa6ac1bd9d94b91 upstream. |
| |
| Certain ACPI-enumerated devices represented as platform devices in |
| Linux, like fans, require special low-level power management handling |
| implemented by their drivers that is not in agreement with the ACPI |
| PM domain behavior. That leads to problems with managing ACPI fans |
| during system-wide suspend and resume. |
| |
| For this reason, make acpi_dev_pm_attach() skip the affected devices |
| by adding a list of device IDs to avoid to it and putting the IDs of |
| the affected devices into that list. |
| |
| Fixes: e5cc8ef31267 (ACPI / PM: Provide ACPI PM callback routines for subsystems) |
| Reported-by: Zhang Rui <rui.zhang@intel.com> |
| Tested-by: Todd Brandt <todd.e.brandt@linux.intel.com> |
| Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> |
| [bwh: Backported to 3.16: adjust context] |
| Signed-off-by: Ben Hutchings <ben@decadent.org.uk> |
| --- |
| drivers/acpi/device_pm.c | 12 +++++++++++- |
| 1 file changed, 11 insertions(+), 1 deletion(-) |
| |
| --- a/drivers/acpi/device_pm.c |
| +++ b/drivers/acpi/device_pm.c |
| @@ -1041,9 +1041,19 @@ static struct dev_pm_domain acpi_general |
| */ |
| int acpi_dev_pm_attach(struct device *dev, bool power_on) |
| { |
| + /* |
| + * Skip devices whose ACPI companions match the device IDs below, |
| + * because they require special power management handling incompatible |
| + * with the generic ACPI PM domain. |
| + */ |
| + static const struct acpi_device_id special_pm_ids[] = { |
| + {"PNP0C0B", }, /* Generic ACPI fan */ |
| + {"INT3404", }, /* Fan */ |
| + {} |
| + }; |
| struct acpi_device *adev = ACPI_COMPANION(dev); |
| |
| - if (!adev) |
| + if (!adev || !acpi_match_device_ids(adev, special_pm_ids)) |
| return -ENODEV; |
| |
| if (dev->pm_domain) |