xref: /linux/drivers/base/swnode.c (revision 60b4c9d5c6feaf6020a424b05ca7e0c6bebe7b76)
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Software nodes for the firmware node framework.
4  *
5  * Copyright (C) 2018, Intel Corporation
6  * Author: Heikki Krogerus <heikki.krogerus@linux.intel.com>
7  */
8 
9 #include <linux/device.h>
10 #include <linux/kernel.h>
11 #include <linux/property.h>
12 #include <linux/slab.h>
13 
14 struct swnode {
15 	int id;
16 	struct kobject kobj;
17 	struct fwnode_handle fwnode;
18 	const struct software_node *node;
19 
20 	/* hierarchy */
21 	struct ida child_ids;
22 	struct list_head entry;
23 	struct list_head children;
24 	struct swnode *parent;
25 
26 	unsigned int allocated:1;
27 };
28 
29 static DEFINE_IDA(swnode_root_ids);
30 static struct kset *swnode_kset;
31 
32 #define kobj_to_swnode(_kobj_) container_of(_kobj_, struct swnode, kobj)
33 
34 static const struct fwnode_operations software_node_ops;
35 
36 bool is_software_node(const struct fwnode_handle *fwnode)
37 {
38 	return !IS_ERR_OR_NULL(fwnode) && fwnode->ops == &software_node_ops;
39 }
40 EXPORT_SYMBOL_GPL(is_software_node);
41 
42 #define to_swnode(__fwnode)						\
43 	({								\
44 		typeof(__fwnode) __to_swnode_fwnode = __fwnode;		\
45 									\
46 		is_software_node(__to_swnode_fwnode) ?			\
47 			container_of(__to_swnode_fwnode,		\
48 				     struct swnode, fwnode) : NULL;	\
49 	})
50 
51 static inline struct swnode *dev_to_swnode(struct device *dev)
52 {
53 	struct fwnode_handle *fwnode = dev_fwnode(dev);
54 
55 	if (!fwnode)
56 		return NULL;
57 
58 	if (!is_software_node(fwnode))
59 		fwnode = fwnode->secondary;
60 
61 	return to_swnode(fwnode);
62 }
63 
64 static struct swnode *
65 software_node_to_swnode(const struct software_node *node)
66 {
67 	struct swnode *swnode = NULL;
68 	struct kobject *k;
69 
70 	if (!node)
71 		return NULL;
72 
73 	spin_lock(&swnode_kset->list_lock);
74 
75 	list_for_each_entry(k, &swnode_kset->list, entry) {
76 		swnode = kobj_to_swnode(k);
77 		if (swnode->node == node)
78 			break;
79 		swnode = NULL;
80 	}
81 
82 	spin_unlock(&swnode_kset->list_lock);
83 
84 	return swnode;
85 }
86 
87 const struct software_node *to_software_node(const struct fwnode_handle *fwnode)
88 {
89 	const struct swnode *swnode = to_swnode(fwnode);
90 
91 	return swnode ? swnode->node : NULL;
92 }
93 EXPORT_SYMBOL_GPL(to_software_node);
94 
95 struct fwnode_handle *software_node_fwnode(const struct software_node *node)
96 {
97 	struct swnode *swnode = software_node_to_swnode(node);
98 
99 	return swnode ? &swnode->fwnode : NULL;
100 }
101 EXPORT_SYMBOL_GPL(software_node_fwnode);
102 
103 /* -------------------------------------------------------------------------- */
104 /* property_entry processing */
105 
106 static const struct property_entry *
107 property_entry_get(const struct property_entry *prop, const char *name)
108 {
109 	if (!prop)
110 		return NULL;
111 
112 	for (; prop->name; prop++)
113 		if (!strcmp(name, prop->name))
114 			return prop;
115 
116 	return NULL;
117 }
118 
119 static const void *property_get_pointer(const struct property_entry *prop)
120 {
121 	if (!prop->length)
122 		return NULL;
123 
124 	return prop->is_inline ? &prop->value : prop->pointer;
125 }
126 
127 static const void *property_entry_find(const struct property_entry *props,
128 				       const char *propname, size_t length)
129 {
130 	const struct property_entry *prop;
131 	const void *pointer;
132 
133 	prop = property_entry_get(props, propname);
134 	if (!prop)
135 		return ERR_PTR(-EINVAL);
136 	pointer = property_get_pointer(prop);
137 	if (!pointer)
138 		return ERR_PTR(-ENODATA);
139 	if (length > prop->length)
140 		return ERR_PTR(-EOVERFLOW);
141 	return pointer;
142 }
143 
144 static int
145 property_entry_count_elems_of_size(const struct property_entry *props,
146 				   const char *propname, size_t length)
147 {
148 	const struct property_entry *prop;
149 
150 	prop = property_entry_get(props, propname);
151 	if (!prop)
152 		return -EINVAL;
153 
154 	return prop->length / length;
155 }
156 
157 static int property_entry_read_int_array(const struct property_entry *props,
158 					 const char *name,
159 					 unsigned int elem_size, void *val,
160 					 size_t nval)
161 {
162 	const void *pointer;
163 	size_t length;
164 
165 	if (!val)
166 		return property_entry_count_elems_of_size(props, name,
167 							  elem_size);
168 
169 	if (!is_power_of_2(elem_size) || elem_size > sizeof(u64))
170 		return -ENXIO;
171 
172 	length = nval * elem_size;
173 
174 	pointer = property_entry_find(props, name, length);
175 	if (IS_ERR(pointer))
176 		return PTR_ERR(pointer);
177 
178 	memcpy(val, pointer, length);
179 	return 0;
180 }
181 
182 static int property_entry_read_string_array(const struct property_entry *props,
183 					    const char *propname,
184 					    const char **strings, size_t nval)
185 {
186 	const void *pointer;
187 	size_t length;
188 	int array_len;
189 
190 	/* Find out the array length. */
191 	array_len = property_entry_count_elems_of_size(props, propname,
192 						       sizeof(const char *));
193 	if (array_len < 0)
194 		return array_len;
195 
196 	/* Return how many there are if strings is NULL. */
197 	if (!strings)
198 		return array_len;
199 
200 	array_len = min_t(size_t, nval, array_len);
201 	length = array_len * sizeof(*strings);
202 
203 	pointer = property_entry_find(props, propname, length);
204 	if (IS_ERR(pointer))
205 		return PTR_ERR(pointer);
206 
207 	memcpy(strings, pointer, length);
208 
209 	return array_len;
210 }
211 
212 static void property_entry_free_data(const struct property_entry *p)
213 {
214 	const char * const *src_str;
215 	size_t i, nval;
216 
217 	if (p->type == DEV_PROP_STRING) {
218 		src_str = property_get_pointer(p);
219 		nval = p->length / sizeof(*src_str);
220 		for (i = 0; i < nval; i++)
221 			kfree(src_str[i]);
222 	}
223 
224 	if (!p->is_inline)
225 		kfree(p->pointer);
226 
227 	kfree(p->name);
228 }
229 
230 static bool property_copy_string_array(const char **dst_ptr,
231 				       const char * const *src_ptr,
232 				       size_t nval)
233 {
234 	int i;
235 
236 	for (i = 0; i < nval; i++) {
237 		dst_ptr[i] = kstrdup(src_ptr[i], GFP_KERNEL);
238 		if (!dst_ptr[i] && src_ptr[i]) {
239 			while (--i >= 0)
240 				kfree(dst_ptr[i]);
241 			return false;
242 		}
243 	}
244 
245 	return true;
246 }
247 
248 static int property_entry_copy_data(struct property_entry *dst,
249 				    const struct property_entry *src)
250 {
251 	const void *pointer = property_get_pointer(src);
252 	void *dst_ptr;
253 	size_t nval;
254 
255 	/*
256 	 * Properties with no data should not be marked as stored
257 	 * out of line.
258 	 */
259 	if (!src->is_inline && !src->length)
260 		return -ENODATA;
261 
262 	/*
263 	 * Reference properties are never stored inline as
264 	 * they are too big.
265 	 */
266 	if (src->type == DEV_PROP_REF && src->is_inline)
267 		return -EINVAL;
268 
269 	if (src->length <= sizeof(dst->value)) {
270 		dst_ptr = &dst->value;
271 		dst->is_inline = true;
272 	} else {
273 		dst_ptr = kmalloc(src->length, GFP_KERNEL);
274 		if (!dst_ptr)
275 			return -ENOMEM;
276 		dst->pointer = dst_ptr;
277 	}
278 
279 	if (src->type == DEV_PROP_STRING) {
280 		nval = src->length / sizeof(const char *);
281 		if (!property_copy_string_array(dst_ptr, pointer, nval)) {
282 			if (!dst->is_inline)
283 				kfree(dst->pointer);
284 			return -ENOMEM;
285 		}
286 	} else {
287 		memcpy(dst_ptr, pointer, src->length);
288 	}
289 
290 	dst->length = src->length;
291 	dst->type = src->type;
292 	dst->name = kstrdup(src->name, GFP_KERNEL);
293 	if (!dst->name) {
294 		property_entry_free_data(dst);
295 		return -ENOMEM;
296 	}
297 
298 	return 0;
299 }
300 
301 /**
302  * property_entries_dup - duplicate array of properties
303  * @properties: array of properties to copy
304  *
305  * This function creates a deep copy of the given NULL-terminated array
306  * of property entries.
307  */
308 struct property_entry *
309 property_entries_dup(const struct property_entry *properties)
310 {
311 	struct property_entry *p;
312 	int i, n = 0;
313 	int ret;
314 
315 	if (!properties)
316 		return NULL;
317 
318 	while (properties[n].name)
319 		n++;
320 
321 	p = kcalloc(n + 1, sizeof(*p), GFP_KERNEL);
322 	if (!p)
323 		return ERR_PTR(-ENOMEM);
324 
325 	for (i = 0; i < n; i++) {
326 		ret = property_entry_copy_data(&p[i], &properties[i]);
327 		if (ret) {
328 			while (--i >= 0)
329 				property_entry_free_data(&p[i]);
330 			kfree(p);
331 			return ERR_PTR(ret);
332 		}
333 	}
334 
335 	return p;
336 }
337 EXPORT_SYMBOL_GPL(property_entries_dup);
338 
339 /**
340  * property_entries_free - free previously allocated array of properties
341  * @properties: array of properties to destroy
342  *
343  * This function frees given NULL-terminated array of property entries,
344  * along with their data.
345  */
346 void property_entries_free(const struct property_entry *properties)
347 {
348 	const struct property_entry *p;
349 
350 	if (!properties)
351 		return;
352 
353 	for (p = properties; p->name; p++)
354 		property_entry_free_data(p);
355 
356 	kfree(properties);
357 }
358 EXPORT_SYMBOL_GPL(property_entries_free);
359 
360 /* -------------------------------------------------------------------------- */
361 /* fwnode operations */
362 
363 static struct fwnode_handle *software_node_get(struct fwnode_handle *fwnode)
364 {
365 	struct swnode *swnode = to_swnode(fwnode);
366 
367 	kobject_get(&swnode->kobj);
368 
369 	return &swnode->fwnode;
370 }
371 
372 static void software_node_put(struct fwnode_handle *fwnode)
373 {
374 	struct swnode *swnode = to_swnode(fwnode);
375 
376 	kobject_put(&swnode->kobj);
377 }
378 
379 static bool software_node_property_present(const struct fwnode_handle *fwnode,
380 					   const char *propname)
381 {
382 	struct swnode *swnode = to_swnode(fwnode);
383 
384 	return !!property_entry_get(swnode->node->properties, propname);
385 }
386 
387 static int software_node_read_int_array(const struct fwnode_handle *fwnode,
388 					const char *propname,
389 					unsigned int elem_size, void *val,
390 					size_t nval)
391 {
392 	struct swnode *swnode = to_swnode(fwnode);
393 
394 	return property_entry_read_int_array(swnode->node->properties, propname,
395 					     elem_size, val, nval);
396 }
397 
398 static int software_node_read_string_array(const struct fwnode_handle *fwnode,
399 					   const char *propname,
400 					   const char **val, size_t nval)
401 {
402 	struct swnode *swnode = to_swnode(fwnode);
403 
404 	return property_entry_read_string_array(swnode->node->properties,
405 						propname, val, nval);
406 }
407 
408 static const char *
409 software_node_get_name(const struct fwnode_handle *fwnode)
410 {
411 	const struct swnode *swnode = to_swnode(fwnode);
412 
413 	if (!swnode)
414 		return "(null)";
415 
416 	return kobject_name(&swnode->kobj);
417 }
418 
419 static const char *
420 software_node_get_name_prefix(const struct fwnode_handle *fwnode)
421 {
422 	struct fwnode_handle *parent;
423 	const char *prefix;
424 
425 	parent = fwnode_get_parent(fwnode);
426 	if (!parent)
427 		return "";
428 
429 	/* Figure out the prefix from the parents. */
430 	while (is_software_node(parent))
431 		parent = fwnode_get_next_parent(parent);
432 
433 	prefix = fwnode_get_name_prefix(parent);
434 	fwnode_handle_put(parent);
435 
436 	/* Guess something if prefix was NULL. */
437 	return prefix ?: "/";
438 }
439 
440 static struct fwnode_handle *
441 software_node_get_parent(const struct fwnode_handle *fwnode)
442 {
443 	struct swnode *swnode = to_swnode(fwnode);
444 
445 	if (!swnode || !swnode->parent)
446 		return NULL;
447 
448 	return fwnode_handle_get(&swnode->parent->fwnode);
449 }
450 
451 static struct fwnode_handle *
452 software_node_get_next_child(const struct fwnode_handle *fwnode,
453 			     struct fwnode_handle *child)
454 {
455 	struct swnode *p = to_swnode(fwnode);
456 	struct swnode *c = to_swnode(child);
457 
458 	if (!p || list_empty(&p->children) ||
459 	    (c && list_is_last(&c->entry, &p->children)))
460 		return NULL;
461 
462 	if (c)
463 		c = list_next_entry(c, entry);
464 	else
465 		c = list_first_entry(&p->children, struct swnode, entry);
466 	return &c->fwnode;
467 }
468 
469 static struct fwnode_handle *
470 software_node_get_named_child_node(const struct fwnode_handle *fwnode,
471 				   const char *childname)
472 {
473 	struct swnode *swnode = to_swnode(fwnode);
474 	struct swnode *child;
475 
476 	if (!swnode || list_empty(&swnode->children))
477 		return NULL;
478 
479 	list_for_each_entry(child, &swnode->children, entry) {
480 		if (!strcmp(childname, kobject_name(&child->kobj))) {
481 			kobject_get(&child->kobj);
482 			return &child->fwnode;
483 		}
484 	}
485 	return NULL;
486 }
487 
488 static int
489 software_node_get_reference_args(const struct fwnode_handle *fwnode,
490 				 const char *propname, const char *nargs_prop,
491 				 unsigned int nargs, unsigned int index,
492 				 struct fwnode_reference_args *args)
493 {
494 	struct swnode *swnode = to_swnode(fwnode);
495 	const struct software_node_ref_args *ref_array;
496 	const struct software_node_ref_args *ref;
497 	const struct property_entry *prop;
498 	struct fwnode_handle *refnode;
499 	u32 nargs_prop_val;
500 	int error;
501 	int i;
502 
503 	if (!swnode)
504 		return -ENOENT;
505 
506 	prop = property_entry_get(swnode->node->properties, propname);
507 	if (!prop)
508 		return -ENOENT;
509 
510 	if (prop->type != DEV_PROP_REF)
511 		return -EINVAL;
512 
513 	/*
514 	 * We expect that references are never stored inline, even
515 	 * single ones, as they are too big.
516 	 */
517 	if (prop->is_inline)
518 		return -EINVAL;
519 
520 	if (index * sizeof(*ref) >= prop->length)
521 		return -ENOENT;
522 
523 	ref_array = prop->pointer;
524 	ref = &ref_array[index];
525 
526 	refnode = software_node_fwnode(ref->node);
527 	if (!refnode)
528 		return -ENOENT;
529 
530 	if (nargs_prop) {
531 		error = property_entry_read_int_array(swnode->node->properties,
532 						      nargs_prop, sizeof(u32),
533 						      &nargs_prop_val, 1);
534 		if (error)
535 			return error;
536 
537 		nargs = nargs_prop_val;
538 	}
539 
540 	if (nargs > NR_FWNODE_REFERENCE_ARGS)
541 		return -EINVAL;
542 
543 	args->fwnode = software_node_get(refnode);
544 	args->nargs = nargs;
545 
546 	for (i = 0; i < nargs; i++)
547 		args->args[i] = ref->args[i];
548 
549 	return 0;
550 }
551 
552 static const struct fwnode_operations software_node_ops = {
553 	.get = software_node_get,
554 	.put = software_node_put,
555 	.property_present = software_node_property_present,
556 	.property_read_int_array = software_node_read_int_array,
557 	.property_read_string_array = software_node_read_string_array,
558 	.get_name = software_node_get_name,
559 	.get_name_prefix = software_node_get_name_prefix,
560 	.get_parent = software_node_get_parent,
561 	.get_next_child_node = software_node_get_next_child,
562 	.get_named_child_node = software_node_get_named_child_node,
563 	.get_reference_args = software_node_get_reference_args
564 };
565 
566 /* -------------------------------------------------------------------------- */
567 
568 /**
569  * software_node_find_by_name - Find software node by name
570  * @parent: Parent of the software node
571  * @name: Name of the software node
572  *
573  * The function will find a node that is child of @parent and that is named
574  * @name. If no node is found, the function returns NULL.
575  *
576  * NOTE: you will need to drop the reference with fwnode_handle_put() after use.
577  */
578 const struct software_node *
579 software_node_find_by_name(const struct software_node *parent, const char *name)
580 {
581 	struct swnode *swnode = NULL;
582 	struct kobject *k;
583 
584 	if (!name)
585 		return NULL;
586 
587 	spin_lock(&swnode_kset->list_lock);
588 
589 	list_for_each_entry(k, &swnode_kset->list, entry) {
590 		swnode = kobj_to_swnode(k);
591 		if (parent == swnode->node->parent && swnode->node->name &&
592 		    !strcmp(name, swnode->node->name)) {
593 			kobject_get(&swnode->kobj);
594 			break;
595 		}
596 		swnode = NULL;
597 	}
598 
599 	spin_unlock(&swnode_kset->list_lock);
600 
601 	return swnode ? swnode->node : NULL;
602 }
603 EXPORT_SYMBOL_GPL(software_node_find_by_name);
604 
605 static int
606 software_node_register_properties(struct software_node *node,
607 				  const struct property_entry *properties)
608 {
609 	struct property_entry *props;
610 
611 	props = property_entries_dup(properties);
612 	if (IS_ERR(props))
613 		return PTR_ERR(props);
614 
615 	node->properties = props;
616 
617 	return 0;
618 }
619 
620 static void software_node_release(struct kobject *kobj)
621 {
622 	struct swnode *swnode = kobj_to_swnode(kobj);
623 
624 	if (swnode->parent) {
625 		ida_simple_remove(&swnode->parent->child_ids, swnode->id);
626 		list_del(&swnode->entry);
627 	} else {
628 		ida_simple_remove(&swnode_root_ids, swnode->id);
629 	}
630 
631 	if (swnode->allocated) {
632 		property_entries_free(swnode->node->properties);
633 		kfree(swnode->node);
634 	}
635 	ida_destroy(&swnode->child_ids);
636 	kfree(swnode);
637 }
638 
639 static struct kobj_type software_node_type = {
640 	.release = software_node_release,
641 	.sysfs_ops = &kobj_sysfs_ops,
642 };
643 
644 static struct fwnode_handle *
645 swnode_register(const struct software_node *node, struct swnode *parent,
646 		unsigned int allocated)
647 {
648 	struct swnode *swnode;
649 	int ret;
650 
651 	swnode = kzalloc(sizeof(*swnode), GFP_KERNEL);
652 	if (!swnode) {
653 		ret = -ENOMEM;
654 		goto out_err;
655 	}
656 
657 	ret = ida_simple_get(parent ? &parent->child_ids : &swnode_root_ids,
658 			     0, 0, GFP_KERNEL);
659 	if (ret < 0) {
660 		kfree(swnode);
661 		goto out_err;
662 	}
663 
664 	swnode->id = ret;
665 	swnode->node = node;
666 	swnode->parent = parent;
667 	swnode->allocated = allocated;
668 	swnode->kobj.kset = swnode_kset;
669 	fwnode_init(&swnode->fwnode, &software_node_ops);
670 
671 	ida_init(&swnode->child_ids);
672 	INIT_LIST_HEAD(&swnode->entry);
673 	INIT_LIST_HEAD(&swnode->children);
674 
675 	if (node->name)
676 		ret = kobject_init_and_add(&swnode->kobj, &software_node_type,
677 					   parent ? &parent->kobj : NULL,
678 					   "%s", node->name);
679 	else
680 		ret = kobject_init_and_add(&swnode->kobj, &software_node_type,
681 					   parent ? &parent->kobj : NULL,
682 					   "node%d", swnode->id);
683 	if (ret) {
684 		kobject_put(&swnode->kobj);
685 		return ERR_PTR(ret);
686 	}
687 
688 	if (parent)
689 		list_add_tail(&swnode->entry, &parent->children);
690 
691 	kobject_uevent(&swnode->kobj, KOBJ_ADD);
692 	return &swnode->fwnode;
693 
694 out_err:
695 	if (allocated)
696 		property_entries_free(node->properties);
697 	return ERR_PTR(ret);
698 }
699 
700 /**
701  * software_node_register_nodes - Register an array of software nodes
702  * @nodes: Zero terminated array of software nodes to be registered
703  *
704  * Register multiple software nodes at once.
705  */
706 int software_node_register_nodes(const struct software_node *nodes)
707 {
708 	int ret;
709 	int i;
710 
711 	for (i = 0; nodes[i].name; i++) {
712 		ret = software_node_register(&nodes[i]);
713 		if (ret) {
714 			software_node_unregister_nodes(nodes);
715 			return ret;
716 		}
717 	}
718 
719 	return 0;
720 }
721 EXPORT_SYMBOL_GPL(software_node_register_nodes);
722 
723 /**
724  * software_node_unregister_nodes - Unregister an array of software nodes
725  * @nodes: Zero terminated array of software nodes to be unregistered
726  *
727  * Unregister multiple software nodes at once.
728  *
729  * NOTE: Be careful using this call if the nodes had parent pointers set up in
730  * them before registering.  If so, it is wiser to remove the nodes
731  * individually, in the correct order (child before parent) instead of relying
732  * on the sequential order of the list of nodes in the array.
733  */
734 void software_node_unregister_nodes(const struct software_node *nodes)
735 {
736 	int i;
737 
738 	for (i = 0; nodes[i].name; i++)
739 		software_node_unregister(&nodes[i]);
740 }
741 EXPORT_SYMBOL_GPL(software_node_unregister_nodes);
742 
743 /**
744  * software_node_register_node_group - Register a group of software nodes
745  * @node_group: NULL terminated array of software node pointers to be registered
746  *
747  * Register multiple software nodes at once.
748  */
749 int software_node_register_node_group(const struct software_node **node_group)
750 {
751 	unsigned int i;
752 	int ret;
753 
754 	if (!node_group)
755 		return 0;
756 
757 	for (i = 0; node_group[i]; i++) {
758 		ret = software_node_register(node_group[i]);
759 		if (ret) {
760 			software_node_unregister_node_group(node_group);
761 			return ret;
762 		}
763 	}
764 
765 	return 0;
766 }
767 EXPORT_SYMBOL_GPL(software_node_register_node_group);
768 
769 /**
770  * software_node_unregister_node_group - Unregister a group of software nodes
771  * @node_group: NULL terminated array of software node pointers to be unregistered
772  *
773  * Unregister multiple software nodes at once.
774  */
775 void software_node_unregister_node_group(const struct software_node **node_group)
776 {
777 	unsigned int i;
778 
779 	if (!node_group)
780 		return;
781 
782 	for (i = 0; node_group[i]; i++)
783 		software_node_unregister(node_group[i]);
784 }
785 EXPORT_SYMBOL_GPL(software_node_unregister_node_group);
786 
787 /**
788  * software_node_register - Register static software node
789  * @node: The software node to be registered
790  */
791 int software_node_register(const struct software_node *node)
792 {
793 	struct swnode *parent = software_node_to_swnode(node->parent);
794 
795 	if (software_node_to_swnode(node))
796 		return -EEXIST;
797 
798 	return PTR_ERR_OR_ZERO(swnode_register(node, parent, 0));
799 }
800 EXPORT_SYMBOL_GPL(software_node_register);
801 
802 /**
803  * software_node_unregister - Unregister static software node
804  * @node: The software node to be unregistered
805  */
806 void software_node_unregister(const struct software_node *node)
807 {
808 	struct swnode *swnode;
809 
810 	swnode = software_node_to_swnode(node);
811 	if (swnode)
812 		fwnode_remove_software_node(&swnode->fwnode);
813 }
814 EXPORT_SYMBOL_GPL(software_node_unregister);
815 
816 struct fwnode_handle *
817 fwnode_create_software_node(const struct property_entry *properties,
818 			    const struct fwnode_handle *parent)
819 {
820 	struct software_node *node;
821 	struct swnode *p = NULL;
822 	int ret;
823 
824 	if (parent) {
825 		if (IS_ERR(parent))
826 			return ERR_CAST(parent);
827 		if (!is_software_node(parent))
828 			return ERR_PTR(-EINVAL);
829 		p = to_swnode(parent);
830 	}
831 
832 	node = kzalloc(sizeof(*node), GFP_KERNEL);
833 	if (!node)
834 		return ERR_PTR(-ENOMEM);
835 
836 	ret = software_node_register_properties(node, properties);
837 	if (ret) {
838 		kfree(node);
839 		return ERR_PTR(ret);
840 	}
841 
842 	node->parent = p ? p->node : NULL;
843 
844 	return swnode_register(node, p, 1);
845 }
846 EXPORT_SYMBOL_GPL(fwnode_create_software_node);
847 
848 void fwnode_remove_software_node(struct fwnode_handle *fwnode)
849 {
850 	struct swnode *swnode = to_swnode(fwnode);
851 
852 	if (!swnode)
853 		return;
854 
855 	kobject_put(&swnode->kobj);
856 }
857 EXPORT_SYMBOL_GPL(fwnode_remove_software_node);
858 
859 /**
860  * device_add_software_node - Assign software node to a device
861  * @dev: The device the software node is meant for.
862  * @swnode: The software node.
863  *
864  * This function will register @swnode and make it the secondary firmware node
865  * pointer of @dev. If @dev has no primary node, then @swnode will become the primary
866  * node.
867  */
868 int device_add_software_node(struct device *dev, const struct software_node *swnode)
869 {
870 	int ret;
871 
872 	/* Only one software node per device. */
873 	if (dev_to_swnode(dev))
874 		return -EBUSY;
875 
876 	ret = software_node_register(swnode);
877 	if (ret)
878 		return ret;
879 
880 	set_secondary_fwnode(dev, software_node_fwnode(swnode));
881 
882 	return 0;
883 }
884 EXPORT_SYMBOL_GPL(device_add_software_node);
885 
886 /**
887  * device_remove_software_node - Remove device's software node
888  * @dev: The device with the software node.
889  *
890  * This function will unregister the software node of @dev.
891  */
892 void device_remove_software_node(struct device *dev)
893 {
894 	struct swnode *swnode;
895 
896 	swnode = dev_to_swnode(dev);
897 	if (!swnode)
898 		return;
899 
900 	software_node_notify(dev, KOBJ_REMOVE);
901 	set_secondary_fwnode(dev, NULL);
902 	kobject_put(&swnode->kobj);
903 }
904 EXPORT_SYMBOL_GPL(device_remove_software_node);
905 
906 int software_node_notify(struct device *dev, unsigned long action)
907 {
908 	struct swnode *swnode;
909 	int ret;
910 
911 	swnode = dev_to_swnode(dev);
912 	if (!swnode)
913 		return 0;
914 
915 	switch (action) {
916 	case KOBJ_ADD:
917 		ret = sysfs_create_link(&dev->kobj, &swnode->kobj,
918 					"software_node");
919 		if (ret)
920 			break;
921 
922 		ret = sysfs_create_link(&swnode->kobj, &dev->kobj,
923 					dev_name(dev));
924 		if (ret) {
925 			sysfs_remove_link(&dev->kobj, "software_node");
926 			break;
927 		}
928 		kobject_get(&swnode->kobj);
929 		break;
930 	case KOBJ_REMOVE:
931 		sysfs_remove_link(&swnode->kobj, dev_name(dev));
932 		sysfs_remove_link(&dev->kobj, "software_node");
933 		kobject_put(&swnode->kobj);
934 		break;
935 	default:
936 		break;
937 	}
938 
939 	return 0;
940 }
941 
942 static int __init software_node_init(void)
943 {
944 	swnode_kset = kset_create_and_add("software_nodes", NULL, kernel_kobj);
945 	if (!swnode_kset)
946 		return -ENOMEM;
947 	return 0;
948 }
949 postcore_initcall(software_node_init);
950 
951 static void __exit software_node_exit(void)
952 {
953 	ida_destroy(&swnode_root_ids);
954 	kset_unregister(swnode_kset);
955 }
956 __exitcall(software_node_exit);
957