Merge remote-tracking branch 'riscv/riscv-fix-32bit' into fixes
[linux-2.6-microblaze.git] / drivers / base / swnode.c
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
1049         /*
1050          * If the device has been fully registered by the time this function is
1051          * called, software_node_notify() must be called separately so that the
1052          * symlinks get created and the reference count of the node is kept in
1053          * balance.
1054          */
1055         if (device_is_registered(dev))
1056                 software_node_notify(dev, KOBJ_ADD);
1057
1058         return 0;
1059 }
1060 EXPORT_SYMBOL_GPL(device_add_software_node);
1061
1062 /**
1063  * device_remove_software_node - Remove device's software node
1064  * @dev: The device with the software node.
1065  *
1066  * This function will unregister the software node of @dev.
1067  */
1068 void device_remove_software_node(struct device *dev)
1069 {
1070         struct swnode *swnode;
1071
1072         swnode = dev_to_swnode(dev);
1073         if (!swnode)
1074                 return;
1075
1076         if (device_is_registered(dev))
1077                 software_node_notify(dev, KOBJ_REMOVE);
1078         set_secondary_fwnode(dev, NULL);
1079         kobject_put(&swnode->kobj);
1080 }
1081 EXPORT_SYMBOL_GPL(device_remove_software_node);
1082
1083 /**
1084  * device_create_managed_software_node - Create a software node for a device
1085  * @dev: The device the software node is assigned to.
1086  * @properties: Device properties for the software node.
1087  * @parent: Parent of the software node.
1088  *
1089  * Creates a software node as a managed resource for @dev, which means the
1090  * lifetime of the newly created software node is tied to the lifetime of @dev.
1091  * Software nodes created with this function should not be reused or shared
1092  * because of that. The function takes a deep copy of @properties for the
1093  * software node.
1094  *
1095  * Since the new software node is assigned directly to @dev, and since it should
1096  * not be shared, it is not returned to the caller. The function returns 0 on
1097  * success, and errno in case of an error.
1098  */
1099 int device_create_managed_software_node(struct device *dev,
1100                                         const struct property_entry *properties,
1101                                         const struct software_node *parent)
1102 {
1103         struct fwnode_handle *p = software_node_fwnode(parent);
1104         struct fwnode_handle *fwnode;
1105
1106         if (parent && !p)
1107                 return -EINVAL;
1108
1109         fwnode = fwnode_create_software_node(properties, p);
1110         if (IS_ERR(fwnode))
1111                 return PTR_ERR(fwnode);
1112
1113         to_swnode(fwnode)->managed = true;
1114         set_secondary_fwnode(dev, fwnode);
1115
1116         return 0;
1117 }
1118 EXPORT_SYMBOL_GPL(device_create_managed_software_node);
1119
1120 int software_node_notify(struct device *dev, unsigned long action)
1121 {
1122         struct swnode *swnode;
1123         int ret;
1124
1125         swnode = dev_to_swnode(dev);
1126         if (!swnode)
1127                 return 0;
1128
1129         switch (action) {
1130         case KOBJ_ADD:
1131                 ret = sysfs_create_link(&dev->kobj, &swnode->kobj, "software_node");
1132                 if (ret)
1133                         break;
1134
1135                 ret = sysfs_create_link(&swnode->kobj, &dev->kobj,
1136                                         dev_name(dev));
1137                 if (ret) {
1138                         sysfs_remove_link(&dev->kobj, "software_node");
1139                         break;
1140                 }
1141                 kobject_get(&swnode->kobj);
1142                 break;
1143         case KOBJ_REMOVE:
1144                 sysfs_remove_link(&swnode->kobj, dev_name(dev));
1145                 sysfs_remove_link(&dev->kobj, "software_node");
1146                 kobject_put(&swnode->kobj);
1147
1148                 if (swnode->managed) {
1149                         set_secondary_fwnode(dev, NULL);
1150                         kobject_put(&swnode->kobj);
1151                 }
1152                 break;
1153         default:
1154                 break;
1155         }
1156
1157         return 0;
1158 }
1159
1160 static int __init software_node_init(void)
1161 {
1162         swnode_kset = kset_create_and_add("software_nodes", NULL, kernel_kobj);
1163         if (!swnode_kset)
1164                 return -ENOMEM;
1165         return 0;
1166 }
1167 postcore_initcall(software_node_init);
1168
1169 static void __exit software_node_exit(void)
1170 {
1171         ida_destroy(&swnode_root_ids);
1172         kset_unregister(swnode_kset);
1173 }
1174 __exitcall(software_node_exit);