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