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