2 * Support for dynamic device trees.
4 * On some platforms, the device tree can be manipulated at runtime.
5 * The routines in this section support adding, removing and changing
9 #define pr_fmt(fmt) "OF: " fmt
12 #include <linux/spinlock.h>
13 #include <linux/slab.h>
14 #include <linux/string.h>
15 #include <linux/proc_fs.h>
17 #include "of_private.h"
20 * of_node_get() - Increment refcount of a node
21 * @node: Node to inc refcount, NULL is supported to simplify writing of
26 struct device_node
*of_node_get(struct device_node
*node
)
29 kobject_get(&node
->kobj
);
32 EXPORT_SYMBOL(of_node_get
);
35 * of_node_put() - Decrement refcount of a node
36 * @node: Node to dec refcount, NULL is supported to simplify writing of
39 void of_node_put(struct device_node
*node
)
42 kobject_put(&node
->kobj
);
44 EXPORT_SYMBOL(of_node_put
);
46 void __of_detach_node_sysfs(struct device_node
*np
)
50 if (!IS_ENABLED(CONFIG_SYSFS
))
53 BUG_ON(!of_node_is_initialized(np
));
57 /* only remove properties if on sysfs */
58 if (of_node_is_attached(np
)) {
59 for_each_property_of_node(np
, pp
)
60 __of_sysfs_remove_bin_file(np
, pp
);
61 kobject_del(&np
->kobj
);
64 /* finally remove the kobj_init ref */
68 static BLOCKING_NOTIFIER_HEAD(of_reconfig_chain
);
70 int of_reconfig_notifier_register(struct notifier_block
*nb
)
72 return blocking_notifier_chain_register(&of_reconfig_chain
, nb
);
74 EXPORT_SYMBOL_GPL(of_reconfig_notifier_register
);
76 int of_reconfig_notifier_unregister(struct notifier_block
*nb
)
78 return blocking_notifier_chain_unregister(&of_reconfig_chain
, nb
);
80 EXPORT_SYMBOL_GPL(of_reconfig_notifier_unregister
);
83 const char *action_names
[] = {
84 [OF_RECONFIG_ATTACH_NODE
] = "ATTACH_NODE",
85 [OF_RECONFIG_DETACH_NODE
] = "DETACH_NODE",
86 [OF_RECONFIG_ADD_PROPERTY
] = "ADD_PROPERTY",
87 [OF_RECONFIG_REMOVE_PROPERTY
] = "REMOVE_PROPERTY",
88 [OF_RECONFIG_UPDATE_PROPERTY
] = "UPDATE_PROPERTY",
92 int of_reconfig_notify(unsigned long action
, struct of_reconfig_data
*p
)
96 struct of_reconfig_data
*pr
= p
;
99 case OF_RECONFIG_ATTACH_NODE
:
100 case OF_RECONFIG_DETACH_NODE
:
101 pr_debug("notify %-15s %pOF\n", action_names
[action
],
104 case OF_RECONFIG_ADD_PROPERTY
:
105 case OF_RECONFIG_REMOVE_PROPERTY
:
106 case OF_RECONFIG_UPDATE_PROPERTY
:
107 pr_debug("notify %-15s %pOF:%s\n", action_names
[action
],
108 pr
->dn
, pr
->prop
->name
);
113 rc
= blocking_notifier_call_chain(&of_reconfig_chain
, action
, p
);
114 return notifier_to_errno(rc
);
118 * of_reconfig_get_state_change() - Returns new state of device
119 * @action - action of the of notifier
120 * @arg - argument of the of notifier
122 * Returns the new state of a device based on the notifier used.
123 * Returns 0 on device going from enabled to disabled, 1 on device
124 * going from disabled to enabled and -1 on no change.
126 int of_reconfig_get_state_change(unsigned long action
, struct of_reconfig_data
*pr
)
128 struct property
*prop
, *old_prop
= NULL
;
129 int is_status
, status_state
, old_status_state
, prev_state
, new_state
;
131 /* figure out if a device should be created or destroyed */
133 case OF_RECONFIG_ATTACH_NODE
:
134 case OF_RECONFIG_DETACH_NODE
:
135 prop
= of_find_property(pr
->dn
, "status", NULL
);
137 case OF_RECONFIG_ADD_PROPERTY
:
138 case OF_RECONFIG_REMOVE_PROPERTY
:
141 case OF_RECONFIG_UPDATE_PROPERTY
:
143 old_prop
= pr
->old_prop
;
146 return OF_RECONFIG_NO_CHANGE
;
151 old_status_state
= -1;
155 if (prop
&& !strcmp(prop
->name
, "status")) {
157 status_state
= !strcmp(prop
->value
, "okay") ||
158 !strcmp(prop
->value
, "ok");
160 old_status_state
= !strcmp(old_prop
->value
, "okay") ||
161 !strcmp(old_prop
->value
, "ok");
165 case OF_RECONFIG_ATTACH_NODE
:
167 /* -1 & 0 status either missing or okay */
168 new_state
= status_state
!= 0;
170 case OF_RECONFIG_DETACH_NODE
:
171 /* -1 & 0 status either missing or okay */
172 prev_state
= status_state
!= 0;
175 case OF_RECONFIG_ADD_PROPERTY
:
177 /* no status property -> enabled (legacy) */
179 new_state
= status_state
;
182 case OF_RECONFIG_REMOVE_PROPERTY
:
184 prev_state
= status_state
;
185 /* no status property -> enabled (legacy) */
189 case OF_RECONFIG_UPDATE_PROPERTY
:
191 prev_state
= old_status_state
!= 0;
192 new_state
= status_state
!= 0;
197 if (prev_state
== new_state
)
198 return OF_RECONFIG_NO_CHANGE
;
200 return new_state
? OF_RECONFIG_CHANGE_ADD
: OF_RECONFIG_CHANGE_REMOVE
;
202 EXPORT_SYMBOL_GPL(of_reconfig_get_state_change
);
204 int of_property_notify(int action
, struct device_node
*np
,
205 struct property
*prop
, struct property
*oldprop
)
207 struct of_reconfig_data pr
;
209 /* only call notifiers if the node is attached */
210 if (!of_node_is_attached(np
))
215 pr
.old_prop
= oldprop
;
216 return of_reconfig_notify(action
, &pr
);
219 static void __of_attach_node(struct device_node
*np
)
221 const __be32
*phandle
;
224 np
->name
= __of_get_property(np
, "name", NULL
) ? : "<NULL>";
225 np
->type
= __of_get_property(np
, "device_type", NULL
) ? : "<NULL>";
227 phandle
= __of_get_property(np
, "phandle", &sz
);
229 phandle
= __of_get_property(np
, "linux,phandle", &sz
);
230 if (IS_ENABLED(CONFIG_PPC_PSERIES
) && !phandle
)
231 phandle
= __of_get_property(np
, "ibm,phandle", &sz
);
232 np
->phandle
= (phandle
&& (sz
>= 4)) ? be32_to_cpup(phandle
) : 0;
235 np
->sibling
= np
->parent
->child
;
236 np
->parent
->child
= np
;
237 of_node_clear_flag(np
, OF_DETACHED
);
241 * of_attach_node() - Plug a device node into the tree and global list.
243 int of_attach_node(struct device_node
*np
)
245 struct of_reconfig_data rd
;
248 memset(&rd
, 0, sizeof(rd
));
251 mutex_lock(&of_mutex
);
252 raw_spin_lock_irqsave(&devtree_lock
, flags
);
253 __of_attach_node(np
);
254 raw_spin_unlock_irqrestore(&devtree_lock
, flags
);
256 __of_attach_node_sysfs(np
);
257 mutex_unlock(&of_mutex
);
259 of_reconfig_notify(OF_RECONFIG_ATTACH_NODE
, &rd
);
264 void __of_detach_node(struct device_node
*np
)
266 struct device_node
*parent
;
268 if (WARN_ON(of_node_check_flag(np
, OF_DETACHED
)))
272 if (WARN_ON(!parent
))
275 if (parent
->child
== np
)
276 parent
->child
= np
->sibling
;
278 struct device_node
*prevsib
;
279 for (prevsib
= np
->parent
->child
;
280 prevsib
->sibling
!= np
;
281 prevsib
= prevsib
->sibling
)
283 prevsib
->sibling
= np
->sibling
;
286 of_node_set_flag(np
, OF_DETACHED
);
290 * of_detach_node() - "Unplug" a node from the device tree.
292 * The caller must hold a reference to the node. The memory associated with
293 * the node is not freed until its refcount goes to zero.
295 int of_detach_node(struct device_node
*np
)
297 struct of_reconfig_data rd
;
301 memset(&rd
, 0, sizeof(rd
));
304 mutex_lock(&of_mutex
);
305 raw_spin_lock_irqsave(&devtree_lock
, flags
);
306 __of_detach_node(np
);
307 raw_spin_unlock_irqrestore(&devtree_lock
, flags
);
309 __of_detach_node_sysfs(np
);
310 mutex_unlock(&of_mutex
);
312 of_reconfig_notify(OF_RECONFIG_DETACH_NODE
, &rd
);
316 EXPORT_SYMBOL_GPL(of_detach_node
);
319 * of_node_release() - release a dynamically allocated node
320 * @kref: kref element of the node to be released
322 * In of_node_put() this function is passed to kref_put() as the destructor.
324 void of_node_release(struct kobject
*kobj
)
326 struct device_node
*node
= kobj_to_device_node(kobj
);
327 struct property
*prop
= node
->properties
;
329 /* We should never be releasing nodes that haven't been detached. */
330 if (!of_node_check_flag(node
, OF_DETACHED
)) {
331 pr_err("ERROR: Bad of_node_put() on %pOF\n", node
);
335 if (!of_node_check_flag(node
, OF_DYNAMIC
))
339 struct property
*next
= prop
->next
;
346 prop
= node
->deadprops
;
347 node
->deadprops
= NULL
;
350 kfree(node
->full_name
);
356 * __of_prop_dup - Copy a property dynamically.
357 * @prop: Property to copy
358 * @allocflags: Allocation flags (typically pass GFP_KERNEL)
360 * Copy a property by dynamically allocating the memory of both the
361 * property structure and the property name & contents. The property's
362 * flags have the OF_DYNAMIC bit set so that we can differentiate between
363 * dynamically allocated properties and not.
364 * Returns the newly allocated property or NULL on out of memory error.
366 struct property
*__of_prop_dup(const struct property
*prop
, gfp_t allocflags
)
368 struct property
*new;
370 new = kzalloc(sizeof(*new), allocflags
);
375 * NOTE: There is no check for zero length value.
376 * In case of a boolean property, this will allocate a value
377 * of zero bytes. We do this to work around the use
378 * of of_get_property() calls on boolean values.
380 new->name
= kstrdup(prop
->name
, allocflags
);
381 new->value
= kmemdup(prop
->value
, prop
->length
, allocflags
);
382 new->length
= prop
->length
;
383 if (!new->name
|| !new->value
)
386 /* mark the property as dynamic */
387 of_property_set_flag(new, OF_DYNAMIC
);
399 * __of_node_dup() - Duplicate or create an empty device node dynamically.
400 * @fmt: Format string (plus vargs) for new full name of the device node
402 * Create an device tree node, either by duplicating an empty node or by allocating
403 * an empty one suitable for further modification. The node data are
404 * dynamically allocated and all the node flags have the OF_DYNAMIC &
405 * OF_DETACHED bits set. Returns the newly allocated node or NULL on out of
408 struct device_node
*__of_node_dup(const struct device_node
*np
, const char *fmt
, ...)
411 struct device_node
*node
;
413 node
= kzalloc(sizeof(*node
), GFP_KERNEL
);
416 va_start(vargs
, fmt
);
417 node
->full_name
= kvasprintf(GFP_KERNEL
, fmt
, vargs
);
419 if (!node
->full_name
) {
424 of_node_set_flag(node
, OF_DYNAMIC
);
425 of_node_set_flag(node
, OF_DETACHED
);
428 /* Iterate over and duplicate all properties */
430 struct property
*pp
, *new_pp
;
431 for_each_property_of_node(np
, pp
) {
432 new_pp
= __of_prop_dup(pp
, GFP_KERNEL
);
435 if (__of_add_property(node
, new_pp
)) {
437 kfree(new_pp
->value
);
446 of_node_put(node
); /* Frees the node and properties */
450 static void __of_changeset_entry_destroy(struct of_changeset_entry
*ce
)
458 static void __of_changeset_entry_dump(struct of_changeset_entry
*ce
)
460 switch (ce
->action
) {
461 case OF_RECONFIG_ADD_PROPERTY
:
462 case OF_RECONFIG_REMOVE_PROPERTY
:
463 case OF_RECONFIG_UPDATE_PROPERTY
:
464 pr_debug("cset<%p> %-15s %pOF/%s\n", ce
, action_names
[ce
->action
],
465 ce
->np
, ce
->prop
->name
);
467 case OF_RECONFIG_ATTACH_NODE
:
468 case OF_RECONFIG_DETACH_NODE
:
469 pr_debug("cset<%p> %-15s %pOF\n", ce
, action_names
[ce
->action
],
475 static inline void __of_changeset_entry_dump(struct of_changeset_entry
*ce
)
481 static void __of_changeset_entry_invert(struct of_changeset_entry
*ce
,
482 struct of_changeset_entry
*rce
)
484 memcpy(rce
, ce
, sizeof(*rce
));
486 switch (ce
->action
) {
487 case OF_RECONFIG_ATTACH_NODE
:
488 rce
->action
= OF_RECONFIG_DETACH_NODE
;
490 case OF_RECONFIG_DETACH_NODE
:
491 rce
->action
= OF_RECONFIG_ATTACH_NODE
;
493 case OF_RECONFIG_ADD_PROPERTY
:
494 rce
->action
= OF_RECONFIG_REMOVE_PROPERTY
;
496 case OF_RECONFIG_REMOVE_PROPERTY
:
497 rce
->action
= OF_RECONFIG_ADD_PROPERTY
;
499 case OF_RECONFIG_UPDATE_PROPERTY
:
500 rce
->old_prop
= ce
->prop
;
501 rce
->prop
= ce
->old_prop
;
502 /* update was used but original property did not exist */
504 rce
->action
= OF_RECONFIG_REMOVE_PROPERTY
;
505 rce
->prop
= ce
->prop
;
511 static void __of_changeset_entry_notify(struct of_changeset_entry
*ce
, bool revert
)
513 struct of_reconfig_data rd
;
514 struct of_changeset_entry ce_inverted
;
518 __of_changeset_entry_invert(ce
, &ce_inverted
);
522 switch (ce
->action
) {
523 case OF_RECONFIG_ATTACH_NODE
:
524 case OF_RECONFIG_DETACH_NODE
:
525 memset(&rd
, 0, sizeof(rd
));
527 ret
= of_reconfig_notify(ce
->action
, &rd
);
529 case OF_RECONFIG_ADD_PROPERTY
:
530 case OF_RECONFIG_REMOVE_PROPERTY
:
531 case OF_RECONFIG_UPDATE_PROPERTY
:
532 ret
= of_property_notify(ce
->action
, ce
->np
, ce
->prop
, ce
->old_prop
);
535 pr_err("invalid devicetree changeset action: %i\n",
541 pr_err("changeset notifier error @%pOF\n", ce
->np
);
544 static int __of_changeset_entry_apply(struct of_changeset_entry
*ce
)
546 struct property
*old_prop
, **propp
;
550 __of_changeset_entry_dump(ce
);
552 raw_spin_lock_irqsave(&devtree_lock
, flags
);
553 switch (ce
->action
) {
554 case OF_RECONFIG_ATTACH_NODE
:
555 __of_attach_node(ce
->np
);
557 case OF_RECONFIG_DETACH_NODE
:
558 __of_detach_node(ce
->np
);
560 case OF_RECONFIG_ADD_PROPERTY
:
561 /* If the property is in deadprops then it must be removed */
562 for (propp
= &ce
->np
->deadprops
; *propp
; propp
= &(*propp
)->next
) {
563 if (*propp
== ce
->prop
) {
564 *propp
= ce
->prop
->next
;
565 ce
->prop
->next
= NULL
;
570 ret
= __of_add_property(ce
->np
, ce
->prop
);
572 pr_err("changeset: add_property failed @%pOF/%s\n",
578 case OF_RECONFIG_REMOVE_PROPERTY
:
579 ret
= __of_remove_property(ce
->np
, ce
->prop
);
581 pr_err("changeset: remove_property failed @%pOF/%s\n",
588 case OF_RECONFIG_UPDATE_PROPERTY
:
589 /* If the property is in deadprops then it must be removed */
590 for (propp
= &ce
->np
->deadprops
; *propp
; propp
= &(*propp
)->next
) {
591 if (*propp
== ce
->prop
) {
592 *propp
= ce
->prop
->next
;
593 ce
->prop
->next
= NULL
;
598 ret
= __of_update_property(ce
->np
, ce
->prop
, &old_prop
);
600 pr_err("changeset: update_property failed @%pOF/%s\n",
609 raw_spin_unlock_irqrestore(&devtree_lock
, flags
);
614 switch (ce
->action
) {
615 case OF_RECONFIG_ATTACH_NODE
:
616 __of_attach_node_sysfs(ce
->np
);
618 case OF_RECONFIG_DETACH_NODE
:
619 __of_detach_node_sysfs(ce
->np
);
621 case OF_RECONFIG_ADD_PROPERTY
:
622 /* ignore duplicate names */
623 __of_add_property_sysfs(ce
->np
, ce
->prop
);
625 case OF_RECONFIG_REMOVE_PROPERTY
:
626 __of_remove_property_sysfs(ce
->np
, ce
->prop
);
628 case OF_RECONFIG_UPDATE_PROPERTY
:
629 __of_update_property_sysfs(ce
->np
, ce
->prop
, ce
->old_prop
);
636 static inline int __of_changeset_entry_revert(struct of_changeset_entry
*ce
)
638 struct of_changeset_entry ce_inverted
;
640 __of_changeset_entry_invert(ce
, &ce_inverted
);
641 return __of_changeset_entry_apply(&ce_inverted
);
645 * of_changeset_init - Initialize a changeset for use
647 * @ocs: changeset pointer
649 * Initialize a changeset structure
651 void of_changeset_init(struct of_changeset
*ocs
)
653 memset(ocs
, 0, sizeof(*ocs
));
654 INIT_LIST_HEAD(&ocs
->entries
);
656 EXPORT_SYMBOL_GPL(of_changeset_init
);
659 * of_changeset_destroy - Destroy a changeset
661 * @ocs: changeset pointer
663 * Destroys a changeset. Note that if a changeset is applied,
664 * its changes to the tree cannot be reverted.
666 void of_changeset_destroy(struct of_changeset
*ocs
)
668 struct of_changeset_entry
*ce
, *cen
;
670 list_for_each_entry_safe_reverse(ce
, cen
, &ocs
->entries
, node
)
671 __of_changeset_entry_destroy(ce
);
673 EXPORT_SYMBOL_GPL(of_changeset_destroy
);
675 int __of_changeset_apply(struct of_changeset
*ocs
)
677 struct of_changeset_entry
*ce
;
680 /* perform the rest of the work */
681 pr_debug("changeset: applying...\n");
682 list_for_each_entry(ce
, &ocs
->entries
, node
) {
683 ret
= __of_changeset_entry_apply(ce
);
685 pr_err("Error applying changeset (%d)\n", ret
);
686 list_for_each_entry_continue_reverse(ce
, &ocs
->entries
, node
)
687 __of_changeset_entry_revert(ce
);
691 pr_debug("changeset: applied, emitting notifiers.\n");
693 /* drop the global lock while emitting notifiers */
694 mutex_unlock(&of_mutex
);
695 list_for_each_entry(ce
, &ocs
->entries
, node
)
696 __of_changeset_entry_notify(ce
, 0);
697 mutex_lock(&of_mutex
);
698 pr_debug("changeset: notifiers sent.\n");
704 * of_changeset_apply - Applies a changeset
706 * @ocs: changeset pointer
708 * Applies a changeset to the live tree.
709 * Any side-effects of live tree state changes are applied here on
710 * success, like creation/destruction of devices and side-effects
711 * like creation of sysfs properties and directories.
712 * Returns 0 on success, a negative error value in case of an error.
713 * On error the partially applied effects are reverted.
715 int of_changeset_apply(struct of_changeset
*ocs
)
719 mutex_lock(&of_mutex
);
720 ret
= __of_changeset_apply(ocs
);
721 mutex_unlock(&of_mutex
);
725 EXPORT_SYMBOL_GPL(of_changeset_apply
);
727 int __of_changeset_revert(struct of_changeset
*ocs
)
729 struct of_changeset_entry
*ce
;
732 pr_debug("changeset: reverting...\n");
733 list_for_each_entry_reverse(ce
, &ocs
->entries
, node
) {
734 ret
= __of_changeset_entry_revert(ce
);
736 pr_err("Error reverting changeset (%d)\n", ret
);
737 list_for_each_entry_continue(ce
, &ocs
->entries
, node
)
738 __of_changeset_entry_apply(ce
);
742 pr_debug("changeset: reverted, emitting notifiers.\n");
744 /* drop the global lock while emitting notifiers */
745 mutex_unlock(&of_mutex
);
746 list_for_each_entry_reverse(ce
, &ocs
->entries
, node
)
747 __of_changeset_entry_notify(ce
, 1);
748 mutex_lock(&of_mutex
);
749 pr_debug("changeset: notifiers sent.\n");
755 * of_changeset_revert - Reverts an applied changeset
757 * @ocs: changeset pointer
759 * Reverts a changeset returning the state of the tree to what it
760 * was before the application.
761 * Any side-effects like creation/destruction of devices and
762 * removal of sysfs properties and directories are applied.
763 * Returns 0 on success, a negative error value in case of an error.
765 int of_changeset_revert(struct of_changeset
*ocs
)
769 mutex_lock(&of_mutex
);
770 ret
= __of_changeset_revert(ocs
);
771 mutex_unlock(&of_mutex
);
775 EXPORT_SYMBOL_GPL(of_changeset_revert
);
778 * of_changeset_action - Perform a changeset action
780 * @ocs: changeset pointer
781 * @action: action to perform
782 * @np: Pointer to device node
783 * @prop: Pointer to property
785 * On action being one of:
786 * + OF_RECONFIG_ATTACH_NODE
787 * + OF_RECONFIG_DETACH_NODE,
788 * + OF_RECONFIG_ADD_PROPERTY
789 * + OF_RECONFIG_REMOVE_PROPERTY,
790 * + OF_RECONFIG_UPDATE_PROPERTY
791 * Returns 0 on success, a negative error value in case of an error.
793 int of_changeset_action(struct of_changeset
*ocs
, unsigned long action
,
794 struct device_node
*np
, struct property
*prop
)
796 struct of_changeset_entry
*ce
;
798 ce
= kzalloc(sizeof(*ce
), GFP_KERNEL
);
802 /* get a reference to the node */
804 ce
->np
= of_node_get(np
);
807 if (action
== OF_RECONFIG_UPDATE_PROPERTY
&& prop
)
808 ce
->old_prop
= of_find_property(np
, prop
->name
, NULL
);
810 /* add it to the list */
811 list_add_tail(&ce
->node
, &ocs
->entries
);
814 EXPORT_SYMBOL_GPL(of_changeset_action
);