of.c 24.0 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
/*
 * Generic OPP OF helpers
 *
 * Copyright (C) 2009-2010 Texas Instruments Incorporated.
 *	Nishanth Menon
 *	Romit Dasgupta
 *	Kevin Hilman
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */

#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt

#include <linux/cpu.h>
#include <linux/errno.h>
#include <linux/device.h>
19
#include <linux/of_device.h>
20
#include <linux/pm_domain.h>
21
#include <linux/slab.h>
22 23 24 25
#include <linux/export.h>

#include "opp.h"

26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
/*
 * Returns opp descriptor node for a device node, caller must
 * do of_node_put().
 */
static struct device_node *_opp_of_get_opp_desc_node(struct device_node *np,
						     int index)
{
	/* "operating-points-v2" can be an array for power domain providers */
	return of_parse_phandle(np, "operating-points-v2", index);
}

/* Returns opp descriptor node for a device, caller must do of_node_put() */
struct device_node *dev_pm_opp_of_get_opp_desc_node(struct device *dev)
{
	return _opp_of_get_opp_desc_node(dev->of_node, 0);
}
EXPORT_SYMBOL_GPL(dev_pm_opp_of_get_opp_desc_node);

44
struct opp_table *_managed_opp(struct device *dev, int index)
45
{
46
	struct opp_table *opp_table, *managed_table = NULL;
47
	struct device_node *np;
48

49 50 51
	np = _opp_of_get_opp_desc_node(dev->of_node, index);
	if (!np)
		return NULL;
52

53
	list_for_each_entry(opp_table, &opp_tables, node) {
54 55 56 57 58 59 60 61
		if (opp_table->np == np) {
			/*
			 * Multiple devices can point to the same OPP table and
			 * so will have same node-pointer, np.
			 *
			 * But the OPPs will be considered as shared only if the
			 * OPP table contains a "opp-shared" property.
			 */
62 63 64 65
			if (opp_table->shared_opp == OPP_TABLE_ACCESS_SHARED) {
				_get_opp_table_kref(opp_table);
				managed_table = opp_table;
			}
66

67
			break;
68 69 70
		}
	}

71
	of_node_put(np);
72 73

	return managed_table;
74 75
}

76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216
/* The caller must call dev_pm_opp_put() after the OPP is used */
static struct dev_pm_opp *_find_opp_of_np(struct opp_table *opp_table,
					  struct device_node *opp_np)
{
	struct dev_pm_opp *opp;

	lockdep_assert_held(&opp_table_lock);

	mutex_lock(&opp_table->lock);

	list_for_each_entry(opp, &opp_table->opp_list, node) {
		if (opp->np == opp_np) {
			dev_pm_opp_get(opp);
			mutex_unlock(&opp_table->lock);
			return opp;
		}
	}

	mutex_unlock(&opp_table->lock);

	return NULL;
}

static struct device_node *of_parse_required_opp(struct device_node *np,
						 int index)
{
	struct device_node *required_np;

	required_np = of_parse_phandle(np, "required-opps", index);
	if (unlikely(!required_np)) {
		pr_err("%s: Unable to parse required-opps: %pOF, index: %d\n",
		       __func__, np, index);
	}

	return required_np;
}

/* The caller must call dev_pm_opp_put_opp_table() after the table is used */
static struct opp_table *_find_table_of_opp_np(struct device_node *opp_np)
{
	struct opp_table *opp_table;
	struct dev_pm_opp *opp;

	lockdep_assert_held(&opp_table_lock);

	list_for_each_entry(opp_table, &opp_tables, node) {
		opp = _find_opp_of_np(opp_table, opp_np);
		if (opp) {
			dev_pm_opp_put(opp);
			_get_opp_table_kref(opp_table);
			return opp_table;
		}
	}

	return ERR_PTR(-ENODEV);
}

