1 // SPDX-License-Identifier: GPL-2.0
3 * Software nodes for the firmware node framework.
5 * Copyright (C) 2018, Intel Corporation
6 * Author: Heikki Krogerus <heikki.krogerus@linux.intel.com>
9 #include <linux/container_of.h>
10 #include <linux/device.h>
11 #include <linux/err.h>
12 #include <linux/export.h>
13 #include <linux/idr.h>
14 #include <linux/init.h>
15 #include <linux/kobject.h>
16 #include <linux/kstrtox.h>
17 #include <linux/list.h>
18 #include <linux/property.h>
19 #include <linux/slab.h>
20 #include <linux/spinlock.h>
21 #include <linux/string.h>
22 #include <linux/sysfs.h>
23 #include <linux/types.h>
29 struct fwnode_handle fwnode
;
30 const struct software_node
*node
;
35 struct list_head entry
;
36 struct list_head children
;
37 struct swnode
*parent
;
39 unsigned int allocated
:1;
40 unsigned int managed
:1;
43 static DEFINE_IDA(swnode_root_ids
);
44 static struct kset
*swnode_kset
;
46 #define kobj_to_swnode(_kobj_) container_of(_kobj_, struct swnode, kobj)
48 static const struct fwnode_operations software_node_ops
;
50 bool is_software_node(const struct fwnode_handle
*fwnode
)
52 return !IS_ERR_OR_NULL(fwnode
) && fwnode
->ops
== &software_node_ops
;
54 EXPORT_SYMBOL_GPL(is_software_node
);
56 #define to_swnode(__fwnode) \
58 typeof(__fwnode) __to_swnode_fwnode = __fwnode; \
60 is_software_node(__to_swnode_fwnode) ? \
61 container_of(__to_swnode_fwnode, \
62 struct swnode, fwnode) : NULL; \
65 static inline struct swnode
*dev_to_swnode(struct device
*dev
)
67 struct fwnode_handle
*fwnode
= dev_fwnode(dev
);
72 if (!is_software_node(fwnode
))
73 fwnode
= fwnode
->secondary
;
75 return to_swnode(fwnode
);
78 static struct swnode
*
79 software_node_to_swnode(const struct software_node
*node
)
81 struct swnode
*swnode
= NULL
;
87 spin_lock(&swnode_kset
->list_lock
);
89 list_for_each_entry(k
, &swnode_kset
->list
, entry
) {
90 swnode
= kobj_to_swnode(k
);
91 if (swnode
->node
== node
)
96 spin_unlock(&swnode_kset
->list_lock
);
101 const struct software_node
*to_software_node(const struct fwnode_handle
*fwnode
)
103 const struct swnode
*swnode
= to_swnode(fwnode
);
105 return swnode
? swnode
->node
: NULL
;
107 EXPORT_SYMBOL_GPL(to_software_node
);
109 struct fwnode_handle
*software_node_fwnode(const struct software_node
*node
)
111 struct swnode
*swnode
= software_node_to_swnode(node
);
113 return swnode
? &swnode
->fwnode
: NULL
;
115 EXPORT_SYMBOL_GPL(software_node_fwnode
);
117 /* -------------------------------------------------------------------------- */
118 /* property_entry processing */
120 static const struct property_entry
*
121 property_entry_get(const struct property_entry
*prop
, const char *name
)
126 for (; prop
->name
; prop
++)
127 if (!strcmp(name
, prop
->name
))
133 static const void *property_get_pointer(const struct property_entry
*prop
)
138 return prop
->is_inline
? &prop
->value
: prop
->pointer
;
141 static const void *property_entry_find(const struct property_entry
*props
,
142 const char *propname
, size_t length
)
144 const struct property_entry
*prop
;
147 prop
= property_entry_get(props
, propname
);
149 return ERR_PTR(-EINVAL
);
150 pointer
= property_get_pointer(prop
);
152 return ERR_PTR(-ENODATA
);
153 if (length
> prop
->length
)
154 return ERR_PTR(-EOVERFLOW
);
159 property_entry_count_elems_of_size(const struct property_entry
*props
,
160 const char *propname
, size_t length
)
162 const struct property_entry
*prop
;
164 prop
= property_entry_get(props
, propname
);
168 return prop
->length
/ length
;
171 static int property_entry_read_int_array(const struct property_entry
*props
,
173 unsigned int elem_size
, void *val
,
180 return property_entry_count_elems_of_size(props
, name
,
183 if (!is_power_of_2(elem_size
) || elem_size
> sizeof(u64
))
186 length
= nval
* elem_size
;
188 pointer
= property_entry_find(props
, name
, length
);
190 return PTR_ERR(pointer
);
192 memcpy(val
, pointer
, length
);
196 static int property_entry_read_string_array(const struct property_entry
*props
,
197 const char *propname
,
198 const char **strings
, size_t nval
)
204 /* Find out the array length. */
205 array_len
= property_entry_count_elems_of_size(props
, propname
,
206 sizeof(const char *));
210 /* Return how many there are if strings is NULL. */
214 array_len
= min_t(size_t, nval
, array_len
);
215 length
= array_len
* sizeof(*strings
);
217 pointer
= property_entry_find(props
, propname
, length
);
219 return PTR_ERR(pointer
);
221 memcpy(strings
, pointer
, length
);
226 static void property_entry_free_data(const struct property_entry
*p
)
228 const char * const *src_str
;
231 if (p
->type
== DEV_PROP_STRING
) {
232 src_str
= property_get_pointer(p
);
233 nval
= p
->length
/ sizeof(*src_str
);
234 for (i
= 0; i
< nval
; i
++)
244 static bool property_copy_string_array(const char **dst_ptr
,
245 const char * const *src_ptr
,
250 for (i
= 0; i
< nval
; i
++) {
251 dst_ptr
[i
] = kstrdup(src_ptr
[i
], GFP_KERNEL
);
252 if (!dst_ptr
[i
] && src_ptr
[i
]) {
262 static int property_entry_copy_data(struct property_entry
*dst
,
263 const struct property_entry
*src
)
265 const void *pointer
= property_get_pointer(src
);
270 * Properties with no data should not be marked as stored
273 if (!src
->is_inline
&& !src
->length
)
277 * Reference properties are never stored inline as
280 if (src
->type
== DEV_PROP_REF
&& src
->is_inline
)
283 if (src
->length
<= sizeof(dst
->value
)) {
284 dst_ptr
= &dst
->value
;
285 dst
->is_inline
= true;
287 dst_ptr
= kmalloc(src
->length
, GFP_KERNEL
);
290 dst
->pointer
= dst_ptr
;
293 if (src
->type
== DEV_PROP_STRING
) {
294 nval
= src
->length
/ sizeof(const char *);
295 if (!property_copy_string_array(dst_ptr
, pointer
, nval
)) {
301 memcpy(dst_ptr
, pointer
, src
->length
);
304 dst
->length
= src
->length
;
305 dst
->type
= src
->type
;
306 dst
->name
= kstrdup(src
->name
, GFP_KERNEL
);
308 property_entry_free_data(dst
);
316 * property_entries_dup - duplicate array of properties
317 * @properties: array of properties to copy
319 * This function creates a deep copy of the given NULL-terminated array
320 * of property entries.
322 struct property_entry
*
323 property_entries_dup(const struct property_entry
*properties
)
325 struct property_entry
*p
;
332 while (properties
[n
].name
)
335 p
= kcalloc(n
+ 1, sizeof(*p
), GFP_KERNEL
);
337 return ERR_PTR(-ENOMEM
);
339 for (i
= 0; i
< n
; i
++) {
340 ret
= property_entry_copy_data(&p
[i
], &properties
[i
]);
343 property_entry_free_data(&p
[i
]);
351 EXPORT_SYMBOL_GPL(property_entries_dup
);
354 * property_entries_free - free previously allocated array of properties
355 * @properties: array of properties to destroy
357 * This function frees given NULL-terminated array of property entries,
358 * along with their data.
360 void property_entries_free(const struct property_entry
*properties
)
362 const struct property_entry
*p
;
367 for (p
= properties
; p
->name
; p
++)
368 property_entry_free_data(p
);
372 EXPORT_SYMBOL_GPL(property_entries_free
);
374 /* -------------------------------------------------------------------------- */
375 /* fwnode operations */
377 static struct fwnode_handle
*software_node_get(struct fwnode_handle
*fwnode
)
379 struct swnode
*swnode
= to_swnode(fwnode
);
381 kobject_get(&swnode
->kobj
);
383 return &swnode
->fwnode
;
386 static void software_node_put(struct fwnode_handle
*fwnode
)
388 struct swnode
*swnode
= to_swnode(fwnode
);
390 kobject_put(&swnode
->kobj
);
393 static bool software_node_property_present(const struct fwnode_handle
*fwnode
,
394 const char *propname
)
396 struct swnode
*swnode
= to_swnode(fwnode
);
398 return !!property_entry_get(swnode
->node
->properties
, propname
);
401 static int software_node_read_int_array(const struct fwnode_handle
*fwnode
,
402 const char *propname
,
403 unsigned int elem_size
, void *val
,
406 struct swnode
*swnode
= to_swnode(fwnode
);
408 return property_entry_read_int_array(swnode
->node
->properties
, propname
,
409 elem_size
, val
, nval
);
412 static int software_node_read_string_array(const struct fwnode_handle
*fwnode
,
413 const char *propname
,
414 const char **val
, size_t nval
)
416 struct swnode
*swnode
= to_swnode(fwnode
);
418 return property_entry_read_string_array(swnode
->node
->properties
,
419 propname
, val
, nval
);
423 software_node_get_name(const struct fwnode_handle
*fwnode
)
425 const struct swnode
*swnode
= to_swnode(fwnode
);
427 return kobject_name(&swnode
->kobj
);
431 software_node_get_name_prefix(const struct fwnode_handle
*fwnode
)
433 struct fwnode_handle
*parent
;
436 parent
= fwnode_get_parent(fwnode
);
440 /* Figure out the prefix from the parents. */
441 while (is_software_node(parent
))
442 parent
= fwnode_get_next_parent(parent
);
444 prefix
= fwnode_get_name_prefix(parent
);
445 fwnode_handle_put(parent
);
447 /* Guess something if prefix was NULL. */
448 return prefix
?: "/";
451 static struct fwnode_handle
*
452 software_node_get_parent(const struct fwnode_handle
*fwnode
)
454 struct swnode
*swnode
= to_swnode(fwnode
);
456 if (!swnode
|| !swnode
->parent
)
459 return fwnode_handle_get(&swnode
->parent
->fwnode
);
462 static struct fwnode_handle
*
463 software_node_get_next_child(const struct fwnode_handle
*fwnode
,
464 struct fwnode_handle
*child
)
466 struct swnode
*p
= to_swnode(fwnode
);
467 struct swnode
*c
= to_swnode(child
);
469 if (!p
|| list_empty(&p
->children
) ||
470 (c
&& list_is_last(&c
->entry
, &p
->children
))) {
471 fwnode_handle_put(child
);
476 c
= list_next_entry(c
, entry
);
478 c
= list_first_entry(&p
->children
, struct swnode
, entry
);
480 fwnode_handle_put(child
);
481 return fwnode_handle_get(&c
->fwnode
);
484 static struct fwnode_handle
*
485 software_node_get_named_child_node(const struct fwnode_handle
*fwnode
,
486 const char *childname
)
488 struct swnode
*swnode
= to_swnode(fwnode
);
489 struct swnode
*child
;
491 if (!swnode
|| list_empty(&swnode
->children
))
494 list_for_each_entry(child
, &swnode
->children
, entry
) {
495 if (!strcmp(childname
, kobject_name(&child
->kobj
))) {
496 kobject_get(&child
->kobj
);
497 return &child
->fwnode
;
504 software_node_get_reference_args(const struct fwnode_handle
*fwnode
,
505 const char *propname
, const char *nargs_prop
,
506 unsigned int nargs
, unsigned int index
,
507 struct fwnode_reference_args
*args
)
509 struct swnode
*swnode
= to_swnode(fwnode
);
510 const struct software_node_ref_args
*ref_array
;
511 const struct software_node_ref_args
*ref
;
512 const struct property_entry
*prop
;
513 struct fwnode_handle
*refnode
;
518 prop
= property_entry_get(swnode
->node
->properties
, propname
);
522 if (prop
->type
!= DEV_PROP_REF
)
526 * We expect that references are never stored inline, even
527 * single ones, as they are too big.
532 if (index
* sizeof(*ref
) >= prop
->length
)
535 ref_array
= prop
->pointer
;
536 ref
= &ref_array
[index
];
538 refnode
= software_node_fwnode(ref
->node
);
543 error
= property_entry_read_int_array(ref
->node
->properties
,
544 nargs_prop
, sizeof(u32
),
549 nargs
= nargs_prop_val
;
552 if (nargs
> NR_FWNODE_REFERENCE_ARGS
)
558 args
->fwnode
= software_node_get(refnode
);
561 for (i
= 0; i
< nargs
; i
++)
562 args
->args
[i
] = ref
->args
[i
];
567 static struct fwnode_handle
*
568 swnode_graph_find_next_port(const struct fwnode_handle
*parent
,
569 struct fwnode_handle
*port
)
571 struct fwnode_handle
*old
= port
;
573 while ((port
= software_node_get_next_child(parent
, old
))) {
575 * fwnode ports have naming style "port@", so we search for any
576 * children that follow that convention.
578 if (!strncmp(to_swnode(port
)->node
->name
, "port@",
587 static struct fwnode_handle
*
588 software_node_graph_get_next_endpoint(const struct fwnode_handle
*fwnode
,
589 struct fwnode_handle
*endpoint
)
591 struct swnode
*swnode
= to_swnode(fwnode
);
592 struct fwnode_handle
*parent
;
593 struct fwnode_handle
*port
;
599 port
= software_node_get_parent(endpoint
);
600 parent
= software_node_get_parent(port
);
602 parent
= software_node_get_named_child_node(fwnode
, "ports");
604 parent
= software_node_get(&swnode
->fwnode
);
606 port
= swnode_graph_find_next_port(parent
, NULL
);
609 for (; port
; port
= swnode_graph_find_next_port(parent
, port
)) {
610 endpoint
= software_node_get_next_child(port
, endpoint
);
612 fwnode_handle_put(port
);
617 fwnode_handle_put(parent
);
622 static struct fwnode_handle
*
623 software_node_graph_get_remote_endpoint(const struct fwnode_handle
*fwnode
)
625 struct swnode
*swnode
= to_swnode(fwnode
);
626 const struct software_node_ref_args
*ref
;
627 const struct property_entry
*prop
;
632 prop
= property_entry_get(swnode
->node
->properties
, "remote-endpoint");
633 if (!prop
|| prop
->type
!= DEV_PROP_REF
|| prop
->is_inline
)
638 return software_node_get(software_node_fwnode(ref
[0].node
));
641 static struct fwnode_handle
*
642 software_node_graph_get_port_parent(struct fwnode_handle
*fwnode
)
644 struct swnode
*swnode
= to_swnode(fwnode
);
646 swnode
= swnode
->parent
;
647 if (swnode
&& !strcmp(swnode
->node
->name
, "ports"))
648 swnode
= swnode
->parent
;
650 return swnode
? software_node_get(&swnode
->fwnode
) : NULL
;
654 software_node_graph_parse_endpoint(const struct fwnode_handle
*fwnode
,
655 struct fwnode_endpoint
*endpoint
)
657 struct swnode
*swnode
= to_swnode(fwnode
);
658 const char *parent_name
= swnode
->parent
->node
->name
;
661 if (strlen("port@") >= strlen(parent_name
) ||
662 strncmp(parent_name
, "port@", strlen("port@")))
665 /* Ports have naming style "port@n", we need to select the n */
666 ret
= kstrtou32(parent_name
+ strlen("port@"), 10, &endpoint
->port
);
670 endpoint
->id
= swnode
->id
;
671 endpoint
->local_fwnode
= fwnode
;
676 static const struct fwnode_operations software_node_ops
= {
677 .get
= software_node_get
,
678 .put
= software_node_put
,
679 .property_present
= software_node_property_present
,
680 .property_read_int_array
= software_node_read_int_array
,
681 .property_read_string_array
= software_node_read_string_array
,
682 .get_name
= software_node_get_name
,
683 .get_name_prefix
= software_node_get_name_prefix
,
684 .get_parent
= software_node_get_parent
,
685 .get_next_child_node
= software_node_get_next_child
,
686 .get_named_child_node
= software_node_get_named_child_node
,
687 .get_reference_args
= software_node_get_reference_args
,
688 .graph_get_next_endpoint
= software_node_graph_get_next_endpoint
,
689 .graph_get_remote_endpoint
= software_node_graph_get_remote_endpoint
,
690 .graph_get_port_parent
= software_node_graph_get_port_parent
,
691 .graph_parse_endpoint
= software_node_graph_parse_endpoint
,
694 /* -------------------------------------------------------------------------- */
697 * software_node_find_by_name - Find software node by name
698 * @parent: Parent of the software node
699 * @name: Name of the software node
701 * The function will find a node that is child of @parent and that is named
702 * @name. If no node is found, the function returns NULL.
704 * NOTE: you will need to drop the reference with fwnode_handle_put() after use.
706 const struct software_node
*
707 software_node_find_by_name(const struct software_node
*parent
, const char *name
)
709 struct swnode
*swnode
= NULL
;
715 spin_lock(&swnode_kset
->list_lock
);
717 list_for_each_entry(k
, &swnode_kset
->list
, entry
) {
718 swnode
= kobj_to_swnode(k
);
719 if (parent
== swnode
->node
->parent
&& swnode
->node
->name
&&
720 !strcmp(name
, swnode
->node
->name
)) {
721 kobject_get(&swnode
->kobj
);
727 spin_unlock(&swnode_kset
->list_lock
);
729 return swnode
? swnode
->node
: NULL
;
731 EXPORT_SYMBOL_GPL(software_node_find_by_name
);
733 static struct software_node
*software_node_alloc(const struct property_entry
*properties
)
735 struct property_entry
*props
;
736 struct software_node
*node
;
738 props
= property_entries_dup(properties
);
740 return ERR_CAST(props
);
742 node
= kzalloc(sizeof(*node
), GFP_KERNEL
);
744 property_entries_free(props
);
745 return ERR_PTR(-ENOMEM
);
748 node
->properties
= props
;
753 static void software_node_free(const struct software_node
*node
)
755 property_entries_free(node
->properties
);
759 static void software_node_release(struct kobject
*kobj
)
761 struct swnode
*swnode
= kobj_to_swnode(kobj
);
763 if (swnode
->parent
) {
764 ida_free(&swnode
->parent
->child_ids
, swnode
->id
);
765 list_del(&swnode
->entry
);
767 ida_free(&swnode_root_ids
, swnode
->id
);
770 if (swnode
->allocated
)
771 software_node_free(swnode
->node
);
773 ida_destroy(&swnode
->child_ids
);
777 static const struct kobj_type software_node_type
= {
778 .release
= software_node_release
,
779 .sysfs_ops
= &kobj_sysfs_ops
,
782 static struct fwnode_handle
*
783 swnode_register(const struct software_node
*node
, struct swnode
*parent
,
784 unsigned int allocated
)
786 struct swnode
*swnode
;
789 swnode
= kzalloc(sizeof(*swnode
), GFP_KERNEL
);
791 return ERR_PTR(-ENOMEM
);
793 ret
= ida_alloc(parent
? &parent
->child_ids
: &swnode_root_ids
,
802 swnode
->parent
= parent
;
803 swnode
->kobj
.kset
= swnode_kset
;
804 fwnode_init(&swnode
->fwnode
, &software_node_ops
);
806 ida_init(&swnode
->child_ids
);
807 INIT_LIST_HEAD(&swnode
->entry
);
808 INIT_LIST_HEAD(&swnode
->children
);
811 ret
= kobject_init_and_add(&swnode
->kobj
, &software_node_type
,
812 parent
? &parent
->kobj
: NULL
,
815 ret
= kobject_init_and_add(&swnode
->kobj
, &software_node_type
,
816 parent
? &parent
->kobj
: NULL
,
817 "node%d", swnode
->id
);
819 kobject_put(&swnode
->kobj
);
824 * Assign the flag only in the successful case, so
825 * the above kobject_put() won't mess up with properties.
827 swnode
->allocated
= allocated
;
830 list_add_tail(&swnode
->entry
, &parent
->children
);
832 kobject_uevent(&swnode
->kobj
, KOBJ_ADD
);
833 return &swnode
->fwnode
;
837 * software_node_register_node_group - Register a group of software nodes
838 * @node_group: NULL terminated array of software node pointers to be registered
840 * Register multiple software nodes at once. If any node in the array
841 * has its .parent pointer set (which can only be to another software_node),
842 * then its parent **must** have been registered before it is; either outside
843 * of this function or by ordering the array such that parent comes before
846 int software_node_register_node_group(const struct software_node
**node_group
)
854 for (i
= 0; node_group
[i
]; i
++) {
855 ret
= software_node_register(node_group
[i
]);
857 software_node_unregister_node_group(node_group
);
864 EXPORT_SYMBOL_GPL(software_node_register_node_group
);
867 * software_node_unregister_node_group - Unregister a group of software nodes
868 * @node_group: NULL terminated array of software node pointers to be unregistered
870 * Unregister multiple software nodes at once. If parent pointers are set up
871 * in any of the software nodes then the array **must** be ordered such that
872 * parents come before their children.
874 * NOTE: If you are uncertain whether the array is ordered such that
875 * parents will be unregistered before their children, it is wiser to
876 * remove the nodes individually, in the correct order (child before
879 void software_node_unregister_node_group(
880 const struct software_node
**node_group
)
887 while (node_group
[i
])
891 software_node_unregister(node_group
[i
]);
893 EXPORT_SYMBOL_GPL(software_node_unregister_node_group
);
896 * software_node_register - Register static software node
897 * @node: The software node to be registered
899 int software_node_register(const struct software_node
*node
)
901 struct swnode
*parent
= software_node_to_swnode(node
->parent
);
903 if (software_node_to_swnode(node
))
906 if (node
->parent
&& !parent
)
909 return PTR_ERR_OR_ZERO(swnode_register(node
, parent
, 0));
911 EXPORT_SYMBOL_GPL(software_node_register
);
914 * software_node_unregister - Unregister static software node
915 * @node: The software node to be unregistered
917 void software_node_unregister(const struct software_node
*node
)
919 struct swnode
*swnode
;
921 swnode
= software_node_to_swnode(node
);
923 fwnode_remove_software_node(&swnode
->fwnode
);
925 EXPORT_SYMBOL_GPL(software_node_unregister
);
927 struct fwnode_handle
*
928 fwnode_create_software_node(const struct property_entry
*properties
,
929 const struct fwnode_handle
*parent
)
931 struct fwnode_handle
*fwnode
;
932 struct software_node
*node
;
936 return ERR_CAST(parent
);
938 p
= to_swnode(parent
);
940 return ERR_PTR(-EINVAL
);
942 node
= software_node_alloc(properties
);
944 return ERR_CAST(node
);
946 node
->parent
= p
? p
->node
: NULL
;
948 fwnode
= swnode_register(node
, p
, 1);
950 software_node_free(node
);
954 EXPORT_SYMBOL_GPL(fwnode_create_software_node
);
956 void fwnode_remove_software_node(struct fwnode_handle
*fwnode
)
958 struct swnode
*swnode
= to_swnode(fwnode
);
963 kobject_put(&swnode
->kobj
);
965 EXPORT_SYMBOL_GPL(fwnode_remove_software_node
);
968 * device_add_software_node - Assign software node to a device
969 * @dev: The device the software node is meant for.
970 * @node: The software node.
972 * This function will make @node the secondary firmware node pointer of @dev. If
973 * @dev has no primary node, then @node will become the primary node. The
974 * function will register @node automatically if it wasn't already registered.
976 int device_add_software_node(struct device
*dev
, const struct software_node
*node
)
978 struct swnode
*swnode
;
981 /* Only one software node per device. */
982 if (dev_to_swnode(dev
))
985 swnode
= software_node_to_swnode(node
);
987 kobject_get(&swnode
->kobj
);
989 ret
= software_node_register(node
);
993 swnode
= software_node_to_swnode(node
);
996 set_secondary_fwnode(dev
, &swnode
->fwnode
);
999 * If the device has been fully registered by the time this function is
1000 * called, software_node_notify() must be called separately so that the
1001 * symlinks get created and the reference count of the node is kept in
1004 if (device_is_registered(dev
))
1005 software_node_notify(dev
);
1009 EXPORT_SYMBOL_GPL(device_add_software_node
);
1012 * device_remove_software_node - Remove device's software node
1013 * @dev: The device with the software node.
1015 * This function will unregister the software node of @dev.
1017 void device_remove_software_node(struct device
*dev
)
1019 struct swnode
*swnode
;
1021 swnode
= dev_to_swnode(dev
);
1025 if (device_is_registered(dev
))
1026 software_node_notify_remove(dev
);
1028 set_secondary_fwnode(dev
, NULL
);
1029 kobject_put(&swnode
->kobj
);
1031 EXPORT_SYMBOL_GPL(device_remove_software_node
);
1034 * device_create_managed_software_node - Create a software node for a device
1035 * @dev: The device the software node is assigned to.
1036 * @properties: Device properties for the software node.
1037 * @parent: Parent of the software node.
1039 * Creates a software node as a managed resource for @dev, which means the
1040 * lifetime of the newly created software node is tied to the lifetime of @dev.
1041 * Software nodes created with this function should not be reused or shared
1042 * because of that. The function takes a deep copy of @properties for the
1045 * Since the new software node is assigned directly to @dev, and since it should
1046 * not be shared, it is not returned to the caller. The function returns 0 on
1047 * success, and errno in case of an error.
1049 int device_create_managed_software_node(struct device
*dev
,
1050 const struct property_entry
*properties
,
1051 const struct software_node
*parent
)
1053 struct fwnode_handle
*p
= software_node_fwnode(parent
);
1054 struct fwnode_handle
*fwnode
;
1059 fwnode
= fwnode_create_software_node(properties
, p
);
1061 return PTR_ERR(fwnode
);
1063 to_swnode(fwnode
)->managed
= true;
1064 set_secondary_fwnode(dev
, fwnode
);
1066 if (device_is_registered(dev
))
1067 software_node_notify(dev
);
1071 EXPORT_SYMBOL_GPL(device_create_managed_software_node
);
1073 void software_node_notify(struct device
*dev
)
1075 struct swnode
*swnode
;
1078 swnode
= dev_to_swnode(dev
);
1082 ret
= sysfs_create_link(&dev
->kobj
, &swnode
->kobj
, "software_node");
1086 ret
= sysfs_create_link(&swnode
->kobj
, &dev
->kobj
, dev_name(dev
));
1088 sysfs_remove_link(&dev
->kobj
, "software_node");
1092 kobject_get(&swnode
->kobj
);
1095 void software_node_notify_remove(struct device
*dev
)
1097 struct swnode
*swnode
;
1099 swnode
= dev_to_swnode(dev
);
1103 sysfs_remove_link(&swnode
->kobj
, dev_name(dev
));
1104 sysfs_remove_link(&dev
->kobj
, "software_node");
1105 kobject_put(&swnode
->kobj
);
1107 if (swnode
->managed
) {
1108 set_secondary_fwnode(dev
, NULL
);
1109 kobject_put(&swnode
->kobj
);
1113 static int __init
software_node_init(void)
1115 swnode_kset
= kset_create_and_add("software_nodes", NULL
, kernel_kobj
);
1120 postcore_initcall(software_node_init
);
1122 static void __exit
software_node_exit(void)
1124 ida_destroy(&swnode_root_ids
);
1125 kset_unregister(swnode_kset
);
1127 __exitcall(software_node_exit
);