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