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