Lines Matching refs:devfreq
56 static struct devfreq *find_device_devfreq(struct device *dev) in find_device_devfreq()
58 struct devfreq *tmp_devfreq; in find_device_devfreq()
75 static unsigned long find_available_min_freq(struct devfreq *devfreq) in find_available_min_freq() argument
80 opp = dev_pm_opp_find_freq_ceil(devfreq->dev.parent, &min_freq); in find_available_min_freq()
89 static unsigned long find_available_max_freq(struct devfreq *devfreq) in find_available_max_freq() argument
94 opp = dev_pm_opp_find_freq_floor(devfreq->dev.parent, &max_freq); in find_available_max_freq()
108 static int devfreq_get_freq_level(struct devfreq *devfreq, unsigned long freq) in devfreq_get_freq_level() argument
112 for (lev = 0; lev < devfreq->profile->max_state; lev++) in devfreq_get_freq_level()
113 if (freq == devfreq->profile->freq_table[lev]) in devfreq_get_freq_level()
119 static int set_freq_table(struct devfreq *devfreq) in set_freq_table() argument
121 struct devfreq_dev_profile *profile = devfreq->profile; in set_freq_table()
127 count = dev_pm_opp_get_opp_count(devfreq->dev.parent); in set_freq_table()
132 profile->freq_table = devm_kcalloc(devfreq->dev.parent, in set_freq_table()
142 opp = dev_pm_opp_find_freq_ceil(devfreq->dev.parent, &freq); in set_freq_table()
144 devm_kfree(devfreq->dev.parent, profile->freq_table); in set_freq_table()
160 int devfreq_update_status(struct devfreq *devfreq, unsigned long freq) in devfreq_update_status() argument
168 if (!devfreq->previous_freq) in devfreq_update_status()
171 prev_lev = devfreq_get_freq_level(devfreq, devfreq->previous_freq); in devfreq_update_status()
177 devfreq->time_in_state[prev_lev] += in devfreq_update_status()
178 cur_time - devfreq->last_stat_updated; in devfreq_update_status()
180 lev = devfreq_get_freq_level(devfreq, freq); in devfreq_update_status()
187 devfreq->trans_table[(prev_lev * in devfreq_update_status()
188 devfreq->profile->max_state) + lev]++; in devfreq_update_status()
189 devfreq->total_trans++; in devfreq_update_status()
193 devfreq->last_stat_updated = cur_time; in devfreq_update_status()
224 static int devfreq_notify_transition(struct devfreq *devfreq, in devfreq_notify_transition() argument
227 if (!devfreq) in devfreq_notify_transition()
232 srcu_notifier_call_chain(&devfreq->transition_notifier_list, in devfreq_notify_transition()
237 srcu_notifier_call_chain(&devfreq->transition_notifier_list, in devfreq_notify_transition()
256 int update_devfreq(struct devfreq *devfreq) in update_devfreq() argument
263 if (!mutex_is_locked(&devfreq->lock)) { in update_devfreq()
268 if (!devfreq->governor) in update_devfreq()
272 err = devfreq->governor->get_target_freq(devfreq, &freq); in update_devfreq()
283 max_freq = MIN(devfreq->scaling_max_freq, devfreq->max_freq); in update_devfreq()
284 min_freq = MAX(devfreq->scaling_min_freq, devfreq->min_freq); in update_devfreq()
295 if (devfreq->profile->get_cur_freq) in update_devfreq()
296 devfreq->profile->get_cur_freq(devfreq->dev.parent, &cur_freq); in update_devfreq()
298 cur_freq = devfreq->previous_freq; in update_devfreq()
302 devfreq_notify_transition(devfreq, &freqs, DEVFREQ_PRECHANGE); in update_devfreq()
304 err = devfreq->profile->target(devfreq->dev.parent, &freq, flags); in update_devfreq()
307 devfreq_notify_transition(devfreq, &freqs, DEVFREQ_POSTCHANGE); in update_devfreq()
312 devfreq_notify_transition(devfreq, &freqs, DEVFREQ_POSTCHANGE); in update_devfreq()
314 if (devfreq_update_status(devfreq, freq)) in update_devfreq()
315 dev_err(&devfreq->dev, in update_devfreq()
318 devfreq->previous_freq = freq; in update_devfreq()
331 struct devfreq *devfreq = container_of(work, in devfreq_monitor() local
332 struct devfreq, work.work); in devfreq_monitor()
334 mutex_lock(&devfreq->lock); in devfreq_monitor()
335 err = update_devfreq(devfreq); in devfreq_monitor()
337 dev_err(&devfreq->dev, "dvfs failed with (%d) error\n", err); in devfreq_monitor()
339 queue_delayed_work(devfreq_wq, &devfreq->work, in devfreq_monitor()
340 msecs_to_jiffies(devfreq->profile->polling_ms)); in devfreq_monitor()
341 mutex_unlock(&devfreq->lock); in devfreq_monitor()
353 void devfreq_monitor_start(struct devfreq *devfreq) in devfreq_monitor_start() argument
355 INIT_DEFERRABLE_WORK(&devfreq->work, devfreq_monitor); in devfreq_monitor_start()
356 if (devfreq->profile->polling_ms) in devfreq_monitor_start()
357 queue_delayed_work(devfreq_wq, &devfreq->work, in devfreq_monitor_start()
358 msecs_to_jiffies(devfreq->profile->polling_ms)); in devfreq_monitor_start()
370 void devfreq_monitor_stop(struct devfreq *devfreq) in devfreq_monitor_stop() argument
372 cancel_delayed_work_sync(&devfreq->work); in devfreq_monitor_stop()
388 void devfreq_monitor_suspend(struct devfreq *devfreq) in devfreq_monitor_suspend() argument
390 mutex_lock(&devfreq->lock); in devfreq_monitor_suspend()
391 if (devfreq->stop_polling) { in devfreq_monitor_suspend()
392 mutex_unlock(&devfreq->lock); in devfreq_monitor_suspend()
396 devfreq_update_status(devfreq, devfreq->previous_freq); in devfreq_monitor_suspend()
397 devfreq->stop_polling = true; in devfreq_monitor_suspend()
398 mutex_unlock(&devfreq->lock); in devfreq_monitor_suspend()
399 cancel_delayed_work_sync(&devfreq->work); in devfreq_monitor_suspend()
411 void devfreq_monitor_resume(struct devfreq *devfreq) in devfreq_monitor_resume() argument
415 mutex_lock(&devfreq->lock); in devfreq_monitor_resume()
416 if (!devfreq->stop_polling) in devfreq_monitor_resume()
419 if (!delayed_work_pending(&devfreq->work) && in devfreq_monitor_resume()
420 devfreq->profile->polling_ms) in devfreq_monitor_resume()
421 queue_delayed_work(devfreq_wq, &devfreq->work, in devfreq_monitor_resume()
422 msecs_to_jiffies(devfreq->profile->polling_ms)); in devfreq_monitor_resume()
424 devfreq->last_stat_updated = jiffies; in devfreq_monitor_resume()
425 devfreq->stop_polling = false; in devfreq_monitor_resume()
427 if (devfreq->profile->get_cur_freq && in devfreq_monitor_resume()
428 !devfreq->profile->get_cur_freq(devfreq->dev.parent, &freq)) in devfreq_monitor_resume()
429 devfreq->previous_freq = freq; in devfreq_monitor_resume()
432 mutex_unlock(&devfreq->lock); in devfreq_monitor_resume()
444 void devfreq_interval_update(struct devfreq *devfreq, unsigned int *delay) in devfreq_interval_update() argument
446 unsigned int cur_delay = devfreq->profile->polling_ms; in devfreq_interval_update()
449 mutex_lock(&devfreq->lock); in devfreq_interval_update()
450 devfreq->profile->polling_ms = new_delay; in devfreq_interval_update()
452 if (devfreq->stop_polling) in devfreq_interval_update()
457 mutex_unlock(&devfreq->lock); in devfreq_interval_update()
458 cancel_delayed_work_sync(&devfreq->work); in devfreq_interval_update()
464 queue_delayed_work(devfreq_wq, &devfreq->work, in devfreq_interval_update()
465 msecs_to_jiffies(devfreq->profile->polling_ms)); in devfreq_interval_update()
471 mutex_unlock(&devfreq->lock); in devfreq_interval_update()
472 cancel_delayed_work_sync(&devfreq->work); in devfreq_interval_update()
473 mutex_lock(&devfreq->lock); in devfreq_interval_update()
474 if (!devfreq->stop_polling) in devfreq_interval_update()
475 queue_delayed_work(devfreq_wq, &devfreq->work, in devfreq_interval_update()
476 msecs_to_jiffies(devfreq->profile->polling_ms)); in devfreq_interval_update()
479 mutex_unlock(&devfreq->lock); in devfreq_interval_update()
495 struct devfreq *devfreq = container_of(nb, struct devfreq, nb); in devfreq_notifier_call() local
498 mutex_lock(&devfreq->lock); in devfreq_notifier_call()
500 devfreq->scaling_min_freq = find_available_min_freq(devfreq); in devfreq_notifier_call()
501 if (!devfreq->scaling_min_freq) { in devfreq_notifier_call()
502 mutex_unlock(&devfreq->lock); in devfreq_notifier_call()
506 devfreq->scaling_max_freq = find_available_max_freq(devfreq); in devfreq_notifier_call()
507 if (!devfreq->scaling_max_freq) { in devfreq_notifier_call()
508 mutex_unlock(&devfreq->lock); in devfreq_notifier_call()
512 ret = update_devfreq(devfreq); in devfreq_notifier_call()
513 mutex_unlock(&devfreq->lock); in devfreq_notifier_call()
526 struct devfreq *devfreq = to_devfreq(dev); in devfreq_dev_release() local
529 if (IS_ERR(find_device_devfreq(devfreq->dev.parent))) { in devfreq_dev_release()
531 dev_warn(&devfreq->dev, "releasing devfreq which doesn't exist\n"); in devfreq_dev_release()
534 list_del(&devfreq->node); in devfreq_dev_release()
537 if (devfreq->governor) in devfreq_dev_release()
538 devfreq->governor->event_handler(devfreq, in devfreq_dev_release()
541 if (devfreq->profile->exit) in devfreq_dev_release()
542 devfreq->profile->exit(devfreq->dev.parent); in devfreq_dev_release()
544 mutex_destroy(&devfreq->lock); in devfreq_dev_release()
545 kfree(devfreq); in devfreq_dev_release()
556 struct devfreq *devfreq_add_device(struct device *dev, in devfreq_add_device()
561 struct devfreq *devfreq; in devfreq_add_device() local
572 devfreq = find_device_devfreq(dev); in devfreq_add_device()
574 if (!IS_ERR(devfreq)) { in devfreq_add_device()
581 devfreq = kzalloc(sizeof(struct devfreq), GFP_KERNEL); in devfreq_add_device()
582 if (!devfreq) { in devfreq_add_device()
587 mutex_init(&devfreq->lock); in devfreq_add_device()
588 mutex_lock(&devfreq->lock); in devfreq_add_device()
589 devfreq->dev.parent = dev; in devfreq_add_device()
590 devfreq->dev.class = devfreq_class; in devfreq_add_device()
591 devfreq->dev.release = devfreq_dev_release; in devfreq_add_device()
592 devfreq->profile = profile; in devfreq_add_device()
593 strncpy(devfreq->governor_name, governor_name, DEVFREQ_NAME_LEN); in devfreq_add_device()
594 devfreq->previous_freq = profile->initial_freq; in devfreq_add_device()
595 devfreq->last_status.current_frequency = profile->initial_freq; in devfreq_add_device()
596 devfreq->data = data; in devfreq_add_device()
597 devfreq->nb.notifier_call = devfreq_notifier_call; in devfreq_add_device()
599 if (!devfreq->profile->max_state && !devfreq->profile->freq_table) { in devfreq_add_device()
600 mutex_unlock(&devfreq->lock); in devfreq_add_device()
601 err = set_freq_table(devfreq); in devfreq_add_device()
604 mutex_lock(&devfreq->lock); in devfreq_add_device()
607 devfreq->scaling_min_freq = find_available_min_freq(devfreq); in devfreq_add_device()
608 if (!devfreq->scaling_min_freq) { in devfreq_add_device()
609 mutex_unlock(&devfreq->lock); in devfreq_add_device()
613 devfreq->min_freq = devfreq->scaling_min_freq; in devfreq_add_device()
615 devfreq->scaling_max_freq = find_available_max_freq(devfreq); in devfreq_add_device()
616 if (!devfreq->scaling_max_freq) { in devfreq_add_device()
617 mutex_unlock(&devfreq->lock); in devfreq_add_device()
621 devfreq->max_freq = devfreq->scaling_max_freq; in devfreq_add_device()
623 dev_set_name(&devfreq->dev, "devfreq%d", in devfreq_add_device()
625 err = device_register(&devfreq->dev); in devfreq_add_device()
627 mutex_unlock(&devfreq->lock); in devfreq_add_device()
628 put_device(&devfreq->dev); in devfreq_add_device()
632 devfreq->trans_table = in devfreq_add_device()
633 devm_kzalloc(&devfreq->dev, in devfreq_add_device()
635 devfreq->profile->max_state, in devfreq_add_device()
636 devfreq->profile->max_state), in devfreq_add_device()
638 devfreq->time_in_state = devm_kcalloc(&devfreq->dev, in devfreq_add_device()
639 devfreq->profile->max_state, in devfreq_add_device()
642 devfreq->last_stat_updated = jiffies; in devfreq_add_device()
644 srcu_init_notifier_head(&devfreq->transition_notifier_list); in devfreq_add_device()
646 mutex_unlock(&devfreq->lock); in devfreq_add_device()
649 list_add(&devfreq->node, &devfreq_list); in devfreq_add_device()
651 governor = find_devfreq_governor(devfreq->governor_name); in devfreq_add_device()
659 devfreq->governor = governor; in devfreq_add_device()
660 err = devfreq->governor->event_handler(devfreq, DEVFREQ_GOV_START, in devfreq_add_device()
669 return devfreq; in devfreq_add_device()
672 list_del(&devfreq->node); in devfreq_add_device()
675 device_unregister(&devfreq->dev); in devfreq_add_device()
676 devfreq = NULL; in devfreq_add_device()
678 if (devfreq) in devfreq_add_device()
679 kfree(devfreq); in devfreq_add_device()
691 int devfreq_remove_device(struct devfreq *devfreq) in devfreq_remove_device() argument
693 if (!devfreq) in devfreq_remove_device()
696 device_unregister(&devfreq->dev); in devfreq_remove_device()
704 struct devfreq **r = res; in devm_devfreq_dev_match()
714 devfreq_remove_device(*(struct devfreq **)res); in devm_devfreq_dev_release()
729 struct devfreq *devm_devfreq_add_device(struct device *dev, in devm_devfreq_add_device()
734 struct devfreq **ptr, *devfreq; in devm_devfreq_add_device() local
740 devfreq = devfreq_add_device(dev, profile, governor_name, data); in devm_devfreq_add_device()
741 if (IS_ERR(devfreq)) { in devm_devfreq_add_device()
743 return devfreq; in devm_devfreq_add_device()
746 *ptr = devfreq; in devm_devfreq_add_device()
749 return devfreq; in devm_devfreq_add_device()
761 struct devfreq *devfreq_get_devfreq_by_phandle(struct device *dev, int index) in devfreq_get_devfreq_by_phandle()
764 struct devfreq *devfreq; in devfreq_get_devfreq_by_phandle() local
777 list_for_each_entry(devfreq, &devfreq_list, node) { in devfreq_get_devfreq_by_phandle()
778 if (devfreq->dev.parent in devfreq_get_devfreq_by_phandle()
779 && devfreq->dev.parent->of_node == node) { in devfreq_get_devfreq_by_phandle()
782 return devfreq; in devfreq_get_devfreq_by_phandle()
791 struct devfreq *devfreq_get_devfreq_by_phandle(struct device *dev, int index) in devfreq_get_devfreq_by_phandle()
803 void devm_devfreq_remove_device(struct device *dev, struct devfreq *devfreq) in devm_devfreq_remove_device() argument
806 devm_devfreq_dev_match, devfreq)); in devm_devfreq_remove_device()
818 int devfreq_suspend_device(struct devfreq *devfreq) in devfreq_suspend_device() argument
820 if (!devfreq) in devfreq_suspend_device()
823 if (!devfreq->governor) in devfreq_suspend_device()
826 return devfreq->governor->event_handler(devfreq, in devfreq_suspend_device()
839 int devfreq_resume_device(struct devfreq *devfreq) in devfreq_resume_device() argument
841 if (!devfreq) in devfreq_resume_device()
844 if (!devfreq->governor) in devfreq_resume_device()
847 return devfreq->governor->event_handler(devfreq, in devfreq_resume_device()
859 struct devfreq *devfreq; in devfreq_add_governor() local
878 list_for_each_entry(devfreq, &devfreq_list, node) { in devfreq_add_governor()
880 struct device *dev = devfreq->dev.parent; in devfreq_add_governor()
882 if (!strncmp(devfreq->governor_name, governor->name, in devfreq_add_governor()
885 if (devfreq->governor) { in devfreq_add_governor()
888 __func__, devfreq->governor->name); in devfreq_add_governor()
889 ret = devfreq->governor->event_handler(devfreq, in devfreq_add_governor()
895 devfreq->governor->name, ret); in devfreq_add_governor()
899 devfreq->governor = governor; in devfreq_add_governor()
900 ret = devfreq->governor->event_handler(devfreq, in devfreq_add_governor()
904 __func__, devfreq->governor->name, in devfreq_add_governor()
924 struct devfreq *devfreq; in devfreq_remove_governor() local
940 list_for_each_entry(devfreq, &devfreq_list, node) { in devfreq_remove_governor()
942 struct device *dev = devfreq->dev.parent; in devfreq_remove_governor()
944 if (!strncmp(devfreq->governor_name, governor->name, in devfreq_remove_governor()
947 if (!devfreq->governor) { in devfreq_remove_governor()
953 ret = devfreq->governor->event_handler(devfreq, in devfreq_remove_governor()
957 __func__, devfreq->governor->name, in devfreq_remove_governor()
960 devfreq->governor = NULL; in devfreq_remove_governor()
984 struct devfreq *df = to_devfreq(dev); in governor_store()
1035 struct devfreq *df = to_devfreq(d); in available_governors_show()
1078 struct devfreq *devfreq = to_devfreq(dev); in cur_freq_show() local
1080 if (devfreq->profile->get_cur_freq && in cur_freq_show()
1081 !devfreq->profile->get_cur_freq(devfreq->dev.parent, &freq)) in cur_freq_show()
1084 return sprintf(buf, "%lu\n", devfreq->previous_freq); in cur_freq_show()
1105 struct devfreq *df = to_devfreq(dev); in polling_interval_store()
1126 struct devfreq *df = to_devfreq(dev); in min_freq_store()
1153 struct devfreq *df = to_devfreq(dev); in min_freq_show()
1161 struct devfreq *df = to_devfreq(dev); in max_freq_store()
1189 struct devfreq *df = to_devfreq(dev); in max_freq_show()
1199 struct devfreq *df = to_devfreq(d); in available_frequencies_show()
1223 struct devfreq *devfreq = to_devfreq(dev); in trans_stat_show() local
1226 unsigned int max_state = devfreq->profile->max_state; in trans_stat_show()
1228 if (!devfreq->stop_polling && in trans_stat_show()
1229 devfreq_update_status(devfreq, devfreq->previous_freq)) in trans_stat_show()
1238 devfreq->profile->freq_table[i]); in trans_stat_show()
1243 if (devfreq->profile->freq_table[i] in trans_stat_show()
1244 == devfreq->previous_freq) { in trans_stat_show()
1250 devfreq->profile->freq_table[i]); in trans_stat_show()
1253 devfreq->trans_table[(i * max_state) + j]); in trans_stat_show()
1255 jiffies_to_msecs(devfreq->time_in_state[i])); in trans_stat_show()
1259 devfreq->total_trans); in trans_stat_show()
1276 ATTRIBUTE_GROUPS(devfreq);
1346 int devfreq_register_opp_notifier(struct device *dev, struct devfreq *devfreq) in devfreq_register_opp_notifier() argument
1348 return dev_pm_opp_register_notifier(dev, &devfreq->nb); in devfreq_register_opp_notifier()
1362 int devfreq_unregister_opp_notifier(struct device *dev, struct devfreq *devfreq) in devfreq_unregister_opp_notifier() argument
1364 return dev_pm_opp_unregister_notifier(dev, &devfreq->nb); in devfreq_unregister_opp_notifier()
1370 devfreq_unregister_opp_notifier(dev, *(struct devfreq **)res); in devm_devfreq_opp_release()
1380 struct devfreq *devfreq) in devm_devfreq_register_opp_notifier() argument
1382 struct devfreq **ptr; in devm_devfreq_register_opp_notifier()
1389 ret = devfreq_register_opp_notifier(dev, devfreq); in devm_devfreq_register_opp_notifier()
1395 *ptr = devfreq; in devm_devfreq_register_opp_notifier()
1409 struct devfreq *devfreq) in devm_devfreq_unregister_opp_notifier() argument
1412 devm_devfreq_dev_match, devfreq)); in devm_devfreq_unregister_opp_notifier()
1422 int devfreq_register_notifier(struct devfreq *devfreq, in devfreq_register_notifier() argument
1428 if (!devfreq) in devfreq_register_notifier()
1434 &devfreq->transition_notifier_list, nb); in devfreq_register_notifier()
1450 int devfreq_unregister_notifier(struct devfreq *devfreq, in devfreq_unregister_notifier() argument
1456 if (!devfreq) in devfreq_unregister_notifier()
1462 &devfreq->transition_notifier_list, nb); in devfreq_unregister_notifier()
1473 struct devfreq *devfreq; member
1482 devfreq_unregister_notifier(this->devfreq, this->nb, this->list); in devm_devfreq_notifier_release()
1494 struct devfreq *devfreq, in devm_devfreq_register_notifier() argument
1506 ret = devfreq_register_notifier(devfreq, nb, list); in devm_devfreq_register_notifier()
1512 ptr->devfreq = devfreq; in devm_devfreq_register_notifier()
1530 struct devfreq *devfreq, in devm_devfreq_unregister_notifier() argument
1535 devm_devfreq_dev_match, devfreq)); in devm_devfreq_unregister_notifier()