diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2022-03-14 10:10:24 +0100 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2022-03-14 10:10:24 +0100 |
commit | d8ef1573dfc3475d4f5dffa37cb4444b5d6f21eb (patch) | |
tree | 3a4cc9f9dd8f49f870756ac7e4e834f789037c19 /drivers | |
parent | afd64e7ee4928c3104ddff40b3fda6a45bd10b50 (diff) | |
parent | b641580deb8c624373f792a90c38c6ebaaddb719 (diff) | |
download | barebox-d8ef1573dfc3475d4f5dffa37cb4444b5d6f21eb.tar.gz barebox-d8ef1573dfc3475d4f5dffa37cb4444b5d6f21eb.tar.xz |
Merge branch 'for-next/of-deep-probe'
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/aiodev/qoriq_thermal.c | 2 | ||||
-rw-r--r-- | drivers/net/cpsw.c | 2 | ||||
-rw-r--r-- | drivers/net/phy/mv88e6xxx/port.c | 2 | ||||
-rw-r--r-- | drivers/of/base.c | 40 | ||||
-rw-r--r-- | drivers/of/fdt.c | 2 | ||||
-rw-r--r-- | drivers/of/platform.c | 44 | ||||
-rw-r--r-- | drivers/of/resolver.c | 4 |
7 files changed, 84 insertions, 12 deletions
diff --git a/drivers/aiodev/qoriq_thermal.c b/drivers/aiodev/qoriq_thermal.c index d62048ef13..1acb06a9de 100644 --- a/drivers/aiodev/qoriq_thermal.c +++ b/drivers/aiodev/qoriq_thermal.c @@ -118,7 +118,7 @@ static int qoriq_tmu_get_sensor_id(void) struct of_phandle_args sensor_specs; struct device_node *np, *sensor_np; - np = of_find_node_by_name(NULL, "thermal-zones"); + np = of_find_node_by_name_address(NULL, "thermal-zones"); if (!np) return -ENODEV; diff --git a/drivers/net/cpsw.c b/drivers/net/cpsw.c index 6725c7b9bd..748aa861f1 100644 --- a/drivers/net/cpsw.c +++ b/drivers/net/cpsw.c @@ -1224,7 +1224,7 @@ static void cpsw_add_slave(struct cpsw_slave *slave, struct device_node *child, uint32_t phy_id[2] = {-1, -1}; int ret; - if (!of_find_node_by_name(child, "fixed-link")) { + if (!of_find_node_by_name_address(child, "fixed-link")) { ret = of_property_read_u32_array(child, "phy_id", phy_id, 2); if (!ret) dev_warn(slave->cpsw->dev, "phy_id is deprecated, use phy-handle\n"); diff --git a/drivers/net/phy/mv88e6xxx/port.c b/drivers/net/phy/mv88e6xxx/port.c index ba2b03e18d..79694e5237 100644 --- a/drivers/net/phy/mv88e6xxx/port.c +++ b/drivers/net/phy/mv88e6xxx/port.c @@ -558,7 +558,7 @@ int mv88e6xxx_port_probe(struct mv88e6xxx_chip *chip) struct device_node *port_nodes[DSA_MAX_PORTS] = { NULL }; int err, i; - switch_node = of_find_node_by_name(np, "ports"); + switch_node = of_find_node_by_name_address(np, "ports"); if (!switch_node) return -EINVAL; diff --git a/drivers/of/base.c b/drivers/of/base.c index 723bf2132d..83291c4785 100644 --- a/drivers/of/base.c +++ b/drivers/of/base.c @@ -23,6 +23,21 @@ static struct device_node *root_node; +bool of_node_name_eq(const struct device_node *np, const char *name) +{ + const char *node_name; + size_t len; + + if (!np) + return false; + + node_name = kbasename(np->full_name); + len = strchrnul(node_name, '@') - node_name; + + return (strlen(name) == len) && (strncmp(node_name, name, len) == 0); +} +EXPORT_SYMBOL(of_node_name_eq); + /* * Iterate over all nodes of a tree. As a devicetree does not * have a dedicated list head, the start node (usually the root @@ -538,6 +553,29 @@ int of_device_is_compatible(const struct device_node *device, EXPORT_SYMBOL(of_device_is_compatible); /** + * of_find_node_by_name_address - Find a node by its full name + * @from: The node to start searching from or NULL, the node + * you pass will not be searched, only the next one + * will; typically, you pass what the previous call + * returned. + * @name: The name string to match against + * + * Returns a pointer to the node found or NULL. + */ +struct device_node *of_find_node_by_name_address(struct device_node *from, + const char *name) +{ + struct device_node *np; + + of_tree_for_each_node_from(np, from) + if (np->name && !of_node_cmp(np->name, name)) + return np; + + return NULL; +} +EXPORT_SYMBOL(of_find_node_by_name_address); + +/** * of_find_node_by_name - Find a node by its "name" property * @from: The node to start searching from or NULL, the node * you pass will not be searched, only the next one @@ -553,7 +591,7 @@ struct device_node *of_find_node_by_name(struct device_node *from, struct device_node *np; of_tree_for_each_node_from(np, from) - if (np->name && !of_node_cmp(np->name, name)) + if (np->name && of_node_name_eq(np, name)) return np; return NULL; diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c index 770126c78e..5ccbd1bb69 100644 --- a/drivers/of/fdt.c +++ b/drivers/of/fdt.c @@ -486,7 +486,7 @@ void *of_flatten_dtb(struct device_node *node) if (ret) goto out_free; - memreserve = of_find_node_by_name(node, "memreserve"); + memreserve = of_find_node_by_name_address(node, "memreserve"); if (memreserve) { const void *entries = of_get_property(memreserve, "reg", &len); diff --git a/drivers/of/platform.c b/drivers/of/platform.c index 9b487cbb0c..7f377b8b37 100644 --- a/drivers/of/platform.c +++ b/drivers/of/platform.c @@ -202,7 +202,7 @@ struct device_d *of_device_enable_and_register_by_name(const char *name) { struct device_node *node; - node = of_find_node_by_name(NULL, name); + node = of_find_node_by_name_address(NULL, name); if (!node) node = of_find_node_by_path(name); @@ -457,6 +457,9 @@ int of_device_ensure_probed_by_alias(const char *alias) { struct device_node *dev_node; + if (!deep_probe_is_supported()) + return 0; + dev_node = of_find_node_by_alias(NULL, alias); if (!dev_node) return -EINVAL; @@ -482,6 +485,9 @@ int of_devices_ensure_probed_by_dev_id(const struct of_device_id *ids) struct device_node *np; int err, ret = 0; + if (!deep_probe_is_supported()) + return 0; + for_each_matching_node(np, ids) { if (!of_device_is_available(np)) continue; @@ -510,19 +516,39 @@ EXPORT_SYMBOL_GPL(of_devices_ensure_probed_by_dev_id); int of_devices_ensure_probed_by_property(const char *property_name) { struct device_node *node; + int err, ret = 0; - for_each_node_with_property(node, property_name) { - int ret; + if (!deep_probe_is_supported()) + return 0; + for_each_node_with_property(node, property_name) { ret = of_device_ensure_probed(node); - if (ret) - return ret; + if (err) + ret = err; } return 0; } EXPORT_SYMBOL_GPL(of_devices_ensure_probed_by_property); +int of_devices_ensure_probed_by_name(const char *name) +{ + struct device_node *node; + int err, ret = 0; + + if (!deep_probe_is_supported()) + return 0; + + for_each_node_by_name(node, name) { + ret = of_device_ensure_probed(node); + if (err) + ret = err; + } + + return 0; +} +EXPORT_SYMBOL_GPL(of_devices_ensure_probed_by_name); + static int of_stdoutpath_init(void) { struct device_node *np; @@ -539,3 +565,11 @@ static int of_stdoutpath_init(void) return of_device_ensure_probed(np); } postconsole_initcall(of_stdoutpath_init); + +static int of_timer_init(void) +{ + of_devices_ensure_probed_by_name("timer"); + + return 0; +} +postcore_initcall(of_timer_init); diff --git a/drivers/of/resolver.c b/drivers/of/resolver.c index 242775099e..2457ae96a4 100644 --- a/drivers/of/resolver.c +++ b/drivers/of/resolver.c @@ -214,7 +214,7 @@ struct device_node *of_resolve_phandles(struct device_node *root, * to a phandle defined in the overlay. We must update the references, * because we just adjusted the definitions. */ - local_fixups = of_find_node_by_name(result, "__local_fixups__"); + local_fixups = of_find_node_by_name_address(result, "__local_fixups__"); err = adjust_local_phandle_references(local_fixups, result, delta); if (err) { pr_err("failed to fix phandles in overlay\n"); @@ -227,7 +227,7 @@ struct device_node *of_resolve_phandles(struct device_node *root, * the base device tree. We must update the references, because they * are otherwise undefined. */ - overlay_fixups = of_find_node_by_name(result, "__fixups__"); + overlay_fixups = of_find_node_by_name_address(result, "__fixups__"); if (!overlay_fixups) { pr_debug("overlay does not contain phandles to base devicetree\n"); goto out; |