Lines Matching refs:opp_table

34 					struct opp_table *opp_table)  in _find_opp_dev()  argument
38 list_for_each_entry(opp_dev, &opp_table->dev_list, node) in _find_opp_dev()
45 static struct opp_table *_find_opp_table_unlocked(struct device *dev) in _find_opp_table_unlocked()
47 struct opp_table *opp_table; in _find_opp_table_unlocked() local
50 list_for_each_entry(opp_table, &opp_tables, node) { in _find_opp_table_unlocked()
51 mutex_lock(&opp_table->lock); in _find_opp_table_unlocked()
52 found = !!_find_opp_dev(dev, opp_table); in _find_opp_table_unlocked()
53 mutex_unlock(&opp_table->lock); in _find_opp_table_unlocked()
56 _get_opp_table_kref(opp_table); in _find_opp_table_unlocked()
58 return opp_table; in _find_opp_table_unlocked()
76 struct opp_table *_find_opp_table(struct device *dev) in _find_opp_table()
78 struct opp_table *opp_table; in _find_opp_table() local
86 opp_table = _find_opp_table_unlocked(dev); in _find_opp_table()
89 return opp_table; in _find_opp_table()
177 struct opp_table *opp_table; in dev_pm_opp_get_max_clock_latency() local
180 opp_table = _find_opp_table(dev); in dev_pm_opp_get_max_clock_latency()
181 if (IS_ERR(opp_table)) in dev_pm_opp_get_max_clock_latency()
184 clock_latency_ns = opp_table->clock_latency_ns_max; in dev_pm_opp_get_max_clock_latency()
186 dev_pm_opp_put_opp_table(opp_table); in dev_pm_opp_get_max_clock_latency()
200 struct opp_table *opp_table; in dev_pm_opp_get_max_volt_latency() local
210 opp_table = _find_opp_table(dev); in dev_pm_opp_get_max_volt_latency()
211 if (IS_ERR(opp_table)) in dev_pm_opp_get_max_volt_latency()
215 if (!opp_table->regulators) in dev_pm_opp_get_max_volt_latency()
218 count = opp_table->regulator_count; in dev_pm_opp_get_max_volt_latency()
224 mutex_lock(&opp_table->lock); in dev_pm_opp_get_max_volt_latency()
230 list_for_each_entry(opp, &opp_table->opp_list, node) { in dev_pm_opp_get_max_volt_latency()
241 mutex_unlock(&opp_table->lock); in dev_pm_opp_get_max_volt_latency()
248 reg = opp_table->regulators[i]; in dev_pm_opp_get_max_volt_latency()
256 dev_pm_opp_put_opp_table(opp_table); in dev_pm_opp_get_max_volt_latency()
286 struct opp_table *opp_table; in dev_pm_opp_get_suspend_opp_freq() local
289 opp_table = _find_opp_table(dev); in dev_pm_opp_get_suspend_opp_freq()
290 if (IS_ERR(opp_table)) in dev_pm_opp_get_suspend_opp_freq()
293 if (opp_table->suspend_opp && opp_table->suspend_opp->available) in dev_pm_opp_get_suspend_opp_freq()
294 freq = dev_pm_opp_get_freq(opp_table->suspend_opp); in dev_pm_opp_get_suspend_opp_freq()
296 dev_pm_opp_put_opp_table(opp_table); in dev_pm_opp_get_suspend_opp_freq()
302 int _get_opp_count(struct opp_table *opp_table) in _get_opp_count() argument
307 mutex_lock(&opp_table->lock); in _get_opp_count()
309 list_for_each_entry(opp, &opp_table->opp_list, node) { in _get_opp_count()
314 mutex_unlock(&opp_table->lock); in _get_opp_count()
328 struct opp_table *opp_table; in dev_pm_opp_get_opp_count() local
331 opp_table = _find_opp_table(dev); in dev_pm_opp_get_opp_count()
332 if (IS_ERR(opp_table)) { in dev_pm_opp_get_opp_count()
333 count = PTR_ERR(opp_table); in dev_pm_opp_get_opp_count()
339 count = _get_opp_count(opp_table); in dev_pm_opp_get_opp_count()
340 dev_pm_opp_put_opp_table(opp_table); in dev_pm_opp_get_opp_count()
373 struct opp_table *opp_table; in dev_pm_opp_find_freq_exact() local
376 opp_table = _find_opp_table(dev); in dev_pm_opp_find_freq_exact()
377 if (IS_ERR(opp_table)) { in dev_pm_opp_find_freq_exact()
378 int r = PTR_ERR(opp_table); in dev_pm_opp_find_freq_exact()
384 mutex_lock(&opp_table->lock); in dev_pm_opp_find_freq_exact()
386 list_for_each_entry(temp_opp, &opp_table->opp_list, node) { in dev_pm_opp_find_freq_exact()
397 mutex_unlock(&opp_table->lock); in dev_pm_opp_find_freq_exact()
398 dev_pm_opp_put_opp_table(opp_table); in dev_pm_opp_find_freq_exact()
422 struct opp_table *opp_table; in dev_pm_opp_find_level_exact() local
425 opp_table = _find_opp_table(dev); in dev_pm_opp_find_level_exact()
426 if (IS_ERR(opp_table)) { in dev_pm_opp_find_level_exact()
427 int r = PTR_ERR(opp_table); in dev_pm_opp_find_level_exact()
433 mutex_lock(&opp_table->lock); in dev_pm_opp_find_level_exact()
435 list_for_each_entry(temp_opp, &opp_table->opp_list, node) { in dev_pm_opp_find_level_exact()
445 mutex_unlock(&opp_table->lock); in dev_pm_opp_find_level_exact()
446 dev_pm_opp_put_opp_table(opp_table); in dev_pm_opp_find_level_exact()
452 static noinline struct dev_pm_opp *_find_freq_ceil(struct opp_table *opp_table, in _find_freq_ceil() argument
457 mutex_lock(&opp_table->lock); in _find_freq_ceil()
459 list_for_each_entry(temp_opp, &opp_table->opp_list, node) { in _find_freq_ceil()
470 mutex_unlock(&opp_table->lock); in _find_freq_ceil()
496 struct opp_table *opp_table; in dev_pm_opp_find_freq_ceil() local
504 opp_table = _find_opp_table(dev); in dev_pm_opp_find_freq_ceil()
505 if (IS_ERR(opp_table)) in dev_pm_opp_find_freq_ceil()
506 return ERR_CAST(opp_table); in dev_pm_opp_find_freq_ceil()
508 opp = _find_freq_ceil(opp_table, freq); in dev_pm_opp_find_freq_ceil()
510 dev_pm_opp_put_opp_table(opp_table); in dev_pm_opp_find_freq_ceil()
537 struct opp_table *opp_table; in dev_pm_opp_find_freq_floor() local
545 opp_table = _find_opp_table(dev); in dev_pm_opp_find_freq_floor()
546 if (IS_ERR(opp_table)) in dev_pm_opp_find_freq_floor()
547 return ERR_CAST(opp_table); in dev_pm_opp_find_freq_floor()
549 mutex_lock(&opp_table->lock); in dev_pm_opp_find_freq_floor()
551 list_for_each_entry(temp_opp, &opp_table->opp_list, node) { in dev_pm_opp_find_freq_floor()
564 mutex_unlock(&opp_table->lock); in dev_pm_opp_find_freq_floor()
565 dev_pm_opp_put_opp_table(opp_table); in dev_pm_opp_find_freq_floor()
594 struct opp_table *opp_table; in dev_pm_opp_find_freq_ceil_by_volt() local
603 opp_table = _find_opp_table(dev); in dev_pm_opp_find_freq_ceil_by_volt()
604 if (IS_ERR(opp_table)) in dev_pm_opp_find_freq_ceil_by_volt()
605 return ERR_CAST(opp_table); in dev_pm_opp_find_freq_ceil_by_volt()
607 mutex_lock(&opp_table->lock); in dev_pm_opp_find_freq_ceil_by_volt()
609 list_for_each_entry(temp_opp, &opp_table->opp_list, node) { in dev_pm_opp_find_freq_ceil_by_volt()
621 mutex_unlock(&opp_table->lock); in dev_pm_opp_find_freq_ceil_by_volt()
622 dev_pm_opp_put_opp_table(opp_table); in dev_pm_opp_find_freq_ceil_by_volt()
667 static int _generic_set_opp_regulator(struct opp_table *opp_table, in _generic_set_opp_regulator() argument
674 struct regulator *reg = opp_table->regulators[0]; in _generic_set_opp_regulator()
678 if (WARN_ON(opp_table->regulator_count > 1)) { in _generic_set_opp_regulator()
691 ret = _generic_set_opp_clk_only(dev, opp_table->clk, freq); in _generic_set_opp_regulator()
706 if (unlikely(!opp_table->enabled)) { in _generic_set_opp_regulator()
715 if (_generic_set_opp_clk_only(dev, opp_table->clk, old_freq)) in _generic_set_opp_regulator()
726 static int _set_opp_bw(const struct opp_table *opp_table, in _set_opp_bw() argument
732 if (!opp_table->paths) in _set_opp_bw()
735 for (i = 0; i < opp_table->path_count; i++) { in _set_opp_bw()
743 ret = icc_set_bw(opp_table->paths[i], avg, peak); in _set_opp_bw()
754 static int _set_opp_custom(const struct opp_table *opp_table, in _set_opp_custom() argument
763 data = opp_table->set_opp_data; in _set_opp_custom()
764 data->regulators = opp_table->regulators; in _set_opp_custom()
765 data->regulator_count = opp_table->regulator_count; in _set_opp_custom()
766 data->clk = opp_table->clk; in _set_opp_custom()
770 size = sizeof(*old_supply) * opp_table->regulator_count; in _set_opp_custom()
779 return opp_table->set_opp(data); in _set_opp_custom()
802 struct opp_table *opp_table, in _set_required_opps() argument
805 struct opp_table **required_opp_tables = opp_table->required_opp_tables; in _set_required_opps()
806 struct device **genpd_virt_devs = opp_table->genpd_virt_devs; in _set_required_opps()
822 mutex_lock(&opp_table->genpd_virt_dev_lock); in _set_required_opps()
826 for (i = 0; i < opp_table->required_opp_count; i++) { in _set_required_opps()
832 for (i = opp_table->required_opp_count - 1; i >= 0; i--) { in _set_required_opps()
839 mutex_unlock(&opp_table->genpd_virt_dev_lock); in _set_required_opps()
856 struct opp_table *opp_table; in dev_pm_opp_set_bw() local
859 opp_table = _find_opp_table(dev); in dev_pm_opp_set_bw()
860 if (IS_ERR(opp_table)) { in dev_pm_opp_set_bw()
862 return PTR_ERR(opp_table); in dev_pm_opp_set_bw()
866 ret = _set_opp_bw(opp_table, opp, dev, false); in dev_pm_opp_set_bw()
868 ret = _set_opp_bw(opp_table, NULL, dev, true); in dev_pm_opp_set_bw()
870 dev_pm_opp_put_opp_table(opp_table); in dev_pm_opp_set_bw()
875 static int _opp_set_rate_zero(struct device *dev, struct opp_table *opp_table) in _opp_set_rate_zero() argument
879 if (!opp_table->enabled) in _opp_set_rate_zero()
887 if (!_get_opp_count(opp_table)) in _opp_set_rate_zero()
890 ret = _set_opp_bw(opp_table, NULL, dev, true); in _opp_set_rate_zero()
894 if (opp_table->regulators) in _opp_set_rate_zero()
895 regulator_disable(opp_table->regulators[0]); in _opp_set_rate_zero()
897 ret = _set_required_opps(dev, opp_table, NULL, false); in _opp_set_rate_zero()
899 opp_table->enabled = false; in _opp_set_rate_zero()
916 struct opp_table *opp_table; in dev_pm_opp_set_rate() local
922 opp_table = _find_opp_table(dev); in dev_pm_opp_set_rate()
923 if (IS_ERR(opp_table)) { in dev_pm_opp_set_rate()
925 return PTR_ERR(opp_table); in dev_pm_opp_set_rate()
929 ret = _opp_set_rate_zero(dev, opp_table); in dev_pm_opp_set_rate()
933 clk = opp_table->clk; in dev_pm_opp_set_rate()
948 if (opp_table->enabled && old_freq == freq) { in dev_pm_opp_set_rate()
962 if (!_get_opp_count(opp_table)) { in dev_pm_opp_set_rate()
968 old_opp = _find_freq_ceil(opp_table, &temp_freq); in dev_pm_opp_set_rate()
975 opp = _find_freq_ceil(opp_table, &temp_freq); in dev_pm_opp_set_rate()
988 ret = _set_required_opps(dev, opp_table, opp, true); in dev_pm_opp_set_rate()
993 if (opp_table->set_opp) { in dev_pm_opp_set_rate()
994 ret = _set_opp_custom(opp_table, dev, old_freq, freq, in dev_pm_opp_set_rate()
997 } else if (opp_table->regulators) { in dev_pm_opp_set_rate()
998 ret = _generic_set_opp_regulator(opp_table, dev, old_freq, freq, in dev_pm_opp_set_rate()
1008 ret = _set_required_opps(dev, opp_table, opp, false); in dev_pm_opp_set_rate()
1014 ret = _set_opp_bw(opp_table, opp, dev, false); in dev_pm_opp_set_rate()
1016 opp_table->enabled = true; in dev_pm_opp_set_rate()
1025 dev_pm_opp_put_opp_table(opp_table); in dev_pm_opp_set_rate()
1032 struct opp_table *opp_table) in _remove_opp_dev() argument
1034 opp_debug_unregister(opp_dev, opp_table); in _remove_opp_dev()
1040 struct opp_table *opp_table) in _add_opp_dev_unlocked() argument
1051 list_add(&opp_dev->node, &opp_table->dev_list); in _add_opp_dev_unlocked()
1054 opp_debug_register(opp_dev, opp_table); in _add_opp_dev_unlocked()
1060 struct opp_table *opp_table) in _add_opp_dev() argument
1064 mutex_lock(&opp_table->lock); in _add_opp_dev()
1065 opp_dev = _add_opp_dev_unlocked(dev, opp_table); in _add_opp_dev()
1066 mutex_unlock(&opp_table->lock); in _add_opp_dev()
1071 static struct opp_table *_allocate_opp_table(struct device *dev, int index) in _allocate_opp_table()
1073 struct opp_table *opp_table; in _allocate_opp_table() local
1081 opp_table = kzalloc(sizeof(*opp_table), GFP_KERNEL); in _allocate_opp_table()
1082 if (!opp_table) in _allocate_opp_table()
1085 mutex_init(&opp_table->lock); in _allocate_opp_table()
1086 mutex_init(&opp_table->genpd_virt_dev_lock); in _allocate_opp_table()
1087 INIT_LIST_HEAD(&opp_table->dev_list); in _allocate_opp_table()
1090 opp_table->regulator_count = -1; in _allocate_opp_table()
1092 opp_dev = _add_opp_dev(dev, opp_table); in _allocate_opp_table()
1098 _of_init_opp_table(opp_table, dev, index); in _allocate_opp_table()
1101 opp_table->clk = clk_get(dev, NULL); in _allocate_opp_table()
1102 if (IS_ERR(opp_table->clk)) { in _allocate_opp_table()
1103 ret = PTR_ERR(opp_table->clk); in _allocate_opp_table()
1111 ret = dev_pm_opp_of_find_icc_paths(dev, opp_table); in _allocate_opp_table()
1120 BLOCKING_INIT_NOTIFIER_HEAD(&opp_table->head); in _allocate_opp_table()
1121 INIT_LIST_HEAD(&opp_table->opp_list); in _allocate_opp_table()
1122 kref_init(&opp_table->kref); in _allocate_opp_table()
1125 list_add(&opp_table->node, &opp_tables); in _allocate_opp_table()
1126 return opp_table; in _allocate_opp_table()
1129 kfree(opp_table); in _allocate_opp_table()
1133 void _get_opp_table_kref(struct opp_table *opp_table) in _get_opp_table_kref() argument
1135 kref_get(&opp_table->kref); in _get_opp_table_kref()
1138 static struct opp_table *_opp_get_opp_table(struct device *dev, int index) in _opp_get_opp_table()
1140 struct opp_table *opp_table; in _opp_get_opp_table() local
1145 opp_table = _find_opp_table_unlocked(dev); in _opp_get_opp_table()
1146 if (!IS_ERR(opp_table)) in _opp_get_opp_table()
1149 opp_table = _managed_opp(dev, index); in _opp_get_opp_table()
1150 if (opp_table) { in _opp_get_opp_table()
1151 if (!_add_opp_dev_unlocked(dev, opp_table)) { in _opp_get_opp_table()
1152 dev_pm_opp_put_opp_table(opp_table); in _opp_get_opp_table()
1153 opp_table = ERR_PTR(-ENOMEM); in _opp_get_opp_table()
1158 opp_table = _allocate_opp_table(dev, index); in _opp_get_opp_table()
1163 return opp_table; in _opp_get_opp_table()
1166 struct opp_table *dev_pm_opp_get_opp_table(struct device *dev) in dev_pm_opp_get_opp_table()
1172 struct opp_table *dev_pm_opp_get_opp_table_indexed(struct device *dev, in dev_pm_opp_get_opp_table_indexed()
1180 struct opp_table *opp_table = container_of(kref, struct opp_table, kref); in _opp_table_kref_release() local
1185 list_del(&opp_table->node); in _opp_table_kref_release()
1188 _of_clear_opp_table(opp_table); in _opp_table_kref_release()
1191 if (!IS_ERR(opp_table->clk)) in _opp_table_kref_release()
1192 clk_put(opp_table->clk); in _opp_table_kref_release()
1194 if (opp_table->paths) { in _opp_table_kref_release()
1195 for (i = 0; i < opp_table->path_count; i++) in _opp_table_kref_release()
1196 icc_put(opp_table->paths[i]); in _opp_table_kref_release()
1197 kfree(opp_table->paths); in _opp_table_kref_release()
1200 WARN_ON(!list_empty(&opp_table->opp_list)); in _opp_table_kref_release()
1202 list_for_each_entry_safe(opp_dev, temp, &opp_table->dev_list, node) { in _opp_table_kref_release()
1207 if (opp_table->genpd_performance_state) in _opp_table_kref_release()
1210 _remove_opp_dev(opp_dev, opp_table); in _opp_table_kref_release()
1213 mutex_destroy(&opp_table->genpd_virt_dev_lock); in _opp_table_kref_release()
1214 mutex_destroy(&opp_table->lock); in _opp_table_kref_release()
1215 kfree(opp_table); in _opp_table_kref_release()
1218 void dev_pm_opp_put_opp_table(struct opp_table *opp_table) in dev_pm_opp_put_opp_table() argument
1220 kref_put_mutex(&opp_table->kref, _opp_table_kref_release, in dev_pm_opp_put_opp_table()
1231 struct opp_table *opp_table) in _opp_kref_release() argument
1237 blocking_notifier_call_chain(&opp_table->head, OPP_EVENT_REMOVE, opp); in _opp_kref_release()
1238 _of_opp_free_required_opps(opp_table, opp); in _opp_kref_release()
1247 struct opp_table *opp_table = opp->opp_table; in _opp_kref_release_unlocked() local
1249 _opp_kref_release(opp, opp_table); in _opp_kref_release_unlocked()
1255 struct opp_table *opp_table = opp->opp_table; in _opp_kref_release_locked() local
1257 _opp_kref_release(opp, opp_table); in _opp_kref_release_locked()
1258 mutex_unlock(&opp_table->lock); in _opp_kref_release_locked()
1269 &opp->opp_table->lock); in dev_pm_opp_put()
1288 struct opp_table *opp_table; in dev_pm_opp_remove() local
1291 opp_table = _find_opp_table(dev); in dev_pm_opp_remove()
1292 if (IS_ERR(opp_table)) in dev_pm_opp_remove()
1295 mutex_lock(&opp_table->lock); in dev_pm_opp_remove()
1297 list_for_each_entry(opp, &opp_table->opp_list, node) { in dev_pm_opp_remove()
1304 mutex_unlock(&opp_table->lock); in dev_pm_opp_remove()
1310 dev_pm_opp_put_opp_table(opp_table); in dev_pm_opp_remove()
1317 dev_pm_opp_put_opp_table(opp_table); in dev_pm_opp_remove()
1321 bool _opp_remove_all_static(struct opp_table *opp_table) in _opp_remove_all_static() argument
1326 mutex_lock(&opp_table->lock); in _opp_remove_all_static()
1328 if (!opp_table->parsed_static_opps) { in _opp_remove_all_static()
1333 if (--opp_table->parsed_static_opps) in _opp_remove_all_static()
1336 list_for_each_entry_safe(opp, tmp, &opp_table->opp_list, node) { in _opp_remove_all_static()
1342 mutex_unlock(&opp_table->lock); in _opp_remove_all_static()
1355 struct opp_table *opp_table; in dev_pm_opp_remove_all_dynamic() local
1359 opp_table = _find_opp_table(dev); in dev_pm_opp_remove_all_dynamic()
1360 if (IS_ERR(opp_table)) in dev_pm_opp_remove_all_dynamic()
1363 mutex_lock(&opp_table->lock); in dev_pm_opp_remove_all_dynamic()
1364 list_for_each_entry_safe(opp, temp, &opp_table->opp_list, node) { in dev_pm_opp_remove_all_dynamic()
1370 mutex_unlock(&opp_table->lock); in dev_pm_opp_remove_all_dynamic()
1374 dev_pm_opp_put_opp_table(opp_table); in dev_pm_opp_remove_all_dynamic()
1377 dev_pm_opp_put_opp_table(opp_table); in dev_pm_opp_remove_all_dynamic()
1381 struct dev_pm_opp *_opp_allocate(struct opp_table *table) in _opp_allocate()
1407 struct opp_table *opp_table) in _opp_supported_by_regulators() argument
1412 if (!opp_table->regulators) in _opp_supported_by_regulators()
1415 for (i = 0; i < opp_table->regulator_count; i++) { in _opp_supported_by_regulators()
1416 reg = opp_table->regulators[i]; in _opp_supported_by_regulators()
1444 struct opp_table *opp_table, in _opp_is_duplicate() argument
1458 list_for_each_entry(opp, &opp_table->opp_list, node) { in _opp_is_duplicate()
1493 struct opp_table *opp_table, bool rate_not_available) in _opp_add() argument
1498 mutex_lock(&opp_table->lock); in _opp_add()
1499 head = &opp_table->opp_list; in _opp_add()
1502 ret = _opp_is_duplicate(dev, new_opp, opp_table, &head); in _opp_add()
1504 mutex_unlock(&opp_table->lock); in _opp_add()
1510 mutex_unlock(&opp_table->lock); in _opp_add()
1512 new_opp->opp_table = opp_table; in _opp_add()
1515 opp_debug_create_one(new_opp, opp_table); in _opp_add()
1517 if (!_opp_supported_by_regulators(new_opp, opp_table)) { in _opp_add()
1548 int _opp_add_v1(struct opp_table *opp_table, struct device *dev, in _opp_add_v1() argument
1555 new_opp = _opp_allocate(opp_table); in _opp_add_v1()
1561 tol = u_volt * opp_table->voltage_tolerance_v1 / 100; in _opp_add_v1()
1568 ret = _opp_add(dev, new_opp, opp_table, false); in _opp_add_v1()
1580 blocking_notifier_call_chain(&opp_table->head, OPP_EVENT_ADD, new_opp); in _opp_add_v1()
1600 struct opp_table *dev_pm_opp_set_supported_hw(struct device *dev, in dev_pm_opp_set_supported_hw()
1603 struct opp_table *opp_table; in dev_pm_opp_set_supported_hw() local
1605 opp_table = dev_pm_opp_get_opp_table(dev); in dev_pm_opp_set_supported_hw()
1606 if (IS_ERR(opp_table)) in dev_pm_opp_set_supported_hw()
1607 return opp_table; in dev_pm_opp_set_supported_hw()
1610 WARN_ON(!list_empty(&opp_table->opp_list)); in dev_pm_opp_set_supported_hw()
1613 if (opp_table->supported_hw) in dev_pm_opp_set_supported_hw()
1614 return opp_table; in dev_pm_opp_set_supported_hw()
1616 opp_table->supported_hw = kmemdup(versions, count * sizeof(*versions), in dev_pm_opp_set_supported_hw()
1618 if (!opp_table->supported_hw) { in dev_pm_opp_set_supported_hw()
1619 dev_pm_opp_put_opp_table(opp_table); in dev_pm_opp_set_supported_hw()
1623 opp_table->supported_hw_count = count; in dev_pm_opp_set_supported_hw()
1625 return opp_table; in dev_pm_opp_set_supported_hw()
1637 void dev_pm_opp_put_supported_hw(struct opp_table *opp_table) in dev_pm_opp_put_supported_hw() argument
1640 WARN_ON(!list_empty(&opp_table->opp_list)); in dev_pm_opp_put_supported_hw()
1642 kfree(opp_table->supported_hw); in dev_pm_opp_put_supported_hw()
1643 opp_table->supported_hw = NULL; in dev_pm_opp_put_supported_hw()
1644 opp_table->supported_hw_count = 0; in dev_pm_opp_put_supported_hw()
1646 dev_pm_opp_put_opp_table(opp_table); in dev_pm_opp_put_supported_hw()
1660 struct opp_table *dev_pm_opp_set_prop_name(struct device *dev, const char *name) in dev_pm_opp_set_prop_name()
1662 struct opp_table *opp_table; in dev_pm_opp_set_prop_name() local
1664 opp_table = dev_pm_opp_get_opp_table(dev); in dev_pm_opp_set_prop_name()
1665 if (IS_ERR(opp_table)) in dev_pm_opp_set_prop_name()
1666 return opp_table; in dev_pm_opp_set_prop_name()
1669 WARN_ON(!list_empty(&opp_table->opp_list)); in dev_pm_opp_set_prop_name()
1672 if (opp_table->prop_name) in dev_pm_opp_set_prop_name()
1673 return opp_table; in dev_pm_opp_set_prop_name()
1675 opp_table->prop_name = kstrdup(name, GFP_KERNEL); in dev_pm_opp_set_prop_name()
1676 if (!opp_table->prop_name) { in dev_pm_opp_set_prop_name()
1677 dev_pm_opp_put_opp_table(opp_table); in dev_pm_opp_set_prop_name()
1681 return opp_table; in dev_pm_opp_set_prop_name()
1693 void dev_pm_opp_put_prop_name(struct opp_table *opp_table) in dev_pm_opp_put_prop_name() argument
1696 WARN_ON(!list_empty(&opp_table->opp_list)); in dev_pm_opp_put_prop_name()
1698 kfree(opp_table->prop_name); in dev_pm_opp_put_prop_name()
1699 opp_table->prop_name = NULL; in dev_pm_opp_put_prop_name()
1701 dev_pm_opp_put_opp_table(opp_table); in dev_pm_opp_put_prop_name()
1705 static int _allocate_set_opp_data(struct opp_table *opp_table) in _allocate_set_opp_data() argument
1708 int len, count = opp_table->regulator_count; in _allocate_set_opp_data()
1710 if (WARN_ON(!opp_table->regulators)) in _allocate_set_opp_data()
1726 opp_table->set_opp_data = data; in _allocate_set_opp_data()
1731 static void _free_set_opp_data(struct opp_table *opp_table) in _free_set_opp_data() argument
1733 kfree(opp_table->set_opp_data); in _free_set_opp_data()
1734 opp_table->set_opp_data = NULL; in _free_set_opp_data()
1749 struct opp_table *dev_pm_opp_set_regulators(struct device *dev, in dev_pm_opp_set_regulators()
1753 struct opp_table *opp_table; in dev_pm_opp_set_regulators() local
1757 opp_table = dev_pm_opp_get_opp_table(dev); in dev_pm_opp_set_regulators()
1758 if (IS_ERR(opp_table)) in dev_pm_opp_set_regulators()
1759 return opp_table; in dev_pm_opp_set_regulators()
1762 if (WARN_ON(!list_empty(&opp_table->opp_list))) { in dev_pm_opp_set_regulators()
1768 if (opp_table->regulators) in dev_pm_opp_set_regulators()
1769 return opp_table; in dev_pm_opp_set_regulators()
1771 opp_table->regulators = kmalloc_array(count, in dev_pm_opp_set_regulators()
1772 sizeof(*opp_table->regulators), in dev_pm_opp_set_regulators()
1774 if (!opp_table->regulators) { in dev_pm_opp_set_regulators()
1789 opp_table->regulators[i] = reg; in dev_pm_opp_set_regulators()
1792 opp_table->regulator_count = count; in dev_pm_opp_set_regulators()
1795 ret = _allocate_set_opp_data(opp_table); in dev_pm_opp_set_regulators()
1799 return opp_table; in dev_pm_opp_set_regulators()
1803 regulator_put(opp_table->regulators[--i]); in dev_pm_opp_set_regulators()
1805 kfree(opp_table->regulators); in dev_pm_opp_set_regulators()
1806 opp_table->regulators = NULL; in dev_pm_opp_set_regulators()
1807 opp_table->regulator_count = -1; in dev_pm_opp_set_regulators()
1809 dev_pm_opp_put_opp_table(opp_table); in dev_pm_opp_set_regulators()
1819 void dev_pm_opp_put_regulators(struct opp_table *opp_table) in dev_pm_opp_put_regulators() argument
1823 if (!opp_table->regulators) in dev_pm_opp_put_regulators()
1827 WARN_ON(!list_empty(&opp_table->opp_list)); in dev_pm_opp_put_regulators()
1829 if (opp_table->enabled) { in dev_pm_opp_put_regulators()
1830 for (i = opp_table->regulator_count - 1; i >= 0; i--) in dev_pm_opp_put_regulators()
1831 regulator_disable(opp_table->regulators[i]); in dev_pm_opp_put_regulators()
1834 for (i = opp_table->regulator_count - 1; i >= 0; i--) in dev_pm_opp_put_regulators()
1835 regulator_put(opp_table->regulators[i]); in dev_pm_opp_put_regulators()
1837 _free_set_opp_data(opp_table); in dev_pm_opp_put_regulators()
1839 kfree(opp_table->regulators); in dev_pm_opp_put_regulators()
1840 opp_table->regulators = NULL; in dev_pm_opp_put_regulators()
1841 opp_table->regulator_count = -1; in dev_pm_opp_put_regulators()
1844 dev_pm_opp_put_opp_table(opp_table); in dev_pm_opp_put_regulators()
1860 struct opp_table *dev_pm_opp_set_clkname(struct device *dev, const char *name) in dev_pm_opp_set_clkname()
1862 struct opp_table *opp_table; in dev_pm_opp_set_clkname() local
1865 opp_table = dev_pm_opp_get_opp_table(dev); in dev_pm_opp_set_clkname()
1866 if (IS_ERR(opp_table)) in dev_pm_opp_set_clkname()
1867 return opp_table; in dev_pm_opp_set_clkname()
1870 if (WARN_ON(!list_empty(&opp_table->opp_list))) { in dev_pm_opp_set_clkname()
1876 if (!IS_ERR(opp_table->clk)) in dev_pm_opp_set_clkname()
1877 clk_put(opp_table->clk); in dev_pm_opp_set_clkname()
1880 opp_table->clk = clk_get(dev, name); in dev_pm_opp_set_clkname()
1881 if (IS_ERR(opp_table->clk)) { in dev_pm_opp_set_clkname()
1882 ret = PTR_ERR(opp_table->clk); in dev_pm_opp_set_clkname()
1890 return opp_table; in dev_pm_opp_set_clkname()
1893 dev_pm_opp_put_opp_table(opp_table); in dev_pm_opp_set_clkname()
1903 void dev_pm_opp_put_clkname(struct opp_table *opp_table) in dev_pm_opp_put_clkname() argument
1906 WARN_ON(!list_empty(&opp_table->opp_list)); in dev_pm_opp_put_clkname()
1908 clk_put(opp_table->clk); in dev_pm_opp_put_clkname()
1909 opp_table->clk = ERR_PTR(-EINVAL); in dev_pm_opp_put_clkname()
1911 dev_pm_opp_put_opp_table(opp_table); in dev_pm_opp_put_clkname()
1925 struct opp_table *dev_pm_opp_register_set_opp_helper(struct device *dev, in dev_pm_opp_register_set_opp_helper()
1928 struct opp_table *opp_table; in dev_pm_opp_register_set_opp_helper() local
1933 opp_table = dev_pm_opp_get_opp_table(dev); in dev_pm_opp_register_set_opp_helper()
1934 if (IS_ERR(opp_table)) in dev_pm_opp_register_set_opp_helper()
1935 return opp_table; in dev_pm_opp_register_set_opp_helper()
1938 if (WARN_ON(!list_empty(&opp_table->opp_list))) { in dev_pm_opp_register_set_opp_helper()
1939 dev_pm_opp_put_opp_table(opp_table); in dev_pm_opp_register_set_opp_helper()
1944 if (!opp_table->set_opp) in dev_pm_opp_register_set_opp_helper()
1945 opp_table->set_opp = set_opp; in dev_pm_opp_register_set_opp_helper()
1947 return opp_table; in dev_pm_opp_register_set_opp_helper()
1958 void dev_pm_opp_unregister_set_opp_helper(struct opp_table *opp_table) in dev_pm_opp_unregister_set_opp_helper() argument
1961 WARN_ON(!list_empty(&opp_table->opp_list)); in dev_pm_opp_unregister_set_opp_helper()
1963 opp_table->set_opp = NULL; in dev_pm_opp_unregister_set_opp_helper()
1964 dev_pm_opp_put_opp_table(opp_table); in dev_pm_opp_unregister_set_opp_helper()
1968 static void _opp_detach_genpd(struct opp_table *opp_table) in _opp_detach_genpd() argument
1972 if (!opp_table->genpd_virt_devs) in _opp_detach_genpd()
1975 for (index = 0; index < opp_table->required_opp_count; index++) { in _opp_detach_genpd()
1976 if (!opp_table->genpd_virt_devs[index]) in _opp_detach_genpd()
1979 dev_pm_domain_detach(opp_table->genpd_virt_devs[index], false); in _opp_detach_genpd()
1980 opp_table->genpd_virt_devs[index] = NULL; in _opp_detach_genpd()
1983 kfree(opp_table->genpd_virt_devs); in _opp_detach_genpd()
1984 opp_table->genpd_virt_devs = NULL; in _opp_detach_genpd()
2009 struct opp_table *dev_pm_opp_attach_genpd(struct device *dev, in dev_pm_opp_attach_genpd()
2012 struct opp_table *opp_table; in dev_pm_opp_attach_genpd() local
2017 opp_table = dev_pm_opp_get_opp_table(dev); in dev_pm_opp_attach_genpd()
2018 if (IS_ERR(opp_table)) in dev_pm_opp_attach_genpd()
2019 return opp_table; in dev_pm_opp_attach_genpd()
2021 if (opp_table->genpd_virt_devs) in dev_pm_opp_attach_genpd()
2022 return opp_table; in dev_pm_opp_attach_genpd()
2029 if (!opp_table->required_opp_count) { in dev_pm_opp_attach_genpd()
2034 mutex_lock(&opp_table->genpd_virt_dev_lock); in dev_pm_opp_attach_genpd()
2036 opp_table->genpd_virt_devs = kcalloc(opp_table->required_opp_count, in dev_pm_opp_attach_genpd()
2037 sizeof(*opp_table->genpd_virt_devs), in dev_pm_opp_attach_genpd()
2039 if (!opp_table->genpd_virt_devs) in dev_pm_opp_attach_genpd()
2043 if (index >= opp_table->required_opp_count) { in dev_pm_opp_attach_genpd()
2045 *name, opp_table->required_opp_count, index); in dev_pm_opp_attach_genpd()
2056 opp_table->genpd_virt_devs[index] = virt_dev; in dev_pm_opp_attach_genpd()
2062 *virt_devs = opp_table->genpd_virt_devs; in dev_pm_opp_attach_genpd()
2063 mutex_unlock(&opp_table->genpd_virt_dev_lock); in dev_pm_opp_attach_genpd()
2065 return opp_table; in dev_pm_opp_attach_genpd()
2068 _opp_detach_genpd(opp_table); in dev_pm_opp_attach_genpd()
2070 mutex_unlock(&opp_table->genpd_virt_dev_lock); in dev_pm_opp_attach_genpd()
2073 dev_pm_opp_put_opp_table(opp_table); in dev_pm_opp_attach_genpd()
2086 void dev_pm_opp_detach_genpd(struct opp_table *opp_table) in dev_pm_opp_detach_genpd() argument
2092 mutex_lock(&opp_table->genpd_virt_dev_lock); in dev_pm_opp_detach_genpd()
2093 _opp_detach_genpd(opp_table); in dev_pm_opp_detach_genpd()
2094 mutex_unlock(&opp_table->genpd_virt_dev_lock); in dev_pm_opp_detach_genpd()
2096 dev_pm_opp_put_opp_table(opp_table); in dev_pm_opp_detach_genpd()
2113 int dev_pm_opp_xlate_performance_state(struct opp_table *src_table, in dev_pm_opp_xlate_performance_state()
2114 struct opp_table *dst_table, in dev_pm_opp_xlate_performance_state()
2179 struct opp_table *opp_table; in dev_pm_opp_add() local
2182 opp_table = dev_pm_opp_get_opp_table(dev); in dev_pm_opp_add()
2183 if (IS_ERR(opp_table)) in dev_pm_opp_add()
2184 return PTR_ERR(opp_table); in dev_pm_opp_add()
2187 opp_table->regulator_count = 1; in dev_pm_opp_add()
2189 ret = _opp_add_v1(opp_table, dev, freq, u_volt, true); in dev_pm_opp_add()
2191 dev_pm_opp_put_opp_table(opp_table); in dev_pm_opp_add()
2213 struct opp_table *opp_table; in _opp_set_availability() local
2218 opp_table = _find_opp_table(dev); in _opp_set_availability()
2219 if (IS_ERR(opp_table)) { in _opp_set_availability()
2220 r = PTR_ERR(opp_table); in _opp_set_availability()
2225 mutex_lock(&opp_table->lock); in _opp_set_availability()
2228 list_for_each_entry(tmp_opp, &opp_table->opp_list, node) { in _opp_set_availability()
2247 mutex_unlock(&opp_table->lock); in _opp_set_availability()
2251 blocking_notifier_call_chain(&opp_table->head, OPP_EVENT_ENABLE, in _opp_set_availability()
2254 blocking_notifier_call_chain(&opp_table->head, in _opp_set_availability()
2261 mutex_unlock(&opp_table->lock); in _opp_set_availability()
2263 dev_pm_opp_put_opp_table(opp_table); in _opp_set_availability()
2284 struct opp_table *opp_table; in dev_pm_opp_adjust_voltage() local
2289 opp_table = _find_opp_table(dev); in dev_pm_opp_adjust_voltage()
2290 if (IS_ERR(opp_table)) { in dev_pm_opp_adjust_voltage()
2291 r = PTR_ERR(opp_table); in dev_pm_opp_adjust_voltage()
2296 mutex_lock(&opp_table->lock); in dev_pm_opp_adjust_voltage()
2299 list_for_each_entry(tmp_opp, &opp_table->opp_list, node) { in dev_pm_opp_adjust_voltage()
2320 mutex_unlock(&opp_table->lock); in dev_pm_opp_adjust_voltage()
2323 blocking_notifier_call_chain(&opp_table->head, OPP_EVENT_ADJUST_VOLTAGE, in dev_pm_opp_adjust_voltage()
2330 mutex_unlock(&opp_table->lock); in dev_pm_opp_adjust_voltage()
2332 dev_pm_opp_put_opp_table(opp_table); in dev_pm_opp_adjust_voltage()
2385 struct opp_table *opp_table; in dev_pm_opp_register_notifier() local
2388 opp_table = _find_opp_table(dev); in dev_pm_opp_register_notifier()
2389 if (IS_ERR(opp_table)) in dev_pm_opp_register_notifier()
2390 return PTR_ERR(opp_table); in dev_pm_opp_register_notifier()
2392 ret = blocking_notifier_chain_register(&opp_table->head, nb); in dev_pm_opp_register_notifier()
2394 dev_pm_opp_put_opp_table(opp_table); in dev_pm_opp_register_notifier()
2410 struct opp_table *opp_table; in dev_pm_opp_unregister_notifier() local
2413 opp_table = _find_opp_table(dev); in dev_pm_opp_unregister_notifier()
2414 if (IS_ERR(opp_table)) in dev_pm_opp_unregister_notifier()
2415 return PTR_ERR(opp_table); in dev_pm_opp_unregister_notifier()
2417 ret = blocking_notifier_chain_unregister(&opp_table->head, nb); in dev_pm_opp_unregister_notifier()
2419 dev_pm_opp_put_opp_table(opp_table); in dev_pm_opp_unregister_notifier()
2434 struct opp_table *opp_table; in dev_pm_opp_remove_table() local
2437 opp_table = _find_opp_table(dev); in dev_pm_opp_remove_table()
2438 if (IS_ERR(opp_table)) { in dev_pm_opp_remove_table()
2439 int error = PTR_ERR(opp_table); in dev_pm_opp_remove_table()
2453 if (_opp_remove_all_static(opp_table)) in dev_pm_opp_remove_table()
2454 dev_pm_opp_put_opp_table(opp_table); in dev_pm_opp_remove_table()
2457 dev_pm_opp_put_opp_table(opp_table); in dev_pm_opp_remove_table()