/* Free resources previously acquired by _opp_table_alloc_required_tables() */
static void _opp_table_free_required_tables(struct opp_table *opp_table)
{
	struct opp_table **required_opp_tables = opp_table->required_opp_tables;
	int i;

	if (!required_opp_tables)
		return;

	for (i = 0; i < opp_table->required_opp_count; i++) {
		if (IS_ERR_OR_NULL(required_opp_tables[i]))
			break;

		dev_pm_opp_put_opp_table(required_opp_tables[i]);
	}

	kfree(required_opp_tables);

	opp_table->required_opp_count = 0;
	opp_table->required_opp_tables = NULL;
}

/*
 * Populate all devices and opp tables which are part of "required-opps" list.
 * Checking only the first OPP node should be enough.
 */
static void _opp_table_alloc_required_tables(struct opp_table *opp_table,
					     struct device *dev,
					     struct device_node *opp_np)
{
	struct opp_table **required_opp_tables;
	struct device_node *required_np, *np;
	int count, i;

	/* Traversing the first OPP node is all we need */
	np = of_get_next_available_child(opp_np, NULL);
	if (!np) {
		dev_err(dev, "Empty OPP table\n");
		return;
	}

	count = of_count_phandle_with_args(np, "required-opps", NULL);
	if (!count)
		goto put_np;

	required_opp_tables = kcalloc(count, sizeof(*required_opp_tables),
				      GFP_KERNEL);
	if (!required_opp_tables)
		goto put_np;

	opp_table->required_opp_tables = required_opp_tables;
	opp_table->required_opp_count = count;

	for (i = 0; i < count; i++) {
		required_np = of_parse_required_opp(np, i);
		if (!required_np)
			goto free_required_tables;

		required_opp_tables[i] = _find_table_of_opp_np(required_np);
		of_node_put(required_np);

		if (IS_ERR(required_opp_tables[i]))
			goto free_required_tables;

		/*
		 * We only support genpd's OPPs in the "required-opps" for now,
		 * as we don't know how much about other cases. Error out if the
		 * required OPP doesn't belong to a genpd.
		 */
		if (!required_opp_tables[i]->is_genpd) {
			dev_err(dev, "required-opp doesn't belong to genpd: %pOF\n",
				required_np);
			goto free_required_tables;
		}
	}

	goto put_np;

free_required_tables:
	_opp_table_free_required_tables(opp_table);
put_np:
	of_node_put(np);
}

217 218
void _of_init_opp_table(struct opp_table *opp_table, struct device *dev,
			int index)
219
{
220 221
	struct device_node *np, *opp_np;
	u32 val;
222 223 224 225 226 227

	/*
	 * Only required for backward compatibility with v1 bindings, but isn't
	 * harmful for other cases. And so we do it unconditionally.
	 */
	np = of_node_get(dev->of_node);
228 229 230 231 232 233 234 235
	if (!np)
		return;

	if (!of_property_read_u32(np, "clock-latency", &val))
		opp_table->clock_latency_ns_max = val;
	of_property_read_u32(np, "voltage-tolerance",
			     &opp_table->voltage_tolerance_v1);

236 237 238
	if (of_find_property(np, "#power-domain-cells", NULL))
		opp_table->is_genpd = true;

239 240 241 242 243 244 245 246 247 248 249 250 251 252
	/* Get OPP table node */
	opp_np = _opp_of_get_opp_desc_node(np, index);
	of_node_put(np);

	if (!opp_np)
		return;

	if (of_property_read_bool(opp_np, "opp-shared"))
		opp_table->shared_opp = OPP_TABLE_ACCESS_SHARED;
	else
		opp_table->shared_opp = OPP_TABLE_ACCESS_EXCLUSIVE;

	opp_table->np = opp_np;

253
	_opp_table_alloc_required_tables(opp_table, dev, opp_np);
254
	of_node_put(opp_np);
255 256
}

257 258 259 260 261
void _of_clear_opp_table(struct opp_table *opp_table)
{
	_opp_table_free_required_tables(opp_table);
}

