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 phydev->supported = phydev->drv->features; 35 36 return 0; 37 } 38 39 static struct phy_driver AR8021_driver = { 40 .name = "AR8021", 41 .uid = 0x4dd040, 42 .mask = 0x4ffff0, 43 .features = PHY_GBIT_FEATURES, 44 .config = ar8021_config, 45 .startup = genphy_startup, 46 .shutdown = genphy_shutdown, 47 }; 48 49 static struct phy_driver AR8031_driver = { 50 .name = "AR8031/AR8033", 51 .uid = 0x4dd074, 52 .mask = 0xffffffef, 53 .features = PHY_GBIT_FEATURES, 54 .config = ar8021_config, 55 .startup = genphy_startup, 56 .shutdown = genphy_shutdown, 57 }; 58 59 static struct phy_driver AR8035_driver = { 60 .name = "AR8035", 61 .uid = 0x4dd072, 62 .mask = 0xffffffef, 63 .features = PHY_GBIT_FEATURES, 64 .config = ar8035_config, 65 .startup = genphy_startup, 66 .shutdown = genphy_shutdown, 67 }; 68 69 int phy_atheros_init(void) 70 { 71 phy_register(&AR8021_driver); 72 phy_register(&AR8031_driver); 73 phy_register(&AR8035_driver); 74 75 return 0; 76 } 77