1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * Support for dynamic device trees. 4 * 5 * On some platforms, the device tree can be manipulated at runtime. 6 * The routines in this section support adding, removing and changing 7 * device tree nodes. 8 */ 9 10 #define pr_fmt(fmt) "OF: " fmt 11 12 #include <linux/of.h> 13 #include <linux/spinlock.h> 14 #include <linux/slab.h> 15 #include <linux/string.h> 16 #include <linux/proc_fs.h> 17 18 #include "of_private.h" 19 20 static struct device_node *kobj_to_device_node(struct kobject *kobj) 21 { 22 return container_of(kobj, struct device_node, kobj); 23 } 24 25 /** 26 * of_node_get() - Increment refcount of a node 27 * @node: Node to inc refcount, NULL is supported to simplify writing of 28 * callers 29 * 30 * Return: The node with refcount incremented. 31 */ 32 struct device_node *of_node_get(struct device_node *node) 33 { 34 if (node) 35 kobject_get(&node->kobj); 36 return node; 37 } 38 EXPORT_SYMBOL(of_node_get); 39 40 /** 41 * of_node_put() - Decrement refcount of a node 42 * @node: Node to dec refcount, NULL is supported to simplify writing of 43 * callers 44 */ 45 void of_node_put(struct device_node *node) 46 { 47 if (node) 48 kobject_put(&node->kobj); 49 } 50 EXPORT_SYMBOL(of_node_put); 51 52 static BLOCKING_NOTIFIER_HEAD(of_reconfig_chain); 53 54 int of_reconfig_notifier_register(struct notifier_block *nb) 55 { 56 return blocking_notifier_chain_register(&of_reconfig_chain, nb); 57 } 58 EXPORT_SYMBOL_GPL(of_reconfig_notifier_register); 59 60 int of_reconfig_notifier_unregister(struct notifier_block *nb) 61 { 62 return blocking_notifier_chain_unregister(&of_reconfig_chain, nb); 63 } 64 EXPORT_SYMBOL_GPL(of_reconfig_notifier_unregister); 65 66 static const char *action_names[] = { 67 [0] = "INVALID", 68 [OF_RECONFIG_ATTACH_NODE] = "ATTACH_NODE", 69 [OF_RECONFIG_DETACH_NODE] = "DETACH_NODE", 70 [OF_RECONFIG_ADD_PROPERTY] = "ADD_PROPERTY", 71 [OF_RECONFIG_REMOVE_PROPERTY] = "REMOVE_PROPERTY", 72 [OF_RECONFIG_UPDATE_PROPERTY] = "UPDATE_PROPERTY", 73 }; 74 75 #define _do_print(func, prefix, action, node, prop, ...) ({ \ 76 func("changeset: " prefix "%-15s %pOF%s%s\n", \ 77 ##__VA_ARGS__, action_names[action], node, \ 78 prop ? ":" : "", prop ? prop->name : ""); \ 79 }) 80 #define of_changeset_action_err(...) _do_print(pr_err, __VA_ARGS__) 81 #define of_changeset_action_debug(...) _do_print(pr_debug, __VA_ARGS__) 82 83 int of_reconfig_notify(unsigned long action, struct of_reconfig_data *p) 84 { 85 int rc; 86 struct of_reconfig_data *pr = p; 87 88 of_changeset_action_debug("notify: ", action, pr->dn, pr->prop); 89 90 rc = blocking_notifier_call_chain(&of_reconfig_chain, action, p); 91 return notifier_to_errno(rc); 92 } 93 94 /* 95 * of_reconfig_get_state_change() - Returns new state of device 96 * @action - action of the of notifier 97 * @arg - argument of the of notifier 98 * 99 * Returns the new state of a device based on the notifier used. 100 * 101 * Return: OF_RECONFIG_CHANGE_REMOVE on device going from enabled to 102 * disabled, OF_RECONFIG_CHANGE_ADD on device going from disabled to 103 * enabled and OF_RECONFIG_NO_CHANGE on no change. 104 */ 105 int of_reconfig_get_state_change(unsigned long action, struct of_reconfig_data *pr) 106 { 107 struct property *prop, *old_prop = NULL; 108 int is_status, status_state, old_status_state, prev_state, new_state; 109 110 /* figure out if a device should be created or destroyed */ 111 switch (action) { 112 case OF_RECONFIG_ATTACH_NODE: 113 case OF_RECONFIG_DETACH_NODE: 114 prop = of_find_property(pr->dn, "status", NULL); 115 break; 116 case OF_RECONFIG_ADD_PROPERTY: 117 case OF_RECONFIG_REMOVE_PROPERTY: 118 prop = pr->prop; 119 break; 120 case OF_RECONFIG_UPDATE_PROPERTY: 121 prop = pr->prop; 122 old_prop = pr->old_prop; 123 break; 124 default: 125 return OF_RECONFIG_NO_CHANGE; 126 } 127 128 is_status = 0; 129 status_state = -1; 130 old_status_state = -1; 131 prev_state = -1; 132 new_state = -1; 133 134 if (prop && !strcmp(prop->name, "status")) { 135 is_status = 1; 136 status_state = !strcmp(prop->value, "okay") || 137 !strcmp(prop->value, "ok"); 138 if (old_prop) 139 old_status_state = !strcmp(old_prop->value, "okay") || 140 !strcmp(old_prop->value, "ok"); 141 } 142 143 switch (action) { 144 case OF_RECONFIG_ATTACH_NODE: 145 prev_state = 0; 146 /* -1 & 0 status either missing or okay */ 147 new_state = status_state != 0; 148 break; 149 case OF_RECONFIG_DETACH_NODE: 150 /* -1 & 0 status either missing or okay */ 151 prev_state = status_state != 0; 152 new_state = 0; 153 break; 154 case OF_RECONFIG_ADD_PROPERTY: 155 if (is_status) { 156 /* no status property -> enabled (legacy) */ 157 prev_state = 1; 158 new_state = status_state; 159 } 160 break; 161 case OF_RECONFIG_REMOVE_PROPERTY: 162 if (is_status) { 163 prev_state = status_state; 164 /* no status property -> enabled (legacy) */ 165 new_state = 1; 166 } 167 break; 168 case OF_RECONFIG_UPDATE_PROPERTY: 169 if (is_status) { 170 prev_state = old_status_state != 0; 171 new_state = status_state != 0; 172 } 173 break; 174 } 175 176 if (prev_state == new_state) 177 return OF_RECONFIG_NO_CHANGE; 178 179 return new_state ? OF_RECONFIG_CHANGE_ADD : OF_RECONFIG_CHANGE_REMOVE; 180 } 181 EXPORT_SYMBOL_GPL(of_reconfig_get_state_change); 182 183 int of_property_notify(int action, struct device_node *np, 184 struct property *prop, struct property *oldprop) 185 { 186 struct of_reconfig_data pr; 187 188 /* only call notifiers if the node is attached */ 189 if (!of_node_is_attached(np)) 190 return 0; 191 192 pr.dn = np; 193 pr.prop = prop; 194 pr.old_prop = oldprop; 195 return of_reconfig_notify(action, &pr); 196 } 197 198 static void __of_attach_node(struct device_node *np) 199 { 200 const __be32 *phandle; 201 int sz; 202 unsigned long flags; 203 204 raw_spin_lock_irqsave(&devtree_lock, flags); 205 206 if (!of_node_check_flag(np, OF_OVERLAY)) { 207 np->name = __of_get_property(np, "name", NULL); 208 if (!np->name) 209 np->name = "<NULL>"; 210 211 phandle = __of_get_property(np, "phandle", &sz); 212 if (!phandle) 213 phandle = __of_get_property(np, "linux,phandle", &sz); 214 if (IS_ENABLED(CONFIG_PPC_PSERIES) && !phandle) 215 phandle = __of_get_property(np, "ibm,phandle", &sz); 216 if (phandle && (sz >= 4)) 217 np->phandle = be32_to_cpup(phandle); 218 else 219 np->phandle = 0; 220 } 221 222 np->child = NULL; 223 np->sibling = np->parent->child; 224 np->parent->child = np; 225 of_node_clear_flag(np, OF_DETACHED); 226 np->fwnode.flags |= FWNODE_FLAG_NOT_DEVICE; 227 228 raw_spin_unlock_irqrestore(&devtree_lock, flags); 229 230 __of_attach_node_sysfs(np); 231 } 232 233 /** 234 * of_attach_node() - Plug a device node into the tree and global list. 235 * @np: Pointer to the caller's Device Node 236 */ 237 int of_attach_node(struct device_node *np) 238 { 239 struct of_reconfig_data rd; 240 241 memset(&rd, 0, sizeof(rd)); 242 rd.dn = np; 243 244 mutex_lock(&of_mutex); 245 __of_attach_node(np); 246 mutex_unlock(&of_mutex); 247 248 of_reconfig_notify(OF_RECONFIG_ATTACH_NODE, &rd); 249 250 return 0; 251 } 252 253 void __of_detach_node(struct device_node *np) 254 { 255 struct device_node *parent; 256 unsigned long flags; 257 258 raw_spin_lock_irqsave(&devtree_lock, flags); 259 260 parent = np->parent; 261 if (WARN_ON(of_node_check_flag(np, OF_DETACHED) || !parent)) { 262 raw_spin_unlock_irqrestore(&devtree_lock, flags); 263 return; 264 } 265 266 if (parent->child == np) 267 parent->child = np->sibling; 268 else { 269 struct device_node *prevsib; 270 for (prevsib = np->parent->child; 271 prevsib->sibling != np; 272 prevsib = prevsib->sibling) 273 ; 274 prevsib->sibling = np->sibling; 275 } 276 277 of_node_set_flag(np, OF_DETACHED); 278 279 /* race with of_find_node_by_phandle() prevented by devtree_lock */ 280 __of_phandle_cache_inv_entry(np->phandle); 281 282 raw_spin_unlock_irqrestore(&devtree_lock, flags); 283 284 __of_detach_node_sysfs(np); 285 } 286 287 /** 288 * of_detach_node() - "Unplug" a node from the device tree. 289 * @np: Pointer to the caller's Device Node 290 */ 291 int of_detach_node(struct device_node *np) 292 { 293 struct of_reconfig_data rd; 294 295 memset(&rd, 0, sizeof(rd)); 296 rd.dn = np; 297 298 mutex_lock(&of_mutex); 299 __of_detach_node(np); 300 mutex_unlock(&of_mutex); 301 302 of_reconfig_notify(OF_RECONFIG_DETACH_NODE, &rd); 303 304 return 0; 305 } 306 EXPORT_SYMBOL_GPL(of_detach_node); 307 308 static void property_list_free(struct property *prop_list) 309 { 310 struct property *prop, *next; 311 312 for (prop = prop_list; prop != NULL; prop = next) { 313 next = prop->next; 314 kfree(prop->name); 315 kfree(prop->value); 316 kfree(prop); 317 } 318 } 319 320 /** 321 * of_node_release() - release a dynamically allocated node 322 * @kobj: kernel object of the node to be released 323 * 324 * In of_node_put() this function is passed to kref_put() as the destructor. 325 */ 326 void of_node_release(struct kobject *kobj) 327 { 328 struct device_node *node = kobj_to_device_node(kobj); 329 330 /* 331 * can not use '"%pOF", node' in pr_err() calls from this function 332 * because an of_node_get(node) when refcount is already zero 333 * will result in an error and a stack dump 334 */ 335 336 /* We should never be releasing nodes that haven't been detached. */ 337 if (!of_node_check_flag(node, OF_DETACHED)) { 338 339 pr_err("ERROR: %s() detected bad of_node_put() on %pOF/%s\n", 340 __func__, node->parent, node->full_name); 341 342 /* 343 * of unittests will test this path. Do not print the stack 344 * trace when the error is caused by unittest so that we do 345 * not display what a normal developer might reasonably 346 * consider a real bug. 347 */ 348 if (!IS_ENABLED(CONFIG_OF_UNITTEST) || 349 strcmp(node->parent->full_name, "testcase-data")) { 350 dump_stack(); 351 pr_err("ERROR: next of_node_put() on this node will result in a kobject warning 'refcount_t: underflow; use-after-free.'\n"); 352 } 353 354 return; 355 } 356 if (!of_node_check_flag(node, OF_DYNAMIC)) 357 return; 358 359 if (of_node_check_flag(node, OF_OVERLAY)) { 360 361 if (!of_node_check_flag(node, OF_OVERLAY_FREE_CSET)) { 362 /* premature refcount of zero, do not free memory */ 363 pr_err("ERROR: memory leak before free overlay changeset, %pOF\n", 364 node); 365 return; 366 } 367 368 /* 369 * If node->properties non-empty then properties were added 370 * to this node either by different overlay that has not 371 * yet been removed, or by a non-overlay mechanism. 372 */ 373 if (node->properties) 374 pr_err("ERROR: %s(), unexpected properties in %pOF\n", 375 __func__, node); 376 } 377 378 if (node->child) 379 pr_err("ERROR: %s() unexpected children for %pOF/%s\n", 380 __func__, node->parent, node->full_name); 381 382 property_list_free(node->properties); 383 property_list_free(node->deadprops); 384 fwnode_links_purge(of_fwnode_handle(node)); 385 386 kfree(node->full_name); 387 kfree(node->data); 388 kfree(node); 389 } 390 391 /** 392 * __of_prop_dup - Copy a property dynamically. 393 * @prop: Property to copy 394 * @allocflags: Allocation flags (typically pass GFP_KERNEL) 395 * 396 * Copy a property by dynamically allocating the memory of both the 397 * property structure and the property name & contents. The property's 398 * flags have the OF_DYNAMIC bit set so that we can differentiate between 399 * dynamically allocated properties and not. 400 * 401 * Return: The newly allocated property or NULL on out of memory error. 402 */ 403 struct property *__of_prop_dup(const struct property *prop, gfp_t allocflags) 404 { 405 struct property *new; 406 407 new = kzalloc(sizeof(*new), allocflags); 408 if (!new) 409 return NULL; 410 411 /* 412 * NOTE: There is no check for zero length value. 413 * In case of a boolean property, this will allocate a value 414 * of zero bytes. We do this to work around the use 415 * of of_get_property() calls on boolean values. 416 */ 417 new->name = kstrdup(prop->name, allocflags); 418 new->value = kmemdup(prop->value, prop->length, allocflags); 419 new->length = prop->length; 420 if (!new->name || !new->value) 421 goto err_free; 422 423 /* mark the property as dynamic */ 424 of_property_set_flag(new, OF_DYNAMIC); 425 426 return new; 427 428 err_free: 429 kfree(new->name); 430 kfree(new->value); 431 kfree(new); 432 return NULL; 433 } 434 435 /** 436 * __of_node_dup() - Duplicate or create an empty device node dynamically. 437 * @np: if not NULL, contains properties to be duplicated in new node 438 * @full_name: string value to be duplicated into new node's full_name field 439 * 440 * Create a device tree node, optionally duplicating the properties of 441 * another node. The node data are dynamically allocated and all the node 442 * flags have the OF_DYNAMIC & OF_DETACHED bits set. 443 * 444 * Return: The newly allocated node or NULL on out of memory error. Use 445 * of_node_put() on it when done to free the memory allocated for it. 446 */ 447 struct device_node *__of_node_dup(const struct device_node *np, 448 const char *full_name) 449 { 450 struct device_node *node; 451 452 node = kzalloc(sizeof(*node), GFP_KERNEL); 453 if (!node) 454 return NULL; 455 node->full_name = kstrdup(full_name, GFP_KERNEL); 456 if (!node->full_name) { 457 kfree(node); 458 return NULL; 459 } 460 461 of_node_set_flag(node, OF_DYNAMIC); 462 of_node_set_flag(node, OF_DETACHED); 463 of_node_init(node); 464 465 /* Iterate over and duplicate all properties */ 466 if (np) { 467 struct property *pp, *new_pp; 468 for_each_property_of_node(np, pp) { 469 new_pp = __of_prop_dup(pp, GFP_KERNEL); 470 if (!new_pp) 471 goto err_prop; 472 if (__of_add_property(node, new_pp)) { 473 kfree(new_pp->name); 474 kfree(new_pp->value); 475 kfree(new_pp); 476 goto err_prop; 477 } 478 } 479 } 480 return node; 481 482 err_prop: 483 of_node_put(node); /* Frees the node and properties */ 484 return NULL; 485 } 486 487 /** 488 * of_changeset_create_node - Dynamically create a device node and attach to 489 * a given changeset. 490 * 491 * @ocs: Pointer to changeset 492 * @parent: Pointer to parent device node 493 * @full_name: Node full name 494 * 495 * Return: Pointer to the created device node or NULL in case of an error. 496 */ 497 struct device_node *of_changeset_create_node(struct of_changeset *ocs, 498 struct device_node *parent, 499 const char *full_name) 500 { 501 struct device_node *np; 502 int ret; 503 504 np = __of_node_dup(NULL, full_name); 505 if (!np) 506 return NULL; 507 np->parent = parent; 508 509 ret = of_changeset_attach_node(ocs, np); 510 if (ret) { 511 of_node_put(np); 512 return NULL; 513 } 514 515 return np; 516 } 517 EXPORT_SYMBOL(of_changeset_create_node); 518 519 static void __of_changeset_entry_destroy(struct of_changeset_entry *ce) 520 { 521 if (ce->action == OF_RECONFIG_ATTACH_NODE && 522 of_node_check_flag(ce->np, OF_OVERLAY)) { 523 if (kref_read(&ce->np->kobj.kref) > 1) { 524 pr_err("ERROR: memory leak, expected refcount 1 instead of %d, of_node_get()/of_node_put() unbalanced - destroy cset entry: attach overlay node %pOF\n", 525 kref_read(&ce->np->kobj.kref), ce->np); 526 } else { 527 of_node_set_flag(ce->np, OF_OVERLAY_FREE_CSET); 528 } 529 } 530 531 of_node_put(ce->np); 532 list_del(&ce->node); 533 kfree(ce); 534 } 535 536 static void __of_changeset_entry_invert(struct of_changeset_entry *ce, 537 struct of_changeset_entry *rce) 538 { 539 memcpy(rce, ce, sizeof(*rce)); 540 541 switch (ce->action) { 542 case OF_RECONFIG_ATTACH_NODE: 543 rce->action = OF_RECONFIG_DETACH_NODE; 544 break; 545 case OF_RECONFIG_DETACH_NODE: 546 rce->action = OF_RECONFIG_ATTACH_NODE; 547 break; 548 case OF_RECONFIG_ADD_PROPERTY: 549 rce->action = OF_RECONFIG_REMOVE_PROPERTY; 550 break; 551 case OF_RECONFIG_REMOVE_PROPERTY: 552 rce->action = OF_RECONFIG_ADD_PROPERTY; 553 break; 554 case OF_RECONFIG_UPDATE_PROPERTY: 555 rce->old_prop = ce->prop; 556 rce->prop = ce->old_prop; 557 /* update was used but original property did not exist */ 558 if (!rce->prop) { 559 rce->action = OF_RECONFIG_REMOVE_PROPERTY; 560 rce->prop = ce->prop; 561 } 562 break; 563 } 564 } 565 566 static int __of_changeset_entry_notify(struct of_changeset_entry *ce, 567 bool revert) 568 { 569 struct of_reconfig_data rd; 570 struct of_changeset_entry ce_inverted; 571 int ret = 0; 572 573 if (revert) { 574 __of_changeset_entry_invert(ce, &ce_inverted); 575 ce = &ce_inverted; 576 } 577 578 switch (ce->action) { 579 case OF_RECONFIG_ATTACH_NODE: 580 case OF_RECONFIG_DETACH_NODE: 581 memset(&rd, 0, sizeof(rd)); 582 rd.dn = ce->np; 583 ret = of_reconfig_notify(ce->action, &rd); 584 break; 585 case OF_RECONFIG_ADD_PROPERTY: 586 case OF_RECONFIG_REMOVE_PROPERTY: 587 case OF_RECONFIG_UPDATE_PROPERTY: 588 ret = of_property_notify(ce->action, ce->np, ce->prop, ce->old_prop); 589 break; 590 default: 591 pr_err("invalid devicetree changeset action: %i\n", 592 (int)ce->action); 593 ret = -EINVAL; 594 } 595 596 if (ret) 597 pr_err("changeset notifier error @%pOF\n", ce->np); 598 return ret; 599 } 600 601 static int __of_changeset_entry_apply(struct of_changeset_entry *ce) 602 { 603 int ret = 0; 604 605 of_changeset_action_debug("apply: ", ce->action, ce->np, ce->prop); 606 607 switch (ce->action) { 608 case OF_RECONFIG_ATTACH_NODE: 609 __of_attach_node(ce->np); 610 break; 611 case OF_RECONFIG_DETACH_NODE: 612 __of_detach_node(ce->np); 613 break; 614 case OF_RECONFIG_ADD_PROPERTY: 615 ret = __of_add_property(ce->np, ce->prop); 616 break; 617 case OF_RECONFIG_REMOVE_PROPERTY: 618 ret = __of_remove_property(ce->np, ce->prop); 619 break; 620 621 case OF_RECONFIG_UPDATE_PROPERTY: 622 ret = __of_update_property(ce->np, ce->prop, &ce->old_prop); 623 break; 624 default: 625 ret = -EINVAL; 626 } 627 628 if (ret) { 629 of_changeset_action_err("apply failed: ", ce->action, ce->np, ce->prop); 630 return ret; 631 } 632 633 return 0; 634 } 635 636 static inline int __of_changeset_entry_revert(struct of_changeset_entry *ce) 637 { 638 struct of_changeset_entry ce_inverted; 639 640 __of_changeset_entry_invert(ce, &ce_inverted); 641 return __of_changeset_entry_apply(&ce_inverted); 642 } 643 644 /** 645 * of_changeset_init - Initialize a changeset for use 646 * 647 * @ocs: changeset pointer 648 * 649 * Initialize a changeset structure 650 */ 651 void of_changeset_init(struct of_changeset *ocs) 652 { 653 memset(ocs, 0, sizeof(*ocs)); 654 INIT_LIST_HEAD(&ocs->entries); 655 } 656 EXPORT_SYMBOL_GPL(of_changeset_init); 657 658 /** 659 * of_changeset_destroy - Destroy a changeset 660 * 661 * @ocs: changeset pointer 662 * 663 * Destroys a changeset. Note that if a changeset is applied, 664 * its changes to the tree cannot be reverted. 665 */ 666 void of_changeset_destroy(struct of_changeset *ocs) 667 { 668 struct of_changeset_entry *ce, *cen; 669 670 list_for_each_entry_safe_reverse(ce, cen, &ocs->entries, node) 671 __of_changeset_entry_destroy(ce); 672 } 673 EXPORT_SYMBOL_GPL(of_changeset_destroy); 674 675 /* 676 * Apply the changeset entries in @ocs. 677 * If apply fails, an attempt is made to revert the entries that were 678 * successfully applied. 679 * 680 * If multiple revert errors occur then only the final revert error is reported. 681 * 682 * Returns 0 on success, a negative error value in case of an error. 683 * If a revert error occurs, it is returned in *ret_revert. 684 */ 685 int __of_changeset_apply_entries(struct of_changeset *ocs, int *ret_revert) 686 { 687 struct of_changeset_entry *ce; 688 int ret, ret_tmp; 689 690 pr_debug("changeset: applying...\n"); 691 list_for_each_entry(ce, &ocs->entries, node) { 692 ret = __of_changeset_entry_apply(ce); 693 if (ret) { 694 pr_err("Error applying changeset (%d)\n", ret); 695 list_for_each_entry_continue_reverse(ce, &ocs->entries, 696 node) { 697 ret_tmp = __of_changeset_entry_revert(ce); 698 if (ret_tmp) 699 *ret_revert = ret_tmp; 700 } 701 return ret; 702 } 703 } 704 705 return 0; 706 } 707 708 /* 709 * Returns 0 on success, a negative error value in case of an error. 710 * 711 * If multiple changeset entry notification errors occur then only the 712 * final notification error is reported. 713 */ 714 int __of_changeset_apply_notify(struct of_changeset *ocs) 715 { 716 struct of_changeset_entry *ce; 717 int ret = 0, ret_tmp; 718 719 pr_debug("changeset: emitting notifiers.\n"); 720 721 /* drop the global lock while emitting notifiers */ 722 mutex_unlock(&of_mutex); 723 list_for_each_entry(ce, &ocs->entries, node) { 724 ret_tmp = __of_changeset_entry_notify(ce, 0); 725 if (ret_tmp) 726 ret = ret_tmp; 727 } 728 mutex_lock(&of_mutex); 729 pr_debug("changeset: notifiers sent.\n"); 730 731 return ret; 732 } 733 734 /* 735 * Returns 0 on success, a negative error value in case of an error. 736 * 737 * If a changeset entry apply fails, an attempt is made to revert any 738 * previous entries in the changeset. If any of the reverts fails, 739 * that failure is not reported. Thus the state of the device tree 740 * is unknown if an apply error occurs. 741 */ 742 static int __of_changeset_apply(struct of_changeset *ocs) 743 { 744 int ret, ret_revert = 0; 745 746 ret = __of_changeset_apply_entries(ocs, &ret_revert); 747 if (!ret) 748 ret = __of_changeset_apply_notify(ocs); 749 750 return ret; 751 } 752 753 /** 754 * of_changeset_apply - Applies a changeset 755 * 756 * @ocs: changeset pointer 757 * 758 * Applies a changeset to the live tree. 759 * Any side-effects of live tree state changes are applied here on 760 * success, like creation/destruction of devices and side-effects 761 * like creation of sysfs properties and directories. 762 * 763 * Return: 0 on success, a negative error value in case of an error. 764 * On error the partially applied effects are reverted. 765 */ 766 int of_changeset_apply(struct of_changeset *ocs) 767 { 768 int ret; 769 770 mutex_lock(&of_mutex); 771 ret = __of_changeset_apply(ocs); 772 mutex_unlock(&of_mutex); 773 774 return ret; 775 } 776 EXPORT_SYMBOL_GPL(of_changeset_apply); 777 778 /* 779 * Revert the changeset entries in @ocs. 780 * If revert fails, an attempt is made to re-apply the entries that were 781 * successfully removed. 782 * 783 * If multiple re-apply errors occur then only the final apply error is 784 * reported. 785 * 786 * Returns 0 on success, a negative error value in case of an error. 787 * If an apply error occurs, it is returned in *ret_apply. 788 */ 789 int __of_changeset_revert_entries(struct of_changeset *ocs, int *ret_apply) 790 { 791 struct of_changeset_entry *ce; 792 int ret, ret_tmp; 793 794 pr_debug("changeset: reverting...\n"); 795 list_for_each_entry_reverse(ce, &ocs->entries, node) { 796 ret = __of_changeset_entry_revert(ce); 797 if (ret) { 798 pr_err("Error reverting changeset (%d)\n", ret); 799 list_for_each_entry_continue(ce, &ocs->entries, node) { 800 ret_tmp = __of_changeset_entry_apply(ce); 801 if (ret_tmp) 802 *ret_apply = ret_tmp; 803 } 804 return ret; 805 } 806 } 807 808 return 0; 809 } 810 811 /* 812 * If multiple changeset entry notification errors occur then only the 813 * final notification error is reported. 814 */ 815 int __of_changeset_revert_notify(struct of_changeset *ocs) 816 { 817 struct of_changeset_entry *ce; 818 int ret = 0, ret_tmp; 819 820 pr_debug("changeset: emitting notifiers.\n"); 821 822 /* drop the global lock while emitting notifiers */ 823 mutex_unlock(&of_mutex); 824 list_for_each_entry_reverse(ce, &ocs->entries, node) { 825 ret_tmp = __of_changeset_entry_notify(ce, 1); 826 if (ret_tmp) 827 ret = ret_tmp; 828 } 829 mutex_lock(&of_mutex); 830 pr_debug("changeset: notifiers sent.\n"); 831 832 return ret; 833 } 834 835 static int __of_changeset_revert(struct of_changeset *ocs) 836 { 837 int ret, ret_reply; 838 839 ret_reply = 0; 840 ret = __of_changeset_revert_entries(ocs, &ret_reply); 841 842 if (!ret) 843 ret = __of_changeset_revert_notify(ocs); 844 845 return ret; 846 } 847 848 /** 849 * of_changeset_revert - Reverts an applied changeset 850 * 851 * @ocs: changeset pointer 852 * 853 * Reverts a changeset returning the state of the tree to what it 854 * was before the application. 855 * Any side-effects like creation/destruction of devices and 856 * removal of sysfs properties and directories are applied. 857 * 858 * Return: 0 on success, a negative error value in case of an error. 859 */ 860 int of_changeset_revert(struct of_changeset *ocs) 861 { 862 int ret; 863 864 mutex_lock(&of_mutex); 865 ret = __of_changeset_revert(ocs); 866 mutex_unlock(&of_mutex); 867 868 return ret; 869 } 870 EXPORT_SYMBOL_GPL(of_changeset_revert); 871 872 /** 873 * of_changeset_action - Add an action to the tail of the changeset list 874 * 875 * @ocs: changeset pointer 876 * @action: action to perform 877 * @np: Pointer to device node 878 * @prop: Pointer to property 879 * 880 * On action being one of: 881 * + OF_RECONFIG_ATTACH_NODE 882 * + OF_RECONFIG_DETACH_NODE, 883 * + OF_RECONFIG_ADD_PROPERTY 884 * + OF_RECONFIG_REMOVE_PROPERTY, 885 * + OF_RECONFIG_UPDATE_PROPERTY 886 * 887 * Return: 0 on success, a negative error value in case of an error. 888 */ 889 int of_changeset_action(struct of_changeset *ocs, unsigned long action, 890 struct device_node *np, struct property *prop) 891 { 892 struct of_changeset_entry *ce; 893 894 if (WARN_ON(action >= ARRAY_SIZE(action_names))) 895 return -EINVAL; 896 897 ce = kzalloc(sizeof(*ce), GFP_KERNEL); 898 if (!ce) 899 return -ENOMEM; 900 901 /* get a reference to the node */ 902 ce->action = action; 903 ce->np = of_node_get(np); 904 ce->prop = prop; 905 906 /* add it to the list */ 907 list_add_tail(&ce->node, &ocs->entries); 908 return 0; 909 } 910 EXPORT_SYMBOL_GPL(of_changeset_action); 911 912 static int of_changeset_add_prop_helper(struct of_changeset *ocs, 913 struct device_node *np, 914 const struct property *pp) 915 { 916 struct property *new_pp; 917 int ret; 918 919 new_pp = __of_prop_dup(pp, GFP_KERNEL); 920 if (!new_pp) 921 return -ENOMEM; 922 923 ret = of_changeset_add_property(ocs, np, new_pp); 924 if (ret) { 925 kfree(new_pp->name); 926 kfree(new_pp->value); 927 kfree(new_pp); 928 } 929 930 return ret; 931 } 932 933 /** 934 * of_changeset_add_prop_string - Add a string property to a changeset 935 * 936 * @ocs: changeset pointer 937 * @np: device node pointer 938 * @prop_name: name of the property to be added 939 * @str: pointer to null terminated string 940 * 941 * Create a string property and add it to a changeset. 942 * 943 * Return: 0 on success, a negative error value in case of an error. 944 */ 945 int of_changeset_add_prop_string(struct of_changeset *ocs, 946 struct device_node *np, 947 const char *prop_name, const char *str) 948 { 949 struct property prop; 950 951 prop.name = (char *)prop_name; 952 prop.length = strlen(str) + 1; 953 prop.value = (void *)str; 954 955 return of_changeset_add_prop_helper(ocs, np, &prop); 956 } 957 EXPORT_SYMBOL_GPL(of_changeset_add_prop_string); 958 959 /** 960 * of_changeset_add_prop_string_array - Add a string list property to 961 * a changeset 962 * 963 * @ocs: changeset pointer 964 * @np: device node pointer 965 * @prop_name: name of the property to be added 966 * @str_array: pointer to an array of null terminated strings 967 * @sz: number of string array elements 968 * 969 * Create a string list property and add it to a changeset. 970 * 971 * Return: 0 on success, a negative error value in case of an error. 972 */ 973 int of_changeset_add_prop_string_array(struct of_changeset *ocs, 974 struct device_node *np, 975 const char *prop_name, 976 const char **str_array, size_t sz) 977 { 978 struct property prop; 979 int i, ret; 980 char *vp; 981 982 prop.name = (char *)prop_name; 983 984 prop.length = 0; 985 for (i = 0; i < sz; i++) 986 prop.length += strlen(str_array[i]) + 1; 987 988 prop.value = kmalloc(prop.length, GFP_KERNEL); 989 if (!prop.value) 990 return -ENOMEM; 991 992 vp = prop.value; 993 for (i = 0; i < sz; i++) { 994 vp += snprintf(vp, (char *)prop.value + prop.length - vp, "%s", 995 str_array[i]) + 1; 996 } 997 ret = of_changeset_add_prop_helper(ocs, np, &prop); 998 kfree(prop.value); 999 1000 return ret; 1001 } 1002 EXPORT_SYMBOL_GPL(of_changeset_add_prop_string_array); 1003 1004 /** 1005 * of_changeset_add_prop_u32_array - Add a property of 32 bit integers 1006 * property to a changeset 1007 * 1008 * @ocs: changeset pointer 1009 * @np: device node pointer 1010 * @prop_name: name of the property to be added 1011 * @array: pointer to an array of 32 bit integers 1012 * @sz: number of array elements 1013 * 1014 * Create a property of 32 bit integers and add it to a changeset. 1015 * 1016 * Return: 0 on success, a negative error value in case of an error. 1017 */ 1018 int of_changeset_add_prop_u32_array(struct of_changeset *ocs, 1019 struct device_node *np, 1020 const char *prop_name, 1021 const u32 *array, size_t sz) 1022 { 1023 struct property prop; 1024 __be32 *val; 1025 int i, ret; 1026 1027 val = kcalloc(sz, sizeof(__be32), GFP_KERNEL); 1028 if (!val) 1029 return -ENOMEM; 1030 1031 for (i = 0; i < sz; i++) 1032 val[i] = cpu_to_be32(array[i]); 1033 prop.name = (char *)prop_name; 1034 prop.length = sizeof(u32) * sz; 1035 prop.value = (void *)val; 1036 1037 ret = of_changeset_add_prop_helper(ocs, np, &prop); 1038 kfree(val); 1039 1040 return ret; 1041 } 1042 EXPORT_SYMBOL_GPL(of_changeset_add_prop_u32_array); 1043