262 263 264 265 266 267 268
static bool _opp_is_supported(struct device *dev, struct opp_table *opp_table,
			      struct device_node *np)
{
	unsigned int count = opp_table->supported_hw_count;
	u32 version;
	int ret;

269 270 271 272 273 274 275 276 277 278 279 280
	if (!opp_table->supported_hw) {
		/*
		 * In the case that no supported_hw has been set by the
		 * platform but there is an opp-supported-hw value set for
		 * an OPP then the OPP should not be enabled as there is
		 * no way to see if the hardware supports it.
		 */
		if (of_find_property(np, "opp-supported-hw", NULL))
			return false;
		else
			return true;
	}
281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301

	while (count--) {
		ret = of_property_read_u32_index(np, "opp-supported-hw", count,
						 &version);
		if (ret) {
			dev_warn(dev, "%s: failed to read opp-supported-hw property at index %d: %d\n",
				 __func__, count, ret);
			return false;
		}

		/* Both of these are bitwise masks of the versions */
		if (!(version & opp_table->supported_hw[count]))
			return false;
	}

	return true;
}

static int opp_parse_supplies(struct dev_pm_opp *opp, struct device *dev,
			      struct opp_table *opp_table)
{
302 303
	u32 *microvolt, *microamp = NULL;
	int supplies, vcount, icount, ret, i, j;
304 305 306
	struct property *prop = NULL;
	char name[NAME_MAX];

307 308
	supplies = opp_table->regulator_count ? opp_table->regulator_count : 1;

309 310 311 312 313 314 315 316 317 318 319 320 321
	/* Search for "opp-microvolt-<name>" */
	if (opp_table->prop_name) {
		snprintf(name, sizeof(name), "opp-microvolt-%s",
			 opp_table->prop_name);
		prop = of_find_property(opp->np, name, NULL);
	}

	if (!prop) {
		/* Search for "opp-microvolt" */
		sprintf(name, "opp-microvolt");
		prop = of_find_property(opp->np, name, NULL);

		/* Missing property isn't a problem, but an invalid entry is */
322 323 324 325 326 327 328 329
		if (!prop) {
			if (!opp_table->regulator_count)
				return 0;

			dev_err(dev, "%s: opp-microvolt missing although OPP managing regulators\n",
				__func__);
			return -EINVAL;
		}
330 331
	}

332 333
	vcount = of_property_count_u32_elems(opp->np, name);
	if (vcount < 0) {
334
		dev_err(dev, "%s: Invalid %s property (%d)\n",
335 336
			__func__, name, vcount);
		return vcount;
337 338
	}

339 340 341 342
	/* There can be one or three elements per supply */
	if (vcount != supplies && vcount != supplies * 3) {
		dev_err(dev, "%s: Invalid number of elements in %s property (%d) with supplies (%d)\n",
			__func__, name, vcount, supplies);
343 344 345
		return -EINVAL;
	}

346 347 348 349 350
	microvolt = kmalloc_array(vcount, sizeof(*microvolt), GFP_KERNEL);
	if (!microvolt)
		return -ENOMEM;

	ret = of_property_read_u32_array(opp->np, name, microvolt, vcount);
351 352
	if (ret) {
		dev_err(dev, "%s: error parsing %s: %d\n", __func__, name, ret);
353 354
		ret = -EINVAL;
		goto free_microvolt;
355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370
	}

	/* Search for "opp-microamp-<name>" */
	prop = NULL;
	if (opp_table->prop_name) {
		snprintf(name, sizeof(name), "opp-microamp-%s",
			 opp_table->prop_name);
		prop = of_find_property(opp->np, name, NULL);
	}

	if (!prop) {
		/* Search for "opp-microamp" */
		sprintf(name, "opp-microamp");
		prop = of_find_property(opp->np, name, NULL);
	}

371 372 373 374 375 376 377 378
	if (prop) {
		icount = of_property_count_u32_elems(opp->np, name);
		if (icount < 0) {
			dev_err(dev, "%s: Invalid %s property (%d)\n", __func__,
				name, icount);
			ret = icount;
			goto free_microvolt;
		}
379

380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423
		if (icount != supplies) {
			dev_err(dev, "%s: Invalid number of elements in %s property (%d) with supplies (%d)\n",
				__func__, name, icount, supplies);
			ret = -EINVAL;
			goto free_microvolt;
		}

		microamp = kmalloc_array(icount, sizeof(*microamp), GFP_KERNEL);
		if (!microamp) {
			ret = -EINVAL;
			goto free_microvolt;
		}

		ret = of_property_read_u32_array(opp->np, name, microamp,
						 icount);
		if (ret) {
			dev_err(dev, "%s: error parsing %s: %d\n", __func__,
				name, ret);
			ret = -EINVAL;
			goto free_microamp;
		}
	}

