183d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
29082eeacSAndy Fleming /*
39082eeacSAndy Fleming * Vitesse PHY drivers
49082eeacSAndy Fleming *
5c18fc2c9SShengzhou Liu * Copyright 2010-2014 Freescale Semiconductor, Inc.
6c18fc2c9SShengzhou Liu * Original Author: Andy Fleming
7f91ba0ecSPriyanka Jain * Add vsc8662 phy support - Priyanka Jain
89082eeacSAndy Fleming */
9*05b60ac5SJoe Hershberger #include <common.h>
109082eeacSAndy Fleming #include <miiphy.h>
119082eeacSAndy Fleming
129082eeacSAndy Fleming /* Cicada Auxiliary Control/Status Register */
139082eeacSAndy Fleming #define MIIM_CIS82xx_AUX_CONSTAT 0x1c
149082eeacSAndy Fleming #define MIIM_CIS82xx_AUXCONSTAT_INIT 0x0004
159082eeacSAndy Fleming #define MIIM_CIS82xx_AUXCONSTAT_DUPLEX 0x0020
169082eeacSAndy Fleming #define MIIM_CIS82xx_AUXCONSTAT_SPEED 0x0018
179082eeacSAndy Fleming #define MIIM_CIS82xx_AUXCONSTAT_GBIT 0x0010
189082eeacSAndy Fleming #define MIIM_CIS82xx_AUXCONSTAT_100 0x0008
199082eeacSAndy Fleming
209082eeacSAndy Fleming /* Cicada Extended Control Register 1 */
219082eeacSAndy Fleming #define MIIM_CIS82xx_EXT_CON1 0x17
229082eeacSAndy Fleming #define MIIM_CIS8201_EXTCON1_INIT 0x0000
239082eeacSAndy Fleming
249082eeacSAndy Fleming /* Cicada 8204 Extended PHY Control Register 1 */
259082eeacSAndy Fleming #define MIIM_CIS8204_EPHY_CON 0x17
269082eeacSAndy Fleming #define MIIM_CIS8204_EPHYCON_INIT 0x0006
279082eeacSAndy Fleming #define MIIM_CIS8204_EPHYCON_RGMII 0x1100
289082eeacSAndy Fleming
299082eeacSAndy Fleming /* Cicada 8204 Serial LED Control Register */
309082eeacSAndy Fleming #define MIIM_CIS8204_SLED_CON 0x1b
319082eeacSAndy Fleming #define MIIM_CIS8204_SLEDCON_INIT 0x1115
329082eeacSAndy Fleming
339082eeacSAndy Fleming /* Vitesse VSC8601 Extended PHY Control Register 1 */
34bb135a01SAlex #define MII_VSC8601_EPHY_CTL 0x17
35bb135a01SAlex #define MII_VSC8601_EPHY_CTL_RGMII_SKEW (1 << 8)
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 */
53c18fc2c9SShengzhou 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 */
vitesse_config(struct phy_device * phydev)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
vitesse_parse_status(struct phy_device * phydev)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
vitesse_startup(struct phy_device * phydev)1139082eeacSAndy Fleming static int vitesse_startup(struct phy_device *phydev)
1149082eeacSAndy Fleming {
115b733c278SMichal Simek int ret;
1169082eeacSAndy Fleming
117b733c278SMichal Simek ret = genphy_update_link(phydev);
118b733c278SMichal Simek if (ret)
119b733c278SMichal Simek return ret;
120b733c278SMichal Simek return vitesse_parse_status(phydev);
1219082eeacSAndy Fleming }
1229082eeacSAndy Fleming
cis8204_config(struct phy_device * phydev)1239082eeacSAndy Fleming static int cis8204_config(struct phy_device *phydev)
1249082eeacSAndy Fleming {
1259082eeacSAndy Fleming /* Override PHY config settings */
1269082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, MIIM_CIS82xx_AUX_CONSTAT,
1279082eeacSAndy Fleming MIIM_CIS82xx_AUXCONSTAT_INIT);
1289082eeacSAndy Fleming
1299082eeacSAndy Fleming genphy_config_aneg(phydev);
1309082eeacSAndy Fleming
1313b5f5280SPhil Edworthy if (phy_interface_is_rgmii(phydev))
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 */
143bb135a01SAlex /* This adds a skew for both TX and RX clocks, so the skew should only be
144bb135a01SAlex * applied to "rgmii-id" interfaces. It may not work as expected
145bb135a01SAlex * on "rgmii-txid", "rgmii-rxid" or "rgmii" interfaces. */
vsc8601_add_skew(struct phy_device * phydev)146bb135a01SAlex static int vsc8601_add_skew(struct phy_device *phydev)
147bb135a01SAlex {
148bb135a01SAlex int ret;
149bb135a01SAlex
150bb135a01SAlex ret = phy_read(phydev, MDIO_DEVAD_NONE, MII_VSC8601_EPHY_CTL);
151bb135a01SAlex if (ret < 0)
152bb135a01SAlex return ret;
153bb135a01SAlex
154bb135a01SAlex ret |= MII_VSC8601_EPHY_CTL_RGMII_SKEW;
155bb135a01SAlex return phy_write(phydev, MDIO_DEVAD_NONE, MII_VSC8601_EPHY_CTL, ret);
156bb135a01SAlex }
157bb135a01SAlex
vsc8601_config(struct phy_device * phydev)158960d70c6SKim Phillips static int vsc8601_config(struct phy_device *phydev)
1599082eeacSAndy Fleming {
160bb135a01SAlex int ret = 0;
1619082eeacSAndy Fleming
162bb135a01SAlex if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID)
163bb135a01SAlex ret = vsc8601_add_skew(phydev);
1649082eeacSAndy Fleming
165bb135a01SAlex if (ret < 0)
166bb135a01SAlex return ret;
167bb135a01SAlex
168bb135a01SAlex return genphy_config_aneg(phydev);
1699082eeacSAndy Fleming }
1709082eeacSAndy Fleming
vsc8574_config(struct phy_device * phydev)1717794b1a7SShaohui Xie static int vsc8574_config(struct phy_device *phydev)
1727794b1a7SShaohui Xie {
1737794b1a7SShaohui Xie u32 val;
174e97a78cfSArpit Goel /* configure register 19G for MAC */
1757794b1a7SShaohui Xie phy_write(phydev, MDIO_DEVAD_NONE, PHY_EXT_PAGE_ACCESS,
1767794b1a7SShaohui Xie PHY_EXT_PAGE_ACCESS_GENERAL);
1777794b1a7SShaohui Xie
1787794b1a7SShaohui Xie val = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_VSC8574_GENERAL19);
1797794b1a7SShaohui Xie if (phydev->interface == PHY_INTERFACE_MODE_QSGMII) {
1807794b1a7SShaohui Xie /* set bit 15:14 to '01' for QSGMII mode */
1817794b1a7SShaohui Xie val = (val & 0x3fff) | (1 << 14);
1827794b1a7SShaohui Xie phy_write(phydev, MDIO_DEVAD_NONE,
1837794b1a7SShaohui Xie MIIM_VSC8574_GENERAL19, val);
1847794b1a7SShaohui Xie /* Enable 4 ports MAC QSGMII */
1857794b1a7SShaohui Xie phy_write(phydev, MDIO_DEVAD_NONE, MIIM_VSC8574_GENERAL18,
1867794b1a7SShaohui Xie MIIM_VSC8574_18G_QSGMII);
1877794b1a7SShaohui Xie } else {
1887794b1a7SShaohui Xie /* set bit 15:14 to '00' for SGMII mode */
1897794b1a7SShaohui Xie val = val & 0x3fff;
1907794b1a7SShaohui Xie phy_write(phydev, MDIO_DEVAD_NONE, MIIM_VSC8574_GENERAL19, val);
1917794b1a7SShaohui Xie /* Enable 4 ports MAC SGMII */
1927794b1a7SShaohui Xie phy_write(phydev, MDIO_DEVAD_NONE, MIIM_VSC8574_GENERAL18,
1937794b1a7SShaohui Xie MIIM_VSC8574_18G_SGMII);
1947794b1a7SShaohui Xie }
1957794b1a7SShaohui Xie val = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_VSC8574_GENERAL18);
1967794b1a7SShaohui Xie /* When bit 15 is cleared the command has completed */
1977794b1a7SShaohui Xie while (val & MIIM_VSC8574_18G_CMDSTAT)
1987794b1a7SShaohui Xie val = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_VSC8574_GENERAL18);
1997794b1a7SShaohui Xie
2007794b1a7SShaohui Xie /* Enable Serdes Auto-negotiation */
2017794b1a7SShaohui Xie phy_write(phydev, MDIO_DEVAD_NONE, PHY_EXT_PAGE_ACCESS,
2027794b1a7SShaohui Xie PHY_EXT_PAGE_ACCESS_EXTENDED3);
2037794b1a7SShaohui Xie val = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_VSC8574_MAC_SERDES_CON);
2047794b1a7SShaohui Xie val = val | MIIM_VSC8574_MAC_SERDES_ANEG;
2057794b1a7SShaohui Xie phy_write(phydev, MDIO_DEVAD_NONE, MIIM_VSC8574_MAC_SERDES_CON, val);
2067794b1a7SShaohui Xie
2077794b1a7SShaohui Xie phy_write(phydev, MDIO_DEVAD_NONE, PHY_EXT_PAGE_ACCESS, 0);
2087794b1a7SShaohui Xie
2097794b1a7SShaohui Xie genphy_config_aneg(phydev);
2107794b1a7SShaohui Xie
2117794b1a7SShaohui Xie return 0;
2127794b1a7SShaohui Xie }
2137794b1a7SShaohui Xie
vsc8514_config(struct phy_device * phydev)214e97a78cfSArpit Goel static int vsc8514_config(struct phy_device *phydev)
215e97a78cfSArpit Goel {
216e97a78cfSArpit Goel u32 val;
217e97a78cfSArpit Goel int timeout = 1000000;
218e97a78cfSArpit Goel
219e97a78cfSArpit Goel /* configure register to access 19G */
220e97a78cfSArpit Goel phy_write(phydev, MDIO_DEVAD_NONE, PHY_EXT_PAGE_ACCESS,
221e97a78cfSArpit Goel PHY_EXT_PAGE_ACCESS_GENERAL);
222e97a78cfSArpit Goel
223e97a78cfSArpit Goel val = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_VSC8514_GENERAL19);
224e97a78cfSArpit Goel if (phydev->interface == PHY_INTERFACE_MODE_QSGMII) {
225e97a78cfSArpit Goel /* set bit 15:14 to '01' for QSGMII mode */
226e97a78cfSArpit Goel val = (val & 0x3fff) | (1 << 14);
227e97a78cfSArpit Goel phy_write(phydev, MDIO_DEVAD_NONE,
228e97a78cfSArpit Goel MIIM_VSC8514_GENERAL19, val);
229e97a78cfSArpit Goel /* Enable 4 ports MAC QSGMII */
230e97a78cfSArpit Goel phy_write(phydev, MDIO_DEVAD_NONE, MIIM_VSC8514_GENERAL18,
231e97a78cfSArpit Goel MIIM_VSC8514_18G_QSGMII);
232e97a78cfSArpit Goel } else {
233e97a78cfSArpit Goel /*TODO Add SGMII functionality once spec sheet
234e97a78cfSArpit Goel * for VSC8514 defines complete functionality
235e97a78cfSArpit Goel */
236e97a78cfSArpit Goel }
237e97a78cfSArpit Goel
238e97a78cfSArpit Goel val = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_VSC8514_GENERAL18);
239e97a78cfSArpit Goel /* When bit 15 is cleared the command has completed */
240e97a78cfSArpit Goel while ((val & MIIM_VSC8514_18G_CMDSTAT) && timeout--)
241e97a78cfSArpit Goel val = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_VSC8514_GENERAL18);
242e97a78cfSArpit Goel
243e97a78cfSArpit Goel if (0 == timeout) {
244e97a78cfSArpit Goel printf("PHY 8514 config failed\n");
245e97a78cfSArpit Goel return -1;
246e97a78cfSArpit Goel }
247e97a78cfSArpit Goel
248e97a78cfSArpit Goel phy_write(phydev, MDIO_DEVAD_NONE, PHY_EXT_PAGE_ACCESS, 0);
249e97a78cfSArpit Goel
250e97a78cfSArpit Goel /* configure register to access 23 */
251e97a78cfSArpit Goel val = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_VSC8514_GENERAL23);
252e97a78cfSArpit Goel /* set bits 10:8 to '000' */
253e97a78cfSArpit Goel val = (val & 0xf8ff);
254e97a78cfSArpit Goel phy_write(phydev, MDIO_DEVAD_NONE, MIIM_VSC8514_GENERAL23, val);
255e97a78cfSArpit Goel
256c18fc2c9SShengzhou Liu /* Enable Serdes Auto-negotiation */
257c18fc2c9SShengzhou Liu phy_write(phydev, MDIO_DEVAD_NONE, PHY_EXT_PAGE_ACCESS,
258c18fc2c9SShengzhou Liu PHY_EXT_PAGE_ACCESS_EXTENDED3);
259c18fc2c9SShengzhou Liu val = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_VSC8514_MAC_SERDES_CON);
260c18fc2c9SShengzhou Liu val = val | MIIM_VSC8574_MAC_SERDES_ANEG;
261c18fc2c9SShengzhou Liu phy_write(phydev, MDIO_DEVAD_NONE, MIIM_VSC8514_MAC_SERDES_CON, val);
262c18fc2c9SShengzhou Liu phy_write(phydev, MDIO_DEVAD_NONE, PHY_EXT_PAGE_ACCESS, 0);
263c18fc2c9SShengzhou Liu
264e97a78cfSArpit Goel genphy_config_aneg(phydev);
265e97a78cfSArpit Goel
266e97a78cfSArpit Goel return 0;
267e97a78cfSArpit Goel }
268e97a78cfSArpit Goel
vsc8664_config(struct phy_device * phydev)269ffc8667aSChunhe Lan static int vsc8664_config(struct phy_device *phydev)
270ffc8667aSChunhe Lan {
271ffc8667aSChunhe Lan u32 val;
272ffc8667aSChunhe Lan
273ffc8667aSChunhe Lan /* Enable MAC interface auto-negotiation */
274ffc8667aSChunhe Lan phy_write(phydev, MDIO_DEVAD_NONE, PHY_EXT_PAGE_ACCESS, 0);
275ffc8667aSChunhe Lan val = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_VSC8664_EPHY_CON);
276ffc8667aSChunhe Lan val |= (1 << 13);
277ffc8667aSChunhe Lan phy_write(phydev, MDIO_DEVAD_NONE, MIIM_VSC8664_EPHY_CON, val);
278ffc8667aSChunhe Lan
279ffc8667aSChunhe Lan phy_write(phydev, MDIO_DEVAD_NONE, PHY_EXT_PAGE_ACCESS,
280ffc8667aSChunhe Lan PHY_EXT_PAGE_ACCESS_EXTENDED);
281ffc8667aSChunhe Lan val = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_VSC8664_SERDES_AND_SIGDET);
282ffc8667aSChunhe Lan val |= (1 << 11);
283ffc8667aSChunhe Lan phy_write(phydev, MDIO_DEVAD_NONE, MIIM_VSC8664_SERDES_AND_SIGDET, val);
284ffc8667aSChunhe Lan phy_write(phydev, MDIO_DEVAD_NONE, PHY_EXT_PAGE_ACCESS, 0);
285ffc8667aSChunhe Lan
286ffc8667aSChunhe Lan /* Enable LED blink */
287ffc8667aSChunhe Lan val = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_VSC8664_LED_CON);
288ffc8667aSChunhe Lan val &= ~(1 << 2);
289ffc8667aSChunhe Lan phy_write(phydev, MDIO_DEVAD_NONE, MIIM_VSC8664_LED_CON, val);
290ffc8667aSChunhe Lan
291ffc8667aSChunhe Lan genphy_config_aneg(phydev);
292ffc8667aSChunhe Lan
293ffc8667aSChunhe Lan return 0;
294ffc8667aSChunhe Lan }
295ffc8667aSChunhe Lan
2969082eeacSAndy Fleming static struct phy_driver VSC8211_driver = {
2979082eeacSAndy Fleming .name = "Vitesse VSC8211",
2989082eeacSAndy Fleming .uid = 0xfc4b0,
2999082eeacSAndy Fleming .mask = 0xffff0,
3009082eeacSAndy Fleming .features = PHY_GBIT_FEATURES,
3019082eeacSAndy Fleming .config = &vitesse_config,
3029082eeacSAndy Fleming .startup = &vitesse_startup,
3039082eeacSAndy Fleming .shutdown = &genphy_shutdown,
3049082eeacSAndy Fleming };
3059082eeacSAndy Fleming
3069082eeacSAndy Fleming static struct phy_driver VSC8221_driver = {
3079082eeacSAndy Fleming .name = "Vitesse VSC8221",
3089082eeacSAndy Fleming .uid = 0xfc550,
3099082eeacSAndy Fleming .mask = 0xffff0,
3109082eeacSAndy Fleming .features = PHY_GBIT_FEATURES,
3119082eeacSAndy Fleming .config = &genphy_config_aneg,
3129082eeacSAndy Fleming .startup = &vitesse_startup,
3139082eeacSAndy Fleming .shutdown = &genphy_shutdown,
3149082eeacSAndy Fleming };
3159082eeacSAndy Fleming
3169082eeacSAndy Fleming static struct phy_driver VSC8244_driver = {
3179082eeacSAndy Fleming .name = "Vitesse VSC8244",
3189082eeacSAndy Fleming .uid = 0xfc6c0,
3199082eeacSAndy Fleming .mask = 0xffff0,
3209082eeacSAndy Fleming .features = PHY_GBIT_FEATURES,
3219082eeacSAndy Fleming .config = &genphy_config_aneg,
3229082eeacSAndy Fleming .startup = &vitesse_startup,
3239082eeacSAndy Fleming .shutdown = &genphy_shutdown,
3249082eeacSAndy Fleming };
3259082eeacSAndy Fleming
3269082eeacSAndy Fleming static struct phy_driver VSC8234_driver = {
3279082eeacSAndy Fleming .name = "Vitesse VSC8234",
3289082eeacSAndy Fleming .uid = 0xfc620,
3299082eeacSAndy Fleming .mask = 0xffff0,
3309082eeacSAndy Fleming .features = PHY_GBIT_FEATURES,
3319082eeacSAndy Fleming .config = &genphy_config_aneg,
3329082eeacSAndy Fleming .startup = &vitesse_startup,
3339082eeacSAndy Fleming .shutdown = &genphy_shutdown,
3349082eeacSAndy Fleming };
3359082eeacSAndy Fleming
3367794b1a7SShaohui Xie static struct phy_driver VSC8574_driver = {
3377794b1a7SShaohui Xie .name = "Vitesse VSC8574",
3387794b1a7SShaohui Xie .uid = 0x704a0,
3397794b1a7SShaohui Xie .mask = 0xffff0,
3407794b1a7SShaohui Xie .features = PHY_GBIT_FEATURES,
3417794b1a7SShaohui Xie .config = &vsc8574_config,
3427794b1a7SShaohui Xie .startup = &vitesse_startup,
3437794b1a7SShaohui Xie .shutdown = &genphy_shutdown,
3447794b1a7SShaohui Xie };
3457794b1a7SShaohui Xie
346e97a78cfSArpit Goel static struct phy_driver VSC8514_driver = {
347e97a78cfSArpit Goel .name = "Vitesse VSC8514",
34844afbbc0SCodrin Ciubotariu .uid = 0x70670,
349e97a78cfSArpit Goel .mask = 0xffff0,
350e97a78cfSArpit Goel .features = PHY_GBIT_FEATURES,
351e97a78cfSArpit Goel .config = &vsc8514_config,
352e97a78cfSArpit Goel .startup = &vitesse_startup,
353e97a78cfSArpit Goel .shutdown = &genphy_shutdown,
354e97a78cfSArpit Goel };
355e97a78cfSArpit Goel
3564c2620ddSPrabhakar Kushwaha static struct phy_driver VSC8584_driver = {
3574c2620ddSPrabhakar Kushwaha .name = "Vitesse VSC8584",
3584c2620ddSPrabhakar Kushwaha .uid = 0x707c0,
3594c2620ddSPrabhakar Kushwaha .mask = 0xffff0,
3604c2620ddSPrabhakar Kushwaha .features = PHY_GBIT_FEATURES,
3614c2620ddSPrabhakar Kushwaha .config = &vsc8574_config,
3624c2620ddSPrabhakar Kushwaha .startup = &vitesse_startup,
3634c2620ddSPrabhakar Kushwaha .shutdown = &genphy_shutdown,
3644c2620ddSPrabhakar Kushwaha };
3654c2620ddSPrabhakar Kushwaha
3669082eeacSAndy Fleming static struct phy_driver VSC8601_driver = {
3679082eeacSAndy Fleming .name = "Vitesse VSC8601",
3689082eeacSAndy Fleming .uid = 0x70420,
3699082eeacSAndy Fleming .mask = 0xffff0,
3709082eeacSAndy Fleming .features = PHY_GBIT_FEATURES,
3719082eeacSAndy Fleming .config = &vsc8601_config,
3729082eeacSAndy Fleming .startup = &vitesse_startup,
3739082eeacSAndy Fleming .shutdown = &genphy_shutdown,
3749082eeacSAndy Fleming };
3759082eeacSAndy Fleming
3769082eeacSAndy Fleming static struct phy_driver VSC8641_driver = {
3779082eeacSAndy Fleming .name = "Vitesse VSC8641",
3789082eeacSAndy Fleming .uid = 0x70430,
3799082eeacSAndy Fleming .mask = 0xffff0,
3809082eeacSAndy Fleming .features = PHY_GBIT_FEATURES,
3819082eeacSAndy Fleming .config = &genphy_config_aneg,
3829082eeacSAndy Fleming .startup = &vitesse_startup,
3839082eeacSAndy Fleming .shutdown = &genphy_shutdown,
3849082eeacSAndy Fleming };
3859082eeacSAndy Fleming
386f91ba0ecSPriyanka Jain static struct phy_driver VSC8662_driver = {
387f91ba0ecSPriyanka Jain .name = "Vitesse VSC8662",
388f91ba0ecSPriyanka Jain .uid = 0x70660,
389f91ba0ecSPriyanka Jain .mask = 0xffff0,
390f91ba0ecSPriyanka Jain .features = PHY_GBIT_FEATURES,
391f91ba0ecSPriyanka Jain .config = &genphy_config_aneg,
392f91ba0ecSPriyanka Jain .startup = &vitesse_startup,
393f91ba0ecSPriyanka Jain .shutdown = &genphy_shutdown,
394f91ba0ecSPriyanka Jain };
395f91ba0ecSPriyanka Jain
396ffc8667aSChunhe Lan static struct phy_driver VSC8664_driver = {
397ffc8667aSChunhe Lan .name = "Vitesse VSC8664",
398ffc8667aSChunhe Lan .uid = 0x70660,
399ffc8667aSChunhe Lan .mask = 0xffff0,
400ffc8667aSChunhe Lan .features = PHY_GBIT_FEATURES,
401ffc8667aSChunhe Lan .config = &vsc8664_config,
402ffc8667aSChunhe Lan .startup = &vitesse_startup,
403ffc8667aSChunhe Lan .shutdown = &genphy_shutdown,
404ffc8667aSChunhe Lan };
405ffc8667aSChunhe Lan
4069082eeacSAndy Fleming /* Vitesse bought Cicada, so we'll put these here */
4079082eeacSAndy Fleming static struct phy_driver cis8201_driver = {
4089082eeacSAndy Fleming .name = "CIS8201",
4099082eeacSAndy Fleming .uid = 0xfc410,
4109082eeacSAndy Fleming .mask = 0xffff0,
4119082eeacSAndy Fleming .features = PHY_GBIT_FEATURES,
4129082eeacSAndy Fleming .config = &vitesse_config,
4139082eeacSAndy Fleming .startup = &vitesse_startup,
4149082eeacSAndy Fleming .shutdown = &genphy_shutdown,
4159082eeacSAndy Fleming };
4169082eeacSAndy Fleming
4179082eeacSAndy Fleming static struct phy_driver cis8204_driver = {
4189082eeacSAndy Fleming .name = "Cicada Cis8204",
4199082eeacSAndy Fleming .uid = 0xfc440,
4209082eeacSAndy Fleming .mask = 0xffff0,
4219082eeacSAndy Fleming .features = PHY_GBIT_FEATURES,
4229082eeacSAndy Fleming .config = &cis8204_config,
4239082eeacSAndy Fleming .startup = &vitesse_startup,
4249082eeacSAndy Fleming .shutdown = &genphy_shutdown,
4259082eeacSAndy Fleming };
4269082eeacSAndy Fleming
phy_vitesse_init(void)4279082eeacSAndy Fleming int phy_vitesse_init(void)
4289082eeacSAndy Fleming {
4299082eeacSAndy Fleming phy_register(&VSC8641_driver);
4309082eeacSAndy Fleming phy_register(&VSC8601_driver);
4319082eeacSAndy Fleming phy_register(&VSC8234_driver);
4329082eeacSAndy Fleming phy_register(&VSC8244_driver);
4339082eeacSAndy Fleming phy_register(&VSC8211_driver);
4349082eeacSAndy Fleming phy_register(&VSC8221_driver);
4357794b1a7SShaohui Xie phy_register(&VSC8574_driver);
4364c2620ddSPrabhakar Kushwaha phy_register(&VSC8584_driver);
437e97a78cfSArpit Goel phy_register(&VSC8514_driver);
438f91ba0ecSPriyanka Jain phy_register(&VSC8662_driver);
439ffc8667aSChunhe Lan phy_register(&VSC8664_driver);
4409082eeacSAndy Fleming phy_register(&cis8201_driver);
4419082eeacSAndy Fleming phy_register(&cis8204_driver);
4429082eeacSAndy Fleming
4439082eeacSAndy Fleming return 0;
4449082eeacSAndy Fleming }
445