• R
    PM / Domains: Fix handling of wakeup devices during system resume · cc85b207
    Rafael J. Wysocki 提交于
    During system suspend pm_genpd_suspend_noirq() checks if the given
    device is in a wakeup path (i.e. it appears to be needed for one or
    more wakeup devices to work or is a wakeup device itself) and if it
    needs to be "active" for wakeup to work.  If that is the case, the
    function returns 0 without incrementing the device domain's counter
    of suspended devices and without executing genpd_stop_dev() for the
    device.  In consequence, the device is not stopped (e.g. its clock
    isn't disabled) and power is always supplied to its domain in the
    resulting system sleep state.
    
    However, pm_genpd_resume_noirq() doesn't repeat that check and it
    runs genpd_start_dev() and decrements the domain's counter of
    suspended devices even for the wakeup device that weren't stopped by
    pm_genpd_suspend_noirq().  As a result, the start callback may be run
    unnecessarily for them and their domains' counters of suspended
    devices may become negative.  Both outcomes aren't desirable, so fix
    pm_genpd_resume_noirq() to look for wakeup devices that might not be
    stopped by during system suspend.
    Signed-off-by: NRafael J. Wysocki <rjw@sisk.pl>
    Tested-by: NSimon Horman <horms@verge.net.au>
    Cc: stable@vger.kernel.org
    cc85b207
domain.c 43.3 KB