	for (i = 0, j = 0; i < supplies; i++) {
		opp->supplies[i].u_volt = microvolt[j++];

		if (vcount == supplies) {
			opp->supplies[i].u_volt_min = opp->supplies[i].u_volt;
			opp->supplies[i].u_volt_max = opp->supplies[i].u_volt;
		} else {
			opp->supplies[i].u_volt_min = microvolt[j++];
			opp->supplies[i].u_volt_max = microvolt[j++];
		}

		if (microamp)
			opp->supplies[i].u_amp = microamp[i];
	}

free_microamp:
	kfree(microamp);
free_microvolt:
	kfree(microvolt);

	return ret;
424 425 426 427 428 429 430 431 432 433 434
}

/**
 * dev_pm_opp_of_remove_table() - Free OPP table entries created from static DT
 *				  entries
 * @dev:	device pointer used to lookup OPP table.
 *
 * Free OPPs created using static entries present in DT.
 */
void dev_pm_opp_of_remove_table(struct device *dev)
{
435
	_dev_pm_opp_find_and_remove_table(dev);
436 437 438 439 440
}
EXPORT_SYMBOL_GPL(dev_pm_opp_of_remove_table);

/**
 * _opp_add_static_v2() - Allocate static OPPs (As per 'v2' DT bindings)
441
 * @opp_table:	OPP table
442 443 444 445 446 447 448 449
 * @dev:	device for which we do this operation
 * @np:		device node
 *
 * This function adds an opp definition to the opp table and returns status. The
 * opp can be controlled using dev_pm_opp_enable/disable functions and may be
 * removed by dev_pm_opp_remove.
 *
 * Return:
450 451 452
 * Valid OPP pointer:
 *		On success
 * NULL:
453
 *		Duplicate OPPs (both freq and volt are same) and opp->available
454 455 456
 *		OR if the OPP is not supported by hardware.
 * ERR_PTR(-EEXIST):
 *		Freq are same and volt are different OR
457
 *		Duplicate OPPs (both freq and volt are same) and !opp->available
458 459 460 461
 * ERR_PTR(-ENOMEM):
 *		Memory allocation failure
 * ERR_PTR(-EINVAL):
 *		Failed parsing the OPP node
462
 */
463 464
static struct dev_pm_opp *_opp_add_static_v2(struct opp_table *opp_table,
		struct device *dev, struct device_node *np)
