
From: Thierry Reding treding@nvidia.com
This function can be used to read a binary property into a buffer. One example where this is needed is to read a MAC address from device tree.
Signed-off-by: Thierry Reding treding@nvidia.com --- drivers/core/of_access.c | 21 +++++++++++++++++++++ drivers/core/ofnode.c | 13 +++++++++++++ drivers/core/read.c | 6 ++++++ include/dm/of_access.h | 15 +++++++++++++++ include/dm/ofnode.h | 11 +++++++++++ include/dm/read.h | 17 +++++++++++++++++ 6 files changed, 83 insertions(+)
diff --git a/drivers/core/of_access.c b/drivers/core/of_access.c index 945b81448cce..d110d171a3ea 100644 --- a/drivers/core/of_access.c +++ b/drivers/core/of_access.c @@ -446,6 +446,27 @@ static void *of_find_property_value_of_size(const struct device_node *np, return prop->value; }
+int of_read_bytes(const struct device_node *np, const char *propname, + u8 *buffer, int size) +{ + const fdt32_t *value; + + debug("%s: %s: ", __func__, propname); + + if (!np) + return -EINVAL; + + value = of_find_property_value_of_size(np, propname, size); + if (IS_ERR(value)) { + debug("(not found)\n"); + return PTR_ERR(value); + } + + memcpy(buffer, value, size); + + return 0; +} + int of_read_u32(const struct device_node *np, const char *propname, u32 *outp) { const __be32 *val; diff --git a/drivers/core/ofnode.c b/drivers/core/ofnode.c index 785f5c3acf7a..21b24e5aa00e 100644 --- a/drivers/core/ofnode.c +++ b/drivers/core/ofnode.c @@ -15,6 +15,19 @@ #include <linux/err.h> #include <linux/ioport.h>
+int ofnode_read_bytes(ofnode node, const char *propname, u8 *buffer, int size) +{ + assert(ofnode_valid(node)); + debug("%s: %s: ", __func__, propname); + + if (ofnode_is_np(node)) + return of_read_bytes(ofnode_to_np(node), propname, buffer, + size); + + return fdtdec_get_byte_array(gd->fdt_blob, ofnode_to_offset(node), + propname, buffer, size); +} + int ofnode_read_u32(ofnode node, const char *propname, u32 *outp) { assert(ofnode_valid(node)); diff --git a/drivers/core/read.c b/drivers/core/read.c index 6bda077a34b9..9919ec19d4d8 100644 --- a/drivers/core/read.c +++ b/drivers/core/read.c @@ -11,6 +11,12 @@ #include <mapmem.h> #include <dm/of_access.h>
+int dev_read_bytes(struct udevice *dev, const char *propname, u8 *buffer, + int size) +{ + return ofnode_read_bytes(dev_ofnode(dev), propname, buffer, size); +} + int dev_read_u32(struct udevice *dev, const char *propname, u32 *outp) { return ofnode_read_u32(dev_ofnode(dev), propname, outp); diff --git a/include/dm/of_access.h b/include/dm/of_access.h index 13fedb7cf5e6..fc6a86959b23 100644 --- a/include/dm/of_access.h +++ b/include/dm/of_access.h @@ -218,6 +218,21 @@ struct device_node *of_find_node_by_prop_value(struct device_node *from, */ struct device_node *of_find_node_by_phandle(phandle handle);
+/** + * of_read_bytes() - Find and read an array of bytes from a property + * + * Search for a property in a device node and read an array of bytes from it. + * + * @np: device node from which the property is to be read + * @propname: name of the property to be read + * @buffer: buffer to read the property value into + * @size: number of bytes to read + * + * @return 0 on success, or a negative error-code on failure. + */ +int of_read_bytes(const struct device_node *np, const char *propname, + u8 *buffer, int size); + /** * of_read_u32() - Find and read a 32-bit integer from a property * diff --git a/include/dm/ofnode.h b/include/dm/ofnode.h index d206ee2caab7..5158296dfd96 100644 --- a/include/dm/ofnode.h +++ b/include/dm/ofnode.h @@ -192,6 +192,17 @@ static inline ofnode ofnode_null(void) return node; }
+/** + * ofnode_read_bytes() - Read an array of bytes from a property + * + * @node: valid node reference to read property from + * @propname: name of the property to read from + * @buffer: buffer to read the value into + * @size: size of @buffer + * @return 0 on success, or a negative error code on failure + */ +int ofnode_read_bytes(ofnode node, const char *propname, u8 *buffer, int size); + /** * ofnode_read_u32() - Read a 32-bit integer from a property * diff --git a/include/dm/read.h b/include/dm/read.h index 60b727cbd821..cb9776b39721 100644 --- a/include/dm/read.h +++ b/include/dm/read.h @@ -44,6 +44,18 @@ static inline bool dev_of_valid(struct udevice *dev) }
#ifndef CONFIG_DM_DEV_READ_INLINE +/** + * dev_read_bytes() - read an array of bytes from a device's DT property + * + * @dev: device to read DT property from + * @propname: name of the property to read from + * @buffer: buffer to read the value into + * @size: size of @buffer + * @return 0 on success, or a negative error code on failure + */ +int dev_read_bytes(struct udevice *dev, const char *propname, u8 *buffer, + int size); + /** * dev_read_u32() - read a 32-bit integer from a device's DT property * @@ -522,6 +534,11 @@ u64 dev_translate_address(struct udevice *dev, const fdt32_t *in_addr); int dev_read_alias_highest_id(const char *stem);
#else /* CONFIG_DM_DEV_READ_INLINE is enabled */ +static inline int dev_read_bytes(struct udevice *dev, const char *propname, + u8 *buffer, int size) +{ + return ofnode_read_bytes(dev_ofnode(dev), propname, buffer, size); +}
static inline int dev_read_u32(struct udevice *dev, const char *propname, u32 *outp)