mail archive of the barebox mailing list
 help / color / mirror / Atom feed
From: Stefan Lengfeld <s.lengfeld@phytec.de>
To: Andrey Smirnov <andrew.smirnov@gmail.com>
Cc: barebox@lists.infradead.org
Subject: Re: [PATCH v2 04/21] i.MX: ocotp: Add provisions for storing multiple MAC addresses
Date: Tue, 13 Dec 2016 10:56:21 +0100	[thread overview]
Message-ID: <20161213095621.GC3694@lws-christ> (raw)
In-Reply-To: <1481565788-9115-5-git-send-email-andrew.smirnov@gmail.com>

Hi Andrey,

On Mon, Dec 12, 2016 at 10:02:51AM -0800, Andrey Smirnov wrote:
> i.MX SoC variants like Vybrid have more than one built-in Ethernet
> interface and as a consequence support storing more than one MAC address
> in OCOTP module. Add code to create multiple 'mac_addr<n>' parameters as
> well as 'mac_addr' as an "alias" to 'mac_addr0' for backwards
> compatibility.
> 
> Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com>
> ---
>  arch/arm/mach-imx/ocotp.c | 65 +++++++++++++++++++++++++++++++++++------------
>  1 file changed, 49 insertions(+), 16 deletions(-)

Acked-by: Stefan Lengfeld <s.lengfeld@phytec.de>

Mit freundlichen Grüßen / Kind regards,
	Stefan Lengfeld

> 
> diff --git a/arch/arm/mach-imx/ocotp.c b/arch/arm/mach-imx/ocotp.c
> index f549c94..55bbbb7 100644
> --- a/arch/arm/mach-imx/ocotp.c
> +++ b/arch/arm/mach-imx/ocotp.c
> @@ -69,12 +69,22 @@
>  /* Other definitions */
>  #define IMX6_OTP_DATA_ERROR_VAL		0xBADABADA
>  #define DEF_RELAX			20
> -#define MAC_OFFSET			(0x22 * 4)
> +#define MAC_OFFSET_0			(0x22 * 4)
> +#define MAC_OFFSET_1			(0x24 * 4)
> +#define MAX_MAC_OFFSETS			2
>  #define MAC_BYTES			8
>  
>  struct imx_ocotp_data {
>  	int num_regs;
>  	u32 (*addr_to_offset)(u32 addr);
> +	u8  mac_offsets[MAX_MAC_OFFSETS];
> +	u8  mac_offsets_num;
> +};
> +
> +struct ocotp_priv_ethaddr {
> +	char value[MAC_BYTES];
> +	struct regmap *map;
> +	u8 offset;
>  };
>  
>  struct ocotp_priv {
> @@ -84,9 +94,10 @@ struct ocotp_priv {
>  	struct device_d dev;
>  	int permanent_write_enable;
>  	int sense_enable;
> -	char ethaddr[MAC_BYTES];
> +	struct ocotp_priv_ethaddr ethaddr[MAX_MAC_OFFSETS];
>  	struct regmap_config map_config;
>  	const struct imx_ocotp_data *data;
> +	int  mac_offset_idx;
>  };
>  
>  static struct ocotp_priv *imx_ocotp;
> @@ -408,31 +419,28 @@ static void memreverse(void *dest, const void *src, size_t n)
>  
>  static int imx_ocotp_get_mac(struct param_d *param, void *priv)
>  {
> -	struct ocotp_priv *ocotp_priv = priv;
>  	char buf[MAC_BYTES];
>  	int ret;
> +	struct ocotp_priv_ethaddr *ethaddr = priv;
>  
> -	ret = regmap_bulk_read(ocotp_priv->map, MAC_OFFSET, buf, MAC_BYTES);
> +	ret = regmap_bulk_read(ethaddr->map, ethaddr->offset,
> +			       buf, MAC_BYTES);
>  	if (ret < 0)
>  		return ret;
>  
> -	memreverse(ocotp_priv->ethaddr, buf, MAC_BYTES);
> +	memreverse(ethaddr->value, buf, MAC_BYTES);
>  	return 0;
>  }
>  
>  static int imx_ocotp_set_mac(struct param_d *param, void *priv)
>  {
> -	struct ocotp_priv *ocotp_priv = priv;
>  	char buf[MAC_BYTES];
> -	int ret;
> +	struct ocotp_priv_ethaddr *ethaddr = priv;
>  
> -	memreverse(buf, ocotp_priv->ethaddr, MAC_BYTES);
> -
> -	ret = regmap_bulk_write(ocotp_priv->map, MAC_OFFSET, buf, MAC_BYTES);
> -	if (ret < 0)
> -		return ret;
> +	memreverse(buf, ethaddr->value, MAC_BYTES);
>  
> -	return 0;
> +	return regmap_bulk_write(ethaddr->map, ethaddr->offset,
> +				 buf, MAC_BYTES);
>  }
>  
>  static struct regmap_bus imx_ocotp_regmap_bus = {
> @@ -491,9 +499,28 @@ static int imx_ocotp_probe(struct device_d *dev)
>  				NULL, NULL, &priv->permanent_write_enable, NULL);
>  	}
>  
> -	if (IS_ENABLED(CONFIG_NET))
> -		dev_add_param_mac(&(priv->dev), "mac_addr", imx_ocotp_set_mac,
> -				imx_ocotp_get_mac, priv->ethaddr, priv);
> +	if (IS_ENABLED(CONFIG_NET)) {
> +		int i;
> +		struct ocotp_priv_ethaddr *ethaddr;
> +
> +		for (i = 0; i < priv->data->mac_offsets_num; i++) {
> +			ethaddr = &priv->ethaddr[i];
> +			ethaddr->map = priv->map;
> +			ethaddr->offset = priv->data->mac_offsets[i];
> +
> +			dev_add_param_mac(&priv->dev, xasprintf("mac_addr%d", i),
> +					  imx_ocotp_set_mac, imx_ocotp_get_mac,
> +					  ethaddr->value, ethaddr);
> +		}
> +
> +		/*
> +		 * Alias to mac_addr0 for backwards compatibility
> +		 */
> +		ethaddr = &priv->ethaddr[0];
> +		dev_add_param_mac(&priv->dev, "mac_addr",
> +				  imx_ocotp_set_mac, imx_ocotp_get_mac,
> +				  ethaddr->value, ethaddr);
> +	}
>  
>  	dev_add_param_bool(&(priv->dev), "sense_enable", NULL, NULL, &priv->sense_enable, priv);
>  
> @@ -532,16 +559,22 @@ static u32 vf610_addr_to_offset(u32 addr)
>  static struct imx_ocotp_data imx6q_ocotp_data = {
>  	.num_regs = 512,
>  	.addr_to_offset = imx6q_addr_to_offset,
> +	.mac_offsets_num = 1,
> +	.mac_offsets = { MAC_OFFSET_0 },
>  };
>  
>  static struct imx_ocotp_data imx6sl_ocotp_data = {
>  	.num_regs = 256,
>  	.addr_to_offset = imx6sl_addr_to_offset,
> +	.mac_offsets_num = 1,
> +	.mac_offsets = { MAC_OFFSET_0 },
>  };
>  
>  static struct imx_ocotp_data vf610_ocotp_data = {
>  	.num_regs = 512,
>  	.addr_to_offset = vf610_addr_to_offset,
> +	.mac_offsets_num = 2,
> +	.mac_offsets = { MAC_OFFSET_0, MAC_OFFSET_1 },
>  };
>  
>  static __maybe_unused struct of_device_id imx_ocotp_dt_ids[] = {
> -- 
> 2.5.5
> 

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

  reply	other threads:[~2016-12-13  9:56 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-12-12 18:02 [PATCH v2 00/21] Vybrid related patches Andrey Smirnov
2016-12-12 18:02 ` [PATCH v2 01/21] i.MX: esdhc: Enable host->clk during initialization Andrey Smirnov
2016-12-12 18:02 ` [PATCH v2 02/21] i.MX: ocotp: Move memory reversing into a subroutine Andrey Smirnov
2016-12-12 18:02 ` [PATCH v2 03/21] i.MX: ocotp: Simplify MAC address storing logic Andrey Smirnov
2017-01-09 11:18   ` Sascha Hauer
2017-01-09 11:28     ` Sascha Hauer
2017-01-10 15:02     ` Andrey Smirnov
2016-12-12 18:02 ` [PATCH v2 04/21] i.MX: ocotp: Add provisions for storing multiple MAC addresses Andrey Smirnov
2016-12-13  9:56   ` Stefan Lengfeld [this message]
2016-12-12 18:02 ` [PATCH 05/21] i.MX: ocotp: Initialize OCOTP as early as possible Andrey Smirnov
2016-12-12 18:02 ` [PATCH v2 06/21] i.MX: clk: Add IMX_PLLV3_SYS_VF610 subtype Andrey Smirnov
2016-12-12 18:02 ` [PATCH v2 07/21] i.MX: ocotp: Add imx_ocotp_sense_enable() Andrey Smirnov
2016-12-12 18:02 ` [PATCH v2 08/21] i.MX: imx6-fusemap: Fix SJC_RESP_LOCK width Andrey Smirnov
2016-12-12 18:02 ` [PATCH v2 09/21] i.MX: Add fusemap for VF610 Andrey Smirnov
2016-12-12 18:02 ` [PATCH v2 10/21] i.MX: vf610: Ramp CPU clock to maximum frequency Andrey Smirnov
2016-12-12 18:02 ` [PATCH v2 11/21] i.MX: iomuxv3: Add low-level pad code to headers Andrey Smirnov
2016-12-12 18:02 ` [PATCH v2 12/21] i.MX: iomuxv3: Add helper type to deconstruct iomux_v3_cfg_t values Andrey Smirnov
2017-01-09 12:00   ` Sascha Hauer
2017-01-10 15:01     ` Andrey Smirnov
2016-12-12 18:03 ` [PATCH v2 13/21] i.MX: iomuxv3: Add low-level pad configuration routine Andrey Smirnov
2016-12-12 18:03 ` [PATCH v2 14/21] i.MX6: sabresd: Remove magic numbers in setup_uart Andrey Smirnov
2016-12-12 18:03 ` [PATCH v2 15/21] i.MX: iomuxv3: Use helper functions in iomux-v3.h Andrey Smirnov
2016-12-12 18:03 ` [PATCH v2 16/21] i.MX: vf610: Add low-level pin configuration helper Andrey Smirnov
2016-12-12 18:03 ` [PATCH v2 17/21] i.MX: iomux-vf610: Add missing pad definitions Andrey Smirnov
2016-12-12 18:03 ` [PATCH v2 18/21] i.MX: imx-usb-phy: Add VF610 OF compatiblity string Andrey Smirnov
2016-12-12 18:03 ` [PATCH v2 19/21] i.MX: Default CONFI_USB_IMX_PHY to 'y' on Vybrid Andrey Smirnov
2017-01-09 12:03   ` Sascha Hauer
2017-01-10 15:02     ` Andrey Smirnov
2016-12-12 18:03 ` [PATCH v2 20/21] i.MX: imx-usb-misc: Add Vybrid support Andrey Smirnov
2016-12-12 18:03 ` [PATCH v2 21/21] i.MX: vf610-twr: Remove MSCM setup code Andrey Smirnov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20161213095621.GC3694@lws-christ \
    --to=s.lengfeld@phytec.de \
    --cc=andrew.smirnov@gmail.com \
    --cc=barebox@lists.infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox