diff options
Diffstat (limited to 'drivers/net/phy')
| -rw-r--r-- | drivers/net/phy/marvell.c | 48 | 
1 files changed, 48 insertions, 0 deletions
| diff --git a/drivers/net/phy/marvell.c b/drivers/net/phy/marvell.c index 46801c791..8397e32e1 100644 --- a/drivers/net/phy/marvell.c +++ b/drivers/net/phy/marvell.c @@ -89,6 +89,12 @@  #define MIIM_88E1149_PHY_PAGE	29 +/* 88E1310 PHY defines */ +#define MIIM_88E1310_PHY_LED_CTRL	16 +#define MIIM_88E1310_PHY_IRQ_EN		18 +#define MIIM_88E1310_PHY_RGMII_CTRL	21 +#define MIIM_88E1310_PHY_PAGE		22 +  /* Marvell 88E1011S */  static int m88e1011s_config(struct phy_device *phydev)  { @@ -394,6 +400,37 @@ static int m88e1149_config(struct phy_device *phydev)  	return 0;  } +/* Marvell 88E1310 */ +static int m88e1310_config(struct phy_device *phydev) +{ +	u16 reg; + +	/* LED link and activity */ +	phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1310_PHY_PAGE, 0x0003); +	reg = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_88E1310_PHY_LED_CTRL); +	reg = (reg & ~0xf) | 0x1; +	phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1310_PHY_LED_CTRL, reg); + +	/* Set LED2/INT to INT mode, low active */ +	phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1310_PHY_PAGE, 0x0003); +	reg = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_88E1310_PHY_IRQ_EN); +	reg = (reg & 0x77ff) | 0x0880; +	phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1310_PHY_IRQ_EN, reg); + +	/* Set RGMII delay */ +	phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1310_PHY_PAGE, 0x0002); +	reg = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_88E1310_PHY_RGMII_CTRL); +	reg |= 0x0030; +	phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1310_PHY_RGMII_CTRL, reg); + +	/* Ensure to return to page 0 */ +	phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1310_PHY_PAGE, 0x0000); + +	genphy_config_aneg(phydev); +	phy_reset(phydev); + +	return 0; +}  static struct phy_driver M88E1011S_driver = {  	.name = "Marvell 88E1011S", @@ -475,8 +512,19 @@ static struct phy_driver M88E1518_driver = {  	.shutdown = &genphy_shutdown,  }; +static struct phy_driver M88E1310_driver = { +	.name = "Marvell 88E1310", +	.uid = 0x01410e90, +	.mask = 0xffffff0, +	.features = PHY_GBIT_FEATURES, +	.config = &m88e1310_config, +	.startup = &m88e1011s_startup, +	.shutdown = &genphy_shutdown, +}; +  int phy_marvell_init(void)  { +	phy_register(&M88E1310_driver);  	phy_register(&M88E1149S_driver);  	phy_register(&M88E1145_driver);  	phy_register(&M88E1121R_driver); |