After changes introduced to dev_get_addr() by: commit: dm: core: Enable optional use of fdt_translate_address()
the mentioned function is not allowed to parse the 'reg' property of child node for which the '#size-cells == 0'. To fill the gap, this commit introduces new core function dev_get_reg(), which makes it possible to get the 'reg' property's value for that use case. Signed-off-by: Przemyslaw Marczak <p.marc...@samsung.com> Cc: Masahiro Yamada <yamada.masah...@socionext.com> Cc: Simon Glass <s...@chromium.org> Cc: Marek Vasut <ma...@denx.de> Cc: Stefan Roese <s...@denx.de> --- drivers/core/device.c | 17 +++++++++++++---- include/dm/device.h | 23 +++++++++++++++++++++++ 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/drivers/core/device.c b/drivers/core/device.c index 758f390..1131175 100644 --- a/drivers/core/device.c +++ b/drivers/core/device.c @@ -581,6 +581,18 @@ const char *dev_get_uclass_name(struct udevice *dev) return dev->uclass->uc_drv->name; } +fdt_addr_t dev_get_reg(struct udevice *dev) +{ +#if CONFIG_IS_ENABLED(OF_CONTROL) + return fdtdec_get_addr_size_auto_parent(gd->fdt_blob, + dev->parent->of_offset, + dev->of_offset, "reg", + 0, NULL); +#else + return FDT_ADDR_T_NONE; +#endif +} + fdt_addr_t dev_get_addr(struct udevice *dev) { #if CONFIG_IS_ENABLED(OF_CONTROL) @@ -601,14 +613,11 @@ fdt_addr_t dev_get_addr(struct udevice *dev) dev->of_offset, reg); } + addr = dev_get_reg(dev); /* * Use the "simple" translate function for less complex * bus setups. */ - addr = fdtdec_get_addr_size_auto_parent(gd->fdt_blob, - dev->parent->of_offset, - dev->of_offset, "reg", - 0, NULL); if (CONFIG_IS_ENABLED(SIMPLE_BUS) && addr != FDT_ADDR_T_NONE) { if (device_get_uclass_id(dev->parent) == UCLASS_SIMPLE_BUS) addr = simple_bus_translate(dev->parent, addr); diff --git a/include/dm/device.h b/include/dm/device.h index 7fb9935..08bcb02 100644 --- a/include/dm/device.h +++ b/include/dm/device.h @@ -445,8 +445,31 @@ int device_find_first_child(struct udevice *parent, struct udevice **devp); int device_find_next_child(struct udevice **devp); /** + * dev_get_reg() - Get the reg property of a device + * + * This returns the address without bus/child address space translation. + * + * @dev: Pointer to a device + * + * @return addr + */ +fdt_addr_t dev_get_reg(struct udevice *dev); + +/** * dev_get_addr() - Get the reg property of a device * + * The returned address value depends on a config options: + * Case 1: CONFIG_OF_TRANSLATE=y (default) + * Result: Make bus/child address space translation, that dependents on "ranges" + * property. + * + * Case 2: CONFIG_OF_TRANSLATE is not set + * Result: Decode only device node's 'reg' property, without translation. + * + * Case 3: CONFIG_OF_TRANSLATE is not set; CONFIG_SIMPLE_BUS=y + * Result: When 'dev->parent' is a simple bus - then do the same as in case 1, + * otherwise do the same as in case 2. + * * @dev: Pointer to a device * * @return addr -- 1.9.1 _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot