
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.marczak@samsung.com Cc: Masahiro Yamada yamada.masahiro@socionext.com Cc: Simon Glass sjg@chromium.org Cc: Marek Vasut marex@denx.de Cc: Stefan Roese sr@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