net: fsl_mdio: Correct the MII management register block address
authorHou Zhiqiang <Zhiqiang.Hou@nxp.com>
Thu, 16 Jul 2020 10:09:11 +0000 (18:09 +0800)
committerTom Rini <trini@konsulko.com>
Thu, 24 Sep 2020 12:27:44 +0000 (08:27 -0400)
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>
Reviewed-by: Priyanka Jain <priyanka.jain@nxp.com>
drivers/net/fsl_mdio.c
include/fsl_mdio.h

index ae96ce4c7bf9777bef3407e90e61901af4f6d128..77f1a96a2eb6fc6a18a950a377843b906e26eee7 100644 (file)
@@ -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);
 
index 41cb73717bc9bc4386b1efa890261f9c70c35140..b6c02cf342de1d0964516e411aecb4a2aee463a7 100644 (file)
@@ -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;