1 /* 2 * Atheros PHY drivers 3 * 4 * SPDX-License-Identifier: GPL-2.0+ 5 * 6 * Copyright 2011, 2013 Freescale Semiconductor, Inc. 7 * author Andy Fleming 8 */ 9 #include <phy.h> 10 11 static int ar8021_config(struct phy_device *phydev) 12 { 13 phy_write(phydev, MDIO_DEVAD_NONE, 0x1d, 0x05); 14 phy_write(phydev, MDIO_DEVAD_NONE, 0x1e, 0x3D47); 15 16 phydev->supported = phydev->drv->features; 17 return 0; 18 } 19 20 static int ar8035_config(struct phy_device *phydev) 21 { 22 int regval; 23 24 phy_write(phydev, MDIO_DEVAD_NONE, 0xd, 0x0007); 25 phy_write(phydev, MDIO_DEVAD_NONE, 0xe, 0x8016); 26 phy_write(phydev, MDIO_DEVAD_NONE, 0xd, 0x4007); 27 regval = phy_read(phydev, MDIO_DEVAD_NONE, 0xe); 28 phy_write(phydev, MDIO_DEVAD_NONE, 0xe, (regval|0x0018)); 29 30 phy_write(phydev, MDIO_DEVAD_NONE, 0x1d, 0x05); 31 regval = phy_read(phydev, MDIO_DEVAD_NONE, 0x1e); 32 phy_write(phydev, MDIO_DEVAD_NONE, 0x1e, (regval|0x0100)); 33 34 genphy_config_aneg(phydev); 35 36 phy_reset(phydev); 37 38 return 0; 39 } 40 41 static struct phy_driver AR8021_driver = { 42 .name = "AR8021", 43 .uid = 0x4dd040, 44 .mask = 0x4ffff0, 45 .features = PHY_GBIT_FEATURES, 46 .config = ar8021_config, 47 .startup = genphy_startup, 48 .shutdown = genphy_shutdown, 49 }; 50 51 static struct phy_driver AR8031_driver = { 52 .name = "AR8031/AR8033", 53 .uid = 0x4dd074, 54 .mask = 0xffffffef, 55 .features = PHY_GBIT_FEATURES, 56 .config = ar8021_config, 57 .startup = genphy_startup, 58 .shutdown = genphy_shutdown, 59 }; 60 61 static struct phy_driver AR8035_driver = { 62 .name = "AR8035", 63 .uid = 0x4dd072, 64 .mask = 0xffffffef, 65 .features = PHY_GBIT_FEATURES, 66 .config = ar8035_config, 67 .startup = genphy_startup, 68 .shutdown = genphy_shutdown, 69 }; 70 71 int phy_atheros_init(void) 72 { 73 phy_register(&AR8021_driver); 74 phy_register(&AR8031_driver); 75 phy_register(&AR8035_driver); 76 77 return 0; 78 } 79