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