@@ -458,4 +458,30 @@ int of_platform_populate(struct device_node *root,
of_node_put(root);
return rc;
}
+
+/**
+ * of_early_platform_populate() - Populate early platform devices from DT
+ * @class: string to compare to the 'compatible' attributes
+ *
+ * This function walks the device tree and register devices whose
+ * 'compatible' property matches the 'class' parameter.
+ *
+ * Returns 0 on success, < 0 on failure.
+ */
+int of_early_platform_populate(const char *class)
+{
+ struct platform_device *pdev;
+ struct device_node *np = NULL;
+
+ while ((np = of_find_compatible_node(np, NULL, class))) {
+ pdev = of_device_alloc(np, NULL, NULL);
+ if (!pdev)
+ return -ENOMEM;
+ list_del(&pdev->dev.devres_head);
+ memset(&pdev->dev.devres_head, 0, sizeof(pdev->dev.devres_head));
+ early_platform_add_devices(&pdev, 1);
+ }
+
+ return 0;
+}
#endif /* !CONFIG_SPARC */
@@ -95,6 +95,7 @@ extern int of_platform_populate(struct device_node *root,
const struct of_device_id *matches,
const struct of_dev_auxdata *lookup,
struct device *parent);
+extern int of_early_platform_populate(const char *class);
#endif /* !CONFIG_SPARC */
#endif /* CONFIG_OF_DEVICE */
Add support for populating early platform devices from the device tree, by walking the tree and adding nodes whose 'compatible' property matches the 'class' string passed as a parameter. This allows devices to be probed long before the whole device infrastructure is available. Signed-off-by: Marc Zyngier <marc.zyngier@arm.com> --- drivers/of/platform.c | 26 ++++++++++++++++++++++++++ include/linux/of_platform.h | 1 + 2 files changed, 27 insertions(+), 0 deletions(-)