From: Matthias Schiffer Date: Wed, 27 Sep 2023 13:33:32 +0000 (+0200) Subject: core: introduce dev_read_addr_name[_size]_ptr() functions X-Git-Url: http://git.dujemihanovic.xyz/img/static/gitweb.css?a=commitdiff_plain;h=bc8fa1cbfd429138ebd894a170ce36b07f86b150;p=u-boot.git core: introduce dev_read_addr_name[_size]_ptr() functions Same as dev_read_addr_name[_size](), but returns a pointer, cast through map_sysmem(). Signed-off-by: Matthias Schiffer Reviewed-by: Simon Glass --- diff --git a/drivers/core/fdtaddr.c b/drivers/core/fdtaddr.c index 0f4eff6707..8e774d49ce 100644 --- a/drivers/core/fdtaddr.c +++ b/drivers/core/fdtaddr.c @@ -153,6 +153,16 @@ fdt_addr_t devfdt_get_addr_name(const struct udevice *dev, const char *name) #endif } +void *devfdt_get_addr_name_ptr(const struct udevice *dev, const char *name) +{ + fdt_addr_t addr = devfdt_get_addr_name(dev, name); + + if (addr == FDT_ADDR_T_NONE) + return NULL; + + return map_sysmem(addr, 0); +} + fdt_addr_t devfdt_get_addr_size_name(const struct udevice *dev, const char *name, fdt_size_t *size) { @@ -170,6 +180,17 @@ fdt_addr_t devfdt_get_addr_size_name(const struct udevice *dev, #endif } +void *devfdt_get_addr_size_name_ptr(const struct udevice *dev, + const char *name, fdt_size_t *size) +{ + fdt_addr_t addr = devfdt_get_addr_size_name(dev, name, size); + + if (addr == FDT_ADDR_T_NONE) + return NULL; + + return map_sysmem(addr, 0); +} + fdt_addr_t devfdt_get_addr(const struct udevice *dev) { return devfdt_get_addr_index(dev, 0); diff --git a/drivers/core/read.c b/drivers/core/read.c index 419013451f..1a4a95cdde 100644 --- a/drivers/core/read.c +++ b/drivers/core/read.c @@ -181,6 +181,16 @@ fdt_addr_t dev_read_addr_name(const struct udevice *dev, const char *name) return dev_read_addr_index(dev, index); } +void *dev_read_addr_name_ptr(const struct udevice *dev, const char *name) +{ + fdt_addr_t addr = dev_read_addr_name(dev, name); + + if (addr == FDT_ADDR_T_NONE) + return NULL; + + return map_sysmem(addr, 0); +} + fdt_addr_t dev_read_addr_size_name(const struct udevice *dev, const char *name, fdt_size_t *size) { @@ -192,6 +202,17 @@ fdt_addr_t dev_read_addr_size_name(const struct udevice *dev, const char *name, return dev_read_addr_size_index(dev, index, size); } +void *dev_read_addr_size_name_ptr(const struct udevice *dev, const char *name, + fdt_size_t *size) +{ + fdt_addr_t addr = dev_read_addr_size_name(dev, name, size); + + if (addr == FDT_ADDR_T_NONE) + return NULL; + + return map_sysmem(addr, 0); +} + void *dev_remap_addr_name(const 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 c577d4369c..bf8132deb8 100644 --- a/include/dm/fdtaddr.h +++ b/include/dm/fdtaddr.h @@ -146,6 +146,19 @@ void *devfdt_get_addr_size_index_ptr(const struct udevice *dev, int index, */ fdt_addr_t devfdt_get_addr_name(const struct udevice *dev, const char *name); +/** + * devfdt_get_addr_name_ptr() - Get the reg property of a device as a pointer, + * indexed by name + * + * @dev: Pointer to a device + * @name: the 'reg' property can hold a list of pairs, with the + * 'reg-names' property providing named-based identification. @name + * indicates the value to search for in 'reg-names'. + * + * Return: Pointer to addr, or NULL if there is no such property + */ +void *devfdt_get_addr_name_ptr(const struct udevice *dev, const char *name); + /** * devfdt_get_addr_size_name() - Get the reg property and its size for a device, * indexed by name @@ -164,6 +177,24 @@ fdt_addr_t devfdt_get_addr_name(const struct udevice *dev, const char *name); fdt_addr_t devfdt_get_addr_size_name(const struct udevice *dev, const char *name, fdt_size_t *size); +/** + * devfdt_get_addr_size_name_ptr() - Get the reg property for a device as a + * pointer, 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 pairs, with the + * 'reg-names' property providing named-based identification. @name + * 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: Pointer to addr, or NULL if there is no such property + */ +void *devfdt_get_addr_size_name_ptr(const struct udevice *dev, + const char *name, fdt_size_t *size); + /** * devfdt_get_addr_pci() - Read an address and handle PCI address translation * diff --git a/include/dm/read.h b/include/dm/read.h index 517795cc20..894bc698bb 100644 --- a/include/dm/read.h +++ b/include/dm/read.h @@ -284,6 +284,19 @@ void *dev_remap_addr_index(const struct udevice *dev, int index); */ fdt_addr_t dev_read_addr_name(const struct udevice *dev, const char *name); +/** + * dev_read_addr_name_ptr() - Get the reg property of a device as a pointer, + * indexed by name + * + * @dev: Device to read from + * @name: the 'reg' property can hold a list of pairs, with the + * 'reg-names' property providing named-based identification. @name + * indicates the value to search for in 'reg-names'. + * + * Return: pointer or NULL if not found + */ +void *dev_read_addr_name_ptr(const struct udevice *dev, const char *name); + /** * dev_read_addr_size_name() - Get the reg property of a device, indexed by name * @@ -298,6 +311,21 @@ fdt_addr_t dev_read_addr_name(const struct udevice *dev, const char *name); fdt_addr_t dev_read_addr_size_name(const struct udevice *dev, const char *name, fdt_size_t *size); +/** + * dev_read_addr_size_name_ptr() - Get the reg property of a device as a pointer, + * indexed by name + * + * @dev: Device to read from + * @name: the 'reg' property can hold a list of pairs, with the + * 'reg-names' property providing named-based identification. @name + * indicates the value to search for in 'reg-names'. + * @size: place to put size value (on success) + * + * Return: pointer or NULL if not found + */ +void *dev_read_addr_size_name_ptr(const 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 @@ -980,6 +1008,12 @@ static inline fdt_addr_t dev_read_addr_name(const struct udevice *dev, return devfdt_get_addr_name(dev, name); } +static inline void *dev_read_addr_name_ptr(const struct udevice *dev, + const char *name) +{ + return devfdt_get_addr_name_ptr(dev, name); +} + static inline fdt_addr_t dev_read_addr_size_name(const struct udevice *dev, const char *name, fdt_size_t *size) @@ -987,6 +1021,13 @@ static inline fdt_addr_t dev_read_addr_size_name(const struct udevice *dev, return devfdt_get_addr_size_name(dev, name, size); } +static inline void *dev_read_addr_size_name_ptr(const struct udevice *dev, + const char *name, + fdt_size_t *size) +{ + return devfdt_get_addr_size_name_ptr(dev, name, size); +} + static inline fdt_addr_t dev_read_addr(const struct udevice *dev) { return devfdt_get_addr(dev);