net: macb: Fix build error for CONFIG_DM_ETH enabled
authorWenyou Yang <wenyou.yang@atmel.com>
Tue, 17 May 2016 05:11:35 +0000 (13:11 +0800)
committerJoe Hershberger <joe.hershberger@ni.com>
Mon, 15 Aug 2016 18:34:44 +0000 (13:34 -0500)
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 <wenyou.yang@atmel.com>
Acked-by: Joe Hershberger <joe.hershberger@ni.com>
drivers/net/macb.c
include/configs/corvus.h
include/configs/smartweb.h
include/configs/snapper9g45.h
include/configs/taurus.h

index 0835fdc..e068c20 100644 (file)
@@ -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);
index e6a811a..28ea15b 100644 (file)
@@ -95,6 +95,7 @@
 
 /* Ethernet */
 #define CONFIG_MACB
+#define CONFIG_PHYLIB
 #define CONFIG_RMII
 #define CONFIG_NET_RETRY_COUNT         20
 #define CONFIG_AT91_WANTS_COMMON_PHY
index 6add391..076a5ce 100644 (file)
  *
  */
 #define CONFIG_MACB
+#define CONFIG_PHYLIB
 #define CONFIG_USB_HOST_ETHER
 #define CONFIG_USB_ETHER_ASIX
 #define CONFIG_USB_ETHER_MCS7830
index fd6c70e..c91ab71 100644 (file)
@@ -56,6 +56,7 @@
 
 /* Ethernet */
 #define CONFIG_MACB
+#define CONFIG_PHYLIB
 #define CONFIG_RMII
 #define CONFIG_NET_RETRY_COUNT         20
 #define CONFIG_RESET_PHY_R
index 882a4e5..2d091db 100644 (file)
@@ -99,6 +99,7 @@
 
 /* Ethernet */
 #define CONFIG_MACB
+#define CONFIG_PHYLIB
 #define CONFIG_RMII
 #define CONFIG_AT91_WANTS_COMMON_PHY