xref: /rk3399_rockchip-uboot/drivers/net/phy/vitesse.c (revision e1a71f8b339220fa74c9cd5d36ae9c444c492e83)
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