465 466
{
	struct dev_pm_opp *new_opp;
467
	u64 rate = 0;
468 469
	u32 val;
	int ret;
470
	bool rate_not_available = false;
471

472 473
	new_opp = _opp_allocate(opp_table);
	if (!new_opp)
474
		return ERR_PTR(-ENOMEM);
475 476 477

	ret = of_property_read_u64(np, "opp-hz", &rate);
	if (ret < 0) {
478
		/* "opp-hz" is optional for devices like power domains. */
479
		if (!opp_table->is_genpd) {
480 481 482 483 484 485 486 487 488 489 490 491
			dev_err(dev, "%s: opp-hz not found\n", __func__);
			goto free_opp;
		}

		rate_not_available = true;
	} else {
		/*
		 * Rate is defined as an unsigned long in clk API, and so
		 * casting explicitly to its type. Must be fixed once rate is 64
		 * bit guaranteed in clk API.
		 */
		new_opp->rate = (unsigned long)rate;
492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508
	}

	/* Check if the OPP supports hardware's hierarchy of versions or not */
	if (!_opp_is_supported(dev, opp_table, np)) {
		dev_dbg(dev, "OPP not supported by hardware: %llu\n", rate);
		goto free_opp;
	}

	new_opp->turbo = of_property_read_bool(np, "turbo-mode");

	new_opp->np = np;
	new_opp->dynamic = false;
	new_opp->available = true;

	if (!of_property_read_u32(np, "clock-latency-ns", &val))
		new_opp->clock_latency_ns = val;

509 510
	new_opp->pstate = of_genpd_opp_to_performance_state(dev, np);

511 512 513 514
	ret = opp_parse_supplies(new_opp, dev, opp_table);
	if (ret)
		goto free_opp;

515
	ret = _opp_add(dev, new_opp, opp_table, rate_not_available);
516 517 518 519
	if (ret) {
		/* Don't return error for duplicate OPPs */
		if (ret == -EBUSY)
			ret = 0;
520
		goto free_opp;
521
	}
522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538

	/* OPP to select on device suspend */
	if (of_property_read_bool(np, "opp-suspend")) {
		if (opp_table->suspend_opp) {
			dev_warn(dev, "%s: Multiple suspend OPPs found (%lu %lu)\n",
				 __func__, opp_table->suspend_opp->rate,
				 new_opp->rate);
		} else {
			new_opp->suspend = true;
			opp_table->suspend_opp = new_opp;
		}
	}

	if (new_opp->clock_latency_ns > opp_table->clock_latency_ns_max)
		opp_table->clock_latency_ns_max = new_opp->clock_latency_ns;

	pr_debug("%s: turbo:%d rate:%lu uv:%lu uvmin:%lu uvmax:%lu latency:%lu\n",
539
		 __func__, new_opp->turbo, new_opp->rate,
540 541
		 new_opp->supplies[0].u_volt, new_opp->supplies[0].u_volt_min,
		 new_opp->supplies[0].u_volt_max, new_opp->clock_latency_ns);
542 543 544 545 546

	/*
	 * Notify the changes in the availability of the operable
	 * frequency/voltage list.
	 */
547
	blocking_notifier_call_chain(&opp_table->head, OPP_EVENT_ADD, new_opp);
548
	return new_opp;
549 550

free_opp:
551 552
	_opp_free(new_opp);

553
	return ERR_PTR(ret);
554 555 556
}

/* Initializes OPP tables based on new bindings */
557
static int _of_add_opp_table_v2(struct device *dev, struct opp_table *opp_table)
558 559
{
	struct device_node *np;
560
	int ret, count = 0, pstate_count = 0;
561
	struct dev_pm_opp *opp;
562

563 564 565 566 567 568
	/* OPP table is already initialized for the device */
	if (opp_table->parsed_static_opps) {
		kref_get(&opp_table->list_kref);
		return 0;
	}

569 570
	kref_init(&opp_table->list_kref);

571
	/* We have opp-table node now, iterate over it and add OPPs */
572
	for_each_available_child_of_node(opp_table->np, np) {
573 574 575
		opp = _opp_add_static_v2(opp_table, dev, np);
		if (IS_ERR(opp)) {
			ret = PTR_ERR(opp);
576 577
			dev_err(dev, "%s: Failed to add OPP, %d\n", __func__,
				ret);
578
			of_node_put(np);
579
			goto put_list_kref;
580 581
		} else if (opp) {
			count++;
582 583 584 585
		}
	}

	/* There should be one of more OPP defined */
586 587
	if (WARN_ON(!count)) {
		ret = -ENOENT;
588
		goto put_list_kref;
589 590
	}

591 592 593 594 595 596 597 598
	list_for_each_entry(opp, &opp_table->opp_list, node)
		pstate_count += !!opp->pstate;

	/* Either all or none of the nodes shall have performance state set */
	if (pstate_count && pstate_count != count) {
		dev_err(dev, "Not all nodes have performance state set (%d: %d)\n",
			count, pstate_count);
		ret = -ENOENT;
599
		goto put_list_kref;
600 601 602 603 604
	}

	if (pstate_count)
		opp_table->genpd_performance_state = true;

605
	opp_table->parsed_static_opps = true;
606

607 608 609 610
	return 0;

put_list_kref:
	_put_opp_list_kref(opp_table);
611 612 613 614 615

	return ret;
}

