Lines Matching refs:genpd
42 #define GENPD_DEV_CALLBACK(genpd, type, callback, dev) \ argument
47 __routine = genpd->dev_ops.callback; \
58 void (*lock)(struct generic_pm_domain *genpd);
59 void (*lock_nested)(struct generic_pm_domain *genpd, int depth);
60 int (*lock_interruptible)(struct generic_pm_domain *genpd);
61 void (*unlock)(struct generic_pm_domain *genpd);
64 static void genpd_lock_mtx(struct generic_pm_domain *genpd) in genpd_lock_mtx() argument
66 mutex_lock(&genpd->mlock); in genpd_lock_mtx()
69 static void genpd_lock_nested_mtx(struct generic_pm_domain *genpd, in genpd_lock_nested_mtx() argument
72 mutex_lock_nested(&genpd->mlock, depth); in genpd_lock_nested_mtx()
75 static int genpd_lock_interruptible_mtx(struct generic_pm_domain *genpd) in genpd_lock_interruptible_mtx() argument
77 return mutex_lock_interruptible(&genpd->mlock); in genpd_lock_interruptible_mtx()
80 static void genpd_unlock_mtx(struct generic_pm_domain *genpd) in genpd_unlock_mtx() argument
82 return mutex_unlock(&genpd->mlock); in genpd_unlock_mtx()
92 static void genpd_lock_spin(struct generic_pm_domain *genpd) in genpd_lock_spin() argument
93 __acquires(&genpd->slock) in genpd_lock_spin()
97 spin_lock_irqsave(&genpd->slock, flags); in genpd_lock_spin()
98 genpd->lock_flags = flags; in genpd_lock_spin()
101 static void genpd_lock_nested_spin(struct generic_pm_domain *genpd, in genpd_lock_nested_spin() argument
103 __acquires(&genpd->slock) in genpd_lock_nested_spin()
107 spin_lock_irqsave_nested(&genpd->slock, flags, depth); in genpd_lock_nested_spin()
108 genpd->lock_flags = flags; in genpd_lock_nested_spin()
111 static int genpd_lock_interruptible_spin(struct generic_pm_domain *genpd) in genpd_lock_interruptible_spin() argument
112 __acquires(&genpd->slock) in genpd_lock_interruptible_spin()
116 spin_lock_irqsave(&genpd->slock, flags); in genpd_lock_interruptible_spin()
117 genpd->lock_flags = flags; in genpd_lock_interruptible_spin()
121 static void genpd_unlock_spin(struct generic_pm_domain *genpd) in genpd_unlock_spin() argument
122 __releases(&genpd->slock) in genpd_unlock_spin()
124 spin_unlock_irqrestore(&genpd->slock, genpd->lock_flags); in genpd_unlock_spin()
134 static void genpd_lock_raw_spin(struct generic_pm_domain *genpd) in genpd_lock_raw_spin() argument
135 __acquires(&genpd->raw_slock) in genpd_lock_raw_spin()
139 raw_spin_lock_irqsave(&genpd->raw_slock, flags); in genpd_lock_raw_spin()
140 genpd->raw_lock_flags = flags; in genpd_lock_raw_spin()
143 static void genpd_lock_nested_raw_spin(struct generic_pm_domain *genpd, in genpd_lock_nested_raw_spin() argument
145 __acquires(&genpd->raw_slock) in genpd_lock_nested_raw_spin()
149 raw_spin_lock_irqsave_nested(&genpd->raw_slock, flags, depth); in genpd_lock_nested_raw_spin()
150 genpd->raw_lock_flags = flags; in genpd_lock_nested_raw_spin()
153 static int genpd_lock_interruptible_raw_spin(struct generic_pm_domain *genpd) in genpd_lock_interruptible_raw_spin() argument
154 __acquires(&genpd->raw_slock) in genpd_lock_interruptible_raw_spin()
158 raw_spin_lock_irqsave(&genpd->raw_slock, flags); in genpd_lock_interruptible_raw_spin()
159 genpd->raw_lock_flags = flags; in genpd_lock_interruptible_raw_spin()
163 static void genpd_unlock_raw_spin(struct generic_pm_domain *genpd) in genpd_unlock_raw_spin() argument
164 __releases(&genpd->raw_slock) in genpd_unlock_raw_spin()
166 raw_spin_unlock_irqrestore(&genpd->raw_slock, genpd->raw_lock_flags); in genpd_unlock_raw_spin()
181 #define genpd_status_on(genpd) (genpd->status == GENPD_STATE_ON) argument
182 #define genpd_is_irq_safe(genpd) (genpd->flags & GENPD_FLAG_IRQ_SAFE) argument
183 #define genpd_is_always_on(genpd) (genpd->flags & GENPD_FLAG_ALWAYS_ON) argument
184 #define genpd_is_active_wakeup(genpd) (genpd->flags & GENPD_FLAG_ACTIVE_WAKEUP) argument
185 #define genpd_is_cpu_domain(genpd) (genpd->flags & GENPD_FLAG_CPU_DOMAIN) argument
186 #define genpd_is_rpm_always_on(genpd) (genpd->flags & GENPD_FLAG_RPM_ALWAYS_ON) argument
187 #define genpd_is_opp_table_fw(genpd) (genpd->flags & GENPD_FLAG_OPP_TABLE_FW) argument
188 #define genpd_is_dev_name_fw(genpd) (genpd->flags & GENPD_FLAG_DEV_NAME_FW) argument
189 #define genpd_is_no_sync_state(genpd) (genpd->flags & GENPD_FLAG_NO_SYNC_STATE) argument
190 #define genpd_is_no_stay_on(genpd) (genpd->flags & GENPD_FLAG_NO_STAY_ON) argument
193 const struct generic_pm_domain *genpd) in irq_safe_dev_in_sleep_domain() argument
197 ret = pm_runtime_is_irq_safe(dev) && !genpd_is_irq_safe(genpd); in irq_safe_dev_in_sleep_domain()
204 if (genpd_is_always_on(genpd) || genpd_is_rpm_always_on(genpd)) in irq_safe_dev_in_sleep_domain()
209 dev_name(&genpd->dev)); in irq_safe_dev_in_sleep_domain()
248 struct generic_pm_domain *genpd = dev_to_genpd(dev); in dev_to_genpd_dev() local
250 if (IS_ERR(genpd)) in dev_to_genpd_dev()
251 return ERR_CAST(genpd); in dev_to_genpd_dev()
253 return &genpd->dev; in dev_to_genpd_dev()
256 static int genpd_stop_dev(const struct generic_pm_domain *genpd, in genpd_stop_dev() argument
259 return GENPD_DEV_CALLBACK(genpd, int, stop, dev); in genpd_stop_dev()
262 static int genpd_start_dev(const struct generic_pm_domain *genpd, in genpd_start_dev() argument
265 return GENPD_DEV_CALLBACK(genpd, int, start, dev); in genpd_start_dev()
268 static bool genpd_sd_counter_dec(struct generic_pm_domain *genpd) in genpd_sd_counter_dec() argument
272 if (!WARN_ON(atomic_read(&genpd->sd_count) == 0)) in genpd_sd_counter_dec()
273 ret = !!atomic_dec_and_test(&genpd->sd_count); in genpd_sd_counter_dec()
278 static void genpd_sd_counter_inc(struct generic_pm_domain *genpd) in genpd_sd_counter_inc() argument
280 atomic_inc(&genpd->sd_count); in genpd_sd_counter_inc()
287 static void genpd_debug_add(struct generic_pm_domain *genpd);
289 static void genpd_debug_remove(struct generic_pm_domain *genpd) in genpd_debug_remove() argument
294 debugfs_lookup_and_remove(dev_name(&genpd->dev), genpd_debugfs_dir); in genpd_debug_remove()
297 static void genpd_update_accounting(struct generic_pm_domain *genpd) in genpd_update_accounting() argument
302 if (now <= genpd->accounting_time) in genpd_update_accounting()
305 delta = now - genpd->accounting_time; in genpd_update_accounting()
312 if (genpd->status == GENPD_STATE_ON) in genpd_update_accounting()
313 genpd->states[genpd->state_idx].idle_time += delta; in genpd_update_accounting()
315 genpd->on_time += delta; in genpd_update_accounting()
317 genpd->accounting_time = now; in genpd_update_accounting()
320 static void genpd_reflect_residency(struct generic_pm_domain *genpd) in genpd_reflect_residency() argument
322 struct genpd_governor_data *gd = genpd->gd; in genpd_reflect_residency()
331 state_idx = genpd->state_idx; in genpd_reflect_residency()
332 state = &genpd->states[state_idx]; in genpd_reflect_residency()
337 } else if (state_idx < (genpd->state_count -1)) { in genpd_reflect_residency()
338 next_state = &genpd->states[state_idx + 1]; in genpd_reflect_residency()
349 static inline void genpd_debug_add(struct generic_pm_domain *genpd) {} in genpd_debug_add() argument
350 static inline void genpd_debug_remove(struct generic_pm_domain *genpd) {} in genpd_debug_remove() argument
351 static inline void genpd_update_accounting(struct generic_pm_domain *genpd) {} in genpd_update_accounting() argument
352 static inline void genpd_reflect_residency(struct generic_pm_domain *genpd) {} in genpd_reflect_residency() argument
355 static int _genpd_reeval_performance_state(struct generic_pm_domain *genpd, in _genpd_reeval_performance_state() argument
363 if (state == genpd->performance_state) in _genpd_reeval_performance_state()
367 if (state > genpd->performance_state) in _genpd_reeval_performance_state()
371 list_for_each_entry(pdd, &genpd->dev_list, list_node) { in _genpd_reeval_performance_state()
392 list_for_each_entry(link, &genpd->parent_links, parent_node) { in _genpd_reeval_performance_state()
400 static int genpd_xlate_performance_state(struct generic_pm_domain *genpd, in genpd_xlate_performance_state() argument
407 return dev_pm_opp_xlate_performance_state(genpd->opp_table, in genpd_xlate_performance_state()
412 static int _genpd_set_performance_state(struct generic_pm_domain *genpd,
434 static int _genpd_set_parent_state(struct generic_pm_domain *genpd, in _genpd_set_parent_state() argument
442 ret = genpd_xlate_performance_state(genpd, parent, state); in _genpd_set_parent_state()
463 static int _genpd_set_performance_state(struct generic_pm_domain *genpd, in _genpd_set_performance_state() argument
469 if (state == genpd->performance_state) in _genpd_set_performance_state()
473 if (state > genpd->performance_state) { in _genpd_set_performance_state()
474 list_for_each_entry(link, &genpd->child_links, child_node) { in _genpd_set_performance_state()
475 ret = _genpd_set_parent_state(genpd, link, state, depth); in _genpd_set_performance_state()
481 if (genpd->set_performance_state) { in _genpd_set_performance_state()
482 ret = genpd->set_performance_state(genpd, state); in _genpd_set_performance_state()
491 if (state < genpd->performance_state) { in _genpd_set_performance_state()
492 list_for_each_entry_reverse(link, &genpd->child_links, child_node) { in _genpd_set_performance_state()
493 ret = _genpd_set_parent_state(genpd, link, state, depth); in _genpd_set_performance_state()
499 genpd->performance_state = state; in _genpd_set_performance_state()
503 list_for_each_entry_continue_reverse(link, &genpd->child_links, child_node) in _genpd_set_performance_state()
507 list_for_each_entry_continue(link, &genpd->child_links, child_node) in _genpd_set_performance_state()
514 struct generic_pm_domain *genpd = dev_to_genpd(dev); in genpd_set_performance_state() local
524 state = _genpd_reeval_performance_state(genpd, state); in genpd_set_performance_state()
526 ret = _genpd_set_performance_state(genpd, state, 0); in genpd_set_performance_state()
553 struct generic_pm_domain *genpd = dev_to_genpd(dev); in genpd_dev_pm_set_performance_state() local
556 genpd_lock(genpd); in genpd_dev_pm_set_performance_state()
564 genpd_unlock(genpd); in genpd_dev_pm_set_performance_state()
586 struct generic_pm_domain *genpd; in dev_pm_genpd_set_performance_state() local
588 genpd = dev_to_genpd_safe(dev); in dev_pm_genpd_set_performance_state()
589 if (!genpd) in dev_pm_genpd_set_performance_state()
617 struct generic_pm_domain *genpd; in dev_pm_genpd_set_next_wakeup() local
620 genpd = dev_to_genpd_safe(dev); in dev_pm_genpd_set_next_wakeup()
621 if (!genpd) in dev_pm_genpd_set_next_wakeup()
642 struct generic_pm_domain *genpd; in dev_pm_genpd_get_next_hrtimer() local
644 genpd = dev_to_genpd_safe(dev); in dev_pm_genpd_get_next_hrtimer()
645 if (!genpd) in dev_pm_genpd_get_next_hrtimer()
648 if (genpd->gd) in dev_pm_genpd_get_next_hrtimer()
649 return genpd->gd->next_hrtimer; in dev_pm_genpd_get_next_hrtimer()
668 struct generic_pm_domain *genpd; in dev_pm_genpd_synced_poweroff() local
670 genpd = dev_to_genpd_safe(dev); in dev_pm_genpd_synced_poweroff()
671 if (!genpd) in dev_pm_genpd_synced_poweroff()
674 genpd_lock(genpd); in dev_pm_genpd_synced_poweroff()
675 genpd->synced_poweroff = true; in dev_pm_genpd_synced_poweroff()
676 genpd_unlock(genpd); in dev_pm_genpd_synced_poweroff()
698 struct generic_pm_domain *genpd; in dev_pm_genpd_set_hwmode() local
701 genpd = dev_to_genpd_safe(dev); in dev_pm_genpd_set_hwmode()
702 if (!genpd) in dev_pm_genpd_set_hwmode()
705 if (!genpd->set_hwmode_dev) in dev_pm_genpd_set_hwmode()
708 genpd_lock(genpd); in dev_pm_genpd_set_hwmode()
713 ret = genpd->set_hwmode_dev(genpd, dev, enable); in dev_pm_genpd_set_hwmode()
718 genpd_unlock(genpd); in dev_pm_genpd_set_hwmode()
759 struct generic_pm_domain *genpd; in dev_pm_genpd_rpm_always_on() local
761 genpd = dev_to_genpd_safe(dev); in dev_pm_genpd_rpm_always_on()
762 if (!genpd) in dev_pm_genpd_rpm_always_on()
765 genpd_lock(genpd); in dev_pm_genpd_rpm_always_on()
767 genpd_unlock(genpd); in dev_pm_genpd_rpm_always_on()
791 struct generic_pm_domain *genpd; in dev_pm_genpd_is_on() local
794 genpd = dev_to_genpd_safe(dev); in dev_pm_genpd_is_on()
795 if (!genpd) in dev_pm_genpd_is_on()
798 genpd_lock(genpd); in dev_pm_genpd_is_on()
799 is_on = genpd_status_on(genpd); in dev_pm_genpd_is_on()
800 genpd_unlock(genpd); in dev_pm_genpd_is_on()
821 void pm_genpd_inc_rejected(struct generic_pm_domain *genpd, in pm_genpd_inc_rejected() argument
824 genpd_lock(genpd); in pm_genpd_inc_rejected()
825 genpd->states[genpd->state_idx].rejected++; in pm_genpd_inc_rejected()
826 genpd->states[genpd->state_idx].usage--; in pm_genpd_inc_rejected()
827 genpd_unlock(genpd); in pm_genpd_inc_rejected()
831 static int _genpd_power_on(struct generic_pm_domain *genpd, bool timed) in _genpd_power_on() argument
833 unsigned int state_idx = genpd->state_idx; in _genpd_power_on()
839 ret = raw_notifier_call_chain_robust(&genpd->power_notifiers, in _genpd_power_on()
846 if (!genpd->power_on) in _genpd_power_on()
849 timed = timed && genpd->gd && !genpd->states[state_idx].fwnode; in _genpd_power_on()
851 ret = genpd->power_on(genpd); in _genpd_power_on()
859 ret = genpd->power_on(genpd); in _genpd_power_on()
864 if (elapsed_ns <= genpd->states[state_idx].power_on_latency_ns) in _genpd_power_on()
867 genpd->states[state_idx].power_on_latency_ns = elapsed_ns; in _genpd_power_on()
868 genpd->gd->max_off_time_changed = true; in _genpd_power_on()
870 dev_name(&genpd->dev), "on", elapsed_ns); in _genpd_power_on()
873 raw_notifier_call_chain(&genpd->power_notifiers, GENPD_NOTIFY_ON, NULL); in _genpd_power_on()
874 genpd->synced_poweroff = false; in _genpd_power_on()
877 raw_notifier_call_chain(&genpd->power_notifiers, GENPD_NOTIFY_OFF, in _genpd_power_on()
882 static int _genpd_power_off(struct generic_pm_domain *genpd, bool timed) in _genpd_power_off() argument
884 unsigned int state_idx = genpd->state_idx; in _genpd_power_off()
890 ret = raw_notifier_call_chain_robust(&genpd->power_notifiers, in _genpd_power_off()
897 if (!genpd->power_off) in _genpd_power_off()
900 timed = timed && genpd->gd && !genpd->states[state_idx].fwnode; in _genpd_power_off()
902 ret = genpd->power_off(genpd); in _genpd_power_off()
910 ret = genpd->power_off(genpd); in _genpd_power_off()
915 if (elapsed_ns <= genpd->states[state_idx].power_off_latency_ns) in _genpd_power_off()
918 genpd->states[state_idx].power_off_latency_ns = elapsed_ns; in _genpd_power_off()
919 genpd->gd->max_off_time_changed = true; in _genpd_power_off()
921 dev_name(&genpd->dev), "off", elapsed_ns); in _genpd_power_off()
924 raw_notifier_call_chain(&genpd->power_notifiers, GENPD_NOTIFY_OFF, in _genpd_power_off()
928 raw_notifier_call_chain(&genpd->power_notifiers, GENPD_NOTIFY_ON, NULL); in _genpd_power_off()
939 static void genpd_queue_power_off_work(struct generic_pm_domain *genpd) in genpd_queue_power_off_work() argument
941 queue_work(pm_wq, &genpd->power_off_work); in genpd_queue_power_off_work()
956 static void genpd_power_off(struct generic_pm_domain *genpd, bool one_dev_on, in genpd_power_off() argument
971 if (!genpd_status_on(genpd) || genpd->prepared_count > 0 || in genpd_power_off()
972 genpd_is_always_on(genpd) || genpd_is_rpm_always_on(genpd) || in genpd_power_off()
973 genpd->stay_on || atomic_read(&genpd->sd_count) > 0) in genpd_power_off()
982 list_for_each_entry(link, &genpd->parent_links, parent_node) { in genpd_power_off()
988 list_for_each_entry(pdd, &genpd->dev_list, list_node) { in genpd_power_off()
994 irq_safe_dev_in_sleep_domain(pdd->dev, genpd)) in genpd_power_off()
1005 if (genpd->gov && genpd->gov->power_down_ok) { in genpd_power_off()
1006 if (!genpd->gov->power_down_ok(&genpd->domain)) in genpd_power_off()
1011 if (!genpd->gov) in genpd_power_off()
1012 genpd->state_idx = 0; in genpd_power_off()
1015 if (atomic_read(&genpd->sd_count) > 0) in genpd_power_off()
1018 if (_genpd_power_off(genpd, true)) { in genpd_power_off()
1019 genpd->states[genpd->state_idx].rejected++; in genpd_power_off()
1023 genpd->status = GENPD_STATE_OFF; in genpd_power_off()
1024 genpd_update_accounting(genpd); in genpd_power_off()
1025 genpd->states[genpd->state_idx].usage++; in genpd_power_off()
1027 list_for_each_entry(link, &genpd->child_links, child_node) { in genpd_power_off()
1043 static int genpd_power_on(struct generic_pm_domain *genpd, unsigned int depth) in genpd_power_on() argument
1048 if (genpd_status_on(genpd)) in genpd_power_on()
1052 genpd_reflect_residency(genpd); in genpd_power_on()
1059 list_for_each_entry(link, &genpd->child_links, child_node) { in genpd_power_on()
1074 ret = _genpd_power_on(genpd, true); in genpd_power_on()
1078 genpd->status = GENPD_STATE_ON; in genpd_power_on()
1079 genpd_update_accounting(genpd); in genpd_power_on()
1085 &genpd->child_links, in genpd_power_on()
1098 struct generic_pm_domain *genpd = dev_to_genpd(dev); in genpd_dev_pm_start() local
1100 return genpd_start_dev(genpd, dev); in genpd_dev_pm_start()
1113 struct generic_pm_domain *genpd = ERR_PTR(-ENODATA); in genpd_dev_pm_qos_notifier() local
1125 genpd = dev_to_genpd(dev); in genpd_dev_pm_qos_notifier()
1131 if (!IS_ERR(genpd)) { in genpd_dev_pm_qos_notifier()
1132 genpd_lock(genpd); in genpd_dev_pm_qos_notifier()
1133 genpd->gd->max_off_time_changed = true; in genpd_dev_pm_qos_notifier()
1134 genpd_unlock(genpd); in genpd_dev_pm_qos_notifier()
1151 struct generic_pm_domain *genpd; in genpd_power_off_work_fn() local
1153 genpd = container_of(work, struct generic_pm_domain, power_off_work); in genpd_power_off_work_fn()
1155 genpd_lock(genpd); in genpd_power_off_work_fn()
1156 genpd_power_off(genpd, false, 0); in genpd_power_off_work_fn()
1157 genpd_unlock(genpd); in genpd_power_off_work_fn()
1216 struct generic_pm_domain *genpd; in genpd_runtime_suspend() local
1227 genpd = dev_to_genpd(dev); in genpd_runtime_suspend()
1228 if (IS_ERR(genpd)) in genpd_runtime_suspend()
1237 suspend_ok = genpd->gov ? genpd->gov->suspend_ok : NULL; in genpd_runtime_suspend()
1249 ret = genpd_stop_dev(genpd, dev); in genpd_runtime_suspend()
1262 genpd->gd->max_off_time_changed = true; in genpd_runtime_suspend()
1271 if (irq_safe_dev_in_sleep_domain(dev, genpd)) in genpd_runtime_suspend()
1274 genpd_lock(genpd); in genpd_runtime_suspend()
1275 genpd_power_off(genpd, true, 0); in genpd_runtime_suspend()
1277 genpd_unlock(genpd); in genpd_runtime_suspend()
1292 struct generic_pm_domain *genpd; in genpd_runtime_resume() local
1302 genpd = dev_to_genpd(dev); in genpd_runtime_resume()
1303 if (IS_ERR(genpd)) in genpd_runtime_resume()
1310 if (irq_safe_dev_in_sleep_domain(dev, genpd)) in genpd_runtime_resume()
1313 genpd_lock(genpd); in genpd_runtime_resume()
1315 ret = genpd_power_on(genpd, 0); in genpd_runtime_resume()
1316 genpd_unlock(genpd); in genpd_runtime_resume()
1326 ret = genpd_start_dev(genpd, dev); in genpd_runtime_resume()
1341 genpd->gd->max_off_time_changed = true; in genpd_runtime_resume()
1349 genpd_stop_dev(genpd, dev); in genpd_runtime_resume()
1351 if (!pm_runtime_is_irq_safe(dev) || genpd_is_irq_safe(genpd)) { in genpd_runtime_resume()
1352 genpd_lock(genpd); in genpd_runtime_resume()
1353 genpd_power_off(genpd, true, 0); in genpd_runtime_resume()
1355 genpd_unlock(genpd); in genpd_runtime_resume()
1374 struct generic_pm_domain *genpd; in genpd_power_off_unused() local
1384 list_for_each_entry(genpd, &gpd_list, gpd_list_node) { in genpd_power_off_unused()
1385 genpd_queue_power_off_work(genpd); in genpd_power_off_unused()
1409 static void genpd_sync_power_off(struct generic_pm_domain *genpd, bool use_lock, in genpd_sync_power_off() argument
1414 if (!genpd_status_on(genpd) || genpd_is_always_on(genpd)) in genpd_sync_power_off()
1417 if (genpd->suspended_count != genpd->device_count in genpd_sync_power_off()
1418 || atomic_read(&genpd->sd_count) > 0) in genpd_sync_power_off()
1422 list_for_each_entry(link, &genpd->parent_links, parent_node) { in genpd_sync_power_off()
1428 if (genpd->gov && genpd->gov->system_power_down_ok) { in genpd_sync_power_off()
1429 if (!genpd->gov->system_power_down_ok(&genpd->domain)) in genpd_sync_power_off()
1433 genpd->state_idx = genpd->state_count - 1; in genpd_sync_power_off()
1436 if (_genpd_power_off(genpd, false)) { in genpd_sync_power_off()
1437 genpd->states[genpd->state_idx].rejected++; in genpd_sync_power_off()
1440 genpd->states[genpd->state_idx].usage++; in genpd_sync_power_off()
1443 genpd->status = GENPD_STATE_OFF; in genpd_sync_power_off()
1445 list_for_each_entry(link, &genpd->child_links, child_node) { in genpd_sync_power_off()
1468 static void genpd_sync_power_on(struct generic_pm_domain *genpd, bool use_lock, in genpd_sync_power_on() argument
1473 if (genpd_status_on(genpd)) in genpd_sync_power_on()
1476 list_for_each_entry(link, &genpd->child_links, child_node) { in genpd_sync_power_on()
1488 _genpd_power_on(genpd, false); in genpd_sync_power_on()
1489 genpd->status = GENPD_STATE_ON; in genpd_sync_power_on()
1503 struct generic_pm_domain *genpd; in genpd_prepare() local
1508 genpd = dev_to_genpd(dev); in genpd_prepare()
1509 if (IS_ERR(genpd)) in genpd_prepare()
1512 genpd_lock(genpd); in genpd_prepare()
1513 genpd->prepared_count++; in genpd_prepare()
1514 genpd_unlock(genpd); in genpd_prepare()
1518 genpd_lock(genpd); in genpd_prepare()
1520 genpd->prepared_count--; in genpd_prepare()
1522 genpd_unlock(genpd); in genpd_prepare()
1543 struct generic_pm_domain *genpd; in genpd_finish_suspend() local
1546 genpd = dev_to_genpd(dev); in genpd_finish_suspend()
1547 if (IS_ERR(genpd)) in genpd_finish_suspend()
1554 if (device_awake_path(dev) && genpd_is_active_wakeup(genpd) && in genpd_finish_suspend()
1558 if (genpd->dev_ops.stop && genpd->dev_ops.start && in genpd_finish_suspend()
1560 ret = genpd_stop_dev(genpd, dev); in genpd_finish_suspend()
1567 genpd_lock(genpd); in genpd_finish_suspend()
1568 genpd->suspended_count++; in genpd_finish_suspend()
1569 genpd_sync_power_off(genpd, true, 0); in genpd_finish_suspend()
1570 genpd_unlock(genpd); in genpd_finish_suspend()
1601 struct generic_pm_domain *genpd; in genpd_finish_resume() local
1606 genpd = dev_to_genpd(dev); in genpd_finish_resume()
1607 if (IS_ERR(genpd)) in genpd_finish_resume()
1610 if (device_awake_path(dev) && genpd_is_active_wakeup(genpd) && in genpd_finish_resume()
1614 genpd_lock(genpd); in genpd_finish_resume()
1615 genpd_sync_power_on(genpd, true, 0); in genpd_finish_resume()
1616 genpd->suspended_count--; in genpd_finish_resume()
1617 genpd_unlock(genpd); in genpd_finish_resume()
1619 if (genpd->dev_ops.stop && genpd->dev_ops.start && in genpd_finish_resume()
1621 ret = genpd_start_dev(genpd, dev); in genpd_finish_resume()
1716 struct generic_pm_domain *genpd; in genpd_complete() local
1720 genpd = dev_to_genpd(dev); in genpd_complete()
1721 if (IS_ERR(genpd)) in genpd_complete()
1726 genpd_lock(genpd); in genpd_complete()
1728 genpd->prepared_count--; in genpd_complete()
1729 if (!genpd->prepared_count) in genpd_complete()
1730 genpd_queue_power_off_work(genpd); in genpd_complete()
1732 genpd_unlock(genpd); in genpd_complete()
1737 struct generic_pm_domain *genpd; in genpd_switch_state() local
1740 genpd = dev_to_genpd_safe(dev); in genpd_switch_state()
1741 if (!genpd) in genpd_switch_state()
1744 use_lock = genpd_is_irq_safe(genpd); in genpd_switch_state()
1747 genpd_lock(genpd); in genpd_switch_state()
1750 genpd->suspended_count++; in genpd_switch_state()
1751 genpd_sync_power_off(genpd, use_lock, 0); in genpd_switch_state()
1753 genpd_sync_power_on(genpd, use_lock, 0); in genpd_switch_state()
1754 genpd->suspended_count--; in genpd_switch_state()
1758 genpd_unlock(genpd); in genpd_switch_state()
1874 static void genpd_update_cpumask(struct generic_pm_domain *genpd, in genpd_update_cpumask() argument
1879 if (!genpd_is_cpu_domain(genpd)) in genpd_update_cpumask()
1882 list_for_each_entry(link, &genpd->child_links, child_node) { in genpd_update_cpumask()
1891 cpumask_set_cpu(cpu, genpd->cpus); in genpd_update_cpumask()
1893 cpumask_clear_cpu(cpu, genpd->cpus); in genpd_update_cpumask()
1896 static void genpd_set_cpumask(struct generic_pm_domain *genpd, int cpu) in genpd_set_cpumask() argument
1899 genpd_update_cpumask(genpd, cpu, true, 0); in genpd_set_cpumask()
1902 static void genpd_clear_cpumask(struct generic_pm_domain *genpd, int cpu) in genpd_clear_cpumask() argument
1905 genpd_update_cpumask(genpd, cpu, false, 0); in genpd_clear_cpumask()
1908 static int genpd_get_cpu(struct generic_pm_domain *genpd, struct device *dev) in genpd_get_cpu() argument
1912 if (!genpd_is_cpu_domain(genpd)) in genpd_get_cpu()
1923 static int genpd_add_device(struct generic_pm_domain *genpd, struct device *dev, in genpd_add_device() argument
1926 struct genpd_governor_data *gd = genpd->gd; in genpd_add_device()
1936 gpd_data->cpu = genpd_get_cpu(genpd, base_dev); in genpd_add_device()
1938 gpd_data->hw_mode = genpd->get_hwmode_dev ? genpd->get_hwmode_dev(genpd, dev) : false; in genpd_add_device()
1940 ret = genpd->attach_dev ? genpd->attach_dev(genpd, dev) : 0; in genpd_add_device()
1944 genpd_lock(genpd); in genpd_add_device()
1946 genpd_set_cpumask(genpd, gpd_data->cpu); in genpd_add_device()
1948 genpd->device_count++; in genpd_add_device()
1952 list_add_tail(&gpd_data->base.list_node, &genpd->dev_list); in genpd_add_device()
1954 genpd_unlock(genpd); in genpd_add_device()
1955 dev_pm_domain_set(dev, &genpd->domain); in genpd_add_device()
1971 int pm_genpd_add_device(struct generic_pm_domain *genpd, struct device *dev) in pm_genpd_add_device() argument
1975 if (!genpd || !dev) in pm_genpd_add_device()
1979 ret = genpd_add_device(genpd, dev, dev); in pm_genpd_add_device()
1986 static int genpd_remove_device(struct generic_pm_domain *genpd, in genpd_remove_device() argument
2000 genpd_lock(genpd); in genpd_remove_device()
2002 if (genpd->prepared_count > 0) { in genpd_remove_device()
2007 genpd->device_count--; in genpd_remove_device()
2008 if (genpd->gd) in genpd_remove_device()
2009 genpd->gd->max_off_time_changed = true; in genpd_remove_device()
2011 genpd_clear_cpumask(genpd, gpd_data->cpu); in genpd_remove_device()
2015 genpd_unlock(genpd); in genpd_remove_device()
2019 if (genpd->detach_dev) in genpd_remove_device()
2020 genpd->detach_dev(genpd, dev); in genpd_remove_device()
2027 genpd_unlock(genpd); in genpd_remove_device()
2039 struct generic_pm_domain *genpd = dev_to_genpd_safe(dev); in pm_genpd_remove_device() local
2041 if (!genpd) in pm_genpd_remove_device()
2044 return genpd_remove_device(genpd, dev); in pm_genpd_remove_device()
2065 struct generic_pm_domain *genpd; in dev_pm_genpd_add_notifier() local
2069 genpd = dev_to_genpd_safe(dev); in dev_pm_genpd_add_notifier()
2070 if (!genpd) in dev_pm_genpd_add_notifier()
2081 genpd_lock(genpd); in dev_pm_genpd_add_notifier()
2082 ret = raw_notifier_chain_register(&genpd->power_notifiers, nb); in dev_pm_genpd_add_notifier()
2083 genpd_unlock(genpd); in dev_pm_genpd_add_notifier()
2087 dev_name(&genpd->dev)); in dev_pm_genpd_add_notifier()
2111 struct generic_pm_domain *genpd; in dev_pm_genpd_remove_notifier() local
2115 genpd = dev_to_genpd_safe(dev); in dev_pm_genpd_remove_notifier()
2116 if (!genpd) in dev_pm_genpd_remove_notifier()
2127 genpd_lock(genpd); in dev_pm_genpd_remove_notifier()
2128 ret = raw_notifier_chain_unregister(&genpd->power_notifiers, in dev_pm_genpd_remove_notifier()
2130 genpd_unlock(genpd); in dev_pm_genpd_remove_notifier()
2134 dev_name(&genpd->dev)); in dev_pm_genpd_remove_notifier()
2143 static int genpd_add_subdomain(struct generic_pm_domain *genpd, in genpd_add_subdomain() argument
2149 if (IS_ERR_OR_NULL(genpd) || IS_ERR_OR_NULL(subdomain) in genpd_add_subdomain()
2150 || genpd == subdomain) in genpd_add_subdomain()
2158 if (!genpd_is_irq_safe(genpd) && genpd_is_irq_safe(subdomain)) { in genpd_add_subdomain()
2160 dev_name(&genpd->dev), subdomain->name); in genpd_add_subdomain()
2169 genpd_lock_nested(genpd, SINGLE_DEPTH_NESTING); in genpd_add_subdomain()
2171 if (!genpd_status_on(genpd) && genpd_status_on(subdomain)) { in genpd_add_subdomain()
2176 list_for_each_entry(itr, &genpd->parent_links, parent_node) { in genpd_add_subdomain()
2177 if (itr->child == subdomain && itr->parent == genpd) { in genpd_add_subdomain()
2183 link->parent = genpd; in genpd_add_subdomain()
2184 list_add_tail(&link->parent_node, &genpd->parent_links); in genpd_add_subdomain()
2188 genpd_sd_counter_inc(genpd); in genpd_add_subdomain()
2191 genpd_unlock(genpd); in genpd_add_subdomain()
2203 int pm_genpd_add_subdomain(struct generic_pm_domain *genpd, in pm_genpd_add_subdomain() argument
2209 ret = genpd_add_subdomain(genpd, subdomain); in pm_genpd_add_subdomain()
2221 int pm_genpd_remove_subdomain(struct generic_pm_domain *genpd, in pm_genpd_remove_subdomain() argument
2227 if (IS_ERR_OR_NULL(genpd) || IS_ERR_OR_NULL(subdomain)) in pm_genpd_remove_subdomain()
2231 genpd_lock_nested(genpd, SINGLE_DEPTH_NESTING); in pm_genpd_remove_subdomain()
2235 dev_name(&genpd->dev), subdomain->name); in pm_genpd_remove_subdomain()
2240 list_for_each_entry_safe(link, l, &genpd->parent_links, parent_node) { in pm_genpd_remove_subdomain()
2248 genpd_sd_counter_dec(genpd); in pm_genpd_remove_subdomain()
2255 genpd_unlock(genpd); in pm_genpd_remove_subdomain()
2268 static int genpd_set_default_power_state(struct generic_pm_domain *genpd) in genpd_set_default_power_state() argument
2276 genpd->states = state; in genpd_set_default_power_state()
2277 genpd->state_count = 1; in genpd_set_default_power_state()
2278 genpd->free_states = genpd_free_default_power_state; in genpd_set_default_power_state()
2288 static int genpd_alloc_data(struct generic_pm_domain *genpd) in genpd_alloc_data() argument
2293 if (genpd_is_cpu_domain(genpd) && in genpd_alloc_data()
2294 !zalloc_cpumask_var(&genpd->cpus, GFP_KERNEL)) in genpd_alloc_data()
2297 if (genpd->gov) { in genpd_alloc_data()
2311 if (genpd->state_count == 0) { in genpd_alloc_data()
2312 ret = genpd_set_default_power_state(genpd); in genpd_alloc_data()
2317 genpd->gd = gd; in genpd_alloc_data()
2318 device_initialize(&genpd->dev); in genpd_alloc_data()
2319 genpd->dev.release = genpd_provider_release; in genpd_alloc_data()
2320 genpd->dev.bus = &genpd_provider_bus_type; in genpd_alloc_data()
2321 genpd->dev.parent = &genpd_provider_bus; in genpd_alloc_data()
2323 if (!genpd_is_dev_name_fw(genpd)) { in genpd_alloc_data()
2324 dev_set_name(&genpd->dev, "%s", genpd->name); in genpd_alloc_data()
2330 genpd->device_id = ret; in genpd_alloc_data()
2331 dev_set_name(&genpd->dev, "%s_%u", genpd->name, genpd->device_id); in genpd_alloc_data()
2336 put_device(&genpd->dev); in genpd_alloc_data()
2337 if (genpd->free_states == genpd_free_default_power_state) { in genpd_alloc_data()
2338 kfree(genpd->states); in genpd_alloc_data()
2339 genpd->states = NULL; in genpd_alloc_data()
2342 if (genpd_is_cpu_domain(genpd)) in genpd_alloc_data()
2343 free_cpumask_var(genpd->cpus); in genpd_alloc_data()
2348 static void genpd_free_data(struct generic_pm_domain *genpd) in genpd_free_data() argument
2350 put_device(&genpd->dev); in genpd_free_data()
2351 if (genpd->device_id != -ENXIO) in genpd_free_data()
2352 ida_free(&genpd_ida, genpd->device_id); in genpd_free_data()
2353 if (genpd_is_cpu_domain(genpd)) in genpd_free_data()
2354 free_cpumask_var(genpd->cpus); in genpd_free_data()
2355 if (genpd->free_states) in genpd_free_data()
2356 genpd->free_states(genpd->states, genpd->state_count); in genpd_free_data()
2357 kfree(genpd->gd); in genpd_free_data()
2360 static void genpd_lock_init(struct generic_pm_domain *genpd) in genpd_lock_init() argument
2362 if (genpd_is_cpu_domain(genpd)) { in genpd_lock_init()
2363 raw_spin_lock_init(&genpd->raw_slock); in genpd_lock_init()
2364 genpd->lock_ops = &genpd_raw_spin_ops; in genpd_lock_init()
2365 } else if (genpd_is_irq_safe(genpd)) { in genpd_lock_init()
2366 spin_lock_init(&genpd->slock); in genpd_lock_init()
2367 genpd->lock_ops = &genpd_spin_ops; in genpd_lock_init()
2369 mutex_init(&genpd->mlock); in genpd_lock_init()
2370 genpd->lock_ops = &genpd_mtx_ops; in genpd_lock_init()
2375 static void genpd_set_stay_on(struct generic_pm_domain *genpd, bool is_off) in genpd_set_stay_on() argument
2377 genpd->stay_on = !genpd_is_no_stay_on(genpd) && !is_off; in genpd_set_stay_on()
2380 static void genpd_set_stay_on(struct generic_pm_domain *genpd, bool is_off) in genpd_set_stay_on() argument
2382 genpd->stay_on = false; in genpd_set_stay_on()
2394 int pm_genpd_init(struct generic_pm_domain *genpd, in pm_genpd_init() argument
2399 if (IS_ERR_OR_NULL(genpd)) in pm_genpd_init()
2402 INIT_LIST_HEAD(&genpd->parent_links); in pm_genpd_init()
2403 INIT_LIST_HEAD(&genpd->child_links); in pm_genpd_init()
2404 INIT_LIST_HEAD(&genpd->dev_list); in pm_genpd_init()
2405 RAW_INIT_NOTIFIER_HEAD(&genpd->power_notifiers); in pm_genpd_init()
2406 genpd_lock_init(genpd); in pm_genpd_init()
2407 genpd->gov = gov; in pm_genpd_init()
2408 INIT_WORK(&genpd->power_off_work, genpd_power_off_work_fn); in pm_genpd_init()
2409 atomic_set(&genpd->sd_count, 0); in pm_genpd_init()
2410 genpd->status = is_off ? GENPD_STATE_OFF : GENPD_STATE_ON; in pm_genpd_init()
2411 genpd_set_stay_on(genpd, is_off); in pm_genpd_init()
2412 genpd->sync_state = GENPD_SYNC_STATE_OFF; in pm_genpd_init()
2413 genpd->device_count = 0; in pm_genpd_init()
2414 genpd->provider = NULL; in pm_genpd_init()
2415 genpd->device_id = -ENXIO; in pm_genpd_init()
2416 genpd->has_provider = false; in pm_genpd_init()
2417 genpd->opp_table = NULL; in pm_genpd_init()
2418 genpd->accounting_time = ktime_get_mono_fast_ns(); in pm_genpd_init()
2419 genpd->domain.ops.runtime_suspend = genpd_runtime_suspend; in pm_genpd_init()
2420 genpd->domain.ops.runtime_resume = genpd_runtime_resume; in pm_genpd_init()
2421 genpd->domain.ops.prepare = genpd_prepare; in pm_genpd_init()
2422 genpd->domain.ops.suspend_noirq = genpd_suspend_noirq; in pm_genpd_init()
2423 genpd->domain.ops.resume_noirq = genpd_resume_noirq; in pm_genpd_init()
2424 genpd->domain.ops.freeze_noirq = genpd_freeze_noirq; in pm_genpd_init()
2425 genpd->domain.ops.thaw_noirq = genpd_thaw_noirq; in pm_genpd_init()
2426 genpd->domain.ops.poweroff_noirq = genpd_poweroff_noirq; in pm_genpd_init()
2427 genpd->domain.ops.restore_noirq = genpd_restore_noirq; in pm_genpd_init()
2428 genpd->domain.ops.complete = genpd_complete; in pm_genpd_init()
2429 genpd->domain.start = genpd_dev_pm_start; in pm_genpd_init()
2430 genpd->domain.set_performance_state = genpd_dev_pm_set_performance_state; in pm_genpd_init()
2432 if (genpd->flags & GENPD_FLAG_PM_CLK) { in pm_genpd_init()
2433 genpd->dev_ops.stop = pm_clk_suspend; in pm_genpd_init()
2434 genpd->dev_ops.start = pm_clk_resume; in pm_genpd_init()
2439 genpd->flags |= GENPD_FLAG_RPM_ALWAYS_ON; in pm_genpd_init()
2442 if ((genpd_is_always_on(genpd) || genpd_is_rpm_always_on(genpd)) && in pm_genpd_init()
2443 !genpd_status_on(genpd)) { in pm_genpd_init()
2444 pr_err("always-on PM domain %s is not on\n", genpd->name); in pm_genpd_init()
2449 if (!gov && genpd->state_count > 1) in pm_genpd_init()
2450 pr_warn("%s: no governor for states\n", genpd->name); in pm_genpd_init()
2452 ret = genpd_alloc_data(genpd); in pm_genpd_init()
2457 list_add(&genpd->gpd_list_node, &gpd_list); in pm_genpd_init()
2459 genpd_debug_add(genpd); in pm_genpd_init()
2465 static int genpd_remove(struct generic_pm_domain *genpd) in genpd_remove() argument
2469 if (IS_ERR_OR_NULL(genpd)) in genpd_remove()
2472 genpd_lock(genpd); in genpd_remove()
2474 if (genpd->has_provider) { in genpd_remove()
2475 genpd_unlock(genpd); in genpd_remove()
2476 pr_err("Provider present, unable to remove %s\n", dev_name(&genpd->dev)); in genpd_remove()
2480 if (!list_empty(&genpd->parent_links) || genpd->device_count) { in genpd_remove()
2481 genpd_unlock(genpd); in genpd_remove()
2482 pr_err("%s: unable to remove %s\n", __func__, dev_name(&genpd->dev)); in genpd_remove()
2486 list_for_each_entry_safe(link, l, &genpd->child_links, child_node) { in genpd_remove()
2492 list_del(&genpd->gpd_list_node); in genpd_remove()
2493 genpd_unlock(genpd); in genpd_remove()
2494 genpd_debug_remove(genpd); in genpd_remove()
2495 cancel_work_sync(&genpd->power_off_work); in genpd_remove()
2496 genpd_free_data(genpd); in genpd_remove()
2498 pr_debug("%s: removed %s\n", __func__, dev_name(&genpd->dev)); in genpd_remove()
2516 int pm_genpd_remove(struct generic_pm_domain *genpd) in pm_genpd_remove() argument
2521 ret = genpd_remove(genpd); in pm_genpd_remove()
2643 static bool genpd_present(const struct generic_pm_domain *genpd) in genpd_present() argument
2650 if (gpd == genpd) { in genpd_present()
2671 struct generic_pm_domain *genpd) in of_genpd_add_provider_simple() argument
2677 if (!np || !genpd) in of_genpd_add_provider_simple()
2683 if (!genpd_present(genpd)) in of_genpd_add_provider_simple()
2686 genpd->dev.of_node = np; in of_genpd_add_provider_simple()
2690 if (!dev && !genpd_is_no_sync_state(genpd)) { in of_genpd_add_provider_simple()
2691 genpd->sync_state = GENPD_SYNC_STATE_SIMPLE; in of_genpd_add_provider_simple()
2692 device_set_node(&genpd->dev, fwnode); in of_genpd_add_provider_simple()
2699 ret = device_add(&genpd->dev); in of_genpd_add_provider_simple()
2704 if (!genpd_is_opp_table_fw(genpd) && genpd->set_performance_state) { in of_genpd_add_provider_simple()
2705 ret = dev_pm_opp_of_add_table(&genpd->dev); in of_genpd_add_provider_simple()
2707 dev_err_probe(&genpd->dev, ret, "Failed to add OPP table\n"); in of_genpd_add_provider_simple()
2715 genpd->opp_table = dev_pm_opp_get_opp_table(&genpd->dev); in of_genpd_add_provider_simple()
2716 WARN_ON(IS_ERR(genpd->opp_table)); in of_genpd_add_provider_simple()
2719 ret = genpd_add_provider(np, genpd_xlate_simple, genpd); in of_genpd_add_provider_simple()
2723 genpd->provider = fwnode; in of_genpd_add_provider_simple()
2724 genpd->has_provider = true; in of_genpd_add_provider_simple()
2729 if (genpd->opp_table) { in of_genpd_add_provider_simple()
2730 dev_pm_opp_put_opp_table(genpd->opp_table); in of_genpd_add_provider_simple()
2731 dev_pm_opp_of_remove_table(&genpd->dev); in of_genpd_add_provider_simple()
2734 device_del(&genpd->dev); in of_genpd_add_provider_simple()
2747 struct generic_pm_domain *genpd; in of_genpd_add_provider_onecell() local
2773 genpd = data->domains[i]; in of_genpd_add_provider_onecell()
2775 if (!genpd) in of_genpd_add_provider_onecell()
2777 if (!genpd_present(genpd)) in of_genpd_add_provider_onecell()
2780 genpd->dev.of_node = np; in of_genpd_add_provider_onecell()
2782 if (sync_state && !genpd_is_no_sync_state(genpd)) { in of_genpd_add_provider_onecell()
2783 genpd->sync_state = GENPD_SYNC_STATE_ONECELL; in of_genpd_add_provider_onecell()
2784 device_set_node(&genpd->dev, fwnode); in of_genpd_add_provider_onecell()
2788 ret = device_add(&genpd->dev); in of_genpd_add_provider_onecell()
2793 if (!genpd_is_opp_table_fw(genpd) && genpd->set_performance_state) { in of_genpd_add_provider_onecell()
2794 ret = dev_pm_opp_of_add_table_indexed(&genpd->dev, i); in of_genpd_add_provider_onecell()
2796 dev_err_probe(&genpd->dev, ret, in of_genpd_add_provider_onecell()
2798 device_del(&genpd->dev); in of_genpd_add_provider_onecell()
2806 genpd->opp_table = dev_pm_opp_get_opp_table(&genpd->dev); in of_genpd_add_provider_onecell()
2807 WARN_ON(IS_ERR(genpd->opp_table)); in of_genpd_add_provider_onecell()
2810 genpd->provider = fwnode; in of_genpd_add_provider_onecell()
2811 genpd->has_provider = true; in of_genpd_add_provider_onecell()
2822 genpd = data->domains[i]; in of_genpd_add_provider_onecell()
2824 if (!genpd) in of_genpd_add_provider_onecell()
2827 genpd->provider = NULL; in of_genpd_add_provider_onecell()
2828 genpd->has_provider = false; in of_genpd_add_provider_onecell()
2830 if (genpd->opp_table) { in of_genpd_add_provider_onecell()
2831 dev_pm_opp_put_opp_table(genpd->opp_table); in of_genpd_add_provider_onecell()
2832 dev_pm_opp_of_remove_table(&genpd->dev); in of_genpd_add_provider_onecell()
2835 device_del(&genpd->dev); in of_genpd_add_provider_onecell()
2899 struct generic_pm_domain *genpd = ERR_PTR(-ENOENT); in genpd_get_from_provider() local
2910 genpd = provider->xlate(genpdspec, provider->data); in genpd_get_from_provider()
2911 if (!IS_ERR(genpd)) in genpd_get_from_provider()
2917 return genpd; in genpd_get_from_provider()
2930 struct generic_pm_domain *genpd; in of_genpd_add_device() local
2938 genpd = genpd_get_from_provider(genpdspec); in of_genpd_add_device()
2939 if (IS_ERR(genpd)) { in of_genpd_add_device()
2940 ret = PTR_ERR(genpd); in of_genpd_add_device()
2944 ret = genpd_add_device(genpd, dev, dev); in of_genpd_add_device()
3044 struct generic_pm_domain *gpd, *tmp, *genpd = ERR_PTR(-ENOENT); in of_genpd_remove_last() local
3054 genpd = ret ? ERR_PTR(ret) : gpd; in of_genpd_remove_last()
3060 return genpd; in of_genpd_remove_last()
3504 struct generic_pm_domain *genpd; in of_genpd_sync_state() local
3510 list_for_each_entry(genpd, &gpd_list, gpd_list_node) { in of_genpd_sync_state()
3511 if (genpd->provider == of_fwnode_handle(np)) { in of_genpd_sync_state()
3512 genpd_lock(genpd); in of_genpd_sync_state()
3513 genpd->stay_on = false; in of_genpd_sync_state()
3514 genpd_power_off(genpd, false, 0); in of_genpd_sync_state()
3515 genpd_unlock(genpd); in of_genpd_sync_state()
3529 struct generic_pm_domain *genpd = container_of(dev, struct generic_pm_domain, dev); in genpd_provider_sync_state() local
3531 switch (genpd->sync_state) { in genpd_provider_sync_state()
3540 genpd_lock(genpd); in genpd_provider_sync_state()
3541 genpd->stay_on = false; in genpd_provider_sync_state()
3542 genpd_power_off(genpd, false, 0); in genpd_provider_sync_state()
3543 genpd_unlock(genpd); in genpd_provider_sync_state()
3645 struct generic_pm_domain *genpd) in genpd_summary_one() argument
3656 ret = genpd_lock_interruptible(genpd); in genpd_summary_one()
3660 if (WARN_ON(genpd->status >= ARRAY_SIZE(status_lookup))) in genpd_summary_one()
3662 if (!genpd_status_on(genpd)) in genpd_summary_one()
3664 status_lookup[genpd->status], genpd->state_idx); in genpd_summary_one()
3667 status_lookup[genpd->status]); in genpd_summary_one()
3668 seq_printf(s, "%-30s %-30s %u", dev_name(&genpd->dev), state, genpd->performance_state); in genpd_summary_one()
3675 list_for_each_entry(link, &genpd->parent_links, parent_node) { in genpd_summary_one()
3676 if (list_is_first(&link->parent_node, &genpd->parent_links)) in genpd_summary_one()
3679 if (!list_is_last(&link->parent_node, &genpd->parent_links)) in genpd_summary_one()
3683 list_for_each_entry(pm_data, &genpd->dev_list, list_node) { in genpd_summary_one()
3692 genpd_unlock(genpd); in genpd_summary_one()
3699 struct generic_pm_domain *genpd; in summary_show() local
3710 list_for_each_entry(genpd, &gpd_list, gpd_list_node) { in summary_show()
3711 ret = genpd_summary_one(s, genpd); in summary_show()
3727 struct generic_pm_domain *genpd = s->private; in status_show() local
3730 ret = genpd_lock_interruptible(genpd); in status_show()
3734 if (WARN_ON_ONCE(genpd->status >= ARRAY_SIZE(status_lookup))) in status_show()
3737 if (genpd->status == GENPD_STATE_OFF) in status_show()
3738 seq_printf(s, "%s-%u\n", status_lookup[genpd->status], in status_show()
3739 genpd->state_idx); in status_show()
3741 seq_printf(s, "%s\n", status_lookup[genpd->status]); in status_show()
3743 genpd_unlock(genpd); in status_show()
3749 struct generic_pm_domain *genpd = s->private; in sub_domains_show() local
3753 ret = genpd_lock_interruptible(genpd); in sub_domains_show()
3757 list_for_each_entry(link, &genpd->parent_links, parent_node) in sub_domains_show()
3760 genpd_unlock(genpd); in sub_domains_show()
3766 struct generic_pm_domain *genpd = s->private; in idle_states_show() local
3771 ret = genpd_lock_interruptible(genpd); in idle_states_show()
3777 for (i = 0; i < genpd->state_count; i++) { in idle_states_show()
3778 struct genpd_power_state *state = &genpd->states[i]; in idle_states_show()
3783 if (genpd->status == GENPD_STATE_OFF && genpd->state_idx == i) { in idle_states_show()
3785 if (now > genpd->accounting_time) { in idle_states_show()
3786 delta = now - genpd->accounting_time; in idle_states_show()
3801 genpd_unlock(genpd); in idle_states_show()
3807 struct generic_pm_domain *genpd = s->private; in active_time_show() local
3811 ret = genpd_lock_interruptible(genpd); in active_time_show()
3815 if (genpd->status == GENPD_STATE_ON) { in active_time_show()
3817 if (now > genpd->accounting_time) in active_time_show()
3818 delta = now - genpd->accounting_time; in active_time_show()
3821 on_time = genpd->on_time + delta; in active_time_show()
3825 genpd_unlock(genpd); in active_time_show()
3831 struct generic_pm_domain *genpd = s->private; in total_idle_time_show() local
3836 ret = genpd_lock_interruptible(genpd); in total_idle_time_show()
3840 for (i = 0; i < genpd->state_count; i++) { in total_idle_time_show()
3841 total += genpd->states[i].idle_time; in total_idle_time_show()
3843 if (genpd->status == GENPD_STATE_OFF && genpd->state_idx == i) { in total_idle_time_show()
3845 if (now > genpd->accounting_time) { in total_idle_time_show()
3846 delta = now - genpd->accounting_time; in total_idle_time_show()
3855 genpd_unlock(genpd); in total_idle_time_show()
3862 struct generic_pm_domain *genpd = s->private; in devices_show() local
3866 ret = genpd_lock_interruptible(genpd); in devices_show()
3870 list_for_each_entry(pm_data, &genpd->dev_list, list_node) in devices_show()
3873 genpd_unlock(genpd); in devices_show()
3879 struct generic_pm_domain *genpd = s->private; in perf_state_show() local
3881 if (genpd_lock_interruptible(genpd)) in perf_state_show()
3884 seq_printf(s, "%u\n", genpd->performance_state); in perf_state_show()
3886 genpd_unlock(genpd); in perf_state_show()
3899 static void genpd_debug_add(struct generic_pm_domain *genpd) in genpd_debug_add() argument
3906 d = debugfs_create_dir(dev_name(&genpd->dev), genpd_debugfs_dir); in genpd_debug_add()
3909 d, genpd, &status_fops); in genpd_debug_add()
3911 d, genpd, &sub_domains_fops); in genpd_debug_add()
3913 d, genpd, &idle_states_fops); in genpd_debug_add()
3915 d, genpd, &active_time_fops); in genpd_debug_add()
3917 d, genpd, &total_idle_time_fops); in genpd_debug_add()
3919 d, genpd, &devices_fops); in genpd_debug_add()
3920 if (genpd->set_performance_state) in genpd_debug_add()
3922 d, genpd, &perf_state_fops); in genpd_debug_add()
3927 struct generic_pm_domain *genpd; in genpd_debug_init() local
3934 list_for_each_entry(genpd, &gpd_list, gpd_list_node) in genpd_debug_init()
3935 genpd_debug_add(genpd); in genpd_debug_init()