1 /* 2 * Support for dynamic device trees. 3 * 4 * On some platforms, the device tree can be manipulated at runtime. 5 * The routines in this section support adding, removing and changing 6 * device tree nodes. 7 */ 8 9 #include <linux/of.h> 10 #include <linux/spinlock.h> 11 #include <linux/slab.h> 12 #include <linux/string.h> 13 #include <linux/proc_fs.h> 14 15 #include "of_private.h" 16 17 /** 18 * of_node_get() - Increment refcount of a node 19 * @node: Node to inc refcount, NULL is supported to simplify writing of 20 * callers 21 * 22 * Returns node. 23 */ 24 struct device_node *of_node_get(struct device_node *node) 25 { 26 if (node) 27 kobject_get(&node->kobj); 28 return node; 29 } 30 EXPORT_SYMBOL(of_node_get); 31 32 /** 33 * of_node_put() - Decrement refcount of a node 34 * @node: Node to dec refcount, NULL is supported to simplify writing of 35 * callers 36 */ 37 void of_node_put(struct device_node *node) 38 { 39 if (node) 40 kobject_put(&node->kobj); 41 } 42 EXPORT_SYMBOL(of_node_put); 43 44 void __of_detach_node_sysfs(struct device_node *np) 45 { 46 struct property *pp; 47 48 if (!IS_ENABLED(CONFIG_SYSFS)) 49 return; 50 51 BUG_ON(!of_node_is_initialized(np)); 52 if (!of_kset) 53 return; 54 55 /* only remove properties if on sysfs */ 56 if (of_node_is_attached(np)) { 57 for_each_property_of_node(np, pp) 58 sysfs_remove_bin_file(&np->kobj, &pp->attr); 59 kobject_del(&np->kobj); 60 } 61 62 /* finally remove the kobj_init ref */ 63 of_node_put(np); 64 } 65 66 static BLOCKING_NOTIFIER_HEAD(of_reconfig_chain); 67 68 int of_reconfig_notifier_register(struct notifier_block *nb) 69 { 70 return blocking_notifier_chain_register(&of_reconfig_chain, nb); 71 } 72 EXPORT_SYMBOL_GPL(of_reconfig_notifier_register); 73 74 int of_reconfig_notifier_unregister(struct notifier_block *nb) 75 { 76 return blocking_notifier_chain_unregister(&of_reconfig_chain, nb); 77 } 78 EXPORT_SYMBOL_GPL(of_reconfig_notifier_unregister); 79 80 #ifdef DEBUG 81 const char *action_names[] = { 82 [OF_RECONFIG_ATTACH_NODE] = "ATTACH_NODE", 83 [OF_RECONFIG_DETACH_NODE] = "DETACH_NODE", 84 [OF_RECONFIG_ADD_PROPERTY] = "ADD_PROPERTY", 85 [OF_RECONFIG_REMOVE_PROPERTY] = "REMOVE_PROPERTY", 86 [OF_RECONFIG_UPDATE_PROPERTY] = "UPDATE_PROPERTY", 87 }; 88 #endif 89 90 int of_reconfig_notify(unsigned long action, struct of_reconfig_data *p) 91 { 92 int rc; 93 #ifdef DEBUG 94 struct of_reconfig_data *pr = p; 95 96 switch (action) { 97 case OF_RECONFIG_ATTACH_NODE: 98 case OF_RECONFIG_DETACH_NODE: 99 pr_debug("of/notify %-15s %s\n", action_names[action], 100 pr->dn->full_name); 101 break; 102 case OF_RECONFIG_ADD_PROPERTY: 103 case OF_RECONFIG_REMOVE_PROPERTY: 104 case OF_RECONFIG_UPDATE_PROPERTY: 105 pr_debug("of/notify %-15s %s:%s\n", action_names[action], 106 pr->dn->full_name, pr->prop->name); 107 break; 108 109 } 110 #endif 111 rc = blocking_notifier_call_chain(&of_reconfig_chain, action, p); 112 return notifier_to_errno(rc); 113 } 114 115 /* 116 * of_reconfig_get_state_change() - Returns new state of device 117 * @action - action of the of notifier 118 * @arg - argument of the of notifier 119 * 120 * Returns the new state of a device based on the notifier used. 121 * Returns 0 on device going from enabled to disabled, 1 on device 122 * going from disabled to enabled and -1 on no change. 123 */ 124 int of_reconfig_get_state_change(unsigned long action, struct of_reconfig_data *pr) 125 { 126 struct property *prop, *old_prop = NULL; 127 int is_status, status_state, old_status_state, prev_state, new_state; 128 129 /* figure out if a device should be created or destroyed */ 130 switch (action) { 131 case OF_RECONFIG_ATTACH_NODE: 132 case OF_RECONFIG_DETACH_NODE: 133 prop = of_find_property(pr->dn, "status", NULL); 134 break; 135 case OF_RECONFIG_ADD_PROPERTY: 136 case OF_RECONFIG_REMOVE_PROPERTY: 137 prop = pr->prop; 138 break; 139 case OF_RECONFIG_UPDATE_PROPERTY: 140 prop = pr->prop; 141 old_prop = pr->old_prop; 142 break; 143 default: 144 return OF_RECONFIG_NO_CHANGE; 145 } 146 147 is_status = 0; 148 status_state = -1; 149 old_status_state = -1; 150 prev_state = -1; 151 new_state = -1; 152 153 if (prop && !strcmp(prop->name, "status")) { 154 is_status = 1; 155 status_state = !strcmp(prop->value, "okay") || 156 !strcmp(prop->value, "ok"); 157 if (old_prop) 158 old_status_state = !strcmp(old_prop->value, "okay") || 159 !strcmp(old_prop->value, "ok"); 160 } 161 162 switch (action) { 163 case OF_RECONFIG_ATTACH_NODE: 164 prev_state = 0; 165 /* -1 & 0 status either missing or okay */ 166 new_state = status_state != 0; 167 break; 168 case OF_RECONFIG_DETACH_NODE: 169 /* -1 & 0 status either missing or okay */ 170 prev_state = status_state != 0; 171 new_state = 0; 172 break; 173 case OF_RECONFIG_ADD_PROPERTY: 174 if (is_status) { 175 /* no status property -> enabled (legacy) */ 176 prev_state = 1; 177 new_state = status_state; 178 } 179 break; 180 case OF_RECONFIG_REMOVE_PROPERTY: 181 if (is_status) { 182 prev_state = status_state; 183 /* no status property -> enabled (legacy) */ 184 new_state = 1; 185 } 186 break; 187 case OF_RECONFIG_UPDATE_PROPERTY: 188 if (is_status) { 189 prev_state = old_status_state != 0; 190 new_state = status_state != 0; 191 } 192 break; 193 } 194 195 if (prev_state == new_state) 196 return OF_RECONFIG_NO_CHANGE; 197 198 return new_state ? OF_RECONFIG_CHANGE_ADD : OF_RECONFIG_CHANGE_REMOVE; 199 } 200 EXPORT_SYMBOL_GPL(of_reconfig_get_state_change); 201 202 int of_property_notify(int action, struct device_node *np, 203 struct property *prop, struct property *oldprop) 204 { 205 struct of_reconfig_data pr; 206 207 /* only call notifiers if the node is attached */ 208 if (!of_node_is_attached(np)) 209 return 0; 210 211 pr.dn = np; 212 pr.prop = prop; 213 pr.old_prop = oldprop; 214 return of_reconfig_notify(action, &pr); 215 } 216 217 void __of_attach_node(struct device_node *np) 218 { 219 const __be32 *phandle; 220 int sz; 221 222 np->name = __of_get_property(np, "name", NULL) ? : "<NULL>"; 223 np->type = __of_get_property(np, "device_type", NULL) ? : "<NULL>"; 224 225 phandle = __of_get_property(np, "phandle", &sz); 226 if (!phandle) 227 phandle = __of_get_property(np, "linux,phandle", &sz); 228 if (IS_ENABLED(CONFIG_PPC_PSERIES) && !phandle) 229 phandle = __of_get_property(np, "ibm,phandle", &sz); 230 np->phandle = (phandle && (sz >= 4)) ? be32_to_cpup(phandle) : 0; 231 232 np->child = NULL; 233 np->sibling = np->parent->child; 234 np->parent->child = np; 235 of_node_clear_flag(np, OF_DETACHED); 236 } 237 238 /** 239 * of_attach_node() - Plug a device node into the tree and global list. 240 */ 241 int of_attach_node(struct device_node *np) 242 { 243 struct of_reconfig_data rd; 244 unsigned long flags; 245 246 memset(&rd, 0, sizeof(rd)); 247 rd.dn = np; 248 249 mutex_lock(&of_mutex); 250 raw_spin_lock_irqsave(&devtree_lock, flags); 251 __of_attach_node(np); 252 raw_spin_unlock_irqrestore(&devtree_lock, flags); 253 254 __of_attach_node_sysfs(np); 255 mutex_unlock(&of_mutex); 256 257 of_reconfig_notify(OF_RECONFIG_ATTACH_NODE, &rd); 258 259 return 0; 260 } 261 262 void __of_detach_node(struct device_node *np) 263 { 264 struct device_node *parent; 265 266 if (WARN_ON(of_node_check_flag(np, OF_DETACHED))) 267 return; 268 269 parent = np->parent; 270 if (WARN_ON(!parent)) 271 return; 272 273 if (parent->child == np) 274 parent->child = np->sibling; 275 else { 276 struct device_node *prevsib; 277 for (prevsib = np->parent->child; 278 prevsib->sibling != np; 279 prevsib = prevsib->sibling) 280 ; 281 prevsib->sibling = np->sibling; 282 } 283 284 of_node_set_flag(np, OF_DETACHED); 285 } 286 287 /** 288 * of_detach_node() - "Unplug" a node from the device tree. 289 * 290 * The caller must hold a reference to the node. The memory associated with 291 * the node is not freed until its refcount goes to zero. 292 */ 293 int of_detach_node(struct device_node *np) 294 { 295 struct of_reconfig_data rd; 296 unsigned long flags; 297 int rc = 0; 298 299 memset(&rd, 0, sizeof(rd)); 300 rd.dn = np; 301 302 mutex_lock(&of_mutex); 303 raw_spin_lock_irqsave(&devtree_lock, flags); 304 __of_detach_node(np); 305 raw_spin_unlock_irqrestore(&devtree_lock, flags); 306 307 __of_detach_node_sysfs(np); 308 mutex_unlock(&of_mutex); 309 310 of_reconfig_notify(OF_RECONFIG_DETACH_NODE, &rd); 311 312 return rc; 313 } 314 EXPORT_SYMBOL_GPL(of_detach_node); 315 316 /** 317 * of_node_release() - release a dynamically allocated node 318 * @kref: kref element of the node to be released 319 * 320 * In of_node_put() this function is passed to kref_put() as the destructor. 321 */ 322 void of_node_release(struct kobject *kobj) 323 { 324 struct device_node *node = kobj_to_device_node(kobj); 325 struct property *prop = node->properties; 326 327 /* We should never be releasing nodes that haven't been detached. */ 328 if (!of_node_check_flag(node, OF_DETACHED)) { 329 pr_err("ERROR: Bad of_node_put() on %s\n", node->full_name); 330 dump_stack(); 331 return; 332 } 333 334 if (!of_node_check_flag(node, OF_DYNAMIC)) 335 return; 336 337 while (prop) { 338 struct property *next = prop->next; 339 kfree(prop->name); 340 kfree(prop->value); 341 kfree(prop); 342 prop = next; 343 344 if (!prop) { 345 prop = node->deadprops; 346 node->deadprops = NULL; 347 } 348 } 349 kfree(node->full_name); 350 kfree(node->data); 351 kfree(node); 352 } 353 354 /** 355 * __of_prop_dup - Copy a property dynamically. 356 * @prop: Property to copy 357 * @allocflags: Allocation flags (typically pass GFP_KERNEL) 358 * 359 * Copy a property by dynamically allocating the memory of both the 360 * property structure and the property name & contents. The property's 361 * flags have the OF_DYNAMIC bit set so that we can differentiate between 362 * dynamically allocated properties and not. 363 * Returns the newly allocated property or NULL on out of memory error. 364 */ 365 struct property *__of_prop_dup(const struct property *prop, gfp_t allocflags) 366 { 367 struct property *new; 368 369 new = kzalloc(sizeof(*new), allocflags); 370 if (!new) 371 return NULL; 372 373 /* 374 * NOTE: There is no check for zero length value. 375 * In case of a boolean property, this will allocate a value 376 * of zero bytes. We do this to work around the use 377 * of of_get_property() calls on boolean values. 378 */ 379 new->name = kstrdup(prop->name, allocflags); 380 new->value = kmemdup(prop->value, prop->length, allocflags); 381 new->length = prop->length; 382 if (!new->name || !new->value) 383 goto err_free; 384 385 /* mark the property as dynamic */ 386 of_property_set_flag(new, OF_DYNAMIC); 387 388 return new; 389 390 err_free: 391 kfree(new->name); 392 kfree(new->value); 393 kfree(new); 394 return NULL; 395 } 396 397 /** 398 * __of_node_dup() - Duplicate or create an empty device node dynamically. 399 * @fmt: Format string (plus vargs) for new full name of the device node 400 * 401 * Create an device tree node, either by duplicating an empty node or by allocating 402 * an empty one suitable for further modification. The node data are 403 * dynamically allocated and all the node flags have the OF_DYNAMIC & 404 * OF_DETACHED bits set. Returns the newly allocated node or NULL on out of 405 * memory error. 406 */ 407 struct device_node *__of_node_dup(const struct device_node *np, const char *fmt, ...) 408 { 409 va_list vargs; 410 struct device_node *node; 411 412 node = kzalloc(sizeof(*node), GFP_KERNEL); 413 if (!node) 414 return NULL; 415 va_start(vargs, fmt); 416 node->full_name = kvasprintf(GFP_KERNEL, fmt, vargs); 417 va_end(vargs); 418 if (!node->full_name) { 419 kfree(node); 420 return NULL; 421 } 422 423 of_node_set_flag(node, OF_DYNAMIC); 424 of_node_set_flag(node, OF_DETACHED); 425 of_node_init(node); 426 427 /* Iterate over and duplicate all properties */ 428 if (np) { 429 struct property *pp, *new_pp; 430 for_each_property_of_node(np, pp) { 431 new_pp = __of_prop_dup(pp, GFP_KERNEL); 432 if (!new_pp) 433 goto err_prop; 434 if (__of_add_property(node, new_pp)) { 435 kfree(new_pp->name); 436 kfree(new_pp->value); 437 kfree(new_pp); 438 goto err_prop; 439 } 440 } 441 } 442 return node; 443 444 err_prop: 445 of_node_put(node); /* Frees the node and properties */ 446 return NULL; 447 } 448 449 static void __of_changeset_entry_destroy(struct of_changeset_entry *ce) 450 { 451 of_node_put(ce->np); 452 list_del(&ce->node); 453 kfree(ce); 454 } 455 456 #ifdef DEBUG 457 static void __of_changeset_entry_dump(struct of_changeset_entry *ce) 458 { 459 switch (ce->action) { 460 case OF_RECONFIG_ADD_PROPERTY: 461 case OF_RECONFIG_REMOVE_PROPERTY: 462 case OF_RECONFIG_UPDATE_PROPERTY: 463 pr_debug("of/cset<%p> %-15s %s/%s\n", ce, action_names[ce->action], 464 ce->np->full_name, ce->prop->name); 465 break; 466 case OF_RECONFIG_ATTACH_NODE: 467 case OF_RECONFIG_DETACH_NODE: 468 pr_debug("of/cset<%p> %-15s %s\n", ce, action_names[ce->action], 469 ce->np->full_name); 470 break; 471 } 472 } 473 #else 474 static inline void __of_changeset_entry_dump(struct of_changeset_entry *ce) 475 { 476 /* empty */ 477 } 478 #endif 479 480 static void __of_changeset_entry_invert(struct of_changeset_entry *ce, 481 struct of_changeset_entry *rce) 482 { 483 memcpy(rce, ce, sizeof(*rce)); 484 485 switch (ce->action) { 486 case OF_RECONFIG_ATTACH_NODE: 487 rce->action = OF_RECONFIG_DETACH_NODE; 488 break; 489 case OF_RECONFIG_DETACH_NODE: 490 rce->action = OF_RECONFIG_ATTACH_NODE; 491 break; 492 case OF_RECONFIG_ADD_PROPERTY: 493 rce->action = OF_RECONFIG_REMOVE_PROPERTY; 494 break; 495 case OF_RECONFIG_REMOVE_PROPERTY: 496 rce->action = OF_RECONFIG_ADD_PROPERTY; 497 break; 498 case OF_RECONFIG_UPDATE_PROPERTY: 499 rce->old_prop = ce->prop; 500 rce->prop = ce->old_prop; 501 /* update was used but original property did not exist */ 502 if (!rce->prop) { 503 rce->action = OF_RECONFIG_REMOVE_PROPERTY; 504 rce->prop = ce->prop; 505 } 506 break; 507 } 508 } 509 510 static void __of_changeset_entry_notify(struct of_changeset_entry *ce, bool revert) 511 { 512 struct of_reconfig_data rd; 513 struct of_changeset_entry ce_inverted; 514 int ret; 515 516 if (revert) { 517 __of_changeset_entry_invert(ce, &ce_inverted); 518 ce = &ce_inverted; 519 } 520 521 switch (ce->action) { 522 case OF_RECONFIG_ATTACH_NODE: 523 case OF_RECONFIG_DETACH_NODE: 524 memset(&rd, 0, sizeof(rd)); 525 rd.dn = ce->np; 526 ret = of_reconfig_notify(ce->action, &rd); 527 break; 528 case OF_RECONFIG_ADD_PROPERTY: 529 case OF_RECONFIG_REMOVE_PROPERTY: 530 case OF_RECONFIG_UPDATE_PROPERTY: 531 ret = of_property_notify(ce->action, ce->np, ce->prop, ce->old_prop); 532 break; 533 default: 534 pr_err("%s: invalid devicetree changeset action: %i\n", __func__, 535 (int)ce->action); 536 return; 537 } 538 539 if (ret) 540 pr_err("%s: notifier error @%s\n", __func__, ce->np->full_name); 541 } 542 543 static int __of_changeset_entry_apply(struct of_changeset_entry *ce) 544 { 545 struct property *old_prop, **propp; 546 unsigned long flags; 547 int ret = 0; 548 549 __of_changeset_entry_dump(ce); 550 551 raw_spin_lock_irqsave(&devtree_lock, flags); 552 switch (ce->action) { 553 case OF_RECONFIG_ATTACH_NODE: 554 __of_attach_node(ce->np); 555 break; 556 case OF_RECONFIG_DETACH_NODE: 557 __of_detach_node(ce->np); 558 break; 559 case OF_RECONFIG_ADD_PROPERTY: 560 /* If the property is in deadprops then it must be removed */ 561 for (propp = &ce->np->deadprops; *propp; propp = &(*propp)->next) { 562 if (*propp == ce->prop) { 563 *propp = ce->prop->next; 564 ce->prop->next = NULL; 565 break; 566 } 567 } 568 569 ret = __of_add_property(ce->np, ce->prop); 570 if (ret) { 571 pr_err("%s: add_property failed @%s/%s\n", 572 __func__, ce->np->full_name, 573 ce->prop->name); 574 break; 575 } 576 break; 577 case OF_RECONFIG_REMOVE_PROPERTY: 578 ret = __of_remove_property(ce->np, ce->prop); 579 if (ret) { 580 pr_err("%s: remove_property failed @%s/%s\n", 581 __func__, ce->np->full_name, 582 ce->prop->name); 583 break; 584 } 585 break; 586 587 case OF_RECONFIG_UPDATE_PROPERTY: 588 /* If the property is in deadprops then it must be removed */ 589 for (propp = &ce->np->deadprops; *propp; propp = &(*propp)->next) { 590 if (*propp == ce->prop) { 591 *propp = ce->prop->next; 592 ce->prop->next = NULL; 593 break; 594 } 595 } 596 597 ret = __of_update_property(ce->np, ce->prop, &old_prop); 598 if (ret) { 599 pr_err("%s: update_property failed @%s/%s\n", 600 __func__, ce->np->full_name, 601 ce->prop->name); 602 break; 603 } 604 break; 605 default: 606 ret = -EINVAL; 607 } 608 raw_spin_unlock_irqrestore(&devtree_lock, flags); 609 610 if (ret) 611 return ret; 612 613 switch (ce->action) { 614 case OF_RECONFIG_ATTACH_NODE: 615 __of_attach_node_sysfs(ce->np); 616 break; 617 case OF_RECONFIG_DETACH_NODE: 618 __of_detach_node_sysfs(ce->np); 619 break; 620 case OF_RECONFIG_ADD_PROPERTY: 621 /* ignore duplicate names */ 622 __of_add_property_sysfs(ce->np, ce->prop); 623 break; 624 case OF_RECONFIG_REMOVE_PROPERTY: 625 __of_remove_property_sysfs(ce->np, ce->prop); 626 break; 627 case OF_RECONFIG_UPDATE_PROPERTY: 628 __of_update_property_sysfs(ce->np, ce->prop, ce->old_prop); 629 break; 630 } 631 632 return 0; 633 } 634 635 static inline int __of_changeset_entry_revert(struct of_changeset_entry *ce) 636 { 637 struct of_changeset_entry ce_inverted; 638 639 __of_changeset_entry_invert(ce, &ce_inverted); 640 return __of_changeset_entry_apply(&ce_inverted); 641 } 642 643 /** 644 * of_changeset_init - Initialize a changeset for use 645 * 646 * @ocs: changeset pointer 647 * 648 * Initialize a changeset structure 649 */ 650 void of_changeset_init(struct of_changeset *ocs) 651 { 652 memset(ocs, 0, sizeof(*ocs)); 653 INIT_LIST_HEAD(&ocs->entries); 654 } 655 EXPORT_SYMBOL_GPL(of_changeset_init); 656 657 /** 658 * of_changeset_destroy - Destroy a changeset 659 * 660 * @ocs: changeset pointer 661 * 662 * Destroys a changeset. Note that if a changeset is applied, 663 * its changes to the tree cannot be reverted. 664 */ 665 void of_changeset_destroy(struct of_changeset *ocs) 666 { 667 struct of_changeset_entry *ce, *cen; 668 669 list_for_each_entry_safe_reverse(ce, cen, &ocs->entries, node) 670 __of_changeset_entry_destroy(ce); 671 } 672 EXPORT_SYMBOL_GPL(of_changeset_destroy); 673 674 int __of_changeset_apply(struct of_changeset *ocs) 675 { 676 struct of_changeset_entry *ce; 677 int ret; 678 679 /* perform the rest of the work */ 680 pr_debug("of_changeset: applying...\n"); 681 list_for_each_entry(ce, &ocs->entries, node) { 682 ret = __of_changeset_entry_apply(ce); 683 if (ret) { 684 pr_err("%s: Error applying changeset (%d)\n", __func__, ret); 685 list_for_each_entry_continue_reverse(ce, &ocs->entries, node) 686 __of_changeset_entry_revert(ce); 687 return ret; 688 } 689 } 690 pr_debug("of_changeset: applied, emitting notifiers.\n"); 691 692 /* drop the global lock while emitting notifiers */ 693 mutex_unlock(&of_mutex); 694 list_for_each_entry(ce, &ocs->entries, node) 695 __of_changeset_entry_notify(ce, 0); 696 mutex_lock(&of_mutex); 697 pr_debug("of_changeset: notifiers sent.\n"); 698 699 return 0; 700 } 701 702 /** 703 * of_changeset_apply - Applies a changeset 704 * 705 * @ocs: changeset pointer 706 * 707 * Applies a changeset to the live tree. 708 * Any side-effects of live tree state changes are applied here on 709 * success, like creation/destruction of devices and side-effects 710 * like creation of sysfs properties and directories. 711 * Returns 0 on success, a negative error value in case of an error. 712 * On error the partially applied effects are reverted. 713 */ 714 int of_changeset_apply(struct of_changeset *ocs) 715 { 716 int ret; 717 718 mutex_lock(&of_mutex); 719 ret = __of_changeset_apply(ocs); 720 mutex_unlock(&of_mutex); 721 722 return ret; 723 } 724 EXPORT_SYMBOL_GPL(of_changeset_apply); 725 726 int __of_changeset_revert(struct of_changeset *ocs) 727 { 728 struct of_changeset_entry *ce; 729 int ret; 730 731 pr_debug("of_changeset: reverting...\n"); 732 list_for_each_entry_reverse(ce, &ocs->entries, node) { 733 ret = __of_changeset_entry_revert(ce); 734 if (ret) { 735 pr_err("%s: Error reverting changeset (%d)\n", __func__, ret); 736 list_for_each_entry_continue(ce, &ocs->entries, node) 737 __of_changeset_entry_apply(ce); 738 return ret; 739 } 740 } 741 pr_debug("of_changeset: reverted, emitting notifiers.\n"); 742 743 /* drop the global lock while emitting notifiers */ 744 mutex_unlock(&of_mutex); 745 list_for_each_entry_reverse(ce, &ocs->entries, node) 746 __of_changeset_entry_notify(ce, 1); 747 mutex_lock(&of_mutex); 748 pr_debug("of_changeset: notifiers sent.\n"); 749 750 return 0; 751 } 752 753 /** 754 * of_changeset_revert - Reverts an applied changeset 755 * 756 * @ocs: changeset pointer 757 * 758 * Reverts a changeset returning the state of the tree to what it 759 * was before the application. 760 * Any side-effects like creation/destruction of devices and 761 * removal of sysfs properties and directories are applied. 762 * Returns 0 on success, a negative error value in case of an error. 763 */ 764 int of_changeset_revert(struct of_changeset *ocs) 765 { 766 int ret; 767 768 mutex_lock(&of_mutex); 769 ret = __of_changeset_revert(ocs); 770 mutex_unlock(&of_mutex); 771 772 return ret; 773 } 774 EXPORT_SYMBOL_GPL(of_changeset_revert); 775 776 /** 777 * of_changeset_action - Perform a changeset action 778 * 779 * @ocs: changeset pointer 780 * @action: action to perform 781 * @np: Pointer to device node 782 * @prop: Pointer to property 783 * 784 * On action being one of: 785 * + OF_RECONFIG_ATTACH_NODE 786 * + OF_RECONFIG_DETACH_NODE, 787 * + OF_RECONFIG_ADD_PROPERTY 788 * + OF_RECONFIG_REMOVE_PROPERTY, 789 * + OF_RECONFIG_UPDATE_PROPERTY 790 * Returns 0 on success, a negative error value in case of an error. 791 */ 792 int of_changeset_action(struct of_changeset *ocs, unsigned long action, 793 struct device_node *np, struct property *prop) 794 { 795 struct of_changeset_entry *ce; 796 797 ce = kzalloc(sizeof(*ce), GFP_KERNEL); 798 if (!ce) { 799 pr_err("%s: Failed to allocate\n", __func__); 800 return -ENOMEM; 801 } 802 /* get a reference to the node */ 803 ce->action = action; 804 ce->np = of_node_get(np); 805 ce->prop = prop; 806 807 if (action == OF_RECONFIG_UPDATE_PROPERTY && prop) 808 ce->old_prop = of_find_property(np, prop->name, NULL); 809 810 /* add it to the list */ 811 list_add_tail(&ce->node, &ocs->entries); 812 return 0; 813 } 814 EXPORT_SYMBOL_GPL(of_changeset_action); 815