Re: [PATCH v2 1/5] of/platform: Generalize /reserved-memory handling
From: Rob Herring <robh+dt@kernel.org>
Date: 2017-08-03 17:40:52
Also in:
linux-arm-msm, lkml
On Wed, Aug 2, 2017 at 9:57 PM, Bjorn Andersson [off-list ref] wrote:
quoted hunk ↗ jump to hunk
By iterating over all /reserved-memory child nodes and match each one to a list of compatibles that we want to treat specially, we can easily extend the list of compatibles to handle - without having to resort to of_platform_populate() that would create unnecessary platform_devices. Signed-off-by: Bjorn Andersson <redacted> --- Changes since v1: - New patch drivers/of/platform.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-)diff --git a/drivers/of/platform.c b/drivers/of/platform.c index b19524623498..8c241a116b08 100644 --- a/drivers/of/platform.c +++ b/drivers/of/platform.c@@ -497,23 +497,32 @@ int of_platform_default_populate(struct device_node *root, EXPORT_SYMBOL_GPL(of_platform_default_populate); #ifndef CONFIG_PPC +static const char *rmem_compats[] = { + "ramoops", + NULL +}; + static int __init of_platform_default_populate_init(void) { + struct device_node *rmem_nodes; struct device_node *node; + int ret; if (!of_have_populated_dt()) return -ENODEV; /* - * Handle ramoops explicitly, since it is inside /reserved-memory, - * which lacks a "compatible" property. + * Handle certain compatibles explicitly, since we don't want to create + * platform_devices for every node in /reserved-memory with a + * "compatible", */ - node = of_find_node_by_path("/reserved-memory"); - if (node) { - node = of_find_compatible_node(node, NULL, "ramoops"); - if (node) + rmem_nodes = of_find_node_by_path("/reserved-memory"); + for_each_available_child_of_node(rmem_nodes, node) { + ret = of_device_compatible_match(node, rmem_compats); + if (ret)
I would just do:
for_each_matching_node(node, ...)
of_platform_device_create(node, NULL, NULL);
I don't think the kernel has to validate that ramoops and any others
we add are children of /reserved-memory. We should only have those
compatibles located there and any other location would be an error.
of_platform_device_create(node, NULL, NULL);
}
+ of_node_put(rmem_nodes);
/* Populate everything else. */
of_platform_default_populate(NULL, NULL, NULL);
--
2.12.0