• Rafael J. Wysocki's avatar
    ACPI / PM: Fix corner case in acpi_bus_update_power() · 2757f8d6
    Rafael J. Wysocki authored
    commit 91bdad0b6237c25a7bf8fd4604d0cc64a2005a23 upstream.
    
    The role of acpi_bus_update_power() is to update the given ACPI
    device object's power.state field to reflect the current physical
    state of the device (as inferred from the configuration of power
    resources and _PSC, if available).  For this purpose it calls
    acpi_device_set_power() that should update the power resources'
    reference counters and set power.state as appropriate.  However,
    that doesn't work if the "new" state is D1, D2 or D3hot and the
    the current value of power.state means D3cold, because in that
    case acpi_device_set_power() will refuse to transition the device
    from D3cold to non-D0.
    
    To address this problem, make acpi_bus_update_power() call
    acpi_power_transition() directly to update the power resources'
    reference counters and only use acpi_device_set_power() to put
    the device into D0 if the current physical state of it cannot
    be determined.
    Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    2757f8d6
device_pm.c 30 KB