mirror of
				git://git.openwrt.org/openwrt/openwrt.git
				synced 2025-10-31 14:04:26 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			93 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			93 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From d0221a780cbc99fec6c27a98dba2828dc5735c00 Mon Sep 17 00:00:00 2001
 | |
| From: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
 | |
| Date: Wed, 13 Oct 2021 14:19:57 +0100
 | |
| Subject: [PATCH] nvmem: imx-ocotp: add support for post processing
 | |
| 
 | |
| Add .cell_post_process callback for imx-ocotp to deal with MAC address,
 | |
| since MAC address need to be reversed byte for some i.MX SoCs.
 | |
| 
 | |
| Tested-by: Joakim Zhang <qiangqing.zhang@nxp.com>
 | |
| Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
 | |
| Link: https://lore.kernel.org/r/20211013131957.30271-4-srinivas.kandagatla@linaro.org
 | |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
 | |
| ---
 | |
|  drivers/nvmem/imx-ocotp.c | 25 +++++++++++++++++++++++++
 | |
|  1 file changed, 25 insertions(+)
 | |
| 
 | |
| --- a/drivers/nvmem/imx-ocotp.c
 | |
| +++ b/drivers/nvmem/imx-ocotp.c
 | |
| @@ -97,6 +97,7 @@ struct ocotp_params {
 | |
|  	unsigned int bank_address_words;
 | |
|  	void (*set_timing)(struct ocotp_priv *priv);
 | |
|  	struct ocotp_ctrl_reg ctrl;
 | |
| +	bool reverse_mac_address;
 | |
|  };
 | |
|  
 | |
|  static int imx_ocotp_wait_for_busy(struct ocotp_priv *priv, u32 flags)
 | |
| @@ -221,6 +222,25 @@ read_end:
 | |
|  	return ret;
 | |
|  }
 | |
|  
 | |
| +static int imx_ocotp_cell_pp(void *context, const char *id, unsigned int offset,
 | |
| +			     void *data, size_t bytes)
 | |
| +{
 | |
| +	struct ocotp_priv *priv = context;
 | |
| +
 | |
| +	/* 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]);
 | |
| +		}
 | |
| +	}
 | |
| +
 | |
| +	return 0;
 | |
| +}
 | |
| +
 | |
|  static void imx_ocotp_set_imx6_timing(struct ocotp_priv *priv)
 | |
|  {
 | |
|  	unsigned long clk_rate;
 | |
| @@ -468,6 +488,7 @@ 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 = {
 | |
| @@ -530,6 +551,7 @@ static const struct ocotp_params imx8mq_
 | |
|  	.bank_address_words = 0,
 | |
|  	.set_timing = imx_ocotp_set_imx6_timing,
 | |
|  	.ctrl = IMX_OCOTP_BM_CTRL_DEFAULT,
 | |
| +	.reverse_mac_address = true,
 | |
|  };
 | |
|  
 | |
|  static const struct ocotp_params imx8mm_params = {
 | |
| @@ -537,6 +559,7 @@ static const struct ocotp_params imx8mm_
 | |
|  	.bank_address_words = 0,
 | |
|  	.set_timing = imx_ocotp_set_imx6_timing,
 | |
|  	.ctrl = IMX_OCOTP_BM_CTRL_DEFAULT,
 | |
| +	.reverse_mac_address = true,
 | |
|  };
 | |
|  
 | |
|  static const struct ocotp_params imx8mn_params = {
 | |
| @@ -544,6 +567,7 @@ static const struct ocotp_params imx8mn_
 | |
|  	.bank_address_words = 0,
 | |
|  	.set_timing = imx_ocotp_set_imx6_timing,
 | |
|  	.ctrl = IMX_OCOTP_BM_CTRL_DEFAULT,
 | |
| +	.reverse_mac_address = true,
 | |
|  };
 | |
|  
 | |
|  static const struct ocotp_params imx8mp_params = {
 | |
| @@ -551,6 +575,7 @@ static const struct ocotp_params imx8mp_
 | |
|  	.bank_address_words = 0,
 | |
|  	.set_timing = imx_ocotp_set_imx6_timing,
 | |
|  	.ctrl = IMX_OCOTP_BM_CTRL_8MP,
 | |
| +	.reverse_mac_address = true,
 | |
|  };
 | |
|  
 | |
|  static const struct of_device_id imx_ocotp_dt_ids[] = {
 |