]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
Merge back earlier 'pm-domains' material for v4.5.
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>
Mon, 21 Dec 2015 02:14:03 +0000 (03:14 +0100)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Mon, 21 Dec 2015 02:14:03 +0000 (03:14 +0100)
1  2 
drivers/base/power/domain.c

index 8ad59f3e6f8049e2362e52fc928c393cfa386ce6,e0dc12efd3ccc984ace6623e151694165c62dcb4..b8037901284042790a80b12a0ef507f149019240
@@@ -390,7 -390,6 +390,7 @@@ static int pm_genpd_runtime_suspend(str
        struct generic_pm_domain *genpd;
        bool (*stop_ok)(struct device *__dev);
        struct gpd_timing_data *td = &dev_gpd_data(dev)->td;
 +      bool runtime_pm = pm_runtime_enabled(dev);
        ktime_t time_start;
        s64 elapsed_ns;
        int ret;
        if (IS_ERR(genpd))
                return -EINVAL;
  
 +      /*
 +       * A runtime PM centric subsystem/driver may re-use the runtime PM
 +       * callbacks for other purposes than runtime PM. In those scenarios
 +       * runtime PM is disabled. Under these circumstances, we shall skip
 +       * validating/measuring the PM QoS latency.
 +       */
        stop_ok = genpd->gov ? genpd->gov->stop_ok : NULL;
 -      if (stop_ok && !stop_ok(dev))
 +      if (runtime_pm && stop_ok && !stop_ok(dev))
                return -EBUSY;
  
        /* Measure suspend latency. */
 -      time_start = ktime_get();
 +      if (runtime_pm)
 +              time_start = ktime_get();
  
        ret = genpd_save_dev(genpd, dev);
        if (ret)
        }
  
        /* Update suspend latency value if the measured time exceeds it. */
 -      elapsed_ns = ktime_to_ns(ktime_sub(ktime_get(), time_start));
 -      if (elapsed_ns > td->suspend_latency_ns) {
 -              td->suspend_latency_ns = elapsed_ns;
 -              dev_dbg(dev, "suspend latency exceeded, %lld ns\n",
 -                      elapsed_ns);
 -              genpd->max_off_time_changed = true;
 -              td->constraint_changed = true;
 +      if (runtime_pm) {
 +              elapsed_ns = ktime_to_ns(ktime_sub(ktime_get(), time_start));
 +              if (elapsed_ns > td->suspend_latency_ns) {
 +                      td->suspend_latency_ns = elapsed_ns;
 +                      dev_dbg(dev, "suspend latency exceeded, %lld ns\n",
 +                              elapsed_ns);
 +                      genpd->max_off_time_changed = true;
 +                      td->constraint_changed = true;
 +              }
        }
  
        /*
@@@ -463,7 -453,6 +463,7 @@@ static int pm_genpd_runtime_resume(stru
  {
        struct generic_pm_domain *genpd;
        struct gpd_timing_data *td = &dev_gpd_data(dev)->td;
 +      bool runtime_pm = pm_runtime_enabled(dev);
        ktime_t time_start;
        s64 elapsed_ns;
        int ret;
  
   out:
        /* Measure resume latency. */
 -      if (timed)
 +      if (timed && runtime_pm)
                time_start = ktime_get();
  
        genpd_start_dev(genpd, dev);
        genpd_restore_dev(genpd, dev);
  
        /* Update resume latency value if the measured time exceeds it. */
 -      if (timed) {
 +      if (timed && runtime_pm) {
                elapsed_ns = ktime_to_ns(ktime_sub(ktime_get(), time_start));
                if (elapsed_ns > td->resume_latency_ns) {
                        td->resume_latency_ns = elapsed_ns;
@@@ -1263,6 -1252,7 +1263,7 @@@ int __pm_genpd_add_device(struct generi
  
        return ret;
  }
+ EXPORT_SYMBOL_GPL(__pm_genpd_add_device);
  
  /**
   * pm_genpd_remove_device - Remove a device from an I/O PM domain.
@@@ -1313,6 -1303,7 +1314,7 @@@ int pm_genpd_remove_device(struct gener
  
        return ret;
  }
+ EXPORT_SYMBOL_GPL(pm_genpd_remove_device);
  
  /**
   * pm_genpd_add_subdomain - Add a subdomain to an I/O PM domain.
@@@ -1363,6 -1354,7 +1365,7 @@@ int pm_genpd_add_subdomain(struct gener
                kfree(link);
        return ret;
  }
+ EXPORT_SYMBOL_GPL(pm_genpd_add_subdomain);
  
  /**
   * pm_genpd_remove_subdomain - Remove a subdomain from an I/O PM domain.
@@@ -1410,6 -1402,7 +1413,7 @@@ out
  
        return ret;
  }
+ EXPORT_SYMBOL_GPL(pm_genpd_remove_subdomain);
  
  /* Default device callbacks for generic PM domains. */