Merge tag 'vfio-v4.5-rc1' of git://github.com/awilliam/linux-vfio
[linux-2.6-block.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/property.h>
19 #include <linux/etherdevice.h>
20 #include <linux/phy.h>
21
22 static inline bool is_pset_node(struct fwnode_handle *fwnode)
23 {
24         return fwnode && fwnode->type == FWNODE_PDATA;
25 }
26
27 static inline struct property_set *to_pset_node(struct fwnode_handle *fwnode)
28 {
29         return is_pset_node(fwnode) ?
30                 container_of(fwnode, struct property_set, fwnode) : NULL;
31 }
32
33 static struct property_entry *pset_prop_get(struct property_set *pset,
34                                             const char *name)
35 {
36         struct property_entry *prop;
37
38         if (!pset || !pset->properties)
39                 return NULL;
40
41         for (prop = pset->properties; prop->name; prop++)
42                 if (!strcmp(name, prop->name))
43                         return prop;
44
45         return NULL;
46 }
47
48 static void *pset_prop_find(struct property_set *pset, const char *propname,
49                             size_t length)
50 {
51         struct property_entry *prop;
52         void *pointer;
53
54         prop = pset_prop_get(pset, propname);
55         if (!prop)
56                 return ERR_PTR(-EINVAL);
57         if (prop->is_array)
58                 pointer = prop->pointer.raw_data;
59         else
60                 pointer = &prop->value.raw_data;
61         if (!pointer)
62                 return ERR_PTR(-ENODATA);
63         if (length > prop->length)
64                 return ERR_PTR(-EOVERFLOW);
65         return pointer;
66 }
67
68 static int pset_prop_read_u8_array(struct property_set *pset,
69                                    const char *propname,
70                                    u8 *values, size_t nval)
71 {
72         void *pointer;
73         size_t length = nval * sizeof(*values);
74
75         pointer = pset_prop_find(pset, propname, length);
76         if (IS_ERR(pointer))
77                 return PTR_ERR(pointer);
78
79         memcpy(values, pointer, length);
80         return 0;
81 }
82
83 static int pset_prop_read_u16_array(struct property_set *pset,
84                                     const char *propname,
85                                     u16 *values, size_t nval)
86 {
87         void *pointer;
88         size_t length = nval * sizeof(*values);
89
90         pointer = pset_prop_find(pset, propname, length);
91         if (IS_ERR(pointer))
92                 return PTR_ERR(pointer);
93
94         memcpy(values, pointer, length);
95         return 0;
96 }
97
98 static int pset_prop_read_u32_array(struct property_set *pset,
99                                     const char *propname,
100                                     u32 *values, size_t nval)
101 {
102         void *pointer;
103         size_t length = nval * sizeof(*values);
104
105         pointer = pset_prop_find(pset, propname, length);
106         if (IS_ERR(pointer))
107                 return PTR_ERR(pointer);
108
109         memcpy(values, pointer, length);
110         return 0;
111 }
112
113 static int pset_prop_read_u64_array(struct property_set *pset,
114                                     const char *propname,
115                                     u64 *values, size_t nval)
116 {
117         void *pointer;
118         size_t length = nval * sizeof(*values);
119
120         pointer = pset_prop_find(pset, propname, length);
121         if (IS_ERR(pointer))
122                 return PTR_ERR(pointer);
123
124         memcpy(values, pointer, length);
125         return 0;
126 }
127
128 static int pset_prop_count_elems_of_size(struct property_set *pset,
129                                          const char *propname, size_t length)
130 {
131         struct property_entry *prop;
132
133         prop = pset_prop_get(pset, propname);
134         if (!prop)
135                 return -EINVAL;
136
137         return prop->length / length;
138 }
139
140 static int pset_prop_read_string_array(struct property_set *pset,
141                                        const char *propname,
142                                        const char **strings, size_t nval)
143 {
144         void *pointer;
145         size_t length = nval * sizeof(*strings);
146
147         pointer = pset_prop_find(pset, propname, length);
148         if (IS_ERR(pointer))
149                 return PTR_ERR(pointer);
150
151         memcpy(strings, pointer, length);
152         return 0;
153 }
154
155 static int pset_prop_read_string(struct property_set *pset,
156                                  const char *propname, const char **strings)
157 {
158         struct property_entry *prop;
159         const char **pointer;
160
161         prop = pset_prop_get(pset, propname);
162         if (!prop)
163                 return -EINVAL;
164         if (!prop->is_string)
165                 return -EILSEQ;
166         if (prop->is_array) {
167                 pointer = prop->pointer.str;
168                 if (!pointer)
169                         return -ENODATA;
170         } else {
171                 pointer = &prop->value.str;
172                 if (*pointer && strnlen(*pointer, prop->length) >= prop->length)
173                         return -EILSEQ;
174         }
175
176         *strings = *pointer;
177         return 0;
178 }
179
180 static inline struct fwnode_handle *dev_fwnode(struct device *dev)
181 {
182         return IS_ENABLED(CONFIG_OF) && dev->of_node ?
183                 &dev->of_node->fwnode : dev->fwnode;
184 }
185
186 /**
187  * device_property_present - check if a property of a device is present
188  * @dev: Device whose property is being checked
189  * @propname: Name of the property
190  *
191  * Check if property @propname is present in the device firmware description.
192  */
193 bool device_property_present(struct device *dev, const char *propname)
194 {
195         return fwnode_property_present(dev_fwnode(dev), propname);
196 }
197 EXPORT_SYMBOL_GPL(device_property_present);
198
199 static bool __fwnode_property_present(struct fwnode_handle *fwnode,
200                                       const char *propname)
201 {
202         if (is_of_node(fwnode))
203                 return of_property_read_bool(to_of_node(fwnode), propname);
204         else if (is_acpi_node(fwnode))
205                 return !acpi_node_prop_get(fwnode, propname, NULL);
206         else if (is_pset_node(fwnode))
207                 return !!pset_prop_get(to_pset_node(fwnode), propname);
208         return false;
209 }
210
211 /**
212  * fwnode_property_present - check if a property of a firmware node is present
213  * @fwnode: Firmware node whose property to check
214  * @propname: Name of the property
215  */
216 bool fwnode_property_present(struct fwnode_handle *fwnode, const char *propname)
217 {
218         bool ret;
219
220         ret = __fwnode_property_present(fwnode, propname);
221         if (ret == false && fwnode && fwnode->secondary)
222                 ret = __fwnode_property_present(fwnode->secondary, propname);
223         return ret;
224 }
225 EXPORT_SYMBOL_GPL(fwnode_property_present);
226
227 /**
228  * device_property_read_u8_array - return a u8 array property of a device
229  * @dev: Device to get the property of
230  * @propname: Name of the property
231  * @val: The values are stored here or %NULL to return the number of values
232  * @nval: Size of the @val array
233  *
234  * Function reads an array of u8 properties with @propname from the device
235  * firmware description and stores them to @val if found.
236  *
237  * Return: number of values if @val was %NULL,
238  *         %0 if the property was found (success),
239  *         %-EINVAL if given arguments are not valid,
240  *         %-ENODATA if the property does not have a value,
241  *         %-EPROTO if the property is not an array of numbers,
242  *         %-EOVERFLOW if the size of the property is not as expected.
243  *         %-ENXIO if no suitable firmware interface is present.
244  */
245 int device_property_read_u8_array(struct device *dev, const char *propname,
246                                   u8 *val, size_t nval)
247 {
248         return fwnode_property_read_u8_array(dev_fwnode(dev), propname, val, nval);
249 }
250 EXPORT_SYMBOL_GPL(device_property_read_u8_array);
251
252 /**
253  * device_property_read_u16_array - return a u16 array property of a device
254  * @dev: Device to get the property of
255  * @propname: Name of the property
256  * @val: The values are stored here or %NULL to return the number of values
257  * @nval: Size of the @val array
258  *
259  * Function reads an array of u16 properties with @propname from the device
260  * firmware description and stores them to @val if found.
261  *
262  * Return: number of values if @val was %NULL,
263  *         %0 if the property was found (success),
264  *         %-EINVAL if given arguments are not valid,
265  *         %-ENODATA if the property does not have a value,
266  *         %-EPROTO if the property is not an array of numbers,
267  *         %-EOVERFLOW if the size of the property is not as expected.
268  *         %-ENXIO if no suitable firmware interface is present.
269  */
270 int device_property_read_u16_array(struct device *dev, const char *propname,
271                                    u16 *val, size_t nval)
272 {
273         return fwnode_property_read_u16_array(dev_fwnode(dev), propname, val, nval);
274 }
275 EXPORT_SYMBOL_GPL(device_property_read_u16_array);
276
277 /**
278  * device_property_read_u32_array - return a u32 array property of a device
279  * @dev: Device to get the property of
280  * @propname: Name of the property
281  * @val: The values are stored here or %NULL to return the number of values
282  * @nval: Size of the @val array
283  *
284  * Function reads an array of u32 properties with @propname from the device
285  * firmware description and stores them to @val if found.
286  *
287  * Return: number of values if @val was %NULL,
288  *         %0 if the property was found (success),
289  *         %-EINVAL if given arguments are not valid,
290  *         %-ENODATA if the property does not have a value,
291  *         %-EPROTO if the property is not an array of numbers,
292  *         %-EOVERFLOW if the size of the property is not as expected.
293  *         %-ENXIO if no suitable firmware interface is present.
294  */
295 int device_property_read_u32_array(struct device *dev, const char *propname,
296                                    u32 *val, size_t nval)
297 {
298         return fwnode_property_read_u32_array(dev_fwnode(dev), propname, val, nval);
299 }
300 EXPORT_SYMBOL_GPL(device_property_read_u32_array);
301
302 /**
303  * device_property_read_u64_array - return a u64 array property of a device
304  * @dev: Device to get the property of
305  * @propname: Name of the property
306  * @val: The values are stored here or %NULL to return the number of values
307  * @nval: Size of the @val array
308  *
309  * Function reads an array of u64 properties with @propname from the device
310  * firmware description and stores them to @val if found.
311  *
312  * Return: number of values if @val was %NULL,
313  *         %0 if the property was found (success),
314  *         %-EINVAL if given arguments are not valid,
315  *         %-ENODATA if the property does not have a value,
316  *         %-EPROTO if the property is not an array of numbers,
317  *         %-EOVERFLOW if the size of the property is not as expected.
318  *         %-ENXIO if no suitable firmware interface is present.
319  */
320 int device_property_read_u64_array(struct device *dev, const char *propname,
321                                    u64 *val, size_t nval)
322 {
323         return fwnode_property_read_u64_array(dev_fwnode(dev), propname, val, nval);
324 }
325 EXPORT_SYMBOL_GPL(device_property_read_u64_array);
326
327 /**
328  * device_property_read_string_array - return a string array property of device
329  * @dev: Device to get the property of
330  * @propname: Name of the property
331  * @val: The values are stored here or %NULL to return the number of values
332  * @nval: Size of the @val array
333  *
334  * Function reads an array of string properties with @propname from the device
335  * firmware description and stores them to @val if found.
336  *
337  * Return: number of values if @val was %NULL,
338  *         %0 if the property was found (success),
339  *         %-EINVAL if given arguments are not valid,
340  *         %-ENODATA if the property does not have a value,
341  *         %-EPROTO or %-EILSEQ if the property is not an array of strings,
342  *         %-EOVERFLOW if the size of the property is not as expected.
343  *         %-ENXIO if no suitable firmware interface is present.
344  */
345 int device_property_read_string_array(struct device *dev, const char *propname,
346                                       const char **val, size_t nval)
347 {
348         return fwnode_property_read_string_array(dev_fwnode(dev), propname, val, nval);
349 }
350 EXPORT_SYMBOL_GPL(device_property_read_string_array);
351
352 /**
353  * device_property_read_string - return a string property of a device
354  * @dev: Device to get the property of
355  * @propname: Name of the property
356  * @val: The value is stored here
357  *
358  * Function reads property @propname from the device firmware description and
359  * stores the value into @val if found. The value is checked to be a string.
360  *
361  * Return: %0 if the property was found (success),
362  *         %-EINVAL if given arguments are not valid,
363  *         %-ENODATA if the property does not have a value,
364  *         %-EPROTO or %-EILSEQ if the property type is not a string.
365  *         %-ENXIO if no suitable firmware interface is present.
366  */
367 int device_property_read_string(struct device *dev, const char *propname,
368                                 const char **val)
369 {
370         return fwnode_property_read_string(dev_fwnode(dev), propname, val);
371 }
372 EXPORT_SYMBOL_GPL(device_property_read_string);
373
374 /**
375  * device_property_match_string - find a string in an array and return index
376  * @dev: Device to get the property of
377  * @propname: Name of the property holding the array
378  * @string: String to look for
379  *
380  * Find a given string in a string array and if it is found return the
381  * index back.
382  *
383  * Return: %0 if the property was found (success),
384  *         %-EINVAL if given arguments are not valid,
385  *         %-ENODATA if the property does not have a value,
386  *         %-EPROTO if the property is not an array of strings,
387  *         %-ENXIO if no suitable firmware interface is present.
388  */
389 int device_property_match_string(struct device *dev, const char *propname,
390                                  const char *string)
391 {
392         return fwnode_property_match_string(dev_fwnode(dev), propname, string);
393 }
394 EXPORT_SYMBOL_GPL(device_property_match_string);
395
396 #define OF_DEV_PROP_READ_ARRAY(node, propname, type, val, nval)                         \
397         (val) ? of_property_read_##type##_array((node), (propname), (val), (nval))      \
398               : of_property_count_elems_of_size((node), (propname), sizeof(type))
399
400 #define PSET_PROP_READ_ARRAY(node, propname, type, val, nval)                           \
401         (val) ? pset_prop_read_##type##_array((node), (propname), (val), (nval))        \
402               : pset_prop_count_elems_of_size((node), (propname), sizeof(type))
403
404 #define FWNODE_PROP_READ(_fwnode_, _propname_, _type_, _proptype_, _val_, _nval_)       \
405 ({                                                                                      \
406         int _ret_;                                                                      \
407         if (is_of_node(_fwnode_))                                                       \
408                 _ret_ = OF_DEV_PROP_READ_ARRAY(to_of_node(_fwnode_), _propname_,        \
409                                                _type_, _val_, _nval_);                  \
410         else if (is_acpi_node(_fwnode_))                                                \
411                 _ret_ = acpi_node_prop_read(_fwnode_, _propname_, _proptype_,           \
412                                             _val_, _nval_);                             \
413         else if (is_pset_node(_fwnode_))                                                \
414                 _ret_ = PSET_PROP_READ_ARRAY(to_pset_node(_fwnode_), _propname_,        \
415                                              _type_, _val_, _nval_);                    \
416         else                                                                            \
417                 _ret_ = -ENXIO;                                                         \
418         _ret_;                                                                          \
419 })
420
421 #define FWNODE_PROP_READ_ARRAY(_fwnode_, _propname_, _type_, _proptype_, _val_, _nval_) \
422 ({                                                                                      \
423         int _ret_;                                                                      \
424         _ret_ = FWNODE_PROP_READ(_fwnode_, _propname_, _type_, _proptype_,              \
425                                  _val_, _nval_);                                        \
426         if (_ret_ == -EINVAL && _fwnode_ && _fwnode_->secondary)                        \
427                 _ret_ = FWNODE_PROP_READ(_fwnode_->secondary, _propname_, _type_,       \
428                                 _proptype_, _val_, _nval_);                             \
429         _ret_;                                                                          \
430 })
431
432 /**
433  * fwnode_property_read_u8_array - return a u8 array property of firmware node
434  * @fwnode: Firmware node to get the property of
435  * @propname: Name of the property
436  * @val: The values are stored here or %NULL to return the number of values
437  * @nval: Size of the @val array
438  *
439  * Read an array of u8 properties with @propname from @fwnode and stores them to
440  * @val if found.
441  *
442  * Return: number of values if @val was %NULL,
443  *         %0 if the property was found (success),
444  *         %-EINVAL if given arguments are not valid,
445  *         %-ENODATA if the property does not have a value,
446  *         %-EPROTO if the property is not an array of numbers,
447  *         %-EOVERFLOW if the size of the property is not as expected,
448  *         %-ENXIO if no suitable firmware interface is present.
449  */
450 int fwnode_property_read_u8_array(struct fwnode_handle *fwnode,
451                                   const char *propname, u8 *val, size_t nval)
452 {
453         return FWNODE_PROP_READ_ARRAY(fwnode, propname, u8, DEV_PROP_U8,
454                                       val, nval);
455 }
456 EXPORT_SYMBOL_GPL(fwnode_property_read_u8_array);
457
458 /**
459  * fwnode_property_read_u16_array - return a u16 array property of firmware node
460  * @fwnode: Firmware node to get the property of
461  * @propname: Name of the property
462  * @val: The values are stored here or %NULL to return the number of values
463  * @nval: Size of the @val array
464  *
465  * Read an array of u16 properties with @propname from @fwnode and store them to
466  * @val if found.
467  *
468  * Return: number of values if @val was %NULL,
469  *         %0 if the property was found (success),
470  *         %-EINVAL if given arguments are not valid,
471  *         %-ENODATA if the property does not have a value,
472  *         %-EPROTO if the property is not an array of numbers,
473  *         %-EOVERFLOW if the size of the property is not as expected,
474  *         %-ENXIO if no suitable firmware interface is present.
475  */
476 int fwnode_property_read_u16_array(struct fwnode_handle *fwnode,
477                                    const char *propname, u16 *val, size_t nval)
478 {
479         return FWNODE_PROP_READ_ARRAY(fwnode, propname, u16, DEV_PROP_U16,
480                                       val, nval);
481 }
482 EXPORT_SYMBOL_GPL(fwnode_property_read_u16_array);
483
484 /**
485  * fwnode_property_read_u32_array - return a u32 array property of firmware node
486  * @fwnode: Firmware node to get the property of
487  * @propname: Name of the property
488  * @val: The values are stored here or %NULL to return the number of values
489  * @nval: Size of the @val array
490  *
491  * Read an array of u32 properties with @propname from @fwnode store them to
492  * @val if found.
493  *
494  * Return: number of values if @val was %NULL,
495  *         %0 if the property was found (success),
496  *         %-EINVAL if given arguments are not valid,
497  *         %-ENODATA if the property does not have a value,
498  *         %-EPROTO if the property is not an array of numbers,
499  *         %-EOVERFLOW if the size of the property is not as expected,
500  *         %-ENXIO if no suitable firmware interface is present.
501  */
502 int fwnode_property_read_u32_array(struct fwnode_handle *fwnode,
503                                    const char *propname, u32 *val, size_t nval)
504 {
505         return FWNODE_PROP_READ_ARRAY(fwnode, propname, u32, DEV_PROP_U32,
506                                       val, nval);
507 }
508 EXPORT_SYMBOL_GPL(fwnode_property_read_u32_array);
509
510 /**
511  * fwnode_property_read_u64_array - return a u64 array property firmware node
512  * @fwnode: Firmware node to get the property of
513  * @propname: Name of the property
514  * @val: The values are stored here or %NULL to return the number of values
515  * @nval: Size of the @val array
516  *
517  * Read an array of u64 properties with @propname from @fwnode and store them to
518  * @val if found.
519  *
520  * Return: number of values if @val was %NULL,
521  *         %0 if the property was found (success),
522  *         %-EINVAL if given arguments are not valid,
523  *         %-ENODATA if the property does not have a value,
524  *         %-EPROTO if the property is not an array of numbers,
525  *         %-EOVERFLOW if the size of the property is not as expected,
526  *         %-ENXIO if no suitable firmware interface is present.
527  */
528 int fwnode_property_read_u64_array(struct fwnode_handle *fwnode,
529                                    const char *propname, u64 *val, size_t nval)
530 {
531         return FWNODE_PROP_READ_ARRAY(fwnode, propname, u64, DEV_PROP_U64,
532                                       val, nval);
533 }
534 EXPORT_SYMBOL_GPL(fwnode_property_read_u64_array);
535
536 static int __fwnode_property_read_string_array(struct fwnode_handle *fwnode,
537                                                const char *propname,
538                                                const char **val, size_t nval)
539 {
540         if (is_of_node(fwnode))
541                 return val ?
542                         of_property_read_string_array(to_of_node(fwnode),
543                                                       propname, val, nval) :
544                         of_property_count_strings(to_of_node(fwnode), propname);
545         else if (is_acpi_node(fwnode))
546                 return acpi_node_prop_read(fwnode, propname, DEV_PROP_STRING,
547                                            val, nval);
548         else if (is_pset_node(fwnode))
549                 return val ?
550                         pset_prop_read_string_array(to_pset_node(fwnode),
551                                                     propname, val, nval) :
552                         pset_prop_count_elems_of_size(to_pset_node(fwnode),
553                                                       propname,
554                                                       sizeof(const char *));
555         return -ENXIO;
556 }
557
558 static int __fwnode_property_read_string(struct fwnode_handle *fwnode,
559                                          const char *propname, const char **val)
560 {
561         if (is_of_node(fwnode))
562                 return of_property_read_string(to_of_node(fwnode), propname, val);
563         else if (is_acpi_node(fwnode))
564                 return acpi_node_prop_read(fwnode, propname, DEV_PROP_STRING,
565                                            val, 1);
566         else if (is_pset_node(fwnode))
567                 return pset_prop_read_string(to_pset_node(fwnode), propname, val);
568         return -ENXIO;
569 }
570
571 /**
572  * fwnode_property_read_string_array - return string array property of a node
573  * @fwnode: Firmware node to get the property of
574  * @propname: Name of the property
575  * @val: The values are stored here or %NULL to return the number of values
576  * @nval: Size of the @val array
577  *
578  * Read an string list property @propname from the given firmware node and store
579  * them to @val if found.
580  *
581  * Return: number of values if @val was %NULL,
582  *         %0 if the property was found (success),
583  *         %-EINVAL if given arguments are not valid,
584  *         %-ENODATA if the property does not have a value,
585  *         %-EPROTO if the property is not an array of strings,
586  *         %-EOVERFLOW if the size of the property is not as expected,
587  *         %-ENXIO if no suitable firmware interface is present.
588  */
589 int fwnode_property_read_string_array(struct fwnode_handle *fwnode,
590                                       const char *propname, const char **val,
591                                       size_t nval)
592 {
593         int ret;
594
595         ret = __fwnode_property_read_string_array(fwnode, propname, val, nval);
596         if (ret == -EINVAL && fwnode && fwnode->secondary)
597                 ret = __fwnode_property_read_string_array(fwnode->secondary,
598                                                           propname, val, nval);
599         return ret;
600 }
601 EXPORT_SYMBOL_GPL(fwnode_property_read_string_array);
602
603 /**
604  * fwnode_property_read_string - return a string property of a firmware node
605  * @fwnode: Firmware node to get the property of
606  * @propname: Name of the property
607  * @val: The value is stored here
608  *
609  * Read property @propname from the given firmware node and store the value into
610  * @val if found.  The value is checked to be a string.
611  *
612  * Return: %0 if the property was found (success),
613  *         %-EINVAL if given arguments are not valid,
614  *         %-ENODATA if the property does not have a value,
615  *         %-EPROTO or %-EILSEQ if the property is not a string,
616  *         %-ENXIO if no suitable firmware interface is present.
617  */
618 int fwnode_property_read_string(struct fwnode_handle *fwnode,
619                                 const char *propname, const char **val)
620 {
621         int ret;
622
623         ret = __fwnode_property_read_string(fwnode, propname, val);
624         if (ret == -EINVAL && fwnode && fwnode->secondary)
625                 ret = __fwnode_property_read_string(fwnode->secondary,
626                                                     propname, val);
627         return ret;
628 }
629 EXPORT_SYMBOL_GPL(fwnode_property_read_string);
630
631 /**
632  * fwnode_property_match_string - find a string in an array and return index
633  * @fwnode: Firmware node to get the property of
634  * @propname: Name of the property holding the array
635  * @string: String to look for
636  *
637  * Find a given string in a string array and if it is found return the
638  * index back.
639  *
640  * Return: %0 if the property was found (success),
641  *         %-EINVAL if given arguments are not valid,
642  *         %-ENODATA if the property does not have a value,
643  *         %-EPROTO if the property is not an array of strings,
644  *         %-ENXIO if no suitable firmware interface is present.
645  */
646 int fwnode_property_match_string(struct fwnode_handle *fwnode,
647         const char *propname, const char *string)
648 {
649         const char **values;
650         int nval, ret, i;
651
652         nval = fwnode_property_read_string_array(fwnode, propname, NULL, 0);
653         if (nval < 0)
654                 return nval;
655
656         if (nval == 0)
657                 return -ENODATA;
658
659         values = kcalloc(nval, sizeof(*values), GFP_KERNEL);
660         if (!values)
661                 return -ENOMEM;
662
663         ret = fwnode_property_read_string_array(fwnode, propname, values, nval);
664         if (ret < 0)
665                 goto out;
666
667         ret = -ENODATA;
668         for (i = 0; i < nval; i++) {
669                 if (!strcmp(values[i], string)) {
670                         ret = i;
671                         break;
672                 }
673         }
674 out:
675         kfree(values);
676         return ret;
677 }
678 EXPORT_SYMBOL_GPL(fwnode_property_match_string);
679
680 /**
681  * pset_free_set - releases memory allocated for copied property set
682  * @pset: Property set to release
683  *
684  * Function takes previously copied property set and releases all the
685  * memory allocated to it.
686  */
687 static void pset_free_set(struct property_set *pset)
688 {
689         const struct property_entry *prop;
690         size_t i, nval;
691
692         if (!pset)
693                 return;
694
695         for (prop = pset->properties; prop->name; prop++) {
696                 if (prop->is_array) {
697                         if (prop->is_string && prop->pointer.str) {
698                                 nval = prop->length / sizeof(const char *);
699                                 for (i = 0; i < nval; i++)
700                                         kfree(prop->pointer.str[i]);
701                         }
702                         kfree(prop->pointer.raw_data);
703                 } else if (prop->is_string) {
704                         kfree(prop->value.str);
705                 }
706                 kfree(prop->name);
707         }
708
709         kfree(pset->properties);
710         kfree(pset);
711 }
712
713 static int pset_copy_entry(struct property_entry *dst,
714                            const struct property_entry *src)
715 {
716         const char **d, **s;
717         size_t i, nval;
718
719         dst->name = kstrdup(src->name, GFP_KERNEL);
720         if (!dst->name)
721                 return -ENOMEM;
722
723         if (src->is_array) {
724                 if (!src->length)
725                         return -ENODATA;
726
727                 if (src->is_string) {
728                         nval = src->length / sizeof(const char *);
729                         dst->pointer.str = kcalloc(nval, sizeof(const char *),
730                                                    GFP_KERNEL);
731                         if (!dst->pointer.str)
732                                 return -ENOMEM;
733
734                         d = dst->pointer.str;
735                         s = src->pointer.str;
736                         for (i = 0; i < nval; i++) {
737                                 d[i] = kstrdup(s[i], GFP_KERNEL);
738                                 if (!d[i] && s[i])
739                                         return -ENOMEM;
740                         }
741                 } else {
742                         dst->pointer.raw_data = kmemdup(src->pointer.raw_data,
743                                                         src->length, GFP_KERNEL);
744                         if (!dst->pointer.raw_data)
745                                 return -ENOMEM;
746                 }
747         } else if (src->is_string) {
748                 dst->value.str = kstrdup(src->value.str, GFP_KERNEL);
749                 if (!dst->value.str && src->value.str)
750                         return -ENOMEM;
751         } else {
752                 dst->value.raw_data = src->value.raw_data;
753         }
754
755         dst->length = src->length;
756         dst->is_array = src->is_array;
757         dst->is_string = src->is_string;
758
759         return 0;
760 }
761
762 /**
763  * pset_copy_set - copies property set
764  * @pset: Property set to copy
765  *
766  * This function takes a deep copy of the given property set and returns
767  * pointer to the copy. Call device_free_property_set() to free resources
768  * allocated in this function.
769  *
770  * Return: Pointer to the new property set or error pointer.
771  */
772 static struct property_set *pset_copy_set(const struct property_set *pset)
773 {
774         const struct property_entry *entry;
775         struct property_set *p;
776         size_t i, n = 0;
777
778         p = kzalloc(sizeof(*p), GFP_KERNEL);
779         if (!p)
780                 return ERR_PTR(-ENOMEM);
781
782         while (pset->properties[n].name)
783                 n++;
784
785         p->properties = kcalloc(n + 1, sizeof(*entry), GFP_KERNEL);
786         if (!p->properties) {
787                 kfree(p);
788                 return ERR_PTR(-ENOMEM);
789         }
790
791         for (i = 0; i < n; i++) {
792                 int ret = pset_copy_entry(&p->properties[i],
793                                           &pset->properties[i]);
794                 if (ret) {
795                         pset_free_set(p);
796                         return ERR_PTR(ret);
797                 }
798         }
799
800         return p;
801 }
802
803 /**
804  * device_remove_property_set - Remove properties from a device object.
805  * @dev: Device whose properties to remove.
806  *
807  * The function removes properties previously associated to the device
808  * secondary firmware node with device_add_property_set(). Memory allocated
809  * to the properties will also be released.
810  */
811 void device_remove_property_set(struct device *dev)
812 {
813         struct fwnode_handle *fwnode;
814
815         fwnode = dev_fwnode(dev);
816         if (!fwnode)
817                 return;
818         /*
819          * Pick either primary or secondary node depending which one holds
820          * the pset. If there is no real firmware node (ACPI/DT) primary
821          * will hold the pset.
822          */
823         if (!is_pset_node(fwnode))
824                 fwnode = fwnode->secondary;
825         if (!IS_ERR(fwnode) && is_pset_node(fwnode))
826                 pset_free_set(to_pset_node(fwnode));
827         set_secondary_fwnode(dev, NULL);
828 }
829 EXPORT_SYMBOL_GPL(device_remove_property_set);
830
831 /**
832  * device_add_property_set - Add a collection of properties to a device object.
833  * @dev: Device to add properties to.
834  * @pset: Collection of properties to add.
835  *
836  * Associate a collection of device properties represented by @pset with @dev
837  * as its secondary firmware node. The function takes a copy of @pset.
838  */
839 int device_add_property_set(struct device *dev, const struct property_set *pset)
840 {
841         struct property_set *p;
842
843         if (!pset)
844                 return -EINVAL;
845
846         p = pset_copy_set(pset);
847         if (IS_ERR(p))
848                 return PTR_ERR(p);
849
850         p->fwnode.type = FWNODE_PDATA;
851         set_secondary_fwnode(dev, &p->fwnode);
852         return 0;
853 }
854 EXPORT_SYMBOL_GPL(device_add_property_set);
855
856 /**
857  * device_get_next_child_node - Return the next child node handle for a device
858  * @dev: Device to find the next child node for.
859  * @child: Handle to one of the device's child nodes or a null handle.
860  */
861 struct fwnode_handle *device_get_next_child_node(struct device *dev,
862                                                  struct fwnode_handle *child)
863 {
864         if (IS_ENABLED(CONFIG_OF) && dev->of_node) {
865                 struct device_node *node;
866
867                 node = of_get_next_available_child(dev->of_node, to_of_node(child));
868                 if (node)
869                         return &node->fwnode;
870         } else if (IS_ENABLED(CONFIG_ACPI)) {
871                 return acpi_get_next_subnode(dev, child);
872         }
873         return NULL;
874 }
875 EXPORT_SYMBOL_GPL(device_get_next_child_node);
876
877 /**
878  * fwnode_handle_put - Drop reference to a device node
879  * @fwnode: Pointer to the device node to drop the reference to.
880  *
881  * This has to be used when terminating device_for_each_child_node() iteration
882  * with break or return to prevent stale device node references from being left
883  * behind.
884  */
885 void fwnode_handle_put(struct fwnode_handle *fwnode)
886 {
887         if (is_of_node(fwnode))
888                 of_node_put(to_of_node(fwnode));
889 }
890 EXPORT_SYMBOL_GPL(fwnode_handle_put);
891
892 /**
893  * device_get_child_node_count - return the number of child nodes for device
894  * @dev: Device to cound the child nodes for
895  */
896 unsigned int device_get_child_node_count(struct device *dev)
897 {
898         struct fwnode_handle *child;
899         unsigned int count = 0;
900
901         device_for_each_child_node(dev, child)
902                 count++;
903
904         return count;
905 }
906 EXPORT_SYMBOL_GPL(device_get_child_node_count);
907
908 bool device_dma_supported(struct device *dev)
909 {
910         /* For DT, this is always supported.
911          * For ACPI, this depends on CCA, which
912          * is determined by the acpi_dma_supported().
913          */
914         if (IS_ENABLED(CONFIG_OF) && dev->of_node)
915                 return true;
916
917         return acpi_dma_supported(ACPI_COMPANION(dev));
918 }
919 EXPORT_SYMBOL_GPL(device_dma_supported);
920
921 enum dev_dma_attr device_get_dma_attr(struct device *dev)
922 {
923         enum dev_dma_attr attr = DEV_DMA_NOT_SUPPORTED;
924
925         if (IS_ENABLED(CONFIG_OF) && dev->of_node) {
926                 if (of_dma_is_coherent(dev->of_node))
927                         attr = DEV_DMA_COHERENT;
928                 else
929                         attr = DEV_DMA_NON_COHERENT;
930         } else
931                 attr = acpi_get_dma_attr(ACPI_COMPANION(dev));
932
933         return attr;
934 }
935 EXPORT_SYMBOL_GPL(device_get_dma_attr);
936
937 /**
938  * device_get_phy_mode - Get phy mode for given device
939  * @dev:        Pointer to the given device
940  *
941  * The function gets phy interface string from property 'phy-mode' or
942  * 'phy-connection-type', and return its index in phy_modes table, or errno in
943  * error case.
944  */
945 int device_get_phy_mode(struct device *dev)
946 {
947         const char *pm;
948         int err, i;
949
950         err = device_property_read_string(dev, "phy-mode", &pm);
951         if (err < 0)
952                 err = device_property_read_string(dev,
953                                                   "phy-connection-type", &pm);
954         if (err < 0)
955                 return err;
956
957         for (i = 0; i < PHY_INTERFACE_MODE_MAX; i++)
958                 if (!strcasecmp(pm, phy_modes(i)))
959                         return i;
960
961         return -ENODEV;
962 }
963 EXPORT_SYMBOL_GPL(device_get_phy_mode);
964
965 static void *device_get_mac_addr(struct device *dev,
966                                  const char *name, char *addr,
967                                  int alen)
968 {
969         int ret = device_property_read_u8_array(dev, name, addr, alen);
970
971         if (ret == 0 && alen == ETH_ALEN && is_valid_ether_addr(addr))
972                 return addr;
973         return NULL;
974 }
975
976 /**
977  * device_get_mac_address - Get the MAC for a given device
978  * @dev:        Pointer to the device
979  * @addr:       Address of buffer to store the MAC in
980  * @alen:       Length of the buffer pointed to by addr, should be ETH_ALEN
981  *
982  * Search the firmware node for the best MAC address to use.  'mac-address' is
983  * checked first, because that is supposed to contain to "most recent" MAC
984  * address. If that isn't set, then 'local-mac-address' is checked next,
985  * because that is the default address.  If that isn't set, then the obsolete
986  * 'address' is checked, just in case we're using an old device tree.
987  *
988  * Note that the 'address' property is supposed to contain a virtual address of
989  * the register set, but some DTS files have redefined that property to be the
990  * MAC address.
991  *
992  * All-zero MAC addresses are rejected, because those could be properties that
993  * exist in the firmware tables, but were not updated by the firmware.  For
994  * example, the DTS could define 'mac-address' and 'local-mac-address', with
995  * zero MAC addresses.  Some older U-Boots only initialized 'local-mac-address'.
996  * In this case, the real MAC is in 'local-mac-address', and 'mac-address'
997  * exists but is all zeros.
998 */
999 void *device_get_mac_address(struct device *dev, char *addr, int alen)
1000 {
1001         char *res;
1002
1003         res = device_get_mac_addr(dev, "mac-address", addr, alen);
1004         if (res)
1005                 return res;
1006
1007         res = device_get_mac_addr(dev, "local-mac-address", addr, alen);
1008         if (res)
1009                 return res;
1010
1011         return device_get_mac_addr(dev, "address", addr, alen);
1012 }
1013 EXPORT_SYMBOL(device_get_mac_address);