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 1668e6ecadSPhil Edworthy #define MII_MARVELL_PHY_PAGE 22 1768e6ecadSPhil Edworthy 189082eeacSAndy Fleming /* 88E1011 PHY Status Register */ 199082eeacSAndy Fleming #define MIIM_88E1xxx_PHY_STATUS 0x11 209082eeacSAndy Fleming #define MIIM_88E1xxx_PHYSTAT_SPEED 0xc000 219082eeacSAndy Fleming #define MIIM_88E1xxx_PHYSTAT_GBIT 0x8000 229082eeacSAndy Fleming #define MIIM_88E1xxx_PHYSTAT_100 0x4000 239082eeacSAndy Fleming #define MIIM_88E1xxx_PHYSTAT_DUPLEX 0x2000 249082eeacSAndy Fleming #define MIIM_88E1xxx_PHYSTAT_SPDDONE 0x0800 259082eeacSAndy Fleming #define MIIM_88E1xxx_PHYSTAT_LINK 0x0400 269082eeacSAndy Fleming 279082eeacSAndy Fleming #define MIIM_88E1xxx_PHY_SCR 0x10 289082eeacSAndy Fleming #define MIIM_88E1xxx_PHY_MDI_X_AUTO 0x0060 299082eeacSAndy Fleming 309082eeacSAndy Fleming /* 88E1111 PHY LED Control Register */ 319082eeacSAndy Fleming #define MIIM_88E1111_PHY_LED_CONTROL 24 329082eeacSAndy Fleming #define MIIM_88E1111_PHY_LED_DIRECT 0x4100 339082eeacSAndy Fleming #define MIIM_88E1111_PHY_LED_COMBINE 0x411C 349082eeacSAndy Fleming 35fa12a08eSZang Roy-R61911 /* 88E1111 Extended PHY Specific Control Register */ 36fa12a08eSZang Roy-R61911 #define MIIM_88E1111_PHY_EXT_CR 0x14 37fa12a08eSZang Roy-R61911 #define MIIM_88E1111_RX_DELAY 0x80 38fa12a08eSZang Roy-R61911 #define MIIM_88E1111_TX_DELAY 0x2 39fa12a08eSZang Roy-R61911 40fa12a08eSZang Roy-R61911 /* 88E1111 Extended PHY Specific Status Register */ 41fa12a08eSZang Roy-R61911 #define MIIM_88E1111_PHY_EXT_SR 0x1b 42fa12a08eSZang Roy-R61911 #define MIIM_88E1111_HWCFG_MODE_MASK 0xf 43fa12a08eSZang Roy-R61911 #define MIIM_88E1111_HWCFG_MODE_COPPER_RGMII 0xb 44fa12a08eSZang Roy-R61911 #define MIIM_88E1111_HWCFG_MODE_FIBER_RGMII 0x3 45fa12a08eSZang Roy-R61911 #define MIIM_88E1111_HWCFG_MODE_SGMII_NO_CLK 0x4 46fa12a08eSZang Roy-R61911 #define MIIM_88E1111_HWCFG_MODE_COPPER_RTBI 0x9 47fa12a08eSZang Roy-R61911 #define MIIM_88E1111_HWCFG_FIBER_COPPER_AUTO 0x8000 48fa12a08eSZang Roy-R61911 #define MIIM_88E1111_HWCFG_FIBER_COPPER_RES 0x2000 49fa12a08eSZang Roy-R61911 50fa12a08eSZang Roy-R61911 #define MIIM_88E1111_COPPER 0 51fa12a08eSZang Roy-R61911 #define MIIM_88E1111_FIBER 1 52fa12a08eSZang Roy-R61911 539082eeacSAndy Fleming /* 88E1118 PHY defines */ 549082eeacSAndy Fleming #define MIIM_88E1118_PHY_PAGE 22 559082eeacSAndy Fleming #define MIIM_88E1118_PHY_LED_PAGE 3 569082eeacSAndy Fleming 579082eeacSAndy Fleming /* 88E1121 PHY LED Control Register */ 589082eeacSAndy Fleming #define MIIM_88E1121_PHY_LED_CTRL 16 599082eeacSAndy Fleming #define MIIM_88E1121_PHY_LED_PAGE 3 609082eeacSAndy Fleming #define MIIM_88E1121_PHY_LED_DEF 0x0030 619082eeacSAndy Fleming 629082eeacSAndy Fleming /* 88E1121 PHY IRQ Enable/Status Register */ 639082eeacSAndy Fleming #define MIIM_88E1121_PHY_IRQ_EN 18 649082eeacSAndy Fleming #define MIIM_88E1121_PHY_IRQ_STATUS 19 659082eeacSAndy Fleming 669082eeacSAndy Fleming #define MIIM_88E1121_PHY_PAGE 22 679082eeacSAndy Fleming 689082eeacSAndy Fleming /* 88E1145 Extended PHY Specific Control Register */ 699082eeacSAndy Fleming #define MIIM_88E1145_PHY_EXT_CR 20 709082eeacSAndy Fleming #define MIIM_M88E1145_RGMII_RX_DELAY 0x0080 719082eeacSAndy Fleming #define MIIM_M88E1145_RGMII_TX_DELAY 0x0002 729082eeacSAndy Fleming 739082eeacSAndy Fleming #define MIIM_88E1145_PHY_LED_CONTROL 24 749082eeacSAndy Fleming #define MIIM_88E1145_PHY_LED_DIRECT 0x4100 759082eeacSAndy Fleming 769082eeacSAndy Fleming #define MIIM_88E1145_PHY_PAGE 29 779082eeacSAndy Fleming #define MIIM_88E1145_PHY_CAL_OV 30 789082eeacSAndy Fleming 799082eeacSAndy Fleming #define MIIM_88E1149_PHY_PAGE 29 809082eeacSAndy Fleming 81aeceec0dSSebastian Hesselbarth /* 88E1310 PHY defines */ 82aeceec0dSSebastian Hesselbarth #define MIIM_88E1310_PHY_LED_CTRL 16 83aeceec0dSSebastian Hesselbarth #define MIIM_88E1310_PHY_IRQ_EN 18 84aeceec0dSSebastian Hesselbarth #define MIIM_88E1310_PHY_RGMII_CTRL 21 85aeceec0dSSebastian Hesselbarth #define MIIM_88E1310_PHY_PAGE 22 86aeceec0dSSebastian Hesselbarth 8793cc2959SJoe Hershberger /* 88E151x PHY defines */ 8868e6ecadSPhil Edworthy /* Page 2 registers */ 8968e6ecadSPhil Edworthy #define MIIM_88E151x_PHY_MSCR 21 9068e6ecadSPhil Edworthy #define MIIM_88E151x_RGMII_RX_DELAY BIT(5) 9168e6ecadSPhil Edworthy #define MIIM_88E151x_RGMII_TX_DELAY BIT(4) 9268e6ecadSPhil Edworthy #define MIIM_88E151x_RGMII_RXTX_DELAY (BIT(5) | BIT(4)) 9393cc2959SJoe Hershberger /* Page 3 registers */ 9493cc2959SJoe Hershberger #define MIIM_88E151x_LED_FUNC_CTRL 16 9593cc2959SJoe Hershberger #define MIIM_88E151x_LED_FLD_SZ 4 9693cc2959SJoe Hershberger #define MIIM_88E151x_LED0_OFFS (0 * MIIM_88E151x_LED_FLD_SZ) 9793cc2959SJoe Hershberger #define MIIM_88E151x_LED1_OFFS (1 * MIIM_88E151x_LED_FLD_SZ) 9893cc2959SJoe Hershberger #define MIIM_88E151x_LED0_ACT 3 9993cc2959SJoe Hershberger #define MIIM_88E151x_LED1_100_1000_LINK 6 10093cc2959SJoe Hershberger #define MIIM_88E151x_LED_TIMER_CTRL 18 10193cc2959SJoe Hershberger #define MIIM_88E151x_INT_EN_OFFS 7 10293cc2959SJoe Hershberger /* Page 18 registers */ 10393cc2959SJoe Hershberger #define MIIM_88E151x_GENERAL_CTRL 20 10493cc2959SJoe Hershberger #define MIIM_88E151x_MODE_SGMII 1 10593cc2959SJoe Hershberger #define MIIM_88E151x_RESET_OFFS 15 10693cc2959SJoe Hershberger 1079082eeacSAndy Fleming /* Marvell 88E1011S */ 1089082eeacSAndy Fleming static int m88e1011s_config(struct phy_device *phydev) 1099082eeacSAndy Fleming { 1109082eeacSAndy Fleming /* Reset and configure the PHY */ 1119082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, MII_BMCR, BMCR_RESET); 1129082eeacSAndy Fleming 1139082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, 0x1d, 0x1f); 1149082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, 0x1e, 0x200c); 1159082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, 0x1d, 0x5); 1169082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, 0x1e, 0); 1179082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, 0x1e, 0x100); 1189082eeacSAndy Fleming 1199082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, MII_BMCR, BMCR_RESET); 1209082eeacSAndy Fleming 1219082eeacSAndy Fleming genphy_config_aneg(phydev); 1229082eeacSAndy Fleming 1239082eeacSAndy Fleming return 0; 1249082eeacSAndy Fleming } 1259082eeacSAndy Fleming 1269082eeacSAndy Fleming /* Parse the 88E1011's status register for speed and duplex 1279082eeacSAndy Fleming * information 1289082eeacSAndy Fleming */ 129ef5e821bSMichal Simek static int m88e1xxx_parse_status(struct phy_device *phydev) 1309082eeacSAndy Fleming { 1319082eeacSAndy Fleming unsigned int speed; 1329082eeacSAndy Fleming unsigned int mii_reg; 1339082eeacSAndy Fleming 1349082eeacSAndy Fleming mii_reg = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_88E1xxx_PHY_STATUS); 1359082eeacSAndy Fleming 1369082eeacSAndy Fleming if ((mii_reg & MIIM_88E1xxx_PHYSTAT_LINK) && 1379082eeacSAndy Fleming !(mii_reg & MIIM_88E1xxx_PHYSTAT_SPDDONE)) { 1389082eeacSAndy Fleming int i = 0; 1399082eeacSAndy Fleming 1409082eeacSAndy Fleming puts("Waiting for PHY realtime link"); 1419082eeacSAndy Fleming while (!(mii_reg & MIIM_88E1xxx_PHYSTAT_SPDDONE)) { 1429082eeacSAndy Fleming /* Timeout reached ? */ 1439082eeacSAndy Fleming if (i > PHY_AUTONEGOTIATE_TIMEOUT) { 1449082eeacSAndy Fleming puts(" TIMEOUT !\n"); 1459082eeacSAndy Fleming phydev->link = 0; 146ef5e821bSMichal Simek return -ETIMEDOUT; 1479082eeacSAndy Fleming } 1489082eeacSAndy Fleming 1499082eeacSAndy Fleming if ((i++ % 1000) == 0) 1509082eeacSAndy Fleming putc('.'); 1519082eeacSAndy Fleming udelay(1000); 1529082eeacSAndy Fleming mii_reg = phy_read(phydev, MDIO_DEVAD_NONE, 1539082eeacSAndy Fleming MIIM_88E1xxx_PHY_STATUS); 1549082eeacSAndy Fleming } 1559082eeacSAndy Fleming puts(" done\n"); 1569082eeacSAndy Fleming udelay(500000); /* another 500 ms (results in faster booting) */ 1579082eeacSAndy Fleming } else { 1589082eeacSAndy Fleming if (mii_reg & MIIM_88E1xxx_PHYSTAT_LINK) 1599082eeacSAndy Fleming phydev->link = 1; 1609082eeacSAndy Fleming else 1619082eeacSAndy Fleming phydev->link = 0; 1629082eeacSAndy Fleming } 1639082eeacSAndy Fleming 1649082eeacSAndy Fleming if (mii_reg & MIIM_88E1xxx_PHYSTAT_DUPLEX) 1659082eeacSAndy Fleming phydev->duplex = DUPLEX_FULL; 1669082eeacSAndy Fleming else 1679082eeacSAndy Fleming phydev->duplex = DUPLEX_HALF; 1689082eeacSAndy Fleming 1699082eeacSAndy Fleming speed = mii_reg & MIIM_88E1xxx_PHYSTAT_SPEED; 1709082eeacSAndy Fleming 1719082eeacSAndy Fleming switch (speed) { 1729082eeacSAndy Fleming case MIIM_88E1xxx_PHYSTAT_GBIT: 1739082eeacSAndy Fleming phydev->speed = SPEED_1000; 1749082eeacSAndy Fleming break; 1759082eeacSAndy Fleming case MIIM_88E1xxx_PHYSTAT_100: 1769082eeacSAndy Fleming phydev->speed = SPEED_100; 1779082eeacSAndy Fleming break; 1789082eeacSAndy Fleming default: 1799082eeacSAndy Fleming phydev->speed = SPEED_10; 1809082eeacSAndy Fleming break; 1819082eeacSAndy Fleming } 1829082eeacSAndy Fleming 1839082eeacSAndy Fleming return 0; 1849082eeacSAndy Fleming } 1859082eeacSAndy Fleming 1869082eeacSAndy Fleming static int m88e1011s_startup(struct phy_device *phydev) 1879082eeacSAndy Fleming { 188b733c278SMichal Simek int ret; 1899082eeacSAndy Fleming 190b733c278SMichal Simek ret = genphy_update_link(phydev); 191b733c278SMichal Simek if (ret) 192b733c278SMichal Simek return ret; 193b733c278SMichal Simek 194b733c278SMichal Simek return m88e1xxx_parse_status(phydev); 1959082eeacSAndy Fleming } 1969082eeacSAndy Fleming 1979082eeacSAndy Fleming /* Marvell 88E1111S */ 1989082eeacSAndy Fleming static int m88e1111s_config(struct phy_device *phydev) 1999082eeacSAndy Fleming { 2009082eeacSAndy Fleming int reg; 2019082eeacSAndy Fleming 20224d98cb4SPhil Edworthy if (phy_interface_is_rgmii(phydev)) { 203fa12a08eSZang Roy-R61911 reg = phy_read(phydev, 204fa12a08eSZang Roy-R61911 MDIO_DEVAD_NONE, MIIM_88E1111_PHY_EXT_CR); 205fa12a08eSZang Roy-R61911 if ((phydev->interface == PHY_INTERFACE_MODE_RGMII) || 206fa12a08eSZang Roy-R61911 (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID)) { 207fa12a08eSZang Roy-R61911 reg |= (MIIM_88E1111_RX_DELAY | MIIM_88E1111_TX_DELAY); 208fa12a08eSZang Roy-R61911 } else if (phydev->interface == PHY_INTERFACE_MODE_RGMII_RXID) { 209fa12a08eSZang Roy-R61911 reg &= ~MIIM_88E1111_TX_DELAY; 210fa12a08eSZang Roy-R61911 reg |= MIIM_88E1111_RX_DELAY; 211fa12a08eSZang Roy-R61911 } else if (phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID) { 212fa12a08eSZang Roy-R61911 reg &= ~MIIM_88E1111_RX_DELAY; 213fa12a08eSZang Roy-R61911 reg |= MIIM_88E1111_TX_DELAY; 2149082eeacSAndy Fleming } 2159082eeacSAndy Fleming 216fa12a08eSZang Roy-R61911 phy_write(phydev, 217fa12a08eSZang Roy-R61911 MDIO_DEVAD_NONE, MIIM_88E1111_PHY_EXT_CR, reg); 218fa12a08eSZang Roy-R61911 219fa12a08eSZang Roy-R61911 reg = phy_read(phydev, 220fa12a08eSZang Roy-R61911 MDIO_DEVAD_NONE, MIIM_88E1111_PHY_EXT_SR); 221fa12a08eSZang Roy-R61911 222fa12a08eSZang Roy-R61911 reg &= ~(MIIM_88E1111_HWCFG_MODE_MASK); 223fa12a08eSZang Roy-R61911 224fa12a08eSZang Roy-R61911 if (reg & MIIM_88E1111_HWCFG_FIBER_COPPER_RES) 225fa12a08eSZang Roy-R61911 reg |= MIIM_88E1111_HWCFG_MODE_FIBER_RGMII; 226fa12a08eSZang Roy-R61911 else 227fa12a08eSZang Roy-R61911 reg |= MIIM_88E1111_HWCFG_MODE_COPPER_RGMII; 228fa12a08eSZang Roy-R61911 229fa12a08eSZang Roy-R61911 phy_write(phydev, 230fa12a08eSZang Roy-R61911 MDIO_DEVAD_NONE, MIIM_88E1111_PHY_EXT_SR, reg); 231fa12a08eSZang Roy-R61911 } 232fa12a08eSZang Roy-R61911 233fa12a08eSZang Roy-R61911 if (phydev->interface == PHY_INTERFACE_MODE_SGMII) { 234fa12a08eSZang Roy-R61911 reg = phy_read(phydev, 235fa12a08eSZang Roy-R61911 MDIO_DEVAD_NONE, MIIM_88E1111_PHY_EXT_SR); 236fa12a08eSZang Roy-R61911 237fa12a08eSZang Roy-R61911 reg &= ~(MIIM_88E1111_HWCFG_MODE_MASK); 238fa12a08eSZang Roy-R61911 reg |= MIIM_88E1111_HWCFG_MODE_SGMII_NO_CLK; 239fa12a08eSZang Roy-R61911 reg |= MIIM_88E1111_HWCFG_FIBER_COPPER_AUTO; 240fa12a08eSZang Roy-R61911 241fa12a08eSZang Roy-R61911 phy_write(phydev, MDIO_DEVAD_NONE, 242fa12a08eSZang Roy-R61911 MIIM_88E1111_PHY_EXT_SR, reg); 243fa12a08eSZang Roy-R61911 } 244fa12a08eSZang Roy-R61911 245fa12a08eSZang Roy-R61911 if (phydev->interface == PHY_INTERFACE_MODE_RTBI) { 246fa12a08eSZang Roy-R61911 reg = phy_read(phydev, 247fa12a08eSZang Roy-R61911 MDIO_DEVAD_NONE, MIIM_88E1111_PHY_EXT_CR); 248fa12a08eSZang Roy-R61911 reg |= (MIIM_88E1111_RX_DELAY | MIIM_88E1111_TX_DELAY); 249fa12a08eSZang Roy-R61911 phy_write(phydev, 250fa12a08eSZang Roy-R61911 MDIO_DEVAD_NONE, MIIM_88E1111_PHY_EXT_CR, reg); 251fa12a08eSZang Roy-R61911 252fa12a08eSZang Roy-R61911 reg = phy_read(phydev, MDIO_DEVAD_NONE, 253fa12a08eSZang Roy-R61911 MIIM_88E1111_PHY_EXT_SR); 254fa12a08eSZang Roy-R61911 reg &= ~(MIIM_88E1111_HWCFG_MODE_MASK | 255fa12a08eSZang Roy-R61911 MIIM_88E1111_HWCFG_FIBER_COPPER_RES); 256fa12a08eSZang Roy-R61911 reg |= 0x7 | MIIM_88E1111_HWCFG_FIBER_COPPER_AUTO; 257fa12a08eSZang Roy-R61911 phy_write(phydev, MDIO_DEVAD_NONE, 258fa12a08eSZang Roy-R61911 MIIM_88E1111_PHY_EXT_SR, reg); 259fa12a08eSZang Roy-R61911 260fa12a08eSZang Roy-R61911 /* soft reset */ 2613089c47dSStefan Roese phy_reset(phydev); 262fa12a08eSZang Roy-R61911 263fa12a08eSZang Roy-R61911 reg = phy_read(phydev, MDIO_DEVAD_NONE, 264fa12a08eSZang Roy-R61911 MIIM_88E1111_PHY_EXT_SR); 265fa12a08eSZang Roy-R61911 reg &= ~(MIIM_88E1111_HWCFG_MODE_MASK | 266fa12a08eSZang Roy-R61911 MIIM_88E1111_HWCFG_FIBER_COPPER_RES); 267fa12a08eSZang Roy-R61911 reg |= MIIM_88E1111_HWCFG_MODE_COPPER_RTBI | 268fa12a08eSZang Roy-R61911 MIIM_88E1111_HWCFG_FIBER_COPPER_AUTO; 269fa12a08eSZang Roy-R61911 phy_write(phydev, MDIO_DEVAD_NONE, 270fa12a08eSZang Roy-R61911 MIIM_88E1111_PHY_EXT_SR, reg); 271fa12a08eSZang Roy-R61911 } 272fa12a08eSZang Roy-R61911 273fa12a08eSZang Roy-R61911 /* soft reset */ 2743089c47dSStefan Roese phy_reset(phydev); 2759082eeacSAndy Fleming 2769082eeacSAndy Fleming genphy_config_aneg(phydev); 277a8c3eca4SStefan Roese genphy_restart_aneg(phydev); 2789082eeacSAndy Fleming 2799082eeacSAndy Fleming return 0; 2809082eeacSAndy Fleming } 2819082eeacSAndy Fleming 28235fa0ddaSHao Zhang /** 28335fa0ddaSHao Zhang * m88e1518_phy_writebits - write bits to a register 28435fa0ddaSHao Zhang */ 28535fa0ddaSHao Zhang void m88e1518_phy_writebits(struct phy_device *phydev, 28635fa0ddaSHao Zhang u8 reg_num, u16 offset, u16 len, u16 data) 28735fa0ddaSHao Zhang { 28835fa0ddaSHao Zhang u16 reg, mask; 28935fa0ddaSHao Zhang 29035fa0ddaSHao Zhang if ((len + offset) >= 16) 29135fa0ddaSHao Zhang mask = 0 - (1 << offset); 29235fa0ddaSHao Zhang else 29335fa0ddaSHao Zhang mask = (1 << (len + offset)) - (1 << offset); 29435fa0ddaSHao Zhang 29535fa0ddaSHao Zhang reg = phy_read(phydev, MDIO_DEVAD_NONE, reg_num); 29635fa0ddaSHao Zhang 29735fa0ddaSHao Zhang reg &= ~mask; 29835fa0ddaSHao Zhang reg |= data << offset; 29935fa0ddaSHao Zhang 30035fa0ddaSHao Zhang phy_write(phydev, MDIO_DEVAD_NONE, reg_num, reg); 30135fa0ddaSHao Zhang } 30235fa0ddaSHao Zhang 30335fa0ddaSHao Zhang static int m88e1518_config(struct phy_device *phydev) 30435fa0ddaSHao Zhang { 30568e6ecadSPhil Edworthy u16 reg; 30668e6ecadSPhil Edworthy 30735fa0ddaSHao Zhang /* 30835fa0ddaSHao Zhang * As per Marvell Release Notes - Alaska 88E1510/88E1518/88E1512 30935fa0ddaSHao Zhang * /88E1514 Rev A0, Errata Section 3.1 31035fa0ddaSHao Zhang */ 31190a94ef6SClemens Gruber 31290a94ef6SClemens Gruber /* EEE initialization */ 31393cc2959SJoe Hershberger phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1118_PHY_PAGE, 0x00ff); 31435fa0ddaSHao Zhang phy_write(phydev, MDIO_DEVAD_NONE, 17, 0x214B); 31535fa0ddaSHao Zhang phy_write(phydev, MDIO_DEVAD_NONE, 16, 0x2144); 31635fa0ddaSHao Zhang phy_write(phydev, MDIO_DEVAD_NONE, 17, 0x0C28); 31735fa0ddaSHao Zhang phy_write(phydev, MDIO_DEVAD_NONE, 16, 0x2146); 31835fa0ddaSHao Zhang phy_write(phydev, MDIO_DEVAD_NONE, 17, 0xB233); 31935fa0ddaSHao Zhang phy_write(phydev, MDIO_DEVAD_NONE, 16, 0x214D); 32035fa0ddaSHao Zhang phy_write(phydev, MDIO_DEVAD_NONE, 17, 0xCC0C); 32135fa0ddaSHao Zhang phy_write(phydev, MDIO_DEVAD_NONE, 16, 0x2159); 32293cc2959SJoe Hershberger phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1118_PHY_PAGE, 0x0000); 32390a94ef6SClemens Gruber 32490a94ef6SClemens Gruber /* SGMII-to-Copper mode initialization */ 32590a94ef6SClemens Gruber if (phydev->interface == PHY_INTERFACE_MODE_SGMII) { 32690a94ef6SClemens Gruber /* Select page 18 */ 32793cc2959SJoe Hershberger phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1118_PHY_PAGE, 18); 32890a94ef6SClemens Gruber 32990a94ef6SClemens Gruber /* In reg 20, write MODE[2:0] = 0x1 (SGMII to Copper) */ 33093cc2959SJoe Hershberger m88e1518_phy_writebits(phydev, MIIM_88E151x_GENERAL_CTRL, 33193cc2959SJoe Hershberger 0, 3, MIIM_88E151x_MODE_SGMII); 33235fa0ddaSHao Zhang 33390a94ef6SClemens Gruber /* PHY reset is necessary after changing MODE[2:0] */ 33493cc2959SJoe Hershberger m88e1518_phy_writebits(phydev, MIIM_88E151x_GENERAL_CTRL, 33593cc2959SJoe Hershberger MIIM_88E151x_RESET_OFFS, 1, 1); 33690a94ef6SClemens Gruber 33790a94ef6SClemens Gruber /* Reset page selection */ 33893cc2959SJoe Hershberger phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1118_PHY_PAGE, 0); 33990a94ef6SClemens Gruber 34035fa0ddaSHao Zhang udelay(100); 34135fa0ddaSHao Zhang } 34235fa0ddaSHao Zhang 34368e6ecadSPhil Edworthy if (phydev->interface == PHY_INTERFACE_MODE_SGMII) { 34468e6ecadSPhil Edworthy reg = phy_read(phydev, MDIO_DEVAD_NONE, 34568e6ecadSPhil Edworthy MIIM_88E1111_PHY_EXT_SR); 34668e6ecadSPhil Edworthy 34768e6ecadSPhil Edworthy reg &= ~(MIIM_88E1111_HWCFG_MODE_MASK); 34868e6ecadSPhil Edworthy reg |= MIIM_88E1111_HWCFG_MODE_SGMII_NO_CLK; 34968e6ecadSPhil Edworthy reg |= MIIM_88E1111_HWCFG_FIBER_COPPER_AUTO; 35068e6ecadSPhil Edworthy 35168e6ecadSPhil Edworthy phy_write(phydev, MDIO_DEVAD_NONE, 35268e6ecadSPhil Edworthy MIIM_88E1111_PHY_EXT_SR, reg); 35368e6ecadSPhil Edworthy } 35468e6ecadSPhil Edworthy 35568e6ecadSPhil Edworthy if (phy_interface_is_rgmii(phydev)) { 35668e6ecadSPhil Edworthy phy_write(phydev, MDIO_DEVAD_NONE, MII_MARVELL_PHY_PAGE, 2); 35768e6ecadSPhil Edworthy 35868e6ecadSPhil Edworthy reg = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_88E151x_PHY_MSCR); 35968e6ecadSPhil Edworthy reg &= ~MIIM_88E151x_RGMII_RXTX_DELAY; 36068e6ecadSPhil Edworthy if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID) 36168e6ecadSPhil Edworthy reg |= MIIM_88E151x_RGMII_RXTX_DELAY; 36268e6ecadSPhil Edworthy else if (phydev->interface == PHY_INTERFACE_MODE_RGMII_RXID) 36368e6ecadSPhil Edworthy reg |= MIIM_88E151x_RGMII_RX_DELAY; 36468e6ecadSPhil Edworthy else if (phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID) 36568e6ecadSPhil Edworthy reg |= MIIM_88E151x_RGMII_TX_DELAY; 36668e6ecadSPhil Edworthy phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E151x_PHY_MSCR, reg); 36768e6ecadSPhil Edworthy 36868e6ecadSPhil Edworthy phy_write(phydev, MDIO_DEVAD_NONE, MII_MARVELL_PHY_PAGE, 0); 36968e6ecadSPhil Edworthy } 37068e6ecadSPhil Edworthy 37168e6ecadSPhil Edworthy /* soft reset */ 37268e6ecadSPhil Edworthy phy_reset(phydev); 37368e6ecadSPhil Edworthy 37468e6ecadSPhil Edworthy genphy_config_aneg(phydev); 37568e6ecadSPhil Edworthy genphy_restart_aneg(phydev); 37668e6ecadSPhil Edworthy 37768e6ecadSPhil Edworthy return 0; 37835fa0ddaSHao Zhang } 37935fa0ddaSHao Zhang 3808396d0abSClemens Gruber /* Marvell 88E1510 */ 3818396d0abSClemens Gruber static int m88e1510_config(struct phy_device *phydev) 3828396d0abSClemens Gruber { 3838396d0abSClemens Gruber /* Select page 3 */ 38493cc2959SJoe Hershberger phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1118_PHY_PAGE, 38593cc2959SJoe Hershberger MIIM_88E1118_PHY_LED_PAGE); 3868396d0abSClemens Gruber 3878396d0abSClemens Gruber /* Enable INTn output on LED[2] */ 38893cc2959SJoe Hershberger m88e1518_phy_writebits(phydev, MIIM_88E151x_LED_TIMER_CTRL, 38993cc2959SJoe Hershberger MIIM_88E151x_INT_EN_OFFS, 1, 1); 3908396d0abSClemens Gruber 3918396d0abSClemens Gruber /* Configure LEDs */ 39293cc2959SJoe Hershberger /* LED[0]:0011 (ACT) */ 39393cc2959SJoe Hershberger m88e1518_phy_writebits(phydev, MIIM_88E151x_LED_FUNC_CTRL, 39493cc2959SJoe Hershberger MIIM_88E151x_LED0_OFFS, MIIM_88E151x_LED_FLD_SZ, 39593cc2959SJoe Hershberger MIIM_88E151x_LED0_ACT); 39693cc2959SJoe Hershberger /* LED[1]:0110 (LINK 100/1000 Mbps) */ 39793cc2959SJoe Hershberger m88e1518_phy_writebits(phydev, MIIM_88E151x_LED_FUNC_CTRL, 39893cc2959SJoe Hershberger MIIM_88E151x_LED1_OFFS, MIIM_88E151x_LED_FLD_SZ, 39993cc2959SJoe Hershberger MIIM_88E151x_LED1_100_1000_LINK); 4008396d0abSClemens Gruber 4018396d0abSClemens Gruber /* Reset page selection */ 40293cc2959SJoe Hershberger phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1118_PHY_PAGE, 0); 4038396d0abSClemens Gruber 4048396d0abSClemens Gruber return m88e1518_config(phydev); 4058396d0abSClemens Gruber } 4068396d0abSClemens Gruber 4079082eeacSAndy Fleming /* Marvell 88E1118 */ 4089082eeacSAndy Fleming static int m88e1118_config(struct phy_device *phydev) 4099082eeacSAndy Fleming { 4109082eeacSAndy Fleming /* Change Page Number */ 4119082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1118_PHY_PAGE, 0x0002); 4129082eeacSAndy Fleming /* Delay RGMII TX and RX */ 4139082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, 0x15, 0x1070); 4149082eeacSAndy Fleming /* Change Page Number */ 4159082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1118_PHY_PAGE, 0x0003); 4169082eeacSAndy Fleming /* Adjust LED control */ 4179082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, 0x10, 0x021e); 4189082eeacSAndy Fleming /* Change Page Number */ 4199082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1118_PHY_PAGE, 0x0000); 4209082eeacSAndy Fleming 4211b008fdbSMichal Simek return genphy_config_aneg(phydev); 4229082eeacSAndy Fleming } 4239082eeacSAndy Fleming 4249082eeacSAndy Fleming static int m88e1118_startup(struct phy_device *phydev) 4259082eeacSAndy Fleming { 426b733c278SMichal Simek int ret; 427b733c278SMichal Simek 4289082eeacSAndy Fleming /* Change Page Number */ 4299082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1118_PHY_PAGE, 0x0000); 4309082eeacSAndy Fleming 431b733c278SMichal Simek ret = genphy_update_link(phydev); 432b733c278SMichal Simek if (ret) 433b733c278SMichal Simek return ret; 4349082eeacSAndy Fleming 435b733c278SMichal Simek return m88e1xxx_parse_status(phydev); 4369082eeacSAndy Fleming } 4379082eeacSAndy Fleming 4389082eeacSAndy Fleming /* Marvell 88E1121R */ 4399082eeacSAndy Fleming static int m88e1121_config(struct phy_device *phydev) 4409082eeacSAndy Fleming { 4419082eeacSAndy Fleming int pg; 4429082eeacSAndy Fleming 4439082eeacSAndy Fleming /* Configure the PHY */ 4449082eeacSAndy Fleming genphy_config_aneg(phydev); 4459082eeacSAndy Fleming 4469082eeacSAndy Fleming /* Switch the page to access the led register */ 4479082eeacSAndy Fleming pg = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_88E1121_PHY_PAGE); 4489082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1121_PHY_PAGE, 4499082eeacSAndy Fleming MIIM_88E1121_PHY_LED_PAGE); 4509082eeacSAndy Fleming /* Configure leds */ 4519082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1121_PHY_LED_CTRL, 4529082eeacSAndy Fleming MIIM_88E1121_PHY_LED_DEF); 4539082eeacSAndy Fleming /* Restore the page pointer */ 4549082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1121_PHY_PAGE, pg); 4559082eeacSAndy Fleming 4569082eeacSAndy Fleming /* Disable IRQs and de-assert interrupt */ 4579082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1121_PHY_IRQ_EN, 0); 4589082eeacSAndy Fleming phy_read(phydev, MDIO_DEVAD_NONE, MIIM_88E1121_PHY_IRQ_STATUS); 4599082eeacSAndy Fleming 4609082eeacSAndy Fleming return 0; 4619082eeacSAndy Fleming } 4629082eeacSAndy Fleming 4639082eeacSAndy Fleming /* Marvell 88E1145 */ 4649082eeacSAndy Fleming static int m88e1145_config(struct phy_device *phydev) 4659082eeacSAndy Fleming { 4669082eeacSAndy Fleming int reg; 4679082eeacSAndy Fleming 4689082eeacSAndy Fleming /* Errata E0, E1 */ 4699082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1145_PHY_PAGE, 0x001b); 4709082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1145_PHY_CAL_OV, 0x418f); 4719082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1145_PHY_PAGE, 0x0016); 4729082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1145_PHY_CAL_OV, 0xa2da); 4739082eeacSAndy Fleming 4749082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1xxx_PHY_SCR, 4759082eeacSAndy Fleming MIIM_88E1xxx_PHY_MDI_X_AUTO); 4769082eeacSAndy Fleming 4779082eeacSAndy Fleming reg = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_88E1145_PHY_EXT_CR); 4789082eeacSAndy Fleming if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID) 4799082eeacSAndy Fleming reg |= MIIM_M88E1145_RGMII_RX_DELAY | 4809082eeacSAndy Fleming MIIM_M88E1145_RGMII_TX_DELAY; 4819082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1145_PHY_EXT_CR, reg); 4829082eeacSAndy Fleming 4839082eeacSAndy Fleming genphy_config_aneg(phydev); 4849082eeacSAndy Fleming 485*ef621da7SYork Sun /* soft reset */ 486*ef621da7SYork Sun reg = phy_read(phydev, MDIO_DEVAD_NONE, MII_BMCR); 487*ef621da7SYork Sun reg |= BMCR_RESET; 488*ef621da7SYork Sun phy_write(phydev, MDIO_DEVAD_NONE, MII_BMCR, reg); 4899082eeacSAndy Fleming 4909082eeacSAndy Fleming return 0; 4919082eeacSAndy Fleming } 4929082eeacSAndy Fleming 4939082eeacSAndy Fleming static int m88e1145_startup(struct phy_device *phydev) 4949082eeacSAndy Fleming { 495b733c278SMichal Simek int ret; 496b733c278SMichal Simek 497b733c278SMichal Simek ret = genphy_update_link(phydev); 498b733c278SMichal Simek if (ret) 499b733c278SMichal Simek return ret; 500b733c278SMichal Simek 5019082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1145_PHY_LED_CONTROL, 5029082eeacSAndy Fleming MIIM_88E1145_PHY_LED_DIRECT); 503b733c278SMichal Simek return m88e1xxx_parse_status(phydev); 5049082eeacSAndy Fleming } 5059082eeacSAndy Fleming 5069082eeacSAndy Fleming /* Marvell 88E1149S */ 5079082eeacSAndy Fleming static int m88e1149_config(struct phy_device *phydev) 5089082eeacSAndy Fleming { 5099082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1149_PHY_PAGE, 0x1f); 5109082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, 0x1e, 0x200c); 5119082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1149_PHY_PAGE, 0x5); 5129082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, 0x1e, 0x0); 5139082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, 0x1e, 0x100); 5149082eeacSAndy Fleming 5159082eeacSAndy Fleming genphy_config_aneg(phydev); 5169082eeacSAndy Fleming 5179082eeacSAndy Fleming phy_reset(phydev); 5189082eeacSAndy Fleming 5199082eeacSAndy Fleming return 0; 5209082eeacSAndy Fleming } 5219082eeacSAndy Fleming 522aeceec0dSSebastian Hesselbarth /* Marvell 88E1310 */ 523aeceec0dSSebastian Hesselbarth static int m88e1310_config(struct phy_device *phydev) 524aeceec0dSSebastian Hesselbarth { 525aeceec0dSSebastian Hesselbarth u16 reg; 526aeceec0dSSebastian Hesselbarth 527aeceec0dSSebastian Hesselbarth /* LED link and activity */ 528aeceec0dSSebastian Hesselbarth phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1310_PHY_PAGE, 0x0003); 529aeceec0dSSebastian Hesselbarth reg = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_88E1310_PHY_LED_CTRL); 530aeceec0dSSebastian Hesselbarth reg = (reg & ~0xf) | 0x1; 531aeceec0dSSebastian Hesselbarth phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1310_PHY_LED_CTRL, reg); 532aeceec0dSSebastian Hesselbarth 533aeceec0dSSebastian Hesselbarth /* Set LED2/INT to INT mode, low active */ 534aeceec0dSSebastian Hesselbarth phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1310_PHY_PAGE, 0x0003); 535aeceec0dSSebastian Hesselbarth reg = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_88E1310_PHY_IRQ_EN); 536aeceec0dSSebastian Hesselbarth reg = (reg & 0x77ff) | 0x0880; 537aeceec0dSSebastian Hesselbarth phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1310_PHY_IRQ_EN, reg); 538aeceec0dSSebastian Hesselbarth 539aeceec0dSSebastian Hesselbarth /* Set RGMII delay */ 540aeceec0dSSebastian Hesselbarth phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1310_PHY_PAGE, 0x0002); 541aeceec0dSSebastian Hesselbarth reg = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_88E1310_PHY_RGMII_CTRL); 542aeceec0dSSebastian Hesselbarth reg |= 0x0030; 543aeceec0dSSebastian Hesselbarth phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1310_PHY_RGMII_CTRL, reg); 544aeceec0dSSebastian Hesselbarth 545aeceec0dSSebastian Hesselbarth /* Ensure to return to page 0 */ 546aeceec0dSSebastian Hesselbarth phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1310_PHY_PAGE, 0x0000); 547aeceec0dSSebastian Hesselbarth 54808e64cecSNathan Rossi return genphy_config_aneg(phydev); 549aeceec0dSSebastian Hesselbarth } 5509082eeacSAndy Fleming 551c52d428dSDirk Eibach static int m88e1680_config(struct phy_device *phydev) 552c52d428dSDirk Eibach { 553c52d428dSDirk Eibach /* 554c52d428dSDirk Eibach * As per Marvell Release Notes - Alaska V 88E1680 Rev A2 555c52d428dSDirk Eibach * Errata Section 4.1 556c52d428dSDirk Eibach */ 557c52d428dSDirk Eibach u16 reg; 558c52d428dSDirk Eibach int res; 559c52d428dSDirk Eibach 560c52d428dSDirk Eibach /* Matrix LED mode (not neede if single LED mode is used */ 561c52d428dSDirk Eibach phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1118_PHY_PAGE, 0x0004); 562c52d428dSDirk Eibach reg = phy_read(phydev, MDIO_DEVAD_NONE, 27); 563c52d428dSDirk Eibach reg |= (1 << 5); 564c52d428dSDirk Eibach phy_write(phydev, MDIO_DEVAD_NONE, 27, reg); 565c52d428dSDirk Eibach 566c52d428dSDirk Eibach /* QSGMII TX amplitude change */ 567c52d428dSDirk Eibach phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1118_PHY_PAGE, 0x00fd); 568c52d428dSDirk Eibach phy_write(phydev, MDIO_DEVAD_NONE, 8, 0x0b53); 569c52d428dSDirk Eibach phy_write(phydev, MDIO_DEVAD_NONE, 7, 0x200d); 570c52d428dSDirk Eibach phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1118_PHY_PAGE, 0x0000); 571c52d428dSDirk Eibach 572c52d428dSDirk Eibach /* EEE initialization */ 573c52d428dSDirk Eibach phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1118_PHY_PAGE, 0x00ff); 574c52d428dSDirk Eibach phy_write(phydev, MDIO_DEVAD_NONE, 17, 0xb030); 575c52d428dSDirk Eibach phy_write(phydev, MDIO_DEVAD_NONE, 16, 0x215c); 576c52d428dSDirk Eibach phy_write(phydev, MDIO_DEVAD_NONE, 22, 0x00fc); 577c52d428dSDirk Eibach phy_write(phydev, MDIO_DEVAD_NONE, 24, 0x888c); 578c52d428dSDirk Eibach phy_write(phydev, MDIO_DEVAD_NONE, 25, 0x888c); 579c52d428dSDirk Eibach phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1118_PHY_PAGE, 0x0000); 580c52d428dSDirk Eibach phy_write(phydev, MDIO_DEVAD_NONE, 0, 0x9140); 581c52d428dSDirk Eibach 582c52d428dSDirk Eibach res = genphy_config_aneg(phydev); 583c52d428dSDirk Eibach if (res < 0) 584c52d428dSDirk Eibach return res; 585c52d428dSDirk Eibach 586c52d428dSDirk Eibach /* soft reset */ 587c52d428dSDirk Eibach reg = phy_read(phydev, MDIO_DEVAD_NONE, MII_BMCR); 588c52d428dSDirk Eibach reg |= BMCR_RESET; 589c52d428dSDirk Eibach phy_write(phydev, MDIO_DEVAD_NONE, MII_BMCR, reg); 590c52d428dSDirk Eibach 591c52d428dSDirk Eibach return 0; 592c52d428dSDirk Eibach } 593c52d428dSDirk Eibach 5949082eeacSAndy Fleming static struct phy_driver M88E1011S_driver = { 5959082eeacSAndy Fleming .name = "Marvell 88E1011S", 5969082eeacSAndy Fleming .uid = 0x1410c60, 5979082eeacSAndy Fleming .mask = 0xffffff0, 5989082eeacSAndy Fleming .features = PHY_GBIT_FEATURES, 5999082eeacSAndy Fleming .config = &m88e1011s_config, 6009082eeacSAndy Fleming .startup = &m88e1011s_startup, 6019082eeacSAndy Fleming .shutdown = &genphy_shutdown, 6029082eeacSAndy Fleming }; 6039082eeacSAndy Fleming 6049082eeacSAndy Fleming static struct phy_driver M88E1111S_driver = { 6059082eeacSAndy Fleming .name = "Marvell 88E1111S", 6069082eeacSAndy Fleming .uid = 0x1410cc0, 6079082eeacSAndy Fleming .mask = 0xffffff0, 6089082eeacSAndy Fleming .features = PHY_GBIT_FEATURES, 6099082eeacSAndy Fleming .config = &m88e1111s_config, 6109082eeacSAndy Fleming .startup = &m88e1011s_startup, 6119082eeacSAndy Fleming .shutdown = &genphy_shutdown, 6129082eeacSAndy Fleming }; 6139082eeacSAndy Fleming 6149082eeacSAndy Fleming static struct phy_driver M88E1118_driver = { 6159082eeacSAndy Fleming .name = "Marvell 88E1118", 6169082eeacSAndy Fleming .uid = 0x1410e10, 6179082eeacSAndy Fleming .mask = 0xffffff0, 6189082eeacSAndy Fleming .features = PHY_GBIT_FEATURES, 6199082eeacSAndy Fleming .config = &m88e1118_config, 6209082eeacSAndy Fleming .startup = &m88e1118_startup, 6219082eeacSAndy Fleming .shutdown = &genphy_shutdown, 6229082eeacSAndy Fleming }; 6239082eeacSAndy Fleming 624b4b81e83SMichal Simek static struct phy_driver M88E1118R_driver = { 625b4b81e83SMichal Simek .name = "Marvell 88E1118R", 626b4b81e83SMichal Simek .uid = 0x1410e40, 627b4b81e83SMichal Simek .mask = 0xffffff0, 628b4b81e83SMichal Simek .features = PHY_GBIT_FEATURES, 629b4b81e83SMichal Simek .config = &m88e1118_config, 630b4b81e83SMichal Simek .startup = &m88e1118_startup, 631b4b81e83SMichal Simek .shutdown = &genphy_shutdown, 632b4b81e83SMichal Simek }; 633b4b81e83SMichal Simek 6349082eeacSAndy Fleming static struct phy_driver M88E1121R_driver = { 6359082eeacSAndy Fleming .name = "Marvell 88E1121R", 6369082eeacSAndy Fleming .uid = 0x1410cb0, 6379082eeacSAndy Fleming .mask = 0xffffff0, 6389082eeacSAndy Fleming .features = PHY_GBIT_FEATURES, 6399082eeacSAndy Fleming .config = &m88e1121_config, 6409082eeacSAndy Fleming .startup = &genphy_startup, 6419082eeacSAndy Fleming .shutdown = &genphy_shutdown, 6429082eeacSAndy Fleming }; 6439082eeacSAndy Fleming 6449082eeacSAndy Fleming static struct phy_driver M88E1145_driver = { 6459082eeacSAndy Fleming .name = "Marvell 88E1145", 6469082eeacSAndy Fleming .uid = 0x1410cd0, 6479082eeacSAndy Fleming .mask = 0xffffff0, 6489082eeacSAndy Fleming .features = PHY_GBIT_FEATURES, 6499082eeacSAndy Fleming .config = &m88e1145_config, 6509082eeacSAndy Fleming .startup = &m88e1145_startup, 6519082eeacSAndy Fleming .shutdown = &genphy_shutdown, 6529082eeacSAndy Fleming }; 6539082eeacSAndy Fleming 6549082eeacSAndy Fleming static struct phy_driver M88E1149S_driver = { 6559082eeacSAndy Fleming .name = "Marvell 88E1149S", 6569082eeacSAndy Fleming .uid = 0x1410ca0, 6579082eeacSAndy Fleming .mask = 0xffffff0, 6589082eeacSAndy Fleming .features = PHY_GBIT_FEATURES, 6599082eeacSAndy Fleming .config = &m88e1149_config, 6609082eeacSAndy Fleming .startup = &m88e1011s_startup, 6619082eeacSAndy Fleming .shutdown = &genphy_shutdown, 6629082eeacSAndy Fleming }; 6639082eeacSAndy Fleming 6648396d0abSClemens Gruber static struct phy_driver M88E1510_driver = { 6658396d0abSClemens Gruber .name = "Marvell 88E1510", 6668396d0abSClemens Gruber .uid = 0x1410dd0, 66783cfbeb0SPhil Edworthy .mask = 0xfffffff, 6688396d0abSClemens Gruber .features = PHY_GBIT_FEATURES, 6698396d0abSClemens Gruber .config = &m88e1510_config, 6708396d0abSClemens Gruber .startup = &m88e1011s_startup, 6718396d0abSClemens Gruber .shutdown = &genphy_shutdown, 6728396d0abSClemens Gruber }; 6738396d0abSClemens Gruber 674998640b4SPhil Edworthy /* 675998640b4SPhil Edworthy * This supports: 676998640b4SPhil Edworthy * 88E1518, uid 0x1410dd1 677998640b4SPhil Edworthy * 88E1512, uid 0x1410dd4 678998640b4SPhil Edworthy */ 6791415107eSMichal Simek static struct phy_driver M88E1518_driver = { 6801415107eSMichal Simek .name = "Marvell 88E1518", 681998640b4SPhil Edworthy .uid = 0x1410dd0, 682998640b4SPhil Edworthy .mask = 0xffffffa, 6831415107eSMichal Simek .features = PHY_GBIT_FEATURES, 68435fa0ddaSHao Zhang .config = &m88e1518_config, 6851415107eSMichal Simek .startup = &m88e1011s_startup, 6861415107eSMichal Simek .shutdown = &genphy_shutdown, 6871415107eSMichal Simek }; 6881415107eSMichal Simek 689aeceec0dSSebastian Hesselbarth static struct phy_driver M88E1310_driver = { 690aeceec0dSSebastian Hesselbarth .name = "Marvell 88E1310", 691aeceec0dSSebastian Hesselbarth .uid = 0x01410e90, 692aeceec0dSSebastian Hesselbarth .mask = 0xffffff0, 693aeceec0dSSebastian Hesselbarth .features = PHY_GBIT_FEATURES, 694aeceec0dSSebastian Hesselbarth .config = &m88e1310_config, 695aeceec0dSSebastian Hesselbarth .startup = &m88e1011s_startup, 696aeceec0dSSebastian Hesselbarth .shutdown = &genphy_shutdown, 697aeceec0dSSebastian Hesselbarth }; 698aeceec0dSSebastian Hesselbarth 699c52d428dSDirk Eibach static struct phy_driver M88E1680_driver = { 700c52d428dSDirk Eibach .name = "Marvell 88E1680", 701c52d428dSDirk Eibach .uid = 0x1410ed0, 702c52d428dSDirk Eibach .mask = 0xffffff0, 703c52d428dSDirk Eibach .features = PHY_GBIT_FEATURES, 704c52d428dSDirk Eibach .config = &m88e1680_config, 705c52d428dSDirk Eibach .startup = &genphy_startup, 706c52d428dSDirk Eibach .shutdown = &genphy_shutdown, 707c52d428dSDirk Eibach }; 708c52d428dSDirk Eibach 7099082eeacSAndy Fleming int phy_marvell_init(void) 7109082eeacSAndy Fleming { 711aeceec0dSSebastian Hesselbarth phy_register(&M88E1310_driver); 7129082eeacSAndy Fleming phy_register(&M88E1149S_driver); 7139082eeacSAndy Fleming phy_register(&M88E1145_driver); 7149082eeacSAndy Fleming phy_register(&M88E1121R_driver); 7159082eeacSAndy Fleming phy_register(&M88E1118_driver); 716b4b81e83SMichal Simek phy_register(&M88E1118R_driver); 7179082eeacSAndy Fleming phy_register(&M88E1111S_driver); 7189082eeacSAndy Fleming phy_register(&M88E1011S_driver); 7198396d0abSClemens Gruber phy_register(&M88E1510_driver); 7201415107eSMichal Simek phy_register(&M88E1518_driver); 721c52d428dSDirk Eibach phy_register(&M88E1680_driver); 7229082eeacSAndy Fleming 7239082eeacSAndy Fleming return 0; 7249082eeacSAndy Fleming } 725