GNU Linux-libre 6.8.7-gnu
[releases.git] / drivers / of / platform.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  *    Copyright (C) 2006 Benjamin Herrenschmidt, IBM Corp.
4  *                       <benh@kernel.crashing.org>
5  *    and                Arnd Bergmann, IBM Corp.
6  *    Merged from powerpc/kernel/of_platform.c and
7  *    sparc{,64}/kernel/of_device.c by Stephen Rothwell
8  */
9
10 #define pr_fmt(fmt)     "OF: " fmt
11
12 #include <linux/errno.h>
13 #include <linux/module.h>
14 #include <linux/amba/bus.h>
15 #include <linux/device.h>
16 #include <linux/dma-mapping.h>
17 #include <linux/slab.h>
18 #include <linux/of_address.h>
19 #include <linux/of_device.h>
20 #include <linux/of_irq.h>
21 #include <linux/of_platform.h>
22 #include <linux/platform_device.h>
23 #include <linux/sysfb.h>
24
25 #include "of_private.h"
26
27 const struct of_device_id of_default_bus_match_table[] = {
28         { .compatible = "simple-bus", },
29         { .compatible = "simple-mfd", },
30         { .compatible = "isa", },
31 #ifdef CONFIG_ARM_AMBA
32         { .compatible = "arm,amba-bus", },
33 #endif /* CONFIG_ARM_AMBA */
34         {} /* Empty terminated list */
35 };
36
37 /**
38  * of_find_device_by_node - Find the platform_device associated with a node
39  * @np: Pointer to device tree node
40  *
41  * Takes a reference to the embedded struct device which needs to be dropped
42  * after use.
43  *
44  * Return: platform_device pointer, or NULL if not found
45  */
46 struct platform_device *of_find_device_by_node(struct device_node *np)
47 {
48         struct device *dev;
49
50         dev = bus_find_device_by_of_node(&platform_bus_type, np);
51         return dev ? to_platform_device(dev) : NULL;
52 }
53 EXPORT_SYMBOL(of_find_device_by_node);
54
55 int of_device_add(struct platform_device *ofdev)
56 {
57         BUG_ON(ofdev->dev.of_node == NULL);
58
59         /* name and id have to be set so that the platform bus doesn't get
60          * confused on matching */
61         ofdev->name = dev_name(&ofdev->dev);
62         ofdev->id = PLATFORM_DEVID_NONE;
63
64         /*
65          * If this device has not binding numa node in devicetree, that is
66          * of_node_to_nid returns NUMA_NO_NODE. device_add will assume that this
67          * device is on the same node as the parent.
68          */
69         set_dev_node(&ofdev->dev, of_node_to_nid(ofdev->dev.of_node));
70
71         return device_add(&ofdev->dev);
72 }
73
74 int of_device_register(struct platform_device *pdev)
75 {
76         device_initialize(&pdev->dev);
77         return of_device_add(pdev);
78 }
79 EXPORT_SYMBOL(of_device_register);
80
81 void of_device_unregister(struct platform_device *ofdev)
82 {
83         device_unregister(&ofdev->dev);
84 }
85 EXPORT_SYMBOL(of_device_unregister);
86
87 #ifdef CONFIG_OF_ADDRESS
88 static const struct of_device_id of_skipped_node_table[] = {
89         { .compatible = "operating-points-v2", },
90         {} /* Empty terminated list */
91 };
92
93 /*
94  * The following routines scan a subtree and registers a device for
95  * each applicable node.
96  *
97  * Note: sparc doesn't use these routines because it has a different
98  * mechanism for creating devices from device tree nodes.
99  */
100
101 /**
102  * of_device_alloc - Allocate and initialize an of_device
103  * @np: device node to assign to device
104  * @bus_id: Name to assign to the device.  May be null to use default name.
105  * @parent: Parent device.
106  */
107 struct platform_device *of_device_alloc(struct device_node *np,
108                                   const char *bus_id,
109                                   struct device *parent)
110 {
111         struct platform_device *dev;
112         int rc, i, num_reg = 0;
113         struct resource *res;
114
115         dev = platform_device_alloc("", PLATFORM_DEVID_NONE);
116         if (!dev)
117                 return NULL;
118
119         /* count the io resources */
120         num_reg = of_address_count(np);
121
122         /* Populate the resource table */
123         if (num_reg) {
124                 res = kcalloc(num_reg, sizeof(*res), GFP_KERNEL);
125                 if (!res) {
126                         platform_device_put(dev);
127                         return NULL;
128                 }
129
130                 dev->num_resources = num_reg;
131                 dev->resource = res;
132                 for (i = 0; i < num_reg; i++, res++) {
133                         rc = of_address_to_resource(np, i, res);
134                         WARN_ON(rc);
135                 }
136         }
137
138         /* setup generic device info */
139         device_set_node(&dev->dev, of_fwnode_handle(of_node_get(np)));
140         dev->dev.parent = parent ? : &platform_bus;
141
142         if (bus_id)
143                 dev_set_name(&dev->dev, "%s", bus_id);
144         else
145                 of_device_make_bus_id(&dev->dev);
146
147         return dev;
148 }
149 EXPORT_SYMBOL(of_device_alloc);
150
151 /**
152  * of_platform_device_create_pdata - Alloc, initialize and register an of_device
153  * @np: pointer to node to create device for
154  * @bus_id: name to assign device
155  * @platform_data: pointer to populate platform_data pointer with
156  * @parent: Linux device model parent device.
157  *
158  * Return: Pointer to created platform device, or NULL if a device was not
159  * registered.  Unavailable devices will not get registered.
160  */
161 static struct platform_device *of_platform_device_create_pdata(
162                                         struct device_node *np,
163                                         const char *bus_id,
164                                         void *platform_data,
165                                         struct device *parent)
166 {
167         struct platform_device *dev;
168
169         if (!of_device_is_available(np) ||
170             of_node_test_and_set_flag(np, OF_POPULATED))
171                 return NULL;
172
173         dev = of_device_alloc(np, bus_id, parent);
174         if (!dev)
175                 goto err_clear_flag;
176
177         dev->dev.coherent_dma_mask = DMA_BIT_MASK(32);
178         if (!dev->dev.dma_mask)
179                 dev->dev.dma_mask = &dev->dev.coherent_dma_mask;
180         dev->dev.bus = &platform_bus_type;
181         dev->dev.platform_data = platform_data;
182         of_msi_configure(&dev->dev, dev->dev.of_node);
183
184         if (of_device_add(dev) != 0) {
185                 platform_device_put(dev);
186                 goto err_clear_flag;
187         }
188
189         return dev;
190
191 err_clear_flag:
192         of_node_clear_flag(np, OF_POPULATED);
193         return NULL;
194 }
195
196 /**
197  * of_platform_device_create - Alloc, initialize and register an of_device
198  * @np: pointer to node to create device for
199  * @bus_id: name to assign device
200  * @parent: Linux device model parent device.
201  *
202  * Return: Pointer to created platform device, or NULL if a device was not
203  * registered.  Unavailable devices will not get registered.
204  */
205 struct platform_device *of_platform_device_create(struct device_node *np,
206                                             const char *bus_id,
207                                             struct device *parent)
208 {
209         return of_platform_device_create_pdata(np, bus_id, NULL, parent);
210 }
211 EXPORT_SYMBOL(of_platform_device_create);
212
213 #ifdef CONFIG_ARM_AMBA
214 static struct amba_device *of_amba_device_create(struct device_node *node,
215                                                  const char *bus_id,
216                                                  void *platform_data,
217                                                  struct device *parent)
218 {
219         struct amba_device *dev;
220         int ret;
221
222         pr_debug("Creating amba device %pOF\n", node);
223
224         if (!of_device_is_available(node) ||
225             of_node_test_and_set_flag(node, OF_POPULATED))
226                 return NULL;
227
228         dev = amba_device_alloc(NULL, 0, 0);
229         if (!dev)
230                 goto err_clear_flag;
231
232         /* AMBA devices only support a single DMA mask */
233         dev->dev.coherent_dma_mask = DMA_BIT_MASK(32);
234         dev->dev.dma_mask = &dev->dev.coherent_dma_mask;
235
236         /* setup generic device info */
237         device_set_node(&dev->dev, of_fwnode_handle(node));
238         dev->dev.parent = parent ? : &platform_bus;
239         dev->dev.platform_data = platform_data;
240         if (bus_id)
241                 dev_set_name(&dev->dev, "%s", bus_id);
242         else
243                 of_device_make_bus_id(&dev->dev);
244
245         /* Allow the HW Peripheral ID to be overridden */
246         of_property_read_u32(node, "arm,primecell-periphid", &dev->periphid);
247
248         ret = of_address_to_resource(node, 0, &dev->res);
249         if (ret) {
250                 pr_err("amba: of_address_to_resource() failed (%d) for %pOF\n",
251                        ret, node);
252                 goto err_free;
253         }
254
255         ret = amba_device_add(dev, &iomem_resource);
256         if (ret) {
257                 pr_err("amba_device_add() failed (%d) for %pOF\n",
258                        ret, node);
259                 goto err_free;
260         }
261
262         return dev;
263
264 err_free:
265         amba_device_put(dev);
266 err_clear_flag:
267         of_node_clear_flag(node, OF_POPULATED);
268         return NULL;
269 }
270 #else /* CONFIG_ARM_AMBA */
271 static struct amba_device *of_amba_device_create(struct device_node *node,
272                                                  const char *bus_id,
273                                                  void *platform_data,
274                                                  struct device *parent)
275 {
276         return NULL;
277 }
278 #endif /* CONFIG_ARM_AMBA */
279
280 /*
281  * of_dev_lookup() - Given a device node, lookup the preferred Linux name
282  */
283 static const struct of_dev_auxdata *of_dev_lookup(const struct of_dev_auxdata *lookup,
284                                  struct device_node *np)
285 {
286         const struct of_dev_auxdata *auxdata;
287         struct resource res;
288         int compatible = 0;
289
290         if (!lookup)
291                 return NULL;
292
293         auxdata = lookup;
294         for (; auxdata->compatible; auxdata++) {
295                 if (!of_device_is_compatible(np, auxdata->compatible))
296                         continue;
297                 compatible++;
298                 if (!of_address_to_resource(np, 0, &res))
299                         if (res.start != auxdata->phys_addr)
300                                 continue;
301                 pr_debug("%pOF: devname=%s\n", np, auxdata->name);
302                 return auxdata;
303         }
304
305         if (!compatible)
306                 return NULL;
307
308         /* Try compatible match if no phys_addr and name are specified */
309         auxdata = lookup;
310         for (; auxdata->compatible; auxdata++) {
311                 if (!of_device_is_compatible(np, auxdata->compatible))
312                         continue;
313                 if (!auxdata->phys_addr && !auxdata->name) {
314                         pr_debug("%pOF: compatible match\n", np);
315                         return auxdata;
316                 }
317         }
318
319         return NULL;
320 }
321
322 /**
323  * of_platform_bus_create() - Create a device for a node and its children.
324  * @bus: device node of the bus to instantiate
325  * @matches: match table for bus nodes
326  * @lookup: auxdata table for matching id and platform_data with device nodes
327  * @parent: parent for new device, or NULL for top level.
328  * @strict: require compatible property
329  *
330  * Creates a platform_device for the provided device_node, and optionally
331  * recursively create devices for all the child nodes.
332  */
333 static int of_platform_bus_create(struct device_node *bus,
334                                   const struct of_device_id *matches,
335                                   const struct of_dev_auxdata *lookup,
336                                   struct device *parent, bool strict)
337 {
338         const struct of_dev_auxdata *auxdata;
339         struct device_node *child;
340         struct platform_device *dev;
341         const char *bus_id = NULL;
342         void *platform_data = NULL;
343         int rc = 0;
344
345         /* Make sure it has a compatible property */
346         if (strict && (!of_get_property(bus, "compatible", NULL))) {
347                 pr_debug("%s() - skipping %pOF, no compatible prop\n",
348                          __func__, bus);
349                 return 0;
350         }
351
352         /* Skip nodes for which we don't want to create devices */
353         if (unlikely(of_match_node(of_skipped_node_table, bus))) {
354                 pr_debug("%s() - skipping %pOF node\n", __func__, bus);
355                 return 0;
356         }
357
358         if (of_node_check_flag(bus, OF_POPULATED_BUS)) {
359                 pr_debug("%s() - skipping %pOF, already populated\n",
360                         __func__, bus);
361                 return 0;
362         }
363
364         auxdata = of_dev_lookup(lookup, bus);
365         if (auxdata) {
366                 bus_id = auxdata->name;
367                 platform_data = auxdata->platform_data;
368         }
369
370         if (of_device_is_compatible(bus, "arm,primecell")) {
371                 /*
372                  * Don't return an error here to keep compatibility with older
373                  * device tree files.
374                  */
375                 of_amba_device_create(bus, bus_id, platform_data, parent);
376                 return 0;
377         }
378
379         dev = of_platform_device_create_pdata(bus, bus_id, platform_data, parent);
380         if (!dev || !of_match_node(matches, bus))
381                 return 0;
382
383         for_each_child_of_node(bus, child) {
384                 pr_debug("   create child: %pOF\n", child);
385                 rc = of_platform_bus_create(child, matches, lookup, &dev->dev, strict);
386                 if (rc) {
387                         of_node_put(child);
388                         break;
389                 }
390         }
391         of_node_set_flag(bus, OF_POPULATED_BUS);
392         return rc;
393 }
394
395 /**
396  * of_platform_bus_probe() - Probe the device-tree for platform buses
397  * @root: parent of the first level to probe or NULL for the root of the tree
398  * @matches: match table for bus nodes
399  * @parent: parent to hook devices from, NULL for toplevel
400  *
401  * Note that children of the provided root are not instantiated as devices
402  * unless the specified root itself matches the bus list and is not NULL.
403  */
404 int of_platform_bus_probe(struct device_node *root,
405                           const struct of_device_id *matches,
406                           struct device *parent)
407 {
408         struct device_node *child;
409         int rc = 0;
410
411         root = root ? of_node_get(root) : of_find_node_by_path("/");
412         if (!root)
413                 return -EINVAL;
414
415         pr_debug("%s()\n", __func__);
416         pr_debug(" starting at: %pOF\n", root);
417
418         /* Do a self check of bus type, if there's a match, create children */
419         if (of_match_node(matches, root)) {
420                 rc = of_platform_bus_create(root, matches, NULL, parent, false);
421         } else for_each_child_of_node(root, child) {
422                 if (!of_match_node(matches, child))
423                         continue;
424                 rc = of_platform_bus_create(child, matches, NULL, parent, false);
425                 if (rc) {
426                         of_node_put(child);
427                         break;
428                 }
429         }
430
431         of_node_put(root);
432         return rc;
433 }
434 EXPORT_SYMBOL(of_platform_bus_probe);
435
436 /**
437  * of_platform_populate() - Populate platform_devices from device tree data
438  * @root: parent of the first level to probe or NULL for the root of the tree
439  * @matches: match table, NULL to use the default
440  * @lookup: auxdata table for matching id and platform_data with device nodes
441  * @parent: parent to hook devices from, NULL for toplevel
442  *
443  * Similar to of_platform_bus_probe(), this function walks the device tree
444  * and creates devices from nodes.  It differs in that it follows the modern
445  * convention of requiring all device nodes to have a 'compatible' property,
446  * and it is suitable for creating devices which are children of the root
447  * node (of_platform_bus_probe will only create children of the root which
448  * are selected by the @matches argument).
449  *
450  * New board support should be using this function instead of
451  * of_platform_bus_probe().
452  *
453  * Return: 0 on success, < 0 on failure.
454  */
455 int of_platform_populate(struct device_node *root,
456                         const struct of_device_id *matches,
457                         const struct of_dev_auxdata *lookup,
458                         struct device *parent)
459 {
460         struct device_node *child;
461         int rc = 0;
462
463         root = root ? of_node_get(root) : of_find_node_by_path("/");
464         if (!root)
465                 return -EINVAL;
466
467         pr_debug("%s()\n", __func__);
468         pr_debug(" starting at: %pOF\n", root);
469
470         device_links_supplier_sync_state_pause();
471         for_each_child_of_node(root, child) {
472                 rc = of_platform_bus_create(child, matches, lookup, parent, true);
473                 if (rc) {
474                         of_node_put(child);
475                         break;
476                 }
477         }
478         device_links_supplier_sync_state_resume();
479
480         of_node_set_flag(root, OF_POPULATED_BUS);
481
482         of_node_put(root);
483         return rc;
484 }
485 EXPORT_SYMBOL_GPL(of_platform_populate);
486
487 int of_platform_default_populate(struct device_node *root,
488                                  const struct of_dev_auxdata *lookup,
489                                  struct device *parent)
490 {
491         return of_platform_populate(root, of_default_bus_match_table, lookup,
492                                     parent);
493 }
494 EXPORT_SYMBOL_GPL(of_platform_default_populate);
495
496 static const struct of_device_id reserved_mem_matches[] = {
497         { .compatible = "phram" },
498         { .compatible = "qcom,rmtfs-mem" },
499         { .compatible = "qcom,cmd-db" },
500         { .compatible = "qcom,smem" },
501         { .compatible = "ramoops" },
502         { .compatible = "nvmem-rmem" },
503         { .compatible = "google,open-dice" },
504         {}
505 };
506
507 static int __init of_platform_default_populate_init(void)
508 {
509         struct device_node *node;
510
511         device_links_supplier_sync_state_pause();
512
513         if (!of_have_populated_dt())
514                 return -ENODEV;
515
516         if (IS_ENABLED(CONFIG_PPC)) {
517                 struct device_node *boot_display = NULL;
518                 struct platform_device *dev;
519                 int display_number = 0;
520                 int ret;
521
522                 /* Check if we have a MacOS display without a node spec */
523                 if (of_property_present(of_chosen, "linux,bootx-noscreen")) {
524                         /*
525                          * The old code tried to work out which node was the MacOS
526                          * display based on the address. I'm dropping that since the
527                          * lack of a node spec only happens with old BootX versions
528                          * (users can update) and with this code, they'll still get
529                          * a display (just not the palette hacks).
530                          */
531                         dev = platform_device_alloc("bootx-noscreen", 0);
532                         if (WARN_ON(!dev))
533                                 return -ENOMEM;
534                         ret = platform_device_add(dev);
535                         if (WARN_ON(ret)) {
536                                 platform_device_put(dev);
537                                 return ret;
538                         }
539                 }
540
541                 /*
542                  * For OF framebuffers, first create the device for the boot display,
543                  * then for the other framebuffers. Only fail for the boot display;
544                  * ignore errors for the rest.
545                  */
546                 for_each_node_by_type(node, "display") {
547                         if (!of_get_property(node, "linux,opened", NULL) ||
548                             !of_get_property(node, "linux,boot-display", NULL))
549                                 continue;
550                         dev = of_platform_device_create(node, "of-display", NULL);
551                         of_node_put(node);
552                         if (WARN_ON(!dev))
553                                 return -ENOMEM;
554                         boot_display = node;
555                         display_number++;
556                         break;
557                 }
558                 for_each_node_by_type(node, "display") {
559                         char buf[14];
560                         const char *of_display_format = "of-display.%d";
561
562                         if (!of_get_property(node, "linux,opened", NULL) || node == boot_display)
563                                 continue;
564                         ret = snprintf(buf, sizeof(buf), of_display_format, display_number++);
565                         if (ret < sizeof(buf))
566                                 of_platform_device_create(node, buf, NULL);
567                 }
568
569         } else {
570                 /*
571                  * Handle certain compatibles explicitly, since we don't want to create
572                  * platform_devices for every node in /reserved-memory with a
573                  * "compatible",
574                  */
575                 for_each_matching_node(node, reserved_mem_matches)
576                         of_platform_device_create(node, NULL, NULL);
577
578                 node = of_find_node_by_path("/firmware");
579                 if (node) {
580                         of_platform_populate(node, NULL, NULL, NULL);
581                         of_node_put(node);
582                 }
583
584                 node = of_get_compatible_child(of_chosen, "simple-framebuffer");
585                 if (node) {
586                         /*
587                          * Since a "simple-framebuffer" device is already added
588                          * here, disable the Generic System Framebuffers (sysfb)
589                          * to prevent it from registering another device for the
590                          * system framebuffer later (e.g: using the screen_info
591                          * data that may had been filled as well).
592                          *
593                          * This can happen for example on DT systems that do EFI
594                          * booting and may provide a GOP handle to the EFI stub.
595                          */
596                         sysfb_disable();
597                         of_platform_device_create(node, NULL, NULL);
598                         of_node_put(node);
599                 }
600
601                 /* Populate everything else. */
602                 of_platform_default_populate(NULL, NULL, NULL);
603         }
604
605         return 0;
606 }
607 arch_initcall_sync(of_platform_default_populate_init);
608
609 static int __init of_platform_sync_state_init(void)
610 {
611         device_links_supplier_sync_state_resume();
612         return 0;
613 }
614 late_initcall_sync(of_platform_sync_state_init);
615
616 int of_platform_device_destroy(struct device *dev, void *data)
617 {
618         /* Do not touch devices not populated from the device tree */
619         if (!dev->of_node || !of_node_check_flag(dev->of_node, OF_POPULATED))
620                 return 0;
621
622         /* Recurse for any nodes that were treated as busses */
623         if (of_node_check_flag(dev->of_node, OF_POPULATED_BUS))
624                 device_for_each_child(dev, NULL, of_platform_device_destroy);
625
626         of_node_clear_flag(dev->of_node, OF_POPULATED);
627         of_node_clear_flag(dev->of_node, OF_POPULATED_BUS);
628
629         if (dev->bus == &platform_bus_type)
630                 platform_device_unregister(to_platform_device(dev));
631 #ifdef CONFIG_ARM_AMBA
632         else if (dev->bus == &amba_bustype)
633                 amba_device_unregister(to_amba_device(dev));
634 #endif
635
636         return 0;
637 }
638 EXPORT_SYMBOL_GPL(of_platform_device_destroy);
639
640 /**
641  * of_platform_depopulate() - Remove devices populated from device tree
642  * @parent: device which children will be removed
643  *
644  * Complementary to of_platform_populate(), this function removes children
645  * of the given device (and, recursively, their children) that have been
646  * created from their respective device tree nodes (and only those,
647  * leaving others - eg. manually created - unharmed).
648  */
649 void of_platform_depopulate(struct device *parent)
650 {
651         if (parent->of_node && of_node_check_flag(parent->of_node, OF_POPULATED_BUS)) {
652                 device_for_each_child_reverse(parent, NULL, of_platform_device_destroy);
653                 of_node_clear_flag(parent->of_node, OF_POPULATED_BUS);
654         }
655 }
656 EXPORT_SYMBOL_GPL(of_platform_depopulate);
657
658 static void devm_of_platform_populate_release(struct device *dev, void *res)
659 {
660         of_platform_depopulate(*(struct device **)res);
661 }
662
663 /**
664  * devm_of_platform_populate() - Populate platform_devices from device tree data
665  * @dev: device that requested to populate from device tree data
666  *
667  * Similar to of_platform_populate(), but will automatically call
668  * of_platform_depopulate() when the device is unbound from the bus.
669  *
670  * Return: 0 on success, < 0 on failure.
671  */
672 int devm_of_platform_populate(struct device *dev)
673 {
674         struct device **ptr;
675         int ret;
676
677         if (!dev)
678                 return -EINVAL;
679
680         ptr = devres_alloc(devm_of_platform_populate_release,
681                            sizeof(*ptr), GFP_KERNEL);
682         if (!ptr)
683                 return -ENOMEM;
684
685         ret = of_platform_populate(dev->of_node, NULL, NULL, dev);
686         if (ret) {
687                 devres_free(ptr);
688         } else {
689                 *ptr = dev;
690                 devres_add(dev, ptr);
691         }
692
693         return ret;
694 }
695 EXPORT_SYMBOL_GPL(devm_of_platform_populate);
696
697 static int devm_of_platform_match(struct device *dev, void *res, void *data)
698 {
699         struct device **ptr = res;
700
701         if (!ptr) {
702                 WARN_ON(!ptr);
703                 return 0;
704         }
705
706         return *ptr == data;
707 }
708
709 /**
710  * devm_of_platform_depopulate() - Remove devices populated from device tree
711  * @dev: device that requested to depopulate from device tree data
712  *
713  * Complementary to devm_of_platform_populate(), this function removes children
714  * of the given device (and, recursively, their children) that have been
715  * created from their respective device tree nodes (and only those,
716  * leaving others - eg. manually created - unharmed).
717  */
718 void devm_of_platform_depopulate(struct device *dev)
719 {
720         int ret;
721
722         ret = devres_release(dev, devm_of_platform_populate_release,
723                              devm_of_platform_match, dev);
724
725         WARN_ON(ret);
726 }
727 EXPORT_SYMBOL_GPL(devm_of_platform_depopulate);
728
729 #ifdef CONFIG_OF_DYNAMIC
730 static int of_platform_notify(struct notifier_block *nb,
731                                 unsigned long action, void *arg)
732 {
733         struct of_reconfig_data *rd = arg;
734         struct platform_device *pdev_parent, *pdev;
735         bool children_left;
736
737         switch (of_reconfig_get_state_change(action, rd)) {
738         case OF_RECONFIG_CHANGE_ADD:
739                 /* verify that the parent is a bus */
740                 if (!of_node_check_flag(rd->dn->parent, OF_POPULATED_BUS))
741                         return NOTIFY_OK;       /* not for us */
742
743                 /* already populated? (driver using of_populate manually) */
744                 if (of_node_check_flag(rd->dn, OF_POPULATED))
745                         return NOTIFY_OK;
746
747                 /*
748                  * Clear the flag before adding the device so that fw_devlink
749                  * doesn't skip adding consumers to this device.
750                  */
751                 rd->dn->fwnode.flags &= ~FWNODE_FLAG_NOT_DEVICE;
752                 /* pdev_parent may be NULL when no bus platform device */
753                 pdev_parent = of_find_device_by_node(rd->dn->parent);
754                 pdev = of_platform_device_create(rd->dn, NULL,
755                                 pdev_parent ? &pdev_parent->dev : NULL);
756                 platform_device_put(pdev_parent);
757
758                 if (pdev == NULL) {
759                         pr_err("%s: failed to create for '%pOF'\n",
760                                         __func__, rd->dn);
761                         /* of_platform_device_create tosses the error code */
762                         return notifier_from_errno(-EINVAL);
763                 }
764                 break;
765
766         case OF_RECONFIG_CHANGE_REMOVE:
767
768                 /* already depopulated? */
769                 if (!of_node_check_flag(rd->dn, OF_POPULATED))
770                         return NOTIFY_OK;
771
772                 /* find our device by node */
773                 pdev = of_find_device_by_node(rd->dn);
774                 if (pdev == NULL)
775                         return NOTIFY_OK;       /* no? not meant for us */
776
777                 /* unregister takes one ref away */
778                 of_platform_device_destroy(&pdev->dev, &children_left);
779
780                 /* and put the reference of the find */
781                 platform_device_put(pdev);
782                 break;
783         }
784
785         return NOTIFY_OK;
786 }
787
788 static struct notifier_block platform_of_notifier = {
789         .notifier_call = of_platform_notify,
790 };
791
792 void of_platform_register_reconfig_notifier(void)
793 {
794         WARN_ON(of_reconfig_notifier_register(&platform_of_notifier));
795 }
796 #endif /* CONFIG_OF_DYNAMIC */
797
798 #endif /* CONFIG_OF_ADDRESS */