net/phy/vitesse: Rework RGMII skew configuration for VSC8601
The VSC8601 config tried to add an RGMII skew based on #defines that no config defines. That's quite an ugly way to do it. Since the skew is only needed on RGMII interfaces, check the interface mode at runtime, and apply the settings accordingly. Tested on custom board with AM3352 SOC and VSC801 PHY. Signed-off-by: Alexandru Gagniuc <alex.g@adaptrum.com> Acked-by: Joe Hershberger <joe.hershberger@ni.com>
This commit is contained in:
parent
c7ac15388e
commit
bb135a0180
|
@ -30,9 +30,8 @@
|
||||||
#define MIIM_CIS8204_SLEDCON_INIT 0x1115
|
#define MIIM_CIS8204_SLEDCON_INIT 0x1115
|
||||||
|
|
||||||
/* Vitesse VSC8601 Extended PHY Control Register 1 */
|
/* Vitesse VSC8601 Extended PHY Control Register 1 */
|
||||||
#define MIIM_VSC8601_EPHY_CON 0x17
|
#define MII_VSC8601_EPHY_CTL 0x17
|
||||||
#define MIIM_VSC8601_EPHY_CON_INIT_SKEW 0x1120
|
#define MII_VSC8601_EPHY_CTL_RGMII_SKEW (1 << 8)
|
||||||
#define MIIM_VSC8601_SKEW_CTRL 0x1c
|
|
||||||
|
|
||||||
#define PHY_EXT_PAGE_ACCESS 0x1f
|
#define PHY_EXT_PAGE_ACCESS 0x1f
|
||||||
#define PHY_EXT_PAGE_ACCESS_GENERAL 0x10
|
#define PHY_EXT_PAGE_ACCESS_GENERAL 0x10
|
||||||
|
@ -142,26 +141,32 @@ static int cis8204_config(struct phy_device *phydev)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Vitesse VSC8601 */
|
/* Vitesse VSC8601 */
|
||||||
|
/* This adds a skew for both TX and RX clocks, so the skew should only be
|
||||||
|
* applied to "rgmii-id" interfaces. It may not work as expected
|
||||||
|
* on "rgmii-txid", "rgmii-rxid" or "rgmii" interfaces. */
|
||||||
|
static int vsc8601_add_skew(struct phy_device *phydev)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = phy_read(phydev, MDIO_DEVAD_NONE, MII_VSC8601_EPHY_CTL);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
ret |= MII_VSC8601_EPHY_CTL_RGMII_SKEW;
|
||||||
|
return phy_write(phydev, MDIO_DEVAD_NONE, MII_VSC8601_EPHY_CTL, ret);
|
||||||
|
}
|
||||||
|
|
||||||
static int vsc8601_config(struct phy_device *phydev)
|
static int vsc8601_config(struct phy_device *phydev)
|
||||||
{
|
{
|
||||||
/* Configure some basic stuff */
|
int ret = 0;
|
||||||
#ifdef CONFIG_SYS_VSC8601_SKEWFIX
|
|
||||||
phy_write(phydev, MDIO_DEVAD_NONE, MIIM_VSC8601_EPHY_CON,
|
|
||||||
MIIM_VSC8601_EPHY_CON_INIT_SKEW);
|
|
||||||
#if defined(CONFIG_SYS_VSC8601_SKEW_TX) && defined(CONFIG_SYS_VSC8601_SKEW_RX)
|
|
||||||
phy_write(phydev, MDIO_DEVAD_NONE, PHY_EXT_PAGE_ACCESS, 1);
|
|
||||||
#define VSC8101_SKEW \
|
|
||||||
((CONFIG_SYS_VSC8601_SKEW_TX << 14) \
|
|
||||||
| (CONFIG_SYS_VSC8601_SKEW_RX << 12))
|
|
||||||
phy_write(phydev, MDIO_DEVAD_NONE, MIIM_VSC8601_SKEW_CTRL,
|
|
||||||
VSC8101_SKEW);
|
|
||||||
phy_write(phydev, MDIO_DEVAD_NONE, PHY_EXT_PAGE_ACCESS, 0);
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
genphy_config_aneg(phydev);
|
if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID)
|
||||||
|
ret = vsc8601_add_skew(phydev);
|
||||||
|
|
||||||
return 0;
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
return genphy_config_aneg(phydev);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int vsc8574_config(struct phy_device *phydev)
|
static int vsc8574_config(struct phy_device *phydev)
|
||||||
|
|
Loading…
Reference in New Issue