From: Vipin Kumar <vipin.ku...@st.com>

Few Designware peripheral registers need to be modified based on the
ethernet interface selected by the board. This patch supports interface
information in ethernet driver

Signed-off-by: Vipin Kumar <vipin.ku...@st.com>
Signed-off-by: Amit Virdi <amit.vi...@st.com>
---
 board/spear/spear300/spear300.c |   11 ++++++++---
 board/spear/spear310/spear310.c |   23 +++++++++++++----------
 board/spear/spear320/spear320.c |   22 ++++++++++++++++++----
 board/spear/spear600/spear600.c |   14 +++++++++++---
 drivers/net/designware.c        |   10 +++++++++-
 drivers/net/designware.h        |    1 +
 include/netdev.h                |    2 +-
 7 files changed, 61 insertions(+), 22 deletions(-)

diff --git a/board/spear/spear300/spear300.c b/board/spear/spear300/spear300.c
index 3f7ccb8..bf3bbc5 100644
--- a/board/spear/spear300/spear300.c
+++ b/board/spear/spear300/spear300.c
@@ -22,6 +22,7 @@
  */
 
 #include <common.h>
+#include <miiphy.h>
 #include <netdev.h>
 #include <nand.h>
 #include <asm/io.h>
@@ -61,9 +62,13 @@ int board_nand_init(struct nand_chip *nand)
 
 int board_eth_init(bd_t *bis)
 {
+       int ret = 0;
+
 #if defined(CONFIG_DESIGNWARE_ETH)
-       return designware_initialize(0, CONFIG_SPEAR_ETHBASE, CONFIG_DW0_PHY);
-#else
-       return -1;
+       u32 interface = PHY_INTERFACE_MODE_MII;
+       if (designware_initialize(0, CONFIG_SPEAR_ETHBASE, CONFIG_DW0_PHY,
+                               interface) >= 0)
+               ret++;
 #endif
+       return ret;
 }
diff --git a/board/spear/spear310/spear310.c b/board/spear/spear310/spear310.c
index f74bbac..107b34b 100644
--- a/board/spear/spear310/spear310.c
+++ b/board/spear/spear310/spear310.c
@@ -23,6 +23,7 @@
  */
 
 #include <common.h>
+#include <miiphy.h>
 #include <netdev.h>
 #include <nand.h>
 #include <asm/io.h>
@@ -65,25 +66,27 @@ int board_eth_init(bd_t *bis)
        int ret = 0;
 
 #if defined(CONFIG_DESIGNWARE_ETH)
-       if (designware_initialize(0, CONFIG_SPEAR_ETHBASE, CONFIG_DW0_PHY) < 0)
-               ret += -1;
+       u32 interface = PHY_INTERFACE_MODE_MII;
+       if (designware_initialize(0, CONFIG_SPEAR_ETHBASE, CONFIG_DW0_PHY,
+                               interface) >= 0)
+               ret++;
 #endif
 #if defined(CONFIG_MACB)
        if (macb_eth_initialize(0, (void *)CONFIG_SYS_MACB0_BASE,
-                               CONFIG_MACB0_PHY) < 0)
-               ret += -1;
+                               CONFIG_MACB0_PHY) >= 0)
+               ret++;
 
        if (macb_eth_initialize(1, (void *)CONFIG_SYS_MACB1_BASE,
-                               CONFIG_MACB1_PHY) < 0)
-               ret += -1;
+                               CONFIG_MACB1_PHY) >= 0)
+               ret++;
 
        if (macb_eth_initialize(2, (void *)CONFIG_SYS_MACB2_BASE,
-                               CONFIG_MACB2_PHY) < 0)
-               ret += -1;
+                               CONFIG_MACB2_PHY) >= 0)
+               ret++;
 
        if (macb_eth_initialize(3, (void *)CONFIG_SYS_MACB3_BASE,
-                               CONFIG_MACB3_PHY) < 0)
-               ret += -1;
+                               CONFIG_MACB3_PHY) >= 0)
+               ret++;
 #endif
        return ret;
 }
diff --git a/board/spear/spear320/spear320.c b/board/spear/spear320/spear320.c
index adddfd1..ffe11ad 100644
--- a/board/spear/spear320/spear320.c
+++ b/board/spear/spear320/spear320.c
@@ -23,6 +23,7 @@
  */
 
 #include <common.h>
+#include <miiphy.h>
 #include <netdev.h>
 #include <nand.h>
 #include <asm/io.h>
@@ -31,8 +32,18 @@
 #include <asm/arch/spr_defs.h>
 #include <asm/arch/spr_misc.h>
 
+#define PLGPIO_SEL_36  0xb3000028
+#define PLGPIO_IO_36   0xb3000038
+
+static void spear_phy_reset(void)
+{
+       writel(0x10, PLGPIO_IO_36);
+       writel(0x10, PLGPIO_SEL_36);
+}
+
 int board_init(void)
 {
+       spear_phy_reset();
        return spear_board_init(MACH_TYPE_SPEAR320);
 }
 
