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