xref: /rk3399_rockchip-uboot/drivers/net/phy/atheros.c (revision 44afdc4a12b9f6f48338e7975e4f08cfe90dba74)
19082eeacSAndy Fleming /*
29082eeacSAndy Fleming  * Atheros PHY drivers
39082eeacSAndy Fleming  *
41a459660SWolfgang Denk  * SPDX-License-Identifier:	GPL-2.0+
59082eeacSAndy Fleming  *
66027384aSXie Xiaobo  * Copyright 2011, 2013 Freescale Semiconductor, Inc.
79082eeacSAndy Fleming  * author Andy Fleming
89082eeacSAndy Fleming  */
99082eeacSAndy Fleming #include <phy.h>
109082eeacSAndy Fleming 
11*ce412b79SMugunthan V N #define AR803x_PHY_DEBUG_ADDR_REG	0x1d
12*ce412b79SMugunthan V N #define AR803x_PHY_DEBUG_DATA_REG	0x1e
13*ce412b79SMugunthan V N 
14*ce412b79SMugunthan V N #define AR803x_DEBUG_REG_5		0x5
15*ce412b79SMugunthan V N #define AR803x_RGMII_TX_CLK_DLY		0x100
16*ce412b79SMugunthan V N 
17*ce412b79SMugunthan V N #define AR803x_DEBUG_REG_0		0x0
18*ce412b79SMugunthan V N #define AR803x_RGMII_RX_CLK_DLY		0x8000
19*ce412b79SMugunthan V N 
ar8021_config(struct phy_device * phydev)209082eeacSAndy Fleming static int ar8021_config(struct phy_device *phydev)
219082eeacSAndy Fleming {
229082eeacSAndy Fleming 	phy_write(phydev, MDIO_DEVAD_NONE, 0x1d, 0x05);
239082eeacSAndy Fleming 	phy_write(phydev, MDIO_DEVAD_NONE, 0x1e, 0x3D47);
249082eeacSAndy Fleming 
25e0d80964SZhao Qiang 	phydev->supported = phydev->drv->features;
269082eeacSAndy Fleming 	return 0;
279082eeacSAndy Fleming }
289082eeacSAndy Fleming 
ar8031_config(struct phy_device * phydev)29*ce412b79SMugunthan V N static int ar8031_config(struct phy_device *phydev)
30*ce412b79SMugunthan V N {
31*ce412b79SMugunthan V N 	if (phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID ||
32*ce412b79SMugunthan V N 	    phydev->interface == PHY_INTERFACE_MODE_RGMII_ID) {
33*ce412b79SMugunthan V N 		phy_write(phydev, MDIO_DEVAD_NONE, AR803x_PHY_DEBUG_ADDR_REG,
34*ce412b79SMugunthan V N 			  AR803x_DEBUG_REG_5);
35*ce412b79SMugunthan V N 		phy_write(phydev, MDIO_DEVAD_NONE, AR803x_PHY_DEBUG_DATA_REG,
36*ce412b79SMugunthan V N 			  AR803x_RGMII_TX_CLK_DLY);
37*ce412b79SMugunthan V N 	}
38*ce412b79SMugunthan V N 
39*ce412b79SMugunthan V N 	if (phydev->interface == PHY_INTERFACE_MODE_RGMII_RXID ||
40*ce412b79SMugunthan V N 	    phydev->interface == PHY_INTERFACE_MODE_RGMII_ID) {
41*ce412b79SMugunthan V N 		phy_write(phydev, MDIO_DEVAD_NONE, AR803x_PHY_DEBUG_ADDR_REG,
42*ce412b79SMugunthan V N 			  AR803x_DEBUG_REG_0);
43*ce412b79SMugunthan V N 		phy_write(phydev, MDIO_DEVAD_NONE, AR803x_PHY_DEBUG_DATA_REG,
44*ce412b79SMugunthan V N 			  AR803x_RGMII_RX_CLK_DLY);
45*ce412b79SMugunthan V N 	}
46*ce412b79SMugunthan V N 
47*ce412b79SMugunthan V N 	phydev->supported = phydev->drv->features;
48*ce412b79SMugunthan V N 
49*ce412b79SMugunthan V N 	genphy_config_aneg(phydev);
50*ce412b79SMugunthan V N 	genphy_restart_aneg(phydev);
51*ce412b79SMugunthan V N 
52*ce412b79SMugunthan V N 	return 0;
53*ce412b79SMugunthan V N }
54*ce412b79SMugunthan V N 
ar8035_config(struct phy_device * phydev)556027384aSXie Xiaobo static int ar8035_config(struct phy_device *phydev)
566027384aSXie Xiaobo {
576027384aSXie Xiaobo 	int regval;
586027384aSXie Xiaobo 
596027384aSXie Xiaobo 	phy_write(phydev, MDIO_DEVAD_NONE, 0xd, 0x0007);
606027384aSXie Xiaobo 	phy_write(phydev, MDIO_DEVAD_NONE, 0xe, 0x8016);
616027384aSXie Xiaobo 	phy_write(phydev, MDIO_DEVAD_NONE, 0xd, 0x4007);
626027384aSXie Xiaobo 	regval = phy_read(phydev, MDIO_DEVAD_NONE, 0xe);
636027384aSXie Xiaobo 	phy_write(phydev, MDIO_DEVAD_NONE, 0xe, (regval|0x0018));
646027384aSXie Xiaobo 
656027384aSXie Xiaobo 	phy_write(phydev, MDIO_DEVAD_NONE, 0x1d, 0x05);
666027384aSXie Xiaobo 	regval = phy_read(phydev, MDIO_DEVAD_NONE, 0x1e);
676027384aSXie Xiaobo 	phy_write(phydev, MDIO_DEVAD_NONE, 0x1e, (regval|0x0100));
686027384aSXie Xiaobo 
692ec4d10bSAndrea Merello 	if ((phydev->interface == PHY_INTERFACE_MODE_RGMII_ID) ||
702ec4d10bSAndrea Merello 	    (phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID)) {
712ec4d10bSAndrea Merello 		/* select debug reg 5 */
722ec4d10bSAndrea Merello 		phy_write(phydev, MDIO_DEVAD_NONE, 0x1D, 0x5);
732ec4d10bSAndrea Merello 		/* enable tx delay */
742ec4d10bSAndrea Merello 		phy_write(phydev, MDIO_DEVAD_NONE, 0x1E, 0x0100);
752ec4d10bSAndrea Merello 	}
762ec4d10bSAndrea Merello 
772ec4d10bSAndrea Merello 	if ((phydev->interface == PHY_INTERFACE_MODE_RGMII_ID) ||
782ec4d10bSAndrea Merello 	    (phydev->interface == PHY_INTERFACE_MODE_RGMII_RXID)) {
792ec4d10bSAndrea Merello 		/* select debug reg 0 */
802ec4d10bSAndrea Merello 		phy_write(phydev, MDIO_DEVAD_NONE, 0x1D, 0x0);
812ec4d10bSAndrea Merello 		/* enable rx delay */
822ec4d10bSAndrea Merello 		phy_write(phydev, MDIO_DEVAD_NONE, 0x1E, 0x8000);
832ec4d10bSAndrea Merello 	}
842ec4d10bSAndrea Merello 
8502aa4c53SXiaobo Xie 	phydev->supported = phydev->drv->features;
866027384aSXie Xiaobo 
87903d384dSAlison Wang 	genphy_config_aneg(phydev);
88903d384dSAlison Wang 	genphy_restart_aneg(phydev);
89903d384dSAlison Wang 
906027384aSXie Xiaobo 	return 0;
916027384aSXie Xiaobo }
926027384aSXie Xiaobo 
9306370590SKim Phillips static struct phy_driver AR8021_driver =  {
949082eeacSAndy Fleming 	.name = "AR8021",
959082eeacSAndy Fleming 	.uid = 0x4dd040,
96dc116bd6SHaijun.Zhang 	.mask = 0x4ffff0,
979082eeacSAndy Fleming 	.features = PHY_GBIT_FEATURES,
989082eeacSAndy Fleming 	.config = ar8021_config,
999082eeacSAndy Fleming 	.startup = genphy_startup,
1009082eeacSAndy Fleming 	.shutdown = genphy_shutdown,
1019082eeacSAndy Fleming };
1029082eeacSAndy Fleming 
103433a2c53SHeiko Schocher static struct phy_driver AR8031_driver =  {
104626ee1e3SShengzhou Liu 	.name = "AR8031/AR8033",
105433a2c53SHeiko Schocher 	.uid = 0x4dd074,
106f66e3dedSFabio Estevam 	.mask = 0xffffffef,
107433a2c53SHeiko Schocher 	.features = PHY_GBIT_FEATURES,
108*ce412b79SMugunthan V N 	.config = ar8031_config,
109433a2c53SHeiko Schocher 	.startup = genphy_startup,
110433a2c53SHeiko Schocher 	.shutdown = genphy_shutdown,
111433a2c53SHeiko Schocher };
112433a2c53SHeiko Schocher 
113433a2c53SHeiko Schocher static struct phy_driver AR8035_driver =  {
1146027384aSXie Xiaobo 	.name = "AR8035",
1156027384aSXie Xiaobo 	.uid = 0x4dd072,
116f66e3dedSFabio Estevam 	.mask = 0xffffffef,
1176027384aSXie Xiaobo 	.features = PHY_GBIT_FEATURES,
1186027384aSXie Xiaobo 	.config = ar8035_config,
1196027384aSXie Xiaobo 	.startup = genphy_startup,
1206027384aSXie Xiaobo 	.shutdown = genphy_shutdown,
1216027384aSXie Xiaobo };
1226027384aSXie Xiaobo 
phy_atheros_init(void)1239082eeacSAndy Fleming int phy_atheros_init(void)
1249082eeacSAndy Fleming {
1259082eeacSAndy Fleming 	phy_register(&AR8021_driver);
126433a2c53SHeiko Schocher 	phy_register(&AR8031_driver);
1276027384aSXie Xiaobo 	phy_register(&AR8035_driver);
1289082eeacSAndy Fleming 
1299082eeacSAndy Fleming 	return 0;
1309082eeacSAndy Fleming }
131