cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

platform.c (22022B)


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