• Daniel Drake's avatar
    ACPI / PM: Allow deeper wakeup power states with no _SxD nor _SxW · bf8c6184
    Daniel Drake authored
    acpi_dev_pm_get_state() is used to determine the range of allowable
    device power states when going into S3 suspend. This is implemented
    by executing the _S3D and _S3W ACPI methods.
    
    Linux follows the ACPI spec behaviour in that when _S3D is implemented
    and _S3W is not, Linux will not go into a power state deeper than the one
    returned by _S3D for a wakeup-enabled device.
    
    However, this same logic is being applied to the case when neither
    _S3D nor _S3W are present, and the result is that this function
    decides that the device must stay in D0 (fully on) state.
    
    This is breaking USB wakeups on Asus V222GA and Acer XC-830. _S3D and
    _S3W are not present, so the USB controller is left in the D0 running
    state during S3, and hence it is unable to generate a PME# wake event.
    
    The ACPI spec is unclear on which power states are permissable for
    wakeup-enabled devices when both _S3D and _S3W are missing.
    However, USB wakeups work fine on these platforms under Windows, where
    device manager shows that they are using D3 device state for the USB
    controller in S3.
    
    I assume that the "max = min" clamping done by the code here is
    specifically written for the _S3D but no _S3W case. By making the
    code true to those conditions, avoiding them on these platforms,
    the controller will be put into D3 state and USB wakeups start working.
    
    Additionally I feel that this change makes the code more directly
    mirror the wording of the ACPI spec and it's associated lack of clarity.
    
    Thanks to Mathias Nyman for pointing us in the right direction.
    Signed-off-by: default avatarDaniel Drake <drake@endlessm.com>
    Link: http://lkml.kernel.org/r/CAB4CAwf_k-WsF3zL4epm9TKAOu0h=Bv1XhXV_gY3bziOo_NPKA@mail.gmail.com
    
    https://phabricator.endlessm.com/T21410Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    bf8c6184
device_pm.c 35.5 KB