driver: net: keystone_net: add support for rgmii phy

In K2G, Ethernet doesn't support SGMII instead it support RGMII,
adding support to the driver to connect to RGMII phy.

Signed-off-by: Vitaly Andrianov <vitalya@ti.com>
Signed-off-by: Mugunthan V N <mugunthanvnm@ti.com>
Signed-off-by: Lokesh Vutla <lokeshvutla@ti.com>
This commit is contained in:
Vitaly Andrianov 2015-09-19 16:26:50 +05:30 committed by Tom Rini
parent bc3003b999
commit 4657a2d44e
2 changed files with 48 additions and 1 deletions

View file

@ -193,6 +193,11 @@ struct mac_sl_cfg {
#define SGMII_RXCFG_REG(x) (EMAC_SGMII_BASE_ADDR + SGMII_OFFSET(x) + 0x034) #define SGMII_RXCFG_REG(x) (EMAC_SGMII_BASE_ADDR + SGMII_OFFSET(x) + 0x034)
#define SGMII_AUXCFG_REG(x) (EMAC_SGMII_BASE_ADDR + SGMII_OFFSET(x) + 0x038) #define SGMII_AUXCFG_REG(x) (EMAC_SGMII_BASE_ADDR + SGMII_OFFSET(x) + 0x038)
/* RGMII */
#define RGMII_REG_STATUS_LINK BIT(0)
#define RGMII_STATUS_REG (GBETH_BASE + 0x18)
/* PSS */ /* PSS */
#ifdef CONFIG_KSNET_NETCP_V1_0 #ifdef CONFIG_KSNET_NETCP_V1_0

View file

@ -42,7 +42,9 @@ struct rx_buff_desc net_rx_buffs = {
.rx_flow = 22, .rx_flow = 22,
}; };
#ifndef CONFIG_SOC_K2G
static void keystone2_net_serdes_setup(void); static void keystone2_net_serdes_setup(void);
#endif
int keystone2_eth_read_mac_addr(struct eth_device *dev) int keystone2_eth_read_mac_addr(struct eth_device *dev)
{ {
@ -171,6 +173,37 @@ int keystone_sgmii_link_status(int port)
(status & SGMII_REG_STATUS_LINK); (status & SGMII_REG_STATUS_LINK);
} }
#ifdef CONFIG_SOC_K2G
int keystone_rgmii_config(struct phy_device *phy_dev)
{
unsigned int i, status;
i = 0;
do {
if (i > SGMII_ANEG_TIMEOUT) {
puts(" TIMEOUT !\n");
phy_dev->link = 0;
return 0;
}
if (ctrlc()) {
puts("user interrupt!\n");
phy_dev->link = 0;
return -EINTR;
}
if ((i++ % 500) == 0)
printf(".");
udelay(1000); /* 1 ms */
status = readl(RGMII_STATUS_REG);
} while (!(status & RGMII_REG_STATUS_LINK));
puts(" done\n");
return 0;
}
#else
int keystone_sgmii_config(struct phy_device *phy_dev, int port, int interface) int keystone_sgmii_config(struct phy_device *phy_dev, int port, int interface)
{ {
unsigned int i, status, mask; unsigned int i, status, mask;
@ -264,6 +297,7 @@ int keystone_sgmii_config(struct phy_device *phy_dev, int port, int interface)
return 0; return 0;
} }
#endif
int mac_sl_reset(u32 port) int mac_sl_reset(u32 port)
{ {
@ -315,7 +349,7 @@ int mac_sl_config(u_int16_t port, struct mac_sl_cfg *cfg)
writel(cfg->max_rx_len, DEVICE_EMACSL_BASE(port) + CPGMACSL_REG_MAXLEN); writel(cfg->max_rx_len, DEVICE_EMACSL_BASE(port) + CPGMACSL_REG_MAXLEN);
writel(cfg->ctl, DEVICE_EMACSL_BASE(port) + CPGMACSL_REG_CTL); writel(cfg->ctl, DEVICE_EMACSL_BASE(port) + CPGMACSL_REG_CTL);
#if defined(CONFIG_SOC_K2E) || defined(CONFIG_SOC_K2L) #ifndef CONFIG_SOC_K2HK
/* Map RX packet flow priority to 0 */ /* Map RX packet flow priority to 0 */
writel(0, DEVICE_EMACSL_BASE(port) + CPGMACSL_REG_RX_PRI_MAP); writel(0, DEVICE_EMACSL_BASE(port) + CPGMACSL_REG_RX_PRI_MAP);
#endif #endif
@ -401,8 +435,12 @@ static int keystone2_eth_open(struct eth_device *dev, bd_t *bis)
if (sys_has_mdio) if (sys_has_mdio)
keystone2_mdio_reset(mdio_bus); keystone2_mdio_reset(mdio_bus);
#ifdef CONFIG_SOC_K2G
keystone_rgmii_config(phy_dev);
#else
keystone_sgmii_config(phy_dev, eth_priv->slave_port - 1, keystone_sgmii_config(phy_dev, eth_priv->slave_port - 1,
eth_priv->sgmii_link_type); eth_priv->sgmii_link_type);
#endif
udelay(10000); udelay(10000);
@ -564,7 +602,9 @@ int keystone2_emac_initialize(struct eth_priv_t *eth_priv)
return res; return res;
} }
#ifndef CONFIG_SOC_K2G
keystone2_net_serdes_setup(); keystone2_net_serdes_setup();
#endif
/* Create phy device and bind it with driver */ /* Create phy device and bind it with driver */
#ifdef CONFIG_KSNET_MDIO_PHY_CONFIG_ENABLE #ifdef CONFIG_KSNET_MDIO_PHY_CONFIG_ENABLE
@ -589,6 +629,7 @@ struct ks2_serdes ks2_serdes_sgmii_156p25mhz = {
.loopback = 0, .loopback = 0,
}; };
#ifndef CONFIG_SOC_K2G
static void keystone2_net_serdes_setup(void) static void keystone2_net_serdes_setup(void)
{ {
ks2_serdes_init(CONFIG_KSNET_SERDES_SGMII_BASE, ks2_serdes_init(CONFIG_KSNET_SERDES_SGMII_BASE,
@ -604,3 +645,4 @@ static void keystone2_net_serdes_setup(void)
/* wait till setup */ /* wait till setup */
udelay(5000); udelay(5000);
} }
#endif