]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/blame - drivers/opp/core.c
opp: core: add regulators enable and disable
[mirror_ubuntu-jammy-kernel.git] / drivers / opp / core.c
CommitLineData
d2912cb1 1// SPDX-License-Identifier: GPL-2.0-only
e1f60b29
NM
2/*
3 * Generic OPP Interface
4 *
5 * Copyright (C) 2009-2010 Texas Instruments Incorporated.
6 * Nishanth Menon
7 * Romit Dasgupta
8 * Kevin Hilman
e1f60b29
NM
9 */
10
d6d2a528
VK
11#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
12
d54974c2 13#include <linux/clk.h>
e1f60b29
NM
14#include <linux/errno.h>
15#include <linux/err.h>
e1f60b29 16#include <linux/slab.h>
51990e82 17#include <linux/device.h>
80126ce7 18#include <linux/export.h>
009acd19 19#include <linux/pm_domain.h>
9f8ea969 20#include <linux/regulator/consumer.h>
e1f60b29 21
f59d3ee8 22#include "opp.h"
e1f60b29
NM
23
24/*
2c2709dc
VK
25 * The root of the list of all opp-tables. All opp_table structures branch off
26 * from here, with each opp_table containing the list of opps it supports in
e1f60b29
NM
27 * various states of availability.
28 */
f47b72a1 29LIST_HEAD(opp_tables);
e1f60b29 30/* Lock to allow exclusive modification to the device and opp lists */
2c2709dc 31DEFINE_MUTEX(opp_table_lock);
e1f60b29 32
2c2709dc
VK
33static struct opp_device *_find_opp_dev(const struct device *dev,
34 struct opp_table *opp_table)
06441658 35{
2c2709dc 36 struct opp_device *opp_dev;
06441658 37
2c2709dc
VK
38 list_for_each_entry(opp_dev, &opp_table->dev_list, node)
39 if (opp_dev->dev == dev)
40 return opp_dev;
06441658
VK
41
42 return NULL;
43}
44
6ac42397 45static struct opp_table *_find_opp_table_unlocked(struct device *dev)
5b650b38
VK
46{
47 struct opp_table *opp_table;
3d255699 48 bool found;
5b650b38
VK
49
50 list_for_each_entry(opp_table, &opp_tables, node) {
3d255699
VK
51 mutex_lock(&opp_table->lock);
52 found = !!_find_opp_dev(dev, opp_table);
53 mutex_unlock(&opp_table->lock);
54
55 if (found) {
5b650b38
VK
56 _get_opp_table_kref(opp_table);
57
58 return opp_table;
59 }
60 }
61
62 return ERR_PTR(-ENODEV);
63}
64
e1f60b29 65/**
2c2709dc
VK
66 * _find_opp_table() - find opp_table struct using device pointer
67 * @dev: device pointer used to lookup OPP table
e1f60b29 68 *
052c6f19 69 * Search OPP table for one containing matching device.
e1f60b29 70 *
2c2709dc 71 * Return: pointer to 'struct opp_table' if found, otherwise -ENODEV or
e1f60b29
NM
72 * -EINVAL based on type of error.
73 *
5b650b38 74 * The callers must call dev_pm_opp_put_opp_table() after the table is used.
e1f60b29 75 */
2c2709dc 76struct opp_table *_find_opp_table(struct device *dev)
e1f60b29 77{
2c2709dc 78 struct opp_table *opp_table;
e1f60b29 79
50a3cb04 80 if (IS_ERR_OR_NULL(dev)) {
e1f60b29
NM
81 pr_err("%s: Invalid parameters\n", __func__);
82 return ERR_PTR(-EINVAL);
83 }
84
5b650b38
VK
85 mutex_lock(&opp_table_lock);
86 opp_table = _find_opp_table_unlocked(dev);
87 mutex_unlock(&opp_table_lock);
e1f60b29 88
5b650b38 89 return opp_table;
e1f60b29
NM
90}
91
92/**
d6d00742 93 * dev_pm_opp_get_voltage() - Gets the voltage corresponding to an opp
e1f60b29
NM
94 * @opp: opp for which voltage has to be returned for
95 *
984f16c8 96 * Return: voltage in micro volt corresponding to the opp, else
e1f60b29
NM
97 * return 0
98 *
dfbe4678 99 * This is useful only for devices with single power supply.
e1f60b29 100 */
47d43ba7 101unsigned long dev_pm_opp_get_voltage(struct dev_pm_opp *opp)
e1f60b29 102{
052c6f19 103 if (IS_ERR_OR_NULL(opp)) {
e1f60b29 104 pr_err("%s: Invalid parameters\n", __func__);
052c6f19
VK
105 return 0;
106 }
e1f60b29 107
052c6f19 108 return opp->supplies[0].u_volt;
e1f60b29 109}
5d4879cd 110EXPORT_SYMBOL_GPL(dev_pm_opp_get_voltage);
e1f60b29
NM
111
112/**
5d4879cd 113 * dev_pm_opp_get_freq() - Gets the frequency corresponding to an available opp
e1f60b29
NM
114 * @opp: opp for which frequency has to be returned for
115 *
984f16c8 116 * Return: frequency in hertz corresponding to the opp, else
e1f60b29 117 * return 0
e1f60b29 118 */
47d43ba7 119unsigned long dev_pm_opp_get_freq(struct dev_pm_opp *opp)
e1f60b29 120{
052c6f19 121 if (IS_ERR_OR_NULL(opp) || !opp->available) {
e1f60b29 122 pr_err("%s: Invalid parameters\n", __func__);
052c6f19
VK
123 return 0;
124 }
e1f60b29 125
052c6f19 126 return opp->rate;
e1f60b29 127}
5d4879cd 128EXPORT_SYMBOL_GPL(dev_pm_opp_get_freq);
e1f60b29 129
5b93ac54
RN
130/**
131 * dev_pm_opp_get_level() - Gets the level corresponding to an available opp
132 * @opp: opp for which level value has to be returned for
133 *
134 * Return: level read from device tree corresponding to the opp, else
135 * return 0.
136 */
137unsigned int dev_pm_opp_get_level(struct dev_pm_opp *opp)
138{
139 if (IS_ERR_OR_NULL(opp) || !opp->available) {
140 pr_err("%s: Invalid parameters\n", __func__);
141 return 0;
142 }
143
144 return opp->level;
145}
146EXPORT_SYMBOL_GPL(dev_pm_opp_get_level);
147
19445b25
BZ
148/**
149 * dev_pm_opp_is_turbo() - Returns if opp is turbo OPP or not
150 * @opp: opp for which turbo mode is being verified
151 *
152 * Turbo OPPs are not for normal use, and can be enabled (under certain
153 * conditions) for short duration of times to finish high throughput work
154 * quickly. Running on them for longer times may overheat the chip.
155 *
156 * Return: true if opp is turbo opp, else false.
19445b25
BZ
157 */
158bool dev_pm_opp_is_turbo(struct dev_pm_opp *opp)
159{
052c6f19 160 if (IS_ERR_OR_NULL(opp) || !opp->available) {
19445b25
BZ
161 pr_err("%s: Invalid parameters\n", __func__);
162 return false;
163 }
164
052c6f19 165 return opp->turbo;
19445b25
BZ
166}
167EXPORT_SYMBOL_GPL(dev_pm_opp_is_turbo);
168
3ca9bb33
VK
169/**
170 * dev_pm_opp_get_max_clock_latency() - Get max clock latency in nanoseconds
171 * @dev: device for which we do this operation
172 *
173 * Return: This function returns the max clock latency in nanoseconds.
3ca9bb33
VK
174 */
175unsigned long dev_pm_opp_get_max_clock_latency(struct device *dev)
176{
2c2709dc 177 struct opp_table *opp_table;
3ca9bb33
VK
178 unsigned long clock_latency_ns;
179
2c2709dc
VK
180 opp_table = _find_opp_table(dev);
181 if (IS_ERR(opp_table))
5b650b38
VK
182 return 0;
183
184 clock_latency_ns = opp_table->clock_latency_ns_max;
185
186 dev_pm_opp_put_opp_table(opp_table);
3ca9bb33 187
3ca9bb33
VK
188 return clock_latency_ns;
189}
190EXPORT_SYMBOL_GPL(dev_pm_opp_get_max_clock_latency);
191
655c9df9
VK
192/**
193 * dev_pm_opp_get_max_volt_latency() - Get max voltage latency in nanoseconds
194 * @dev: device for which we do this operation
195 *
196 * Return: This function returns the max voltage latency in nanoseconds.
655c9df9
VK
197 */
198unsigned long dev_pm_opp_get_max_volt_latency(struct device *dev)
199{
2c2709dc 200 struct opp_table *opp_table;
655c9df9 201 struct dev_pm_opp *opp;
478256bd 202 struct regulator *reg;
655c9df9 203 unsigned long latency_ns = 0;
dfbe4678
VK
204 int ret, i, count;
205 struct {
206 unsigned long min;
207 unsigned long max;
208 } *uV;
209
cdd3e614
VK
210 opp_table = _find_opp_table(dev);
211 if (IS_ERR(opp_table))
212 return 0;
213
dfbe4678 214 /* Regulator may not be required for the device */
90e3577b 215 if (!opp_table->regulators)
cdd3e614 216 goto put_opp_table;
dfbe4678 217
90e3577b
VK
218 count = opp_table->regulator_count;
219
dfbe4678
VK
220 uV = kmalloc_array(count, sizeof(*uV), GFP_KERNEL);
221 if (!uV)
478256bd 222 goto put_opp_table;
655c9df9 223
052c6f19
VK
224 mutex_lock(&opp_table->lock);
225
dfbe4678
VK
226 for (i = 0; i < count; i++) {
227 uV[i].min = ~0;
228 uV[i].max = 0;
655c9df9 229
052c6f19 230 list_for_each_entry(opp, &opp_table->opp_list, node) {
dfbe4678
VK
231 if (!opp->available)
232 continue;
233
234 if (opp->supplies[i].u_volt_min < uV[i].min)
235 uV[i].min = opp->supplies[i].u_volt_min;
236 if (opp->supplies[i].u_volt_max > uV[i].max)
237 uV[i].max = opp->supplies[i].u_volt_max;
238 }
655c9df9
VK
239 }
240
052c6f19 241 mutex_unlock(&opp_table->lock);
655c9df9
VK
242
243 /*
2c2709dc 244 * The caller needs to ensure that opp_table (and hence the regulator)
655c9df9
VK
245 * isn't freed, while we are executing this routine.
246 */
8cc31116 247 for (i = 0; i < count; i++) {
478256bd 248 reg = opp_table->regulators[i];
dfbe4678
VK
249 ret = regulator_set_voltage_time(reg, uV[i].min, uV[i].max);
250 if (ret > 0)
251 latency_ns += ret * 1000;
252 }
253
dfbe4678 254 kfree(uV);
cdd3e614
VK
255put_opp_table:
256 dev_pm_opp_put_opp_table(opp_table);
655c9df9
VK
257
258 return latency_ns;
259}
260EXPORT_SYMBOL_GPL(dev_pm_opp_get_max_volt_latency);
261
21743447
VK
262/**
263 * dev_pm_opp_get_max_transition_latency() - Get max transition latency in
264 * nanoseconds
265 * @dev: device for which we do this operation
266 *
267 * Return: This function returns the max transition latency, in nanoseconds, to
268 * switch from one OPP to other.
21743447
VK
269 */
270unsigned long dev_pm_opp_get_max_transition_latency(struct device *dev)
271{
272 return dev_pm_opp_get_max_volt_latency(dev) +
273 dev_pm_opp_get_max_clock_latency(dev);
274}
275EXPORT_SYMBOL_GPL(dev_pm_opp_get_max_transition_latency);
276
4eafbd15 277/**
3aa26a3b 278 * dev_pm_opp_get_suspend_opp_freq() - Get frequency of suspend opp in Hz
4eafbd15
BZ
279 * @dev: device for which we do this operation
280 *
3aa26a3b
VK
281 * Return: This function returns the frequency of the OPP marked as suspend_opp
282 * if one is available, else returns 0;
4eafbd15 283 */
3aa26a3b 284unsigned long dev_pm_opp_get_suspend_opp_freq(struct device *dev)
4eafbd15 285{
2c2709dc 286 struct opp_table *opp_table;
3aa26a3b 287 unsigned long freq = 0;
4eafbd15 288
2c2709dc 289 opp_table = _find_opp_table(dev);
5b650b38
VK
290 if (IS_ERR(opp_table))
291 return 0;
3aa26a3b 292
5b650b38
VK
293 if (opp_table->suspend_opp && opp_table->suspend_opp->available)
294 freq = dev_pm_opp_get_freq(opp_table->suspend_opp);
295
296 dev_pm_opp_put_opp_table(opp_table);
4eafbd15 297
3aa26a3b 298 return freq;
4eafbd15 299}
3aa26a3b 300EXPORT_SYMBOL_GPL(dev_pm_opp_get_suspend_opp_freq);
4eafbd15 301
a1e8c136
VK
302int _get_opp_count(struct opp_table *opp_table)
303{
304 struct dev_pm_opp *opp;
305 int count = 0;
306
307 mutex_lock(&opp_table->lock);
308
309 list_for_each_entry(opp, &opp_table->opp_list, node) {
310 if (opp->available)
311 count++;
312 }
313
314 mutex_unlock(&opp_table->lock);
315
316 return count;
317}
318
e1f60b29 319/**
2c2709dc 320 * dev_pm_opp_get_opp_count() - Get number of opps available in the opp table
e1f60b29
NM
321 * @dev: device for which we do this operation
322 *
984f16c8 323 * Return: This function returns the number of available opps if there are any,
e1f60b29 324 * else returns 0 if none or the corresponding error value.
e1f60b29 325 */
5d4879cd 326int dev_pm_opp_get_opp_count(struct device *dev)
e1f60b29 327{
2c2709dc 328 struct opp_table *opp_table;
a1e8c136 329 int count;
e1f60b29 330
2c2709dc
VK
331 opp_table = _find_opp_table(dev);
332 if (IS_ERR(opp_table)) {
333 count = PTR_ERR(opp_table);
035ed072 334 dev_dbg(dev, "%s: OPP table not found (%d)\n",
b4718c02 335 __func__, count);
09f662f9 336 return count;
e1f60b29
NM
337 }
338
a1e8c136 339 count = _get_opp_count(opp_table);
5b650b38
VK
340 dev_pm_opp_put_opp_table(opp_table);
341
e1f60b29
NM
342 return count;
343}
5d4879cd 344EXPORT_SYMBOL_GPL(dev_pm_opp_get_opp_count);
e1f60b29
NM
345
346/**
5d4879cd 347 * dev_pm_opp_find_freq_exact() - search for an exact frequency
e1f60b29
NM
348 * @dev: device for which we do this operation
349 * @freq: frequency to search for
7ae49618 350 * @available: true/false - match for available opp
e1f60b29 351 *
2c2709dc 352 * Return: Searches for exact match in the opp table and returns pointer to the
984f16c8
NM
353 * matching opp if found, else returns ERR_PTR in case of error and should
354 * be handled using IS_ERR. Error return values can be:
0779726c
NM
355 * EINVAL: for bad pointer
356 * ERANGE: no match found for search
357 * ENODEV: if device not found in list of registered devices
e1f60b29
NM
358 *
359 * Note: available is a modifier for the search. if available=true, then the
360 * match is for exact matching frequency and is available in the stored OPP
361 * table. if false, the match is for exact frequency which is not available.
362 *
363 * This provides a mechanism to enable an opp which is not available currently
364 * or the opposite as well.
365 *
8a31d9d9
VK
366 * The callers are required to call dev_pm_opp_put() for the returned OPP after
367 * use.
e1f60b29 368 */
47d43ba7
NM
369struct dev_pm_opp *dev_pm_opp_find_freq_exact(struct device *dev,
370 unsigned long freq,
371 bool available)
e1f60b29 372{
2c2709dc 373 struct opp_table *opp_table;
47d43ba7 374 struct dev_pm_opp *temp_opp, *opp = ERR_PTR(-ERANGE);
e1f60b29 375
2c2709dc
VK
376 opp_table = _find_opp_table(dev);
377 if (IS_ERR(opp_table)) {
378 int r = PTR_ERR(opp_table);
379
380 dev_err(dev, "%s: OPP table not found (%d)\n", __func__, r);
e1f60b29
NM
381 return ERR_PTR(r);
382 }
383
052c6f19 384 mutex_lock(&opp_table->lock);
5b650b38 385
052c6f19 386 list_for_each_entry(temp_opp, &opp_table->opp_list, node) {
e1f60b29
NM
387 if (temp_opp->available == available &&
388 temp_opp->rate == freq) {
389 opp = temp_opp;
8a31d9d9
VK
390
391 /* Increment the reference count of OPP */
392 dev_pm_opp_get(opp);
e1f60b29
NM
393 break;
394 }
395 }
396
052c6f19 397 mutex_unlock(&opp_table->lock);
5b650b38 398 dev_pm_opp_put_opp_table(opp_table);
8a31d9d9 399
e1f60b29
NM
400 return opp;
401}
5d4879cd 402EXPORT_SYMBOL_GPL(dev_pm_opp_find_freq_exact);
e1f60b29 403
71419d84
NC
404/**
405 * dev_pm_opp_find_level_exact() - search for an exact level
406 * @dev: device for which we do this operation
407 * @level: level to search for
408 *
409 * Return: Searches for exact match in the opp table and returns pointer to the
410 * matching opp if found, else returns ERR_PTR in case of error and should
411 * be handled using IS_ERR. Error return values can be:
412 * EINVAL: for bad pointer
413 * ERANGE: no match found for search
414 * ENODEV: if device not found in list of registered devices
415 *
416 * The callers are required to call dev_pm_opp_put() for the returned OPP after
417 * use.
418 */
419struct dev_pm_opp *dev_pm_opp_find_level_exact(struct device *dev,
420 unsigned int level)
421{
422 struct opp_table *opp_table;
423 struct dev_pm_opp *temp_opp, *opp = ERR_PTR(-ERANGE);
424
425 opp_table = _find_opp_table(dev);
426 if (IS_ERR(opp_table)) {
427 int r = PTR_ERR(opp_table);
428
429 dev_err(dev, "%s: OPP table not found (%d)\n", __func__, r);
430 return ERR_PTR(r);
431 }
432
433 mutex_lock(&opp_table->lock);
434
435 list_for_each_entry(temp_opp, &opp_table->opp_list, node) {
436 if (temp_opp->level == level) {
437 opp = temp_opp;
438
439 /* Increment the reference count of OPP */
440 dev_pm_opp_get(opp);
441 break;
442 }
443 }
444
445 mutex_unlock(&opp_table->lock);
446 dev_pm_opp_put_opp_table(opp_table);
447
448 return opp;
449}
450EXPORT_SYMBOL_GPL(dev_pm_opp_find_level_exact);
451
067b7ce0
JZ
452static noinline struct dev_pm_opp *_find_freq_ceil(struct opp_table *opp_table,
453 unsigned long *freq)
454{
455 struct dev_pm_opp *temp_opp, *opp = ERR_PTR(-ERANGE);
456
052c6f19
VK
457 mutex_lock(&opp_table->lock);
458
459 list_for_each_entry(temp_opp, &opp_table->opp_list, node) {
067b7ce0
JZ
460 if (temp_opp->available && temp_opp->rate >= *freq) {
461 opp = temp_opp;
462 *freq = opp->rate;
8a31d9d9
VK
463
464 /* Increment the reference count of OPP */
465 dev_pm_opp_get(opp);
067b7ce0
JZ
466 break;
467 }
468 }
469
052c6f19
VK
470 mutex_unlock(&opp_table->lock);
471
067b7ce0
JZ
472 return opp;
473}
474
e1f60b29 475/**
5d4879cd 476 * dev_pm_opp_find_freq_ceil() - Search for an rounded ceil freq
e1f60b29
NM
477 * @dev: device for which we do this operation
478 * @freq: Start frequency
479 *
480 * Search for the matching ceil *available* OPP from a starting freq
481 * for a device.
482 *
984f16c8 483 * Return: matching *opp and refreshes *freq accordingly, else returns
0779726c
NM
484 * ERR_PTR in case of error and should be handled using IS_ERR. Error return
485 * values can be:
486 * EINVAL: for bad pointer
487 * ERANGE: no match found for search
488 * ENODEV: if device not found in list of registered devices
e1f60b29 489 *
8a31d9d9
VK
490 * The callers are required to call dev_pm_opp_put() for the returned OPP after
491 * use.
e1f60b29 492 */
47d43ba7
NM
493struct dev_pm_opp *dev_pm_opp_find_freq_ceil(struct device *dev,
494 unsigned long *freq)
e1f60b29 495{
2c2709dc 496 struct opp_table *opp_table;
8a31d9d9 497 struct dev_pm_opp *opp;
b02ded24 498
e1f60b29
NM
499 if (!dev || !freq) {
500 dev_err(dev, "%s: Invalid argument freq=%p\n", __func__, freq);
501 return ERR_PTR(-EINVAL);
502 }
503
2c2709dc 504 opp_table = _find_opp_table(dev);
5b650b38 505 if (IS_ERR(opp_table))
2c2709dc 506 return ERR_CAST(opp_table);
5b650b38 507
8a31d9d9 508 opp = _find_freq_ceil(opp_table, freq);
e1f60b29 509
5b650b38 510 dev_pm_opp_put_opp_table(opp_table);
8a31d9d9
VK
511
512 return opp;
e1f60b29 513}
5d4879cd 514EXPORT_SYMBOL_GPL(dev_pm_opp_find_freq_ceil);
e1f60b29
NM
515
516/**
5d4879cd 517 * dev_pm_opp_find_freq_floor() - Search for a rounded floor freq
e1f60b29
NM
518 * @dev: device for which we do this operation
519 * @freq: Start frequency
520 *
521 * Search for the matching floor *available* OPP from a starting freq
522 * for a device.
523 *
984f16c8 524 * Return: matching *opp and refreshes *freq accordingly, else returns
0779726c
NM
525 * ERR_PTR in case of error and should be handled using IS_ERR. Error return
526 * values can be:
527 * EINVAL: for bad pointer
528 * ERANGE: no match found for search
529 * ENODEV: if device not found in list of registered devices
e1f60b29 530 *
8a31d9d9
VK
531 * The callers are required to call dev_pm_opp_put() for the returned OPP after
532 * use.
e1f60b29 533 */
47d43ba7
NM
534struct dev_pm_opp *dev_pm_opp_find_freq_floor(struct device *dev,
535 unsigned long *freq)
e1f60b29 536{
2c2709dc 537 struct opp_table *opp_table;
47d43ba7 538 struct dev_pm_opp *temp_opp, *opp = ERR_PTR(-ERANGE);
e1f60b29
NM
539
540 if (!dev || !freq) {
541 dev_err(dev, "%s: Invalid argument freq=%p\n", __func__, freq);
542 return ERR_PTR(-EINVAL);
543 }
544
2c2709dc 545 opp_table = _find_opp_table(dev);
5b650b38 546 if (IS_ERR(opp_table))
2c2709dc 547 return ERR_CAST(opp_table);
5b650b38 548
052c6f19 549 mutex_lock(&opp_table->lock);
e1f60b29 550
052c6f19 551 list_for_each_entry(temp_opp, &opp_table->opp_list, node) {
e1f60b29
NM
552 if (temp_opp->available) {
553 /* go to the next node, before choosing prev */
554 if (temp_opp->rate > *freq)
555 break;
556 else
557 opp = temp_opp;
558 }
559 }
8a31d9d9
VK
560
561 /* Increment the reference count of OPP */
562 if (!IS_ERR(opp))
563 dev_pm_opp_get(opp);
052c6f19 564 mutex_unlock(&opp_table->lock);
5b650b38 565 dev_pm_opp_put_opp_table(opp_table);
8a31d9d9 566
e1f60b29
NM
567 if (!IS_ERR(opp))
568 *freq = opp->rate;
569
570 return opp;
571}
5d4879cd 572EXPORT_SYMBOL_GPL(dev_pm_opp_find_freq_floor);
e1f60b29 573
2f36bde0
AC
574/**
575 * dev_pm_opp_find_freq_ceil_by_volt() - Find OPP with highest frequency for
576 * target voltage.
577 * @dev: Device for which we do this operation.
578 * @u_volt: Target voltage.
579 *
580 * Search for OPP with highest (ceil) frequency and has voltage <= u_volt.
581 *
582 * Return: matching *opp, else returns ERR_PTR in case of error which should be
583 * handled using IS_ERR.
584 *
585 * Error return values can be:
586 * EINVAL: bad parameters
587 *
588 * The callers are required to call dev_pm_opp_put() for the returned OPP after
589 * use.
590 */
591struct dev_pm_opp *dev_pm_opp_find_freq_ceil_by_volt(struct device *dev,
592 unsigned long u_volt)
593{
594 struct opp_table *opp_table;
595 struct dev_pm_opp *temp_opp, *opp = ERR_PTR(-ERANGE);
596
597 if (!dev || !u_volt) {
598 dev_err(dev, "%s: Invalid argument volt=%lu\n", __func__,
599 u_volt);
600 return ERR_PTR(-EINVAL);
601 }
602
603 opp_table = _find_opp_table(dev);
604 if (IS_ERR(opp_table))
605 return ERR_CAST(opp_table);
606
607 mutex_lock(&opp_table->lock);
608
609 list_for_each_entry(temp_opp, &opp_table->opp_list, node) {
610 if (temp_opp->available) {
611 if (temp_opp->supplies[0].u_volt > u_volt)
612 break;
613 opp = temp_opp;
614 }
615 }
616
617 /* Increment the reference count of OPP */
618 if (!IS_ERR(opp))
619 dev_pm_opp_get(opp);
620
621 mutex_unlock(&opp_table->lock);
622 dev_pm_opp_put_opp_table(opp_table);
623
624 return opp;
625}
626EXPORT_SYMBOL_GPL(dev_pm_opp_find_freq_ceil_by_volt);
627
6a0712f6 628static int _set_opp_voltage(struct device *dev, struct regulator *reg,
ce31781a 629 struct dev_pm_opp_supply *supply)
6a0712f6
VK
630{
631 int ret;
632
633 /* Regulator not available for device */
634 if (IS_ERR(reg)) {
635 dev_dbg(dev, "%s: regulator not available: %ld\n", __func__,
636 PTR_ERR(reg));
637 return 0;
638 }
639
ce31781a
VK
640 dev_dbg(dev, "%s: voltages (mV): %lu %lu %lu\n", __func__,
641 supply->u_volt_min, supply->u_volt, supply->u_volt_max);
6a0712f6 642
ce31781a
VK
643 ret = regulator_set_voltage_triplet(reg, supply->u_volt_min,
644 supply->u_volt, supply->u_volt_max);
6a0712f6
VK
645 if (ret)
646 dev_err(dev, "%s: failed to set voltage (%lu %lu %lu mV): %d\n",
ce31781a
VK
647 __func__, supply->u_volt_min, supply->u_volt,
648 supply->u_volt_max, ret);
6a0712f6
VK
649
650 return ret;
651}
652
285881b5
VK
653static inline int _generic_set_opp_clk_only(struct device *dev, struct clk *clk,
654 unsigned long freq)
94735585
VK
655{
656 int ret;
657
658 ret = clk_set_rate(clk, freq);
659 if (ret) {
660 dev_err(dev, "%s: failed to set clock rate: %d\n", __func__,
661 ret);
662 }
663
664 return ret;
665}
666
8d45719c 667static int _generic_set_opp_regulator(struct opp_table *opp_table,
c74b32fa
VK
668 struct device *dev,
669 unsigned long old_freq,
670 unsigned long freq,
671 struct dev_pm_opp_supply *old_supply,
672 struct dev_pm_opp_supply *new_supply)
94735585 673{
c74b32fa 674 struct regulator *reg = opp_table->regulators[0];
94735585
VK
675 int ret;
676
677 /* This function only supports single regulator per device */
c74b32fa 678 if (WARN_ON(opp_table->regulator_count > 1)) {
94735585
VK
679 dev_err(dev, "multiple regulators are not supported\n");
680 return -EINVAL;
681 }
682
683 /* Scaling up? Scale voltage before frequency */
c5c2a97b 684 if (freq >= old_freq) {
94735585
VK
685 ret = _set_opp_voltage(dev, reg, new_supply);
686 if (ret)
687 goto restore_voltage;
688 }
689
690 /* Change frequency */
285881b5 691 ret = _generic_set_opp_clk_only(dev, opp_table->clk, freq);
94735585
VK
692 if (ret)
693 goto restore_voltage;
694
695 /* Scaling down? Scale voltage after frequency */
696 if (freq < old_freq) {
697 ret = _set_opp_voltage(dev, reg, new_supply);
698 if (ret)
699 goto restore_freq;
700 }
701
8d45719c
KK
702 /*
703 * Enable the regulator after setting its voltages, otherwise it breaks
704 * some boot-enabled regulators.
705 */
706 if (unlikely(!opp_table->regulator_enabled)) {
707 ret = regulator_enable(reg);
708 if (ret < 0)
709 dev_warn(dev, "Failed to enable regulator: %d", ret);
710 else
711 opp_table->regulator_enabled = true;
712 }
713
94735585
VK
714 return 0;
715
716restore_freq:
285881b5 717 if (_generic_set_opp_clk_only(dev, opp_table->clk, old_freq))
94735585
VK
718 dev_err(dev, "%s: failed to restore old-freq (%lu Hz)\n",
719 __func__, old_freq);
720restore_voltage:
721 /* This shouldn't harm even if the voltages weren't updated earlier */
c74b32fa 722 if (old_supply)
94735585
VK
723 _set_opp_voltage(dev, reg, old_supply);
724
725 return ret;
726}
727
7e535993
VK
728static int _set_opp_custom(const struct opp_table *opp_table,
729 struct device *dev, unsigned long old_freq,
730 unsigned long freq,
731 struct dev_pm_opp_supply *old_supply,
732 struct dev_pm_opp_supply *new_supply)
733{
734 struct dev_pm_set_opp_data *data;
735 int size;
736
737 data = opp_table->set_opp_data;
738 data->regulators = opp_table->regulators;
739 data->regulator_count = opp_table->regulator_count;
740 data->clk = opp_table->clk;
741 data->dev = dev;
742
743 data->old_opp.rate = old_freq;
744 size = sizeof(*old_supply) * opp_table->regulator_count;
560d1bca 745 if (!old_supply)
7e535993
VK
746 memset(data->old_opp.supplies, 0, size);
747 else
748 memcpy(data->old_opp.supplies, old_supply, size);
749
750 data->new_opp.rate = freq;
751 memcpy(data->new_opp.supplies, new_supply, size);
752
753 return opp_table->set_opp(data);
754}
755
ca1b5d77
VK
756/* This is only called for PM domain for now */
757static int _set_required_opps(struct device *dev,
758 struct opp_table *opp_table,
759 struct dev_pm_opp *opp)
760{
761 struct opp_table **required_opp_tables = opp_table->required_opp_tables;
762 struct device **genpd_virt_devs = opp_table->genpd_virt_devs;
763 unsigned int pstate;
764 int i, ret = 0;
765
766 if (!required_opp_tables)
767 return 0;
768
769 /* Single genpd case */
770 if (!genpd_virt_devs) {
cd7ea582 771 pstate = likely(opp) ? opp->required_opps[0]->pstate : 0;
ca1b5d77
VK
772 ret = dev_pm_genpd_set_performance_state(dev, pstate);
773 if (ret) {
774 dev_err(dev, "Failed to set performance state of %s: %d (%d)\n",
775 dev_name(dev), pstate, ret);
776 }
777 return ret;
778 }
779
780 /* Multiple genpd case */
781
782 /*
783 * Acquire genpd_virt_dev_lock to make sure we don't use a genpd_dev
784 * after it is freed from another thread.
785 */
786 mutex_lock(&opp_table->genpd_virt_dev_lock);
787
788 for (i = 0; i < opp_table->required_opp_count; i++) {
cd7ea582 789 pstate = likely(opp) ? opp->required_opps[i]->pstate : 0;
ca1b5d77
VK
790
791 if (!genpd_virt_devs[i])
792 continue;
793
794 ret = dev_pm_genpd_set_performance_state(genpd_virt_devs[i], pstate);
795 if (ret) {
796 dev_err(dev, "Failed to set performance rate of %s: %d (%d)\n",
797 dev_name(genpd_virt_devs[i]), pstate, ret);
798 break;
799 }
800 }
801 mutex_unlock(&opp_table->genpd_virt_dev_lock);
802
803 return ret;
804}
805
6a0712f6
VK
806/**
807 * dev_pm_opp_set_rate() - Configure new OPP based on frequency
808 * @dev: device for which we do this operation
809 * @target_freq: frequency to achieve
810 *
b3e3759e
SB
811 * This configures the power-supplies to the levels specified by the OPP
812 * corresponding to the target_freq, and programs the clock to a value <=
813 * target_freq, as rounded by clk_round_rate(). Device wanting to run at fmax
814 * provided by the opp, should have already rounded to the target OPP's
815 * frequency.
6a0712f6
VK
816 */
817int dev_pm_opp_set_rate(struct device *dev, unsigned long target_freq)
818{
2c2709dc 819 struct opp_table *opp_table;
b3e3759e 820 unsigned long freq, old_freq, temp_freq;
6a0712f6 821 struct dev_pm_opp *old_opp, *opp;
6a0712f6 822 struct clk *clk;
fe2af402 823 int ret, i;
6a0712f6 824
052c6f19
VK
825 opp_table = _find_opp_table(dev);
826 if (IS_ERR(opp_table)) {
827 dev_err(dev, "%s: device opp doesn't exist\n", __func__);
828 return PTR_ERR(opp_table);
829 }
830
cd7ea582 831 if (unlikely(!target_freq)) {
b23dfa35
VK
832 /*
833 * Some drivers need to support cases where some platforms may
834 * have OPP table for the device, while others don't and
835 * opp_set_rate() just needs to behave like clk_set_rate().
836 */
837 if (!_get_opp_count(opp_table))
aca48b61 838 return 0;
b23dfa35 839
8d45719c 840 if (!opp_table->required_opp_tables && !opp_table->regulators) {
cd7ea582
RN
841 dev_err(dev, "target frequency can't be 0\n");
842 ret = -EINVAL;
b23dfa35 843 goto put_opp_table;
cd7ea582
RN
844 }
845
8d45719c
KK
846 if (opp_table->regulator_enabled) {
847 regulator_disable(opp_table->regulators[0]);
848 opp_table->regulator_enabled = false;
849 }
850
b23dfa35 851 ret = _set_required_opps(dev, opp_table, NULL);
cd7ea582
RN
852 goto put_opp_table;
853 }
854
052c6f19
VK
855 clk = opp_table->clk;
856 if (IS_ERR(clk)) {
857 dev_err(dev, "%s: No clock available for the device\n",
858 __func__);
859 ret = PTR_ERR(clk);
860 goto put_opp_table;
861 }
6a0712f6
VK
862
863 freq = clk_round_rate(clk, target_freq);
864 if ((long)freq <= 0)
865 freq = target_freq;
866
867 old_freq = clk_get_rate(clk);
868
869 /* Return early if nothing to do */
870 if (old_freq == freq) {
871 dev_dbg(dev, "%s: old/new frequencies (%lu Hz) are same, nothing to do\n",
872 __func__, freq);
052c6f19
VK
873 ret = 0;
874 goto put_opp_table;
6a0712f6
VK
875 }
876
aca48b61
RN
877 /*
878 * For IO devices which require an OPP on some platforms/SoCs
879 * while just needing to scale the clock on some others
880 * we look for empty OPP tables with just a clock handle and
881 * scale only the clk. This makes dev_pm_opp_set_rate()
882 * equivalent to a clk_set_rate()
883 */
884 if (!_get_opp_count(opp_table)) {
885 ret = _generic_set_opp_clk_only(dev, clk, freq);
886 goto put_opp_table;
887 }
888
b3e3759e
SB
889 temp_freq = old_freq;
890 old_opp = _find_freq_ceil(opp_table, &temp_freq);
4df27c91 891 if (IS_ERR(old_opp)) {
6a0712f6
VK
892 dev_err(dev, "%s: failed to find current OPP for freq %lu (%ld)\n",
893 __func__, old_freq, PTR_ERR(old_opp));
894 }
895
b3e3759e
SB
896 temp_freq = freq;
897 opp = _find_freq_ceil(opp_table, &temp_freq);
6a0712f6
VK
898 if (IS_ERR(opp)) {
899 ret = PTR_ERR(opp);
900 dev_err(dev, "%s: failed to find OPP for freq %lu (%d)\n",
901 __func__, freq, ret);
052c6f19 902 goto put_old_opp;
6a0712f6
VK
903 }
904
94735585
VK
905 dev_dbg(dev, "%s: switching OPP: %lu Hz --> %lu Hz\n", __func__,
906 old_freq, freq);
dfbe4678 907
ca1b5d77 908 /* Scaling up? Configure required OPPs before frequency */
faef080f 909 if (freq >= old_freq) {
ca1b5d77
VK
910 ret = _set_required_opps(dev, opp_table, opp);
911 if (ret)
912 goto put_opp;
913 }
914
7e535993
VK
915 if (opp_table->set_opp) {
916 ret = _set_opp_custom(opp_table, dev, old_freq, freq,
917 IS_ERR(old_opp) ? NULL : old_opp->supplies,
918 opp->supplies);
919 } else if (opp_table->regulators) {
c74b32fa
VK
920 ret = _generic_set_opp_regulator(opp_table, dev, old_freq, freq,
921 IS_ERR(old_opp) ? NULL : old_opp->supplies,
922 opp->supplies);
923 } else {
7e535993 924 /* Only frequency scaling */
285881b5 925 ret = _generic_set_opp_clk_only(dev, clk, freq);
ca1b5d77 926 }
c74b32fa 927
ca1b5d77
VK
928 /* Scaling down? Configure required OPPs after frequency */
929 if (!ret && freq < old_freq) {
930 ret = _set_required_opps(dev, opp_table, opp);
931 if (ret)
932 dev_err(dev, "Failed to set required opps: %d\n", ret);
dfbe4678
VK
933 }
934
fe2af402
GD
935 if (!ret && opp_table->paths) {
936 for (i = 0; i < opp_table->path_count; i++) {
937 ret = icc_set_bw(opp_table->paths[i],
938 opp->bandwidth[i].avg,
939 opp->bandwidth[i].peak);
940 if (ret)
941 dev_err(dev, "Failed to set bandwidth[%d]: %d\n",
942 i, ret);
943 }
944 }
945
ca1b5d77 946put_opp:
8a31d9d9 947 dev_pm_opp_put(opp);
052c6f19 948put_old_opp:
8a31d9d9
VK
949 if (!IS_ERR(old_opp))
950 dev_pm_opp_put(old_opp);
052c6f19 951put_opp_table:
5b650b38 952 dev_pm_opp_put_opp_table(opp_table);
052c6f19 953 return ret;
6a0712f6
VK
954}
955EXPORT_SYMBOL_GPL(dev_pm_opp_set_rate);
956
2c2709dc 957/* OPP-dev Helpers */
2c2709dc
VK
958static void _remove_opp_dev(struct opp_device *opp_dev,
959 struct opp_table *opp_table)
06441658 960{
2c2709dc
VK
961 opp_debug_unregister(opp_dev, opp_table);
962 list_del(&opp_dev->node);
052c6f19 963 kfree(opp_dev);
06441658
VK
964}
965
283d55e6
VK
966static struct opp_device *_add_opp_dev_unlocked(const struct device *dev,
967 struct opp_table *opp_table)
06441658 968{
2c2709dc 969 struct opp_device *opp_dev;
06441658 970
2c2709dc
VK
971 opp_dev = kzalloc(sizeof(*opp_dev), GFP_KERNEL);
972 if (!opp_dev)
06441658
VK
973 return NULL;
974
2c2709dc
VK
975 /* Initialize opp-dev */
976 opp_dev->dev = dev;
3d255699 977
052c6f19 978 list_add(&opp_dev->node, &opp_table->dev_list);
06441658 979
2c2709dc 980 /* Create debugfs entries for the opp_table */
a2dea4cb 981 opp_debug_register(opp_dev, opp_table);
283d55e6
VK
982
983 return opp_dev;
984}
985
986struct opp_device *_add_opp_dev(const struct device *dev,
987 struct opp_table *opp_table)
988{
989 struct opp_device *opp_dev;
990
991 mutex_lock(&opp_table->lock);
992 opp_dev = _add_opp_dev_unlocked(dev, opp_table);
3d255699 993 mutex_unlock(&opp_table->lock);
deaa5146 994
2c2709dc 995 return opp_dev;
06441658
VK
996}
997
eb7c8743 998static struct opp_table *_allocate_opp_table(struct device *dev, int index)
07cce74a 999{
2c2709dc
VK
1000 struct opp_table *opp_table;
1001 struct opp_device *opp_dev;
d54974c2 1002 int ret;
07cce74a
VK
1003
1004 /*
2c2709dc 1005 * Allocate a new OPP table. In the infrequent case where a new
07cce74a
VK
1006 * device is needed to be added, we pay this penalty.
1007 */
2c2709dc
VK
1008 opp_table = kzalloc(sizeof(*opp_table), GFP_KERNEL);
1009 if (!opp_table)
07cce74a
VK
1010 return NULL;
1011
3d255699 1012 mutex_init(&opp_table->lock);
4f018bc0 1013 mutex_init(&opp_table->genpd_virt_dev_lock);
2c2709dc 1014 INIT_LIST_HEAD(&opp_table->dev_list);
06441658 1015
46f48aca
VK
1016 /* Mark regulator count uninitialized */
1017 opp_table->regulator_count = -1;
1018
2c2709dc
VK
1019 opp_dev = _add_opp_dev(dev, opp_table);
1020 if (!opp_dev) {
1021 kfree(opp_table);
06441658
VK
1022 return NULL;
1023 }
1024
eb7c8743 1025 _of_init_opp_table(opp_table, dev, index);
50f8cfbd 1026
d54974c2 1027 /* Find clk for the device */
2c2709dc
VK
1028 opp_table->clk = clk_get(dev, NULL);
1029 if (IS_ERR(opp_table->clk)) {
1030 ret = PTR_ERR(opp_table->clk);
d54974c2
VK
1031 if (ret != -EPROBE_DEFER)
1032 dev_dbg(dev, "%s: Couldn't find clock: %d\n", __func__,
1033 ret);
1034 }
1035
6d3f922c
GD
1036 /* Find interconnect path(s) for the device */
1037 ret = dev_pm_opp_of_find_icc_paths(dev, opp_table);
1038 if (ret)
1039 dev_warn(dev, "%s: Error finding interconnect paths: %d\n",
1040 __func__, ret);
1041
052c6f19 1042 BLOCKING_INIT_NOTIFIER_HEAD(&opp_table->head);
2c2709dc 1043 INIT_LIST_HEAD(&opp_table->opp_list);
f067a982 1044 kref_init(&opp_table->kref);
07cce74a 1045
2c2709dc 1046 /* Secure the device table modification */
052c6f19 1047 list_add(&opp_table->node, &opp_tables);
2c2709dc 1048 return opp_table;
07cce74a
VK
1049}
1050
f067a982 1051void _get_opp_table_kref(struct opp_table *opp_table)
b6160e26 1052{
f067a982
VK
1053 kref_get(&opp_table->kref);
1054}
1055
eb7c8743 1056static struct opp_table *_opp_get_opp_table(struct device *dev, int index)
f067a982
VK
1057{
1058 struct opp_table *opp_table;
1059
1060 /* Hold our table modification lock here */
1061 mutex_lock(&opp_table_lock);
1062
5b650b38
VK
1063 opp_table = _find_opp_table_unlocked(dev);
1064 if (!IS_ERR(opp_table))
f067a982 1065 goto unlock;
f067a982 1066
283d55e6
VK
1067 opp_table = _managed_opp(dev, index);
1068 if (opp_table) {
1069 if (!_add_opp_dev_unlocked(dev, opp_table)) {
1070 dev_pm_opp_put_opp_table(opp_table);
1071 opp_table = NULL;
1072 }
1073 goto unlock;
1074 }
1075
eb7c8743 1076 opp_table = _allocate_opp_table(dev, index);
f067a982
VK
1077
1078unlock:
1079 mutex_unlock(&opp_table_lock);
1080
1081 return opp_table;
1082}
eb7c8743
VK
1083
1084struct opp_table *dev_pm_opp_get_opp_table(struct device *dev)
1085{
1086 return _opp_get_opp_table(dev, 0);
1087}
f067a982
VK
1088EXPORT_SYMBOL_GPL(dev_pm_opp_get_opp_table);
1089
eb7c8743
VK
1090struct opp_table *dev_pm_opp_get_opp_table_indexed(struct device *dev,
1091 int index)
1092{
1093 return _opp_get_opp_table(dev, index);
1094}
1095
b83c1899 1096static void _opp_table_kref_release(struct kref *kref)
f067a982
VK
1097{
1098 struct opp_table *opp_table = container_of(kref, struct opp_table, kref);
cdd6ed90 1099 struct opp_device *opp_dev, *temp;
6d3f922c 1100 int i;
b6160e26 1101
5d6d106f
VK
1102 _of_clear_opp_table(opp_table);
1103
b6160e26
VK
1104 /* Release clk */
1105 if (!IS_ERR(opp_table->clk))
1106 clk_put(opp_table->clk);
1107
6d3f922c
GD
1108 if (opp_table->paths) {
1109 for (i = 0; i < opp_table->path_count; i++)
1110 icc_put(opp_table->paths[i]);
1111 kfree(opp_table->paths);
1112 }
1113
cdd6ed90 1114 WARN_ON(!list_empty(&opp_table->opp_list));
b6160e26 1115
cdd6ed90
VK
1116 list_for_each_entry_safe(opp_dev, temp, &opp_table->dev_list, node) {
1117 /*
1118 * The OPP table is getting removed, drop the performance state
1119 * constraints.
1120 */
1121 if (opp_table->genpd_performance_state)
1122 dev_pm_genpd_set_performance_state((struct device *)(opp_dev->dev), 0);
b6160e26 1123
cdd6ed90
VK
1124 _remove_opp_dev(opp_dev, opp_table);
1125 }
b6160e26 1126
4f018bc0 1127 mutex_destroy(&opp_table->genpd_virt_dev_lock);
37a73ec0 1128 mutex_destroy(&opp_table->lock);
052c6f19
VK
1129 list_del(&opp_table->node);
1130 kfree(opp_table);
b6160e26 1131
f067a982
VK
1132 mutex_unlock(&opp_table_lock);
1133}
1134
1135void dev_pm_opp_put_opp_table(struct opp_table *opp_table)
1136{
1137 kref_put_mutex(&opp_table->kref, _opp_table_kref_release,
1138 &opp_table_lock);
1139}
1140EXPORT_SYMBOL_GPL(dev_pm_opp_put_opp_table);
1141
8cd2f6e8 1142void _opp_free(struct dev_pm_opp *opp)
969fceb3
VK
1143{
1144 kfree(opp);
969fceb3
VK
1145}
1146
1690d8bb
VK
1147static void _opp_kref_release(struct dev_pm_opp *opp,
1148 struct opp_table *opp_table)
129eec55
VK
1149{
1150 /*
1151 * Notify the changes in the availability of the operable
1152 * frequency/voltage list.
1153 */
052c6f19 1154 blocking_notifier_call_chain(&opp_table->head, OPP_EVENT_REMOVE, opp);
da544b61 1155 _of_opp_free_required_opps(opp_table, opp);
deaa5146 1156 opp_debug_remove_one(opp);
052c6f19
VK
1157 list_del(&opp->node);
1158 kfree(opp);
1690d8bb 1159}
129eec55 1160
1690d8bb
VK
1161static void _opp_kref_release_unlocked(struct kref *kref)
1162{
1163 struct dev_pm_opp *opp = container_of(kref, struct dev_pm_opp, kref);
1164 struct opp_table *opp_table = opp->opp_table;
1165
1166 _opp_kref_release(opp, opp_table);
1167}
1168
1169static void _opp_kref_release_locked(struct kref *kref)
1170{
1171 struct dev_pm_opp *opp = container_of(kref, struct dev_pm_opp, kref);
1172 struct opp_table *opp_table = opp->opp_table;
1173
1174 _opp_kref_release(opp, opp_table);
37a73ec0 1175 mutex_unlock(&opp_table->lock);
129eec55
VK
1176}
1177
a88bd2a5 1178void dev_pm_opp_get(struct dev_pm_opp *opp)
8a31d9d9
VK
1179{
1180 kref_get(&opp->kref);
1181}
1182
7034764a
VK
1183void dev_pm_opp_put(struct dev_pm_opp *opp)
1184{
1690d8bb
VK
1185 kref_put_mutex(&opp->kref, _opp_kref_release_locked,
1186 &opp->opp_table->lock);
7034764a
VK
1187}
1188EXPORT_SYMBOL_GPL(dev_pm_opp_put);
1189
1690d8bb
VK
1190static void dev_pm_opp_put_unlocked(struct dev_pm_opp *opp)
1191{
1192 kref_put(&opp->kref, _opp_kref_release_unlocked);
1193}
1194
129eec55 1195/**
2c2709dc 1196 * dev_pm_opp_remove() - Remove an OPP from OPP table
129eec55
VK
1197 * @dev: device for which we do this operation
1198 * @freq: OPP to remove with matching 'freq'
1199 *
2c2709dc 1200 * This function removes an opp from the opp table.
129eec55
VK
1201 */
1202void dev_pm_opp_remove(struct device *dev, unsigned long freq)
1203{
1204 struct dev_pm_opp *opp;
2c2709dc 1205 struct opp_table *opp_table;
129eec55
VK
1206 bool found = false;
1207
2c2709dc
VK
1208 opp_table = _find_opp_table(dev);
1209 if (IS_ERR(opp_table))
5b650b38 1210 return;
129eec55 1211
37a73ec0
VK
1212 mutex_lock(&opp_table->lock);
1213
2c2709dc 1214 list_for_each_entry(opp, &opp_table->opp_list, node) {
129eec55
VK
1215 if (opp->rate == freq) {
1216 found = true;
1217 break;
1218 }
1219 }
1220
37a73ec0
VK
1221 mutex_unlock(&opp_table->lock);
1222
5b650b38
VK
1223 if (found) {
1224 dev_pm_opp_put(opp);
0ad8c623
VK
1225
1226 /* Drop the reference taken by dev_pm_opp_add() */
1227 dev_pm_opp_put_opp_table(opp_table);
5b650b38 1228 } else {
129eec55
VK
1229 dev_warn(dev, "%s: Couldn't find OPP with freq: %lu\n",
1230 __func__, freq);
129eec55
VK
1231 }
1232
0ad8c623 1233 /* Drop the reference taken by _find_opp_table() */
5b650b38 1234 dev_pm_opp_put_opp_table(opp_table);
129eec55
VK
1235}
1236EXPORT_SYMBOL_GPL(dev_pm_opp_remove);
1237
03758d60
VK
1238void _opp_remove_all_static(struct opp_table *opp_table)
1239{
1240 struct dev_pm_opp *opp, *tmp;
1241
1242 mutex_lock(&opp_table->lock);
1243
1244 if (!opp_table->parsed_static_opps || --opp_table->parsed_static_opps)
1245 goto unlock;
1246
1247 list_for_each_entry_safe(opp, tmp, &opp_table->opp_list, node) {
1248 if (!opp->dynamic)
1249 dev_pm_opp_put_unlocked(opp);
1250 }
1251
1252unlock:
1253 mutex_unlock(&opp_table->lock);
1254}
1255
1690d8bb
VK
1256/**
1257 * dev_pm_opp_remove_all_dynamic() - Remove all dynamically created OPPs
1258 * @dev: device for which we do this operation
1259 *
1260 * This function removes all dynamically created OPPs from the opp table.
1261 */
1262void dev_pm_opp_remove_all_dynamic(struct device *dev)
1263{
1264 struct opp_table *opp_table;
1265 struct dev_pm_opp *opp, *temp;
1266 int count = 0;
1267
1268 opp_table = _find_opp_table(dev);
1269 if (IS_ERR(opp_table))
1270 return;
1271
1272 mutex_lock(&opp_table->lock);
1273 list_for_each_entry_safe(opp, temp, &opp_table->opp_list, node) {
1274 if (opp->dynamic) {
1275 dev_pm_opp_put_unlocked(opp);
1276 count++;
1277 }
1278 }
1279 mutex_unlock(&opp_table->lock);
1280
1281 /* Drop the references taken by dev_pm_opp_add() */
1282 while (count--)
1283 dev_pm_opp_put_opp_table(opp_table);
1284
1285 /* Drop the reference taken by _find_opp_table() */
1286 dev_pm_opp_put_opp_table(opp_table);
1287}
1288EXPORT_SYMBOL_GPL(dev_pm_opp_remove_all_dynamic);
1289
8cd2f6e8 1290struct dev_pm_opp *_opp_allocate(struct opp_table *table)
e1f60b29 1291{
23dacf6d 1292 struct dev_pm_opp *opp;
6d3f922c 1293 int supply_count, supply_size, icc_size;
e1f60b29 1294
dfbe4678 1295 /* Allocate space for at least one supply */
6d3f922c
GD
1296 supply_count = table->regulator_count > 0 ? table->regulator_count : 1;
1297 supply_size = sizeof(*opp->supplies) * supply_count;
1298 icc_size = sizeof(*opp->bandwidth) * table->path_count;
e1f60b29 1299
dfbe4678 1300 /* allocate new OPP node and supplies structures */
6d3f922c
GD
1301 opp = kzalloc(sizeof(*opp) + supply_size + icc_size, GFP_KERNEL);
1302
8cd2f6e8 1303 if (!opp)
23dacf6d 1304 return NULL;
23dacf6d 1305
dfbe4678
VK
1306 /* Put the supplies at the end of the OPP structure as an empty array */
1307 opp->supplies = (struct dev_pm_opp_supply *)(opp + 1);
6d3f922c
GD
1308 if (icc_size)
1309 opp->bandwidth = (struct dev_pm_opp_icc_bw *)(opp->supplies + supply_count);
dfbe4678
VK
1310 INIT_LIST_HEAD(&opp->node);
1311
23dacf6d
VK
1312 return opp;
1313}
1314
7d34d56e 1315static bool _opp_supported_by_regulators(struct dev_pm_opp *opp,
2c2709dc 1316 struct opp_table *opp_table)
7d34d56e 1317{
dfbe4678
VK
1318 struct regulator *reg;
1319 int i;
1320
90e3577b
VK
1321 if (!opp_table->regulators)
1322 return true;
1323
dfbe4678
VK
1324 for (i = 0; i < opp_table->regulator_count; i++) {
1325 reg = opp_table->regulators[i];
1326
1327 if (!regulator_is_supported_voltage(reg,
1328 opp->supplies[i].u_volt_min,
1329 opp->supplies[i].u_volt_max)) {
1330 pr_warn("%s: OPP minuV: %lu maxuV: %lu, not supported by regulator\n",
1331 __func__, opp->supplies[i].u_volt_min,
1332 opp->supplies[i].u_volt_max);
1333 return false;
1334 }
7d34d56e
VK
1335 }
1336
1337 return true;
1338}
1339
6c591eec
SK
1340int _opp_compare_key(struct dev_pm_opp *opp1, struct dev_pm_opp *opp2)
1341{
1342 if (opp1->rate != opp2->rate)
1343 return opp1->rate < opp2->rate ? -1 : 1;
6d3f922c
GD
1344 if (opp1->bandwidth && opp2->bandwidth &&
1345 opp1->bandwidth[0].peak != opp2->bandwidth[0].peak)
1346 return opp1->bandwidth[0].peak < opp2->bandwidth[0].peak ? -1 : 1;
6c591eec
SK
1347 if (opp1->level != opp2->level)
1348 return opp1->level < opp2->level ? -1 : 1;
1349 return 0;
1350}
1351
a1e8c136
VK
1352static int _opp_is_duplicate(struct device *dev, struct dev_pm_opp *new_opp,
1353 struct opp_table *opp_table,
1354 struct list_head **head)
23dacf6d
VK
1355{
1356 struct dev_pm_opp *opp;
6c591eec 1357 int opp_cmp;
23dacf6d
VK
1358
1359 /*
1360 * Insert new OPP in order of increasing frequency and discard if
1361 * already present.
1362 *
2c2709dc 1363 * Need to use &opp_table->opp_list in the condition part of the 'for'
23dacf6d
VK
1364 * loop, don't replace it with head otherwise it will become an infinite
1365 * loop.
1366 */
052c6f19 1367 list_for_each_entry(opp, &opp_table->opp_list, node) {
6c591eec
SK
1368 opp_cmp = _opp_compare_key(new_opp, opp);
1369 if (opp_cmp > 0) {
a1e8c136 1370 *head = &opp->node;
23dacf6d
VK
1371 continue;
1372 }
1373
6c591eec 1374 if (opp_cmp < 0)
a1e8c136 1375 return 0;
23dacf6d
VK
1376
1377 /* Duplicate OPPs */
06441658 1378 dev_warn(dev, "%s: duplicate OPPs detected. Existing: freq: %lu, volt: %lu, enabled: %d. New: freq: %lu, volt: %lu, enabled: %d\n",
dfbe4678
VK
1379 __func__, opp->rate, opp->supplies[0].u_volt,
1380 opp->available, new_opp->rate,
1381 new_opp->supplies[0].u_volt, new_opp->available);
23dacf6d 1382
dfbe4678 1383 /* Should we compare voltages for all regulators here ? */
a1e8c136
VK
1384 return opp->available &&
1385 new_opp->supplies[0].u_volt == opp->supplies[0].u_volt ? -EBUSY : -EEXIST;
1386 }
1387
1388 return 0;
1389}
1390
1391/*
1392 * Returns:
1393 * 0: On success. And appropriate error message for duplicate OPPs.
1394 * -EBUSY: For OPP with same freq/volt and is available. The callers of
1395 * _opp_add() must return 0 if they receive -EBUSY from it. This is to make
1396 * sure we don't print error messages unnecessarily if different parts of
1397 * kernel try to initialize the OPP table.
1398 * -EEXIST: For OPP with same freq but different volt or is unavailable. This
1399 * should be considered an error by the callers of _opp_add().
1400 */
1401int _opp_add(struct device *dev, struct dev_pm_opp *new_opp,
1402 struct opp_table *opp_table, bool rate_not_available)
1403{
1404 struct list_head *head;
1405 int ret;
1406
1407 mutex_lock(&opp_table->lock);
1408 head = &opp_table->opp_list;
37a73ec0 1409
a1e8c136
VK
1410 if (likely(!rate_not_available)) {
1411 ret = _opp_is_duplicate(dev, new_opp, opp_table, &head);
1412 if (ret) {
1413 mutex_unlock(&opp_table->lock);
1414 return ret;
1415 }
23dacf6d
VK
1416 }
1417
052c6f19 1418 list_add(&new_opp->node, head);
37a73ec0
VK
1419 mutex_unlock(&opp_table->lock);
1420
1421 new_opp->opp_table = opp_table;
7034764a 1422 kref_init(&new_opp->kref);
23dacf6d 1423
a2dea4cb 1424 opp_debug_create_one(new_opp, opp_table);
deaa5146 1425
2c2709dc 1426 if (!_opp_supported_by_regulators(new_opp, opp_table)) {
7d34d56e
VK
1427 new_opp->available = false;
1428 dev_warn(dev, "%s: OPP not supported by regulators (%lu)\n",
1429 __func__, new_opp->rate);
1430 }
1431
23dacf6d
VK
1432 return 0;
1433}
1434
984f16c8 1435/**
b64b9c3f 1436 * _opp_add_v1() - Allocate a OPP based on v1 bindings.
8cd2f6e8 1437 * @opp_table: OPP table
984f16c8
NM
1438 * @dev: device for which we do this operation
1439 * @freq: Frequency in Hz for this OPP
1440 * @u_volt: Voltage in uVolts for this OPP
1441 * @dynamic: Dynamically added OPPs.
1442 *
2c2709dc 1443 * This function adds an opp definition to the opp table and returns status.
984f16c8
NM
1444 * The opp is made available by default and it can be controlled using
1445 * dev_pm_opp_enable/disable functions and may be removed by dev_pm_opp_remove.
1446 *
8f8d37b2
VK
1447 * NOTE: "dynamic" parameter impacts OPPs added by the dev_pm_opp_of_add_table
1448 * and freed by dev_pm_opp_of_remove_table.
984f16c8 1449 *
984f16c8
NM
1450 * Return:
1451 * 0 On success OR
1452 * Duplicate OPPs (both freq and volt are same) and opp->available
1453 * -EEXIST Freq are same and volt are different OR
1454 * Duplicate OPPs (both freq and volt are same) and !opp->available
1455 * -ENOMEM Memory allocation failure
1456 */
8cd2f6e8
VK
1457int _opp_add_v1(struct opp_table *opp_table, struct device *dev,
1458 unsigned long freq, long u_volt, bool dynamic)
e1f60b29 1459{
23dacf6d 1460 struct dev_pm_opp *new_opp;
50f8cfbd 1461 unsigned long tol;
6ce4184d 1462 int ret;
e1f60b29 1463
8cd2f6e8
VK
1464 new_opp = _opp_allocate(opp_table);
1465 if (!new_opp)
1466 return -ENOMEM;
23dacf6d 1467
a7470db6 1468 /* populate the opp table */
a7470db6 1469 new_opp->rate = freq;
2c2709dc 1470 tol = u_volt * opp_table->voltage_tolerance_v1 / 100;
dfbe4678
VK
1471 new_opp->supplies[0].u_volt = u_volt;
1472 new_opp->supplies[0].u_volt_min = u_volt - tol;
1473 new_opp->supplies[0].u_volt_max = u_volt + tol;
a7470db6 1474 new_opp->available = true;
23dacf6d 1475 new_opp->dynamic = dynamic;
a7470db6 1476
a1e8c136 1477 ret = _opp_add(dev, new_opp, opp_table, false);
7f8538eb
VK
1478 if (ret) {
1479 /* Don't return error for duplicate OPPs */
1480 if (ret == -EBUSY)
1481 ret = 0;
6ce4184d 1482 goto free_opp;
7f8538eb 1483 }
64ce8545 1484
03ca370f
MH
1485 /*
1486 * Notify the changes in the availability of the operable
1487 * frequency/voltage list.
1488 */
052c6f19 1489 blocking_notifier_call_chain(&opp_table->head, OPP_EVENT_ADD, new_opp);
e1f60b29 1490 return 0;
6ce4184d
VK
1491
1492free_opp:
8cd2f6e8
VK
1493 _opp_free(new_opp);
1494
6ce4184d 1495 return ret;
e1f60b29 1496}
38393409 1497
7de36b0a
VK
1498/**
1499 * dev_pm_opp_set_supported_hw() - Set supported platforms
1500 * @dev: Device for which supported-hw has to be set.
1501 * @versions: Array of hierarchy of versions to match.
1502 * @count: Number of elements in the array.
1503 *
1504 * This is required only for the V2 bindings, and it enables a platform to
1505 * specify the hierarchy of versions it supports. OPP layer will then enable
1506 * OPPs, which are available for those versions, based on its 'opp-supported-hw'
1507 * property.
7de36b0a 1508 */
fa30184d
VK
1509struct opp_table *dev_pm_opp_set_supported_hw(struct device *dev,
1510 const u32 *versions, unsigned int count)
7de36b0a 1511{
2c2709dc 1512 struct opp_table *opp_table;
7de36b0a 1513
fa30184d
VK
1514 opp_table = dev_pm_opp_get_opp_table(dev);
1515 if (!opp_table)
1516 return ERR_PTR(-ENOMEM);
7de36b0a 1517
2c2709dc
VK
1518 /* Make sure there are no concurrent readers while updating opp_table */
1519 WARN_ON(!list_empty(&opp_table->opp_list));
7de36b0a 1520
25419de1
VK
1521 /* Another CPU that shares the OPP table has set the property ? */
1522 if (opp_table->supported_hw)
1523 return opp_table;
7de36b0a 1524
2c2709dc 1525 opp_table->supported_hw = kmemdup(versions, count * sizeof(*versions),
7de36b0a 1526 GFP_KERNEL);
2c2709dc 1527 if (!opp_table->supported_hw) {
25419de1
VK
1528 dev_pm_opp_put_opp_table(opp_table);
1529 return ERR_PTR(-ENOMEM);
7de36b0a
VK
1530 }
1531
2c2709dc 1532 opp_table->supported_hw_count = count;
fa30184d
VK
1533
1534 return opp_table;
7de36b0a
VK
1535}
1536EXPORT_SYMBOL_GPL(dev_pm_opp_set_supported_hw);
1537
1538/**
1539 * dev_pm_opp_put_supported_hw() - Releases resources blocked for supported hw
fa30184d 1540 * @opp_table: OPP table returned by dev_pm_opp_set_supported_hw().
7de36b0a
VK
1541 *
1542 * This is required only for the V2 bindings, and is called for a matching
2c2709dc 1543 * dev_pm_opp_set_supported_hw(). Until this is called, the opp_table structure
7de36b0a 1544 * will not be freed.
7de36b0a 1545 */
fa30184d 1546void dev_pm_opp_put_supported_hw(struct opp_table *opp_table)
7de36b0a 1547{
2c2709dc
VK
1548 /* Make sure there are no concurrent readers while updating opp_table */
1549 WARN_ON(!list_empty(&opp_table->opp_list));
7de36b0a 1550
2c2709dc
VK
1551 kfree(opp_table->supported_hw);
1552 opp_table->supported_hw = NULL;
1553 opp_table->supported_hw_count = 0;
7de36b0a 1554
fa30184d 1555 dev_pm_opp_put_opp_table(opp_table);
7de36b0a
VK
1556}
1557EXPORT_SYMBOL_GPL(dev_pm_opp_put_supported_hw);
1558
01fb4d3c
VK
1559/**
1560 * dev_pm_opp_set_prop_name() - Set prop-extn name
a5da6447 1561 * @dev: Device for which the prop-name has to be set.
01fb4d3c
VK
1562 * @name: name to postfix to properties.
1563 *
1564 * This is required only for the V2 bindings, and it enables a platform to
1565 * specify the extn to be used for certain property names. The properties to
1566 * which the extension will apply are opp-microvolt and opp-microamp. OPP core
1567 * should postfix the property name with -<name> while looking for them.
01fb4d3c 1568 */
fa30184d 1569struct opp_table *dev_pm_opp_set_prop_name(struct device *dev, const char *name)
01fb4d3c 1570{
2c2709dc 1571 struct opp_table *opp_table;
01fb4d3c 1572
fa30184d
VK
1573 opp_table = dev_pm_opp_get_opp_table(dev);
1574 if (!opp_table)
1575 return ERR_PTR(-ENOMEM);
01fb4d3c 1576
2c2709dc
VK
1577 /* Make sure there are no concurrent readers while updating opp_table */
1578 WARN_ON(!list_empty(&opp_table->opp_list));
01fb4d3c 1579
878ec1a9
VK
1580 /* Another CPU that shares the OPP table has set the property ? */
1581 if (opp_table->prop_name)
1582 return opp_table;
01fb4d3c 1583
2c2709dc
VK
1584 opp_table->prop_name = kstrdup(name, GFP_KERNEL);
1585 if (!opp_table->prop_name) {
878ec1a9
VK
1586 dev_pm_opp_put_opp_table(opp_table);
1587 return ERR_PTR(-ENOMEM);
01fb4d3c
VK
1588 }
1589
fa30184d 1590 return opp_table;
01fb4d3c
VK
1591}
1592EXPORT_SYMBOL_GPL(dev_pm_opp_set_prop_name);
1593
1594/**
1595 * dev_pm_opp_put_prop_name() - Releases resources blocked for prop-name
fa30184d 1596 * @opp_table: OPP table returned by dev_pm_opp_set_prop_name().
01fb4d3c
VK
1597 *
1598 * This is required only for the V2 bindings, and is called for a matching
2c2709dc 1599 * dev_pm_opp_set_prop_name(). Until this is called, the opp_table structure
01fb4d3c 1600 * will not be freed.
01fb4d3c 1601 */
fa30184d 1602void dev_pm_opp_put_prop_name(struct opp_table *opp_table)
01fb4d3c 1603{
2c2709dc
VK
1604 /* Make sure there are no concurrent readers while updating opp_table */
1605 WARN_ON(!list_empty(&opp_table->opp_list));
01fb4d3c 1606
2c2709dc
VK
1607 kfree(opp_table->prop_name);
1608 opp_table->prop_name = NULL;
01fb4d3c 1609
fa30184d 1610 dev_pm_opp_put_opp_table(opp_table);
01fb4d3c
VK
1611}
1612EXPORT_SYMBOL_GPL(dev_pm_opp_put_prop_name);
1613
94735585
VK
1614static int _allocate_set_opp_data(struct opp_table *opp_table)
1615{
1616 struct dev_pm_set_opp_data *data;
1617 int len, count = opp_table->regulator_count;
1618
90e3577b 1619 if (WARN_ON(!opp_table->regulators))
94735585
VK
1620 return -EINVAL;
1621
1622 /* space for set_opp_data */
1623 len = sizeof(*data);
1624
1625 /* space for old_opp.supplies and new_opp.supplies */
1626 len += 2 * sizeof(struct dev_pm_opp_supply) * count;
1627
1628 data = kzalloc(len, GFP_KERNEL);
1629 if (!data)
1630 return -ENOMEM;
1631
1632 data->old_opp.supplies = (void *)(data + 1);
1633 data->new_opp.supplies = data->old_opp.supplies + count;
1634
1635 opp_table->set_opp_data = data;
1636
1637 return 0;
1638}
1639
1640static void _free_set_opp_data(struct opp_table *opp_table)
1641{
1642 kfree(opp_table->set_opp_data);
1643 opp_table->set_opp_data = NULL;
1644}
1645
9f8ea969 1646/**
dfbe4678 1647 * dev_pm_opp_set_regulators() - Set regulator names for the device
9f8ea969 1648 * @dev: Device for which regulator name is being set.
dfbe4678
VK
1649 * @names: Array of pointers to the names of the regulator.
1650 * @count: Number of regulators.
9f8ea969
VK
1651 *
1652 * In order to support OPP switching, OPP layer needs to know the name of the
dfbe4678
VK
1653 * device's regulators, as the core would be required to switch voltages as
1654 * well.
9f8ea969
VK
1655 *
1656 * This must be called before any OPPs are initialized for the device.
9f8ea969 1657 */
dfbe4678
VK
1658struct opp_table *dev_pm_opp_set_regulators(struct device *dev,
1659 const char * const names[],
1660 unsigned int count)
9f8ea969 1661{
2c2709dc 1662 struct opp_table *opp_table;
9f8ea969 1663 struct regulator *reg;
dfbe4678 1664 int ret, i;
9f8ea969 1665
fa30184d
VK
1666 opp_table = dev_pm_opp_get_opp_table(dev);
1667 if (!opp_table)
1668 return ERR_PTR(-ENOMEM);
9f8ea969
VK
1669
1670 /* This should be called before OPPs are initialized */
2c2709dc 1671 if (WARN_ON(!list_empty(&opp_table->opp_list))) {
9f8ea969
VK
1672 ret = -EBUSY;
1673 goto err;
1674 }
1675
779b783c
VK
1676 /* Another CPU that shares the OPP table has set the regulators ? */
1677 if (opp_table->regulators)
1678 return opp_table;
dfbe4678
VK
1679
1680 opp_table->regulators = kmalloc_array(count,
1681 sizeof(*opp_table->regulators),
1682 GFP_KERNEL);
1683 if (!opp_table->regulators) {
1684 ret = -ENOMEM;
9f8ea969
VK
1685 goto err;
1686 }
1687
dfbe4678
VK
1688 for (i = 0; i < count; i++) {
1689 reg = regulator_get_optional(dev, names[i]);
1690 if (IS_ERR(reg)) {
1691 ret = PTR_ERR(reg);
1692 if (ret != -EPROBE_DEFER)
1693 dev_err(dev, "%s: no regulator (%s) found: %d\n",
1694 __func__, names[i], ret);
1695 goto free_regulators;
1696 }
1697
1698 opp_table->regulators[i] = reg;
1699 }
1700
1701 opp_table->regulator_count = count;
9f8ea969 1702
94735585
VK
1703 /* Allocate block only once to pass to set_opp() routines */
1704 ret = _allocate_set_opp_data(opp_table);
1705 if (ret)
1706 goto free_regulators;
1707
91291d9a 1708 return opp_table;
9f8ea969 1709
dfbe4678 1710free_regulators:
24957db1
MS
1711 while (i != 0)
1712 regulator_put(opp_table->regulators[--i]);
dfbe4678
VK
1713
1714 kfree(opp_table->regulators);
1715 opp_table->regulators = NULL;
46f48aca 1716 opp_table->regulator_count = -1;
9f8ea969 1717err:
fa30184d 1718 dev_pm_opp_put_opp_table(opp_table);
9f8ea969 1719
91291d9a 1720 return ERR_PTR(ret);
9f8ea969 1721}
dfbe4678 1722EXPORT_SYMBOL_GPL(dev_pm_opp_set_regulators);
9f8ea969
VK
1723
1724/**
dfbe4678
VK
1725 * dev_pm_opp_put_regulators() - Releases resources blocked for regulator
1726 * @opp_table: OPP table returned from dev_pm_opp_set_regulators().
9f8ea969 1727 */
dfbe4678 1728void dev_pm_opp_put_regulators(struct opp_table *opp_table)
9f8ea969 1729{
dfbe4678
VK
1730 int i;
1731
779b783c
VK
1732 if (!opp_table->regulators)
1733 goto put_opp_table;
9f8ea969 1734
2c2709dc
VK
1735 /* Make sure there are no concurrent readers while updating opp_table */
1736 WARN_ON(!list_empty(&opp_table->opp_list));
9f8ea969 1737
8d45719c
KK
1738 if (opp_table->regulator_enabled) {
1739 for (i = opp_table->regulator_count - 1; i >= 0; i--)
1740 regulator_disable(opp_table->regulators[i]);
1741
1742 opp_table->regulator_enabled = false;
1743 }
1744
24957db1 1745 for (i = opp_table->regulator_count - 1; i >= 0; i--)
dfbe4678
VK
1746 regulator_put(opp_table->regulators[i]);
1747
94735585
VK
1748 _free_set_opp_data(opp_table);
1749
dfbe4678
VK
1750 kfree(opp_table->regulators);
1751 opp_table->regulators = NULL;
46f48aca 1752 opp_table->regulator_count = -1;
9f8ea969 1753
779b783c 1754put_opp_table:
fa30184d 1755 dev_pm_opp_put_opp_table(opp_table);
9f8ea969 1756}
dfbe4678 1757EXPORT_SYMBOL_GPL(dev_pm_opp_put_regulators);
9f8ea969 1758
829a4e8c
VK
1759/**
1760 * dev_pm_opp_set_clkname() - Set clk name for the device
1761 * @dev: Device for which clk name is being set.
1762 * @name: Clk name.
1763 *
1764 * In order to support OPP switching, OPP layer needs to get pointer to the
1765 * clock for the device. Simple cases work fine without using this routine (i.e.
1766 * by passing connection-id as NULL), but for a device with multiple clocks
1767 * available, the OPP core needs to know the exact name of the clk to use.
1768 *
1769 * This must be called before any OPPs are initialized for the device.
1770 */
1771struct opp_table *dev_pm_opp_set_clkname(struct device *dev, const char *name)
1772{
1773 struct opp_table *opp_table;
1774 int ret;
1775
1776 opp_table = dev_pm_opp_get_opp_table(dev);
1777 if (!opp_table)
1778 return ERR_PTR(-ENOMEM);
1779
1780 /* This should be called before OPPs are initialized */
1781 if (WARN_ON(!list_empty(&opp_table->opp_list))) {
1782 ret = -EBUSY;
1783 goto err;
1784 }
1785
1786 /* Already have default clk set, free it */
1787 if (!IS_ERR(opp_table->clk))
1788 clk_put(opp_table->clk);
1789
1790 /* Find clk for the device */
1791 opp_table->clk = clk_get(dev, name);
1792 if (IS_ERR(opp_table->clk)) {
1793 ret = PTR_ERR(opp_table->clk);
1794 if (ret != -EPROBE_DEFER) {
1795 dev_err(dev, "%s: Couldn't find clock: %d\n", __func__,
1796 ret);
1797 }
1798 goto err;
1799 }
1800
1801 return opp_table;
1802
1803err:
1804 dev_pm_opp_put_opp_table(opp_table);
1805
1806 return ERR_PTR(ret);
1807}
1808EXPORT_SYMBOL_GPL(dev_pm_opp_set_clkname);
1809
1810/**
1811 * dev_pm_opp_put_clkname() - Releases resources blocked for clk.
1812 * @opp_table: OPP table returned from dev_pm_opp_set_clkname().
1813 */
1814void dev_pm_opp_put_clkname(struct opp_table *opp_table)
1815{
1816 /* Make sure there are no concurrent readers while updating opp_table */
1817 WARN_ON(!list_empty(&opp_table->opp_list));
1818
1819 clk_put(opp_table->clk);
1820 opp_table->clk = ERR_PTR(-EINVAL);
1821
1822 dev_pm_opp_put_opp_table(opp_table);
1823}
1824EXPORT_SYMBOL_GPL(dev_pm_opp_put_clkname);
1825
4dab160e
VK
1826/**
1827 * dev_pm_opp_register_set_opp_helper() - Register custom set OPP helper
1828 * @dev: Device for which the helper is getting registered.
1829 * @set_opp: Custom set OPP helper.
1830 *
1831 * This is useful to support complex platforms (like platforms with multiple
1832 * regulators per device), instead of the generic OPP set rate helper.
1833 *
1834 * This must be called before any OPPs are initialized for the device.
4dab160e 1835 */
fa30184d 1836struct opp_table *dev_pm_opp_register_set_opp_helper(struct device *dev,
4dab160e
VK
1837 int (*set_opp)(struct dev_pm_set_opp_data *data))
1838{
1839 struct opp_table *opp_table;
4dab160e
VK
1840
1841 if (!set_opp)
fa30184d 1842 return ERR_PTR(-EINVAL);
4dab160e 1843
fa30184d
VK
1844 opp_table = dev_pm_opp_get_opp_table(dev);
1845 if (!opp_table)
1846 return ERR_PTR(-ENOMEM);
4dab160e
VK
1847
1848 /* This should be called before OPPs are initialized */
1849 if (WARN_ON(!list_empty(&opp_table->opp_list))) {
5019acc6
VK
1850 dev_pm_opp_put_opp_table(opp_table);
1851 return ERR_PTR(-EBUSY);
4dab160e
VK
1852 }
1853
5019acc6
VK
1854 /* Another CPU that shares the OPP table has set the helper ? */
1855 if (!opp_table->set_opp)
1856 opp_table->set_opp = set_opp;
4dab160e 1857
fa30184d 1858 return opp_table;
4dab160e
VK
1859}
1860EXPORT_SYMBOL_GPL(dev_pm_opp_register_set_opp_helper);
1861
1862/**
604a7aeb 1863 * dev_pm_opp_unregister_set_opp_helper() - Releases resources blocked for
4dab160e 1864 * set_opp helper
fa30184d 1865 * @opp_table: OPP table returned from dev_pm_opp_register_set_opp_helper().
4dab160e 1866 *
fa30184d 1867 * Release resources blocked for platform specific set_opp helper.
4dab160e 1868 */
604a7aeb 1869void dev_pm_opp_unregister_set_opp_helper(struct opp_table *opp_table)
4dab160e 1870{
4dab160e
VK
1871 /* Make sure there are no concurrent readers while updating opp_table */
1872 WARN_ON(!list_empty(&opp_table->opp_list));
1873
1874 opp_table->set_opp = NULL;
fa30184d 1875 dev_pm_opp_put_opp_table(opp_table);
4dab160e 1876}
604a7aeb 1877EXPORT_SYMBOL_GPL(dev_pm_opp_unregister_set_opp_helper);
4dab160e 1878
6319aee1
VK
1879static void _opp_detach_genpd(struct opp_table *opp_table)
1880{
1881 int index;
1882
1883 for (index = 0; index < opp_table->required_opp_count; index++) {
1884 if (!opp_table->genpd_virt_devs[index])
1885 continue;
1886
1887 dev_pm_domain_detach(opp_table->genpd_virt_devs[index], false);
1888 opp_table->genpd_virt_devs[index] = NULL;
1889 }
c0ab9e08
VK
1890
1891 kfree(opp_table->genpd_virt_devs);
1892 opp_table->genpd_virt_devs = NULL;
6319aee1
VK
1893}
1894
4f018bc0 1895/**
6319aee1
VK
1896 * dev_pm_opp_attach_genpd - Attach genpd(s) for the device and save virtual device pointer
1897 * @dev: Consumer device for which the genpd is getting attached.
1898 * @names: Null terminated array of pointers containing names of genpd to attach.
17a8f868 1899 * @virt_devs: Pointer to return the array of virtual devices.
4f018bc0
VK
1900 *
1901 * Multiple generic power domains for a device are supported with the help of
1902 * virtual genpd devices, which are created for each consumer device - genpd
1903 * pair. These are the device structures which are attached to the power domain
1904 * and are required by the OPP core to set the performance state of the genpd.
6319aee1
VK
1905 * The same API also works for the case where single genpd is available and so
1906 * we don't need to support that separately.
4f018bc0
VK
1907 *
1908 * This helper will normally be called by the consumer driver of the device
6319aee1 1909 * "dev", as only that has details of the genpd names.
4f018bc0 1910 *
6319aee1
VK
1911 * This helper needs to be called once with a list of all genpd to attach.
1912 * Otherwise the original device structure will be used instead by the OPP core.
baea35e4
VK
1913 *
1914 * The order of entries in the names array must match the order in which
1915 * "required-opps" are added in DT.
4f018bc0 1916 */
17a8f868
VK
1917struct opp_table *dev_pm_opp_attach_genpd(struct device *dev,
1918 const char **names, struct device ***virt_devs)
4f018bc0
VK
1919{
1920 struct opp_table *opp_table;
6319aee1 1921 struct device *virt_dev;
baea35e4 1922 int index = 0, ret = -EINVAL;
6319aee1 1923 const char **name = names;
4f018bc0
VK
1924
1925 opp_table = dev_pm_opp_get_opp_table(dev);
1926 if (!opp_table)
1927 return ERR_PTR(-ENOMEM);
1928
6319aee1
VK
1929 /*
1930 * If the genpd's OPP table isn't already initialized, parsing of the
1931 * required-opps fail for dev. We should retry this after genpd's OPP
1932 * table is added.
1933 */
1934 if (!opp_table->required_opp_count) {
1935 ret = -EPROBE_DEFER;
1936 goto put_table;
1937 }
1938
4f018bc0
VK
1939 mutex_lock(&opp_table->genpd_virt_dev_lock);
1940
c0ab9e08
VK
1941 opp_table->genpd_virt_devs = kcalloc(opp_table->required_opp_count,
1942 sizeof(*opp_table->genpd_virt_devs),
1943 GFP_KERNEL);
1944 if (!opp_table->genpd_virt_devs)
1945 goto unlock;
4f018bc0 1946
6319aee1 1947 while (*name) {
6319aee1
VK
1948 if (index >= opp_table->required_opp_count) {
1949 dev_err(dev, "Index can't be greater than required-opp-count - 1, %s (%d : %d)\n",
1950 *name, opp_table->required_opp_count, index);
1951 goto err;
1952 }
4f018bc0 1953
6319aee1
VK
1954 if (opp_table->genpd_virt_devs[index]) {
1955 dev_err(dev, "Genpd virtual device already set %s\n",
1956 *name);
1957 goto err;
1958 }
1959
1960 virt_dev = dev_pm_domain_attach_by_name(dev, *name);
1961 if (IS_ERR(virt_dev)) {
1962 ret = PTR_ERR(virt_dev);
1963 dev_err(dev, "Couldn't attach to pm_domain: %d\n", ret);
1964 goto err;
1965 }
1966
1967 opp_table->genpd_virt_devs[index] = virt_dev;
baea35e4 1968 index++;
6319aee1 1969 name++;
4f018bc0
VK
1970 }
1971
17a8f868
VK
1972 if (virt_devs)
1973 *virt_devs = opp_table->genpd_virt_devs;
4f018bc0
VK
1974 mutex_unlock(&opp_table->genpd_virt_dev_lock);
1975
1976 return opp_table;
6319aee1
VK
1977
1978err:
1979 _opp_detach_genpd(opp_table);
c0ab9e08 1980unlock:
6319aee1
VK
1981 mutex_unlock(&opp_table->genpd_virt_dev_lock);
1982
1983put_table:
1984 dev_pm_opp_put_opp_table(opp_table);
1985
1986 return ERR_PTR(ret);
4f018bc0 1987}
6319aee1 1988EXPORT_SYMBOL_GPL(dev_pm_opp_attach_genpd);
4f018bc0
VK
1989
1990/**
6319aee1
VK
1991 * dev_pm_opp_detach_genpd() - Detach genpd(s) from the device.
1992 * @opp_table: OPP table returned by dev_pm_opp_attach_genpd().
4f018bc0 1993 *
6319aee1
VK
1994 * This detaches the genpd(s), resets the virtual device pointers, and puts the
1995 * OPP table.
4f018bc0 1996 */
6319aee1 1997void dev_pm_opp_detach_genpd(struct opp_table *opp_table)
4f018bc0 1998{
4f018bc0
VK
1999 /*
2000 * Acquire genpd_virt_dev_lock to make sure virt_dev isn't getting
2001 * used in parallel.
2002 */
2003 mutex_lock(&opp_table->genpd_virt_dev_lock);
6319aee1 2004 _opp_detach_genpd(opp_table);
4f018bc0
VK
2005 mutex_unlock(&opp_table->genpd_virt_dev_lock);
2006
6319aee1 2007 dev_pm_opp_put_opp_table(opp_table);
4f018bc0 2008}
6319aee1 2009EXPORT_SYMBOL_GPL(dev_pm_opp_detach_genpd);
4f018bc0 2010
c8a59103
VK
2011/**
2012 * dev_pm_opp_xlate_performance_state() - Find required OPP's pstate for src_table.
2013 * @src_table: OPP table which has dst_table as one of its required OPP table.
2014 * @dst_table: Required OPP table of the src_table.
2015 * @pstate: Current performance state of the src_table.
2016 *
2017 * This Returns pstate of the OPP (present in @dst_table) pointed out by the
2018 * "required-opps" property of the OPP (present in @src_table) which has
2019 * performance state set to @pstate.
2020 *
2021 * Return: Zero or positive performance state on success, otherwise negative
2022 * value on errors.
2023 */
2024int dev_pm_opp_xlate_performance_state(struct opp_table *src_table,
2025 struct opp_table *dst_table,
2026 unsigned int pstate)
2027{
2028 struct dev_pm_opp *opp;
2029 int dest_pstate = -EINVAL;
2030 int i;
2031
2032 if (!pstate)
2033 return 0;
2034
2035 /*
2036 * Normally the src_table will have the "required_opps" property set to
2037 * point to one of the OPPs in the dst_table, but in some cases the
2038 * genpd and its master have one to one mapping of performance states
2039 * and so none of them have the "required-opps" property set. Return the
2040 * pstate of the src_table as it is in such cases.
2041 */
2042 if (!src_table->required_opp_count)
2043 return pstate;
2044
2045 for (i = 0; i < src_table->required_opp_count; i++) {
2046 if (src_table->required_opp_tables[i]->np == dst_table->np)
2047 break;
2048 }
2049
2050 if (unlikely(i == src_table->required_opp_count)) {
2051 pr_err("%s: Couldn't find matching OPP table (%p: %p)\n",
2052 __func__, src_table, dst_table);
2053 return -EINVAL;
2054 }
2055
2056 mutex_lock(&src_table->lock);
2057
2058 list_for_each_entry(opp, &src_table->opp_list, node) {
2059 if (opp->pstate == pstate) {
2060 dest_pstate = opp->required_opps[i]->pstate;
2061 goto unlock;
2062 }
2063 }
2064
2065 pr_err("%s: Couldn't find matching OPP (%p: %p)\n", __func__, src_table,
2066 dst_table);
2067
2068unlock:
2069 mutex_unlock(&src_table->lock);
2070
2071 return dest_pstate;
2072}
2073
38393409
VK
2074/**
2075 * dev_pm_opp_add() - Add an OPP table from a table definitions
2076 * @dev: device for which we do this operation
2077 * @freq: Frequency in Hz for this OPP
2078 * @u_volt: Voltage in uVolts for this OPP
2079 *
2c2709dc 2080 * This function adds an opp definition to the opp table and returns status.
38393409
VK
2081 * The opp is made available by default and it can be controlled using
2082 * dev_pm_opp_enable/disable functions.
2083 *
38393409 2084 * Return:
984f16c8 2085 * 0 On success OR
38393409 2086 * Duplicate OPPs (both freq and volt are same) and opp->available
984f16c8 2087 * -EEXIST Freq are same and volt are different OR
38393409 2088 * Duplicate OPPs (both freq and volt are same) and !opp->available
984f16c8 2089 * -ENOMEM Memory allocation failure
38393409
VK
2090 */
2091int dev_pm_opp_add(struct device *dev, unsigned long freq, unsigned long u_volt)
2092{
8cd2f6e8
VK
2093 struct opp_table *opp_table;
2094 int ret;
2095
b83c1899
VK
2096 opp_table = dev_pm_opp_get_opp_table(dev);
2097 if (!opp_table)
2098 return -ENOMEM;
8cd2f6e8 2099
46f48aca
VK
2100 /* Fix regulator count for dynamic OPPs */
2101 opp_table->regulator_count = 1;
2102
8cd2f6e8 2103 ret = _opp_add_v1(opp_table, dev, freq, u_volt, true);
0ad8c623
VK
2104 if (ret)
2105 dev_pm_opp_put_opp_table(opp_table);
8cd2f6e8 2106
8cd2f6e8 2107 return ret;
38393409 2108}
5d4879cd 2109EXPORT_SYMBOL_GPL(dev_pm_opp_add);
e1f60b29
NM
2110
2111/**
327854c8 2112 * _opp_set_availability() - helper to set the availability of an opp
e1f60b29
NM
2113 * @dev: device for which we do this operation
2114 * @freq: OPP frequency to modify availability
2115 * @availability_req: availability status requested for this opp
2116 *
052c6f19
VK
2117 * Set the availability of an OPP, opp_{enable,disable} share a common logic
2118 * which is isolated here.
e1f60b29 2119 *
984f16c8 2120 * Return: -EINVAL for bad pointers, -ENOMEM if no memory available for the
e1a2d49c 2121 * copy operation, returns 0 if no modification was done OR modification was
e1f60b29 2122 * successful.
e1f60b29 2123 */
327854c8
NM
2124static int _opp_set_availability(struct device *dev, unsigned long freq,
2125 bool availability_req)
e1f60b29 2126{
2c2709dc 2127 struct opp_table *opp_table;
a7f3987e 2128 struct dev_pm_opp *tmp_opp, *opp = ERR_PTR(-ENODEV);
e1f60b29
NM
2129 int r = 0;
2130
2c2709dc
VK
2131 /* Find the opp_table */
2132 opp_table = _find_opp_table(dev);
2133 if (IS_ERR(opp_table)) {
2134 r = PTR_ERR(opp_table);
e1f60b29 2135 dev_warn(dev, "%s: Device OPP not found (%d)\n", __func__, r);
a7f3987e 2136 return r;
e1f60b29
NM
2137 }
2138
37a73ec0
VK
2139 mutex_lock(&opp_table->lock);
2140
e1f60b29 2141 /* Do we have the frequency? */
2c2709dc 2142 list_for_each_entry(tmp_opp, &opp_table->opp_list, node) {
e1f60b29
NM
2143 if (tmp_opp->rate == freq) {
2144 opp = tmp_opp;
2145 break;
2146 }
2147 }
37a73ec0 2148
e1f60b29
NM
2149 if (IS_ERR(opp)) {
2150 r = PTR_ERR(opp);
2151 goto unlock;
2152 }
2153
2154 /* Is update really needed? */
2155 if (opp->available == availability_req)
2156 goto unlock;
e1f60b29 2157
a7f3987e 2158 opp->available = availability_req;
e1f60b29 2159
e4d8ae00
VK
2160 dev_pm_opp_get(opp);
2161 mutex_unlock(&opp_table->lock);
2162
03ca370f
MH
2163 /* Notify the change of the OPP availability */
2164 if (availability_req)
052c6f19 2165 blocking_notifier_call_chain(&opp_table->head, OPP_EVENT_ENABLE,
a7f3987e 2166 opp);
03ca370f 2167 else
052c6f19 2168 blocking_notifier_call_chain(&opp_table->head,
a7f3987e 2169 OPP_EVENT_DISABLE, opp);
e1f60b29 2170
e4d8ae00
VK
2171 dev_pm_opp_put(opp);
2172 goto put_table;
2173
e1f60b29 2174unlock:
5b650b38 2175 mutex_unlock(&opp_table->lock);
e4d8ae00 2176put_table:
5b650b38 2177 dev_pm_opp_put_opp_table(opp_table);
e1f60b29
NM
2178 return r;
2179}
2180
25cb20a2
SB
2181/**
2182 * dev_pm_opp_adjust_voltage() - helper to change the voltage of an OPP
2183 * @dev: device for which we do this operation
2184 * @freq: OPP frequency to adjust voltage of
2185 * @u_volt: new OPP target voltage
2186 * @u_volt_min: new OPP min voltage
2187 * @u_volt_max: new OPP max voltage
2188 *
2189 * Return: -EINVAL for bad pointers, -ENOMEM if no memory available for the
2190 * copy operation, returns 0 if no modifcation was done OR modification was
2191 * successful.
2192 */
2193int dev_pm_opp_adjust_voltage(struct device *dev, unsigned long freq,
2194 unsigned long u_volt, unsigned long u_volt_min,
2195 unsigned long u_volt_max)
2196
2197{
2198 struct opp_table *opp_table;
2199 struct dev_pm_opp *tmp_opp, *opp = ERR_PTR(-ENODEV);
2200 int r = 0;
2201
2202 /* Find the opp_table */
2203 opp_table = _find_opp_table(dev);
2204 if (IS_ERR(opp_table)) {
2205 r = PTR_ERR(opp_table);
2206 dev_warn(dev, "%s: Device OPP not found (%d)\n", __func__, r);
2207 return r;
2208 }
2209
2210 mutex_lock(&opp_table->lock);
2211
2212 /* Do we have the frequency? */
2213 list_for_each_entry(tmp_opp, &opp_table->opp_list, node) {
2214 if (tmp_opp->rate == freq) {
2215 opp = tmp_opp;
2216 break;
2217 }
2218 }
2219
2220 if (IS_ERR(opp)) {
2221 r = PTR_ERR(opp);
2222 goto adjust_unlock;
2223 }
2224
2225 /* Is update really needed? */
2226 if (opp->supplies->u_volt == u_volt)
2227 goto adjust_unlock;
2228
2229 opp->supplies->u_volt = u_volt;
2230 opp->supplies->u_volt_min = u_volt_min;
2231 opp->supplies->u_volt_max = u_volt_max;
2232
2233 dev_pm_opp_get(opp);
2234 mutex_unlock(&opp_table->lock);
2235
2236 /* Notify the voltage change of the OPP */
2237 blocking_notifier_call_chain(&opp_table->head, OPP_EVENT_ADJUST_VOLTAGE,
2238 opp);
2239
2240 dev_pm_opp_put(opp);
2241 goto adjust_put_table;
2242
2243adjust_unlock:
2244 mutex_unlock(&opp_table->lock);
2245adjust_put_table:
2246 dev_pm_opp_put_opp_table(opp_table);
2247 return r;
2248}
2249
e1f60b29 2250/**
5d4879cd 2251 * dev_pm_opp_enable() - Enable a specific OPP
e1f60b29
NM
2252 * @dev: device for which we do this operation
2253 * @freq: OPP frequency to enable
2254 *
2255 * Enables a provided opp. If the operation is valid, this returns 0, else the
2256 * corresponding error value. It is meant to be used for users an OPP available
5d4879cd 2257 * after being temporarily made unavailable with dev_pm_opp_disable.
e1f60b29 2258 *
984f16c8 2259 * Return: -EINVAL for bad pointers, -ENOMEM if no memory available for the
e1a2d49c 2260 * copy operation, returns 0 if no modification was done OR modification was
984f16c8 2261 * successful.
e1f60b29 2262 */
5d4879cd 2263int dev_pm_opp_enable(struct device *dev, unsigned long freq)
e1f60b29 2264{
327854c8 2265 return _opp_set_availability(dev, freq, true);
e1f60b29 2266}
5d4879cd 2267EXPORT_SYMBOL_GPL(dev_pm_opp_enable);
e1f60b29
NM
2268
2269/**
5d4879cd 2270 * dev_pm_opp_disable() - Disable a specific OPP
e1f60b29
NM
2271 * @dev: device for which we do this operation
2272 * @freq: OPP frequency to disable
2273 *
2274 * Disables a provided opp. If the operation is valid, this returns
2275 * 0, else the corresponding error value. It is meant to be a temporary
2276 * control by users to make this OPP not available until the circumstances are
5d4879cd 2277 * right to make it available again (with a call to dev_pm_opp_enable).
e1f60b29 2278 *
984f16c8 2279 * Return: -EINVAL for bad pointers, -ENOMEM if no memory available for the
e1a2d49c 2280 * copy operation, returns 0 if no modification was done OR modification was
984f16c8 2281 * successful.
e1f60b29 2282 */
5d4879cd 2283int dev_pm_opp_disable(struct device *dev, unsigned long freq)
e1f60b29 2284{
327854c8 2285 return _opp_set_availability(dev, freq, false);
e1f60b29 2286}
5d4879cd 2287EXPORT_SYMBOL_GPL(dev_pm_opp_disable);
e1f60b29 2288
03ca370f 2289/**
dc2c9ad5
VK
2290 * dev_pm_opp_register_notifier() - Register OPP notifier for the device
2291 * @dev: Device for which notifier needs to be registered
2292 * @nb: Notifier block to be registered
984f16c8 2293 *
dc2c9ad5
VK
2294 * Return: 0 on success or a negative error value.
2295 */
2296int dev_pm_opp_register_notifier(struct device *dev, struct notifier_block *nb)
2297{
2298 struct opp_table *opp_table;
2299 int ret;
2300
dc2c9ad5 2301 opp_table = _find_opp_table(dev);
5b650b38
VK
2302 if (IS_ERR(opp_table))
2303 return PTR_ERR(opp_table);
2304
052c6f19 2305 ret = blocking_notifier_chain_register(&opp_table->head, nb);
dc2c9ad5 2306
5b650b38 2307 dev_pm_opp_put_opp_table(opp_table);
dc2c9ad5
VK
2308
2309 return ret;
2310}
2311EXPORT_SYMBOL(dev_pm_opp_register_notifier);
2312
2313/**
2314 * dev_pm_opp_unregister_notifier() - Unregister OPP notifier for the device
2315 * @dev: Device for which notifier needs to be unregistered
2316 * @nb: Notifier block to be unregistered
984f16c8 2317 *
dc2c9ad5 2318 * Return: 0 on success or a negative error value.
03ca370f 2319 */
dc2c9ad5
VK
2320int dev_pm_opp_unregister_notifier(struct device *dev,
2321 struct notifier_block *nb)
03ca370f 2322{
dc2c9ad5
VK
2323 struct opp_table *opp_table;
2324 int ret;
03ca370f 2325
dc2c9ad5 2326 opp_table = _find_opp_table(dev);
5b650b38
VK
2327 if (IS_ERR(opp_table))
2328 return PTR_ERR(opp_table);
dc2c9ad5 2329
052c6f19 2330 ret = blocking_notifier_chain_unregister(&opp_table->head, nb);
03ca370f 2331
5b650b38 2332 dev_pm_opp_put_opp_table(opp_table);
dc2c9ad5
VK
2333
2334 return ret;
03ca370f 2335}
dc2c9ad5 2336EXPORT_SYMBOL(dev_pm_opp_unregister_notifier);
b496dfbc 2337
2a4eb735 2338void _dev_pm_opp_find_and_remove_table(struct device *dev)
9274c892
VK
2339{
2340 struct opp_table *opp_table;
2341
2c2709dc
VK
2342 /* Check for existing table for 'dev' */
2343 opp_table = _find_opp_table(dev);
2344 if (IS_ERR(opp_table)) {
2345 int error = PTR_ERR(opp_table);
737002b5
VK
2346
2347 if (error != -ENODEV)
2c2709dc 2348 WARN(1, "%s: opp_table: %d\n",
737002b5
VK
2349 IS_ERR_OR_NULL(dev) ?
2350 "Invalid device" : dev_name(dev),
2351 error);
5b650b38 2352 return;
737002b5
VK
2353 }
2354
03758d60 2355 _opp_remove_all_static(opp_table);
cdd6ed90
VK
2356
2357 /* Drop reference taken by _find_opp_table() */
2358 dev_pm_opp_put_opp_table(opp_table);
737002b5 2359
cdd6ed90 2360 /* Drop reference taken while the OPP table was added */
5b650b38 2361 dev_pm_opp_put_opp_table(opp_table);
737002b5 2362}
129eec55
VK
2363
2364/**
411466c5 2365 * dev_pm_opp_remove_table() - Free all OPPs associated with the device
2c2709dc 2366 * @dev: device pointer used to lookup OPP table.
129eec55 2367 *
411466c5
SH
2368 * Free both OPPs created using static entries present in DT and the
2369 * dynamically added entries.
129eec55 2370 */
411466c5 2371void dev_pm_opp_remove_table(struct device *dev)
129eec55 2372{
2a4eb735 2373 _dev_pm_opp_find_and_remove_table(dev);
8d4d4e98 2374}
411466c5 2375EXPORT_SYMBOL_GPL(dev_pm_opp_remove_table);