xref: /linux/drivers/opp/of.c (revision 5c35a02c545a7bbe77f3a1ae337d9e29beed079b)
1 /*
2  * Generic OPP OF helpers
3  *
4  * Copyright (C) 2009-2010 Texas Instruments Incorporated.
5  *	Nishanth Menon
6  *	Romit Dasgupta
7  *	Kevin Hilman
8  *
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.
12  */
13 
14 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
15 
16 #include <linux/cpu.h>
17 #include <linux/errno.h>
18 #include <linux/device.h>
19 #include <linux/of_device.h>
20 #include <linux/pm_domain.h>
21 #include <linux/slab.h>
22 #include <linux/export.h>
23 
24 #include "opp.h"
25 
26 static struct opp_table *_managed_opp(const struct device_node *np)
27 {
28 	struct opp_table *opp_table, *managed_table = NULL;
29 
30 	mutex_lock(&opp_table_lock);
31 
32 	list_for_each_entry(opp_table, &opp_tables, node) {
33 		if (opp_table->np == np) {
34 			/*
35 			 * Multiple devices can point to the same OPP table and
36 			 * so will have same node-pointer, np.
37 			 *
38 			 * But the OPPs will be considered as shared only if the
39 			 * OPP table contains a "opp-shared" property.
40 			 */
41 			if (opp_table->shared_opp == OPP_TABLE_ACCESS_SHARED) {
42 				_get_opp_table_kref(opp_table);
43 				managed_table = opp_table;
44 			}
45 
46 			break;
47 		}
48 	}
49 
50 	mutex_unlock(&opp_table_lock);
51 
52 	return managed_table;
53 }
54 
55 void _of_init_opp_table(struct opp_table *opp_table, struct device *dev)
56 {
57 	struct device_node *np;
58 
59 	/*
60 	 * Only required for backward compatibility with v1 bindings, but isn't
61 	 * harmful for other cases. And so we do it unconditionally.
62 	 */
63 	np = of_node_get(dev->of_node);
64 	if (np) {
65 		u32 val;
66 
67 		if (!of_property_read_u32(np, "clock-latency", &val))
68 			opp_table->clock_latency_ns_max = val;
69 		of_property_read_u32(np, "voltage-tolerance",
70 				     &opp_table->voltage_tolerance_v1);
71 		of_node_put(np);
72 	}
73 }
74 
75 static bool _opp_is_supported(struct device *dev, struct opp_table *opp_table,
76 			      struct device_node *np)
77 {
78 	unsigned int count = opp_table->supported_hw_count;
79 	u32 version;
80 	int ret;
81 
82 	if (!opp_table->supported_hw) {
83 		/*
84 		 * In the case that no supported_hw has been set by the
85 		 * platform but there is an opp-supported-hw value set for
86 		 * an OPP then the OPP should not be enabled as there is
87 		 * no way to see if the hardware supports it.
88 		 */
89 		if (of_find_property(np, "opp-supported-hw", NULL))
90 			return false;
91 		else
92 			return true;
93 	}
94 
95 	while (count--) {
96 		ret = of_property_read_u32_index(np, "opp-supported-hw", count,
97 						 &version);
98 		if (ret) {
99 			dev_warn(dev, "%s: failed to read opp-supported-hw property at index %d: %d\n",
100 				 __func__, count, ret);
101 			return false;
102 		}
103 
104 		/* Both of these are bitwise masks of the versions */
105 		if (!(version & opp_table->supported_hw[count]))
106 			return false;
107 	}
108 
109 	return true;
110 }
111 
112 static int opp_parse_supplies(struct dev_pm_opp *opp, struct device *dev,
113 			      struct opp_table *opp_table)
114 {
115 	u32 *microvolt, *microamp = NULL;
116 	int supplies, vcount, icount, ret, i, j;
117 	struct property *prop = NULL;
118 	char name[NAME_MAX];
119 
120 	supplies = opp_table->regulator_count ? opp_table->regulator_count : 1;
121 
122 	/* Search for "opp-microvolt-<name>" */
123 	if (opp_table->prop_name) {
124 		snprintf(name, sizeof(name), "opp-microvolt-%s",
125 			 opp_table->prop_name);
126 		prop = of_find_property(opp->np, name, NULL);
127 	}
128 
129 	if (!prop) {
130 		/* Search for "opp-microvolt" */
131 		sprintf(name, "opp-microvolt");
132 		prop = of_find_property(opp->np, name, NULL);
133 
134 		/* Missing property isn't a problem, but an invalid entry is */
135 		if (!prop) {
136 			if (!opp_table->regulator_count)
137 				return 0;
138 
139 			dev_err(dev, "%s: opp-microvolt missing although OPP managing regulators\n",
140 				__func__);
141 			return -EINVAL;
142 		}
143 	}
144 
145 	vcount = of_property_count_u32_elems(opp->np, name);
146 	if (vcount < 0) {
147 		dev_err(dev, "%s: Invalid %s property (%d)\n",
148 			__func__, name, vcount);
149 		return vcount;
150 	}
151 
152 	/* There can be one or three elements per supply */
153 	if (vcount != supplies && vcount != supplies * 3) {
154 		dev_err(dev, "%s: Invalid number of elements in %s property (%d) with supplies (%d)\n",
155 			__func__, name, vcount, supplies);
156 		return -EINVAL;
157 	}
158 
159 	microvolt = kmalloc_array(vcount, sizeof(*microvolt), GFP_KERNEL);
160 	if (!microvolt)
161 		return -ENOMEM;
162 
163 	ret = of_property_read_u32_array(opp->np, name, microvolt, vcount);
164 	if (ret) {
165 		dev_err(dev, "%s: error parsing %s: %d\n", __func__, name, ret);
166 		ret = -EINVAL;
167 		goto free_microvolt;
168 	}
169 
170 	/* Search for "opp-microamp-<name>" */
171 	prop = NULL;
172 	if (opp_table->prop_name) {
173 		snprintf(name, sizeof(name), "opp-microamp-%s",
174 			 opp_table->prop_name);
175 		prop = of_find_property(opp->np, name, NULL);
176 	}
177 
178 	if (!prop) {
179 		/* Search for "opp-microamp" */
180 		sprintf(name, "opp-microamp");
181 		prop = of_find_property(opp->np, name, NULL);
182 	}
183 
184 	if (prop) {
185 		icount = of_property_count_u32_elems(opp->np, name);
186 		if (icount < 0) {
187 			dev_err(dev, "%s: Invalid %s property (%d)\n", __func__,
188 				name, icount);
189 			ret = icount;
190 			goto free_microvolt;
191 		}
192 
193 		if (icount != supplies) {
194 			dev_err(dev, "%s: Invalid number of elements in %s property (%d) with supplies (%d)\n",
195 				__func__, name, icount, supplies);
196 			ret = -EINVAL;
197 			goto free_microvolt;
198 		}
199 
200 		microamp = kmalloc_array(icount, sizeof(*microamp), GFP_KERNEL);
201 		if (!microamp) {
202 			ret = -EINVAL;
203 			goto free_microvolt;
204 		}
205 
206 		ret = of_property_read_u32_array(opp->np, name, microamp,
207 						 icount);
208 		if (ret) {
209 			dev_err(dev, "%s: error parsing %s: %d\n", __func__,
210 				name, ret);
211 			ret = -EINVAL;
212 			goto free_microamp;
213 		}
214 	}
215 
216 	for (i = 0, j = 0; i < supplies; i++) {
217 		opp->supplies[i].u_volt = microvolt[j++];
218 
219 		if (vcount == supplies) {
220 			opp->supplies[i].u_volt_min = opp->supplies[i].u_volt;
221 			opp->supplies[i].u_volt_max = opp->supplies[i].u_volt;
222 		} else {
223 			opp->supplies[i].u_volt_min = microvolt[j++];
224 			opp->supplies[i].u_volt_max = microvolt[j++];
225 		}
226 
227 		if (microamp)
228 			opp->supplies[i].u_amp = microamp[i];
229 	}
230 
231 free_microamp:
232 	kfree(microamp);
233 free_microvolt:
234 	kfree(microvolt);
235 
236 	return ret;
237 }
238 
239 /**
240  * dev_pm_opp_of_remove_table() - Free OPP table entries created from static DT
241  *				  entries
242  * @dev:	device pointer used to lookup OPP table.
243  *
244  * Free OPPs created using static entries present in DT.
245  */
246 void dev_pm_opp_of_remove_table(struct device *dev)
247 {
248 	_dev_pm_opp_find_and_remove_table(dev, false);
249 }
250 EXPORT_SYMBOL_GPL(dev_pm_opp_of_remove_table);
251 
252 /* Returns opp descriptor node for a device node, caller must
253  * do of_node_put() */
254 static struct device_node *_opp_of_get_opp_desc_node(struct device_node *np,
255 						     int index)
256 {
257 	/* "operating-points-v2" can be an array for power domain providers */
258 	return of_parse_phandle(np, "operating-points-v2", index);
259 }
260 
261 /* Returns opp descriptor node for a device, caller must do of_node_put() */
262 struct device_node *dev_pm_opp_of_get_opp_desc_node(struct device *dev)
263 {
264 	return _opp_of_get_opp_desc_node(dev->of_node, 0);
265 }
266 EXPORT_SYMBOL_GPL(dev_pm_opp_of_get_opp_desc_node);
267 
268 /**
269  * _opp_add_static_v2() - Allocate static OPPs (As per 'v2' DT bindings)
270  * @opp_table:	OPP table
271  * @dev:	device for which we do this operation
272  * @np:		device node
273  *
274  * This function adds an opp definition to the opp table and returns status. The
275  * opp can be controlled using dev_pm_opp_enable/disable functions and may be
276  * removed by dev_pm_opp_remove.
277  *
278  * Return:
279  * 0		On success OR
280  *		Duplicate OPPs (both freq and volt are same) and opp->available
281  * -EEXIST	Freq are same and volt are different OR
282  *		Duplicate OPPs (both freq and volt are same) and !opp->available
283  * -ENOMEM	Memory allocation failure
284  * -EINVAL	Failed parsing the OPP node
285  */
286 static int _opp_add_static_v2(struct opp_table *opp_table, struct device *dev,
287 			      struct device_node *np)
288 {
289 	struct dev_pm_opp *new_opp;
290 	u64 rate = 0;
291 	u32 val;
292 	int ret;
293 	bool rate_not_available = false;
294 
295 	new_opp = _opp_allocate(opp_table);
296 	if (!new_opp)
297 		return -ENOMEM;
298 
299 	ret = of_property_read_u64(np, "opp-hz", &rate);
300 	if (ret < 0) {
301 		/* "opp-hz" is optional for devices like power domains. */
302 		if (!of_find_property(dev->of_node, "#power-domain-cells",
303 				      NULL)) {
304 			dev_err(dev, "%s: opp-hz not found\n", __func__);
305 			goto free_opp;
306 		}
307 
308 		rate_not_available = true;
309 	} else {
310 		/*
311 		 * Rate is defined as an unsigned long in clk API, and so
312 		 * casting explicitly to its type. Must be fixed once rate is 64
313 		 * bit guaranteed in clk API.
314 		 */
315 		new_opp->rate = (unsigned long)rate;
316 	}
317 
318 	/* Check if the OPP supports hardware's hierarchy of versions or not */
319 	if (!_opp_is_supported(dev, opp_table, np)) {
320 		dev_dbg(dev, "OPP not supported by hardware: %llu\n", rate);
321 		goto free_opp;
322 	}
323 
324 	new_opp->turbo = of_property_read_bool(np, "turbo-mode");
325 
326 	new_opp->np = np;
327 	new_opp->dynamic = false;
328 	new_opp->available = true;
329 
330 	if (!of_property_read_u32(np, "clock-latency-ns", &val))
331 		new_opp->clock_latency_ns = val;
332 
333 	new_opp->pstate = of_genpd_opp_to_performance_state(dev, np);
334 
335 	ret = opp_parse_supplies(new_opp, dev, opp_table);
336 	if (ret)
337 		goto free_opp;
338 
339 	ret = _opp_add(dev, new_opp, opp_table, rate_not_available);
340 	if (ret) {
341 		/* Don't return error for duplicate OPPs */
342 		if (ret == -EBUSY)
343 			ret = 0;
344 		goto free_opp;
345 	}
346 
347 	/* OPP to select on device suspend */
348 	if (of_property_read_bool(np, "opp-suspend")) {
349 		if (opp_table->suspend_opp) {
350 			dev_warn(dev, "%s: Multiple suspend OPPs found (%lu %lu)\n",
351 				 __func__, opp_table->suspend_opp->rate,
352 				 new_opp->rate);
353 		} else {
354 			new_opp->suspend = true;
355 			opp_table->suspend_opp = new_opp;
356 		}
357 	}
358 
359 	if (new_opp->clock_latency_ns > opp_table->clock_latency_ns_max)
360 		opp_table->clock_latency_ns_max = new_opp->clock_latency_ns;
361 
362 	pr_debug("%s: turbo:%d rate:%lu uv:%lu uvmin:%lu uvmax:%lu latency:%lu\n",
363 		 __func__, new_opp->turbo, new_opp->rate,
364 		 new_opp->supplies[0].u_volt, new_opp->supplies[0].u_volt_min,
365 		 new_opp->supplies[0].u_volt_max, new_opp->clock_latency_ns);
366 
367 	/*
368 	 * Notify the changes in the availability of the operable
369 	 * frequency/voltage list.
370 	 */
371 	blocking_notifier_call_chain(&opp_table->head, OPP_EVENT_ADD, new_opp);
372 	return 0;
373 
374 free_opp:
375 	_opp_free(new_opp);
376 
377 	return ret;
378 }
379 
380 /* Initializes OPP tables based on new bindings */
381 static int _of_add_opp_table_v2(struct device *dev, struct device_node *opp_np)
382 {
383 	struct device_node *np;
384 	struct opp_table *opp_table;
385 	int ret = 0, count = 0, pstate_count = 0;
386 	struct dev_pm_opp *opp;
387 
388 	opp_table = _managed_opp(opp_np);
389 	if (opp_table) {
390 		/* OPPs are already managed */
391 		if (!_add_opp_dev(dev, opp_table))
392 			ret = -ENOMEM;
393 		goto put_opp_table;
394 	}
395 
396 	opp_table = dev_pm_opp_get_opp_table(dev);
397 	if (!opp_table)
398 		return -ENOMEM;
399 
400 	/* We have opp-table node now, iterate over it and add OPPs */
401 	for_each_available_child_of_node(opp_np, np) {
402 		count++;
403 
404 		ret = _opp_add_static_v2(opp_table, dev, np);
405 		if (ret) {
406 			dev_err(dev, "%s: Failed to add OPP, %d\n", __func__,
407 				ret);
408 			_dev_pm_opp_remove_table(opp_table, dev, false);
409 			of_node_put(np);
410 			goto put_opp_table;
411 		}
412 	}
413 
414 	/* There should be one of more OPP defined */
415 	if (WARN_ON(!count)) {
416 		ret = -ENOENT;
417 		goto put_opp_table;
418 	}
419 
420 	list_for_each_entry(opp, &opp_table->opp_list, node)
421 		pstate_count += !!opp->pstate;
422 
423 	/* Either all or none of the nodes shall have performance state set */
424 	if (pstate_count && pstate_count != count) {
425 		dev_err(dev, "Not all nodes have performance state set (%d: %d)\n",
426 			count, pstate_count);
427 		ret = -ENOENT;
428 		goto put_opp_table;
429 	}
430 
431 	if (pstate_count)
432 		opp_table->genpd_performance_state = true;
433 
434 	opp_table->np = opp_np;
435 	if (of_property_read_bool(opp_np, "opp-shared"))
436 		opp_table->shared_opp = OPP_TABLE_ACCESS_SHARED;
437 	else
438 		opp_table->shared_opp = OPP_TABLE_ACCESS_EXCLUSIVE;
439 
440 put_opp_table:
441 	dev_pm_opp_put_opp_table(opp_table);
442 
443 	return ret;
444 }
445 
446 /* Initializes OPP tables based on old-deprecated bindings */
447 static int _of_add_opp_table_v1(struct device *dev)
448 {
449 	struct opp_table *opp_table;
450 	const struct property *prop;
451 	const __be32 *val;
452 	int nr, ret = 0;
453 
454 	prop = of_find_property(dev->of_node, "operating-points", NULL);
455 	if (!prop)
456 		return -ENODEV;
457 	if (!prop->value)
458 		return -ENODATA;
459 
460 	/*
461 	 * Each OPP is a set of tuples consisting of frequency and
462 	 * voltage like <freq-kHz vol-uV>.
463 	 */
464 	nr = prop->length / sizeof(u32);
465 	if (nr % 2) {
466 		dev_err(dev, "%s: Invalid OPP table\n", __func__);
467 		return -EINVAL;
468 	}
469 
470 	opp_table = dev_pm_opp_get_opp_table(dev);
471 	if (!opp_table)
472 		return -ENOMEM;
473 
474 	val = prop->value;
475 	while (nr) {
476 		unsigned long freq = be32_to_cpup(val++) * 1000;
477 		unsigned long volt = be32_to_cpup(val++);
478 
479 		ret = _opp_add_v1(opp_table, dev, freq, volt, false);
480 		if (ret) {
481 			dev_err(dev, "%s: Failed to add OPP %ld (%d)\n",
482 				__func__, freq, ret);
483 			_dev_pm_opp_remove_table(opp_table, dev, false);
484 			break;
485 		}
486 		nr -= 2;
487 	}
488 
489 	dev_pm_opp_put_opp_table(opp_table);
490 	return ret;
491 }
492 
493 /**
494  * dev_pm_opp_of_add_table() - Initialize opp table from device tree
495  * @dev:	device pointer used to lookup OPP table.
496  *
497  * Register the initial OPP table with the OPP library for given device.
498  *
499  * Return:
500  * 0		On success OR
501  *		Duplicate OPPs (both freq and volt are same) and opp->available
502  * -EEXIST	Freq are same and volt are different OR
503  *		Duplicate OPPs (both freq and volt are same) and !opp->available
504  * -ENOMEM	Memory allocation failure
505  * -ENODEV	when 'operating-points' property is not found or is invalid data
506  *		in device node.
507  * -ENODATA	when empty 'operating-points' property is found
508  * -EINVAL	when invalid entries are found in opp-v2 table
509  */
510 int dev_pm_opp_of_add_table(struct device *dev)
511 {
512 	struct device_node *opp_np;
513 	int ret;
514 
515 	/*
516 	 * OPPs have two version of bindings now. The older one is deprecated,
517 	 * try for the new binding first.
518 	 */
519 	opp_np = dev_pm_opp_of_get_opp_desc_node(dev);
520 	if (!opp_np) {
521 		/*
522 		 * Try old-deprecated bindings for backward compatibility with
523 		 * older dtbs.
524 		 */
525 		return _of_add_opp_table_v1(dev);
526 	}
527 
528 	ret = _of_add_opp_table_v2(dev, opp_np);
529 	of_node_put(opp_np);
530 
531 	return ret;
532 }
533 EXPORT_SYMBOL_GPL(dev_pm_opp_of_add_table);
534 
535 /**
536  * dev_pm_opp_of_add_table_indexed() - Initialize indexed opp table from device tree
537  * @dev:	device pointer used to lookup OPP table.
538  * @index:	Index number.
539  *
540  * Register the initial OPP table with the OPP library for given device only
541  * using the "operating-points-v2" property.
542  *
543  * Return:
544  * 0		On success OR
545  *		Duplicate OPPs (both freq and volt are same) and opp->available
546  * -EEXIST	Freq are same and volt are different OR
547  *		Duplicate OPPs (both freq and volt are same) and !opp->available
548  * -ENOMEM	Memory allocation failure
549  * -ENODEV	when 'operating-points' property is not found or is invalid data
550  *		in device node.
551  * -ENODATA	when empty 'operating-points' property is found
552  * -EINVAL	when invalid entries are found in opp-v2 table
553  */
554 int dev_pm_opp_of_add_table_indexed(struct device *dev, int index)
555 {
556 	struct device_node *opp_np;
557 	int ret, count;
558 
559 again:
560 	opp_np = _opp_of_get_opp_desc_node(dev->of_node, index);
561 	if (!opp_np) {
562 		/*
563 		 * If only one phandle is present, then the same OPP table
564 		 * applies for all index requests.
565 		 */
566 		count = of_count_phandle_with_args(dev->of_node,
567 						   "operating-points-v2", NULL);
568 		if (count == 1 && index) {
569 			index = 0;
570 			goto again;
571 		}
572 
573 		return -ENODEV;
574 	}
575 
576 	ret = _of_add_opp_table_v2(dev, opp_np);
577 	of_node_put(opp_np);
578 
579 	return ret;
580 }
581 EXPORT_SYMBOL_GPL(dev_pm_opp_of_add_table_indexed);
582 
583 /* CPU device specific helpers */
584 
585 /**
586  * dev_pm_opp_of_cpumask_remove_table() - Removes OPP table for @cpumask
587  * @cpumask:	cpumask for which OPP table needs to be removed
588  *
589  * This removes the OPP tables for CPUs present in the @cpumask.
590  * This should be used only to remove static entries created from DT.
591  */
592 void dev_pm_opp_of_cpumask_remove_table(const struct cpumask *cpumask)
593 {
594 	_dev_pm_opp_cpumask_remove_table(cpumask, true);
595 }
596 EXPORT_SYMBOL_GPL(dev_pm_opp_of_cpumask_remove_table);
597 
598 /**
599  * dev_pm_opp_of_cpumask_add_table() - Adds OPP table for @cpumask
600  * @cpumask:	cpumask for which OPP table needs to be added.
601  *
602  * This adds the OPP tables for CPUs present in the @cpumask.
603  */
604 int dev_pm_opp_of_cpumask_add_table(const struct cpumask *cpumask)
605 {
606 	struct device *cpu_dev;
607 	int cpu, ret = 0;
608 
609 	WARN_ON(cpumask_empty(cpumask));
610 
611 	for_each_cpu(cpu, cpumask) {
612 		cpu_dev = get_cpu_device(cpu);
613 		if (!cpu_dev) {
614 			pr_err("%s: failed to get cpu%d device\n", __func__,
615 			       cpu);
616 			continue;
617 		}
618 
619 		ret = dev_pm_opp_of_add_table(cpu_dev);
620 		if (ret) {
621 			/*
622 			 * OPP may get registered dynamically, don't print error
623 			 * message here.
624 			 */
625 			pr_debug("%s: couldn't find opp table for cpu:%d, %d\n",
626 				 __func__, cpu, ret);
627 
628 			/* Free all other OPPs */
629 			dev_pm_opp_of_cpumask_remove_table(cpumask);
630 			break;
631 		}
632 	}
633 
634 	return ret;
635 }
636 EXPORT_SYMBOL_GPL(dev_pm_opp_of_cpumask_add_table);
637 
638 /*
639  * Works only for OPP v2 bindings.
640  *
641  * Returns -ENOENT if operating-points-v2 bindings aren't supported.
642  */
643 /**
644  * dev_pm_opp_of_get_sharing_cpus() - Get cpumask of CPUs sharing OPPs with
645  *				      @cpu_dev using operating-points-v2
646  *				      bindings.
647  *
648  * @cpu_dev:	CPU device for which we do this operation
649  * @cpumask:	cpumask to update with information of sharing CPUs
650  *
651  * This updates the @cpumask with CPUs that are sharing OPPs with @cpu_dev.
652  *
653  * Returns -ENOENT if operating-points-v2 isn't present for @cpu_dev.
654  */
655 int dev_pm_opp_of_get_sharing_cpus(struct device *cpu_dev,
656 				   struct cpumask *cpumask)
657 {
658 	struct device_node *np, *tmp_np, *cpu_np;
659 	int cpu, ret = 0;
660 
661 	/* Get OPP descriptor node */
662 	np = dev_pm_opp_of_get_opp_desc_node(cpu_dev);
663 	if (!np) {
664 		dev_dbg(cpu_dev, "%s: Couldn't find opp node.\n", __func__);
665 		return -ENOENT;
666 	}
667 
668 	cpumask_set_cpu(cpu_dev->id, cpumask);
669 
670 	/* OPPs are shared ? */
671 	if (!of_property_read_bool(np, "opp-shared"))
672 		goto put_cpu_node;
673 
674 	for_each_possible_cpu(cpu) {
675 		if (cpu == cpu_dev->id)
676 			continue;
677 
678 		cpu_np = of_cpu_device_node_get(cpu);
679 		if (!cpu_np) {
680 			dev_err(cpu_dev, "%s: failed to get cpu%d node\n",
681 				__func__, cpu);
682 			ret = -ENOENT;
683 			goto put_cpu_node;
684 		}
685 
686 		/* Get OPP descriptor node */
687 		tmp_np = _opp_of_get_opp_desc_node(cpu_np, 0);
688 		of_node_put(cpu_np);
689 		if (!tmp_np) {
690 			pr_err("%pOF: Couldn't find opp node\n", cpu_np);
691 			ret = -ENOENT;
692 			goto put_cpu_node;
693 		}
694 
695 		/* CPUs are sharing opp node */
696 		if (np == tmp_np)
697 			cpumask_set_cpu(cpu, cpumask);
698 
699 		of_node_put(tmp_np);
700 	}
701 
702 put_cpu_node:
703 	of_node_put(np);
704 	return ret;
705 }
706 EXPORT_SYMBOL_GPL(dev_pm_opp_of_get_sharing_cpus);
707 
708 /**
709  * of_dev_pm_opp_find_required_opp() - Search for required OPP.
710  * @dev: The device whose OPP node is referenced by the 'np' DT node.
711  * @np: Node that contains the "required-opps" property.
712  *
713  * Returns the OPP of the device 'dev', whose phandle is present in the "np"
714  * node. Although the "required-opps" property supports having multiple
715  * phandles, this helper routine only parses the very first phandle in the list.
716  *
717  * Return: Matching opp, else returns ERR_PTR in case of error and should be
718  * handled using IS_ERR.
719  *
720  * The callers are required to call dev_pm_opp_put() for the returned OPP after
721  * use.
722  */
723 struct dev_pm_opp *of_dev_pm_opp_find_required_opp(struct device *dev,
724 						   struct device_node *np)
725 {
726 	struct dev_pm_opp *temp_opp, *opp = ERR_PTR(-ENODEV);
727 	struct device_node *required_np;
728 	struct opp_table *opp_table;
729 
730 	opp_table = _find_opp_table(dev);
731 	if (IS_ERR(opp_table))
732 		return ERR_CAST(opp_table);
733 
734 	required_np = of_parse_phandle(np, "required-opps", 0);
735 	if (unlikely(!required_np)) {
736 		dev_err(dev, "Unable to parse required-opps\n");
737 		goto put_opp_table;
738 	}
739 
740 	mutex_lock(&opp_table->lock);
741 
742 	list_for_each_entry(temp_opp, &opp_table->opp_list, node) {
743 		if (temp_opp->available && temp_opp->np == required_np) {
744 			opp = temp_opp;
745 
746 			/* Increment the reference count of OPP */
747 			dev_pm_opp_get(opp);
748 			break;
749 		}
750 	}
751 
752 	mutex_unlock(&opp_table->lock);
753 
754 	of_node_put(required_np);
755 put_opp_table:
756 	dev_pm_opp_put_opp_table(opp_table);
757 
758 	return opp;
759 }
760 EXPORT_SYMBOL_GPL(of_dev_pm_opp_find_required_opp);
761 
762 /**
763  * dev_pm_opp_get_of_node() - Gets the DT node corresponding to an opp
764  * @opp:	opp for which DT node has to be returned for
765  *
766  * Return: DT node corresponding to the opp, else 0 on success.
767  *
768  * The caller needs to put the node with of_node_put() after using it.
769  */
770 struct device_node *dev_pm_opp_get_of_node(struct dev_pm_opp *opp)
771 {
772 	if (IS_ERR_OR_NULL(opp)) {
773 		pr_err("%s: Invalid parameters\n", __func__);
774 		return NULL;
775 	}
776 
777 	return of_node_get(opp->np);
778 }
779 EXPORT_SYMBOL_GPL(dev_pm_opp_get_of_node);
780