• Mika Westerberg's avatar
    ACPI / PM: Use target_state to set the device power state · 71b65445
    Mika Westerberg authored
    Commit 20dacb71 ("ACPI / PM: Rework device power management to follow
    ACPI 6") changed the device power management to use D3hot if the device
    in question does not have _PR3 method even if D3cold was requested by the
    caller.
    
    However, if the device has _PR3 device->power.state is also set to D3hot
    instead of D3Cold after power resources have been turned off because
    device->power.state will be assigned from "state" instead of
    "target_state".
    
    Next time the device is transitioned to D0, acpi_power_transition() will
    find that the current power state of the device is D3hot instead of D3cold
    which causes it to power down all resources required for the current
    (wrong) state D3hot.
    
    Below is a simplified ASL example of a real touch panel device which
    triggers the problem:
    
      Scope (TPL1)
      {
          Name (_PR0, Package (1) { \_SB.PCI0.I2C1.PXTC })
          Name (_PR3, Package (1) { \_SB.PCI0.I2C1.PXTC })
          ...
      }
    
    In both D0 and D3hot the same power resource is required. However, when
    acpi_power_transition() turns off power resources required for D3hot (as
    the device is transitioned to D0) it powers down PXTC which then makes the
    device to lose its power.
    
    Fix this by assigning "target_state" to the device power state instead of
    "state" that is always D3hot even for devices with valid _PR3.
    
    Fixes: 20dacb71 (ACPI / PM: Rework device power management to follow ACPI 6)
    Signed-off-by: default avatarMika Westerberg <mika.westerberg@linux.intel.com>
    Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    71b65445
device_pm.c 32 KB