19082eeacSAndy Fleming /* 29082eeacSAndy Fleming * Atheros PHY drivers 39082eeacSAndy Fleming * 49082eeacSAndy Fleming * This program is free software; you can redistribute it and/or 59082eeacSAndy Fleming * modify it under the terms of the GNU General Public License as 69082eeacSAndy Fleming * published by the Free Software Foundation; either version 2 of 79082eeacSAndy Fleming * the License, or (at your option) any later version. 89082eeacSAndy Fleming * 99082eeacSAndy Fleming * This program is distributed in the hope that it will be useful, 109082eeacSAndy Fleming * but WITHOUT ANY WARRANTY; without even the implied warranty of 119082eeacSAndy Fleming * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 129082eeacSAndy Fleming * GNU General Public License for more details. 139082eeacSAndy Fleming * 149082eeacSAndy Fleming * You should have received a copy of the GNU General Public License 159082eeacSAndy Fleming * along with this program; if not, write to the Free Software 169082eeacSAndy Fleming * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 179082eeacSAndy Fleming * MA 02111-1307 USA 189082eeacSAndy Fleming * 19*6027384aSXie Xiaobo * Copyright 2011, 2013 Freescale Semiconductor, Inc. 209082eeacSAndy Fleming * author Andy Fleming 219082eeacSAndy Fleming * 229082eeacSAndy Fleming */ 239082eeacSAndy Fleming #include <phy.h> 249082eeacSAndy Fleming 259082eeacSAndy Fleming static int ar8021_config(struct phy_device *phydev) 269082eeacSAndy Fleming { 279082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, 0x1d, 0x05); 289082eeacSAndy Fleming phy_write(phydev, MDIO_DEVAD_NONE, 0x1e, 0x3D47); 299082eeacSAndy Fleming 309082eeacSAndy Fleming return 0; 319082eeacSAndy Fleming } 329082eeacSAndy Fleming 33*6027384aSXie Xiaobo static int ar8035_config(struct phy_device *phydev) 34*6027384aSXie Xiaobo { 35*6027384aSXie Xiaobo int regval; 36*6027384aSXie Xiaobo 37*6027384aSXie Xiaobo phy_write(phydev, MDIO_DEVAD_NONE, 0xd, 0x0007); 38*6027384aSXie Xiaobo phy_write(phydev, MDIO_DEVAD_NONE, 0xe, 0x8016); 39*6027384aSXie Xiaobo phy_write(phydev, MDIO_DEVAD_NONE, 0xd, 0x4007); 40*6027384aSXie Xiaobo regval = phy_read(phydev, MDIO_DEVAD_NONE, 0xe); 41*6027384aSXie Xiaobo phy_write(phydev, MDIO_DEVAD_NONE, 0xe, (regval|0x0018)); 42*6027384aSXie Xiaobo 43*6027384aSXie Xiaobo phy_write(phydev, MDIO_DEVAD_NONE, 0x1d, 0x05); 44*6027384aSXie Xiaobo regval = phy_read(phydev, MDIO_DEVAD_NONE, 0x1e); 45*6027384aSXie Xiaobo phy_write(phydev, MDIO_DEVAD_NONE, 0x1e, (regval|0x0100)); 46*6027384aSXie Xiaobo 47*6027384aSXie Xiaobo genphy_config_aneg(phydev); 48*6027384aSXie Xiaobo 49*6027384aSXie Xiaobo phy_reset(phydev); 50*6027384aSXie Xiaobo 51*6027384aSXie Xiaobo return 0; 52*6027384aSXie Xiaobo } 53*6027384aSXie Xiaobo 5406370590SKim Phillips static struct phy_driver AR8021_driver = { 559082eeacSAndy Fleming .name = "AR8021", 569082eeacSAndy Fleming .uid = 0x4dd040, 579082eeacSAndy Fleming .mask = 0xfffff0, 589082eeacSAndy Fleming .features = PHY_GBIT_FEATURES, 599082eeacSAndy Fleming .config = ar8021_config, 609082eeacSAndy Fleming .startup = genphy_startup, 619082eeacSAndy Fleming .shutdown = genphy_shutdown, 629082eeacSAndy Fleming }; 639082eeacSAndy Fleming 64*6027384aSXie Xiaobo struct phy_driver AR8035_driver = { 65*6027384aSXie Xiaobo .name = "AR8035", 66*6027384aSXie Xiaobo .uid = 0x4dd072, 67*6027384aSXie Xiaobo .mask = 0x4fffff, 68*6027384aSXie Xiaobo .features = PHY_GBIT_FEATURES, 69*6027384aSXie Xiaobo .config = ar8035_config, 70*6027384aSXie Xiaobo .startup = genphy_startup, 71*6027384aSXie Xiaobo .shutdown = genphy_shutdown, 72*6027384aSXie Xiaobo }; 73*6027384aSXie Xiaobo 749082eeacSAndy Fleming int phy_atheros_init(void) 759082eeacSAndy Fleming { 769082eeacSAndy Fleming phy_register(&AR8021_driver); 77*6027384aSXie Xiaobo phy_register(&AR8035_driver); 789082eeacSAndy Fleming 799082eeacSAndy Fleming return 0; 809082eeacSAndy Fleming } 81