1 // SPDX-License-Identifier: GPL-2.0
3 * property.c - Unified device property interface.
5 * Copyright (C) 2014, Intel Corporation
6 * Authors: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
7 * Mika Westerberg <mika.westerberg@linux.intel.com>
10 #include <linux/acpi.h>
11 #include <linux/export.h>
12 #include <linux/kernel.h>
14 #include <linux/of_address.h>
15 #include <linux/of_graph.h>
16 #include <linux/of_irq.h>
17 #include <linux/property.h>
18 #include <linux/etherdevice.h>
19 #include <linux/phy.h>
23 struct fwnode_handle fwnode
;
24 const struct property_entry
*properties
;
27 static const struct fwnode_operations pset_fwnode_ops
;
29 static inline bool is_pset_node(const struct fwnode_handle
*fwnode
)
31 return !IS_ERR_OR_NULL(fwnode
) && fwnode
->ops
== &pset_fwnode_ops
;
34 #define to_pset_node(__fwnode) \
36 typeof(__fwnode) __to_pset_node_fwnode = __fwnode; \
38 is_pset_node(__to_pset_node_fwnode) ? \
39 container_of(__to_pset_node_fwnode, \
40 struct property_set, fwnode) : \
44 static const struct property_entry
*
45 pset_prop_get(const struct property_set
*pset
, const char *name
)
47 const struct property_entry
*prop
;
49 if (!pset
|| !pset
->properties
)
52 for (prop
= pset
->properties
; prop
->name
; prop
++)
53 if (!strcmp(name
, prop
->name
))
59 static const void *pset_prop_find(const struct property_set
*pset
,
60 const char *propname
, size_t length
)
62 const struct property_entry
*prop
;
65 prop
= pset_prop_get(pset
, propname
);
67 return ERR_PTR(-EINVAL
);
69 pointer
= prop
->pointer
.raw_data
;
71 pointer
= &prop
->value
.raw_data
;
73 return ERR_PTR(-ENODATA
);
74 if (length
> prop
->length
)
75 return ERR_PTR(-EOVERFLOW
);
79 static int pset_prop_read_u8_array(const struct property_set
*pset
,
81 u8
*values
, size_t nval
)
84 size_t length
= nval
* sizeof(*values
);
86 pointer
= pset_prop_find(pset
, propname
, length
);
88 return PTR_ERR(pointer
);
90 memcpy(values
, pointer
, length
);
94 static int pset_prop_read_u16_array(const struct property_set
*pset
,
96 u16
*values
, size_t nval
)
99 size_t length
= nval
* sizeof(*values
);
101 pointer
= pset_prop_find(pset
, propname
, length
);
103 return PTR_ERR(pointer
);
105 memcpy(values
, pointer
, length
);
109 static int pset_prop_read_u32_array(const struct property_set
*pset
,
110 const char *propname
,
111 u32
*values
, size_t nval
)
114 size_t length
= nval
* sizeof(*values
);
116 pointer
= pset_prop_find(pset
, propname
, length
);
118 return PTR_ERR(pointer
);
120 memcpy(values
, pointer
, length
);
124 static int pset_prop_read_u64_array(const struct property_set
*pset
,
125 const char *propname
,
126 u64
*values
, size_t nval
)
129 size_t length
= nval
* sizeof(*values
);
131 pointer
= pset_prop_find(pset
, propname
, length
);
133 return PTR_ERR(pointer
);
135 memcpy(values
, pointer
, length
);
139 static int pset_prop_count_elems_of_size(const struct property_set
*pset
,
140 const char *propname
, size_t length
)
142 const struct property_entry
*prop
;
144 prop
= pset_prop_get(pset
, propname
);
148 return prop
->length
/ length
;
151 static int pset_prop_read_string_array(const struct property_set
*pset
,
152 const char *propname
,
153 const char **strings
, size_t nval
)
155 const struct property_entry
*prop
;
157 size_t array_len
, length
;
159 /* Find out the array length. */
160 prop
= pset_prop_get(pset
, propname
);
165 /* The array length for a non-array string property is 1. */
168 /* Find the length of an array. */
169 array_len
= pset_prop_count_elems_of_size(pset
, propname
,
170 sizeof(const char *));
172 /* Return how many there are if strings is NULL. */
176 array_len
= min(nval
, array_len
);
177 length
= array_len
* sizeof(*strings
);
179 pointer
= pset_prop_find(pset
, propname
, length
);
181 return PTR_ERR(pointer
);
183 memcpy(strings
, pointer
, length
);
188 struct fwnode_handle
*dev_fwnode(struct device
*dev
)
190 return IS_ENABLED(CONFIG_OF
) && dev
->of_node
?
191 &dev
->of_node
->fwnode
: dev
->fwnode
;
193 EXPORT_SYMBOL_GPL(dev_fwnode
);
195 static bool pset_fwnode_property_present(const struct fwnode_handle
*fwnode
,
196 const char *propname
)
198 return !!pset_prop_get(to_pset_node(fwnode
), propname
);
201 static int pset_fwnode_read_int_array(const struct fwnode_handle
*fwnode
,
202 const char *propname
,
203 unsigned int elem_size
, void *val
,
206 const struct property_set
*node
= to_pset_node(fwnode
);
209 return pset_prop_count_elems_of_size(node
, propname
, elem_size
);
213 return pset_prop_read_u8_array(node
, propname
, val
, nval
);
215 return pset_prop_read_u16_array(node
, propname
, val
, nval
);
217 return pset_prop_read_u32_array(node
, propname
, val
, nval
);
219 return pset_prop_read_u64_array(node
, propname
, val
, nval
);
226 pset_fwnode_property_read_string_array(const struct fwnode_handle
*fwnode
,
227 const char *propname
,
228 const char **val
, size_t nval
)
230 return pset_prop_read_string_array(to_pset_node(fwnode
), propname
,
234 static const struct fwnode_operations pset_fwnode_ops
= {
235 .property_present
= pset_fwnode_property_present
,
236 .property_read_int_array
= pset_fwnode_read_int_array
,
237 .property_read_string_array
= pset_fwnode_property_read_string_array
,
241 * device_property_present - check if a property of a device is present
242 * @dev: Device whose property is being checked
243 * @propname: Name of the property
245 * Check if property @propname is present in the device firmware description.
247 bool device_property_present(struct device
*dev
, const char *propname
)
249 return fwnode_property_present(dev_fwnode(dev
), propname
);
251 EXPORT_SYMBOL_GPL(device_property_present
);
254 * fwnode_property_present - check if a property of a firmware node is present
255 * @fwnode: Firmware node whose property to check
256 * @propname: Name of the property
258 bool fwnode_property_present(const struct fwnode_handle
*fwnode
,
259 const char *propname
)
263 ret
= fwnode_call_bool_op(fwnode
, property_present
, propname
);
264 if (ret
== false && !IS_ERR_OR_NULL(fwnode
) &&
265 !IS_ERR_OR_NULL(fwnode
->secondary
))
266 ret
= fwnode_call_bool_op(fwnode
->secondary
, property_present
,
270 EXPORT_SYMBOL_GPL(fwnode_property_present
);
273 * device_property_read_u8_array - return a u8 array property of a device
274 * @dev: Device to get the property of
275 * @propname: Name of the property
276 * @val: The values are stored here or %NULL to return the number of values
277 * @nval: Size of the @val array
279 * Function reads an array of u8 properties with @propname from the device
280 * firmware description and stores them to @val if found.
282 * Return: number of values if @val was %NULL,
283 * %0 if the property was found (success),
284 * %-EINVAL if given arguments are not valid,
285 * %-ENODATA if the property does not have a value,
286 * %-EPROTO if the property is not an array of numbers,
287 * %-EOVERFLOW if the size of the property is not as expected.
288 * %-ENXIO if no suitable firmware interface is present.
290 int device_property_read_u8_array(struct device
*dev
, const char *propname
,
291 u8
*val
, size_t nval
)
293 return fwnode_property_read_u8_array(dev_fwnode(dev
), propname
, val
, nval
);
295 EXPORT_SYMBOL_GPL(device_property_read_u8_array
);
298 * device_property_read_u16_array - return a u16 array property of a device
299 * @dev: Device to get the property of
300 * @propname: Name of the property
301 * @val: The values are stored here or %NULL to return the number of values
302 * @nval: Size of the @val array
304 * Function reads an array of u16 properties with @propname from the device
305 * firmware description and stores them to @val if found.
307 * Return: number of values if @val was %NULL,
308 * %0 if the property was found (success),
309 * %-EINVAL if given arguments are not valid,
310 * %-ENODATA if the property does not have a value,
311 * %-EPROTO if the property is not an array of numbers,
312 * %-EOVERFLOW if the size of the property is not as expected.
313 * %-ENXIO if no suitable firmware interface is present.
315 int device_property_read_u16_array(struct device
*dev
, const char *propname
,
316 u16
*val
, size_t nval
)
318 return fwnode_property_read_u16_array(dev_fwnode(dev
), propname
, val
, nval
);
320 EXPORT_SYMBOL_GPL(device_property_read_u16_array
);
323 * device_property_read_u32_array - return a u32 array property of a device
324 * @dev: Device to get the property of
325 * @propname: Name of the property
326 * @val: The values are stored here or %NULL to return the number of values
327 * @nval: Size of the @val array
329 * Function reads an array of u32 properties with @propname from the device
330 * firmware description and stores them to @val if found.
332 * Return: number of values if @val was %NULL,
333 * %0 if the property was found (success),
334 * %-EINVAL if given arguments are not valid,
335 * %-ENODATA if the property does not have a value,
336 * %-EPROTO if the property is not an array of numbers,
337 * %-EOVERFLOW if the size of the property is not as expected.
338 * %-ENXIO if no suitable firmware interface is present.
340 int device_property_read_u32_array(struct device
*dev
, const char *propname
,
341 u32
*val
, size_t nval
)
343 return fwnode_property_read_u32_array(dev_fwnode(dev
), propname
, val
, nval
);
345 EXPORT_SYMBOL_GPL(device_property_read_u32_array
);
348 * device_property_read_u64_array - return a u64 array property of a device
349 * @dev: Device to get the property of
350 * @propname: Name of the property
351 * @val: The values are stored here or %NULL to return the number of values
352 * @nval: Size of the @val array
354 * Function reads an array of u64 properties with @propname from the device
355 * firmware description and stores them to @val if found.
357 * Return: number of values if @val was %NULL,
358 * %0 if the property was found (success),
359 * %-EINVAL if given arguments are not valid,
360 * %-ENODATA if the property does not have a value,
361 * %-EPROTO if the property is not an array of numbers,
362 * %-EOVERFLOW if the size of the property is not as expected.
363 * %-ENXIO if no suitable firmware interface is present.
365 int device_property_read_u64_array(struct device
*dev
, const char *propname
,
366 u64
*val
, size_t nval
)
368 return fwnode_property_read_u64_array(dev_fwnode(dev
), propname
, val
, nval
);
370 EXPORT_SYMBOL_GPL(device_property_read_u64_array
);
373 * device_property_read_string_array - return a string array property of device
374 * @dev: Device to get the property of
375 * @propname: Name of the property
376 * @val: The values are stored here or %NULL to return the number of values
377 * @nval: Size of the @val array
379 * Function reads an array of string properties with @propname from the device
380 * firmware description and stores them to @val if found.
382 * Return: number of values read on success if @val is non-NULL,
383 * number of values available on success if @val is NULL,
384 * %-EINVAL if given arguments are not valid,
385 * %-ENODATA if the property does not have a value,
386 * %-EPROTO or %-EILSEQ if the property is not an array of strings,
387 * %-EOVERFLOW if the size of the property is not as expected.
388 * %-ENXIO if no suitable firmware interface is present.
390 int device_property_read_string_array(struct device
*dev
, const char *propname
,
391 const char **val
, size_t nval
)
393 return fwnode_property_read_string_array(dev_fwnode(dev
), propname
, val
, nval
);
395 EXPORT_SYMBOL_GPL(device_property_read_string_array
);
398 * device_property_read_string - return a string property of a device
399 * @dev: Device to get the property of
400 * @propname: Name of the property
401 * @val: The value is stored here
403 * Function reads property @propname from the device firmware description and
404 * stores the value into @val if found. The value is checked to be a string.
406 * Return: %0 if the property was found (success),
407 * %-EINVAL if given arguments are not valid,
408 * %-ENODATA if the property does not have a value,
409 * %-EPROTO or %-EILSEQ if the property type is not a string.
410 * %-ENXIO if no suitable firmware interface is present.
412 int device_property_read_string(struct device
*dev
, const char *propname
,
415 return fwnode_property_read_string(dev_fwnode(dev
), propname
, val
);
417 EXPORT_SYMBOL_GPL(device_property_read_string
);
420 * device_property_match_string - find a string in an array and return index
421 * @dev: Device to get the property of
422 * @propname: Name of the property holding the array
423 * @string: String to look for
425 * Find a given string in a string array and if it is found return the
428 * Return: %0 if the property was found (success),
429 * %-EINVAL if given arguments are not valid,
430 * %-ENODATA if the property does not have a value,
431 * %-EPROTO if the property is not an array of strings,
432 * %-ENXIO if no suitable firmware interface is present.
434 int device_property_match_string(struct device
*dev
, const char *propname
,
437 return fwnode_property_match_string(dev_fwnode(dev
), propname
, string
);
439 EXPORT_SYMBOL_GPL(device_property_match_string
);
441 static int fwnode_property_read_int_array(const struct fwnode_handle
*fwnode
,
442 const char *propname
,
443 unsigned int elem_size
, void *val
,
448 ret
= fwnode_call_int_op(fwnode
, property_read_int_array
, propname
,
449 elem_size
, val
, nval
);
450 if (ret
== -EINVAL
&& !IS_ERR_OR_NULL(fwnode
) &&
451 !IS_ERR_OR_NULL(fwnode
->secondary
))
452 ret
= fwnode_call_int_op(
453 fwnode
->secondary
, property_read_int_array
, propname
,
454 elem_size
, val
, nval
);
460 * fwnode_property_read_u8_array - return a u8 array property of firmware node
461 * @fwnode: Firmware node to get the property of
462 * @propname: Name of the property
463 * @val: The values are stored here or %NULL to return the number of values
464 * @nval: Size of the @val array
466 * Read an array of u8 properties with @propname from @fwnode and stores them to
469 * Return: number of values if @val was %NULL,
470 * %0 if the property was found (success),
471 * %-EINVAL if given arguments are not valid,
472 * %-ENODATA if the property does not have a value,
473 * %-EPROTO if the property is not an array of numbers,
474 * %-EOVERFLOW if the size of the property is not as expected,
475 * %-ENXIO if no suitable firmware interface is present.
477 int fwnode_property_read_u8_array(const struct fwnode_handle
*fwnode
,
478 const char *propname
, u8
*val
, size_t nval
)
480 return fwnode_property_read_int_array(fwnode
, propname
, sizeof(u8
),
483 EXPORT_SYMBOL_GPL(fwnode_property_read_u8_array
);
486 * fwnode_property_read_u16_array - return a u16 array property of firmware node
487 * @fwnode: Firmware node to get the property of
488 * @propname: Name of the property
489 * @val: The values are stored here or %NULL to return the number of values
490 * @nval: Size of the @val array
492 * Read an array of u16 properties with @propname from @fwnode and store them to
495 * Return: number of values if @val was %NULL,
496 * %0 if the property was found (success),
497 * %-EINVAL if given arguments are not valid,
498 * %-ENODATA if the property does not have a value,
499 * %-EPROTO if the property is not an array of numbers,
500 * %-EOVERFLOW if the size of the property is not as expected,
501 * %-ENXIO if no suitable firmware interface is present.
503 int fwnode_property_read_u16_array(const struct fwnode_handle
*fwnode
,
504 const char *propname
, u16
*val
, size_t nval
)
506 return fwnode_property_read_int_array(fwnode
, propname
, sizeof(u16
),
509 EXPORT_SYMBOL_GPL(fwnode_property_read_u16_array
);
512 * fwnode_property_read_u32_array - return a u32 array property of firmware node
513 * @fwnode: Firmware node to get the property of
514 * @propname: Name of the property
515 * @val: The values are stored here or %NULL to return the number of values
516 * @nval: Size of the @val array
518 * Read an array of u32 properties with @propname from @fwnode store them to
521 * Return: number of values if @val was %NULL,
522 * %0 if the property was found (success),
523 * %-EINVAL if given arguments are not valid,
524 * %-ENODATA if the property does not have a value,
525 * %-EPROTO if the property is not an array of numbers,
526 * %-EOVERFLOW if the size of the property is not as expected,
527 * %-ENXIO if no suitable firmware interface is present.
529 int fwnode_property_read_u32_array(const struct fwnode_handle
*fwnode
,
530 const char *propname
, u32
*val
, size_t nval
)
532 return fwnode_property_read_int_array(fwnode
, propname
, sizeof(u32
),
535 EXPORT_SYMBOL_GPL(fwnode_property_read_u32_array
);
538 * fwnode_property_read_u64_array - return a u64 array property firmware node
539 * @fwnode: Firmware node to get the property of
540 * @propname: Name of the property
541 * @val: The values are stored here or %NULL to return the number of values
542 * @nval: Size of the @val array
544 * Read an array of u64 properties with @propname from @fwnode and store them to
547 * Return: number of values if @val was %NULL,
548 * %0 if the property was found (success),
549 * %-EINVAL if given arguments are not valid,
550 * %-ENODATA if the property does not have a value,
551 * %-EPROTO if the property is not an array of numbers,
552 * %-EOVERFLOW if the size of the property is not as expected,
553 * %-ENXIO if no suitable firmware interface is present.
555 int fwnode_property_read_u64_array(const struct fwnode_handle
*fwnode
,
556 const char *propname
, u64
*val
, size_t nval
)
558 return fwnode_property_read_int_array(fwnode
, propname
, sizeof(u64
),
561 EXPORT_SYMBOL_GPL(fwnode_property_read_u64_array
);
564 * fwnode_property_read_string_array - return string array property of a node
565 * @fwnode: Firmware node to get the property of
566 * @propname: Name of the property
567 * @val: The values are stored here or %NULL to return the number of values
568 * @nval: Size of the @val array
570 * Read an string list property @propname from the given firmware node and store
571 * them to @val if found.
573 * Return: number of values read on success if @val is non-NULL,
574 * number of values available on success if @val is NULL,
575 * %-EINVAL if given arguments are not valid,
576 * %-ENODATA if the property does not have a value,
577 * %-EPROTO or %-EILSEQ if the property is not an array of strings,
578 * %-EOVERFLOW if the size of the property is not as expected,
579 * %-ENXIO if no suitable firmware interface is present.
581 int fwnode_property_read_string_array(const struct fwnode_handle
*fwnode
,
582 const char *propname
, const char **val
,
587 ret
= fwnode_call_int_op(fwnode
, property_read_string_array
, propname
,
589 if (ret
== -EINVAL
&& !IS_ERR_OR_NULL(fwnode
) &&
590 !IS_ERR_OR_NULL(fwnode
->secondary
))
591 ret
= fwnode_call_int_op(fwnode
->secondary
,
592 property_read_string_array
, propname
,
596 EXPORT_SYMBOL_GPL(fwnode_property_read_string_array
);
599 * fwnode_property_read_string - return a string property of a firmware node
600 * @fwnode: Firmware node to get the property of
601 * @propname: Name of the property
602 * @val: The value is stored here
604 * Read property @propname from the given firmware node and store the value into
605 * @val if found. The value is checked to be a string.
607 * Return: %0 if the property was found (success),
608 * %-EINVAL if given arguments are not valid,
609 * %-ENODATA if the property does not have a value,
610 * %-EPROTO or %-EILSEQ if the property is not a string,
611 * %-ENXIO if no suitable firmware interface is present.
613 int fwnode_property_read_string(const struct fwnode_handle
*fwnode
,
614 const char *propname
, const char **val
)
616 int ret
= fwnode_property_read_string_array(fwnode
, propname
, val
, 1);
618 return ret
< 0 ? ret
: 0;
620 EXPORT_SYMBOL_GPL(fwnode_property_read_string
);
623 * fwnode_property_match_string - find a string in an array and return index
624 * @fwnode: Firmware node to get the property of
625 * @propname: Name of the property holding the array
626 * @string: String to look for
628 * Find a given string in a string array and if it is found return the
631 * Return: %0 if the property was found (success),
632 * %-EINVAL if given arguments are not valid,
633 * %-ENODATA if the property does not have a value,
634 * %-EPROTO if the property is not an array of strings,
635 * %-ENXIO if no suitable firmware interface is present.
637 int fwnode_property_match_string(const struct fwnode_handle
*fwnode
,
638 const char *propname
, const char *string
)
643 nval
= fwnode_property_read_string_array(fwnode
, propname
, NULL
, 0);
650 values
= kcalloc(nval
, sizeof(*values
), GFP_KERNEL
);
654 ret
= fwnode_property_read_string_array(fwnode
, propname
, values
, nval
);
658 ret
= match_string(values
, nval
, string
);
665 EXPORT_SYMBOL_GPL(fwnode_property_match_string
);
668 * fwnode_property_get_reference_args() - Find a reference with arguments
669 * @fwnode: Firmware node where to look for the reference
670 * @prop: The name of the property
671 * @nargs_prop: The name of the property telling the number of
672 * arguments in the referred node. NULL if @nargs is known,
673 * otherwise @nargs is ignored. Only relevant on OF.
674 * @nargs: Number of arguments. Ignored if @nargs_prop is non-NULL.
675 * @index: Index of the reference, from zero onwards.
676 * @args: Result structure with reference and integer arguments.
678 * Obtain a reference based on a named property in an fwnode, with
681 * Caller is responsible to call fwnode_handle_put() on the returned
682 * args->fwnode pointer.
684 * Returns: %0 on success
685 * %-ENOENT when the index is out of bounds, the index has an empty
686 * reference or the property was not found
687 * %-EINVAL on parse error
689 int fwnode_property_get_reference_args(const struct fwnode_handle
*fwnode
,
690 const char *prop
, const char *nargs_prop
,
691 unsigned int nargs
, unsigned int index
,
692 struct fwnode_reference_args
*args
)
694 return fwnode_call_int_op(fwnode
, get_reference_args
, prop
, nargs_prop
,
697 EXPORT_SYMBOL_GPL(fwnode_property_get_reference_args
);
699 static void property_entry_free_data(const struct property_entry
*p
)
704 if (p
->is_string
&& p
->pointer
.str
) {
705 nval
= p
->length
/ sizeof(const char *);
706 for (i
= 0; i
< nval
; i
++)
707 kfree(p
->pointer
.str
[i
]);
709 kfree(p
->pointer
.raw_data
);
710 } else if (p
->is_string
) {
716 static int property_copy_string_array(struct property_entry
*dst
,
717 const struct property_entry
*src
)
720 size_t nval
= src
->length
/ sizeof(*d
);
723 d
= kcalloc(nval
, sizeof(*d
), GFP_KERNEL
);
727 for (i
= 0; i
< nval
; i
++) {
728 d
[i
] = kstrdup(src
->pointer
.str
[i
], GFP_KERNEL
);
729 if (!d
[i
] && src
->pointer
.str
[i
]) {
737 dst
->pointer
.raw_data
= d
;
741 static int property_entry_copy_data(struct property_entry
*dst
,
742 const struct property_entry
*src
)
750 if (src
->is_string
) {
751 error
= property_copy_string_array(dst
, src
);
755 dst
->pointer
.raw_data
= kmemdup(src
->pointer
.raw_data
,
756 src
->length
, GFP_KERNEL
);
757 if (!dst
->pointer
.raw_data
)
760 } else if (src
->is_string
) {
761 dst
->value
.str
= kstrdup(src
->value
.str
, GFP_KERNEL
);
762 if (!dst
->value
.str
&& src
->value
.str
)
765 dst
->value
.raw_data
= src
->value
.raw_data
;
768 dst
->length
= src
->length
;
769 dst
->is_array
= src
->is_array
;
770 dst
->is_string
= src
->is_string
;
772 dst
->name
= kstrdup(src
->name
, GFP_KERNEL
);
779 property_entry_free_data(dst
);
784 * property_entries_dup - duplicate array of properties
785 * @properties: array of properties to copy
787 * This function creates a deep copy of the given NULL-terminated array
788 * of property entries.
790 struct property_entry
*
791 property_entries_dup(const struct property_entry
*properties
)
793 struct property_entry
*p
;
796 while (properties
[n
].name
)
799 p
= kcalloc(n
+ 1, sizeof(*p
), GFP_KERNEL
);
801 return ERR_PTR(-ENOMEM
);
803 for (i
= 0; i
< n
; i
++) {
804 int ret
= property_entry_copy_data(&p
[i
], &properties
[i
]);
807 property_entry_free_data(&p
[i
]);
815 EXPORT_SYMBOL_GPL(property_entries_dup
);
818 * property_entries_free - free previously allocated array of properties
819 * @properties: array of properties to destroy
821 * This function frees given NULL-terminated array of property entries,
822 * along with their data.
824 void property_entries_free(const struct property_entry
*properties
)
826 const struct property_entry
*p
;
828 for (p
= properties
; p
->name
; p
++)
829 property_entry_free_data(p
);
833 EXPORT_SYMBOL_GPL(property_entries_free
);
836 * pset_free_set - releases memory allocated for copied property set
837 * @pset: Property set to release
839 * Function takes previously copied property set and releases all the
840 * memory allocated to it.
842 static void pset_free_set(struct property_set
*pset
)
847 property_entries_free(pset
->properties
);
852 * pset_copy_set - copies property set
853 * @pset: Property set to copy
855 * This function takes a deep copy of the given property set and returns
856 * pointer to the copy. Call device_free_property_set() to free resources
857 * allocated in this function.
859 * Return: Pointer to the new property set or error pointer.
861 static struct property_set
*pset_copy_set(const struct property_set
*pset
)
863 struct property_entry
*properties
;
864 struct property_set
*p
;
866 p
= kzalloc(sizeof(*p
), GFP_KERNEL
);
868 return ERR_PTR(-ENOMEM
);
870 properties
= property_entries_dup(pset
->properties
);
871 if (IS_ERR(properties
)) {
873 return ERR_CAST(properties
);
876 p
->properties
= properties
;
881 * device_remove_properties - Remove properties from a device object.
882 * @dev: Device whose properties to remove.
884 * The function removes properties previously associated to the device
885 * secondary firmware node with device_add_properties(). Memory allocated
886 * to the properties will also be released.
888 void device_remove_properties(struct device
*dev
)
890 struct fwnode_handle
*fwnode
;
891 struct property_set
*pset
;
893 fwnode
= dev_fwnode(dev
);
897 * Pick either primary or secondary node depending which one holds
898 * the pset. If there is no real firmware node (ACPI/DT) primary
899 * will hold the pset.
901 pset
= to_pset_node(fwnode
);
903 set_primary_fwnode(dev
, NULL
);
905 pset
= to_pset_node(fwnode
->secondary
);
906 if (pset
&& dev
== pset
->dev
)
907 set_secondary_fwnode(dev
, NULL
);
909 if (pset
&& dev
== pset
->dev
)
912 EXPORT_SYMBOL_GPL(device_remove_properties
);
915 * device_add_properties - Add a collection of properties to a device object.
916 * @dev: Device to add properties to.
917 * @properties: Collection of properties to add.
919 * Associate a collection of device properties represented by @properties with
920 * @dev as its secondary firmware node. The function takes a copy of
923 int device_add_properties(struct device
*dev
,
924 const struct property_entry
*properties
)
926 struct property_set
*p
, pset
;
931 pset
.properties
= properties
;
933 p
= pset_copy_set(&pset
);
937 p
->fwnode
.ops
= &pset_fwnode_ops
;
938 set_secondary_fwnode(dev
, &p
->fwnode
);
942 EXPORT_SYMBOL_GPL(device_add_properties
);
945 * fwnode_get_next_parent - Iterate to the node's parent
946 * @fwnode: Firmware whose parent is retrieved
948 * This is like fwnode_get_parent() except that it drops the refcount
949 * on the passed node, making it suitable for iterating through a
952 * Returns a node pointer with refcount incremented, use
953 * fwnode_handle_node() on it when done.
955 struct fwnode_handle
*fwnode_get_next_parent(struct fwnode_handle
*fwnode
)
957 struct fwnode_handle
*parent
= fwnode_get_parent(fwnode
);
959 fwnode_handle_put(fwnode
);
963 EXPORT_SYMBOL_GPL(fwnode_get_next_parent
);
966 * fwnode_get_parent - Return parent firwmare node
967 * @fwnode: Firmware whose parent is retrieved
969 * Return parent firmware node of the given node if possible or %NULL if no
970 * parent was available.
972 struct fwnode_handle
*fwnode_get_parent(const struct fwnode_handle
*fwnode
)
974 return fwnode_call_ptr_op(fwnode
, get_parent
);
976 EXPORT_SYMBOL_GPL(fwnode_get_parent
);
979 * fwnode_get_next_child_node - Return the next child node handle for a node
980 * @fwnode: Firmware node to find the next child node for.
981 * @child: Handle to one of the node's child nodes or a %NULL handle.
983 struct fwnode_handle
*
984 fwnode_get_next_child_node(const struct fwnode_handle
*fwnode
,
985 struct fwnode_handle
*child
)
987 return fwnode_call_ptr_op(fwnode
, get_next_child_node
, child
);
989 EXPORT_SYMBOL_GPL(fwnode_get_next_child_node
);
992 * fwnode_get_next_available_child_node - Return the next
993 * available child node handle for a node
994 * @fwnode: Firmware node to find the next child node for.
995 * @child: Handle to one of the node's child nodes or a %NULL handle.
997 struct fwnode_handle
*
998 fwnode_get_next_available_child_node(const struct fwnode_handle
*fwnode
,
999 struct fwnode_handle
*child
)
1001 struct fwnode_handle
*next_child
= child
;
1007 next_child
= fwnode_get_next_child_node(fwnode
, next_child
);
1009 if (!next_child
|| fwnode_device_is_available(next_child
))
1011 } while (next_child
);
1015 EXPORT_SYMBOL_GPL(fwnode_get_next_available_child_node
);
1018 * device_get_next_child_node - Return the next child node handle for a device
1019 * @dev: Device to find the next child node for.
1020 * @child: Handle to one of the device's child nodes or a null handle.
1022 struct fwnode_handle
*device_get_next_child_node(struct device
*dev
,
1023 struct fwnode_handle
*child
)
1025 struct acpi_device
*adev
= ACPI_COMPANION(dev
);
1026 struct fwnode_handle
*fwnode
= NULL
;
1029 fwnode
= &dev
->of_node
->fwnode
;
1031 fwnode
= acpi_fwnode_handle(adev
);
1033 return fwnode_get_next_child_node(fwnode
, child
);
1035 EXPORT_SYMBOL_GPL(device_get_next_child_node
);
1038 * fwnode_get_named_child_node - Return first matching named child node handle
1039 * @fwnode: Firmware node to find the named child node for.
1040 * @childname: String to match child node name against.
1042 struct fwnode_handle
*
1043 fwnode_get_named_child_node(const struct fwnode_handle
*fwnode
,
1044 const char *childname
)
1046 return fwnode_call_ptr_op(fwnode
, get_named_child_node
, childname
);
1048 EXPORT_SYMBOL_GPL(fwnode_get_named_child_node
);
1051 * device_get_named_child_node - Return first matching named child node handle
1052 * @dev: Device to find the named child node for.
1053 * @childname: String to match child node name against.
1055 struct fwnode_handle
*device_get_named_child_node(struct device
*dev
,
1056 const char *childname
)
1058 return fwnode_get_named_child_node(dev_fwnode(dev
), childname
);
1060 EXPORT_SYMBOL_GPL(device_get_named_child_node
);
1063 * fwnode_handle_get - Obtain a reference to a device node
1064 * @fwnode: Pointer to the device node to obtain the reference to.
1066 * Returns the fwnode handle.
1068 struct fwnode_handle
*fwnode_handle_get(struct fwnode_handle
*fwnode
)
1070 if (!fwnode_has_op(fwnode
, get
))
1073 return fwnode_call_ptr_op(fwnode
, get
);
1075 EXPORT_SYMBOL_GPL(fwnode_handle_get
);
1078 * fwnode_handle_put - Drop reference to a device node
1079 * @fwnode: Pointer to the device node to drop the reference to.
1081 * This has to be used when terminating device_for_each_child_node() iteration
1082 * with break or return to prevent stale device node references from being left
1085 void fwnode_handle_put(struct fwnode_handle
*fwnode
)
1087 fwnode_call_void_op(fwnode
, put
);
1089 EXPORT_SYMBOL_GPL(fwnode_handle_put
);
1092 * fwnode_device_is_available - check if a device is available for use
1093 * @fwnode: Pointer to the fwnode of the device.
1095 bool fwnode_device_is_available(const struct fwnode_handle
*fwnode
)
1097 return fwnode_call_bool_op(fwnode
, device_is_available
);
1099 EXPORT_SYMBOL_GPL(fwnode_device_is_available
);
1102 * device_get_child_node_count - return the number of child nodes for device
1103 * @dev: Device to cound the child nodes for
1105 unsigned int device_get_child_node_count(struct device
*dev
)
1107 struct fwnode_handle
*child
;
1108 unsigned int count
= 0;
1110 device_for_each_child_node(dev
, child
)
1115 EXPORT_SYMBOL_GPL(device_get_child_node_count
);
1117 bool device_dma_supported(struct device
*dev
)
1119 /* For DT, this is always supported.
1120 * For ACPI, this depends on CCA, which
1121 * is determined by the acpi_dma_supported().
1123 if (IS_ENABLED(CONFIG_OF
) && dev
->of_node
)
1126 return acpi_dma_supported(ACPI_COMPANION(dev
));
1128 EXPORT_SYMBOL_GPL(device_dma_supported
);
1130 enum dev_dma_attr
device_get_dma_attr(struct device
*dev
)
1132 enum dev_dma_attr attr
= DEV_DMA_NOT_SUPPORTED
;
1134 if (IS_ENABLED(CONFIG_OF
) && dev
->of_node
) {
1135 if (of_dma_is_coherent(dev
->of_node
))
1136 attr
= DEV_DMA_COHERENT
;
1138 attr
= DEV_DMA_NON_COHERENT
;
1140 attr
= acpi_get_dma_attr(ACPI_COMPANION(dev
));
1144 EXPORT_SYMBOL_GPL(device_get_dma_attr
);
1147 * fwnode_get_phy_mode - Get phy mode for given firmware node
1148 * @fwnode: Pointer to the given node
1150 * The function gets phy interface string from property 'phy-mode' or
1151 * 'phy-connection-type', and return its index in phy_modes table, or errno in
1154 int fwnode_get_phy_mode(struct fwnode_handle
*fwnode
)
1159 err
= fwnode_property_read_string(fwnode
, "phy-mode", &pm
);
1161 err
= fwnode_property_read_string(fwnode
,
1162 "phy-connection-type", &pm
);
1166 for (i
= 0; i
< PHY_INTERFACE_MODE_MAX
; i
++)
1167 if (!strcasecmp(pm
, phy_modes(i
)))
1172 EXPORT_SYMBOL_GPL(fwnode_get_phy_mode
);
1175 * device_get_phy_mode - Get phy mode for given device
1176 * @dev: Pointer to the given device
1178 * The function gets phy interface string from property 'phy-mode' or
1179 * 'phy-connection-type', and return its index in phy_modes table, or errno in
1182 int device_get_phy_mode(struct device
*dev
)
1184 return fwnode_get_phy_mode(dev_fwnode(dev
));
1186 EXPORT_SYMBOL_GPL(device_get_phy_mode
);
1188 static void *fwnode_get_mac_addr(struct fwnode_handle
*fwnode
,
1189 const char *name
, char *addr
,
1192 int ret
= fwnode_property_read_u8_array(fwnode
, name
, addr
, alen
);
1194 if (ret
== 0 && alen
== ETH_ALEN
&& is_valid_ether_addr(addr
))
1200 * fwnode_get_mac_address - Get the MAC from the firmware node
1201 * @fwnode: Pointer to the firmware node
1202 * @addr: Address of buffer to store the MAC in
1203 * @alen: Length of the buffer pointed to by addr, should be ETH_ALEN
1205 * Search the firmware node for the best MAC address to use. 'mac-address' is
1206 * checked first, because that is supposed to contain to "most recent" MAC
1207 * address. If that isn't set, then 'local-mac-address' is checked next,
1208 * because that is the default address. If that isn't set, then the obsolete
1209 * 'address' is checked, just in case we're using an old device tree.
1211 * Note that the 'address' property is supposed to contain a virtual address of
1212 * the register set, but some DTS files have redefined that property to be the
1215 * All-zero MAC addresses are rejected, because those could be properties that
1216 * exist in the firmware tables, but were not updated by the firmware. For
1217 * example, the DTS could define 'mac-address' and 'local-mac-address', with
1218 * zero MAC addresses. Some older U-Boots only initialized 'local-mac-address'.
1219 * In this case, the real MAC is in 'local-mac-address', and 'mac-address'
1220 * exists but is all zeros.
1222 void *fwnode_get_mac_address(struct fwnode_handle
*fwnode
, char *addr
, int alen
)
1226 res
= fwnode_get_mac_addr(fwnode
, "mac-address", addr
, alen
);
1230 res
= fwnode_get_mac_addr(fwnode
, "local-mac-address", addr
, alen
);
1234 return fwnode_get_mac_addr(fwnode
, "address", addr
, alen
);
1236 EXPORT_SYMBOL(fwnode_get_mac_address
);
1239 * device_get_mac_address - Get the MAC for a given device
1240 * @dev: Pointer to the device
1241 * @addr: Address of buffer to store the MAC in
1242 * @alen: Length of the buffer pointed to by addr, should be ETH_ALEN
1244 void *device_get_mac_address(struct device
*dev
, char *addr
, int alen
)
1246 return fwnode_get_mac_address(dev_fwnode(dev
), addr
, alen
);
1248 EXPORT_SYMBOL(device_get_mac_address
);
1251 * fwnode_irq_get - Get IRQ directly from a fwnode
1252 * @fwnode: Pointer to the firmware node
1253 * @index: Zero-based index of the IRQ
1255 * Returns Linux IRQ number on success. Other values are determined
1256 * accordingly to acpi_/of_ irq_get() operation.
1258 int fwnode_irq_get(struct fwnode_handle
*fwnode
, unsigned int index
)
1260 struct device_node
*of_node
= to_of_node(fwnode
);
1261 struct resource res
;
1264 if (IS_ENABLED(CONFIG_OF
) && of_node
)
1265 return of_irq_get(of_node
, index
);
1267 ret
= acpi_irq_get(ACPI_HANDLE_FWNODE(fwnode
), index
, &res
);
1273 EXPORT_SYMBOL(fwnode_irq_get
);
1276 * device_graph_get_next_endpoint - Get next endpoint firmware node
1277 * @fwnode: Pointer to the parent firmware node
1278 * @prev: Previous endpoint node or %NULL to get the first
1280 * Returns an endpoint firmware node pointer or %NULL if no more endpoints
1283 struct fwnode_handle
*
1284 fwnode_graph_get_next_endpoint(const struct fwnode_handle
*fwnode
,
1285 struct fwnode_handle
*prev
)
1287 return fwnode_call_ptr_op(fwnode
, graph_get_next_endpoint
, prev
);
1289 EXPORT_SYMBOL_GPL(fwnode_graph_get_next_endpoint
);
1292 * fwnode_graph_get_port_parent - Return the device fwnode of a port endpoint
1293 * @endpoint: Endpoint firmware node of the port
1295 * Return: the firmware node of the device the @endpoint belongs to.
1297 struct fwnode_handle
*
1298 fwnode_graph_get_port_parent(const struct fwnode_handle
*endpoint
)
1300 struct fwnode_handle
*port
, *parent
;
1302 port
= fwnode_get_parent(endpoint
);
1303 parent
= fwnode_call_ptr_op(port
, graph_get_port_parent
);
1305 fwnode_handle_put(port
);
1309 EXPORT_SYMBOL_GPL(fwnode_graph_get_port_parent
);
1312 * fwnode_graph_get_remote_port_parent - Return fwnode of a remote device
1313 * @fwnode: Endpoint firmware node pointing to the remote endpoint
1315 * Extracts firmware node of a remote device the @fwnode points to.
1317 struct fwnode_handle
*
1318 fwnode_graph_get_remote_port_parent(const struct fwnode_handle
*fwnode
)
1320 struct fwnode_handle
*endpoint
, *parent
;
1322 endpoint
= fwnode_graph_get_remote_endpoint(fwnode
);
1323 parent
= fwnode_graph_get_port_parent(endpoint
);
1325 fwnode_handle_put(endpoint
);
1329 EXPORT_SYMBOL_GPL(fwnode_graph_get_remote_port_parent
);
1332 * fwnode_graph_get_remote_port - Return fwnode of a remote port
1333 * @fwnode: Endpoint firmware node pointing to the remote endpoint
1335 * Extracts firmware node of a remote port the @fwnode points to.
1337 struct fwnode_handle
*
1338 fwnode_graph_get_remote_port(const struct fwnode_handle
*fwnode
)
1340 return fwnode_get_next_parent(fwnode_graph_get_remote_endpoint(fwnode
));
1342 EXPORT_SYMBOL_GPL(fwnode_graph_get_remote_port
);
1345 * fwnode_graph_get_remote_endpoint - Return fwnode of a remote endpoint
1346 * @fwnode: Endpoint firmware node pointing to the remote endpoint
1348 * Extracts firmware node of a remote endpoint the @fwnode points to.
1350 struct fwnode_handle
*
1351 fwnode_graph_get_remote_endpoint(const struct fwnode_handle
*fwnode
)
1353 return fwnode_call_ptr_op(fwnode
, graph_get_remote_endpoint
);
1355 EXPORT_SYMBOL_GPL(fwnode_graph_get_remote_endpoint
);
1358 * fwnode_graph_get_remote_node - get remote parent node for given port/endpoint
1359 * @fwnode: pointer to parent fwnode_handle containing graph port/endpoint
1360 * @port_id: identifier of the parent port node
1361 * @endpoint_id: identifier of the endpoint node
1363 * Return: Remote fwnode handle associated with remote endpoint node linked
1364 * to @node. Use fwnode_node_put() on it when done.
1366 struct fwnode_handle
*
1367 fwnode_graph_get_remote_node(const struct fwnode_handle
*fwnode
, u32 port_id
,
1370 struct fwnode_handle
*endpoint
= NULL
;
1372 while ((endpoint
= fwnode_graph_get_next_endpoint(fwnode
, endpoint
))) {
1373 struct fwnode_endpoint fwnode_ep
;
1374 struct fwnode_handle
*remote
;
1377 ret
= fwnode_graph_parse_endpoint(endpoint
, &fwnode_ep
);
1381 if (fwnode_ep
.port
!= port_id
|| fwnode_ep
.id
!= endpoint_id
)
1384 remote
= fwnode_graph_get_remote_port_parent(endpoint
);
1388 return fwnode_device_is_available(remote
) ? remote
: NULL
;
1393 EXPORT_SYMBOL_GPL(fwnode_graph_get_remote_node
);
1396 * fwnode_graph_parse_endpoint - parse common endpoint node properties
1397 * @fwnode: pointer to endpoint fwnode_handle
1398 * @endpoint: pointer to the fwnode endpoint data structure
1400 * Parse @fwnode representing a graph endpoint node and store the
1401 * information in @endpoint. The caller must hold a reference to
1404 int fwnode_graph_parse_endpoint(const struct fwnode_handle
*fwnode
,
1405 struct fwnode_endpoint
*endpoint
)
1407 memset(endpoint
, 0, sizeof(*endpoint
));
1409 return fwnode_call_int_op(fwnode
, graph_parse_endpoint
, endpoint
);
1411 EXPORT_SYMBOL(fwnode_graph_parse_endpoint
);
1413 const void *device_get_match_data(struct device
*dev
)
1415 return fwnode_call_ptr_op(dev_fwnode(dev
), device_get_match_data
, dev
);
1417 EXPORT_SYMBOL_GPL(device_get_match_data
);