lkml.org 
[lkml]   [2019]   [Dec]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.9 137/199] ACPI: PM: Avoid attaching ACPI PM domain to certain devices
    Date
    From: Rafael J. Wysocki <rafael.j.wysocki@intel.com>

    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>
    Cc: 3.10+ <stable@vger.kernel.org> # 3.10+
    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    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
    @@ -1096,9 +1096,19 @@ static void acpi_dev_pm_detach(struct de
    */
    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)

    \
     
     \ /
      Last update: 2019-12-19 19:48    [W:4.050 / U:0.512 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site