summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVipin Kumar <vipin.kumar@st.com>2012-05-07 13:06:44 +0530
committerAlbert ARIBAUD <albert.u.boot@aribaud.net>2012-07-07 14:07:40 +0200
commit9afc1af01f2d4b033e0da5df105b399949976a12 (patch)
treef0df7ec6f543b2c6f2d0baad645cec5f96c2c289
parent8eb0ee6a649d09a41155bf6c9dbd4d531ed41f9e (diff)
SPEAr: Add interface information in initialization
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> Signed-off-by: Stefan Roese <sr@denx.de>
-rw-r--r--board/spear/spear300/spear300.c11
-rw-r--r--board/spear/spear310/spear310.c23
-rw-r--r--board/spear/spear320/spear320.c22
-rw-r--r--board/spear/spear600/spear600.c14
-rw-r--r--drivers/net/designware.c10
-rw-r--r--drivers/net/designware.h1
-rw-r--r--include/netdev.h2
7 files changed, 61 insertions, 22 deletions
diff --git a/board/spear/spear300/spear300.c b/board/spear/spear300/spear300.c
index 2283ad5ddbc..f809c2dc917 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 c0e68299944..8609a5910f0 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 e101888e044..54a2e1003ce 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 d18d313b298..814f9ccb6b2 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 9b17db41f60..8f22e00ddd8 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;
@@ -531,7 +538,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;
@@ -565,6 +572,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 abf729d57dd..40020bf26b8 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 4724717d99a..d1aaf0cd2d0 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);