NET: phy: add 88E1310 PHY initialization
authorSebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
Tue, 4 Dec 2012 08:31:59 +0000 (09:31 +0100)
committerJoe Hershberger <joe.hershberger@ni.com>
Tue, 25 Jun 2013 00:10:14 +0000 (19:10 -0500)
This adds PHY initialization for Marvell Alaska 88E1310 PHY.

Signed-off-by: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
drivers/net/phy/marvell.c

index 46801c791903efcd36167d267a70be0b1ec978c8..8397e32e1a0f8dccecfb1c3e1f10d21103e344dc 100644 (file)
 
 #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);