1*83d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+ 29082eeacSAndy Fleming /* 39082eeacSAndy Fleming * Atheros PHY drivers 49082eeacSAndy Fleming * 56027384aSXie Xiaobo * Copyright 2011, 2013 Freescale Semiconductor, Inc. 69082eeacSAndy Fleming * author Andy Fleming 79082eeacSAndy Fleming */ 89082eeacSAndy Fleming #include <phy.h> 99082eeacSAndy Fleming 10ce412b79SMugunthan V N #define AR803x_PHY_DEBUG_ADDR_REG 0x1d 11ce412b79SMugunthan V N #define AR803x_PHY_DEBUG_DATA_REG 0x1e 12ce412b79SMugunthan V N 13ce412b79SMugunthan V N #define AR803x_DEBUG_REG_5 0x5 14ce412b79SMugunthan V N #define AR803x_RGMII_TX_CLK_DLY 0x100 15ce412b79SMugunthan V N 16ce412b79SMugunthan V N #define AR803x_DEBUG_REG_0 0x0 17ce412b79SMugunthan V N #define AR803x_RGMII_RX_CLK_DLY 0x8000 18ce412b79SMugunthan V N 199082eeacSAndy Fleming static int ar8021_config(struct phy_device *phydev) 209082eeacSAndy Fleming { 211e2d2597SZhao Qiang phy_write(phydev, MDIO_DEVAD_NONE, 0x00, 0x1200); 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 29ce412b79SMugunthan V N static int ar8031_config(struct phy_device *phydev) 30ce412b79SMugunthan V N { 31ce412b79SMugunthan V N if (phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID || 32ce412b79SMugunthan V N phydev->interface == PHY_INTERFACE_MODE_RGMII_ID) { 33ce412b79SMugunthan V N phy_write(phydev, MDIO_DEVAD_NONE, AR803x_PHY_DEBUG_ADDR_REG, 34ce412b79SMugunthan V N AR803x_DEBUG_REG_5); 35ce412b79SMugunthan V N phy_write(phydev, MDIO_DEVAD_NONE, AR803x_PHY_DEBUG_DATA_REG, 36ce412b79SMugunthan V N AR803x_RGMII_TX_CLK_DLY); 37ce412b79SMugunthan V N } 38ce412b79SMugunthan V N 39ce412b79SMugunthan V N if (phydev->interface == PHY_INTERFACE_MODE_RGMII_RXID || 40ce412b79SMugunthan V N phydev->interface == PHY_INTERFACE_MODE_RGMII_ID) { 41ce412b79SMugunthan V N phy_write(phydev, MDIO_DEVAD_NONE, AR803x_PHY_DEBUG_ADDR_REG, 42ce412b79SMugunthan V N AR803x_DEBUG_REG_0); 43ce412b79SMugunthan V N phy_write(phydev, MDIO_DEVAD_NONE, AR803x_PHY_DEBUG_DATA_REG, 44ce412b79SMugunthan V N AR803x_RGMII_RX_CLK_DLY); 45ce412b79SMugunthan V N } 46ce412b79SMugunthan V N 47ce412b79SMugunthan V N phydev->supported = phydev->drv->features; 48ce412b79SMugunthan V N 49ce412b79SMugunthan V N genphy_config_aneg(phydev); 50ce412b79SMugunthan V N genphy_restart_aneg(phydev); 51ce412b79SMugunthan V N 52ce412b79SMugunthan V N return 0; 53ce412b79SMugunthan V N } 54ce412b79SMugunthan V N 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, 108ce412b79SMugunthan 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 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