kernel: backport NVMEM patches queued for the v6.4
[openwrt/openwrt.git] / target / linux / generic / backport-5.10 / 814-v6.4-0007-nvmem-imx-ocotp-replace-global-post-processing-with-.patch
diff --git a/target/linux/generic/backport-5.10/814-v6.4-0007-nvmem-imx-ocotp-replace-global-post-processing-with-.patch b/target/linux/generic/backport-5.10/814-v6.4-0007-nvmem-imx-ocotp-replace-global-post-processing-with-.patch
new file mode 100644 (file)
index 0000000..2a5fa61
--- /dev/null
@@ -0,0 +1,81 @@
+From 6c56a82d7895a213a43182a5d01a21a906a79847 Mon Sep 17 00:00:00 2001
+From: Michael Walle <michael@walle.cc>
+Date: Tue, 4 Apr 2023 18:21:26 +0100
+Subject: [PATCH] nvmem: imx-ocotp: replace global post processing with layouts
+
+In preparation of retiring the global post processing hook change this
+driver to use layouts. The layout will be supplied during registration
+and will be used to add the post processing hook to all added cells.
+
+Signed-off-by: Michael Walle <michael@walle.cc>
+Tested-by: Michael Walle <michael@walle.cc> # on kontron-pitx-imx8m
+Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
+Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
+Link: https://lore.kernel.org/r/20230404172148.82422-19-srinivas.kandagatla@linaro.org
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/nvmem/imx-ocotp.c | 30 +++++++++++++++++++-----------
+ 1 file changed, 19 insertions(+), 11 deletions(-)
+
+--- a/drivers/nvmem/imx-ocotp.c
++++ b/drivers/nvmem/imx-ocotp.c
+@@ -225,18 +225,13 @@ read_end:
+ static int imx_ocotp_cell_pp(void *context, const char *id, int index,
+                            unsigned int offset, void *data, size_t bytes)
+ {
+-      struct ocotp_priv *priv = context;
++      u8 *buf = data;
++      int i;
+       /* Deal with some post processing of nvmem cell data */
+-      if (id && !strcmp(id, "mac-address")) {
+-              if (priv->params->reverse_mac_address) {
+-                      u8 *buf = data;
+-                      int i;
+-
+-                      for (i = 0; i < bytes/2; i++)
+-                              swap(buf[i], buf[bytes - i - 1]);
+-              }
+-      }
++      if (id && !strcmp(id, "mac-address"))
++              for (i = 0; i < bytes / 2; i++)
++                      swap(buf[i], buf[bytes - i - 1]);
+       return 0;
+ }
+@@ -488,7 +483,6 @@ static struct nvmem_config imx_ocotp_nvm
+       .stride = 1,
+       .reg_read = imx_ocotp_read,
+       .reg_write = imx_ocotp_write,
+-      .cell_post_process = imx_ocotp_cell_pp,
+ };
+ static const struct ocotp_params imx6q_params = {
+@@ -595,6 +589,17 @@ static const struct of_device_id imx_oco
+ };
+ MODULE_DEVICE_TABLE(of, imx_ocotp_dt_ids);
++static void imx_ocotp_fixup_cell_info(struct nvmem_device *nvmem,
++                                    struct nvmem_layout *layout,
++                                    struct nvmem_cell_info *cell)
++{
++      cell->read_post_process = imx_ocotp_cell_pp;
++}
++
++struct nvmem_layout imx_ocotp_layout = {
++      .fixup_cell_info = imx_ocotp_fixup_cell_info,
++};
++
+ static int imx_ocotp_probe(struct platform_device *pdev)
+ {
+       struct device *dev = &pdev->dev;
+@@ -619,6 +624,9 @@ static int imx_ocotp_probe(struct platfo
+       imx_ocotp_nvmem_config.size = 4 * priv->params->nregs;
+       imx_ocotp_nvmem_config.dev = dev;
+       imx_ocotp_nvmem_config.priv = priv;
++      if (priv->params->reverse_mac_address)
++              imx_ocotp_nvmem_config.layout = &imx_ocotp_layout;
++
+       priv->config = &imx_ocotp_nvmem_config;
+       clk_prepare_enable(priv->clk);