Loading drivers/base/power/domain.c +62 −43 Original line number Diff line number Diff line Loading @@ -151,6 +151,59 @@ static void genpd_recalc_cpu_exit_latency(struct generic_pm_domain *genpd) genpd->cpuidle_data->idle_state->exit_latency = usecs64; } static int genpd_power_on(struct generic_pm_domain *genpd) { ktime_t time_start; s64 elapsed_ns; int ret; if (!genpd->power_on) return 0; time_start = ktime_get(); ret = genpd->power_on(genpd); if (ret) return ret; elapsed_ns = ktime_to_ns(ktime_sub(ktime_get(), time_start)); if (elapsed_ns <= genpd->power_on_latency_ns) return ret; genpd->power_on_latency_ns = elapsed_ns; genpd->max_off_time_changed = true; genpd_recalc_cpu_exit_latency(genpd); pr_warn("%s: Power-%s latency exceeded, new value %lld ns\n", genpd->name, "on", elapsed_ns); return ret; } static int genpd_power_off(struct generic_pm_domain *genpd) { ktime_t time_start; s64 elapsed_ns; int ret; if (!genpd->power_off) return 0; time_start = ktime_get(); ret = genpd->power_off(genpd); if (ret == -EBUSY) return ret; elapsed_ns = ktime_to_ns(ktime_sub(ktime_get(), time_start)); if (elapsed_ns <= genpd->power_off_latency_ns) return ret; genpd->power_off_latency_ns = elapsed_ns; genpd->max_off_time_changed = true; pr_warn("%s: Power-%s latency exceeded, new value %lld ns\n", genpd->name, "off", elapsed_ns); return ret; } /** * __pm_genpd_poweron - Restore power to a given PM domain and its masters. * @genpd: PM domain to power up. Loading Loading @@ -222,26 +275,10 @@ static int __pm_genpd_poweron(struct generic_pm_domain *genpd) } } if (genpd->power_on) { ktime_t time_start = ktime_get(); s64 elapsed_ns; ret = genpd->power_on(genpd); ret = genpd_power_on(genpd); if (ret) goto err; elapsed_ns = ktime_to_ns(ktime_sub(ktime_get(), time_start)); if (elapsed_ns > genpd->power_on_latency_ns) { genpd->power_on_latency_ns = elapsed_ns; genpd->max_off_time_changed = true; genpd_recalc_cpu_exit_latency(genpd); if (genpd->name) pr_warning("%s: Power-on latency exceeded, " "new value %lld ns\n", genpd->name, elapsed_ns); } } out: genpd_set_active(genpd); Loading Loading @@ -544,16 +581,11 @@ static int pm_genpd_poweroff(struct generic_pm_domain *genpd) } if (genpd->power_off) { ktime_t time_start; s64 elapsed_ns; if (atomic_read(&genpd->sd_count) > 0) { ret = -EBUSY; goto out; } time_start = ktime_get(); /* * If sd_count > 0 at this point, one of the subdomains hasn't * managed to call pm_genpd_poweron() for the master yet after Loading @@ -562,21 +594,11 @@ static int pm_genpd_poweroff(struct generic_pm_domain *genpd) * the pm_genpd_poweron() restore power for us (this shouldn't * happen very often). */ ret = genpd->power_off(genpd); ret = genpd_power_off(genpd); if (ret == -EBUSY) { genpd_set_active(genpd); goto out; } elapsed_ns = ktime_to_ns(ktime_sub(ktime_get(), time_start)); if (elapsed_ns > genpd->power_off_latency_ns) { genpd->power_off_latency_ns = elapsed_ns; genpd->max_off_time_changed = true; if (genpd->name) pr_warning("%s: Power-off latency exceeded, " "new value %lld ns\n", genpd->name, elapsed_ns); } } genpd->status = GPD_STATE_POWER_OFF; Loading Loading @@ -779,9 +801,9 @@ static inline void genpd_power_off_work_fn(struct work_struct *work) {} * pm_genpd_present - Check if the given PM domain has been initialized. * @genpd: PM domain to check. */ static bool pm_genpd_present(struct generic_pm_domain *genpd) static bool pm_genpd_present(const struct generic_pm_domain *genpd) { struct generic_pm_domain *gpd; const struct generic_pm_domain *gpd; if (IS_ERR_OR_NULL(genpd)) return false; Loading Loading @@ -822,8 +844,7 @@ static void pm_genpd_sync_poweroff(struct generic_pm_domain *genpd) || atomic_read(&genpd->sd_count) > 0) return; if (genpd->power_off) genpd->power_off(genpd); genpd_power_off(genpd); genpd->status = GPD_STATE_POWER_OFF; Loading Loading @@ -854,8 +875,7 @@ static void pm_genpd_sync_poweron(struct generic_pm_domain *genpd) genpd_sd_counter_inc(link->master); } if (genpd->power_on) genpd->power_on(genpd); genpd_power_on(genpd); genpd->status = GPD_STATE_ACTIVE; } Loading Loading @@ -1277,8 +1297,7 @@ static int pm_genpd_restore_noirq(struct device *dev) * If the domain was off before the hibernation, make * sure it will be off going forward. */ if (genpd->power_off) genpd->power_off(genpd); genpd_power_off(genpd); return 0; } Loading include/linux/pm.h +1 −5 Original line number Diff line number Diff line Loading @@ -538,11 +538,7 @@ enum rpm_request { }; struct wakeup_source; struct pm_domain_data { struct list_head list_node; struct device *dev; }; struct pm_domain_data; struct pm_subsys_data { spinlock_t lock; Loading include/linux/pm_domain.h +5 −0 Original line number Diff line number Diff line Loading @@ -100,6 +100,11 @@ struct gpd_timing_data { bool cached_stop_ok; }; struct pm_domain_data { struct list_head list_node; struct device *dev; }; struct generic_pm_domain_data { struct pm_domain_data base; struct gpd_timing_data td; Loading Loading
drivers/base/power/domain.c +62 −43 Original line number Diff line number Diff line Loading @@ -151,6 +151,59 @@ static void genpd_recalc_cpu_exit_latency(struct generic_pm_domain *genpd) genpd->cpuidle_data->idle_state->exit_latency = usecs64; } static int genpd_power_on(struct generic_pm_domain *genpd) { ktime_t time_start; s64 elapsed_ns; int ret; if (!genpd->power_on) return 0; time_start = ktime_get(); ret = genpd->power_on(genpd); if (ret) return ret; elapsed_ns = ktime_to_ns(ktime_sub(ktime_get(), time_start)); if (elapsed_ns <= genpd->power_on_latency_ns) return ret; genpd->power_on_latency_ns = elapsed_ns; genpd->max_off_time_changed = true; genpd_recalc_cpu_exit_latency(genpd); pr_warn("%s: Power-%s latency exceeded, new value %lld ns\n", genpd->name, "on", elapsed_ns); return ret; } static int genpd_power_off(struct generic_pm_domain *genpd) { ktime_t time_start; s64 elapsed_ns; int ret; if (!genpd->power_off) return 0; time_start = ktime_get(); ret = genpd->power_off(genpd); if (ret == -EBUSY) return ret; elapsed_ns = ktime_to_ns(ktime_sub(ktime_get(), time_start)); if (elapsed_ns <= genpd->power_off_latency_ns) return ret; genpd->power_off_latency_ns = elapsed_ns; genpd->max_off_time_changed = true; pr_warn("%s: Power-%s latency exceeded, new value %lld ns\n", genpd->name, "off", elapsed_ns); return ret; } /** * __pm_genpd_poweron - Restore power to a given PM domain and its masters. * @genpd: PM domain to power up. Loading Loading @@ -222,26 +275,10 @@ static int __pm_genpd_poweron(struct generic_pm_domain *genpd) } } if (genpd->power_on) { ktime_t time_start = ktime_get(); s64 elapsed_ns; ret = genpd->power_on(genpd); ret = genpd_power_on(genpd); if (ret) goto err; elapsed_ns = ktime_to_ns(ktime_sub(ktime_get(), time_start)); if (elapsed_ns > genpd->power_on_latency_ns) { genpd->power_on_latency_ns = elapsed_ns; genpd->max_off_time_changed = true; genpd_recalc_cpu_exit_latency(genpd); if (genpd->name) pr_warning("%s: Power-on latency exceeded, " "new value %lld ns\n", genpd->name, elapsed_ns); } } out: genpd_set_active(genpd); Loading Loading @@ -544,16 +581,11 @@ static int pm_genpd_poweroff(struct generic_pm_domain *genpd) } if (genpd->power_off) { ktime_t time_start; s64 elapsed_ns; if (atomic_read(&genpd->sd_count) > 0) { ret = -EBUSY; goto out; } time_start = ktime_get(); /* * If sd_count > 0 at this point, one of the subdomains hasn't * managed to call pm_genpd_poweron() for the master yet after Loading @@ -562,21 +594,11 @@ static int pm_genpd_poweroff(struct generic_pm_domain *genpd) * the pm_genpd_poweron() restore power for us (this shouldn't * happen very often). */ ret = genpd->power_off(genpd); ret = genpd_power_off(genpd); if (ret == -EBUSY) { genpd_set_active(genpd); goto out; } elapsed_ns = ktime_to_ns(ktime_sub(ktime_get(), time_start)); if (elapsed_ns > genpd->power_off_latency_ns) { genpd->power_off_latency_ns = elapsed_ns; genpd->max_off_time_changed = true; if (genpd->name) pr_warning("%s: Power-off latency exceeded, " "new value %lld ns\n", genpd->name, elapsed_ns); } } genpd->status = GPD_STATE_POWER_OFF; Loading Loading @@ -779,9 +801,9 @@ static inline void genpd_power_off_work_fn(struct work_struct *work) {} * pm_genpd_present - Check if the given PM domain has been initialized. * @genpd: PM domain to check. */ static bool pm_genpd_present(struct generic_pm_domain *genpd) static bool pm_genpd_present(const struct generic_pm_domain *genpd) { struct generic_pm_domain *gpd; const struct generic_pm_domain *gpd; if (IS_ERR_OR_NULL(genpd)) return false; Loading Loading @@ -822,8 +844,7 @@ static void pm_genpd_sync_poweroff(struct generic_pm_domain *genpd) || atomic_read(&genpd->sd_count) > 0) return; if (genpd->power_off) genpd->power_off(genpd); genpd_power_off(genpd); genpd->status = GPD_STATE_POWER_OFF; Loading Loading @@ -854,8 +875,7 @@ static void pm_genpd_sync_poweron(struct generic_pm_domain *genpd) genpd_sd_counter_inc(link->master); } if (genpd->power_on) genpd->power_on(genpd); genpd_power_on(genpd); genpd->status = GPD_STATE_ACTIVE; } Loading Loading @@ -1277,8 +1297,7 @@ static int pm_genpd_restore_noirq(struct device *dev) * If the domain was off before the hibernation, make * sure it will be off going forward. */ if (genpd->power_off) genpd->power_off(genpd); genpd_power_off(genpd); return 0; } Loading
include/linux/pm.h +1 −5 Original line number Diff line number Diff line Loading @@ -538,11 +538,7 @@ enum rpm_request { }; struct wakeup_source; struct pm_domain_data { struct list_head list_node; struct device *dev; }; struct pm_domain_data; struct pm_subsys_data { spinlock_t lock; Loading
include/linux/pm_domain.h +5 −0 Original line number Diff line number Diff line Loading @@ -100,6 +100,11 @@ struct gpd_timing_data { bool cached_stop_ok; }; struct pm_domain_data { struct list_head list_node; struct device *dev; }; struct generic_pm_domain_data { struct pm_domain_data base; struct gpd_timing_data td; Loading