Lines Matching refs:opp_table
40 static bool _find_opp_dev(const struct device *dev, struct opp_table *opp_table) in _find_opp_dev() argument
45 mutex_lock(&opp_table->lock); in _find_opp_dev()
46 list_for_each_entry(opp_dev, &opp_table->dev_list, node) in _find_opp_dev()
52 mutex_unlock(&opp_table->lock); in _find_opp_dev()
56 static struct opp_table *_find_opp_table_unlocked(struct device *dev) in _find_opp_table_unlocked()
58 struct opp_table *opp_table; in _find_opp_table_unlocked() local
60 list_for_each_entry(opp_table, &opp_tables, node) { in _find_opp_table_unlocked()
61 if (_find_opp_dev(dev, opp_table)) { in _find_opp_table_unlocked()
62 _get_opp_table_kref(opp_table); in _find_opp_table_unlocked()
63 return opp_table; in _find_opp_table_unlocked()
81 struct opp_table *_find_opp_table(struct device *dev) in _find_opp_table()
83 struct opp_table *opp_table; in _find_opp_table() local
91 opp_table = _find_opp_table_unlocked(dev); in _find_opp_table()
94 return opp_table; in _find_opp_table()
104 static bool assert_single_clk(struct opp_table *opp_table) in assert_single_clk() argument
106 return !WARN_ON(opp_table->clk_count > 1); in assert_single_clk()
149 sizeof(*supplies) * opp->opp_table->regulator_count); in dev_pm_opp_get_supplies()
172 for (i = 0; i < opp->opp_table->regulator_count; i++) in dev_pm_opp_get_power()
190 if (IS_ERR_OR_NULL(opp) || index >= opp->opp_table->clk_count) { in dev_pm_opp_get_freq_indexed()
230 index >= opp->opp_table->required_opp_count) { in dev_pm_opp_get_required_pstate()
236 if (lazy_linking_pending(opp->opp_table)) in dev_pm_opp_get_required_pstate()
240 if (unlikely(!opp->opp_table->required_opp_tables[index]->is_genpd)) { in dev_pm_opp_get_required_pstate()
278 struct opp_table *opp_table; in dev_pm_opp_get_max_clock_latency() local
281 opp_table = _find_opp_table(dev); in dev_pm_opp_get_max_clock_latency()
282 if (IS_ERR(opp_table)) in dev_pm_opp_get_max_clock_latency()
285 clock_latency_ns = opp_table->clock_latency_ns_max; in dev_pm_opp_get_max_clock_latency()
287 dev_pm_opp_put_opp_table(opp_table); in dev_pm_opp_get_max_clock_latency()
301 struct opp_table *opp_table; in dev_pm_opp_get_max_volt_latency() local
311 opp_table = _find_opp_table(dev); in dev_pm_opp_get_max_volt_latency()
312 if (IS_ERR(opp_table)) in dev_pm_opp_get_max_volt_latency()
316 if (!opp_table->regulators) in dev_pm_opp_get_max_volt_latency()
319 count = opp_table->regulator_count; in dev_pm_opp_get_max_volt_latency()
325 mutex_lock(&opp_table->lock); in dev_pm_opp_get_max_volt_latency()
331 list_for_each_entry(opp, &opp_table->opp_list, node) { in dev_pm_opp_get_max_volt_latency()
342 mutex_unlock(&opp_table->lock); in dev_pm_opp_get_max_volt_latency()
349 reg = opp_table->regulators[i]; in dev_pm_opp_get_max_volt_latency()
357 dev_pm_opp_put_opp_table(opp_table); in dev_pm_opp_get_max_volt_latency()
387 struct opp_table *opp_table; in dev_pm_opp_get_suspend_opp_freq() local
390 opp_table = _find_opp_table(dev); in dev_pm_opp_get_suspend_opp_freq()
391 if (IS_ERR(opp_table)) in dev_pm_opp_get_suspend_opp_freq()
394 if (opp_table->suspend_opp && opp_table->suspend_opp->available) in dev_pm_opp_get_suspend_opp_freq()
395 freq = dev_pm_opp_get_freq(opp_table->suspend_opp); in dev_pm_opp_get_suspend_opp_freq()
397 dev_pm_opp_put_opp_table(opp_table); in dev_pm_opp_get_suspend_opp_freq()
403 int _get_opp_count(struct opp_table *opp_table) in _get_opp_count() argument
408 mutex_lock(&opp_table->lock); in _get_opp_count()
410 list_for_each_entry(opp, &opp_table->opp_list, node) { in _get_opp_count()
415 mutex_unlock(&opp_table->lock); in _get_opp_count()
429 struct opp_table *opp_table; in dev_pm_opp_get_opp_count() local
432 opp_table = _find_opp_table(dev); in dev_pm_opp_get_opp_count()
433 if (IS_ERR(opp_table)) { in dev_pm_opp_get_opp_count()
434 count = PTR_ERR(opp_table); in dev_pm_opp_get_opp_count()
440 count = _get_opp_count(opp_table); in dev_pm_opp_get_opp_count()
441 dev_pm_opp_put_opp_table(opp_table); in dev_pm_opp_get_opp_count()
497 static struct dev_pm_opp *_opp_table_find_key(struct opp_table *opp_table, in _opp_table_find_key() argument
502 bool (*assert)(struct opp_table *opp_table)) in _opp_table_find_key() argument
507 if (assert && !assert(opp_table)) in _opp_table_find_key()
510 mutex_lock(&opp_table->lock); in _opp_table_find_key()
512 list_for_each_entry(temp_opp, &opp_table->opp_list, node) { in _opp_table_find_key()
525 mutex_unlock(&opp_table->lock); in _opp_table_find_key()
535 bool (*assert)(struct opp_table *opp_table)) in _find_key() argument
537 struct opp_table *opp_table; in _find_key() local
540 opp_table = _find_opp_table(dev); in _find_key()
541 if (IS_ERR(opp_table)) { in _find_key()
543 PTR_ERR(opp_table)); in _find_key()
544 return ERR_CAST(opp_table); in _find_key()
547 opp = _opp_table_find_key(opp_table, key, index, available, read, in _find_key()
550 dev_pm_opp_put_opp_table(opp_table); in _find_key()
558 bool (*assert)(struct opp_table *opp_table)) in _find_key_exact() argument
568 static struct dev_pm_opp *_opp_table_find_key_ceil(struct opp_table *opp_table, in _opp_table_find_key_ceil() argument
571 bool (*assert)(struct opp_table *opp_table)) in _opp_table_find_key_ceil() argument
573 return _opp_table_find_key(opp_table, key, index, available, read, in _opp_table_find_key_ceil()
580 bool (*assert)(struct opp_table *opp_table)) in _find_key_ceil() argument
589 bool (*assert)(struct opp_table *opp_table)) in _find_key_floor() argument
654 static noinline struct dev_pm_opp *_find_freq_ceil(struct opp_table *opp_table, in _find_freq_ceil() argument
657 return _opp_table_find_key_ceil(opp_table, freq, 0, true, _read_freq, in _find_freq_ceil()
904 _opp_config_clk_single(struct device *dev, struct opp_table *opp_table, in _opp_config_clk_single() argument
921 ret = clk_set_rate(opp_table->clk, freq); in _opp_config_clk_single()
926 opp_table->rate_clk_single = freq; in _opp_config_clk_single()
937 struct opp_table *opp_table, struct dev_pm_opp *opp, void *data, in dev_pm_opp_config_clks_simple() argument
943 for (i = opp_table->clk_count - 1; i >= 0; i--) { in dev_pm_opp_config_clks_simple()
944 ret = clk_set_rate(opp_table->clks[i], opp->rates[i]); in dev_pm_opp_config_clks_simple()
952 for (i = 0; i < opp_table->clk_count; i++) { in dev_pm_opp_config_clks_simple()
953 ret = clk_set_rate(opp_table->clks[i], opp->rates[i]); in dev_pm_opp_config_clks_simple()
987 if (unlikely(!new_opp->opp_table->enabled)) { in _opp_config_regulator_single()
996 static int _set_opp_bw(const struct opp_table *opp_table, in _set_opp_bw() argument
1002 if (!opp_table->paths) in _set_opp_bw()
1005 for (i = 0; i < opp_table->path_count; i++) { in _set_opp_bw()
1013 ret = icc_set_bw(opp_table->paths[i], avg, peak); in _set_opp_bw()
1043 struct opp_table *opp_table, struct dev_pm_opp *opp, bool scaling_down) in _opp_set_required_opps_generic() argument
1050 struct opp_table *opp_table, struct dev_pm_opp *opp, bool scaling_down) in _opp_set_required_opps_genpd() argument
1053 opp_table->genpd_virt_devs ? opp_table->genpd_virt_devs : &dev; in _opp_set_required_opps_genpd()
1060 mutex_lock(&opp_table->genpd_virt_dev_lock); in _opp_set_required_opps_genpd()
1064 for (i = 0; i < opp_table->required_opp_count; i++) { in _opp_set_required_opps_genpd()
1070 for (i = opp_table->required_opp_count - 1; i >= 0; i--) { in _opp_set_required_opps_genpd()
1077 mutex_unlock(&opp_table->genpd_virt_dev_lock); in _opp_set_required_opps_genpd()
1083 static int _set_required_opps(struct device *dev, struct opp_table *opp_table, in _set_required_opps() argument
1087 if (lazy_linking_pending(opp_table)) in _set_required_opps()
1090 if (opp_table->set_required_opps) in _set_required_opps()
1091 return opp_table->set_required_opps(dev, opp_table, opp, up); in _set_required_opps()
1097 void _update_set_required_opps(struct opp_table *opp_table) in _update_set_required_opps() argument
1100 if (opp_table->set_required_opps) in _update_set_required_opps()
1104 if (opp_table->required_opp_tables[0]->is_genpd) in _update_set_required_opps()
1105 opp_table->set_required_opps = _opp_set_required_opps_genpd; in _update_set_required_opps()
1107 opp_table->set_required_opps = _opp_set_required_opps_generic; in _update_set_required_opps()
1110 static void _find_current_opp(struct device *dev, struct opp_table *opp_table) in _find_current_opp() argument
1115 if (!IS_ERR(opp_table->clk)) { in _find_current_opp()
1116 freq = clk_get_rate(opp_table->clk); in _find_current_opp()
1117 opp = _find_freq_ceil(opp_table, &freq); in _find_current_opp()
1126 mutex_lock(&opp_table->lock); in _find_current_opp()
1127 opp = list_first_entry(&opp_table->opp_list, struct dev_pm_opp, node); in _find_current_opp()
1129 mutex_unlock(&opp_table->lock); in _find_current_opp()
1132 opp_table->current_opp = opp; in _find_current_opp()
1135 static int _disable_opp_table(struct device *dev, struct opp_table *opp_table) in _disable_opp_table() argument
1139 if (!opp_table->enabled) in _disable_opp_table()
1147 if (!_get_opp_count(opp_table)) in _disable_opp_table()
1150 ret = _set_opp_bw(opp_table, NULL, dev); in _disable_opp_table()
1154 if (opp_table->regulators) in _disable_opp_table()
1155 regulator_disable(opp_table->regulators[0]); in _disable_opp_table()
1157 ret = _set_required_opps(dev, opp_table, NULL, false); in _disable_opp_table()
1159 opp_table->enabled = false; in _disable_opp_table()
1163 static int _set_opp(struct device *dev, struct opp_table *opp_table, in _set_opp() argument
1170 return _disable_opp_table(dev, opp_table); in _set_opp()
1173 if (unlikely(!opp_table->current_opp)) in _set_opp()
1174 _find_current_opp(dev, opp_table); in _set_opp()
1176 old_opp = opp_table->current_opp; in _set_opp()
1179 if (!forced && old_opp == opp && opp_table->enabled) { in _set_opp()
1189 scaling_down = _opp_compare_key(opp_table, old_opp, opp); in _set_opp()
1195 ret = _set_required_opps(dev, opp_table, opp, true); in _set_opp()
1201 ret = _set_opp_bw(opp_table, opp, dev); in _set_opp()
1207 if (opp_table->config_regulators) { in _set_opp()
1208 ret = opp_table->config_regulators(dev, old_opp, opp, in _set_opp()
1209 opp_table->regulators, in _set_opp()
1210 opp_table->regulator_count); in _set_opp()
1219 if (opp_table->config_clks) { in _set_opp()
1220 ret = opp_table->config_clks(dev, opp_table, opp, clk_data, scaling_down); in _set_opp()
1227 if (opp_table->config_regulators) { in _set_opp()
1228 ret = opp_table->config_regulators(dev, old_opp, opp, in _set_opp()
1229 opp_table->regulators, in _set_opp()
1230 opp_table->regulator_count); in _set_opp()
1238 ret = _set_opp_bw(opp_table, opp, dev); in _set_opp()
1244 ret = _set_required_opps(dev, opp_table, opp, false); in _set_opp()
1251 opp_table->enabled = true; in _set_opp()
1256 opp_table->current_opp = opp; in _set_opp()
1274 struct opp_table *opp_table; in dev_pm_opp_set_rate() local
1280 opp_table = _find_opp_table(dev); in dev_pm_opp_set_rate()
1281 if (IS_ERR(opp_table)) { in dev_pm_opp_set_rate()
1283 return PTR_ERR(opp_table); in dev_pm_opp_set_rate()
1294 if (!_get_opp_count(opp_table)) { in dev_pm_opp_set_rate()
1295 ret = opp_table->config_clks(dev, opp_table, NULL, in dev_pm_opp_set_rate()
1300 freq = clk_round_rate(opp_table->clk, target_freq); in dev_pm_opp_set_rate()
1310 opp = _find_freq_ceil(opp_table, &temp_freq); in dev_pm_opp_set_rate()
1325 forced = opp_table->rate_clk_single != target_freq; in dev_pm_opp_set_rate()
1328 ret = _set_opp(dev, opp_table, opp, &target_freq, forced); in dev_pm_opp_set_rate()
1334 dev_pm_opp_put_opp_table(opp_table); in dev_pm_opp_set_rate()
1351 struct opp_table *opp_table; in dev_pm_opp_set_opp() local
1354 opp_table = _find_opp_table(dev); in dev_pm_opp_set_opp()
1355 if (IS_ERR(opp_table)) { in dev_pm_opp_set_opp()
1357 return PTR_ERR(opp_table); in dev_pm_opp_set_opp()
1360 ret = _set_opp(dev, opp_table, opp, NULL, false); in dev_pm_opp_set_opp()
1361 dev_pm_opp_put_opp_table(opp_table); in dev_pm_opp_set_opp()
1369 struct opp_table *opp_table) in _remove_opp_dev() argument
1371 opp_debug_unregister(opp_dev, opp_table); in _remove_opp_dev()
1377 struct opp_table *opp_table) in _add_opp_dev() argument
1388 mutex_lock(&opp_table->lock); in _add_opp_dev()
1389 list_add(&opp_dev->node, &opp_table->dev_list); in _add_opp_dev()
1390 mutex_unlock(&opp_table->lock); in _add_opp_dev()
1393 opp_debug_register(opp_dev, opp_table); in _add_opp_dev()
1398 static struct opp_table *_allocate_opp_table(struct device *dev, int index) in _allocate_opp_table()
1400 struct opp_table *opp_table; in _allocate_opp_table() local
1408 opp_table = kzalloc(sizeof(*opp_table), GFP_KERNEL); in _allocate_opp_table()
1409 if (!opp_table) in _allocate_opp_table()
1412 mutex_init(&opp_table->lock); in _allocate_opp_table()
1413 mutex_init(&opp_table->genpd_virt_dev_lock); in _allocate_opp_table()
1414 INIT_LIST_HEAD(&opp_table->dev_list); in _allocate_opp_table()
1415 INIT_LIST_HEAD(&opp_table->lazy); in _allocate_opp_table()
1417 opp_table->clk = ERR_PTR(-ENODEV); in _allocate_opp_table()
1420 opp_table->regulator_count = -1; in _allocate_opp_table()
1422 opp_dev = _add_opp_dev(dev, opp_table); in _allocate_opp_table()
1428 _of_init_opp_table(opp_table, dev, index); in _allocate_opp_table()
1431 ret = dev_pm_opp_of_find_icc_paths(dev, opp_table); in _allocate_opp_table()
1440 BLOCKING_INIT_NOTIFIER_HEAD(&opp_table->head); in _allocate_opp_table()
1441 INIT_LIST_HEAD(&opp_table->opp_list); in _allocate_opp_table()
1442 kref_init(&opp_table->kref); in _allocate_opp_table()
1444 return opp_table; in _allocate_opp_table()
1447 _of_clear_opp_table(opp_table); in _allocate_opp_table()
1448 _remove_opp_dev(opp_dev, opp_table); in _allocate_opp_table()
1449 mutex_destroy(&opp_table->genpd_virt_dev_lock); in _allocate_opp_table()
1450 mutex_destroy(&opp_table->lock); in _allocate_opp_table()
1452 kfree(opp_table); in _allocate_opp_table()
1456 void _get_opp_table_kref(struct opp_table *opp_table) in _get_opp_table_kref() argument
1458 kref_get(&opp_table->kref); in _get_opp_table_kref()
1461 static struct opp_table *_update_opp_table_clk(struct device *dev, in _update_opp_table_clk()
1462 struct opp_table *opp_table, in _update_opp_table_clk() argument
1471 if (!getclk || IS_ERR(opp_table) || !IS_ERR(opp_table->clk) || in _update_opp_table_clk()
1472 opp_table->clks) in _update_opp_table_clk()
1473 return opp_table; in _update_opp_table_clk()
1476 opp_table->clk = clk_get(dev, NULL); in _update_opp_table_clk()
1478 ret = PTR_ERR_OR_ZERO(opp_table->clk); in _update_opp_table_clk()
1480 opp_table->config_clks = _opp_config_clk_single; in _update_opp_table_clk()
1481 opp_table->clk_count = 1; in _update_opp_table_clk()
1482 return opp_table; in _update_opp_table_clk()
1498 opp_table->clk_count = 1; in _update_opp_table_clk()
1501 return opp_table; in _update_opp_table_clk()
1504 dev_pm_opp_put_opp_table(opp_table); in _update_opp_table_clk()
1525 struct opp_table *_add_opp_table_indexed(struct device *dev, int index, in _add_opp_table_indexed()
1528 struct opp_table *opp_table; in _add_opp_table_indexed() local
1533 opp_table = _find_opp_table_unlocked(dev); in _add_opp_table_indexed()
1534 if (!IS_ERR(opp_table)) in _add_opp_table_indexed()
1548 opp_table = _managed_opp(dev, index); in _add_opp_table_indexed()
1553 if (opp_table) { in _add_opp_table_indexed()
1554 if (!_add_opp_dev(dev, opp_table)) { in _add_opp_table_indexed()
1555 dev_pm_opp_put_opp_table(opp_table); in _add_opp_table_indexed()
1556 opp_table = ERR_PTR(-ENOMEM); in _add_opp_table_indexed()
1561 opp_table = _allocate_opp_table(dev, index); in _add_opp_table_indexed()
1564 if (!IS_ERR(opp_table)) in _add_opp_table_indexed()
1565 list_add(&opp_table->node, &opp_tables); in _add_opp_table_indexed()
1573 return _update_opp_table_clk(dev, opp_table, getclk); in _add_opp_table_indexed()
1576 static struct opp_table *_add_opp_table(struct device *dev, bool getclk) in _add_opp_table()
1581 struct opp_table *dev_pm_opp_get_opp_table(struct device *dev) in dev_pm_opp_get_opp_table()
1589 struct opp_table *opp_table = container_of(kref, struct opp_table, kref); in _opp_table_kref_release() local
1594 list_del(&opp_table->node); in _opp_table_kref_release()
1597 if (opp_table->current_opp) in _opp_table_kref_release()
1598 dev_pm_opp_put(opp_table->current_opp); in _opp_table_kref_release()
1600 _of_clear_opp_table(opp_table); in _opp_table_kref_release()
1603 if (!IS_ERR(opp_table->clk)) in _opp_table_kref_release()
1604 clk_put(opp_table->clk); in _opp_table_kref_release()
1606 if (opp_table->paths) { in _opp_table_kref_release()
1607 for (i = 0; i < opp_table->path_count; i++) in _opp_table_kref_release()
1608 icc_put(opp_table->paths[i]); in _opp_table_kref_release()
1609 kfree(opp_table->paths); in _opp_table_kref_release()
1612 WARN_ON(!list_empty(&opp_table->opp_list)); in _opp_table_kref_release()
1614 list_for_each_entry_safe(opp_dev, temp, &opp_table->dev_list, node) in _opp_table_kref_release()
1615 _remove_opp_dev(opp_dev, opp_table); in _opp_table_kref_release()
1617 mutex_destroy(&opp_table->genpd_virt_dev_lock); in _opp_table_kref_release()
1618 mutex_destroy(&opp_table->lock); in _opp_table_kref_release()
1619 kfree(opp_table); in _opp_table_kref_release()
1622 void dev_pm_opp_put_opp_table(struct opp_table *opp_table) in dev_pm_opp_put_opp_table() argument
1624 kref_put_mutex(&opp_table->kref, _opp_table_kref_release, in dev_pm_opp_put_opp_table()
1637 struct opp_table *opp_table = opp->opp_table; in _opp_kref_release() local
1640 mutex_unlock(&opp_table->lock); in _opp_kref_release()
1646 blocking_notifier_call_chain(&opp_table->head, OPP_EVENT_REMOVE, opp); in _opp_kref_release()
1647 _of_clear_opp(opp_table, opp); in _opp_kref_release()
1659 kref_put_mutex(&opp->kref, _opp_kref_release, &opp->opp_table->lock); in dev_pm_opp_put()
1673 struct opp_table *opp_table; in dev_pm_opp_remove() local
1675 opp_table = _find_opp_table(dev); in dev_pm_opp_remove()
1676 if (IS_ERR(opp_table)) in dev_pm_opp_remove()
1679 if (!assert_single_clk(opp_table)) in dev_pm_opp_remove()
1682 mutex_lock(&opp_table->lock); in dev_pm_opp_remove()
1684 list_for_each_entry(iter, &opp_table->opp_list, node) { in dev_pm_opp_remove()
1691 mutex_unlock(&opp_table->lock); in dev_pm_opp_remove()
1697 dev_pm_opp_put_opp_table(opp_table); in dev_pm_opp_remove()
1705 dev_pm_opp_put_opp_table(opp_table); in dev_pm_opp_remove()
1709 static struct dev_pm_opp *_opp_get_next(struct opp_table *opp_table, in _opp_get_next() argument
1714 mutex_lock(&opp_table->lock); in _opp_get_next()
1715 list_for_each_entry(temp, &opp_table->opp_list, node) { in _opp_get_next()
1726 mutex_unlock(&opp_table->lock); in _opp_get_next()
1735 static void _opp_remove_all(struct opp_table *opp_table, bool dynamic) in _opp_remove_all() argument
1739 while ((opp = _opp_get_next(opp_table, dynamic))) { in _opp_remove_all()
1745 dev_pm_opp_put_opp_table(opp_table); in _opp_remove_all()
1749 bool _opp_remove_all_static(struct opp_table *opp_table) in _opp_remove_all_static() argument
1751 mutex_lock(&opp_table->lock); in _opp_remove_all_static()
1753 if (!opp_table->parsed_static_opps) { in _opp_remove_all_static()
1754 mutex_unlock(&opp_table->lock); in _opp_remove_all_static()
1758 if (--opp_table->parsed_static_opps) { in _opp_remove_all_static()
1759 mutex_unlock(&opp_table->lock); in _opp_remove_all_static()
1763 mutex_unlock(&opp_table->lock); in _opp_remove_all_static()
1765 _opp_remove_all(opp_table, false); in _opp_remove_all_static()
1777 struct opp_table *opp_table; in dev_pm_opp_remove_all_dynamic() local
1779 opp_table = _find_opp_table(dev); in dev_pm_opp_remove_all_dynamic()
1780 if (IS_ERR(opp_table)) in dev_pm_opp_remove_all_dynamic()
1783 _opp_remove_all(opp_table, true); in dev_pm_opp_remove_all_dynamic()
1786 dev_pm_opp_put_opp_table(opp_table); in dev_pm_opp_remove_all_dynamic()
1790 struct dev_pm_opp *_opp_allocate(struct opp_table *opp_table) in _opp_allocate() argument
1796 supply_count = opp_table->regulator_count > 0 ? in _opp_allocate()
1797 opp_table->regulator_count : 1; in _opp_allocate()
1799 clk_size = sizeof(*opp->rates) * opp_table->clk_count; in _opp_allocate()
1800 icc_size = sizeof(*opp->bandwidth) * opp_table->path_count; in _opp_allocate()
1813 opp->bandwidth = (struct dev_pm_opp_icc_bw *)(opp->rates + opp_table->clk_count); in _opp_allocate()
1821 struct opp_table *opp_table) in _opp_supported_by_regulators() argument
1826 if (!opp_table->regulators) in _opp_supported_by_regulators()
1829 for (i = 0; i < opp_table->regulator_count; i++) { in _opp_supported_by_regulators()
1830 reg = opp_table->regulators[i]; in _opp_supported_by_regulators()
1845 static int _opp_compare_rate(struct opp_table *opp_table, in _opp_compare_rate() argument
1850 for (i = 0; i < opp_table->clk_count; i++) { in _opp_compare_rate()
1859 static int _opp_compare_bw(struct opp_table *opp_table, struct dev_pm_opp *opp1, in _opp_compare_bw() argument
1864 for (i = 0; i < opp_table->path_count; i++) { in _opp_compare_bw()
1879 int _opp_compare_key(struct opp_table *opp_table, struct dev_pm_opp *opp1, in _opp_compare_key() argument
1884 ret = _opp_compare_rate(opp_table, opp1, opp2); in _opp_compare_key()
1888 ret = _opp_compare_bw(opp_table, opp1, opp2); in _opp_compare_key()
1900 struct opp_table *opp_table, in _opp_is_duplicate() argument
1914 list_for_each_entry(opp, &opp_table->opp_list, node) { in _opp_is_duplicate()
1915 opp_cmp = _opp_compare_key(opp_table, new_opp, opp); in _opp_is_duplicate()
1964 struct opp_table *opp_table) in _opp_add() argument
1969 mutex_lock(&opp_table->lock); in _opp_add()
1970 head = &opp_table->opp_list; in _opp_add()
1972 ret = _opp_is_duplicate(dev, new_opp, opp_table, &head); in _opp_add()
1974 mutex_unlock(&opp_table->lock); in _opp_add()
1979 mutex_unlock(&opp_table->lock); in _opp_add()
1981 new_opp->opp_table = opp_table; in _opp_add()
1984 opp_debug_create_one(new_opp, opp_table); in _opp_add()
1986 if (!_opp_supported_by_regulators(new_opp, opp_table)) { in _opp_add()
1993 if (lazy_linking_pending(opp_table)) in _opp_add()
1996 _required_opps_available(new_opp, opp_table->required_opp_count); in _opp_add()
2023 int _opp_add_v1(struct opp_table *opp_table, struct device *dev, in _opp_add_v1() argument
2030 if (!assert_single_clk(opp_table)) in _opp_add_v1()
2033 new_opp = _opp_allocate(opp_table); in _opp_add_v1()
2039 tol = u_volt * opp_table->voltage_tolerance_v1 / 100; in _opp_add_v1()
2046 ret = _opp_add(dev, new_opp, opp_table); in _opp_add_v1()
2058 blocking_notifier_call_chain(&opp_table->head, OPP_EVENT_ADD, new_opp); in _opp_add_v1()
2078 static int _opp_set_supported_hw(struct opp_table *opp_table, in _opp_set_supported_hw() argument
2082 if (opp_table->supported_hw) in _opp_set_supported_hw()
2085 opp_table->supported_hw = kmemdup(versions, count * sizeof(*versions), in _opp_set_supported_hw()
2087 if (!opp_table->supported_hw) in _opp_set_supported_hw()
2090 opp_table->supported_hw_count = count; in _opp_set_supported_hw()
2103 static void _opp_put_supported_hw(struct opp_table *opp_table) in _opp_put_supported_hw() argument
2105 if (opp_table->supported_hw) { in _opp_put_supported_hw()
2106 kfree(opp_table->supported_hw); in _opp_put_supported_hw()
2107 opp_table->supported_hw = NULL; in _opp_put_supported_hw()
2108 opp_table->supported_hw_count = 0; in _opp_put_supported_hw()
2122 static int _opp_set_prop_name(struct opp_table *opp_table, const char *name) in _opp_set_prop_name() argument
2125 if (!opp_table->prop_name) { in _opp_set_prop_name()
2126 opp_table->prop_name = kstrdup(name, GFP_KERNEL); in _opp_set_prop_name()
2127 if (!opp_table->prop_name) in _opp_set_prop_name()
2142 static void _opp_put_prop_name(struct opp_table *opp_table) in _opp_put_prop_name() argument
2144 if (opp_table->prop_name) { in _opp_put_prop_name()
2145 kfree(opp_table->prop_name); in _opp_put_prop_name()
2146 opp_table->prop_name = NULL; in _opp_put_prop_name()
2162 static int _opp_set_regulators(struct opp_table *opp_table, struct device *dev, in _opp_set_regulators() argument
2177 if (opp_table->regulators) in _opp_set_regulators()
2180 opp_table->regulators = kmalloc_array(count, in _opp_set_regulators()
2181 sizeof(*opp_table->regulators), in _opp_set_regulators()
2183 if (!opp_table->regulators) in _opp_set_regulators()
2195 opp_table->regulators[i] = reg; in _opp_set_regulators()
2198 opp_table->regulator_count = count; in _opp_set_regulators()
2202 opp_table->config_regulators = _opp_config_regulator_single; in _opp_set_regulators()
2208 regulator_put(opp_table->regulators[--i]); in _opp_set_regulators()
2210 kfree(opp_table->regulators); in _opp_set_regulators()
2211 opp_table->regulators = NULL; in _opp_set_regulators()
2212 opp_table->regulator_count = -1; in _opp_set_regulators()
2221 static void _opp_put_regulators(struct opp_table *opp_table) in _opp_put_regulators() argument
2225 if (!opp_table->regulators) in _opp_put_regulators()
2228 if (opp_table->enabled) { in _opp_put_regulators()
2229 for (i = opp_table->regulator_count - 1; i >= 0; i--) in _opp_put_regulators()
2230 regulator_disable(opp_table->regulators[i]); in _opp_put_regulators()
2233 for (i = opp_table->regulator_count - 1; i >= 0; i--) in _opp_put_regulators()
2234 regulator_put(opp_table->regulators[i]); in _opp_put_regulators()
2236 kfree(opp_table->regulators); in _opp_put_regulators()
2237 opp_table->regulators = NULL; in _opp_put_regulators()
2238 opp_table->regulator_count = -1; in _opp_put_regulators()
2241 static void _put_clks(struct opp_table *opp_table, int count) in _put_clks() argument
2246 clk_put(opp_table->clks[i]); in _put_clks()
2248 kfree(opp_table->clks); in _put_clks()
2249 opp_table->clks = NULL; in _put_clks()
2265 static int _opp_set_clknames(struct opp_table *opp_table, struct device *dev, in _opp_set_clknames() argument
2289 if (opp_table->clks) in _opp_set_clknames()
2292 opp_table->clks = kmalloc_array(count, sizeof(*opp_table->clks), in _opp_set_clknames()
2294 if (!opp_table->clks) in _opp_set_clknames()
2307 opp_table->clks[i] = clk; in _opp_set_clknames()
2310 opp_table->clk_count = count; in _opp_set_clknames()
2311 opp_table->config_clks = config_clks; in _opp_set_clknames()
2315 if (!opp_table->config_clks) in _opp_set_clknames()
2316 opp_table->config_clks = _opp_config_clk_single; in _opp_set_clknames()
2330 opp_table->clk = opp_table->clks[0]; in _opp_set_clknames()
2336 _put_clks(opp_table, i); in _opp_set_clknames()
2344 static void _opp_put_clknames(struct opp_table *opp_table) in _opp_put_clknames() argument
2346 if (!opp_table->clks) in _opp_put_clknames()
2349 opp_table->config_clks = NULL; in _opp_put_clknames()
2350 opp_table->clk = ERR_PTR(-ENODEV); in _opp_put_clknames()
2352 _put_clks(opp_table, opp_table->clk_count); in _opp_put_clknames()
2364 static int _opp_set_config_regulators_helper(struct opp_table *opp_table, in _opp_set_config_regulators_helper() argument
2368 if (!opp_table->config_regulators) in _opp_set_config_regulators_helper()
2369 opp_table->config_regulators = config_regulators; in _opp_set_config_regulators_helper()
2381 static void _opp_put_config_regulators_helper(struct opp_table *opp_table) in _opp_put_config_regulators_helper() argument
2383 if (opp_table->config_regulators) in _opp_put_config_regulators_helper()
2384 opp_table->config_regulators = NULL; in _opp_put_config_regulators_helper()
2387 static void _detach_genpd(struct opp_table *opp_table) in _detach_genpd() argument
2391 if (!opp_table->genpd_virt_devs) in _detach_genpd()
2394 for (index = 0; index < opp_table->required_opp_count; index++) { in _detach_genpd()
2395 if (!opp_table->genpd_virt_devs[index]) in _detach_genpd()
2398 dev_pm_domain_detach(opp_table->genpd_virt_devs[index], false); in _detach_genpd()
2399 opp_table->genpd_virt_devs[index] = NULL; in _detach_genpd()
2402 kfree(opp_table->genpd_virt_devs); in _detach_genpd()
2403 opp_table->genpd_virt_devs = NULL; in _detach_genpd()
2428 static int _opp_attach_genpd(struct opp_table *opp_table, struct device *dev, in _opp_attach_genpd() argument
2435 if (opp_table->genpd_virt_devs) in _opp_attach_genpd()
2443 if (!opp_table->required_opp_count) in _opp_attach_genpd()
2446 mutex_lock(&opp_table->genpd_virt_dev_lock); in _opp_attach_genpd()
2448 opp_table->genpd_virt_devs = kcalloc(opp_table->required_opp_count, in _opp_attach_genpd()
2449 sizeof(*opp_table->genpd_virt_devs), in _opp_attach_genpd()
2451 if (!opp_table->genpd_virt_devs) in _opp_attach_genpd()
2455 if (index >= opp_table->required_opp_count) { in _opp_attach_genpd()
2457 *name, opp_table->required_opp_count, index); in _opp_attach_genpd()
2468 opp_table->genpd_virt_devs[index] = virt_dev; in _opp_attach_genpd()
2474 *virt_devs = opp_table->genpd_virt_devs; in _opp_attach_genpd()
2475 mutex_unlock(&opp_table->genpd_virt_dev_lock); in _opp_attach_genpd()
2480 _detach_genpd(opp_table); in _opp_attach_genpd()
2482 mutex_unlock(&opp_table->genpd_virt_dev_lock); in _opp_attach_genpd()
2494 static void _opp_detach_genpd(struct opp_table *opp_table) in _opp_detach_genpd() argument
2500 mutex_lock(&opp_table->genpd_virt_dev_lock); in _opp_detach_genpd()
2501 _detach_genpd(opp_table); in _opp_detach_genpd()
2502 mutex_unlock(&opp_table->genpd_virt_dev_lock); in _opp_detach_genpd()
2508 _opp_detach_genpd(data->opp_table); in _opp_clear_config()
2510 _opp_put_regulators(data->opp_table); in _opp_clear_config()
2512 _opp_put_supported_hw(data->opp_table); in _opp_clear_config()
2514 _opp_put_config_regulators_helper(data->opp_table); in _opp_clear_config()
2516 _opp_put_prop_name(data->opp_table); in _opp_clear_config()
2518 _opp_put_clknames(data->opp_table); in _opp_clear_config()
2520 dev_pm_opp_put_opp_table(data->opp_table); in _opp_clear_config()
2543 struct opp_table *opp_table; in dev_pm_opp_set_config() local
2552 opp_table = _add_opp_table(dev, false); in dev_pm_opp_set_config()
2553 if (IS_ERR(opp_table)) { in dev_pm_opp_set_config()
2555 return PTR_ERR(opp_table); in dev_pm_opp_set_config()
2558 data->opp_table = opp_table; in dev_pm_opp_set_config()
2562 if (WARN_ON(!list_empty(&opp_table->opp_list))) { in dev_pm_opp_set_config()
2569 ret = _opp_set_clknames(opp_table, dev, config->clk_names, in dev_pm_opp_set_config()
2583 ret = _opp_set_prop_name(opp_table, config->prop_name); in dev_pm_opp_set_config()
2592 ret = _opp_set_config_regulators_helper(opp_table, dev, in dev_pm_opp_set_config()
2602 ret = _opp_set_supported_hw(opp_table, config->supported_hw, in dev_pm_opp_set_config()
2612 ret = _opp_set_regulators(opp_table, dev, in dev_pm_opp_set_config()
2622 ret = _opp_attach_genpd(opp_table, dev, config->genpd_names, in dev_pm_opp_set_config()
2716 struct dev_pm_opp *dev_pm_opp_xlate_required_opp(struct opp_table *src_table, in dev_pm_opp_xlate_required_opp()
2717 struct opp_table *dst_table, in dev_pm_opp_xlate_required_opp()
2770 int dev_pm_opp_xlate_performance_state(struct opp_table *src_table, in dev_pm_opp_xlate_performance_state()
2771 struct opp_table *dst_table, in dev_pm_opp_xlate_performance_state()
2846 struct opp_table *opp_table; in dev_pm_opp_add() local
2849 opp_table = _add_opp_table(dev, true); in dev_pm_opp_add()
2850 if (IS_ERR(opp_table)) in dev_pm_opp_add()
2851 return PTR_ERR(opp_table); in dev_pm_opp_add()
2854 opp_table->regulator_count = 1; in dev_pm_opp_add()
2856 ret = _opp_add_v1(opp_table, dev, freq, u_volt, true); in dev_pm_opp_add()
2858 dev_pm_opp_put_opp_table(opp_table); in dev_pm_opp_add()
2880 struct opp_table *opp_table; in _opp_set_availability() local
2885 opp_table = _find_opp_table(dev); in _opp_set_availability()
2886 if (IS_ERR(opp_table)) { in _opp_set_availability()
2887 r = PTR_ERR(opp_table); in _opp_set_availability()
2892 if (!assert_single_clk(opp_table)) { in _opp_set_availability()
2897 mutex_lock(&opp_table->lock); in _opp_set_availability()
2900 list_for_each_entry(tmp_opp, &opp_table->opp_list, node) { in _opp_set_availability()
2919 mutex_unlock(&opp_table->lock); in _opp_set_availability()
2923 blocking_notifier_call_chain(&opp_table->head, OPP_EVENT_ENABLE, in _opp_set_availability()
2926 blocking_notifier_call_chain(&opp_table->head, in _opp_set_availability()
2933 mutex_unlock(&opp_table->lock); in _opp_set_availability()
2935 dev_pm_opp_put_opp_table(opp_table); in _opp_set_availability()
2956 struct opp_table *opp_table; in dev_pm_opp_adjust_voltage() local
2961 opp_table = _find_opp_table(dev); in dev_pm_opp_adjust_voltage()
2962 if (IS_ERR(opp_table)) { in dev_pm_opp_adjust_voltage()
2963 r = PTR_ERR(opp_table); in dev_pm_opp_adjust_voltage()
2968 if (!assert_single_clk(opp_table)) { in dev_pm_opp_adjust_voltage()
2973 mutex_lock(&opp_table->lock); in dev_pm_opp_adjust_voltage()
2976 list_for_each_entry(tmp_opp, &opp_table->opp_list, node) { in dev_pm_opp_adjust_voltage()
2997 mutex_unlock(&opp_table->lock); in dev_pm_opp_adjust_voltage()
3000 blocking_notifier_call_chain(&opp_table->head, OPP_EVENT_ADJUST_VOLTAGE, in dev_pm_opp_adjust_voltage()
3007 mutex_unlock(&opp_table->lock); in dev_pm_opp_adjust_voltage()
3009 dev_pm_opp_put_opp_table(opp_table); in dev_pm_opp_adjust_voltage()
3062 struct opp_table *opp_table; in dev_pm_opp_register_notifier() local
3065 opp_table = _find_opp_table(dev); in dev_pm_opp_register_notifier()
3066 if (IS_ERR(opp_table)) in dev_pm_opp_register_notifier()
3067 return PTR_ERR(opp_table); in dev_pm_opp_register_notifier()
3069 ret = blocking_notifier_chain_register(&opp_table->head, nb); in dev_pm_opp_register_notifier()
3071 dev_pm_opp_put_opp_table(opp_table); in dev_pm_opp_register_notifier()
3087 struct opp_table *opp_table; in dev_pm_opp_unregister_notifier() local
3090 opp_table = _find_opp_table(dev); in dev_pm_opp_unregister_notifier()
3091 if (IS_ERR(opp_table)) in dev_pm_opp_unregister_notifier()
3092 return PTR_ERR(opp_table); in dev_pm_opp_unregister_notifier()
3094 ret = blocking_notifier_chain_unregister(&opp_table->head, nb); in dev_pm_opp_unregister_notifier()
3096 dev_pm_opp_put_opp_table(opp_table); in dev_pm_opp_unregister_notifier()
3111 struct opp_table *opp_table; in dev_pm_opp_remove_table() local
3114 opp_table = _find_opp_table(dev); in dev_pm_opp_remove_table()
3115 if (IS_ERR(opp_table)) { in dev_pm_opp_remove_table()
3116 int error = PTR_ERR(opp_table); in dev_pm_opp_remove_table()
3130 if (_opp_remove_all_static(opp_table)) in dev_pm_opp_remove_table()
3131 dev_pm_opp_put_opp_table(opp_table); in dev_pm_opp_remove_table()
3134 dev_pm_opp_put_opp_table(opp_table); in dev_pm_opp_remove_table()
3148 struct opp_table *opp_table; in dev_pm_opp_sync_regulators() local
3153 opp_table = _find_opp_table(dev); in dev_pm_opp_sync_regulators()
3154 if (IS_ERR(opp_table)) in dev_pm_opp_sync_regulators()
3158 if (unlikely(!opp_table->regulators)) in dev_pm_opp_sync_regulators()
3162 if (!opp_table->enabled) in dev_pm_opp_sync_regulators()
3165 for (i = 0; i < opp_table->regulator_count; i++) { in dev_pm_opp_sync_regulators()
3166 reg = opp_table->regulators[i]; in dev_pm_opp_sync_regulators()
3173 dev_pm_opp_put_opp_table(opp_table); in dev_pm_opp_sync_regulators()