/* Initializes OPP tables based on old-deprecated bindings */
616
static int _of_add_opp_table_v1(struct device *dev, struct opp_table *opp_table)
617 618 619
{
	const struct property *prop;
	const __be32 *val;
620
	int nr, ret = 0;
621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637

	prop = of_find_property(dev->of_node, "operating-points", NULL);
	if (!prop)
		return -ENODEV;
	if (!prop->value)
		return -ENODATA;

	/*
	 * Each OPP is a set of tuples consisting of frequency and
	 * voltage like <freq-kHz vol-uV>.
	 */
	nr = prop->length / sizeof(u32);
	if (nr % 2) {
		dev_err(dev, "%s: Invalid OPP table\n", __func__);
		return -EINVAL;
	}

638 639
	kref_init(&opp_table->list_kref);

640 641 642 643 644
	val = prop->value;
	while (nr) {
		unsigned long freq = be32_to_cpup(val++) * 1000;
		unsigned long volt = be32_to_cpup(val++);

645
		ret = _opp_add_v1(opp_table, dev, freq, volt, false);
646 647 648
		if (ret) {
			dev_err(dev, "%s: Failed to add OPP %ld (%d)\n",
				__func__, freq, ret);
649 650
			_put_opp_list_kref(opp_table);
			return ret;
651
		}
652 653 654
		nr -= 2;
	}

655
	return ret;
656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676
}

/**
 * dev_pm_opp_of_add_table() - Initialize opp table from device tree
 * @dev:	device pointer used to lookup OPP table.
 *
 * Register the initial OPP table with the OPP library for given device.
 *
 * Return:
 * 0		On success OR
 *		Duplicate OPPs (both freq and volt are same) and opp->available
 * -EEXIST	Freq are same and volt are different OR
 *		Duplicate OPPs (both freq and volt are same) and !opp->available
 * -ENOMEM	Memory allocation failure
 * -ENODEV	when 'operating-points' property is not found or is invalid data
 *		in device node.
 * -ENODATA	when empty 'operating-points' property is found
 * -EINVAL	when invalid entries are found in opp-v2 table
 */
int dev_pm_opp_of_add_table(struct device *dev)
{
677
	struct opp_table *opp_table;
678 679
	int ret;

680 681 682 683
	opp_table = dev_pm_opp_get_opp_table_indexed(dev, 0);
	if (!opp_table)
		return -ENOMEM;

684
	/*
685 686
	 * OPPs have two version of bindings now. Also try the old (v1)
	 * bindings for backward compatibility with older dtbs.
687
	 */
688 689 690 691
	if (opp_table->np)
		ret = _of_add_opp_table_v2(dev, opp_table);
	else
		ret = _of_add_opp_table_v1(dev, opp_table);
692

693 694
	if (ret)
		dev_pm_opp_put_opp_table(opp_table);
695 696 697 698 699

	return ret;
}
EXPORT_SYMBOL_GPL(dev_pm_opp_of_add_table);

700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720
/**
 * dev_pm_opp_of_add_table_indexed() - Initialize indexed opp table from device tree
 * @dev:	device pointer used to lookup OPP table.
 * @index:	Index number.
 *
 * Register the initial OPP table with the OPP library for given device only
 * using the "operating-points-v2" property.
 *
 * Return:
 * 0		On success OR
 *		Duplicate OPPs (both freq and volt are same) and opp->available
 * -EEXIST	Freq are same and volt are different OR
 *		Duplicate OPPs (both freq and volt are same) and !opp->available
 * -ENOMEM	Memory allocation failure
 * -ENODEV	when 'operating-points' property is not found or is invalid data
 *		in device node.
 * -ENODATA	when empty 'operating-points' property is found
 * -EINVAL	when invalid entries are found in opp-v2 table
 */
