diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2018-11-09 10:55:05 +0100 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2018-11-09 10:55:05 +0100 |
commit | 227426f16163d3721fee82650980aae0eef01375 (patch) | |
tree | a64101906c15b814ec942468e88875ce8160e45d /drivers/of | |
parent | c024f90f5dd5604d3f82dbbc055fd88a69d59187 (diff) | |
parent | ac7324a0ed12a67fc836b383388f2562d32e55ed (diff) | |
download | barebox-227426f16163d3721fee82650980aae0eef01375.tar.gz barebox-227426f16163d3721fee82650980aae0eef01375.tar.xz |
Merge branch 'for-next/net-switch-mv88e6xxx'
Diffstat (limited to 'drivers/of')
-rw-r--r-- | drivers/of/address.c | 4 | ||||
-rw-r--r-- | drivers/of/platform.c | 80 |
2 files changed, 24 insertions, 60 deletions
diff --git a/drivers/of/address.c b/drivers/of/address.c index 14db080417..4e12522a0a 100644 --- a/drivers/of/address.c +++ b/drivers/of/address.c @@ -379,8 +379,8 @@ static u64 __of_translate_address(struct device_node *dev, /* Count address cells & copy address locally */ bus->count_cells(dev, &na, &ns); if (!OF_CHECK_COUNTS(na, ns)) { - printk(KERN_ERR "prom_parse: Bad cell count for %s\n", - dev->full_name); + pr_debug("prom_parse: Bad cell count for %s\n", + dev->full_name); return OF_BAD_ADDR; } memcpy(addr, in_addr, na * 4); diff --git a/drivers/of/platform.c b/drivers/of/platform.c index c9157cdd74..17052f4199 100644 --- a/drivers/of/platform.c +++ b/drivers/of/platform.c @@ -43,71 +43,35 @@ EXPORT_SYMBOL(of_find_device_by_node); * of_device_make_bus_id - Use the device node data to assign a unique name * @dev: pointer to device structure that is linked to a device tree node * - * This routine will first try using either the dcr-reg or the reg property - * value to derive a unique name. As a last resort it will use the node - * name followed by a unique number. + * This routine will first try using the translated bus address to + * derive a unique name. If it cannot, then it will prepend names from + * parent nodes until a unique name can be derived. */ static void of_device_make_bus_id(struct device_d *dev) { - static int bus_no_reg_magic; - struct device_node *np = dev->device_node; - const __be32 *reg, *addrp; + struct device_node *node = dev->device_node; + const __be32 *reg; u64 addr; - char *name, *at; - - name = xstrdup(np->name); - at = strchr(name, '@'); - if (at) - *at = '\0'; - -#ifdef CONFIG_PPC_DCR - /* - * If it's a DCR based device, use 'd' for native DCRs - * and 'D' for MMIO DCRs. - */ - reg = of_get_property(np, "dcr-reg", NULL); - if (reg) { -#ifdef CONFIG_PPC_DCR_NATIVE - snprintf(dev->name, MAX_DRIVER_NAME, "d%x.%s", *reg, name); -#else /* CONFIG_PPC_DCR_NATIVE */ - u64 addr = of_translate_dcr_address(np, *reg, NULL); - if (addr != OF_BAD_ADDR) { - snprintf(dev->name, MAX_DRIVER_NAME, "D%llx.%s", - (unsigned long long)addr, name); - free(name); - return; - } -#endif /* !CONFIG_PPC_DCR_NATIVE */ - } -#endif /* CONFIG_PPC_DCR */ - - /* - * For MMIO, get the physical address - */ - reg = of_get_property(np, "reg", NULL); - if (reg) { - if (of_can_translate_address(np)) { - addr = of_translate_address(np, reg); - } else { - addrp = of_get_address(np, 0, NULL, NULL); - if (addrp) - addr = of_read_number(addrp, 1); - else - addr = OF_BAD_ADDR; - } - if (addr != OF_BAD_ADDR) { - snprintf(dev->name, MAX_DRIVER_NAME, "%llx.%s", - (unsigned long long)addr, name); - free(name); + + /* Construct the name, using parent nodes if necessary to ensure uniqueness */ + while (node->parent) { + /* + * If the address can be translated, then that is as much + * uniqueness as we need. Make it the first component and return + */ + reg = of_get_property(node, "reg", NULL); + if (reg && (addr = of_translate_address(node, reg)) != OF_BAD_ADDR) { + dev_set_name(dev, dev->name ? "%llx.%s:%s" : "%llx.%s", + (unsigned long long)addr, node->name, + dev->name); return; } - } - /* - * No BusID, use the node name and add a globally incremented counter - */ - snprintf(dev->name, MAX_DRIVER_NAME, "%s.%d", name, bus_no_reg_magic++); - free(name); + /* format arguments only used if dev_name() resolves to NULL */ + dev_set_name(dev, dev->name ? "%s:%s" : "%s", + kbasename(node->full_name), dev->name); + node = node->parent; + } } /** |