net: fsl_mdio: Correct the MII management register block address

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: 2932c5a802 ("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>
This commit is contained in:
Hou Zhiqiang 2020-07-16 18:09:11 +08:00 committed by Tom Rini
parent c54f6139ed
commit 16c53ce712
2 changed files with 26 additions and 6 deletions

View File

@ -11,6 +11,7 @@
#include <fsl_mdio.h> #include <fsl_mdio.h>
#include <asm/io.h> #include <asm/io.h>
#include <linux/errno.h> #include <linux/errno.h>
#include <tsec.h>
#ifdef CONFIG_DM_MDIO #ifdef CONFIG_DM_MDIO
struct tsec_mdio_priv { struct tsec_mdio_priv {
@ -190,17 +191,30 @@ static const struct mdio_ops tsec_mdio_ops = {
.reset = tsec_mdio_reset, .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[] = { static const struct udevice_id tsec_mdio_ids[] = {
{ .compatible = "fsl,gianfar-tbi" }, { .compatible = "fsl,gianfar-tbi", .data = (ulong)&gianfar_data },
{ .compatible = "fsl,gianfar-mdio" }, { .compatible = "fsl,gianfar-mdio", .data = (ulong)&gianfar_data },
{ .compatible = "fsl,etsec2-tbi" }, { .compatible = "fsl,etsec2-tbi", .data = (ulong)&etsec2_data },
{ .compatible = "fsl,etsec2-mdio" }, { .compatible = "fsl,etsec2-mdio", .data = (ulong)&etsec2_data },
{ .compatible = "fsl,fman-mdio" }, { .compatible = "fsl,fman-mdio", .data = (ulong)&fman_data },
{} {}
}; };
static int tsec_mdio_probe(struct udevice *dev) 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 tsec_mdio_priv *priv = (dev) ? dev_get_priv(dev) : NULL;
struct mdio_perdev_priv *pdata = (dev) ? dev_get_uclass_priv(dev) : struct mdio_perdev_priv *pdata = (dev) ? dev_get_uclass_priv(dev) :
NULL; NULL;
@ -213,7 +227,9 @@ static int tsec_mdio_probe(struct udevice *dev)
printf("dev_get_priv(dev %p) = NULL\n", dev); printf("dev_get_priv(dev %p) = NULL\n", dev);
return -1; 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__, debug("%s priv %p @ regs %p, pdata %p\n", __func__,
priv, priv->regs, pdata); priv, priv->regs, pdata);

View File

@ -55,6 +55,10 @@ int memac_mdio_read(struct mii_dev *bus, int port_addr, int dev_addr,
int regnum); int regnum);
int memac_mdio_reset(struct mii_dev *bus); int memac_mdio_reset(struct mii_dev *bus);
struct fsl_pq_mdio_data {
u32 mdio_regs_off;
};
struct fsl_pq_mdio_info { struct fsl_pq_mdio_info {
struct tsec_mii_mng __iomem *regs; struct tsec_mii_mng __iomem *regs;
char *name; char *name;