19082eeacSAndy Fleming /* 29082eeacSAndy Fleming * Marvell PHY drivers 39082eeacSAndy Fleming * 41a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+ 59082eeacSAndy Fleming * 69082eeacSAndy Fleming * Copyright 2010-2011 Freescale Semiconductor, Inc. 79082eeacSAndy Fleming * author Andy Fleming 89082eeacSAndy Fleming */ 99082eeacSAndy Fleming #include <config.h> 109082eeacSAndy Fleming #include <common.h> 11fbfa1abaSSimon Glass #include <errno.h> 129082eeacSAndy Fleming #include <phy.h> 139082eeacSAndy Fleming 149082eeacSAndy Fleming #define PHY_AUTONEGOTIATE_TIMEOUT 5000 159082eeacSAndy Fleming 169082eeacSAndy Fleming /* 88E1011 PHY Status Register */ 179082eeacSAndy Fleming #define MIIM_88E1xxx_PHY_STATUS 0x11 189082eeacSAndy Fleming #define MIIM_88E1xxx_PHYSTAT_SPEED 0xc000 199082eeacSAndy Fleming #define MIIM_88E1xxx_PHYSTAT_GBIT 0x8000 209082eeacSAndy Fleming #define MIIM_88E1xxx_PHYSTAT_100 0x4000 219082eeacSAndy Fleming #define MIIM_88E1xxx_PHYSTAT_DUPLEX 0x2000 229082eeacSAndy Fleming #define MIIM_88E1xxx_PHYSTAT_SPDDONE 0x0800 239082eeacSAndy Fleming #define MIIM_88E1xxx_PHYSTAT_LINK 0x0400 249082eeacSAndy Fleming 259082eeacSAndy Fleming #define MIIM_88E1xxx_PHY_SCR 0x10 269082eeacSAndy Fleming #define MIIM_88E1xxx_PHY_MDI_X_AUTO 0x0060 279082eeacSAndy Fleming 289082eeacSAndy Fleming /* 88E1111 PHY LED Control Register */ 299082eeacSAndy Fleming #define MIIM_88E1111_PHY_LED_CONTROL 24 309082eeacSAndy Fleming #define MIIM_88E1111_PHY_LED_DIRECT 0x4100 319082eeacSAndy Fleming #define MIIM_88E1111_PHY_LED_COMBINE 0x411C 329082eeacSAndy Fleming 33fa12a08eSZang Roy-R61911 /* 88E1111 Extended PHY Specific Control Register */ 34fa12a08eSZang Roy-R61911 #define MIIM_88E1111_PHY_EXT_CR 0x14 35fa12a08eSZang Roy-R61911 #define MIIM_88E1111_RX_DELAY 0x80 36fa12a08eSZang Roy-R61911 #define MIIM_88E1111_TX_DELAY 0x2 37fa12a08eSZang Roy-R61911 38fa12a08eSZang Roy-R61911 /* 88E1111 Extended PHY Specific Status Register */ 39fa12a08eSZang Roy-R61911 #define MIIM_88E1111_PHY_EXT_SR 0x1b 40fa12a08eSZang Roy-R61911 #define MIIM_88E1111_HWCFG_MODE_MASK 0xf 41fa12a08eSZang Roy-R61911 #define MIIM_88E1111_HWCFG_MODE_COPPER_RGMII 0xb 42fa12a08eSZang Roy-R61911 #define MIIM_88E1111_HWCFG_MODE_FIBER_RGMII 0x3 43fa12a08eSZang Roy-R61911 #define MIIM_88E1111_HWCFG_MODE_SGMII_NO_CLK 0x4 44fa12a08eSZang Roy-R61911 #define MIIM_88E1111_HWCFG_MODE_COPPER_RTBI 0x9 45fa12a08eSZang Roy-R61911 #define MIIM_88E1111_HWCFG_FIBER_COPPER_AUTO 0x8000 46fa12a08eSZang Roy-R61911 #define MIIM_88E1111_HWCFG_FIBER_COPPER_RES 0x2000 47fa12a08eSZang Roy-R61911 48fa12a08eSZang Roy-R61911 #define MIIM_88E1111_COPPER 0 49fa12a08eSZang Roy-R61911 #define MIIM_88E1111_FIBER 1 50fa12a08eSZang Roy-R61911 519082eeacSAndy Fleming /* 88E1118 PHY defines */ 529082eeacSAndy Fleming #define MIIM_88E1118_PHY_PAGE 22 539082eeacSAndy Fleming #define MIIM_88E1118_PHY_LED_PAGE 3 549082eeacSAndy Fleming 559082eeacSAndy Fleming /* 88E1121 PHY LED Control Register */ 569082eeacSAndy Fleming #define MIIM_88E1121_PHY_LED_CTRL 16 579082eeacSAndy Fleming #define MIIM_88E1121_PHY_LED_PAGE 3 589082eeacSAndy Fleming #define MIIM_88E1121_PHY_LED_DEF 0x0030 599082eeacSAndy Fleming 609082eeacSAndy Fleming /* 88E1121 PHY IRQ Enable/Status Register */ 619082eeacSAndy Fleming #define MIIM_88E1121_PHY_IRQ_EN 18 629082eeacSAndy Fleming #define MIIM_88E1121_PHY_IRQ_STATUS 19 639082eeacSAndy Fleming 649082eeacSAndy Fleming #define MIIM_88E1121_PHY_PAGE 22 659082eeacSAndy Fleming 669082eeacSAndy Fleming /* 88E1145 Extended PHY Specific Control Register */ 679082eeacSAndy Fleming #define MIIM_88E1145_PHY_EXT_CR 20 689082eeacSAndy Fleming #define MIIM_M88E1145_RGMII_RX_DELAY 0x0080 699082eeacSAndy Fleming #define MIIM_M88E1145_RGMII_TX_DELAY 0x0002 709082eeacSAndy Fleming 719082eeacSAndy Fleming #define MIIM_88E1145_PHY_LED_CONTROL 24 729082eeacSAndy Fleming #define MIIM_88E1145_PHY_LED_DIRECT 0x4100 739082eeacSAndy Fleming 749082eeacSAndy Fleming #define MIIM_88E1145_PHY_PAGE 29 759082eeacSAndy Fleming #define MIIM_88E1145_PHY_CAL_OV 30 769082eeacSAndy Fleming 779082eeacSAndy Fleming #define MIIM_88E1149_PHY_PAGE 29 789082eeacSAndy Fleming 79aeceec0dSSebastian Hesselbarth /* 88E1310 PHY defines */ 80aeceec0dSSebastian Hesselbarth #define MIIM_88E1310_PHY_LED_CTRL 16 81aeceec0dSSebastian Hesselbarth #define MIIM_88E1310_PHY_IRQ_EN 18 82aeceec0dSSebastian Hesselbarth #define MIIM_88E1310_PHY_RGMII_CTRL 21 83aeceec0dSSebastian Hesselbarth #define MIIM_88E1310_PHY_PAGE 22 84aeceec0dSSebastian Hesselbarth 85*93cc2959SJoe Hershberger /* 88E151x PHY defines */ 86*93cc2959SJoe Hershberger /* Page 3 registers */ 87*93cc2959SJoe Hershberger #define MIIM_88E151x_LED_FUNC_CTRL 16 88*93cc2959SJoe Hershberger #define MIIM_88E151x_LED_FLD_SZ 4 89*93cc2959SJoe Hershberger #define MIIM_88E151x_LED0_OFFS (0 * MIIM_88E151x_LED_FLD_SZ) 90*93cc2959SJoe Hershberger #define MIIM_88E151x_LED1_OFFS (1 * MIIM_88E151x_LED_FLD_SZ) 91*93cc2959SJoe Hershberger #define MIIM_88E151x_LED0_ACT 3 92*93cc2959SJoe Hershberger #define MIIM_88E151x_LED1_100_1000_LINK 6 93*93cc2959SJoe Hershberger #define MIIM_88E151x_LED_TIMER_CTRL 18 94*93cc2959SJoe Hershberger #define MIIM_88E151x_INT_EN_OFFS 7 95*93cc2959SJoe Hershberger /* Page 18 registers */ 96*93cc2959SJoe Hershberger #define MIIM_88E151x_GENERAL_CTRL 20 97*93cc2959SJoe Hershberger #define MIIM_88E151x_MODE_SGMII 1 98*93cc2959SJoe Hershberger #define MIIM_88E151x_RESET_OFFS 15 99*93cc2959SJoe Hershberger 1009082eeacSAndy Fleming /* Marvell 88E1011S */ 1019082eeacSAndy Fleming static int m88e1011s_config(struct phy_device *phydev) 1029082eeacSAndy Fleming { 1039082eeacSAndy Fleming /* Reset and configure the PHY */ 1049082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, MII_BMCR, BMCR_RESET); 1059082eeacSAndy Fleming 1069082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, 0x1d, 0x1f); 1079082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, 0x1e, 0x200c); 1089082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, 0x1d, 0x5); 1099082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, 0x1e, 0); 1109082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, 0x1e, 0x100); 1119082eeacSAndy Fleming 1129082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, MII_BMCR, BMCR_RESET); 1139082eeacSAndy Fleming 1149082eeacSAndy Fleming genphy_config_aneg(phydev); 1159082eeacSAndy Fleming 1169082eeacSAndy Fleming return 0; 1179082eeacSAndy Fleming } 1189082eeacSAndy Fleming 1199082eeacSAndy Fleming /* Parse the 88E1011's status register for speed and duplex 1209082eeacSAndy Fleming * information 1219082eeacSAndy Fleming */ 122ef5e821bSMichal Simek static int m88e1xxx_parse_status(struct phy_device *phydev) 1239082eeacSAndy Fleming { 1249082eeacSAndy Fleming unsigned int speed; 1259082eeacSAndy Fleming unsigned int mii_reg; 1269082eeacSAndy Fleming 1279082eeacSAndy Fleming mii_reg = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_88E1xxx_PHY_STATUS); 1289082eeacSAndy Fleming 1299082eeacSAndy Fleming if ((mii_reg & MIIM_88E1xxx_PHYSTAT_LINK) && 1309082eeacSAndy Fleming !(mii_reg & MIIM_88E1xxx_PHYSTAT_SPDDONE)) { 1319082eeacSAndy Fleming int i = 0; 1329082eeacSAndy Fleming 1339082eeacSAndy Fleming puts("Waiting for PHY realtime link"); 1349082eeacSAndy Fleming while (!(mii_reg & MIIM_88E1xxx_PHYSTAT_SPDDONE)) { 1359082eeacSAndy Fleming /* Timeout reached ? */ 1369082eeacSAndy Fleming if (i > PHY_AUTONEGOTIATE_TIMEOUT) { 1379082eeacSAndy Fleming puts(" TIMEOUT !\n"); 1389082eeacSAndy Fleming phydev->link = 0; 139ef5e821bSMichal Simek return -ETIMEDOUT; 1409082eeacSAndy Fleming } 1419082eeacSAndy Fleming 1429082eeacSAndy Fleming if ((i++ % 1000) == 0) 1439082eeacSAndy Fleming putc('.'); 1449082eeacSAndy Fleming udelay(1000); 1459082eeacSAndy Fleming mii_reg = phy_read(phydev, MDIO_DEVAD_NONE, 1469082eeacSAndy Fleming MIIM_88E1xxx_PHY_STATUS); 1479082eeacSAndy Fleming } 1489082eeacSAndy Fleming puts(" done\n"); 1499082eeacSAndy Fleming udelay(500000); /* another 500 ms (results in faster booting) */ 1509082eeacSAndy Fleming } else { 1519082eeacSAndy Fleming if (mii_reg & MIIM_88E1xxx_PHYSTAT_LINK) 1529082eeacSAndy Fleming phydev->link = 1; 1539082eeacSAndy Fleming else 1549082eeacSAndy Fleming phydev->link = 0; 1559082eeacSAndy Fleming } 1569082eeacSAndy Fleming 1579082eeacSAndy Fleming if (mii_reg & MIIM_88E1xxx_PHYSTAT_DUPLEX) 1589082eeacSAndy Fleming phydev->duplex = DUPLEX_FULL; 1599082eeacSAndy Fleming else 1609082eeacSAndy Fleming phydev->duplex = DUPLEX_HALF; 1619082eeacSAndy Fleming 1629082eeacSAndy Fleming speed = mii_reg & MIIM_88E1xxx_PHYSTAT_SPEED; 1639082eeacSAndy Fleming 1649082eeacSAndy Fleming switch (speed) { 1659082eeacSAndy Fleming case MIIM_88E1xxx_PHYSTAT_GBIT: 1669082eeacSAndy Fleming phydev->speed = SPEED_1000; 1679082eeacSAndy Fleming break; 1689082eeacSAndy Fleming case MIIM_88E1xxx_PHYSTAT_100: 1699082eeacSAndy Fleming phydev->speed = SPEED_100; 1709082eeacSAndy Fleming break; 1719082eeacSAndy Fleming default: 1729082eeacSAndy Fleming phydev->speed = SPEED_10; 1739082eeacSAndy Fleming break; 1749082eeacSAndy Fleming } 1759082eeacSAndy Fleming 1769082eeacSAndy Fleming return 0; 1779082eeacSAndy Fleming } 1789082eeacSAndy Fleming 1799082eeacSAndy Fleming static int m88e1011s_startup(struct phy_device *phydev) 1809082eeacSAndy Fleming { 181b733c278SMichal Simek int ret; 1829082eeacSAndy Fleming 183b733c278SMichal Simek ret = genphy_update_link(phydev); 184b733c278SMichal Simek if (ret) 185b733c278SMichal Simek return ret; 186b733c278SMichal Simek 187b733c278SMichal Simek return m88e1xxx_parse_status(phydev); 1889082eeacSAndy Fleming } 1899082eeacSAndy Fleming 1909082eeacSAndy Fleming /* Marvell 88E1111S */ 1919082eeacSAndy Fleming static int m88e1111s_config(struct phy_device *phydev) 1929082eeacSAndy Fleming { 1939082eeacSAndy Fleming int reg; 1949082eeacSAndy Fleming 19524d98cb4SPhil Edworthy if (phy_interface_is_rgmii(phydev)) { 196fa12a08eSZang Roy-R61911 reg = phy_read(phydev, 197fa12a08eSZang Roy-R61911 MDIO_DEVAD_NONE, MIIM_88E1111_PHY_EXT_CR); 198fa12a08eSZang Roy-R61911 if ((phydev->interface == PHY_INTERFACE_MODE_RGMII) || 199fa12a08eSZang Roy-R61911 (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID)) { 200fa12a08eSZang Roy-R61911 reg |= (MIIM_88E1111_RX_DELAY | MIIM_88E1111_TX_DELAY); 201fa12a08eSZang Roy-R61911 } else if (phydev->interface == PHY_INTERFACE_MODE_RGMII_RXID) { 202fa12a08eSZang Roy-R61911 reg &= ~MIIM_88E1111_TX_DELAY; 203fa12a08eSZang Roy-R61911 reg |= MIIM_88E1111_RX_DELAY; 204fa12a08eSZang Roy-R61911 } else if (phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID) { 205fa12a08eSZang Roy-R61911 reg &= ~MIIM_88E1111_RX_DELAY; 206fa12a08eSZang Roy-R61911 reg |= MIIM_88E1111_TX_DELAY; 2079082eeacSAndy Fleming } 2089082eeacSAndy Fleming 209fa12a08eSZang Roy-R61911 phy_write(phydev, 210fa12a08eSZang Roy-R61911 MDIO_DEVAD_NONE, MIIM_88E1111_PHY_EXT_CR, reg); 211fa12a08eSZang Roy-R61911 212fa12a08eSZang Roy-R61911 reg = phy_read(phydev, 213fa12a08eSZang Roy-R61911 MDIO_DEVAD_NONE, MIIM_88E1111_PHY_EXT_SR); 214fa12a08eSZang Roy-R61911 215fa12a08eSZang Roy-R61911 reg &= ~(MIIM_88E1111_HWCFG_MODE_MASK); 216fa12a08eSZang Roy-R61911 217fa12a08eSZang Roy-R61911 if (reg & MIIM_88E1111_HWCFG_FIBER_COPPER_RES) 218fa12a08eSZang Roy-R61911 reg |= MIIM_88E1111_HWCFG_MODE_FIBER_RGMII; 219fa12a08eSZang Roy-R61911 else 220fa12a08eSZang Roy-R61911 reg |= MIIM_88E1111_HWCFG_MODE_COPPER_RGMII; 221fa12a08eSZang Roy-R61911 222fa12a08eSZang Roy-R61911 phy_write(phydev, 223fa12a08eSZang Roy-R61911 MDIO_DEVAD_NONE, MIIM_88E1111_PHY_EXT_SR, reg); 224fa12a08eSZang Roy-R61911 } 225fa12a08eSZang Roy-R61911 226fa12a08eSZang Roy-R61911 if (phydev->interface == PHY_INTERFACE_MODE_SGMII) { 227fa12a08eSZang Roy-R61911 reg = phy_read(phydev, 228fa12a08eSZang Roy-R61911 MDIO_DEVAD_NONE, MIIM_88E1111_PHY_EXT_SR); 229fa12a08eSZang Roy-R61911 230fa12a08eSZang Roy-R61911 reg &= ~(MIIM_88E1111_HWCFG_MODE_MASK); 231fa12a08eSZang Roy-R61911 reg |= MIIM_88E1111_HWCFG_MODE_SGMII_NO_CLK; 232fa12a08eSZang Roy-R61911 reg |= MIIM_88E1111_HWCFG_FIBER_COPPER_AUTO; 233fa12a08eSZang Roy-R61911 234fa12a08eSZang Roy-R61911 phy_write(phydev, MDIO_DEVAD_NONE, 235fa12a08eSZang Roy-R61911 MIIM_88E1111_PHY_EXT_SR, reg); 236fa12a08eSZang Roy-R61911 } 237fa12a08eSZang Roy-R61911 238fa12a08eSZang Roy-R61911 if (phydev->interface == PHY_INTERFACE_MODE_RTBI) { 239fa12a08eSZang Roy-R61911 reg = phy_read(phydev, 240fa12a08eSZang Roy-R61911 MDIO_DEVAD_NONE, MIIM_88E1111_PHY_EXT_CR); 241fa12a08eSZang Roy-R61911 reg |= (MIIM_88E1111_RX_DELAY | MIIM_88E1111_TX_DELAY); 242fa12a08eSZang Roy-R61911 phy_write(phydev, 243fa12a08eSZang Roy-R61911 MDIO_DEVAD_NONE, MIIM_88E1111_PHY_EXT_CR, reg); 244fa12a08eSZang Roy-R61911 245fa12a08eSZang Roy-R61911 reg = phy_read(phydev, MDIO_DEVAD_NONE, 246fa12a08eSZang Roy-R61911 MIIM_88E1111_PHY_EXT_SR); 247fa12a08eSZang Roy-R61911 reg &= ~(MIIM_88E1111_HWCFG_MODE_MASK | 248fa12a08eSZang Roy-R61911 MIIM_88E1111_HWCFG_FIBER_COPPER_RES); 249fa12a08eSZang Roy-R61911 reg |= 0x7 | MIIM_88E1111_HWCFG_FIBER_COPPER_AUTO; 250fa12a08eSZang Roy-R61911 phy_write(phydev, MDIO_DEVAD_NONE, 251fa12a08eSZang Roy-R61911 MIIM_88E1111_PHY_EXT_SR, reg); 252fa12a08eSZang Roy-R61911 253fa12a08eSZang Roy-R61911 /* soft reset */ 2543089c47dSStefan Roese phy_reset(phydev); 255fa12a08eSZang Roy-R61911 256fa12a08eSZang Roy-R61911 reg = phy_read(phydev, MDIO_DEVAD_NONE, 257fa12a08eSZang Roy-R61911 MIIM_88E1111_PHY_EXT_SR); 258fa12a08eSZang Roy-R61911 reg &= ~(MIIM_88E1111_HWCFG_MODE_MASK | 259fa12a08eSZang Roy-R61911 MIIM_88E1111_HWCFG_FIBER_COPPER_RES); 260fa12a08eSZang Roy-R61911 reg |= MIIM_88E1111_HWCFG_MODE_COPPER_RTBI | 261fa12a08eSZang Roy-R61911 MIIM_88E1111_HWCFG_FIBER_COPPER_AUTO; 262fa12a08eSZang Roy-R61911 phy_write(phydev, MDIO_DEVAD_NONE, 263fa12a08eSZang Roy-R61911 MIIM_88E1111_PHY_EXT_SR, reg); 264fa12a08eSZang Roy-R61911 } 265fa12a08eSZang Roy-R61911 266fa12a08eSZang Roy-R61911 /* soft reset */ 2673089c47dSStefan Roese phy_reset(phydev); 2689082eeacSAndy Fleming 2699082eeacSAndy Fleming genphy_config_aneg(phydev); 270a8c3eca4SStefan Roese genphy_restart_aneg(phydev); 2719082eeacSAndy Fleming 2729082eeacSAndy Fleming return 0; 2739082eeacSAndy Fleming } 2749082eeacSAndy Fleming 27535fa0ddaSHao Zhang /** 27635fa0ddaSHao Zhang * m88e1518_phy_writebits - write bits to a register 27735fa0ddaSHao Zhang */ 27835fa0ddaSHao Zhang void m88e1518_phy_writebits(struct phy_device *phydev, 27935fa0ddaSHao Zhang u8 reg_num, u16 offset, u16 len, u16 data) 28035fa0ddaSHao Zhang { 28135fa0ddaSHao Zhang u16 reg, mask; 28235fa0ddaSHao Zhang 28335fa0ddaSHao Zhang if ((len + offset) >= 16) 28435fa0ddaSHao Zhang mask = 0 - (1 << offset); 28535fa0ddaSHao Zhang else 28635fa0ddaSHao Zhang mask = (1 << (len + offset)) - (1 << offset); 28735fa0ddaSHao Zhang 28835fa0ddaSHao Zhang reg = phy_read(phydev, MDIO_DEVAD_NONE, reg_num); 28935fa0ddaSHao Zhang 29035fa0ddaSHao Zhang reg &= ~mask; 29135fa0ddaSHao Zhang reg |= data << offset; 29235fa0ddaSHao Zhang 29335fa0ddaSHao Zhang phy_write(phydev, MDIO_DEVAD_NONE, reg_num, reg); 29435fa0ddaSHao Zhang } 29535fa0ddaSHao Zhang 29635fa0ddaSHao Zhang static int m88e1518_config(struct phy_device *phydev) 29735fa0ddaSHao Zhang { 29835fa0ddaSHao Zhang /* 29935fa0ddaSHao Zhang * As per Marvell Release Notes - Alaska 88E1510/88E1518/88E1512 30035fa0ddaSHao Zhang * /88E1514 Rev A0, Errata Section 3.1 30135fa0ddaSHao Zhang */ 30290a94ef6SClemens Gruber 30390a94ef6SClemens Gruber /* EEE initialization */ 304*93cc2959SJoe Hershberger phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1118_PHY_PAGE, 0x00ff); 30535fa0ddaSHao Zhang phy_write(phydev, MDIO_DEVAD_NONE, 17, 0x214B); 30635fa0ddaSHao Zhang phy_write(phydev, MDIO_DEVAD_NONE, 16, 0x2144); 30735fa0ddaSHao Zhang phy_write(phydev, MDIO_DEVAD_NONE, 17, 0x0C28); 30835fa0ddaSHao Zhang phy_write(phydev, MDIO_DEVAD_NONE, 16, 0x2146); 30935fa0ddaSHao Zhang phy_write(phydev, MDIO_DEVAD_NONE, 17, 0xB233); 31035fa0ddaSHao Zhang phy_write(phydev, MDIO_DEVAD_NONE, 16, 0x214D); 31135fa0ddaSHao Zhang phy_write(phydev, MDIO_DEVAD_NONE, 17, 0xCC0C); 31235fa0ddaSHao Zhang phy_write(phydev, MDIO_DEVAD_NONE, 16, 0x2159); 313*93cc2959SJoe Hershberger phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1118_PHY_PAGE, 0x0000); 31490a94ef6SClemens Gruber 31590a94ef6SClemens Gruber /* SGMII-to-Copper mode initialization */ 31690a94ef6SClemens Gruber if (phydev->interface == PHY_INTERFACE_MODE_SGMII) { 31790a94ef6SClemens Gruber /* Select page 18 */ 318*93cc2959SJoe Hershberger phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1118_PHY_PAGE, 18); 31990a94ef6SClemens Gruber 32090a94ef6SClemens Gruber /* In reg 20, write MODE[2:0] = 0x1 (SGMII to Copper) */ 321*93cc2959SJoe Hershberger m88e1518_phy_writebits(phydev, MIIM_88E151x_GENERAL_CTRL, 322*93cc2959SJoe Hershberger 0, 3, MIIM_88E151x_MODE_SGMII); 32335fa0ddaSHao Zhang 32490a94ef6SClemens Gruber /* PHY reset is necessary after changing MODE[2:0] */ 325*93cc2959SJoe Hershberger m88e1518_phy_writebits(phydev, MIIM_88E151x_GENERAL_CTRL, 326*93cc2959SJoe Hershberger MIIM_88E151x_RESET_OFFS, 1, 1); 32790a94ef6SClemens Gruber 32890a94ef6SClemens Gruber /* Reset page selection */ 329*93cc2959SJoe Hershberger phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1118_PHY_PAGE, 0); 33090a94ef6SClemens Gruber 33135fa0ddaSHao Zhang udelay(100); 33235fa0ddaSHao Zhang } 33335fa0ddaSHao Zhang 33435fa0ddaSHao Zhang return m88e1111s_config(phydev); 33535fa0ddaSHao Zhang } 33635fa0ddaSHao Zhang 3378396d0abSClemens Gruber /* Marvell 88E1510 */ 3388396d0abSClemens Gruber static int m88e1510_config(struct phy_device *phydev) 3398396d0abSClemens Gruber { 3408396d0abSClemens Gruber /* Select page 3 */ 341*93cc2959SJoe Hershberger phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1118_PHY_PAGE, 342*93cc2959SJoe Hershberger MIIM_88E1118_PHY_LED_PAGE); 3438396d0abSClemens Gruber 3448396d0abSClemens Gruber /* Enable INTn output on LED[2] */ 345*93cc2959SJoe Hershberger m88e1518_phy_writebits(phydev, MIIM_88E151x_LED_TIMER_CTRL, 346*93cc2959SJoe Hershberger MIIM_88E151x_INT_EN_OFFS, 1, 1); 3478396d0abSClemens Gruber 3488396d0abSClemens Gruber /* Configure LEDs */ 349*93cc2959SJoe Hershberger /* LED[0]:0011 (ACT) */ 350*93cc2959SJoe Hershberger m88e1518_phy_writebits(phydev, MIIM_88E151x_LED_FUNC_CTRL, 351*93cc2959SJoe Hershberger MIIM_88E151x_LED0_OFFS, MIIM_88E151x_LED_FLD_SZ, 352*93cc2959SJoe Hershberger MIIM_88E151x_LED0_ACT); 353*93cc2959SJoe Hershberger /* LED[1]:0110 (LINK 100/1000 Mbps) */ 354*93cc2959SJoe Hershberger m88e1518_phy_writebits(phydev, MIIM_88E151x_LED_FUNC_CTRL, 355*93cc2959SJoe Hershberger MIIM_88E151x_LED1_OFFS, MIIM_88E151x_LED_FLD_SZ, 356*93cc2959SJoe Hershberger MIIM_88E151x_LED1_100_1000_LINK); 3578396d0abSClemens Gruber 3588396d0abSClemens Gruber /* Reset page selection */ 359*93cc2959SJoe Hershberger phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1118_PHY_PAGE, 0); 3608396d0abSClemens Gruber 3618396d0abSClemens Gruber return m88e1518_config(phydev); 3628396d0abSClemens Gruber } 3638396d0abSClemens Gruber 3649082eeacSAndy Fleming /* Marvell 88E1118 */ 3659082eeacSAndy Fleming static int m88e1118_config(struct phy_device *phydev) 3669082eeacSAndy Fleming { 3679082eeacSAndy Fleming /* Change Page Number */ 3689082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1118_PHY_PAGE, 0x0002); 3699082eeacSAndy Fleming /* Delay RGMII TX and RX */ 3709082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, 0x15, 0x1070); 3719082eeacSAndy Fleming /* Change Page Number */ 3729082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1118_PHY_PAGE, 0x0003); 3739082eeacSAndy Fleming /* Adjust LED control */ 3749082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, 0x10, 0x021e); 3759082eeacSAndy Fleming /* Change Page Number */ 3769082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1118_PHY_PAGE, 0x0000); 3779082eeacSAndy Fleming 3781b008fdbSMichal Simek return genphy_config_aneg(phydev); 3799082eeacSAndy Fleming } 3809082eeacSAndy Fleming 3819082eeacSAndy Fleming static int m88e1118_startup(struct phy_device *phydev) 3829082eeacSAndy Fleming { 383b733c278SMichal Simek int ret; 384b733c278SMichal Simek 3859082eeacSAndy Fleming /* Change Page Number */ 3869082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1118_PHY_PAGE, 0x0000); 3879082eeacSAndy Fleming 388b733c278SMichal Simek ret = genphy_update_link(phydev); 389b733c278SMichal Simek if (ret) 390b733c278SMichal Simek return ret; 3919082eeacSAndy Fleming 392b733c278SMichal Simek return m88e1xxx_parse_status(phydev); 3939082eeacSAndy Fleming } 3949082eeacSAndy Fleming 3959082eeacSAndy Fleming /* Marvell 88E1121R */ 3969082eeacSAndy Fleming static int m88e1121_config(struct phy_device *phydev) 3979082eeacSAndy Fleming { 3989082eeacSAndy Fleming int pg; 3999082eeacSAndy Fleming 4009082eeacSAndy Fleming /* Configure the PHY */ 4019082eeacSAndy Fleming genphy_config_aneg(phydev); 4029082eeacSAndy Fleming 4039082eeacSAndy Fleming /* Switch the page to access the led register */ 4049082eeacSAndy Fleming pg = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_88E1121_PHY_PAGE); 4059082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1121_PHY_PAGE, 4069082eeacSAndy Fleming MIIM_88E1121_PHY_LED_PAGE); 4079082eeacSAndy Fleming /* Configure leds */ 4089082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1121_PHY_LED_CTRL, 4099082eeacSAndy Fleming MIIM_88E1121_PHY_LED_DEF); 4109082eeacSAndy Fleming /* Restore the page pointer */ 4119082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1121_PHY_PAGE, pg); 4129082eeacSAndy Fleming 4139082eeacSAndy Fleming /* Disable IRQs and de-assert interrupt */ 4149082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1121_PHY_IRQ_EN, 0); 4159082eeacSAndy Fleming phy_read(phydev, MDIO_DEVAD_NONE, MIIM_88E1121_PHY_IRQ_STATUS); 4169082eeacSAndy Fleming 4179082eeacSAndy Fleming return 0; 4189082eeacSAndy Fleming } 4199082eeacSAndy Fleming 4209082eeacSAndy Fleming /* Marvell 88E1145 */ 4219082eeacSAndy Fleming static int m88e1145_config(struct phy_device *phydev) 4229082eeacSAndy Fleming { 4239082eeacSAndy Fleming int reg; 4249082eeacSAndy Fleming 4259082eeacSAndy Fleming /* Errata E0, E1 */ 4269082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1145_PHY_PAGE, 0x001b); 4279082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1145_PHY_CAL_OV, 0x418f); 4289082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1145_PHY_PAGE, 0x0016); 4299082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1145_PHY_CAL_OV, 0xa2da); 4309082eeacSAndy Fleming 4319082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1xxx_PHY_SCR, 4329082eeacSAndy Fleming MIIM_88E1xxx_PHY_MDI_X_AUTO); 4339082eeacSAndy Fleming 4349082eeacSAndy Fleming reg = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_88E1145_PHY_EXT_CR); 4359082eeacSAndy Fleming if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID) 4369082eeacSAndy Fleming reg |= MIIM_M88E1145_RGMII_RX_DELAY | 4379082eeacSAndy Fleming MIIM_M88E1145_RGMII_TX_DELAY; 4389082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1145_PHY_EXT_CR, reg); 4399082eeacSAndy Fleming 4409082eeacSAndy Fleming genphy_config_aneg(phydev); 4419082eeacSAndy Fleming 4429082eeacSAndy Fleming phy_reset(phydev); 4439082eeacSAndy Fleming 4449082eeacSAndy Fleming return 0; 4459082eeacSAndy Fleming } 4469082eeacSAndy Fleming 4479082eeacSAndy Fleming static int m88e1145_startup(struct phy_device *phydev) 4489082eeacSAndy Fleming { 449b733c278SMichal Simek int ret; 450b733c278SMichal Simek 451b733c278SMichal Simek ret = genphy_update_link(phydev); 452b733c278SMichal Simek if (ret) 453b733c278SMichal Simek return ret; 454b733c278SMichal Simek 4559082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1145_PHY_LED_CONTROL, 4569082eeacSAndy Fleming MIIM_88E1145_PHY_LED_DIRECT); 457b733c278SMichal Simek return m88e1xxx_parse_status(phydev); 4589082eeacSAndy Fleming } 4599082eeacSAndy Fleming 4609082eeacSAndy Fleming /* Marvell 88E1149S */ 4619082eeacSAndy Fleming static int m88e1149_config(struct phy_device *phydev) 4629082eeacSAndy Fleming { 4639082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1149_PHY_PAGE, 0x1f); 4649082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, 0x1e, 0x200c); 4659082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1149_PHY_PAGE, 0x5); 4669082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, 0x1e, 0x0); 4679082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, 0x1e, 0x100); 4689082eeacSAndy Fleming 4699082eeacSAndy Fleming genphy_config_aneg(phydev); 4709082eeacSAndy Fleming 4719082eeacSAndy Fleming phy_reset(phydev); 4729082eeacSAndy Fleming 4739082eeacSAndy Fleming return 0; 4749082eeacSAndy Fleming } 4759082eeacSAndy Fleming 476aeceec0dSSebastian Hesselbarth /* Marvell 88E1310 */ 477aeceec0dSSebastian Hesselbarth static int m88e1310_config(struct phy_device *phydev) 478aeceec0dSSebastian Hesselbarth { 479aeceec0dSSebastian Hesselbarth u16 reg; 480aeceec0dSSebastian Hesselbarth 481aeceec0dSSebastian Hesselbarth /* LED link and activity */ 482aeceec0dSSebastian Hesselbarth phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1310_PHY_PAGE, 0x0003); 483aeceec0dSSebastian Hesselbarth reg = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_88E1310_PHY_LED_CTRL); 484aeceec0dSSebastian Hesselbarth reg = (reg & ~0xf) | 0x1; 485aeceec0dSSebastian Hesselbarth phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1310_PHY_LED_CTRL, reg); 486aeceec0dSSebastian Hesselbarth 487aeceec0dSSebastian Hesselbarth /* Set LED2/INT to INT mode, low active */ 488aeceec0dSSebastian Hesselbarth phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1310_PHY_PAGE, 0x0003); 489aeceec0dSSebastian Hesselbarth reg = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_88E1310_PHY_IRQ_EN); 490aeceec0dSSebastian Hesselbarth reg = (reg & 0x77ff) | 0x0880; 491aeceec0dSSebastian Hesselbarth phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1310_PHY_IRQ_EN, reg); 492aeceec0dSSebastian Hesselbarth 493aeceec0dSSebastian Hesselbarth /* Set RGMII delay */ 494aeceec0dSSebastian Hesselbarth phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1310_PHY_PAGE, 0x0002); 495aeceec0dSSebastian Hesselbarth reg = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_88E1310_PHY_RGMII_CTRL); 496aeceec0dSSebastian Hesselbarth reg |= 0x0030; 497aeceec0dSSebastian Hesselbarth phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1310_PHY_RGMII_CTRL, reg); 498aeceec0dSSebastian Hesselbarth 499aeceec0dSSebastian Hesselbarth /* Ensure to return to page 0 */ 500aeceec0dSSebastian Hesselbarth phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1310_PHY_PAGE, 0x0000); 501aeceec0dSSebastian Hesselbarth 50208e64cecSNathan Rossi return genphy_config_aneg(phydev); 503aeceec0dSSebastian Hesselbarth } 5049082eeacSAndy Fleming 505c52d428dSDirk Eibach static int m88e1680_config(struct phy_device *phydev) 506c52d428dSDirk Eibach { 507c52d428dSDirk Eibach /* 508c52d428dSDirk Eibach * As per Marvell Release Notes - Alaska V 88E1680 Rev A2 509c52d428dSDirk Eibach * Errata Section 4.1 510c52d428dSDirk Eibach */ 511c52d428dSDirk Eibach u16 reg; 512c52d428dSDirk Eibach int res; 513c52d428dSDirk Eibach 514c52d428dSDirk Eibach /* Matrix LED mode (not neede if single LED mode is used */ 515c52d428dSDirk Eibach phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1118_PHY_PAGE, 0x0004); 516c52d428dSDirk Eibach reg = phy_read(phydev, MDIO_DEVAD_NONE, 27); 517c52d428dSDirk Eibach reg |= (1 << 5); 518c52d428dSDirk Eibach phy_write(phydev, MDIO_DEVAD_NONE, 27, reg); 519c52d428dSDirk Eibach 520c52d428dSDirk Eibach /* QSGMII TX amplitude change */ 521c52d428dSDirk Eibach phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1118_PHY_PAGE, 0x00fd); 522c52d428dSDirk Eibach phy_write(phydev, MDIO_DEVAD_NONE, 8, 0x0b53); 523c52d428dSDirk Eibach phy_write(phydev, MDIO_DEVAD_NONE, 7, 0x200d); 524c52d428dSDirk Eibach phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1118_PHY_PAGE, 0x0000); 525c52d428dSDirk Eibach 526c52d428dSDirk Eibach /* EEE initialization */ 527c52d428dSDirk Eibach phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1118_PHY_PAGE, 0x00ff); 528c52d428dSDirk Eibach phy_write(phydev, MDIO_DEVAD_NONE, 17, 0xb030); 529c52d428dSDirk Eibach phy_write(phydev, MDIO_DEVAD_NONE, 16, 0x215c); 530c52d428dSDirk Eibach phy_write(phydev, MDIO_DEVAD_NONE, 22, 0x00fc); 531c52d428dSDirk Eibach phy_write(phydev, MDIO_DEVAD_NONE, 24, 0x888c); 532c52d428dSDirk Eibach phy_write(phydev, MDIO_DEVAD_NONE, 25, 0x888c); 533c52d428dSDirk Eibach phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1118_PHY_PAGE, 0x0000); 534c52d428dSDirk Eibach phy_write(phydev, MDIO_DEVAD_NONE, 0, 0x9140); 535c52d428dSDirk Eibach 536c52d428dSDirk Eibach res = genphy_config_aneg(phydev); 537c52d428dSDirk Eibach if (res < 0) 538c52d428dSDirk Eibach return res; 539c52d428dSDirk Eibach 540c52d428dSDirk Eibach /* soft reset */ 541c52d428dSDirk Eibach reg = phy_read(phydev, MDIO_DEVAD_NONE, MII_BMCR); 542c52d428dSDirk Eibach reg |= BMCR_RESET; 543c52d428dSDirk Eibach phy_write(phydev, MDIO_DEVAD_NONE, MII_BMCR, reg); 544c52d428dSDirk Eibach 545c52d428dSDirk Eibach return 0; 546c52d428dSDirk Eibach } 547c52d428dSDirk Eibach 5489082eeacSAndy Fleming static struct phy_driver M88E1011S_driver = { 5499082eeacSAndy Fleming .name = "Marvell 88E1011S", 5509082eeacSAndy Fleming .uid = 0x1410c60, 5519082eeacSAndy Fleming .mask = 0xffffff0, 5529082eeacSAndy Fleming .features = PHY_GBIT_FEATURES, 5539082eeacSAndy Fleming .config = &m88e1011s_config, 5549082eeacSAndy Fleming .startup = &m88e1011s_startup, 5559082eeacSAndy Fleming .shutdown = &genphy_shutdown, 5569082eeacSAndy Fleming }; 5579082eeacSAndy Fleming 5589082eeacSAndy Fleming static struct phy_driver M88E1111S_driver = { 5599082eeacSAndy Fleming .name = "Marvell 88E1111S", 5609082eeacSAndy Fleming .uid = 0x1410cc0, 5619082eeacSAndy Fleming .mask = 0xffffff0, 5629082eeacSAndy Fleming .features = PHY_GBIT_FEATURES, 5639082eeacSAndy Fleming .config = &m88e1111s_config, 5649082eeacSAndy Fleming .startup = &m88e1011s_startup, 5659082eeacSAndy Fleming .shutdown = &genphy_shutdown, 5669082eeacSAndy Fleming }; 5679082eeacSAndy Fleming 5689082eeacSAndy Fleming static struct phy_driver M88E1118_driver = { 5699082eeacSAndy Fleming .name = "Marvell 88E1118", 5709082eeacSAndy Fleming .uid = 0x1410e10, 5719082eeacSAndy Fleming .mask = 0xffffff0, 5729082eeacSAndy Fleming .features = PHY_GBIT_FEATURES, 5739082eeacSAndy Fleming .config = &m88e1118_config, 5749082eeacSAndy Fleming .startup = &m88e1118_startup, 5759082eeacSAndy Fleming .shutdown = &genphy_shutdown, 5769082eeacSAndy Fleming }; 5779082eeacSAndy Fleming 578b4b81e83SMichal Simek static struct phy_driver M88E1118R_driver = { 579b4b81e83SMichal Simek .name = "Marvell 88E1118R", 580b4b81e83SMichal Simek .uid = 0x1410e40, 581b4b81e83SMichal Simek .mask = 0xffffff0, 582b4b81e83SMichal Simek .features = PHY_GBIT_FEATURES, 583b4b81e83SMichal Simek .config = &m88e1118_config, 584b4b81e83SMichal Simek .startup = &m88e1118_startup, 585b4b81e83SMichal Simek .shutdown = &genphy_shutdown, 586b4b81e83SMichal Simek }; 587b4b81e83SMichal Simek 5889082eeacSAndy Fleming static struct phy_driver M88E1121R_driver = { 5899082eeacSAndy Fleming .name = "Marvell 88E1121R", 5909082eeacSAndy Fleming .uid = 0x1410cb0, 5919082eeacSAndy Fleming .mask = 0xffffff0, 5929082eeacSAndy Fleming .features = PHY_GBIT_FEATURES, 5939082eeacSAndy Fleming .config = &m88e1121_config, 5949082eeacSAndy Fleming .startup = &genphy_startup, 5959082eeacSAndy Fleming .shutdown = &genphy_shutdown, 5969082eeacSAndy Fleming }; 5979082eeacSAndy Fleming 5989082eeacSAndy Fleming static struct phy_driver M88E1145_driver = { 5999082eeacSAndy Fleming .name = "Marvell 88E1145", 6009082eeacSAndy Fleming .uid = 0x1410cd0, 6019082eeacSAndy Fleming .mask = 0xffffff0, 6029082eeacSAndy Fleming .features = PHY_GBIT_FEATURES, 6039082eeacSAndy Fleming .config = &m88e1145_config, 6049082eeacSAndy Fleming .startup = &m88e1145_startup, 6059082eeacSAndy Fleming .shutdown = &genphy_shutdown, 6069082eeacSAndy Fleming }; 6079082eeacSAndy Fleming 6089082eeacSAndy Fleming static struct phy_driver M88E1149S_driver = { 6099082eeacSAndy Fleming .name = "Marvell 88E1149S", 6109082eeacSAndy Fleming .uid = 0x1410ca0, 6119082eeacSAndy Fleming .mask = 0xffffff0, 6129082eeacSAndy Fleming .features = PHY_GBIT_FEATURES, 6139082eeacSAndy Fleming .config = &m88e1149_config, 6149082eeacSAndy Fleming .startup = &m88e1011s_startup, 6159082eeacSAndy Fleming .shutdown = &genphy_shutdown, 6169082eeacSAndy Fleming }; 6179082eeacSAndy Fleming 6188396d0abSClemens Gruber static struct phy_driver M88E1510_driver = { 6198396d0abSClemens Gruber .name = "Marvell 88E1510", 6208396d0abSClemens Gruber .uid = 0x1410dd0, 62183cfbeb0SPhil Edworthy .mask = 0xfffffff, 6228396d0abSClemens Gruber .features = PHY_GBIT_FEATURES, 6238396d0abSClemens Gruber .config = &m88e1510_config, 6248396d0abSClemens Gruber .startup = &m88e1011s_startup, 6258396d0abSClemens Gruber .shutdown = &genphy_shutdown, 6268396d0abSClemens Gruber }; 6278396d0abSClemens Gruber 628998640b4SPhil Edworthy /* 629998640b4SPhil Edworthy * This supports: 630998640b4SPhil Edworthy * 88E1518, uid 0x1410dd1 631998640b4SPhil Edworthy * 88E1512, uid 0x1410dd4 632998640b4SPhil Edworthy */ 6331415107eSMichal Simek static struct phy_driver M88E1518_driver = { 6341415107eSMichal Simek .name = "Marvell 88E1518", 635998640b4SPhil Edworthy .uid = 0x1410dd0, 636998640b4SPhil Edworthy .mask = 0xffffffa, 6371415107eSMichal Simek .features = PHY_GBIT_FEATURES, 63835fa0ddaSHao Zhang .config = &m88e1518_config, 6391415107eSMichal Simek .startup = &m88e1011s_startup, 6401415107eSMichal Simek .shutdown = &genphy_shutdown, 6411415107eSMichal Simek }; 6421415107eSMichal Simek 643aeceec0dSSebastian Hesselbarth static struct phy_driver M88E1310_driver = { 644aeceec0dSSebastian Hesselbarth .name = "Marvell 88E1310", 645aeceec0dSSebastian Hesselbarth .uid = 0x01410e90, 646aeceec0dSSebastian Hesselbarth .mask = 0xffffff0, 647aeceec0dSSebastian Hesselbarth .features = PHY_GBIT_FEATURES, 648aeceec0dSSebastian Hesselbarth .config = &m88e1310_config, 649aeceec0dSSebastian Hesselbarth .startup = &m88e1011s_startup, 650aeceec0dSSebastian Hesselbarth .shutdown = &genphy_shutdown, 651aeceec0dSSebastian Hesselbarth }; 652aeceec0dSSebastian Hesselbarth 653c52d428dSDirk Eibach static struct phy_driver M88E1680_driver = { 654c52d428dSDirk Eibach .name = "Marvell 88E1680", 655c52d428dSDirk Eibach .uid = 0x1410ed0, 656c52d428dSDirk Eibach .mask = 0xffffff0, 657c52d428dSDirk Eibach .features = PHY_GBIT_FEATURES, 658c52d428dSDirk Eibach .config = &m88e1680_config, 659c52d428dSDirk Eibach .startup = &genphy_startup, 660c52d428dSDirk Eibach .shutdown = &genphy_shutdown, 661c52d428dSDirk Eibach }; 662c52d428dSDirk Eibach 6639082eeacSAndy Fleming int phy_marvell_init(void) 6649082eeacSAndy Fleming { 665aeceec0dSSebastian Hesselbarth phy_register(&M88E1310_driver); 6669082eeacSAndy Fleming phy_register(&M88E1149S_driver); 6679082eeacSAndy Fleming phy_register(&M88E1145_driver); 6689082eeacSAndy Fleming phy_register(&M88E1121R_driver); 6699082eeacSAndy Fleming phy_register(&M88E1118_driver); 670b4b81e83SMichal Simek phy_register(&M88E1118R_driver); 6719082eeacSAndy Fleming phy_register(&M88E1111S_driver); 6729082eeacSAndy Fleming phy_register(&M88E1011S_driver); 6738396d0abSClemens Gruber phy_register(&M88E1510_driver); 6741415107eSMichal Simek phy_register(&M88E1518_driver); 675c52d428dSDirk Eibach phy_register(&M88E1680_driver); 6769082eeacSAndy Fleming 6779082eeacSAndy Fleming return 0; 6789082eeacSAndy Fleming } 679