2 * Generic OPP Interface
4 * Copyright (C) 2009-2010 Texas Instruments Incorporated.
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License version 2 as
11 * published by the Free Software Foundation.
14 #include <linux/kernel.h>
15 #include <linux/errno.h>
16 #include <linux/err.h>
17 #include <linux/slab.h>
18 #include <linux/device.h>
19 #include <linux/list.h>
20 #include <linux/rculist.h>
21 #include <linux/rcupdate.h>
22 #include <linux/pm_opp.h>
24 #include <linux/export.h>
27 * Internal data structure organization with the OPP layer library is as
30 * |- device 1 (represents voltage domain 1)
31 * | |- opp 1 (availability, freq, voltage)
35 * |- device 2 (represents the next voltage domain)
37 * `- device m (represents mth voltage domain)
38 * device 1, 2.. are represented by dev_opp structure while each opp
39 * is represented by the opp structure.
43 * struct dev_pm_opp - Generic OPP description structure
44 * @node: opp list node. The nodes are maintained throughout the lifetime
45 * of boot. It is expected only an optimal set of OPPs are
46 * added to the library by the SoC framework.
47 * RCU usage: opp list is traversed with RCU locks. node
48 * modification is possible realtime, hence the modifications
49 * are protected by the dev_opp_list_lock for integrity.
50 * IMPORTANT: the opp nodes should be maintained in increasing
52 * @available: true/false - marks if this OPP as available or not
53 * @rate: Frequency in hertz
54 * @u_volt: Nominal voltage in microvolts corresponding to this OPP
55 * @dev_opp: points back to the device_opp struct this opp belongs to
56 * @head: RCU callback head used for deferred freeing
58 * This structure stores the OPP information for a given device.
61 struct list_head node
;
67 struct device_opp
*dev_opp
;
72 * struct device_opp - Device opp structure
73 * @node: list node - contains the devices with OPPs that
74 * have been registered. Nodes once added are not modified in this
76 * RCU usage: nodes are not modified in the list of device_opp,
77 * however addition is possible and is secured by dev_opp_list_lock
78 * @dev: device pointer
79 * @head: notifier head to notify the OPP availability changes.
80 * @opp_list: list of opps
82 * This is an internal data structure maintaining the link to opps attached to
83 * a device. This structure is not meant to be shared to users as it is
84 * meant for book keeping and private to OPP library
87 struct list_head node
;
90 struct srcu_notifier_head head
;
91 struct list_head opp_list
;
95 * The root of the list of all devices. All device_opp structures branch off
96 * from here, with each device_opp containing the list of opp it supports in
97 * various states of availability.
99 static LIST_HEAD(dev_opp_list
);
100 /* Lock to allow exclusive modification to the device and opp lists */
101 static DEFINE_MUTEX(dev_opp_list_lock
);
104 * find_device_opp() - find device_opp struct using device pointer
105 * @dev: device pointer used to lookup device OPPs
107 * Search list of device OPPs for one containing matching device. Does a RCU
108 * reader operation to grab the pointer needed.
110 * Returns pointer to 'struct device_opp' if found, otherwise -ENODEV or
111 * -EINVAL based on type of error.
113 * Locking: This function must be called under rcu_read_lock(). device_opp
114 * is a RCU protected pointer. This means that device_opp is valid as long
115 * as we are under RCU lock.
117 static struct device_opp
*find_device_opp(struct device
*dev
)
119 struct device_opp
*tmp_dev_opp
, *dev_opp
= ERR_PTR(-ENODEV
);
121 if (unlikely(IS_ERR_OR_NULL(dev
))) {
122 pr_err("%s: Invalid parameters\n", __func__
);
123 return ERR_PTR(-EINVAL
);
126 list_for_each_entry_rcu(tmp_dev_opp
, &dev_opp_list
, node
) {
127 if (tmp_dev_opp
->dev
== dev
) {
128 dev_opp
= tmp_dev_opp
;
137 * dev_pm_opp_get_voltage() - Gets the voltage corresponding to an available opp
138 * @opp: opp for which voltage has to be returned for
140 * Return voltage in micro volt corresponding to the opp, else
143 * Locking: This function must be called under rcu_read_lock(). opp is a rcu
144 * protected pointer. This means that opp which could have been fetched by
145 * opp_find_freq_{exact,ceil,floor} functions is valid as long as we are
146 * under RCU lock. The pointer returned by the opp_find_freq family must be
147 * used in the same section as the usage of this function with the pointer
148 * prior to unlocking with rcu_read_unlock() to maintain the integrity of the
151 unsigned long dev_pm_opp_get_voltage(struct dev_pm_opp
*opp
)
153 struct dev_pm_opp
*tmp_opp
;
156 tmp_opp
= rcu_dereference(opp
);
157 if (unlikely(IS_ERR_OR_NULL(tmp_opp
)) || !tmp_opp
->available
)
158 pr_err("%s: Invalid parameters\n", __func__
);
164 EXPORT_SYMBOL_GPL(dev_pm_opp_get_voltage
);
167 * dev_pm_opp_get_freq() - Gets the frequency corresponding to an available opp
168 * @opp: opp for which frequency has to be returned for
170 * Return frequency in hertz corresponding to the opp, else
173 * Locking: This function must be called under rcu_read_lock(). opp is a rcu
174 * protected pointer. This means that opp which could have been fetched by
175 * opp_find_freq_{exact,ceil,floor} functions is valid as long as we are
176 * under RCU lock. The pointer returned by the opp_find_freq family must be
177 * used in the same section as the usage of this function with the pointer
178 * prior to unlocking with rcu_read_unlock() to maintain the integrity of the
181 unsigned long dev_pm_opp_get_freq(struct dev_pm_opp
*opp
)
183 struct dev_pm_opp
*tmp_opp
;
186 tmp_opp
= rcu_dereference(opp
);
187 if (unlikely(IS_ERR_OR_NULL(tmp_opp
)) || !tmp_opp
->available
)
188 pr_err("%s: Invalid parameters\n", __func__
);
194 EXPORT_SYMBOL_GPL(dev_pm_opp_get_freq
);
197 * dev_pm_opp_get_opp_count() - Get number of opps available in the opp list
198 * @dev: device for which we do this operation
200 * This function returns the number of available opps if there are any,
201 * else returns 0 if none or the corresponding error value.
203 * Locking: This function must be called under rcu_read_lock(). This function
204 * internally references two RCU protected structures: device_opp and opp which
205 * are safe as long as we are under a common RCU locked section.
207 int dev_pm_opp_get_opp_count(struct device
*dev
)
209 struct device_opp
*dev_opp
;
210 struct dev_pm_opp
*temp_opp
;
213 dev_opp
= find_device_opp(dev
);
214 if (IS_ERR(dev_opp
)) {
215 int r
= PTR_ERR(dev_opp
);
216 dev_err(dev
, "%s: device OPP not found (%d)\n", __func__
, r
);
220 list_for_each_entry_rcu(temp_opp
, &dev_opp
->opp_list
, node
) {
221 if (temp_opp
->available
)
227 EXPORT_SYMBOL_GPL(dev_pm_opp_get_opp_count
);
230 * dev_pm_opp_find_freq_exact() - search for an exact frequency
231 * @dev: device for which we do this operation
232 * @freq: frequency to search for
233 * @available: true/false - match for available opp
235 * Searches for exact match in the opp list and returns pointer to the matching
236 * opp if found, else returns ERR_PTR in case of error and should be handled
237 * using IS_ERR. Error return values can be:
238 * EINVAL: for bad pointer
239 * ERANGE: no match found for search
240 * ENODEV: if device not found in list of registered devices
242 * Note: available is a modifier for the search. if available=true, then the
243 * match is for exact matching frequency and is available in the stored OPP
244 * table. if false, the match is for exact frequency which is not available.
246 * This provides a mechanism to enable an opp which is not available currently
247 * or the opposite as well.
249 * Locking: This function must be called under rcu_read_lock(). opp is a rcu
250 * protected pointer. The reason for the same is that the opp pointer which is
251 * returned will remain valid for use with opp_get_{voltage, freq} only while
252 * under the locked area. The pointer returned must be used prior to unlocking
253 * with rcu_read_unlock() to maintain the integrity of the pointer.
255 struct dev_pm_opp
*dev_pm_opp_find_freq_exact(struct device
*dev
,
259 struct device_opp
*dev_opp
;
260 struct dev_pm_opp
*temp_opp
, *opp
= ERR_PTR(-ERANGE
);
262 dev_opp
= find_device_opp(dev
);
263 if (IS_ERR(dev_opp
)) {
264 int r
= PTR_ERR(dev_opp
);
265 dev_err(dev
, "%s: device OPP not found (%d)\n", __func__
, r
);
269 list_for_each_entry_rcu(temp_opp
, &dev_opp
->opp_list
, node
) {
270 if (temp_opp
->available
== available
&&
271 temp_opp
->rate
== freq
) {
279 EXPORT_SYMBOL_GPL(dev_pm_opp_find_freq_exact
);
282 * dev_pm_opp_find_freq_ceil() - Search for an rounded ceil freq
283 * @dev: device for which we do this operation
284 * @freq: Start frequency
286 * Search for the matching ceil *available* OPP from a starting freq
289 * Returns matching *opp and refreshes *freq accordingly, else returns
290 * ERR_PTR in case of error and should be handled using IS_ERR. Error return
292 * EINVAL: for bad pointer
293 * ERANGE: no match found for search
294 * ENODEV: if device not found in list of registered devices
296 * Locking: This function must be called under rcu_read_lock(). opp is a rcu
297 * protected pointer. The reason for the same is that the opp pointer which is
298 * returned will remain valid for use with opp_get_{voltage, freq} only while
299 * under the locked area. The pointer returned must be used prior to unlocking
300 * with rcu_read_unlock() to maintain the integrity of the pointer.
302 struct dev_pm_opp
*dev_pm_opp_find_freq_ceil(struct device
*dev
,
305 struct device_opp
*dev_opp
;
306 struct dev_pm_opp
*temp_opp
, *opp
= ERR_PTR(-ERANGE
);
309 dev_err(dev
, "%s: Invalid argument freq=%p\n", __func__
, freq
);
310 return ERR_PTR(-EINVAL
);
313 dev_opp
= find_device_opp(dev
);
315 return ERR_CAST(dev_opp
);
317 list_for_each_entry_rcu(temp_opp
, &dev_opp
->opp_list
, node
) {
318 if (temp_opp
->available
&& temp_opp
->rate
>= *freq
) {
327 EXPORT_SYMBOL_GPL(dev_pm_opp_find_freq_ceil
);
330 * dev_pm_opp_find_freq_floor() - Search for a rounded floor freq
331 * @dev: device for which we do this operation
332 * @freq: Start frequency
334 * Search for the matching floor *available* OPP from a starting freq
337 * Returns matching *opp and refreshes *freq accordingly, else returns
338 * ERR_PTR in case of error and should be handled using IS_ERR. Error return
340 * EINVAL: for bad pointer
341 * ERANGE: no match found for search
342 * ENODEV: if device not found in list of registered devices
344 * Locking: This function must be called under rcu_read_lock(). opp is a rcu
345 * protected pointer. The reason for the same is that the opp pointer which is
346 * returned will remain valid for use with opp_get_{voltage, freq} only while
347 * under the locked area. The pointer returned must be used prior to unlocking
348 * with rcu_read_unlock() to maintain the integrity of the pointer.
350 struct dev_pm_opp
*dev_pm_opp_find_freq_floor(struct device
*dev
,
353 struct device_opp
*dev_opp
;
354 struct dev_pm_opp
*temp_opp
, *opp
= ERR_PTR(-ERANGE
);
357 dev_err(dev
, "%s: Invalid argument freq=%p\n", __func__
, freq
);
358 return ERR_PTR(-EINVAL
);
361 dev_opp
= find_device_opp(dev
);
363 return ERR_CAST(dev_opp
);
365 list_for_each_entry_rcu(temp_opp
, &dev_opp
->opp_list
, node
) {
366 if (temp_opp
->available
) {
367 /* go to the next node, before choosing prev */
368 if (temp_opp
->rate
> *freq
)
379 EXPORT_SYMBOL_GPL(dev_pm_opp_find_freq_floor
);
382 * dev_pm_opp_add() - Add an OPP table from a table definitions
383 * @dev: device for which we do this operation
384 * @freq: Frequency in Hz for this OPP
385 * @u_volt: Voltage in uVolts for this OPP
387 * This function adds an opp definition to the opp list and returns status.
388 * The opp is made available by default and it can be controlled using
389 * dev_pm_opp_enable/disable functions.
391 * Locking: The internal device_opp and opp structures are RCU protected.
392 * Hence this function internally uses RCU updater strategy with mutex locks
393 * to keep the integrity of the internal data structures. Callers should ensure
394 * that this function is *NOT* called under RCU protection or in contexts where
395 * mutex cannot be locked.
399 * Duplicate OPPs (both freq and volt are same) and opp->available
400 * -EEXIST: Freq are same and volt are different OR
401 * Duplicate OPPs (both freq and volt are same) and !opp->available
402 * -ENOMEM: Memory allocation failure
404 int dev_pm_opp_add(struct device
*dev
, unsigned long freq
, unsigned long u_volt
)
406 struct device_opp
*dev_opp
= NULL
;
407 struct dev_pm_opp
*opp
, *new_opp
;
408 struct list_head
*head
;
410 /* allocate new OPP node */
411 new_opp
= kzalloc(sizeof(*new_opp
), GFP_KERNEL
);
413 dev_warn(dev
, "%s: Unable to create new OPP node\n", __func__
);
417 /* Hold our list modification lock here */
418 mutex_lock(&dev_opp_list_lock
);
420 /* Check for existing list for 'dev' */
421 dev_opp
= find_device_opp(dev
);
422 if (IS_ERR(dev_opp
)) {
424 * Allocate a new device OPP table. In the infrequent case
425 * where a new device is needed to be added, we pay this
428 dev_opp
= kzalloc(sizeof(struct device_opp
), GFP_KERNEL
);
430 mutex_unlock(&dev_opp_list_lock
);
433 "%s: Unable to create device OPP structure\n",
439 srcu_init_notifier_head(&dev_opp
->head
);
440 INIT_LIST_HEAD(&dev_opp
->opp_list
);
442 /* Secure the device list modification */
443 list_add_rcu(&dev_opp
->node
, &dev_opp_list
);
446 /* populate the opp table */
447 new_opp
->dev_opp
= dev_opp
;
448 new_opp
->rate
= freq
;
449 new_opp
->u_volt
= u_volt
;
450 new_opp
->available
= true;
453 * Insert new OPP in order of increasing frequency
454 * and discard if already present
456 head
= &dev_opp
->opp_list
;
457 list_for_each_entry_rcu(opp
, &dev_opp
->opp_list
, node
) {
458 if (new_opp
->rate
<= opp
->rate
)
464 /* Duplicate OPPs ? */
465 if (new_opp
->rate
== opp
->rate
) {
466 int ret
= opp
->available
&& new_opp
->u_volt
== opp
->u_volt
?
469 dev_warn(dev
, "%s: duplicate OPPs detected. Existing: freq: %lu, volt: %lu, enabled: %d. New: freq: %lu, volt: %lu, enabled: %d\n",
470 __func__
, opp
->rate
, opp
->u_volt
, opp
->available
,
471 new_opp
->rate
, new_opp
->u_volt
, new_opp
->available
);
472 mutex_unlock(&dev_opp_list_lock
);
477 list_add_rcu(&new_opp
->node
, head
);
478 mutex_unlock(&dev_opp_list_lock
);
481 * Notify the changes in the availability of the operable
482 * frequency/voltage list.
484 srcu_notifier_call_chain(&dev_opp
->head
, OPP_EVENT_ADD
, new_opp
);
487 EXPORT_SYMBOL_GPL(dev_pm_opp_add
);
490 * opp_set_availability() - helper to set the availability of an opp
491 * @dev: device for which we do this operation
492 * @freq: OPP frequency to modify availability
493 * @availability_req: availability status requested for this opp
495 * Set the availability of an OPP with an RCU operation, opp_{enable,disable}
496 * share a common logic which is isolated here.
498 * Returns -EINVAL for bad pointers, -ENOMEM if no memory available for the
499 * copy operation, returns 0 if no modifcation was done OR modification was
502 * Locking: The internal device_opp and opp structures are RCU protected.
503 * Hence this function internally uses RCU updater strategy with mutex locks to
504 * keep the integrity of the internal data structures. Callers should ensure
505 * that this function is *NOT* called under RCU protection or in contexts where
506 * mutex locking or synchronize_rcu() blocking calls cannot be used.
508 static int opp_set_availability(struct device
*dev
, unsigned long freq
,
509 bool availability_req
)
511 struct device_opp
*tmp_dev_opp
, *dev_opp
= ERR_PTR(-ENODEV
);
512 struct dev_pm_opp
*new_opp
, *tmp_opp
, *opp
= ERR_PTR(-ENODEV
);
515 /* keep the node allocated */
516 new_opp
= kmalloc(sizeof(*new_opp
), GFP_KERNEL
);
518 dev_warn(dev
, "%s: Unable to create OPP\n", __func__
);
522 mutex_lock(&dev_opp_list_lock
);
524 /* Find the device_opp */
525 list_for_each_entry(tmp_dev_opp
, &dev_opp_list
, node
) {
526 if (dev
== tmp_dev_opp
->dev
) {
527 dev_opp
= tmp_dev_opp
;
531 if (IS_ERR(dev_opp
)) {
532 r
= PTR_ERR(dev_opp
);
533 dev_warn(dev
, "%s: Device OPP not found (%d)\n", __func__
, r
);
537 /* Do we have the frequency? */
538 list_for_each_entry(tmp_opp
, &dev_opp
->opp_list
, node
) {
539 if (tmp_opp
->rate
== freq
) {
549 /* Is update really needed? */
550 if (opp
->available
== availability_req
)
552 /* copy the old data over */
555 /* plug in new node */
556 new_opp
->available
= availability_req
;
558 list_replace_rcu(&opp
->node
, &new_opp
->node
);
559 mutex_unlock(&dev_opp_list_lock
);
560 kfree_rcu(opp
, head
);
562 /* Notify the change of the OPP availability */
563 if (availability_req
)
564 srcu_notifier_call_chain(&dev_opp
->head
, OPP_EVENT_ENABLE
,
567 srcu_notifier_call_chain(&dev_opp
->head
, OPP_EVENT_DISABLE
,
573 mutex_unlock(&dev_opp_list_lock
);
579 * dev_pm_opp_enable() - Enable a specific OPP
580 * @dev: device for which we do this operation
581 * @freq: OPP frequency to enable
583 * Enables a provided opp. If the operation is valid, this returns 0, else the
584 * corresponding error value. It is meant to be used for users an OPP available
585 * after being temporarily made unavailable with dev_pm_opp_disable.
587 * Locking: The internal device_opp and opp structures are RCU protected.
588 * Hence this function indirectly uses RCU and mutex locks to keep the
589 * integrity of the internal data structures. Callers should ensure that
590 * this function is *NOT* called under RCU protection or in contexts where
591 * mutex locking or synchronize_rcu() blocking calls cannot be used.
593 int dev_pm_opp_enable(struct device
*dev
, unsigned long freq
)
595 return opp_set_availability(dev
, freq
, true);
597 EXPORT_SYMBOL_GPL(dev_pm_opp_enable
);
600 * dev_pm_opp_disable() - Disable a specific OPP
601 * @dev: device for which we do this operation
602 * @freq: OPP frequency to disable
604 * Disables a provided opp. If the operation is valid, this returns
605 * 0, else the corresponding error value. It is meant to be a temporary
606 * control by users to make this OPP not available until the circumstances are
607 * right to make it available again (with a call to dev_pm_opp_enable).
609 * Locking: The internal device_opp and opp structures are RCU protected.
610 * Hence this function indirectly uses RCU and mutex locks to keep the
611 * integrity of the internal data structures. Callers should ensure that
612 * this function is *NOT* called under RCU protection or in contexts where
613 * mutex locking or synchronize_rcu() blocking calls cannot be used.
615 int dev_pm_opp_disable(struct device
*dev
, unsigned long freq
)
617 return opp_set_availability(dev
, freq
, false);
619 EXPORT_SYMBOL_GPL(dev_pm_opp_disable
);
622 * dev_pm_opp_get_notifier() - find notifier_head of the device with opp
623 * @dev: device pointer used to lookup device OPPs.
625 struct srcu_notifier_head
*dev_pm_opp_get_notifier(struct device
*dev
)
627 struct device_opp
*dev_opp
= find_device_opp(dev
);
630 return ERR_CAST(dev_opp
); /* matching type */
632 return &dev_opp
->head
;
637 * of_init_opp_table() - Initialize opp table from device tree
638 * @dev: device pointer used to lookup device OPPs.
640 * Register the initial OPP table with the OPP library for given device.
642 int of_init_opp_table(struct device
*dev
)
644 const struct property
*prop
;
648 prop
= of_find_property(dev
->of_node
, "operating-points", NULL
);
655 * Each OPP is a set of tuples consisting of frequency and
656 * voltage like <freq-kHz vol-uV>.
658 nr
= prop
->length
/ sizeof(u32
);
660 dev_err(dev
, "%s: Invalid OPP list\n", __func__
);
666 unsigned long freq
= be32_to_cpup(val
++) * 1000;
667 unsigned long volt
= be32_to_cpup(val
++);
669 if (dev_pm_opp_add(dev
, freq
, volt
))
670 dev_warn(dev
, "%s: Failed to add OPP %ld\n",
677 EXPORT_SYMBOL_GPL(of_init_opp_table
);