+Joe
On 16 May 2016 at 23:11, Wenyou Yang <[email protected]> wrote: > Use the right phy_connect() prototype for CONFIGF_DM_ETH. > Support to get the phy interface from dt and set GMAC_UR. > > Signed-off-by: Wenyou Yang <[email protected]> > --- > This patch is based on the patch set, > [PATCH 00/18] at91: Convert Ethernet and LCD to driver model > http://lists.denx.de/pipermail/u-boot/2016-May/253559.html > > Hi Simon, > > With this patch, the ethernet works on SAMA5D2 Xplained board. > But it includes a lot of #ifdef, I think it is not pretty. > > What is your opinions? I believe there is a new PHY interface that might help. I added Joe in case he can help. We should move PHYs to driver model but apparently that is tricky to do at present. > > > drivers/net/macb.c | 77 > ++++++++++++++++++++++++++++++++++++++++++++++++------ > 1 file changed, 69 insertions(+), 8 deletions(-) > > diff --git a/drivers/net/macb.c b/drivers/net/macb.c > index 63fb466..ddb9e23 100644 > --- a/drivers/net/macb.c > +++ b/drivers/net/macb.c > @@ -43,6 +43,8 @@ > > #include "macb.h" > > +DECLARE_GLOBAL_DATA_PTR; > + > #define MACB_RX_BUFFER_SIZE 4096 > #define MACB_RX_RING_SIZE (MACB_RX_BUFFER_SIZE / 128) > #define MACB_TX_RING_SIZE 16 > @@ -108,6 +110,10 @@ struct macb_device { > #endif > unsigned short phy_addr; > struct mii_dev *bus; > + > +#ifdef CONFIG_DM_ETH > + phy_interface_t phy_interface; > +#endif > }; > #ifndef CONFIG_DM_ETH > #define to_macb(_nd) container_of(_nd, struct macb_device, netdev) > @@ -434,7 +440,7 @@ static void macb_phy_reset(struct macb_device *macb, > const char *name) > } > > #ifdef CONFIG_MACB_SEARCH_PHY > -static int macb_phy_find(struct macb_device *macb) > +static int macb_phy_find(struct macb_device *macb, const char *name) > { > int i; > u16 phy_id; > @@ -444,21 +450,27 @@ static int macb_phy_find(struct macb_device *macb) > macb->phy_addr = i; > phy_id = macb_mdio_read(macb, MII_PHYSID1); > if (phy_id != 0xffff) { > - printf("%s: PHY present at %d\n", macb->netdev.name, > i); > + printf("%s: PHY present at %d\n", name, i); > return 1; > } > } > > /* PHY isn't up to snuff */ > - printf("%s: PHY not found\n", macb->netdev.name); > + printf("%s: PHY not found\n", name); > > return 0; > } > #endif /* CONFIG_MACB_SEARCH_PHY */ > > - > +#ifdef CONFIG_DM_ETH > +static int macb_phy_init(struct udevice *dev, const char *name) > +#else > static int macb_phy_init(struct macb_device *macb, const char *name) > +#endif > { > +#ifdef CONFIG_DM_ETH > + struct macb_device *macb = dev_get_priv(dev); > +#endif > #ifdef CONFIG_PHYLIB > struct phy_device *phydev; > #endif > @@ -470,7 +482,7 @@ static int macb_phy_init(struct macb_device *macb, const > char *name) > arch_get_mdio_control(name); > #ifdef CONFIG_MACB_SEARCH_PHY > /* Auto-detect phy_addr */ > - if (!macb_phy_find(macb)) > + if (!macb_phy_find(macb, name)) > return 0; > #endif /* CONFIG_MACB_SEARCH_PHY */ > > @@ -482,9 +494,14 @@ static int macb_phy_init(struct macb_device *macb, const > char *name) > } > > #ifdef CONFIG_PHYLIB > +#ifdef CONFIG_DM_ETH > + phydev = phy_connect(macb->bus, macb->phy_addr, dev, > + macb->phy_interface); > +#else > /* need to consider other phy interface mode */ > phydev = phy_connect(macb->bus, macb->phy_addr, &macb->netdev, > PHY_INTERFACE_MODE_RGMII); > +#endif > if (!phydev) { > printf("phy_connect failed\n"); > return -ENODEV; > @@ -585,8 +602,15 @@ static int gmac_init_multi_queues(struct macb_device > *macb) > return 0; > } > > +#ifdef CONFIG_DM_ETH > +static int _macb_init(struct udevice *dev, const char *name) > +#else > static int _macb_init(struct macb_device *macb, const char *name) > +#endif > { > +#ifdef CONFIG_DM_ETH > + struct macb_device *macb = dev_get_priv(dev); > +#endif > unsigned long paddr; > int i; > > @@ -634,13 +658,35 @@ static int _macb_init(struct macb_device *macb, const > char *name) > * When the GMAC IP without GE feature, this bit is used > * to select interface between RMII and MII. > */ > +#ifdef CONFIG_DM_ETH > + if (macb->phy_interface == PHY_INTERFACE_MODE_RMII) > + gem_writel(macb, UR, GEM_BIT(RGMII)); > + else > + gem_writel(macb, UR, 0); > +#else > #if defined(CONFIG_RGMII) || defined(CONFIG_RMII) > gem_writel(macb, UR, GEM_BIT(RGMII)); > #else > gem_writel(macb, UR, 0); > #endif > +#endif > } else { > /* choose RMII or MII mode. This depends on the board */ > +#ifdef CONFIG_DM_ETH > +#ifdef CONFIG_AT91FAMILY > + if (macb->phy_interface == PHY_INTERFACE_MODE_RMII) { > + macb_writel(macb, USRIO, > + MACB_BIT(RMII) | MACB_BIT(CLKEN)); > + } else { > + macb_writel(macb, USRIO, MACB_BIT(CLKEN)); > + } > +#else > + if (macb->phy_interface == PHY_INTERFACE_MODE_RMII) > + macb_writel(macb, USRIO, 0); > + else > + macb_writel(macb, USRIO, MACB_BIT(MII)); > +#endif > +#else > #ifdef CONFIG_RMII > #ifdef CONFIG_AT91FAMILY > macb_writel(macb, USRIO, MACB_BIT(RMII) | MACB_BIT(CLKEN)); > @@ -654,9 +700,14 @@ static int _macb_init(struct macb_device *macb, const > char *name) > macb_writel(macb, USRIO, MACB_BIT(MII)); > #endif > #endif /* CONFIG_RMII */ > +#endif > } > > +#ifdef CONFIG_DM_ETH > + if (!macb_phy_init(dev, name)) > +#else > if (!macb_phy_init(macb, name)) > +#endif > return -1; > > /* Enable TX and RX */ > @@ -873,9 +924,7 @@ int macb_eth_initialize(int id, void *regs, unsigned int > phy_addr) > > static int macb_start(struct udevice *dev) > { > - struct macb_device *macb = dev_get_priv(dev); > - > - return _macb_init(macb, dev->name); > + return _macb_init(dev, dev->name); > } > > static int macb_send(struct udevice *dev, void *packet, int length) > @@ -933,6 +982,18 @@ static int macb_eth_probe(struct udevice *dev) > struct eth_pdata *pdata = dev_get_platdata(dev); > struct macb_device *macb = dev_get_priv(dev); > > +#ifdef CONFIG_DM_ETH > + const char *phy_mode; > + > + phy_mode = fdt_getprop(gd->fdt_blob, dev->of_offset, "phy-mode", > NULL); > + if (phy_mode) > + macb->phy_interface = phy_get_interface_by_name(phy_mode); > + if (macb->phy_interface == -1) { > + debug("%s: Invalid PHY interface '%s'\n", __func__, phy_mode); > + return -EINVAL; > + } > +#endif > + > macb->regs = (void *)pdata->iobase; > > _macb_eth_initialize(macb); > -- > 2.7.4 > Regards, Simon _______________________________________________ U-Boot mailing list [email protected] http://lists.denx.de/mailman/listinfo/u-boot

