Lines Matching refs:genpd

22 #define GENPD_DEV_CALLBACK(genpd, type, callback, dev)		\  argument
27 __routine = genpd->dev_ops.callback; \
34 #define GENPD_DEV_TIMED_CALLBACK(genpd, type, callback, dev, field, name) \ argument
37 type __retval = GENPD_DEV_CALLBACK(genpd, type, callback, dev); \
44 genpd->max_off_time_changed = true; \
55 struct generic_pm_domain *genpd = NULL, *gpd; in pm_genpd_lookup_name() local
63 genpd = gpd; in pm_genpd_lookup_name()
68 return genpd; in pm_genpd_lookup_name()
79 struct generic_pm_domain *genpd = NULL, *gpd; in pm_genpd_lookup_dev() local
87 genpd = gpd; in pm_genpd_lookup_dev()
93 return genpd; in pm_genpd_lookup_dev()
108 static int genpd_stop_dev(struct generic_pm_domain *genpd, struct device *dev) in genpd_stop_dev() argument
110 return GENPD_DEV_TIMED_CALLBACK(genpd, int, stop, dev, in genpd_stop_dev()
114 static int genpd_start_dev(struct generic_pm_domain *genpd, struct device *dev) in genpd_start_dev() argument
116 return GENPD_DEV_TIMED_CALLBACK(genpd, int, start, dev, in genpd_start_dev()
120 static bool genpd_sd_counter_dec(struct generic_pm_domain *genpd) in genpd_sd_counter_dec() argument
124 if (!WARN_ON(atomic_read(&genpd->sd_count) == 0)) in genpd_sd_counter_dec()
125 ret = !!atomic_dec_and_test(&genpd->sd_count); in genpd_sd_counter_dec()
130 static void genpd_sd_counter_inc(struct generic_pm_domain *genpd) in genpd_sd_counter_inc() argument
132 atomic_inc(&genpd->sd_count); in genpd_sd_counter_inc()
136 static void genpd_acquire_lock(struct generic_pm_domain *genpd) in genpd_acquire_lock() argument
140 mutex_lock(&genpd->lock); in genpd_acquire_lock()
146 prepare_to_wait(&genpd->status_wait_queue, &wait, in genpd_acquire_lock()
148 if (genpd->status == GPD_STATE_ACTIVE in genpd_acquire_lock()
149 || genpd->status == GPD_STATE_POWER_OFF) in genpd_acquire_lock()
151 mutex_unlock(&genpd->lock); in genpd_acquire_lock()
155 mutex_lock(&genpd->lock); in genpd_acquire_lock()
157 finish_wait(&genpd->status_wait_queue, &wait); in genpd_acquire_lock()
160 static void genpd_release_lock(struct generic_pm_domain *genpd) in genpd_release_lock() argument
162 mutex_unlock(&genpd->lock); in genpd_release_lock()
165 static void genpd_set_active(struct generic_pm_domain *genpd) in genpd_set_active() argument
167 if (genpd->resume_count == 0) in genpd_set_active()
168 genpd->status = GPD_STATE_ACTIVE; in genpd_set_active()
171 static void genpd_recalc_cpu_exit_latency(struct generic_pm_domain *genpd) in genpd_recalc_cpu_exit_latency() argument
175 if (!genpd->cpuidle_data) in genpd_recalc_cpu_exit_latency()
178 usecs64 = genpd->power_on_latency_ns; in genpd_recalc_cpu_exit_latency()
180 usecs64 += genpd->cpuidle_data->saved_exit_latency; in genpd_recalc_cpu_exit_latency()
181 genpd->cpuidle_data->idle_state->exit_latency = usecs64; in genpd_recalc_cpu_exit_latency()
184 static int genpd_power_on(struct generic_pm_domain *genpd) in genpd_power_on() argument
190 if (!genpd->power_on) in genpd_power_on()
194 ret = genpd->power_on(genpd); in genpd_power_on()
199 if (elapsed_ns <= genpd->power_on_latency_ns) in genpd_power_on()
202 genpd->power_on_latency_ns = elapsed_ns; in genpd_power_on()
203 genpd->max_off_time_changed = true; in genpd_power_on()
204 genpd_recalc_cpu_exit_latency(genpd); in genpd_power_on()
206 genpd->name, "on", elapsed_ns); in genpd_power_on()
211 static int genpd_power_off(struct generic_pm_domain *genpd) in genpd_power_off() argument
217 if (!genpd->power_off) in genpd_power_off()
221 ret = genpd->power_off(genpd); in genpd_power_off()
226 if (elapsed_ns <= genpd->power_off_latency_ns) in genpd_power_off()
229 genpd->power_off_latency_ns = elapsed_ns; in genpd_power_off()
230 genpd->max_off_time_changed = true; in genpd_power_off()
232 genpd->name, "off", elapsed_ns); in genpd_power_off()
244 static int __pm_genpd_poweron(struct generic_pm_domain *genpd) in __pm_genpd_poweron() argument
245 __releases(&genpd->lock) __acquires(&genpd->lock) in __pm_genpd_poweron()
253 prepare_to_wait(&genpd->status_wait_queue, &wait, in __pm_genpd_poweron()
255 if (genpd->status != GPD_STATE_WAIT_MASTER) in __pm_genpd_poweron()
257 mutex_unlock(&genpd->lock); in __pm_genpd_poweron()
261 mutex_lock(&genpd->lock); in __pm_genpd_poweron()
263 finish_wait(&genpd->status_wait_queue, &wait); in __pm_genpd_poweron()
265 if (genpd->status == GPD_STATE_ACTIVE in __pm_genpd_poweron()
266 || (genpd->prepared_count > 0 && genpd->suspend_power_off)) in __pm_genpd_poweron()
269 if (genpd->status != GPD_STATE_POWER_OFF) { in __pm_genpd_poweron()
270 genpd_set_active(genpd); in __pm_genpd_poweron()
274 if (genpd->cpuidle_data) { in __pm_genpd_poweron()
276 genpd->cpuidle_data->idle_state->disabled = true; in __pm_genpd_poweron()
286 list_for_each_entry(link, &genpd->slave_links, slave_node) { in __pm_genpd_poweron()
288 genpd->status = GPD_STATE_WAIT_MASTER; in __pm_genpd_poweron()
290 mutex_unlock(&genpd->lock); in __pm_genpd_poweron()
294 mutex_lock(&genpd->lock); in __pm_genpd_poweron()
300 genpd->status = GPD_STATE_POWER_OFF; in __pm_genpd_poweron()
301 wake_up_all(&genpd->status_wait_queue); in __pm_genpd_poweron()
308 ret = genpd_power_on(genpd); in __pm_genpd_poweron()
313 genpd_set_active(genpd); in __pm_genpd_poweron()
318 list_for_each_entry_continue_reverse(link, &genpd->slave_links, slave_node) in __pm_genpd_poweron()
328 int pm_genpd_poweron(struct generic_pm_domain *genpd) in pm_genpd_poweron() argument
332 mutex_lock(&genpd->lock); in pm_genpd_poweron()
333 ret = __pm_genpd_poweron(genpd); in pm_genpd_poweron()
334 mutex_unlock(&genpd->lock); in pm_genpd_poweron()
344 struct generic_pm_domain *genpd; in pm_genpd_name_poweron() local
346 genpd = pm_genpd_lookup_name(domain_name); in pm_genpd_name_poweron()
347 return genpd ? pm_genpd_poweron(genpd) : -EINVAL; in pm_genpd_name_poweron()
350 static int genpd_start_dev_no_timing(struct generic_pm_domain *genpd, in genpd_start_dev_no_timing() argument
353 return GENPD_DEV_CALLBACK(genpd, int, start, dev); in genpd_start_dev_no_timing()
356 static int genpd_save_dev(struct generic_pm_domain *genpd, struct device *dev) in genpd_save_dev() argument
358 return GENPD_DEV_TIMED_CALLBACK(genpd, int, save_state, dev, in genpd_save_dev()
362 static int genpd_restore_dev(struct generic_pm_domain *genpd, struct device *dev) in genpd_restore_dev() argument
364 return GENPD_DEV_TIMED_CALLBACK(genpd, int, restore_state, dev, in genpd_restore_dev()
379 struct generic_pm_domain *genpd; in genpd_dev_pm_qos_notifier() local
388 genpd = dev_to_genpd(dev); in genpd_dev_pm_qos_notifier()
390 genpd = ERR_PTR(-ENODATA); in genpd_dev_pm_qos_notifier()
395 if (!IS_ERR(genpd)) { in genpd_dev_pm_qos_notifier()
396 mutex_lock(&genpd->lock); in genpd_dev_pm_qos_notifier()
397 genpd->max_off_time_changed = true; in genpd_dev_pm_qos_notifier()
398 mutex_unlock(&genpd->lock); in genpd_dev_pm_qos_notifier()
415 struct generic_pm_domain *genpd) in __pm_genpd_save_device() argument
416 __releases(&genpd->lock) __acquires(&genpd->lock) in __pm_genpd_save_device()
435 mutex_unlock(&genpd->lock); in __pm_genpd_save_device()
437 genpd_start_dev(genpd, dev); in __pm_genpd_save_device()
438 ret = genpd_save_dev(genpd, dev); in __pm_genpd_save_device()
439 genpd_stop_dev(genpd, dev); in __pm_genpd_save_device()
441 mutex_lock(&genpd->lock); in __pm_genpd_save_device()
455 struct generic_pm_domain *genpd) in __pm_genpd_restore_device() argument
456 __releases(&genpd->lock) __acquires(&genpd->lock) in __pm_genpd_restore_device()
463 mutex_unlock(&genpd->lock); in __pm_genpd_restore_device()
465 genpd_start_dev(genpd, dev); in __pm_genpd_restore_device()
472 genpd_restore_dev(genpd, dev); in __pm_genpd_restore_device()
474 mutex_lock(&genpd->lock); in __pm_genpd_restore_device()
486 static bool genpd_abort_poweroff(struct generic_pm_domain *genpd) in genpd_abort_poweroff() argument
488 return genpd->status == GPD_STATE_WAIT_MASTER in genpd_abort_poweroff()
489 || genpd->status == GPD_STATE_ACTIVE || genpd->resume_count > 0; in genpd_abort_poweroff()
499 static void genpd_queue_power_off_work(struct generic_pm_domain *genpd) in genpd_queue_power_off_work() argument
501 queue_work(pm_wq, &genpd->power_off_work); in genpd_queue_power_off_work()
512 static int pm_genpd_poweroff(struct generic_pm_domain *genpd) in pm_genpd_poweroff() argument
513 __releases(&genpd->lock) __acquires(&genpd->lock) in pm_genpd_poweroff()
528 if (genpd->status == GPD_STATE_POWER_OFF in pm_genpd_poweroff()
529 || genpd->status == GPD_STATE_WAIT_MASTER in pm_genpd_poweroff()
530 || genpd->resume_count > 0 || genpd->prepared_count > 0) in pm_genpd_poweroff()
533 if (atomic_read(&genpd->sd_count) > 0) in pm_genpd_poweroff()
537 list_for_each_entry(pdd, &genpd->dev_list, list_node) { in pm_genpd_poweroff()
551 if (not_suspended > genpd->in_progress) in pm_genpd_poweroff()
554 if (genpd->poweroff_task) { in pm_genpd_poweroff()
559 genpd->status = GPD_STATE_REPEAT; in pm_genpd_poweroff()
563 if (genpd->gov && genpd->gov->power_down_ok) { in pm_genpd_poweroff()
564 if (!genpd->gov->power_down_ok(&genpd->domain)) in pm_genpd_poweroff()
568 genpd->status = GPD_STATE_BUSY; in pm_genpd_poweroff()
569 genpd->poweroff_task = current; in pm_genpd_poweroff()
571 list_for_each_entry_reverse(pdd, &genpd->dev_list, list_node) { in pm_genpd_poweroff()
572 ret = atomic_read(&genpd->sd_count) == 0 ? in pm_genpd_poweroff()
573 __pm_genpd_save_device(pdd, genpd) : -EBUSY; in pm_genpd_poweroff()
575 if (genpd_abort_poweroff(genpd)) in pm_genpd_poweroff()
579 genpd_set_active(genpd); in pm_genpd_poweroff()
583 if (genpd->status == GPD_STATE_REPEAT) { in pm_genpd_poweroff()
584 genpd->poweroff_task = NULL; in pm_genpd_poweroff()
589 if (genpd->cpuidle_data) { in pm_genpd_poweroff()
597 genpd->status = GPD_STATE_POWER_OFF; in pm_genpd_poweroff()
599 genpd->cpuidle_data->idle_state->disabled = false; in pm_genpd_poweroff()
604 if (genpd->power_off) { in pm_genpd_poweroff()
605 if (atomic_read(&genpd->sd_count) > 0) { in pm_genpd_poweroff()
618 ret = genpd_power_off(genpd); in pm_genpd_poweroff()
620 genpd_set_active(genpd); in pm_genpd_poweroff()
625 genpd->status = GPD_STATE_POWER_OFF; in pm_genpd_poweroff()
627 list_for_each_entry(link, &genpd->slave_links, slave_node) { in pm_genpd_poweroff()
633 genpd->poweroff_task = NULL; in pm_genpd_poweroff()
634 wake_up_all(&genpd->status_wait_queue); in pm_genpd_poweroff()
644 struct generic_pm_domain *genpd; in genpd_power_off_work_fn() local
646 genpd = container_of(work, struct generic_pm_domain, power_off_work); in genpd_power_off_work_fn()
648 genpd_acquire_lock(genpd); in genpd_power_off_work_fn()
649 pm_genpd_poweroff(genpd); in genpd_power_off_work_fn()
650 genpd_release_lock(genpd); in genpd_power_off_work_fn()
663 struct generic_pm_domain *genpd; in pm_genpd_runtime_suspend() local
670 genpd = dev_to_genpd(dev); in pm_genpd_runtime_suspend()
671 if (IS_ERR(genpd)) in pm_genpd_runtime_suspend()
674 stop_ok = genpd->gov ? genpd->gov->stop_ok : NULL; in pm_genpd_runtime_suspend()
678 ret = genpd_stop_dev(genpd, dev); in pm_genpd_runtime_suspend()
689 mutex_lock(&genpd->lock); in pm_genpd_runtime_suspend()
700 genpd->in_progress++; in pm_genpd_runtime_suspend()
701 pm_genpd_poweroff(genpd); in pm_genpd_runtime_suspend()
702 genpd->in_progress--; in pm_genpd_runtime_suspend()
703 mutex_unlock(&genpd->lock); in pm_genpd_runtime_suspend()
718 struct generic_pm_domain *genpd; in pm_genpd_runtime_resume() local
724 genpd = dev_to_genpd(dev); in pm_genpd_runtime_resume()
725 if (IS_ERR(genpd)) in pm_genpd_runtime_resume()
730 return genpd_start_dev_no_timing(genpd, dev); in pm_genpd_runtime_resume()
732 mutex_lock(&genpd->lock); in pm_genpd_runtime_resume()
733 ret = __pm_genpd_poweron(genpd); in pm_genpd_runtime_resume()
735 mutex_unlock(&genpd->lock); in pm_genpd_runtime_resume()
738 genpd->status = GPD_STATE_BUSY; in pm_genpd_runtime_resume()
739 genpd->resume_count++; in pm_genpd_runtime_resume()
741 prepare_to_wait(&genpd->status_wait_queue, &wait, in pm_genpd_runtime_resume()
748 if (!genpd->poweroff_task || genpd->poweroff_task == current) in pm_genpd_runtime_resume()
750 mutex_unlock(&genpd->lock); in pm_genpd_runtime_resume()
754 mutex_lock(&genpd->lock); in pm_genpd_runtime_resume()
756 finish_wait(&genpd->status_wait_queue, &wait); in pm_genpd_runtime_resume()
757 __pm_genpd_restore_device(dev->power.subsys_data->domain_data, genpd); in pm_genpd_runtime_resume()
758 genpd->resume_count--; in pm_genpd_runtime_resume()
759 genpd_set_active(genpd); in pm_genpd_runtime_resume()
760 wake_up_all(&genpd->status_wait_queue); in pm_genpd_runtime_resume()
761 mutex_unlock(&genpd->lock); in pm_genpd_runtime_resume()
779 struct generic_pm_domain *genpd; in pm_genpd_poweroff_unused() local
788 list_for_each_entry(genpd, &gpd_list, gpd_list_node) in pm_genpd_poweroff_unused()
789 genpd_queue_power_off_work(genpd); in pm_genpd_poweroff_unused()
807 static bool pm_genpd_present(const struct generic_pm_domain *genpd) in pm_genpd_present() argument
811 if (IS_ERR_OR_NULL(genpd)) in pm_genpd_present()
815 if (gpd == genpd) in pm_genpd_present()
821 static bool genpd_dev_active_wakeup(struct generic_pm_domain *genpd, in genpd_dev_active_wakeup() argument
824 return GENPD_DEV_CALLBACK(genpd, bool, active_wakeup, dev); in genpd_dev_active_wakeup()
839 static void pm_genpd_sync_poweroff(struct generic_pm_domain *genpd) in pm_genpd_sync_poweroff() argument
843 if (genpd->status == GPD_STATE_POWER_OFF) in pm_genpd_sync_poweroff()
846 if (genpd->suspended_count != genpd->device_count in pm_genpd_sync_poweroff()
847 || atomic_read(&genpd->sd_count) > 0) in pm_genpd_sync_poweroff()
850 genpd_power_off(genpd); in pm_genpd_sync_poweroff()
852 genpd->status = GPD_STATE_POWER_OFF; in pm_genpd_sync_poweroff()
854 list_for_each_entry(link, &genpd->slave_links, slave_node) { in pm_genpd_sync_poweroff()
869 static void pm_genpd_sync_poweron(struct generic_pm_domain *genpd) in pm_genpd_sync_poweron() argument
873 if (genpd->status != GPD_STATE_POWER_OFF) in pm_genpd_sync_poweron()
876 list_for_each_entry(link, &genpd->slave_links, slave_node) { in pm_genpd_sync_poweron()
881 genpd_power_on(genpd); in pm_genpd_sync_poweron()
883 genpd->status = GPD_STATE_ACTIVE; in pm_genpd_sync_poweron()
902 static bool resume_needed(struct device *dev, struct generic_pm_domain *genpd) in resume_needed() argument
909 active_wakeup = genpd_dev_active_wakeup(genpd, dev); in resume_needed()
924 struct generic_pm_domain *genpd; in pm_genpd_prepare() local
929 genpd = dev_to_genpd(dev); in pm_genpd_prepare()
930 if (IS_ERR(genpd)) in pm_genpd_prepare()
947 if (resume_needed(dev, genpd)) in pm_genpd_prepare()
950 genpd_acquire_lock(genpd); in pm_genpd_prepare()
952 if (genpd->prepared_count++ == 0) { in pm_genpd_prepare()
953 genpd->suspended_count = 0; in pm_genpd_prepare()
954 genpd->suspend_power_off = genpd->status == GPD_STATE_POWER_OFF; in pm_genpd_prepare()
957 genpd_release_lock(genpd); in pm_genpd_prepare()
959 if (genpd->suspend_power_off) { in pm_genpd_prepare()
975 mutex_lock(&genpd->lock); in pm_genpd_prepare()
977 if (--genpd->prepared_count == 0) in pm_genpd_prepare()
978 genpd->suspend_power_off = false; in pm_genpd_prepare()
980 mutex_unlock(&genpd->lock); in pm_genpd_prepare()
998 struct generic_pm_domain *genpd; in pm_genpd_suspend() local
1002 genpd = dev_to_genpd(dev); in pm_genpd_suspend()
1003 if (IS_ERR(genpd)) in pm_genpd_suspend()
1006 return genpd->suspend_power_off ? 0 : pm_generic_suspend(dev); in pm_genpd_suspend()
1019 struct generic_pm_domain *genpd; in pm_genpd_suspend_late() local
1023 genpd = dev_to_genpd(dev); in pm_genpd_suspend_late()
1024 if (IS_ERR(genpd)) in pm_genpd_suspend_late()
1027 return genpd->suspend_power_off ? 0 : pm_generic_suspend_late(dev); in pm_genpd_suspend_late()
1039 struct generic_pm_domain *genpd; in pm_genpd_suspend_noirq() local
1043 genpd = dev_to_genpd(dev); in pm_genpd_suspend_noirq()
1044 if (IS_ERR(genpd)) in pm_genpd_suspend_noirq()
1047 if (genpd->suspend_power_off in pm_genpd_suspend_noirq()
1048 || (dev->power.wakeup_path && genpd_dev_active_wakeup(genpd, dev))) in pm_genpd_suspend_noirq()
1051 genpd_stop_dev(genpd, dev); in pm_genpd_suspend_noirq()
1058 genpd->suspended_count++; in pm_genpd_suspend_noirq()
1059 pm_genpd_sync_poweroff(genpd); in pm_genpd_suspend_noirq()
1072 struct generic_pm_domain *genpd; in pm_genpd_resume_noirq() local
1076 genpd = dev_to_genpd(dev); in pm_genpd_resume_noirq()
1077 if (IS_ERR(genpd)) in pm_genpd_resume_noirq()
1080 if (genpd->suspend_power_off in pm_genpd_resume_noirq()
1081 || (dev->power.wakeup_path && genpd_dev_active_wakeup(genpd, dev))) in pm_genpd_resume_noirq()
1089 pm_genpd_sync_poweron(genpd); in pm_genpd_resume_noirq()
1090 genpd->suspended_count--; in pm_genpd_resume_noirq()
1092 return genpd_start_dev(genpd, dev); in pm_genpd_resume_noirq()
1106 struct generic_pm_domain *genpd; in pm_genpd_resume_early() local
1110 genpd = dev_to_genpd(dev); in pm_genpd_resume_early()
1111 if (IS_ERR(genpd)) in pm_genpd_resume_early()
1114 return genpd->suspend_power_off ? 0 : pm_generic_resume_early(dev); in pm_genpd_resume_early()
1127 struct generic_pm_domain *genpd; in pm_genpd_resume() local
1131 genpd = dev_to_genpd(dev); in pm_genpd_resume()
1132 if (IS_ERR(genpd)) in pm_genpd_resume()
1135 return genpd->suspend_power_off ? 0 : pm_generic_resume(dev); in pm_genpd_resume()
1148 struct generic_pm_domain *genpd; in pm_genpd_freeze() local
1152 genpd = dev_to_genpd(dev); in pm_genpd_freeze()
1153 if (IS_ERR(genpd)) in pm_genpd_freeze()
1156 return genpd->suspend_power_off ? 0 : pm_generic_freeze(dev); in pm_genpd_freeze()
1170 struct generic_pm_domain *genpd; in pm_genpd_freeze_late() local
1174 genpd = dev_to_genpd(dev); in pm_genpd_freeze_late()
1175 if (IS_ERR(genpd)) in pm_genpd_freeze_late()
1178 return genpd->suspend_power_off ? 0 : pm_generic_freeze_late(dev); in pm_genpd_freeze_late()
1192 struct generic_pm_domain *genpd; in pm_genpd_freeze_noirq() local
1196 genpd = dev_to_genpd(dev); in pm_genpd_freeze_noirq()
1197 if (IS_ERR(genpd)) in pm_genpd_freeze_noirq()
1200 return genpd->suspend_power_off ? 0 : genpd_stop_dev(genpd, dev); in pm_genpd_freeze_noirq()
1212 struct generic_pm_domain *genpd; in pm_genpd_thaw_noirq() local
1216 genpd = dev_to_genpd(dev); in pm_genpd_thaw_noirq()
1217 if (IS_ERR(genpd)) in pm_genpd_thaw_noirq()
1220 return genpd->suspend_power_off ? 0 : genpd_start_dev(genpd, dev); in pm_genpd_thaw_noirq()
1234 struct generic_pm_domain *genpd; in pm_genpd_thaw_early() local
1238 genpd = dev_to_genpd(dev); in pm_genpd_thaw_early()
1239 if (IS_ERR(genpd)) in pm_genpd_thaw_early()
1242 return genpd->suspend_power_off ? 0 : pm_generic_thaw_early(dev); in pm_genpd_thaw_early()
1255 struct generic_pm_domain *genpd; in pm_genpd_thaw() local
1259 genpd = dev_to_genpd(dev); in pm_genpd_thaw()
1260 if (IS_ERR(genpd)) in pm_genpd_thaw()
1263 return genpd->suspend_power_off ? 0 : pm_generic_thaw(dev); in pm_genpd_thaw()
1275 struct generic_pm_domain *genpd; in pm_genpd_restore_noirq() local
1279 genpd = dev_to_genpd(dev); in pm_genpd_restore_noirq()
1280 if (IS_ERR(genpd)) in pm_genpd_restore_noirq()
1291 if (genpd->suspended_count++ == 0) { in pm_genpd_restore_noirq()
1297 genpd->status = GPD_STATE_POWER_OFF; in pm_genpd_restore_noirq()
1298 if (genpd->suspend_power_off) { in pm_genpd_restore_noirq()
1303 genpd_power_off(genpd); in pm_genpd_restore_noirq()
1309 if (genpd->suspend_power_off) in pm_genpd_restore_noirq()
1312 pm_genpd_sync_poweron(genpd); in pm_genpd_restore_noirq()
1314 return genpd_start_dev(genpd, dev); in pm_genpd_restore_noirq()
1328 struct generic_pm_domain *genpd; in pm_genpd_complete() local
1333 genpd = dev_to_genpd(dev); in pm_genpd_complete()
1334 if (IS_ERR(genpd)) in pm_genpd_complete()
1337 mutex_lock(&genpd->lock); in pm_genpd_complete()
1339 run_complete = !genpd->suspend_power_off; in pm_genpd_complete()
1340 if (--genpd->prepared_count == 0) in pm_genpd_complete()
1341 genpd->suspend_power_off = false; in pm_genpd_complete()
1343 mutex_unlock(&genpd->lock); in pm_genpd_complete()
1362 struct generic_pm_domain *genpd; in genpd_syscore_switch() local
1364 genpd = dev_to_genpd(dev); in genpd_syscore_switch()
1365 if (!pm_genpd_present(genpd)) in genpd_syscore_switch()
1369 genpd->suspended_count++; in genpd_syscore_switch()
1370 pm_genpd_sync_poweroff(genpd); in genpd_syscore_switch()
1372 pm_genpd_sync_poweron(genpd); in genpd_syscore_switch()
1373 genpd->suspended_count--; in genpd_syscore_switch()
1410 struct generic_pm_domain *genpd, in genpd_alloc_dev_data() argument
1443 dev->pm_domain = &genpd->domain; in genpd_alloc_dev_data()
1477 int __pm_genpd_add_device(struct generic_pm_domain *genpd, struct device *dev, in __pm_genpd_add_device() argument
1485 if (IS_ERR_OR_NULL(genpd) || IS_ERR_OR_NULL(dev)) in __pm_genpd_add_device()
1488 gpd_data = genpd_alloc_dev_data(dev, genpd, td); in __pm_genpd_add_device()
1492 genpd_acquire_lock(genpd); in __pm_genpd_add_device()
1494 if (genpd->prepared_count > 0) { in __pm_genpd_add_device()
1499 ret = genpd->attach_dev ? genpd->attach_dev(genpd, dev) : 0; in __pm_genpd_add_device()
1503 genpd->device_count++; in __pm_genpd_add_device()
1504 genpd->max_off_time_changed = true; in __pm_genpd_add_device()
1506 list_add_tail(&gpd_data->base.list_node, &genpd->dev_list); in __pm_genpd_add_device()
1509 genpd_release_lock(genpd); in __pm_genpd_add_device()
1536 int pm_genpd_remove_device(struct generic_pm_domain *genpd, in pm_genpd_remove_device() argument
1545 if (!genpd || genpd != pm_genpd_lookup_dev(dev)) in pm_genpd_remove_device()
1553 genpd_acquire_lock(genpd); in pm_genpd_remove_device()
1555 if (genpd->prepared_count > 0) { in pm_genpd_remove_device()
1560 genpd->device_count--; in pm_genpd_remove_device()
1561 genpd->max_off_time_changed = true; in pm_genpd_remove_device()
1563 if (genpd->detach_dev) in pm_genpd_remove_device()
1564 genpd->detach_dev(genpd, dev); in pm_genpd_remove_device()
1568 genpd_release_lock(genpd); in pm_genpd_remove_device()
1575 genpd_release_lock(genpd); in pm_genpd_remove_device()
1586 int pm_genpd_add_subdomain(struct generic_pm_domain *genpd, in pm_genpd_add_subdomain() argument
1592 if (IS_ERR_OR_NULL(genpd) || IS_ERR_OR_NULL(subdomain) in pm_genpd_add_subdomain()
1593 || genpd == subdomain) in pm_genpd_add_subdomain()
1597 genpd_acquire_lock(genpd); in pm_genpd_add_subdomain()
1603 genpd_release_lock(genpd); in pm_genpd_add_subdomain()
1607 if (genpd->status == GPD_STATE_POWER_OFF in pm_genpd_add_subdomain()
1613 list_for_each_entry(link, &genpd->master_links, master_node) { in pm_genpd_add_subdomain()
1614 if (link->slave == subdomain && link->master == genpd) { in pm_genpd_add_subdomain()
1625 link->master = genpd; in pm_genpd_add_subdomain()
1626 list_add_tail(&link->master_node, &genpd->master_links); in pm_genpd_add_subdomain()
1630 genpd_sd_counter_inc(genpd); in pm_genpd_add_subdomain()
1634 genpd_release_lock(genpd); in pm_genpd_add_subdomain()
1673 int pm_genpd_remove_subdomain(struct generic_pm_domain *genpd, in pm_genpd_remove_subdomain() argument
1679 if (IS_ERR_OR_NULL(genpd) || IS_ERR_OR_NULL(subdomain)) in pm_genpd_remove_subdomain()
1683 genpd_acquire_lock(genpd); in pm_genpd_remove_subdomain()
1685 list_for_each_entry(link, &genpd->master_links, master_node) { in pm_genpd_remove_subdomain()
1694 genpd_release_lock(genpd); in pm_genpd_remove_subdomain()
1702 genpd_sd_counter_dec(genpd); in pm_genpd_remove_subdomain()
1710 genpd_release_lock(genpd); in pm_genpd_remove_subdomain()
1724 int pm_genpd_attach_cpuidle(struct generic_pm_domain *genpd, int state) in pm_genpd_attach_cpuidle() argument
1731 if (IS_ERR_OR_NULL(genpd) || state < 0) in pm_genpd_attach_cpuidle()
1734 genpd_acquire_lock(genpd); in pm_genpd_attach_cpuidle()
1736 if (genpd->cpuidle_data) { in pm_genpd_attach_cpuidle()
1761 genpd->cpuidle_data = cpuidle_data; in pm_genpd_attach_cpuidle()
1762 genpd_recalc_cpu_exit_latency(genpd); in pm_genpd_attach_cpuidle()
1765 genpd_release_lock(genpd); in pm_genpd_attach_cpuidle()
1793 int pm_genpd_detach_cpuidle(struct generic_pm_domain *genpd) in pm_genpd_detach_cpuidle() argument
1799 if (IS_ERR_OR_NULL(genpd)) in pm_genpd_detach_cpuidle()
1802 genpd_acquire_lock(genpd); in pm_genpd_detach_cpuidle()
1804 cpuidle_data = genpd->cpuidle_data; in pm_genpd_detach_cpuidle()
1816 genpd->cpuidle_data = NULL; in pm_genpd_detach_cpuidle()
1820 genpd_release_lock(genpd); in pm_genpd_detach_cpuidle()
1887 void pm_genpd_init(struct generic_pm_domain *genpd, in pm_genpd_init() argument
1890 if (IS_ERR_OR_NULL(genpd)) in pm_genpd_init()
1893 INIT_LIST_HEAD(&genpd->master_links); in pm_genpd_init()
1894 INIT_LIST_HEAD(&genpd->slave_links); in pm_genpd_init()
1895 INIT_LIST_HEAD(&genpd->dev_list); in pm_genpd_init()
1896 mutex_init(&genpd->lock); in pm_genpd_init()
1897 genpd->gov = gov; in pm_genpd_init()
1898 INIT_WORK(&genpd->power_off_work, genpd_power_off_work_fn); in pm_genpd_init()
1899 genpd->in_progress = 0; in pm_genpd_init()
1900 atomic_set(&genpd->sd_count, 0); in pm_genpd_init()
1901 genpd->status = is_off ? GPD_STATE_POWER_OFF : GPD_STATE_ACTIVE; in pm_genpd_init()
1902 init_waitqueue_head(&genpd->status_wait_queue); in pm_genpd_init()
1903 genpd->poweroff_task = NULL; in pm_genpd_init()
1904 genpd->resume_count = 0; in pm_genpd_init()
1905 genpd->device_count = 0; in pm_genpd_init()
1906 genpd->max_off_time_ns = -1; in pm_genpd_init()
1907 genpd->max_off_time_changed = true; in pm_genpd_init()
1908 genpd->domain.ops.runtime_suspend = pm_genpd_runtime_suspend; in pm_genpd_init()
1909 genpd->domain.ops.runtime_resume = pm_genpd_runtime_resume; in pm_genpd_init()
1910 genpd->domain.ops.prepare = pm_genpd_prepare; in pm_genpd_init()
1911 genpd->domain.ops.suspend = pm_genpd_suspend; in pm_genpd_init()
1912 genpd->domain.ops.suspend_late = pm_genpd_suspend_late; in pm_genpd_init()
1913 genpd->domain.ops.suspend_noirq = pm_genpd_suspend_noirq; in pm_genpd_init()
1914 genpd->domain.ops.resume_noirq = pm_genpd_resume_noirq; in pm_genpd_init()
1915 genpd->domain.ops.resume_early = pm_genpd_resume_early; in pm_genpd_init()
1916 genpd->domain.ops.resume = pm_genpd_resume; in pm_genpd_init()
1917 genpd->domain.ops.freeze = pm_genpd_freeze; in pm_genpd_init()
1918 genpd->domain.ops.freeze_late = pm_genpd_freeze_late; in pm_genpd_init()
1919 genpd->domain.ops.freeze_noirq = pm_genpd_freeze_noirq; in pm_genpd_init()
1920 genpd->domain.ops.thaw_noirq = pm_genpd_thaw_noirq; in pm_genpd_init()
1921 genpd->domain.ops.thaw_early = pm_genpd_thaw_early; in pm_genpd_init()
1922 genpd->domain.ops.thaw = pm_genpd_thaw; in pm_genpd_init()
1923 genpd->domain.ops.poweroff = pm_genpd_suspend; in pm_genpd_init()
1924 genpd->domain.ops.poweroff_late = pm_genpd_suspend_late; in pm_genpd_init()
1925 genpd->domain.ops.poweroff_noirq = pm_genpd_suspend_noirq; in pm_genpd_init()
1926 genpd->domain.ops.restore_noirq = pm_genpd_restore_noirq; in pm_genpd_init()
1927 genpd->domain.ops.restore_early = pm_genpd_resume_early; in pm_genpd_init()
1928 genpd->domain.ops.restore = pm_genpd_resume; in pm_genpd_init()
1929 genpd->domain.ops.complete = pm_genpd_complete; in pm_genpd_init()
1930 genpd->dev_ops.save_state = pm_genpd_default_save_state; in pm_genpd_init()
1931 genpd->dev_ops.restore_state = pm_genpd_default_restore_state; in pm_genpd_init()
1933 if (genpd->flags & GENPD_FLAG_PM_CLK) { in pm_genpd_init()
1934 genpd->dev_ops.stop = pm_clk_suspend; in pm_genpd_init()
1935 genpd->dev_ops.start = pm_clk_resume; in pm_genpd_init()
1939 list_add(&genpd->gpd_list_node, &gpd_list); in pm_genpd_init()
2094 struct generic_pm_domain *genpd = ERR_PTR(-ENOENT); in of_genpd_get_from_provider() local
2102 genpd = provider->xlate(genpdspec, provider->data); in of_genpd_get_from_provider()
2103 if (!IS_ERR(genpd)) in of_genpd_get_from_provider()
2109 return genpd; in of_genpd_get_from_provider()
2273 struct generic_pm_domain *genpd) in pm_genpd_summary_one() argument
2287 ret = mutex_lock_interruptible(&genpd->lock); in pm_genpd_summary_one()
2291 if (WARN_ON(genpd->status >= ARRAY_SIZE(status_lookup))) in pm_genpd_summary_one()
2293 seq_printf(s, "%-30s %-15s ", genpd->name, status_lookup[genpd->status]); in pm_genpd_summary_one()
2300 list_for_each_entry(link, &genpd->master_links, master_node) { in pm_genpd_summary_one()
2302 if (!list_is_last(&link->master_node, &genpd->master_links)) in pm_genpd_summary_one()
2306 list_for_each_entry(pm_data, &genpd->dev_list, list_node) { in pm_genpd_summary_one()
2318 mutex_unlock(&genpd->lock); in pm_genpd_summary_one()
2325 struct generic_pm_domain *genpd; in pm_genpd_summary_show() local
2336 list_for_each_entry(genpd, &gpd_list, gpd_list_node) { in pm_genpd_summary_show()
2337 ret = pm_genpd_summary_one(s, genpd); in pm_genpd_summary_show()