1 From d0221a780cbc99fec6c27a98dba2828dc5735c00 Mon Sep 17 00:00:00 2001
2 From: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
3 Date: Wed, 13 Oct 2021 14:19:57 +0100
4 Subject: [PATCH] nvmem: imx-ocotp: add support for post processing
6 Add .cell_post_process callback for imx-ocotp to deal with MAC address,
7 since MAC address need to be reversed byte for some i.MX SoCs.
9 Tested-by: Joakim Zhang <qiangqing.zhang@nxp.com>
10 Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
11 Link: https://lore.kernel.org/r/20211013131957.30271-4-srinivas.kandagatla@linaro.org
12 Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
14 drivers/nvmem/imx-ocotp.c | 25 +++++++++++++++++++++++++
15 1 file changed, 25 insertions(+)
17 --- a/drivers/nvmem/imx-ocotp.c
18 +++ b/drivers/nvmem/imx-ocotp.c
19 @@ -97,6 +97,7 @@ struct ocotp_params {
20 unsigned int bank_address_words;
21 void (*set_timing)(struct ocotp_priv *priv);
22 struct ocotp_ctrl_reg ctrl;
23 + bool reverse_mac_address;
26 static int imx_ocotp_wait_for_busy(struct ocotp_priv *priv, u32 flags)
27 @@ -221,6 +222,25 @@ read_end:
31 +static int imx_ocotp_cell_pp(void *context, const char *id, unsigned int offset,
32 + void *data, size_t bytes)
34 + struct ocotp_priv *priv = context;
36 + /* Deal with some post processing of nvmem cell data */
37 + if (id && !strcmp(id, "mac-address")) {
38 + if (priv->params->reverse_mac_address) {
42 + for (i = 0; i < bytes/2; i++)
43 + swap(buf[i], buf[bytes - i - 1]);
50 static void imx_ocotp_set_imx6_timing(struct ocotp_priv *priv)
52 unsigned long clk_rate;
53 @@ -468,6 +488,7 @@ static struct nvmem_config imx_ocotp_nvm
55 .reg_read = imx_ocotp_read,
56 .reg_write = imx_ocotp_write,
57 + .cell_post_process = imx_ocotp_cell_pp,
60 static const struct ocotp_params imx6q_params = {
61 @@ -530,6 +551,7 @@ static const struct ocotp_params imx8mq_
62 .bank_address_words = 0,
63 .set_timing = imx_ocotp_set_imx6_timing,
64 .ctrl = IMX_OCOTP_BM_CTRL_DEFAULT,
65 + .reverse_mac_address = true,
68 static const struct ocotp_params imx8mm_params = {
69 @@ -537,6 +559,7 @@ static const struct ocotp_params imx8mm_
70 .bank_address_words = 0,
71 .set_timing = imx_ocotp_set_imx6_timing,
72 .ctrl = IMX_OCOTP_BM_CTRL_DEFAULT,
73 + .reverse_mac_address = true,
76 static const struct ocotp_params imx8mn_params = {
77 @@ -544,6 +567,7 @@ static const struct ocotp_params imx8mn_
78 .bank_address_words = 0,
79 .set_timing = imx_ocotp_set_imx6_timing,
80 .ctrl = IMX_OCOTP_BM_CTRL_DEFAULT,
81 + .reverse_mac_address = true,
84 static const struct ocotp_params imx8mp_params = {
85 @@ -551,6 +575,7 @@ static const struct ocotp_params imx8mp_
86 .bank_address_words = 0,
87 .set_timing = imx_ocotp_set_imx6_timing,
88 .ctrl = IMX_OCOTP_BM_CTRL_8MP,
89 + .reverse_mac_address = true,
92 static const struct of_device_id imx_ocotp_dt_ids[] = {