xref: /openbmc/linux/drivers/base/property.c (revision 7e6f7d24)
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/etherdevice.h>
19 #include <linux/phy.h>
20 
21 struct property_set {
22 	struct device *dev;
23 	struct fwnode_handle fwnode;
24 	const struct property_entry *properties;
25 };
26 
27 static const struct fwnode_operations pset_fwnode_ops;
28 
29 static inline bool is_pset_node(const struct fwnode_handle *fwnode)
30 {
31 	return !IS_ERR_OR_NULL(fwnode) && fwnode->ops == &pset_fwnode_ops;
32 }
33 
34 #define to_pset_node(__fwnode)						\
35 	({								\
36 		typeof(__fwnode) __to_pset_node_fwnode = __fwnode;	\
37 									\
38 		is_pset_node(__to_pset_node_fwnode) ?			\
39 			container_of(__to_pset_node_fwnode,		\
40 				     struct property_set, fwnode) :	\
41 			NULL;						\
42 	})
43 
44 static const struct property_entry *
45 pset_prop_get(const struct property_set *pset, const char *name)
46 {
47 	const struct property_entry *prop;
48 
49 	if (!pset || !pset->properties)
50 		return NULL;
51 
52 	for (prop = pset->properties; prop->name; prop++)
53 		if (!strcmp(name, prop->name))
54 			return prop;
55 
56 	return NULL;
57 }
58 
59 static const void *property_get_pointer(const struct property_entry *prop)
60 {
61 	switch (prop->type) {
62 	case DEV_PROP_U8:
63 		if (prop->is_array)
64 			return prop->pointer.u8_data;
65 		return &prop->value.u8_data;
66 	case DEV_PROP_U16:
67 		if (prop->is_array)
68 			return prop->pointer.u16_data;
69 		return &prop->value.u16_data;
70 	case DEV_PROP_U32:
71 		if (prop->is_array)
72 			return prop->pointer.u32_data;
73 		return &prop->value.u32_data;
74 	case DEV_PROP_U64:
75 		if (prop->is_array)
76 			return prop->pointer.u64_data;
77 		return &prop->value.u64_data;
78 	case DEV_PROP_STRING:
79 		if (prop->is_array)
80 			return prop->pointer.str;
81 		return &prop->value.str;
82 	default:
83 		return NULL;
84 	}
85 }
86 
87 static void property_set_pointer(struct property_entry *prop, const void *pointer)
88 {
89 	switch (prop->type) {
90 	case DEV_PROP_U8:
91 		if (prop->is_array)
92 			prop->pointer.u8_data = pointer;
93 		else
94 			prop->value.u8_data = *((u8 *)pointer);
95 		break;
96 	case DEV_PROP_U16:
97 		if (prop->is_array)
98 			prop->pointer.u16_data = pointer;
99 		else
100 			prop->value.u16_data = *((u16 *)pointer);
101 		break;
102 	case DEV_PROP_U32:
103 		if (prop->is_array)
104 			prop->pointer.u32_data = pointer;
105 		else
106 			prop->value.u32_data = *((u32 *)pointer);
107 		break;
108 	case DEV_PROP_U64:
109 		if (prop->is_array)
110 			prop->pointer.u64_data = pointer;
111 		else
112 			prop->value.u64_data = *((u64 *)pointer);
113 		break;
114 	case DEV_PROP_STRING:
115 		if (prop->is_array)
116 			prop->pointer.str = pointer;
117 		else
118 			prop->value.str = pointer;
119 		break;
120 	default:
121 		break;
122 	}
123 }
124 
125 static const void *pset_prop_find(const struct property_set *pset,
126 				  const char *propname, size_t length)
127 {
128 	const struct property_entry *prop;
129 	const void *pointer;
130 
131 	prop = pset_prop_get(pset, propname);
132 	if (!prop)
133 		return ERR_PTR(-EINVAL);
134 	pointer = property_get_pointer(prop);
135 	if (!pointer)
136 		return ERR_PTR(-ENODATA);
137 	if (length > prop->length)
138 		return ERR_PTR(-EOVERFLOW);
139 	return pointer;
140 }
141 
142 static int pset_prop_read_u8_array(const struct property_set *pset,
143 				   const char *propname,
144 				   u8 *values, size_t nval)
145 {
146 	const void *pointer;
147 	size_t length = nval * sizeof(*values);
148 
149 	pointer = pset_prop_find(pset, propname, length);
150 	if (IS_ERR(pointer))
151 		return PTR_ERR(pointer);
152 
153 	memcpy(values, pointer, length);
154 	return 0;
155 }
156 
157 static int pset_prop_read_u16_array(const struct property_set *pset,
158 				    const char *propname,
159 				    u16 *values, size_t nval)
160 {
161 	const void *pointer;
162 	size_t length = nval * sizeof(*values);
163 
164 	pointer = pset_prop_find(pset, propname, length);
165 	if (IS_ERR(pointer))
166 		return PTR_ERR(pointer);
167 
168 	memcpy(values, pointer, length);
169 	return 0;
170 }
171 
172 static int pset_prop_read_u32_array(const struct property_set *pset,
173 				    const char *propname,
174 				    u32 *values, size_t nval)
175 {
176 	const void *pointer;
177 	size_t length = nval * sizeof(*values);
178 
179 	pointer = pset_prop_find(pset, propname, length);
180 	if (IS_ERR(pointer))
181 		return PTR_ERR(pointer);
182 
183 	memcpy(values, pointer, length);
184 	return 0;
185 }
186 
187 static int pset_prop_read_u64_array(const struct property_set *pset,
188 				    const char *propname,
189 				    u64 *values, size_t nval)
190 {
191 	const void *pointer;
192 	size_t length = nval * sizeof(*values);
193 
194 	pointer = pset_prop_find(pset, propname, length);
195 	if (IS_ERR(pointer))
196 		return PTR_ERR(pointer);
197 
198 	memcpy(values, pointer, length);
199 	return 0;
200 }
201 
202 static int pset_prop_count_elems_of_size(const struct property_set *pset,
203 					 const char *propname, size_t length)
204 {
205 	const struct property_entry *prop;
206 
207 	prop = pset_prop_get(pset, propname);
208 	if (!prop)
209 		return -EINVAL;
210 
211 	return prop->length / length;
212 }
213 
214 static int pset_prop_read_string_array(const struct property_set *pset,
215 				       const char *propname,
216 				       const char **strings, size_t nval)
217 {
218 	const struct property_entry *prop;
219 	const void *pointer;
220 	size_t array_len, length;
221 
222 	/* Find out the array length. */
223 	prop = pset_prop_get(pset, propname);
224 	if (!prop)
225 		return -EINVAL;
226 
227 	if (!prop->is_array)
228 		/* The array length for a non-array string property is 1. */
229 		array_len = 1;
230 	else
231 		/* Find the length of an array. */
232 		array_len = pset_prop_count_elems_of_size(pset, propname,
233 							  sizeof(const char *));
234 
235 	/* Return how many there are if strings is NULL. */
236 	if (!strings)
237 		return array_len;
238 
239 	array_len = min(nval, array_len);
240 	length = array_len * sizeof(*strings);
241 
242 	pointer = pset_prop_find(pset, propname, length);
243 	if (IS_ERR(pointer))
244 		return PTR_ERR(pointer);
245 
246 	memcpy(strings, pointer, length);
247 
248 	return array_len;
249 }
250 
251 struct fwnode_handle *dev_fwnode(struct device *dev)
252 {
253 	return IS_ENABLED(CONFIG_OF) && dev->of_node ?
254 		&dev->of_node->fwnode : dev->fwnode;
255 }
256 EXPORT_SYMBOL_GPL(dev_fwnode);
257 
258 static bool pset_fwnode_property_present(const struct fwnode_handle *fwnode,
259 					 const char *propname)
260 {
261 	return !!pset_prop_get(to_pset_node(fwnode), propname);
262 }
263 
264 static int pset_fwnode_read_int_array(const struct fwnode_handle *fwnode,
265 				      const char *propname,
266 				      unsigned int elem_size, void *val,
267 				      size_t nval)
268 {
269 	const struct property_set *node = to_pset_node(fwnode);
270 
271 	if (!val)
272 		return pset_prop_count_elems_of_size(node, propname, elem_size);
273 
274 	switch (elem_size) {
275 	case sizeof(u8):
276 		return pset_prop_read_u8_array(node, propname, val, nval);
277 	case sizeof(u16):
278 		return pset_prop_read_u16_array(node, propname, val, nval);
279 	case sizeof(u32):
280 		return pset_prop_read_u32_array(node, propname, val, nval);
281 	case sizeof(u64):
282 		return pset_prop_read_u64_array(node, propname, val, nval);
283 	}
284 
285 	return -ENXIO;
286 }
287 
288 static int
289 pset_fwnode_property_read_string_array(const struct fwnode_handle *fwnode,
290 				       const char *propname,
291 				       const char **val, size_t nval)
292 {
293 	return pset_prop_read_string_array(to_pset_node(fwnode), propname,
294 					   val, nval);
295 }
296 
297 static const struct fwnode_operations pset_fwnode_ops = {
298 	.property_present = pset_fwnode_property_present,
299 	.property_read_int_array = pset_fwnode_read_int_array,
300 	.property_read_string_array = pset_fwnode_property_read_string_array,
301 };
302 
303 /**
304  * device_property_present - check if a property of a device is present
305  * @dev: Device whose property is being checked
306  * @propname: Name of the property
307  *
308  * Check if property @propname is present in the device firmware description.
309  */
310 bool device_property_present(struct device *dev, const char *propname)
311 {
312 	return fwnode_property_present(dev_fwnode(dev), propname);
313 }
314 EXPORT_SYMBOL_GPL(device_property_present);
315 
316 /**
317  * fwnode_property_present - check if a property of a firmware node is present
318  * @fwnode: Firmware node whose property to check
319  * @propname: Name of the property
320  */
321 bool fwnode_property_present(const struct fwnode_handle *fwnode,
322 			     const char *propname)
323 {
324 	bool ret;
325 
326 	ret = fwnode_call_bool_op(fwnode, property_present, propname);
327 	if (ret == false && !IS_ERR_OR_NULL(fwnode) &&
328 	    !IS_ERR_OR_NULL(fwnode->secondary))
329 		ret = fwnode_call_bool_op(fwnode->secondary, property_present,
330 					 propname);
331 	return ret;
332 }
333 EXPORT_SYMBOL_GPL(fwnode_property_present);
334 
335 /**
336  * device_property_read_u8_array - return a u8 array property of a device
337  * @dev: Device to get the property of
338  * @propname: Name of the property
339  * @val: The values are stored here or %NULL to return the number of values
340  * @nval: Size of the @val array
341  *
342  * Function reads an array of u8 properties with @propname from the device
343  * firmware description and stores them to @val if found.
344  *
345  * Return: number of values if @val was %NULL,
346  *         %0 if the property was found (success),
347  *	   %-EINVAL if given arguments are not valid,
348  *	   %-ENODATA if the property does not have a value,
349  *	   %-EPROTO if the property is not an array of numbers,
350  *	   %-EOVERFLOW if the size of the property is not as expected.
351  *	   %-ENXIO if no suitable firmware interface is present.
352  */
353 int device_property_read_u8_array(struct device *dev, const char *propname,
354 				  u8 *val, size_t nval)
355 {
356 	return fwnode_property_read_u8_array(dev_fwnode(dev), propname, val, nval);
357 }
358 EXPORT_SYMBOL_GPL(device_property_read_u8_array);
359 
360 /**
361  * device_property_read_u16_array - return a u16 array property of a device
362  * @dev: Device to get the property of
363  * @propname: Name of the property
364  * @val: The values are stored here or %NULL to return the number of values
365  * @nval: Size of the @val array
366  *
367  * Function reads an array of u16 properties with @propname from the device
368  * firmware description and stores them to @val if found.
369  *
370  * Return: number of values if @val was %NULL,
371  *         %0 if the property was found (success),
372  *	   %-EINVAL if given arguments are not valid,
373  *	   %-ENODATA if the property does not have a value,
374  *	   %-EPROTO if the property is not an array of numbers,
375  *	   %-EOVERFLOW if the size of the property is not as expected.
376  *	   %-ENXIO if no suitable firmware interface is present.
377  */
378 int device_property_read_u16_array(struct device *dev, const char *propname,
379 				   u16 *val, size_t nval)
380 {
381 	return fwnode_property_read_u16_array(dev_fwnode(dev), propname, val, nval);
382 }
383 EXPORT_SYMBOL_GPL(device_property_read_u16_array);
384 
385 /**
386  * device_property_read_u32_array - return a u32 array property of a device
387  * @dev: Device to get the property of
388  * @propname: Name of the property
389  * @val: The values are stored here or %NULL to return the number of values
390  * @nval: Size of the @val array
391  *
392  * Function reads an array of u32 properties with @propname from the device
393  * firmware description and stores them to @val if found.
394  *
395  * Return: number of values if @val was %NULL,
396  *         %0 if the property was found (success),
397  *	   %-EINVAL if given arguments are not valid,
398  *	   %-ENODATA if the property does not have a value,
399  *	   %-EPROTO if the property is not an array of numbers,
400  *	   %-EOVERFLOW if the size of the property is not as expected.
401  *	   %-ENXIO if no suitable firmware interface is present.
402  */
403 int device_property_read_u32_array(struct device *dev, const char *propname,
404 				   u32 *val, size_t nval)
405 {
406 	return fwnode_property_read_u32_array(dev_fwnode(dev), propname, val, nval);
407 }
408 EXPORT_SYMBOL_GPL(device_property_read_u32_array);
409 
410 /**
411  * device_property_read_u64_array - return a u64 array property of a device
412  * @dev: Device to get the property of
413  * @propname: Name of the property
414  * @val: The values are stored here or %NULL to return the number of values
415  * @nval: Size of the @val array
416  *
417  * Function reads an array of u64 properties with @propname from the device
418  * firmware description and stores them to @val if found.
419  *
420  * Return: number of values if @val was %NULL,
421  *         %0 if the property was found (success),
422  *	   %-EINVAL if given arguments are not valid,
423  *	   %-ENODATA if the property does not have a value,
424  *	   %-EPROTO if the property is not an array of numbers,
425  *	   %-EOVERFLOW if the size of the property is not as expected.
426  *	   %-ENXIO if no suitable firmware interface is present.
427  */
428 int device_property_read_u64_array(struct device *dev, const char *propname,
429 				   u64 *val, size_t nval)
430 {
431 	return fwnode_property_read_u64_array(dev_fwnode(dev), propname, val, nval);
432 }
433 EXPORT_SYMBOL_GPL(device_property_read_u64_array);
434 
435 /**
436  * device_property_read_string_array - return a string array property of device
437  * @dev: Device to get the property of
438  * @propname: Name of the property
439  * @val: The values are stored here or %NULL to return the number of values
440  * @nval: Size of the @val array
441  *
442  * Function reads an array of string properties with @propname from the device
443  * firmware description and stores them to @val if found.
444  *
445  * Return: number of values read on success if @val is non-NULL,
446  *	   number of values available on success if @val is NULL,
447  *	   %-EINVAL if given arguments are not valid,
448  *	   %-ENODATA if the property does not have a value,
449  *	   %-EPROTO or %-EILSEQ if the property is not an array of strings,
450  *	   %-EOVERFLOW if the size of the property is not as expected.
451  *	   %-ENXIO if no suitable firmware interface is present.
452  */
453 int device_property_read_string_array(struct device *dev, const char *propname,
454 				      const char **val, size_t nval)
455 {
456 	return fwnode_property_read_string_array(dev_fwnode(dev), propname, val, nval);
457 }
458 EXPORT_SYMBOL_GPL(device_property_read_string_array);
459 
460 /**
461  * device_property_read_string - return a string property of a device
462  * @dev: Device to get the property of
463  * @propname: Name of the property
464  * @val: The value is stored here
465  *
466  * Function reads property @propname from the device firmware description and
467  * stores the value into @val if found. The value is checked to be a string.
468  *
469  * Return: %0 if the property was found (success),
470  *	   %-EINVAL if given arguments are not valid,
471  *	   %-ENODATA if the property does not have a value,
472  *	   %-EPROTO or %-EILSEQ if the property type is not a string.
473  *	   %-ENXIO if no suitable firmware interface is present.
474  */
475 int device_property_read_string(struct device *dev, const char *propname,
476 				const char **val)
477 {
478 	return fwnode_property_read_string(dev_fwnode(dev), propname, val);
479 }
480 EXPORT_SYMBOL_GPL(device_property_read_string);
481 
482 /**
483  * device_property_match_string - find a string in an array and return index
484  * @dev: Device to get the property of
485  * @propname: Name of the property holding the array
486  * @string: String to look for
487  *
488  * Find a given string in a string array and if it is found return the
489  * index back.
490  *
491  * Return: %0 if the property was found (success),
492  *	   %-EINVAL if given arguments are not valid,
493  *	   %-ENODATA if the property does not have a value,
494  *	   %-EPROTO if the property is not an array of strings,
495  *	   %-ENXIO if no suitable firmware interface is present.
496  */
497 int device_property_match_string(struct device *dev, const char *propname,
498 				 const char *string)
499 {
500 	return fwnode_property_match_string(dev_fwnode(dev), propname, string);
501 }
502 EXPORT_SYMBOL_GPL(device_property_match_string);
503 
504 static int fwnode_property_read_int_array(const struct fwnode_handle *fwnode,
505 					  const char *propname,
506 					  unsigned int elem_size, void *val,
507 					  size_t nval)
508 {
509 	int ret;
510 
511 	ret = fwnode_call_int_op(fwnode, property_read_int_array, propname,
512 				 elem_size, val, nval);
513 	if (ret == -EINVAL && !IS_ERR_OR_NULL(fwnode) &&
514 	    !IS_ERR_OR_NULL(fwnode->secondary))
515 		ret = fwnode_call_int_op(
516 			fwnode->secondary, property_read_int_array, propname,
517 			elem_size, val, nval);
518 
519 	return ret;
520 }
521 
522 /**
523  * fwnode_property_read_u8_array - return a u8 array property of firmware node
524  * @fwnode: Firmware node to get the property of
525  * @propname: Name of the property
526  * @val: The values are stored here or %NULL to return the number of values
527  * @nval: Size of the @val array
528  *
529  * Read an array of u8 properties with @propname from @fwnode and stores them to
530  * @val if found.
531  *
532  * Return: number of values if @val was %NULL,
533  *         %0 if the property was found (success),
534  *	   %-EINVAL if given arguments are not valid,
535  *	   %-ENODATA if the property does not have a value,
536  *	   %-EPROTO if the property is not an array of numbers,
537  *	   %-EOVERFLOW if the size of the property is not as expected,
538  *	   %-ENXIO if no suitable firmware interface is present.
539  */
540 int fwnode_property_read_u8_array(const struct fwnode_handle *fwnode,
541 				  const char *propname, u8 *val, size_t nval)
542 {
543 	return fwnode_property_read_int_array(fwnode, propname, sizeof(u8),
544 					      val, nval);
545 }
546 EXPORT_SYMBOL_GPL(fwnode_property_read_u8_array);
547 
548 /**
549  * fwnode_property_read_u16_array - return a u16 array property of firmware node
550  * @fwnode: Firmware node to get the property of
551  * @propname: Name of the property
552  * @val: The values are stored here or %NULL to return the number of values
553  * @nval: Size of the @val array
554  *
555  * Read an array of u16 properties with @propname from @fwnode and store them to
556  * @val if found.
557  *
558  * Return: number of values if @val was %NULL,
559  *         %0 if the property was found (success),
560  *	   %-EINVAL if given arguments are not valid,
561  *	   %-ENODATA if the property does not have a value,
562  *	   %-EPROTO if the property is not an array of numbers,
563  *	   %-EOVERFLOW if the size of the property is not as expected,
564  *	   %-ENXIO if no suitable firmware interface is present.
565  */
566 int fwnode_property_read_u16_array(const struct fwnode_handle *fwnode,
567 				   const char *propname, u16 *val, size_t nval)
568 {
569 	return fwnode_property_read_int_array(fwnode, propname, sizeof(u16),
570 					      val, nval);
571 }
572 EXPORT_SYMBOL_GPL(fwnode_property_read_u16_array);
573 
574 /**
575  * fwnode_property_read_u32_array - return a u32 array property of firmware node
576  * @fwnode: Firmware node to get the property of
577  * @propname: Name of the property
578  * @val: The values are stored here or %NULL to return the number of values
579  * @nval: Size of the @val array
580  *
581  * Read an array of u32 properties with @propname from @fwnode store them to
582  * @val if found.
583  *
584  * Return: number of values if @val was %NULL,
585  *         %0 if the property was found (success),
586  *	   %-EINVAL if given arguments are not valid,
587  *	   %-ENODATA if the property does not have a value,
588  *	   %-EPROTO if the property is not an array of numbers,
589  *	   %-EOVERFLOW if the size of the property is not as expected,
590  *	   %-ENXIO if no suitable firmware interface is present.
591  */
592 int fwnode_property_read_u32_array(const struct fwnode_handle *fwnode,
593 				   const char *propname, u32 *val, size_t nval)
594 {
595 	return fwnode_property_read_int_array(fwnode, propname, sizeof(u32),
596 					      val, nval);
597 }
598 EXPORT_SYMBOL_GPL(fwnode_property_read_u32_array);
599 
600 /**
601  * fwnode_property_read_u64_array - return a u64 array property firmware node
602  * @fwnode: Firmware node to get the property of
603  * @propname: Name of the property
604  * @val: The values are stored here or %NULL to return the number of values
605  * @nval: Size of the @val array
606  *
607  * Read an array of u64 properties with @propname from @fwnode and store them to
608  * @val if found.
609  *
610  * Return: number of values if @val was %NULL,
611  *         %0 if the property was found (success),
612  *	   %-EINVAL if given arguments are not valid,
613  *	   %-ENODATA if the property does not have a value,
614  *	   %-EPROTO if the property is not an array of numbers,
615  *	   %-EOVERFLOW if the size of the property is not as expected,
616  *	   %-ENXIO if no suitable firmware interface is present.
617  */
618 int fwnode_property_read_u64_array(const struct fwnode_handle *fwnode,
619 				   const char *propname, u64 *val, size_t nval)
620 {
621 	return fwnode_property_read_int_array(fwnode, propname, sizeof(u64),
622 					      val, nval);
623 }
624 EXPORT_SYMBOL_GPL(fwnode_property_read_u64_array);
625 
626 /**
627  * fwnode_property_read_string_array - return string array property of a node
628  * @fwnode: Firmware node to get the property of
629  * @propname: Name of the property
630  * @val: The values are stored here or %NULL to return the number of values
631  * @nval: Size of the @val array
632  *
633  * Read an string list property @propname from the given firmware node and store
634  * them to @val if found.
635  *
636  * Return: number of values read on success if @val is non-NULL,
637  *	   number of values available on success if @val is NULL,
638  *	   %-EINVAL if given arguments are not valid,
639  *	   %-ENODATA if the property does not have a value,
640  *	   %-EPROTO or %-EILSEQ if the property is not an array of strings,
641  *	   %-EOVERFLOW if the size of the property is not as expected,
642  *	   %-ENXIO if no suitable firmware interface is present.
643  */
644 int fwnode_property_read_string_array(const struct fwnode_handle *fwnode,
645 				      const char *propname, const char **val,
646 				      size_t nval)
647 {
648 	int ret;
649 
650 	ret = fwnode_call_int_op(fwnode, property_read_string_array, propname,
651 				 val, nval);
652 	if (ret == -EINVAL && !IS_ERR_OR_NULL(fwnode) &&
653 	    !IS_ERR_OR_NULL(fwnode->secondary))
654 		ret = fwnode_call_int_op(fwnode->secondary,
655 					 property_read_string_array, propname,
656 					 val, nval);
657 	return ret;
658 }
659 EXPORT_SYMBOL_GPL(fwnode_property_read_string_array);
660 
661 /**
662  * fwnode_property_read_string - return a string property of a firmware node
663  * @fwnode: Firmware node to get the property of
664  * @propname: Name of the property
665  * @val: The value is stored here
666  *
667  * Read property @propname from the given firmware node and store the value into
668  * @val if found.  The value is checked to be a string.
669  *
670  * Return: %0 if the property was found (success),
671  *	   %-EINVAL if given arguments are not valid,
672  *	   %-ENODATA if the property does not have a value,
673  *	   %-EPROTO or %-EILSEQ if the property is not a string,
674  *	   %-ENXIO if no suitable firmware interface is present.
675  */
676 int fwnode_property_read_string(const struct fwnode_handle *fwnode,
677 				const char *propname, const char **val)
678 {
679 	int ret = fwnode_property_read_string_array(fwnode, propname, val, 1);
680 
681 	return ret < 0 ? ret : 0;
682 }
683 EXPORT_SYMBOL_GPL(fwnode_property_read_string);
684 
685 /**
686  * fwnode_property_match_string - find a string in an array and return index
687  * @fwnode: Firmware node to get the property of
688  * @propname: Name of the property holding the array
689  * @string: String to look for
690  *
691  * Find a given string in a string array and if it is found return the
692  * index back.
693  *
694  * Return: %0 if the property was found (success),
695  *	   %-EINVAL if given arguments are not valid,
696  *	   %-ENODATA if the property does not have a value,
697  *	   %-EPROTO if the property is not an array of strings,
698  *	   %-ENXIO if no suitable firmware interface is present.
699  */
700 int fwnode_property_match_string(const struct fwnode_handle *fwnode,
701 	const char *propname, const char *string)
702 {
703 	const char **values;
704 	int nval, ret;
705 
706 	nval = fwnode_property_read_string_array(fwnode, propname, NULL, 0);
707 	if (nval < 0)
708 		return nval;
709 
710 	if (nval == 0)
711 		return -ENODATA;
712 
713 	values = kcalloc(nval, sizeof(*values), GFP_KERNEL);
714 	if (!values)
715 		return -ENOMEM;
716 
717 	ret = fwnode_property_read_string_array(fwnode, propname, values, nval);
718 	if (ret < 0)
719 		goto out;
720 
721 	ret = match_string(values, nval, string);
722 	if (ret < 0)
723 		ret = -ENODATA;
724 out:
725 	kfree(values);
726 	return ret;
727 }
728 EXPORT_SYMBOL_GPL(fwnode_property_match_string);
729 
730 /**
731  * fwnode_property_get_reference_args() - Find a reference with arguments
732  * @fwnode:	Firmware node where to look for the reference
733  * @prop:	The name of the property
734  * @nargs_prop:	The name of the property telling the number of
735  *		arguments in the referred node. NULL if @nargs is known,
736  *		otherwise @nargs is ignored. Only relevant on OF.
737  * @nargs:	Number of arguments. Ignored if @nargs_prop is non-NULL.
738  * @index:	Index of the reference, from zero onwards.
739  * @args:	Result structure with reference and integer arguments.
740  *
741  * Obtain a reference based on a named property in an fwnode, with
742  * integer arguments.
743  *
744  * Caller is responsible to call fwnode_handle_put() on the returned
745  * args->fwnode pointer.
746  *
747  * Returns: %0 on success
748  *	    %-ENOENT when the index is out of bounds, the index has an empty
749  *		     reference or the property was not found
750  *	    %-EINVAL on parse error
751  */
752 int fwnode_property_get_reference_args(const struct fwnode_handle *fwnode,
753 				       const char *prop, const char *nargs_prop,
754 				       unsigned int nargs, unsigned int index,
755 				       struct fwnode_reference_args *args)
756 {
757 	return fwnode_call_int_op(fwnode, get_reference_args, prop, nargs_prop,
758 				  nargs, index, args);
759 }
760 EXPORT_SYMBOL_GPL(fwnode_property_get_reference_args);
761 
762 static void property_entry_free_data(const struct property_entry *p)
763 {
764 	const void *pointer = property_get_pointer(p);
765 	size_t i, nval;
766 
767 	if (p->is_array) {
768 		if (p->type == DEV_PROP_STRING && p->pointer.str) {
769 			nval = p->length / sizeof(const char *);
770 			for (i = 0; i < nval; i++)
771 				kfree(p->pointer.str[i]);
772 		}
773 		kfree(pointer);
774 	} else if (p->type == DEV_PROP_STRING) {
775 		kfree(p->value.str);
776 	}
777 	kfree(p->name);
778 }
779 
780 static int property_copy_string_array(struct property_entry *dst,
781 				      const struct property_entry *src)
782 {
783 	const char **d;
784 	size_t nval = src->length / sizeof(*d);
785 	int i;
786 
787 	d = kcalloc(nval, sizeof(*d), GFP_KERNEL);
788 	if (!d)
789 		return -ENOMEM;
790 
791 	for (i = 0; i < nval; i++) {
792 		d[i] = kstrdup(src->pointer.str[i], GFP_KERNEL);
793 		if (!d[i] && src->pointer.str[i]) {
794 			while (--i >= 0)
795 				kfree(d[i]);
796 			kfree(d);
797 			return -ENOMEM;
798 		}
799 	}
800 
801 	dst->pointer.str = d;
802 	return 0;
803 }
804 
805 static int property_entry_copy_data(struct property_entry *dst,
806 				    const struct property_entry *src)
807 {
808 	const void *pointer = property_get_pointer(src);
809 	const void *new;
810 	int error;
811 
812 	if (src->is_array) {
813 		if (!src->length)
814 			return -ENODATA;
815 
816 		if (src->type == DEV_PROP_STRING) {
817 			error = property_copy_string_array(dst, src);
818 			if (error)
819 				return error;
820 			new = dst->pointer.str;
821 		} else {
822 			new = kmemdup(pointer, src->length, GFP_KERNEL);
823 			if (!new)
824 				return -ENOMEM;
825 		}
826 	} else if (src->type == DEV_PROP_STRING) {
827 		new = kstrdup(src->value.str, GFP_KERNEL);
828 		if (!new && src->value.str)
829 			return -ENOMEM;
830 	} else {
831 		new = pointer;
832 	}
833 
834 	dst->length = src->length;
835 	dst->is_array = src->is_array;
836 	dst->type = src->type;
837 
838 	property_set_pointer(dst, new);
839 
840 	dst->name = kstrdup(src->name, GFP_KERNEL);
841 	if (!dst->name)
842 		goto out_free_data;
843 
844 	return 0;
845 
846 out_free_data:
847 	property_entry_free_data(dst);
848 	return -ENOMEM;
849 }
850 
851 /**
852  * property_entries_dup - duplicate array of properties
853  * @properties: array of properties to copy
854  *
855  * This function creates a deep copy of the given NULL-terminated array
856  * of property entries.
857  */
858 struct property_entry *
859 property_entries_dup(const struct property_entry *properties)
860 {
861 	struct property_entry *p;
862 	int i, n = 0;
863 
864 	while (properties[n].name)
865 		n++;
866 
867 	p = kcalloc(n + 1, sizeof(*p), GFP_KERNEL);
868 	if (!p)
869 		return ERR_PTR(-ENOMEM);
870 
871 	for (i = 0; i < n; i++) {
872 		int ret = property_entry_copy_data(&p[i], &properties[i]);
873 		if (ret) {
874 			while (--i >= 0)
875 				property_entry_free_data(&p[i]);
876 			kfree(p);
877 			return ERR_PTR(ret);
878 		}
879 	}
880 
881 	return p;
882 }
883 EXPORT_SYMBOL_GPL(property_entries_dup);
884 
885 /**
886  * property_entries_free - free previously allocated array of properties
887  * @properties: array of properties to destroy
888  *
889  * This function frees given NULL-terminated array of property entries,
890  * along with their data.
891  */
892 void property_entries_free(const struct property_entry *properties)
893 {
894 	const struct property_entry *p;
895 
896 	for (p = properties; p->name; p++)
897 		property_entry_free_data(p);
898 
899 	kfree(properties);
900 }
901 EXPORT_SYMBOL_GPL(property_entries_free);
902 
903 /**
904  * pset_free_set - releases memory allocated for copied property set
905  * @pset: Property set to release
906  *
907  * Function takes previously copied property set and releases all the
908  * memory allocated to it.
909  */
910 static void pset_free_set(struct property_set *pset)
911 {
912 	if (!pset)
913 		return;
914 
915 	property_entries_free(pset->properties);
916 	kfree(pset);
917 }
918 
919 /**
920  * pset_copy_set - copies property set
921  * @pset: Property set to copy
922  *
923  * This function takes a deep copy of the given property set and returns
924  * pointer to the copy. Call device_free_property_set() to free resources
925  * allocated in this function.
926  *
927  * Return: Pointer to the new property set or error pointer.
928  */
929 static struct property_set *pset_copy_set(const struct property_set *pset)
930 {
931 	struct property_entry *properties;
932 	struct property_set *p;
933 
934 	p = kzalloc(sizeof(*p), GFP_KERNEL);
935 	if (!p)
936 		return ERR_PTR(-ENOMEM);
937 
938 	properties = property_entries_dup(pset->properties);
939 	if (IS_ERR(properties)) {
940 		kfree(p);
941 		return ERR_CAST(properties);
942 	}
943 
944 	p->properties = properties;
945 	return p;
946 }
947 
948 /**
949  * device_remove_properties - Remove properties from a device object.
950  * @dev: Device whose properties to remove.
951  *
952  * The function removes properties previously associated to the device
953  * secondary firmware node with device_add_properties(). Memory allocated
954  * to the properties will also be released.
955  */
956 void device_remove_properties(struct device *dev)
957 {
958 	struct fwnode_handle *fwnode;
959 	struct property_set *pset;
960 
961 	fwnode = dev_fwnode(dev);
962 	if (!fwnode)
963 		return;
964 	/*
965 	 * Pick either primary or secondary node depending which one holds
966 	 * the pset. If there is no real firmware node (ACPI/DT) primary
967 	 * will hold the pset.
968 	 */
969 	pset = to_pset_node(fwnode);
970 	if (pset) {
971 		set_primary_fwnode(dev, NULL);
972 	} else {
973 		pset = to_pset_node(fwnode->secondary);
974 		if (pset && dev == pset->dev)
975 			set_secondary_fwnode(dev, NULL);
976 	}
977 	if (pset && dev == pset->dev)
978 		pset_free_set(pset);
979 }
980 EXPORT_SYMBOL_GPL(device_remove_properties);
981 
982 /**
983  * device_add_properties - Add a collection of properties to a device object.
984  * @dev: Device to add properties to.
985  * @properties: Collection of properties to add.
986  *
987  * Associate a collection of device properties represented by @properties with
988  * @dev as its secondary firmware node. The function takes a copy of
989  * @properties.
990  */
991 int device_add_properties(struct device *dev,
992 			  const struct property_entry *properties)
993 {
994 	struct property_set *p, pset;
995 
996 	if (!properties)
997 		return -EINVAL;
998 
999 	pset.properties = properties;
1000 
1001 	p = pset_copy_set(&pset);
1002 	if (IS_ERR(p))
1003 		return PTR_ERR(p);
1004 
1005 	p->fwnode.ops = &pset_fwnode_ops;
1006 	set_secondary_fwnode(dev, &p->fwnode);
1007 	p->dev = dev;
1008 	return 0;
1009 }
1010 EXPORT_SYMBOL_GPL(device_add_properties);
1011 
1012 /**
1013  * fwnode_get_next_parent - Iterate to the node's parent
1014  * @fwnode: Firmware whose parent is retrieved
1015  *
1016  * This is like fwnode_get_parent() except that it drops the refcount
1017  * on the passed node, making it suitable for iterating through a
1018  * node's parents.
1019  *
1020  * Returns a node pointer with refcount incremented, use
1021  * fwnode_handle_node() on it when done.
1022  */
1023 struct fwnode_handle *fwnode_get_next_parent(struct fwnode_handle *fwnode)
1024 {
1025 	struct fwnode_handle *parent = fwnode_get_parent(fwnode);
1026 
1027 	fwnode_handle_put(fwnode);
1028 
1029 	return parent;
1030 }
1031 EXPORT_SYMBOL_GPL(fwnode_get_next_parent);
1032 
1033 /**
1034  * fwnode_get_parent - Return parent firwmare node
1035  * @fwnode: Firmware whose parent is retrieved
1036  *
1037  * Return parent firmware node of the given node if possible or %NULL if no
1038  * parent was available.
1039  */
1040 struct fwnode_handle *fwnode_get_parent(const struct fwnode_handle *fwnode)
1041 {
1042 	return fwnode_call_ptr_op(fwnode, get_parent);
1043 }
1044 EXPORT_SYMBOL_GPL(fwnode_get_parent);
1045 
1046 /**
1047  * fwnode_get_next_child_node - Return the next child node handle for a node
1048  * @fwnode: Firmware node to find the next child node for.
1049  * @child: Handle to one of the node's child nodes or a %NULL handle.
1050  */
1051 struct fwnode_handle *
1052 fwnode_get_next_child_node(const struct fwnode_handle *fwnode,
1053 			   struct fwnode_handle *child)
1054 {
1055 	return fwnode_call_ptr_op(fwnode, get_next_child_node, child);
1056 }
1057 EXPORT_SYMBOL_GPL(fwnode_get_next_child_node);
1058 
1059 /**
1060  * fwnode_get_next_available_child_node - Return the next
1061  * available child node handle for a node
1062  * @fwnode: Firmware node to find the next child node for.
1063  * @child: Handle to one of the node's child nodes or a %NULL handle.
1064  */
1065 struct fwnode_handle *
1066 fwnode_get_next_available_child_node(const struct fwnode_handle *fwnode,
1067 				     struct fwnode_handle *child)
1068 {
1069 	struct fwnode_handle *next_child = child;
1070 
1071 	if (!fwnode)
1072 		return NULL;
1073 
1074 	do {
1075 		next_child = fwnode_get_next_child_node(fwnode, next_child);
1076 
1077 		if (!next_child || fwnode_device_is_available(next_child))
1078 			break;
1079 	} while (next_child);
1080 
1081 	return next_child;
1082 }
1083 EXPORT_SYMBOL_GPL(fwnode_get_next_available_child_node);
1084 
1085 /**
1086  * device_get_next_child_node - Return the next child node handle for a device
1087  * @dev: Device to find the next child node for.
1088  * @child: Handle to one of the device's child nodes or a null handle.
1089  */
1090 struct fwnode_handle *device_get_next_child_node(struct device *dev,
1091 						 struct fwnode_handle *child)
1092 {
1093 	struct acpi_device *adev = ACPI_COMPANION(dev);
1094 	struct fwnode_handle *fwnode = NULL;
1095 
1096 	if (dev->of_node)
1097 		fwnode = &dev->of_node->fwnode;
1098 	else if (adev)
1099 		fwnode = acpi_fwnode_handle(adev);
1100 
1101 	return fwnode_get_next_child_node(fwnode, child);
1102 }
1103 EXPORT_SYMBOL_GPL(device_get_next_child_node);
1104 
1105 /**
1106  * fwnode_get_named_child_node - Return first matching named child node handle
1107  * @fwnode: Firmware node to find the named child node for.
1108  * @childname: String to match child node name against.
1109  */
1110 struct fwnode_handle *
1111 fwnode_get_named_child_node(const struct fwnode_handle *fwnode,
1112 			    const char *childname)
1113 {
1114 	return fwnode_call_ptr_op(fwnode, get_named_child_node, childname);
1115 }
1116 EXPORT_SYMBOL_GPL(fwnode_get_named_child_node);
1117 
1118 /**
1119  * device_get_named_child_node - Return first matching named child node handle
1120  * @dev: Device to find the named child node for.
1121  * @childname: String to match child node name against.
1122  */
1123 struct fwnode_handle *device_get_named_child_node(struct device *dev,
1124 						  const char *childname)
1125 {
1126 	return fwnode_get_named_child_node(dev_fwnode(dev), childname);
1127 }
1128 EXPORT_SYMBOL_GPL(device_get_named_child_node);
1129 
1130 /**
1131  * fwnode_handle_get - Obtain a reference to a device node
1132  * @fwnode: Pointer to the device node to obtain the reference to.
1133  *
1134  * Returns the fwnode handle.
1135  */
1136 struct fwnode_handle *fwnode_handle_get(struct fwnode_handle *fwnode)
1137 {
1138 	if (!fwnode_has_op(fwnode, get))
1139 		return fwnode;
1140 
1141 	return fwnode_call_ptr_op(fwnode, get);
1142 }
1143 EXPORT_SYMBOL_GPL(fwnode_handle_get);
1144 
1145 /**
1146  * fwnode_handle_put - Drop reference to a device node
1147  * @fwnode: Pointer to the device node to drop the reference to.
1148  *
1149  * This has to be used when terminating device_for_each_child_node() iteration
1150  * with break or return to prevent stale device node references from being left
1151  * behind.
1152  */
1153 void fwnode_handle_put(struct fwnode_handle *fwnode)
1154 {
1155 	fwnode_call_void_op(fwnode, put);
1156 }
1157 EXPORT_SYMBOL_GPL(fwnode_handle_put);
1158 
1159 /**
1160  * fwnode_device_is_available - check if a device is available for use
1161  * @fwnode: Pointer to the fwnode of the device.
1162  */
1163 bool fwnode_device_is_available(const struct fwnode_handle *fwnode)
1164 {
1165 	return fwnode_call_bool_op(fwnode, device_is_available);
1166 }
1167 EXPORT_SYMBOL_GPL(fwnode_device_is_available);
1168 
1169 /**
1170  * device_get_child_node_count - return the number of child nodes for device
1171  * @dev: Device to cound the child nodes for
1172  */
1173 unsigned int device_get_child_node_count(struct device *dev)
1174 {
1175 	struct fwnode_handle *child;
1176 	unsigned int count = 0;
1177 
1178 	device_for_each_child_node(dev, child)
1179 		count++;
1180 
1181 	return count;
1182 }
1183 EXPORT_SYMBOL_GPL(device_get_child_node_count);
1184 
1185 bool device_dma_supported(struct device *dev)
1186 {
1187 	/* For DT, this is always supported.
1188 	 * For ACPI, this depends on CCA, which
1189 	 * is determined by the acpi_dma_supported().
1190 	 */
1191 	if (IS_ENABLED(CONFIG_OF) && dev->of_node)
1192 		return true;
1193 
1194 	return acpi_dma_supported(ACPI_COMPANION(dev));
1195 }
1196 EXPORT_SYMBOL_GPL(device_dma_supported);
1197 
1198 enum dev_dma_attr device_get_dma_attr(struct device *dev)
1199 {
1200 	enum dev_dma_attr attr = DEV_DMA_NOT_SUPPORTED;
1201 
1202 	if (IS_ENABLED(CONFIG_OF) && dev->of_node) {
1203 		if (of_dma_is_coherent(dev->of_node))
1204 			attr = DEV_DMA_COHERENT;
1205 		else
1206 			attr = DEV_DMA_NON_COHERENT;
1207 	} else
1208 		attr = acpi_get_dma_attr(ACPI_COMPANION(dev));
1209 
1210 	return attr;
1211 }
1212 EXPORT_SYMBOL_GPL(device_get_dma_attr);
1213 
1214 /**
1215  * fwnode_get_phy_mode - Get phy mode for given firmware node
1216  * @fwnode:	Pointer to the given node
1217  *
1218  * The function gets phy interface string from property 'phy-mode' or
1219  * 'phy-connection-type', and return its index in phy_modes table, or errno in
1220  * error case.
1221  */
1222 int fwnode_get_phy_mode(struct fwnode_handle *fwnode)
1223 {
1224 	const char *pm;
1225 	int err, i;
1226 
1227 	err = fwnode_property_read_string(fwnode, "phy-mode", &pm);
1228 	if (err < 0)
1229 		err = fwnode_property_read_string(fwnode,
1230 						  "phy-connection-type", &pm);
1231 	if (err < 0)
1232 		return err;
1233 
1234 	for (i = 0; i < PHY_INTERFACE_MODE_MAX; i++)
1235 		if (!strcasecmp(pm, phy_modes(i)))
1236 			return i;
1237 
1238 	return -ENODEV;
1239 }
1240 EXPORT_SYMBOL_GPL(fwnode_get_phy_mode);
1241 
1242 /**
1243  * device_get_phy_mode - Get phy mode for given device
1244  * @dev:	Pointer to the given device
1245  *
1246  * The function gets phy interface string from property 'phy-mode' or
1247  * 'phy-connection-type', and return its index in phy_modes table, or errno in
1248  * error case.
1249  */
1250 int device_get_phy_mode(struct device *dev)
1251 {
1252 	return fwnode_get_phy_mode(dev_fwnode(dev));
1253 }
1254 EXPORT_SYMBOL_GPL(device_get_phy_mode);
1255 
1256 static void *fwnode_get_mac_addr(struct fwnode_handle *fwnode,
1257 				 const char *name, char *addr,
1258 				 int alen)
1259 {
1260 	int ret = fwnode_property_read_u8_array(fwnode, name, addr, alen);
1261 
1262 	if (ret == 0 && alen == ETH_ALEN && is_valid_ether_addr(addr))
1263 		return addr;
1264 	return NULL;
1265 }
1266 
1267 /**
1268  * fwnode_get_mac_address - Get the MAC from the firmware node
1269  * @fwnode:	Pointer to the firmware node
1270  * @addr:	Address of buffer to store the MAC in
1271  * @alen:	Length of the buffer pointed to by addr, should be ETH_ALEN
1272  *
1273  * Search the firmware node for the best MAC address to use.  'mac-address' is
1274  * checked first, because that is supposed to contain to "most recent" MAC
1275  * address. If that isn't set, then 'local-mac-address' is checked next,
1276  * because that is the default address.  If that isn't set, then the obsolete
1277  * 'address' is checked, just in case we're using an old device tree.
1278  *
1279  * Note that the 'address' property is supposed to contain a virtual address of
1280  * the register set, but some DTS files have redefined that property to be the
1281  * MAC address.
1282  *
1283  * All-zero MAC addresses are rejected, because those could be properties that
1284  * exist in the firmware tables, but were not updated by the firmware.  For
1285  * example, the DTS could define 'mac-address' and 'local-mac-address', with
1286  * zero MAC addresses.  Some older U-Boots only initialized 'local-mac-address'.
1287  * In this case, the real MAC is in 'local-mac-address', and 'mac-address'
1288  * exists but is all zeros.
1289 */
1290 void *fwnode_get_mac_address(struct fwnode_handle *fwnode, char *addr, int alen)
1291 {
1292 	char *res;
1293 
1294 	res = fwnode_get_mac_addr(fwnode, "mac-address", addr, alen);
1295 	if (res)
1296 		return res;
1297 
1298 	res = fwnode_get_mac_addr(fwnode, "local-mac-address", addr, alen);
1299 	if (res)
1300 		return res;
1301 
1302 	return fwnode_get_mac_addr(fwnode, "address", addr, alen);
1303 }
1304 EXPORT_SYMBOL(fwnode_get_mac_address);
1305 
1306 /**
1307  * device_get_mac_address - Get the MAC for a given device
1308  * @dev:	Pointer to the device
1309  * @addr:	Address of buffer to store the MAC in
1310  * @alen:	Length of the buffer pointed to by addr, should be ETH_ALEN
1311  */
1312 void *device_get_mac_address(struct device *dev, char *addr, int alen)
1313 {
1314 	return fwnode_get_mac_address(dev_fwnode(dev), addr, alen);
1315 }
1316 EXPORT_SYMBOL(device_get_mac_address);
1317 
1318 /**
1319  * fwnode_irq_get - Get IRQ directly from a fwnode
1320  * @fwnode:	Pointer to the firmware node
1321  * @index:	Zero-based index of the IRQ
1322  *
1323  * Returns Linux IRQ number on success. Other values are determined
1324  * accordingly to acpi_/of_ irq_get() operation.
1325  */
1326 int fwnode_irq_get(struct fwnode_handle *fwnode, unsigned int index)
1327 {
1328 	struct device_node *of_node = to_of_node(fwnode);
1329 	struct resource res;
1330 	int ret;
1331 
1332 	if (IS_ENABLED(CONFIG_OF) && of_node)
1333 		return of_irq_get(of_node, index);
1334 
1335 	ret = acpi_irq_get(ACPI_HANDLE_FWNODE(fwnode), index, &res);
1336 	if (ret)
1337 		return ret;
1338 
1339 	return res.start;
1340 }
1341 EXPORT_SYMBOL(fwnode_irq_get);
1342 
1343 /**
1344  * device_graph_get_next_endpoint - Get next endpoint firmware node
1345  * @fwnode: Pointer to the parent firmware node
1346  * @prev: Previous endpoint node or %NULL to get the first
1347  *
1348  * Returns an endpoint firmware node pointer or %NULL if no more endpoints
1349  * are available.
1350  */
1351 struct fwnode_handle *
1352 fwnode_graph_get_next_endpoint(const struct fwnode_handle *fwnode,
1353 			       struct fwnode_handle *prev)
1354 {
1355 	return fwnode_call_ptr_op(fwnode, graph_get_next_endpoint, prev);
1356 }
1357 EXPORT_SYMBOL_GPL(fwnode_graph_get_next_endpoint);
1358 
1359 /**
1360  * fwnode_graph_get_port_parent - Return the device fwnode of a port endpoint
1361  * @endpoint: Endpoint firmware node of the port
1362  *
1363  * Return: the firmware node of the device the @endpoint belongs to.
1364  */
1365 struct fwnode_handle *
1366 fwnode_graph_get_port_parent(const struct fwnode_handle *endpoint)
1367 {
1368 	struct fwnode_handle *port, *parent;
1369 
1370 	port = fwnode_get_parent(endpoint);
1371 	parent = fwnode_call_ptr_op(port, graph_get_port_parent);
1372 
1373 	fwnode_handle_put(port);
1374 
1375 	return parent;
1376 }
1377 EXPORT_SYMBOL_GPL(fwnode_graph_get_port_parent);
1378 
1379 /**
1380  * fwnode_graph_get_remote_port_parent - Return fwnode of a remote device
1381  * @fwnode: Endpoint firmware node pointing to the remote endpoint
1382  *
1383  * Extracts firmware node of a remote device the @fwnode points to.
1384  */
1385 struct fwnode_handle *
1386 fwnode_graph_get_remote_port_parent(const struct fwnode_handle *fwnode)
1387 {
1388 	struct fwnode_handle *endpoint, *parent;
1389 
1390 	endpoint = fwnode_graph_get_remote_endpoint(fwnode);
1391 	parent = fwnode_graph_get_port_parent(endpoint);
1392 
1393 	fwnode_handle_put(endpoint);
1394 
1395 	return parent;
1396 }
1397 EXPORT_SYMBOL_GPL(fwnode_graph_get_remote_port_parent);
1398 
1399 /**
1400  * fwnode_graph_get_remote_port - Return fwnode of a remote port
1401  * @fwnode: Endpoint firmware node pointing to the remote endpoint
1402  *
1403  * Extracts firmware node of a remote port the @fwnode points to.
1404  */
1405 struct fwnode_handle *
1406 fwnode_graph_get_remote_port(const struct fwnode_handle *fwnode)
1407 {
1408 	return fwnode_get_next_parent(fwnode_graph_get_remote_endpoint(fwnode));
1409 }
1410 EXPORT_SYMBOL_GPL(fwnode_graph_get_remote_port);
1411 
1412 /**
1413  * fwnode_graph_get_remote_endpoint - Return fwnode of a remote endpoint
1414  * @fwnode: Endpoint firmware node pointing to the remote endpoint
1415  *
1416  * Extracts firmware node of a remote endpoint the @fwnode points to.
1417  */
1418 struct fwnode_handle *
1419 fwnode_graph_get_remote_endpoint(const struct fwnode_handle *fwnode)
1420 {
1421 	return fwnode_call_ptr_op(fwnode, graph_get_remote_endpoint);
1422 }
1423 EXPORT_SYMBOL_GPL(fwnode_graph_get_remote_endpoint);
1424 
1425 /**
1426  * fwnode_graph_get_remote_node - get remote parent node for given port/endpoint
1427  * @fwnode: pointer to parent fwnode_handle containing graph port/endpoint
1428  * @port_id: identifier of the parent port node
1429  * @endpoint_id: identifier of the endpoint node
1430  *
1431  * Return: Remote fwnode handle associated with remote endpoint node linked
1432  *	   to @node. Use fwnode_node_put() on it when done.
1433  */
1434 struct fwnode_handle *
1435 fwnode_graph_get_remote_node(const struct fwnode_handle *fwnode, u32 port_id,
1436 			     u32 endpoint_id)
1437 {
1438 	struct fwnode_handle *endpoint = NULL;
1439 
1440 	while ((endpoint = fwnode_graph_get_next_endpoint(fwnode, endpoint))) {
1441 		struct fwnode_endpoint fwnode_ep;
1442 		struct fwnode_handle *remote;
1443 		int ret;
1444 
1445 		ret = fwnode_graph_parse_endpoint(endpoint, &fwnode_ep);
1446 		if (ret < 0)
1447 			continue;
1448 
1449 		if (fwnode_ep.port != port_id || fwnode_ep.id != endpoint_id)
1450 			continue;
1451 
1452 		remote = fwnode_graph_get_remote_port_parent(endpoint);
1453 		if (!remote)
1454 			return NULL;
1455 
1456 		return fwnode_device_is_available(remote) ? remote : NULL;
1457 	}
1458 
1459 	return NULL;
1460 }
1461 EXPORT_SYMBOL_GPL(fwnode_graph_get_remote_node);
1462 
1463 /**
1464  * fwnode_graph_parse_endpoint - parse common endpoint node properties
1465  * @fwnode: pointer to endpoint fwnode_handle
1466  * @endpoint: pointer to the fwnode endpoint data structure
1467  *
1468  * Parse @fwnode representing a graph endpoint node and store the
1469  * information in @endpoint. The caller must hold a reference to
1470  * @fwnode.
1471  */
1472 int fwnode_graph_parse_endpoint(const struct fwnode_handle *fwnode,
1473 				struct fwnode_endpoint *endpoint)
1474 {
1475 	memset(endpoint, 0, sizeof(*endpoint));
1476 
1477 	return fwnode_call_int_op(fwnode, graph_parse_endpoint, endpoint);
1478 }
1479 EXPORT_SYMBOL(fwnode_graph_parse_endpoint);
1480 
1481 const void *device_get_match_data(struct device *dev)
1482 {
1483 	return fwnode_call_ptr_op(dev_fwnode(dev), device_get_match_data, dev);
1484 }
1485 EXPORT_SYMBOL_GPL(device_get_match_data);
1486