GNU Linux-libre 4.14.259-gnu1
[releases.git] / drivers / base / property.c
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);