19082eeacSAndy Fleming /* 29082eeacSAndy Fleming * Vitesse PHY drivers 39082eeacSAndy Fleming * 4f91ba0ecSPriyanka Jain * Copyright 2010-2012 Freescale Semiconductor, Inc. 5f91ba0ecSPriyanka Jain * 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 */ 53e97a78cfSArpit Goel #define MIIM_VSC8514_GENERAL18 0x12 54e97a78cfSArpit Goel #define MIIM_VSC8514_GENERAL19 0x13 55e97a78cfSArpit Goel #define MIIM_VSC8514_GENERAL23 0x17 56e97a78cfSArpit Goel 57e97a78cfSArpit Goel /* Vitesse VSC8514 gerenal purpose register 18 */ 58e97a78cfSArpit Goel #define MIIM_VSC8514_18G_QSGMII 0x80e0 59e97a78cfSArpit Goel #define MIIM_VSC8514_18G_CMDSTAT 0x8000 60e97a78cfSArpit Goel 61*ffc8667aSChunhe Lan /* Vitesse VSC8664 Control/Status Register */ 62*ffc8667aSChunhe Lan #define MIIM_VSC8664_SERDES_AND_SIGDET 0x13 63*ffc8667aSChunhe Lan #define MIIM_VSC8664_ADDITIONAL_DEV 0x16 64*ffc8667aSChunhe Lan #define MIIM_VSC8664_EPHY_CON 0x17 65*ffc8667aSChunhe Lan #define MIIM_VSC8664_LED_CON 0x1E 66*ffc8667aSChunhe Lan 67*ffc8667aSChunhe Lan #define PHY_EXT_PAGE_ACCESS_EXTENDED 0x0001 68*ffc8667aSChunhe Lan 699082eeacSAndy Fleming /* CIS8201 */ 709082eeacSAndy Fleming static int vitesse_config(struct phy_device *phydev) 719082eeacSAndy Fleming { 729082eeacSAndy Fleming /* Override PHY config settings */ 739082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, MIIM_CIS82xx_AUX_CONSTAT, 749082eeacSAndy Fleming MIIM_CIS82xx_AUXCONSTAT_INIT); 759082eeacSAndy Fleming /* Set up the interface mode */ 769082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, MIIM_CIS82xx_EXT_CON1, 779082eeacSAndy Fleming MIIM_CIS8201_EXTCON1_INIT); 789082eeacSAndy Fleming 799082eeacSAndy Fleming genphy_config_aneg(phydev); 809082eeacSAndy Fleming 819082eeacSAndy Fleming return 0; 829082eeacSAndy Fleming } 839082eeacSAndy Fleming 849082eeacSAndy Fleming static int vitesse_parse_status(struct phy_device *phydev) 859082eeacSAndy Fleming { 869082eeacSAndy Fleming int speed; 879082eeacSAndy Fleming int mii_reg; 889082eeacSAndy Fleming 899082eeacSAndy Fleming mii_reg = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_CIS82xx_AUX_CONSTAT); 909082eeacSAndy Fleming 919082eeacSAndy Fleming if (mii_reg & MIIM_CIS82xx_AUXCONSTAT_DUPLEX) 929082eeacSAndy Fleming phydev->duplex = DUPLEX_FULL; 939082eeacSAndy Fleming else 949082eeacSAndy Fleming phydev->duplex = DUPLEX_HALF; 959082eeacSAndy Fleming 969082eeacSAndy Fleming speed = mii_reg & MIIM_CIS82xx_AUXCONSTAT_SPEED; 979082eeacSAndy Fleming switch (speed) { 989082eeacSAndy Fleming case MIIM_CIS82xx_AUXCONSTAT_GBIT: 999082eeacSAndy Fleming phydev->speed = SPEED_1000; 1009082eeacSAndy Fleming break; 1019082eeacSAndy Fleming case MIIM_CIS82xx_AUXCONSTAT_100: 1029082eeacSAndy Fleming phydev->speed = SPEED_100; 1039082eeacSAndy Fleming break; 1049082eeacSAndy Fleming default: 1059082eeacSAndy Fleming phydev->speed = SPEED_10; 1069082eeacSAndy Fleming break; 1079082eeacSAndy Fleming } 1089082eeacSAndy Fleming 1099082eeacSAndy Fleming return 0; 1109082eeacSAndy Fleming } 1119082eeacSAndy Fleming 1129082eeacSAndy Fleming static int vitesse_startup(struct phy_device *phydev) 1139082eeacSAndy Fleming { 1149082eeacSAndy Fleming genphy_update_link(phydev); 1159082eeacSAndy Fleming vitesse_parse_status(phydev); 1169082eeacSAndy Fleming 1179082eeacSAndy Fleming return 0; 1189082eeacSAndy Fleming } 1199082eeacSAndy Fleming 1209082eeacSAndy Fleming static int cis8204_config(struct phy_device *phydev) 1219082eeacSAndy Fleming { 1229082eeacSAndy Fleming /* Override PHY config settings */ 1239082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, MIIM_CIS82xx_AUX_CONSTAT, 1249082eeacSAndy Fleming MIIM_CIS82xx_AUXCONSTAT_INIT); 1259082eeacSAndy Fleming 1269082eeacSAndy Fleming genphy_config_aneg(phydev); 1279082eeacSAndy Fleming 1289082eeacSAndy Fleming if ((phydev->interface == PHY_INTERFACE_MODE_RGMII) || 1299082eeacSAndy Fleming (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 250e97a78cfSArpit Goel genphy_config_aneg(phydev); 251e97a78cfSArpit Goel 252e97a78cfSArpit Goel return 0; 253e97a78cfSArpit Goel } 254e97a78cfSArpit Goel 255*ffc8667aSChunhe Lan static int vsc8664_config(struct phy_device *phydev) 256*ffc8667aSChunhe Lan { 257*ffc8667aSChunhe Lan u32 val; 258*ffc8667aSChunhe Lan 259*ffc8667aSChunhe Lan /* Enable MAC interface auto-negotiation */ 260*ffc8667aSChunhe Lan phy_write(phydev, MDIO_DEVAD_NONE, PHY_EXT_PAGE_ACCESS, 0); 261*ffc8667aSChunhe Lan val = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_VSC8664_EPHY_CON); 262*ffc8667aSChunhe Lan val |= (1 << 13); 263*ffc8667aSChunhe Lan phy_write(phydev, MDIO_DEVAD_NONE, MIIM_VSC8664_EPHY_CON, val); 264*ffc8667aSChunhe Lan 265*ffc8667aSChunhe Lan phy_write(phydev, MDIO_DEVAD_NONE, PHY_EXT_PAGE_ACCESS, 266*ffc8667aSChunhe Lan PHY_EXT_PAGE_ACCESS_EXTENDED); 267*ffc8667aSChunhe Lan val = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_VSC8664_SERDES_AND_SIGDET); 268*ffc8667aSChunhe Lan val |= (1 << 11); 269*ffc8667aSChunhe Lan phy_write(phydev, MDIO_DEVAD_NONE, MIIM_VSC8664_SERDES_AND_SIGDET, val); 270*ffc8667aSChunhe Lan phy_write(phydev, MDIO_DEVAD_NONE, PHY_EXT_PAGE_ACCESS, 0); 271*ffc8667aSChunhe Lan 272*ffc8667aSChunhe Lan /* Enable LED blink */ 273*ffc8667aSChunhe Lan val = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_VSC8664_LED_CON); 274*ffc8667aSChunhe Lan val &= ~(1 << 2); 275*ffc8667aSChunhe Lan phy_write(phydev, MDIO_DEVAD_NONE, MIIM_VSC8664_LED_CON, val); 276*ffc8667aSChunhe Lan 277*ffc8667aSChunhe Lan genphy_config_aneg(phydev); 278*ffc8667aSChunhe Lan 279*ffc8667aSChunhe Lan return 0; 280*ffc8667aSChunhe Lan } 281*ffc8667aSChunhe Lan 2829082eeacSAndy Fleming static struct phy_driver VSC8211_driver = { 2839082eeacSAndy Fleming .name = "Vitesse VSC8211", 2849082eeacSAndy Fleming .uid = 0xfc4b0, 2859082eeacSAndy Fleming .mask = 0xffff0, 2869082eeacSAndy Fleming .features = PHY_GBIT_FEATURES, 2879082eeacSAndy Fleming .config = &vitesse_config, 2889082eeacSAndy Fleming .startup = &vitesse_startup, 2899082eeacSAndy Fleming .shutdown = &genphy_shutdown, 2909082eeacSAndy Fleming }; 2919082eeacSAndy Fleming 2929082eeacSAndy Fleming static struct phy_driver VSC8221_driver = { 2939082eeacSAndy Fleming .name = "Vitesse VSC8221", 2949082eeacSAndy Fleming .uid = 0xfc550, 2959082eeacSAndy Fleming .mask = 0xffff0, 2969082eeacSAndy Fleming .features = PHY_GBIT_FEATURES, 2979082eeacSAndy Fleming .config = &genphy_config_aneg, 2989082eeacSAndy Fleming .startup = &vitesse_startup, 2999082eeacSAndy Fleming .shutdown = &genphy_shutdown, 3009082eeacSAndy Fleming }; 3019082eeacSAndy Fleming 3029082eeacSAndy Fleming static struct phy_driver VSC8244_driver = { 3039082eeacSAndy Fleming .name = "Vitesse VSC8244", 3049082eeacSAndy Fleming .uid = 0xfc6c0, 3059082eeacSAndy Fleming .mask = 0xffff0, 3069082eeacSAndy Fleming .features = PHY_GBIT_FEATURES, 3079082eeacSAndy Fleming .config = &genphy_config_aneg, 3089082eeacSAndy Fleming .startup = &vitesse_startup, 3099082eeacSAndy Fleming .shutdown = &genphy_shutdown, 3109082eeacSAndy Fleming }; 3119082eeacSAndy Fleming 3129082eeacSAndy Fleming static struct phy_driver VSC8234_driver = { 3139082eeacSAndy Fleming .name = "Vitesse VSC8234", 3149082eeacSAndy Fleming .uid = 0xfc620, 3159082eeacSAndy Fleming .mask = 0xffff0, 3169082eeacSAndy Fleming .features = PHY_GBIT_FEATURES, 3179082eeacSAndy Fleming .config = &genphy_config_aneg, 3189082eeacSAndy Fleming .startup = &vitesse_startup, 3199082eeacSAndy Fleming .shutdown = &genphy_shutdown, 3209082eeacSAndy Fleming }; 3219082eeacSAndy Fleming 3227794b1a7SShaohui Xie static struct phy_driver VSC8574_driver = { 3237794b1a7SShaohui Xie .name = "Vitesse VSC8574", 3247794b1a7SShaohui Xie .uid = 0x704a0, 3257794b1a7SShaohui Xie .mask = 0xffff0, 3267794b1a7SShaohui Xie .features = PHY_GBIT_FEATURES, 3277794b1a7SShaohui Xie .config = &vsc8574_config, 3287794b1a7SShaohui Xie .startup = &vitesse_startup, 3297794b1a7SShaohui Xie .shutdown = &genphy_shutdown, 3307794b1a7SShaohui Xie }; 3317794b1a7SShaohui Xie 332e97a78cfSArpit Goel static struct phy_driver VSC8514_driver = { 333e97a78cfSArpit Goel .name = "Vitesse VSC8514", 33444afbbc0SCodrin Ciubotariu .uid = 0x70670, 335e97a78cfSArpit Goel .mask = 0xffff0, 336e97a78cfSArpit Goel .features = PHY_GBIT_FEATURES, 337e97a78cfSArpit Goel .config = &vsc8514_config, 338e97a78cfSArpit Goel .startup = &vitesse_startup, 339e97a78cfSArpit Goel .shutdown = &genphy_shutdown, 340e97a78cfSArpit Goel }; 341e97a78cfSArpit Goel 3429082eeacSAndy Fleming static struct phy_driver VSC8601_driver = { 3439082eeacSAndy Fleming .name = "Vitesse VSC8601", 3449082eeacSAndy Fleming .uid = 0x70420, 3459082eeacSAndy Fleming .mask = 0xffff0, 3469082eeacSAndy Fleming .features = PHY_GBIT_FEATURES, 3479082eeacSAndy Fleming .config = &vsc8601_config, 3489082eeacSAndy Fleming .startup = &vitesse_startup, 3499082eeacSAndy Fleming .shutdown = &genphy_shutdown, 3509082eeacSAndy Fleming }; 3519082eeacSAndy Fleming 3529082eeacSAndy Fleming static struct phy_driver VSC8641_driver = { 3539082eeacSAndy Fleming .name = "Vitesse VSC8641", 3549082eeacSAndy Fleming .uid = 0x70430, 3559082eeacSAndy Fleming .mask = 0xffff0, 3569082eeacSAndy Fleming .features = PHY_GBIT_FEATURES, 3579082eeacSAndy Fleming .config = &genphy_config_aneg, 3589082eeacSAndy Fleming .startup = &vitesse_startup, 3599082eeacSAndy Fleming .shutdown = &genphy_shutdown, 3609082eeacSAndy Fleming }; 3619082eeacSAndy Fleming 362f91ba0ecSPriyanka Jain static struct phy_driver VSC8662_driver = { 363f91ba0ecSPriyanka Jain .name = "Vitesse VSC8662", 364f91ba0ecSPriyanka Jain .uid = 0x70660, 365f91ba0ecSPriyanka Jain .mask = 0xffff0, 366f91ba0ecSPriyanka Jain .features = PHY_GBIT_FEATURES, 367f91ba0ecSPriyanka Jain .config = &genphy_config_aneg, 368f91ba0ecSPriyanka Jain .startup = &vitesse_startup, 369f91ba0ecSPriyanka Jain .shutdown = &genphy_shutdown, 370f91ba0ecSPriyanka Jain }; 371f91ba0ecSPriyanka Jain 372*ffc8667aSChunhe Lan static struct phy_driver VSC8664_driver = { 373*ffc8667aSChunhe Lan .name = "Vitesse VSC8664", 374*ffc8667aSChunhe Lan .uid = 0x70660, 375*ffc8667aSChunhe Lan .mask = 0xffff0, 376*ffc8667aSChunhe Lan .features = PHY_GBIT_FEATURES, 377*ffc8667aSChunhe Lan .config = &vsc8664_config, 378*ffc8667aSChunhe Lan .startup = &vitesse_startup, 379*ffc8667aSChunhe Lan .shutdown = &genphy_shutdown, 380*ffc8667aSChunhe Lan }; 381*ffc8667aSChunhe Lan 3829082eeacSAndy Fleming /* Vitesse bought Cicada, so we'll put these here */ 3839082eeacSAndy Fleming static struct phy_driver cis8201_driver = { 3849082eeacSAndy Fleming .name = "CIS8201", 3859082eeacSAndy Fleming .uid = 0xfc410, 3869082eeacSAndy Fleming .mask = 0xffff0, 3879082eeacSAndy Fleming .features = PHY_GBIT_FEATURES, 3889082eeacSAndy Fleming .config = &vitesse_config, 3899082eeacSAndy Fleming .startup = &vitesse_startup, 3909082eeacSAndy Fleming .shutdown = &genphy_shutdown, 3919082eeacSAndy Fleming }; 3929082eeacSAndy Fleming 3939082eeacSAndy Fleming static struct phy_driver cis8204_driver = { 3949082eeacSAndy Fleming .name = "Cicada Cis8204", 3959082eeacSAndy Fleming .uid = 0xfc440, 3969082eeacSAndy Fleming .mask = 0xffff0, 3979082eeacSAndy Fleming .features = PHY_GBIT_FEATURES, 3989082eeacSAndy Fleming .config = &cis8204_config, 3999082eeacSAndy Fleming .startup = &vitesse_startup, 4009082eeacSAndy Fleming .shutdown = &genphy_shutdown, 4019082eeacSAndy Fleming }; 4029082eeacSAndy Fleming 4039082eeacSAndy Fleming int phy_vitesse_init(void) 4049082eeacSAndy Fleming { 4059082eeacSAndy Fleming phy_register(&VSC8641_driver); 4069082eeacSAndy Fleming phy_register(&VSC8601_driver); 4079082eeacSAndy Fleming phy_register(&VSC8234_driver); 4089082eeacSAndy Fleming phy_register(&VSC8244_driver); 4099082eeacSAndy Fleming phy_register(&VSC8211_driver); 4109082eeacSAndy Fleming phy_register(&VSC8221_driver); 4117794b1a7SShaohui Xie phy_register(&VSC8574_driver); 412e97a78cfSArpit Goel phy_register(&VSC8514_driver); 413f91ba0ecSPriyanka Jain phy_register(&VSC8662_driver); 414*ffc8667aSChunhe Lan phy_register(&VSC8664_driver); 4159082eeacSAndy Fleming phy_register(&cis8201_driver); 4169082eeacSAndy Fleming phy_register(&cis8204_driver); 4179082eeacSAndy Fleming 4189082eeacSAndy Fleming return 0; 4199082eeacSAndy Fleming } 420