xref: /linux/drivers/base/property.c (revision c288ea679840de4dee2ce6da5d0f139e3774ad86)
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * property.c - Unified device property interface.
4  *
5  * Copyright (C) 2014, Intel Corporation
6  * Authors: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
7  *          Mika Westerberg <mika.westerberg@linux.intel.com>
8  */
9 
10 #include <linux/acpi.h>
11 #include <linux/export.h>
12 #include <linux/kernel.h>
13 #include <linux/of.h>
14 #include <linux/of_address.h>
15 #include <linux/of_graph.h>
16 #include <linux/of_irq.h>
17 #include <linux/property.h>
18 #include <linux/phy.h>
19 
20 struct fwnode_handle *dev_fwnode(struct device *dev)
21 {
22 	return IS_ENABLED(CONFIG_OF) && dev->of_node ?
23 		of_fwnode_handle(dev->of_node) : dev->fwnode;
24 }
25 EXPORT_SYMBOL_GPL(dev_fwnode);
26 
27 /**
28  * device_property_present - check if a property of a device is present
29  * @dev: Device whose property is being checked
30  * @propname: Name of the property
31  *
32  * Check if property @propname is present in the device firmware description.
33  */
34 bool device_property_present(struct device *dev, const char *propname)
35 {
36 	return fwnode_property_present(dev_fwnode(dev), propname);
37 }
38 EXPORT_SYMBOL_GPL(device_property_present);
39 
40 /**
41  * fwnode_property_present - check if a property of a firmware node is present
42  * @fwnode: Firmware node whose property to check
43  * @propname: Name of the property
44  */
45 bool fwnode_property_present(const struct fwnode_handle *fwnode,
46 			     const char *propname)
47 {
48 	bool ret;
49 
50 	ret = fwnode_call_bool_op(fwnode, property_present, propname);
51 	if (ret == false && !IS_ERR_OR_NULL(fwnode) &&
52 	    !IS_ERR_OR_NULL(fwnode->secondary))
53 		ret = fwnode_call_bool_op(fwnode->secondary, property_present,
54 					 propname);
55 	return ret;
56 }
57 EXPORT_SYMBOL_GPL(fwnode_property_present);
58 
59 /**
60  * device_property_read_u8_array - return a u8 array property of a device
61  * @dev: Device to get the property of
62  * @propname: Name of the property
63  * @val: The values are stored here or %NULL to return the number of values
64  * @nval: Size of the @val array
65  *
66  * Function reads an array of u8 properties with @propname from the device
67  * firmware description and stores them to @val if found.
68  *
69  * Return: number of values if @val was %NULL,
70  *         %0 if the property was found (success),
71  *	   %-EINVAL if given arguments are not valid,
72  *	   %-ENODATA if the property does not have a value,
73  *	   %-EPROTO if the property is not an array of numbers,
74  *	   %-EOVERFLOW if the size of the property is not as expected.
75  *	   %-ENXIO if no suitable firmware interface is present.
76  */
77 int device_property_read_u8_array(struct device *dev, const char *propname,
78 				  u8 *val, size_t nval)
79 {
80 	return fwnode_property_read_u8_array(dev_fwnode(dev), propname, val, nval);
81 }
82 EXPORT_SYMBOL_GPL(device_property_read_u8_array);
83 
84 /**
85  * device_property_read_u16_array - return a u16 array property of a device
86  * @dev: Device to get the property of
87  * @propname: Name of the property
88  * @val: The values are stored here or %NULL to return the number of values
89  * @nval: Size of the @val array
90  *
91  * Function reads an array of u16 properties with @propname from the device
92  * firmware description and stores them to @val if found.
93  *
94  * Return: number of values if @val was %NULL,
95  *         %0 if the property was found (success),
96  *	   %-EINVAL if given arguments are not valid,
97  *	   %-ENODATA if the property does not have a value,
98  *	   %-EPROTO if the property is not an array of numbers,
99  *	   %-EOVERFLOW if the size of the property is not as expected.
100  *	   %-ENXIO if no suitable firmware interface is present.
101  */
102 int device_property_read_u16_array(struct device *dev, const char *propname,
103 				   u16 *val, size_t nval)
104 {
105 	return fwnode_property_read_u16_array(dev_fwnode(dev), propname, val, nval);
106 }
107 EXPORT_SYMBOL_GPL(device_property_read_u16_array);
108 
109 /**
110  * device_property_read_u32_array - return a u32 array property of a device
111  * @dev: Device to get the property of
112  * @propname: Name of the property
113  * @val: The values are stored here or %NULL to return the number of values
114  * @nval: Size of the @val array
115  *
116  * Function reads an array of u32 properties with @propname from the device
117  * firmware description and stores them to @val if found.
118  *
119  * Return: number of values if @val was %NULL,
120  *         %0 if the property was found (success),
121  *	   %-EINVAL if given arguments are not valid,
122  *	   %-ENODATA if the property does not have a value,
123  *	   %-EPROTO if the property is not an array of numbers,
124  *	   %-EOVERFLOW if the size of the property is not as expected.
125  *	   %-ENXIO if no suitable firmware interface is present.
126  */
127 int device_property_read_u32_array(struct device *dev, const char *propname,
128 				   u32 *val, size_t nval)
129 {
130 	return fwnode_property_read_u32_array(dev_fwnode(dev), propname, val, nval);
131 }
132 EXPORT_SYMBOL_GPL(device_property_read_u32_array);
133 
134 /**
135  * device_property_read_u64_array - return a u64 array property of a device
136  * @dev: Device to get the property of
137  * @propname: Name of the property
138  * @val: The values are stored here or %NULL to return the number of values
139  * @nval: Size of the @val array
140  *
141  * Function reads an array of u64 properties with @propname from the device
142  * firmware description and stores them to @val if found.
143  *
144  * Return: number of values if @val was %NULL,
145  *         %0 if the property was found (success),
146  *	   %-EINVAL if given arguments are not valid,
147  *	   %-ENODATA if the property does not have a value,
148  *	   %-EPROTO if the property is not an array of numbers,
149  *	   %-EOVERFLOW if the size of the property is not as expected.
150  *	   %-ENXIO if no suitable firmware interface is present.
151  */
152 int device_property_read_u64_array(struct device *dev, const char *propname,
153 				   u64 *val, size_t nval)
154 {
155 	return fwnode_property_read_u64_array(dev_fwnode(dev), propname, val, nval);
156 }
157 EXPORT_SYMBOL_GPL(device_property_read_u64_array);
158 
159 /**
160  * device_property_read_string_array - return a string array property of device
161  * @dev: Device to get the property of
162  * @propname: Name of the property
163  * @val: The values are stored here or %NULL to return the number of values
164  * @nval: Size of the @val array
165  *
166  * Function reads an array of string properties with @propname from the device
167  * firmware description and stores them to @val if found.
168  *
169  * Return: number of values read on success if @val is non-NULL,
170  *	   number of values available on success if @val is NULL,
171  *	   %-EINVAL if given arguments are not valid,
172  *	   %-ENODATA if the property does not have a value,
173  *	   %-EPROTO or %-EILSEQ if the property is not an array of strings,
174  *	   %-EOVERFLOW if the size of the property is not as expected.
175  *	   %-ENXIO if no suitable firmware interface is present.
176  */
177 int device_property_read_string_array(struct device *dev, const char *propname,
178 				      const char **val, size_t nval)
179 {
180 	return fwnode_property_read_string_array(dev_fwnode(dev), propname, val, nval);
181 }
182 EXPORT_SYMBOL_GPL(device_property_read_string_array);
183 
184 /**
185  * device_property_read_string - return a string property of a device
186  * @dev: Device to get the property of
187  * @propname: Name of the property
188  * @val: The value is stored here
189  *
190  * Function reads property @propname from the device firmware description and
191  * stores the value into @val if found. The value is checked to be a string.
192  *
193  * Return: %0 if the property was found (success),
194  *	   %-EINVAL if given arguments are not valid,
195  *	   %-ENODATA if the property does not have a value,
196  *	   %-EPROTO or %-EILSEQ if the property type is not a string.
197  *	   %-ENXIO if no suitable firmware interface is present.
198  */
199 int device_property_read_string(struct device *dev, const char *propname,
200 				const char **val)
201 {
202 	return fwnode_property_read_string(dev_fwnode(dev), propname, val);
203 }
204 EXPORT_SYMBOL_GPL(device_property_read_string);
205 
206 /**
207  * device_property_match_string - find a string in an array and return index
208  * @dev: Device to get the property of
209  * @propname: Name of the property holding the array
210  * @string: String to look for
211  *
212  * Find a given string in a string array and if it is found return the
213  * index back.
214  *
215  * Return: %0 if the property was found (success),
216  *	   %-EINVAL if given arguments are not valid,
217  *	   %-ENODATA if the property does not have a value,
218  *	   %-EPROTO if the property is not an array of strings,
219  *	   %-ENXIO if no suitable firmware interface is present.
220  */
221 int device_property_match_string(struct device *dev, const char *propname,
222 				 const char *string)
223 {
224 	return fwnode_property_match_string(dev_fwnode(dev), propname, string);
225 }
226 EXPORT_SYMBOL_GPL(device_property_match_string);
227 
228 static int fwnode_property_read_int_array(const struct fwnode_handle *fwnode,
229 					  const char *propname,
230 					  unsigned int elem_size, void *val,
231 					  size_t nval)
232 {
233 	int ret;
234 
235 	ret = fwnode_call_int_op(fwnode, property_read_int_array, propname,
236 				 elem_size, val, nval);
237 	if (ret == -EINVAL && !IS_ERR_OR_NULL(fwnode) &&
238 	    !IS_ERR_OR_NULL(fwnode->secondary))
239 		ret = fwnode_call_int_op(
240 			fwnode->secondary, property_read_int_array, propname,
241 			elem_size, val, nval);
242 
243 	return ret;
244 }
245 
246 /**
247  * fwnode_property_read_u8_array - return a u8 array property of firmware node
248  * @fwnode: Firmware node to get the property of
249  * @propname: Name of the property
250  * @val: The values are stored here or %NULL to return the number of values
251  * @nval: Size of the @val array
252  *
253  * Read an array of u8 properties with @propname from @fwnode and stores them to
254  * @val if found.
255  *
256  * Return: number of values if @val was %NULL,
257  *         %0 if the property was found (success),
258  *	   %-EINVAL if given arguments are not valid,
259  *	   %-ENODATA if the property does not have a value,
260  *	   %-EPROTO if the property is not an array of numbers,
261  *	   %-EOVERFLOW if the size of the property is not as expected,
262  *	   %-ENXIO if no suitable firmware interface is present.
263  */
264 int fwnode_property_read_u8_array(const struct fwnode_handle *fwnode,
265 				  const char *propname, u8 *val, size_t nval)
266 {
267 	return fwnode_property_read_int_array(fwnode, propname, sizeof(u8),
268 					      val, nval);
269 }
270 EXPORT_SYMBOL_GPL(fwnode_property_read_u8_array);
271 
272 /**
273  * fwnode_property_read_u16_array - return a u16 array property of firmware node
274  * @fwnode: Firmware node to get the property of
275  * @propname: Name of the property
276  * @val: The values are stored here or %NULL to return the number of values
277  * @nval: Size of the @val array
278  *
279  * Read an array of u16 properties with @propname from @fwnode and store them to
280  * @val if found.
281  *
282  * Return: number of values if @val was %NULL,
283  *         %0 if the property was found (success),
284  *	   %-EINVAL if given arguments are not valid,
285  *	   %-ENODATA if the property does not have a value,
286  *	   %-EPROTO if the property is not an array of numbers,
287  *	   %-EOVERFLOW if the size of the property is not as expected,
288  *	   %-ENXIO if no suitable firmware interface is present.
289  */
290 int fwnode_property_read_u16_array(const struct fwnode_handle *fwnode,
291 				   const char *propname, u16 *val, size_t nval)
292 {
293 	return fwnode_property_read_int_array(fwnode, propname, sizeof(u16),
294 					      val, nval);
295 }
296 EXPORT_SYMBOL_GPL(fwnode_property_read_u16_array);
297 
298 /**
299  * fwnode_property_read_u32_array - return a u32 array property of firmware node
300  * @fwnode: Firmware node to get the property of
301  * @propname: Name of the property
302  * @val: The values are stored here or %NULL to return the number of values
303  * @nval: Size of the @val array
304  *
305  * Read an array of u32 properties with @propname from @fwnode store them to
306  * @val if found.
307  *
308  * Return: number of values if @val was %NULL,
309  *         %0 if the property was found (success),
310  *	   %-EINVAL if given arguments are not valid,
311  *	   %-ENODATA if the property does not have a value,
312  *	   %-EPROTO if the property is not an array of numbers,
313  *	   %-EOVERFLOW if the size of the property is not as expected,
314  *	   %-ENXIO if no suitable firmware interface is present.
315  */
316 int fwnode_property_read_u32_array(const struct fwnode_handle *fwnode,
317 				   const char *propname, u32 *val, size_t nval)
318 {
319 	return fwnode_property_read_int_array(fwnode, propname, sizeof(u32),
320 					      val, nval);
321 }
322 EXPORT_SYMBOL_GPL(fwnode_property_read_u32_array);
323 
324 /**
325  * fwnode_property_read_u64_array - return a u64 array property firmware node
326  * @fwnode: Firmware node to get the property of
327  * @propname: Name of the property
328  * @val: The values are stored here or %NULL to return the number of values
329  * @nval: Size of the @val array
330  *
331  * Read an array of u64 properties with @propname from @fwnode and store them to
332  * @val if found.
333  *
334  * Return: number of values if @val was %NULL,
335  *         %0 if the property was found (success),
336  *	   %-EINVAL if given arguments are not valid,
337  *	   %-ENODATA if the property does not have a value,
338  *	   %-EPROTO if the property is not an array of numbers,
339  *	   %-EOVERFLOW if the size of the property is not as expected,
340  *	   %-ENXIO if no suitable firmware interface is present.
341  */
342 int fwnode_property_read_u64_array(const struct fwnode_handle *fwnode,
343 				   const char *propname, u64 *val, size_t nval)
344 {
345 	return fwnode_property_read_int_array(fwnode, propname, sizeof(u64),
346 					      val, nval);
347 }
348 EXPORT_SYMBOL_GPL(fwnode_property_read_u64_array);
349 
350 /**
351  * fwnode_property_read_string_array - return string array property of a node
352  * @fwnode: Firmware node to get the property of
353  * @propname: Name of the property
354  * @val: The values are stored here or %NULL to return the number of values
355  * @nval: Size of the @val array
356  *
357  * Read an string list property @propname from the given firmware node and store
358  * them to @val if found.
359  *
360  * Return: number of values read on success if @val is non-NULL,
361  *	   number of values available on success if @val is NULL,
362  *	   %-EINVAL if given arguments are not valid,
363  *	   %-ENODATA if the property does not have a value,
364  *	   %-EPROTO or %-EILSEQ if the property is not an array of strings,
365  *	   %-EOVERFLOW if the size of the property is not as expected,
366  *	   %-ENXIO if no suitable firmware interface is present.
367  */
368 int fwnode_property_read_string_array(const struct fwnode_handle *fwnode,
369 				      const char *propname, const char **val,
370 				      size_t nval)
371 {
372 	int ret;
373 
374 	ret = fwnode_call_int_op(fwnode, property_read_string_array, propname,
375 				 val, nval);
376 	if (ret == -EINVAL && !IS_ERR_OR_NULL(fwnode) &&
377 	    !IS_ERR_OR_NULL(fwnode->secondary))
378 		ret = fwnode_call_int_op(fwnode->secondary,
379 					 property_read_string_array, propname,
380 					 val, nval);
381 	return ret;
382 }
383 EXPORT_SYMBOL_GPL(fwnode_property_read_string_array);
384 
385 /**
386  * fwnode_property_read_string - return a string property of a firmware node
387  * @fwnode: Firmware node to get the property of
388  * @propname: Name of the property
389  * @val: The value is stored here
390  *
391  * Read property @propname from the given firmware node and store the value into
392  * @val if found.  The value is checked to be a string.
393  *
394  * Return: %0 if the property was found (success),
395  *	   %-EINVAL if given arguments are not valid,
396  *	   %-ENODATA if the property does not have a value,
397  *	   %-EPROTO or %-EILSEQ if the property is not a string,
398  *	   %-ENXIO if no suitable firmware interface is present.
399  */
400 int fwnode_property_read_string(const struct fwnode_handle *fwnode,
401 				const char *propname, const char **val)
402 {
403 	int ret = fwnode_property_read_string_array(fwnode, propname, val, 1);
404 
405 	return ret < 0 ? ret : 0;
406 }
407 EXPORT_SYMBOL_GPL(fwnode_property_read_string);
408 
409 /**
410  * fwnode_property_match_string - find a string in an array and return index
411  * @fwnode: Firmware node to get the property of
412  * @propname: Name of the property holding the array
413  * @string: String to look for
414  *
415  * Find a given string in a string array and if it is found return the
416  * index back.
417  *
418  * Return: %0 if the property was found (success),
419  *	   %-EINVAL if given arguments are not valid,
420  *	   %-ENODATA if the property does not have a value,
421  *	   %-EPROTO if the property is not an array of strings,
422  *	   %-ENXIO if no suitable firmware interface is present.
423  */
424 int fwnode_property_match_string(const struct fwnode_handle *fwnode,
425 	const char *propname, const char *string)
426 {
427 	const char **values;
428 	int nval, ret;
429 
430 	nval = fwnode_property_read_string_array(fwnode, propname, NULL, 0);
431 	if (nval < 0)
432 		return nval;
433 
434 	if (nval == 0)
435 		return -ENODATA;
436 
437 	values = kcalloc(nval, sizeof(*values), GFP_KERNEL);
438 	if (!values)
439 		return -ENOMEM;
440 
441 	ret = fwnode_property_read_string_array(fwnode, propname, values, nval);
442 	if (ret < 0)
443 		goto out;
444 
445 	ret = match_string(values, nval, string);
446 	if (ret < 0)
447 		ret = -ENODATA;
448 out:
449 	kfree(values);
450 	return ret;
451 }
452 EXPORT_SYMBOL_GPL(fwnode_property_match_string);
453 
454 /**
455  * fwnode_property_get_reference_args() - Find a reference with arguments
456  * @fwnode:	Firmware node where to look for the reference
457  * @prop:	The name of the property
458  * @nargs_prop:	The name of the property telling the number of
459  *		arguments in the referred node. NULL if @nargs is known,
460  *		otherwise @nargs is ignored. Only relevant on OF.
461  * @nargs:	Number of arguments. Ignored if @nargs_prop is non-NULL.
462  * @index:	Index of the reference, from zero onwards.
463  * @args:	Result structure with reference and integer arguments.
464  *
465  * Obtain a reference based on a named property in an fwnode, with
466  * integer arguments.
467  *
468  * Caller is responsible to call fwnode_handle_put() on the returned
469  * args->fwnode pointer.
470  *
471  * Returns: %0 on success
472  *	    %-ENOENT when the index is out of bounds, the index has an empty
473  *		     reference or the property was not found
474  *	    %-EINVAL on parse error
475  */
476 int fwnode_property_get_reference_args(const struct fwnode_handle *fwnode,
477 				       const char *prop, const char *nargs_prop,
478 				       unsigned int nargs, unsigned int index,
479 				       struct fwnode_reference_args *args)
480 {
481 	return fwnode_call_int_op(fwnode, get_reference_args, prop, nargs_prop,
482 				  nargs, index, args);
483 }
484 EXPORT_SYMBOL_GPL(fwnode_property_get_reference_args);
485 
486 /**
487  * fwnode_find_reference - Find named reference to a fwnode_handle
488  * @fwnode: Firmware node where to look for the reference
489  * @name: The name of the reference
490  * @index: Index of the reference
491  *
492  * @index can be used when the named reference holds a table of references.
493  *
494  * Returns pointer to the reference fwnode, or ERR_PTR. Caller is responsible to
495  * call fwnode_handle_put() on the returned fwnode pointer.
496  */
497 struct fwnode_handle *fwnode_find_reference(const struct fwnode_handle *fwnode,
498 					    const char *name,
499 					    unsigned int index)
500 {
501 	struct fwnode_reference_args args;
502 	int ret;
503 
504 	ret = fwnode_property_get_reference_args(fwnode, name, NULL, 0, index,
505 						 &args);
506 	return ret ? ERR_PTR(ret) : args.fwnode;
507 }
508 EXPORT_SYMBOL_GPL(fwnode_find_reference);
509 
510 /**
511  * fwnode_get_name - Return the name of a node
512  * @fwnode: The firmware node
513  *
514  * Returns a pointer to the node name.
515  */
516 const char *fwnode_get_name(const struct fwnode_handle *fwnode)
517 {
518 	return fwnode_call_ptr_op(fwnode, get_name);
519 }
520 EXPORT_SYMBOL_GPL(fwnode_get_name);
521 
522 /**
523  * fwnode_get_name_prefix - Return the prefix of node for printing purposes
524  * @fwnode: The firmware node
525  *
526  * Returns the prefix of a node, intended to be printed right before the node.
527  * The prefix works also as a separator between the nodes.
528  */
529 const char *fwnode_get_name_prefix(const struct fwnode_handle *fwnode)
530 {
531 	return fwnode_call_ptr_op(fwnode, get_name_prefix);
532 }
533 
534 /**
535  * fwnode_get_parent - Return parent firwmare node
536  * @fwnode: Firmware whose parent is retrieved
537  *
538  * Return parent firmware node of the given node if possible or %NULL if no
539  * parent was available.
540  */
541 struct fwnode_handle *fwnode_get_parent(const struct fwnode_handle *fwnode)
542 {
543 	return fwnode_call_ptr_op(fwnode, get_parent);
544 }
545 EXPORT_SYMBOL_GPL(fwnode_get_parent);
546 
547 /**
548  * fwnode_get_next_parent - Iterate to the node's parent
549  * @fwnode: Firmware whose parent is retrieved
550  *
551  * This is like fwnode_get_parent() except that it drops the refcount
552  * on the passed node, making it suitable for iterating through a
553  * node's parents.
554  *
555  * Returns a node pointer with refcount incremented, use
556  * fwnode_handle_node() on it when done.
557  */
558 struct fwnode_handle *fwnode_get_next_parent(struct fwnode_handle *fwnode)
559 {
560 	struct fwnode_handle *parent = fwnode_get_parent(fwnode);
561 
562 	fwnode_handle_put(fwnode);
563 
564 	return parent;
565 }
566 EXPORT_SYMBOL_GPL(fwnode_get_next_parent);
567 
568 /**
569  * fwnode_get_next_parent_dev - Find device of closest ancestor fwnode
570  * @fwnode: firmware node
571  *
572  * Given a firmware node (@fwnode), this function finds its closest ancestor
573  * firmware node that has a corresponding struct device and returns that struct
574  * device.
575  *
576  * The caller of this function is expected to call put_device() on the returned
577  * device when they are done.
578  */
579 struct device *fwnode_get_next_parent_dev(struct fwnode_handle *fwnode)
580 {
581 	struct device *dev;
582 
583 	fwnode_handle_get(fwnode);
584 	do {
585 		fwnode = fwnode_get_next_parent(fwnode);
586 		if (!fwnode)
587 			return NULL;
588 		dev = get_dev_from_fwnode(fwnode);
589 	} while (!dev);
590 	fwnode_handle_put(fwnode);
591 	return dev;
592 }
593 
594 /**
595  * fwnode_count_parents - Return the number of parents a node has
596  * @fwnode: The node the parents of which are to be counted
597  *
598  * Returns the number of parents a node has.
599  */
600 unsigned int fwnode_count_parents(const struct fwnode_handle *fwnode)
601 {
602 	struct fwnode_handle *__fwnode;
603 	unsigned int count;
604 
605 	__fwnode = fwnode_get_parent(fwnode);
606 
607 	for (count = 0; __fwnode; count++)
608 		__fwnode = fwnode_get_next_parent(__fwnode);
609 
610 	return count;
611 }
612 EXPORT_SYMBOL_GPL(fwnode_count_parents);
613 
614 /**
615  * fwnode_get_nth_parent - Return an nth parent of a node
616  * @fwnode: The node the parent of which is requested
617  * @depth: Distance of the parent from the node
618  *
619  * Returns the nth parent of a node. If there is no parent at the requested
620  * @depth, %NULL is returned. If @depth is 0, the functionality is equivalent to
621  * fwnode_handle_get(). For @depth == 1, it is fwnode_get_parent() and so on.
622  *
623  * The caller is responsible for calling fwnode_handle_put() for the returned
624  * node.
625  */
626 struct fwnode_handle *fwnode_get_nth_parent(struct fwnode_handle *fwnode,
627 					    unsigned int depth)
628 {
629 	unsigned int i;
630 
631 	fwnode_handle_get(fwnode);
632 
633 	for (i = 0; i < depth && fwnode; i++)
634 		fwnode = fwnode_get_next_parent(fwnode);
635 
636 	return fwnode;
637 }
638 EXPORT_SYMBOL_GPL(fwnode_get_nth_parent);
639 
640 /**
641  * fwnode_is_ancestor_of - Test if @test_ancestor is ancestor of @test_child
642  * @test_ancestor: Firmware which is tested for being an ancestor
643  * @test_child: Firmware which is tested for being the child
644  *
645  * A node is considered an ancestor of itself too.
646  *
647  * Returns true if @test_ancestor is an ancestor of @test_child.
648  * Otherwise, returns false.
649  */
650 bool fwnode_is_ancestor_of(struct fwnode_handle *test_ancestor,
651 				  struct fwnode_handle *test_child)
652 {
653 	if (!test_ancestor)
654 		return false;
655 
656 	fwnode_handle_get(test_child);
657 	while (test_child) {
658 		if (test_child == test_ancestor) {
659 			fwnode_handle_put(test_child);
660 			return true;
661 		}
662 		test_child = fwnode_get_next_parent(test_child);
663 	}
664 	return false;
665 }
666 
667 /**
668  * fwnode_get_next_child_node - Return the next child node handle for a node
669  * @fwnode: Firmware node to find the next child node for.
670  * @child: Handle to one of the node's child nodes or a %NULL handle.
671  */
672 struct fwnode_handle *
673 fwnode_get_next_child_node(const struct fwnode_handle *fwnode,
674 			   struct fwnode_handle *child)
675 {
676 	return fwnode_call_ptr_op(fwnode, get_next_child_node, child);
677 }
678 EXPORT_SYMBOL_GPL(fwnode_get_next_child_node);
679 
680 /**
681  * fwnode_get_next_available_child_node - Return the next
682  * available child node handle for a node
683  * @fwnode: Firmware node to find the next child node for.
684  * @child: Handle to one of the node's child nodes or a %NULL handle.
685  */
686 struct fwnode_handle *
687 fwnode_get_next_available_child_node(const struct fwnode_handle *fwnode,
688 				     struct fwnode_handle *child)
689 {
690 	struct fwnode_handle *next_child = child;
691 
692 	if (!fwnode)
693 		return NULL;
694 
695 	do {
696 		next_child = fwnode_get_next_child_node(fwnode, next_child);
697 		if (!next_child)
698 			return NULL;
699 	} while (!fwnode_device_is_available(next_child));
700 
701 	return next_child;
702 }
703 EXPORT_SYMBOL_GPL(fwnode_get_next_available_child_node);
704 
705 /**
706  * device_get_next_child_node - Return the next child node handle for a device
707  * @dev: Device to find the next child node for.
708  * @child: Handle to one of the device's child nodes or a null handle.
709  */
710 struct fwnode_handle *device_get_next_child_node(struct device *dev,
711 						 struct fwnode_handle *child)
712 {
713 	const struct fwnode_handle *fwnode = dev_fwnode(dev);
714 	struct fwnode_handle *next;
715 
716 	/* Try to find a child in primary fwnode */
717 	next = fwnode_get_next_child_node(fwnode, child);
718 	if (next)
719 		return next;
720 
721 	/* When no more children in primary, continue with secondary */
722 	if (fwnode && !IS_ERR_OR_NULL(fwnode->secondary))
723 		next = fwnode_get_next_child_node(fwnode->secondary, child);
724 
725 	return next;
726 }
727 EXPORT_SYMBOL_GPL(device_get_next_child_node);
728 
729 /**
730  * fwnode_get_named_child_node - Return first matching named child node handle
731  * @fwnode: Firmware node to find the named child node for.
732  * @childname: String to match child node name against.
733  */
734 struct fwnode_handle *
735 fwnode_get_named_child_node(const struct fwnode_handle *fwnode,
736 			    const char *childname)
737 {
738 	return fwnode_call_ptr_op(fwnode, get_named_child_node, childname);
739 }
740 EXPORT_SYMBOL_GPL(fwnode_get_named_child_node);
741 
742 /**
743  * device_get_named_child_node - Return first matching named child node handle
744  * @dev: Device to find the named child node for.
745  * @childname: String to match child node name against.
746  */
747 struct fwnode_handle *device_get_named_child_node(struct device *dev,
748 						  const char *childname)
749 {
750 	return fwnode_get_named_child_node(dev_fwnode(dev), childname);
751 }
752 EXPORT_SYMBOL_GPL(device_get_named_child_node);
753 
754 /**
755  * fwnode_handle_get - Obtain a reference to a device node
756  * @fwnode: Pointer to the device node to obtain the reference to.
757  *
758  * Returns the fwnode handle.
759  */
760 struct fwnode_handle *fwnode_handle_get(struct fwnode_handle *fwnode)
761 {
762 	if (!fwnode_has_op(fwnode, get))
763 		return fwnode;
764 
765 	return fwnode_call_ptr_op(fwnode, get);
766 }
767 EXPORT_SYMBOL_GPL(fwnode_handle_get);
768 
769 /**
770  * fwnode_handle_put - Drop reference to a device node
771  * @fwnode: Pointer to the device node to drop the reference to.
772  *
773  * This has to be used when terminating device_for_each_child_node() iteration
774  * with break or return to prevent stale device node references from being left
775  * behind.
776  */
777 void fwnode_handle_put(struct fwnode_handle *fwnode)
778 {
779 	fwnode_call_void_op(fwnode, put);
780 }
781 EXPORT_SYMBOL_GPL(fwnode_handle_put);
782 
783 /**
784  * fwnode_device_is_available - check if a device is available for use
785  * @fwnode: Pointer to the fwnode of the device.
786  *
787  * For fwnode node types that don't implement the .device_is_available()
788  * operation, this function returns true.
789  */
790 bool fwnode_device_is_available(const struct fwnode_handle *fwnode)
791 {
792 	if (!fwnode_has_op(fwnode, device_is_available))
793 		return true;
794 
795 	return fwnode_call_bool_op(fwnode, device_is_available);
796 }
797 EXPORT_SYMBOL_GPL(fwnode_device_is_available);
798 
799 /**
800  * device_get_child_node_count - return the number of child nodes for device
801  * @dev: Device to cound the child nodes for
802  */
803 unsigned int device_get_child_node_count(struct device *dev)
804 {
805 	struct fwnode_handle *child;
806 	unsigned int count = 0;
807 
808 	device_for_each_child_node(dev, child)
809 		count++;
810 
811 	return count;
812 }
813 EXPORT_SYMBOL_GPL(device_get_child_node_count);
814 
815 bool device_dma_supported(struct device *dev)
816 {
817 	const struct fwnode_handle *fwnode = dev_fwnode(dev);
818 
819 	/* For DT, this is always supported.
820 	 * For ACPI, this depends on CCA, which
821 	 * is determined by the acpi_dma_supported().
822 	 */
823 	if (is_of_node(fwnode))
824 		return true;
825 
826 	return acpi_dma_supported(to_acpi_device_node(fwnode));
827 }
828 EXPORT_SYMBOL_GPL(device_dma_supported);
829 
830 enum dev_dma_attr device_get_dma_attr(struct device *dev)
831 {
832 	const struct fwnode_handle *fwnode = dev_fwnode(dev);
833 	enum dev_dma_attr attr = DEV_DMA_NOT_SUPPORTED;
834 
835 	if (is_of_node(fwnode)) {
836 		if (of_dma_is_coherent(to_of_node(fwnode)))
837 			attr = DEV_DMA_COHERENT;
838 		else
839 			attr = DEV_DMA_NON_COHERENT;
840 	} else
841 		attr = acpi_get_dma_attr(to_acpi_device_node(fwnode));
842 
843 	return attr;
844 }
845 EXPORT_SYMBOL_GPL(device_get_dma_attr);
846 
847 /**
848  * fwnode_get_phy_mode - Get phy mode for given firmware node
849  * @fwnode:	Pointer to the given node
850  *
851  * The function gets phy interface string from property 'phy-mode' or
852  * 'phy-connection-type', and return its index in phy_modes table, or errno in
853  * error case.
854  */
855 int fwnode_get_phy_mode(struct fwnode_handle *fwnode)
856 {
857 	const char *pm;
858 	int err, i;
859 
860 	err = fwnode_property_read_string(fwnode, "phy-mode", &pm);
861 	if (err < 0)
862 		err = fwnode_property_read_string(fwnode,
863 						  "phy-connection-type", &pm);
864 	if (err < 0)
865 		return err;
866 
867 	for (i = 0; i < PHY_INTERFACE_MODE_MAX; i++)
868 		if (!strcasecmp(pm, phy_modes(i)))
869 			return i;
870 
871 	return -ENODEV;
872 }
873 EXPORT_SYMBOL_GPL(fwnode_get_phy_mode);
874 
875 /**
876  * device_get_phy_mode - Get phy mode for given device
877  * @dev:	Pointer to the given device
878  *
879  * The function gets phy interface string from property 'phy-mode' or
880  * 'phy-connection-type', and return its index in phy_modes table, or errno in
881  * error case.
882  */
883 int device_get_phy_mode(struct device *dev)
884 {
885 	return fwnode_get_phy_mode(dev_fwnode(dev));
886 }
887 EXPORT_SYMBOL_GPL(device_get_phy_mode);
888 
889 /**
890  * fwnode_irq_get - Get IRQ directly from a fwnode
891  * @fwnode:	Pointer to the firmware node
892  * @index:	Zero-based index of the IRQ
893  *
894  * Returns Linux IRQ number on success. Other values are determined
895  * accordingly to acpi_/of_ irq_get() operation.
896  */
897 int fwnode_irq_get(const struct fwnode_handle *fwnode, unsigned int index)
898 {
899 	struct resource res;
900 	int ret;
901 
902 	if (is_of_node(fwnode))
903 		return of_irq_get(to_of_node(fwnode), index);
904 
905 	ret = acpi_irq_get(ACPI_HANDLE_FWNODE(fwnode), index, &res);
906 	if (ret)
907 		return ret;
908 
909 	return res.start;
910 }
911 EXPORT_SYMBOL(fwnode_irq_get);
912 
913 /**
914  * fwnode_graph_get_next_endpoint - Get next endpoint firmware node
915  * @fwnode: Pointer to the parent firmware node
916  * @prev: Previous endpoint node or %NULL to get the first
917  *
918  * Returns an endpoint firmware node pointer or %NULL if no more endpoints
919  * are available.
920  */
921 struct fwnode_handle *
922 fwnode_graph_get_next_endpoint(const struct fwnode_handle *fwnode,
923 			       struct fwnode_handle *prev)
924 {
925 	const struct fwnode_handle *parent;
926 	struct fwnode_handle *ep;
927 
928 	/*
929 	 * If this function is in a loop and the previous iteration returned
930 	 * an endpoint from fwnode->secondary, then we need to use the secondary
931 	 * as parent rather than @fwnode.
932 	 */
933 	if (prev)
934 		parent = fwnode_graph_get_port_parent(prev);
935 	else
936 		parent = fwnode;
937 
938 	ep = fwnode_call_ptr_op(parent, graph_get_next_endpoint, prev);
939 
940 	if (IS_ERR_OR_NULL(ep) &&
941 	    !IS_ERR_OR_NULL(parent) && !IS_ERR_OR_NULL(parent->secondary))
942 		ep = fwnode_graph_get_next_endpoint(parent->secondary, NULL);
943 
944 	return ep;
945 }
946 EXPORT_SYMBOL_GPL(fwnode_graph_get_next_endpoint);
947 
948 /**
949  * fwnode_graph_get_port_parent - Return the device fwnode of a port endpoint
950  * @endpoint: Endpoint firmware node of the port
951  *
952  * Return: the firmware node of the device the @endpoint belongs to.
953  */
954 struct fwnode_handle *
955 fwnode_graph_get_port_parent(const struct fwnode_handle *endpoint)
956 {
957 	struct fwnode_handle *port, *parent;
958 
959 	port = fwnode_get_parent(endpoint);
960 	parent = fwnode_call_ptr_op(port, graph_get_port_parent);
961 
962 	fwnode_handle_put(port);
963 
964 	return parent;
965 }
966 EXPORT_SYMBOL_GPL(fwnode_graph_get_port_parent);
967 
968 /**
969  * fwnode_graph_get_remote_port_parent - Return fwnode of a remote device
970  * @fwnode: Endpoint firmware node pointing to the remote endpoint
971  *
972  * Extracts firmware node of a remote device the @fwnode points to.
973  */
974 struct fwnode_handle *
975 fwnode_graph_get_remote_port_parent(const struct fwnode_handle *fwnode)
976 {
977 	struct fwnode_handle *endpoint, *parent;
978 
979 	endpoint = fwnode_graph_get_remote_endpoint(fwnode);
980 	parent = fwnode_graph_get_port_parent(endpoint);
981 
982 	fwnode_handle_put(endpoint);
983 
984 	return parent;
985 }
986 EXPORT_SYMBOL_GPL(fwnode_graph_get_remote_port_parent);
987 
988 /**
989  * fwnode_graph_get_remote_port - Return fwnode of a remote port
990  * @fwnode: Endpoint firmware node pointing to the remote endpoint
991  *
992  * Extracts firmware node of a remote port the @fwnode points to.
993  */
994 struct fwnode_handle *
995 fwnode_graph_get_remote_port(const struct fwnode_handle *fwnode)
996 {
997 	return fwnode_get_next_parent(fwnode_graph_get_remote_endpoint(fwnode));
998 }
999 EXPORT_SYMBOL_GPL(fwnode_graph_get_remote_port);
1000 
1001 /**
1002  * fwnode_graph_get_remote_endpoint - Return fwnode of a remote endpoint
1003  * @fwnode: Endpoint firmware node pointing to the remote endpoint
1004  *
1005  * Extracts firmware node of a remote endpoint the @fwnode points to.
1006  */
1007 struct fwnode_handle *
1008 fwnode_graph_get_remote_endpoint(const struct fwnode_handle *fwnode)
1009 {
1010 	return fwnode_call_ptr_op(fwnode, graph_get_remote_endpoint);
1011 }
1012 EXPORT_SYMBOL_GPL(fwnode_graph_get_remote_endpoint);
1013 
1014 static bool fwnode_graph_remote_available(struct fwnode_handle *ep)
1015 {
1016 	struct fwnode_handle *dev_node;
1017 	bool available;
1018 
1019 	dev_node = fwnode_graph_get_remote_port_parent(ep);
1020 	available = fwnode_device_is_available(dev_node);
1021 	fwnode_handle_put(dev_node);
1022 
1023 	return available;
1024 }
1025 
1026 /**
1027  * fwnode_graph_get_endpoint_by_id - get endpoint by port and endpoint numbers
1028  * @fwnode: parent fwnode_handle containing the graph
1029  * @port: identifier of the port node
1030  * @endpoint: identifier of the endpoint node under the port node
1031  * @flags: fwnode lookup flags
1032  *
1033  * Return the fwnode handle of the local endpoint corresponding the port and
1034  * endpoint IDs or NULL if not found.
1035  *
1036  * If FWNODE_GRAPH_ENDPOINT_NEXT is passed in @flags and the specified endpoint
1037  * has not been found, look for the closest endpoint ID greater than the
1038  * specified one and return the endpoint that corresponds to it, if present.
1039  *
1040  * Does not return endpoints that belong to disabled devices or endpoints that
1041  * are unconnected, unless FWNODE_GRAPH_DEVICE_DISABLED is passed in @flags.
1042  *
1043  * The returned endpoint needs to be released by calling fwnode_handle_put() on
1044  * it when it is not needed any more.
1045  */
1046 struct fwnode_handle *
1047 fwnode_graph_get_endpoint_by_id(const struct fwnode_handle *fwnode,
1048 				u32 port, u32 endpoint, unsigned long flags)
1049 {
1050 	struct fwnode_handle *ep, *best_ep = NULL;
1051 	unsigned int best_ep_id = 0;
1052 	bool endpoint_next = flags & FWNODE_GRAPH_ENDPOINT_NEXT;
1053 	bool enabled_only = !(flags & FWNODE_GRAPH_DEVICE_DISABLED);
1054 
1055 	fwnode_graph_for_each_endpoint(fwnode, ep) {
1056 		struct fwnode_endpoint fwnode_ep = { 0 };
1057 		int ret;
1058 
1059 		if (enabled_only && !fwnode_graph_remote_available(ep))
1060 			continue;
1061 
1062 		ret = fwnode_graph_parse_endpoint(ep, &fwnode_ep);
1063 		if (ret < 0)
1064 			continue;
1065 
1066 		if (fwnode_ep.port != port)
1067 			continue;
1068 
1069 		if (fwnode_ep.id == endpoint)
1070 			return ep;
1071 
1072 		if (!endpoint_next)
1073 			continue;
1074 
1075 		/*
1076 		 * If the endpoint that has just been found is not the first
1077 		 * matching one and the ID of the one found previously is closer
1078 		 * to the requested endpoint ID, skip it.
1079 		 */
1080 		if (fwnode_ep.id < endpoint ||
1081 		    (best_ep && best_ep_id < fwnode_ep.id))
1082 			continue;
1083 
1084 		fwnode_handle_put(best_ep);
1085 		best_ep = fwnode_handle_get(ep);
1086 		best_ep_id = fwnode_ep.id;
1087 	}
1088 
1089 	return best_ep;
1090 }
1091 EXPORT_SYMBOL_GPL(fwnode_graph_get_endpoint_by_id);
1092 
1093 /**
1094  * fwnode_graph_get_endpoint_count - Count endpoints on a device node
1095  * @fwnode: The node related to a device
1096  * @flags: fwnode lookup flags
1097  * Count endpoints in a device node.
1098  *
1099  * If FWNODE_GRAPH_DEVICE_DISABLED flag is specified, also unconnected endpoints
1100  * and endpoints connected to disabled devices are counted.
1101  */
1102 unsigned int fwnode_graph_get_endpoint_count(struct fwnode_handle *fwnode,
1103 					     unsigned long flags)
1104 {
1105 	struct fwnode_handle *ep;
1106 	unsigned int count = 0;
1107 
1108 	fwnode_graph_for_each_endpoint(fwnode, ep) {
1109 		if (flags & FWNODE_GRAPH_DEVICE_DISABLED ||
1110 		    fwnode_graph_remote_available(ep))
1111 			count++;
1112 	}
1113 
1114 	return count;
1115 }
1116 EXPORT_SYMBOL_GPL(fwnode_graph_get_endpoint_count);
1117 
1118 /**
1119  * fwnode_graph_parse_endpoint - parse common endpoint node properties
1120  * @fwnode: pointer to endpoint fwnode_handle
1121  * @endpoint: pointer to the fwnode endpoint data structure
1122  *
1123  * Parse @fwnode representing a graph endpoint node and store the
1124  * information in @endpoint. The caller must hold a reference to
1125  * @fwnode.
1126  */
1127 int fwnode_graph_parse_endpoint(const struct fwnode_handle *fwnode,
1128 				struct fwnode_endpoint *endpoint)
1129 {
1130 	memset(endpoint, 0, sizeof(*endpoint));
1131 
1132 	return fwnode_call_int_op(fwnode, graph_parse_endpoint, endpoint);
1133 }
1134 EXPORT_SYMBOL(fwnode_graph_parse_endpoint);
1135 
1136 const void *device_get_match_data(struct device *dev)
1137 {
1138 	return fwnode_call_ptr_op(dev_fwnode(dev), device_get_match_data, dev);
1139 }
1140 EXPORT_SYMBOL_GPL(device_get_match_data);
1141 
1142 static void *
1143 fwnode_graph_devcon_match(struct fwnode_handle *fwnode, const char *con_id,
1144 			  void *data, devcon_match_fn_t match)
1145 {
1146 	struct fwnode_handle *node;
1147 	struct fwnode_handle *ep;
1148 	void *ret;
1149 
1150 	fwnode_graph_for_each_endpoint(fwnode, ep) {
1151 		node = fwnode_graph_get_remote_port_parent(ep);
1152 		if (!fwnode_device_is_available(node)) {
1153 			fwnode_handle_put(node);
1154 			continue;
1155 		}
1156 
1157 		ret = match(node, con_id, data);
1158 		fwnode_handle_put(node);
1159 		if (ret) {
1160 			fwnode_handle_put(ep);
1161 			return ret;
1162 		}
1163 	}
1164 	return NULL;
1165 }
1166 
1167 static void *
1168 fwnode_devcon_match(struct fwnode_handle *fwnode, const char *con_id,
1169 		    void *data, devcon_match_fn_t match)
1170 {
1171 	struct fwnode_handle *node;
1172 	void *ret;
1173 	int i;
1174 
1175 	for (i = 0; ; i++) {
1176 		node = fwnode_find_reference(fwnode, con_id, i);
1177 		if (IS_ERR(node))
1178 			break;
1179 
1180 		ret = match(node, NULL, data);
1181 		fwnode_handle_put(node);
1182 		if (ret)
1183 			return ret;
1184 	}
1185 
1186 	return NULL;
1187 }
1188 
1189 /**
1190  * fwnode_connection_find_match - Find connection from a device node
1191  * @fwnode: Device node with the connection
1192  * @con_id: Identifier for the connection
1193  * @data: Data for the match function
1194  * @match: Function to check and convert the connection description
1195  *
1196  * Find a connection with unique identifier @con_id between @fwnode and another
1197  * device node. @match will be used to convert the connection description to
1198  * data the caller is expecting to be returned.
1199  */
1200 void *fwnode_connection_find_match(struct fwnode_handle *fwnode,
1201 				   const char *con_id, void *data,
1202 				   devcon_match_fn_t match)
1203 {
1204 	void *ret;
1205 
1206 	if (!fwnode || !match)
1207 		return NULL;
1208 
1209 	ret = fwnode_graph_devcon_match(fwnode, con_id, data, match);
1210 	if (ret)
1211 		return ret;
1212 
1213 	return fwnode_devcon_match(fwnode, con_id, data, match);
1214 }
1215 EXPORT_SYMBOL_GPL(fwnode_connection_find_match);
1216