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 20static 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 */ 32struct device_node *of_node_get(struct device_node *node) 33{ 34 if (node) 35 kobject_get(&node->kobj); 36 return node; 37} 38EXPORT_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 */ 45void of_node_put(struct device_node *node) 46{ 47 if (node) 48 kobject_put(&node->kobj); 49} 50EXPORT_SYMBOL(of_node_put); 51 52static BLOCKING_NOTIFIER_HEAD(of_reconfig_chain); 53 54int of_reconfig_notifier_register(struct notifier_block *nb) 55{ 56 return blocking_notifier_chain_register(&of_reconfig_chain, nb); 57} 58EXPORT_SYMBOL_GPL(of_reconfig_notifier_register); 59 60int of_reconfig_notifier_unregister(struct notifier_block *nb) 61{ 62 return blocking_notifier_chain_unregister(&of_reconfig_chain, nb); 63} 64EXPORT_SYMBOL_GPL(of_reconfig_notifier_unregister); 65 66static 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 75int of_reconfig_notify(unsigned long action, struct of_reconfig_data *p) 76{ 77 int rc; 78#ifdef DEBUG 79 struct of_reconfig_data *pr = p; 80 81 switch (action) { 82 case OF_RECONFIG_ATTACH_NODE: 83 case OF_RECONFIG_DETACH_NODE: 84 pr_debug("notify %-15s %pOF\n", action_names[action], 85 pr->dn); 86 break; 87 case OF_RECONFIG_ADD_PROPERTY: 88 case OF_RECONFIG_REMOVE_PROPERTY: 89 case OF_RECONFIG_UPDATE_PROPERTY: 90 pr_debug("notify %-15s %pOF:%s\n", action_names[action], 91 pr->dn, pr->prop->name); 92 break; 93 94 } 95#endif 96 rc = blocking_notifier_call_chain(&of_reconfig_chain, action, p); 97 return notifier_to_errno(rc); 98} 99 100/* 101 * of_reconfig_get_state_change() - Returns new state of device 102 * @action - action of the of notifier 103 * @arg - argument of the of notifier 104 * 105 * Returns the new state of a device based on the notifier used. 106 * 107 * Return: OF_RECONFIG_CHANGE_REMOVE on device going from enabled to 108 * disabled, OF_RECONFIG_CHANGE_ADD on device going from disabled to 109 * enabled and OF_RECONFIG_NO_CHANGE on no change. 110 */ 111int of_reconfig_get_state_change(unsigned long action, struct of_reconfig_data *pr) 112{ 113 struct property *prop, *old_prop = NULL; 114 int is_status, status_state, old_status_state, prev_state, new_state; 115 116 /* figure out if a device should be created or destroyed */ 117 switch (action) { 118 case OF_RECONFIG_ATTACH_NODE: 119 case OF_RECONFIG_DETACH_NODE: 120 prop = of_find_property(pr->dn, "status", NULL); 121 break; 122 case OF_RECONFIG_ADD_PROPERTY: 123 case OF_RECONFIG_REMOVE_PROPERTY: 124 prop = pr->prop; 125 break; 126 case OF_RECONFIG_UPDATE_PROPERTY: 127 prop = pr->prop; 128 old_prop = pr->old_prop; 129 break; 130 default: 131 return OF_RECONFIG_NO_CHANGE; 132 } 133 134 is_status = 0; 135 status_state = -1; 136 old_status_state = -1; 137 prev_state = -1; 138 new_state = -1; 139 140 if (prop && !strcmp(prop->name, "status")) { 141 is_status = 1; 142 status_state = !strcmp(prop->value, "okay") || 143 !strcmp(prop->value, "ok"); 144 if (old_prop) 145 old_status_state = !strcmp(old_prop->value, "okay") || 146 !strcmp(old_prop->value, "ok"); 147 } 148 149 switch (action) { 150 case OF_RECONFIG_ATTACH_NODE: 151 prev_state = 0; 152 /* -1 & 0 status either missing or okay */ 153 new_state = status_state != 0; 154 break; 155 case OF_RECONFIG_DETACH_NODE: 156 /* -1 & 0 status either missing or okay */ 157 prev_state = status_state != 0; 158 new_state = 0; 159 break; 160 case OF_RECONFIG_ADD_PROPERTY: 161 if (is_status) { 162 /* no status property -> enabled (legacy) */ 163 prev_state = 1; 164 new_state = status_state; 165 } 166 break; 167 case OF_RECONFIG_REMOVE_PROPERTY: 168 if (is_status) { 169 prev_state = status_state; 170 /* no status property -> enabled (legacy) */ 171 new_state = 1; 172 } 173 break; 174 case OF_RECONFIG_UPDATE_PROPERTY: 175 if (is_status) { 176 prev_state = old_status_state != 0; 177 new_state = status_state != 0; 178 } 179 break; 180 } 181 182 if (prev_state == new_state) 183 return OF_RECONFIG_NO_CHANGE; 184 185 return new_state ? OF_RECONFIG_CHANGE_ADD : OF_RECONFIG_CHANGE_REMOVE; 186} 187EXPORT_SYMBOL_GPL(of_reconfig_get_state_change); 188 189int of_property_notify(int action, struct device_node *np, 190 struct property *prop, struct property *oldprop) 191{ 192 struct of_reconfig_data pr; 193 194 /* only call notifiers if the node is attached */ 195 if (!of_node_is_attached(np)) 196 return 0; 197 198 pr.dn = np; 199 pr.prop = prop; 200 pr.old_prop = oldprop; 201 return of_reconfig_notify(action, &pr); 202} 203 204static void __of_attach_node(struct device_node *np) 205{ 206 const __be32 *phandle; 207 int sz; 208 209 if (!of_node_check_flag(np, OF_OVERLAY)) { 210 np->name = __of_get_property(np, "name", NULL); 211 if (!np->name) 212 np->name = "<NULL>"; 213 214 phandle = __of_get_property(np, "phandle", &sz); 215 if (!phandle) 216 phandle = __of_get_property(np, "linux,phandle", &sz); 217 if (IS_ENABLED(CONFIG_PPC_PSERIES) && !phandle) 218 phandle = __of_get_property(np, "ibm,phandle", &sz); 219 if (phandle && (sz >= 4)) 220 np->phandle = be32_to_cpup(phandle); 221 else 222 np->phandle = 0; 223 } 224 225 np->child = NULL; 226 np->sibling = np->parent->child; 227 np->parent->child = np; 228 of_node_clear_flag(np, OF_DETACHED); 229} 230 231/** 232 * of_attach_node() - Plug a device node into the tree and global list. 233 */ 234int of_attach_node(struct device_node *np) 235{ 236 struct of_reconfig_data rd; 237 unsigned long flags; 238 239 memset(&rd, 0, sizeof(rd)); 240 rd.dn = np; 241 242 mutex_lock(&of_mutex); 243 raw_spin_lock_irqsave(&devtree_lock, flags); 244 __of_attach_node(np); 245 raw_spin_unlock_irqrestore(&devtree_lock, flags); 246 247 __of_attach_node_sysfs(np); 248 mutex_unlock(&of_mutex); 249 250 of_reconfig_notify(OF_RECONFIG_ATTACH_NODE, &rd); 251 252 return 0; 253} 254 255void __of_detach_node(struct device_node *np) 256{ 257 struct device_node *parent; 258 259 if (WARN_ON(of_node_check_flag(np, OF_DETACHED))) 260 return; 261 262 parent = np->parent; 263 if (WARN_ON(!parent)) 264 return; 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 283/** 284 * of_detach_node() - "Unplug" a node from the device tree. 285 */ 286int of_detach_node(struct device_node *np) 287{ 288 struct of_reconfig_data rd; 289 unsigned long flags; 290 291 memset(&rd, 0, sizeof(rd)); 292 rd.dn = np; 293 294 mutex_lock(&of_mutex); 295 raw_spin_lock_irqsave(&devtree_lock, flags); 296 __of_detach_node(np); 297 raw_spin_unlock_irqrestore(&devtree_lock, flags); 298 299 __of_detach_node_sysfs(np); 300 mutex_unlock(&of_mutex); 301 302 of_reconfig_notify(OF_RECONFIG_DETACH_NODE, &rd); 303 304 return 0; 305} 306EXPORT_SYMBOL_GPL(of_detach_node); 307 308static 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 * @kref: kref element of the node to be released 323 * 324 * In of_node_put() this function is passed to kref_put() as the destructor. 325 */ 326void of_node_release(struct kobject *kobj) 327{ 328 struct device_node *node = kobj_to_device_node(kobj); 329 330 /* We should never be releasing nodes that haven't been detached. */ 331 if (!of_node_check_flag(node, OF_DETACHED)) { 332 pr_err("ERROR: Bad of_node_put() on %pOF\n", node); 333 dump_stack(); 334 return; 335 } 336 if (!of_node_check_flag(node, OF_DYNAMIC)) 337 return; 338 339 if (of_node_check_flag(node, OF_OVERLAY)) { 340 341 if (!of_node_check_flag(node, OF_OVERLAY_FREE_CSET)) { 342 /* premature refcount of zero, do not free memory */ 343 pr_err("ERROR: memory leak before free overlay changeset, %pOF\n", 344 node); 345 return; 346 } 347 348 /* 349 * If node->properties non-empty then properties were added 350 * to this node either by different overlay that has not 351 * yet been removed, or by a non-overlay mechanism. 352 */ 353 if (node->properties) 354 pr_err("ERROR: %s(), unexpected properties in %pOF\n", 355 __func__, node); 356 } 357 358 property_list_free(node->properties); 359 property_list_free(node->deadprops); 360 361 kfree(node->full_name); 362 kfree(node->data); 363 kfree(node); 364} 365 366/** 367 * __of_prop_dup - Copy a property dynamically. 368 * @prop: Property to copy 369 * @allocflags: Allocation flags (typically pass GFP_KERNEL) 370 * 371 * Copy a property by dynamically allocating the memory of both the 372 * property structure and the property name & contents. The property's 373 * flags have the OF_DYNAMIC bit set so that we can differentiate between 374 * dynamically allocated properties and not. 375 * 376 * Return: The newly allocated property or NULL on out of memory error. 377 */ 378struct property *__of_prop_dup(const struct property *prop, gfp_t allocflags) 379{ 380 struct property *new; 381 382 new = kzalloc(sizeof(*new), allocflags); 383 if (!new) 384 return NULL; 385 386 /* 387 * NOTE: There is no check for zero length value. 388 * In case of a boolean property, this will allocate a value 389 * of zero bytes. We do this to work around the use 390 * of of_get_property() calls on boolean values. 391 */ 392 new->name = kstrdup(prop->name, allocflags); 393 new->value = kmemdup(prop->value, prop->length, allocflags); 394 new->length = prop->length; 395 if (!new->name || !new->value) 396 goto err_free; 397 398 /* mark the property as dynamic */ 399 of_property_set_flag(new, OF_DYNAMIC); 400 401 return new; 402 403 err_free: 404 kfree(new->name); 405 kfree(new->value); 406 kfree(new); 407 return NULL; 408} 409 410/** 411 * __of_node_dup() - Duplicate or create an empty device node dynamically. 412 * @np: if not NULL, contains properties to be duplicated in new node 413 * @full_name: string value to be duplicated into new node's full_name field 414 * 415 * Create a device tree node, optionally duplicating the properties of 416 * another node. The node data are dynamically allocated and all the node 417 * flags have the OF_DYNAMIC & OF_DETACHED bits set. 418 * 419 * Return: The newly allocated node or NULL on out of memory error. 420 */ 421struct device_node *__of_node_dup(const struct device_node *np, 422 const char *full_name) 423{ 424 struct device_node *node; 425 426 node = kzalloc(sizeof(*node), GFP_KERNEL); 427 if (!node) 428 return NULL; 429 node->full_name = kstrdup(full_name, GFP_KERNEL); 430 if (!node->full_name) { 431 kfree(node); 432 return NULL; 433 } 434 435 of_node_set_flag(node, OF_DYNAMIC); 436 of_node_set_flag(node, OF_DETACHED); 437 of_node_init(node); 438 439 /* Iterate over and duplicate all properties */ 440 if (np) { 441 struct property *pp, *new_pp; 442 for_each_property_of_node(np, pp) { 443 new_pp = __of_prop_dup(pp, GFP_KERNEL); 444 if (!new_pp) 445 goto err_prop; 446 if (__of_add_property(node, new_pp)) { 447 kfree(new_pp->name); 448 kfree(new_pp->value); 449 kfree(new_pp); 450 goto err_prop; 451 } 452 } 453 } 454 return node; 455 456 err_prop: 457 of_node_put(node); /* Frees the node and properties */ 458 return NULL; 459} 460 461static void __of_changeset_entry_destroy(struct of_changeset_entry *ce) 462{ 463 if (ce->action == OF_RECONFIG_ATTACH_NODE && 464 of_node_check_flag(ce->np, OF_OVERLAY)) { 465 if (kref_read(&ce->np->kobj.kref) > 1) { 466 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", 467 kref_read(&ce->np->kobj.kref), ce->np); 468 } else { 469 of_node_set_flag(ce->np, OF_OVERLAY_FREE_CSET); 470 } 471 } 472 473 of_node_put(ce->np); 474 list_del(&ce->node); 475 kfree(ce); 476} 477 478#ifdef DEBUG 479static void __of_changeset_entry_dump(struct of_changeset_entry *ce) 480{ 481 switch (ce->action) { 482 case OF_RECONFIG_ADD_PROPERTY: 483 case OF_RECONFIG_REMOVE_PROPERTY: 484 case OF_RECONFIG_UPDATE_PROPERTY: 485 pr_debug("cset<%p> %-15s %pOF/%s\n", ce, action_names[ce->action], 486 ce->np, ce->prop->name); 487 break; 488 case OF_RECONFIG_ATTACH_NODE: 489 case OF_RECONFIG_DETACH_NODE: 490 pr_debug("cset<%p> %-15s %pOF\n", ce, action_names[ce->action], 491 ce->np); 492 break; 493 } 494} 495#else 496static inline void __of_changeset_entry_dump(struct of_changeset_entry *ce) 497{ 498 /* empty */ 499} 500#endif 501 502static void __of_changeset_entry_invert(struct of_changeset_entry *ce, 503 struct of_changeset_entry *rce) 504{ 505 memcpy(rce, ce, sizeof(*rce)); 506 507 switch (ce->action) { 508 case OF_RECONFIG_ATTACH_NODE: 509 rce->action = OF_RECONFIG_DETACH_NODE; 510 break; 511 case OF_RECONFIG_DETACH_NODE: 512 rce->action = OF_RECONFIG_ATTACH_NODE; 513 break; 514 case OF_RECONFIG_ADD_PROPERTY: 515 rce->action = OF_RECONFIG_REMOVE_PROPERTY; 516 break; 517 case OF_RECONFIG_REMOVE_PROPERTY: 518 rce->action = OF_RECONFIG_ADD_PROPERTY; 519 break; 520 case OF_RECONFIG_UPDATE_PROPERTY: 521 rce->old_prop = ce->prop; 522 rce->prop = ce->old_prop; 523 /* update was used but original property did not exist */ 524 if (!rce->prop) { 525 rce->action = OF_RECONFIG_REMOVE_PROPERTY; 526 rce->prop = ce->prop; 527 } 528 break; 529 } 530} 531 532static int __of_changeset_entry_notify(struct of_changeset_entry *ce, 533 bool revert) 534{ 535 struct of_reconfig_data rd; 536 struct of_changeset_entry ce_inverted; 537 int ret = 0; 538 539 if (revert) { 540 __of_changeset_entry_invert(ce, &ce_inverted); 541 ce = &ce_inverted; 542 } 543 544 switch (ce->action) { 545 case OF_RECONFIG_ATTACH_NODE: 546 case OF_RECONFIG_DETACH_NODE: 547 memset(&rd, 0, sizeof(rd)); 548 rd.dn = ce->np; 549 ret = of_reconfig_notify(ce->action, &rd); 550 break; 551 case OF_RECONFIG_ADD_PROPERTY: 552 case OF_RECONFIG_REMOVE_PROPERTY: 553 case OF_RECONFIG_UPDATE_PROPERTY: 554 ret = of_property_notify(ce->action, ce->np, ce->prop, ce->old_prop); 555 break; 556 default: 557 pr_err("invalid devicetree changeset action: %i\n", 558 (int)ce->action); 559 ret = -EINVAL; 560 } 561 562 if (ret) 563 pr_err("changeset notifier error @%pOF\n", ce->np); 564 return ret; 565} 566 567static int __of_changeset_entry_apply(struct of_changeset_entry *ce) 568{ 569 struct property *old_prop, **propp; 570 unsigned long flags; 571 int ret = 0; 572 573 __of_changeset_entry_dump(ce); 574 575 raw_spin_lock_irqsave(&devtree_lock, flags); 576 switch (ce->action) { 577 case OF_RECONFIG_ATTACH_NODE: 578 __of_attach_node(ce->np); 579 break; 580 case OF_RECONFIG_DETACH_NODE: 581 __of_detach_node(ce->np); 582 break; 583 case OF_RECONFIG_ADD_PROPERTY: 584 /* If the property is in deadprops then it must be removed */ 585 for (propp = &ce->np->deadprops; *propp; propp = &(*propp)->next) { 586 if (*propp == ce->prop) { 587 *propp = ce->prop->next; 588 ce->prop->next = NULL; 589 break; 590 } 591 } 592 593 ret = __of_add_property(ce->np, ce->prop); 594 break; 595 case OF_RECONFIG_REMOVE_PROPERTY: 596 ret = __of_remove_property(ce->np, ce->prop); 597 break; 598 599 case OF_RECONFIG_UPDATE_PROPERTY: 600 /* If the property is in deadprops then it must be removed */ 601 for (propp = &ce->np->deadprops; *propp; propp = &(*propp)->next) { 602 if (*propp == ce->prop) { 603 *propp = ce->prop->next; 604 ce->prop->next = NULL; 605 break; 606 } 607 } 608 609 ret = __of_update_property(ce->np, ce->prop, &old_prop); 610 break; 611 default: 612 ret = -EINVAL; 613 } 614 raw_spin_unlock_irqrestore(&devtree_lock, flags); 615 616 if (ret) { 617 pr_err("changeset: apply failed: %-15s %pOF:%s\n", 618 action_names[ce->action], ce->np, ce->prop->name); 619 return ret; 620 } 621 622 switch (ce->action) { 623 case OF_RECONFIG_ATTACH_NODE: 624 __of_attach_node_sysfs(ce->np); 625 break; 626 case OF_RECONFIG_DETACH_NODE: 627 __of_detach_node_sysfs(ce->np); 628 break; 629 case OF_RECONFIG_ADD_PROPERTY: 630 /* ignore duplicate names */ 631 __of_add_property_sysfs(ce->np, ce->prop); 632 break; 633 case OF_RECONFIG_REMOVE_PROPERTY: 634 __of_remove_property_sysfs(ce->np, ce->prop); 635 break; 636 case OF_RECONFIG_UPDATE_PROPERTY: 637 __of_update_property_sysfs(ce->np, ce->prop, ce->old_prop); 638 break; 639 } 640 641 return 0; 642} 643 644static inline int __of_changeset_entry_revert(struct of_changeset_entry *ce) 645{ 646 struct of_changeset_entry ce_inverted; 647 648 __of_changeset_entry_invert(ce, &ce_inverted); 649 return __of_changeset_entry_apply(&ce_inverted); 650} 651 652/** 653 * of_changeset_init - Initialize a changeset for use 654 * 655 * @ocs: changeset pointer 656 * 657 * Initialize a changeset structure 658 */ 659void of_changeset_init(struct of_changeset *ocs) 660{ 661 memset(ocs, 0, sizeof(*ocs)); 662 INIT_LIST_HEAD(&ocs->entries); 663} 664EXPORT_SYMBOL_GPL(of_changeset_init); 665 666/** 667 * of_changeset_destroy - Destroy a changeset 668 * 669 * @ocs: changeset pointer 670 * 671 * Destroys a changeset. Note that if a changeset is applied, 672 * its changes to the tree cannot be reverted. 673 */ 674void of_changeset_destroy(struct of_changeset *ocs) 675{ 676 struct of_changeset_entry *ce, *cen; 677 678 list_for_each_entry_safe_reverse(ce, cen, &ocs->entries, node) 679 __of_changeset_entry_destroy(ce); 680} 681EXPORT_SYMBOL_GPL(of_changeset_destroy); 682 683/* 684 * Apply the changeset entries in @ocs. 685 * If apply fails, an attempt is made to revert the entries that were 686 * successfully applied. 687 * 688 * If multiple revert errors occur then only the final revert error is reported. 689 * 690 * Returns 0 on success, a negative error value in case of an error. 691 * If a revert error occurs, it is returned in *ret_revert. 692 */ 693int __of_changeset_apply_entries(struct of_changeset *ocs, int *ret_revert) 694{ 695 struct of_changeset_entry *ce; 696 int ret, ret_tmp; 697 698 pr_debug("changeset: applying...\n"); 699 list_for_each_entry(ce, &ocs->entries, node) { 700 ret = __of_changeset_entry_apply(ce); 701 if (ret) { 702 pr_err("Error applying changeset (%d)\n", ret); 703 list_for_each_entry_continue_reverse(ce, &ocs->entries, 704 node) { 705 ret_tmp = __of_changeset_entry_revert(ce); 706 if (ret_tmp) 707 *ret_revert = ret_tmp; 708 } 709 return ret; 710 } 711 } 712 713 return 0; 714} 715 716/* 717 * Returns 0 on success, a negative error value in case of an error. 718 * 719 * If multiple changeset entry notification errors occur then only the 720 * final notification error is reported. 721 */ 722int __of_changeset_apply_notify(struct of_changeset *ocs) 723{ 724 struct of_changeset_entry *ce; 725 int ret = 0, ret_tmp; 726 727 pr_debug("changeset: emitting notifiers.\n"); 728 729 /* drop the global lock while emitting notifiers */ 730 mutex_unlock(&of_mutex); 731 list_for_each_entry(ce, &ocs->entries, node) { 732 ret_tmp = __of_changeset_entry_notify(ce, 0); 733 if (ret_tmp) 734 ret = ret_tmp; 735 } 736 mutex_lock(&of_mutex); 737 pr_debug("changeset: notifiers sent.\n"); 738 739 return ret; 740} 741 742/* 743 * Returns 0 on success, a negative error value in case of an error. 744 * 745 * If a changeset entry apply fails, an attempt is made to revert any 746 * previous entries in the changeset. If any of the reverts fails, 747 * that failure is not reported. Thus the state of the device tree 748 * is unknown if an apply error occurs. 749 */ 750static int __of_changeset_apply(struct of_changeset *ocs) 751{ 752 int ret, ret_revert = 0; 753 754 ret = __of_changeset_apply_entries(ocs, &ret_revert); 755 if (!ret) 756 ret = __of_changeset_apply_notify(ocs); 757 758 return ret; 759} 760 761/** 762 * of_changeset_apply - Applies a changeset 763 * 764 * @ocs: changeset pointer 765 * 766 * Applies a changeset to the live tree. 767 * Any side-effects of live tree state changes are applied here on 768 * success, like creation/destruction of devices and side-effects 769 * like creation of sysfs properties and directories. 770 * 771 * Return: 0 on success, a negative error value in case of an error. 772 * On error the partially applied effects are reverted. 773 */ 774int of_changeset_apply(struct of_changeset *ocs) 775{ 776 int ret; 777 778 mutex_lock(&of_mutex); 779 ret = __of_changeset_apply(ocs); 780 mutex_unlock(&of_mutex); 781 782 return ret; 783} 784EXPORT_SYMBOL_GPL(of_changeset_apply); 785 786/* 787 * Revert the changeset entries in @ocs. 788 * If revert fails, an attempt is made to re-apply the entries that were 789 * successfully removed. 790 * 791 * If multiple re-apply errors occur then only the final apply error is 792 * reported. 793 * 794 * Returns 0 on success, a negative error value in case of an error. 795 * If an apply error occurs, it is returned in *ret_apply. 796 */ 797int __of_changeset_revert_entries(struct of_changeset *ocs, int *ret_apply) 798{ 799 struct of_changeset_entry *ce; 800 int ret, ret_tmp; 801 802 pr_debug("changeset: reverting...\n"); 803 list_for_each_entry_reverse(ce, &ocs->entries, node) { 804 ret = __of_changeset_entry_revert(ce); 805 if (ret) { 806 pr_err("Error reverting changeset (%d)\n", ret); 807 list_for_each_entry_continue(ce, &ocs->entries, node) { 808 ret_tmp = __of_changeset_entry_apply(ce); 809 if (ret_tmp) 810 *ret_apply = ret_tmp; 811 } 812 return ret; 813 } 814 } 815 816 return 0; 817} 818 819/* 820 * If multiple changeset entry notification errors occur then only the 821 * final notification error is reported. 822 */ 823int __of_changeset_revert_notify(struct of_changeset *ocs) 824{ 825 struct of_changeset_entry *ce; 826 int ret = 0, ret_tmp; 827 828 pr_debug("changeset: emitting notifiers.\n"); 829 830 /* drop the global lock while emitting notifiers */ 831 mutex_unlock(&of_mutex); 832 list_for_each_entry_reverse(ce, &ocs->entries, node) { 833 ret_tmp = __of_changeset_entry_notify(ce, 1); 834 if (ret_tmp) 835 ret = ret_tmp; 836 } 837 mutex_lock(&of_mutex); 838 pr_debug("changeset: notifiers sent.\n"); 839 840 return ret; 841} 842 843static int __of_changeset_revert(struct of_changeset *ocs) 844{ 845 int ret, ret_reply; 846 847 ret_reply = 0; 848 ret = __of_changeset_revert_entries(ocs, &ret_reply); 849 850 if (!ret) 851 ret = __of_changeset_revert_notify(ocs); 852 853 return ret; 854} 855 856/** 857 * of_changeset_revert - Reverts an applied changeset 858 * 859 * @ocs: changeset pointer 860 * 861 * Reverts a changeset returning the state of the tree to what it 862 * was before the application. 863 * Any side-effects like creation/destruction of devices and 864 * removal of sysfs properties and directories are applied. 865 * 866 * Return: 0 on success, a negative error value in case of an error. 867 */ 868int of_changeset_revert(struct of_changeset *ocs) 869{ 870 int ret; 871 872 mutex_lock(&of_mutex); 873 ret = __of_changeset_revert(ocs); 874 mutex_unlock(&of_mutex); 875 876 return ret; 877} 878EXPORT_SYMBOL_GPL(of_changeset_revert); 879 880/** 881 * of_changeset_action - Add an action to the tail of the changeset list 882 * 883 * @ocs: changeset pointer 884 * @action: action to perform 885 * @np: Pointer to device node 886 * @prop: Pointer to property 887 * 888 * On action being one of: 889 * + OF_RECONFIG_ATTACH_NODE 890 * + OF_RECONFIG_DETACH_NODE, 891 * + OF_RECONFIG_ADD_PROPERTY 892 * + OF_RECONFIG_REMOVE_PROPERTY, 893 * + OF_RECONFIG_UPDATE_PROPERTY 894 * 895 * Return: 0 on success, a negative error value in case of an error. 896 */ 897int of_changeset_action(struct of_changeset *ocs, unsigned long action, 898 struct device_node *np, struct property *prop) 899{ 900 struct of_changeset_entry *ce; 901 902 if (WARN_ON(action >= ARRAY_SIZE(action_names))) 903 return -EINVAL; 904 905 ce = kzalloc(sizeof(*ce), GFP_KERNEL); 906 if (!ce) 907 return -ENOMEM; 908 909 /* get a reference to the node */ 910 ce->action = action; 911 ce->np = of_node_get(np); 912 ce->prop = prop; 913 914 if (action == OF_RECONFIG_UPDATE_PROPERTY && prop) 915 ce->old_prop = of_find_property(np, prop->name, NULL); 916 917 /* add it to the list */ 918 list_add_tail(&ce->node, &ocs->entries); 919 return 0; 920} 921EXPORT_SYMBOL_GPL(of_changeset_action); 922