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