Patchwork [U-Boot,V2,RESEND,06/24] SPEAr: Add interface information in initialization

login
register
mail settings
Submitter Amit Virdi
Date May 7, 2012, 7:36 a.m.
Message ID <33656c7f61e3f75a50f14c58c7ebaaaa41b8846c.1336376035.git.amit.virdi@st.com>
Download mbox | patch
Permalink /patch/157257/
State Accepted
Commit 9afc1af01f2d4b033e0da5df105b399949976a12
Delegated to: Stefan Roese
Headers show

Comments

Amit Virdi - May 7, 2012, 7:36 a.m.
From: Vipin Kumar <vipin.kumar@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.kumar@st.com>
Signed-off-by: Amit Virdi <amit.virdi@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(-)

Patch

diff --git a/board/spear/spear300/spear300.c b/board/spear/spear300/spear300.c
index 2283ad5..f809c2d 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>
@@ -64,9 +65,13 @@  void board_nand_init()
 
 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 c0e6829..8609a59 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>
@@ -68,25 +69,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 e101888..54a2e10 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,10 +32,20 @@ 
 #include <asm/arch/spr_defs.h>
 #include <asm/arch/spr_misc.h>
 
+#define PLGPIO_SEL_36	0xb3000028
+#define PLGPIO_IO_36	0xb3000038
+
 static struct nand_chip nand_chip[CONFIG_SYS_MAX_NAND_DEVICE];
 
+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);
 }
 
@@ -67,14 +78,17 @@  void board_nand_init()
 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 d18d313..814f9cc 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>
@@ -59,9 +60,16 @@  void board_nand_init()
 
 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 4724717..d1aaf0c 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);