Lines Matching full:devfreq
3 * devfreq: Generic Dynamic Voltage and Frequency Scaling (DVFS) Framework
22 #include <linux/devfreq.h>
34 #include <trace/events/devfreq.h>
43 * devfreq core provides delayed work based load monitoring helper
49 /* The list of all device-devfreq governors */
51 /* The list of all device-devfreq */
61 * find_device_devfreq() - find devfreq struct using device pointer
62 * @dev: device pointer used to lookup device devfreq.
65 * devfreq info. devfreq_list_lock should be held by the caller.
67 static struct devfreq *find_device_devfreq(struct device *dev) in find_device_devfreq()
69 struct devfreq *tmp_devfreq; in find_device_devfreq()
74 pr_err("DEVFREQ: %s: Invalid parameters\n", __func__); in find_device_devfreq()
86 static unsigned long find_available_min_freq(struct devfreq *devfreq) in find_available_min_freq() argument
91 opp = dev_pm_opp_find_freq_ceil(devfreq->dev.parent, &min_freq); in find_available_min_freq()
100 static unsigned long find_available_max_freq(struct devfreq *devfreq) in find_available_max_freq() argument
105 opp = dev_pm_opp_find_freq_floor(devfreq->dev.parent, &max_freq); in find_available_max_freq()
116 * @devfreq: the devfreq instance
122 static void get_freq_range(struct devfreq *devfreq, in get_freq_range() argument
126 unsigned long *freq_table = devfreq->profile->freq_table; in get_freq_range()
129 lockdep_assert_held(&devfreq->lock); in get_freq_range()
133 * The devfreq drivers can initialize this in either ascending or in get_freq_range()
134 * descending order and devfreq core supports both. in get_freq_range()
136 if (freq_table[0] < freq_table[devfreq->profile->max_state - 1]) { in get_freq_range()
138 *max_freq = freq_table[devfreq->profile->max_state - 1]; in get_freq_range()
140 *min_freq = freq_table[devfreq->profile->max_state - 1]; in get_freq_range()
145 qos_min_freq = dev_pm_qos_read_value(devfreq->dev.parent, in get_freq_range()
147 qos_max_freq = dev_pm_qos_read_value(devfreq->dev.parent, in get_freq_range()
155 *min_freq = max(*min_freq, devfreq->scaling_min_freq); in get_freq_range()
156 *max_freq = min(*max_freq, devfreq->scaling_max_freq); in get_freq_range()
164 * @devfreq: the devfreq instance
167 static int devfreq_get_freq_level(struct devfreq *devfreq, unsigned long freq) in devfreq_get_freq_level() argument
171 for (lev = 0; lev < devfreq->profile->max_state; lev++) in devfreq_get_freq_level()
172 if (freq == devfreq->profile->freq_table[lev]) in devfreq_get_freq_level()
178 static int set_freq_table(struct devfreq *devfreq) in set_freq_table() argument
180 struct devfreq_dev_profile *profile = devfreq->profile; in set_freq_table()
186 count = dev_pm_opp_get_opp_count(devfreq->dev.parent); in set_freq_table()
191 profile->freq_table = devm_kcalloc(devfreq->dev.parent, in set_freq_table()
201 opp = dev_pm_opp_find_freq_ceil(devfreq->dev.parent, &freq); in set_freq_table()
203 devm_kfree(devfreq->dev.parent, profile->freq_table); in set_freq_table()
215 * devfreq_update_status() - Update statistics of devfreq behavior
216 * @devfreq: the devfreq instance
219 int devfreq_update_status(struct devfreq *devfreq, unsigned long freq) in devfreq_update_status() argument
224 lockdep_assert_held(&devfreq->lock); in devfreq_update_status()
228 if (!devfreq->previous_freq) in devfreq_update_status()
231 prev_lev = devfreq_get_freq_level(devfreq, devfreq->previous_freq); in devfreq_update_status()
237 devfreq->stats.time_in_state[prev_lev] += in devfreq_update_status()
238 cur_time - devfreq->stats.last_update; in devfreq_update_status()
240 lev = devfreq_get_freq_level(devfreq, freq); in devfreq_update_status()
247 devfreq->stats.trans_table[ in devfreq_update_status()
248 (prev_lev * devfreq->profile->max_state) + lev]++; in devfreq_update_status()
249 devfreq->stats.total_trans++; in devfreq_update_status()
253 devfreq->stats.last_update = cur_time; in devfreq_update_status()
259 * find_devfreq_governor() - find devfreq governor from name
262 * Search the list of devfreq governors and return the matched
272 pr_err("DEVFREQ: %s: Invalid parameters\n", __func__); in find_devfreq_governor()
289 * Search the list of devfreq governors and request the module and try again
303 pr_err("DEVFREQ: %s: Invalid parameters\n", __func__); in try_then_request_governor()
327 static int devfreq_notify_transition(struct devfreq *devfreq, in devfreq_notify_transition() argument
330 if (!devfreq) in devfreq_notify_transition()
335 srcu_notifier_call_chain(&devfreq->transition_notifier_list, in devfreq_notify_transition()
340 srcu_notifier_call_chain(&devfreq->transition_notifier_list, in devfreq_notify_transition()
350 static int devfreq_set_target(struct devfreq *devfreq, unsigned long new_freq, in devfreq_set_target() argument
357 if (devfreq->profile->get_cur_freq) in devfreq_set_target()
358 devfreq->profile->get_cur_freq(devfreq->dev.parent, &cur_freq); in devfreq_set_target()
360 cur_freq = devfreq->previous_freq; in devfreq_set_target()
364 devfreq_notify_transition(devfreq, &freqs, DEVFREQ_PRECHANGE); in devfreq_set_target()
366 err = devfreq->profile->target(devfreq->dev.parent, &new_freq, flags); in devfreq_set_target()
369 devfreq_notify_transition(devfreq, &freqs, DEVFREQ_POSTCHANGE); in devfreq_set_target()
376 * change order of between devfreq device and passive devfreq device. in devfreq_set_target()
379 trace_devfreq_frequency(devfreq, new_freq, cur_freq); in devfreq_set_target()
382 devfreq_notify_transition(devfreq, &freqs, DEVFREQ_POSTCHANGE); in devfreq_set_target()
384 if (devfreq_update_status(devfreq, new_freq)) in devfreq_set_target()
385 dev_err(&devfreq->dev, in devfreq_set_target()
388 devfreq->previous_freq = new_freq; in devfreq_set_target()
390 if (devfreq->suspend_freq) in devfreq_set_target()
391 devfreq->resume_freq = new_freq; in devfreq_set_target()
399 * @devfreq: the devfreq instance.
401 * is only used for devfreq device using passive governor.
403 * Note: Lock devfreq->lock before calling devfreq_update_target. This function
404 * should be only used by both update_devfreq() and devfreq governors.
406 int devfreq_update_target(struct devfreq *devfreq, unsigned long freq) in devfreq_update_target() argument
412 lockdep_assert_held(&devfreq->lock); in devfreq_update_target()
414 if (!devfreq->governor) in devfreq_update_target()
418 err = devfreq->governor->get_target_freq(devfreq, &freq); in devfreq_update_target()
421 get_freq_range(devfreq, &min_freq, &max_freq); in devfreq_update_target()
432 return devfreq_set_target(devfreq, freq, flags); in devfreq_update_target()
440 * @devfreq: the devfreq instance.
442 * Note: Lock devfreq->lock before calling update_devfreq
445 int update_devfreq(struct devfreq *devfreq) in update_devfreq() argument
447 return devfreq_update_target(devfreq, 0L); in update_devfreq()
452 * devfreq_monitor() - Periodically poll devfreq objects.
459 struct devfreq *devfreq = container_of(work, in devfreq_monitor() local
460 struct devfreq, work.work); in devfreq_monitor()
462 mutex_lock(&devfreq->lock); in devfreq_monitor()
463 err = update_devfreq(devfreq); in devfreq_monitor()
465 dev_err(&devfreq->dev, "dvfs failed with (%d) error\n", err); in devfreq_monitor()
467 queue_delayed_work(devfreq_wq, &devfreq->work, in devfreq_monitor()
468 msecs_to_jiffies(devfreq->profile->polling_ms)); in devfreq_monitor()
469 mutex_unlock(&devfreq->lock); in devfreq_monitor()
471 trace_devfreq_monitor(devfreq); in devfreq_monitor()
475 * devfreq_monitor_start() - Start load monitoring of devfreq instance
476 * @devfreq: the devfreq instance.
478 * Helper function for starting devfreq device load monitoring. By
481 * event when device is added to devfreq framework.
483 void devfreq_monitor_start(struct devfreq *devfreq) in devfreq_monitor_start() argument
485 if (IS_SUPPORTED_FLAG(devfreq->governor->flags, IRQ_DRIVEN)) in devfreq_monitor_start()
488 switch (devfreq->profile->timer) { in devfreq_monitor_start()
490 INIT_DEFERRABLE_WORK(&devfreq->work, devfreq_monitor); in devfreq_monitor_start()
493 INIT_DELAYED_WORK(&devfreq->work, devfreq_monitor); in devfreq_monitor_start()
499 if (devfreq->profile->polling_ms) in devfreq_monitor_start()
500 queue_delayed_work(devfreq_wq, &devfreq->work, in devfreq_monitor_start()
501 msecs_to_jiffies(devfreq->profile->polling_ms)); in devfreq_monitor_start()
506 * devfreq_monitor_stop() - Stop load monitoring of a devfreq instance
507 * @devfreq: the devfreq instance.
509 * Helper function to stop devfreq device load monitoring. Function
511 * event when device is removed from devfreq framework.
513 void devfreq_monitor_stop(struct devfreq *devfreq) in devfreq_monitor_stop() argument
515 if (IS_SUPPORTED_FLAG(devfreq->governor->flags, IRQ_DRIVEN)) in devfreq_monitor_stop()
518 cancel_delayed_work_sync(&devfreq->work); in devfreq_monitor_stop()
523 * devfreq_monitor_suspend() - Suspend load monitoring of a devfreq instance
524 * @devfreq: the devfreq instance.
526 * Helper function to suspend devfreq device load monitoring. Function
534 void devfreq_monitor_suspend(struct devfreq *devfreq) in devfreq_monitor_suspend() argument
536 mutex_lock(&devfreq->lock); in devfreq_monitor_suspend()
537 if (devfreq->stop_polling) { in devfreq_monitor_suspend()
538 mutex_unlock(&devfreq->lock); in devfreq_monitor_suspend()
542 devfreq_update_status(devfreq, devfreq->previous_freq); in devfreq_monitor_suspend()
543 devfreq->stop_polling = true; in devfreq_monitor_suspend()
544 mutex_unlock(&devfreq->lock); in devfreq_monitor_suspend()
546 if (IS_SUPPORTED_FLAG(devfreq->governor->flags, IRQ_DRIVEN)) in devfreq_monitor_suspend()
549 cancel_delayed_work_sync(&devfreq->work); in devfreq_monitor_suspend()
554 * devfreq_monitor_resume() - Resume load monitoring of a devfreq instance
555 * @devfreq: the devfreq instance.
557 * Helper function to resume devfreq device load monitoring. Function
561 void devfreq_monitor_resume(struct devfreq *devfreq) in devfreq_monitor_resume() argument
565 mutex_lock(&devfreq->lock); in devfreq_monitor_resume()
567 if (IS_SUPPORTED_FLAG(devfreq->governor->flags, IRQ_DRIVEN)) in devfreq_monitor_resume()
570 if (!devfreq->stop_polling) in devfreq_monitor_resume()
573 if (!delayed_work_pending(&devfreq->work) && in devfreq_monitor_resume()
574 devfreq->profile->polling_ms) in devfreq_monitor_resume()
575 queue_delayed_work(devfreq_wq, &devfreq->work, in devfreq_monitor_resume()
576 msecs_to_jiffies(devfreq->profile->polling_ms)); in devfreq_monitor_resume()
579 devfreq->stats.last_update = get_jiffies_64(); in devfreq_monitor_resume()
580 devfreq->stop_polling = false; in devfreq_monitor_resume()
582 if (devfreq->profile->get_cur_freq && in devfreq_monitor_resume()
583 !devfreq->profile->get_cur_freq(devfreq->dev.parent, &freq)) in devfreq_monitor_resume()
584 devfreq->previous_freq = freq; in devfreq_monitor_resume()
587 mutex_unlock(&devfreq->lock); in devfreq_monitor_resume()
592 * devfreq_update_interval() - Update device devfreq monitoring interval
593 * @devfreq: the devfreq instance.
599 void devfreq_update_interval(struct devfreq *devfreq, unsigned int *delay) in devfreq_update_interval() argument
601 unsigned int cur_delay = devfreq->profile->polling_ms; in devfreq_update_interval()
604 mutex_lock(&devfreq->lock); in devfreq_update_interval()
605 devfreq->profile->polling_ms = new_delay; in devfreq_update_interval()
607 if (IS_SUPPORTED_FLAG(devfreq->governor->flags, IRQ_DRIVEN)) in devfreq_update_interval()
610 if (devfreq->stop_polling) in devfreq_update_interval()
615 mutex_unlock(&devfreq->lock); in devfreq_update_interval()
616 cancel_delayed_work_sync(&devfreq->work); in devfreq_update_interval()
622 queue_delayed_work(devfreq_wq, &devfreq->work, in devfreq_update_interval()
623 msecs_to_jiffies(devfreq->profile->polling_ms)); in devfreq_update_interval()
629 mutex_unlock(&devfreq->lock); in devfreq_update_interval()
630 cancel_delayed_work_sync(&devfreq->work); in devfreq_update_interval()
631 mutex_lock(&devfreq->lock); in devfreq_update_interval()
632 if (!devfreq->stop_polling) in devfreq_update_interval()
633 queue_delayed_work(devfreq_wq, &devfreq->work, in devfreq_update_interval()
634 msecs_to_jiffies(devfreq->profile->polling_ms)); in devfreq_update_interval()
637 mutex_unlock(&devfreq->lock); in devfreq_update_interval()
643 * has been changed out of devfreq framework.
644 * @nb: the notifier_block (supposed to be devfreq->nb)
648 * Called by a notifier that uses devfreq->nb.
653 struct devfreq *devfreq = container_of(nb, struct devfreq, nb); in devfreq_notifier_call() local
656 mutex_lock(&devfreq->lock); in devfreq_notifier_call()
658 devfreq->scaling_min_freq = find_available_min_freq(devfreq); in devfreq_notifier_call()
659 if (!devfreq->scaling_min_freq) in devfreq_notifier_call()
662 devfreq->scaling_max_freq = find_available_max_freq(devfreq); in devfreq_notifier_call()
663 if (!devfreq->scaling_max_freq) { in devfreq_notifier_call()
664 devfreq->scaling_max_freq = ULONG_MAX; in devfreq_notifier_call()
668 err = update_devfreq(devfreq); in devfreq_notifier_call()
671 mutex_unlock(&devfreq->lock); in devfreq_notifier_call()
673 dev_err(devfreq->dev.parent, in devfreq_notifier_call()
682 * @devfreq: the devfreq instance.
684 static int qos_notifier_call(struct devfreq *devfreq) in qos_notifier_call() argument
688 mutex_lock(&devfreq->lock); in qos_notifier_call()
689 err = update_devfreq(devfreq); in qos_notifier_call()
690 mutex_unlock(&devfreq->lock); in qos_notifier_call()
692 dev_err(devfreq->dev.parent, in qos_notifier_call()
701 * @nb: Should be devfreq->nb_min
706 return qos_notifier_call(container_of(nb, struct devfreq, nb_min)); in qos_min_notifier_call()
711 * @nb: Should be devfreq->nb_max
716 return qos_notifier_call(container_of(nb, struct devfreq, nb_max)); in qos_max_notifier_call()
721 * @dev: the devfreq device
723 * Remove devfreq from the list and release its resources.
727 struct devfreq *devfreq = to_devfreq(dev); in devfreq_dev_release() local
731 list_del(&devfreq->node); in devfreq_dev_release()
734 err = dev_pm_qos_remove_notifier(devfreq->dev.parent, &devfreq->nb_max, in devfreq_dev_release()
739 err = dev_pm_qos_remove_notifier(devfreq->dev.parent, &devfreq->nb_min, in devfreq_dev_release()
745 if (dev_pm_qos_request_active(&devfreq->user_max_freq_req)) { in devfreq_dev_release()
746 err = dev_pm_qos_remove_request(&devfreq->user_max_freq_req); in devfreq_dev_release()
751 if (dev_pm_qos_request_active(&devfreq->user_min_freq_req)) { in devfreq_dev_release()
752 err = dev_pm_qos_remove_request(&devfreq->user_min_freq_req); in devfreq_dev_release()
758 if (devfreq->profile->exit) in devfreq_dev_release()
759 devfreq->profile->exit(devfreq->dev.parent); in devfreq_dev_release()
761 if (devfreq->opp_table) in devfreq_dev_release()
762 dev_pm_opp_put_opp_table(devfreq->opp_table); in devfreq_dev_release()
764 mutex_destroy(&devfreq->lock); in devfreq_dev_release()
765 kfree(devfreq); in devfreq_dev_release()
768 static void create_sysfs_files(struct devfreq *devfreq,
770 static void remove_sysfs_files(struct devfreq *devfreq,
774 * devfreq_add_device() - Add devfreq feature to the device
775 * @dev: the device to add devfreq feature.
776 * @profile: device-specific profile to run devfreq.
778 * @data: private data for the governor. The devfreq framework does not
781 struct devfreq *devfreq_add_device(struct device *dev, in devfreq_add_device()
786 struct devfreq *devfreq; in devfreq_add_device() local
796 devfreq = find_device_devfreq(dev); in devfreq_add_device()
798 if (!IS_ERR(devfreq)) { in devfreq_add_device()
799 dev_err(dev, "%s: devfreq device already exists!\n", in devfreq_add_device()
805 devfreq = kzalloc(sizeof(struct devfreq), GFP_KERNEL); in devfreq_add_device()
806 if (!devfreq) { in devfreq_add_device()
811 mutex_init(&devfreq->lock); in devfreq_add_device()
812 mutex_lock(&devfreq->lock); in devfreq_add_device()
813 devfreq->dev.parent = dev; in devfreq_add_device()
814 devfreq->dev.class = devfreq_class; in devfreq_add_device()
815 devfreq->dev.release = devfreq_dev_release; in devfreq_add_device()
816 INIT_LIST_HEAD(&devfreq->node); in devfreq_add_device()
817 devfreq->profile = profile; in devfreq_add_device()
818 devfreq->previous_freq = profile->initial_freq; in devfreq_add_device()
819 devfreq->last_status.current_frequency = profile->initial_freq; in devfreq_add_device()
820 devfreq->data = data; in devfreq_add_device()
821 devfreq->nb.notifier_call = devfreq_notifier_call; in devfreq_add_device()
823 if (devfreq->profile->timer < 0 in devfreq_add_device()
824 || devfreq->profile->timer >= DEVFREQ_TIMER_NUM) { in devfreq_add_device()
825 mutex_unlock(&devfreq->lock); in devfreq_add_device()
830 if (!devfreq->profile->max_state && !devfreq->profile->freq_table) { in devfreq_add_device()
831 mutex_unlock(&devfreq->lock); in devfreq_add_device()
832 err = set_freq_table(devfreq); in devfreq_add_device()
835 mutex_lock(&devfreq->lock); in devfreq_add_device()
838 devfreq->scaling_min_freq = find_available_min_freq(devfreq); in devfreq_add_device()
839 if (!devfreq->scaling_min_freq) { in devfreq_add_device()
840 mutex_unlock(&devfreq->lock); in devfreq_add_device()
845 devfreq->scaling_max_freq = find_available_max_freq(devfreq); in devfreq_add_device()
846 if (!devfreq->scaling_max_freq) { in devfreq_add_device()
847 mutex_unlock(&devfreq->lock); in devfreq_add_device()
852 devfreq->suspend_freq = dev_pm_opp_get_suspend_opp_freq(dev); in devfreq_add_device()
853 devfreq->opp_table = dev_pm_opp_get_opp_table(dev); in devfreq_add_device()
854 if (IS_ERR(devfreq->opp_table)) in devfreq_add_device()
855 devfreq->opp_table = NULL; in devfreq_add_device()
857 atomic_set(&devfreq->suspend_count, 0); in devfreq_add_device()
859 dev_set_name(&devfreq->dev, "%s", dev_name(dev)); in devfreq_add_device()
860 err = device_register(&devfreq->dev); in devfreq_add_device()
862 mutex_unlock(&devfreq->lock); in devfreq_add_device()
863 put_device(&devfreq->dev); in devfreq_add_device()
867 devfreq->stats.trans_table = devm_kzalloc(&devfreq->dev, in devfreq_add_device()
869 devfreq->profile->max_state, in devfreq_add_device()
870 devfreq->profile->max_state), in devfreq_add_device()
872 if (!devfreq->stats.trans_table) { in devfreq_add_device()
873 mutex_unlock(&devfreq->lock); in devfreq_add_device()
878 devfreq->stats.time_in_state = devm_kcalloc(&devfreq->dev, in devfreq_add_device()
879 devfreq->profile->max_state, in devfreq_add_device()
880 sizeof(*devfreq->stats.time_in_state), in devfreq_add_device()
882 if (!devfreq->stats.time_in_state) { in devfreq_add_device()
883 mutex_unlock(&devfreq->lock); in devfreq_add_device()
888 devfreq->stats.total_trans = 0; in devfreq_add_device()
889 devfreq->stats.last_update = get_jiffies_64(); in devfreq_add_device()
891 srcu_init_notifier_head(&devfreq->transition_notifier_list); in devfreq_add_device()
893 mutex_unlock(&devfreq->lock); in devfreq_add_device()
895 err = dev_pm_qos_add_request(dev, &devfreq->user_min_freq_req, in devfreq_add_device()
899 err = dev_pm_qos_add_request(dev, &devfreq->user_max_freq_req, in devfreq_add_device()
905 devfreq->nb_min.notifier_call = qos_min_notifier_call; in devfreq_add_device()
906 err = dev_pm_qos_add_notifier(dev, &devfreq->nb_min, in devfreq_add_device()
911 devfreq->nb_max.notifier_call = qos_max_notifier_call; in devfreq_add_device()
912 err = dev_pm_qos_add_notifier(dev, &devfreq->nb_max, in devfreq_add_device()
927 devfreq->governor = governor; in devfreq_add_device()
928 err = devfreq->governor->event_handler(devfreq, DEVFREQ_GOV_START, in devfreq_add_device()
935 create_sysfs_files(devfreq, devfreq->governor); in devfreq_add_device()
937 list_add(&devfreq->node, &devfreq_list); in devfreq_add_device()
941 if (devfreq->profile->is_cooling_device) { in devfreq_add_device()
942 devfreq->cdev = devfreq_cooling_em_register(devfreq, NULL); in devfreq_add_device()
943 if (IS_ERR(devfreq->cdev)) in devfreq_add_device()
944 devfreq->cdev = NULL; in devfreq_add_device()
947 return devfreq; in devfreq_add_device()
952 devfreq_remove_device(devfreq); in devfreq_add_device()
953 devfreq = NULL; in devfreq_add_device()
955 kfree(devfreq); in devfreq_add_device()
962 * devfreq_remove_device() - Remove devfreq feature from a device.
963 * @devfreq: the devfreq instance to be removed
967 int devfreq_remove_device(struct devfreq *devfreq) in devfreq_remove_device() argument
969 if (!devfreq) in devfreq_remove_device()
972 devfreq_cooling_unregister(devfreq->cdev); in devfreq_remove_device()
974 if (devfreq->governor) { in devfreq_remove_device()
975 devfreq->governor->event_handler(devfreq, in devfreq_remove_device()
977 remove_sysfs_files(devfreq, devfreq->governor); in devfreq_remove_device()
980 device_unregister(&devfreq->dev); in devfreq_remove_device()
988 struct devfreq **r = res; in devm_devfreq_dev_match()
998 devfreq_remove_device(*(struct devfreq **)res); in devm_devfreq_dev_release()
1003 * @dev: the device to add devfreq feature.
1004 * @profile: device-specific profile to run devfreq.
1006 * @data: private data for the governor. The devfreq framework does not
1009 * This function manages automatically the memory of devfreq device using device
1010 * resource management and simplify the free operation for memory of devfreq
1013 struct devfreq *devm_devfreq_add_device(struct device *dev, in devm_devfreq_add_device()
1018 struct devfreq **ptr, *devfreq; in devm_devfreq_add_device() local
1024 devfreq = devfreq_add_device(dev, profile, governor_name, data); in devm_devfreq_add_device()
1025 if (IS_ERR(devfreq)) { in devm_devfreq_add_device()
1027 return devfreq; in devm_devfreq_add_device()
1030 *ptr = devfreq; in devm_devfreq_add_device()
1033 return devfreq; in devm_devfreq_add_device()
1039 * devfreq_get_devfreq_by_node - Get the devfreq device from devicetree
1042 * return the instance of devfreq device
1044 struct devfreq *devfreq_get_devfreq_by_node(struct device_node *node) in devfreq_get_devfreq_by_node()
1046 struct devfreq *devfreq; in devfreq_get_devfreq_by_node() local
1052 list_for_each_entry(devfreq, &devfreq_list, node) { in devfreq_get_devfreq_by_node()
1053 if (devfreq->dev.parent in devfreq_get_devfreq_by_node()
1054 && devfreq->dev.parent->of_node == node) { in devfreq_get_devfreq_by_node()
1056 return devfreq; in devfreq_get_devfreq_by_node()
1065 * devfreq_get_devfreq_by_phandle - Get the devfreq device from devicetree
1068 * @index - index into list of devfreq
1070 * return the instance of devfreq device
1072 struct devfreq *devfreq_get_devfreq_by_phandle(struct device *dev, in devfreq_get_devfreq_by_phandle()
1076 struct devfreq *devfreq; in devfreq_get_devfreq_by_phandle() local
1088 devfreq = devfreq_get_devfreq_by_node(node); in devfreq_get_devfreq_by_phandle()
1091 return devfreq; in devfreq_get_devfreq_by_phandle()
1095 struct devfreq *devfreq_get_devfreq_by_node(struct device_node *node) in devfreq_get_devfreq_by_node()
1100 struct devfreq *devfreq_get_devfreq_by_phandle(struct device *dev, in devfreq_get_devfreq_by_phandle()
1111 * @dev: the device from which to remove devfreq feature.
1112 * @devfreq: the devfreq instance to be removed
1114 void devm_devfreq_remove_device(struct device *dev, struct devfreq *devfreq) in devm_devfreq_remove_device() argument
1117 devm_devfreq_dev_match, devfreq)); in devm_devfreq_remove_device()
1122 * devfreq_suspend_device() - Suspend devfreq of a device.
1123 * @devfreq: the devfreq instance to be suspended
1127 * holds the devfreq.
1129 int devfreq_suspend_device(struct devfreq *devfreq) in devfreq_suspend_device() argument
1133 if (!devfreq) in devfreq_suspend_device()
1136 if (atomic_inc_return(&devfreq->suspend_count) > 1) in devfreq_suspend_device()
1139 if (devfreq->governor) { in devfreq_suspend_device()
1140 ret = devfreq->governor->event_handler(devfreq, in devfreq_suspend_device()
1146 if (devfreq->suspend_freq) { in devfreq_suspend_device()
1147 mutex_lock(&devfreq->lock); in devfreq_suspend_device()
1148 ret = devfreq_set_target(devfreq, devfreq->suspend_freq, 0); in devfreq_suspend_device()
1149 mutex_unlock(&devfreq->lock); in devfreq_suspend_device()
1159 * devfreq_resume_device() - Resume devfreq of a device.
1160 * @devfreq: the devfreq instance to be resumed
1164 * holds the devfreq.
1166 int devfreq_resume_device(struct devfreq *devfreq) in devfreq_resume_device() argument
1170 if (!devfreq) in devfreq_resume_device()
1173 if (atomic_dec_return(&devfreq->suspend_count) >= 1) in devfreq_resume_device()
1176 if (devfreq->resume_freq) { in devfreq_resume_device()
1177 mutex_lock(&devfreq->lock); in devfreq_resume_device()
1178 ret = devfreq_set_target(devfreq, devfreq->resume_freq, 0); in devfreq_resume_device()
1179 mutex_unlock(&devfreq->lock); in devfreq_resume_device()
1184 if (devfreq->governor) { in devfreq_resume_device()
1185 ret = devfreq->governor->event_handler(devfreq, in devfreq_resume_device()
1196 * devfreq_suspend() - Suspend devfreq governors and devices
1199 * and devices preserving the state for resume. On some platforms the devfreq
1205 struct devfreq *devfreq; in devfreq_suspend() local
1209 list_for_each_entry(devfreq, &devfreq_list, node) { in devfreq_suspend()
1210 ret = devfreq_suspend_device(devfreq); in devfreq_suspend()
1212 dev_err(&devfreq->dev, in devfreq_suspend()
1213 "failed to suspend devfreq device\n"); in devfreq_suspend()
1219 * devfreq_resume() - Resume devfreq governors and devices
1226 struct devfreq *devfreq; in devfreq_resume() local
1230 list_for_each_entry(devfreq, &devfreq_list, node) { in devfreq_resume()
1231 ret = devfreq_resume_device(devfreq); in devfreq_resume()
1233 dev_warn(&devfreq->dev, in devfreq_resume()
1234 "failed to resume devfreq device\n"); in devfreq_resume()
1240 * devfreq_add_governor() - Add devfreq governor
1241 * @governor: the devfreq governor to be added
1246 struct devfreq *devfreq; in devfreq_add_governor() local
1265 list_for_each_entry(devfreq, &devfreq_list, node) { in devfreq_add_governor()
1267 struct device *dev = devfreq->dev.parent; in devfreq_add_governor()
1269 if (!strncmp(devfreq->governor->name, governor->name, in devfreq_add_governor()
1272 if (devfreq->governor) { in devfreq_add_governor()
1275 __func__, devfreq->governor->name); in devfreq_add_governor()
1276 ret = devfreq->governor->event_handler(devfreq, in devfreq_add_governor()
1282 devfreq->governor->name, ret); in devfreq_add_governor()
1286 devfreq->governor = governor; in devfreq_add_governor()
1287 ret = devfreq->governor->event_handler(devfreq, in devfreq_add_governor()
1291 __func__, devfreq->governor->name, in devfreq_add_governor()
1305 * devfreq_remove_governor() - Remove devfreq feature from a device.
1306 * @governor: the devfreq governor to be removed
1311 struct devfreq *devfreq; in devfreq_remove_governor() local
1327 list_for_each_entry(devfreq, &devfreq_list, node) { in devfreq_remove_governor()
1329 struct device *dev = devfreq->dev.parent; in devfreq_remove_governor()
1331 if (!strncmp(devfreq->governor->name, governor->name, in devfreq_remove_governor()
1333 /* we should have a devfreq governor! */ in devfreq_remove_governor()
1334 if (!devfreq->governor) { in devfreq_remove_governor()
1340 ret = devfreq->governor->event_handler(devfreq, in devfreq_remove_governor()
1344 __func__, devfreq->governor->name, in devfreq_remove_governor()
1347 devfreq->governor = NULL; in devfreq_remove_governor()
1362 struct devfreq *df = to_devfreq(dev); in name_show()
1370 struct devfreq *df = to_devfreq(dev); in governor_show()
1381 struct devfreq *df = to_devfreq(dev); in governor_store()
1462 struct devfreq *df = to_devfreq(d); in available_governors_show()
1471 * The devfreq with immutable governor (e.g., passive) shows in available_governors_show()
1478 * The devfreq device shows the registered governor except for in available_governors_show()
1508 struct devfreq *df = to_devfreq(dev); in cur_freq_show()
1524 struct devfreq *df = to_devfreq(dev); in target_freq_show()
1533 struct devfreq *df = to_devfreq(dev); in min_freq_store()
1560 struct devfreq *df = to_devfreq(dev); in min_freq_show()
1574 struct devfreq *df = to_devfreq(dev); in max_freq_store()
1614 struct devfreq *df = to_devfreq(dev); in max_freq_show()
1629 struct devfreq *df = to_devfreq(d); in available_frequencies_show()
1656 struct devfreq *df = to_devfreq(dev); in trans_stat_show()
1710 struct devfreq *df = to_devfreq(dev); in trans_stat_store()
1749 ATTRIBUTE_GROUPS(devfreq);
1754 struct devfreq *df = to_devfreq(dev); in polling_interval_show()
1766 struct devfreq *df = to_devfreq(dev); in polling_interval_store()
1787 struct devfreq *df = to_devfreq(dev); in timer_show()
1798 struct devfreq *df = to_devfreq(dev); in timer_store()
1858 static void create_sysfs_files(struct devfreq *devfreq, in create_sysfs_files() argument
1862 CREATE_SYSFS_FILE(devfreq, polling_interval); in create_sysfs_files()
1864 CREATE_SYSFS_FILE(devfreq, timer); in create_sysfs_files()
1868 static void remove_sysfs_files(struct devfreq *devfreq, in remove_sysfs_files() argument
1872 sysfs_remove_file(&devfreq->dev.kobj, in remove_sysfs_files()
1875 sysfs_remove_file(&devfreq->dev.kobj, &dev_attr_timer.attr); in remove_sysfs_files()
1879 * devfreq_summary_show() - Show the summary of the devfreq devices
1880 * @s: seq_file instance to show the summary of devfreq devices
1883 * Show the summary of the devfreq devices via 'devfreq_summary' debugfs file.
1884 * It helps that user can know the detailed information of the devfreq devices.
1890 struct devfreq *devfreq; in devfreq_summary_show() local
1891 struct devfreq *p_devfreq = NULL; in devfreq_summary_show()
1917 list_for_each_entry_reverse(devfreq, &devfreq_list, node) { in devfreq_summary_show()
1919 if (!strncmp(devfreq->governor->name, DEVFREQ_GOV_PASSIVE, in devfreq_summary_show()
1921 struct devfreq_passive_data *data = devfreq->data; in devfreq_summary_show()
1930 mutex_lock(&devfreq->lock); in devfreq_summary_show()
1931 cur_freq = devfreq->previous_freq; in devfreq_summary_show()
1932 get_freq_range(devfreq, &min_freq, &max_freq); in devfreq_summary_show()
1933 timer = devfreq->profile->timer; in devfreq_summary_show()
1935 if (IS_SUPPORTED_ATTR(devfreq->governor->attrs, POLLING_INTERVAL)) in devfreq_summary_show()
1936 polling_ms = devfreq->profile->polling_ms; in devfreq_summary_show()
1939 mutex_unlock(&devfreq->lock); in devfreq_summary_show()
1943 dev_name(&devfreq->dev), in devfreq_summary_show()
1945 devfreq->governor->name, in devfreq_summary_show()
1961 devfreq_class = class_create(THIS_MODULE, "devfreq"); in devfreq_init()
1975 devfreq_debugfs = debugfs_create_dir("devfreq", NULL); in devfreq_init()
1985 * The following are helper functions for devfreq user device drivers with
1992 * @dev: The devfreq user device. (parent of devfreq)
1994 * @flags: Flags handed from devfreq framework.
2026 * devfreq_register_opp_notifier() - Helper function to get devfreq notified
2029 * @dev: The devfreq user device. (parent of devfreq)
2030 * @devfreq: The devfreq object.
2032 int devfreq_register_opp_notifier(struct device *dev, struct devfreq *devfreq) in devfreq_register_opp_notifier() argument
2034 return dev_pm_opp_register_notifier(dev, &devfreq->nb); in devfreq_register_opp_notifier()
2039 * devfreq_unregister_opp_notifier() - Helper function to stop getting devfreq
2042 * @dev: The devfreq user device. (parent of devfreq)
2043 * @devfreq: The devfreq object.
2048 int devfreq_unregister_opp_notifier(struct device *dev, struct devfreq *devfreq) in devfreq_unregister_opp_notifier() argument
2050 return dev_pm_opp_unregister_notifier(dev, &devfreq->nb); in devfreq_unregister_opp_notifier()
2056 devfreq_unregister_opp_notifier(dev, *(struct devfreq **)res); in devm_devfreq_opp_release()
2062 * @dev: The devfreq user device. (parent of devfreq)
2063 * @devfreq: The devfreq object.
2066 struct devfreq *devfreq) in devm_devfreq_register_opp_notifier() argument
2068 struct devfreq **ptr; in devm_devfreq_register_opp_notifier()
2075 ret = devfreq_register_opp_notifier(dev, devfreq); in devm_devfreq_register_opp_notifier()
2081 *ptr = devfreq; in devm_devfreq_register_opp_notifier()
2091 * @dev: The devfreq user device. (parent of devfreq)
2092 * @devfreq: The devfreq object.
2095 struct devfreq *devfreq) in devm_devfreq_unregister_opp_notifier() argument
2098 devm_devfreq_dev_match, devfreq)); in devm_devfreq_unregister_opp_notifier()
2103 * devfreq_register_notifier() - Register a driver with devfreq
2104 * @devfreq: The devfreq object.
2108 int devfreq_register_notifier(struct devfreq *devfreq, in devfreq_register_notifier() argument
2114 if (!devfreq) in devfreq_register_notifier()
2120 &devfreq->transition_notifier_list, nb); in devfreq_register_notifier()
2131 * devfreq_unregister_notifier() - Unregister a driver with devfreq
2132 * @devfreq: The devfreq object.
2136 int devfreq_unregister_notifier(struct devfreq *devfreq, in devfreq_unregister_notifier() argument
2142 if (!devfreq) in devfreq_unregister_notifier()
2148 &devfreq->transition_notifier_list, nb); in devfreq_unregister_notifier()
2159 struct devfreq *devfreq; member
2168 devfreq_unregister_notifier(this->devfreq, this->nb, this->list); in devm_devfreq_notifier_release()
2174 * @dev: The devfreq user device. (parent of devfreq)
2175 * @devfreq: The devfreq object.
2180 struct devfreq *devfreq, in devm_devfreq_register_notifier() argument
2192 ret = devfreq_register_notifier(devfreq, nb, list); in devm_devfreq_register_notifier()
2198 ptr->devfreq = devfreq; in devm_devfreq_register_notifier()
2210 * @dev: The devfreq user device. (parent of devfreq)
2211 * @devfreq: The devfreq object.
2216 struct devfreq *devfreq, in devm_devfreq_unregister_notifier() argument
2221 devm_devfreq_dev_match, devfreq)); in devm_devfreq_unregister_notifier()