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