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 %s\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 %s:%s\n", action_names
[action
],
108 pr
->dn
->full_name
, 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 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 %s\n", node
->full_name
);
336 if (!of_node_check_flag(node
, OF_DYNAMIC
))
340 struct property
*next
= prop
->next
;
347 prop
= node
->deadprops
;
348 node
->deadprops
= NULL
;
351 kfree(node
->full_name
);
357 * __of_prop_dup - Copy a property dynamically.
358 * @prop: Property to copy
359 * @allocflags: Allocation flags (typically pass GFP_KERNEL)
361 * Copy a property by dynamically allocating the memory of both the
362 * property structure and the property name & contents. The property's
363 * flags have the OF_DYNAMIC bit set so that we can differentiate between
364 * dynamically allocated properties and not.
365 * Returns the newly allocated property or NULL on out of memory error.
367 struct property
*__of_prop_dup(const struct property
*prop
, gfp_t allocflags
)
369 struct property
*new;
371 new = kzalloc(sizeof(*new), allocflags
);
376 * NOTE: There is no check for zero length value.
377 * In case of a boolean property, this will allocate a value
378 * of zero bytes. We do this to work around the use
379 * of of_get_property() calls on boolean values.
381 new->name
= kstrdup(prop
->name
, allocflags
);
382 new->value
= kmemdup(prop
->value
, prop
->length
, allocflags
);
383 new->length
= prop
->length
;
384 if (!new->name
|| !new->value
)
387 /* mark the property as dynamic */
388 of_property_set_flag(new, OF_DYNAMIC
);
400 * __of_node_dup() - Duplicate or create an empty device node dynamically.
401 * @fmt: Format string (plus vargs) for new full name of the device node
403 * Create an device tree node, either by duplicating an empty node or by allocating
404 * an empty one suitable for further modification. The node data are
405 * dynamically allocated and all the node flags have the OF_DYNAMIC &
406 * OF_DETACHED bits set. Returns the newly allocated node or NULL on out of
409 struct device_node
*__of_node_dup(const struct device_node
*np
, const char *fmt
, ...)
412 struct device_node
*node
;
414 node
= kzalloc(sizeof(*node
), GFP_KERNEL
);
417 va_start(vargs
, fmt
);
418 node
->full_name
= kvasprintf(GFP_KERNEL
, fmt
, vargs
);
420 if (!node
->full_name
) {
425 of_node_set_flag(node
, OF_DYNAMIC
);
426 of_node_set_flag(node
, OF_DETACHED
);
429 /* Iterate over and duplicate all properties */
431 struct property
*pp
, *new_pp
;
432 for_each_property_of_node(np
, pp
) {
433 new_pp
= __of_prop_dup(pp
, GFP_KERNEL
);
436 if (__of_add_property(node
, new_pp
)) {
438 kfree(new_pp
->value
);
447 of_node_put(node
); /* Frees the node and properties */
451 static void __of_changeset_entry_destroy(struct of_changeset_entry
*ce
)
459 static void __of_changeset_entry_dump(struct of_changeset_entry
*ce
)
461 switch (ce
->action
) {
462 case OF_RECONFIG_ADD_PROPERTY
:
463 case OF_RECONFIG_REMOVE_PROPERTY
:
464 case OF_RECONFIG_UPDATE_PROPERTY
:
465 pr_debug("cset<%p> %-15s %s/%s\n", ce
, action_names
[ce
->action
],
466 ce
->np
->full_name
, ce
->prop
->name
);
468 case OF_RECONFIG_ATTACH_NODE
:
469 case OF_RECONFIG_DETACH_NODE
:
470 pr_debug("cset<%p> %-15s %s\n", ce
, action_names
[ce
->action
],
476 static inline void __of_changeset_entry_dump(struct of_changeset_entry
*ce
)
482 static void __of_changeset_entry_invert(struct of_changeset_entry
*ce
,
483 struct of_changeset_entry
*rce
)
485 memcpy(rce
, ce
, sizeof(*rce
));
487 switch (ce
->action
) {
488 case OF_RECONFIG_ATTACH_NODE
:
489 rce
->action
= OF_RECONFIG_DETACH_NODE
;
491 case OF_RECONFIG_DETACH_NODE
:
492 rce
->action
= OF_RECONFIG_ATTACH_NODE
;
494 case OF_RECONFIG_ADD_PROPERTY
:
495 rce
->action
= OF_RECONFIG_REMOVE_PROPERTY
;
497 case OF_RECONFIG_REMOVE_PROPERTY
:
498 rce
->action
= OF_RECONFIG_ADD_PROPERTY
;
500 case OF_RECONFIG_UPDATE_PROPERTY
:
501 rce
->old_prop
= ce
->prop
;
502 rce
->prop
= ce
->old_prop
;
503 /* update was used but original property did not exist */
505 rce
->action
= OF_RECONFIG_REMOVE_PROPERTY
;
506 rce
->prop
= ce
->prop
;
512 static void __of_changeset_entry_notify(struct of_changeset_entry
*ce
, bool revert
)
514 struct of_reconfig_data rd
;
515 struct of_changeset_entry ce_inverted
;
519 __of_changeset_entry_invert(ce
, &ce_inverted
);
523 switch (ce
->action
) {
524 case OF_RECONFIG_ATTACH_NODE
:
525 case OF_RECONFIG_DETACH_NODE
:
526 memset(&rd
, 0, sizeof(rd
));
528 ret
= of_reconfig_notify(ce
->action
, &rd
);
530 case OF_RECONFIG_ADD_PROPERTY
:
531 case OF_RECONFIG_REMOVE_PROPERTY
:
532 case OF_RECONFIG_UPDATE_PROPERTY
:
533 ret
= of_property_notify(ce
->action
, ce
->np
, ce
->prop
, ce
->old_prop
);
536 pr_err("invalid devicetree changeset action: %i\n",
542 pr_err("changeset notifier error @%s\n", ce
->np
->full_name
);
545 static int __of_changeset_entry_apply(struct of_changeset_entry
*ce
)
547 struct property
*old_prop
, **propp
;
551 __of_changeset_entry_dump(ce
);
553 raw_spin_lock_irqsave(&devtree_lock
, flags
);
554 switch (ce
->action
) {
555 case OF_RECONFIG_ATTACH_NODE
:
556 __of_attach_node(ce
->np
);
558 case OF_RECONFIG_DETACH_NODE
:
559 __of_detach_node(ce
->np
);
561 case OF_RECONFIG_ADD_PROPERTY
:
562 /* If the property is in deadprops then it must be removed */
563 for (propp
= &ce
->np
->deadprops
; *propp
; propp
= &(*propp
)->next
) {
564 if (*propp
== ce
->prop
) {
565 *propp
= ce
->prop
->next
;
566 ce
->prop
->next
= NULL
;
571 ret
= __of_add_property(ce
->np
, ce
->prop
);
573 pr_err("changeset: add_property failed @%s/%s\n",
579 case OF_RECONFIG_REMOVE_PROPERTY
:
580 ret
= __of_remove_property(ce
->np
, ce
->prop
);
582 pr_err("changeset: remove_property failed @%s/%s\n",
589 case OF_RECONFIG_UPDATE_PROPERTY
:
590 /* If the property is in deadprops then it must be removed */
591 for (propp
= &ce
->np
->deadprops
; *propp
; propp
= &(*propp
)->next
) {
592 if (*propp
== ce
->prop
) {
593 *propp
= ce
->prop
->next
;
594 ce
->prop
->next
= NULL
;
599 ret
= __of_update_property(ce
->np
, ce
->prop
, &old_prop
);
601 pr_err("changeset: update_property failed @%s/%s\n",
610 raw_spin_unlock_irqrestore(&devtree_lock
, flags
);
615 switch (ce
->action
) {
616 case OF_RECONFIG_ATTACH_NODE
:
617 __of_attach_node_sysfs(ce
->np
);
619 case OF_RECONFIG_DETACH_NODE
:
620 __of_detach_node_sysfs(ce
->np
);
622 case OF_RECONFIG_ADD_PROPERTY
:
623 /* ignore duplicate names */
624 __of_add_property_sysfs(ce
->np
, ce
->prop
);
626 case OF_RECONFIG_REMOVE_PROPERTY
:
627 __of_remove_property_sysfs(ce
->np
, ce
->prop
);
629 case OF_RECONFIG_UPDATE_PROPERTY
:
630 __of_update_property_sysfs(ce
->np
, ce
->prop
, ce
->old_prop
);
637 static inline int __of_changeset_entry_revert(struct of_changeset_entry
*ce
)
639 struct of_changeset_entry ce_inverted
;
641 __of_changeset_entry_invert(ce
, &ce_inverted
);
642 return __of_changeset_entry_apply(&ce_inverted
);
646 * of_changeset_init - Initialize a changeset for use
648 * @ocs: changeset pointer
650 * Initialize a changeset structure
652 void of_changeset_init(struct of_changeset
*ocs
)
654 memset(ocs
, 0, sizeof(*ocs
));
655 INIT_LIST_HEAD(&ocs
->entries
);
657 EXPORT_SYMBOL_GPL(of_changeset_init
);
660 * of_changeset_destroy - Destroy a changeset
662 * @ocs: changeset pointer
664 * Destroys a changeset. Note that if a changeset is applied,
665 * its changes to the tree cannot be reverted.
667 void of_changeset_destroy(struct of_changeset
*ocs
)
669 struct of_changeset_entry
*ce
, *cen
;
671 list_for_each_entry_safe_reverse(ce
, cen
, &ocs
->entries
, node
)
672 __of_changeset_entry_destroy(ce
);
674 EXPORT_SYMBOL_GPL(of_changeset_destroy
);
676 int __of_changeset_apply(struct of_changeset
*ocs
)
678 struct of_changeset_entry
*ce
;
681 /* perform the rest of the work */
682 pr_debug("changeset: applying...\n");
683 list_for_each_entry(ce
, &ocs
->entries
, node
) {
684 ret
= __of_changeset_entry_apply(ce
);
686 pr_err("Error applying changeset (%d)\n", ret
);
687 list_for_each_entry_continue_reverse(ce
, &ocs
->entries
, node
)
688 __of_changeset_entry_revert(ce
);
692 pr_debug("changeset: applied, emitting notifiers.\n");
694 /* drop the global lock while emitting notifiers */
695 mutex_unlock(&of_mutex
);
696 list_for_each_entry(ce
, &ocs
->entries
, node
)
697 __of_changeset_entry_notify(ce
, 0);
698 mutex_lock(&of_mutex
);
699 pr_debug("changeset: notifiers sent.\n");
705 * of_changeset_apply - Applies a changeset
707 * @ocs: changeset pointer
709 * Applies a changeset to the live tree.
710 * Any side-effects of live tree state changes are applied here on
711 * success, like creation/destruction of devices and side-effects
712 * like creation of sysfs properties and directories.
713 * Returns 0 on success, a negative error value in case of an error.
714 * On error the partially applied effects are reverted.
716 int of_changeset_apply(struct of_changeset
*ocs
)
720 mutex_lock(&of_mutex
);
721 ret
= __of_changeset_apply(ocs
);
722 mutex_unlock(&of_mutex
);
726 EXPORT_SYMBOL_GPL(of_changeset_apply
);
728 int __of_changeset_revert(struct of_changeset
*ocs
)
730 struct of_changeset_entry
*ce
;
733 pr_debug("changeset: reverting...\n");
734 list_for_each_entry_reverse(ce
, &ocs
->entries
, node
) {
735 ret
= __of_changeset_entry_revert(ce
);
737 pr_err("Error reverting changeset (%d)\n", ret
);
738 list_for_each_entry_continue(ce
, &ocs
->entries
, node
)
739 __of_changeset_entry_apply(ce
);
743 pr_debug("changeset: reverted, emitting notifiers.\n");
745 /* drop the global lock while emitting notifiers */
746 mutex_unlock(&of_mutex
);
747 list_for_each_entry_reverse(ce
, &ocs
->entries
, node
)
748 __of_changeset_entry_notify(ce
, 1);
749 mutex_lock(&of_mutex
);
750 pr_debug("changeset: notifiers sent.\n");
756 * of_changeset_revert - Reverts an applied changeset
758 * @ocs: changeset pointer
760 * Reverts a changeset returning the state of the tree to what it
761 * was before the application.
762 * Any side-effects like creation/destruction of devices and
763 * removal of sysfs properties and directories are applied.
764 * Returns 0 on success, a negative error value in case of an error.
766 int of_changeset_revert(struct of_changeset
*ocs
)
770 mutex_lock(&of_mutex
);
771 ret
= __of_changeset_revert(ocs
);
772 mutex_unlock(&of_mutex
);
776 EXPORT_SYMBOL_GPL(of_changeset_revert
);
779 * of_changeset_action - Perform a changeset action
781 * @ocs: changeset pointer
782 * @action: action to perform
783 * @np: Pointer to device node
784 * @prop: Pointer to property
786 * On action being one of:
787 * + OF_RECONFIG_ATTACH_NODE
788 * + OF_RECONFIG_DETACH_NODE,
789 * + OF_RECONFIG_ADD_PROPERTY
790 * + OF_RECONFIG_REMOVE_PROPERTY,
791 * + OF_RECONFIG_UPDATE_PROPERTY
792 * Returns 0 on success, a negative error value in case of an error.
794 int of_changeset_action(struct of_changeset
*ocs
, unsigned long action
,
795 struct device_node
*np
, struct property
*prop
)
797 struct of_changeset_entry
*ce
;
799 ce
= kzalloc(sizeof(*ce
), GFP_KERNEL
);
803 /* get a reference to the node */
805 ce
->np
= of_node_get(np
);
808 if (action
== OF_RECONFIG_UPDATE_PROPERTY
&& prop
)
809 ce
->old_prop
= of_find_property(np
, prop
->name
, NULL
);
811 /* add it to the list */
812 list_add_tail(&ce
->node
, &ocs
->entries
);
815 EXPORT_SYMBOL_GPL(of_changeset_action
);