RE: [PATCH 3/6] nvmem: core: add nvmem cell post processing callback
From: Joakim Zhang <hidden>
Date: 2021-09-23 02:52:13
Also in:
lkml
Hi Ahmad,
-----Original Message----- From: Ahmad Fatoum <a.fatoum@pengutronix.de> Sent: 2021年9月22日 19:37 To: Joakim Zhang <redacted>; srinivas.kandagatla@linaro.org; robh+dt@kernel.org; shawnguo@kernel.org Cc: devicetree@vger.kernel.org; dl-linux-imx <redacted>; kernel@pengutronix.de; linux-kernel@vger.kernel.org Subject: Re: [PATCH 3/6] nvmem: core: add nvmem cell post processing callback On 08.09.21 12:02, Joakim Zhang wrote:quoted
From: Srinivas Kandagatla <redacted> Some NVMEM providers have certain nvmem cells encoded, which requires post processing before actually using it. For example mac-address is stored in either in ascii or delimited orreverse-order.quoted
Having a post-process callback hook to provider drivers would enable them to do this vendor specific post processing before nvmem consumers seeit.quoted
Signed-off-by: Srinivas Kandagatla <redacted> Signed-off-by: Joakim Zhang <redacted> --- drivers/nvmem/core.c | 9 +++++++++ include/linux/nvmem-provider.h | 5 +++++ 2 files changed, 14 insertions(+)diff --git a/drivers/nvmem/core.c b/drivers/nvmem/core.c index23c08dbaf45e..4f81a3adf081 100644--- a/drivers/nvmem/core.c +++ b/drivers/nvmem/core.c@@ -38,6 +38,7 @@ struct nvmem_device { unsigned int nkeepout; nvmem_reg_read_t reg_read; nvmem_reg_write_t reg_write; + nvmem_cell_post_process_t cell_post_process; struct gpio_desc *wp_gpio; void *priv; };@@ -797,6 +798,7 @@ struct nvmem_device *nvmem_register(const structnvmem_config *config)quoted
nvmem->type = config->type; nvmem->reg_read = config->reg_read; nvmem->reg_write = config->reg_write; + nvmem->cell_post_process = config->cell_post_process; nvmem->keepout = config->keepout; nvmem->nkeepout = config->nkeepout; if (config->of_node)@@ -1404,6 +1406,13 @@ static int __nvmem_cell_read(structnvmem_device *nvmem,quoted
if (cell->bit_offset || cell->nbits) nvmem_shift_read_buffer_in_place(cell, buf); + if (nvmem->cell_post_process) { + rc = nvmem->cell_post_process(nvmem->priv, cell->type, + cell->offset, buf, cell->bytes); + if (rc) + return rc; + } + if (len) *len = cell->bytes;diff --git a/include/linux/nvmem-provider.hb/include/linux/nvmem-provider.h index 104505e9028f..d980c79f9605 100644--- a/include/linux/nvmem-provider.h +++ b/include/linux/nvmem-provider.h@@ -19,6 +19,9 @@ typedef int (*nvmem_reg_read_t)(void *priv, unsignedint offset,quoted
void *val, size_t bytes); typedef int (*nvmem_reg_write_t)(void *priv, unsigned int offset, void *val, size_t bytes); +/* used for vendor specific post processing of cell data */ typedef +int (*nvmem_cell_post_process_t)(void *priv, int type, unsigned int offset, + void *buf, size_t bytes); enum nvmem_type { NVMEM_TYPE_UNKNOWN = 0,@@ -62,6 +65,7 @@ struct nvmem_keepout { * @no_of_node: Device should not use the parent's of_node even ifit's !NULL.quoted
* @reg_read: Callback to read data. * @reg_write: Callback to write data. + * @cell_read_callback: Callback for vendor specific post processing + of cell dataThe member below is called cell_post_process
Good caught! Will fix it in V2. Thanks. Best Regards, Joakim Zhang
quoted
* @size: Device size. * @word_size: Minimum read/write access granularity. * @stride: Minimum read/write access stride.@@ -92,6 +96,7 @@ struct nvmem_config { bool no_of_node; nvmem_reg_read_t reg_read; nvmem_reg_write_t reg_write; + nvmem_cell_post_process_t cell_post_process; int size; int word_size; int stride;-- Pengutronix e.K. | | Steuerwalder Str. 21 | https://eur01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fwww.pe ngutronix.de%2F&data=04%7C01%7Cqiangqing.zhang%40nxp.com%7C85 4dcad461914aa4227e08d97dbd56f0%7C686ea1d3bc2b4c6fa92cd99c5c301635 %7C0%7C0%7C637679074424671648%7CUnknown%7CTWFpbGZsb3d8eyJWIj oiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C10 00&sdata=nYxnuFbFB9PhGfEUPiwg7dJOR2hQHV5NbjfT1NyKWBM%3D&a mp;reserved=0 | 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |