3200 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2/*3 * Generic OPP Interface4 *5 * Copyright (C) 2009-2010 Texas Instruments Incorporated.6 * Nishanth Menon7 * Romit Dasgupta8 * Kevin Hilman9 */10 11#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt12 13#include <linux/clk.h>14#include <linux/errno.h>15#include <linux/err.h>16#include <linux/device.h>17#include <linux/export.h>18#include <linux/pm_domain.h>19#include <linux/regulator/consumer.h>20#include <linux/slab.h>21#include <linux/xarray.h>22 23#include "opp.h"24 25/*26 * The root of the list of all opp-tables. All opp_table structures branch off27 * from here, with each opp_table containing the list of opps it supports in28 * various states of availability.29 */30LIST_HEAD(opp_tables);31 32/* Lock to allow exclusive modification to the device and opp lists */33DEFINE_MUTEX(opp_table_lock);34/* Flag indicating that opp_tables list is being updated at the moment */35static bool opp_tables_busy;36 37/* OPP ID allocator */38static DEFINE_XARRAY_ALLOC1(opp_configs);39 40static bool _find_opp_dev(const struct device *dev, struct opp_table *opp_table)41{42 struct opp_device *opp_dev;43 bool found = false;44 45 mutex_lock(&opp_table->lock);46 list_for_each_entry(opp_dev, &opp_table->dev_list, node)47 if (opp_dev->dev == dev) {48 found = true;49 break;50 }51 52 mutex_unlock(&opp_table->lock);53 return found;54}55 56static struct opp_table *_find_opp_table_unlocked(struct device *dev)57{58 struct opp_table *opp_table;59 60 list_for_each_entry(opp_table, &opp_tables, node) {61 if (_find_opp_dev(dev, opp_table)) {62 _get_opp_table_kref(opp_table);63 return opp_table;64 }65 }66 67 return ERR_PTR(-ENODEV);68}69 70/**71 * _find_opp_table() - find opp_table struct using device pointer72 * @dev: device pointer used to lookup OPP table73 *74 * Search OPP table for one containing matching device.75 *76 * Return: pointer to 'struct opp_table' if found, otherwise -ENODEV or77 * -EINVAL based on type of error.78 *79 * The callers must call dev_pm_opp_put_opp_table() after the table is used.80 */81struct opp_table *_find_opp_table(struct device *dev)82{83 struct opp_table *opp_table;84 85 if (IS_ERR_OR_NULL(dev)) {86 pr_err("%s: Invalid parameters\n", __func__);87 return ERR_PTR(-EINVAL);88 }89 90 mutex_lock(&opp_table_lock);91 opp_table = _find_opp_table_unlocked(dev);92 mutex_unlock(&opp_table_lock);93 94 return opp_table;95}96 97/*98 * Returns true if multiple clocks aren't there, else returns false with WARN.99 *100 * We don't force clk_count == 1 here as there are users who don't have a clock101 * representation in the OPP table and manage the clock configuration themselves102 * in an platform specific way.103 */104static bool assert_single_clk(struct opp_table *opp_table)105{106 return !WARN_ON(opp_table->clk_count > 1);107}108 109/**110 * dev_pm_opp_get_voltage() - Gets the voltage corresponding to an opp111 * @opp: opp for which voltage has to be returned for112 *113 * Return: voltage in micro volt corresponding to the opp, else114 * return 0115 *116 * This is useful only for devices with single power supply.117 */118unsigned long dev_pm_opp_get_voltage(struct dev_pm_opp *opp)119{120 if (IS_ERR_OR_NULL(opp)) {121 pr_err("%s: Invalid parameters\n", __func__);122 return 0;123 }124 125 return opp->supplies[0].u_volt;126}127EXPORT_SYMBOL_GPL(dev_pm_opp_get_voltage);128 129/**130 * dev_pm_opp_get_supplies() - Gets the supply information corresponding to an opp131 * @opp: opp for which voltage has to be returned for132 * @supplies: Placeholder for copying the supply information.133 *134 * Return: negative error number on failure, 0 otherwise on success after135 * setting @supplies.136 *137 * This can be used for devices with any number of power supplies. The caller138 * must ensure the @supplies array must contain space for each regulator.139 */140int dev_pm_opp_get_supplies(struct dev_pm_opp *opp,141 struct dev_pm_opp_supply *supplies)142{143 if (IS_ERR_OR_NULL(opp) || !supplies) {144 pr_err("%s: Invalid parameters\n", __func__);145 return -EINVAL;146 }147 148 memcpy(supplies, opp->supplies,149 sizeof(*supplies) * opp->opp_table->regulator_count);150 return 0;151}152EXPORT_SYMBOL_GPL(dev_pm_opp_get_supplies);153 154/**155 * dev_pm_opp_get_power() - Gets the power corresponding to an opp156 * @opp: opp for which power has to be returned for157 *158 * Return: power in micro watt corresponding to the opp, else159 * return 0160 *161 * This is useful only for devices with single power supply.162 */163unsigned long dev_pm_opp_get_power(struct dev_pm_opp *opp)164{165 unsigned long opp_power = 0;166 int i;167 168 if (IS_ERR_OR_NULL(opp)) {169 pr_err("%s: Invalid parameters\n", __func__);170 return 0;171 }172 for (i = 0; i < opp->opp_table->regulator_count; i++)173 opp_power += opp->supplies[i].u_watt;174 175 return opp_power;176}177EXPORT_SYMBOL_GPL(dev_pm_opp_get_power);178 179/**180 * dev_pm_opp_get_freq_indexed() - Gets the frequency corresponding to an181 * available opp with specified index182 * @opp: opp for which frequency has to be returned for183 * @index: index of the frequency within the required opp184 *185 * Return: frequency in hertz corresponding to the opp with specified index,186 * else return 0187 */188unsigned long dev_pm_opp_get_freq_indexed(struct dev_pm_opp *opp, u32 index)189{190 if (IS_ERR_OR_NULL(opp) || index >= opp->opp_table->clk_count) {191 pr_err("%s: Invalid parameters\n", __func__);192 return 0;193 }194 195 return opp->rates[index];196}197EXPORT_SYMBOL_GPL(dev_pm_opp_get_freq_indexed);198 199/**200 * dev_pm_opp_get_level() - Gets the level corresponding to an available opp201 * @opp: opp for which level value has to be returned for202 *203 * Return: level read from device tree corresponding to the opp, else204 * return U32_MAX.205 */206unsigned int dev_pm_opp_get_level(struct dev_pm_opp *opp)207{208 if (IS_ERR_OR_NULL(opp) || !opp->available) {209 pr_err("%s: Invalid parameters\n", __func__);210 return 0;211 }212 213 return opp->level;214}215EXPORT_SYMBOL_GPL(dev_pm_opp_get_level);216 217/**218 * dev_pm_opp_get_required_pstate() - Gets the required performance state219 * corresponding to an available opp220 * @opp: opp for which performance state has to be returned for221 * @index: index of the required opp222 *223 * Return: performance state read from device tree corresponding to the224 * required opp, else return U32_MAX.225 */226unsigned int dev_pm_opp_get_required_pstate(struct dev_pm_opp *opp,227 unsigned int index)228{229 if (IS_ERR_OR_NULL(opp) || !opp->available ||230 index >= opp->opp_table->required_opp_count) {231 pr_err("%s: Invalid parameters\n", __func__);232 return 0;233 }234 235 /* required-opps not fully initialized yet */236 if (lazy_linking_pending(opp->opp_table))237 return 0;238 239 /* The required OPP table must belong to a genpd */240 if (unlikely(!opp->opp_table->required_opp_tables[index]->is_genpd)) {241 pr_err("%s: Performance state is only valid for genpds.\n", __func__);242 return 0;243 }244 245 return opp->required_opps[index]->level;246}247EXPORT_SYMBOL_GPL(dev_pm_opp_get_required_pstate);248 249/**250 * dev_pm_opp_is_turbo() - Returns if opp is turbo OPP or not251 * @opp: opp for which turbo mode is being verified252 *253 * Turbo OPPs are not for normal use, and can be enabled (under certain254 * conditions) for short duration of times to finish high throughput work255 * quickly. Running on them for longer times may overheat the chip.256 *257 * Return: true if opp is turbo opp, else false.258 */259bool dev_pm_opp_is_turbo(struct dev_pm_opp *opp)260{261 if (IS_ERR_OR_NULL(opp) || !opp->available) {262 pr_err("%s: Invalid parameters\n", __func__);263 return false;264 }265 266 return opp->turbo;267}268EXPORT_SYMBOL_GPL(dev_pm_opp_is_turbo);269 270/**271 * dev_pm_opp_get_max_clock_latency() - Get max clock latency in nanoseconds272 * @dev: device for which we do this operation273 *274 * Return: This function returns the max clock latency in nanoseconds.275 */276unsigned long dev_pm_opp_get_max_clock_latency(struct device *dev)277{278 struct opp_table *opp_table;279 unsigned long clock_latency_ns;280 281 opp_table = _find_opp_table(dev);282 if (IS_ERR(opp_table))283 return 0;284 285 clock_latency_ns = opp_table->clock_latency_ns_max;286 287 dev_pm_opp_put_opp_table(opp_table);288 289 return clock_latency_ns;290}291EXPORT_SYMBOL_GPL(dev_pm_opp_get_max_clock_latency);292 293/**294 * dev_pm_opp_get_max_volt_latency() - Get max voltage latency in nanoseconds295 * @dev: device for which we do this operation296 *297 * Return: This function returns the max voltage latency in nanoseconds.298 */299unsigned long dev_pm_opp_get_max_volt_latency(struct device *dev)300{301 struct opp_table *opp_table;302 struct dev_pm_opp *opp;303 struct regulator *reg;304 unsigned long latency_ns = 0;305 int ret, i, count;306 struct {307 unsigned long min;308 unsigned long max;309 } *uV;310 311 opp_table = _find_opp_table(dev);312 if (IS_ERR(opp_table))313 return 0;314 315 /* Regulator may not be required for the device */316 if (!opp_table->regulators)317 goto put_opp_table;318 319 count = opp_table->regulator_count;320 321 uV = kmalloc_array(count, sizeof(*uV), GFP_KERNEL);322 if (!uV)323 goto put_opp_table;324 325 mutex_lock(&opp_table->lock);326 327 for (i = 0; i < count; i++) {328 uV[i].min = ~0;329 uV[i].max = 0;330 331 list_for_each_entry(opp, &opp_table->opp_list, node) {332 if (!opp->available)333 continue;334 335 if (opp->supplies[i].u_volt_min < uV[i].min)336 uV[i].min = opp->supplies[i].u_volt_min;337 if (opp->supplies[i].u_volt_max > uV[i].max)338 uV[i].max = opp->supplies[i].u_volt_max;339 }340 }341 342 mutex_unlock(&opp_table->lock);343 344 /*345 * The caller needs to ensure that opp_table (and hence the regulator)346 * isn't freed, while we are executing this routine.347 */348 for (i = 0; i < count; i++) {349 reg = opp_table->regulators[i];350 ret = regulator_set_voltage_time(reg, uV[i].min, uV[i].max);351 if (ret > 0)352 latency_ns += ret * 1000;353 }354 355 kfree(uV);356put_opp_table:357 dev_pm_opp_put_opp_table(opp_table);358 359 return latency_ns;360}361EXPORT_SYMBOL_GPL(dev_pm_opp_get_max_volt_latency);362 363/**364 * dev_pm_opp_get_max_transition_latency() - Get max transition latency in365 * nanoseconds366 * @dev: device for which we do this operation367 *368 * Return: This function returns the max transition latency, in nanoseconds, to369 * switch from one OPP to other.370 */371unsigned long dev_pm_opp_get_max_transition_latency(struct device *dev)372{373 return dev_pm_opp_get_max_volt_latency(dev) +374 dev_pm_opp_get_max_clock_latency(dev);375}376EXPORT_SYMBOL_GPL(dev_pm_opp_get_max_transition_latency);377 378/**379 * dev_pm_opp_get_suspend_opp_freq() - Get frequency of suspend opp in Hz380 * @dev: device for which we do this operation381 *382 * Return: This function returns the frequency of the OPP marked as suspend_opp383 * if one is available, else returns 0;384 */385unsigned long dev_pm_opp_get_suspend_opp_freq(struct device *dev)386{387 struct opp_table *opp_table;388 unsigned long freq = 0;389 390 opp_table = _find_opp_table(dev);391 if (IS_ERR(opp_table))392 return 0;393 394 if (opp_table->suspend_opp && opp_table->suspend_opp->available)395 freq = dev_pm_opp_get_freq(opp_table->suspend_opp);396 397 dev_pm_opp_put_opp_table(opp_table);398 399 return freq;400}401EXPORT_SYMBOL_GPL(dev_pm_opp_get_suspend_opp_freq);402 403int _get_opp_count(struct opp_table *opp_table)404{405 struct dev_pm_opp *opp;406 int count = 0;407 408 mutex_lock(&opp_table->lock);409 410 list_for_each_entry(opp, &opp_table->opp_list, node) {411 if (opp->available)412 count++;413 }414 415 mutex_unlock(&opp_table->lock);416 417 return count;418}419 420/**421 * dev_pm_opp_get_opp_count() - Get number of opps available in the opp table422 * @dev: device for which we do this operation423 *424 * Return: This function returns the number of available opps if there are any,425 * else returns 0 if none or the corresponding error value.426 */427int dev_pm_opp_get_opp_count(struct device *dev)428{429 struct opp_table *opp_table;430 int count;431 432 opp_table = _find_opp_table(dev);433 if (IS_ERR(opp_table)) {434 count = PTR_ERR(opp_table);435 dev_dbg(dev, "%s: OPP table not found (%d)\n",436 __func__, count);437 return count;438 }439 440 count = _get_opp_count(opp_table);441 dev_pm_opp_put_opp_table(opp_table);442 443 return count;444}445EXPORT_SYMBOL_GPL(dev_pm_opp_get_opp_count);446 447/* Helpers to read keys */448static unsigned long _read_freq(struct dev_pm_opp *opp, int index)449{450 return opp->rates[index];451}452 453static unsigned long _read_level(struct dev_pm_opp *opp, int index)454{455 return opp->level;456}457 458static unsigned long _read_bw(struct dev_pm_opp *opp, int index)459{460 return opp->bandwidth[index].peak;461}462 463/* Generic comparison helpers */464static bool _compare_exact(struct dev_pm_opp **opp, struct dev_pm_opp *temp_opp,465 unsigned long opp_key, unsigned long key)466{467 if (opp_key == key) {468 *opp = temp_opp;469 return true;470 }471 472 return false;473}474 475static bool _compare_ceil(struct dev_pm_opp **opp, struct dev_pm_opp *temp_opp,476 unsigned long opp_key, unsigned long key)477{478 if (opp_key >= key) {479 *opp = temp_opp;480 return true;481 }482 483 return false;484}485 486static bool _compare_floor(struct dev_pm_opp **opp, struct dev_pm_opp *temp_opp,487 unsigned long opp_key, unsigned long key)488{489 if (opp_key > key)490 return true;491 492 *opp = temp_opp;493 return false;494}495 496/* Generic key finding helpers */497static struct dev_pm_opp *_opp_table_find_key(struct opp_table *opp_table,498 unsigned long *key, int index, bool available,499 unsigned long (*read)(struct dev_pm_opp *opp, int index),500 bool (*compare)(struct dev_pm_opp **opp, struct dev_pm_opp *temp_opp,501 unsigned long opp_key, unsigned long key),502 bool (*assert)(struct opp_table *opp_table))503{504 struct dev_pm_opp *temp_opp, *opp = ERR_PTR(-ERANGE);505 506 /* Assert that the requirement is met */507 if (assert && !assert(opp_table))508 return ERR_PTR(-EINVAL);509 510 mutex_lock(&opp_table->lock);511 512 list_for_each_entry(temp_opp, &opp_table->opp_list, node) {513 if (temp_opp->available == available) {514 if (compare(&opp, temp_opp, read(temp_opp, index), *key))515 break;516 }517 }518 519 /* Increment the reference count of OPP */520 if (!IS_ERR(opp)) {521 *key = read(opp, index);522 dev_pm_opp_get(opp);523 }524 525 mutex_unlock(&opp_table->lock);526 527 return opp;528}529 530static struct dev_pm_opp *531_find_key(struct device *dev, unsigned long *key, int index, bool available,532 unsigned long (*read)(struct dev_pm_opp *opp, int index),533 bool (*compare)(struct dev_pm_opp **opp, struct dev_pm_opp *temp_opp,534 unsigned long opp_key, unsigned long key),535 bool (*assert)(struct opp_table *opp_table))536{537 struct opp_table *opp_table;538 struct dev_pm_opp *opp;539 540 opp_table = _find_opp_table(dev);541 if (IS_ERR(opp_table)) {542 dev_err(dev, "%s: OPP table not found (%ld)\n", __func__,543 PTR_ERR(opp_table));544 return ERR_CAST(opp_table);545 }546 547 opp = _opp_table_find_key(opp_table, key, index, available, read,548 compare, assert);549 550 dev_pm_opp_put_opp_table(opp_table);551 552 return opp;553}554 555static struct dev_pm_opp *_find_key_exact(struct device *dev,556 unsigned long key, int index, bool available,557 unsigned long (*read)(struct dev_pm_opp *opp, int index),558 bool (*assert)(struct opp_table *opp_table))559{560 /*561 * The value of key will be updated here, but will be ignored as the562 * caller doesn't need it.563 */564 return _find_key(dev, &key, index, available, read, _compare_exact,565 assert);566}567 568static struct dev_pm_opp *_opp_table_find_key_ceil(struct opp_table *opp_table,569 unsigned long *key, int index, bool available,570 unsigned long (*read)(struct dev_pm_opp *opp, int index),571 bool (*assert)(struct opp_table *opp_table))572{573 return _opp_table_find_key(opp_table, key, index, available, read,574 _compare_ceil, assert);575}576 577static struct dev_pm_opp *_find_key_ceil(struct device *dev, unsigned long *key,578 int index, bool available,579 unsigned long (*read)(struct dev_pm_opp *opp, int index),580 bool (*assert)(struct opp_table *opp_table))581{582 return _find_key(dev, key, index, available, read, _compare_ceil,583 assert);584}585 586static struct dev_pm_opp *_find_key_floor(struct device *dev,587 unsigned long *key, int index, bool available,588 unsigned long (*read)(struct dev_pm_opp *opp, int index),589 bool (*assert)(struct opp_table *opp_table))590{591 return _find_key(dev, key, index, available, read, _compare_floor,592 assert);593}594 595/**596 * dev_pm_opp_find_freq_exact() - search for an exact frequency597 * @dev: device for which we do this operation598 * @freq: frequency to search for599 * @available: true/false - match for available opp600 *601 * Return: Searches for exact match in the opp table and returns pointer to the602 * matching opp if found, else returns ERR_PTR in case of error and should603 * be handled using IS_ERR. Error return values can be:604 * EINVAL: for bad pointer605 * ERANGE: no match found for search606 * ENODEV: if device not found in list of registered devices607 *608 * Note: available is a modifier for the search. if available=true, then the609 * match is for exact matching frequency and is available in the stored OPP610 * table. if false, the match is for exact frequency which is not available.611 *612 * This provides a mechanism to enable an opp which is not available currently613 * or the opposite as well.614 *615 * The callers are required to call dev_pm_opp_put() for the returned OPP after616 * use.617 */618struct dev_pm_opp *dev_pm_opp_find_freq_exact(struct device *dev,619 unsigned long freq, bool available)620{621 return _find_key_exact(dev, freq, 0, available, _read_freq,622 assert_single_clk);623}624EXPORT_SYMBOL_GPL(dev_pm_opp_find_freq_exact);625 626/**627 * dev_pm_opp_find_freq_exact_indexed() - Search for an exact freq for the628 * clock corresponding to the index629 * @dev: Device for which we do this operation630 * @freq: frequency to search for631 * @index: Clock index632 * @available: true/false - match for available opp633 *634 * Search for the matching exact OPP for the clock corresponding to the635 * specified index from a starting freq for a device.636 *637 * Return: matching *opp , else returns ERR_PTR in case of error and should be638 * handled using IS_ERR. Error return values can be:639 * EINVAL: for bad pointer640 * ERANGE: no match found for search641 * ENODEV: if device not found in list of registered devices642 *643 * The callers are required to call dev_pm_opp_put() for the returned OPP after644 * use.645 */646struct dev_pm_opp *647dev_pm_opp_find_freq_exact_indexed(struct device *dev, unsigned long freq,648 u32 index, bool available)649{650 return _find_key_exact(dev, freq, index, available, _read_freq, NULL);651}652EXPORT_SYMBOL_GPL(dev_pm_opp_find_freq_exact_indexed);653 654static noinline struct dev_pm_opp *_find_freq_ceil(struct opp_table *opp_table,655 unsigned long *freq)656{657 return _opp_table_find_key_ceil(opp_table, freq, 0, true, _read_freq,658 assert_single_clk);659}660 661/**662 * dev_pm_opp_find_freq_ceil() - Search for an rounded ceil freq663 * @dev: device for which we do this operation664 * @freq: Start frequency665 *666 * Search for the matching ceil *available* OPP from a starting freq667 * for a device.668 *669 * Return: matching *opp and refreshes *freq accordingly, else returns670 * ERR_PTR in case of error and should be handled using IS_ERR. Error return671 * values can be:672 * EINVAL: for bad pointer673 * ERANGE: no match found for search674 * ENODEV: if device not found in list of registered devices675 *676 * The callers are required to call dev_pm_opp_put() for the returned OPP after677 * use.678 */679struct dev_pm_opp *dev_pm_opp_find_freq_ceil(struct device *dev,680 unsigned long *freq)681{682 return _find_key_ceil(dev, freq, 0, true, _read_freq, assert_single_clk);683}684EXPORT_SYMBOL_GPL(dev_pm_opp_find_freq_ceil);685 686/**687 * dev_pm_opp_find_freq_ceil_indexed() - Search for a rounded ceil freq for the688 * clock corresponding to the index689 * @dev: Device for which we do this operation690 * @freq: Start frequency691 * @index: Clock index692 *693 * Search for the matching ceil *available* OPP for the clock corresponding to694 * the specified index from a starting freq for a device.695 *696 * Return: matching *opp and refreshes *freq accordingly, else returns697 * ERR_PTR in case of error and should be handled using IS_ERR. Error return698 * values can be:699 * EINVAL: for bad pointer700 * ERANGE: no match found for search701 * ENODEV: if device not found in list of registered devices702 *703 * The callers are required to call dev_pm_opp_put() for the returned OPP after704 * use.705 */706struct dev_pm_opp *707dev_pm_opp_find_freq_ceil_indexed(struct device *dev, unsigned long *freq,708 u32 index)709{710 return _find_key_ceil(dev, freq, index, true, _read_freq, NULL);711}712EXPORT_SYMBOL_GPL(dev_pm_opp_find_freq_ceil_indexed);713 714/**715 * dev_pm_opp_find_freq_floor() - Search for a rounded floor freq716 * @dev: device for which we do this operation717 * @freq: Start frequency718 *719 * Search for the matching floor *available* OPP from a starting freq720 * for a device.721 *722 * Return: matching *opp and refreshes *freq accordingly, else returns723 * ERR_PTR in case of error and should be handled using IS_ERR. Error return724 * values can be:725 * EINVAL: for bad pointer726 * ERANGE: no match found for search727 * ENODEV: if device not found in list of registered devices728 *729 * The callers are required to call dev_pm_opp_put() for the returned OPP after730 * use.731 */732struct dev_pm_opp *dev_pm_opp_find_freq_floor(struct device *dev,733 unsigned long *freq)734{735 return _find_key_floor(dev, freq, 0, true, _read_freq, assert_single_clk);736}737EXPORT_SYMBOL_GPL(dev_pm_opp_find_freq_floor);738 739/**740 * dev_pm_opp_find_freq_floor_indexed() - Search for a rounded floor freq for the741 * clock corresponding to the index742 * @dev: Device for which we do this operation743 * @freq: Start frequency744 * @index: Clock index745 *746 * Search for the matching floor *available* OPP for the clock corresponding to747 * the specified index from a starting freq for a device.748 *749 * Return: matching *opp and refreshes *freq accordingly, else returns750 * ERR_PTR in case of error and should be handled using IS_ERR. Error return751 * values can be:752 * EINVAL: for bad pointer753 * ERANGE: no match found for search754 * ENODEV: if device not found in list of registered devices755 *756 * The callers are required to call dev_pm_opp_put() for the returned OPP after757 * use.758 */759struct dev_pm_opp *760dev_pm_opp_find_freq_floor_indexed(struct device *dev, unsigned long *freq,761 u32 index)762{763 return _find_key_floor(dev, freq, index, true, _read_freq, NULL);764}765EXPORT_SYMBOL_GPL(dev_pm_opp_find_freq_floor_indexed);766 767/**768 * dev_pm_opp_find_level_exact() - search for an exact level769 * @dev: device for which we do this operation770 * @level: level to search for771 *772 * Return: Searches for exact match in the opp table and returns pointer to the773 * matching opp if found, else returns ERR_PTR in case of error and should774 * be handled using IS_ERR. Error return values can be:775 * EINVAL: for bad pointer776 * ERANGE: no match found for search777 * ENODEV: if device not found in list of registered devices778 *779 * The callers are required to call dev_pm_opp_put() for the returned OPP after780 * use.781 */782struct dev_pm_opp *dev_pm_opp_find_level_exact(struct device *dev,783 unsigned int level)784{785 return _find_key_exact(dev, level, 0, true, _read_level, NULL);786}787EXPORT_SYMBOL_GPL(dev_pm_opp_find_level_exact);788 789/**790 * dev_pm_opp_find_level_ceil() - search for an rounded up level791 * @dev: device for which we do this operation792 * @level: level to search for793 *794 * Return: Searches for rounded up match in the opp table and returns pointer795 * to the matching opp if found, else returns ERR_PTR in case of error and796 * should be handled using IS_ERR. Error return values can be:797 * EINVAL: for bad pointer798 * ERANGE: no match found for search799 * ENODEV: if device not found in list of registered devices800 *801 * The callers are required to call dev_pm_opp_put() for the returned OPP after802 * use.803 */804struct dev_pm_opp *dev_pm_opp_find_level_ceil(struct device *dev,805 unsigned int *level)806{807 unsigned long temp = *level;808 struct dev_pm_opp *opp;809 810 opp = _find_key_ceil(dev, &temp, 0, true, _read_level, NULL);811 if (IS_ERR(opp))812 return opp;813 814 /* False match */815 if (temp == OPP_LEVEL_UNSET) {816 dev_err(dev, "%s: OPP levels aren't available\n", __func__);817 dev_pm_opp_put(opp);818 return ERR_PTR(-ENODEV);819 }820 821 *level = temp;822 return opp;823}824EXPORT_SYMBOL_GPL(dev_pm_opp_find_level_ceil);825 826/**827 * dev_pm_opp_find_level_floor() - Search for a rounded floor level828 * @dev: device for which we do this operation829 * @level: Start level830 *831 * Search for the matching floor *available* OPP from a starting level832 * for a device.833 *834 * Return: matching *opp and refreshes *level accordingly, else returns835 * ERR_PTR in case of error and should be handled using IS_ERR. Error return836 * values can be:837 * EINVAL: for bad pointer838 * ERANGE: no match found for search839 * ENODEV: if device not found in list of registered devices840 *841 * The callers are required to call dev_pm_opp_put() for the returned OPP after842 * use.843 */844struct dev_pm_opp *dev_pm_opp_find_level_floor(struct device *dev,845 unsigned int *level)846{847 unsigned long temp = *level;848 struct dev_pm_opp *opp;849 850 opp = _find_key_floor(dev, &temp, 0, true, _read_level, NULL);851 *level = temp;852 return opp;853}854EXPORT_SYMBOL_GPL(dev_pm_opp_find_level_floor);855 856/**857 * dev_pm_opp_find_bw_ceil() - Search for a rounded ceil bandwidth858 * @dev: device for which we do this operation859 * @bw: start bandwidth860 * @index: which bandwidth to compare, in case of OPPs with several values861 *862 * Search for the matching floor *available* OPP from a starting bandwidth863 * for a device.864 *865 * Return: matching *opp and refreshes *bw accordingly, else returns866 * ERR_PTR in case of error and should be handled using IS_ERR. Error return867 * values can be:868 * EINVAL: for bad pointer869 * ERANGE: no match found for search870 * ENODEV: if device not found in list of registered devices871 *872 * The callers are required to call dev_pm_opp_put() for the returned OPP after873 * use.874 */875struct dev_pm_opp *dev_pm_opp_find_bw_ceil(struct device *dev, unsigned int *bw,876 int index)877{878 unsigned long temp = *bw;879 struct dev_pm_opp *opp;880 881 opp = _find_key_ceil(dev, &temp, index, true, _read_bw, NULL);882 *bw = temp;883 return opp;884}885EXPORT_SYMBOL_GPL(dev_pm_opp_find_bw_ceil);886 887/**888 * dev_pm_opp_find_bw_floor() - Search for a rounded floor bandwidth889 * @dev: device for which we do this operation890 * @bw: start bandwidth891 * @index: which bandwidth to compare, in case of OPPs with several values892 *893 * Search for the matching floor *available* OPP from a starting bandwidth894 * for a device.895 *896 * Return: matching *opp and refreshes *bw accordingly, else returns897 * ERR_PTR in case of error and should be handled using IS_ERR. Error return898 * values can be:899 * EINVAL: for bad pointer900 * ERANGE: no match found for search901 * ENODEV: if device not found in list of registered devices902 *903 * The callers are required to call dev_pm_opp_put() for the returned OPP after904 * use.905 */906struct dev_pm_opp *dev_pm_opp_find_bw_floor(struct device *dev,907 unsigned int *bw, int index)908{909 unsigned long temp = *bw;910 struct dev_pm_opp *opp;911 912 opp = _find_key_floor(dev, &temp, index, true, _read_bw, NULL);913 *bw = temp;914 return opp;915}916EXPORT_SYMBOL_GPL(dev_pm_opp_find_bw_floor);917 918static int _set_opp_voltage(struct device *dev, struct regulator *reg,919 struct dev_pm_opp_supply *supply)920{921 int ret;922 923 /* Regulator not available for device */924 if (IS_ERR(reg)) {925 dev_dbg(dev, "%s: regulator not available: %ld\n", __func__,926 PTR_ERR(reg));927 return 0;928 }929 930 dev_dbg(dev, "%s: voltages (mV): %lu %lu %lu\n", __func__,931 supply->u_volt_min, supply->u_volt, supply->u_volt_max);932 933 ret = regulator_set_voltage_triplet(reg, supply->u_volt_min,934 supply->u_volt, supply->u_volt_max);935 if (ret)936 dev_err(dev, "%s: failed to set voltage (%lu %lu %lu mV): %d\n",937 __func__, supply->u_volt_min, supply->u_volt,938 supply->u_volt_max, ret);939 940 return ret;941}942 943static int944_opp_config_clk_single(struct device *dev, struct opp_table *opp_table,945 struct dev_pm_opp *opp, void *data, bool scaling_down)946{947 unsigned long *target = data;948 unsigned long freq;949 int ret;950 951 /* One of target and opp must be available */952 if (target) {953 freq = *target;954 } else if (opp) {955 freq = opp->rates[0];956 } else {957 WARN_ON(1);958 return -EINVAL;959 }960 961 ret = clk_set_rate(opp_table->clk, freq);962 if (ret) {963 dev_err(dev, "%s: failed to set clock rate: %d\n", __func__,964 ret);965 } else {966 opp_table->current_rate_single_clk = freq;967 }968 969 return ret;970}971 972/*973 * Simple implementation for configuring multiple clocks. Configure clocks in974 * the order in which they are present in the array while scaling up.975 */976int dev_pm_opp_config_clks_simple(struct device *dev,977 struct opp_table *opp_table, struct dev_pm_opp *opp, void *data,978 bool scaling_down)979{980 int ret, i;981 982 if (scaling_down) {983 for (i = opp_table->clk_count - 1; i >= 0; i--) {984 ret = clk_set_rate(opp_table->clks[i], opp->rates[i]);985 if (ret) {986 dev_err(dev, "%s: failed to set clock rate: %d\n", __func__,987 ret);988 return ret;989 }990 }991 } else {992 for (i = 0; i < opp_table->clk_count; i++) {993 ret = clk_set_rate(opp_table->clks[i], opp->rates[i]);994 if (ret) {995 dev_err(dev, "%s: failed to set clock rate: %d\n", __func__,996 ret);997 return ret;998 }999 }1000 }1001 1002 return 0;1003}1004EXPORT_SYMBOL_GPL(dev_pm_opp_config_clks_simple);1005 1006static int _opp_config_regulator_single(struct device *dev,1007 struct dev_pm_opp *old_opp, struct dev_pm_opp *new_opp,1008 struct regulator **regulators, unsigned int count)1009{1010 struct regulator *reg = regulators[0];1011 int ret;1012 1013 /* This function only supports single regulator per device */1014 if (WARN_ON(count > 1)) {1015 dev_err(dev, "multiple regulators are not supported\n");1016 return -EINVAL;1017 }1018 1019 ret = _set_opp_voltage(dev, reg, new_opp->supplies);1020 if (ret)1021 return ret;1022 1023 /*1024 * Enable the regulator after setting its voltages, otherwise it breaks1025 * some boot-enabled regulators.1026 */1027 if (unlikely(!new_opp->opp_table->enabled)) {1028 ret = regulator_enable(reg);1029 if (ret < 0)1030 dev_warn(dev, "Failed to enable regulator: %d", ret);1031 }1032 1033 return 0;1034}1035 1036static int _set_opp_bw(const struct opp_table *opp_table,1037 struct dev_pm_opp *opp, struct device *dev)1038{1039 u32 avg, peak;1040 int i, ret;1041 1042 if (!opp_table->paths)1043 return 0;1044 1045 for (i = 0; i < opp_table->path_count; i++) {1046 if (!opp) {1047 avg = 0;1048 peak = 0;1049 } else {1050 avg = opp->bandwidth[i].avg;1051 peak = opp->bandwidth[i].peak;1052 }1053 ret = icc_set_bw(opp_table->paths[i], avg, peak);1054 if (ret) {1055 dev_err(dev, "Failed to %s bandwidth[%d]: %d\n",1056 opp ? "set" : "remove", i, ret);1057 return ret;1058 }1059 }1060 1061 return 0;1062}1063 1064static int _set_opp_level(struct device *dev, struct dev_pm_opp *opp)1065{1066 unsigned int level = 0;1067 int ret = 0;1068 1069 if (opp) {1070 if (opp->level == OPP_LEVEL_UNSET)1071 return 0;1072 1073 level = opp->level;1074 }1075 1076 /* Request a new performance state through the device's PM domain. */1077 ret = dev_pm_domain_set_performance_state(dev, level);1078 if (ret)1079 dev_err(dev, "Failed to set performance state %u (%d)\n", level,1080 ret);1081 1082 return ret;1083}1084 1085/* This is only called for PM domain for now */1086static int _set_required_opps(struct device *dev, struct opp_table *opp_table,1087 struct dev_pm_opp *opp, bool up)1088{1089 struct device **devs = opp_table->required_devs;1090 struct dev_pm_opp *required_opp;1091 int index, target, delta, ret;1092 1093 if (!devs)1094 return 0;1095 1096 /* required-opps not fully initialized yet */1097 if (lazy_linking_pending(opp_table))1098 return -EBUSY;1099 1100 /* Scaling up? Set required OPPs in normal order, else reverse */1101 if (up) {1102 index = 0;1103 target = opp_table->required_opp_count;1104 delta = 1;1105 } else {1106 index = opp_table->required_opp_count - 1;1107 target = -1;1108 delta = -1;1109 }1110 1111 while (index != target) {1112 if (devs[index]) {1113 required_opp = opp ? opp->required_opps[index] : NULL;1114 1115 ret = _set_opp_level(devs[index], required_opp);1116 if (ret)1117 return ret;1118 }1119 1120 index += delta;1121 }1122 1123 return 0;1124}1125 1126static void _find_current_opp(struct device *dev, struct opp_table *opp_table)1127{1128 struct dev_pm_opp *opp = ERR_PTR(-ENODEV);1129 unsigned long freq;1130 1131 if (!IS_ERR(opp_table->clk)) {1132 freq = clk_get_rate(opp_table->clk);1133 opp = _find_freq_ceil(opp_table, &freq);1134 }1135 1136 /*1137 * Unable to find the current OPP ? Pick the first from the list since1138 * it is in ascending order, otherwise rest of the code will need to1139 * make special checks to validate current_opp.1140 */1141 if (IS_ERR(opp)) {1142 mutex_lock(&opp_table->lock);1143 opp = list_first_entry(&opp_table->opp_list, struct dev_pm_opp, node);1144 dev_pm_opp_get(opp);1145 mutex_unlock(&opp_table->lock);1146 }1147 1148 opp_table->current_opp = opp;1149}1150 1151static int _disable_opp_table(struct device *dev, struct opp_table *opp_table)1152{1153 int ret;1154 1155 if (!opp_table->enabled)1156 return 0;1157 1158 /*1159 * Some drivers need to support cases where some platforms may1160 * have OPP table for the device, while others don't and1161 * opp_set_rate() just needs to behave like clk_set_rate().1162 */1163 if (!_get_opp_count(opp_table))1164 return 0;1165 1166 ret = _set_opp_bw(opp_table, NULL, dev);1167 if (ret)1168 return ret;1169 1170 if (opp_table->regulators)1171 regulator_disable(opp_table->regulators[0]);1172 1173 ret = _set_opp_level(dev, NULL);1174 if (ret)1175 goto out;1176 1177 ret = _set_required_opps(dev, opp_table, NULL, false);1178 1179out:1180 opp_table->enabled = false;1181 return ret;1182}1183 1184static int _set_opp(struct device *dev, struct opp_table *opp_table,1185 struct dev_pm_opp *opp, void *clk_data, bool forced)1186{1187 struct dev_pm_opp *old_opp;1188 int scaling_down, ret;1189 1190 if (unlikely(!opp))1191 return _disable_opp_table(dev, opp_table);1192 1193 /* Find the currently set OPP if we don't know already */1194 if (unlikely(!opp_table->current_opp))1195 _find_current_opp(dev, opp_table);1196 1197 old_opp = opp_table->current_opp;1198 1199 /* Return early if nothing to do */1200 if (!forced && old_opp == opp && opp_table->enabled) {1201 dev_dbg_ratelimited(dev, "%s: OPPs are same, nothing to do\n", __func__);1202 return 0;1203 }1204 1205 dev_dbg(dev, "%s: switching OPP: Freq %lu -> %lu Hz, Level %u -> %u, Bw %u -> %u\n",1206 __func__, old_opp->rates[0], opp->rates[0], old_opp->level,1207 opp->level, old_opp->bandwidth ? old_opp->bandwidth[0].peak : 0,1208 opp->bandwidth ? opp->bandwidth[0].peak : 0);1209 1210 scaling_down = _opp_compare_key(opp_table, old_opp, opp);1211 if (scaling_down == -1)1212 scaling_down = 0;1213 1214 /* Scaling up? Configure required OPPs before frequency */1215 if (!scaling_down) {1216 ret = _set_required_opps(dev, opp_table, opp, true);1217 if (ret) {1218 dev_err(dev, "Failed to set required opps: %d\n", ret);1219 return ret;1220 }1221 1222 ret = _set_opp_level(dev, opp);1223 if (ret)1224 return ret;1225 1226 ret = _set_opp_bw(opp_table, opp, dev);1227 if (ret) {1228 dev_err(dev, "Failed to set bw: %d\n", ret);1229 return ret;1230 }1231 1232 if (opp_table->config_regulators) {1233 ret = opp_table->config_regulators(dev, old_opp, opp,1234 opp_table->regulators,1235 opp_table->regulator_count);1236 if (ret) {1237 dev_err(dev, "Failed to set regulator voltages: %d\n",1238 ret);1239 return ret;1240 }1241 }1242 }1243 1244 if (opp_table->config_clks) {1245 ret = opp_table->config_clks(dev, opp_table, opp, clk_data, scaling_down);1246 if (ret)1247 return ret;1248 }1249 1250 /* Scaling down? Configure required OPPs after frequency */1251 if (scaling_down) {1252 if (opp_table->config_regulators) {1253 ret = opp_table->config_regulators(dev, old_opp, opp,1254 opp_table->regulators,1255 opp_table->regulator_count);1256 if (ret) {1257 dev_err(dev, "Failed to set regulator voltages: %d\n",1258 ret);1259 return ret;1260 }1261 }1262 1263 ret = _set_opp_bw(opp_table, opp, dev);1264 if (ret) {1265 dev_err(dev, "Failed to set bw: %d\n", ret);1266 return ret;1267 }1268 1269 ret = _set_opp_level(dev, opp);1270 if (ret)1271 return ret;1272 1273 ret = _set_required_opps(dev, opp_table, opp, false);1274 if (ret) {1275 dev_err(dev, "Failed to set required opps: %d\n", ret);1276 return ret;1277 }1278 }1279 1280 opp_table->enabled = true;1281 dev_pm_opp_put(old_opp);1282 1283 /* Make sure current_opp doesn't get freed */1284 dev_pm_opp_get(opp);1285 opp_table->current_opp = opp;1286 1287 return ret;1288}1289 1290/**1291 * dev_pm_opp_set_rate() - Configure new OPP based on frequency1292 * @dev: device for which we do this operation1293 * @target_freq: frequency to achieve1294 *1295 * This configures the power-supplies to the levels specified by the OPP1296 * corresponding to the target_freq, and programs the clock to a value <=1297 * target_freq, as rounded by clk_round_rate(). Device wanting to run at fmax1298 * provided by the opp, should have already rounded to the target OPP's1299 * frequency.1300 */1301int dev_pm_opp_set_rate(struct device *dev, unsigned long target_freq)1302{1303 struct opp_table *opp_table;1304 unsigned long freq = 0, temp_freq;1305 struct dev_pm_opp *opp = NULL;1306 bool forced = false;1307 int ret;1308 1309 opp_table = _find_opp_table(dev);1310 if (IS_ERR(opp_table)) {1311 dev_err(dev, "%s: device's opp table doesn't exist\n", __func__);1312 return PTR_ERR(opp_table);1313 }1314 1315 if (target_freq) {1316 /*1317 * For IO devices which require an OPP on some platforms/SoCs1318 * while just needing to scale the clock on some others1319 * we look for empty OPP tables with just a clock handle and1320 * scale only the clk. This makes dev_pm_opp_set_rate()1321 * equivalent to a clk_set_rate()1322 */1323 if (!_get_opp_count(opp_table)) {1324 ret = opp_table->config_clks(dev, opp_table, NULL,1325 &target_freq, false);1326 goto put_opp_table;1327 }1328 1329 freq = clk_round_rate(opp_table->clk, target_freq);1330 if ((long)freq <= 0)1331 freq = target_freq;1332 1333 /*1334 * The clock driver may support finer resolution of the1335 * frequencies than the OPP table, don't update the frequency we1336 * pass to clk_set_rate() here.1337 */1338 temp_freq = freq;1339 opp = _find_freq_ceil(opp_table, &temp_freq);1340 if (IS_ERR(opp)) {1341 ret = PTR_ERR(opp);1342 dev_err(dev, "%s: failed to find OPP for freq %lu (%d)\n",1343 __func__, freq, ret);1344 goto put_opp_table;1345 }1346 1347 /*1348 * An OPP entry specifies the highest frequency at which other1349 * properties of the OPP entry apply. Even if the new OPP is1350 * same as the old one, we may still reach here for a different1351 * value of the frequency. In such a case, do not abort but1352 * configure the hardware to the desired frequency forcefully.1353 */1354 forced = opp_table->current_rate_single_clk != freq;1355 }1356 1357 ret = _set_opp(dev, opp_table, opp, &freq, forced);1358 1359 if (freq)1360 dev_pm_opp_put(opp);1361 1362put_opp_table:1363 dev_pm_opp_put_opp_table(opp_table);1364 return ret;1365}1366EXPORT_SYMBOL_GPL(dev_pm_opp_set_rate);1367 1368/**1369 * dev_pm_opp_set_opp() - Configure device for OPP1370 * @dev: device for which we do this operation1371 * @opp: OPP to set to1372 *1373 * This configures the device based on the properties of the OPP passed to this1374 * routine.1375 *1376 * Return: 0 on success, a negative error number otherwise.1377 */1378int dev_pm_opp_set_opp(struct device *dev, struct dev_pm_opp *opp)1379{1380 struct opp_table *opp_table;1381 int ret;1382 1383 opp_table = _find_opp_table(dev);1384 if (IS_ERR(opp_table)) {1385 dev_err(dev, "%s: device opp doesn't exist\n", __func__);1386 return PTR_ERR(opp_table);1387 }1388 1389 ret = _set_opp(dev, opp_table, opp, NULL, false);1390 dev_pm_opp_put_opp_table(opp_table);1391 1392 return ret;1393}1394EXPORT_SYMBOL_GPL(dev_pm_opp_set_opp);1395 1396/* OPP-dev Helpers */1397static void _remove_opp_dev(struct opp_device *opp_dev,1398 struct opp_table *opp_table)1399{1400 opp_debug_unregister(opp_dev, opp_table);1401 list_del(&opp_dev->node);1402 kfree(opp_dev);1403}1404 1405struct opp_device *_add_opp_dev(const struct device *dev,1406 struct opp_table *opp_table)1407{1408 struct opp_device *opp_dev;1409 1410 opp_dev = kzalloc(sizeof(*opp_dev), GFP_KERNEL);1411 if (!opp_dev)1412 return NULL;1413 1414 /* Initialize opp-dev */1415 opp_dev->dev = dev;1416 1417 mutex_lock(&opp_table->lock);1418 list_add(&opp_dev->node, &opp_table->dev_list);1419 mutex_unlock(&opp_table->lock);1420 1421 /* Create debugfs entries for the opp_table */1422 opp_debug_register(opp_dev, opp_table);1423 1424 return opp_dev;1425}1426 1427static struct opp_table *_allocate_opp_table(struct device *dev, int index)1428{1429 struct opp_table *opp_table;1430 struct opp_device *opp_dev;1431 int ret;1432 1433 /*1434 * Allocate a new OPP table. In the infrequent case where a new1435 * device is needed to be added, we pay this penalty.1436 */1437 opp_table = kzalloc(sizeof(*opp_table), GFP_KERNEL);1438 if (!opp_table)1439 return ERR_PTR(-ENOMEM);1440 1441 mutex_init(&opp_table->lock);1442 INIT_LIST_HEAD(&opp_table->dev_list);1443 INIT_LIST_HEAD(&opp_table->lazy);1444 1445 opp_table->clk = ERR_PTR(-ENODEV);1446 1447 /* Mark regulator count uninitialized */1448 opp_table->regulator_count = -1;1449 1450 opp_dev = _add_opp_dev(dev, opp_table);1451 if (!opp_dev) {1452 ret = -ENOMEM;1453 goto err;1454 }1455 1456 _of_init_opp_table(opp_table, dev, index);1457 1458 /* Find interconnect path(s) for the device */1459 ret = dev_pm_opp_of_find_icc_paths(dev, opp_table);1460 if (ret) {1461 if (ret == -EPROBE_DEFER)1462 goto remove_opp_dev;1463 1464 dev_warn(dev, "%s: Error finding interconnect paths: %d\n",1465 __func__, ret);1466 }1467 1468 BLOCKING_INIT_NOTIFIER_HEAD(&opp_table->head);1469 INIT_LIST_HEAD(&opp_table->opp_list);1470 kref_init(&opp_table->kref);1471 1472 return opp_table;1473 1474remove_opp_dev:1475 _of_clear_opp_table(opp_table);1476 _remove_opp_dev(opp_dev, opp_table);1477 mutex_destroy(&opp_table->lock);1478err:1479 kfree(opp_table);1480 return ERR_PTR(ret);1481}1482 1483void _get_opp_table_kref(struct opp_table *opp_table)1484{1485 kref_get(&opp_table->kref);1486}1487 1488static struct opp_table *_update_opp_table_clk(struct device *dev,1489 struct opp_table *opp_table,1490 bool getclk)1491{1492 int ret;1493 1494 /*1495 * Return early if we don't need to get clk or we have already done it1496 * earlier.1497 */1498 if (!getclk || IS_ERR(opp_table) || !IS_ERR(opp_table->clk) ||1499 opp_table->clks)1500 return opp_table;1501 1502 /* Find clk for the device */1503 opp_table->clk = clk_get(dev, NULL);1504 1505 ret = PTR_ERR_OR_ZERO(opp_table->clk);1506 if (!ret) {1507 opp_table->config_clks = _opp_config_clk_single;1508 opp_table->clk_count = 1;1509 return opp_table;1510 }1511 1512 if (ret == -ENOENT) {1513 /*1514 * There are few platforms which don't want the OPP core to1515 * manage device's clock settings. In such cases neither the1516 * platform provides the clks explicitly to us, nor the DT1517 * contains a valid clk entry. The OPP nodes in DT may still1518 * contain "opp-hz" property though, which we need to parse and1519 * allow the platform to find an OPP based on freq later on.1520 *1521 * This is a simple solution to take care of such corner cases,1522 * i.e. make the clk_count 1, which lets us allocate space for1523 * frequency in opp->rates and also parse the entries in DT.1524 */1525 opp_table->clk_count = 1;1526 1527 dev_dbg(dev, "%s: Couldn't find clock: %d\n", __func__, ret);1528 return opp_table;1529 }1530 1531 dev_pm_opp_put_opp_table(opp_table);1532 dev_err_probe(dev, ret, "Couldn't find clock\n");1533 1534 return ERR_PTR(ret);1535}1536 1537/*1538 * We need to make sure that the OPP table for a device doesn't get added twice,1539 * if this routine gets called in parallel with the same device pointer.1540 *1541 * The simplest way to enforce that is to perform everything (find existing1542 * table and if not found, create a new one) under the opp_table_lock, so only1543 * one creator gets access to the same. But that expands the critical section1544 * under the lock and may end up causing circular dependencies with frameworks1545 * like debugfs, interconnect or clock framework as they may be direct or1546 * indirect users of OPP core.1547 *1548 * And for that reason we have to go for a bit tricky implementation here, which1549 * uses the opp_tables_busy flag to indicate if another creator is in the middle1550 * of adding an OPP table and others should wait for it to finish.1551 */1552struct opp_table *_add_opp_table_indexed(struct device *dev, int index,1553 bool getclk)1554{1555 struct opp_table *opp_table;1556 1557again:1558 mutex_lock(&opp_table_lock);1559 1560 opp_table = _find_opp_table_unlocked(dev);1561 if (!IS_ERR(opp_table))1562 goto unlock;1563 1564 /*1565 * The opp_tables list or an OPP table's dev_list is getting updated by1566 * another user, wait for it to finish.1567 */1568 if (unlikely(opp_tables_busy)) {1569 mutex_unlock(&opp_table_lock);1570 cpu_relax();1571 goto again;1572 }1573 1574 opp_tables_busy = true;1575 opp_table = _managed_opp(dev, index);1576 1577 /* Drop the lock to reduce the size of critical section */1578 mutex_unlock(&opp_table_lock);1579 1580 if (opp_table) {1581 if (!_add_opp_dev(dev, opp_table)) {1582 dev_pm_opp_put_opp_table(opp_table);1583 opp_table = ERR_PTR(-ENOMEM);1584 }1585 1586 mutex_lock(&opp_table_lock);1587 } else {1588 opp_table = _allocate_opp_table(dev, index);1589 1590 mutex_lock(&opp_table_lock);1591 if (!IS_ERR(opp_table))1592 list_add(&opp_table->node, &opp_tables);1593 }1594 1595 opp_tables_busy = false;1596 1597unlock:1598 mutex_unlock(&opp_table_lock);1599 1600 return _update_opp_table_clk(dev, opp_table, getclk);1601}1602 1603static struct opp_table *_add_opp_table(struct device *dev, bool getclk)1604{1605 return _add_opp_table_indexed(dev, 0, getclk);1606}1607 1608struct opp_table *dev_pm_opp_get_opp_table(struct device *dev)1609{1610 return _find_opp_table(dev);1611}1612EXPORT_SYMBOL_GPL(dev_pm_opp_get_opp_table);1613 1614static void _opp_table_kref_release(struct kref *kref)1615{1616 struct opp_table *opp_table = container_of(kref, struct opp_table, kref);1617 struct opp_device *opp_dev, *temp;1618 int i;1619 1620 /* Drop the lock as soon as we can */1621 list_del(&opp_table->node);1622 mutex_unlock(&opp_table_lock);1623 1624 if (opp_table->current_opp)1625 dev_pm_opp_put(opp_table->current_opp);1626 1627 _of_clear_opp_table(opp_table);1628 1629 /* Release automatically acquired single clk */1630 if (!IS_ERR(opp_table->clk))1631 clk_put(opp_table->clk);1632 1633 if (opp_table->paths) {1634 for (i = 0; i < opp_table->path_count; i++)1635 icc_put(opp_table->paths[i]);1636 kfree(opp_table->paths);1637 }1638 1639 WARN_ON(!list_empty(&opp_table->opp_list));1640 1641 list_for_each_entry_safe(opp_dev, temp, &opp_table->dev_list, node)1642 _remove_opp_dev(opp_dev, opp_table);1643 1644 mutex_destroy(&opp_table->lock);1645 kfree(opp_table);1646}1647 1648void dev_pm_opp_put_opp_table(struct opp_table *opp_table)1649{1650 kref_put_mutex(&opp_table->kref, _opp_table_kref_release,1651 &opp_table_lock);1652}1653EXPORT_SYMBOL_GPL(dev_pm_opp_put_opp_table);1654 1655void _opp_free(struct dev_pm_opp *opp)1656{1657 kfree(opp);1658}1659 1660static void _opp_kref_release(struct kref *kref)1661{1662 struct dev_pm_opp *opp = container_of(kref, struct dev_pm_opp, kref);1663 struct opp_table *opp_table = opp->opp_table;1664 1665 list_del(&opp->node);1666 mutex_unlock(&opp_table->lock);1667 1668 /*1669 * Notify the changes in the availability of the operable1670 * frequency/voltage list.1671 */1672 blocking_notifier_call_chain(&opp_table->head, OPP_EVENT_REMOVE, opp);1673 _of_clear_opp(opp_table, opp);1674 opp_debug_remove_one(opp);1675 kfree(opp);1676}1677 1678void dev_pm_opp_get(struct dev_pm_opp *opp)1679{1680 kref_get(&opp->kref);1681}1682 1683void dev_pm_opp_put(struct dev_pm_opp *opp)1684{1685 kref_put_mutex(&opp->kref, _opp_kref_release, &opp->opp_table->lock);1686}1687EXPORT_SYMBOL_GPL(dev_pm_opp_put);1688 1689/**1690 * dev_pm_opp_remove() - Remove an OPP from OPP table1691 * @dev: device for which we do this operation1692 * @freq: OPP to remove with matching 'freq'1693 *1694 * This function removes an opp from the opp table.1695 */1696void dev_pm_opp_remove(struct device *dev, unsigned long freq)1697{1698 struct dev_pm_opp *opp = NULL, *iter;1699 struct opp_table *opp_table;1700 1701 opp_table = _find_opp_table(dev);1702 if (IS_ERR(opp_table))1703 return;1704 1705 if (!assert_single_clk(opp_table))1706 goto put_table;1707 1708 mutex_lock(&opp_table->lock);1709 1710 list_for_each_entry(iter, &opp_table->opp_list, node) {1711 if (iter->rates[0] == freq) {1712 opp = iter;1713 break;1714 }1715 }1716 1717 mutex_unlock(&opp_table->lock);1718 1719 if (opp) {1720 dev_pm_opp_put(opp);1721 1722 /* Drop the reference taken by dev_pm_opp_add() */1723 dev_pm_opp_put_opp_table(opp_table);1724 } else {1725 dev_warn(dev, "%s: Couldn't find OPP with freq: %lu\n",1726 __func__, freq);1727 }1728 1729put_table:1730 /* Drop the reference taken by _find_opp_table() */1731 dev_pm_opp_put_opp_table(opp_table);1732}1733EXPORT_SYMBOL_GPL(dev_pm_opp_remove);1734 1735static struct dev_pm_opp *_opp_get_next(struct opp_table *opp_table,1736 bool dynamic)1737{1738 struct dev_pm_opp *opp = NULL, *temp;1739 1740 mutex_lock(&opp_table->lock);1741 list_for_each_entry(temp, &opp_table->opp_list, node) {1742 /*1743 * Refcount must be dropped only once for each OPP by OPP core,1744 * do that with help of "removed" flag.1745 */1746 if (!temp->removed && dynamic == temp->dynamic) {1747 opp = temp;1748 break;1749 }1750 }1751 1752 mutex_unlock(&opp_table->lock);1753 return opp;1754}1755 1756/*1757 * Can't call dev_pm_opp_put() from under the lock as debugfs removal needs to1758 * happen lock less to avoid circular dependency issues. This routine must be1759 * called without the opp_table->lock held.1760 */1761static void _opp_remove_all(struct opp_table *opp_table, bool dynamic)1762{1763 struct dev_pm_opp *opp;1764 1765 while ((opp = _opp_get_next(opp_table, dynamic))) {1766 opp->removed = true;1767 dev_pm_opp_put(opp);1768 1769 /* Drop the references taken by dev_pm_opp_add() */1770 if (dynamic)1771 dev_pm_opp_put_opp_table(opp_table);1772 }1773}1774 1775bool _opp_remove_all_static(struct opp_table *opp_table)1776{1777 mutex_lock(&opp_table->lock);1778 1779 if (!opp_table->parsed_static_opps) {1780 mutex_unlock(&opp_table->lock);1781 return false;1782 }1783 1784 if (--opp_table->parsed_static_opps) {1785 mutex_unlock(&opp_table->lock);1786 return true;1787 }1788 1789 mutex_unlock(&opp_table->lock);1790 1791 _opp_remove_all(opp_table, false);1792 return true;1793}1794 1795/**1796 * dev_pm_opp_remove_all_dynamic() - Remove all dynamically created OPPs1797 * @dev: device for which we do this operation1798 *1799 * This function removes all dynamically created OPPs from the opp table.1800 */1801void dev_pm_opp_remove_all_dynamic(struct device *dev)1802{1803 struct opp_table *opp_table;1804 1805 opp_table = _find_opp_table(dev);1806 if (IS_ERR(opp_table))1807 return;1808 1809 _opp_remove_all(opp_table, true);1810 1811 /* Drop the reference taken by _find_opp_table() */1812 dev_pm_opp_put_opp_table(opp_table);1813}1814EXPORT_SYMBOL_GPL(dev_pm_opp_remove_all_dynamic);1815 1816struct dev_pm_opp *_opp_allocate(struct opp_table *opp_table)1817{1818 struct dev_pm_opp *opp;1819 int supply_count, supply_size, icc_size, clk_size;1820 1821 /* Allocate space for at least one supply */1822 supply_count = opp_table->regulator_count > 0 ?1823 opp_table->regulator_count : 1;1824 supply_size = sizeof(*opp->supplies) * supply_count;1825 clk_size = sizeof(*opp->rates) * opp_table->clk_count;1826 icc_size = sizeof(*opp->bandwidth) * opp_table->path_count;1827 1828 /* allocate new OPP node and supplies structures */1829 opp = kzalloc(sizeof(*opp) + supply_size + clk_size + icc_size, GFP_KERNEL);1830 if (!opp)1831 return NULL;1832 1833 /* Put the supplies, bw and clock at the end of the OPP structure */1834 opp->supplies = (struct dev_pm_opp_supply *)(opp + 1);1835 1836 opp->rates = (unsigned long *)(opp->supplies + supply_count);1837 1838 if (icc_size)1839 opp->bandwidth = (struct dev_pm_opp_icc_bw *)(opp->rates + opp_table->clk_count);1840 1841 INIT_LIST_HEAD(&opp->node);1842 1843 opp->level = OPP_LEVEL_UNSET;1844 1845 return opp;1846}1847 1848static bool _opp_supported_by_regulators(struct dev_pm_opp *opp,1849 struct opp_table *opp_table)1850{1851 struct regulator *reg;1852 int i;1853 1854 if (!opp_table->regulators)1855 return true;1856 1857 for (i = 0; i < opp_table->regulator_count; i++) {1858 reg = opp_table->regulators[i];1859 1860 if (!regulator_is_supported_voltage(reg,1861 opp->supplies[i].u_volt_min,1862 opp->supplies[i].u_volt_max)) {1863 pr_warn("%s: OPP minuV: %lu maxuV: %lu, not supported by regulator\n",1864 __func__, opp->supplies[i].u_volt_min,1865 opp->supplies[i].u_volt_max);1866 return false;1867 }1868 }1869 1870 return true;1871}1872 1873static int _opp_compare_rate(struct opp_table *opp_table,1874 struct dev_pm_opp *opp1, struct dev_pm_opp *opp2)1875{1876 int i;1877 1878 for (i = 0; i < opp_table->clk_count; i++) {1879 if (opp1->rates[i] != opp2->rates[i])1880 return opp1->rates[i] < opp2->rates[i] ? -1 : 1;1881 }1882 1883 /* Same rates for both OPPs */1884 return 0;1885}1886 1887static int _opp_compare_bw(struct opp_table *opp_table, struct dev_pm_opp *opp1,1888 struct dev_pm_opp *opp2)1889{1890 int i;1891 1892 for (i = 0; i < opp_table->path_count; i++) {1893 if (opp1->bandwidth[i].peak != opp2->bandwidth[i].peak)1894 return opp1->bandwidth[i].peak < opp2->bandwidth[i].peak ? -1 : 1;1895 }1896 1897 /* Same bw for both OPPs */1898 return 0;1899}1900 1901/*1902 * Returns1903 * 0: opp1 == opp21904 * 1: opp1 > opp21905 * -1: opp1 < opp21906 */1907int _opp_compare_key(struct opp_table *opp_table, struct dev_pm_opp *opp1,1908 struct dev_pm_opp *opp2)1909{1910 int ret;1911 1912 ret = _opp_compare_rate(opp_table, opp1, opp2);1913 if (ret)1914 return ret;1915 1916 ret = _opp_compare_bw(opp_table, opp1, opp2);1917 if (ret)1918 return ret;1919 1920 if (opp1->level != opp2->level)1921 return opp1->level < opp2->level ? -1 : 1;1922 1923 /* Duplicate OPPs */1924 return 0;1925}1926 1927static int _opp_is_duplicate(struct device *dev, struct dev_pm_opp *new_opp,1928 struct opp_table *opp_table,1929 struct list_head **head)1930{1931 struct dev_pm_opp *opp;1932 int opp_cmp;1933 1934 /*1935 * Insert new OPP in order of increasing frequency and discard if1936 * already present.1937 *1938 * Need to use &opp_table->opp_list in the condition part of the 'for'1939 * loop, don't replace it with head otherwise it will become an infinite1940 * loop.1941 */1942 list_for_each_entry(opp, &opp_table->opp_list, node) {1943 opp_cmp = _opp_compare_key(opp_table, new_opp, opp);1944 if (opp_cmp > 0) {1945 *head = &opp->node;1946 continue;1947 }1948 1949 if (opp_cmp < 0)1950 return 0;1951 1952 /* Duplicate OPPs */1953 dev_warn(dev, "%s: duplicate OPPs detected. Existing: freq: %lu, volt: %lu, enabled: %d. New: freq: %lu, volt: %lu, enabled: %d\n",1954 __func__, opp->rates[0], opp->supplies[0].u_volt,1955 opp->available, new_opp->rates[0],1956 new_opp->supplies[0].u_volt, new_opp->available);1957 1958 /* Should we compare voltages for all regulators here ? */1959 return opp->available &&1960 new_opp->supplies[0].u_volt == opp->supplies[0].u_volt ? -EBUSY : -EEXIST;1961 }1962 1963 return 0;1964}1965 1966void _required_opps_available(struct dev_pm_opp *opp, int count)1967{1968 int i;1969 1970 for (i = 0; i < count; i++) {1971 if (opp->required_opps[i]->available)1972 continue;1973 1974 opp->available = false;1975 pr_warn("%s: OPP not supported by required OPP %pOF (%lu)\n",1976 __func__, opp->required_opps[i]->np, opp->rates[0]);1977 return;1978 }1979}1980 1981/*1982 * Returns:1983 * 0: On success. And appropriate error message for duplicate OPPs.1984 * -EBUSY: For OPP with same freq/volt and is available. The callers of1985 * _opp_add() must return 0 if they receive -EBUSY from it. This is to make1986 * sure we don't print error messages unnecessarily if different parts of1987 * kernel try to initialize the OPP table.1988 * -EEXIST: For OPP with same freq but different volt or is unavailable. This1989 * should be considered an error by the callers of _opp_add().1990 */1991int _opp_add(struct device *dev, struct dev_pm_opp *new_opp,1992 struct opp_table *opp_table)1993{1994 struct list_head *head;1995 int ret;1996 1997 mutex_lock(&opp_table->lock);1998 head = &opp_table->opp_list;1999 2000 ret = _opp_is_duplicate(dev, new_opp, opp_table, &head);2001 if (ret) {2002 mutex_unlock(&opp_table->lock);2003 return ret;2004 }2005 2006 list_add(&new_opp->node, head);2007 mutex_unlock(&opp_table->lock);2008 2009 new_opp->opp_table = opp_table;2010 kref_init(&new_opp->kref);2011 2012 opp_debug_create_one(new_opp, opp_table);2013 2014 if (!_opp_supported_by_regulators(new_opp, opp_table)) {2015 new_opp->available = false;2016 dev_warn(dev, "%s: OPP not supported by regulators (%lu)\n",2017 __func__, new_opp->rates[0]);2018 }2019 2020 /* required-opps not fully initialized yet */2021 if (lazy_linking_pending(opp_table))2022 return 0;2023 2024 _required_opps_available(new_opp, opp_table->required_opp_count);2025 2026 return 0;2027}2028 2029/**2030 * _opp_add_v1() - Allocate a OPP based on v1 bindings.2031 * @opp_table: OPP table2032 * @dev: device for which we do this operation2033 * @data: The OPP data for the OPP to add2034 * @dynamic: Dynamically added OPPs.2035 *2036 * This function adds an opp definition to the opp table and returns status.2037 * The opp is made available by default and it can be controlled using2038 * dev_pm_opp_enable/disable functions and may be removed by dev_pm_opp_remove.2039 *2040 * NOTE: "dynamic" parameter impacts OPPs added by the dev_pm_opp_of_add_table2041 * and freed by dev_pm_opp_of_remove_table.2042 *2043 * Return:2044 * 0 On success OR2045 * Duplicate OPPs (both freq and volt are same) and opp->available2046 * -EEXIST Freq are same and volt are different OR2047 * Duplicate OPPs (both freq and volt are same) and !opp->available2048 * -ENOMEM Memory allocation failure2049 */2050int _opp_add_v1(struct opp_table *opp_table, struct device *dev,2051 struct dev_pm_opp_data *data, bool dynamic)2052{2053 struct dev_pm_opp *new_opp;2054 unsigned long tol, u_volt = data->u_volt;2055 int ret;2056 2057 if (!assert_single_clk(opp_table))2058 return -EINVAL;2059 2060 new_opp = _opp_allocate(opp_table);2061 if (!new_opp)2062 return -ENOMEM;2063 2064 /* populate the opp table */2065 new_opp->rates[0] = data->freq;2066 new_opp->level = data->level;2067 new_opp->turbo = data->turbo;2068 tol = u_volt * opp_table->voltage_tolerance_v1 / 100;2069 new_opp->supplies[0].u_volt = u_volt;2070 new_opp->supplies[0].u_volt_min = u_volt - tol;2071 new_opp->supplies[0].u_volt_max = u_volt + tol;2072 new_opp->available = true;2073 new_opp->dynamic = dynamic;2074 2075 ret = _opp_add(dev, new_opp, opp_table);2076 if (ret) {2077 /* Don't return error for duplicate OPPs */2078 if (ret == -EBUSY)2079 ret = 0;2080 goto free_opp;2081 }2082 2083 /*2084 * Notify the changes in the availability of the operable2085 * frequency/voltage list.2086 */2087 blocking_notifier_call_chain(&opp_table->head, OPP_EVENT_ADD, new_opp);2088 return 0;2089 2090free_opp:2091 _opp_free(new_opp);2092 2093 return ret;2094}2095 2096/*2097 * This is required only for the V2 bindings, and it enables a platform to2098 * specify the hierarchy of versions it supports. OPP layer will then enable2099 * OPPs, which are available for those versions, based on its 'opp-supported-hw'2100 * property.2101 */2102static int _opp_set_supported_hw(struct opp_table *opp_table,2103 const u32 *versions, unsigned int count)2104{2105 /* Another CPU that shares the OPP table has set the property ? */2106 if (opp_table->supported_hw)2107 return 0;2108 2109 opp_table->supported_hw = kmemdup(versions, count * sizeof(*versions),2110 GFP_KERNEL);2111 if (!opp_table->supported_hw)2112 return -ENOMEM;2113 2114 opp_table->supported_hw_count = count;2115 2116 return 0;2117}2118 2119static void _opp_put_supported_hw(struct opp_table *opp_table)2120{2121 if (opp_table->supported_hw) {2122 kfree(opp_table->supported_hw);2123 opp_table->supported_hw = NULL;2124 opp_table->supported_hw_count = 0;2125 }2126}2127 2128/*2129 * This is required only for the V2 bindings, and it enables a platform to2130 * specify the extn to be used for certain property names. The properties to2131 * which the extension will apply are opp-microvolt and opp-microamp. OPP core2132 * should postfix the property name with -<name> while looking for them.2133 */2134static int _opp_set_prop_name(struct opp_table *opp_table, const char *name)2135{2136 /* Another CPU that shares the OPP table has set the property ? */2137 if (!opp_table->prop_name) {2138 opp_table->prop_name = kstrdup(name, GFP_KERNEL);2139 if (!opp_table->prop_name)2140 return -ENOMEM;2141 }2142 2143 return 0;2144}2145 2146static void _opp_put_prop_name(struct opp_table *opp_table)2147{2148 if (opp_table->prop_name) {2149 kfree(opp_table->prop_name);2150 opp_table->prop_name = NULL;2151 }2152}2153 2154/*2155 * In order to support OPP switching, OPP layer needs to know the name of the2156 * device's regulators, as the core would be required to switch voltages as2157 * well.2158 *2159 * This must be called before any OPPs are initialized for the device.2160 */2161static int _opp_set_regulators(struct opp_table *opp_table, struct device *dev,2162 const char * const names[])2163{2164 const char * const *temp = names;2165 struct regulator *reg;2166 int count = 0, ret, i;2167 2168 /* Count number of regulators */2169 while (*temp++)2170 count++;2171 2172 if (!count)2173 return -EINVAL;2174 2175 /* Another CPU that shares the OPP table has set the regulators ? */2176 if (opp_table->regulators)2177 return 0;2178 2179 opp_table->regulators = kmalloc_array(count,2180 sizeof(*opp_table->regulators),2181 GFP_KERNEL);2182 if (!opp_table->regulators)2183 return -ENOMEM;2184 2185 for (i = 0; i < count; i++) {2186 reg = regulator_get_optional(dev, names[i]);2187 if (IS_ERR(reg)) {2188 ret = dev_err_probe(dev, PTR_ERR(reg),2189 "%s: no regulator (%s) found\n",2190 __func__, names[i]);2191 goto free_regulators;2192 }2193 2194 opp_table->regulators[i] = reg;2195 }2196 2197 opp_table->regulator_count = count;2198 2199 /* Set generic config_regulators() for single regulators here */2200 if (count == 1)2201 opp_table->config_regulators = _opp_config_regulator_single;2202 2203 return 0;2204 2205free_regulators:2206 while (i != 0)2207 regulator_put(opp_table->regulators[--i]);2208 2209 kfree(opp_table->regulators);2210 opp_table->regulators = NULL;2211 opp_table->regulator_count = -1;2212 2213 return ret;2214}2215 2216static void _opp_put_regulators(struct opp_table *opp_table)2217{2218 int i;2219 2220 if (!opp_table->regulators)2221 return;2222 2223 if (opp_table->enabled) {2224 for (i = opp_table->regulator_count - 1; i >= 0; i--)2225 regulator_disable(opp_table->regulators[i]);2226 }2227 2228 for (i = opp_table->regulator_count - 1; i >= 0; i--)2229 regulator_put(opp_table->regulators[i]);2230 2231 kfree(opp_table->regulators);2232 opp_table->regulators = NULL;2233 opp_table->regulator_count = -1;2234}2235 2236static void _put_clks(struct opp_table *opp_table, int count)2237{2238 int i;2239 2240 for (i = count - 1; i >= 0; i--)2241 clk_put(opp_table->clks[i]);2242 2243 kfree(opp_table->clks);2244 opp_table->clks = NULL;2245}2246 2247/*2248 * In order to support OPP switching, OPP layer needs to get pointers to the2249 * clocks for the device. Simple cases work fine without using this routine2250 * (i.e. by passing connection-id as NULL), but for a device with multiple2251 * clocks available, the OPP core needs to know the exact names of the clks to2252 * use.2253 *2254 * This must be called before any OPPs are initialized for the device.2255 */2256static int _opp_set_clknames(struct opp_table *opp_table, struct device *dev,2257 const char * const names[],2258 config_clks_t config_clks)2259{2260 const char * const *temp = names;2261 int count = 0, ret, i;2262 struct clk *clk;2263 2264 /* Count number of clks */2265 while (*temp++)2266 count++;2267 2268 /*2269 * This is a special case where we have a single clock, whose connection2270 * id name is NULL, i.e. first two entries are NULL in the array.2271 */2272 if (!count && !names[1])2273 count = 1;2274 2275 /* Fail early for invalid configurations */2276 if (!count || (!config_clks && count > 1))2277 return -EINVAL;2278 2279 /* Another CPU that shares the OPP table has set the clkname ? */2280 if (opp_table->clks)2281 return 0;2282 2283 opp_table->clks = kmalloc_array(count, sizeof(*opp_table->clks),2284 GFP_KERNEL);2285 if (!opp_table->clks)2286 return -ENOMEM;2287 2288 /* Find clks for the device */2289 for (i = 0; i < count; i++) {2290 clk = clk_get(dev, names[i]);2291 if (IS_ERR(clk)) {2292 ret = dev_err_probe(dev, PTR_ERR(clk),2293 "%s: Couldn't find clock with name: %s\n",2294 __func__, names[i]);2295 goto free_clks;2296 }2297 2298 opp_table->clks[i] = clk;2299 }2300 2301 opp_table->clk_count = count;2302 opp_table->config_clks = config_clks;2303 2304 /* Set generic single clk set here */2305 if (count == 1) {2306 if (!opp_table->config_clks)2307 opp_table->config_clks = _opp_config_clk_single;2308 2309 /*2310 * We could have just dropped the "clk" field and used "clks"2311 * everywhere. Instead we kept the "clk" field around for2312 * following reasons:2313 *2314 * - avoiding clks[0] everywhere else.2315 * - not running single clk helpers for multiple clk usecase by2316 * mistake.2317 *2318 * Since this is single-clk case, just update the clk pointer2319 * too.2320 */2321 opp_table->clk = opp_table->clks[0];2322 }2323 2324 return 0;2325 2326free_clks:2327 _put_clks(opp_table, i);2328 return ret;2329}2330 2331static void _opp_put_clknames(struct opp_table *opp_table)2332{2333 if (!opp_table->clks)2334 return;2335 2336 opp_table->config_clks = NULL;2337 opp_table->clk = ERR_PTR(-ENODEV);2338 2339 _put_clks(opp_table, opp_table->clk_count);2340}2341 2342/*2343 * This is useful to support platforms with multiple regulators per device.2344 *2345 * This must be called before any OPPs are initialized for the device.2346 */2347static int _opp_set_config_regulators_helper(struct opp_table *opp_table,2348 struct device *dev, config_regulators_t config_regulators)2349{2350 /* Another CPU that shares the OPP table has set the helper ? */2351 if (!opp_table->config_regulators)2352 opp_table->config_regulators = config_regulators;2353 2354 return 0;2355}2356 2357static void _opp_put_config_regulators_helper(struct opp_table *opp_table)2358{2359 if (opp_table->config_regulators)2360 opp_table->config_regulators = NULL;2361}2362 2363static void _opp_detach_genpd(struct opp_table *opp_table)2364{2365 int index;2366 2367 for (index = 0; index < opp_table->required_opp_count; index++) {2368 if (!opp_table->required_devs[index])2369 continue;2370 2371 dev_pm_domain_detach(opp_table->required_devs[index], false);2372 opp_table->required_devs[index] = NULL;2373 }2374}2375 2376/*2377 * Multiple generic power domains for a device are supported with the help of2378 * virtual genpd devices, which are created for each consumer device - genpd2379 * pair. These are the device structures which are attached to the power domain2380 * and are required by the OPP core to set the performance state of the genpd.2381 * The same API also works for the case where single genpd is available and so2382 * we don't need to support that separately.2383 *2384 * This helper will normally be called by the consumer driver of the device2385 * "dev", as only that has details of the genpd names.2386 *2387 * This helper needs to be called once with a list of all genpd to attach.2388 * Otherwise the original device structure will be used instead by the OPP core.2389 *2390 * The order of entries in the names array must match the order in which2391 * "required-opps" are added in DT.2392 */2393static int _opp_attach_genpd(struct opp_table *opp_table, struct device *dev,2394 const char * const *names, struct device ***virt_devs)2395{2396 struct device *virt_dev, *gdev;2397 struct opp_table *genpd_table;2398 int index = 0, ret = -EINVAL;2399 const char * const *name = names;2400 2401 if (!opp_table->required_devs) {2402 dev_err(dev, "Required OPPs not available, can't attach genpd\n");2403 return -EINVAL;2404 }2405 2406 /* Genpd core takes care of propagation to parent genpd */2407 if (opp_table->is_genpd) {2408 dev_err(dev, "%s: Operation not supported for genpds\n", __func__);2409 return -EOPNOTSUPP;2410 }2411 2412 /* Checking only the first one is enough ? */2413 if (opp_table->required_devs[0])2414 return 0;2415 2416 while (*name) {2417 if (index >= opp_table->required_opp_count) {2418 dev_err(dev, "Index can't be greater than required-opp-count - 1, %s (%d : %d)\n",2419 *name, opp_table->required_opp_count, index);2420 goto err;2421 }2422 2423 virt_dev = dev_pm_domain_attach_by_name(dev, *name);2424 if (IS_ERR_OR_NULL(virt_dev)) {2425 ret = virt_dev ? PTR_ERR(virt_dev) : -ENODEV;2426 dev_err(dev, "Couldn't attach to pm_domain: %d\n", ret);2427 goto err;2428 }2429 2430 /*2431 * The required_opp_tables parsing is not perfect, as the OPP2432 * core does the parsing solely based on the DT node pointers.2433 * The core sets the required_opp_tables entry to the first OPP2434 * table in the "opp_tables" list, that matches with the node2435 * pointer.2436 *2437 * If the target DT OPP table is used by multiple devices and2438 * they all create separate instances of 'struct opp_table' from2439 * it, then it is possible that the required_opp_tables entry2440 * may be set to the incorrect sibling device.2441 *2442 * Cross check it again and fix if required.2443 */2444 gdev = dev_to_genpd_dev(virt_dev);2445 if (IS_ERR(gdev)) {2446 ret = PTR_ERR(gdev);2447 goto err;2448 }2449 2450 genpd_table = _find_opp_table(gdev);2451 if (!IS_ERR(genpd_table)) {2452 if (genpd_table != opp_table->required_opp_tables[index]) {2453 dev_pm_opp_put_opp_table(opp_table->required_opp_tables[index]);2454 opp_table->required_opp_tables[index] = genpd_table;2455 } else {2456 dev_pm_opp_put_opp_table(genpd_table);2457 }2458 }2459 2460 opp_table->required_devs[index] = virt_dev;2461 index++;2462 name++;2463 }2464 2465 if (virt_devs)2466 *virt_devs = opp_table->required_devs;2467 2468 return 0;2469 2470err:2471 _opp_detach_genpd(opp_table);2472 return ret;2473 2474}2475 2476static int _opp_set_required_devs(struct opp_table *opp_table,2477 struct device *dev,2478 struct device **required_devs)2479{2480 int i;2481 2482 if (!opp_table->required_devs) {2483 dev_err(dev, "Required OPPs not available, can't set required devs\n");2484 return -EINVAL;2485 }2486 2487 /* Another device that shares the OPP table has set the required devs ? */2488 if (opp_table->required_devs[0])2489 return 0;2490 2491 for (i = 0; i < opp_table->required_opp_count; i++) {2492 /* Genpd core takes care of propagation to parent genpd */2493 if (required_devs[i] && opp_table->is_genpd &&2494 opp_table->required_opp_tables[i]->is_genpd) {2495 dev_err(dev, "%s: Operation not supported for genpds\n", __func__);2496 return -EOPNOTSUPP;2497 }2498 2499 opp_table->required_devs[i] = required_devs[i];2500 }2501 2502 return 0;2503}2504 2505static void _opp_put_required_devs(struct opp_table *opp_table)2506{2507 int i;2508 2509 for (i = 0; i < opp_table->required_opp_count; i++)2510 opp_table->required_devs[i] = NULL;2511}2512 2513static void _opp_clear_config(struct opp_config_data *data)2514{2515 if (data->flags & OPP_CONFIG_REQUIRED_DEVS)2516 _opp_put_required_devs(data->opp_table);2517 else if (data->flags & OPP_CONFIG_GENPD)2518 _opp_detach_genpd(data->opp_table);2519 2520 if (data->flags & OPP_CONFIG_REGULATOR)2521 _opp_put_regulators(data->opp_table);2522 if (data->flags & OPP_CONFIG_SUPPORTED_HW)2523 _opp_put_supported_hw(data->opp_table);2524 if (data->flags & OPP_CONFIG_REGULATOR_HELPER)2525 _opp_put_config_regulators_helper(data->opp_table);2526 if (data->flags & OPP_CONFIG_PROP_NAME)2527 _opp_put_prop_name(data->opp_table);2528 if (data->flags & OPP_CONFIG_CLK)2529 _opp_put_clknames(data->opp_table);2530 2531 dev_pm_opp_put_opp_table(data->opp_table);2532 kfree(data);2533}2534 2535/**2536 * dev_pm_opp_set_config() - Set OPP configuration for the device.2537 * @dev: Device for which configuration is being set.2538 * @config: OPP configuration.2539 *2540 * This allows all device OPP configurations to be performed at once.2541 *2542 * This must be called before any OPPs are initialized for the device. This may2543 * be called multiple times for the same OPP table, for example once for each2544 * CPU that share the same table. This must be balanced by the same number of2545 * calls to dev_pm_opp_clear_config() in order to free the OPP table properly.2546 *2547 * This returns a token to the caller, which must be passed to2548 * dev_pm_opp_clear_config() to free the resources later. The value of the2549 * returned token will be >= 1 for success and negative for errors. The minimum2550 * value of 1 is chosen here to make it easy for callers to manage the resource.2551 */2552int dev_pm_opp_set_config(struct device *dev, struct dev_pm_opp_config *config)2553{2554 struct opp_table *opp_table;2555 struct opp_config_data *data;2556 unsigned int id;2557 int ret;2558 2559 data = kmalloc(sizeof(*data), GFP_KERNEL);2560 if (!data)2561 return -ENOMEM;2562 2563 opp_table = _add_opp_table(dev, false);2564 if (IS_ERR(opp_table)) {2565 kfree(data);2566 return PTR_ERR(opp_table);2567 }2568 2569 data->opp_table = opp_table;2570 data->flags = 0;2571 2572 /* This should be called before OPPs are initialized */2573 if (WARN_ON(!list_empty(&opp_table->opp_list))) {2574 ret = -EBUSY;2575 goto err;2576 }2577 2578 /* Configure clocks */2579 if (config->clk_names) {2580 ret = _opp_set_clknames(opp_table, dev, config->clk_names,2581 config->config_clks);2582 if (ret)2583 goto err;2584 2585 data->flags |= OPP_CONFIG_CLK;2586 } else if (config->config_clks) {2587 /* Don't allow config callback without clocks */2588 ret = -EINVAL;2589 goto err;2590 }2591 2592 /* Configure property names */2593 if (config->prop_name) {2594 ret = _opp_set_prop_name(opp_table, config->prop_name);2595 if (ret)2596 goto err;2597 2598 data->flags |= OPP_CONFIG_PROP_NAME;2599 }2600 2601 /* Configure config_regulators helper */2602 if (config->config_regulators) {2603 ret = _opp_set_config_regulators_helper(opp_table, dev,2604 config->config_regulators);2605 if (ret)2606 goto err;2607 2608 data->flags |= OPP_CONFIG_REGULATOR_HELPER;2609 }2610 2611 /* Configure supported hardware */2612 if (config->supported_hw) {2613 ret = _opp_set_supported_hw(opp_table, config->supported_hw,2614 config->supported_hw_count);2615 if (ret)2616 goto err;2617 2618 data->flags |= OPP_CONFIG_SUPPORTED_HW;2619 }2620 2621 /* Configure supplies */2622 if (config->regulator_names) {2623 ret = _opp_set_regulators(opp_table, dev,2624 config->regulator_names);2625 if (ret)2626 goto err;2627 2628 data->flags |= OPP_CONFIG_REGULATOR;2629 }2630 2631 /* Attach genpds */2632 if (config->genpd_names) {2633 if (config->required_devs) {2634 ret = -EINVAL;2635 goto err;2636 }2637 2638 ret = _opp_attach_genpd(opp_table, dev, config->genpd_names,2639 config->virt_devs);2640 if (ret)2641 goto err;2642 2643 data->flags |= OPP_CONFIG_GENPD;2644 } else if (config->required_devs) {2645 ret = _opp_set_required_devs(opp_table, dev,2646 config->required_devs);2647 if (ret)2648 goto err;2649 2650 data->flags |= OPP_CONFIG_REQUIRED_DEVS;2651 }2652 2653 ret = xa_alloc(&opp_configs, &id, data, XA_LIMIT(1, INT_MAX),2654 GFP_KERNEL);2655 if (ret)2656 goto err;2657 2658 return id;2659 2660err:2661 _opp_clear_config(data);2662 return ret;2663}2664EXPORT_SYMBOL_GPL(dev_pm_opp_set_config);2665 2666/**2667 * dev_pm_opp_clear_config() - Releases resources blocked for OPP configuration.2668 * @token: The token returned by dev_pm_opp_set_config() previously.2669 *2670 * This allows all device OPP configurations to be cleared at once. This must be2671 * called once for each call made to dev_pm_opp_set_config(), in order to free2672 * the OPPs properly.2673 *2674 * Currently the first call itself ends up freeing all the OPP configurations,2675 * while the later ones only drop the OPP table reference. This works well for2676 * now as we would never want to use an half initialized OPP table and want to2677 * remove the configurations together.2678 */2679void dev_pm_opp_clear_config(int token)2680{2681 struct opp_config_data *data;2682 2683 /*2684 * This lets the callers call this unconditionally and keep their code2685 * simple.2686 */2687 if (unlikely(token <= 0))2688 return;2689 2690 data = xa_erase(&opp_configs, token);2691 if (WARN_ON(!data))2692 return;2693 2694 _opp_clear_config(data);2695}2696EXPORT_SYMBOL_GPL(dev_pm_opp_clear_config);2697 2698static void devm_pm_opp_config_release(void *token)2699{2700 dev_pm_opp_clear_config((unsigned long)token);2701}2702 2703/**2704 * devm_pm_opp_set_config() - Set OPP configuration for the device.2705 * @dev: Device for which configuration is being set.2706 * @config: OPP configuration.2707 *2708 * This allows all device OPP configurations to be performed at once.2709 * This is a resource-managed variant of dev_pm_opp_set_config().2710 *2711 * Return: 0 on success and errorno otherwise.2712 */2713int devm_pm_opp_set_config(struct device *dev, struct dev_pm_opp_config *config)2714{2715 int token = dev_pm_opp_set_config(dev, config);2716 2717 if (token < 0)2718 return token;2719 2720 return devm_add_action_or_reset(dev, devm_pm_opp_config_release,2721 (void *) ((unsigned long) token));2722}2723EXPORT_SYMBOL_GPL(devm_pm_opp_set_config);2724 2725/**2726 * dev_pm_opp_xlate_required_opp() - Find required OPP for @src_table OPP.2727 * @src_table: OPP table which has @dst_table as one of its required OPP table.2728 * @dst_table: Required OPP table of the @src_table.2729 * @src_opp: OPP from the @src_table.2730 *2731 * This function returns the OPP (present in @dst_table) pointed out by the2732 * "required-opps" property of the @src_opp (present in @src_table).2733 *2734 * The callers are required to call dev_pm_opp_put() for the returned OPP after2735 * use.2736 *2737 * Return: pointer to 'struct dev_pm_opp' on success and errorno otherwise.2738 */2739struct dev_pm_opp *dev_pm_opp_xlate_required_opp(struct opp_table *src_table,2740 struct opp_table *dst_table,2741 struct dev_pm_opp *src_opp)2742{2743 struct dev_pm_opp *opp, *dest_opp = ERR_PTR(-ENODEV);2744 int i;2745 2746 if (!src_table || !dst_table || !src_opp ||2747 !src_table->required_opp_tables)2748 return ERR_PTR(-EINVAL);2749 2750 /* required-opps not fully initialized yet */2751 if (lazy_linking_pending(src_table))2752 return ERR_PTR(-EBUSY);2753 2754 for (i = 0; i < src_table->required_opp_count; i++) {2755 if (src_table->required_opp_tables[i] == dst_table) {2756 mutex_lock(&src_table->lock);2757 2758 list_for_each_entry(opp, &src_table->opp_list, node) {2759 if (opp == src_opp) {2760 dest_opp = opp->required_opps[i];2761 dev_pm_opp_get(dest_opp);2762 break;2763 }2764 }2765 2766 mutex_unlock(&src_table->lock);2767 break;2768 }2769 }2770 2771 if (IS_ERR(dest_opp)) {2772 pr_err("%s: Couldn't find matching OPP (%p: %p)\n", __func__,2773 src_table, dst_table);2774 }2775 2776 return dest_opp;2777}2778EXPORT_SYMBOL_GPL(dev_pm_opp_xlate_required_opp);2779 2780/**2781 * dev_pm_opp_xlate_performance_state() - Find required OPP's pstate for src_table.2782 * @src_table: OPP table which has dst_table as one of its required OPP table.2783 * @dst_table: Required OPP table of the src_table.2784 * @pstate: Current performance state of the src_table.2785 *2786 * This Returns pstate of the OPP (present in @dst_table) pointed out by the2787 * "required-opps" property of the OPP (present in @src_table) which has2788 * performance state set to @pstate.2789 *2790 * Return: Zero or positive performance state on success, otherwise negative2791 * value on errors.2792 */2793int dev_pm_opp_xlate_performance_state(struct opp_table *src_table,2794 struct opp_table *dst_table,2795 unsigned int pstate)2796{2797 struct dev_pm_opp *opp;2798 int dest_pstate = -EINVAL;2799 int i;2800 2801 /*2802 * Normally the src_table will have the "required_opps" property set to2803 * point to one of the OPPs in the dst_table, but in some cases the2804 * genpd and its master have one to one mapping of performance states2805 * and so none of them have the "required-opps" property set. Return the2806 * pstate of the src_table as it is in such cases.2807 */2808 if (!src_table || !src_table->required_opp_count)2809 return pstate;2810 2811 /* Both OPP tables must belong to genpds */2812 if (unlikely(!src_table->is_genpd || !dst_table->is_genpd)) {2813 pr_err("%s: Performance state is only valid for genpds.\n", __func__);2814 return -EINVAL;2815 }2816 2817 /* required-opps not fully initialized yet */2818 if (lazy_linking_pending(src_table))2819 return -EBUSY;2820 2821 for (i = 0; i < src_table->required_opp_count; i++) {2822 if (src_table->required_opp_tables[i]->np == dst_table->np)2823 break;2824 }2825 2826 if (unlikely(i == src_table->required_opp_count)) {2827 pr_err("%s: Couldn't find matching OPP table (%p: %p)\n",2828 __func__, src_table, dst_table);2829 return -EINVAL;2830 }2831 2832 mutex_lock(&src_table->lock);2833 2834 list_for_each_entry(opp, &src_table->opp_list, node) {2835 if (opp->level == pstate) {2836 dest_pstate = opp->required_opps[i]->level;2837 goto unlock;2838 }2839 }2840 2841 pr_err("%s: Couldn't find matching OPP (%p: %p)\n", __func__, src_table,2842 dst_table);2843 2844unlock:2845 mutex_unlock(&src_table->lock);2846 2847 return dest_pstate;2848}2849 2850/**2851 * dev_pm_opp_add_dynamic() - Add an OPP table from a table definitions2852 * @dev: The device for which we do this operation2853 * @data: The OPP data for the OPP to add2854 *2855 * This function adds an opp definition to the opp table and returns status.2856 * The opp is made available by default and it can be controlled using2857 * dev_pm_opp_enable/disable functions.2858 *2859 * Return:2860 * 0 On success OR2861 * Duplicate OPPs (both freq and volt are same) and opp->available2862 * -EEXIST Freq are same and volt are different OR2863 * Duplicate OPPs (both freq and volt are same) and !opp->available2864 * -ENOMEM Memory allocation failure2865 */2866int dev_pm_opp_add_dynamic(struct device *dev, struct dev_pm_opp_data *data)2867{2868 struct opp_table *opp_table;2869 int ret;2870 2871 opp_table = _add_opp_table(dev, true);2872 if (IS_ERR(opp_table))2873 return PTR_ERR(opp_table);2874 2875 /* Fix regulator count for dynamic OPPs */2876 opp_table->regulator_count = 1;2877 2878 ret = _opp_add_v1(opp_table, dev, data, true);2879 if (ret)2880 dev_pm_opp_put_opp_table(opp_table);2881 2882 return ret;2883}2884EXPORT_SYMBOL_GPL(dev_pm_opp_add_dynamic);2885 2886/**2887 * _opp_set_availability() - helper to set the availability of an opp2888 * @dev: device for which we do this operation2889 * @freq: OPP frequency to modify availability2890 * @availability_req: availability status requested for this opp2891 *2892 * Set the availability of an OPP, opp_{enable,disable} share a common logic2893 * which is isolated here.2894 *2895 * Return: -EINVAL for bad pointers, -ENOMEM if no memory available for the2896 * copy operation, returns 0 if no modification was done OR modification was2897 * successful.2898 */2899static int _opp_set_availability(struct device *dev, unsigned long freq,2900 bool availability_req)2901{2902 struct opp_table *opp_table;2903 struct dev_pm_opp *tmp_opp, *opp = ERR_PTR(-ENODEV);2904 int r = 0;2905 2906 /* Find the opp_table */2907 opp_table = _find_opp_table(dev);2908 if (IS_ERR(opp_table)) {2909 r = PTR_ERR(opp_table);2910 dev_warn(dev, "%s: Device OPP not found (%d)\n", __func__, r);2911 return r;2912 }2913 2914 if (!assert_single_clk(opp_table)) {2915 r = -EINVAL;2916 goto put_table;2917 }2918 2919 mutex_lock(&opp_table->lock);2920 2921 /* Do we have the frequency? */2922 list_for_each_entry(tmp_opp, &opp_table->opp_list, node) {2923 if (tmp_opp->rates[0] == freq) {2924 opp = tmp_opp;2925 break;2926 }2927 }2928 2929 if (IS_ERR(opp)) {2930 r = PTR_ERR(opp);2931 goto unlock;2932 }2933 2934 /* Is update really needed? */2935 if (opp->available == availability_req)2936 goto unlock;2937 2938 opp->available = availability_req;2939 2940 dev_pm_opp_get(opp);2941 mutex_unlock(&opp_table->lock);2942 2943 /* Notify the change of the OPP availability */2944 if (availability_req)2945 blocking_notifier_call_chain(&opp_table->head, OPP_EVENT_ENABLE,2946 opp);2947 else2948 blocking_notifier_call_chain(&opp_table->head,2949 OPP_EVENT_DISABLE, opp);2950 2951 dev_pm_opp_put(opp);2952 goto put_table;2953 2954unlock:2955 mutex_unlock(&opp_table->lock);2956put_table:2957 dev_pm_opp_put_opp_table(opp_table);2958 return r;2959}2960 2961/**2962 * dev_pm_opp_adjust_voltage() - helper to change the voltage of an OPP2963 * @dev: device for which we do this operation2964 * @freq: OPP frequency to adjust voltage of2965 * @u_volt: new OPP target voltage2966 * @u_volt_min: new OPP min voltage2967 * @u_volt_max: new OPP max voltage2968 *2969 * Return: -EINVAL for bad pointers, -ENOMEM if no memory available for the2970 * copy operation, returns 0 if no modifcation was done OR modification was2971 * successful.2972 */2973int dev_pm_opp_adjust_voltage(struct device *dev, unsigned long freq,2974 unsigned long u_volt, unsigned long u_volt_min,2975 unsigned long u_volt_max)2976 2977{2978 struct opp_table *opp_table;2979 struct dev_pm_opp *tmp_opp, *opp = ERR_PTR(-ENODEV);2980 int r = 0;2981 2982 /* Find the opp_table */2983 opp_table = _find_opp_table(dev);2984 if (IS_ERR(opp_table)) {2985 r = PTR_ERR(opp_table);2986 dev_warn(dev, "%s: Device OPP not found (%d)\n", __func__, r);2987 return r;2988 }2989 2990 if (!assert_single_clk(opp_table)) {2991 r = -EINVAL;2992 goto put_table;2993 }2994 2995 mutex_lock(&opp_table->lock);2996 2997 /* Do we have the frequency? */2998 list_for_each_entry(tmp_opp, &opp_table->opp_list, node) {2999 if (tmp_opp->rates[0] == freq) {3000 opp = tmp_opp;3001 break;3002 }3003 }3004 3005 if (IS_ERR(opp)) {3006 r = PTR_ERR(opp);3007 goto adjust_unlock;3008 }3009 3010 /* Is update really needed? */3011 if (opp->supplies->u_volt == u_volt)3012 goto adjust_unlock;3013 3014 opp->supplies->u_volt = u_volt;3015 opp->supplies->u_volt_min = u_volt_min;3016 opp->supplies->u_volt_max = u_volt_max;3017 3018 dev_pm_opp_get(opp);3019 mutex_unlock(&opp_table->lock);3020 3021 /* Notify the voltage change of the OPP */3022 blocking_notifier_call_chain(&opp_table->head, OPP_EVENT_ADJUST_VOLTAGE,3023 opp);3024 3025 dev_pm_opp_put(opp);3026 goto put_table;3027 3028adjust_unlock:3029 mutex_unlock(&opp_table->lock);3030put_table:3031 dev_pm_opp_put_opp_table(opp_table);3032 return r;3033}3034EXPORT_SYMBOL_GPL(dev_pm_opp_adjust_voltage);3035 3036/**3037 * dev_pm_opp_sync_regulators() - Sync state of voltage regulators3038 * @dev: device for which we do this operation3039 *3040 * Sync voltage state of the OPP table regulators.3041 *3042 * Return: 0 on success or a negative error value.3043 */3044int dev_pm_opp_sync_regulators(struct device *dev)3045{3046 struct opp_table *opp_table;3047 struct regulator *reg;3048 int i, ret = 0;3049 3050 /* Device may not have OPP table */3051 opp_table = _find_opp_table(dev);3052 if (IS_ERR(opp_table))3053 return 0;3054 3055 /* Regulator may not be required for the device */3056 if (unlikely(!opp_table->regulators))3057 goto put_table;3058 3059 /* Nothing to sync if voltage wasn't changed */3060 if (!opp_table->enabled)3061 goto put_table;3062 3063 for (i = 0; i < opp_table->regulator_count; i++) {3064 reg = opp_table->regulators[i];3065 ret = regulator_sync_voltage(reg);3066 if (ret)3067 break;3068 }3069put_table:3070 /* Drop reference taken by _find_opp_table() */3071 dev_pm_opp_put_opp_table(opp_table);3072 3073 return ret;3074}3075EXPORT_SYMBOL_GPL(dev_pm_opp_sync_regulators);3076 3077/**3078 * dev_pm_opp_enable() - Enable a specific OPP3079 * @dev: device for which we do this operation3080 * @freq: OPP frequency to enable3081 *3082 * Enables a provided opp. If the operation is valid, this returns 0, else the3083 * corresponding error value. It is meant to be used for users an OPP available3084 * after being temporarily made unavailable with dev_pm_opp_disable.3085 *3086 * Return: -EINVAL for bad pointers, -ENOMEM if no memory available for the3087 * copy operation, returns 0 if no modification was done OR modification was3088 * successful.3089 */3090int dev_pm_opp_enable(struct device *dev, unsigned long freq)3091{3092 return _opp_set_availability(dev, freq, true);3093}3094EXPORT_SYMBOL_GPL(dev_pm_opp_enable);3095 3096/**3097 * dev_pm_opp_disable() - Disable a specific OPP3098 * @dev: device for which we do this operation3099 * @freq: OPP frequency to disable3100 *3101 * Disables a provided opp. If the operation is valid, this returns3102 * 0, else the corresponding error value. It is meant to be a temporary3103 * control by users to make this OPP not available until the circumstances are3104 * right to make it available again (with a call to dev_pm_opp_enable).3105 *3106 * Return: -EINVAL for bad pointers, -ENOMEM if no memory available for the3107 * copy operation, returns 0 if no modification was done OR modification was3108 * successful.3109 */3110int dev_pm_opp_disable(struct device *dev, unsigned long freq)3111{3112 return _opp_set_availability(dev, freq, false);3113}3114EXPORT_SYMBOL_GPL(dev_pm_opp_disable);3115 3116/**3117 * dev_pm_opp_register_notifier() - Register OPP notifier for the device3118 * @dev: Device for which notifier needs to be registered3119 * @nb: Notifier block to be registered3120 *3121 * Return: 0 on success or a negative error value.3122 */3123int dev_pm_opp_register_notifier(struct device *dev, struct notifier_block *nb)3124{3125 struct opp_table *opp_table;3126 int ret;3127 3128 opp_table = _find_opp_table(dev);3129 if (IS_ERR(opp_table))3130 return PTR_ERR(opp_table);3131 3132 ret = blocking_notifier_chain_register(&opp_table->head, nb);3133 3134 dev_pm_opp_put_opp_table(opp_table);3135 3136 return ret;3137}3138EXPORT_SYMBOL(dev_pm_opp_register_notifier);3139 3140/**3141 * dev_pm_opp_unregister_notifier() - Unregister OPP notifier for the device3142 * @dev: Device for which notifier needs to be unregistered3143 * @nb: Notifier block to be unregistered3144 *3145 * Return: 0 on success or a negative error value.3146 */3147int dev_pm_opp_unregister_notifier(struct device *dev,3148 struct notifier_block *nb)3149{3150 struct opp_table *opp_table;3151 int ret;3152 3153 opp_table = _find_opp_table(dev);3154 if (IS_ERR(opp_table))3155 return PTR_ERR(opp_table);3156 3157 ret = blocking_notifier_chain_unregister(&opp_table->head, nb);3158 3159 dev_pm_opp_put_opp_table(opp_table);3160 3161 return ret;3162}3163EXPORT_SYMBOL(dev_pm_opp_unregister_notifier);3164 3165/**3166 * dev_pm_opp_remove_table() - Free all OPPs associated with the device3167 * @dev: device pointer used to lookup OPP table.3168 *3169 * Free both OPPs created using static entries present in DT and the3170 * dynamically added entries.3171 */3172void dev_pm_opp_remove_table(struct device *dev)3173{3174 struct opp_table *opp_table;3175 3176 /* Check for existing table for 'dev' */3177 opp_table = _find_opp_table(dev);3178 if (IS_ERR(opp_table)) {3179 int error = PTR_ERR(opp_table);3180 3181 if (error != -ENODEV)3182 WARN(1, "%s: opp_table: %d\n",3183 IS_ERR_OR_NULL(dev) ?3184 "Invalid device" : dev_name(dev),3185 error);3186 return;3187 }3188 3189 /*3190 * Drop the extra reference only if the OPP table was successfully added3191 * with dev_pm_opp_of_add_table() earlier.3192 **/3193 if (_opp_remove_all_static(opp_table))3194 dev_pm_opp_put_opp_table(opp_table);3195 3196 /* Drop reference taken by _find_opp_table() */3197 dev_pm_opp_put_opp_table(opp_table);3198}3199EXPORT_SYMBOL_GPL(dev_pm_opp_remove_table);3200