int dev_pm_opp_of_add_table_indexed(struct device *dev, int index)
{
721
	struct opp_table *opp_table;
722
	int ret, count;
723

724
	if (index) {
725 726 727 728 729 730
		/*
		 * If only one phandle is present, then the same OPP table
		 * applies for all index requests.
		 */
		count = of_count_phandle_with_args(dev->of_node,
						   "operating-points-v2", NULL);
731 732
		if (count != 1)
			return -ENODEV;
733

734
		index = 0;
735
	}
736

737 738 739 740 741 742 743
	opp_table = dev_pm_opp_get_opp_table_indexed(dev, index);
	if (!opp_table)
		return -ENOMEM;

	ret = _of_add_opp_table_v2(dev, opp_table);
	if (ret)
		dev_pm_opp_put_opp_table(opp_table);
744 745 746 747 748

	return ret;
}
EXPORT_SYMBOL_GPL(dev_pm_opp_of_add_table_indexed);

749 750 751 752 753 754 755 756 757 758 759
/* CPU device specific helpers */

/**
 * dev_pm_opp_of_cpumask_remove_table() - Removes OPP table for @cpumask
 * @cpumask:	cpumask for which OPP table needs to be removed
 *
 * This removes the OPP tables for CPUs present in the @cpumask.
 * This should be used only to remove static entries created from DT.
 */
void dev_pm_opp_of_cpumask_remove_table(const struct cpumask *cpumask)
{
760
	_dev_pm_opp_cpumask_remove_table(cpumask, -1);
761 762 763 764 765 766 767 768 769 770 771 772
}
EXPORT_SYMBOL_GPL(dev_pm_opp_of_cpumask_remove_table);

/**
 * dev_pm_opp_of_cpumask_add_table() - Adds OPP table for @cpumask
 * @cpumask:	cpumask for which OPP table needs to be added.
 *
 * This adds the OPP tables for CPUs present in the @cpumask.
 */
int dev_pm_opp_of_cpumask_add_table(const struct cpumask *cpumask)
{
	struct device *cpu_dev;
773
	int cpu, ret;
774

775 776
	if (WARN_ON(cpumask_empty(cpumask)))
		return -ENODEV;
777 778 779 780 781 782

	for_each_cpu(cpu, cpumask) {
		cpu_dev = get_cpu_device(cpu);
		if (!cpu_dev) {
			pr_err("%s: failed to get cpu%d device\n", __func__,
			       cpu);
783 784
			ret = -ENODEV;
			goto remove_table;
785 786 787 788
		}

		ret = dev_pm_opp_of_add_table(cpu_dev);
		if (ret) {
789 790 791 792 793 794
			/*
			 * OPP may get registered dynamically, don't print error
			 * message here.
			 */
			pr_debug("%s: couldn't find opp table for cpu:%d, %d\n",
				 __func__, cpu, ret);
795

796
			goto remove_table;
797 798 799
		}
	}

800 801 802 803 804 805
	return 0;

remove_table:
	/* Free all other OPPs */
	_dev_pm_opp_cpumask_remove_table(cpumask, cpu);

806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829
	return ret;
}
EXPORT_SYMBOL_GPL(dev_pm_opp_of_cpumask_add_table);

/*
 * Works only for OPP v2 bindings.
 *
 * Returns -ENOENT if operating-points-v2 bindings aren't supported.
 */
/**
 * dev_pm_opp_of_get_sharing_cpus() - Get cpumask of CPUs sharing OPPs with
 *				      @cpu_dev using operating-points-v2
 *				      bindings.
 *
 * @cpu_dev:	CPU device for which we do this operation
 * @cpumask:	cpumask to update with information of sharing CPUs
 *
 * This updates the @cpumask with CPUs that are sharing OPPs with @cpu_dev.
 *
 * Returns -ENOENT if operating-points-v2 isn't present for @cpu_dev.
 */
int dev_pm_opp_of_get_sharing_cpus(struct device *cpu_dev,
				   struct cpumask *cpumask)
{
830
	struct device_node *np, *tmp_np, *cpu_np;
831 832 833
	int cpu, ret = 0;

