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 169082eeacSAndy Fleming return 0; 179082eeacSAndy Fleming } 189082eeacSAndy Fleming 196027384aSXie Xiaobo static int ar8035_config(struct phy_device *phydev) 206027384aSXie Xiaobo { 216027384aSXie Xiaobo int regval; 226027384aSXie Xiaobo 236027384aSXie Xiaobo phy_write(phydev, MDIO_DEVAD_NONE, 0xd, 0x0007); 246027384aSXie Xiaobo phy_write(phydev, MDIO_DEVAD_NONE, 0xe, 0x8016); 256027384aSXie Xiaobo phy_write(phydev, MDIO_DEVAD_NONE, 0xd, 0x4007); 266027384aSXie Xiaobo regval = phy_read(phydev, MDIO_DEVAD_NONE, 0xe); 276027384aSXie Xiaobo phy_write(phydev, MDIO_DEVAD_NONE, 0xe, (regval|0x0018)); 286027384aSXie Xiaobo 296027384aSXie Xiaobo phy_write(phydev, MDIO_DEVAD_NONE, 0x1d, 0x05); 306027384aSXie Xiaobo regval = phy_read(phydev, MDIO_DEVAD_NONE, 0x1e); 316027384aSXie Xiaobo phy_write(phydev, MDIO_DEVAD_NONE, 0x1e, (regval|0x0100)); 326027384aSXie Xiaobo 336027384aSXie Xiaobo genphy_config_aneg(phydev); 346027384aSXie Xiaobo 356027384aSXie Xiaobo phy_reset(phydev); 366027384aSXie Xiaobo 376027384aSXie Xiaobo return 0; 386027384aSXie Xiaobo } 396027384aSXie Xiaobo 4006370590SKim Phillips static struct phy_driver AR8021_driver = { 419082eeacSAndy Fleming .name = "AR8021", 429082eeacSAndy Fleming .uid = 0x4dd040, 43e003ba5bSFabio Estevam .mask = 0x4fffff, 449082eeacSAndy Fleming .features = PHY_GBIT_FEATURES, 459082eeacSAndy Fleming .config = ar8021_config, 469082eeacSAndy Fleming .startup = genphy_startup, 479082eeacSAndy Fleming .shutdown = genphy_shutdown, 489082eeacSAndy Fleming }; 499082eeacSAndy Fleming 50433a2c53SHeiko Schocher static struct phy_driver AR8031_driver = { 51626ee1e3SShengzhou Liu .name = "AR8031/AR8033", 52433a2c53SHeiko Schocher .uid = 0x4dd074, 53*f66e3dedSFabio Estevam .mask = 0xffffffef, 54433a2c53SHeiko Schocher .features = PHY_GBIT_FEATURES, 55626ee1e3SShengzhou Liu .config = ar8021_config, 56433a2c53SHeiko Schocher .startup = genphy_startup, 57433a2c53SHeiko Schocher .shutdown = genphy_shutdown, 58433a2c53SHeiko Schocher }; 59433a2c53SHeiko Schocher 60433a2c53SHeiko Schocher static struct phy_driver AR8035_driver = { 616027384aSXie Xiaobo .name = "AR8035", 626027384aSXie Xiaobo .uid = 0x4dd072, 63*f66e3dedSFabio Estevam .mask = 0xffffffef, 646027384aSXie Xiaobo .features = PHY_GBIT_FEATURES, 656027384aSXie Xiaobo .config = ar8035_config, 666027384aSXie Xiaobo .startup = genphy_startup, 676027384aSXie Xiaobo .shutdown = genphy_shutdown, 686027384aSXie Xiaobo }; 696027384aSXie Xiaobo 709082eeacSAndy Fleming int phy_atheros_init(void) 719082eeacSAndy Fleming { 729082eeacSAndy Fleming phy_register(&AR8021_driver); 73433a2c53SHeiko Schocher phy_register(&AR8031_driver); 746027384aSXie Xiaobo phy_register(&AR8035_driver); 759082eeacSAndy Fleming 769082eeacSAndy Fleming return 0; 779082eeacSAndy Fleming } 78