xref: /openbmc/linux/drivers/of/dynamic.c (revision 4da722ca)
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 #define pr_fmt(fmt)	"OF: " fmt
10 
11 #include <linux/of.h>
12 #include <linux/spinlock.h>
13 #include <linux/slab.h>
14 #include <linux/string.h>
15 #include <linux/proc_fs.h>
16 
17 #include "of_private.h"
18 
19 /**
20  * of_node_get() - Increment refcount of a node
21  * @node:	Node to inc refcount, NULL is supported to simplify writing of
22  *		callers
23  *
24  * Returns node.
25  */
26 struct device_node *of_node_get(struct device_node *node)
27 {
28 	if (node)
29 		kobject_get(&node->kobj);
30 	return node;
31 }
32 EXPORT_SYMBOL(of_node_get);
33 
34 /**
35  * of_node_put() - Decrement refcount of a node
36  * @node:	Node to dec refcount, NULL is supported to simplify writing of
37  *		callers
38  */
39 void of_node_put(struct device_node *node)
40 {
41 	if (node)
42 		kobject_put(&node->kobj);
43 }
44 EXPORT_SYMBOL(of_node_put);
45 
46 void __of_detach_node_sysfs(struct device_node *np)
47 {
48 	struct property *pp;
49 
50 	if (!IS_ENABLED(CONFIG_SYSFS))
51 		return;
52 
53 	BUG_ON(!of_node_is_initialized(np));
54 	if (!of_kset)
55 		return;
56 
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);
62 	}
63 
64 	/* finally remove the kobj_init ref */
65 	of_node_put(np);
66 }
67 
68 static BLOCKING_NOTIFIER_HEAD(of_reconfig_chain);
69 
70 int of_reconfig_notifier_register(struct notifier_block *nb)
71 {
72 	return blocking_notifier_chain_register(&of_reconfig_chain, nb);
73 }
74 EXPORT_SYMBOL_GPL(of_reconfig_notifier_register);
75 
76 int of_reconfig_notifier_unregister(struct notifier_block *nb)
77 {
78 	return blocking_notifier_chain_unregister(&of_reconfig_chain, nb);
79 }
80 EXPORT_SYMBOL_GPL(of_reconfig_notifier_unregister);
81 
82 #ifdef DEBUG
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",
89 };
90 #endif
91 
92 int of_reconfig_notify(unsigned long action, struct of_reconfig_data *p)
93 {
94 	int rc;
95 #ifdef DEBUG
96 	struct of_reconfig_data *pr = p;
97 
98 	switch (action) {
99 	case OF_RECONFIG_ATTACH_NODE:
100 	case OF_RECONFIG_DETACH_NODE:
101 		pr_debug("notify %-15s %pOF\n", action_names[action],
102 			pr->dn);
103 		break;
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);
109 		break;
110 
111 	}
112 #endif
113 	rc = blocking_notifier_call_chain(&of_reconfig_chain, action, p);
114 	return notifier_to_errno(rc);
115 }
116 
117 /*
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
121  *
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.
125  */
126 int of_reconfig_get_state_change(unsigned long action, struct of_reconfig_data *pr)
127 {
128 	struct property *prop, *old_prop = NULL;
129 	int is_status, status_state, old_status_state, prev_state, new_state;
130 
131 	/* figure out if a device should be created or destroyed */
132 	switch (action) {
133 	case OF_RECONFIG_ATTACH_NODE:
134 	case OF_RECONFIG_DETACH_NODE:
135 		prop = of_find_property(pr->dn, "status", NULL);
136 		break;
137 	case OF_RECONFIG_ADD_PROPERTY:
138 	case OF_RECONFIG_REMOVE_PROPERTY:
139 		prop = pr->prop;
140 		break;
141 	case OF_RECONFIG_UPDATE_PROPERTY:
142 		prop = pr->prop;
143 		old_prop = pr->old_prop;
144 		break;
145 	default:
146 		return OF_RECONFIG_NO_CHANGE;
147 	}
148 
149 	is_status = 0;
150 	status_state = -1;
151 	old_status_state = -1;
152 	prev_state = -1;
153 	new_state = -1;
154 
155 	if (prop && !strcmp(prop->name, "status")) {
156 		is_status = 1;
157 		status_state = !strcmp(prop->value, "okay") ||
158 			       !strcmp(prop->value, "ok");
159 		if (old_prop)
160 			old_status_state = !strcmp(old_prop->value, "okay") ||
161 					   !strcmp(old_prop->value, "ok");
162 	}
163 
164 	switch (action) {
165 	case OF_RECONFIG_ATTACH_NODE:
166 		prev_state = 0;
167 		/* -1 & 0 status either missing or okay */
168 		new_state = status_state != 0;
169 		break;
170 	case OF_RECONFIG_DETACH_NODE:
171 		/* -1 & 0 status either missing or okay */
172 		prev_state = status_state != 0;
173 		new_state = 0;
174 		break;
175 	case OF_RECONFIG_ADD_PROPERTY:
176 		if (is_status) {
177 			/* no status property -> enabled (legacy) */
178 			prev_state = 1;
179 			new_state = status_state;
180 		}
181 		break;
182 	case OF_RECONFIG_REMOVE_PROPERTY:
183 		if (is_status) {
184 			prev_state = status_state;
185 			/* no status property -> enabled (legacy) */
186 			new_state = 1;
187 		}
188 		break;
189 	case OF_RECONFIG_UPDATE_PROPERTY:
190 		if (is_status) {
191 			prev_state = old_status_state != 0;
192 			new_state = status_state != 0;
193 		}
194 		break;
195 	}
196 
197 	if (prev_state == new_state)
198 		return OF_RECONFIG_NO_CHANGE;
199 
200 	return new_state ? OF_RECONFIG_CHANGE_ADD : OF_RECONFIG_CHANGE_REMOVE;
201 }
202 EXPORT_SYMBOL_GPL(of_reconfig_get_state_change);
203 
204 int of_property_notify(int action, struct device_node *np,
205 		       struct property *prop, struct property *oldprop)
206 {
207 	struct of_reconfig_data pr;
208 
209 	/* only call notifiers if the node is attached */
210 	if (!of_node_is_attached(np))
211 		return 0;
212 
213 	pr.dn = np;
214 	pr.prop = prop;
215 	pr.old_prop = oldprop;
216 	return of_reconfig_notify(action, &pr);
217 }
218 
219 static void __of_attach_node(struct device_node *np)
220 {
221 	const __be32 *phandle;
222 	int sz;
223 
224 	np->name = __of_get_property(np, "name", NULL) ? : "<NULL>";
225 	np->type = __of_get_property(np, "device_type", NULL) ? : "<NULL>";
226 
227 	phandle = __of_get_property(np, "phandle", &sz);
228 	if (!phandle)
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;
233 
234 	np->child = NULL;
235 	np->sibling = np->parent->child;
236 	np->parent->child = np;
237 	of_node_clear_flag(np, OF_DETACHED);
238 }
239 
240 /**
241  * of_attach_node() - Plug a device node into the tree and global list.
242  */
243 int of_attach_node(struct device_node *np)
244 {
245 	struct of_reconfig_data rd;
246 	unsigned long flags;
247 
248 	memset(&rd, 0, sizeof(rd));
249 	rd.dn = np;
250 
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);
255 
256 	__of_attach_node_sysfs(np);
257 	mutex_unlock(&of_mutex);
258 
259 	of_reconfig_notify(OF_RECONFIG_ATTACH_NODE, &rd);
260 
261 	return 0;
262 }
263 
264 void __of_detach_node(struct device_node *np)
265 {
266 	struct device_node *parent;
267 
268 	if (WARN_ON(of_node_check_flag(np, OF_DETACHED)))
269 		return;
270 
271 	parent = np->parent;
272 	if (WARN_ON(!parent))
273 		return;
274 
275 	if (parent->child == np)
276 		parent->child = np->sibling;
277 	else {
278 		struct device_node *prevsib;
279 		for (prevsib = np->parent->child;
280 		     prevsib->sibling != np;
281 		     prevsib = prevsib->sibling)
282 			;
283 		prevsib->sibling = np->sibling;
284 	}
285 
286 	of_node_set_flag(np, OF_DETACHED);
287 }
288 
289 /**
290  * of_detach_node() - "Unplug" a node from the device tree.
291  *
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.
294  */
295 int of_detach_node(struct device_node *np)
296 {
297 	struct of_reconfig_data rd;
298 	unsigned long flags;
299 	int rc = 0;
300 
301 	memset(&rd, 0, sizeof(rd));
302 	rd.dn = np;
303 
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);
308 
309 	__of_detach_node_sysfs(np);
310 	mutex_unlock(&of_mutex);
311 
312 	of_reconfig_notify(OF_RECONFIG_DETACH_NODE, &rd);
313 
314 	return rc;
315 }
316 EXPORT_SYMBOL_GPL(of_detach_node);
317 
318 /**
319  * of_node_release() - release a dynamically allocated node
320  * @kref: kref element of the node to be released
321  *
322  * In of_node_put() this function is passed to kref_put() as the destructor.
323  */
324 void of_node_release(struct kobject *kobj)
325 {
326 	struct device_node *node = kobj_to_device_node(kobj);
327 	struct property *prop = node->properties;
328 
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);
332 		dump_stack();
333 		return;
334 	}
335 	if (!of_node_check_flag(node, OF_DYNAMIC))
336 		return;
337 
338 	while (prop) {
339 		struct property *next = prop->next;
340 		kfree(prop->name);
341 		kfree(prop->value);
342 		kfree(prop);
343 		prop = next;
344 
345 		if (!prop) {
346 			prop = node->deadprops;
347 			node->deadprops = NULL;
348 		}
349 	}
350 	kfree(node->full_name);
351 	kfree(node->data);
352 	kfree(node);
353 }
354 
355 /**
356  * __of_prop_dup - Copy a property dynamically.
357  * @prop:	Property to copy
358  * @allocflags:	Allocation flags (typically pass GFP_KERNEL)
359  *
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.
365  */
366 struct property *__of_prop_dup(const struct property *prop, gfp_t allocflags)
367 {
368 	struct property *new;
369 
370 	new = kzalloc(sizeof(*new), allocflags);
371 	if (!new)
372 		return NULL;
373 
374 	/*
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.
379 	 */
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)
384 		goto err_free;
385 
386 	/* mark the property as dynamic */
387 	of_property_set_flag(new, OF_DYNAMIC);
388 
389 	return new;
390 
391  err_free:
392 	kfree(new->name);
393 	kfree(new->value);
394 	kfree(new);
395 	return NULL;
396 }
397 
398 /**
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
401  *
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
406  * memory error.
407  */
408 struct device_node *__of_node_dup(const struct device_node *np, const char *fmt, ...)
409 {
410 	va_list vargs;
411 	struct device_node *node;
412 
413 	node = kzalloc(sizeof(*node), GFP_KERNEL);
414 	if (!node)
415 		return NULL;
416 	va_start(vargs, fmt);
417 	node->full_name = kvasprintf(GFP_KERNEL, fmt, vargs);
418 	va_end(vargs);
419 	if (!node->full_name) {
420 		kfree(node);
421 		return NULL;
422 	}
423 
424 	of_node_set_flag(node, OF_DYNAMIC);
425 	of_node_set_flag(node, OF_DETACHED);
426 	of_node_init(node);
427 
428 	/* Iterate over and duplicate all properties */
429 	if (np) {
430 		struct property *pp, *new_pp;
431 		for_each_property_of_node(np, pp) {
432 			new_pp = __of_prop_dup(pp, GFP_KERNEL);
433 			if (!new_pp)
434 				goto err_prop;
435 			if (__of_add_property(node, new_pp)) {
436 				kfree(new_pp->name);
437 				kfree(new_pp->value);
438 				kfree(new_pp);
439 				goto err_prop;
440 			}
441 		}
442 	}
443 	return node;
444 
445  err_prop:
446 	of_node_put(node); /* Frees the node and properties */
447 	return NULL;
448 }
449 
450 static void __of_changeset_entry_destroy(struct of_changeset_entry *ce)
451 {
452 	of_node_put(ce->np);
453 	list_del(&ce->node);
454 	kfree(ce);
455 }
456 
457 #ifdef DEBUG
458 static void __of_changeset_entry_dump(struct of_changeset_entry *ce)
459 {
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);
466 		break;
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],
470 			ce->np);
471 		break;
472 	}
473 }
474 #else
475 static inline void __of_changeset_entry_dump(struct of_changeset_entry *ce)
476 {
477 	/* empty */
478 }
479 #endif
480 
481 static void __of_changeset_entry_invert(struct of_changeset_entry *ce,
482 					  struct of_changeset_entry *rce)
483 {
484 	memcpy(rce, ce, sizeof(*rce));
485 
486 	switch (ce->action) {
487 	case OF_RECONFIG_ATTACH_NODE:
488 		rce->action = OF_RECONFIG_DETACH_NODE;
489 		break;
490 	case OF_RECONFIG_DETACH_NODE:
491 		rce->action = OF_RECONFIG_ATTACH_NODE;
492 		break;
493 	case OF_RECONFIG_ADD_PROPERTY:
494 		rce->action = OF_RECONFIG_REMOVE_PROPERTY;
495 		break;
496 	case OF_RECONFIG_REMOVE_PROPERTY:
497 		rce->action = OF_RECONFIG_ADD_PROPERTY;
498 		break;
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 */
503 		if (!rce->prop) {
504 			rce->action = OF_RECONFIG_REMOVE_PROPERTY;
505 			rce->prop = ce->prop;
506 		}
507 		break;
508 	}
509 }
510 
511 static void __of_changeset_entry_notify(struct of_changeset_entry *ce, bool revert)
512 {
513 	struct of_reconfig_data rd;
514 	struct of_changeset_entry ce_inverted;
515 	int ret;
516 
517 	if (revert) {
518 		__of_changeset_entry_invert(ce, &ce_inverted);
519 		ce = &ce_inverted;
520 	}
521 
522 	switch (ce->action) {
523 	case OF_RECONFIG_ATTACH_NODE:
524 	case OF_RECONFIG_DETACH_NODE:
525 		memset(&rd, 0, sizeof(rd));
526 		rd.dn = ce->np;
527 		ret = of_reconfig_notify(ce->action, &rd);
528 		break;
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);
533 		break;
534 	default:
535 		pr_err("invalid devicetree changeset action: %i\n",
536 			(int)ce->action);
537 		return;
538 	}
539 
540 	if (ret)
541 		pr_err("changeset notifier error @%pOF\n", ce->np);
542 }
543 
544 static int __of_changeset_entry_apply(struct of_changeset_entry *ce)
545 {
546 	struct property *old_prop, **propp;
547 	unsigned long flags;
548 	int ret = 0;
549 
550 	__of_changeset_entry_dump(ce);
551 
552 	raw_spin_lock_irqsave(&devtree_lock, flags);
553 	switch (ce->action) {
554 	case OF_RECONFIG_ATTACH_NODE:
555 		__of_attach_node(ce->np);
556 		break;
557 	case OF_RECONFIG_DETACH_NODE:
558 		__of_detach_node(ce->np);
559 		break;
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;
566 				break;
567 			}
568 		}
569 
570 		ret = __of_add_property(ce->np, ce->prop);
571 		if (ret) {
572 			pr_err("changeset: add_property failed @%pOF/%s\n",
573 				ce->np,
574 				ce->prop->name);
575 			break;
576 		}
577 		break;
578 	case OF_RECONFIG_REMOVE_PROPERTY:
579 		ret = __of_remove_property(ce->np, ce->prop);
580 		if (ret) {
581 			pr_err("changeset: remove_property failed @%pOF/%s\n",
582 				ce->np,
583 				ce->prop->name);
584 			break;
585 		}
586 		break;
587 
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;
594 				break;
595 			}
596 		}
597 
598 		ret = __of_update_property(ce->np, ce->prop, &old_prop);
599 		if (ret) {
600 			pr_err("changeset: update_property failed @%pOF/%s\n",
601 				ce->np,
602 				ce->prop->name);
603 			break;
604 		}
605 		break;
606 	default:
607 		ret = -EINVAL;
608 	}
609 	raw_spin_unlock_irqrestore(&devtree_lock, flags);
610 
611 	if (ret)
612 		return ret;
613 
614 	switch (ce->action) {
615 	case OF_RECONFIG_ATTACH_NODE:
616 		__of_attach_node_sysfs(ce->np);
617 		break;
618 	case OF_RECONFIG_DETACH_NODE:
619 		__of_detach_node_sysfs(ce->np);
620 		break;
621 	case OF_RECONFIG_ADD_PROPERTY:
622 		/* ignore duplicate names */
623 		__of_add_property_sysfs(ce->np, ce->prop);
624 		break;
625 	case OF_RECONFIG_REMOVE_PROPERTY:
626 		__of_remove_property_sysfs(ce->np, ce->prop);
627 		break;
628 	case OF_RECONFIG_UPDATE_PROPERTY:
629 		__of_update_property_sysfs(ce->np, ce->prop, ce->old_prop);
630 		break;
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 int __of_changeset_apply(struct of_changeset *ocs)
676 {
677 	struct of_changeset_entry *ce;
678 	int ret;
679 
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);
684 		if (ret) {
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);
688 			return ret;
689 		}
690 	}
691 	pr_debug("changeset: applied, emitting notifiers.\n");
692 
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");
699 
700 	return 0;
701 }
702 
703 /**
704  * of_changeset_apply - Applies a changeset
705  *
706  * @ocs:	changeset pointer
707  *
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.
714  */
715 int of_changeset_apply(struct of_changeset *ocs)
716 {
717 	int ret;
718 
719 	mutex_lock(&of_mutex);
720 	ret = __of_changeset_apply(ocs);
721 	mutex_unlock(&of_mutex);
722 
723 	return ret;
724 }
725 EXPORT_SYMBOL_GPL(of_changeset_apply);
726 
727 int __of_changeset_revert(struct of_changeset *ocs)
728 {
729 	struct of_changeset_entry *ce;
730 	int ret;
731 
732 	pr_debug("changeset: reverting...\n");
733 	list_for_each_entry_reverse(ce, &ocs->entries, node) {
734 		ret = __of_changeset_entry_revert(ce);
735 		if (ret) {
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);
739 			return ret;
740 		}
741 	}
742 	pr_debug("changeset: reverted, emitting notifiers.\n");
743 
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");
750 
751 	return 0;
752 }
753 
754 /**
755  * of_changeset_revert - Reverts an applied changeset
756  *
757  * @ocs:	changeset pointer
758  *
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.
764  */
765 int of_changeset_revert(struct of_changeset *ocs)
766 {
767 	int ret;
768 
769 	mutex_lock(&of_mutex);
770 	ret = __of_changeset_revert(ocs);
771 	mutex_unlock(&of_mutex);
772 
773 	return ret;
774 }
775 EXPORT_SYMBOL_GPL(of_changeset_revert);
776 
777 /**
778  * of_changeset_action - Perform a changeset action
779  *
780  * @ocs:	changeset pointer
781  * @action:	action to perform
782  * @np:		Pointer to device node
783  * @prop:	Pointer to property
784  *
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.
792  */
793 int of_changeset_action(struct of_changeset *ocs, unsigned long action,
794 		struct device_node *np, struct property *prop)
795 {
796 	struct of_changeset_entry *ce;
797 
798 	ce = kzalloc(sizeof(*ce), GFP_KERNEL);
799 	if (!ce)
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