lkml.org 
[lkml]   [2012]   [Mar]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 1/6] PM / Domains: Fix handling of wakeup devices during system resume
    Date
    From: Rafael J. Wysocki <rjw@sisk.pl>

    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: Rafael J. Wysocki <rjw@sisk.pl>
    ---
    drivers/base/power/domain.c | 3 ++-
    1 file changed, 2 insertions(+), 1 deletion(-)

    Index: linux/drivers/base/power/domain.c
    ===================================================================
    --- linux.orig/drivers/base/power/domain.c
    +++ linux/drivers/base/power/domain.c
    @@ -896,7 +896,8 @@ static int pm_genpd_resume_noirq(struct
    if (IS_ERR(genpd))
    return -EINVAL;

    - if (genpd->suspend_power_off)
    + if (genpd->suspend_power_off
    + || (dev->power.wakeup_path && genpd_dev_active_wakeup(genpd, dev)))
    return 0;

    /*


    \
     
     \ /
      Last update: 2012-03-13 01:27    [W:0.023 / U:30.520 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site