summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorAhmad Fatoum <a.fatoum@pengutronix.de>2022-08-18 07:19:51 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2022-09-01 10:44:09 +0200
commit29fe3748483d9608ad9f0dba77c6b0e715114cc6 (patch)
treeb5d91915975f2dfc12fdc5782d0c68cc6834d727 /drivers
parenteb86034040c255cc35b8493d47beec5cc3cb10c5 (diff)
downloadbarebox-29fe3748483d9608ad9f0dba77c6b0e715114cc6.tar.gz
barebox-29fe3748483d9608ad9f0dba77c6b0e715114cc6.tar.xz
nvmem: import Linux nvmem_cell_read_variable_le_u32
We already have nvmem_cell_get_and_read(), so add its Linux sibling nvmem_cell_read_variable_le_u32 as well, which additionally takes care of conversion to little-endian. Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de> Link: https://lore.barebox.org/20220818051955.2088238-7-a.fatoum@pengutronix.de Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/nvmem/core.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/drivers/nvmem/core.c b/drivers/nvmem/core.c
index fed387c43a..c5fe5f6b76 100644
--- a/drivers/nvmem/core.c
+++ b/drivers/nvmem/core.c
@@ -803,3 +803,36 @@ void *nvmem_cell_get_and_read(struct device_node *np, const char *cell_name,
return value;
}
EXPORT_SYMBOL_GPL(nvmem_cell_get_and_read);
+
+/**
+ * nvmem_cell_read_variable_le_u32() - Read up to 32-bits of data as a little endian number.
+ *
+ * @dev: Device that requests the nvmem cell.
+ * @cell_id: Name of nvmem cell to read.
+ * @val: pointer to output value.
+ *
+ * Return: 0 on success or negative errno.
+ */
+int nvmem_cell_read_variable_le_u32(struct device_d *dev, const char *cell_id,
+ u32 *val)
+{
+ size_t len;
+ const u8 *buf;
+ int i;
+
+ len = sizeof(*val);
+
+ buf = nvmem_cell_get_and_read(dev->device_node, cell_id, len);
+ if (IS_ERR(buf))
+ return PTR_ERR(buf);
+
+ /* Copy w/ implicit endian conversion */
+ *val = 0;
+ for (i = 0; i < len; i++)
+ *val |= buf[i] << (8 * i);
+
+ kfree(buf);
+
+ return 0;
+}
+EXPORT_SYMBOL_GPL(nvmem_cell_read_variable_le_u32);