19082eeacSAndy Fleming /*
29082eeacSAndy Fleming * Vitesse PHY drivers
39082eeacSAndy Fleming *
4c18fc2c9SShengzhou Liu * Copyright 2010-2014 Freescale Semiconductor, Inc.
5c18fc2c9SShengzhou 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 */
33bb135a01SAlex #define MII_VSC8601_EPHY_CTL 0x17
34bb135a01SAlex #define MII_VSC8601_EPHY_CTL_RGMII_SKEW (1 << 8)
359082eeacSAndy Fleming
369082eeacSAndy Fleming #define PHY_EXT_PAGE_ACCESS 0x1f
377794b1a7SShaohui Xie #define PHY_EXT_PAGE_ACCESS_GENERAL 0x10
387794b1a7SShaohui Xie #define PHY_EXT_PAGE_ACCESS_EXTENDED3 0x3
397794b1a7SShaohui Xie
407794b1a7SShaohui Xie /* Vitesse VSC8574 control register */
417794b1a7SShaohui Xie #define MIIM_VSC8574_MAC_SERDES_CON 0x10
427794b1a7SShaohui Xie #define MIIM_VSC8574_MAC_SERDES_ANEG 0x80
437794b1a7SShaohui Xie #define MIIM_VSC8574_GENERAL18 0x12
447794b1a7SShaohui Xie #define MIIM_VSC8574_GENERAL19 0x13
457794b1a7SShaohui Xie
467794b1a7SShaohui Xie /* Vitesse VSC8574 gerenal purpose register 18 */
477794b1a7SShaohui Xie #define MIIM_VSC8574_18G_SGMII 0x80f0
487794b1a7SShaohui Xie #define MIIM_VSC8574_18G_QSGMII 0x80e0
497794b1a7SShaohui Xie #define MIIM_VSC8574_18G_CMDSTAT 0x8000
509082eeacSAndy Fleming
51e97a78cfSArpit Goel /* Vitesse VSC8514 control register */
52c18fc2c9SShengzhou Liu #define MIIM_VSC8514_MAC_SERDES_CON 0x10
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
61ffc8667aSChunhe Lan /* Vitesse VSC8664 Control/Status Register */
62ffc8667aSChunhe Lan #define MIIM_VSC8664_SERDES_AND_SIGDET 0x13
63ffc8667aSChunhe Lan #define MIIM_VSC8664_ADDITIONAL_DEV 0x16
64ffc8667aSChunhe Lan #define MIIM_VSC8664_EPHY_CON 0x17
65ffc8667aSChunhe Lan #define MIIM_VSC8664_LED_CON 0x1E
66ffc8667aSChunhe Lan
67ffc8667aSChunhe Lan #define PHY_EXT_PAGE_ACCESS_EXTENDED 0x0001
68ffc8667aSChunhe Lan
699082eeacSAndy Fleming /* CIS8201 */
vitesse_config(struct phy_device * phydev)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
vitesse_parse_status(struct phy_device * phydev)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
vitesse_startup(struct phy_device * phydev)1129082eeacSAndy Fleming static int vitesse_startup(struct phy_device *phydev)
1139082eeacSAndy Fleming {
114b733c278SMichal Simek int ret;
1159082eeacSAndy Fleming
116b733c278SMichal Simek ret = genphy_update_link(phydev);
117b733c278SMichal Simek if (ret)
118b733c278SMichal Simek return ret;
119b733c278SMichal Simek return vitesse_parse_status(phydev);
1209082eeacSAndy Fleming }
1219082eeacSAndy Fleming
cis8204_config(struct phy_device * phydev)1229082eeacSAndy Fleming static int cis8204_config(struct phy_device *phydev)
1239082eeacSAndy Fleming {
1249082eeacSAndy Fleming /* Override PHY config settings */
1259082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, MIIM_CIS82xx_AUX_CONSTAT,
1269082eeacSAndy Fleming MIIM_CIS82xx_AUXCONSTAT_INIT);
1279082eeacSAndy Fleming
1289082eeacSAndy Fleming genphy_config_aneg(phydev);
1299082eeacSAndy Fleming
130*3b5f5280SPhil Edworthy if (phy_interface_is_rgmii(phydev))
1319082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, MIIM_CIS8204_EPHY_CON,
1329082eeacSAndy Fleming MIIM_CIS8204_EPHYCON_INIT |
1339082eeacSAndy Fleming MIIM_CIS8204_EPHYCON_RGMII);
1349082eeacSAndy Fleming else
1359082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, MIIM_CIS8204_EPHY_CON,
1369082eeacSAndy Fleming MIIM_CIS8204_EPHYCON_INIT);
1379082eeacSAndy Fleming
1389082eeacSAndy Fleming return 0;
1399082eeacSAndy Fleming }
1409082eeacSAndy Fleming
1419082eeacSAndy Fleming /* Vitesse VSC8601 */
142bb135a01SAlex /* This adds a skew for both TX and RX clocks, so the skew should only be
143bb135a01SAlex * applied to "rgmii-id" interfaces. It may not work as expected
144bb135a01SAlex * on "rgmii-txid", "rgmii-rxid" or "rgmii" interfaces. */
vsc8601_add_skew(struct phy_device * phydev)145bb135a01SAlex static int vsc8601_add_skew(struct phy_device *phydev)
146bb135a01SAlex {
147bb135a01SAlex int ret;
148bb135a01SAlex
149bb135a01SAlex ret = phy_read(phydev, MDIO_DEVAD_NONE, MII_VSC8601_EPHY_CTL);
150bb135a01SAlex if (ret < 0)
151bb135a01SAlex return ret;
152bb135a01SAlex
153bb135a01SAlex ret |= MII_VSC8601_EPHY_CTL_RGMII_SKEW;
154bb135a01SAlex return phy_write(phydev, MDIO_DEVAD_NONE, MII_VSC8601_EPHY_CTL, ret);
155bb135a01SAlex }
156bb135a01SAlex
vsc8601_config(struct phy_device * phydev)157960d70c6SKim Phillips static int vsc8601_config(struct phy_device *phydev)
1589082eeacSAndy Fleming {
159bb135a01SAlex int ret = 0;
1609082eeacSAndy Fleming
161bb135a01SAlex if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID)
162bb135a01SAlex ret = vsc8601_add_skew(phydev);
1639082eeacSAndy Fleming
164bb135a01SAlex if (ret < 0)
165bb135a01SAlex return ret;
166bb135a01SAlex
167bb135a01SAlex return genphy_config_aneg(phydev);
1689082eeacSAndy Fleming }
1699082eeacSAndy Fleming
vsc8574_config(struct phy_device * phydev)1707794b1a7SShaohui Xie static int vsc8574_config(struct phy_device *phydev)
1717794b1a7SShaohui Xie {
1727794b1a7SShaohui Xie u32 val;
173e97a78cfSArpit Goel /* configure register 19G for MAC */
1747794b1a7SShaohui Xie phy_write(phydev, MDIO_DEVAD_NONE, PHY_EXT_PAGE_ACCESS,
1757794b1a7SShaohui Xie PHY_EXT_PAGE_ACCESS_GENERAL);
1767794b1a7SShaohui Xie
1777794b1a7SShaohui Xie val = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_VSC8574_GENERAL19);
1787794b1a7SShaohui Xie if (phydev->interface == PHY_INTERFACE_MODE_QSGMII) {
1797794b1a7SShaohui Xie /* set bit 15:14 to '01' for QSGMII mode */
1807794b1a7SShaohui Xie val = (val & 0x3fff) | (1 << 14);
1817794b1a7SShaohui Xie phy_write(phydev, MDIO_DEVAD_NONE,
1827794b1a7SShaohui Xie MIIM_VSC8574_GENERAL19, val);
1837794b1a7SShaohui Xie /* Enable 4 ports MAC QSGMII */
1847794b1a7SShaohui Xie phy_write(phydev, MDIO_DEVAD_NONE, MIIM_VSC8574_GENERAL18,
1857794b1a7SShaohui Xie MIIM_VSC8574_18G_QSGMII);
1867794b1a7SShaohui Xie } else {
1877794b1a7SShaohui Xie /* set bit 15:14 to '00' for SGMII mode */
1887794b1a7SShaohui Xie val = val & 0x3fff;
1897794b1a7SShaohui Xie phy_write(phydev, MDIO_DEVAD_NONE, MIIM_VSC8574_GENERAL19, val);
1907794b1a7SShaohui Xie /* Enable 4 ports MAC SGMII */
1917794b1a7SShaohui Xie phy_write(phydev, MDIO_DEVAD_NONE, MIIM_VSC8574_GENERAL18,
1927794b1a7SShaohui Xie MIIM_VSC8574_18G_SGMII);
1937794b1a7SShaohui Xie }
1947794b1a7SShaohui Xie val = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_VSC8574_GENERAL18);
1957794b1a7SShaohui Xie /* When bit 15 is cleared the command has completed */
1967794b1a7SShaohui Xie while (val & MIIM_VSC8574_18G_CMDSTAT)
1977794b1a7SShaohui Xie val = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_VSC8574_GENERAL18);
1987794b1a7SShaohui Xie
1997794b1a7SShaohui Xie /* Enable Serdes Auto-negotiation */
2007794b1a7SShaohui Xie phy_write(phydev, MDIO_DEVAD_NONE, PHY_EXT_PAGE_ACCESS,
2017794b1a7SShaohui Xie PHY_EXT_PAGE_ACCESS_EXTENDED3);
2027794b1a7SShaohui Xie val = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_VSC8574_MAC_SERDES_CON);
2037794b1a7SShaohui Xie val = val | MIIM_VSC8574_MAC_SERDES_ANEG;
2047794b1a7SShaohui Xie phy_write(phydev, MDIO_DEVAD_NONE, MIIM_VSC8574_MAC_SERDES_CON, val);
2057794b1a7SShaohui Xie
2067794b1a7SShaohui Xie phy_write(phydev, MDIO_DEVAD_NONE, PHY_EXT_PAGE_ACCESS, 0);
2077794b1a7SShaohui Xie
2087794b1a7SShaohui Xie genphy_config_aneg(phydev);
2097794b1a7SShaohui Xie
2107794b1a7SShaohui Xie return 0;
2117794b1a7SShaohui Xie }
2127794b1a7SShaohui Xie
vsc8514_config(struct phy_device * phydev)213e97a78cfSArpit Goel static int vsc8514_config(struct phy_device *phydev)
214e97a78cfSArpit Goel {
215e97a78cfSArpit Goel u32 val;
216e97a78cfSArpit Goel int timeout = 1000000;
217e97a78cfSArpit Goel
218e97a78cfSArpit Goel /* configure register to access 19G */
219e97a78cfSArpit Goel phy_write(phydev, MDIO_DEVAD_NONE, PHY_EXT_PAGE_ACCESS,
220e97a78cfSArpit Goel PHY_EXT_PAGE_ACCESS_GENERAL);
221e97a78cfSArpit Goel
222e97a78cfSArpit Goel val = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_VSC8514_GENERAL19);
223e97a78cfSArpit Goel if (phydev->interface == PHY_INTERFACE_MODE_QSGMII) {
224e97a78cfSArpit Goel /* set bit 15:14 to '01' for QSGMII mode */
225e97a78cfSArpit Goel val = (val & 0x3fff) | (1 << 14);
226e97a78cfSArpit Goel phy_write(phydev, MDIO_DEVAD_NONE,
227e97a78cfSArpit Goel MIIM_VSC8514_GENERAL19, val);
228e97a78cfSArpit Goel /* Enable 4 ports MAC QSGMII */
229e97a78cfSArpit Goel phy_write(phydev, MDIO_DEVAD_NONE, MIIM_VSC8514_GENERAL18,
230e97a78cfSArpit Goel MIIM_VSC8514_18G_QSGMII);
231e97a78cfSArpit Goel } else {
232e97a78cfSArpit Goel /*TODO Add SGMII functionality once spec sheet
233e97a78cfSArpit Goel * for VSC8514 defines complete functionality
234e97a78cfSArpit Goel */
235e97a78cfSArpit Goel }
236e97a78cfSArpit Goel
237e97a78cfSArpit Goel val = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_VSC8514_GENERAL18);
238e97a78cfSArpit Goel /* When bit 15 is cleared the command has completed */
239e97a78cfSArpit Goel while ((val & MIIM_VSC8514_18G_CMDSTAT) && timeout--)
240e97a78cfSArpit Goel val = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_VSC8514_GENERAL18);
241e97a78cfSArpit Goel
242e97a78cfSArpit Goel if (0 == timeout) {
243e97a78cfSArpit Goel printf("PHY 8514 config failed\n");
244e97a78cfSArpit Goel return -1;
245e97a78cfSArpit Goel }
246e97a78cfSArpit Goel
247e97a78cfSArpit Goel phy_write(phydev, MDIO_DEVAD_NONE, PHY_EXT_PAGE_ACCESS, 0);
248e97a78cfSArpit Goel
249e97a78cfSArpit Goel /* configure register to access 23 */
250e97a78cfSArpit Goel val = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_VSC8514_GENERAL23);
251e97a78cfSArpit Goel /* set bits 10:8 to '000' */
252e97a78cfSArpit Goel val = (val & 0xf8ff);
253e97a78cfSArpit Goel phy_write(phydev, MDIO_DEVAD_NONE, MIIM_VSC8514_GENERAL23, val);
254e97a78cfSArpit Goel
255c18fc2c9SShengzhou Liu /* Enable Serdes Auto-negotiation */
256c18fc2c9SShengzhou Liu phy_write(phydev, MDIO_DEVAD_NONE, PHY_EXT_PAGE_ACCESS,
257c18fc2c9SShengzhou Liu PHY_EXT_PAGE_ACCESS_EXTENDED3);
258c18fc2c9SShengzhou Liu val = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_VSC8514_MAC_SERDES_CON);
259c18fc2c9SShengzhou Liu val = val | MIIM_VSC8574_MAC_SERDES_ANEG;
260c18fc2c9SShengzhou Liu phy_write(phydev, MDIO_DEVAD_NONE, MIIM_VSC8514_MAC_SERDES_CON, val);
261c18fc2c9SShengzhou Liu phy_write(phydev, MDIO_DEVAD_NONE, PHY_EXT_PAGE_ACCESS, 0);
262c18fc2c9SShengzhou Liu
263e97a78cfSArpit Goel genphy_config_aneg(phydev);
264e97a78cfSArpit Goel
265e97a78cfSArpit Goel return 0;
266e97a78cfSArpit Goel }
267e97a78cfSArpit Goel
vsc8664_config(struct phy_device * phydev)268ffc8667aSChunhe Lan static int vsc8664_config(struct phy_device *phydev)
269ffc8667aSChunhe Lan {
270ffc8667aSChunhe Lan u32 val;
271ffc8667aSChunhe Lan
272ffc8667aSChunhe Lan /* Enable MAC interface auto-negotiation */
273ffc8667aSChunhe Lan phy_write(phydev, MDIO_DEVAD_NONE, PHY_EXT_PAGE_ACCESS, 0);
274ffc8667aSChunhe Lan val = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_VSC8664_EPHY_CON);
275ffc8667aSChunhe Lan val |= (1 << 13);
276ffc8667aSChunhe Lan phy_write(phydev, MDIO_DEVAD_NONE, MIIM_VSC8664_EPHY_CON, val);
277ffc8667aSChunhe Lan
278ffc8667aSChunhe Lan phy_write(phydev, MDIO_DEVAD_NONE, PHY_EXT_PAGE_ACCESS,
279ffc8667aSChunhe Lan PHY_EXT_PAGE_ACCESS_EXTENDED);
280ffc8667aSChunhe Lan val = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_VSC8664_SERDES_AND_SIGDET);
281ffc8667aSChunhe Lan val |= (1 << 11);
282ffc8667aSChunhe Lan phy_write(phydev, MDIO_DEVAD_NONE, MIIM_VSC8664_SERDES_AND_SIGDET, val);
283ffc8667aSChunhe Lan phy_write(phydev, MDIO_DEVAD_NONE, PHY_EXT_PAGE_ACCESS, 0);
284ffc8667aSChunhe Lan
285ffc8667aSChunhe Lan /* Enable LED blink */
286ffc8667aSChunhe Lan val = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_VSC8664_LED_CON);
287ffc8667aSChunhe Lan val &= ~(1 << 2);
288ffc8667aSChunhe Lan phy_write(phydev, MDIO_DEVAD_NONE, MIIM_VSC8664_LED_CON, val);
289ffc8667aSChunhe Lan
290ffc8667aSChunhe Lan genphy_config_aneg(phydev);
291ffc8667aSChunhe Lan
292ffc8667aSChunhe Lan return 0;
293ffc8667aSChunhe Lan }
294ffc8667aSChunhe Lan
2959082eeacSAndy Fleming static struct phy_driver VSC8211_driver = {
2969082eeacSAndy Fleming .name = "Vitesse VSC8211",
2979082eeacSAndy Fleming .uid = 0xfc4b0,
2989082eeacSAndy Fleming .mask = 0xffff0,
2999082eeacSAndy Fleming .features = PHY_GBIT_FEATURES,
3009082eeacSAndy Fleming .config = &vitesse_config,
3019082eeacSAndy Fleming .startup = &vitesse_startup,
3029082eeacSAndy Fleming .shutdown = &genphy_shutdown,
3039082eeacSAndy Fleming };
3049082eeacSAndy Fleming
3059082eeacSAndy Fleming static struct phy_driver VSC8221_driver = {
3069082eeacSAndy Fleming .name = "Vitesse VSC8221",
3079082eeacSAndy Fleming .uid = 0xfc550,
3089082eeacSAndy Fleming .mask = 0xffff0,
3099082eeacSAndy Fleming .features = PHY_GBIT_FEATURES,
3109082eeacSAndy Fleming .config = &genphy_config_aneg,
3119082eeacSAndy Fleming .startup = &vitesse_startup,
3129082eeacSAndy Fleming .shutdown = &genphy_shutdown,
3139082eeacSAndy Fleming };
3149082eeacSAndy Fleming
3159082eeacSAndy Fleming static struct phy_driver VSC8244_driver = {
3169082eeacSAndy Fleming .name = "Vitesse VSC8244",
3179082eeacSAndy Fleming .uid = 0xfc6c0,
3189082eeacSAndy Fleming .mask = 0xffff0,
3199082eeacSAndy Fleming .features = PHY_GBIT_FEATURES,
3209082eeacSAndy Fleming .config = &genphy_config_aneg,
3219082eeacSAndy Fleming .startup = &vitesse_startup,
3229082eeacSAndy Fleming .shutdown = &genphy_shutdown,
3239082eeacSAndy Fleming };
3249082eeacSAndy Fleming
3259082eeacSAndy Fleming static struct phy_driver VSC8234_driver = {
3269082eeacSAndy Fleming .name = "Vitesse VSC8234",
3279082eeacSAndy Fleming .uid = 0xfc620,
3289082eeacSAndy Fleming .mask = 0xffff0,
3299082eeacSAndy Fleming .features = PHY_GBIT_FEATURES,
3309082eeacSAndy Fleming .config = &genphy_config_aneg,
3319082eeacSAndy Fleming .startup = &vitesse_startup,
3329082eeacSAndy Fleming .shutdown = &genphy_shutdown,
3339082eeacSAndy Fleming };
3349082eeacSAndy Fleming
3357794b1a7SShaohui Xie static struct phy_driver VSC8574_driver = {
3367794b1a7SShaohui Xie .name = "Vitesse VSC8574",
3377794b1a7SShaohui Xie .uid = 0x704a0,
3387794b1a7SShaohui Xie .mask = 0xffff0,
3397794b1a7SShaohui Xie .features = PHY_GBIT_FEATURES,
3407794b1a7SShaohui Xie .config = &vsc8574_config,
3417794b1a7SShaohui Xie .startup = &vitesse_startup,
3427794b1a7SShaohui Xie .shutdown = &genphy_shutdown,
3437794b1a7SShaohui Xie };
3447794b1a7SShaohui Xie
345e97a78cfSArpit Goel static struct phy_driver VSC8514_driver = {
346e97a78cfSArpit Goel .name = "Vitesse VSC8514",
34744afbbc0SCodrin Ciubotariu .uid = 0x70670,
348e97a78cfSArpit Goel .mask = 0xffff0,
349e97a78cfSArpit Goel .features = PHY_GBIT_FEATURES,
350e97a78cfSArpit Goel .config = &vsc8514_config,
351e97a78cfSArpit Goel .startup = &vitesse_startup,
352e97a78cfSArpit Goel .shutdown = &genphy_shutdown,
353e97a78cfSArpit Goel };
354e97a78cfSArpit Goel
3554c2620ddSPrabhakar Kushwaha static struct phy_driver VSC8584_driver = {
3564c2620ddSPrabhakar Kushwaha .name = "Vitesse VSC8584",
3574c2620ddSPrabhakar Kushwaha .uid = 0x707c0,
3584c2620ddSPrabhakar Kushwaha .mask = 0xffff0,
3594c2620ddSPrabhakar Kushwaha .features = PHY_GBIT_FEATURES,
3604c2620ddSPrabhakar Kushwaha .config = &vsc8574_config,
3614c2620ddSPrabhakar Kushwaha .startup = &vitesse_startup,
3624c2620ddSPrabhakar Kushwaha .shutdown = &genphy_shutdown,
3634c2620ddSPrabhakar Kushwaha };
3644c2620ddSPrabhakar Kushwaha
3659082eeacSAndy Fleming static struct phy_driver VSC8601_driver = {
3669082eeacSAndy Fleming .name = "Vitesse VSC8601",
3679082eeacSAndy Fleming .uid = 0x70420,
3689082eeacSAndy Fleming .mask = 0xffff0,
3699082eeacSAndy Fleming .features = PHY_GBIT_FEATURES,
3709082eeacSAndy Fleming .config = &vsc8601_config,
3719082eeacSAndy Fleming .startup = &vitesse_startup,
3729082eeacSAndy Fleming .shutdown = &genphy_shutdown,
3739082eeacSAndy Fleming };
3749082eeacSAndy Fleming
3759082eeacSAndy Fleming static struct phy_driver VSC8641_driver = {
3769082eeacSAndy Fleming .name = "Vitesse VSC8641",
3779082eeacSAndy Fleming .uid = 0x70430,
3789082eeacSAndy Fleming .mask = 0xffff0,
3799082eeacSAndy Fleming .features = PHY_GBIT_FEATURES,
3809082eeacSAndy Fleming .config = &genphy_config_aneg,
3819082eeacSAndy Fleming .startup = &vitesse_startup,
3829082eeacSAndy Fleming .shutdown = &genphy_shutdown,
3839082eeacSAndy Fleming };
3849082eeacSAndy Fleming
385f91ba0ecSPriyanka Jain static struct phy_driver VSC8662_driver = {
386f91ba0ecSPriyanka Jain .name = "Vitesse VSC8662",
387f91ba0ecSPriyanka Jain .uid = 0x70660,
388f91ba0ecSPriyanka Jain .mask = 0xffff0,
389f91ba0ecSPriyanka Jain .features = PHY_GBIT_FEATURES,
390f91ba0ecSPriyanka Jain .config = &genphy_config_aneg,
391f91ba0ecSPriyanka Jain .startup = &vitesse_startup,
392f91ba0ecSPriyanka Jain .shutdown = &genphy_shutdown,
393f91ba0ecSPriyanka Jain };
394f91ba0ecSPriyanka Jain
395ffc8667aSChunhe Lan static struct phy_driver VSC8664_driver = {
396ffc8667aSChunhe Lan .name = "Vitesse VSC8664",
397ffc8667aSChunhe Lan .uid = 0x70660,
398ffc8667aSChunhe Lan .mask = 0xffff0,
399ffc8667aSChunhe Lan .features = PHY_GBIT_FEATURES,
400ffc8667aSChunhe Lan .config = &vsc8664_config,
401ffc8667aSChunhe Lan .startup = &vitesse_startup,
402ffc8667aSChunhe Lan .shutdown = &genphy_shutdown,
403ffc8667aSChunhe Lan };
404ffc8667aSChunhe Lan
4059082eeacSAndy Fleming /* Vitesse bought Cicada, so we'll put these here */
4069082eeacSAndy Fleming static struct phy_driver cis8201_driver = {
4079082eeacSAndy Fleming .name = "CIS8201",
4089082eeacSAndy Fleming .uid = 0xfc410,
4099082eeacSAndy Fleming .mask = 0xffff0,
4109082eeacSAndy Fleming .features = PHY_GBIT_FEATURES,
4119082eeacSAndy Fleming .config = &vitesse_config,
4129082eeacSAndy Fleming .startup = &vitesse_startup,
4139082eeacSAndy Fleming .shutdown = &genphy_shutdown,
4149082eeacSAndy Fleming };
4159082eeacSAndy Fleming
4169082eeacSAndy Fleming static struct phy_driver cis8204_driver = {
4179082eeacSAndy Fleming .name = "Cicada Cis8204",
4189082eeacSAndy Fleming .uid = 0xfc440,
4199082eeacSAndy Fleming .mask = 0xffff0,
4209082eeacSAndy Fleming .features = PHY_GBIT_FEATURES,
4219082eeacSAndy Fleming .config = &cis8204_config,
4229082eeacSAndy Fleming .startup = &vitesse_startup,
4239082eeacSAndy Fleming .shutdown = &genphy_shutdown,
4249082eeacSAndy Fleming };
4259082eeacSAndy Fleming
phy_vitesse_init(void)4269082eeacSAndy Fleming int phy_vitesse_init(void)
4279082eeacSAndy Fleming {
4289082eeacSAndy Fleming phy_register(&VSC8641_driver);
4299082eeacSAndy Fleming phy_register(&VSC8601_driver);
4309082eeacSAndy Fleming phy_register(&VSC8234_driver);
4319082eeacSAndy Fleming phy_register(&VSC8244_driver);
4329082eeacSAndy Fleming phy_register(&VSC8211_driver);
4339082eeacSAndy Fleming phy_register(&VSC8221_driver);
4347794b1a7SShaohui Xie phy_register(&VSC8574_driver);
4354c2620ddSPrabhakar Kushwaha phy_register(&VSC8584_driver);
436e97a78cfSArpit Goel phy_register(&VSC8514_driver);
437f91ba0ecSPriyanka Jain phy_register(&VSC8662_driver);
438ffc8667aSChunhe Lan phy_register(&VSC8664_driver);
4399082eeacSAndy Fleming phy_register(&cis8201_driver);
4409082eeacSAndy Fleming phy_register(&cis8204_driver);
4419082eeacSAndy Fleming
4429082eeacSAndy Fleming return 0;
4439082eeacSAndy Fleming }
444