diff options
author | Ahmad Fatoum <a.fatoum@pengutronix.de> | 2022-08-18 07:19:51 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2022-09-01 10:44:09 +0200 |
commit | 29fe3748483d9608ad9f0dba77c6b0e715114cc6 (patch) | |
tree | b5d91915975f2dfc12fdc5782d0c68cc6834d727 /drivers | |
parent | eb86034040c255cc35b8493d47beec5cc3cb10c5 (diff) | |
download | barebox-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.c | 33 |
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); |