On 15/05/19 7:45 PM, Sekhar Nori wrote: > Current dev_read_*() API lacks support to get address and size > of a "reg" property by name or index. Add support for the same. > > Livetree support has been added but not tested. > > Signed-off-by: Sekhar Nori <nsek...@ti.com>
Can you add some test cases under test/dm/test-fdt.c Other than that: Reviewed-by: Lokesh Vutla <lokeshvu...@ti.com> Thanks and regards, Lokesh > --- > drivers/core/fdtaddr.c | 17 +++++++++++++++++ > drivers/core/read.c | 20 ++++++++++++++++++++ > include/dm/fdtaddr.h | 18 ++++++++++++++++++ > include/dm/read.h | 41 +++++++++++++++++++++++++++++++++++++++++ > 4 files changed, 96 insertions(+) > > diff --git a/drivers/core/fdtaddr.c b/drivers/core/fdtaddr.c > index c2873861dacd..6850003a287b 100644 > --- a/drivers/core/fdtaddr.c > +++ b/drivers/core/fdtaddr.c > @@ -129,6 +129,23 @@ fdt_addr_t devfdt_get_addr_name(struct udevice *dev, > const char *name) > #endif > } > > +fdt_addr_t devfdt_get_addr_size_name(struct udevice *dev, const char *name, > + fdt_size_t *size) > +{ > +#if CONFIG_IS_ENABLED(OF_CONTROL) > + int index; > + > + index = fdt_stringlist_search(gd->fdt_blob, dev_of_offset(dev), > + "reg-names", name); > + if (index < 0) > + return index; > + > + return devfdt_get_addr_size_index(dev, index, size); > +#else > + return FDT_ADDR_T_NONE; > +#endif > +} > + > fdt_addr_t devfdt_get_addr(struct udevice *dev) > { > return devfdt_get_addr_index(dev, 0); > diff --git a/drivers/core/read.c b/drivers/core/read.c > index 6bda077a34b9..7c6944eeea84 100644 > --- a/drivers/core/read.c > +++ b/drivers/core/read.c > @@ -82,6 +82,15 @@ fdt_addr_t dev_read_addr_index(struct udevice *dev, int > index) > return devfdt_get_addr_index(dev, index); > } > > +fdt_addr_t dev_read_addr_size_index(struct udevice *dev, int index, > + fdt_size_t *size) > +{ > + if (ofnode_is_np(dev_ofnode(dev))) > + return ofnode_get_add_size_index(dev_ofnode(dev), index, size); > + else > + return devfdt_get_addr_size_index(dev, index, size); > +} > + > void *dev_remap_addr_index(struct udevice *dev, int index) > { > fdt_addr_t addr = dev_read_addr_index(dev, index); > @@ -102,6 +111,17 @@ fdt_addr_t dev_read_addr_name(struct udevice *dev, const > char *name) > return dev_read_addr_index(dev, index); > } > > +fdt_addr_t dev_read_addr_size_name(struct udevice *dev, const char *name, > + fdt_size_t *size) > +{ > + int index = dev_read_stringlist_search(dev, "reg-names", name); > + > + if (index < 0) > + return FDT_ADDR_T_NONE; > + else > + return dev_read_addr_size_index(dev, index, size); > +} > + > void *dev_remap_addr_name(struct udevice *dev, const char *name) > { > fdt_addr_t addr = dev_read_addr_name(dev, name); > diff --git a/include/dm/fdtaddr.h b/include/dm/fdtaddr.h > index 3bc2599b6cbd..57b326cb3362 100644 > --- a/include/dm/fdtaddr.h > +++ b/include/dm/fdtaddr.h > @@ -120,4 +120,22 @@ fdt_addr_t devfdt_get_addr_size_index(struct udevice > *dev, int index, > */ > fdt_addr_t devfdt_get_addr_name(struct udevice *dev, const char *name); > > +/** > + * devfdt_get_addr_size_name() - Get the reg property and its size for a > device, > + * indexed by name > + * > + * Returns the address and size specified in the 'reg' property of a device. > + * > + * @dev: Pointer to a device > + * @name: the 'reg' property can hold a list of <addr, size> pairs, with the > + * 'reg-names' property providing named-based identification. @index > + * indicates the value to search for in 'reg-names'. > + * @size: Pointer to size variable - this function returns the size > + * specified in the 'reg' property here > + * > + * @return addr > + */ > +fdt_addr_t devfdt_get_addr_size_name(struct udevice *dev, const char *name, > + fdt_size_t *size); > + > #endif > diff --git a/include/dm/read.h b/include/dm/read.h > index 60b727cbd821..5c38fcc922ae 100644 > --- a/include/dm/read.h > +++ b/include/dm/read.h > @@ -144,6 +144,19 @@ int dev_read_size(struct udevice *dev, const char > *propname); > */ > fdt_addr_t dev_read_addr_index(struct udevice *dev, int index); > > +/** > + * dev_read_addr_size_index() - Get the indexed reg property of a device > + * > + * @dev: Device to read from > + * @index: the 'reg' property can hold a list of <addr, size> pairs > + * and @index is used to select which one is required > + * @size: place to put size value (on success) > + * > + * @return address or FDT_ADDR_T_NONE if not found > + */ > +fdt_addr_t dev_read_addr_size_index(struct udevice *dev, int index, > + fdt_size_t *size); > + > /** > * dev_remap_addr_index() - Get the indexed reg property of a device > * as a memory-mapped I/O pointer > @@ -168,6 +181,20 @@ void *dev_remap_addr_index(struct udevice *dev, int > index); > */ > fdt_addr_t dev_read_addr_name(struct udevice *dev, const char* name); > > +/** > + * dev_read_addr_size_name() - Get the reg property of a device, indexed by > name > + * > + * @dev: Device to read from > + * @name: the 'reg' property can hold a list of <addr, size> pairs, with the > + * 'reg-names' property providing named-based identification. @index > + * indicates the value to search for in 'reg-names'. > + * @size: place to put size value (on success) > + * > + * @return address or FDT_ADDR_T_NONE if not found > + */ > +fdt_addr_t dev_read_addr_size_name(struct udevice *dev, const char *name, > + fdt_size_t *size); > + > /** > * dev_remap_addr_name() - Get the reg property of a device, indexed by name, > * as a memory-mapped I/O pointer > @@ -588,12 +615,26 @@ static inline fdt_addr_t dev_read_addr_index(struct > udevice *dev, int index) > return devfdt_get_addr_index(dev, index); > } > > +static inline fdt_addr_t dev_read_addr_size_index(struct udevice *dev, > + int index, > + fdt_size_t *size) > +{ > + return devfdt_get_addr_size_index(dev, index, size); > +} > + > static inline fdt_addr_t dev_read_addr_name(struct udevice *dev, > const char *name) > { > return devfdt_get_addr_name(dev, name); > } > > +static inline fdt_addr_t dev_read_addr_size_name(struct udevice *dev, > + const char *name, > + fdt_size_t *size) > +{ > + return devfdt_get_addr_size_name(dev, name, size); > +} > + > static inline fdt_addr_t dev_read_addr(struct udevice *dev) > { > return devfdt_get_addr(dev); > _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot