diff mbox series

[PATCHv4,02/16] net: fsl_mdio: Correct the MII management register block address

Message ID 20200701165857.39930-3-Zhiqiang.Hou@nxp.com
State Superseded
Delegated to: Priyanka Jain
Headers show
Series powerpc: covert p1010, p1020 and p2020 RDB board to DM_ETH | expand

Commit Message

Zhiqiang Hou July 1, 2020, 4:58 p.m. UTC
From: Hou Zhiqiang <Zhiqiang.Hou@nxp.com>

The MII management register block offset is different between
gianfar and etsec2 compatible devices, this patch is to fix
this issue by adding driver data for different compatible
string.

Fixes: 2932c5a802a9 ("net: tsec: fsl_mdio: add DM MDIO support")
Signed-off-by: Hou Zhiqiang <Zhiqiang.Hou@nxp.com>
---
V4:
 - No change.

 drivers/net/fsl_mdio.c | 28 ++++++++++++++++++++++------
 include/fsl_mdio.h     |  4 ++++
 2 files changed, 26 insertions(+), 6 deletions(-)

Comments

Vladimir Oltean July 4, 2020, 8:11 a.m. UTC | #1
On Thu, Jul 02, 2020 at 12:58:43AM +0800, Zhiqiang Hou wrote:
> From: Hou Zhiqiang <Zhiqiang.Hou@nxp.com>
> 
> The MII management register block offset is different between
> gianfar and etsec2 compatible devices, this patch is to fix
> this issue by adding driver data for different compatible
> string.
> 
> Fixes: 2932c5a802a9 ("net: tsec: fsl_mdio: add DM MDIO support")
> Signed-off-by: Hou Zhiqiang <Zhiqiang.Hou@nxp.com>
> ---

Reviewed-by: Vladimir Oltean <vladimir.oltean@nxp.com>

> V4:
>  - No change.
> 
>  drivers/net/fsl_mdio.c | 28 ++++++++++++++++++++++------
>  include/fsl_mdio.h     |  4 ++++
>  2 files changed, 26 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/net/fsl_mdio.c b/drivers/net/fsl_mdio.c
> index e52daa214d..5b615d50f6 100644
> --- a/drivers/net/fsl_mdio.c
> +++ b/drivers/net/fsl_mdio.c
> @@ -11,6 +11,7 @@
>  #include <fsl_mdio.h>
>  #include <asm/io.h>
>  #include <linux/errno.h>
> +#include <tsec.h>
>  
>  #ifdef CONFIG_DM_MDIO
>  struct tsec_mdio_priv {
> @@ -190,17 +191,30 @@ static const struct mdio_ops tsec_mdio_ops = {
>  	.reset = tsec_mdio_reset,
>  };
>  
> +static struct fsl_pq_mdio_data etsec2_data = {
> +	.mdio_regs_off = TSEC_MDIO_REGS_OFFSET,
> +};
> +
> +static struct fsl_pq_mdio_data gianfar_data = {
> +	.mdio_regs_off = 0x0,
> +};
> +
> +static struct fsl_pq_mdio_data fman_data = {
> +	.mdio_regs_off = 0x0,
> +};
> +
>  static const struct udevice_id tsec_mdio_ids[] = {
> -	{ .compatible = "fsl,gianfar-tbi" },
> -	{ .compatible = "fsl,gianfar-mdio" },
> -	{ .compatible = "fsl,etsec2-tbi" },
> -	{ .compatible = "fsl,etsec2-mdio" },
> -	{ .compatible = "fsl,fman-mdio" },
> +	{ .compatible = "fsl,gianfar-tbi", .data = (ulong)&gianfar_data },
> +	{ .compatible = "fsl,gianfar-mdio", .data = (ulong)&gianfar_data },
> +	{ .compatible = "fsl,etsec2-tbi", .data = (ulong)&etsec2_data },
> +	{ .compatible = "fsl,etsec2-mdio", .data = (ulong)&etsec2_data },
> +	{ .compatible = "fsl,fman-mdio", .data = (ulong)&fman_data },
>  	{}
>  };
>  
>  static int tsec_mdio_probe(struct udevice *dev)
>  {
> +	struct fsl_pq_mdio_data *data;
>  	struct tsec_mdio_priv *priv = (dev) ? dev_get_priv(dev) : NULL;
>  	struct mdio_perdev_priv *pdata = (dev) ? dev_get_uclass_priv(dev) :
>  						 NULL;
> @@ -213,7 +227,9 @@ static int tsec_mdio_probe(struct udevice *dev)
>  		printf("dev_get_priv(dev %p) = NULL\n", dev);
>  		return -1;
>  	}
> -	priv->regs = dev_remap_addr(dev);
> +
> +	data = (struct fsl_pq_mdio_data *)dev_get_driver_data(dev);
> +	priv->regs = dev_remap_addr(dev) + data->mdio_regs_off;
>  	debug("%s priv %p @ regs %p, pdata %p\n", __func__,
>  	      priv, priv->regs, pdata);
>  
> diff --git a/include/fsl_mdio.h b/include/fsl_mdio.h
> index 8857d50910..cd612c0954 100644
> --- a/include/fsl_mdio.h
> +++ b/include/fsl_mdio.h
> @@ -55,6 +55,10 @@ int memac_mdio_read(struct mii_dev *bus, int port_addr, int dev_addr,
>  		int regnum);
>  int memac_mdio_reset(struct mii_dev *bus);
>  
> +struct fsl_pq_mdio_data {
> +	u32 mdio_regs_off;
> +};
> +
>  struct fsl_pq_mdio_info {
>  	struct tsec_mii_mng __iomem *regs;
>  	char *name;
> -- 
> 2.25.1
>
diff mbox series

Patch

diff --git a/drivers/net/fsl_mdio.c b/drivers/net/fsl_mdio.c
index e52daa214d..5b615d50f6 100644
--- a/drivers/net/fsl_mdio.c
+++ b/drivers/net/fsl_mdio.c
@@ -11,6 +11,7 @@ 
 #include <fsl_mdio.h>
 #include <asm/io.h>
 #include <linux/errno.h>
+#include <tsec.h>
 
 #ifdef CONFIG_DM_MDIO
 struct tsec_mdio_priv {
@@ -190,17 +191,30 @@  static const struct mdio_ops tsec_mdio_ops = {
 	.reset = tsec_mdio_reset,
 };
 
+static struct fsl_pq_mdio_data etsec2_data = {
+	.mdio_regs_off = TSEC_MDIO_REGS_OFFSET,
+};
+
+static struct fsl_pq_mdio_data gianfar_data = {
+	.mdio_regs_off = 0x0,
+};
+
+static struct fsl_pq_mdio_data fman_data = {
+	.mdio_regs_off = 0x0,
+};
+
 static const struct udevice_id tsec_mdio_ids[] = {
-	{ .compatible = "fsl,gianfar-tbi" },
-	{ .compatible = "fsl,gianfar-mdio" },
-	{ .compatible = "fsl,etsec2-tbi" },
-	{ .compatible = "fsl,etsec2-mdio" },
-	{ .compatible = "fsl,fman-mdio" },
+	{ .compatible = "fsl,gianfar-tbi", .data = (ulong)&gianfar_data },
+	{ .compatible = "fsl,gianfar-mdio", .data = (ulong)&gianfar_data },
+	{ .compatible = "fsl,etsec2-tbi", .data = (ulong)&etsec2_data },
+	{ .compatible = "fsl,etsec2-mdio", .data = (ulong)&etsec2_data },
+	{ .compatible = "fsl,fman-mdio", .data = (ulong)&fman_data },
 	{}
 };
 
 static int tsec_mdio_probe(struct udevice *dev)
 {
+	struct fsl_pq_mdio_data *data;
 	struct tsec_mdio_priv *priv = (dev) ? dev_get_priv(dev) : NULL;
 	struct mdio_perdev_priv *pdata = (dev) ? dev_get_uclass_priv(dev) :
 						 NULL;
@@ -213,7 +227,9 @@  static int tsec_mdio_probe(struct udevice *dev)
 		printf("dev_get_priv(dev %p) = NULL\n", dev);
 		return -1;
 	}
-	priv->regs = dev_remap_addr(dev);
+
+	data = (struct fsl_pq_mdio_data *)dev_get_driver_data(dev);
+	priv->regs = dev_remap_addr(dev) + data->mdio_regs_off;
 	debug("%s priv %p @ regs %p, pdata %p\n", __func__,
 	      priv, priv->regs, pdata);
 
diff --git a/include/fsl_mdio.h b/include/fsl_mdio.h
index 8857d50910..cd612c0954 100644
--- a/include/fsl_mdio.h
+++ b/include/fsl_mdio.h
@@ -55,6 +55,10 @@  int memac_mdio_read(struct mii_dev *bus, int port_addr, int dev_addr,
 		int regnum);
 int memac_mdio_reset(struct mii_dev *bus);
 
+struct fsl_pq_mdio_data {
+	u32 mdio_regs_off;
+};
+
 struct fsl_pq_mdio_info {
 	struct tsec_mii_mng __iomem *regs;
 	char *name;