diff options
Diffstat (limited to 'drivers/net/tsec.c')
| -rw-r--r-- | drivers/net/tsec.c | 57 | 
1 files changed, 22 insertions, 35 deletions
| diff --git a/drivers/net/tsec.c b/drivers/net/tsec.c index 5d12e4b7755..c436b8317d9 100644 --- a/drivers/net/tsec.c +++ b/drivers/net/tsec.c @@ -18,6 +18,7 @@  #include <linux/bitops.h>  #include <linux/delay.h>  #include <linux/errno.h> +#include <miiphy.h>  #include <asm/processor.h>  #include <asm/io.h> @@ -681,8 +682,15 @@ static int init_phy(struct tsec_private *priv)  	if (priv->interface == PHY_INTERFACE_MODE_SGMII)  		tsec_configure_serdes(priv); +#if defined(CONFIG_DM_ETH) && defined(CONFIG_DM_MDIO) +	if (ofnode_valid(ofnode_find_subnode(priv->dev->node, "fixed-link"))) +		phydev = phy_connect(NULL, 0, priv->dev, priv->interface); +	else +		phydev = dm_eth_phy_connect(priv->dev); +#else  	phydev = phy_connect(priv->bus, priv->phyaddr, priv->dev,  			     priv->interface); +#endif  	if (!phydev)  		return 0; @@ -793,43 +801,19 @@ int tsec_probe(struct udevice *dev)  {  	struct eth_pdata *pdata = dev_get_platdata(dev);  	struct tsec_private *priv = dev_get_priv(dev); -	struct tsec_mii_mng __iomem *ext_phyregs_mii;  	struct ofnode_phandle_args phandle_args;  	u32 tbiaddr = CONFIG_SYS_TBIPA_VALUE; -	struct fsl_pq_mdio_info mdio_info; +	struct tsec_data *data;  	const char *phy_mode;  	fdt_addr_t reg;  	ofnode parent;  	int ret; +	data = (struct tsec_data *)dev_get_driver_data(dev); +  	pdata->iobase = (phys_addr_t)dev_read_addr(dev);  	priv->regs = dev_remap_addr(dev); -	if (dev_read_phandle_with_args(dev, "phy-handle", NULL, 0, 0, -				       &phandle_args)) { -		printf("phy-handle does not exist under tsec %s\n", dev->name); -		return -ENOENT; -	} else { -		int reg = ofnode_read_u32_default(phandle_args.node, "reg", 0); - -		priv->phyaddr = reg; -	} - -	parent = ofnode_get_parent(phandle_args.node); -	if (!ofnode_valid(parent)) { -		printf("No parent node for PHY?\n"); -		return -ENOENT; -	} - -	reg = ofnode_get_addr_index(parent, 0); -	if (reg == FDT_ADDR_T_NONE) { -		printf("No 'reg' property of MII for external PHY\n"); -		return -ENOENT; -	} - -	ext_phyregs_mii = map_physmem(reg + TSEC_MDIO_REGS_OFFSET, 0, -				      MAP_NOCACHE); -  	ret = dev_read_phandle_with_args(dev, "tbi-handle", NULL, 0, 0,  					 &phandle_args);  	if (ret == 0) { @@ -847,7 +831,7 @@ int tsec_probe(struct udevice *dev)  			return -ENOENT;  		} -		priv->phyregs_sgmii = map_physmem(reg + TSEC_MDIO_REGS_OFFSET, +		priv->phyregs_sgmii = map_physmem(reg + data->mdio_regs_off,  						  0, MAP_NOCACHE);  	} @@ -867,12 +851,6 @@ int tsec_probe(struct udevice *dev)  	if (priv->interface == PHY_INTERFACE_MODE_SGMII)  		priv->flags |= TSEC_SGMII; -	mdio_info.regs = ext_phyregs_mii; -	mdio_info.name = (char *)dev->name; -	ret = fsl_pq_mdio_init(NULL, &mdio_info); -	if (ret) -		return ret; -  	/* Reset the MAC */  	setbits_be32(&priv->regs->maccfg1, MACCFG1_SOFT_RESET);  	udelay(2);  /* Soft Reset must be asserted for 3 TX clocks */ @@ -905,8 +883,17 @@ static const struct eth_ops tsec_ops = {  	.mcast = tsec_mcast_addr,  }; +static struct tsec_data etsec2_data = { +	.mdio_regs_off = TSEC_MDIO_REGS_OFFSET, +}; + +static struct tsec_data gianfar_data = { +	.mdio_regs_off = 0x0, +}; +  static const struct udevice_id tsec_ids[] = { -	{ .compatible = "fsl,etsec2" }, +	{ .compatible = "fsl,etsec2", .data = (ulong)&etsec2_data }, +	{ .compatible = "gianfar", .data = (ulong)&gianfar_data },  	{ }  }; | 
