Linux Audio

Check our new training course

Loading...
  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/slab.h>
 21#include <linux/export.h>
 22
 23#include "opp.h"
 24
 25static struct opp_table *_managed_opp(const struct device_node *np)
 26{
 27	struct opp_table *opp_table, *managed_table = NULL;
 28
 29	mutex_lock(&opp_table_lock);
 30
 31	list_for_each_entry(opp_table, &opp_tables, node) {
 32		if (opp_table->np == np) {
 33			/*
 34			 * Multiple devices can point to the same OPP table and
 35			 * so will have same node-pointer, np.
 36			 *
 37			 * But the OPPs will be considered as shared only if the
 38			 * OPP table contains a "opp-shared" property.
 39			 */
 40			if (opp_table->shared_opp == OPP_TABLE_ACCESS_SHARED) {
 41				_get_opp_table_kref(opp_table);
 42				managed_table = opp_table;
 43			}
 44
 45			break;
 46		}
 47	}
 48
 49	mutex_unlock(&opp_table_lock);
 50
 51	return managed_table;
 52}
 53
 54void _of_init_opp_table(struct opp_table *opp_table, struct device *dev)
 55{
 56	struct device_node *np;
 57
 58	/*
 59	 * Only required for backward compatibility with v1 bindings, but isn't
 60	 * harmful for other cases. And so we do it unconditionally.
 61	 */
 62	np = of_node_get(dev->of_node);
 63	if (np) {
 64		u32 val;
 65
 66		if (!of_property_read_u32(np, "clock-latency", &val))
 67			opp_table->clock_latency_ns_max = val;
 68		of_property_read_u32(np, "voltage-tolerance",
 69				     &opp_table->voltage_tolerance_v1);
 70		of_node_put(np);
 71	}
 72}
 73
 74static bool _opp_is_supported(struct device *dev, struct opp_table *opp_table,
 75			      struct device_node *np)
 76{
 77	unsigned int count = opp_table->supported_hw_count;
 78	u32 version;
 79	int ret;
 80
 81	if (!opp_table->supported_hw) {
 82		/*
 83		 * In the case that no supported_hw has been set by the
 84		 * platform but there is an opp-supported-hw value set for
 85		 * an OPP then the OPP should not be enabled as there is
 86		 * no way to see if the hardware supports it.
 87		 */
 88		if (of_find_property(np, "opp-supported-hw", NULL))
 89			return false;
 90		else
 91			return true;
 92	}
 93
 94	while (count--) {
 95		ret = of_property_read_u32_index(np, "opp-supported-hw", count,
 96						 &version);
 97		if (ret) {
 98			dev_warn(dev, "%s: failed to read opp-supported-hw property at index %d: %d\n",
 99				 __func__, count, ret);
100			return false;
101		}
102
103		/* Both of these are bitwise masks of the versions */
104		if (!(version & opp_table->supported_hw[count]))
105			return false;
106	}
107
108	return true;
109}
110
111static int opp_parse_supplies(struct dev_pm_opp *opp, struct device *dev,
112			      struct opp_table *opp_table)
113{
114	u32 *microvolt, *microamp = NULL;
115	int supplies, vcount, icount, ret, i, j;
116	struct property *prop = NULL;
117	char name[NAME_MAX];
118
119	supplies = opp_table->regulator_count ? opp_table->regulator_count : 1;
120
121	/* Search for "opp-microvolt-<name>" */
122	if (opp_table->prop_name) {
123		snprintf(name, sizeof(name), "opp-microvolt-%s",
124			 opp_table->prop_name);
125		prop = of_find_property(opp->np, name, NULL);
126	}
127
128	if (!prop) {
129		/* Search for "opp-microvolt" */
130		sprintf(name, "opp-microvolt");
131		prop = of_find_property(opp->np, name, NULL);
132
133		/* Missing property isn't a problem, but an invalid entry is */
134		if (!prop) {
135			if (!opp_table->regulator_count)
136				return 0;
137
138			dev_err(dev, "%s: opp-microvolt missing although OPP managing regulators\n",
139				__func__);
140			return -EINVAL;
141		}
142	}
143
144	vcount = of_property_count_u32_elems(opp->np, name);
145	if (vcount < 0) {
146		dev_err(dev, "%s: Invalid %s property (%d)\n",
147			__func__, name, vcount);
148		return vcount;
149	}
150
151	/* There can be one or three elements per supply */
152	if (vcount != supplies && vcount != supplies * 3) {
153		dev_err(dev, "%s: Invalid number of elements in %s property (%d) with supplies (%d)\n",
154			__func__, name, vcount, supplies);
155		return -EINVAL;
156	}
157
158	microvolt = kmalloc_array(vcount, sizeof(*microvolt), GFP_KERNEL);
159	if (!microvolt)
160		return -ENOMEM;
161
162	ret = of_property_read_u32_array(opp->np, name, microvolt, vcount);
163	if (ret) {
164		dev_err(dev, "%s: error parsing %s: %d\n", __func__, name, ret);
165		ret = -EINVAL;
166		goto free_microvolt;
167	}
168
169	/* Search for "opp-microamp-<name>" */
170	prop = NULL;
171	if (opp_table->prop_name) {
172		snprintf(name, sizeof(name), "opp-microamp-%s",
173			 opp_table->prop_name);
174		prop = of_find_property(opp->np, name, NULL);
175	}
176
177	if (!prop) {
178		/* Search for "opp-microamp" */
179		sprintf(name, "opp-microamp");
180		prop = of_find_property(opp->np, name, NULL);
181	}
182
183	if (prop) {
184		icount = of_property_count_u32_elems(opp->np, name);
185		if (icount < 0) {
186			dev_err(dev, "%s: Invalid %s property (%d)\n", __func__,
187				name, icount);
188			ret = icount;
189			goto free_microvolt;
190		}
191
192		if (icount != supplies) {
193			dev_err(dev, "%s: Invalid number of elements in %s property (%d) with supplies (%d)\n",
194				__func__, name, icount, supplies);
195			ret = -EINVAL;
196			goto free_microvolt;
197		}
198
199		microamp = kmalloc_array(icount, sizeof(*microamp), GFP_KERNEL);
200		if (!microamp) {
201			ret = -EINVAL;
202			goto free_microvolt;
203		}
204
205		ret = of_property_read_u32_array(opp->np, name, microamp,
206						 icount);
207		if (ret) {
208			dev_err(dev, "%s: error parsing %s: %d\n", __func__,
209				name, ret);
210			ret = -EINVAL;
211			goto free_microamp;
212		}
213	}
214
215	for (i = 0, j = 0; i < supplies; i++) {
216		opp->supplies[i].u_volt = microvolt[j++];
217
218		if (vcount == supplies) {
219			opp->supplies[i].u_volt_min = opp->supplies[i].u_volt;
220			opp->supplies[i].u_volt_max = opp->supplies[i].u_volt;
221		} else {
222			opp->supplies[i].u_volt_min = microvolt[j++];
223			opp->supplies[i].u_volt_max = microvolt[j++];
224		}
225
226		if (microamp)
227			opp->supplies[i].u_amp = microamp[i];
228	}
229
230free_microamp:
231	kfree(microamp);
232free_microvolt:
233	kfree(microvolt);
234
235	return ret;
236}
237
238/**
239 * dev_pm_opp_of_remove_table() - Free OPP table entries created from static DT
240 *				  entries
241 * @dev:	device pointer used to lookup OPP table.
242 *
243 * Free OPPs created using static entries present in DT.
244 */
245void dev_pm_opp_of_remove_table(struct device *dev)
246{
247	_dev_pm_opp_find_and_remove_table(dev, false);
248}
249EXPORT_SYMBOL_GPL(dev_pm_opp_of_remove_table);
250
251/* Returns opp descriptor node for a device node, caller must
252 * do of_node_put() */
253static struct device_node *_opp_of_get_opp_desc_node(struct device_node *np)
254{
255	/*
256	 * There should be only ONE phandle present in "operating-points-v2"
257	 * property.
258	 */
259
260	return of_parse_phandle(np, "operating-points-v2", 0);
261}
262
263/* Returns opp descriptor node for a device, caller must do of_node_put() */
264struct device_node *dev_pm_opp_of_get_opp_desc_node(struct device *dev)
265{
266	return _opp_of_get_opp_desc_node(dev->of_node);
267}
268EXPORT_SYMBOL_GPL(dev_pm_opp_of_get_opp_desc_node);
269
270/**
271 * _opp_add_static_v2() - Allocate static OPPs (As per 'v2' DT bindings)
272 * @opp_table:	OPP table
273 * @dev:	device for which we do this operation
274 * @np:		device node
275 *
276 * This function adds an opp definition to the opp table and returns status. The
277 * opp can be controlled using dev_pm_opp_enable/disable functions and may be
278 * removed by dev_pm_opp_remove.
279 *
280 * Return:
281 * 0		On success OR
282 *		Duplicate OPPs (both freq and volt are same) and opp->available
283 * -EEXIST	Freq are same and volt are different OR
284 *		Duplicate OPPs (both freq and volt are same) and !opp->available
285 * -ENOMEM	Memory allocation failure
286 * -EINVAL	Failed parsing the OPP node
287 */
288static int _opp_add_static_v2(struct opp_table *opp_table, struct device *dev,
289			      struct device_node *np)
290{
291	struct dev_pm_opp *new_opp;
292	u64 rate;
293	u32 val;
294	int ret;
295
296	new_opp = _opp_allocate(opp_table);
297	if (!new_opp)
298		return -ENOMEM;
299
300	ret = of_property_read_u64(np, "opp-hz", &rate);
301	if (ret < 0) {
302		dev_err(dev, "%s: opp-hz not found\n", __func__);
303		goto free_opp;
304	}
305
306	/* Check if the OPP supports hardware's hierarchy of versions or not */
307	if (!_opp_is_supported(dev, opp_table, np)) {
308		dev_dbg(dev, "OPP not supported by hardware: %llu\n", rate);
309		goto free_opp;
310	}
311
312	/*
313	 * Rate is defined as an unsigned long in clk API, and so casting
314	 * explicitly to its type. Must be fixed once rate is 64 bit
315	 * guaranteed in clk API.
316	 */
317	new_opp->rate = (unsigned long)rate;
318	new_opp->turbo = of_property_read_bool(np, "turbo-mode");
319
320	new_opp->np = np;
321	new_opp->dynamic = false;
322	new_opp->available = true;
323
324	if (!of_property_read_u32(np, "clock-latency-ns", &val))
325		new_opp->clock_latency_ns = val;
326
327	ret = opp_parse_supplies(new_opp, dev, opp_table);
328	if (ret)
329		goto free_opp;
330
331	ret = _opp_add(dev, new_opp, opp_table);
332	if (ret) {
333		/* Don't return error for duplicate OPPs */
334		if (ret == -EBUSY)
335			ret = 0;
336		goto free_opp;
337	}
338
339	/* OPP to select on device suspend */
340	if (of_property_read_bool(np, "opp-suspend")) {
341		if (opp_table->suspend_opp) {
342			dev_warn(dev, "%s: Multiple suspend OPPs found (%lu %lu)\n",
343				 __func__, opp_table->suspend_opp->rate,
344				 new_opp->rate);
345		} else {
346			new_opp->suspend = true;
347			opp_table->suspend_opp = new_opp;
348		}
349	}
350
351	if (new_opp->clock_latency_ns > opp_table->clock_latency_ns_max)
352		opp_table->clock_latency_ns_max = new_opp->clock_latency_ns;
353
354	pr_debug("%s: turbo:%d rate:%lu uv:%lu uvmin:%lu uvmax:%lu latency:%lu\n",
355		 __func__, new_opp->turbo, new_opp->rate,
356		 new_opp->supplies[0].u_volt, new_opp->supplies[0].u_volt_min,
357		 new_opp->supplies[0].u_volt_max, new_opp->clock_latency_ns);
358
359	/*
360	 * Notify the changes in the availability of the operable
361	 * frequency/voltage list.
362	 */
363	blocking_notifier_call_chain(&opp_table->head, OPP_EVENT_ADD, new_opp);
364	return 0;
365
366free_opp:
367	_opp_free(new_opp);
368
369	return ret;
370}
371
372/* Initializes OPP tables based on new bindings */
373static int _of_add_opp_table_v2(struct device *dev, struct device_node *opp_np)
374{
375	struct device_node *np;
376	struct opp_table *opp_table;
377	int ret = 0, count = 0;
378
379	opp_table = _managed_opp(opp_np);
380	if (opp_table) {
381		/* OPPs are already managed */
382		if (!_add_opp_dev(dev, opp_table))
383			ret = -ENOMEM;
384		goto put_opp_table;
385	}
386
387	opp_table = dev_pm_opp_get_opp_table(dev);
388	if (!opp_table)
389		return -ENOMEM;
390
391	/* We have opp-table node now, iterate over it and add OPPs */
392	for_each_available_child_of_node(opp_np, np) {
393		count++;
394
395		ret = _opp_add_static_v2(opp_table, dev, np);
396		if (ret) {
397			dev_err(dev, "%s: Failed to add OPP, %d\n", __func__,
398				ret);
399			_dev_pm_opp_remove_table(opp_table, dev, false);
400			of_node_put(np);
401			goto put_opp_table;
402		}
403	}
404
405	/* There should be one of more OPP defined */
406	if (WARN_ON(!count)) {
407		ret = -ENOENT;
408		goto put_opp_table;
409	}
410
411	opp_table->np = opp_np;
412	if (of_property_read_bool(opp_np, "opp-shared"))
413		opp_table->shared_opp = OPP_TABLE_ACCESS_SHARED;
414	else
415		opp_table->shared_opp = OPP_TABLE_ACCESS_EXCLUSIVE;
416
417put_opp_table:
418	dev_pm_opp_put_opp_table(opp_table);
419
420	return ret;
421}
422
423/* Initializes OPP tables based on old-deprecated bindings */
424static int _of_add_opp_table_v1(struct device *dev)
425{
426	struct opp_table *opp_table;
427	const struct property *prop;
428	const __be32 *val;
429	int nr, ret = 0;
430
431	prop = of_find_property(dev->of_node, "operating-points", NULL);
432	if (!prop)
433		return -ENODEV;
434	if (!prop->value)
435		return -ENODATA;
436
437	/*
438	 * Each OPP is a set of tuples consisting of frequency and
439	 * voltage like <freq-kHz vol-uV>.
440	 */
441	nr = prop->length / sizeof(u32);
442	if (nr % 2) {
443		dev_err(dev, "%s: Invalid OPP table\n", __func__);
444		return -EINVAL;
445	}
446
447	opp_table = dev_pm_opp_get_opp_table(dev);
448	if (!opp_table)
449		return -ENOMEM;
450
451	val = prop->value;
452	while (nr) {
453		unsigned long freq = be32_to_cpup(val++) * 1000;
454		unsigned long volt = be32_to_cpup(val++);
455
456		ret = _opp_add_v1(opp_table, dev, freq, volt, false);
457		if (ret) {
458			dev_err(dev, "%s: Failed to add OPP %ld (%d)\n",
459				__func__, freq, ret);
460			_dev_pm_opp_remove_table(opp_table, dev, false);
461			break;
462		}
463		nr -= 2;
464	}
465
466	dev_pm_opp_put_opp_table(opp_table);
467	return ret;
468}
469
470/**
471 * dev_pm_opp_of_add_table() - Initialize opp table from device tree
472 * @dev:	device pointer used to lookup OPP table.
473 *
474 * Register the initial OPP table with the OPP library for given device.
475 *
476 * Return:
477 * 0		On success OR
478 *		Duplicate OPPs (both freq and volt are same) and opp->available
479 * -EEXIST	Freq are same and volt are different OR
480 *		Duplicate OPPs (both freq and volt are same) and !opp->available
481 * -ENOMEM	Memory allocation failure
482 * -ENODEV	when 'operating-points' property is not found or is invalid data
483 *		in device node.
484 * -ENODATA	when empty 'operating-points' property is found
485 * -EINVAL	when invalid entries are found in opp-v2 table
486 */
487int dev_pm_opp_of_add_table(struct device *dev)
488{
489	struct device_node *opp_np;
490	int ret;
491
492	/*
493	 * OPPs have two version of bindings now. The older one is deprecated,
494	 * try for the new binding first.
495	 */
496	opp_np = dev_pm_opp_of_get_opp_desc_node(dev);
497	if (!opp_np) {
498		/*
499		 * Try old-deprecated bindings for backward compatibility with
500		 * older dtbs.
501		 */
502		return _of_add_opp_table_v1(dev);
503	}
504
505	ret = _of_add_opp_table_v2(dev, opp_np);
506	of_node_put(opp_np);
507
508	return ret;
509}
510EXPORT_SYMBOL_GPL(dev_pm_opp_of_add_table);
511
512/* CPU device specific helpers */
513
514/**
515 * dev_pm_opp_of_cpumask_remove_table() - Removes OPP table for @cpumask
516 * @cpumask:	cpumask for which OPP table needs to be removed
517 *
518 * This removes the OPP tables for CPUs present in the @cpumask.
519 * This should be used only to remove static entries created from DT.
520 */
521void dev_pm_opp_of_cpumask_remove_table(const struct cpumask *cpumask)
522{
523	_dev_pm_opp_cpumask_remove_table(cpumask, true);
524}
525EXPORT_SYMBOL_GPL(dev_pm_opp_of_cpumask_remove_table);
526
527/**
528 * dev_pm_opp_of_cpumask_add_table() - Adds OPP table for @cpumask
529 * @cpumask:	cpumask for which OPP table needs to be added.
530 *
531 * This adds the OPP tables for CPUs present in the @cpumask.
532 */
533int dev_pm_opp_of_cpumask_add_table(const struct cpumask *cpumask)
534{
535	struct device *cpu_dev;
536	int cpu, ret = 0;
537
538	WARN_ON(cpumask_empty(cpumask));
539
540	for_each_cpu(cpu, cpumask) {
541		cpu_dev = get_cpu_device(cpu);
542		if (!cpu_dev) {
543			pr_err("%s: failed to get cpu%d device\n", __func__,
544			       cpu);
545			continue;
546		}
547
548		ret = dev_pm_opp_of_add_table(cpu_dev);
549		if (ret) {
550			/*
551			 * OPP may get registered dynamically, don't print error
552			 * message here.
553			 */
554			pr_debug("%s: couldn't find opp table for cpu:%d, %d\n",
555				 __func__, cpu, ret);
556
557			/* Free all other OPPs */
558			dev_pm_opp_of_cpumask_remove_table(cpumask);
559			break;
560		}
561	}
562
563	return ret;
564}
565EXPORT_SYMBOL_GPL(dev_pm_opp_of_cpumask_add_table);
566
567/*
568 * Works only for OPP v2 bindings.
569 *
570 * Returns -ENOENT if operating-points-v2 bindings aren't supported.
571 */
572/**
573 * dev_pm_opp_of_get_sharing_cpus() - Get cpumask of CPUs sharing OPPs with
574 *				      @cpu_dev using operating-points-v2
575 *				      bindings.
576 *
577 * @cpu_dev:	CPU device for which we do this operation
578 * @cpumask:	cpumask to update with information of sharing CPUs
579 *
580 * This updates the @cpumask with CPUs that are sharing OPPs with @cpu_dev.
581 *
582 * Returns -ENOENT if operating-points-v2 isn't present for @cpu_dev.
583 */
584int dev_pm_opp_of_get_sharing_cpus(struct device *cpu_dev,
585				   struct cpumask *cpumask)
586{
587	struct device_node *np, *tmp_np, *cpu_np;
588	int cpu, ret = 0;
589
590	/* Get OPP descriptor node */
591	np = dev_pm_opp_of_get_opp_desc_node(cpu_dev);
592	if (!np) {
593		dev_dbg(cpu_dev, "%s: Couldn't find opp node.\n", __func__);
594		return -ENOENT;
595	}
596
597	cpumask_set_cpu(cpu_dev->id, cpumask);
598
599	/* OPPs are shared ? */
600	if (!of_property_read_bool(np, "opp-shared"))
601		goto put_cpu_node;
602
603	for_each_possible_cpu(cpu) {
604		if (cpu == cpu_dev->id)
605			continue;
606
607		cpu_np = of_cpu_device_node_get(cpu);
608		if (!cpu_np) {
609			dev_err(cpu_dev, "%s: failed to get cpu%d node\n",
610				__func__, cpu);
611			ret = -ENOENT;
612			goto put_cpu_node;
613		}
614
615		/* Get OPP descriptor node */
616		tmp_np = _opp_of_get_opp_desc_node(cpu_np);
617		of_node_put(cpu_np);
618		if (!tmp_np) {
619			pr_err("%pOF: Couldn't find opp node\n", cpu_np);
620			ret = -ENOENT;
621			goto put_cpu_node;
622		}
623
624		/* CPUs are sharing opp node */
625		if (np == tmp_np)
626			cpumask_set_cpu(cpu, cpumask);
627
628		of_node_put(tmp_np);
629	}
630
631put_cpu_node:
632	of_node_put(np);
633	return ret;
634}
635EXPORT_SYMBOL_GPL(dev_pm_opp_of_get_sharing_cpus);
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * Generic OPP OF helpers
   4 *
   5 * Copyright (C) 2009-2010 Texas Instruments Incorporated.
   6 *	Nishanth Menon
   7 *	Romit Dasgupta
   8 *	Kevin Hilman
   9 */
  10
  11#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  12
  13#include <linux/cpu.h>
  14#include <linux/errno.h>
  15#include <linux/device.h>
  16#include <linux/of_device.h>
  17#include <linux/pm_domain.h>
  18#include <linux/slab.h>
  19#include <linux/export.h>
  20#include <linux/energy_model.h>
  21
  22#include "opp.h"
  23
  24/*
  25 * Returns opp descriptor node for a device node, caller must
  26 * do of_node_put().
  27 */
  28static struct device_node *_opp_of_get_opp_desc_node(struct device_node *np,
  29						     int index)
  30{
  31	/* "operating-points-v2" can be an array for power domain providers */
  32	return of_parse_phandle(np, "operating-points-v2", index);
  33}
  34
  35/* Returns opp descriptor node for a device, caller must do of_node_put() */
  36struct device_node *dev_pm_opp_of_get_opp_desc_node(struct device *dev)
  37{
  38	return _opp_of_get_opp_desc_node(dev->of_node, 0);
  39}
  40EXPORT_SYMBOL_GPL(dev_pm_opp_of_get_opp_desc_node);
  41
  42struct opp_table *_managed_opp(struct device *dev, int index)
  43{
  44	struct opp_table *opp_table, *managed_table = NULL;
  45	struct device_node *np;
  46
  47	np = _opp_of_get_opp_desc_node(dev->of_node, index);
  48	if (!np)
  49		return NULL;
  50
  51	list_for_each_entry(opp_table, &opp_tables, node) {
  52		if (opp_table->np == np) {
  53			/*
  54			 * Multiple devices can point to the same OPP table and
  55			 * so will have same node-pointer, np.
  56			 *
  57			 * But the OPPs will be considered as shared only if the
  58			 * OPP table contains a "opp-shared" property.
  59			 */
  60			if (opp_table->shared_opp == OPP_TABLE_ACCESS_SHARED) {
  61				_get_opp_table_kref(opp_table);
  62				managed_table = opp_table;
  63			}
  64
  65			break;
  66		}
  67	}
  68
  69	of_node_put(np);
  70
  71	return managed_table;
  72}
  73
  74/* The caller must call dev_pm_opp_put() after the OPP is used */
  75static struct dev_pm_opp *_find_opp_of_np(struct opp_table *opp_table,
  76					  struct device_node *opp_np)
  77{
  78	struct dev_pm_opp *opp;
  79
  80	mutex_lock(&opp_table->lock);
  81
  82	list_for_each_entry(opp, &opp_table->opp_list, node) {
  83		if (opp->np == opp_np) {
  84			dev_pm_opp_get(opp);
  85			mutex_unlock(&opp_table->lock);
  86			return opp;
  87		}
  88	}
  89
  90	mutex_unlock(&opp_table->lock);
  91
  92	return NULL;
  93}
  94
  95static struct device_node *of_parse_required_opp(struct device_node *np,
  96						 int index)
  97{
  98	struct device_node *required_np;
  99
 100	required_np = of_parse_phandle(np, "required-opps", index);
 101	if (unlikely(!required_np)) {
 102		pr_err("%s: Unable to parse required-opps: %pOF, index: %d\n",
 103		       __func__, np, index);
 104	}
 105
 106	return required_np;
 107}
 108
 109/* The caller must call dev_pm_opp_put_opp_table() after the table is used */
 110static struct opp_table *_find_table_of_opp_np(struct device_node *opp_np)
 111{
 112	struct opp_table *opp_table;
 113	struct device_node *opp_table_np;
 114
 115	lockdep_assert_held(&opp_table_lock);
 116
 117	opp_table_np = of_get_parent(opp_np);
 118	if (!opp_table_np)
 119		goto err;
 120
 121	/* It is safe to put the node now as all we need now is its address */
 122	of_node_put(opp_table_np);
 123
 124	list_for_each_entry(opp_table, &opp_tables, node) {
 125		if (opp_table_np == opp_table->np) {
 126			_get_opp_table_kref(opp_table);
 127			return opp_table;
 128		}
 129	}
 130
 131err:
 132	return ERR_PTR(-ENODEV);
 133}
 134
 135/* Free resources previously acquired by _opp_table_alloc_required_tables() */
 136static void _opp_table_free_required_tables(struct opp_table *opp_table)
 137{
 138	struct opp_table **required_opp_tables = opp_table->required_opp_tables;
 139	int i;
 140
 141	if (!required_opp_tables)
 142		return;
 143
 144	for (i = 0; i < opp_table->required_opp_count; i++) {
 145		if (IS_ERR_OR_NULL(required_opp_tables[i]))
 146			break;
 147
 148		dev_pm_opp_put_opp_table(required_opp_tables[i]);
 149	}
 150
 151	kfree(required_opp_tables);
 152
 153	opp_table->required_opp_count = 0;
 154	opp_table->required_opp_tables = NULL;
 155}
 156
 157/*
 158 * Populate all devices and opp tables which are part of "required-opps" list.
 159 * Checking only the first OPP node should be enough.
 160 */
 161static void _opp_table_alloc_required_tables(struct opp_table *opp_table,
 162					     struct device *dev,
 163					     struct device_node *opp_np)
 164{
 165	struct opp_table **required_opp_tables;
 166	struct device_node *required_np, *np;
 167	int count, i;
 168
 169	/* Traversing the first OPP node is all we need */
 170	np = of_get_next_available_child(opp_np, NULL);
 171	if (!np) {
 172		dev_err(dev, "Empty OPP table\n");
 173		return;
 174	}
 175
 176	count = of_count_phandle_with_args(np, "required-opps", NULL);
 177	if (!count)
 178		goto put_np;
 179
 180	required_opp_tables = kcalloc(count, sizeof(*required_opp_tables),
 181				      GFP_KERNEL);
 182	if (!required_opp_tables)
 183		goto put_np;
 184
 185	opp_table->required_opp_tables = required_opp_tables;
 186	opp_table->required_opp_count = count;
 187
 188	for (i = 0; i < count; i++) {
 189		required_np = of_parse_required_opp(np, i);
 190		if (!required_np)
 191			goto free_required_tables;
 192
 193		required_opp_tables[i] = _find_table_of_opp_np(required_np);
 194		of_node_put(required_np);
 195
 196		if (IS_ERR(required_opp_tables[i]))
 197			goto free_required_tables;
 198
 199		/*
 200		 * We only support genpd's OPPs in the "required-opps" for now,
 201		 * as we don't know how much about other cases. Error out if the
 202		 * required OPP doesn't belong to a genpd.
 203		 */
 204		if (!required_opp_tables[i]->is_genpd) {
 205			dev_err(dev, "required-opp doesn't belong to genpd: %pOF\n",
 206				required_np);
 207			goto free_required_tables;
 208		}
 209	}
 210
 211	goto put_np;
 212
 213free_required_tables:
 214	_opp_table_free_required_tables(opp_table);
 215put_np:
 216	of_node_put(np);
 217}
 218
 219void _of_init_opp_table(struct opp_table *opp_table, struct device *dev,
 220			int index)
 221{
 222	struct device_node *np, *opp_np;
 223	u32 val;
 224
 225	/*
 226	 * Only required for backward compatibility with v1 bindings, but isn't
 227	 * harmful for other cases. And so we do it unconditionally.
 228	 */
 229	np = of_node_get(dev->of_node);
 230	if (!np)
 231		return;
 232
 233	if (!of_property_read_u32(np, "clock-latency", &val))
 234		opp_table->clock_latency_ns_max = val;
 235	of_property_read_u32(np, "voltage-tolerance",
 236			     &opp_table->voltage_tolerance_v1);
 237
 238	if (of_find_property(np, "#power-domain-cells", NULL))
 239		opp_table->is_genpd = true;
 240
 241	/* Get OPP table node */
 242	opp_np = _opp_of_get_opp_desc_node(np, index);
 243	of_node_put(np);
 244
 245	if (!opp_np)
 246		return;
 247
 248	if (of_property_read_bool(opp_np, "opp-shared"))
 249		opp_table->shared_opp = OPP_TABLE_ACCESS_SHARED;
 250	else
 251		opp_table->shared_opp = OPP_TABLE_ACCESS_EXCLUSIVE;
 252
 253	opp_table->np = opp_np;
 254
 255	_opp_table_alloc_required_tables(opp_table, dev, opp_np);
 256	of_node_put(opp_np);
 257}
 258
 259void _of_clear_opp_table(struct opp_table *opp_table)
 260{
 261	_opp_table_free_required_tables(opp_table);
 262}
 263
 264/*
 265 * Release all resources previously acquired with a call to
 266 * _of_opp_alloc_required_opps().
 267 */
 268void _of_opp_free_required_opps(struct opp_table *opp_table,
 269				struct dev_pm_opp *opp)
 270{
 271	struct dev_pm_opp **required_opps = opp->required_opps;
 272	int i;
 273
 274	if (!required_opps)
 275		return;
 276
 277	for (i = 0; i < opp_table->required_opp_count; i++) {
 278		if (!required_opps[i])
 279			break;
 280
 281		/* Put the reference back */
 282		dev_pm_opp_put(required_opps[i]);
 283	}
 284
 285	kfree(required_opps);
 286	opp->required_opps = NULL;
 287}
 288
 289/* Populate all required OPPs which are part of "required-opps" list */
 290static int _of_opp_alloc_required_opps(struct opp_table *opp_table,
 291				       struct dev_pm_opp *opp)
 292{
 293	struct dev_pm_opp **required_opps;
 294	struct opp_table *required_table;
 295	struct device_node *np;
 296	int i, ret, count = opp_table->required_opp_count;
 297
 298	if (!count)
 299		return 0;
 300
 301	required_opps = kcalloc(count, sizeof(*required_opps), GFP_KERNEL);
 302	if (!required_opps)
 303		return -ENOMEM;
 304
 305	opp->required_opps = required_opps;
 306
 307	for (i = 0; i < count; i++) {
 308		required_table = opp_table->required_opp_tables[i];
 309
 310		np = of_parse_required_opp(opp->np, i);
 311		if (unlikely(!np)) {
 312			ret = -ENODEV;
 313			goto free_required_opps;
 314		}
 315
 316		required_opps[i] = _find_opp_of_np(required_table, np);
 317		of_node_put(np);
 318
 319		if (!required_opps[i]) {
 320			pr_err("%s: Unable to find required OPP node: %pOF (%d)\n",
 321			       __func__, opp->np, i);
 322			ret = -ENODEV;
 323			goto free_required_opps;
 324		}
 325	}
 326
 327	return 0;
 328
 329free_required_opps:
 330	_of_opp_free_required_opps(opp_table, opp);
 331
 332	return ret;
 333}
 334
 335static bool _opp_is_supported(struct device *dev, struct opp_table *opp_table,
 336			      struct device_node *np)
 337{
 338	unsigned int count = opp_table->supported_hw_count;
 339	u32 version;
 340	int ret;
 341
 342	if (!opp_table->supported_hw) {
 343		/*
 344		 * In the case that no supported_hw has been set by the
 345		 * platform but there is an opp-supported-hw value set for
 346		 * an OPP then the OPP should not be enabled as there is
 347		 * no way to see if the hardware supports it.
 348		 */
 349		if (of_find_property(np, "opp-supported-hw", NULL))
 350			return false;
 351		else
 352			return true;
 353	}
 354
 355	while (count--) {
 356		ret = of_property_read_u32_index(np, "opp-supported-hw", count,
 357						 &version);
 358		if (ret) {
 359			dev_warn(dev, "%s: failed to read opp-supported-hw property at index %d: %d\n",
 360				 __func__, count, ret);
 361			return false;
 362		}
 363
 364		/* Both of these are bitwise masks of the versions */
 365		if (!(version & opp_table->supported_hw[count]))
 366			return false;
 367	}
 368
 369	return true;
 370}
 371
 372static int opp_parse_supplies(struct dev_pm_opp *opp, struct device *dev,
 373			      struct opp_table *opp_table)
 374{
 375	u32 *microvolt, *microamp = NULL;
 376	int supplies = opp_table->regulator_count, vcount, icount, ret, i, j;
 377	struct property *prop = NULL;
 378	char name[NAME_MAX];
 379
 380	/* Search for "opp-microvolt-<name>" */
 381	if (opp_table->prop_name) {
 382		snprintf(name, sizeof(name), "opp-microvolt-%s",
 383			 opp_table->prop_name);
 384		prop = of_find_property(opp->np, name, NULL);
 385	}
 386
 387	if (!prop) {
 388		/* Search for "opp-microvolt" */
 389		sprintf(name, "opp-microvolt");
 390		prop = of_find_property(opp->np, name, NULL);
 391
 392		/* Missing property isn't a problem, but an invalid entry is */
 393		if (!prop) {
 394			if (unlikely(supplies == -1)) {
 395				/* Initialize regulator_count */
 396				opp_table->regulator_count = 0;
 397				return 0;
 398			}
 399
 400			if (!supplies)
 401				return 0;
 402
 403			dev_err(dev, "%s: opp-microvolt missing although OPP managing regulators\n",
 404				__func__);
 405			return -EINVAL;
 406		}
 407	}
 408
 409	if (unlikely(supplies == -1)) {
 410		/* Initialize regulator_count */
 411		supplies = opp_table->regulator_count = 1;
 412	} else if (unlikely(!supplies)) {
 413		dev_err(dev, "%s: opp-microvolt wasn't expected\n", __func__);
 414		return -EINVAL;
 415	}
 416
 417	vcount = of_property_count_u32_elems(opp->np, name);
 418	if (vcount < 0) {
 419		dev_err(dev, "%s: Invalid %s property (%d)\n",
 420			__func__, name, vcount);
 421		return vcount;
 422	}
 423
 424	/* There can be one or three elements per supply */
 425	if (vcount != supplies && vcount != supplies * 3) {
 426		dev_err(dev, "%s: Invalid number of elements in %s property (%d) with supplies (%d)\n",
 427			__func__, name, vcount, supplies);
 428		return -EINVAL;
 429	}
 430
 431	microvolt = kmalloc_array(vcount, sizeof(*microvolt), GFP_KERNEL);
 432	if (!microvolt)
 433		return -ENOMEM;
 434
 435	ret = of_property_read_u32_array(opp->np, name, microvolt, vcount);
 436	if (ret) {
 437		dev_err(dev, "%s: error parsing %s: %d\n", __func__, name, ret);
 438		ret = -EINVAL;
 439		goto free_microvolt;
 440	}
 441
 442	/* Search for "opp-microamp-<name>" */
 443	prop = NULL;
 444	if (opp_table->prop_name) {
 445		snprintf(name, sizeof(name), "opp-microamp-%s",
 446			 opp_table->prop_name);
 447		prop = of_find_property(opp->np, name, NULL);
 448	}
 449
 450	if (!prop) {
 451		/* Search for "opp-microamp" */
 452		sprintf(name, "opp-microamp");
 453		prop = of_find_property(opp->np, name, NULL);
 454	}
 455
 456	if (prop) {
 457		icount = of_property_count_u32_elems(opp->np, name);
 458		if (icount < 0) {
 459			dev_err(dev, "%s: Invalid %s property (%d)\n", __func__,
 460				name, icount);
 461			ret = icount;
 462			goto free_microvolt;
 463		}
 464
 465		if (icount != supplies) {
 466			dev_err(dev, "%s: Invalid number of elements in %s property (%d) with supplies (%d)\n",
 467				__func__, name, icount, supplies);
 468			ret = -EINVAL;
 469			goto free_microvolt;
 470		}
 471
 472		microamp = kmalloc_array(icount, sizeof(*microamp), GFP_KERNEL);
 473		if (!microamp) {
 474			ret = -EINVAL;
 475			goto free_microvolt;
 476		}
 477
 478		ret = of_property_read_u32_array(opp->np, name, microamp,
 479						 icount);
 480		if (ret) {
 481			dev_err(dev, "%s: error parsing %s: %d\n", __func__,
 482				name, ret);
 483			ret = -EINVAL;
 484			goto free_microamp;
 485		}
 486	}
 487
 488	for (i = 0, j = 0; i < supplies; i++) {
 489		opp->supplies[i].u_volt = microvolt[j++];
 490
 491		if (vcount == supplies) {
 492			opp->supplies[i].u_volt_min = opp->supplies[i].u_volt;
 493			opp->supplies[i].u_volt_max = opp->supplies[i].u_volt;
 494		} else {
 495			opp->supplies[i].u_volt_min = microvolt[j++];
 496			opp->supplies[i].u_volt_max = microvolt[j++];
 497		}
 498
 499		if (microamp)
 500			opp->supplies[i].u_amp = microamp[i];
 501	}
 502
 503free_microamp:
 504	kfree(microamp);
 505free_microvolt:
 506	kfree(microvolt);
 507
 508	return ret;
 509}
 510
 511/**
 512 * dev_pm_opp_of_remove_table() - Free OPP table entries created from static DT
 513 *				  entries
 514 * @dev:	device pointer used to lookup OPP table.
 515 *
 516 * Free OPPs created using static entries present in DT.
 517 */
 518void dev_pm_opp_of_remove_table(struct device *dev)
 519{
 520	_dev_pm_opp_find_and_remove_table(dev);
 521}
 522EXPORT_SYMBOL_GPL(dev_pm_opp_of_remove_table);
 523
 524/**
 525 * _opp_add_static_v2() - Allocate static OPPs (As per 'v2' DT bindings)
 526 * @opp_table:	OPP table
 527 * @dev:	device for which we do this operation
 528 * @np:		device node
 529 *
 530 * This function adds an opp definition to the opp table and returns status. The
 531 * opp can be controlled using dev_pm_opp_enable/disable functions and may be
 532 * removed by dev_pm_opp_remove.
 533 *
 534 * Return:
 535 * Valid OPP pointer:
 536 *		On success
 537 * NULL:
 538 *		Duplicate OPPs (both freq and volt are same) and opp->available
 539 *		OR if the OPP is not supported by hardware.
 540 * ERR_PTR(-EEXIST):
 541 *		Freq are same and volt are different OR
 542 *		Duplicate OPPs (both freq and volt are same) and !opp->available
 543 * ERR_PTR(-ENOMEM):
 544 *		Memory allocation failure
 545 * ERR_PTR(-EINVAL):
 546 *		Failed parsing the OPP node
 547 */
 548static struct dev_pm_opp *_opp_add_static_v2(struct opp_table *opp_table,
 549		struct device *dev, struct device_node *np)
 550{
 551	struct dev_pm_opp *new_opp;
 552	u64 rate = 0;
 553	u32 val;
 554	int ret;
 555	bool rate_not_available = false;
 556
 557	new_opp = _opp_allocate(opp_table);
 558	if (!new_opp)
 559		return ERR_PTR(-ENOMEM);
 560
 561	ret = of_property_read_u64(np, "opp-hz", &rate);
 562	if (ret < 0) {
 563		/* "opp-hz" is optional for devices like power domains. */
 564		if (!opp_table->is_genpd) {
 565			dev_err(dev, "%s: opp-hz not found\n", __func__);
 566			goto free_opp;
 567		}
 568
 569		rate_not_available = true;
 570	} else {
 571		/*
 572		 * Rate is defined as an unsigned long in clk API, and so
 573		 * casting explicitly to its type. Must be fixed once rate is 64
 574		 * bit guaranteed in clk API.
 575		 */
 576		new_opp->rate = (unsigned long)rate;
 577	}
 578
 579	of_property_read_u32(np, "opp-level", &new_opp->level);
 580
 581	/* Check if the OPP supports hardware's hierarchy of versions or not */
 582	if (!_opp_is_supported(dev, opp_table, np)) {
 583		dev_dbg(dev, "OPP not supported by hardware: %llu\n", rate);
 584		goto free_opp;
 585	}
 586
 587	new_opp->turbo = of_property_read_bool(np, "turbo-mode");
 588
 589	new_opp->np = np;
 590	new_opp->dynamic = false;
 591	new_opp->available = true;
 592
 593	ret = _of_opp_alloc_required_opps(opp_table, new_opp);
 594	if (ret)
 595		goto free_opp;
 596
 597	if (!of_property_read_u32(np, "clock-latency-ns", &val))
 598		new_opp->clock_latency_ns = val;
 599
 600	ret = opp_parse_supplies(new_opp, dev, opp_table);
 601	if (ret)
 602		goto free_required_opps;
 603
 604	if (opp_table->is_genpd)
 605		new_opp->pstate = pm_genpd_opp_to_performance_state(dev, new_opp);
 606
 607	ret = _opp_add(dev, new_opp, opp_table, rate_not_available);
 608	if (ret) {
 609		/* Don't return error for duplicate OPPs */
 610		if (ret == -EBUSY)
 611			ret = 0;
 612		goto free_required_opps;
 613	}
 614
 615	/* OPP to select on device suspend */
 616	if (of_property_read_bool(np, "opp-suspend")) {
 617		if (opp_table->suspend_opp) {
 618			/* Pick the OPP with higher rate as suspend OPP */
 619			if (new_opp->rate > opp_table->suspend_opp->rate) {
 620				opp_table->suspend_opp->suspend = false;
 621				new_opp->suspend = true;
 622				opp_table->suspend_opp = new_opp;
 623			}
 624		} else {
 625			new_opp->suspend = true;
 626			opp_table->suspend_opp = new_opp;
 627		}
 628	}
 629
 630	if (new_opp->clock_latency_ns > opp_table->clock_latency_ns_max)
 631		opp_table->clock_latency_ns_max = new_opp->clock_latency_ns;
 632
 633	pr_debug("%s: turbo:%d rate:%lu uv:%lu uvmin:%lu uvmax:%lu latency:%lu\n",
 634		 __func__, new_opp->turbo, new_opp->rate,
 635		 new_opp->supplies[0].u_volt, new_opp->supplies[0].u_volt_min,
 636		 new_opp->supplies[0].u_volt_max, new_opp->clock_latency_ns);
 637
 638	/*
 639	 * Notify the changes in the availability of the operable
 640	 * frequency/voltage list.
 641	 */
 642	blocking_notifier_call_chain(&opp_table->head, OPP_EVENT_ADD, new_opp);
 643	return new_opp;
 644
 645free_required_opps:
 646	_of_opp_free_required_opps(opp_table, new_opp);
 647free_opp:
 648	_opp_free(new_opp);
 649
 650	return ERR_PTR(ret);
 651}
 652
 653/* Initializes OPP tables based on new bindings */
 654static int _of_add_opp_table_v2(struct device *dev, struct opp_table *opp_table)
 655{
 656	struct device_node *np;
 657	int ret, count = 0, pstate_count = 0;
 658	struct dev_pm_opp *opp;
 659
 660	/* OPP table is already initialized for the device */
 661	if (opp_table->parsed_static_opps) {
 662		kref_get(&opp_table->list_kref);
 663		return 0;
 664	}
 665
 666	/*
 667	 * Re-initialize list_kref every time we add static OPPs to the OPP
 668	 * table as the reference count may be 0 after the last tie static OPPs
 669	 * were removed.
 670	 */
 671	kref_init(&opp_table->list_kref);
 672
 673	/* We have opp-table node now, iterate over it and add OPPs */
 674	for_each_available_child_of_node(opp_table->np, np) {
 675		opp = _opp_add_static_v2(opp_table, dev, np);
 676		if (IS_ERR(opp)) {
 677			ret = PTR_ERR(opp);
 678			dev_err(dev, "%s: Failed to add OPP, %d\n", __func__,
 679				ret);
 680			of_node_put(np);
 681			return ret;
 682		} else if (opp) {
 683			count++;
 684		}
 685	}
 686
 687	/* There should be one of more OPP defined */
 688	if (WARN_ON(!count))
 689		return -ENOENT;
 690
 691	list_for_each_entry(opp, &opp_table->opp_list, node)
 692		pstate_count += !!opp->pstate;
 693
 694	/* Either all or none of the nodes shall have performance state set */
 695	if (pstate_count && pstate_count != count) {
 696		dev_err(dev, "Not all nodes have performance state set (%d: %d)\n",
 697			count, pstate_count);
 698		return -ENOENT;
 699	}
 700
 701	if (pstate_count)
 702		opp_table->genpd_performance_state = true;
 703
 704	opp_table->parsed_static_opps = true;
 705
 706	return 0;
 707}
 708
 709/* Initializes OPP tables based on old-deprecated bindings */
 710static int _of_add_opp_table_v1(struct device *dev, struct opp_table *opp_table)
 711{
 712	const struct property *prop;
 713	const __be32 *val;
 714	int nr, ret = 0;
 715
 716	prop = of_find_property(dev->of_node, "operating-points", NULL);
 717	if (!prop)
 718		return -ENODEV;
 719	if (!prop->value)
 720		return -ENODATA;
 721
 722	/*
 723	 * Each OPP is a set of tuples consisting of frequency and
 724	 * voltage like <freq-kHz vol-uV>.
 725	 */
 726	nr = prop->length / sizeof(u32);
 727	if (nr % 2) {
 728		dev_err(dev, "%s: Invalid OPP table\n", __func__);
 729		return -EINVAL;
 730	}
 731
 732	val = prop->value;
 733	while (nr) {
 734		unsigned long freq = be32_to_cpup(val++) * 1000;
 735		unsigned long volt = be32_to_cpup(val++);
 736
 737		ret = _opp_add_v1(opp_table, dev, freq, volt, false);
 738		if (ret) {
 739			dev_err(dev, "%s: Failed to add OPP %ld (%d)\n",
 740				__func__, freq, ret);
 741			return ret;
 742		}
 743		nr -= 2;
 744	}
 745
 746	return ret;
 747}
 748
 749/**
 750 * dev_pm_opp_of_add_table() - Initialize opp table from device tree
 751 * @dev:	device pointer used to lookup OPP table.
 752 *
 753 * Register the initial OPP table with the OPP library for given device.
 754 *
 755 * Return:
 756 * 0		On success OR
 757 *		Duplicate OPPs (both freq and volt are same) and opp->available
 758 * -EEXIST	Freq are same and volt are different OR
 759 *		Duplicate OPPs (both freq and volt are same) and !opp->available
 760 * -ENOMEM	Memory allocation failure
 761 * -ENODEV	when 'operating-points' property is not found or is invalid data
 762 *		in device node.
 763 * -ENODATA	when empty 'operating-points' property is found
 764 * -EINVAL	when invalid entries are found in opp-v2 table
 765 */
 766int dev_pm_opp_of_add_table(struct device *dev)
 767{
 768	struct opp_table *opp_table;
 769	int ret;
 770
 771	opp_table = dev_pm_opp_get_opp_table_indexed(dev, 0);
 772	if (!opp_table)
 773		return -ENOMEM;
 774
 775	/*
 776	 * OPPs have two version of bindings now. Also try the old (v1)
 777	 * bindings for backward compatibility with older dtbs.
 778	 */
 779	if (opp_table->np)
 780		ret = _of_add_opp_table_v2(dev, opp_table);
 781	else
 782		ret = _of_add_opp_table_v1(dev, opp_table);
 783
 784	if (ret)
 785		dev_pm_opp_put_opp_table(opp_table);
 786
 787	return ret;
 788}
 789EXPORT_SYMBOL_GPL(dev_pm_opp_of_add_table);
 790
 791/**
 792 * dev_pm_opp_of_add_table_indexed() - Initialize indexed opp table from device tree
 793 * @dev:	device pointer used to lookup OPP table.
 794 * @index:	Index number.
 795 *
 796 * Register the initial OPP table with the OPP library for given device only
 797 * using the "operating-points-v2" property.
 798 *
 799 * Return:
 800 * 0		On success OR
 801 *		Duplicate OPPs (both freq and volt are same) and opp->available
 802 * -EEXIST	Freq are same and volt are different OR
 803 *		Duplicate OPPs (both freq and volt are same) and !opp->available
 804 * -ENOMEM	Memory allocation failure
 805 * -ENODEV	when 'operating-points' property is not found or is invalid data
 806 *		in device node.
 807 * -ENODATA	when empty 'operating-points' property is found
 808 * -EINVAL	when invalid entries are found in opp-v2 table
 809 */
 810int dev_pm_opp_of_add_table_indexed(struct device *dev, int index)
 811{
 812	struct opp_table *opp_table;
 813	int ret, count;
 814
 815	if (index) {
 816		/*
 817		 * If only one phandle is present, then the same OPP table
 818		 * applies for all index requests.
 819		 */
 820		count = of_count_phandle_with_args(dev->of_node,
 821						   "operating-points-v2", NULL);
 822		if (count == 1)
 823			index = 0;
 824	}
 825
 826	opp_table = dev_pm_opp_get_opp_table_indexed(dev, index);
 827	if (!opp_table)
 828		return -ENOMEM;
 829
 830	ret = _of_add_opp_table_v2(dev, opp_table);
 831	if (ret)
 832		dev_pm_opp_put_opp_table(opp_table);
 833
 834	return ret;
 835}
 836EXPORT_SYMBOL_GPL(dev_pm_opp_of_add_table_indexed);
 837
 838/* CPU device specific helpers */
 839
 840/**
 841 * dev_pm_opp_of_cpumask_remove_table() - Removes OPP table for @cpumask
 842 * @cpumask:	cpumask for which OPP table needs to be removed
 843 *
 844 * This removes the OPP tables for CPUs present in the @cpumask.
 845 * This should be used only to remove static entries created from DT.
 846 */
 847void dev_pm_opp_of_cpumask_remove_table(const struct cpumask *cpumask)
 848{
 849	_dev_pm_opp_cpumask_remove_table(cpumask, -1);
 850}
 851EXPORT_SYMBOL_GPL(dev_pm_opp_of_cpumask_remove_table);
 852
 853/**
 854 * dev_pm_opp_of_cpumask_add_table() - Adds OPP table for @cpumask
 855 * @cpumask:	cpumask for which OPP table needs to be added.
 856 *
 857 * This adds the OPP tables for CPUs present in the @cpumask.
 858 */
 859int dev_pm_opp_of_cpumask_add_table(const struct cpumask *cpumask)
 860{
 861	struct device *cpu_dev;
 862	int cpu, ret;
 863
 864	if (WARN_ON(cpumask_empty(cpumask)))
 865		return -ENODEV;
 866
 867	for_each_cpu(cpu, cpumask) {
 868		cpu_dev = get_cpu_device(cpu);
 869		if (!cpu_dev) {
 870			pr_err("%s: failed to get cpu%d device\n", __func__,
 871			       cpu);
 872			ret = -ENODEV;
 873			goto remove_table;
 874		}
 875
 876		ret = dev_pm_opp_of_add_table(cpu_dev);
 877		if (ret) {
 878			/*
 879			 * OPP may get registered dynamically, don't print error
 880			 * message here.
 881			 */
 882			pr_debug("%s: couldn't find opp table for cpu:%d, %d\n",
 883				 __func__, cpu, ret);
 884
 885			goto remove_table;
 886		}
 887	}
 888
 889	return 0;
 890
 891remove_table:
 892	/* Free all other OPPs */
 893	_dev_pm_opp_cpumask_remove_table(cpumask, cpu);
 894
 895	return ret;
 896}
 897EXPORT_SYMBOL_GPL(dev_pm_opp_of_cpumask_add_table);
 898
 899/*
 900 * Works only for OPP v2 bindings.
 901 *
 902 * Returns -ENOENT if operating-points-v2 bindings aren't supported.
 903 */
 904/**
 905 * dev_pm_opp_of_get_sharing_cpus() - Get cpumask of CPUs sharing OPPs with
 906 *				      @cpu_dev using operating-points-v2
 907 *				      bindings.
 908 *
 909 * @cpu_dev:	CPU device for which we do this operation
 910 * @cpumask:	cpumask to update with information of sharing CPUs
 911 *
 912 * This updates the @cpumask with CPUs that are sharing OPPs with @cpu_dev.
 913 *
 914 * Returns -ENOENT if operating-points-v2 isn't present for @cpu_dev.
 915 */
 916int dev_pm_opp_of_get_sharing_cpus(struct device *cpu_dev,
 917				   struct cpumask *cpumask)
 918{
 919	struct device_node *np, *tmp_np, *cpu_np;
 920	int cpu, ret = 0;
 921
 922	/* Get OPP descriptor node */
 923	np = dev_pm_opp_of_get_opp_desc_node(cpu_dev);
 924	if (!np) {
 925		dev_dbg(cpu_dev, "%s: Couldn't find opp node.\n", __func__);
 926		return -ENOENT;
 927	}
 928
 929	cpumask_set_cpu(cpu_dev->id, cpumask);
 930
 931	/* OPPs are shared ? */
 932	if (!of_property_read_bool(np, "opp-shared"))
 933		goto put_cpu_node;
 934
 935	for_each_possible_cpu(cpu) {
 936		if (cpu == cpu_dev->id)
 937			continue;
 938
 939		cpu_np = of_cpu_device_node_get(cpu);
 940		if (!cpu_np) {
 941			dev_err(cpu_dev, "%s: failed to get cpu%d node\n",
 942				__func__, cpu);
 943			ret = -ENOENT;
 944			goto put_cpu_node;
 945		}
 946
 947		/* Get OPP descriptor node */
 948		tmp_np = _opp_of_get_opp_desc_node(cpu_np, 0);
 949		of_node_put(cpu_np);
 950		if (!tmp_np) {
 951			pr_err("%pOF: Couldn't find opp node\n", cpu_np);
 952			ret = -ENOENT;
 953			goto put_cpu_node;
 954		}
 955
 956		/* CPUs are sharing opp node */
 957		if (np == tmp_np)
 958			cpumask_set_cpu(cpu, cpumask);
 959
 960		of_node_put(tmp_np);
 961	}
 962
 963put_cpu_node:
 964	of_node_put(np);
 965	return ret;
 966}
 967EXPORT_SYMBOL_GPL(dev_pm_opp_of_get_sharing_cpus);
 968
 969/**
 970 * of_get_required_opp_performance_state() - Search for required OPP and return its performance state.
 971 * @np: Node that contains the "required-opps" property.
 972 * @index: Index of the phandle to parse.
 973 *
 974 * Returns the performance state of the OPP pointed out by the "required-opps"
 975 * property at @index in @np.
 976 *
 977 * Return: Zero or positive performance state on success, otherwise negative
 978 * value on errors.
 979 */
 980int of_get_required_opp_performance_state(struct device_node *np, int index)
 981{
 982	struct dev_pm_opp *opp;
 983	struct device_node *required_np;
 984	struct opp_table *opp_table;
 985	int pstate = -EINVAL;
 986
 987	required_np = of_parse_required_opp(np, index);
 988	if (!required_np)
 989		return -EINVAL;
 990
 991	opp_table = _find_table_of_opp_np(required_np);
 992	if (IS_ERR(opp_table)) {
 993		pr_err("%s: Failed to find required OPP table %pOF: %ld\n",
 994		       __func__, np, PTR_ERR(opp_table));
 995		goto put_required_np;
 996	}
 997
 998	opp = _find_opp_of_np(opp_table, required_np);
 999	if (opp) {
1000		pstate = opp->pstate;
1001		dev_pm_opp_put(opp);
1002	}
1003
1004	dev_pm_opp_put_opp_table(opp_table);
1005
1006put_required_np:
1007	of_node_put(required_np);
1008
1009	return pstate;
1010}
1011EXPORT_SYMBOL_GPL(of_get_required_opp_performance_state);
1012
1013/**
1014 * dev_pm_opp_get_of_node() - Gets the DT node corresponding to an opp
1015 * @opp:	opp for which DT node has to be returned for
1016 *
1017 * Return: DT node corresponding to the opp, else 0 on success.
1018 *
1019 * The caller needs to put the node with of_node_put() after using it.
1020 */
1021struct device_node *dev_pm_opp_get_of_node(struct dev_pm_opp *opp)
1022{
1023	if (IS_ERR_OR_NULL(opp)) {
1024		pr_err("%s: Invalid parameters\n", __func__);
1025		return NULL;
1026	}
1027
1028	return of_node_get(opp->np);
1029}
1030EXPORT_SYMBOL_GPL(dev_pm_opp_get_of_node);
1031
1032/*
1033 * Callback function provided to the Energy Model framework upon registration.
1034 * This computes the power estimated by @CPU at @kHz if it is the frequency
1035 * of an existing OPP, or at the frequency of the first OPP above @kHz otherwise
1036 * (see dev_pm_opp_find_freq_ceil()). This function updates @kHz to the ceiled
1037 * frequency and @mW to the associated power. The power is estimated as
1038 * P = C * V^2 * f with C being the CPU's capacitance and V and f respectively
1039 * the voltage and frequency of the OPP.
1040 *
1041 * Returns -ENODEV if the CPU device cannot be found, -EINVAL if the power
1042 * calculation failed because of missing parameters, 0 otherwise.
1043 */
1044static int __maybe_unused _get_cpu_power(unsigned long *mW, unsigned long *kHz,
1045					 int cpu)
1046{
1047	struct device *cpu_dev;
1048	struct dev_pm_opp *opp;
1049	struct device_node *np;
1050	unsigned long mV, Hz;
1051	u32 cap;
1052	u64 tmp;
1053	int ret;
1054
1055	cpu_dev = get_cpu_device(cpu);
1056	if (!cpu_dev)
1057		return -ENODEV;
1058
1059	np = of_node_get(cpu_dev->of_node);
1060	if (!np)
1061		return -EINVAL;
1062
1063	ret = of_property_read_u32(np, "dynamic-power-coefficient", &cap);
1064	of_node_put(np);
1065	if (ret)
1066		return -EINVAL;
1067
1068	Hz = *kHz * 1000;
1069	opp = dev_pm_opp_find_freq_ceil(cpu_dev, &Hz);
1070	if (IS_ERR(opp))
1071		return -EINVAL;
1072
1073	mV = dev_pm_opp_get_voltage(opp) / 1000;
1074	dev_pm_opp_put(opp);
1075	if (!mV)
1076		return -EINVAL;
1077
1078	tmp = (u64)cap * mV * mV * (Hz / 1000000);
1079	do_div(tmp, 1000000000);
1080
1081	*mW = (unsigned long)tmp;
1082	*kHz = Hz / 1000;
1083
1084	return 0;
1085}
1086
1087/**
1088 * dev_pm_opp_of_register_em() - Attempt to register an Energy Model
1089 * @cpus	: CPUs for which an Energy Model has to be registered
1090 *
1091 * This checks whether the "dynamic-power-coefficient" devicetree property has
1092 * been specified, and tries to register an Energy Model with it if it has.
1093 */
1094void dev_pm_opp_of_register_em(struct cpumask *cpus)
1095{
1096	struct em_data_callback em_cb = EM_DATA_CB(_get_cpu_power);
1097	int ret, nr_opp, cpu = cpumask_first(cpus);
1098	struct device *cpu_dev;
1099	struct device_node *np;
1100	u32 cap;
1101
1102	cpu_dev = get_cpu_device(cpu);
1103	if (!cpu_dev)
1104		return;
1105
1106	nr_opp = dev_pm_opp_get_opp_count(cpu_dev);
1107	if (nr_opp <= 0)
1108		return;
1109
1110	np = of_node_get(cpu_dev->of_node);
1111	if (!np)
1112		return;
1113
1114	/*
1115	 * Register an EM only if the 'dynamic-power-coefficient' property is
1116	 * set in devicetree. It is assumed the voltage values are known if that
1117	 * property is set since it is useless otherwise. If voltages are not
1118	 * known, just let the EM registration fail with an error to alert the
1119	 * user about the inconsistent configuration.
1120	 */
1121	ret = of_property_read_u32(np, "dynamic-power-coefficient", &cap);
1122	of_node_put(np);
1123	if (ret || !cap)
1124		return;
1125
1126	em_register_perf_domain(cpus, nr_opp, &em_cb);
1127}
1128EXPORT_SYMBOL_GPL(dev_pm_opp_of_register_em);