xref: /openbmc/linux/drivers/base/swnode.c (revision 94588c1b)
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 	struct kobject kobj;
16 	struct fwnode_handle fwnode;
17 	const struct software_node *node;
18 	int id;
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 	unsigned int managed:1;
28 };
29 
30 static DEFINE_IDA(swnode_root_ids);
31 static struct kset *swnode_kset;
32 
33 #define kobj_to_swnode(_kobj_) container_of(_kobj_, struct swnode, kobj)
34 
35 static const struct fwnode_operations software_node_ops;
36 
37 bool is_software_node(const struct fwnode_handle *fwnode)
38 {
39 	return !IS_ERR_OR_NULL(fwnode) && fwnode->ops == &software_node_ops;
40 }
41 EXPORT_SYMBOL_GPL(is_software_node);
42 
43 #define to_swnode(__fwnode)						\
44 	({								\
45 		typeof(__fwnode) __to_swnode_fwnode = __fwnode;		\
46 									\
47 		is_software_node(__to_swnode_fwnode) ?			\
48 			container_of(__to_swnode_fwnode,		\
49 				     struct swnode, fwnode) : NULL;	\
50 	})
51 
52 static inline struct swnode *dev_to_swnode(struct device *dev)
53 {
54 	struct fwnode_handle *fwnode = dev_fwnode(dev);
55 
56 	if (!fwnode)
57 		return NULL;
58 
59 	if (!is_software_node(fwnode))
60 		fwnode = fwnode->secondary;
61 
62 	return to_swnode(fwnode);
63 }
64 
65 static struct swnode *
66 software_node_to_swnode(const struct software_node *node)
67 {
68 	struct swnode *swnode = NULL;
69 	struct kobject *k;
70 
71 	if (!node)
72 		return NULL;
73 
74 	spin_lock(&swnode_kset->list_lock);
75 
76 	list_for_each_entry(k, &swnode_kset->list, entry) {
77 		swnode = kobj_to_swnode(k);
78 		if (swnode->node == node)
79 			break;
80 		swnode = NULL;
81 	}
82 
83 	spin_unlock(&swnode_kset->list_lock);
84 
85 	return swnode;
86 }
87 
88 const struct software_node *to_software_node(const struct fwnode_handle *fwnode)
89 {
90 	const struct swnode *swnode = to_swnode(fwnode);
91 
92 	return swnode ? swnode->node : NULL;
93 }
94 EXPORT_SYMBOL_GPL(to_software_node);
95 
96 struct fwnode_handle *software_node_fwnode(const struct software_node *node)
97 {
98 	struct swnode *swnode = software_node_to_swnode(node);
99 
100 	return swnode ? &swnode->fwnode : NULL;
101 }
102 EXPORT_SYMBOL_GPL(software_node_fwnode);
103 
104 /* -------------------------------------------------------------------------- */
105 /* property_entry processing */
106 
107 static const struct property_entry *
108 property_entry_get(const struct property_entry *prop, const char *name)
109 {
110 	if (!prop)
111 		return NULL;
112 
113 	for (; prop->name; prop++)
114 		if (!strcmp(name, prop->name))
115 			return prop;
116 
117 	return NULL;
118 }
119 
120 static const void *property_get_pointer(const struct property_entry *prop)
121 {
122 	if (!prop->length)
123 		return NULL;
124 
125 	return prop->is_inline ? &prop->value : prop->pointer;
126 }
127 
128 static const void *property_entry_find(const struct property_entry *props,
129 				       const char *propname, size_t length)
130 {
131 	const struct property_entry *prop;
132 	const void *pointer;
133 
134 	prop = property_entry_get(props, propname);
135 	if (!prop)
136 		return ERR_PTR(-EINVAL);
137 	pointer = property_get_pointer(prop);
138 	if (!pointer)
139 		return ERR_PTR(-ENODATA);
140 	if (length > prop->length)
141 		return ERR_PTR(-EOVERFLOW);
142 	return pointer;
143 }
144 
145 static int
146 property_entry_count_elems_of_size(const struct property_entry *props,
147 				   const char *propname, size_t length)
148 {
149 	const struct property_entry *prop;
150 
151 	prop = property_entry_get(props, propname);
152 	if (!prop)
153 		return -EINVAL;
154 
155 	return prop->length / length;
156 }
157 
158 static int property_entry_read_int_array(const struct property_entry *props,
159 					 const char *name,
160 					 unsigned int elem_size, void *val,
161 					 size_t nval)
162 {
163 	const void *pointer;
164 	size_t length;
165 
166 	if (!val)
167 		return property_entry_count_elems_of_size(props, name,
168 							  elem_size);
169 
170 	if (!is_power_of_2(elem_size) || elem_size > sizeof(u64))
171 		return -ENXIO;
172 
173 	length = nval * elem_size;
174 
175 	pointer = property_entry_find(props, name, length);
176 	if (IS_ERR(pointer))
177 		return PTR_ERR(pointer);
178 
179 	memcpy(val, pointer, length);
180 	return 0;
181 }
182 
183 static int property_entry_read_string_array(const struct property_entry *props,
184 					    const char *propname,
185 					    const char **strings, size_t nval)
186 {
187 	const void *pointer;
188 	size_t length;
189 	int array_len;
190 
191 	/* Find out the array length. */
192 	array_len = property_entry_count_elems_of_size(props, propname,
193 						       sizeof(const char *));
194 	if (array_len < 0)
195 		return array_len;
196 
197 	/* Return how many there are if strings is NULL. */
198 	if (!strings)
199 		return array_len;
200 
201 	array_len = min_t(size_t, nval, array_len);
202 	length = array_len * sizeof(*strings);
203 
204 	pointer = property_entry_find(props, propname, length);
205 	if (IS_ERR(pointer))
206 		return PTR_ERR(pointer);
207 
208 	memcpy(strings, pointer, length);
209 
210 	return array_len;
211 }
212 
213 static void property_entry_free_data(const struct property_entry *p)
214 {
215 	const char * const *src_str;
216 	size_t i, nval;
217 
218 	if (p->type == DEV_PROP_STRING) {
219 		src_str = property_get_pointer(p);
220 		nval = p->length / sizeof(*src_str);
221 		for (i = 0; i < nval; i++)
222 			kfree(src_str[i]);
223 	}
224 
225 	if (!p->is_inline)
226 		kfree(p->pointer);
227 
228 	kfree(p->name);
229 }
230 
231 static bool property_copy_string_array(const char **dst_ptr,
232 				       const char * const *src_ptr,
233 				       size_t nval)
234 {
235 	int i;
236 
237 	for (i = 0; i < nval; i++) {
238 		dst_ptr[i] = kstrdup(src_ptr[i], GFP_KERNEL);
239 		if (!dst_ptr[i] && src_ptr[i]) {
240 			while (--i >= 0)
241 				kfree(dst_ptr[i]);
242 			return false;
243 		}
244 	}
245 
246 	return true;
247 }
248 
249 static int property_entry_copy_data(struct property_entry *dst,
250 				    const struct property_entry *src)
251 {
252 	const void *pointer = property_get_pointer(src);
253 	void *dst_ptr;
254 	size_t nval;
255 
256 	/*
257 	 * Properties with no data should not be marked as stored
258 	 * out of line.
259 	 */
260 	if (!src->is_inline && !src->length)
261 		return -ENODATA;
262 
263 	/*
264 	 * Reference properties are never stored inline as
265 	 * they are too big.
266 	 */
267 	if (src->type == DEV_PROP_REF && src->is_inline)
268 		return -EINVAL;
269 
270 	if (src->length <= sizeof(dst->value)) {
271 		dst_ptr = &dst->value;
272 		dst->is_inline = true;
273 	} else {
274 		dst_ptr = kmalloc(src->length, GFP_KERNEL);
275 		if (!dst_ptr)
276 			return -ENOMEM;
277 		dst->pointer = dst_ptr;
278 	}
279 
280 	if (src->type == DEV_PROP_STRING) {
281 		nval = src->length / sizeof(const char *);
282 		if (!property_copy_string_array(dst_ptr, pointer, nval)) {
283 			if (!dst->is_inline)
284 				kfree(dst->pointer);
285 			return -ENOMEM;
286 		}
287 	} else {
288 		memcpy(dst_ptr, pointer, src->length);
289 	}
290 
291 	dst->length = src->length;
292 	dst->type = src->type;
293 	dst->name = kstrdup(src->name, GFP_KERNEL);
294 	if (!dst->name) {
295 		property_entry_free_data(dst);
296 		return -ENOMEM;
297 	}
298 
299 	return 0;
300 }
301 
302 /**
303  * property_entries_dup - duplicate array of properties
304  * @properties: array of properties to copy
305  *
306  * This function creates a deep copy of the given NULL-terminated array
307  * of property entries.
308  */
309 struct property_entry *
310 property_entries_dup(const struct property_entry *properties)
311 {
312 	struct property_entry *p;
313 	int i, n = 0;
314 	int ret;
315 
316 	if (!properties)
317 		return NULL;
318 
319 	while (properties[n].name)
320 		n++;
321 
322 	p = kcalloc(n + 1, sizeof(*p), GFP_KERNEL);
323 	if (!p)
324 		return ERR_PTR(-ENOMEM);
325 
326 	for (i = 0; i < n; i++) {
327 		ret = property_entry_copy_data(&p[i], &properties[i]);
328 		if (ret) {
329 			while (--i >= 0)
330 				property_entry_free_data(&p[i]);
331 			kfree(p);
332 			return ERR_PTR(ret);
333 		}
334 	}
335 
336 	return p;
337 }
338 EXPORT_SYMBOL_GPL(property_entries_dup);
339 
340 /**
341  * property_entries_free - free previously allocated array of properties
342  * @properties: array of properties to destroy
343  *
344  * This function frees given NULL-terminated array of property entries,
345  * along with their data.
346  */
347 void property_entries_free(const struct property_entry *properties)
348 {
349 	const struct property_entry *p;
350 
351 	if (!properties)
352 		return;
353 
354 	for (p = properties; p->name; p++)
355 		property_entry_free_data(p);
356 
357 	kfree(properties);
358 }
359 EXPORT_SYMBOL_GPL(property_entries_free);
360 
361 /* -------------------------------------------------------------------------- */
362 /* fwnode operations */
363 
364 static struct fwnode_handle *software_node_get(struct fwnode_handle *fwnode)
365 {
366 	struct swnode *swnode = to_swnode(fwnode);
367 
368 	kobject_get(&swnode->kobj);
369 
370 	return &swnode->fwnode;
371 }
372 
373 static void software_node_put(struct fwnode_handle *fwnode)
374 {
375 	struct swnode *swnode = to_swnode(fwnode);
376 
377 	kobject_put(&swnode->kobj);
378 }
379 
380 static bool software_node_property_present(const struct fwnode_handle *fwnode,
381 					   const char *propname)
382 {
383 	struct swnode *swnode = to_swnode(fwnode);
384 
385 	return !!property_entry_get(swnode->node->properties, propname);
386 }
387 
388 static int software_node_read_int_array(const struct fwnode_handle *fwnode,
389 					const char *propname,
390 					unsigned int elem_size, void *val,
391 					size_t nval)
392 {
393 	struct swnode *swnode = to_swnode(fwnode);
394 
395 	return property_entry_read_int_array(swnode->node->properties, propname,
396 					     elem_size, val, nval);
397 }
398 
399 static int software_node_read_string_array(const struct fwnode_handle *fwnode,
400 					   const char *propname,
401 					   const char **val, size_t nval)
402 {
403 	struct swnode *swnode = to_swnode(fwnode);
404 
405 	return property_entry_read_string_array(swnode->node->properties,
406 						propname, val, nval);
407 }
408 
409 static const char *
410 software_node_get_name(const struct fwnode_handle *fwnode)
411 {
412 	const struct swnode *swnode = to_swnode(fwnode);
413 
414 	if (!swnode)
415 		return "(null)";
416 
417 	return kobject_name(&swnode->kobj);
418 }
419 
420 static const char *
421 software_node_get_name_prefix(const struct fwnode_handle *fwnode)
422 {
423 	struct fwnode_handle *parent;
424 	const char *prefix;
425 
426 	parent = fwnode_get_parent(fwnode);
427 	if (!parent)
428 		return "";
429 
430 	/* Figure out the prefix from the parents. */
431 	while (is_software_node(parent))
432 		parent = fwnode_get_next_parent(parent);
433 
434 	prefix = fwnode_get_name_prefix(parent);
435 	fwnode_handle_put(parent);
436 
437 	/* Guess something if prefix was NULL. */
438 	return prefix ?: "/";
439 }
440 
441 static struct fwnode_handle *
442 software_node_get_parent(const struct fwnode_handle *fwnode)
443 {
444 	struct swnode *swnode = to_swnode(fwnode);
445 
446 	if (!swnode || !swnode->parent)
447 		return NULL;
448 
449 	return fwnode_handle_get(&swnode->parent->fwnode);
450 }
451 
452 static struct fwnode_handle *
453 software_node_get_next_child(const struct fwnode_handle *fwnode,
454 			     struct fwnode_handle *child)
455 {
456 	struct swnode *p = to_swnode(fwnode);
457 	struct swnode *c = to_swnode(child);
458 
459 	if (!p || list_empty(&p->children) ||
460 	    (c && list_is_last(&c->entry, &p->children))) {
461 		fwnode_handle_put(child);
462 		return NULL;
463 	}
464 
465 	if (c)
466 		c = list_next_entry(c, entry);
467 	else
468 		c = list_first_entry(&p->children, struct swnode, entry);
469 
470 	fwnode_handle_put(child);
471 	return fwnode_handle_get(&c->fwnode);
472 }
473 
474 static struct fwnode_handle *
475 software_node_get_named_child_node(const struct fwnode_handle *fwnode,
476 				   const char *childname)
477 {
478 	struct swnode *swnode = to_swnode(fwnode);
479 	struct swnode *child;
480 
481 	if (!swnode || list_empty(&swnode->children))
482 		return NULL;
483 
484 	list_for_each_entry(child, &swnode->children, entry) {
485 		if (!strcmp(childname, kobject_name(&child->kobj))) {
486 			kobject_get(&child->kobj);
487 			return &child->fwnode;
488 		}
489 	}
490 	return NULL;
491 }
492 
493 static int
494 software_node_get_reference_args(const struct fwnode_handle *fwnode,
495 				 const char *propname, const char *nargs_prop,
496 				 unsigned int nargs, unsigned int index,
497 				 struct fwnode_reference_args *args)
498 {
499 	struct swnode *swnode = to_swnode(fwnode);
500 	const struct software_node_ref_args *ref_array;
501 	const struct software_node_ref_args *ref;
502 	const struct property_entry *prop;
503 	struct fwnode_handle *refnode;
504 	u32 nargs_prop_val;
505 	int error;
506 	int i;
507 
508 	if (!swnode)
509 		return -ENOENT;
510 
511 	prop = property_entry_get(swnode->node->properties, propname);
512 	if (!prop)
513 		return -ENOENT;
514 
515 	if (prop->type != DEV_PROP_REF)
516 		return -EINVAL;
517 
518 	/*
519 	 * We expect that references are never stored inline, even
520 	 * single ones, as they are too big.
521 	 */
522 	if (prop->is_inline)
523 		return -EINVAL;
524 
525 	if (index * sizeof(*ref) >= prop->length)
526 		return -ENOENT;
527 
528 	ref_array = prop->pointer;
529 	ref = &ref_array[index];
530 
531 	refnode = software_node_fwnode(ref->node);
532 	if (!refnode)
533 		return -ENOENT;
534 
535 	if (nargs_prop) {
536 		error = property_entry_read_int_array(swnode->node->properties,
537 						      nargs_prop, sizeof(u32),
538 						      &nargs_prop_val, 1);
539 		if (error)
540 			return error;
541 
542 		nargs = nargs_prop_val;
543 	}
544 
545 	if (nargs > NR_FWNODE_REFERENCE_ARGS)
546 		return -EINVAL;
547 
548 	args->fwnode = software_node_get(refnode);
549 	args->nargs = nargs;
550 
551 	for (i = 0; i < nargs; i++)
552 		args->args[i] = ref->args[i];
553 
554 	return 0;
555 }
556 
557 static struct fwnode_handle *
558 swnode_graph_find_next_port(const struct fwnode_handle *parent,
559 			    struct fwnode_handle *port)
560 {
561 	struct fwnode_handle *old = port;
562 
563 	while ((port = software_node_get_next_child(parent, old))) {
564 		/*
565 		 * fwnode ports have naming style "port@", so we search for any
566 		 * children that follow that convention.
567 		 */
568 		if (!strncmp(to_swnode(port)->node->name, "port@",
569 			     strlen("port@")))
570 			return port;
571 		old = port;
572 	}
573 
574 	return NULL;
575 }
576 
577 static struct fwnode_handle *
578 software_node_graph_get_next_endpoint(const struct fwnode_handle *fwnode,
579 				      struct fwnode_handle *endpoint)
580 {
581 	struct swnode *swnode = to_swnode(fwnode);
582 	struct fwnode_handle *parent;
583 	struct fwnode_handle *port;
584 
585 	if (!swnode)
586 		return NULL;
587 
588 	if (endpoint) {
589 		port = software_node_get_parent(endpoint);
590 		parent = software_node_get_parent(port);
591 	} else {
592 		parent = software_node_get_named_child_node(fwnode, "ports");
593 		if (!parent)
594 			parent = software_node_get(&swnode->fwnode);
595 
596 		port = swnode_graph_find_next_port(parent, NULL);
597 	}
598 
599 	for (; port; port = swnode_graph_find_next_port(parent, port)) {
600 		endpoint = software_node_get_next_child(port, endpoint);
601 		if (endpoint) {
602 			fwnode_handle_put(port);
603 			break;
604 		}
605 	}
606 
607 	fwnode_handle_put(parent);
608 
609 	return endpoint;
610 }
611 
612 static struct fwnode_handle *
613 software_node_graph_get_remote_endpoint(const struct fwnode_handle *fwnode)
614 {
615 	struct swnode *swnode = to_swnode(fwnode);
616 	const struct software_node_ref_args *ref;
617 	const struct property_entry *prop;
618 
619 	if (!swnode)
620 		return NULL;
621 
622 	prop = property_entry_get(swnode->node->properties, "remote-endpoint");
623 	if (!prop || prop->type != DEV_PROP_REF || prop->is_inline)
624 		return NULL;
625 
626 	ref = prop->pointer;
627 
628 	return software_node_get(software_node_fwnode(ref[0].node));
629 }
630 
631 static struct fwnode_handle *
632 software_node_graph_get_port_parent(struct fwnode_handle *fwnode)
633 {
634 	struct swnode *swnode = to_swnode(fwnode);
635 
636 	swnode = swnode->parent;
637 	if (swnode && !strcmp(swnode->node->name, "ports"))
638 		swnode = swnode->parent;
639 
640 	return swnode ? software_node_get(&swnode->fwnode) : NULL;
641 }
642 
643 static int
644 software_node_graph_parse_endpoint(const struct fwnode_handle *fwnode,
645 				   struct fwnode_endpoint *endpoint)
646 {
647 	struct swnode *swnode = to_swnode(fwnode);
648 	const char *parent_name = swnode->parent->node->name;
649 	int ret;
650 
651 	if (strlen("port@") >= strlen(parent_name) ||
652 	    strncmp(parent_name, "port@", strlen("port@")))
653 		return -EINVAL;
654 
655 	/* Ports have naming style "port@n", we need to select the n */
656 	ret = kstrtou32(parent_name + strlen("port@"), 10, &endpoint->port);
657 	if (ret)
658 		return ret;
659 
660 	endpoint->id = swnode->id;
661 	endpoint->local_fwnode = fwnode;
662 
663 	return 0;
664 }
665 
666 static const struct fwnode_operations software_node_ops = {
667 	.get = software_node_get,
668 	.put = software_node_put,
669 	.property_present = software_node_property_present,
670 	.property_read_int_array = software_node_read_int_array,
671 	.property_read_string_array = software_node_read_string_array,
672 	.get_name = software_node_get_name,
673 	.get_name_prefix = software_node_get_name_prefix,
674 	.get_parent = software_node_get_parent,
675 	.get_next_child_node = software_node_get_next_child,
676 	.get_named_child_node = software_node_get_named_child_node,
677 	.get_reference_args = software_node_get_reference_args,
678 	.graph_get_next_endpoint = software_node_graph_get_next_endpoint,
679 	.graph_get_remote_endpoint = software_node_graph_get_remote_endpoint,
680 	.graph_get_port_parent = software_node_graph_get_port_parent,
681 	.graph_parse_endpoint = software_node_graph_parse_endpoint,
682 };
683 
684 /* -------------------------------------------------------------------------- */
685 
686 /**
687  * software_node_find_by_name - Find software node by name
688  * @parent: Parent of the software node
689  * @name: Name of the software node
690  *
691  * The function will find a node that is child of @parent and that is named
692  * @name. If no node is found, the function returns NULL.
693  *
694  * NOTE: you will need to drop the reference with fwnode_handle_put() after use.
695  */
696 const struct software_node *
697 software_node_find_by_name(const struct software_node *parent, const char *name)
698 {
699 	struct swnode *swnode = NULL;
700 	struct kobject *k;
701 
702 	if (!name)
703 		return NULL;
704 
705 	spin_lock(&swnode_kset->list_lock);
706 
707 	list_for_each_entry(k, &swnode_kset->list, entry) {
708 		swnode = kobj_to_swnode(k);
709 		if (parent == swnode->node->parent && swnode->node->name &&
710 		    !strcmp(name, swnode->node->name)) {
711 			kobject_get(&swnode->kobj);
712 			break;
713 		}
714 		swnode = NULL;
715 	}
716 
717 	spin_unlock(&swnode_kset->list_lock);
718 
719 	return swnode ? swnode->node : NULL;
720 }
721 EXPORT_SYMBOL_GPL(software_node_find_by_name);
722 
723 static struct software_node *software_node_alloc(const struct property_entry *properties)
724 {
725 	struct property_entry *props;
726 	struct software_node *node;
727 
728 	props = property_entries_dup(properties);
729 	if (IS_ERR(props))
730 		return ERR_CAST(props);
731 
732 	node = kzalloc(sizeof(*node), GFP_KERNEL);
733 	if (!node) {
734 		property_entries_free(props);
735 		return ERR_PTR(-ENOMEM);
736 	}
737 
738 	node->properties = props;
739 
740 	return node;
741 }
742 
743 static void software_node_free(const struct software_node *node)
744 {
745 	property_entries_free(node->properties);
746 	kfree(node);
747 }
748 
749 static void software_node_release(struct kobject *kobj)
750 {
751 	struct swnode *swnode = kobj_to_swnode(kobj);
752 
753 	if (swnode->parent) {
754 		ida_simple_remove(&swnode->parent->child_ids, swnode->id);
755 		list_del(&swnode->entry);
756 	} else {
757 		ida_simple_remove(&swnode_root_ids, swnode->id);
758 	}
759 
760 	if (swnode->allocated)
761 		software_node_free(swnode->node);
762 
763 	ida_destroy(&swnode->child_ids);
764 	kfree(swnode);
765 }
766 
767 static struct kobj_type software_node_type = {
768 	.release = software_node_release,
769 	.sysfs_ops = &kobj_sysfs_ops,
770 };
771 
772 static struct fwnode_handle *
773 swnode_register(const struct software_node *node, struct swnode *parent,
774 		unsigned int allocated)
775 {
776 	struct swnode *swnode;
777 	int ret;
778 
779 	swnode = kzalloc(sizeof(*swnode), GFP_KERNEL);
780 	if (!swnode)
781 		return ERR_PTR(-ENOMEM);
782 
783 	ret = ida_simple_get(parent ? &parent->child_ids : &swnode_root_ids,
784 			     0, 0, GFP_KERNEL);
785 	if (ret < 0) {
786 		kfree(swnode);
787 		return ERR_PTR(ret);
788 	}
789 
790 	swnode->id = ret;
791 	swnode->node = node;
792 	swnode->parent = parent;
793 	swnode->kobj.kset = swnode_kset;
794 	fwnode_init(&swnode->fwnode, &software_node_ops);
795 
796 	ida_init(&swnode->child_ids);
797 	INIT_LIST_HEAD(&swnode->entry);
798 	INIT_LIST_HEAD(&swnode->children);
799 
800 	if (node->name)
801 		ret = kobject_init_and_add(&swnode->kobj, &software_node_type,
802 					   parent ? &parent->kobj : NULL,
803 					   "%s", node->name);
804 	else
805 		ret = kobject_init_and_add(&swnode->kobj, &software_node_type,
806 					   parent ? &parent->kobj : NULL,
807 					   "node%d", swnode->id);
808 	if (ret) {
809 		kobject_put(&swnode->kobj);
810 		return ERR_PTR(ret);
811 	}
812 
813 	/*
814 	 * Assign the flag only in the successful case, so
815 	 * the above kobject_put() won't mess up with properties.
816 	 */
817 	swnode->allocated = allocated;
818 
819 	if (parent)
820 		list_add_tail(&swnode->entry, &parent->children);
821 
822 	kobject_uevent(&swnode->kobj, KOBJ_ADD);
823 	return &swnode->fwnode;
824 }
825 
826 /**
827  * software_node_register_nodes - Register an array of software nodes
828  * @nodes: Zero terminated array of software nodes to be registered
829  *
830  * Register multiple software nodes at once. If any node in the array
831  * has its .parent pointer set (which can only be to another software_node),
832  * then its parent **must** have been registered before it is; either outside
833  * of this function or by ordering the array such that parent comes before
834  * child.
835  */
836 int software_node_register_nodes(const struct software_node *nodes)
837 {
838 	int ret;
839 	int i;
840 
841 	for (i = 0; nodes[i].name; i++) {
842 		const struct software_node *parent = nodes[i].parent;
843 
844 		if (parent && !software_node_to_swnode(parent)) {
845 			ret = -EINVAL;
846 			goto err_unregister_nodes;
847 		}
848 
849 		ret = software_node_register(&nodes[i]);
850 		if (ret)
851 			goto err_unregister_nodes;
852 	}
853 
854 	return 0;
855 
856 err_unregister_nodes:
857 	software_node_unregister_nodes(nodes);
858 	return ret;
859 }
860 EXPORT_SYMBOL_GPL(software_node_register_nodes);
861 
862 /**
863  * software_node_unregister_nodes - Unregister an array of software nodes
864  * @nodes: Zero terminated array of software nodes to be unregistered
865  *
866  * Unregister multiple software nodes at once. If parent pointers are set up
867  * in any of the software nodes then the array **must** be ordered such that
868  * parents come before their children.
869  *
870  * NOTE: If you are uncertain whether the array is ordered such that
871  * parents will be unregistered before their children, it is wiser to
872  * remove the nodes individually, in the correct order (child before
873  * parent).
874  */
875 void software_node_unregister_nodes(const struct software_node *nodes)
876 {
877 	unsigned int i = 0;
878 
879 	while (nodes[i].name)
880 		i++;
881 
882 	while (i--)
883 		software_node_unregister(&nodes[i]);
884 }
885 EXPORT_SYMBOL_GPL(software_node_unregister_nodes);
886 
887 /**
888  * software_node_register_node_group - Register a group of software nodes
889  * @node_group: NULL terminated array of software node pointers to be registered
890  *
891  * Register multiple software nodes at once. If any node in the array
892  * has its .parent pointer set (which can only be to another software_node),
893  * then its parent **must** have been registered before it is; either outside
894  * of this function or by ordering the array such that parent comes before
895  * child.
896  */
897 int software_node_register_node_group(const struct software_node **node_group)
898 {
899 	unsigned int i;
900 	int ret;
901 
902 	if (!node_group)
903 		return 0;
904 
905 	for (i = 0; node_group[i]; i++) {
906 		ret = software_node_register(node_group[i]);
907 		if (ret) {
908 			software_node_unregister_node_group(node_group);
909 			return ret;
910 		}
911 	}
912 
913 	return 0;
914 }
915 EXPORT_SYMBOL_GPL(software_node_register_node_group);
916 
917 /**
918  * software_node_unregister_node_group - Unregister a group of software nodes
919  * @node_group: NULL terminated array of software node pointers to be unregistered
920  *
921  * Unregister multiple software nodes at once. If parent pointers are set up
922  * in any of the software nodes then the array **must** be ordered such that
923  * parents come before their children.
924  *
925  * NOTE: If you are uncertain whether the array is ordered such that
926  * parents will be unregistered before their children, it is wiser to
927  * remove the nodes individually, in the correct order (child before
928  * parent).
929  */
930 void software_node_unregister_node_group(
931 		const struct software_node **node_group)
932 {
933 	unsigned int i = 0;
934 
935 	if (!node_group)
936 		return;
937 
938 	while (node_group[i])
939 		i++;
940 
941 	while (i--)
942 		software_node_unregister(node_group[i]);
943 }
944 EXPORT_SYMBOL_GPL(software_node_unregister_node_group);
945 
946 /**
947  * software_node_register - Register static software node
948  * @node: The software node to be registered
949  */
950 int software_node_register(const struct software_node *node)
951 {
952 	struct swnode *parent = software_node_to_swnode(node->parent);
953 
954 	if (software_node_to_swnode(node))
955 		return -EEXIST;
956 
957 	if (node->parent && !parent)
958 		return -EINVAL;
959 
960 	return PTR_ERR_OR_ZERO(swnode_register(node, parent, 0));
961 }
962 EXPORT_SYMBOL_GPL(software_node_register);
963 
964 /**
965  * software_node_unregister - Unregister static software node
966  * @node: The software node to be unregistered
967  */
968 void software_node_unregister(const struct software_node *node)
969 {
970 	struct swnode *swnode;
971 
972 	swnode = software_node_to_swnode(node);
973 	if (swnode)
974 		fwnode_remove_software_node(&swnode->fwnode);
975 }
976 EXPORT_SYMBOL_GPL(software_node_unregister);
977 
978 struct fwnode_handle *
979 fwnode_create_software_node(const struct property_entry *properties,
980 			    const struct fwnode_handle *parent)
981 {
982 	struct fwnode_handle *fwnode;
983 	struct software_node *node;
984 	struct swnode *p;
985 
986 	if (IS_ERR(parent))
987 		return ERR_CAST(parent);
988 
989 	p = to_swnode(parent);
990 	if (parent && !p)
991 		return ERR_PTR(-EINVAL);
992 
993 	node = software_node_alloc(properties);
994 	if (IS_ERR(node))
995 		return ERR_CAST(node);
996 
997 	node->parent = p ? p->node : NULL;
998 
999 	fwnode = swnode_register(node, p, 1);
1000 	if (IS_ERR(fwnode))
1001 		software_node_free(node);
1002 
1003 	return fwnode;
1004 }
1005 EXPORT_SYMBOL_GPL(fwnode_create_software_node);
1006 
1007 void fwnode_remove_software_node(struct fwnode_handle *fwnode)
1008 {
1009 	struct swnode *swnode = to_swnode(fwnode);
1010 
1011 	if (!swnode)
1012 		return;
1013 
1014 	kobject_put(&swnode->kobj);
1015 }
1016 EXPORT_SYMBOL_GPL(fwnode_remove_software_node);
1017 
1018 /**
1019  * device_add_software_node - Assign software node to a device
1020  * @dev: The device the software node is meant for.
1021  * @node: The software node.
1022  *
1023  * This function will make @node the secondary firmware node pointer of @dev. If
1024  * @dev has no primary node, then @node will become the primary node. The
1025  * function will register @node automatically if it wasn't already registered.
1026  */
1027 int device_add_software_node(struct device *dev, const struct software_node *node)
1028 {
1029 	struct swnode *swnode;
1030 	int ret;
1031 
1032 	/* Only one software node per device. */
1033 	if (dev_to_swnode(dev))
1034 		return -EBUSY;
1035 
1036 	swnode = software_node_to_swnode(node);
1037 	if (swnode) {
1038 		kobject_get(&swnode->kobj);
1039 	} else {
1040 		ret = software_node_register(node);
1041 		if (ret)
1042 			return ret;
1043 
1044 		swnode = software_node_to_swnode(node);
1045 	}
1046 
1047 	set_secondary_fwnode(dev, &swnode->fwnode);
1048 	software_node_notify(dev, KOBJ_ADD);
1049 
1050 	return 0;
1051 }
1052 EXPORT_SYMBOL_GPL(device_add_software_node);
1053 
1054 /**
1055  * device_remove_software_node - Remove device's software node
1056  * @dev: The device with the software node.
1057  *
1058  * This function will unregister the software node of @dev.
1059  */
1060 void device_remove_software_node(struct device *dev)
1061 {
1062 	struct swnode *swnode;
1063 
1064 	swnode = dev_to_swnode(dev);
1065 	if (!swnode)
1066 		return;
1067 
1068 	software_node_notify(dev, KOBJ_REMOVE);
1069 	set_secondary_fwnode(dev, NULL);
1070 	kobject_put(&swnode->kobj);
1071 }
1072 EXPORT_SYMBOL_GPL(device_remove_software_node);
1073 
1074 /**
1075  * device_create_managed_software_node - Create a software node for a device
1076  * @dev: The device the software node is assigned to.
1077  * @properties: Device properties for the software node.
1078  * @parent: Parent of the software node.
1079  *
1080  * Creates a software node as a managed resource for @dev, which means the
1081  * lifetime of the newly created software node is tied to the lifetime of @dev.
1082  * Software nodes created with this function should not be reused or shared
1083  * because of that. The function takes a deep copy of @properties for the
1084  * software node.
1085  *
1086  * Since the new software node is assigned directly to @dev, and since it should
1087  * not be shared, it is not returned to the caller. The function returns 0 on
1088  * success, and errno in case of an error.
1089  */
1090 int device_create_managed_software_node(struct device *dev,
1091 					const struct property_entry *properties,
1092 					const struct software_node *parent)
1093 {
1094 	struct fwnode_handle *p = software_node_fwnode(parent);
1095 	struct fwnode_handle *fwnode;
1096 
1097 	if (parent && !p)
1098 		return -EINVAL;
1099 
1100 	fwnode = fwnode_create_software_node(properties, p);
1101 	if (IS_ERR(fwnode))
1102 		return PTR_ERR(fwnode);
1103 
1104 	to_swnode(fwnode)->managed = true;
1105 	set_secondary_fwnode(dev, fwnode);
1106 
1107 	return 0;
1108 }
1109 EXPORT_SYMBOL_GPL(device_create_managed_software_node);
1110 
1111 int software_node_notify(struct device *dev, unsigned long action)
1112 {
1113 	struct swnode *swnode;
1114 	int ret;
1115 
1116 	swnode = dev_to_swnode(dev);
1117 	if (!swnode)
1118 		return 0;
1119 
1120 	switch (action) {
1121 	case KOBJ_ADD:
1122 		ret = sysfs_create_link_nowarn(&dev->kobj, &swnode->kobj,
1123 					       "software_node");
1124 		if (ret)
1125 			break;
1126 
1127 		ret = sysfs_create_link(&swnode->kobj, &dev->kobj,
1128 					dev_name(dev));
1129 		if (ret) {
1130 			sysfs_remove_link(&dev->kobj, "software_node");
1131 			break;
1132 		}
1133 		kobject_get(&swnode->kobj);
1134 		break;
1135 	case KOBJ_REMOVE:
1136 		sysfs_remove_link(&swnode->kobj, dev_name(dev));
1137 		sysfs_remove_link(&dev->kobj, "software_node");
1138 		kobject_put(&swnode->kobj);
1139 
1140 		if (swnode->managed) {
1141 			set_secondary_fwnode(dev, NULL);
1142 			kobject_put(&swnode->kobj);
1143 		}
1144 		break;
1145 	default:
1146 		break;
1147 	}
1148 
1149 	return 0;
1150 }
1151 
1152 static int __init software_node_init(void)
1153 {
1154 	swnode_kset = kset_create_and_add("software_nodes", NULL, kernel_kobj);
1155 	if (!swnode_kset)
1156 		return -ENOMEM;
1157 	return 0;
1158 }
1159 postcore_initcall(software_node_init);
1160 
1161 static void __exit software_node_exit(void)
1162 {
1163 	ida_destroy(&swnode_root_ids);
1164 	kset_unregister(swnode_kset);
1165 }
1166 __exitcall(software_node_exit);
1167