Lines Matching full:genpd
27 /* Provides a unique ID for each genpd device */
37 #define GENPD_DEV_CALLBACK(genpd, type, callback, dev) \ argument
42 __routine = genpd->dev_ops.callback; \
53 void (*lock)(struct generic_pm_domain *genpd);
54 void (*lock_nested)(struct generic_pm_domain *genpd, int depth);
55 int (*lock_interruptible)(struct generic_pm_domain *genpd);
56 void (*unlock)(struct generic_pm_domain *genpd);
59 static void genpd_lock_mtx(struct generic_pm_domain *genpd) in genpd_lock_mtx() argument
61 mutex_lock(&genpd->mlock); in genpd_lock_mtx()
64 static void genpd_lock_nested_mtx(struct generic_pm_domain *genpd, in genpd_lock_nested_mtx() argument
67 mutex_lock_nested(&genpd->mlock, depth); in genpd_lock_nested_mtx()
70 static int genpd_lock_interruptible_mtx(struct generic_pm_domain *genpd) in genpd_lock_interruptible_mtx() argument
72 return mutex_lock_interruptible(&genpd->mlock); in genpd_lock_interruptible_mtx()
75 static void genpd_unlock_mtx(struct generic_pm_domain *genpd) in genpd_unlock_mtx() argument
77 return mutex_unlock(&genpd->mlock); in genpd_unlock_mtx()
87 static void genpd_lock_spin(struct generic_pm_domain *genpd) in genpd_lock_spin() argument
88 __acquires(&genpd->slock) in genpd_lock_spin()
92 spin_lock_irqsave(&genpd->slock, flags); in genpd_lock_spin()
93 genpd->lock_flags = flags; in genpd_lock_spin()
96 static void genpd_lock_nested_spin(struct generic_pm_domain *genpd, in genpd_lock_nested_spin() argument
98 __acquires(&genpd->slock) in genpd_lock_nested_spin()
102 spin_lock_irqsave_nested(&genpd->slock, flags, depth); in genpd_lock_nested_spin()
103 genpd->lock_flags = flags; in genpd_lock_nested_spin()
106 static int genpd_lock_interruptible_spin(struct generic_pm_domain *genpd) in genpd_lock_interruptible_spin() argument
107 __acquires(&genpd->slock) in genpd_lock_interruptible_spin()
111 spin_lock_irqsave(&genpd->slock, flags); in genpd_lock_interruptible_spin()
112 genpd->lock_flags = flags; in genpd_lock_interruptible_spin()
116 static void genpd_unlock_spin(struct generic_pm_domain *genpd) in genpd_unlock_spin() argument
117 __releases(&genpd->slock) in genpd_unlock_spin()
119 spin_unlock_irqrestore(&genpd->slock, genpd->lock_flags); in genpd_unlock_spin()
129 static void genpd_lock_raw_spin(struct generic_pm_domain *genpd) in genpd_lock_raw_spin() argument
130 __acquires(&genpd->raw_slock) in genpd_lock_raw_spin()
134 raw_spin_lock_irqsave(&genpd->raw_slock, flags); in genpd_lock_raw_spin()
135 genpd->raw_lock_flags = flags; in genpd_lock_raw_spin()
138 static void genpd_lock_nested_raw_spin(struct generic_pm_domain *genpd, in genpd_lock_nested_raw_spin() argument
140 __acquires(&genpd->raw_slock) in genpd_lock_nested_raw_spin()
144 raw_spin_lock_irqsave_nested(&genpd->raw_slock, flags, depth); in genpd_lock_nested_raw_spin()
145 genpd->raw_lock_flags = flags; in genpd_lock_nested_raw_spin()
148 static int genpd_lock_interruptible_raw_spin(struct generic_pm_domain *genpd) in genpd_lock_interruptible_raw_spin() argument
149 __acquires(&genpd->raw_slock) in genpd_lock_interruptible_raw_spin()
153 raw_spin_lock_irqsave(&genpd->raw_slock, flags); in genpd_lock_interruptible_raw_spin()
154 genpd->raw_lock_flags = flags; in genpd_lock_interruptible_raw_spin()
158 static void genpd_unlock_raw_spin(struct generic_pm_domain *genpd) in genpd_unlock_raw_spin() argument
159 __releases(&genpd->raw_slock) in genpd_unlock_raw_spin()
161 raw_spin_unlock_irqrestore(&genpd->raw_slock, genpd->raw_lock_flags); in genpd_unlock_raw_spin()
176 #define genpd_status_on(genpd) (genpd->status == GENPD_STATE_ON) argument
177 #define genpd_is_irq_safe(genpd) (genpd->flags & GENPD_FLAG_IRQ_SAFE) argument
178 #define genpd_is_always_on(genpd) (genpd->flags & GENPD_FLAG_ALWAYS_ON) argument
179 #define genpd_is_active_wakeup(genpd) (genpd->flags & GENPD_FLAG_ACTIVE_WAKEUP) argument
180 #define genpd_is_cpu_domain(genpd) (genpd->flags & GENPD_FLAG_CPU_DOMAIN) argument
181 #define genpd_is_rpm_always_on(genpd) (genpd->flags & GENPD_FLAG_RPM_ALWAYS_ON) argument
182 #define genpd_is_opp_table_fw(genpd) (genpd->flags & GENPD_FLAG_OPP_TABLE_FW) argument
183 #define genpd_is_dev_name_fw(genpd) (genpd->flags & GENPD_FLAG_DEV_NAME_FW) argument
184 #define genpd_is_no_sync_state(genpd) (genpd->flags & GENPD_FLAG_NO_SYNC_STATE) argument
185 #define genpd_is_no_stay_on(genpd) (genpd->flags & GENPD_FLAG_NO_STAY_ON) argument
188 const struct generic_pm_domain *genpd) in irq_safe_dev_in_sleep_domain() argument
192 ret = pm_runtime_is_irq_safe(dev) && !genpd_is_irq_safe(genpd); in irq_safe_dev_in_sleep_domain()
199 if (genpd_is_always_on(genpd) || genpd_is_rpm_always_on(genpd)) in irq_safe_dev_in_sleep_domain()
204 dev_name(&genpd->dev)); in irq_safe_dev_in_sleep_domain()
222 /* A genpd's always have its ->runtime_suspend() callback assigned. */ in dev_to_genpd_safe()
231 * attached to the device is a genpd domain.
243 struct generic_pm_domain *genpd = dev_to_genpd(dev); in dev_to_genpd_dev() local
245 if (IS_ERR(genpd)) in dev_to_genpd_dev()
246 return ERR_CAST(genpd); in dev_to_genpd_dev()
248 return &genpd->dev; in dev_to_genpd_dev()
251 static int genpd_stop_dev(const struct generic_pm_domain *genpd, in genpd_stop_dev() argument
254 return GENPD_DEV_CALLBACK(genpd, int, stop, dev); in genpd_stop_dev()
257 static int genpd_start_dev(const struct generic_pm_domain *genpd, in genpd_start_dev() argument
260 return GENPD_DEV_CALLBACK(genpd, int, start, dev); in genpd_start_dev()
263 static bool genpd_sd_counter_dec(struct generic_pm_domain *genpd) in genpd_sd_counter_dec() argument
267 if (!WARN_ON(atomic_read(&genpd->sd_count) == 0)) in genpd_sd_counter_dec()
268 ret = !!atomic_dec_and_test(&genpd->sd_count); in genpd_sd_counter_dec()
273 static void genpd_sd_counter_inc(struct generic_pm_domain *genpd) in genpd_sd_counter_inc() argument
275 atomic_inc(&genpd->sd_count); in genpd_sd_counter_inc()
282 static void genpd_debug_add(struct generic_pm_domain *genpd);
284 static void genpd_debug_remove(struct generic_pm_domain *genpd) in genpd_debug_remove() argument
289 debugfs_lookup_and_remove(dev_name(&genpd->dev), genpd_debugfs_dir); in genpd_debug_remove()
292 static void genpd_update_accounting(struct generic_pm_domain *genpd) in genpd_update_accounting() argument
297 if (now <= genpd->accounting_time) in genpd_update_accounting()
300 delta = now - genpd->accounting_time; in genpd_update_accounting()
303 * If genpd->status is active, it means we are just in genpd_update_accounting()
307 if (genpd->status == GENPD_STATE_ON) in genpd_update_accounting()
308 genpd->states[genpd->state_idx].idle_time += delta; in genpd_update_accounting()
310 genpd->on_time += delta; in genpd_update_accounting()
312 genpd->accounting_time = now; in genpd_update_accounting()
315 static void genpd_reflect_residency(struct generic_pm_domain *genpd) in genpd_reflect_residency() argument
317 struct genpd_governor_data *gd = genpd->gd; in genpd_reflect_residency()
326 state_idx = genpd->state_idx; in genpd_reflect_residency()
327 state = &genpd->states[state_idx]; in genpd_reflect_residency()
332 } else if (state_idx < (genpd->state_count -1)) { in genpd_reflect_residency()
333 next_state = &genpd->states[state_idx + 1]; in genpd_reflect_residency()
344 static inline void genpd_debug_add(struct generic_pm_domain *genpd) {} in genpd_debug_add() argument
345 static inline void genpd_debug_remove(struct generic_pm_domain *genpd) {} in genpd_debug_remove() argument
346 static inline void genpd_update_accounting(struct generic_pm_domain *genpd) {} in genpd_update_accounting() argument
347 static inline void genpd_reflect_residency(struct generic_pm_domain *genpd) {} in genpd_reflect_residency() argument
350 static int _genpd_reeval_performance_state(struct generic_pm_domain *genpd, in _genpd_reeval_performance_state() argument
358 if (state == genpd->performance_state) in _genpd_reeval_performance_state()
362 if (state > genpd->performance_state) in _genpd_reeval_performance_state()
366 list_for_each_entry(pdd, &genpd->dev_list, list_node) { in _genpd_reeval_performance_state()
376 * field is protected by the parent genpd->lock, which is already taken. in _genpd_reeval_performance_state()
387 list_for_each_entry(link, &genpd->parent_links, parent_node) { in _genpd_reeval_performance_state()
395 static int genpd_xlate_performance_state(struct generic_pm_domain *genpd, in genpd_xlate_performance_state() argument
402 return dev_pm_opp_xlate_performance_state(genpd->opp_table, in genpd_xlate_performance_state()
407 static int _genpd_set_performance_state(struct generic_pm_domain *genpd,
429 static int _genpd_set_parent_state(struct generic_pm_domain *genpd, in _genpd_set_parent_state() argument
437 ret = genpd_xlate_performance_state(genpd, parent, state); in _genpd_set_parent_state()
458 static int _genpd_set_performance_state(struct generic_pm_domain *genpd, in _genpd_set_performance_state() argument
464 if (state == genpd->performance_state) in _genpd_set_performance_state()
468 if (state > genpd->performance_state) { in _genpd_set_performance_state()
469 list_for_each_entry(link, &genpd->child_links, child_node) { in _genpd_set_performance_state()
470 ret = _genpd_set_parent_state(genpd, link, state, depth); in _genpd_set_performance_state()
476 if (genpd->set_performance_state) { in _genpd_set_performance_state()
477 ret = genpd->set_performance_state(genpd, state); in _genpd_set_performance_state()
486 if (state < genpd->performance_state) { in _genpd_set_performance_state()
487 list_for_each_entry_reverse(link, &genpd->child_links, child_node) { in _genpd_set_performance_state()
488 ret = _genpd_set_parent_state(genpd, link, state, depth); in _genpd_set_performance_state()
494 genpd->performance_state = state; in _genpd_set_performance_state()
498 list_for_each_entry_continue_reverse(link, &genpd->child_links, child_node) in _genpd_set_performance_state()
502 list_for_each_entry_continue(link, &genpd->child_links, child_node) in _genpd_set_performance_state()
509 struct generic_pm_domain *genpd = dev_to_genpd(dev); in genpd_set_performance_state() local
519 state = _genpd_reeval_performance_state(genpd, state); in genpd_set_performance_state()
521 ret = _genpd_set_performance_state(genpd, state, 0); in genpd_set_performance_state()
548 struct generic_pm_domain *genpd = dev_to_genpd(dev); in genpd_dev_pm_set_performance_state() local
551 genpd_lock(genpd); in genpd_dev_pm_set_performance_state()
559 genpd_unlock(genpd); in genpd_dev_pm_set_performance_state()
572 * performance state of the genpd).
574 * It is assumed that the users guarantee that the genpd wouldn't be detached
581 struct generic_pm_domain *genpd; in dev_pm_genpd_set_performance_state() local
583 genpd = dev_to_genpd_safe(dev); in dev_pm_genpd_set_performance_state()
584 if (!genpd) in dev_pm_genpd_set_performance_state()
603 * guarantee that the genpd wouldn't be detached while this routine is getting
612 struct generic_pm_domain *genpd; in dev_pm_genpd_set_next_wakeup() local
615 genpd = dev_to_genpd_safe(dev); in dev_pm_genpd_set_next_wakeup()
616 if (!genpd) in dev_pm_genpd_set_next_wakeup()
626 * dev_pm_genpd_get_next_hrtimer - Return the next_hrtimer for the genpd
627 * @dev: A device that is attached to the genpd.
632 * Returns the aggregated value of the genpd's next hrtimer or KTIME_MAX if no
637 struct generic_pm_domain *genpd; in dev_pm_genpd_get_next_hrtimer() local
639 genpd = dev_to_genpd_safe(dev); in dev_pm_genpd_get_next_hrtimer()
640 if (!genpd) in dev_pm_genpd_get_next_hrtimer()
643 if (genpd->gd) in dev_pm_genpd_get_next_hrtimer()
644 return genpd->gd->next_hrtimer; in dev_pm_genpd_get_next_hrtimer()
653 * @dev: A device that is attached to the genpd.
655 * Allows a consumer of the genpd to notify the provider that the next power off
658 * It is assumed that the users guarantee that the genpd wouldn't be detached
663 struct generic_pm_domain *genpd; in dev_pm_genpd_synced_poweroff() local
665 genpd = dev_to_genpd_safe(dev); in dev_pm_genpd_synced_poweroff()
666 if (!genpd) in dev_pm_genpd_synced_poweroff()
669 genpd_lock(genpd); in dev_pm_genpd_synced_poweroff()
670 genpd->synced_poweroff = true; in dev_pm_genpd_synced_poweroff()
671 genpd_unlock(genpd); in dev_pm_genpd_synced_poweroff()
686 * It is assumed that the users guarantee that the genpd wouldn't be detached
693 struct generic_pm_domain *genpd; in dev_pm_genpd_set_hwmode() local
696 genpd = dev_to_genpd_safe(dev); in dev_pm_genpd_set_hwmode()
697 if (!genpd) in dev_pm_genpd_set_hwmode()
700 if (!genpd->set_hwmode_dev) in dev_pm_genpd_set_hwmode()
703 genpd_lock(genpd); in dev_pm_genpd_set_hwmode()
708 ret = genpd->set_hwmode_dev(genpd, dev, enable); in dev_pm_genpd_set_hwmode()
713 genpd_unlock(genpd); in dev_pm_genpd_set_hwmode()
726 * It is assumed that the users guarantee that the genpd wouldn't be detached
745 * behaviour to be dynamically controlled for a device attached to a genpd.
747 * It is assumed that the users guarantee that the genpd wouldn't be detached
754 struct generic_pm_domain *genpd; in dev_pm_genpd_rpm_always_on() local
756 genpd = dev_to_genpd_safe(dev); in dev_pm_genpd_rpm_always_on()
757 if (!genpd) in dev_pm_genpd_rpm_always_on()
760 genpd_lock(genpd); in dev_pm_genpd_rpm_always_on()
762 genpd_unlock(genpd); in dev_pm_genpd_rpm_always_on()
777 * Note: this function returns the power status of the genpd at the time of the
779 * sharing the same genpd. Therefore, this information should not be relied for
786 struct generic_pm_domain *genpd; in dev_pm_genpd_is_on() local
789 genpd = dev_to_genpd_safe(dev); in dev_pm_genpd_is_on()
790 if (!genpd) in dev_pm_genpd_is_on()
793 genpd_lock(genpd); in dev_pm_genpd_is_on()
794 is_on = genpd_status_on(genpd); in dev_pm_genpd_is_on()
795 genpd_unlock(genpd); in dev_pm_genpd_is_on()
804 * @genpd: The PM domain the idle-state belongs to.
813 * It is assumed that the users guarantee that the genpd doesn't get removed
816 void pm_genpd_inc_rejected(struct generic_pm_domain *genpd, in pm_genpd_inc_rejected() argument
819 genpd_lock(genpd); in pm_genpd_inc_rejected()
820 genpd->states[genpd->state_idx].rejected++; in pm_genpd_inc_rejected()
821 genpd->states[genpd->state_idx].usage--; in pm_genpd_inc_rejected()
822 genpd_unlock(genpd); in pm_genpd_inc_rejected()
826 static int _genpd_power_on(struct generic_pm_domain *genpd, bool timed) in _genpd_power_on() argument
828 unsigned int state_idx = genpd->state_idx; in _genpd_power_on()
834 ret = raw_notifier_call_chain_robust(&genpd->power_notifiers, in _genpd_power_on()
841 if (!genpd->power_on) in _genpd_power_on()
844 timed = timed && genpd->gd && !genpd->states[state_idx].fwnode; in _genpd_power_on()
846 ret = genpd->power_on(genpd); in _genpd_power_on()
854 ret = genpd->power_on(genpd); in _genpd_power_on()
859 if (elapsed_ns <= genpd->states[state_idx].power_on_latency_ns) in _genpd_power_on()
862 genpd->states[state_idx].power_on_latency_ns = elapsed_ns; in _genpd_power_on()
863 genpd->gd->max_off_time_changed = true; in _genpd_power_on()
865 dev_name(&genpd->dev), "on", elapsed_ns); in _genpd_power_on()
868 raw_notifier_call_chain(&genpd->power_notifiers, GENPD_NOTIFY_ON, NULL); in _genpd_power_on()
869 genpd->synced_poweroff = false; in _genpd_power_on()
872 raw_notifier_call_chain(&genpd->power_notifiers, GENPD_NOTIFY_OFF, in _genpd_power_on()
877 static int _genpd_power_off(struct generic_pm_domain *genpd, bool timed) in _genpd_power_off() argument
879 unsigned int state_idx = genpd->state_idx; in _genpd_power_off()
885 ret = raw_notifier_call_chain_robust(&genpd->power_notifiers, in _genpd_power_off()
892 if (!genpd->power_off) in _genpd_power_off()
895 timed = timed && genpd->gd && !genpd->states[state_idx].fwnode; in _genpd_power_off()
897 ret = genpd->power_off(genpd); in _genpd_power_off()
905 ret = genpd->power_off(genpd); in _genpd_power_off()
910 if (elapsed_ns <= genpd->states[state_idx].power_off_latency_ns) in _genpd_power_off()
913 genpd->states[state_idx].power_off_latency_ns = elapsed_ns; in _genpd_power_off()
914 genpd->gd->max_off_time_changed = true; in _genpd_power_off()
916 dev_name(&genpd->dev), "off", elapsed_ns); in _genpd_power_off()
919 raw_notifier_call_chain(&genpd->power_notifiers, GENPD_NOTIFY_OFF, in _genpd_power_off()
923 raw_notifier_call_chain(&genpd->power_notifiers, GENPD_NOTIFY_ON, NULL); in _genpd_power_off()
929 * @genpd: PM domain to power off.
934 static void genpd_queue_power_off_work(struct generic_pm_domain *genpd) in genpd_queue_power_off_work() argument
936 queue_work(pm_wq, &genpd->power_off_work); in genpd_queue_power_off_work()
941 * @genpd: PM domain to power down.
942 * @one_dev_on: If invoked from genpd's ->runtime_suspend|resume() callback, the
948 * If all of the @genpd's devices have been suspended and all of its subdomains
949 * have been powered down, remove power from @genpd.
951 static void genpd_power_off(struct generic_pm_domain *genpd, bool one_dev_on, in genpd_power_off() argument
966 if (!genpd_status_on(genpd) || genpd->prepared_count > 0 || in genpd_power_off()
967 genpd_is_always_on(genpd) || genpd_is_rpm_always_on(genpd) || in genpd_power_off()
968 genpd->stay_on || atomic_read(&genpd->sd_count) > 0) in genpd_power_off()
977 list_for_each_entry(link, &genpd->parent_links, parent_node) { in genpd_power_off()
983 list_for_each_entry(pdd, &genpd->dev_list, list_node) { in genpd_power_off()
989 irq_safe_dev_in_sleep_domain(pdd->dev, genpd)) in genpd_power_off()
1000 if (genpd->gov && genpd->gov->power_down_ok) { in genpd_power_off()
1001 if (!genpd->gov->power_down_ok(&genpd->domain)) in genpd_power_off()
1006 if (!genpd->gov) in genpd_power_off()
1007 genpd->state_idx = 0; in genpd_power_off()
1010 if (atomic_read(&genpd->sd_count) > 0) in genpd_power_off()
1013 if (_genpd_power_off(genpd, true)) { in genpd_power_off()
1014 genpd->states[genpd->state_idx].rejected++; in genpd_power_off()
1018 genpd->status = GENPD_STATE_OFF; in genpd_power_off()
1019 genpd_update_accounting(genpd); in genpd_power_off()
1020 genpd->states[genpd->state_idx].usage++; in genpd_power_off()
1022 list_for_each_entry(link, &genpd->child_links, child_node) { in genpd_power_off()
1032 * @genpd: PM domain to power up.
1035 * Restore power to @genpd and all of its parents so that it is possible to
1038 static int genpd_power_on(struct generic_pm_domain *genpd, unsigned int depth) in genpd_power_on() argument
1043 if (genpd_status_on(genpd)) in genpd_power_on()
1047 genpd_reflect_residency(genpd); in genpd_power_on()
1054 list_for_each_entry(link, &genpd->child_links, child_node) { in genpd_power_on()
1069 ret = _genpd_power_on(genpd, true); in genpd_power_on()
1073 genpd->status = GENPD_STATE_ON; in genpd_power_on()
1074 genpd_update_accounting(genpd); in genpd_power_on()
1080 &genpd->child_links, in genpd_power_on()
1093 struct generic_pm_domain *genpd = dev_to_genpd(dev); in genpd_dev_pm_start() local
1095 return genpd_start_dev(genpd, dev); in genpd_dev_pm_start()
1108 struct generic_pm_domain *genpd = ERR_PTR(-ENODATA); in genpd_dev_pm_qos_notifier() local
1120 genpd = dev_to_genpd(dev); in genpd_dev_pm_qos_notifier()
1126 if (!IS_ERR(genpd)) { in genpd_dev_pm_qos_notifier()
1127 genpd_lock(genpd); in genpd_dev_pm_qos_notifier()
1128 genpd->gd->max_off_time_changed = true; in genpd_dev_pm_qos_notifier()
1129 genpd_unlock(genpd); in genpd_dev_pm_qos_notifier()
1146 struct generic_pm_domain *genpd; in genpd_power_off_work_fn() local
1148 genpd = container_of(work, struct generic_pm_domain, power_off_work); in genpd_power_off_work_fn()
1150 genpd_lock(genpd); in genpd_power_off_work_fn()
1151 genpd_power_off(genpd, false, 0); in genpd_power_off_work_fn()
1152 genpd_unlock(genpd); in genpd_power_off_work_fn()
1211 struct generic_pm_domain *genpd; in genpd_runtime_suspend() local
1222 genpd = dev_to_genpd(dev); in genpd_runtime_suspend()
1223 if (IS_ERR(genpd)) in genpd_runtime_suspend()
1232 suspend_ok = genpd->gov ? genpd->gov->suspend_ok : NULL; in genpd_runtime_suspend()
1244 ret = genpd_stop_dev(genpd, dev); in genpd_runtime_suspend()
1257 genpd->gd->max_off_time_changed = true; in genpd_runtime_suspend()
1266 if (irq_safe_dev_in_sleep_domain(dev, genpd)) in genpd_runtime_suspend()
1269 genpd_lock(genpd); in genpd_runtime_suspend()
1270 genpd_power_off(genpd, true, 0); in genpd_runtime_suspend()
1272 genpd_unlock(genpd); in genpd_runtime_suspend()
1287 struct generic_pm_domain *genpd; in genpd_runtime_resume() local
1297 genpd = dev_to_genpd(dev); in genpd_runtime_resume()
1298 if (IS_ERR(genpd)) in genpd_runtime_resume()
1305 if (irq_safe_dev_in_sleep_domain(dev, genpd)) in genpd_runtime_resume()
1308 genpd_lock(genpd); in genpd_runtime_resume()
1310 ret = genpd_power_on(genpd, 0); in genpd_runtime_resume()
1311 genpd_unlock(genpd); in genpd_runtime_resume()
1321 ret = genpd_start_dev(genpd, dev); in genpd_runtime_resume()
1336 genpd->gd->max_off_time_changed = true; in genpd_runtime_resume()
1344 genpd_stop_dev(genpd, dev); in genpd_runtime_resume()
1346 if (!pm_runtime_is_irq_safe(dev) || genpd_is_irq_safe(genpd)) { in genpd_runtime_resume()
1347 genpd_lock(genpd); in genpd_runtime_resume()
1348 genpd_power_off(genpd, true, 0); in genpd_runtime_resume()
1350 genpd_unlock(genpd); in genpd_runtime_resume()
1369 struct generic_pm_domain *genpd; in genpd_power_off_unused() local
1372 pr_warn("genpd: Not disabling unused power domains\n"); in genpd_power_off_unused()
1376 pr_info("genpd: Disabling unused power domains\n"); in genpd_power_off_unused()
1379 list_for_each_entry(genpd, &gpd_list, gpd_list_node) { in genpd_power_off_unused()
1380 genpd_queue_power_off_work(genpd); in genpd_power_off_unused()
1393 * @genpd: PM domain to power off, if possible.
1404 static void genpd_sync_power_off(struct generic_pm_domain *genpd, bool use_lock, in genpd_sync_power_off() argument
1409 if (!genpd_status_on(genpd) || genpd_is_always_on(genpd)) in genpd_sync_power_off()
1412 if (genpd->suspended_count != genpd->device_count in genpd_sync_power_off()
1413 || atomic_read(&genpd->sd_count) > 0) in genpd_sync_power_off()
1417 list_for_each_entry(link, &genpd->parent_links, parent_node) { in genpd_sync_power_off()
1423 if (genpd->gov && genpd->gov->system_power_down_ok) { in genpd_sync_power_off()
1424 if (!genpd->gov->system_power_down_ok(&genpd->domain)) in genpd_sync_power_off()
1428 genpd->state_idx = genpd->state_count - 1; in genpd_sync_power_off()
1431 if (_genpd_power_off(genpd, false)) { in genpd_sync_power_off()
1432 genpd->states[genpd->state_idx].rejected++; in genpd_sync_power_off()
1435 genpd->states[genpd->state_idx].usage++; in genpd_sync_power_off()
1441 if (genpd->gov && genpd->gov->system_power_down_ok) in genpd_sync_power_off()
1442 genpd->states[genpd->state_idx].usage_s2idle++; in genpd_sync_power_off()
1445 genpd->status = GENPD_STATE_OFF; in genpd_sync_power_off()
1447 list_for_each_entry(link, &genpd->child_links, child_node) { in genpd_sync_power_off()
1462 * @genpd: PM domain to power on.
1470 static void genpd_sync_power_on(struct generic_pm_domain *genpd, bool use_lock, in genpd_sync_power_on() argument
1475 if (genpd_status_on(genpd)) in genpd_sync_power_on()
1478 list_for_each_entry(link, &genpd->child_links, child_node) { in genpd_sync_power_on()
1490 _genpd_power_on(genpd, false); in genpd_sync_power_on()
1491 genpd->status = GENPD_STATE_ON; in genpd_sync_power_on()
1505 struct generic_pm_domain *genpd; in genpd_prepare() local
1510 genpd = dev_to_genpd(dev); in genpd_prepare()
1511 if (IS_ERR(genpd)) in genpd_prepare()
1514 genpd_lock(genpd); in genpd_prepare()
1515 genpd->prepared_count++; in genpd_prepare()
1516 genpd_unlock(genpd); in genpd_prepare()
1520 genpd_lock(genpd); in genpd_prepare()
1522 genpd->prepared_count--; in genpd_prepare()
1524 genpd_unlock(genpd); in genpd_prepare()
1527 /* Never return 1, as genpd don't cope with the direct_complete path. */ in genpd_prepare()
1545 struct generic_pm_domain *genpd; in genpd_finish_suspend() local
1548 genpd = dev_to_genpd(dev); in genpd_finish_suspend()
1549 if (IS_ERR(genpd)) in genpd_finish_suspend()
1556 if (device_awake_path(dev) && genpd_is_active_wakeup(genpd) && in genpd_finish_suspend()
1560 if (genpd->dev_ops.stop && genpd->dev_ops.start && in genpd_finish_suspend()
1562 ret = genpd_stop_dev(genpd, dev); in genpd_finish_suspend()
1569 genpd_lock(genpd); in genpd_finish_suspend()
1570 genpd->suspended_count++; in genpd_finish_suspend()
1571 genpd_sync_power_off(genpd, true, 0); in genpd_finish_suspend()
1572 genpd_unlock(genpd); in genpd_finish_suspend()
1603 struct generic_pm_domain *genpd; in genpd_finish_resume() local
1608 genpd = dev_to_genpd(dev); in genpd_finish_resume()
1609 if (IS_ERR(genpd)) in genpd_finish_resume()
1612 if (device_awake_path(dev) && genpd_is_active_wakeup(genpd) && in genpd_finish_resume()
1616 genpd_lock(genpd); in genpd_finish_resume()
1617 genpd_sync_power_on(genpd, true, 0); in genpd_finish_resume()
1618 genpd->suspended_count--; in genpd_finish_resume()
1619 genpd_unlock(genpd); in genpd_finish_resume()
1621 if (genpd->dev_ops.stop && genpd->dev_ops.start && in genpd_finish_resume()
1623 ret = genpd_start_dev(genpd, dev); in genpd_finish_resume()
1718 struct generic_pm_domain *genpd; in genpd_complete() local
1722 genpd = dev_to_genpd(dev); in genpd_complete()
1723 if (IS_ERR(genpd)) in genpd_complete()
1728 genpd_lock(genpd); in genpd_complete()
1730 genpd->prepared_count--; in genpd_complete()
1731 if (!genpd->prepared_count) in genpd_complete()
1732 genpd_queue_power_off_work(genpd); in genpd_complete()
1734 genpd_unlock(genpd); in genpd_complete()
1739 struct generic_pm_domain *genpd; in genpd_switch_state() local
1742 genpd = dev_to_genpd_safe(dev); in genpd_switch_state()
1743 if (!genpd) in genpd_switch_state()
1746 use_lock = genpd_is_irq_safe(genpd); in genpd_switch_state()
1749 genpd_lock(genpd); in genpd_switch_state()
1752 genpd->suspended_count++; in genpd_switch_state()
1753 genpd_sync_power_off(genpd, use_lock, 0); in genpd_switch_state()
1755 genpd_sync_power_on(genpd, use_lock, 0); in genpd_switch_state()
1756 genpd->suspended_count--; in genpd_switch_state()
1760 genpd_unlock(genpd); in genpd_switch_state()
1764 * dev_pm_genpd_suspend - Synchronously try to suspend the genpd for @dev
1765 * @dev: The device that is attached to the genpd, that can be suspended.
1770 * genpd.
1779 * dev_pm_genpd_resume - Synchronously try to resume the genpd for @dev
1780 * @dev: The device that is attached to the genpd, which needs to be resumed.
1784 * to resume a corresponding CPU device that is attached to a genpd.
1876 static void genpd_update_cpumask(struct generic_pm_domain *genpd, in genpd_update_cpumask() argument
1881 if (!genpd_is_cpu_domain(genpd)) in genpd_update_cpumask()
1884 list_for_each_entry(link, &genpd->child_links, child_node) { in genpd_update_cpumask()
1893 cpumask_set_cpu(cpu, genpd->cpus); in genpd_update_cpumask()
1895 cpumask_clear_cpu(cpu, genpd->cpus); in genpd_update_cpumask()
1898 static void genpd_set_cpumask(struct generic_pm_domain *genpd, int cpu) in genpd_set_cpumask() argument
1901 genpd_update_cpumask(genpd, cpu, true, 0); in genpd_set_cpumask()
1904 static void genpd_clear_cpumask(struct generic_pm_domain *genpd, int cpu) in genpd_clear_cpumask() argument
1907 genpd_update_cpumask(genpd, cpu, false, 0); in genpd_clear_cpumask()
1910 static int genpd_get_cpu(struct generic_pm_domain *genpd, struct device *dev) in genpd_get_cpu() argument
1914 if (!genpd_is_cpu_domain(genpd)) in genpd_get_cpu()
1925 static int genpd_add_device(struct generic_pm_domain *genpd, struct device *dev, in genpd_add_device() argument
1928 struct genpd_governor_data *gd = genpd->gd; in genpd_add_device()
1938 gpd_data->cpu = genpd_get_cpu(genpd, base_dev); in genpd_add_device()
1940 gpd_data->hw_mode = genpd->get_hwmode_dev ? genpd->get_hwmode_dev(genpd, dev) : false; in genpd_add_device()
1942 ret = genpd->attach_dev ? genpd->attach_dev(genpd, dev) : 0; in genpd_add_device()
1946 genpd_lock(genpd); in genpd_add_device()
1948 genpd_set_cpumask(genpd, gpd_data->cpu); in genpd_add_device()
1950 genpd->device_count++; in genpd_add_device()
1954 list_add_tail(&gpd_data->base.list_node, &genpd->dev_list); in genpd_add_device()
1956 genpd_unlock(genpd); in genpd_add_device()
1957 dev_pm_domain_set(dev, &genpd->domain); in genpd_add_device()
1970 * @genpd: PM domain to add the device to.
1973 int pm_genpd_add_device(struct generic_pm_domain *genpd, struct device *dev) in pm_genpd_add_device() argument
1977 if (!genpd || !dev) in pm_genpd_add_device()
1981 ret = genpd_add_device(genpd, dev, dev); in pm_genpd_add_device()
1988 static int genpd_remove_device(struct generic_pm_domain *genpd, in genpd_remove_device() argument
2002 genpd_lock(genpd); in genpd_remove_device()
2004 if (genpd->prepared_count > 0) { in genpd_remove_device()
2009 genpd->device_count--; in genpd_remove_device()
2010 if (genpd->gd) in genpd_remove_device()
2011 genpd->gd->max_off_time_changed = true; in genpd_remove_device()
2013 genpd_clear_cpumask(genpd, gpd_data->cpu); in genpd_remove_device()
2017 genpd_unlock(genpd); in genpd_remove_device()
2021 if (genpd->detach_dev) in genpd_remove_device()
2022 genpd->detach_dev(genpd, dev); in genpd_remove_device()
2029 genpd_unlock(genpd); in genpd_remove_device()
2041 struct generic_pm_domain *genpd = dev_to_genpd_safe(dev); in pm_genpd_remove_device() local
2043 if (!genpd) in pm_genpd_remove_device()
2046 return genpd_remove_device(genpd, dev); in pm_genpd_remove_device()
2051 * dev_pm_genpd_add_notifier - Add a genpd power on/off notifier for @dev
2056 * Users may call this function to add a genpd power on/off notifier for an
2058 * sent when genpd is powering on/off the PM domain.
2060 * It is assumed that the user guarantee that the genpd wouldn't be detached
2067 struct generic_pm_domain *genpd; in dev_pm_genpd_add_notifier() local
2071 genpd = dev_to_genpd_safe(dev); in dev_pm_genpd_add_notifier()
2072 if (!genpd) in dev_pm_genpd_add_notifier()
2083 genpd_lock(genpd); in dev_pm_genpd_add_notifier()
2084 ret = raw_notifier_chain_register(&genpd->power_notifiers, nb); in dev_pm_genpd_add_notifier()
2085 genpd_unlock(genpd); in dev_pm_genpd_add_notifier()
2089 dev_name(&genpd->dev)); in dev_pm_genpd_add_notifier()
2099 * dev_pm_genpd_remove_notifier - Remove a genpd power on/off notifier for @dev
2103 * Users may call this function to remove a genpd power on/off notifier for an
2106 * It is assumed that the user guarantee that the genpd wouldn't be detached
2113 struct generic_pm_domain *genpd; in dev_pm_genpd_remove_notifier() local
2117 genpd = dev_to_genpd_safe(dev); in dev_pm_genpd_remove_notifier()
2118 if (!genpd) in dev_pm_genpd_remove_notifier()
2129 genpd_lock(genpd); in dev_pm_genpd_remove_notifier()
2130 ret = raw_notifier_chain_unregister(&genpd->power_notifiers, in dev_pm_genpd_remove_notifier()
2132 genpd_unlock(genpd); in dev_pm_genpd_remove_notifier()
2136 dev_name(&genpd->dev)); in dev_pm_genpd_remove_notifier()
2145 static int genpd_add_subdomain(struct generic_pm_domain *genpd, in genpd_add_subdomain() argument
2151 if (IS_ERR_OR_NULL(genpd) || IS_ERR_OR_NULL(subdomain) in genpd_add_subdomain()
2152 || genpd == subdomain) in genpd_add_subdomain()
2160 if (!genpd_is_irq_safe(genpd) && genpd_is_irq_safe(subdomain)) { in genpd_add_subdomain()
2162 dev_name(&genpd->dev), subdomain->name); in genpd_add_subdomain()
2171 genpd_lock_nested(genpd, SINGLE_DEPTH_NESTING); in genpd_add_subdomain()
2173 if (!genpd_status_on(genpd) && genpd_status_on(subdomain)) { in genpd_add_subdomain()
2178 list_for_each_entry(itr, &genpd->parent_links, parent_node) { in genpd_add_subdomain()
2179 if (itr->child == subdomain && itr->parent == genpd) { in genpd_add_subdomain()
2185 link->parent = genpd; in genpd_add_subdomain()
2186 list_add_tail(&link->parent_node, &genpd->parent_links); in genpd_add_subdomain()
2190 genpd_sd_counter_inc(genpd); in genpd_add_subdomain()
2193 genpd_unlock(genpd); in genpd_add_subdomain()
2202 * @genpd: Leader PM domain to add the subdomain to.
2205 int pm_genpd_add_subdomain(struct generic_pm_domain *genpd, in pm_genpd_add_subdomain() argument
2211 ret = genpd_add_subdomain(genpd, subdomain); in pm_genpd_add_subdomain()
2220 * @genpd: Leader PM domain to remove the subdomain from.
2223 int pm_genpd_remove_subdomain(struct generic_pm_domain *genpd, in pm_genpd_remove_subdomain() argument
2229 if (IS_ERR_OR_NULL(genpd) || IS_ERR_OR_NULL(subdomain)) in pm_genpd_remove_subdomain()
2233 genpd_lock_nested(genpd, SINGLE_DEPTH_NESTING); in pm_genpd_remove_subdomain()
2237 dev_name(&genpd->dev), subdomain->name); in pm_genpd_remove_subdomain()
2242 list_for_each_entry_safe(link, l, &genpd->parent_links, parent_node) { in pm_genpd_remove_subdomain()
2250 genpd_sd_counter_dec(genpd); in pm_genpd_remove_subdomain()
2257 genpd_unlock(genpd); in pm_genpd_remove_subdomain()
2270 static int genpd_set_default_power_state(struct generic_pm_domain *genpd) in genpd_set_default_power_state() argument
2278 genpd->states = state; in genpd_set_default_power_state()
2279 genpd->state_count = 1; in genpd_set_default_power_state()
2280 genpd->free_states = genpd_free_default_power_state; in genpd_set_default_power_state()
2290 static int genpd_alloc_data(struct generic_pm_domain *genpd) in genpd_alloc_data() argument
2295 if (genpd_is_cpu_domain(genpd) && in genpd_alloc_data()
2296 !zalloc_cpumask_var(&genpd->cpus, GFP_KERNEL)) in genpd_alloc_data()
2299 if (genpd->gov) { in genpd_alloc_data()
2313 if (genpd->state_count == 0) { in genpd_alloc_data()
2314 ret = genpd_set_default_power_state(genpd); in genpd_alloc_data()
2319 genpd->gd = gd; in genpd_alloc_data()
2320 device_initialize(&genpd->dev); in genpd_alloc_data()
2321 genpd->dev.release = genpd_provider_release; in genpd_alloc_data()
2322 genpd->dev.bus = &genpd_provider_bus_type; in genpd_alloc_data()
2324 if (!genpd_is_dev_name_fw(genpd)) { in genpd_alloc_data()
2325 dev_set_name(&genpd->dev, "%s", genpd->name); in genpd_alloc_data()
2331 genpd->device_id = ret; in genpd_alloc_data()
2332 dev_set_name(&genpd->dev, "%s_%u", genpd->name, genpd->device_id); in genpd_alloc_data()
2337 put_device(&genpd->dev); in genpd_alloc_data()
2338 if (genpd->free_states == genpd_free_default_power_state) { in genpd_alloc_data()
2339 kfree(genpd->states); in genpd_alloc_data()
2340 genpd->states = NULL; in genpd_alloc_data()
2343 if (genpd_is_cpu_domain(genpd)) in genpd_alloc_data()
2344 free_cpumask_var(genpd->cpus); in genpd_alloc_data()
2349 static void genpd_free_data(struct generic_pm_domain *genpd) in genpd_free_data() argument
2351 put_device(&genpd->dev); in genpd_free_data()
2352 if (genpd->device_id != -ENXIO) in genpd_free_data()
2353 ida_free(&genpd_ida, genpd->device_id); in genpd_free_data()
2354 if (genpd_is_cpu_domain(genpd)) in genpd_free_data()
2355 free_cpumask_var(genpd->cpus); in genpd_free_data()
2356 if (genpd->free_states) in genpd_free_data()
2357 genpd->free_states(genpd->states, genpd->state_count); in genpd_free_data()
2358 kfree(genpd->gd); in genpd_free_data()
2361 static void genpd_lock_init(struct generic_pm_domain *genpd) in genpd_lock_init() argument
2363 if (genpd_is_cpu_domain(genpd)) { in genpd_lock_init()
2364 raw_spin_lock_init(&genpd->raw_slock); in genpd_lock_init()
2365 genpd->lock_ops = &genpd_raw_spin_ops; in genpd_lock_init()
2366 } else if (genpd_is_irq_safe(genpd)) { in genpd_lock_init()
2367 spin_lock_init(&genpd->slock); in genpd_lock_init()
2368 genpd->lock_ops = &genpd_spin_ops; in genpd_lock_init()
2370 mutex_init(&genpd->mlock); in genpd_lock_init()
2371 genpd->lock_ops = &genpd_mtx_ops; in genpd_lock_init()
2376 static void genpd_set_stay_on(struct generic_pm_domain *genpd, bool is_off) in genpd_set_stay_on() argument
2378 genpd->stay_on = !genpd_is_no_stay_on(genpd) && !is_off; in genpd_set_stay_on()
2381 static void genpd_set_stay_on(struct generic_pm_domain *genpd, bool is_off) in genpd_set_stay_on() argument
2383 genpd->stay_on = false; in genpd_set_stay_on()
2389 * @genpd: PM domain object to initialize.
2395 int pm_genpd_init(struct generic_pm_domain *genpd, in pm_genpd_init() argument
2400 if (IS_ERR_OR_NULL(genpd)) in pm_genpd_init()
2403 INIT_LIST_HEAD(&genpd->parent_links); in pm_genpd_init()
2404 INIT_LIST_HEAD(&genpd->child_links); in pm_genpd_init()
2405 INIT_LIST_HEAD(&genpd->dev_list); in pm_genpd_init()
2406 RAW_INIT_NOTIFIER_HEAD(&genpd->power_notifiers); in pm_genpd_init()
2407 genpd_lock_init(genpd); in pm_genpd_init()
2408 genpd->gov = gov; in pm_genpd_init()
2409 INIT_WORK(&genpd->power_off_work, genpd_power_off_work_fn); in pm_genpd_init()
2410 atomic_set(&genpd->sd_count, 0); in pm_genpd_init()
2411 genpd->status = is_off ? GENPD_STATE_OFF : GENPD_STATE_ON; in pm_genpd_init()
2412 genpd_set_stay_on(genpd, is_off); in pm_genpd_init()
2413 genpd->sync_state = GENPD_SYNC_STATE_OFF; in pm_genpd_init()
2414 genpd->device_count = 0; in pm_genpd_init()
2415 genpd->provider = NULL; in pm_genpd_init()
2416 genpd->device_id = -ENXIO; in pm_genpd_init()
2417 genpd->has_provider = false; in pm_genpd_init()
2418 genpd->opp_table = NULL; in pm_genpd_init()
2419 genpd->accounting_time = ktime_get_mono_fast_ns(); in pm_genpd_init()
2420 genpd->domain.ops.runtime_suspend = genpd_runtime_suspend; in pm_genpd_init()
2421 genpd->domain.ops.runtime_resume = genpd_runtime_resume; in pm_genpd_init()
2422 genpd->domain.ops.prepare = genpd_prepare; in pm_genpd_init()
2423 genpd->domain.ops.suspend_noirq = genpd_suspend_noirq; in pm_genpd_init()
2424 genpd->domain.ops.resume_noirq = genpd_resume_noirq; in pm_genpd_init()
2425 genpd->domain.ops.freeze_noirq = genpd_freeze_noirq; in pm_genpd_init()
2426 genpd->domain.ops.thaw_noirq = genpd_thaw_noirq; in pm_genpd_init()
2427 genpd->domain.ops.poweroff_noirq = genpd_poweroff_noirq; in pm_genpd_init()
2428 genpd->domain.ops.restore_noirq = genpd_restore_noirq; in pm_genpd_init()
2429 genpd->domain.ops.complete = genpd_complete; in pm_genpd_init()
2430 genpd->domain.start = genpd_dev_pm_start; in pm_genpd_init()
2431 genpd->domain.set_performance_state = genpd_dev_pm_set_performance_state; in pm_genpd_init()
2433 if (genpd->flags & GENPD_FLAG_PM_CLK) { in pm_genpd_init()
2434 genpd->dev_ops.stop = pm_clk_suspend; in pm_genpd_init()
2435 genpd->dev_ops.start = pm_clk_resume; in pm_genpd_init()
2440 genpd->flags |= GENPD_FLAG_RPM_ALWAYS_ON; in pm_genpd_init()
2443 if ((genpd_is_always_on(genpd) || genpd_is_rpm_always_on(genpd)) && in pm_genpd_init()
2444 !genpd_status_on(genpd)) { in pm_genpd_init()
2445 pr_err("always-on PM domain %s is not on\n", genpd->name); in pm_genpd_init()
2450 if (!gov && genpd->state_count > 1) in pm_genpd_init()
2451 pr_warn("%s: no governor for states\n", genpd->name); in pm_genpd_init()
2453 ret = genpd_alloc_data(genpd); in pm_genpd_init()
2458 list_add(&genpd->gpd_list_node, &gpd_list); in pm_genpd_init()
2460 genpd_debug_add(genpd); in pm_genpd_init()
2466 static int genpd_remove(struct generic_pm_domain *genpd) in genpd_remove() argument
2470 if (IS_ERR_OR_NULL(genpd)) in genpd_remove()
2473 genpd_lock(genpd); in genpd_remove()
2475 if (genpd->has_provider) { in genpd_remove()
2476 genpd_unlock(genpd); in genpd_remove()
2477 pr_err("Provider present, unable to remove %s\n", dev_name(&genpd->dev)); in genpd_remove()
2481 if (!list_empty(&genpd->parent_links) || genpd->device_count) { in genpd_remove()
2482 genpd_unlock(genpd); in genpd_remove()
2483 pr_err("%s: unable to remove %s\n", __func__, dev_name(&genpd->dev)); in genpd_remove()
2487 list_for_each_entry_safe(link, l, &genpd->child_links, child_node) { in genpd_remove()
2493 list_del(&genpd->gpd_list_node); in genpd_remove()
2494 genpd_unlock(genpd); in genpd_remove()
2495 genpd_debug_remove(genpd); in genpd_remove()
2496 cancel_work_sync(&genpd->power_off_work); in genpd_remove()
2497 genpd_free_data(genpd); in genpd_remove()
2499 pr_debug("%s: removed %s\n", __func__, dev_name(&genpd->dev)); in genpd_remove()
2506 * @genpd: Pointer to PM domain that is to be removed.
2517 int pm_genpd_remove(struct generic_pm_domain *genpd) in pm_genpd_remove() argument
2522 ret = genpd_remove(genpd); in pm_genpd_remove()
2648 static bool genpd_present(const struct generic_pm_domain *genpd) in genpd_present() argument
2655 if (gpd == genpd) { in genpd_present()
2673 * @genpd: Pointer to PM domain associated with the PM domain provider.
2676 struct generic_pm_domain *genpd) in of_genpd_add_provider_simple() argument
2682 if (!np || !genpd) in of_genpd_add_provider_simple()
2688 if (!genpd_present(genpd)) in of_genpd_add_provider_simple()
2691 genpd->dev.parent = genpd_provider_bus; in of_genpd_add_provider_simple()
2692 genpd->dev.of_node = np; in of_genpd_add_provider_simple()
2696 if (!dev && !genpd_is_no_sync_state(genpd)) { in of_genpd_add_provider_simple()
2697 genpd->sync_state = GENPD_SYNC_STATE_SIMPLE; in of_genpd_add_provider_simple()
2698 device_set_node(&genpd->dev, fwnode); in of_genpd_add_provider_simple()
2705 ret = device_add(&genpd->dev); in of_genpd_add_provider_simple()
2709 /* Parse genpd OPP table */ in of_genpd_add_provider_simple()
2710 if (!genpd_is_opp_table_fw(genpd) && genpd->set_performance_state) { in of_genpd_add_provider_simple()
2711 ret = dev_pm_opp_of_add_table(&genpd->dev); in of_genpd_add_provider_simple()
2713 dev_err_probe(&genpd->dev, ret, "Failed to add OPP table\n"); in of_genpd_add_provider_simple()
2721 genpd->opp_table = dev_pm_opp_get_opp_table(&genpd->dev); in of_genpd_add_provider_simple()
2722 WARN_ON(IS_ERR(genpd->opp_table)); in of_genpd_add_provider_simple()
2725 ret = genpd_add_provider(np, genpd_xlate_simple, genpd); in of_genpd_add_provider_simple()
2729 genpd->provider = fwnode; in of_genpd_add_provider_simple()
2730 genpd->has_provider = true; in of_genpd_add_provider_simple()
2735 if (genpd->opp_table) { in of_genpd_add_provider_simple()
2736 dev_pm_opp_put_opp_table(genpd->opp_table); in of_genpd_add_provider_simple()
2737 dev_pm_opp_of_remove_table(&genpd->dev); in of_genpd_add_provider_simple()
2740 device_del(&genpd->dev); in of_genpd_add_provider_simple()
2753 struct generic_pm_domain *genpd; in of_genpd_add_provider_onecell() local
2779 genpd = data->domains[i]; in of_genpd_add_provider_onecell()
2781 if (!genpd) in of_genpd_add_provider_onecell()
2783 if (!genpd_present(genpd)) in of_genpd_add_provider_onecell()
2786 genpd->dev.parent = genpd_provider_bus; in of_genpd_add_provider_onecell()
2787 genpd->dev.of_node = np; in of_genpd_add_provider_onecell()
2789 if (sync_state && !genpd_is_no_sync_state(genpd)) { in of_genpd_add_provider_onecell()
2790 genpd->sync_state = GENPD_SYNC_STATE_ONECELL; in of_genpd_add_provider_onecell()
2791 device_set_node(&genpd->dev, fwnode); in of_genpd_add_provider_onecell()
2795 ret = device_add(&genpd->dev); in of_genpd_add_provider_onecell()
2799 /* Parse genpd OPP table */ in of_genpd_add_provider_onecell()
2800 if (!genpd_is_opp_table_fw(genpd) && genpd->set_performance_state) { in of_genpd_add_provider_onecell()
2801 ret = dev_pm_opp_of_add_table_indexed(&genpd->dev, i); in of_genpd_add_provider_onecell()
2803 dev_err_probe(&genpd->dev, ret, in of_genpd_add_provider_onecell()
2805 device_del(&genpd->dev); in of_genpd_add_provider_onecell()
2813 genpd->opp_table = dev_pm_opp_get_opp_table(&genpd->dev); in of_genpd_add_provider_onecell()
2814 WARN_ON(IS_ERR(genpd->opp_table)); in of_genpd_add_provider_onecell()
2817 genpd->provider = fwnode; in of_genpd_add_provider_onecell()
2818 genpd->has_provider = true; in of_genpd_add_provider_onecell()
2829 genpd = data->domains[i]; in of_genpd_add_provider_onecell()
2831 if (!genpd) in of_genpd_add_provider_onecell()
2834 genpd->provider = NULL; in of_genpd_add_provider_onecell()
2835 genpd->has_provider = false; in of_genpd_add_provider_onecell()
2837 if (genpd->opp_table) { in of_genpd_add_provider_onecell()
2838 dev_pm_opp_put_opp_table(genpd->opp_table); in of_genpd_add_provider_onecell()
2839 dev_pm_opp_of_remove_table(&genpd->dev); in of_genpd_add_provider_onecell()
2842 device_del(&genpd->dev); in of_genpd_add_provider_onecell()
2906 struct generic_pm_domain *genpd = ERR_PTR(-ENOENT); in genpd_get_from_provider() local
2917 genpd = provider->xlate(genpdspec, provider->data); in genpd_get_from_provider()
2918 if (!IS_ERR(genpd)) in genpd_get_from_provider()
2924 return genpd; in genpd_get_from_provider()
3104 struct generic_pm_domain *genpd; in of_genpd_add_device() local
3112 genpd = genpd_get_from_provider(genpdspec); in of_genpd_add_device()
3113 if (IS_ERR(genpd)) { in of_genpd_add_device()
3114 ret = PTR_ERR(genpd); in of_genpd_add_device()
3118 ret = genpd_add_device(genpd, dev, dev); in of_genpd_add_device()
3218 struct generic_pm_domain *gpd, *tmp, *genpd = ERR_PTR(-ENOENT); in of_genpd_remove_last() local
3228 genpd = ret ? ERR_PTR(ret) : gpd; in of_genpd_remove_last()
3234 return genpd; in of_genpd_remove_last()
3245 .name = "genpd",
3269 /* Check if the device was created by genpd at attach. */ in genpd_dev_pm_detach()
3300 /* Unregister the device if it was created by genpd. */ in genpd_dev_pm_detach()
3500 /* Allocate and register device on the genpd bus. */ in genpd_dev_pm_attach_by_id()
3505 dev_set_name(virt_dev, "genpd:%u:%s", index, dev_name(dev)); in genpd_dev_pm_attach_by_id()
3632 * of_genpd_parse_idle_states: Return array of idle states for the genpd.
3634 * @dn: The genpd device node
3677 * of_genpd_sync_state() - A common sync_state function for genpd providers
3678 * @np: The device node the genpd provider is associated with.
3680 * The @np that corresponds to a genpd provider may provide one or multiple
3682 * provider. For each genpd we try a power-off.
3686 struct generic_pm_domain *genpd; in of_genpd_sync_state() local
3692 list_for_each_entry(genpd, &gpd_list, gpd_list_node) { in of_genpd_sync_state()
3693 if (genpd->provider == of_fwnode_handle(np)) { in of_genpd_sync_state()
3694 genpd_lock(genpd); in of_genpd_sync_state()
3695 genpd->stay_on = false; in of_genpd_sync_state()
3696 genpd_power_off(genpd, false, 0); in of_genpd_sync_state()
3697 genpd_unlock(genpd); in of_genpd_sync_state()
3711 struct generic_pm_domain *genpd = container_of(dev, struct generic_pm_domain, dev); in genpd_provider_sync_state() local
3713 switch (genpd->sync_state) { in genpd_provider_sync_state()
3722 genpd_lock(genpd); in genpd_provider_sync_state()
3723 genpd->stay_on = false; in genpd_provider_sync_state()
3724 genpd_power_off(genpd, false, 0); in genpd_provider_sync_state()
3725 genpd_unlock(genpd); in genpd_provider_sync_state()
3825 struct generic_pm_domain *genpd) in genpd_summary_one() argument
3836 ret = genpd_lock_interruptible(genpd); in genpd_summary_one()
3840 if (WARN_ON(genpd->status >= ARRAY_SIZE(status_lookup))) in genpd_summary_one()
3842 if (!genpd_status_on(genpd)) in genpd_summary_one()
3844 status_lookup[genpd->status], genpd->state_idx); in genpd_summary_one()
3847 status_lookup[genpd->status]); in genpd_summary_one()
3848 seq_printf(s, "%-30s %-30s %u", dev_name(&genpd->dev), state, genpd->performance_state); in genpd_summary_one()
3855 list_for_each_entry(link, &genpd->parent_links, parent_node) { in genpd_summary_one()
3856 if (list_is_first(&link->parent_node, &genpd->parent_links)) in genpd_summary_one()
3859 if (!list_is_last(&link->parent_node, &genpd->parent_links)) in genpd_summary_one()
3863 list_for_each_entry(pm_data, &genpd->dev_list, list_node) { in genpd_summary_one()
3872 genpd_unlock(genpd); in genpd_summary_one()
3879 struct generic_pm_domain *genpd; in summary_show() local
3890 list_for_each_entry(genpd, &gpd_list, gpd_list_node) { in summary_show()
3891 ret = genpd_summary_one(s, genpd); in summary_show()
3907 struct generic_pm_domain *genpd = s->private; in status_show() local
3910 ret = genpd_lock_interruptible(genpd); in status_show()
3914 if (WARN_ON_ONCE(genpd->status >= ARRAY_SIZE(status_lookup))) in status_show()
3917 if (genpd->status == GENPD_STATE_OFF) in status_show()
3918 seq_printf(s, "%s-%u\n", status_lookup[genpd->status], in status_show()
3919 genpd->state_idx); in status_show()
3921 seq_printf(s, "%s\n", status_lookup[genpd->status]); in status_show()
3923 genpd_unlock(genpd); in status_show()
3929 struct generic_pm_domain *genpd = s->private; in sub_domains_show() local
3933 ret = genpd_lock_interruptible(genpd); in sub_domains_show()
3937 list_for_each_entry(link, &genpd->parent_links, parent_node) in sub_domains_show()
3940 genpd_unlock(genpd); in sub_domains_show()
3946 struct generic_pm_domain *genpd = s->private; in idle_states_show() local
3951 ret = genpd_lock_interruptible(genpd); in idle_states_show()
3957 for (i = 0; i < genpd->state_count; i++) { in idle_states_show()
3958 struct genpd_power_state *state = &genpd->states[i]; in idle_states_show()
3963 if (genpd->status == GENPD_STATE_OFF && genpd->state_idx == i) { in idle_states_show()
3965 if (now > genpd->accounting_time) { in idle_states_show()
3966 delta = now - genpd->accounting_time; in idle_states_show()
3978 genpd_unlock(genpd); in idle_states_show()
3984 struct generic_pm_domain *genpd = s->private; in idle_states_desc_show() local
3988 ret = genpd_lock_interruptible(genpd); in idle_states_desc_show()
3994 for (i = 0; i < genpd->state_count; i++) { in idle_states_desc_show()
3995 struct genpd_power_state *state = &genpd->states[i]; in idle_states_desc_show()
4012 genpd_unlock(genpd); in idle_states_desc_show()
4018 struct generic_pm_domain *genpd = s->private; in active_time_show() local
4022 ret = genpd_lock_interruptible(genpd); in active_time_show()
4026 if (genpd->status == GENPD_STATE_ON) { in active_time_show()
4028 if (now > genpd->accounting_time) in active_time_show()
4029 delta = now - genpd->accounting_time; in active_time_show()
4032 on_time = genpd->on_time + delta; in active_time_show()
4036 genpd_unlock(genpd); in active_time_show()
4042 struct generic_pm_domain *genpd = s->private; in total_idle_time_show() local
4047 ret = genpd_lock_interruptible(genpd); in total_idle_time_show()
4051 for (i = 0; i < genpd->state_count; i++) { in total_idle_time_show()
4052 total += genpd->states[i].idle_time; in total_idle_time_show()
4054 if (genpd->status == GENPD_STATE_OFF && genpd->state_idx == i) { in total_idle_time_show()
4056 if (now > genpd->accounting_time) { in total_idle_time_show()
4057 delta = now - genpd->accounting_time; in total_idle_time_show()
4066 genpd_unlock(genpd); in total_idle_time_show()
4073 struct generic_pm_domain *genpd = s->private; in devices_show() local
4077 ret = genpd_lock_interruptible(genpd); in devices_show()
4081 list_for_each_entry(pm_data, &genpd->dev_list, list_node) in devices_show()
4084 genpd_unlock(genpd); in devices_show()
4090 struct generic_pm_domain *genpd = s->private; in perf_state_show() local
4092 if (genpd_lock_interruptible(genpd)) in perf_state_show()
4095 seq_printf(s, "%u\n", genpd->performance_state); in perf_state_show()
4097 genpd_unlock(genpd); in perf_state_show()
4111 static void genpd_debug_add(struct generic_pm_domain *genpd) in genpd_debug_add() argument
4118 d = debugfs_create_dir(dev_name(&genpd->dev), genpd_debugfs_dir); in genpd_debug_add()
4121 d, genpd, &status_fops); in genpd_debug_add()
4123 d, genpd, &sub_domains_fops); in genpd_debug_add()
4125 d, genpd, &idle_states_fops); in genpd_debug_add()
4127 d, genpd, &idle_states_desc_fops); in genpd_debug_add()
4129 d, genpd, &active_time_fops); in genpd_debug_add()
4131 d, genpd, &total_idle_time_fops); in genpd_debug_add()
4133 d, genpd, &devices_fops); in genpd_debug_add()
4134 if (genpd->set_performance_state) in genpd_debug_add()
4136 d, genpd, &perf_state_fops); in genpd_debug_add()
4141 struct generic_pm_domain *genpd; in genpd_debug_init() local
4148 list_for_each_entry(genpd, &gpd_list, gpd_list_node) in genpd_debug_init()
4149 genpd_debug_add(genpd); in genpd_debug_init()