On Thu, Jul 02, 2020 at 12:58:43AM +0800, Zhiqiang Hou wrote: > From: Hou Zhiqiang <zhiqiang....@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....@nxp.com> > ---
Reviewed-by: Vladimir Oltean <vladimir.olt...@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 >