xref: /openbmc/u-boot/drivers/net/phy/atheros.c (revision 2ec4d10b65d1f7d45098606e9a6857d587c3027c)
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 
119082eeacSAndy Fleming static int ar8021_config(struct phy_device *phydev)
129082eeacSAndy Fleming {
139082eeacSAndy Fleming 	phy_write(phydev, MDIO_DEVAD_NONE, 0x1d, 0x05);
149082eeacSAndy Fleming 	phy_write(phydev, MDIO_DEVAD_NONE, 0x1e, 0x3D47);
159082eeacSAndy Fleming 
16e0d80964SZhao Qiang 	phydev->supported = phydev->drv->features;
179082eeacSAndy Fleming 	return 0;
189082eeacSAndy Fleming }
199082eeacSAndy Fleming 
206027384aSXie Xiaobo static int ar8035_config(struct phy_device *phydev)
216027384aSXie Xiaobo {
226027384aSXie Xiaobo 	int regval;
236027384aSXie Xiaobo 
246027384aSXie Xiaobo 	phy_write(phydev, MDIO_DEVAD_NONE, 0xd, 0x0007);
256027384aSXie Xiaobo 	phy_write(phydev, MDIO_DEVAD_NONE, 0xe, 0x8016);
266027384aSXie Xiaobo 	phy_write(phydev, MDIO_DEVAD_NONE, 0xd, 0x4007);
276027384aSXie Xiaobo 	regval = phy_read(phydev, MDIO_DEVAD_NONE, 0xe);
286027384aSXie Xiaobo 	phy_write(phydev, MDIO_DEVAD_NONE, 0xe, (regval|0x0018));
296027384aSXie Xiaobo 
306027384aSXie Xiaobo 	phy_write(phydev, MDIO_DEVAD_NONE, 0x1d, 0x05);
316027384aSXie Xiaobo 	regval = phy_read(phydev, MDIO_DEVAD_NONE, 0x1e);
326027384aSXie Xiaobo 	phy_write(phydev, MDIO_DEVAD_NONE, 0x1e, (regval|0x0100));
336027384aSXie Xiaobo 
34*2ec4d10bSAndrea Merello 	if ((phydev->interface == PHY_INTERFACE_MODE_RGMII_ID) ||
35*2ec4d10bSAndrea Merello 	    (phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID)) {
36*2ec4d10bSAndrea Merello 		/* select debug reg 5 */
37*2ec4d10bSAndrea Merello 		phy_write(phydev, MDIO_DEVAD_NONE, 0x1D, 0x5);
38*2ec4d10bSAndrea Merello 		/* enable tx delay */
39*2ec4d10bSAndrea Merello 		phy_write(phydev, MDIO_DEVAD_NONE, 0x1E, 0x0100);
40*2ec4d10bSAndrea Merello 	}
41*2ec4d10bSAndrea Merello 
42*2ec4d10bSAndrea Merello 	if ((phydev->interface == PHY_INTERFACE_MODE_RGMII_ID) ||
43*2ec4d10bSAndrea Merello 	    (phydev->interface == PHY_INTERFACE_MODE_RGMII_RXID)) {
44*2ec4d10bSAndrea Merello 		/* select debug reg 0 */
45*2ec4d10bSAndrea Merello 		phy_write(phydev, MDIO_DEVAD_NONE, 0x1D, 0x0);
46*2ec4d10bSAndrea Merello 		/* enable rx delay */
47*2ec4d10bSAndrea Merello 		phy_write(phydev, MDIO_DEVAD_NONE, 0x1E, 0x8000);
48*2ec4d10bSAndrea Merello 	}
49*2ec4d10bSAndrea Merello 
5002aa4c53SXiaobo Xie 	phydev->supported = phydev->drv->features;
516027384aSXie Xiaobo 
52903d384dSAlison Wang 	genphy_config_aneg(phydev);
53903d384dSAlison Wang 	genphy_restart_aneg(phydev);
54903d384dSAlison Wang 
556027384aSXie Xiaobo 	return 0;
566027384aSXie Xiaobo }
576027384aSXie Xiaobo 
5806370590SKim Phillips static struct phy_driver AR8021_driver =  {
599082eeacSAndy Fleming 	.name = "AR8021",
609082eeacSAndy Fleming 	.uid = 0x4dd040,
61dc116bd6SHaijun.Zhang 	.mask = 0x4ffff0,
629082eeacSAndy Fleming 	.features = PHY_GBIT_FEATURES,
639082eeacSAndy Fleming 	.config = ar8021_config,
649082eeacSAndy Fleming 	.startup = genphy_startup,
659082eeacSAndy Fleming 	.shutdown = genphy_shutdown,
669082eeacSAndy Fleming };
679082eeacSAndy Fleming 
68433a2c53SHeiko Schocher static struct phy_driver AR8031_driver =  {
69626ee1e3SShengzhou Liu 	.name = "AR8031/AR8033",
70433a2c53SHeiko Schocher 	.uid = 0x4dd074,
71f66e3dedSFabio Estevam 	.mask = 0xffffffef,
72433a2c53SHeiko Schocher 	.features = PHY_GBIT_FEATURES,
73d584c68cSFabio Estevam 	.config = ar8035_config,
74433a2c53SHeiko Schocher 	.startup = genphy_startup,
75433a2c53SHeiko Schocher 	.shutdown = genphy_shutdown,
76433a2c53SHeiko Schocher };
77433a2c53SHeiko Schocher 
78433a2c53SHeiko Schocher static struct phy_driver AR8035_driver =  {
796027384aSXie Xiaobo 	.name = "AR8035",
806027384aSXie Xiaobo 	.uid = 0x4dd072,
81f66e3dedSFabio Estevam 	.mask = 0xffffffef,
826027384aSXie Xiaobo 	.features = PHY_GBIT_FEATURES,
836027384aSXie Xiaobo 	.config = ar8035_config,
846027384aSXie Xiaobo 	.startup = genphy_startup,
856027384aSXie Xiaobo 	.shutdown = genphy_shutdown,
866027384aSXie Xiaobo };
876027384aSXie Xiaobo 
889082eeacSAndy Fleming int phy_atheros_init(void)
899082eeacSAndy Fleming {
909082eeacSAndy Fleming 	phy_register(&AR8021_driver);
91433a2c53SHeiko Schocher 	phy_register(&AR8031_driver);
926027384aSXie Xiaobo 	phy_register(&AR8035_driver);
939082eeacSAndy Fleming 
949082eeacSAndy Fleming 	return 0;
959082eeacSAndy Fleming }
96