19082eeacSAndy Fleming /* 29082eeacSAndy Fleming * Vitesse PHY drivers 39082eeacSAndy Fleming * 4*c18fc2c9SShengzhou Liu * Copyright 2010-2014 Freescale Semiconductor, Inc. 5*c18fc2c9SShengzhou Liu * Original Author: Andy Fleming 6f91ba0ecSPriyanka Jain * Add vsc8662 phy support - Priyanka Jain 71a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+ 89082eeacSAndy Fleming */ 99082eeacSAndy Fleming #include <miiphy.h> 109082eeacSAndy Fleming 119082eeacSAndy Fleming /* Cicada Auxiliary Control/Status Register */ 129082eeacSAndy Fleming #define MIIM_CIS82xx_AUX_CONSTAT 0x1c 139082eeacSAndy Fleming #define MIIM_CIS82xx_AUXCONSTAT_INIT 0x0004 149082eeacSAndy Fleming #define MIIM_CIS82xx_AUXCONSTAT_DUPLEX 0x0020 159082eeacSAndy Fleming #define MIIM_CIS82xx_AUXCONSTAT_SPEED 0x0018 169082eeacSAndy Fleming #define MIIM_CIS82xx_AUXCONSTAT_GBIT 0x0010 179082eeacSAndy Fleming #define MIIM_CIS82xx_AUXCONSTAT_100 0x0008 189082eeacSAndy Fleming 199082eeacSAndy Fleming /* Cicada Extended Control Register 1 */ 209082eeacSAndy Fleming #define MIIM_CIS82xx_EXT_CON1 0x17 219082eeacSAndy Fleming #define MIIM_CIS8201_EXTCON1_INIT 0x0000 229082eeacSAndy Fleming 239082eeacSAndy Fleming /* Cicada 8204 Extended PHY Control Register 1 */ 249082eeacSAndy Fleming #define MIIM_CIS8204_EPHY_CON 0x17 259082eeacSAndy Fleming #define MIIM_CIS8204_EPHYCON_INIT 0x0006 269082eeacSAndy Fleming #define MIIM_CIS8204_EPHYCON_RGMII 0x1100 279082eeacSAndy Fleming 289082eeacSAndy Fleming /* Cicada 8204 Serial LED Control Register */ 299082eeacSAndy Fleming #define MIIM_CIS8204_SLED_CON 0x1b 309082eeacSAndy Fleming #define MIIM_CIS8204_SLEDCON_INIT 0x1115 319082eeacSAndy Fleming 329082eeacSAndy Fleming /* Vitesse VSC8601 Extended PHY Control Register 1 */ 339082eeacSAndy Fleming #define MIIM_VSC8601_EPHY_CON 0x17 349082eeacSAndy Fleming #define MIIM_VSC8601_EPHY_CON_INIT_SKEW 0x1120 359082eeacSAndy Fleming #define MIIM_VSC8601_SKEW_CTRL 0x1c 369082eeacSAndy Fleming 379082eeacSAndy Fleming #define PHY_EXT_PAGE_ACCESS 0x1f 387794b1a7SShaohui Xie #define PHY_EXT_PAGE_ACCESS_GENERAL 0x10 397794b1a7SShaohui Xie #define PHY_EXT_PAGE_ACCESS_EXTENDED3 0x3 407794b1a7SShaohui Xie 417794b1a7SShaohui Xie /* Vitesse VSC8574 control register */ 427794b1a7SShaohui Xie #define MIIM_VSC8574_MAC_SERDES_CON 0x10 437794b1a7SShaohui Xie #define MIIM_VSC8574_MAC_SERDES_ANEG 0x80 447794b1a7SShaohui Xie #define MIIM_VSC8574_GENERAL18 0x12 457794b1a7SShaohui Xie #define MIIM_VSC8574_GENERAL19 0x13 467794b1a7SShaohui Xie 477794b1a7SShaohui Xie /* Vitesse VSC8574 gerenal purpose register 18 */ 487794b1a7SShaohui Xie #define MIIM_VSC8574_18G_SGMII 0x80f0 497794b1a7SShaohui Xie #define MIIM_VSC8574_18G_QSGMII 0x80e0 507794b1a7SShaohui Xie #define MIIM_VSC8574_18G_CMDSTAT 0x8000 519082eeacSAndy Fleming 52e97a78cfSArpit Goel /* Vitesse VSC8514 control register */ 53*c18fc2c9SShengzhou Liu #define MIIM_VSC8514_MAC_SERDES_CON 0x10 54e97a78cfSArpit Goel #define MIIM_VSC8514_GENERAL18 0x12 55e97a78cfSArpit Goel #define MIIM_VSC8514_GENERAL19 0x13 56e97a78cfSArpit Goel #define MIIM_VSC8514_GENERAL23 0x17 57e97a78cfSArpit Goel 58e97a78cfSArpit Goel /* Vitesse VSC8514 gerenal purpose register 18 */ 59e97a78cfSArpit Goel #define MIIM_VSC8514_18G_QSGMII 0x80e0 60e97a78cfSArpit Goel #define MIIM_VSC8514_18G_CMDSTAT 0x8000 61e97a78cfSArpit Goel 62ffc8667aSChunhe Lan /* Vitesse VSC8664 Control/Status Register */ 63ffc8667aSChunhe Lan #define MIIM_VSC8664_SERDES_AND_SIGDET 0x13 64ffc8667aSChunhe Lan #define MIIM_VSC8664_ADDITIONAL_DEV 0x16 65ffc8667aSChunhe Lan #define MIIM_VSC8664_EPHY_CON 0x17 66ffc8667aSChunhe Lan #define MIIM_VSC8664_LED_CON 0x1E 67ffc8667aSChunhe Lan 68ffc8667aSChunhe Lan #define PHY_EXT_PAGE_ACCESS_EXTENDED 0x0001 69ffc8667aSChunhe Lan 709082eeacSAndy Fleming /* CIS8201 */ 719082eeacSAndy Fleming static int vitesse_config(struct phy_device *phydev) 729082eeacSAndy Fleming { 739082eeacSAndy Fleming /* Override PHY config settings */ 749082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, MIIM_CIS82xx_AUX_CONSTAT, 759082eeacSAndy Fleming MIIM_CIS82xx_AUXCONSTAT_INIT); 769082eeacSAndy Fleming /* Set up the interface mode */ 779082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, MIIM_CIS82xx_EXT_CON1, 789082eeacSAndy Fleming MIIM_CIS8201_EXTCON1_INIT); 799082eeacSAndy Fleming 809082eeacSAndy Fleming genphy_config_aneg(phydev); 819082eeacSAndy Fleming 829082eeacSAndy Fleming return 0; 839082eeacSAndy Fleming } 849082eeacSAndy Fleming 859082eeacSAndy Fleming static int vitesse_parse_status(struct phy_device *phydev) 869082eeacSAndy Fleming { 879082eeacSAndy Fleming int speed; 889082eeacSAndy Fleming int mii_reg; 899082eeacSAndy Fleming 909082eeacSAndy Fleming mii_reg = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_CIS82xx_AUX_CONSTAT); 919082eeacSAndy Fleming 929082eeacSAndy Fleming if (mii_reg & MIIM_CIS82xx_AUXCONSTAT_DUPLEX) 939082eeacSAndy Fleming phydev->duplex = DUPLEX_FULL; 949082eeacSAndy Fleming else 959082eeacSAndy Fleming phydev->duplex = DUPLEX_HALF; 969082eeacSAndy Fleming 979082eeacSAndy Fleming speed = mii_reg & MIIM_CIS82xx_AUXCONSTAT_SPEED; 989082eeacSAndy Fleming switch (speed) { 999082eeacSAndy Fleming case MIIM_CIS82xx_AUXCONSTAT_GBIT: 1009082eeacSAndy Fleming phydev->speed = SPEED_1000; 1019082eeacSAndy Fleming break; 1029082eeacSAndy Fleming case MIIM_CIS82xx_AUXCONSTAT_100: 1039082eeacSAndy Fleming phydev->speed = SPEED_100; 1049082eeacSAndy Fleming break; 1059082eeacSAndy Fleming default: 1069082eeacSAndy Fleming phydev->speed = SPEED_10; 1079082eeacSAndy Fleming break; 1089082eeacSAndy Fleming } 1099082eeacSAndy Fleming 1109082eeacSAndy Fleming return 0; 1119082eeacSAndy Fleming } 1129082eeacSAndy Fleming 1139082eeacSAndy Fleming static int vitesse_startup(struct phy_device *phydev) 1149082eeacSAndy Fleming { 1159082eeacSAndy Fleming genphy_update_link(phydev); 1169082eeacSAndy Fleming vitesse_parse_status(phydev); 1179082eeacSAndy Fleming 1189082eeacSAndy Fleming return 0; 1199082eeacSAndy Fleming } 1209082eeacSAndy Fleming 1219082eeacSAndy Fleming static int cis8204_config(struct phy_device *phydev) 1229082eeacSAndy Fleming { 1239082eeacSAndy Fleming /* Override PHY config settings */ 1249082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, MIIM_CIS82xx_AUX_CONSTAT, 1259082eeacSAndy Fleming MIIM_CIS82xx_AUXCONSTAT_INIT); 1269082eeacSAndy Fleming 1279082eeacSAndy Fleming genphy_config_aneg(phydev); 1289082eeacSAndy Fleming 1299082eeacSAndy Fleming if ((phydev->interface == PHY_INTERFACE_MODE_RGMII) || 1309082eeacSAndy Fleming (phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID) || 1319082eeacSAndy Fleming (phydev->interface == PHY_INTERFACE_MODE_RGMII_RXID)) 1329082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, MIIM_CIS8204_EPHY_CON, 1339082eeacSAndy Fleming MIIM_CIS8204_EPHYCON_INIT | 1349082eeacSAndy Fleming MIIM_CIS8204_EPHYCON_RGMII); 1359082eeacSAndy Fleming else 1369082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, MIIM_CIS8204_EPHY_CON, 1379082eeacSAndy Fleming MIIM_CIS8204_EPHYCON_INIT); 1389082eeacSAndy Fleming 1399082eeacSAndy Fleming return 0; 1409082eeacSAndy Fleming } 1419082eeacSAndy Fleming 1429082eeacSAndy Fleming /* Vitesse VSC8601 */ 143960d70c6SKim Phillips static int vsc8601_config(struct phy_device *phydev) 1449082eeacSAndy Fleming { 1459082eeacSAndy Fleming /* Configure some basic stuff */ 1469082eeacSAndy Fleming #ifdef CONFIG_SYS_VSC8601_SKEWFIX 1479082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, MIIM_VSC8601_EPHY_CON, 1489082eeacSAndy Fleming MIIM_VSC8601_EPHY_CON_INIT_SKEW); 1499082eeacSAndy Fleming #if defined(CONFIG_SYS_VSC8601_SKEW_TX) && defined(CONFIG_SYS_VSC8601_SKEW_RX) 1509082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, PHY_EXT_PAGE_ACCESS, 1); 1519082eeacSAndy Fleming #define VSC8101_SKEW \ 1529082eeacSAndy Fleming ((CONFIG_SYS_VSC8601_SKEW_TX << 14) \ 1539082eeacSAndy Fleming | (CONFIG_SYS_VSC8601_SKEW_RX << 12)) 1549082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, MIIM_VSC8601_SKEW_CTRL, 1559082eeacSAndy Fleming VSC8101_SKEW); 1569082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, PHY_EXT_PAGE_ACCESS, 0); 1579082eeacSAndy Fleming #endif 1589082eeacSAndy Fleming #endif 1599082eeacSAndy Fleming 1609082eeacSAndy Fleming genphy_config_aneg(phydev); 1619082eeacSAndy Fleming 1629082eeacSAndy Fleming return 0; 1639082eeacSAndy Fleming } 1649082eeacSAndy Fleming 1657794b1a7SShaohui Xie static int vsc8574_config(struct phy_device *phydev) 1667794b1a7SShaohui Xie { 1677794b1a7SShaohui Xie u32 val; 168e97a78cfSArpit Goel /* configure register 19G for MAC */ 1697794b1a7SShaohui Xie phy_write(phydev, MDIO_DEVAD_NONE, PHY_EXT_PAGE_ACCESS, 1707794b1a7SShaohui Xie PHY_EXT_PAGE_ACCESS_GENERAL); 1717794b1a7SShaohui Xie 1727794b1a7SShaohui Xie val = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_VSC8574_GENERAL19); 1737794b1a7SShaohui Xie if (phydev->interface == PHY_INTERFACE_MODE_QSGMII) { 1747794b1a7SShaohui Xie /* set bit 15:14 to '01' for QSGMII mode */ 1757794b1a7SShaohui Xie val = (val & 0x3fff) | (1 << 14); 1767794b1a7SShaohui Xie phy_write(phydev, MDIO_DEVAD_NONE, 1777794b1a7SShaohui Xie MIIM_VSC8574_GENERAL19, val); 1787794b1a7SShaohui Xie /* Enable 4 ports MAC QSGMII */ 1797794b1a7SShaohui Xie phy_write(phydev, MDIO_DEVAD_NONE, MIIM_VSC8574_GENERAL18, 1807794b1a7SShaohui Xie MIIM_VSC8574_18G_QSGMII); 1817794b1a7SShaohui Xie } else { 1827794b1a7SShaohui Xie /* set bit 15:14 to '00' for SGMII mode */ 1837794b1a7SShaohui Xie val = val & 0x3fff; 1847794b1a7SShaohui Xie phy_write(phydev, MDIO_DEVAD_NONE, MIIM_VSC8574_GENERAL19, val); 1857794b1a7SShaohui Xie /* Enable 4 ports MAC SGMII */ 1867794b1a7SShaohui Xie phy_write(phydev, MDIO_DEVAD_NONE, MIIM_VSC8574_GENERAL18, 1877794b1a7SShaohui Xie MIIM_VSC8574_18G_SGMII); 1887794b1a7SShaohui Xie } 1897794b1a7SShaohui Xie val = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_VSC8574_GENERAL18); 1907794b1a7SShaohui Xie /* When bit 15 is cleared the command has completed */ 1917794b1a7SShaohui Xie while (val & MIIM_VSC8574_18G_CMDSTAT) 1927794b1a7SShaohui Xie val = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_VSC8574_GENERAL18); 1937794b1a7SShaohui Xie 1947794b1a7SShaohui Xie /* Enable Serdes Auto-negotiation */ 1957794b1a7SShaohui Xie phy_write(phydev, MDIO_DEVAD_NONE, PHY_EXT_PAGE_ACCESS, 1967794b1a7SShaohui Xie PHY_EXT_PAGE_ACCESS_EXTENDED3); 1977794b1a7SShaohui Xie val = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_VSC8574_MAC_SERDES_CON); 1987794b1a7SShaohui Xie val = val | MIIM_VSC8574_MAC_SERDES_ANEG; 1997794b1a7SShaohui Xie phy_write(phydev, MDIO_DEVAD_NONE, MIIM_VSC8574_MAC_SERDES_CON, val); 2007794b1a7SShaohui Xie 2017794b1a7SShaohui Xie phy_write(phydev, MDIO_DEVAD_NONE, PHY_EXT_PAGE_ACCESS, 0); 2027794b1a7SShaohui Xie 2037794b1a7SShaohui Xie genphy_config_aneg(phydev); 2047794b1a7SShaohui Xie 2057794b1a7SShaohui Xie return 0; 2067794b1a7SShaohui Xie } 2077794b1a7SShaohui Xie 208e97a78cfSArpit Goel static int vsc8514_config(struct phy_device *phydev) 209e97a78cfSArpit Goel { 210e97a78cfSArpit Goel u32 val; 211e97a78cfSArpit Goel int timeout = 1000000; 212e97a78cfSArpit Goel 213e97a78cfSArpit Goel /* configure register to access 19G */ 214e97a78cfSArpit Goel phy_write(phydev, MDIO_DEVAD_NONE, PHY_EXT_PAGE_ACCESS, 215e97a78cfSArpit Goel PHY_EXT_PAGE_ACCESS_GENERAL); 216e97a78cfSArpit Goel 217e97a78cfSArpit Goel val = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_VSC8514_GENERAL19); 218e97a78cfSArpit Goel if (phydev->interface == PHY_INTERFACE_MODE_QSGMII) { 219e97a78cfSArpit Goel /* set bit 15:14 to '01' for QSGMII mode */ 220e97a78cfSArpit Goel val = (val & 0x3fff) | (1 << 14); 221e97a78cfSArpit Goel phy_write(phydev, MDIO_DEVAD_NONE, 222e97a78cfSArpit Goel MIIM_VSC8514_GENERAL19, val); 223e97a78cfSArpit Goel /* Enable 4 ports MAC QSGMII */ 224e97a78cfSArpit Goel phy_write(phydev, MDIO_DEVAD_NONE, MIIM_VSC8514_GENERAL18, 225e97a78cfSArpit Goel MIIM_VSC8514_18G_QSGMII); 226e97a78cfSArpit Goel } else { 227e97a78cfSArpit Goel /*TODO Add SGMII functionality once spec sheet 228e97a78cfSArpit Goel * for VSC8514 defines complete functionality 229e97a78cfSArpit Goel */ 230e97a78cfSArpit Goel } 231e97a78cfSArpit Goel 232e97a78cfSArpit Goel val = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_VSC8514_GENERAL18); 233e97a78cfSArpit Goel /* When bit 15 is cleared the command has completed */ 234e97a78cfSArpit Goel while ((val & MIIM_VSC8514_18G_CMDSTAT) && timeout--) 235e97a78cfSArpit Goel val = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_VSC8514_GENERAL18); 236e97a78cfSArpit Goel 237e97a78cfSArpit Goel if (0 == timeout) { 238e97a78cfSArpit Goel printf("PHY 8514 config failed\n"); 239e97a78cfSArpit Goel return -1; 240e97a78cfSArpit Goel } 241e97a78cfSArpit Goel 242e97a78cfSArpit Goel phy_write(phydev, MDIO_DEVAD_NONE, PHY_EXT_PAGE_ACCESS, 0); 243e97a78cfSArpit Goel 244e97a78cfSArpit Goel /* configure register to access 23 */ 245e97a78cfSArpit Goel val = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_VSC8514_GENERAL23); 246e97a78cfSArpit Goel /* set bits 10:8 to '000' */ 247e97a78cfSArpit Goel val = (val & 0xf8ff); 248e97a78cfSArpit Goel phy_write(phydev, MDIO_DEVAD_NONE, MIIM_VSC8514_GENERAL23, val); 249e97a78cfSArpit Goel 250*c18fc2c9SShengzhou Liu /* Enable Serdes Auto-negotiation */ 251*c18fc2c9SShengzhou Liu phy_write(phydev, MDIO_DEVAD_NONE, PHY_EXT_PAGE_ACCESS, 252*c18fc2c9SShengzhou Liu PHY_EXT_PAGE_ACCESS_EXTENDED3); 253*c18fc2c9SShengzhou Liu val = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_VSC8514_MAC_SERDES_CON); 254*c18fc2c9SShengzhou Liu val = val | MIIM_VSC8574_MAC_SERDES_ANEG; 255*c18fc2c9SShengzhou Liu phy_write(phydev, MDIO_DEVAD_NONE, MIIM_VSC8514_MAC_SERDES_CON, val); 256*c18fc2c9SShengzhou Liu phy_write(phydev, MDIO_DEVAD_NONE, PHY_EXT_PAGE_ACCESS, 0); 257*c18fc2c9SShengzhou Liu 258e97a78cfSArpit Goel genphy_config_aneg(phydev); 259e97a78cfSArpit Goel 260e97a78cfSArpit Goel return 0; 261e97a78cfSArpit Goel } 262e97a78cfSArpit Goel 263ffc8667aSChunhe Lan static int vsc8664_config(struct phy_device *phydev) 264ffc8667aSChunhe Lan { 265ffc8667aSChunhe Lan u32 val; 266ffc8667aSChunhe Lan 267ffc8667aSChunhe Lan /* Enable MAC interface auto-negotiation */ 268ffc8667aSChunhe Lan phy_write(phydev, MDIO_DEVAD_NONE, PHY_EXT_PAGE_ACCESS, 0); 269ffc8667aSChunhe Lan val = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_VSC8664_EPHY_CON); 270ffc8667aSChunhe Lan val |= (1 << 13); 271ffc8667aSChunhe Lan phy_write(phydev, MDIO_DEVAD_NONE, MIIM_VSC8664_EPHY_CON, val); 272ffc8667aSChunhe Lan 273ffc8667aSChunhe Lan phy_write(phydev, MDIO_DEVAD_NONE, PHY_EXT_PAGE_ACCESS, 274ffc8667aSChunhe Lan PHY_EXT_PAGE_ACCESS_EXTENDED); 275ffc8667aSChunhe Lan val = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_VSC8664_SERDES_AND_SIGDET); 276ffc8667aSChunhe Lan val |= (1 << 11); 277ffc8667aSChunhe Lan phy_write(phydev, MDIO_DEVAD_NONE, MIIM_VSC8664_SERDES_AND_SIGDET, val); 278ffc8667aSChunhe Lan phy_write(phydev, MDIO_DEVAD_NONE, PHY_EXT_PAGE_ACCESS, 0); 279ffc8667aSChunhe Lan 280ffc8667aSChunhe Lan /* Enable LED blink */ 281ffc8667aSChunhe Lan val = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_VSC8664_LED_CON); 282ffc8667aSChunhe Lan val &= ~(1 << 2); 283ffc8667aSChunhe Lan phy_write(phydev, MDIO_DEVAD_NONE, MIIM_VSC8664_LED_CON, val); 284ffc8667aSChunhe Lan 285ffc8667aSChunhe Lan genphy_config_aneg(phydev); 286ffc8667aSChunhe Lan 287ffc8667aSChunhe Lan return 0; 288ffc8667aSChunhe Lan } 289ffc8667aSChunhe Lan 2909082eeacSAndy Fleming static struct phy_driver VSC8211_driver = { 2919082eeacSAndy Fleming .name = "Vitesse VSC8211", 2929082eeacSAndy Fleming .uid = 0xfc4b0, 2939082eeacSAndy Fleming .mask = 0xffff0, 2949082eeacSAndy Fleming .features = PHY_GBIT_FEATURES, 2959082eeacSAndy Fleming .config = &vitesse_config, 2969082eeacSAndy Fleming .startup = &vitesse_startup, 2979082eeacSAndy Fleming .shutdown = &genphy_shutdown, 2989082eeacSAndy Fleming }; 2999082eeacSAndy Fleming 3009082eeacSAndy Fleming static struct phy_driver VSC8221_driver = { 3019082eeacSAndy Fleming .name = "Vitesse VSC8221", 3029082eeacSAndy Fleming .uid = 0xfc550, 3039082eeacSAndy Fleming .mask = 0xffff0, 3049082eeacSAndy Fleming .features = PHY_GBIT_FEATURES, 3059082eeacSAndy Fleming .config = &genphy_config_aneg, 3069082eeacSAndy Fleming .startup = &vitesse_startup, 3079082eeacSAndy Fleming .shutdown = &genphy_shutdown, 3089082eeacSAndy Fleming }; 3099082eeacSAndy Fleming 3109082eeacSAndy Fleming static struct phy_driver VSC8244_driver = { 3119082eeacSAndy Fleming .name = "Vitesse VSC8244", 3129082eeacSAndy Fleming .uid = 0xfc6c0, 3139082eeacSAndy Fleming .mask = 0xffff0, 3149082eeacSAndy Fleming .features = PHY_GBIT_FEATURES, 3159082eeacSAndy Fleming .config = &genphy_config_aneg, 3169082eeacSAndy Fleming .startup = &vitesse_startup, 3179082eeacSAndy Fleming .shutdown = &genphy_shutdown, 3189082eeacSAndy Fleming }; 3199082eeacSAndy Fleming 3209082eeacSAndy Fleming static struct phy_driver VSC8234_driver = { 3219082eeacSAndy Fleming .name = "Vitesse VSC8234", 3229082eeacSAndy Fleming .uid = 0xfc620, 3239082eeacSAndy Fleming .mask = 0xffff0, 3249082eeacSAndy Fleming .features = PHY_GBIT_FEATURES, 3259082eeacSAndy Fleming .config = &genphy_config_aneg, 3269082eeacSAndy Fleming .startup = &vitesse_startup, 3279082eeacSAndy Fleming .shutdown = &genphy_shutdown, 3289082eeacSAndy Fleming }; 3299082eeacSAndy Fleming 3307794b1a7SShaohui Xie static struct phy_driver VSC8574_driver = { 3317794b1a7SShaohui Xie .name = "Vitesse VSC8574", 3327794b1a7SShaohui Xie .uid = 0x704a0, 3337794b1a7SShaohui Xie .mask = 0xffff0, 3347794b1a7SShaohui Xie .features = PHY_GBIT_FEATURES, 3357794b1a7SShaohui Xie .config = &vsc8574_config, 3367794b1a7SShaohui Xie .startup = &vitesse_startup, 3377794b1a7SShaohui Xie .shutdown = &genphy_shutdown, 3387794b1a7SShaohui Xie }; 3397794b1a7SShaohui Xie 340e97a78cfSArpit Goel static struct phy_driver VSC8514_driver = { 341e97a78cfSArpit Goel .name = "Vitesse VSC8514", 34244afbbc0SCodrin Ciubotariu .uid = 0x70670, 343e97a78cfSArpit Goel .mask = 0xffff0, 344e97a78cfSArpit Goel .features = PHY_GBIT_FEATURES, 345e97a78cfSArpit Goel .config = &vsc8514_config, 346e97a78cfSArpit Goel .startup = &vitesse_startup, 347e97a78cfSArpit Goel .shutdown = &genphy_shutdown, 348e97a78cfSArpit Goel }; 349e97a78cfSArpit Goel 3509082eeacSAndy Fleming static struct phy_driver VSC8601_driver = { 3519082eeacSAndy Fleming .name = "Vitesse VSC8601", 3529082eeacSAndy Fleming .uid = 0x70420, 3539082eeacSAndy Fleming .mask = 0xffff0, 3549082eeacSAndy Fleming .features = PHY_GBIT_FEATURES, 3559082eeacSAndy Fleming .config = &vsc8601_config, 3569082eeacSAndy Fleming .startup = &vitesse_startup, 3579082eeacSAndy Fleming .shutdown = &genphy_shutdown, 3589082eeacSAndy Fleming }; 3599082eeacSAndy Fleming 3609082eeacSAndy Fleming static struct phy_driver VSC8641_driver = { 3619082eeacSAndy Fleming .name = "Vitesse VSC8641", 3629082eeacSAndy Fleming .uid = 0x70430, 3639082eeacSAndy Fleming .mask = 0xffff0, 3649082eeacSAndy Fleming .features = PHY_GBIT_FEATURES, 3659082eeacSAndy Fleming .config = &genphy_config_aneg, 3669082eeacSAndy Fleming .startup = &vitesse_startup, 3679082eeacSAndy Fleming .shutdown = &genphy_shutdown, 3689082eeacSAndy Fleming }; 3699082eeacSAndy Fleming 370f91ba0ecSPriyanka Jain static struct phy_driver VSC8662_driver = { 371f91ba0ecSPriyanka Jain .name = "Vitesse VSC8662", 372f91ba0ecSPriyanka Jain .uid = 0x70660, 373f91ba0ecSPriyanka Jain .mask = 0xffff0, 374f91ba0ecSPriyanka Jain .features = PHY_GBIT_FEATURES, 375f91ba0ecSPriyanka Jain .config = &genphy_config_aneg, 376f91ba0ecSPriyanka Jain .startup = &vitesse_startup, 377f91ba0ecSPriyanka Jain .shutdown = &genphy_shutdown, 378f91ba0ecSPriyanka Jain }; 379f91ba0ecSPriyanka Jain 380ffc8667aSChunhe Lan static struct phy_driver VSC8664_driver = { 381ffc8667aSChunhe Lan .name = "Vitesse VSC8664", 382ffc8667aSChunhe Lan .uid = 0x70660, 383ffc8667aSChunhe Lan .mask = 0xffff0, 384ffc8667aSChunhe Lan .features = PHY_GBIT_FEATURES, 385ffc8667aSChunhe Lan .config = &vsc8664_config, 386ffc8667aSChunhe Lan .startup = &vitesse_startup, 387ffc8667aSChunhe Lan .shutdown = &genphy_shutdown, 388ffc8667aSChunhe Lan }; 389ffc8667aSChunhe Lan 3909082eeacSAndy Fleming /* Vitesse bought Cicada, so we'll put these here */ 3919082eeacSAndy Fleming static struct phy_driver cis8201_driver = { 3929082eeacSAndy Fleming .name = "CIS8201", 3939082eeacSAndy Fleming .uid = 0xfc410, 3949082eeacSAndy Fleming .mask = 0xffff0, 3959082eeacSAndy Fleming .features = PHY_GBIT_FEATURES, 3969082eeacSAndy Fleming .config = &vitesse_config, 3979082eeacSAndy Fleming .startup = &vitesse_startup, 3989082eeacSAndy Fleming .shutdown = &genphy_shutdown, 3999082eeacSAndy Fleming }; 4009082eeacSAndy Fleming 4019082eeacSAndy Fleming static struct phy_driver cis8204_driver = { 4029082eeacSAndy Fleming .name = "Cicada Cis8204", 4039082eeacSAndy Fleming .uid = 0xfc440, 4049082eeacSAndy Fleming .mask = 0xffff0, 4059082eeacSAndy Fleming .features = PHY_GBIT_FEATURES, 4069082eeacSAndy Fleming .config = &cis8204_config, 4079082eeacSAndy Fleming .startup = &vitesse_startup, 4089082eeacSAndy Fleming .shutdown = &genphy_shutdown, 4099082eeacSAndy Fleming }; 4109082eeacSAndy Fleming 4119082eeacSAndy Fleming int phy_vitesse_init(void) 4129082eeacSAndy Fleming { 4139082eeacSAndy Fleming phy_register(&VSC8641_driver); 4149082eeacSAndy Fleming phy_register(&VSC8601_driver); 4159082eeacSAndy Fleming phy_register(&VSC8234_driver); 4169082eeacSAndy Fleming phy_register(&VSC8244_driver); 4179082eeacSAndy Fleming phy_register(&VSC8211_driver); 4189082eeacSAndy Fleming phy_register(&VSC8221_driver); 4197794b1a7SShaohui Xie phy_register(&VSC8574_driver); 420e97a78cfSArpit Goel phy_register(&VSC8514_driver); 421f91ba0ecSPriyanka Jain phy_register(&VSC8662_driver); 422ffc8667aSChunhe Lan phy_register(&VSC8664_driver); 4239082eeacSAndy Fleming phy_register(&cis8201_driver); 4249082eeacSAndy Fleming phy_register(&cis8204_driver); 4259082eeacSAndy Fleming 4269082eeacSAndy Fleming return 0; 4279082eeacSAndy Fleming } 428