lkml.org 
[lkml]   [2012]   [Aug]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 11/15] PM / Domains: Do not measure start time for "irq safe" devices
    Date

    The genpd_start_dev() routine used by pm_genpd_runtime_resume()
    to put "irq safe" devices into the full power state measures the
    time necessary to "start" the device and updates its PM QoS timing
    data if necessary. This may lead to a deadlock if the given device
    is a clock source and genpd_start_dev() is invoked from within the
    clock source's .enable() routine, which will happen if that routine
    uses pm_runtime_get_sync(), for example, to ensure that the device
    is operational.

    For this reason, introduce a special routine analogous to
    genpd_start_dev(), called genpd_start_dev_no_timing(), that doesn't
    carry out the time measurement, and make pm_genpd_runtime_resume()
    use it instead of genpd_start_dev() to power up "irq safe" devices.

    Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
    ---
    drivers/base/power/domain.c | 8 +++++++-
    1 file changed, 7 insertions(+), 1 deletion(-)

    Index: linux/drivers/base/power/domain.c
    ===================================================================
    --- linux.orig/drivers/base/power/domain.c
    +++ linux/drivers/base/power/domain.c
    @@ -75,6 +75,12 @@ static int genpd_start_dev(struct generi
    start_latency_ns, "start");
    }

    +static int genpd_start_dev_no_timing(struct generic_pm_domain *genpd,
    + struct device *dev)
    +{
    + return GENPD_DEV_CALLBACK(genpd, int, start, dev);
    +}
    +
    static bool genpd_sd_counter_dec(struct generic_pm_domain *genpd)
    {
    bool ret = false;
    @@ -626,7 +632,7 @@ static int pm_genpd_runtime_resume(struc

    /* If power.irq_safe, the PM domain is never powered off. */
    if (dev->power.irq_safe)
    - return genpd_start_dev(genpd, dev);
    + return genpd_start_dev_no_timing(genpd, dev);

    mutex_lock(&genpd->lock);
    ret = __pm_genpd_poweron(genpd);


    \
     
     \ /
      Last update: 2012-08-06 02:41    [W:0.029 / U:121.528 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site