Lines Matching refs:genpd

20 #define GENPD_DEV_CALLBACK(genpd, type, callback, dev)		\  argument
25 __routine = genpd->dev_ops.callback; \
36 #define GENPD_DEV_TIMED_CALLBACK(genpd, type, callback, dev, field, name) \ argument
39 type __retval = GENPD_DEV_CALLBACK(genpd, type, callback, dev); \
63 static int genpd_stop_dev(struct generic_pm_domain *genpd, struct device *dev) in genpd_stop_dev() argument
65 return GENPD_DEV_TIMED_CALLBACK(genpd, int, stop, dev, in genpd_stop_dev()
69 static int genpd_start_dev(struct generic_pm_domain *genpd, struct device *dev) in genpd_start_dev() argument
71 return GENPD_DEV_TIMED_CALLBACK(genpd, int, start, dev, in genpd_start_dev()
75 static int genpd_save_dev(struct generic_pm_domain *genpd, struct device *dev) in genpd_save_dev() argument
77 return GENPD_DEV_TIMED_CALLBACK(genpd, int, save_state, dev, in genpd_save_dev()
81 static int genpd_restore_dev(struct generic_pm_domain *genpd, struct device *dev) in genpd_restore_dev() argument
83 return GENPD_DEV_TIMED_CALLBACK(genpd, int, restore_state, dev, in genpd_restore_dev()
88 static bool genpd_sd_counter_dec(struct generic_pm_domain *genpd) in genpd_sd_counter_dec() argument
92 if (!WARN_ON(atomic_read(&genpd->sd_count) == 0)) in genpd_sd_counter_dec()
93 ret = !!atomic_dec_and_test(&genpd->sd_count); in genpd_sd_counter_dec()
98 static void genpd_sd_counter_inc(struct generic_pm_domain *genpd) in genpd_sd_counter_inc() argument
100 atomic_inc(&genpd->sd_count); in genpd_sd_counter_inc()
104 static void genpd_acquire_lock(struct generic_pm_domain *genpd) in genpd_acquire_lock() argument
108 mutex_lock(&genpd->lock); in genpd_acquire_lock()
114 prepare_to_wait(&genpd->status_wait_queue, &wait, in genpd_acquire_lock()
116 if (genpd->status == GPD_STATE_ACTIVE in genpd_acquire_lock()
117 || genpd->status == GPD_STATE_POWER_OFF) in genpd_acquire_lock()
119 mutex_unlock(&genpd->lock); in genpd_acquire_lock()
123 mutex_lock(&genpd->lock); in genpd_acquire_lock()
125 finish_wait(&genpd->status_wait_queue, &wait); in genpd_acquire_lock()
128 static void genpd_release_lock(struct generic_pm_domain *genpd) in genpd_release_lock() argument
130 mutex_unlock(&genpd->lock); in genpd_release_lock()
133 static void genpd_set_active(struct generic_pm_domain *genpd) in genpd_set_active() argument
135 if (genpd->resume_count == 0) in genpd_set_active()
136 genpd->status = GPD_STATE_ACTIVE; in genpd_set_active()
146 int __pm_genpd_poweron(struct generic_pm_domain *genpd) in __pm_genpd_poweron() argument
147 __releases(&genpd->lock) __acquires(&genpd->lock) in __pm_genpd_poweron()
155 prepare_to_wait(&genpd->status_wait_queue, &wait, in __pm_genpd_poweron()
157 if (genpd->status != GPD_STATE_WAIT_MASTER) in __pm_genpd_poweron()
159 mutex_unlock(&genpd->lock); in __pm_genpd_poweron()
163 mutex_lock(&genpd->lock); in __pm_genpd_poweron()
165 finish_wait(&genpd->status_wait_queue, &wait); in __pm_genpd_poweron()
167 if (genpd->status == GPD_STATE_ACTIVE in __pm_genpd_poweron()
168 || (genpd->prepared_count > 0 && genpd->suspend_power_off)) in __pm_genpd_poweron()
171 if (genpd->status != GPD_STATE_POWER_OFF) { in __pm_genpd_poweron()
172 genpd_set_active(genpd); in __pm_genpd_poweron()
181 list_for_each_entry(link, &genpd->slave_links, slave_node) { in __pm_genpd_poweron()
183 genpd->status = GPD_STATE_WAIT_MASTER; in __pm_genpd_poweron()
185 mutex_unlock(&genpd->lock); in __pm_genpd_poweron()
189 mutex_lock(&genpd->lock); in __pm_genpd_poweron()
195 genpd->status = GPD_STATE_POWER_OFF; in __pm_genpd_poweron()
196 wake_up_all(&genpd->status_wait_queue); in __pm_genpd_poweron()
203 if (genpd->power_on) { in __pm_genpd_poweron()
207 ret = genpd->power_on(genpd); in __pm_genpd_poweron()
212 if (elapsed_ns > genpd->power_on_latency_ns) { in __pm_genpd_poweron()
213 genpd->power_on_latency_ns = elapsed_ns; in __pm_genpd_poweron()
214 if (genpd->name) in __pm_genpd_poweron()
216 "new value %lld ns\n", genpd->name, in __pm_genpd_poweron()
221 genpd_set_active(genpd); in __pm_genpd_poweron()
226 list_for_each_entry_continue_reverse(link, &genpd->slave_links, slave_node) in __pm_genpd_poweron()
236 int pm_genpd_poweron(struct generic_pm_domain *genpd) in pm_genpd_poweron() argument
240 mutex_lock(&genpd->lock); in pm_genpd_poweron()
241 ret = __pm_genpd_poweron(genpd); in pm_genpd_poweron()
242 mutex_unlock(&genpd->lock); in pm_genpd_poweron()
256 struct generic_pm_domain *genpd) in __pm_genpd_save_device() argument
257 __releases(&genpd->lock) __acquires(&genpd->lock) in __pm_genpd_save_device()
266 mutex_unlock(&genpd->lock); in __pm_genpd_save_device()
268 genpd_start_dev(genpd, dev); in __pm_genpd_save_device()
269 ret = genpd_save_dev(genpd, dev); in __pm_genpd_save_device()
270 genpd_stop_dev(genpd, dev); in __pm_genpd_save_device()
272 mutex_lock(&genpd->lock); in __pm_genpd_save_device()
286 struct generic_pm_domain *genpd) in __pm_genpd_restore_device() argument
287 __releases(&genpd->lock) __acquires(&genpd->lock) in __pm_genpd_restore_device()
295 mutex_unlock(&genpd->lock); in __pm_genpd_restore_device()
297 genpd_start_dev(genpd, dev); in __pm_genpd_restore_device()
298 genpd_restore_dev(genpd, dev); in __pm_genpd_restore_device()
299 genpd_stop_dev(genpd, dev); in __pm_genpd_restore_device()
301 mutex_lock(&genpd->lock); in __pm_genpd_restore_device()
315 static bool genpd_abort_poweroff(struct generic_pm_domain *genpd) in genpd_abort_poweroff() argument
317 return genpd->status == GPD_STATE_WAIT_MASTER in genpd_abort_poweroff()
318 || genpd->status == GPD_STATE_ACTIVE || genpd->resume_count > 0; in genpd_abort_poweroff()
328 void genpd_queue_power_off_work(struct generic_pm_domain *genpd) in genpd_queue_power_off_work() argument
330 if (!work_pending(&genpd->power_off_work)) in genpd_queue_power_off_work()
331 queue_work(pm_wq, &genpd->power_off_work); in genpd_queue_power_off_work()
342 static int pm_genpd_poweroff(struct generic_pm_domain *genpd) in pm_genpd_poweroff() argument
343 __releases(&genpd->lock) __acquires(&genpd->lock) in pm_genpd_poweroff()
358 if (genpd->status == GPD_STATE_POWER_OFF in pm_genpd_poweroff()
359 || genpd->status == GPD_STATE_WAIT_MASTER in pm_genpd_poweroff()
360 || genpd->resume_count > 0 || genpd->prepared_count > 0) in pm_genpd_poweroff()
363 if (atomic_read(&genpd->sd_count) > 0) in pm_genpd_poweroff()
367 list_for_each_entry(pdd, &genpd->dev_list, list_node) in pm_genpd_poweroff()
372 if (not_suspended > genpd->in_progress) in pm_genpd_poweroff()
375 if (genpd->poweroff_task) { in pm_genpd_poweroff()
380 genpd->status = GPD_STATE_REPEAT; in pm_genpd_poweroff()
384 if (genpd->gov && genpd->gov->power_down_ok) { in pm_genpd_poweroff()
385 if (!genpd->gov->power_down_ok(&genpd->domain)) in pm_genpd_poweroff()
389 genpd->status = GPD_STATE_BUSY; in pm_genpd_poweroff()
390 genpd->poweroff_task = current; in pm_genpd_poweroff()
392 list_for_each_entry_reverse(pdd, &genpd->dev_list, list_node) { in pm_genpd_poweroff()
393 ret = atomic_read(&genpd->sd_count) == 0 ? in pm_genpd_poweroff()
394 __pm_genpd_save_device(pdd, genpd) : -EBUSY; in pm_genpd_poweroff()
396 if (genpd_abort_poweroff(genpd)) in pm_genpd_poweroff()
400 genpd_set_active(genpd); in pm_genpd_poweroff()
404 if (genpd->status == GPD_STATE_REPEAT) { in pm_genpd_poweroff()
405 genpd->poweroff_task = NULL; in pm_genpd_poweroff()
410 if (genpd->power_off) { in pm_genpd_poweroff()
414 if (atomic_read(&genpd->sd_count) > 0) { in pm_genpd_poweroff()
429 ret = genpd->power_off(genpd); in pm_genpd_poweroff()
431 genpd_set_active(genpd); in pm_genpd_poweroff()
436 if (elapsed_ns > genpd->power_off_latency_ns) { in pm_genpd_poweroff()
437 genpd->power_off_latency_ns = elapsed_ns; in pm_genpd_poweroff()
438 if (genpd->name) in pm_genpd_poweroff()
440 "new value %lld ns\n", genpd->name, in pm_genpd_poweroff()
445 genpd->status = GPD_STATE_POWER_OFF; in pm_genpd_poweroff()
446 genpd->power_off_time = ktime_get(); in pm_genpd_poweroff()
449 list_for_each_entry_reverse(pdd, &genpd->dev_list, list_node) { in pm_genpd_poweroff()
455 genpd->power_on_latency_ns); in pm_genpd_poweroff()
458 list_for_each_entry(link, &genpd->slave_links, slave_node) { in pm_genpd_poweroff()
464 genpd->poweroff_task = NULL; in pm_genpd_poweroff()
465 wake_up_all(&genpd->status_wait_queue); in pm_genpd_poweroff()
475 struct generic_pm_domain *genpd; in genpd_power_off_work_fn() local
477 genpd = container_of(work, struct generic_pm_domain, power_off_work); in genpd_power_off_work_fn()
479 genpd_acquire_lock(genpd); in genpd_power_off_work_fn()
480 pm_genpd_poweroff(genpd); in genpd_power_off_work_fn()
481 genpd_release_lock(genpd); in genpd_power_off_work_fn()
494 struct generic_pm_domain *genpd; in pm_genpd_runtime_suspend() local
500 genpd = dev_to_genpd(dev); in pm_genpd_runtime_suspend()
501 if (IS_ERR(genpd)) in pm_genpd_runtime_suspend()
504 might_sleep_if(!genpd->dev_irq_safe); in pm_genpd_runtime_suspend()
509 stop_ok = genpd->gov ? genpd->gov->stop_ok : NULL; in pm_genpd_runtime_suspend()
513 ret = genpd_stop_dev(genpd, dev); in pm_genpd_runtime_suspend()
527 mutex_lock(&genpd->lock); in pm_genpd_runtime_suspend()
528 genpd->in_progress++; in pm_genpd_runtime_suspend()
529 pm_genpd_poweroff(genpd); in pm_genpd_runtime_suspend()
530 genpd->in_progress--; in pm_genpd_runtime_suspend()
531 mutex_unlock(&genpd->lock); in pm_genpd_runtime_suspend()
546 struct generic_pm_domain *genpd; in pm_genpd_runtime_resume() local
552 genpd = dev_to_genpd(dev); in pm_genpd_runtime_resume()
553 if (IS_ERR(genpd)) in pm_genpd_runtime_resume()
556 might_sleep_if(!genpd->dev_irq_safe); in pm_genpd_runtime_resume()
562 mutex_lock(&genpd->lock); in pm_genpd_runtime_resume()
563 ret = __pm_genpd_poweron(genpd); in pm_genpd_runtime_resume()
565 mutex_unlock(&genpd->lock); in pm_genpd_runtime_resume()
568 genpd->status = GPD_STATE_BUSY; in pm_genpd_runtime_resume()
569 genpd->resume_count++; in pm_genpd_runtime_resume()
571 prepare_to_wait(&genpd->status_wait_queue, &wait, in pm_genpd_runtime_resume()
578 if (!genpd->poweroff_task || genpd->poweroff_task == current) in pm_genpd_runtime_resume()
580 mutex_unlock(&genpd->lock); in pm_genpd_runtime_resume()
584 mutex_lock(&genpd->lock); in pm_genpd_runtime_resume()
586 finish_wait(&genpd->status_wait_queue, &wait); in pm_genpd_runtime_resume()
587 __pm_genpd_restore_device(dev->power.subsys_data->domain_data, genpd); in pm_genpd_runtime_resume()
588 genpd->resume_count--; in pm_genpd_runtime_resume()
589 genpd_set_active(genpd); in pm_genpd_runtime_resume()
590 wake_up_all(&genpd->status_wait_queue); in pm_genpd_runtime_resume()
591 mutex_unlock(&genpd->lock); in pm_genpd_runtime_resume()
594 genpd_start_dev(genpd, dev); in pm_genpd_runtime_resume()
604 struct generic_pm_domain *genpd; in pm_genpd_poweroff_unused() local
608 list_for_each_entry(genpd, &gpd_list, gpd_list_node) in pm_genpd_poweroff_unused()
609 genpd_queue_power_off_work(genpd); in pm_genpd_poweroff_unused()
625 static bool genpd_dev_active_wakeup(struct generic_pm_domain *genpd, in genpd_dev_active_wakeup() argument
628 return GENPD_DEV_CALLBACK(genpd, bool, active_wakeup, dev); in genpd_dev_active_wakeup()
631 static int genpd_suspend_dev(struct generic_pm_domain *genpd, struct device *dev) in genpd_suspend_dev() argument
633 return GENPD_DEV_CALLBACK(genpd, int, suspend, dev); in genpd_suspend_dev()
636 static int genpd_suspend_late(struct generic_pm_domain *genpd, struct device *dev) in genpd_suspend_late() argument
638 return GENPD_DEV_CALLBACK(genpd, int, suspend_late, dev); in genpd_suspend_late()
641 static int genpd_resume_early(struct generic_pm_domain *genpd, struct device *dev) in genpd_resume_early() argument
643 return GENPD_DEV_CALLBACK(genpd, int, resume_early, dev); in genpd_resume_early()
646 static int genpd_resume_dev(struct generic_pm_domain *genpd, struct device *dev) in genpd_resume_dev() argument
648 return GENPD_DEV_CALLBACK(genpd, int, resume, dev); in genpd_resume_dev()
651 static int genpd_freeze_dev(struct generic_pm_domain *genpd, struct device *dev) in genpd_freeze_dev() argument
653 return GENPD_DEV_CALLBACK(genpd, int, freeze, dev); in genpd_freeze_dev()
656 static int genpd_freeze_late(struct generic_pm_domain *genpd, struct device *dev) in genpd_freeze_late() argument
658 return GENPD_DEV_CALLBACK(genpd, int, freeze_late, dev); in genpd_freeze_late()
661 static int genpd_thaw_early(struct generic_pm_domain *genpd, struct device *dev) in genpd_thaw_early() argument
663 return GENPD_DEV_CALLBACK(genpd, int, thaw_early, dev); in genpd_thaw_early()
666 static int genpd_thaw_dev(struct generic_pm_domain *genpd, struct device *dev) in genpd_thaw_dev() argument
668 return GENPD_DEV_CALLBACK(genpd, int, thaw, dev); in genpd_thaw_dev()
682 static void pm_genpd_sync_poweroff(struct generic_pm_domain *genpd) in pm_genpd_sync_poweroff() argument
686 if (genpd->status == GPD_STATE_POWER_OFF) in pm_genpd_sync_poweroff()
689 if (genpd->suspended_count != genpd->device_count in pm_genpd_sync_poweroff()
690 || atomic_read(&genpd->sd_count) > 0) in pm_genpd_sync_poweroff()
693 if (genpd->power_off) in pm_genpd_sync_poweroff()
694 genpd->power_off(genpd); in pm_genpd_sync_poweroff()
696 genpd->status = GPD_STATE_POWER_OFF; in pm_genpd_sync_poweroff()
698 list_for_each_entry(link, &genpd->slave_links, slave_node) { in pm_genpd_sync_poweroff()
720 static bool resume_needed(struct device *dev, struct generic_pm_domain *genpd) in resume_needed() argument
727 active_wakeup = genpd_dev_active_wakeup(genpd, dev); in resume_needed()
742 struct generic_pm_domain *genpd; in pm_genpd_prepare() local
747 genpd = dev_to_genpd(dev); in pm_genpd_prepare()
748 if (IS_ERR(genpd)) in pm_genpd_prepare()
765 if (resume_needed(dev, genpd)) in pm_genpd_prepare()
768 genpd_acquire_lock(genpd); in pm_genpd_prepare()
770 if (genpd->prepared_count++ == 0) { in pm_genpd_prepare()
771 genpd->suspended_count = 0; in pm_genpd_prepare()
772 genpd->suspend_power_off = genpd->status == GPD_STATE_POWER_OFF; in pm_genpd_prepare()
775 genpd_release_lock(genpd); in pm_genpd_prepare()
777 if (genpd->suspend_power_off) { in pm_genpd_prepare()
793 mutex_lock(&genpd->lock); in pm_genpd_prepare()
795 if (--genpd->prepared_count == 0) in pm_genpd_prepare()
796 genpd->suspend_power_off = false; in pm_genpd_prepare()
798 mutex_unlock(&genpd->lock); in pm_genpd_prepare()
816 struct generic_pm_domain *genpd; in pm_genpd_suspend() local
820 genpd = dev_to_genpd(dev); in pm_genpd_suspend()
821 if (IS_ERR(genpd)) in pm_genpd_suspend()
824 return genpd->suspend_power_off ? 0 : genpd_suspend_dev(genpd, dev); in pm_genpd_suspend()
837 struct generic_pm_domain *genpd; in pm_genpd_suspend_late() local
841 genpd = dev_to_genpd(dev); in pm_genpd_suspend_late()
842 if (IS_ERR(genpd)) in pm_genpd_suspend_late()
845 return genpd->suspend_power_off ? 0 : genpd_suspend_late(genpd, dev); in pm_genpd_suspend_late()
857 struct generic_pm_domain *genpd; in pm_genpd_suspend_noirq() local
861 genpd = dev_to_genpd(dev); in pm_genpd_suspend_noirq()
862 if (IS_ERR(genpd)) in pm_genpd_suspend_noirq()
865 if (genpd->suspend_power_off || dev_gpd_data(dev)->always_on in pm_genpd_suspend_noirq()
866 || (dev->power.wakeup_path && genpd_dev_active_wakeup(genpd, dev))) in pm_genpd_suspend_noirq()
869 genpd_stop_dev(genpd, dev); in pm_genpd_suspend_noirq()
876 genpd->suspended_count++; in pm_genpd_suspend_noirq()
877 pm_genpd_sync_poweroff(genpd); in pm_genpd_suspend_noirq()
890 struct generic_pm_domain *genpd; in pm_genpd_resume_noirq() local
894 genpd = dev_to_genpd(dev); in pm_genpd_resume_noirq()
895 if (IS_ERR(genpd)) in pm_genpd_resume_noirq()
898 if (genpd->suspend_power_off || dev_gpd_data(dev)->always_on in pm_genpd_resume_noirq()
899 || (dev->power.wakeup_path && genpd_dev_active_wakeup(genpd, dev))) in pm_genpd_resume_noirq()
907 pm_genpd_poweron(genpd); in pm_genpd_resume_noirq()
908 genpd->suspended_count--; in pm_genpd_resume_noirq()
910 return genpd_start_dev(genpd, dev); in pm_genpd_resume_noirq()
924 struct generic_pm_domain *genpd; in pm_genpd_resume_early() local
928 genpd = dev_to_genpd(dev); in pm_genpd_resume_early()
929 if (IS_ERR(genpd)) in pm_genpd_resume_early()
932 return genpd->suspend_power_off ? 0 : genpd_resume_early(genpd, dev); in pm_genpd_resume_early()
945 struct generic_pm_domain *genpd; in pm_genpd_resume() local
949 genpd = dev_to_genpd(dev); in pm_genpd_resume()
950 if (IS_ERR(genpd)) in pm_genpd_resume()
953 return genpd->suspend_power_off ? 0 : genpd_resume_dev(genpd, dev); in pm_genpd_resume()
966 struct generic_pm_domain *genpd; in pm_genpd_freeze() local
970 genpd = dev_to_genpd(dev); in pm_genpd_freeze()
971 if (IS_ERR(genpd)) in pm_genpd_freeze()
974 return genpd->suspend_power_off ? 0 : genpd_freeze_dev(genpd, dev); in pm_genpd_freeze()
988 struct generic_pm_domain *genpd; in pm_genpd_freeze_late() local
992 genpd = dev_to_genpd(dev); in pm_genpd_freeze_late()
993 if (IS_ERR(genpd)) in pm_genpd_freeze_late()
996 return genpd->suspend_power_off ? 0 : genpd_freeze_late(genpd, dev); in pm_genpd_freeze_late()
1010 struct generic_pm_domain *genpd; in pm_genpd_freeze_noirq() local
1014 genpd = dev_to_genpd(dev); in pm_genpd_freeze_noirq()
1015 if (IS_ERR(genpd)) in pm_genpd_freeze_noirq()
1018 return genpd->suspend_power_off || dev_gpd_data(dev)->always_on ? in pm_genpd_freeze_noirq()
1019 0 : genpd_stop_dev(genpd, dev); in pm_genpd_freeze_noirq()
1031 struct generic_pm_domain *genpd; in pm_genpd_thaw_noirq() local
1035 genpd = dev_to_genpd(dev); in pm_genpd_thaw_noirq()
1036 if (IS_ERR(genpd)) in pm_genpd_thaw_noirq()
1039 return genpd->suspend_power_off || dev_gpd_data(dev)->always_on ? in pm_genpd_thaw_noirq()
1040 0 : genpd_start_dev(genpd, dev); in pm_genpd_thaw_noirq()
1054 struct generic_pm_domain *genpd; in pm_genpd_thaw_early() local
1058 genpd = dev_to_genpd(dev); in pm_genpd_thaw_early()
1059 if (IS_ERR(genpd)) in pm_genpd_thaw_early()
1062 return genpd->suspend_power_off ? 0 : genpd_thaw_early(genpd, dev); in pm_genpd_thaw_early()
1075 struct generic_pm_domain *genpd; in pm_genpd_thaw() local
1079 genpd = dev_to_genpd(dev); in pm_genpd_thaw()
1080 if (IS_ERR(genpd)) in pm_genpd_thaw()
1083 return genpd->suspend_power_off ? 0 : genpd_thaw_dev(genpd, dev); in pm_genpd_thaw()
1095 struct generic_pm_domain *genpd; in pm_genpd_restore_noirq() local
1099 genpd = dev_to_genpd(dev); in pm_genpd_restore_noirq()
1100 if (IS_ERR(genpd)) in pm_genpd_restore_noirq()
1111 if (genpd->suspended_count++ == 0) { in pm_genpd_restore_noirq()
1117 genpd->status = GPD_STATE_POWER_OFF; in pm_genpd_restore_noirq()
1118 if (genpd->suspend_power_off) { in pm_genpd_restore_noirq()
1123 if (genpd->power_off) in pm_genpd_restore_noirq()
1124 genpd->power_off(genpd); in pm_genpd_restore_noirq()
1130 if (genpd->suspend_power_off) in pm_genpd_restore_noirq()
1133 pm_genpd_poweron(genpd); in pm_genpd_restore_noirq()
1135 return dev_gpd_data(dev)->always_on ? 0 : genpd_start_dev(genpd, dev); in pm_genpd_restore_noirq()
1149 struct generic_pm_domain *genpd; in pm_genpd_complete() local
1154 genpd = dev_to_genpd(dev); in pm_genpd_complete()
1155 if (IS_ERR(genpd)) in pm_genpd_complete()
1158 mutex_lock(&genpd->lock); in pm_genpd_complete()
1160 run_complete = !genpd->suspend_power_off; in pm_genpd_complete()
1161 if (--genpd->prepared_count == 0) in pm_genpd_complete()
1162 genpd->suspend_power_off = false; in pm_genpd_complete()
1164 mutex_unlock(&genpd->lock); in pm_genpd_complete()
1200 int __pm_genpd_add_device(struct generic_pm_domain *genpd, struct device *dev, in __pm_genpd_add_device() argument
1209 if (IS_ERR_OR_NULL(genpd) || IS_ERR_OR_NULL(dev)) in __pm_genpd_add_device()
1212 genpd_acquire_lock(genpd); in __pm_genpd_add_device()
1214 if (genpd->status == GPD_STATE_POWER_OFF) { in __pm_genpd_add_device()
1219 if (genpd->prepared_count > 0) { in __pm_genpd_add_device()
1224 list_for_each_entry(pdd, &genpd->dev_list, list_node) in __pm_genpd_add_device()
1236 genpd->device_count++; in __pm_genpd_add_device()
1238 dev->pm_domain = &genpd->domain; in __pm_genpd_add_device()
1243 list_add_tail(&gpd_data->base.list_node, &genpd->dev_list); in __pm_genpd_add_device()
1248 genpd_release_lock(genpd); in __pm_genpd_add_device()
1263 struct generic_pm_domain *genpd = NULL, *gpd; in __pm_genpd_of_add_device() local
1273 genpd = gpd; in __pm_genpd_of_add_device()
1279 if (!genpd) in __pm_genpd_of_add_device()
1282 return __pm_genpd_add_device(genpd, dev, td); in __pm_genpd_of_add_device()
1290 int pm_genpd_remove_device(struct generic_pm_domain *genpd, in pm_genpd_remove_device() argument
1298 if (IS_ERR_OR_NULL(genpd) || IS_ERR_OR_NULL(dev)) in pm_genpd_remove_device()
1301 genpd_acquire_lock(genpd); in pm_genpd_remove_device()
1303 if (genpd->prepared_count > 0) { in pm_genpd_remove_device()
1308 list_for_each_entry(pdd, &genpd->dev_list, list_node) { in pm_genpd_remove_device()
1318 genpd->device_count--; in pm_genpd_remove_device()
1325 genpd_release_lock(genpd); in pm_genpd_remove_device()
1355 int pm_genpd_add_subdomain(struct generic_pm_domain *genpd, in pm_genpd_add_subdomain() argument
1361 if (IS_ERR_OR_NULL(genpd) || IS_ERR_OR_NULL(subdomain)) in pm_genpd_add_subdomain()
1365 genpd_acquire_lock(genpd); in pm_genpd_add_subdomain()
1371 genpd_release_lock(genpd); in pm_genpd_add_subdomain()
1375 if (genpd->status == GPD_STATE_POWER_OFF in pm_genpd_add_subdomain()
1381 list_for_each_entry(link, &genpd->slave_links, slave_node) { in pm_genpd_add_subdomain()
1382 if (link->slave == subdomain && link->master == genpd) { in pm_genpd_add_subdomain()
1393 link->master = genpd; in pm_genpd_add_subdomain()
1394 list_add_tail(&link->master_node, &genpd->master_links); in pm_genpd_add_subdomain()
1398 genpd_sd_counter_inc(genpd); in pm_genpd_add_subdomain()
1402 genpd_release_lock(genpd); in pm_genpd_add_subdomain()
1412 int pm_genpd_remove_subdomain(struct generic_pm_domain *genpd, in pm_genpd_remove_subdomain() argument
1418 if (IS_ERR_OR_NULL(genpd) || IS_ERR_OR_NULL(subdomain)) in pm_genpd_remove_subdomain()
1422 genpd_acquire_lock(genpd); in pm_genpd_remove_subdomain()
1424 list_for_each_entry(link, &genpd->master_links, master_node) { in pm_genpd_remove_subdomain()
1433 genpd_release_lock(genpd); in pm_genpd_remove_subdomain()
1441 genpd_sd_counter_dec(genpd); in pm_genpd_remove_subdomain()
1449 genpd_release_lock(genpd); in pm_genpd_remove_subdomain()
1673 void pm_genpd_init(struct generic_pm_domain *genpd, in pm_genpd_init() argument
1676 if (IS_ERR_OR_NULL(genpd)) in pm_genpd_init()
1679 INIT_LIST_HEAD(&genpd->master_links); in pm_genpd_init()
1680 INIT_LIST_HEAD(&genpd->slave_links); in pm_genpd_init()
1681 INIT_LIST_HEAD(&genpd->dev_list); in pm_genpd_init()
1682 mutex_init(&genpd->lock); in pm_genpd_init()
1683 genpd->gov = gov; in pm_genpd_init()
1684 INIT_WORK(&genpd->power_off_work, genpd_power_off_work_fn); in pm_genpd_init()
1685 genpd->in_progress = 0; in pm_genpd_init()
1686 atomic_set(&genpd->sd_count, 0); in pm_genpd_init()
1687 genpd->status = is_off ? GPD_STATE_POWER_OFF : GPD_STATE_ACTIVE; in pm_genpd_init()
1688 init_waitqueue_head(&genpd->status_wait_queue); in pm_genpd_init()
1689 genpd->poweroff_task = NULL; in pm_genpd_init()
1690 genpd->resume_count = 0; in pm_genpd_init()
1691 genpd->device_count = 0; in pm_genpd_init()
1692 genpd->max_off_time_ns = -1; in pm_genpd_init()
1693 genpd->domain.ops.runtime_suspend = pm_genpd_runtime_suspend; in pm_genpd_init()
1694 genpd->domain.ops.runtime_resume = pm_genpd_runtime_resume; in pm_genpd_init()
1695 genpd->domain.ops.runtime_idle = pm_generic_runtime_idle; in pm_genpd_init()
1696 genpd->domain.ops.prepare = pm_genpd_prepare; in pm_genpd_init()
1697 genpd->domain.ops.suspend = pm_genpd_suspend; in pm_genpd_init()
1698 genpd->domain.ops.suspend_late = pm_genpd_suspend_late; in pm_genpd_init()
1699 genpd->domain.ops.suspend_noirq = pm_genpd_suspend_noirq; in pm_genpd_init()
1700 genpd->domain.ops.resume_noirq = pm_genpd_resume_noirq; in pm_genpd_init()
1701 genpd->domain.ops.resume_early = pm_genpd_resume_early; in pm_genpd_init()
1702 genpd->domain.ops.resume = pm_genpd_resume; in pm_genpd_init()
1703 genpd->domain.ops.freeze = pm_genpd_freeze; in pm_genpd_init()
1704 genpd->domain.ops.freeze_late = pm_genpd_freeze_late; in pm_genpd_init()
1705 genpd->domain.ops.freeze_noirq = pm_genpd_freeze_noirq; in pm_genpd_init()
1706 genpd->domain.ops.thaw_noirq = pm_genpd_thaw_noirq; in pm_genpd_init()
1707 genpd->domain.ops.thaw_early = pm_genpd_thaw_early; in pm_genpd_init()
1708 genpd->domain.ops.thaw = pm_genpd_thaw; in pm_genpd_init()
1709 genpd->domain.ops.poweroff = pm_genpd_suspend; in pm_genpd_init()
1710 genpd->domain.ops.poweroff_late = pm_genpd_suspend_late; in pm_genpd_init()
1711 genpd->domain.ops.poweroff_noirq = pm_genpd_suspend_noirq; in pm_genpd_init()
1712 genpd->domain.ops.restore_noirq = pm_genpd_restore_noirq; in pm_genpd_init()
1713 genpd->domain.ops.restore_early = pm_genpd_resume_early; in pm_genpd_init()
1714 genpd->domain.ops.restore = pm_genpd_resume; in pm_genpd_init()
1715 genpd->domain.ops.complete = pm_genpd_complete; in pm_genpd_init()
1716 genpd->dev_ops.save_state = pm_genpd_default_save_state; in pm_genpd_init()
1717 genpd->dev_ops.restore_state = pm_genpd_default_restore_state; in pm_genpd_init()
1718 genpd->dev_ops.suspend = pm_genpd_default_suspend; in pm_genpd_init()
1719 genpd->dev_ops.suspend_late = pm_genpd_default_suspend_late; in pm_genpd_init()
1720 genpd->dev_ops.resume_early = pm_genpd_default_resume_early; in pm_genpd_init()
1721 genpd->dev_ops.resume = pm_genpd_default_resume; in pm_genpd_init()
1722 genpd->dev_ops.freeze = pm_genpd_default_freeze; in pm_genpd_init()
1723 genpd->dev_ops.freeze_late = pm_genpd_default_freeze_late; in pm_genpd_init()
1724 genpd->dev_ops.thaw_early = pm_genpd_default_thaw_early; in pm_genpd_init()
1725 genpd->dev_ops.thaw = pm_genpd_default_thaw; in pm_genpd_init()
1727 list_add(&genpd->gpd_list_node, &gpd_list); in pm_genpd_init()