diff options
| -rw-r--r-- | board/spear/spear300/spear300.c | 11 | ||||
| -rw-r--r-- | board/spear/spear310/spear310.c | 23 | ||||
| -rw-r--r-- | board/spear/spear320/spear320.c | 22 | ||||
| -rw-r--r-- | board/spear/spear600/spear600.c | 14 | ||||
| -rw-r--r-- | drivers/net/designware.c | 10 | ||||
| -rw-r--r-- | drivers/net/designware.h | 1 | ||||
| -rw-r--r-- | 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 2283ad5dd..f809c2dc9 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 c0e682999..8609a5910 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 e101888e0..54a2e1003 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 d18d313b2..814f9ccb6 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 9b17db41f..8f22e00dd 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 abf729d57..40020bf26 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 4724717d9..d1aaf0cd2 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); |