• Home
  • Raw
  • Download

Lines Matching +full:power +full:- +full:domain

2  * drivers/base/power/domain.c - Common code related to device power domains.
24 #include "power.h"
33 __routine = genpd->dev_ops.callback; \
52 mutex_lock(&genpd->mlock); in genpd_lock_mtx()
58 mutex_lock_nested(&genpd->mlock, depth); in genpd_lock_nested_mtx()
63 return mutex_lock_interruptible(&genpd->mlock); in genpd_lock_interruptible_mtx()
68 return mutex_unlock(&genpd->mlock); in genpd_unlock_mtx()
79 __acquires(&genpd->slock) in genpd_lock_spin()
83 spin_lock_irqsave(&genpd->slock, flags); in genpd_lock_spin()
84 genpd->lock_flags = flags; in genpd_lock_spin()
89 __acquires(&genpd->slock) in genpd_lock_nested_spin()
93 spin_lock_irqsave_nested(&genpd->slock, flags, depth); in genpd_lock_nested_spin()
94 genpd->lock_flags = flags; in genpd_lock_nested_spin()
98 __acquires(&genpd->slock) in genpd_lock_interruptible_spin()
102 spin_lock_irqsave(&genpd->slock, flags); in genpd_lock_interruptible_spin()
103 genpd->lock_flags = flags; in genpd_lock_interruptible_spin()
108 __releases(&genpd->slock) in genpd_unlock_spin()
110 spin_unlock_irqrestore(&genpd->slock, genpd->lock_flags); in genpd_unlock_spin()
120 #define genpd_lock(p) p->lock_ops->lock(p)
121 #define genpd_lock_nested(p, d) p->lock_ops->lock_nested(p, d)
122 #define genpd_lock_interruptible(p) p->lock_ops->lock_interruptible(p)
123 #define genpd_unlock(p) p->lock_ops->unlock(p)
125 #define genpd_status_on(genpd) (genpd->status == GPD_STATE_ACTIVE)
126 #define genpd_is_irq_safe(genpd) (genpd->flags & GENPD_FLAG_IRQ_SAFE)
127 #define genpd_is_always_on(genpd) (genpd->flags & GENPD_FLAG_ALWAYS_ON)
128 #define genpd_is_active_wakeup(genpd) (genpd->flags & GENPD_FLAG_ACTIVE_WAKEUP)
138 * Warn once if an IRQ safe device is attached to a no sleep domain, as in irq_safe_dev_in_no_sleep_domain()
140 * domain this isn't case, thus don't warn. in irq_safe_dev_in_no_sleep_domain()
143 dev_warn_once(dev, "PM domain %s will not be powered off\n", in irq_safe_dev_in_no_sleep_domain()
144 genpd->name); in irq_safe_dev_in_no_sleep_domain()
150 * Get the generic PM domain for a particular struct device.
151 * This validates the struct device pointer, the PM domain pointer,
152 * and checks that the PM domain pointer is a real generic PM domain.
159 if (IS_ERR_OR_NULL(dev) || IS_ERR_OR_NULL(dev->pm_domain)) in genpd_lookup_dev()
164 if (&gpd->domain == dev->pm_domain) { in genpd_lookup_dev()
176 * attached to the device is a genpd domain.
180 if (IS_ERR_OR_NULL(dev->pm_domain)) in dev_to_genpd()
181 return ERR_PTR(-EINVAL); in dev_to_genpd()
183 return pd_to_genpd(dev->pm_domain); in dev_to_genpd()
202 if (!WARN_ON(atomic_read(&genpd->sd_count) == 0)) in genpd_sd_counter_dec()
203 ret = !!atomic_dec_and_test(&genpd->sd_count); in genpd_sd_counter_dec()
210 atomic_inc(&genpd->sd_count); in genpd_sd_counter_inc()
220 delta = ktime_sub(now, genpd->accounting_time); in genpd_update_accounting()
223 * If genpd->status is active, it means we are just in genpd_update_accounting()
227 if (genpd->status == GPD_STATE_ACTIVE) { in genpd_update_accounting()
228 int state_idx = genpd->state_idx; in genpd_update_accounting()
230 genpd->states[state_idx].idle_time = in genpd_update_accounting()
231 ktime_add(genpd->states[state_idx].idle_time, delta); in genpd_update_accounting()
233 genpd->on_time = ktime_add(genpd->on_time, delta); in genpd_update_accounting()
236 genpd->accounting_time = now; in genpd_update_accounting()
243 * dev_pm_genpd_set_performance_state- Set performance state of device's power
244 * domain.
246 * @dev: Device for which the performance-state needs to be set.
267 return -ENODEV; in dev_pm_genpd_set_performance_state()
269 if (unlikely(!genpd->set_performance_state)) in dev_pm_genpd_set_performance_state()
270 return -EINVAL; in dev_pm_genpd_set_performance_state()
272 if (unlikely(!dev->power.subsys_data || in dev_pm_genpd_set_performance_state()
273 !dev->power.subsys_data->domain_data)) { in dev_pm_genpd_set_performance_state()
275 return -EINVAL; in dev_pm_genpd_set_performance_state()
280 gpd_data = to_gpd_data(dev->power.subsys_data->domain_data); in dev_pm_genpd_set_performance_state()
281 prev = gpd_data->performance_state; in dev_pm_genpd_set_performance_state()
282 gpd_data->performance_state = state; in dev_pm_genpd_set_performance_state()
285 if (state == genpd->performance_state) in dev_pm_genpd_set_performance_state()
289 if (state > genpd->performance_state) in dev_pm_genpd_set_performance_state()
292 /* Traverse all devices within the domain */ in dev_pm_genpd_set_performance_state()
293 list_for_each_entry(pdd, &genpd->dev_list, list_node) { in dev_pm_genpd_set_performance_state()
296 if (pd_data->performance_state > state) in dev_pm_genpd_set_performance_state()
297 state = pd_data->performance_state; in dev_pm_genpd_set_performance_state()
300 if (state == genpd->performance_state) in dev_pm_genpd_set_performance_state()
307 * one-to-one mapping and would require additional information. We can in dev_pm_genpd_set_performance_state()
315 ret = genpd->set_performance_state(genpd, state); in dev_pm_genpd_set_performance_state()
317 gpd_data->performance_state = prev; in dev_pm_genpd_set_performance_state()
322 genpd->performance_state = state; in dev_pm_genpd_set_performance_state()
333 unsigned int state_idx = genpd->state_idx; in _genpd_power_on()
338 if (!genpd->power_on) in _genpd_power_on()
342 return genpd->power_on(genpd); in _genpd_power_on()
345 ret = genpd->power_on(genpd); in _genpd_power_on()
351 if (unlikely(genpd->set_performance_state)) { in _genpd_power_on()
352 ret = genpd->set_performance_state(genpd, genpd->performance_state); in _genpd_power_on()
355 genpd->name, genpd->performance_state, ret); in _genpd_power_on()
359 if (elapsed_ns <= genpd->states[state_idx].power_on_latency_ns) in _genpd_power_on()
362 genpd->states[state_idx].power_on_latency_ns = elapsed_ns; in _genpd_power_on()
363 genpd->max_off_time_changed = true; in _genpd_power_on()
364 pr_debug("%s: Power-%s latency exceeded, new value %lld ns\n", in _genpd_power_on()
365 genpd->name, "on", elapsed_ns); in _genpd_power_on()
372 unsigned int state_idx = genpd->state_idx; in _genpd_power_off()
377 if (!genpd->power_off) in _genpd_power_off()
381 return genpd->power_off(genpd); in _genpd_power_off()
384 ret = genpd->power_off(genpd); in _genpd_power_off()
385 if (ret == -EBUSY) in _genpd_power_off()
389 if (elapsed_ns <= genpd->states[state_idx].power_off_latency_ns) in _genpd_power_off()
392 genpd->states[state_idx].power_off_latency_ns = elapsed_ns; in _genpd_power_off()
393 genpd->max_off_time_changed = true; in _genpd_power_off()
394 pr_debug("%s: Power-%s latency exceeded, new value %lld ns\n", in _genpd_power_off()
395 genpd->name, "off", elapsed_ns); in _genpd_power_off()
401 * genpd_queue_power_off_work - Queue up the execution of genpd_power_off().
402 * @genpd: PM domain to power off.
409 queue_work(pm_wq, &genpd->power_off_work); in genpd_queue_power_off_work()
413 * genpd_power_off - Remove power from a given PM domain.
414 * @genpd: PM domain to power down.
415 * @one_dev_on: If invoked from genpd's ->runtime_suspend|resume() callback, the
418 * be RPM_SUSPENDED, while it tries to power off the PM domain.
421 * have been powered down, remove power from @genpd.
431 * Do not try to power off the domain in the following situations: in genpd_power_off()
432 * (1) The domain is already in the "power off" state. in genpd_power_off()
435 if (!genpd_status_on(genpd) || genpd->prepared_count > 0) in genpd_power_off()
439 * Abort power off for the PM domain in the following situations: in genpd_power_off()
440 * (1) The domain is configured as always on. in genpd_power_off()
441 * (2) When the domain has a subdomain being powered on. in genpd_power_off()
443 if (genpd_is_always_on(genpd) || atomic_read(&genpd->sd_count) > 0) in genpd_power_off()
444 return -EBUSY; in genpd_power_off()
446 list_for_each_entry(pdd, &genpd->dev_list, list_node) { in genpd_power_off()
449 stat = dev_pm_qos_flags(pdd->dev, PM_QOS_FLAG_NO_POWER_OFF); in genpd_power_off()
451 return -EBUSY; in genpd_power_off()
454 * Do not allow PM domain to be powered off, when an IRQ safe in genpd_power_off()
455 * device is part of a non-IRQ safe domain. in genpd_power_off()
457 if (!pm_runtime_suspended(pdd->dev) || in genpd_power_off()
458 irq_safe_dev_in_no_sleep_domain(pdd->dev, genpd)) in genpd_power_off()
463 return -EBUSY; in genpd_power_off()
465 if (genpd->gov && genpd->gov->power_down_ok) { in genpd_power_off()
466 if (!genpd->gov->power_down_ok(&genpd->domain)) in genpd_power_off()
467 return -EAGAIN; in genpd_power_off()
471 if (!genpd->gov) in genpd_power_off()
472 genpd->state_idx = 0; in genpd_power_off()
474 if (genpd->power_off) { in genpd_power_off()
477 if (atomic_read(&genpd->sd_count) > 0) in genpd_power_off()
478 return -EBUSY; in genpd_power_off()
485 * the genpd_power_on() restore power for us (this shouldn't in genpd_power_off()
493 genpd->status = GPD_STATE_POWER_OFF; in genpd_power_off()
496 list_for_each_entry(link, &genpd->slave_links, slave_node) { in genpd_power_off()
497 genpd_sd_counter_dec(link->master); in genpd_power_off()
498 genpd_lock_nested(link->master, depth + 1); in genpd_power_off()
499 genpd_power_off(link->master, false, depth + 1); in genpd_power_off()
500 genpd_unlock(link->master); in genpd_power_off()
507 * genpd_power_on - Restore power to a given PM domain and its masters.
508 * @genpd: PM domain to power up.
511 * Restore power to @genpd and all of its masters so that it is possible to
527 list_for_each_entry(link, &genpd->slave_links, slave_node) { in genpd_power_on()
528 struct generic_pm_domain *master = link->master; in genpd_power_on()
546 genpd->status = GPD_STATE_ACTIVE; in genpd_power_on()
553 &genpd->slave_links, in genpd_power_on()
555 genpd_sd_counter_dec(link->master); in genpd_power_on()
556 genpd_lock_nested(link->master, depth + 1); in genpd_power_on()
557 genpd_power_off(link->master, false, depth + 1); in genpd_power_on()
558 genpd_unlock(link->master); in genpd_power_on()
571 dev = gpd_data->base.dev; in genpd_dev_pm_qos_notifier()
577 spin_lock_irq(&dev->power.lock); in genpd_dev_pm_qos_notifier()
579 pdd = dev->power.subsys_data ? in genpd_dev_pm_qos_notifier()
580 dev->power.subsys_data->domain_data : NULL; in genpd_dev_pm_qos_notifier()
582 to_gpd_data(pdd)->td.constraint_changed = true; in genpd_dev_pm_qos_notifier()
585 genpd = ERR_PTR(-ENODATA); in genpd_dev_pm_qos_notifier()
588 spin_unlock_irq(&dev->power.lock); in genpd_dev_pm_qos_notifier()
592 genpd->max_off_time_changed = true; in genpd_dev_pm_qos_notifier()
596 dev = dev->parent; in genpd_dev_pm_qos_notifier()
597 if (!dev || dev->power.ignore_children) in genpd_dev_pm_qos_notifier()
605 * genpd_power_off_work_fn - Power off PM domain whose subdomain count is 0.
620 * __genpd_runtime_suspend - walk the hierarchy of ->runtime_suspend() callbacks
627 if (dev->type && dev->type->pm) in __genpd_runtime_suspend()
628 cb = dev->type->pm->runtime_suspend; in __genpd_runtime_suspend()
629 else if (dev->class && dev->class->pm) in __genpd_runtime_suspend()
630 cb = dev->class->pm->runtime_suspend; in __genpd_runtime_suspend()
631 else if (dev->bus && dev->bus->pm) in __genpd_runtime_suspend()
632 cb = dev->bus->pm->runtime_suspend; in __genpd_runtime_suspend()
636 if (!cb && dev->driver && dev->driver->pm) in __genpd_runtime_suspend()
637 cb = dev->driver->pm->runtime_suspend; in __genpd_runtime_suspend()
643 * __genpd_runtime_resume - walk the hierarchy of ->runtime_resume() callbacks
650 if (dev->type && dev->type->pm) in __genpd_runtime_resume()
651 cb = dev->type->pm->runtime_resume; in __genpd_runtime_resume()
652 else if (dev->class && dev->class->pm) in __genpd_runtime_resume()
653 cb = dev->class->pm->runtime_resume; in __genpd_runtime_resume()
654 else if (dev->bus && dev->bus->pm) in __genpd_runtime_resume()
655 cb = dev->bus->pm->runtime_resume; in __genpd_runtime_resume()
659 if (!cb && dev->driver && dev->driver->pm) in __genpd_runtime_resume()
660 cb = dev->driver->pm->runtime_resume; in __genpd_runtime_resume()
666 * genpd_runtime_suspend - Suspend a device belonging to I/O PM domain.
670 * pm_domain field points to the domain member of an object of type
671 * struct generic_pm_domain representing a PM domain consisting of I/O devices.
677 struct gpd_timing_data *td = &dev_gpd_data(dev)->td; in genpd_runtime_suspend()
687 return -EINVAL; in genpd_runtime_suspend()
690 * A runtime PM centric subsystem/driver may re-use the runtime PM in genpd_runtime_suspend()
695 suspend_ok = genpd->gov ? genpd->gov->suspend_ok : NULL; in genpd_runtime_suspend()
697 return -EBUSY; in genpd_runtime_suspend()
717 if (elapsed_ns > td->suspend_latency_ns) { in genpd_runtime_suspend()
718 td->suspend_latency_ns = elapsed_ns; in genpd_runtime_suspend()
721 genpd->max_off_time_changed = true; in genpd_runtime_suspend()
722 td->constraint_changed = true; in genpd_runtime_suspend()
727 * If power.irq_safe is set, this routine may be run with in genpd_runtime_suspend()
728 * IRQs disabled, so suspend only if the PM domain also is irq_safe. in genpd_runtime_suspend()
741 * genpd_runtime_resume - Resume a device belonging to I/O PM domain.
745 * pm_domain field points to the domain member of an object of type
746 * struct generic_pm_domain representing a PM domain consisting of I/O devices.
751 struct gpd_timing_data *td = &dev_gpd_data(dev)->td; in genpd_runtime_resume()
762 return -EINVAL; in genpd_runtime_resume()
765 * As we don't power off a non IRQ safe domain, which holds in genpd_runtime_resume()
766 * an IRQ safe device, we don't need to restore power to it. in genpd_runtime_resume()
797 if (elapsed_ns > td->resume_latency_ns) { in genpd_runtime_resume()
798 td->resume_latency_ns = elapsed_ns; in genpd_runtime_resume()
801 genpd->max_off_time_changed = true; in genpd_runtime_resume()
802 td->constraint_changed = true; in genpd_runtime_resume()
830 * genpd_power_off_unused - Power off all PM domains with no devices in use.
837 pr_warn("genpd: Not disabling unused power domains\n"); in genpd_power_off_unused()
873 * genpd_sync_power_off - Synchronously power off a PM domain and its masters.
874 * @genpd: PM domain to power off, if possible.
878 * Check if the given PM domain can be powered off (during system suspend or
881 * This function is only called in "noirq" and "syscore" stages of system power
893 if (genpd->suspended_count != genpd->device_count in genpd_sync_power_off()
894 || atomic_read(&genpd->sd_count) > 0) in genpd_sync_power_off()
898 genpd->state_idx = genpd->state_count - 1; in genpd_sync_power_off()
902 genpd->status = GPD_STATE_POWER_OFF; in genpd_sync_power_off()
904 list_for_each_entry(link, &genpd->slave_links, slave_node) { in genpd_sync_power_off()
905 genpd_sd_counter_dec(link->master); in genpd_sync_power_off()
908 genpd_lock_nested(link->master, depth + 1); in genpd_sync_power_off()
910 genpd_sync_power_off(link->master, use_lock, depth + 1); in genpd_sync_power_off()
913 genpd_unlock(link->master); in genpd_sync_power_off()
918 * genpd_sync_power_on - Synchronously power on a PM domain and its masters.
919 * @genpd: PM domain to power on.
923 * This function is only called in "noirq" and "syscore" stages of system power
935 list_for_each_entry(link, &genpd->slave_links, slave_node) { in genpd_sync_power_on()
936 genpd_sd_counter_inc(link->master); in genpd_sync_power_on()
939 genpd_lock_nested(link->master, depth + 1); in genpd_sync_power_on()
941 genpd_sync_power_on(link->master, use_lock, depth + 1); in genpd_sync_power_on()
944 genpd_unlock(link->master); in genpd_sync_power_on()
949 genpd->status = GPD_STATE_ACTIVE; in genpd_sync_power_on()
953 * resume_needed - Check whether to resume a device before system suspend.
955 * @genpd: PM domain the device belongs to.
981 * genpd_prepare - Start power transition of a device in a PM domain.
984 * Start a power transition of a device (during a system-wide power transition)
985 * under the assumption that its pm_domain field points to the domain member of
986 * an object of type struct generic_pm_domain representing a PM domain
998 return -EINVAL; in genpd_prepare()
1010 if (genpd->prepared_count++ == 0) in genpd_prepare()
1011 genpd->suspended_count = 0; in genpd_prepare()
1019 genpd->prepared_count--; in genpd_prepare()
1029 * genpd_finish_suspend - Completion of suspend or hibernation of device in an
1030 * I/O pm domain.
1034 * Stop the device and remove power from the domain if all devices in it have
1044 return -EINVAL; in genpd_finish_suspend()
1053 if (dev->power.wakeup_path && genpd_is_active_wakeup(genpd)) in genpd_finish_suspend()
1056 if (genpd->dev_ops.stop && genpd->dev_ops.start && in genpd_finish_suspend()
1069 genpd->suspended_count++; in genpd_finish_suspend()
1077 * genpd_suspend_noirq - Completion of suspend of device in an I/O PM domain.
1080 * Stop the device and remove power from the domain if all devices in it have
1091 * genpd_resume_noirq - Start of resume of device in an I/O PM domain.
1094 * Restore power to the device's PM domain, if necessary, and start the device.
1105 return -EINVAL; in genpd_resume_noirq()
1107 if (dev->power.wakeup_path && genpd_is_active_wakeup(genpd)) in genpd_resume_noirq()
1112 genpd->suspended_count--; in genpd_resume_noirq()
1115 if (genpd->dev_ops.stop && genpd->dev_ops.start && in genpd_resume_noirq()
1126 * genpd_freeze_noirq - Completion of freezing a device in an I/O PM domain.
1130 * pm_domain field points to the domain member of an object of type
1131 * struct generic_pm_domain representing a power domain consisting of I/O
1143 return -EINVAL; in genpd_freeze_noirq()
1149 if (genpd->dev_ops.stop && genpd->dev_ops.start && in genpd_freeze_noirq()
1157 * genpd_thaw_noirq - Early thaw of device in an I/O PM domain.
1160 * Start the device, unless power has been removed from the domain already
1172 return -EINVAL; in genpd_thaw_noirq()
1174 if (genpd->dev_ops.stop && genpd->dev_ops.start && in genpd_thaw_noirq()
1185 * genpd_poweroff_noirq - Completion of hibernation of device in an
1186 * I/O PM domain.
1189 * Stop the device and remove power from the domain if all devices in it have
1200 * genpd_restore_noirq - Start of restore of device in an I/O PM domain.
1203 * Make sure the domain will be in the same power state as before the
1215 return -EINVAL; in genpd_restore_noirq()
1219 * first time for the given domain in the present cycle. in genpd_restore_noirq()
1222 if (genpd->suspended_count++ == 0) in genpd_restore_noirq()
1224 * The boot kernel might put the domain into arbitrary state, in genpd_restore_noirq()
1226 * so that it tries to power it on in case it was really off. in genpd_restore_noirq()
1228 genpd->status = GPD_STATE_POWER_OFF; in genpd_restore_noirq()
1233 if (genpd->dev_ops.stop && genpd->dev_ops.start && in genpd_restore_noirq()
1244 * genpd_complete - Complete power transition of a device in a power domain.
1247 * Complete a power transition of a device (during a system-wide power
1249 * domain member of an object of type struct generic_pm_domain representing
1250 * a power domain consisting of I/O devices.
1266 genpd->prepared_count--; in genpd_complete()
1267 if (!genpd->prepared_count) in genpd_complete()
1274 * genpd_syscore_switch - Switch power during system core suspend or resume.
1275 * @dev: Device that normally is marked as "always on" to switch power for.
1289 genpd->suspended_count++; in genpd_syscore_switch()
1293 genpd->suspended_count--; in genpd_syscore_switch()
1334 ret = -ENOMEM; in genpd_alloc_dev_data()
1339 gpd_data->td = *td; in genpd_alloc_dev_data()
1341 gpd_data->base.dev = dev; in genpd_alloc_dev_data()
1342 gpd_data->td.constraint_changed = true; in genpd_alloc_dev_data()
1343 gpd_data->td.effective_constraint_ns = PM_QOS_RESUME_LATENCY_NO_CONSTRAINT_NS; in genpd_alloc_dev_data()
1344 gpd_data->nb.notifier_call = genpd_dev_pm_qos_notifier; in genpd_alloc_dev_data()
1346 spin_lock_irq(&dev->power.lock); in genpd_alloc_dev_data()
1348 if (dev->power.subsys_data->domain_data) { in genpd_alloc_dev_data()
1349 ret = -EINVAL; in genpd_alloc_dev_data()
1353 dev->power.subsys_data->domain_data = &gpd_data->base; in genpd_alloc_dev_data()
1355 spin_unlock_irq(&dev->power.lock); in genpd_alloc_dev_data()
1360 spin_unlock_irq(&dev->power.lock); in genpd_alloc_dev_data()
1370 spin_lock_irq(&dev->power.lock); in genpd_free_dev_data()
1372 dev->power.subsys_data->domain_data = NULL; in genpd_free_dev_data()
1374 spin_unlock_irq(&dev->power.lock); in genpd_free_dev_data()
1389 return -EINVAL; in genpd_add_device()
1395 ret = genpd->attach_dev ? genpd->attach_dev(genpd, dev) : 0; in genpd_add_device()
1401 dev_pm_domain_set(dev, &genpd->domain); in genpd_add_device()
1403 genpd->device_count++; in genpd_add_device()
1404 genpd->max_off_time_changed = true; in genpd_add_device()
1406 list_add_tail(&gpd_data->base.list_node, &genpd->dev_list); in genpd_add_device()
1413 dev_pm_qos_add_notifier(dev, &gpd_data->nb); in genpd_add_device()
1419 * pm_genpd_add_device - Add a device to an I/O PM domain.
1420 * @genpd: PM domain to add the device to.
1444 pdd = dev->power.subsys_data->domain_data; in genpd_remove_device()
1446 dev_pm_qos_remove_notifier(dev, &gpd_data->nb); in genpd_remove_device()
1450 if (genpd->prepared_count > 0) { in genpd_remove_device()
1451 ret = -EAGAIN; in genpd_remove_device()
1455 genpd->device_count--; in genpd_remove_device()
1456 genpd->max_off_time_changed = true; in genpd_remove_device()
1460 list_del_init(&pdd->list_node); in genpd_remove_device()
1464 if (genpd->detach_dev) in genpd_remove_device()
1465 genpd->detach_dev(genpd, dev); in genpd_remove_device()
1473 dev_pm_qos_add_notifier(dev, &gpd_data->nb); in genpd_remove_device()
1479 * pm_genpd_remove_device - Remove a device from an I/O PM domain.
1487 return -EINVAL; in pm_genpd_remove_device()
1501 return -EINVAL; in genpd_add_subdomain()
1504 * If the domain can be powered on/off in an IRQ safe in genpd_add_subdomain()
1510 genpd->name, subdomain->name); in genpd_add_subdomain()
1511 return -EINVAL; in genpd_add_subdomain()
1516 return -ENOMEM; in genpd_add_subdomain()
1522 ret = -EINVAL; in genpd_add_subdomain()
1526 list_for_each_entry(itr, &genpd->master_links, master_node) { in genpd_add_subdomain()
1527 if (itr->slave == subdomain && itr->master == genpd) { in genpd_add_subdomain()
1528 ret = -EINVAL; in genpd_add_subdomain()
1533 link->master = genpd; in genpd_add_subdomain()
1534 list_add_tail(&link->master_node, &genpd->master_links); in genpd_add_subdomain()
1535 link->slave = subdomain; in genpd_add_subdomain()
1536 list_add_tail(&link->slave_node, &subdomain->slave_links); in genpd_add_subdomain()
1549 * pm_genpd_add_subdomain - Add a subdomain to an I/O PM domain.
1550 * @genpd: Master PM domain to add the subdomain to.
1567 * pm_genpd_remove_subdomain - Remove a subdomain from an I/O PM domain.
1568 * @genpd: Master PM domain to remove the subdomain from.
1575 int ret = -EINVAL; in pm_genpd_remove_subdomain()
1578 return -EINVAL; in pm_genpd_remove_subdomain()
1583 if (!list_empty(&subdomain->master_links) || subdomain->device_count) { in pm_genpd_remove_subdomain()
1584 pr_warn("%s: unable to remove subdomain %s\n", genpd->name, in pm_genpd_remove_subdomain()
1585 subdomain->name); in pm_genpd_remove_subdomain()
1586 ret = -EBUSY; in pm_genpd_remove_subdomain()
1590 list_for_each_entry_safe(link, l, &genpd->master_links, master_node) { in pm_genpd_remove_subdomain()
1591 if (link->slave != subdomain) in pm_genpd_remove_subdomain()
1594 list_del(&link->master_node); in pm_genpd_remove_subdomain()
1595 list_del(&link->slave_node); in pm_genpd_remove_subdomain()
1618 return -ENOMEM; in genpd_set_default_power_state()
1620 genpd->states = state; in genpd_set_default_power_state()
1621 genpd->state_count = 1; in genpd_set_default_power_state()
1622 genpd->free = state; in genpd_set_default_power_state()
1629 if (genpd->flags & GENPD_FLAG_IRQ_SAFE) { in genpd_lock_init()
1630 spin_lock_init(&genpd->slock); in genpd_lock_init()
1631 genpd->lock_ops = &genpd_spin_ops; in genpd_lock_init()
1633 mutex_init(&genpd->mlock); in genpd_lock_init()
1634 genpd->lock_ops = &genpd_mtx_ops; in genpd_lock_init()
1639 * pm_genpd_init - Initialize a generic I/O PM domain object.
1640 * @genpd: PM domain object to initialize.
1641 * @gov: PM domain governor to associate with the domain (may be NULL).
1642 * @is_off: Initial value of the domain's power_is_off field.
1652 return -EINVAL; in pm_genpd_init()
1654 INIT_LIST_HEAD(&genpd->master_links); in pm_genpd_init()
1655 INIT_LIST_HEAD(&genpd->slave_links); in pm_genpd_init()
1656 INIT_LIST_HEAD(&genpd->dev_list); in pm_genpd_init()
1658 genpd->gov = gov; in pm_genpd_init()
1659 INIT_WORK(&genpd->power_off_work, genpd_power_off_work_fn); in pm_genpd_init()
1660 atomic_set(&genpd->sd_count, 0); in pm_genpd_init()
1661 genpd->status = is_off ? GPD_STATE_POWER_OFF : GPD_STATE_ACTIVE; in pm_genpd_init()
1662 genpd->device_count = 0; in pm_genpd_init()
1663 genpd->max_off_time_ns = -1; in pm_genpd_init()
1664 genpd->max_off_time_changed = true; in pm_genpd_init()
1665 genpd->provider = NULL; in pm_genpd_init()
1666 genpd->has_provider = false; in pm_genpd_init()
1667 genpd->accounting_time = ktime_get(); in pm_genpd_init()
1668 genpd->domain.ops.runtime_suspend = genpd_runtime_suspend; in pm_genpd_init()
1669 genpd->domain.ops.runtime_resume = genpd_runtime_resume; in pm_genpd_init()
1670 genpd->domain.ops.prepare = genpd_prepare; in pm_genpd_init()
1671 genpd->domain.ops.suspend_noirq = genpd_suspend_noirq; in pm_genpd_init()
1672 genpd->domain.ops.resume_noirq = genpd_resume_noirq; in pm_genpd_init()
1673 genpd->domain.ops.freeze_noirq = genpd_freeze_noirq; in pm_genpd_init()
1674 genpd->domain.ops.thaw_noirq = genpd_thaw_noirq; in pm_genpd_init()
1675 genpd->domain.ops.poweroff_noirq = genpd_poweroff_noirq; in pm_genpd_init()
1676 genpd->domain.ops.restore_noirq = genpd_restore_noirq; in pm_genpd_init()
1677 genpd->domain.ops.complete = genpd_complete; in pm_genpd_init()
1679 if (genpd->flags & GENPD_FLAG_PM_CLK) { in pm_genpd_init()
1680 genpd->dev_ops.stop = pm_clk_suspend; in pm_genpd_init()
1681 genpd->dev_ops.start = pm_clk_resume; in pm_genpd_init()
1684 /* Always-on domains must be powered on at initialization. */ in pm_genpd_init()
1686 return -EINVAL; in pm_genpd_init()
1689 if (genpd->state_count == 0) { in pm_genpd_init()
1694 pr_warn("%s : no governor for states\n", genpd->name); in pm_genpd_init()
1697 device_initialize(&genpd->dev); in pm_genpd_init()
1698 dev_set_name(&genpd->dev, "%s", genpd->name); in pm_genpd_init()
1701 list_add(&genpd->gpd_list_node, &gpd_list); in pm_genpd_init()
1713 return -EINVAL; in genpd_remove()
1717 if (genpd->has_provider) { in genpd_remove()
1719 pr_err("Provider present, unable to remove %s\n", genpd->name); in genpd_remove()
1720 return -EBUSY; in genpd_remove()
1723 if (!list_empty(&genpd->master_links) || genpd->device_count) { in genpd_remove()
1725 pr_err("%s: unable to remove %s\n", __func__, genpd->name); in genpd_remove()
1726 return -EBUSY; in genpd_remove()
1729 list_for_each_entry_safe(link, l, &genpd->slave_links, slave_node) { in genpd_remove()
1730 list_del(&link->master_node); in genpd_remove()
1731 list_del(&link->slave_node); in genpd_remove()
1735 list_del(&genpd->gpd_list_node); in genpd_remove()
1737 cancel_work_sync(&genpd->power_off_work); in genpd_remove()
1738 kfree(genpd->free); in genpd_remove()
1739 pr_debug("%s: removed %s\n", __func__, genpd->name); in genpd_remove()
1745 * pm_genpd_remove - Remove a generic I/O PM domain
1746 * @genpd: Pointer to PM domain that is to be removed.
1748 * To remove the PM domain, this function:
1749 * - Removes the PM domain as a subdomain to any parent domains,
1751 * - Removes the PM domain from the list of registered PM domains.
1753 * The PM domain will only be removed, if the associated provider has
1754 * been removed, it is not a parent to any other PM domain and has no
1772 * Device Tree based PM domain providers.
1774 * The code below implements generic device tree based PM domain providers that
1778 * devices to these domains is supposed to register a PM domain provider, which
1779 * maps a PM domain specifier retrieved from the device tree to a PM domain.
1782 * - genpd_xlate_simple() for 1:1 device tree node to PM domain mapping.
1783 * - genpd_xlate_onecell() for mapping of multiple PM domains per node by
1788 * struct of_genpd_provider - PM domain provider registration structure
1789 * @link: Entry in global list of PM domain providers
1790 * @node: Pointer to device tree node of PM domain provider
1791 * @xlate: Provider-specific xlate callback mapping a set of specifier cells
1792 * into a PM domain.
1802 /* List of registered PM domain providers. */
1808 * genpd_xlate_simple() - Xlate function for direct node-domain mapping
1809 * @genpdspec: OF phandle args to map into a PM domain
1810 * @data: xlate function private data - pointer to struct generic_pm_domain
1824 * genpd_xlate_onecell() - Xlate function using a single index.
1825 * @genpdspec: OF phandle args to map into a PM domain
1826 * @data: xlate function private data - pointer to struct genpd_onecell_data
1828 * This is a generic xlate function that can be used to model simple PM domain
1838 unsigned int idx = genpdspec->args[0]; in genpd_xlate_onecell()
1840 if (genpdspec->args_count != 1) in genpd_xlate_onecell()
1841 return ERR_PTR(-EINVAL); in genpd_xlate_onecell()
1843 if (idx >= genpd_data->num_domains) { in genpd_xlate_onecell()
1844 pr_err("%s: invalid domain index %u\n", __func__, idx); in genpd_xlate_onecell()
1845 return ERR_PTR(-EINVAL); in genpd_xlate_onecell()
1848 if (!genpd_data->domains[idx]) in genpd_xlate_onecell()
1849 return ERR_PTR(-ENOENT); in genpd_xlate_onecell()
1851 return genpd_data->domains[idx]; in genpd_xlate_onecell()
1855 * genpd_add_provider() - Register a PM domain provider for a node
1856 * @np: Device node pointer associated with the PM domain provider.
1857 * @xlate: Callback for decoding PM domain from phandle arguments.
1867 return -ENOMEM; in genpd_add_provider()
1869 cp->node = of_node_get(np); in genpd_add_provider()
1870 cp->data = data; in genpd_add_provider()
1871 cp->xlate = xlate; in genpd_add_provider()
1874 list_add(&cp->link, &of_genpd_providers); in genpd_add_provider()
1876 pr_debug("Added domain provider from %pOF\n", np); in genpd_add_provider()
1882 * of_genpd_add_provider_simple() - Register a simple PM domain provider
1883 * @np: Device node pointer associated with the PM domain provider.
1884 * @genpd: Pointer to PM domain associated with the PM domain provider.
1889 int ret = -EINVAL; in of_genpd_add_provider_simple()
1892 return -EINVAL; in of_genpd_add_provider_simple()
1899 genpd->dev.of_node = np; in of_genpd_add_provider_simple()
1902 if (genpd->set_performance_state) { in of_genpd_add_provider_simple()
1903 ret = dev_pm_opp_of_add_table(&genpd->dev); in of_genpd_add_provider_simple()
1905 dev_err(&genpd->dev, "Failed to add OPP table: %d\n", in of_genpd_add_provider_simple()
1913 if (genpd->set_performance_state) in of_genpd_add_provider_simple()
1914 dev_pm_opp_of_remove_table(&genpd->dev); in of_genpd_add_provider_simple()
1919 genpd->provider = &np->fwnode; in of_genpd_add_provider_simple()
1920 genpd->has_provider = true; in of_genpd_add_provider_simple()
1930 * of_genpd_add_provider_onecell() - Register a onecell PM domain provider
1931 * @np: Device node pointer associated with the PM domain provider.
1932 * @data: Pointer to the data associated with the PM domain provider.
1939 int ret = -EINVAL; in of_genpd_add_provider_onecell()
1942 return -EINVAL; in of_genpd_add_provider_onecell()
1946 if (!data->xlate) in of_genpd_add_provider_onecell()
1947 data->xlate = genpd_xlate_onecell; in of_genpd_add_provider_onecell()
1949 for (i = 0; i < data->num_domains; i++) { in of_genpd_add_provider_onecell()
1950 genpd = data->domains[i]; in of_genpd_add_provider_onecell()
1957 genpd->dev.of_node = np; in of_genpd_add_provider_onecell()
1960 if (genpd->set_performance_state) { in of_genpd_add_provider_onecell()
1961 ret = dev_pm_opp_of_add_table_indexed(&genpd->dev, i); in of_genpd_add_provider_onecell()
1963 dev_err(&genpd->dev, "Failed to add OPP table for index %d: %d\n", in of_genpd_add_provider_onecell()
1969 genpd->provider = &np->fwnode; in of_genpd_add_provider_onecell()
1970 genpd->has_provider = true; in of_genpd_add_provider_onecell()
1973 ret = genpd_add_provider(np, data->xlate, data); in of_genpd_add_provider_onecell()
1982 while (i--) { in of_genpd_add_provider_onecell()
1983 genpd = data->domains[i]; in of_genpd_add_provider_onecell()
1988 genpd->provider = NULL; in of_genpd_add_provider_onecell()
1989 genpd->has_provider = false; in of_genpd_add_provider_onecell()
1991 if (genpd->set_performance_state) in of_genpd_add_provider_onecell()
1992 dev_pm_opp_of_remove_table(&genpd->dev); in of_genpd_add_provider_onecell()
2002 * of_genpd_del_provider() - Remove a previously registered PM domain provider
2003 * @np: Device node pointer associated with the PM domain provider
2013 if (cp->node == np) { in of_genpd_del_provider()
2015 * For each PM domain associated with the in of_genpd_del_provider()
2017 * so that the PM domain can be safely removed. in of_genpd_del_provider()
2020 if (gpd->provider == &np->fwnode) { in of_genpd_del_provider()
2021 gpd->has_provider = false; in of_genpd_del_provider()
2023 if (!gpd->set_performance_state) in of_genpd_del_provider()
2026 dev_pm_opp_of_remove_table(&gpd->dev); in of_genpd_del_provider()
2030 list_del(&cp->link); in of_genpd_del_provider()
2031 of_node_put(cp->node); in of_genpd_del_provider()
2042 * genpd_get_from_provider() - Look-up PM domain
2043 * @genpdspec: OF phandle args to use for look-up
2045 * Looks for a PM domain provider under the node specified by @genpdspec and if
2047 * domain.
2055 struct generic_pm_domain *genpd = ERR_PTR(-ENOENT); in genpd_get_from_provider()
2059 return ERR_PTR(-EINVAL); in genpd_get_from_provider()
2065 if (provider->node == genpdspec->np) in genpd_get_from_provider()
2066 genpd = provider->xlate(genpdspec, provider->data); in genpd_get_from_provider()
2077 * of_genpd_add_device() - Add a device to an I/O PM domain
2078 * @genpdspec: OF phandle args to use for look-up PM domain
2081 * Looks-up an I/O PM domain based upon phandle args provided and adds
2082 * the device to the PM domain. Returns a negative error code on failure.
2107 * of_genpd_add_subdomain - Add a subdomain to an I/O PM domain.
2108 * @parent_spec: OF phandle args to use for parent PM domain look-up
2109 * @subdomain_spec: OF phandle args to use for subdomain look-up
2111 * Looks-up a parent PM domain and subdomain based upon phandle args
2112 * provided and adds the subdomain to the parent PM domain. Returns a
2145 * of_genpd_remove_last - Remove the last PM domain registered for a provider
2148 * Find the last PM domain that was added by a particular provider and
2149 * remove this PM domain from the list of PM domains. The provider is
2151 * domain will only be removed, if the provider associated with domain
2159 struct generic_pm_domain *gpd, *tmp, *genpd = ERR_PTR(-ENOENT); in of_genpd_remove_last()
2163 return ERR_PTR(-EINVAL); in of_genpd_remove_last()
2167 if (gpd->provider == &np->fwnode) { in of_genpd_remove_last()
2189 * genpd_dev_pm_detach - Detach a device from its PM domain.
2193 * Try to locate a corresponding generic PM domain, which the device was
2206 dev_dbg(dev, "removing from PM domain %s\n", pd->name); in genpd_dev_pm_detach()
2210 if (ret != -EAGAIN) in genpd_dev_pm_detach()
2218 dev_err(dev, "failed to remove from PM domain %s: %d", in genpd_dev_pm_detach()
2219 pd->name, ret); in genpd_dev_pm_detach()
2223 /* Check if PM domain can be powered off after removing this device. */ in genpd_dev_pm_detach()
2227 if (dev->bus == &genpd_bus_type) in genpd_dev_pm_detach()
2249 ret = of_parse_phandle_with_args(np, "power-domains", in __genpd_dev_pm_attach()
2250 "#power-domain-cells", index, &pd_args); in __genpd_dev_pm_attach()
2259 dev_dbg(dev, "%s() failed to find PM domain: %ld\n", in __genpd_dev_pm_attach()
2264 dev_dbg(dev, "adding to PM domain %s\n", pd->name); in __genpd_dev_pm_attach()
2270 if (ret != -EPROBE_DEFER) in __genpd_dev_pm_attach()
2271 dev_err(dev, "failed to add to PM domain %s: %d", in __genpd_dev_pm_attach()
2272 pd->name, ret); in __genpd_dev_pm_attach()
2276 dev->pm_domain->detach = genpd_dev_pm_detach; in __genpd_dev_pm_attach()
2277 dev->pm_domain->sync = genpd_dev_pm_sync; in __genpd_dev_pm_attach()
2288 return ret ? -EPROBE_DEFER : 1; in __genpd_dev_pm_attach()
2292 * genpd_dev_pm_attach - Attach a device to its PM domain using DT.
2295 * Parse device's OF node to find a PM domain specifier. If such is found,
2298 * Returns 1 on successfully attached PM domain, 0 when the device don't need a
2299 * PM domain or when multiple power-domains exists for it, else a negative error
2300 * code. Note that if a power-domain exists for the device, but it cannot be
2301 * found or turned on, then return -EPROBE_DEFER to ensure that the device is
2302 * not probed and to re-try again later.
2306 if (!dev->of_node) in genpd_dev_pm_attach()
2311 * can only attach one PM domain per device. in genpd_dev_pm_attach()
2313 if (of_count_phandle_with_args(dev->of_node, "power-domains", in genpd_dev_pm_attach()
2314 "#power-domain-cells") != 1) in genpd_dev_pm_attach()
2317 return __genpd_dev_pm_attach(dev, dev->of_node, 0, true); in genpd_dev_pm_attach()
2322 * genpd_dev_pm_attach_by_id - Associate a device with one of its PM domains.
2323 * @dev: The device used to lookup the PM domain.
2324 * @index: The index of the PM domain.
2326 * Parse device's OF node to find a PM domain specifier at the provided @index.
2328 * pm_domain ops. To deal with detaching of the virtual device, the ->detach()
2331 * Returns the created virtual device if successfully attached PM domain, NULL
2332 * when the device don't need a PM domain, else an ERR_PTR() in case of
2333 * failures. If a power-domain exists for the device, but cannot be found or
2334 * turned on, then ERR_PTR(-EPROBE_DEFER) is returned to ensure that the device
2335 * is not probed and to re-try again later.
2344 if (!dev->of_node) in genpd_dev_pm_attach_by_id()
2348 num_domains = of_count_phandle_with_args(dev->of_node, "power-domains", in genpd_dev_pm_attach_by_id()
2349 "#power-domain-cells"); in genpd_dev_pm_attach_by_id()
2356 return ERR_PTR(-ENOMEM); in genpd_dev_pm_attach_by_id()
2359 genpd_dev->bus = &genpd_bus_type; in genpd_dev_pm_attach_by_id()
2360 genpd_dev->release = genpd_release_dev; in genpd_dev_pm_attach_by_id()
2368 /* Try to attach the device to the PM domain at the specified index. */ in genpd_dev_pm_attach_by_id()
2369 ret = __genpd_dev_pm_attach(genpd_dev, dev->of_node, index, false); in genpd_dev_pm_attach_by_id()
2383 * genpd_dev_pm_attach_by_name - Associate a device with one of its PM domains.
2384 * @dev: The device used to lookup the PM domain.
2385 * @name: The name of the PM domain.
2387 * Parse device's OF node to find a PM domain specifier using the
2388 * power-domain-names DT property. For further description see
2395 if (!dev->of_node) in genpd_dev_pm_attach_by_name()
2398 index = of_property_match_string(dev->of_node, "power-domain-names", in genpd_dev_pm_attach_by_name()
2407 { .compatible = "domain-idle-state", },
2418 err = of_property_read_u32(state_node, "entry-latency-us", in genpd_parse_state()
2421 pr_debug(" * %pOF missing entry-latency-us property\n", in genpd_parse_state()
2423 return -EINVAL; in genpd_parse_state()
2426 err = of_property_read_u32(state_node, "exit-latency-us", in genpd_parse_state()
2429 pr_debug(" * %pOF missing exit-latency-us property\n", in genpd_parse_state()
2431 return -EINVAL; in genpd_parse_state()
2434 err = of_property_read_u32(state_node, "min-residency-us", &residency); in genpd_parse_state()
2436 genpd_state->residency_ns = 1000 * residency; in genpd_parse_state()
2438 genpd_state->power_on_latency_ns = 1000 * exit_latency; in genpd_parse_state()
2439 genpd_state->power_off_latency_ns = 1000 * entry_latency; in genpd_parse_state()
2440 genpd_state->fwnode = &state_node->fwnode; in genpd_parse_state()
2453 ret = of_count_phandle_with_args(dn, "domain-idle-states", NULL); in genpd_iterate_idle_states()
2458 of_for_each_phandle(&it, ret, dn, "domain-idle-states", NULL, 0) { in genpd_iterate_idle_states()
2486 * free the memory after use. If no domain idle states is found it returns
2487 * -EINVAL and in case of errors, a negative error code.
2497 return ret < 0 ? ret : -EINVAL; in of_genpd_parse_idle_states()
2501 return -ENOMEM; in of_genpd_parse_idle_states()
2506 return ret < 0 ? ret : -EINVAL; in of_genpd_parse_idle_states()
2517 * of_genpd_opp_to_performance_state- Gets performance state of device's
2518 * power domain corresponding to a DT node's "required-opps" property.
2520 * @dev: Device for which the performance-state needs to be found.
2521 * @np: DT node where the "required-opps" property is present. This can be
2525 * Returns performance state corresponding to the "required-opps" property of
2526 * a DT node. This calls platform specific genpd->opp_to_performance_state()
2527 * callback to translate power domain OPP to performance state.
2542 if (unlikely(!genpd->set_performance_state)) in of_genpd_opp_to_performance_state()
2547 opp = of_dev_pm_opp_find_required_opp(&genpd->dev, np); in of_genpd_opp_to_performance_state()
2554 state = genpd->opp_to_performance_state(genpd, opp); in of_genpd_opp_to_performance_state()
2598 if (dev->power.runtime_error) in rtpm_status_str()
2600 else if (dev->power.disable_depth) in rtpm_status_str()
2602 else if (dev->power.runtime_status < ARRAY_SIZE(status_lookup)) in rtpm_status_str()
2603 p = status_lookup[dev->power.runtime_status]; in rtpm_status_str()
2625 return -ERESTARTSYS; in genpd_summary_one()
2627 if (WARN_ON(genpd->status >= ARRAY_SIZE(status_lookup))) in genpd_summary_one()
2630 snprintf(state, sizeof(state), "%s-%u", in genpd_summary_one()
2631 status_lookup[genpd->status], genpd->state_idx); in genpd_summary_one()
2634 status_lookup[genpd->status]); in genpd_summary_one()
2635 seq_printf(s, "%-30s %-15s ", genpd->name, state); in genpd_summary_one()
2640 * Also genpd->name is immutable. in genpd_summary_one()
2642 list_for_each_entry(link, &genpd->master_links, master_node) { in genpd_summary_one()
2643 seq_printf(s, "%s", link->slave->name); in genpd_summary_one()
2644 if (!list_is_last(&link->master_node, &genpd->master_links)) in genpd_summary_one()
2648 list_for_each_entry(pm_data, &genpd->dev_list, list_node) { in genpd_summary_one()
2649 kobj_path = kobject_get_path(&pm_data->dev->kobj, in genpd_summary_one()
2655 seq_printf(s, "\n %-50s ", kobj_path); in genpd_summary_one()
2656 rtpm_status_str(s, pm_data->dev); in genpd_summary_one()
2672 seq_puts(s, "domain status slaves\n"); in genpd_summary_show()
2674 seq_puts(s, "----------------------------------------------------------------------\n"); in genpd_summary_show()
2678 return -ERESTARTSYS; in genpd_summary_show()
2697 struct generic_pm_domain *genpd = s->private; in genpd_status_show()
2702 return -ERESTARTSYS; in genpd_status_show()
2704 if (WARN_ON_ONCE(genpd->status >= ARRAY_SIZE(status_lookup))) in genpd_status_show()
2707 if (genpd->status == GPD_STATE_POWER_OFF) in genpd_status_show()
2708 seq_printf(s, "%s-%u\n", status_lookup[genpd->status], in genpd_status_show()
2709 genpd->state_idx); in genpd_status_show()
2711 seq_printf(s, "%s\n", status_lookup[genpd->status]); in genpd_status_show()
2719 struct generic_pm_domain *genpd = s->private; in genpd_sub_domains_show()
2725 return -ERESTARTSYS; in genpd_sub_domains_show()
2727 list_for_each_entry(link, &genpd->master_links, master_node) in genpd_sub_domains_show()
2728 seq_printf(s, "%s\n", link->slave->name); in genpd_sub_domains_show()
2736 struct generic_pm_domain *genpd = s->private; in genpd_idle_states_show()
2742 return -ERESTARTSYS; in genpd_idle_states_show()
2746 for (i = 0; i < genpd->state_count; i++) { in genpd_idle_states_show()
2750 if ((genpd->status == GPD_STATE_POWER_OFF) && in genpd_idle_states_show()
2751 (genpd->state_idx == i)) in genpd_idle_states_show()
2752 delta = ktime_sub(ktime_get(), genpd->accounting_time); in genpd_idle_states_show()
2755 ktime_add(genpd->states[i].idle_time, delta)); in genpd_idle_states_show()
2756 seq_printf(s, "S%-13i %lld\n", i, msecs); in genpd_idle_states_show()
2765 struct generic_pm_domain *genpd = s->private; in genpd_active_time_show()
2771 return -ERESTARTSYS; in genpd_active_time_show()
2773 if (genpd->status == GPD_STATE_ACTIVE) in genpd_active_time_show()
2774 delta = ktime_sub(ktime_get(), genpd->accounting_time); in genpd_active_time_show()
2777 ktime_add(genpd->on_time, delta))); in genpd_active_time_show()
2785 struct generic_pm_domain *genpd = s->private; in genpd_total_idle_time_show()
2792 return -ERESTARTSYS; in genpd_total_idle_time_show()
2794 for (i = 0; i < genpd->state_count; i++) { in genpd_total_idle_time_show()
2796 if ((genpd->status == GPD_STATE_POWER_OFF) && in genpd_total_idle_time_show()
2797 (genpd->state_idx == i)) in genpd_total_idle_time_show()
2798 delta = ktime_sub(ktime_get(), genpd->accounting_time); in genpd_total_idle_time_show()
2800 total = ktime_add(total, genpd->states[i].idle_time); in genpd_total_idle_time_show()
2813 struct generic_pm_domain *genpd = s->private; in genpd_devices_show()
2820 return -ERESTARTSYS; in genpd_devices_show()
2822 list_for_each_entry(pm_data, &genpd->dev_list, list_node) { in genpd_devices_show()
2823 kobj_path = kobject_get_path(&pm_data->dev->kobj, in genpd_devices_show()
2839 struct generic_pm_domain *genpd = s->private; in genpd_perf_state_show()
2842 return -ERESTARTSYS; in genpd_perf_state_show()
2844 seq_printf(s, "%u\n", genpd->performance_state); in genpd_perf_state_show()
2853 return single_open(file, genpd_##name##_show, inode->i_private); \
2890 return -ENOMEM; in genpd_debug_init()
2895 return -ENOMEM; in genpd_debug_init()
2898 d = debugfs_create_dir(genpd->name, genpd_debugfs_dir); in genpd_debug_init()
2900 return -ENOMEM; in genpd_debug_init()
2914 if (genpd->set_performance_state) in genpd_debug_init()