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