diff options
Diffstat (limited to 'drivers/core')
-rw-r--r-- | drivers/core/fdtaddr.c | 17 | ||||
-rw-r--r-- | drivers/core/ofnode.c | 5 | ||||
-rw-r--r-- | drivers/core/root.c | 16 | ||||
-rw-r--r-- | drivers/core/uclass.c | 26 |
4 files changed, 52 insertions, 12 deletions
diff --git a/drivers/core/fdtaddr.c b/drivers/core/fdtaddr.c index 3847dd836e..9a3b4c312a 100644 --- a/drivers/core/fdtaddr.c +++ b/drivers/core/fdtaddr.c @@ -49,12 +49,17 @@ fdt_addr_t devfdt_get_addr_index(struct udevice *dev, int index) reg += index * (na + ns); - /* - * Use the full-fledged translate function for complex - * bus setups. - */ - addr = fdt_translate_address((void *)gd->fdt_blob, - dev_of_offset(dev), reg); + if (ns) { + /* + * Use the full-fledged translate function for complex + * bus setups. + */ + addr = fdt_translate_address((void *)gd->fdt_blob, + dev_of_offset(dev), reg); + } else { + /* Non translatable if #size-cells == 0 */ + addr = fdt_read_number(reg, na); + } } else { /* * Use the "simple" translate function for less complex diff --git a/drivers/core/ofnode.c b/drivers/core/ofnode.c index 4e4532651f..5909a25f85 100644 --- a/drivers/core/ofnode.c +++ b/drivers/core/ofnode.c @@ -227,13 +227,16 @@ fdt_addr_t ofnode_get_addr_index(ofnode node, int index) uint flags; u64 size; int na; + int ns; prop_val = of_get_address(ofnode_to_np(node), index, &size, &flags); if (!prop_val) return FDT_ADDR_T_NONE; - if (IS_ENABLED(CONFIG_OF_TRANSLATE)) { + ns = of_n_size_cells(ofnode_to_np(node)); + + if (IS_ENABLED(CONFIG_OF_TRANSLATE) && ns > 0) { return of_translate_address(ofnode_to_np(node), prop_val); } else { na = of_n_addr_cells(ofnode_to_np(node)); diff --git a/drivers/core/root.c b/drivers/core/root.c index 3a426ab4b7..9000ed55ca 100644 --- a/drivers/core/root.c +++ b/drivers/core/root.c @@ -333,7 +333,8 @@ static int dm_scan_fdt_node(struct udevice *parent, const void *blob, int dm_extended_scan_fdt(const void *blob, bool pre_reloc_only) { - int node, ret; + int ret; + ofnode node; ret = dm_scan_fdt(gd->fdt_blob, pre_reloc_only); if (ret) { @@ -342,13 +343,18 @@ int dm_extended_scan_fdt(const void *blob, bool pre_reloc_only) } /* bind fixed-clock */ - node = ofnode_to_offset(ofnode_path("/clocks")); + node = ofnode_path("/clocks"); /* if no DT "clocks" node, no need to go further */ - if (node < 0) + if (!ofnode_valid(node)) return ret; - ret = dm_scan_fdt_node(gd->dm_root, gd->fdt_blob, node, - pre_reloc_only); +#if CONFIG_IS_ENABLED(OF_LIVE) + if (of_live_active()) + ret = dm_scan_fdt_live(gd->dm_root, node.np, pre_reloc_only); + else +#endif + ret = dm_scan_fdt_node(gd->dm_root, gd->fdt_blob, node.of_offset, + pre_reloc_only); if (ret) debug("dm_scan_fdt_node() failed: %d\n", ret); diff --git a/drivers/core/uclass.c b/drivers/core/uclass.c index 1aedaa08f0..628e2e13ff 100644 --- a/drivers/core/uclass.c +++ b/drivers/core/uclass.c @@ -457,6 +457,32 @@ int uclass_get_device_by_ofnode(enum uclass_id id, ofnode node, } #if CONFIG_IS_ENABLED(OF_CONTROL) +int uclass_get_device_by_phandle_id(enum uclass_id id, uint phandle_id, + struct udevice **devp) +{ + struct udevice *dev; + struct uclass *uc; + int ret; + + *devp = NULL; + ret = uclass_get(id, &uc); + if (ret) + return ret; + + list_for_each_entry(dev, &uc->dev_head, uclass_node) { + uint phandle; + + phandle = dev_read_phandle(dev); + + if (phandle == phandle_id) { + *devp = dev; + return uclass_get_device_tail(dev, ret, devp); + } + } + + return -ENODEV; +} + int uclass_get_device_by_phandle(enum uclass_id id, struct udevice *parent, const char *name, struct udevice **devp) { |