	/* Get OPP descriptor node */
834
	np = dev_pm_opp_of_get_opp_desc_node(cpu_dev);
835
	if (!np) {
836
		dev_dbg(cpu_dev, "%s: Couldn't find opp node.\n", __func__);
837 838 839 840 841 842 843 844 845 846 847 848 849
		return -ENOENT;
	}

	cpumask_set_cpu(cpu_dev->id, cpumask);

	/* OPPs are shared ? */
	if (!of_property_read_bool(np, "opp-shared"))
		goto put_cpu_node;

	for_each_possible_cpu(cpu) {
		if (cpu == cpu_dev->id)
			continue;

850
		cpu_np = of_cpu_device_node_get(cpu);
851 852
		if (!cpu_np) {
			dev_err(cpu_dev, "%s: failed to get cpu%d node\n",
853
				__func__, cpu);
854
			ret = -ENOENT;
855 856 857 858
			goto put_cpu_node;
		}

		/* Get OPP descriptor node */
859
		tmp_np = _opp_of_get_opp_desc_node(cpu_np, 0);
860
		of_node_put(cpu_np);
861
		if (!tmp_np) {
862
			pr_err("%pOF: Couldn't find opp node\n", cpu_np);
863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878
			ret = -ENOENT;
			goto put_cpu_node;
		}

		/* CPUs are sharing opp node */
		if (np == tmp_np)
			cpumask_set_cpu(cpu, cpumask);

		of_node_put(tmp_np);
	}

put_cpu_node:
	of_node_put(np);
	return ret;
}
EXPORT_SYMBOL_GPL(dev_pm_opp_of_get_sharing_cpus);
879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932

/**
 * of_dev_pm_opp_find_required_opp() - Search for required OPP.
 * @dev: The device whose OPP node is referenced by the 'np' DT node.
 * @np: Node that contains the "required-opps" property.
 *
 * Returns the OPP of the device 'dev', whose phandle is present in the "np"
 * node. Although the "required-opps" property supports having multiple
 * phandles, this helper routine only parses the very first phandle in the list.
 *
 * Return: Matching opp, else returns ERR_PTR in case of error and should be
 * handled using IS_ERR.
 *
 * The callers are required to call dev_pm_opp_put() for the returned OPP after
 * use.
 */
struct dev_pm_opp *of_dev_pm_opp_find_required_opp(struct device *dev,
						   struct device_node *np)
{
	struct dev_pm_opp *temp_opp, *opp = ERR_PTR(-ENODEV);
	struct device_node *required_np;
	struct opp_table *opp_table;

	opp_table = _find_opp_table(dev);
	if (IS_ERR(opp_table))
		return ERR_CAST(opp_table);

	required_np = of_parse_phandle(np, "required-opps", 0);
	if (unlikely(!required_np)) {
		dev_err(dev, "Unable to parse required-opps\n");
		goto put_opp_table;
	}

	mutex_lock(&opp_table->lock);

	list_for_each_entry(temp_opp, &opp_table->opp_list, node) {
		if (temp_opp->available && temp_opp->np == required_np) {
			opp = temp_opp;

			/* Increment the reference count of OPP */
			dev_pm_opp_get(opp);
			break;
		}
	}

	mutex_unlock(&opp_table->lock);

	of_node_put(required_np);
put_opp_table:
	dev_pm_opp_put_opp_table(opp_table);

	return opp;
}
EXPORT_SYMBOL_GPL(of_dev_pm_opp_find_required_opp);
933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951

/**
 * dev_pm_opp_get_of_node() - Gets the DT node corresponding to an opp
 * @opp:	opp for which DT node has to be returned for
 *
 * Return: DT node corresponding to the opp, else 0 on success.
 *
 * The caller needs to put the node with of_node_put() after using it.
 */
struct device_node *dev_pm_opp_get_of_node(struct dev_pm_opp *opp)
{
	if (IS_ERR_OR_NULL(opp)) {
		pr_err("%s: Invalid parameters\n", __func__);
		return NULL;
	}

	return of_node_get(opp->np);
}
EXPORT_SYMBOL_GPL(dev_pm_opp_get_of_node);