@@ -63,14 +74,17 @@ int board_nand_init(struct nand_chip *nand)
 int board_eth_init(bd_t *bis)
 {
        int ret = 0;
+
 #if defined(CONFIG_DESIGNWARE_ETH)
-       if (designware_initialize(0, CONFIG_SPEAR_ETHBASE, CONFIG_DW0_PHY) < 0)
-               ret += -1;
+       u32 interface = PHY_INTERFACE_MODE_MII;
+       if (designware_initialize(0, CONFIG_SPEAR_ETHBASE, CONFIG_DW0_PHY,
+                               interface) >= 0)
+               ret++;
 #endif
 #if defined(CONFIG_MACB)
        if (macb_eth_initialize(0, (void *)CONFIG_SYS_MACB0_BASE,
-                               CONFIG_MACB0_PHY) < 0)
-               ret += -1;
+                               CONFIG_MACB0_PHY) >= 0)
+               ret++;
 #endif
        return ret;
 }
diff --git a/board/spear/spear600/spear600.c b/board/spear/spear600/spear600.c
index 5a32b7f..f592233 100644
--- a/board/spear/spear600/spear600.c
+++ b/board/spear/spear600/spear600.c
@@ -22,6 +22,7 @@
  */
 
 #include <common.h>
+#include <miiphy.h>
 #include <netdev.h>
 #include <nand.h>
 #include <asm/io.h>
@@ -56,9 +57,16 @@ int board_nand_init(struct nand_chip *nand)
 
 int board_eth_init(bd_t *bis)
 {
+       int ret = 0;
+
 #if defined(CONFIG_DESIGNWARE_ETH)
-       return designware_initialize(0, CONFIG_SPEAR_ETHBASE, CONFIG_DW0_PHY);
-#else
-       return -1;
+       u32 interface = PHY_INTERFACE_MODE_MII;
+#if defined(CONFIG_DW_AUTONEG)
+       interface = PHY_INTERFACE_MODE_GMII;
+#endif
+       if (designware_initialize(0, CONFIG_SPEAR_ETHBASE, CONFIG_DW0_PHY,
+                               interface) >= 0)
+               ret++;
 #endif
+       return ret;
 }
diff --git a/drivers/net/designware.c b/drivers/net/designware.c
index e8e669b..e263022 100644
--- a/drivers/net/designware.c
+++ b/drivers/net/designware.c
@@ -171,6 +171,13 @@ static int dw_eth_init(struct eth_device *dev, bd_t *bis)
        if (priv->speed != SPEED_1000M)
                conf |= MII_PORTSELECT;
 
+       if ((priv->interface != PHY_INTERFACE_MODE_MII) &&
+               (priv->interface != PHY_INTERFACE_MODE_GMII)) {
+
+               if (priv->speed == SPEED_100M)
+                       conf |= FES_100;
+       }
+
        if (priv->duplex == FULL_DUPLEX)
                conf |= FULLDPLXMODE;
 
@@ -532,7 +539,7 @@ static int dw_mii_write(const char *devname, u8 addr, u8 
reg, u16 val)
 }
 #endif
 
-int designware_initialize(u32 id, ulong base_addr, u32 phy_addr)
+int designware_initialize(u32 id, ulong base_addr, u32 phy_addr, u32 interface)
 {
        struct eth_device *dev;
        struct dw_eth_dev *priv;
@@ -566,6 +573,7 @@ int designware_initialize(u32 id, ulong base_addr, u32 
phy_addr)
                        DW_DMA_BASE_OFFSET);
        priv->address = phy_addr;
        priv->phy_configured = 0;
+       priv->interface = interface;
 
        if (mac_reset(dev) < 0)
                return -1;
diff --git a/drivers/net/designware.h b/drivers/net/designware.h
index abf729d..40020bf 100644
--- a/drivers/net/designware.h
+++ b/drivers/net/designware.h
@@ -234,6 +234,7 @@ struct dmamacdescr {
 
 struct dw_eth_dev {
        u32 address;
+       u32 interface;
        u32 speed;
        u32 duplex;
        u32 tx_currdescnum;
diff --git a/include/netdev.h b/include/netdev.h
index b0c21d5..bad1eaf 100644
--- a/include/netdev.h
+++ b/include/netdev.h
@@ -52,7 +52,7 @@ int calxedaxgmac_initialize(u32 id, ulong base_addr);
 int cs8900_initialize(u8 dev_num, int base_addr);
 int davinci_emac_initialize(void);
 int dc21x4x_initialize(bd_t *bis);
-int designware_initialize(u32 id, ulong base_addr, u32 phy_addr);
+int designware_initialize(u32 id, ulong base_addr, u32 phy_addr, u32 
interface);
 int dm9000_initialize(bd_t *bis);
 int dnet_eth_initialize(int id, void *regs, unsigned int phy_addr);
 int e1000_initialize(bd_t *bis);
-- 
1.7.2.2

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to