Linux Audio

Check our new training course

In-person Linux kernel drivers training

Jun 16-20, 2025
Register
Loading...
Note: File does not exist in v3.5.6.
   1// SPDX-License-Identifier: GPL-2.0+
   2/*
   3 * drivers/of/property.c - Procedures for accessing and interpreting
   4 *			   Devicetree properties and graphs.
   5 *
   6 * Initially created by copying procedures from drivers/of/base.c. This
   7 * file contains the OF property as well as the OF graph interface
   8 * functions.
   9 *
  10 * Paul Mackerras	August 1996.
  11 * Copyright (C) 1996-2005 Paul Mackerras.
  12 *
  13 *  Adapted for 64bit PowerPC by Dave Engebretsen and Peter Bergner.
  14 *    {engebret|bergner}@us.ibm.com
  15 *
  16 *  Adapted for sparc and sparc64 by David S. Miller davem@davemloft.net
  17 *
  18 *  Reconsolidated from arch/x/kernel/prom.c by Stephen Rothwell and
  19 *  Grant Likely.
  20 */
  21
  22#define pr_fmt(fmt)	"OF: " fmt
  23
  24#include <linux/of.h>
  25#include <linux/of_device.h>
  26#include <linux/of_graph.h>
  27#include <linux/string.h>
  28
  29#include "of_private.h"
  30
  31/**
  32 * of_property_count_elems_of_size - Count the number of elements in a property
  33 *
  34 * @np:		device node from which the property value is to be read.
  35 * @propname:	name of the property to be searched.
  36 * @elem_size:	size of the individual element
  37 *
  38 * Search for a property in a device node and count the number of elements of
  39 * size elem_size in it. Returns number of elements on sucess, -EINVAL if the
  40 * property does not exist or its length does not match a multiple of elem_size
  41 * and -ENODATA if the property does not have a value.
  42 */
  43int of_property_count_elems_of_size(const struct device_node *np,
  44				const char *propname, int elem_size)
  45{
  46	struct property *prop = of_find_property(np, propname, NULL);
  47
  48	if (!prop)
  49		return -EINVAL;
  50	if (!prop->value)
  51		return -ENODATA;
  52
  53	if (prop->length % elem_size != 0) {
  54		pr_err("size of %s in node %pOF is not a multiple of %d\n",
  55		       propname, np, elem_size);
  56		return -EINVAL;
  57	}
  58
  59	return prop->length / elem_size;
  60}
  61EXPORT_SYMBOL_GPL(of_property_count_elems_of_size);
  62
  63/**
  64 * of_find_property_value_of_size
  65 *
  66 * @np:		device node from which the property value is to be read.
  67 * @propname:	name of the property to be searched.
  68 * @min:	minimum allowed length of property value
  69 * @max:	maximum allowed length of property value (0 means unlimited)
  70 * @len:	if !=NULL, actual length is written to here
  71 *
  72 * Search for a property in a device node and valid the requested size.
  73 * Returns the property value on success, -EINVAL if the property does not
  74 *  exist, -ENODATA if property does not have a value, and -EOVERFLOW if the
  75 * property data is too small or too large.
  76 *
  77 */
  78static void *of_find_property_value_of_size(const struct device_node *np,
  79			const char *propname, u32 min, u32 max, size_t *len)
  80{
  81	struct property *prop = of_find_property(np, propname, NULL);
  82
  83	if (!prop)
  84		return ERR_PTR(-EINVAL);
  85	if (!prop->value)
  86		return ERR_PTR(-ENODATA);
  87	if (prop->length < min)
  88		return ERR_PTR(-EOVERFLOW);
  89	if (max && prop->length > max)
  90		return ERR_PTR(-EOVERFLOW);
  91
  92	if (len)
  93		*len = prop->length;
  94
  95	return prop->value;
  96}
  97
  98/**
  99 * of_property_read_u32_index - Find and read a u32 from a multi-value property.
 100 *
 101 * @np:		device node from which the property value is to be read.
 102 * @propname:	name of the property to be searched.
 103 * @index:	index of the u32 in the list of values
 104 * @out_value:	pointer to return value, modified only if no error.
 105 *
 106 * Search for a property in a device node and read nth 32-bit value from
 107 * it. Returns 0 on success, -EINVAL if the property does not exist,
 108 * -ENODATA if property does not have a value, and -EOVERFLOW if the
 109 * property data isn't large enough.
 110 *
 111 * The out_value is modified only if a valid u32 value can be decoded.
 112 */
 113int of_property_read_u32_index(const struct device_node *np,
 114				       const char *propname,
 115				       u32 index, u32 *out_value)
 116{
 117	const u32 *val = of_find_property_value_of_size(np, propname,
 118					((index + 1) * sizeof(*out_value)),
 119					0,
 120					NULL);
 121
 122	if (IS_ERR(val))
 123		return PTR_ERR(val);
 124
 125	*out_value = be32_to_cpup(((__be32 *)val) + index);
 126	return 0;
 127}
 128EXPORT_SYMBOL_GPL(of_property_read_u32_index);
 129
 130/**
 131 * of_property_read_u64_index - Find and read a u64 from a multi-value property.
 132 *
 133 * @np:		device node from which the property value is to be read.
 134 * @propname:	name of the property to be searched.
 135 * @index:	index of the u64 in the list of values
 136 * @out_value:	pointer to return value, modified only if no error.
 137 *
 138 * Search for a property in a device node and read nth 64-bit value from
 139 * it. Returns 0 on success, -EINVAL if the property does not exist,
 140 * -ENODATA if property does not have a value, and -EOVERFLOW if the
 141 * property data isn't large enough.
 142 *
 143 * The out_value is modified only if a valid u64 value can be decoded.
 144 */
 145int of_property_read_u64_index(const struct device_node *np,
 146				       const char *propname,
 147				       u32 index, u64 *out_value)
 148{
 149	const u64 *val = of_find_property_value_of_size(np, propname,
 150					((index + 1) * sizeof(*out_value)),
 151					0, NULL);
 152
 153	if (IS_ERR(val))
 154		return PTR_ERR(val);
 155
 156	*out_value = be64_to_cpup(((__be64 *)val) + index);
 157	return 0;
 158}
 159EXPORT_SYMBOL_GPL(of_property_read_u64_index);
 160
 161/**
 162 * of_property_read_variable_u8_array - Find and read an array of u8 from a
 163 * property, with bounds on the minimum and maximum array size.
 164 *
 165 * @np:		device node from which the property value is to be read.
 166 * @propname:	name of the property to be searched.
 167 * @out_values:	pointer to return value, modified only if return value is 0.
 168 * @sz_min:	minimum number of array elements to read
 169 * @sz_max:	maximum number of array elements to read, if zero there is no
 170 *		upper limit on the number of elements in the dts entry but only
 171 *		sz_min will be read.
 172 *
 173 * Search for a property in a device node and read 8-bit value(s) from
 174 * it. Returns number of elements read on success, -EINVAL if the property
 175 * does not exist, -ENODATA if property does not have a value, and -EOVERFLOW
 176 * if the property data is smaller than sz_min or longer than sz_max.
 177 *
 178 * dts entry of array should be like:
 179 *	property = /bits/ 8 <0x50 0x60 0x70>;
 180 *
 181 * The out_values is modified only if a valid u8 value can be decoded.
 182 */
 183int of_property_read_variable_u8_array(const struct device_node *np,
 184					const char *propname, u8 *out_values,
 185					size_t sz_min, size_t sz_max)
 186{
 187	size_t sz, count;
 188	const u8 *val = of_find_property_value_of_size(np, propname,
 189						(sz_min * sizeof(*out_values)),
 190						(sz_max * sizeof(*out_values)),
 191						&sz);
 192
 193	if (IS_ERR(val))
 194		return PTR_ERR(val);
 195
 196	if (!sz_max)
 197		sz = sz_min;
 198	else
 199		sz /= sizeof(*out_values);
 200
 201	count = sz;
 202	while (count--)
 203		*out_values++ = *val++;
 204
 205	return sz;
 206}
 207EXPORT_SYMBOL_GPL(of_property_read_variable_u8_array);
 208
 209/**
 210 * of_property_read_variable_u16_array - Find and read an array of u16 from a
 211 * property, with bounds on the minimum and maximum array size.
 212 *
 213 * @np:		device node from which the property value is to be read.
 214 * @propname:	name of the property to be searched.
 215 * @out_values:	pointer to return value, modified only if return value is 0.
 216 * @sz_min:	minimum number of array elements to read
 217 * @sz_max:	maximum number of array elements to read, if zero there is no
 218 *		upper limit on the number of elements in the dts entry but only
 219 *		sz_min will be read.
 220 *
 221 * Search for a property in a device node and read 16-bit value(s) from
 222 * it. Returns number of elements read on success, -EINVAL if the property
 223 * does not exist, -ENODATA if property does not have a value, and -EOVERFLOW
 224 * if the property data is smaller than sz_min or longer than sz_max.
 225 *
 226 * dts entry of array should be like:
 227 *	property = /bits/ 16 <0x5000 0x6000 0x7000>;
 228 *
 229 * The out_values is modified only if a valid u16 value can be decoded.
 230 */
 231int of_property_read_variable_u16_array(const struct device_node *np,
 232					const char *propname, u16 *out_values,
 233					size_t sz_min, size_t sz_max)
 234{
 235	size_t sz, count;
 236	const __be16 *val = of_find_property_value_of_size(np, propname,
 237						(sz_min * sizeof(*out_values)),
 238						(sz_max * sizeof(*out_values)),
 239						&sz);
 240
 241	if (IS_ERR(val))
 242		return PTR_ERR(val);
 243
 244	if (!sz_max)
 245		sz = sz_min;
 246	else
 247		sz /= sizeof(*out_values);
 248
 249	count = sz;
 250	while (count--)
 251		*out_values++ = be16_to_cpup(val++);
 252
 253	return sz;
 254}
 255EXPORT_SYMBOL_GPL(of_property_read_variable_u16_array);
 256
 257/**
 258 * of_property_read_variable_u32_array - Find and read an array of 32 bit
 259 * integers from a property, with bounds on the minimum and maximum array size.
 260 *
 261 * @np:		device node from which the property value is to be read.
 262 * @propname:	name of the property to be searched.
 263 * @out_values:	pointer to return value, modified only if return value is 0.
 264 * @sz_min:	minimum number of array elements to read
 265 * @sz_max:	maximum number of array elements to read, if zero there is no
 266 *		upper limit on the number of elements in the dts entry but only
 267 *		sz_min will be read.
 268 *
 269 * Search for a property in a device node and read 32-bit value(s) from
 270 * it. Returns number of elements read on success, -EINVAL if the property
 271 * does not exist, -ENODATA if property does not have a value, and -EOVERFLOW
 272 * if the property data is smaller than sz_min or longer than sz_max.
 273 *
 274 * The out_values is modified only if a valid u32 value can be decoded.
 275 */
 276int of_property_read_variable_u32_array(const struct device_node *np,
 277			       const char *propname, u32 *out_values,
 278			       size_t sz_min, size_t sz_max)
 279{
 280	size_t sz, count;
 281	const __be32 *val = of_find_property_value_of_size(np, propname,
 282						(sz_min * sizeof(*out_values)),
 283						(sz_max * sizeof(*out_values)),
 284						&sz);
 285
 286	if (IS_ERR(val))
 287		return PTR_ERR(val);
 288
 289	if (!sz_max)
 290		sz = sz_min;
 291	else
 292		sz /= sizeof(*out_values);
 293
 294	count = sz;
 295	while (count--)
 296		*out_values++ = be32_to_cpup(val++);
 297
 298	return sz;
 299}
 300EXPORT_SYMBOL_GPL(of_property_read_variable_u32_array);
 301
 302/**
 303 * of_property_read_u64 - Find and read a 64 bit integer from a property
 304 * @np:		device node from which the property value is to be read.
 305 * @propname:	name of the property to be searched.
 306 * @out_value:	pointer to return value, modified only if return value is 0.
 307 *
 308 * Search for a property in a device node and read a 64-bit value from
 309 * it. Returns 0 on success, -EINVAL if the property does not exist,
 310 * -ENODATA if property does not have a value, and -EOVERFLOW if the
 311 * property data isn't large enough.
 312 *
 313 * The out_value is modified only if a valid u64 value can be decoded.
 314 */
 315int of_property_read_u64(const struct device_node *np, const char *propname,
 316			 u64 *out_value)
 317{
 318	const __be32 *val = of_find_property_value_of_size(np, propname,
 319						sizeof(*out_value),
 320						0,
 321						NULL);
 322
 323	if (IS_ERR(val))
 324		return PTR_ERR(val);
 325
 326	*out_value = of_read_number(val, 2);
 327	return 0;
 328}
 329EXPORT_SYMBOL_GPL(of_property_read_u64);
 330
 331/**
 332 * of_property_read_variable_u64_array - Find and read an array of 64 bit
 333 * integers from a property, with bounds on the minimum and maximum array size.
 334 *
 335 * @np:		device node from which the property value is to be read.
 336 * @propname:	name of the property to be searched.
 337 * @out_values:	pointer to return value, modified only if return value is 0.
 338 * @sz_min:	minimum number of array elements to read
 339 * @sz_max:	maximum number of array elements to read, if zero there is no
 340 *		upper limit on the number of elements in the dts entry but only
 341 *		sz_min will be read.
 342 *
 343 * Search for a property in a device node and read 64-bit value(s) from
 344 * it. Returns number of elements read on success, -EINVAL if the property
 345 * does not exist, -ENODATA if property does not have a value, and -EOVERFLOW
 346 * if the property data is smaller than sz_min or longer than sz_max.
 347 *
 348 * The out_values is modified only if a valid u64 value can be decoded.
 349 */
 350int of_property_read_variable_u64_array(const struct device_node *np,
 351			       const char *propname, u64 *out_values,
 352			       size_t sz_min, size_t sz_max)
 353{
 354	size_t sz, count;
 355	const __be32 *val = of_find_property_value_of_size(np, propname,
 356						(sz_min * sizeof(*out_values)),
 357						(sz_max * sizeof(*out_values)),
 358						&sz);
 359
 360	if (IS_ERR(val))
 361		return PTR_ERR(val);
 362
 363	if (!sz_max)
 364		sz = sz_min;
 365	else
 366		sz /= sizeof(*out_values);
 367
 368	count = sz;
 369	while (count--) {
 370		*out_values++ = of_read_number(val, 2);
 371		val += 2;
 372	}
 373
 374	return sz;
 375}
 376EXPORT_SYMBOL_GPL(of_property_read_variable_u64_array);
 377
 378/**
 379 * of_property_read_string - Find and read a string from a property
 380 * @np:		device node from which the property value is to be read.
 381 * @propname:	name of the property to be searched.
 382 * @out_string:	pointer to null terminated return string, modified only if
 383 *		return value is 0.
 384 *
 385 * Search for a property in a device tree node and retrieve a null
 386 * terminated string value (pointer to data, not a copy). Returns 0 on
 387 * success, -EINVAL if the property does not exist, -ENODATA if property
 388 * does not have a value, and -EILSEQ if the string is not null-terminated
 389 * within the length of the property data.
 390 *
 391 * The out_string pointer is modified only if a valid string can be decoded.
 392 */
 393int of_property_read_string(const struct device_node *np, const char *propname,
 394				const char **out_string)
 395{
 396	const struct property *prop = of_find_property(np, propname, NULL);
 397	if (!prop)
 398		return -EINVAL;
 399	if (!prop->value)
 400		return -ENODATA;
 401	if (strnlen(prop->value, prop->length) >= prop->length)
 402		return -EILSEQ;
 403	*out_string = prop->value;
 404	return 0;
 405}
 406EXPORT_SYMBOL_GPL(of_property_read_string);
 407
 408/**
 409 * of_property_match_string() - Find string in a list and return index
 410 * @np: pointer to node containing string list property
 411 * @propname: string list property name
 412 * @string: pointer to string to search for in string list
 413 *
 414 * This function searches a string list property and returns the index
 415 * of a specific string value.
 416 */
 417int of_property_match_string(const struct device_node *np, const char *propname,
 418			     const char *string)
 419{
 420	const struct property *prop = of_find_property(np, propname, NULL);
 421	size_t l;
 422	int i;
 423	const char *p, *end;
 424
 425	if (!prop)
 426		return -EINVAL;
 427	if (!prop->value)
 428		return -ENODATA;
 429
 430	p = prop->value;
 431	end = p + prop->length;
 432
 433	for (i = 0; p < end; i++, p += l) {
 434		l = strnlen(p, end - p) + 1;
 435		if (p + l > end)
 436			return -EILSEQ;
 437		pr_debug("comparing %s with %s\n", string, p);
 438		if (strcmp(string, p) == 0)
 439			return i; /* Found it; return index */
 440	}
 441	return -ENODATA;
 442}
 443EXPORT_SYMBOL_GPL(of_property_match_string);
 444
 445/**
 446 * of_property_read_string_helper() - Utility helper for parsing string properties
 447 * @np:		device node from which the property value is to be read.
 448 * @propname:	name of the property to be searched.
 449 * @out_strs:	output array of string pointers.
 450 * @sz:		number of array elements to read.
 451 * @skip:	Number of strings to skip over at beginning of list.
 452 *
 453 * Don't call this function directly. It is a utility helper for the
 454 * of_property_read_string*() family of functions.
 455 */
 456int of_property_read_string_helper(const struct device_node *np,
 457				   const char *propname, const char **out_strs,
 458				   size_t sz, int skip)
 459{
 460	const struct property *prop = of_find_property(np, propname, NULL);
 461	int l = 0, i = 0;
 462	const char *p, *end;
 463
 464	if (!prop)
 465		return -EINVAL;
 466	if (!prop->value)
 467		return -ENODATA;
 468	p = prop->value;
 469	end = p + prop->length;
 470
 471	for (i = 0; p < end && (!out_strs || i < skip + sz); i++, p += l) {
 472		l = strnlen(p, end - p) + 1;
 473		if (p + l > end)
 474			return -EILSEQ;
 475		if (out_strs && i >= skip)
 476			*out_strs++ = p;
 477	}
 478	i -= skip;
 479	return i <= 0 ? -ENODATA : i;
 480}
 481EXPORT_SYMBOL_GPL(of_property_read_string_helper);
 482
 483const __be32 *of_prop_next_u32(struct property *prop, const __be32 *cur,
 484			       u32 *pu)
 485{
 486	const void *curv = cur;
 487
 488	if (!prop)
 489		return NULL;
 490
 491	if (!cur) {
 492		curv = prop->value;
 493		goto out_val;
 494	}
 495
 496	curv += sizeof(*cur);
 497	if (curv >= prop->value + prop->length)
 498		return NULL;
 499
 500out_val:
 501	*pu = be32_to_cpup(curv);
 502	return curv;
 503}
 504EXPORT_SYMBOL_GPL(of_prop_next_u32);
 505
 506const char *of_prop_next_string(struct property *prop, const char *cur)
 507{
 508	const void *curv = cur;
 509
 510	if (!prop)
 511		return NULL;
 512
 513	if (!cur)
 514		return prop->value;
 515
 516	curv += strlen(cur) + 1;
 517	if (curv >= prop->value + prop->length)
 518		return NULL;
 519
 520	return curv;
 521}
 522EXPORT_SYMBOL_GPL(of_prop_next_string);
 523
 524/**
 525 * of_graph_parse_endpoint() - parse common endpoint node properties
 526 * @node: pointer to endpoint device_node
 527 * @endpoint: pointer to the OF endpoint data structure
 528 *
 529 * The caller should hold a reference to @node.
 530 */
 531int of_graph_parse_endpoint(const struct device_node *node,
 532			    struct of_endpoint *endpoint)
 533{
 534	struct device_node *port_node = of_get_parent(node);
 535
 536	WARN_ONCE(!port_node, "%s(): endpoint %pOF has no parent node\n",
 537		  __func__, node);
 538
 539	memset(endpoint, 0, sizeof(*endpoint));
 540
 541	endpoint->local_node = node;
 542	/*
 543	 * It doesn't matter whether the two calls below succeed.
 544	 * If they don't then the default value 0 is used.
 545	 */
 546	of_property_read_u32(port_node, "reg", &endpoint->port);
 547	of_property_read_u32(node, "reg", &endpoint->id);
 548
 549	of_node_put(port_node);
 550
 551	return 0;
 552}
 553EXPORT_SYMBOL(of_graph_parse_endpoint);
 554
 555/**
 556 * of_graph_get_port_by_id() - get the port matching a given id
 557 * @parent: pointer to the parent device node
 558 * @id: id of the port
 559 *
 560 * Return: A 'port' node pointer with refcount incremented. The caller
 561 * has to use of_node_put() on it when done.
 562 */
 563struct device_node *of_graph_get_port_by_id(struct device_node *parent, u32 id)
 564{
 565	struct device_node *node, *port;
 566
 567	node = of_get_child_by_name(parent, "ports");
 568	if (node)
 569		parent = node;
 570
 571	for_each_child_of_node(parent, port) {
 572		u32 port_id = 0;
 573
 574		if (!of_node_name_eq(port, "port"))
 575			continue;
 576		of_property_read_u32(port, "reg", &port_id);
 577		if (id == port_id)
 578			break;
 579	}
 580
 581	of_node_put(node);
 582
 583	return port;
 584}
 585EXPORT_SYMBOL(of_graph_get_port_by_id);
 586
 587/**
 588 * of_graph_get_next_endpoint() - get next endpoint node
 589 * @parent: pointer to the parent device node
 590 * @prev: previous endpoint node, or NULL to get first
 591 *
 592 * Return: An 'endpoint' node pointer with refcount incremented. Refcount
 593 * of the passed @prev node is decremented.
 594 */
 595struct device_node *of_graph_get_next_endpoint(const struct device_node *parent,
 596					struct device_node *prev)
 597{
 598	struct device_node *endpoint;
 599	struct device_node *port;
 600
 601	if (!parent)
 602		return NULL;
 603
 604	/*
 605	 * Start by locating the port node. If no previous endpoint is specified
 606	 * search for the first port node, otherwise get the previous endpoint
 607	 * parent port node.
 608	 */
 609	if (!prev) {
 610		struct device_node *node;
 611
 612		node = of_get_child_by_name(parent, "ports");
 613		if (node)
 614			parent = node;
 615
 616		port = of_get_child_by_name(parent, "port");
 617		of_node_put(node);
 618
 619		if (!port) {
 620			pr_err("graph: no port node found in %pOF\n", parent);
 621			return NULL;
 622		}
 623	} else {
 624		port = of_get_parent(prev);
 625		if (WARN_ONCE(!port, "%s(): endpoint %pOF has no parent node\n",
 626			      __func__, prev))
 627			return NULL;
 628	}
 629
 630	while (1) {
 631		/*
 632		 * Now that we have a port node, get the next endpoint by
 633		 * getting the next child. If the previous endpoint is NULL this
 634		 * will return the first child.
 635		 */
 636		endpoint = of_get_next_child(port, prev);
 637		if (endpoint) {
 638			of_node_put(port);
 639			return endpoint;
 640		}
 641
 642		/* No more endpoints under this port, try the next one. */
 643		prev = NULL;
 644
 645		do {
 646			port = of_get_next_child(parent, port);
 647			if (!port)
 648				return NULL;
 649		} while (!of_node_name_eq(port, "port"));
 650	}
 651}
 652EXPORT_SYMBOL(of_graph_get_next_endpoint);
 653
 654/**
 655 * of_graph_get_endpoint_by_regs() - get endpoint node of specific identifiers
 656 * @parent: pointer to the parent device node
 657 * @port_reg: identifier (value of reg property) of the parent port node
 658 * @reg: identifier (value of reg property) of the endpoint node
 659 *
 660 * Return: An 'endpoint' node pointer which is identified by reg and at the same
 661 * is the child of a port node identified by port_reg. reg and port_reg are
 662 * ignored when they are -1. Use of_node_put() on the pointer when done.
 663 */
 664struct device_node *of_graph_get_endpoint_by_regs(
 665	const struct device_node *parent, int port_reg, int reg)
 666{
 667	struct of_endpoint endpoint;
 668	struct device_node *node = NULL;
 669
 670	for_each_endpoint_of_node(parent, node) {
 671		of_graph_parse_endpoint(node, &endpoint);
 672		if (((port_reg == -1) || (endpoint.port == port_reg)) &&
 673			((reg == -1) || (endpoint.id == reg)))
 674			return node;
 675	}
 676
 677	return NULL;
 678}
 679EXPORT_SYMBOL(of_graph_get_endpoint_by_regs);
 680
 681/**
 682 * of_graph_get_remote_endpoint() - get remote endpoint node
 683 * @node: pointer to a local endpoint device_node
 684 *
 685 * Return: Remote endpoint node associated with remote endpoint node linked
 686 *	   to @node. Use of_node_put() on it when done.
 687 */
 688struct device_node *of_graph_get_remote_endpoint(const struct device_node *node)
 689{
 690	/* Get remote endpoint node. */
 691	return of_parse_phandle(node, "remote-endpoint", 0);
 692}
 693EXPORT_SYMBOL(of_graph_get_remote_endpoint);
 694
 695/**
 696 * of_graph_get_port_parent() - get port's parent node
 697 * @node: pointer to a local endpoint device_node
 698 *
 699 * Return: device node associated with endpoint node linked
 700 *	   to @node. Use of_node_put() on it when done.
 701 */
 702struct device_node *of_graph_get_port_parent(struct device_node *node)
 703{
 704	unsigned int depth;
 705
 706	if (!node)
 707		return NULL;
 708
 709	/*
 710	 * Preserve usecount for passed in node as of_get_next_parent()
 711	 * will do of_node_put() on it.
 712	 */
 713	of_node_get(node);
 714
 715	/* Walk 3 levels up only if there is 'ports' node. */
 716	for (depth = 3; depth && node; depth--) {
 717		node = of_get_next_parent(node);
 718		if (depth == 2 && !of_node_name_eq(node, "ports"))
 719			break;
 720	}
 721	return node;
 722}
 723EXPORT_SYMBOL(of_graph_get_port_parent);
 724
 725/**
 726 * of_graph_get_remote_port_parent() - get remote port's parent node
 727 * @node: pointer to a local endpoint device_node
 728 *
 729 * Return: Remote device node associated with remote endpoint node linked
 730 *	   to @node. Use of_node_put() on it when done.
 731 */
 732struct device_node *of_graph_get_remote_port_parent(
 733			       const struct device_node *node)
 734{
 735	struct device_node *np, *pp;
 736
 737	/* Get remote endpoint node. */
 738	np = of_graph_get_remote_endpoint(node);
 739
 740	pp = of_graph_get_port_parent(np);
 741
 742	of_node_put(np);
 743
 744	return pp;
 745}
 746EXPORT_SYMBOL(of_graph_get_remote_port_parent);
 747
 748/**
 749 * of_graph_get_remote_port() - get remote port node
 750 * @node: pointer to a local endpoint device_node
 751 *
 752 * Return: Remote port node associated with remote endpoint node linked
 753 *	   to @node. Use of_node_put() on it when done.
 754 */
 755struct device_node *of_graph_get_remote_port(const struct device_node *node)
 756{
 757	struct device_node *np;
 758
 759	/* Get remote endpoint node. */
 760	np = of_graph_get_remote_endpoint(node);
 761	if (!np)
 762		return NULL;
 763	return of_get_next_parent(np);
 764}
 765EXPORT_SYMBOL(of_graph_get_remote_port);
 766
 767int of_graph_get_endpoint_count(const struct device_node *np)
 768{
 769	struct device_node *endpoint;
 770	int num = 0;
 771
 772	for_each_endpoint_of_node(np, endpoint)
 773		num++;
 774
 775	return num;
 776}
 777EXPORT_SYMBOL(of_graph_get_endpoint_count);
 778
 779/**
 780 * of_graph_get_remote_node() - get remote parent device_node for given port/endpoint
 781 * @node: pointer to parent device_node containing graph port/endpoint
 782 * @port: identifier (value of reg property) of the parent port node
 783 * @endpoint: identifier (value of reg property) of the endpoint node
 784 *
 785 * Return: Remote device node associated with remote endpoint node linked
 786 *	   to @node. Use of_node_put() on it when done.
 787 */
 788struct device_node *of_graph_get_remote_node(const struct device_node *node,
 789					     u32 port, u32 endpoint)
 790{
 791	struct device_node *endpoint_node, *remote;
 792
 793	endpoint_node = of_graph_get_endpoint_by_regs(node, port, endpoint);
 794	if (!endpoint_node) {
 795		pr_debug("no valid endpoint (%d, %d) for node %pOF\n",
 796			 port, endpoint, node);
 797		return NULL;
 798	}
 799
 800	remote = of_graph_get_remote_port_parent(endpoint_node);
 801	of_node_put(endpoint_node);
 802	if (!remote) {
 803		pr_debug("no valid remote node\n");
 804		return NULL;
 805	}
 806
 807	if (!of_device_is_available(remote)) {
 808		pr_debug("not available for remote node\n");
 809		of_node_put(remote);
 810		return NULL;
 811	}
 812
 813	return remote;
 814}
 815EXPORT_SYMBOL(of_graph_get_remote_node);
 816
 817static struct fwnode_handle *of_fwnode_get(struct fwnode_handle *fwnode)
 818{
 819	return of_fwnode_handle(of_node_get(to_of_node(fwnode)));
 820}
 821
 822static void of_fwnode_put(struct fwnode_handle *fwnode)
 823{
 824	of_node_put(to_of_node(fwnode));
 825}
 826
 827static bool of_fwnode_device_is_available(const struct fwnode_handle *fwnode)
 828{
 829	return of_device_is_available(to_of_node(fwnode));
 830}
 831
 832static bool of_fwnode_property_present(const struct fwnode_handle *fwnode,
 833				       const char *propname)
 834{
 835	return of_property_read_bool(to_of_node(fwnode), propname);
 836}
 837
 838static int of_fwnode_property_read_int_array(const struct fwnode_handle *fwnode,
 839					     const char *propname,
 840					     unsigned int elem_size, void *val,
 841					     size_t nval)
 842{
 843	const struct device_node *node = to_of_node(fwnode);
 844
 845	if (!val)
 846		return of_property_count_elems_of_size(node, propname,
 847						       elem_size);
 848
 849	switch (elem_size) {
 850	case sizeof(u8):
 851		return of_property_read_u8_array(node, propname, val, nval);
 852	case sizeof(u16):
 853		return of_property_read_u16_array(node, propname, val, nval);
 854	case sizeof(u32):
 855		return of_property_read_u32_array(node, propname, val, nval);
 856	case sizeof(u64):
 857		return of_property_read_u64_array(node, propname, val, nval);
 858	}
 859
 860	return -ENXIO;
 861}
 862
 863static int
 864of_fwnode_property_read_string_array(const struct fwnode_handle *fwnode,
 865				     const char *propname, const char **val,
 866				     size_t nval)
 867{
 868	const struct device_node *node = to_of_node(fwnode);
 869
 870	return val ?
 871		of_property_read_string_array(node, propname, val, nval) :
 872		of_property_count_strings(node, propname);
 873}
 874
 875static struct fwnode_handle *
 876of_fwnode_get_parent(const struct fwnode_handle *fwnode)
 877{
 878	return of_fwnode_handle(of_get_parent(to_of_node(fwnode)));
 879}
 880
 881static struct fwnode_handle *
 882of_fwnode_get_next_child_node(const struct fwnode_handle *fwnode,
 883			      struct fwnode_handle *child)
 884{
 885	return of_fwnode_handle(of_get_next_available_child(to_of_node(fwnode),
 886							    to_of_node(child)));
 887}
 888
 889static struct fwnode_handle *
 890of_fwnode_get_named_child_node(const struct fwnode_handle *fwnode,
 891			       const char *childname)
 892{
 893	const struct device_node *node = to_of_node(fwnode);
 894	struct device_node *child;
 895
 896	for_each_available_child_of_node(node, child)
 897		if (of_node_name_eq(child, childname))
 898			return of_fwnode_handle(child);
 899
 900	return NULL;
 901}
 902
 903static int
 904of_fwnode_get_reference_args(const struct fwnode_handle *fwnode,
 905			     const char *prop, const char *nargs_prop,
 906			     unsigned int nargs, unsigned int index,
 907			     struct fwnode_reference_args *args)
 908{
 909	struct of_phandle_args of_args;
 910	unsigned int i;
 911	int ret;
 912
 913	if (nargs_prop)
 914		ret = of_parse_phandle_with_args(to_of_node(fwnode), prop,
 915						 nargs_prop, index, &of_args);
 916	else
 917		ret = of_parse_phandle_with_fixed_args(to_of_node(fwnode), prop,
 918						       nargs, index, &of_args);
 919	if (ret < 0)
 920		return ret;
 921	if (!args)
 922		return 0;
 923
 924	args->nargs = of_args.args_count;
 925	args->fwnode = of_fwnode_handle(of_args.np);
 926
 927	for (i = 0; i < NR_FWNODE_REFERENCE_ARGS; i++)
 928		args->args[i] = i < of_args.args_count ? of_args.args[i] : 0;
 929
 930	return 0;
 931}
 932
 933static struct fwnode_handle *
 934of_fwnode_graph_get_next_endpoint(const struct fwnode_handle *fwnode,
 935				  struct fwnode_handle *prev)
 936{
 937	return of_fwnode_handle(of_graph_get_next_endpoint(to_of_node(fwnode),
 938							   to_of_node(prev)));
 939}
 940
 941static struct fwnode_handle *
 942of_fwnode_graph_get_remote_endpoint(const struct fwnode_handle *fwnode)
 943{
 944	return of_fwnode_handle(
 945		of_graph_get_remote_endpoint(to_of_node(fwnode)));
 946}
 947
 948static struct fwnode_handle *
 949of_fwnode_graph_get_port_parent(struct fwnode_handle *fwnode)
 950{
 951	struct device_node *np;
 952
 953	/* Get the parent of the port */
 954	np = of_get_parent(to_of_node(fwnode));
 955	if (!np)
 956		return NULL;
 957
 958	/* Is this the "ports" node? If not, it's the port parent. */
 959	if (!of_node_name_eq(np, "ports"))
 960		return of_fwnode_handle(np);
 961
 962	return of_fwnode_handle(of_get_next_parent(np));
 963}
 964
 965static int of_fwnode_graph_parse_endpoint(const struct fwnode_handle *fwnode,
 966					  struct fwnode_endpoint *endpoint)
 967{
 968	const struct device_node *node = to_of_node(fwnode);
 969	struct device_node *port_node = of_get_parent(node);
 970
 971	endpoint->local_fwnode = fwnode;
 972
 973	of_property_read_u32(port_node, "reg", &endpoint->port);
 974	of_property_read_u32(node, "reg", &endpoint->id);
 975
 976	of_node_put(port_node);
 977
 978	return 0;
 979}
 980
 981static const void *
 982of_fwnode_device_get_match_data(const struct fwnode_handle *fwnode,
 983				const struct device *dev)
 984{
 985	return of_device_get_match_data(dev);
 986}
 987
 988const struct fwnode_operations of_fwnode_ops = {
 989	.get = of_fwnode_get,
 990	.put = of_fwnode_put,
 991	.device_is_available = of_fwnode_device_is_available,
 992	.device_get_match_data = of_fwnode_device_get_match_data,
 993	.property_present = of_fwnode_property_present,
 994	.property_read_int_array = of_fwnode_property_read_int_array,
 995	.property_read_string_array = of_fwnode_property_read_string_array,
 996	.get_parent = of_fwnode_get_parent,
 997	.get_next_child_node = of_fwnode_get_next_child_node,
 998	.get_named_child_node = of_fwnode_get_named_child_node,
 999	.get_reference_args = of_fwnode_get_reference_args,
1000	.graph_get_next_endpoint = of_fwnode_graph_get_next_endpoint,
1001	.graph_get_remote_endpoint = of_fwnode_graph_get_remote_endpoint,
1002	.graph_get_port_parent = of_fwnode_graph_get_port_parent,
1003	.graph_parse_endpoint = of_fwnode_graph_parse_endpoint,
1004};
1005EXPORT_SYMBOL_GPL(of_fwnode_ops);