1*5751aa2fSNobuhiro Iwamatsu /* 2*5751aa2fSNobuhiro Iwamatsu * SMSC PHY drivers 3*5751aa2fSNobuhiro Iwamatsu * 4*5751aa2fSNobuhiro Iwamatsu * This program is free software; you can redistribute it and/or 5*5751aa2fSNobuhiro Iwamatsu * modify it under the terms of the GNU General Public License as 6*5751aa2fSNobuhiro Iwamatsu * published by the Free Software Foundation; either version 2 of 7*5751aa2fSNobuhiro Iwamatsu * the License, or (at your option) any later version. 8*5751aa2fSNobuhiro Iwamatsu * 9*5751aa2fSNobuhiro Iwamatsu * This program is distributed in the hope that it will be useful, 10*5751aa2fSNobuhiro Iwamatsu * but WITHOUT ANY WARRANTY; without even the implied warranty of 11*5751aa2fSNobuhiro Iwamatsu * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12*5751aa2fSNobuhiro Iwamatsu * GNU General Public License for more details. 13*5751aa2fSNobuhiro Iwamatsu * 14*5751aa2fSNobuhiro Iwamatsu * You should have received a copy of the GNU General Public License 15*5751aa2fSNobuhiro Iwamatsu * along with this program; if not, write to the Free Software 16*5751aa2fSNobuhiro Iwamatsu * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 17*5751aa2fSNobuhiro Iwamatsu * MA 02111-1307 USA 18*5751aa2fSNobuhiro Iwamatsu * 19*5751aa2fSNobuhiro Iwamatsu * Base code from drivers/net/phy/davicom.c 20*5751aa2fSNobuhiro Iwamatsu * Copyright 2010-2011 Freescale Semiconductor, Inc. 21*5751aa2fSNobuhiro Iwamatsu * author Andy Fleming 22*5751aa2fSNobuhiro Iwamatsu * 23*5751aa2fSNobuhiro Iwamatsu * Some code get from linux kenrel 24*5751aa2fSNobuhiro Iwamatsu * Copyright (c) 2006 Herbert Valerio Riedel <hvr@gnu.org> 25*5751aa2fSNobuhiro Iwamatsu * 26*5751aa2fSNobuhiro Iwamatsu */ 27*5751aa2fSNobuhiro Iwamatsu #include <miiphy.h> 28*5751aa2fSNobuhiro Iwamatsu 29*5751aa2fSNobuhiro Iwamatsu static int smsc_parse_status(struct phy_device *phydev) 30*5751aa2fSNobuhiro Iwamatsu { 31*5751aa2fSNobuhiro Iwamatsu int mii_reg; 32*5751aa2fSNobuhiro Iwamatsu 33*5751aa2fSNobuhiro Iwamatsu mii_reg = phy_read(phydev, MDIO_DEVAD_NONE, MII_BMSR); 34*5751aa2fSNobuhiro Iwamatsu 35*5751aa2fSNobuhiro Iwamatsu if (mii_reg & (BMSR_100FULL | BMSR_100HALF)) 36*5751aa2fSNobuhiro Iwamatsu phydev->speed = SPEED_100; 37*5751aa2fSNobuhiro Iwamatsu else 38*5751aa2fSNobuhiro Iwamatsu phydev->speed = SPEED_10; 39*5751aa2fSNobuhiro Iwamatsu 40*5751aa2fSNobuhiro Iwamatsu if (mii_reg & (BMSR_10FULL | BMSR_100FULL)) 41*5751aa2fSNobuhiro Iwamatsu phydev->duplex = DUPLEX_FULL; 42*5751aa2fSNobuhiro Iwamatsu else 43*5751aa2fSNobuhiro Iwamatsu phydev->duplex = DUPLEX_HALF; 44*5751aa2fSNobuhiro Iwamatsu 45*5751aa2fSNobuhiro Iwamatsu return 0; 46*5751aa2fSNobuhiro Iwamatsu } 47*5751aa2fSNobuhiro Iwamatsu 48*5751aa2fSNobuhiro Iwamatsu static int smsc_startup(struct phy_device *phydev) 49*5751aa2fSNobuhiro Iwamatsu { 50*5751aa2fSNobuhiro Iwamatsu genphy_update_link(phydev); 51*5751aa2fSNobuhiro Iwamatsu smsc_parse_status(phydev); 52*5751aa2fSNobuhiro Iwamatsu return 0; 53*5751aa2fSNobuhiro Iwamatsu } 54*5751aa2fSNobuhiro Iwamatsu 55*5751aa2fSNobuhiro Iwamatsu static struct phy_driver lan8700_driver = { 56*5751aa2fSNobuhiro Iwamatsu .name = "SMSC LAN8700", 57*5751aa2fSNobuhiro Iwamatsu .uid = 0x0007c0c0, 58*5751aa2fSNobuhiro Iwamatsu .mask = 0xffff0, 59*5751aa2fSNobuhiro Iwamatsu .features = PHY_BASIC_FEATURES, 60*5751aa2fSNobuhiro Iwamatsu .config = &genphy_config_aneg, 61*5751aa2fSNobuhiro Iwamatsu .startup = &smsc_startup, 62*5751aa2fSNobuhiro Iwamatsu .shutdown = &genphy_shutdown, 63*5751aa2fSNobuhiro Iwamatsu }; 64*5751aa2fSNobuhiro Iwamatsu 65*5751aa2fSNobuhiro Iwamatsu static struct phy_driver lan911x_driver = { 66*5751aa2fSNobuhiro Iwamatsu .name = "SMSC LAN911x Internal PHY", 67*5751aa2fSNobuhiro Iwamatsu .uid = 0x0007c0d0, 68*5751aa2fSNobuhiro Iwamatsu .mask = 0xffff0, 69*5751aa2fSNobuhiro Iwamatsu .features = PHY_BASIC_FEATURES, 70*5751aa2fSNobuhiro Iwamatsu .config = &genphy_config_aneg, 71*5751aa2fSNobuhiro Iwamatsu .startup = &smsc_startup, 72*5751aa2fSNobuhiro Iwamatsu .shutdown = &genphy_shutdown, 73*5751aa2fSNobuhiro Iwamatsu }; 74*5751aa2fSNobuhiro Iwamatsu 75*5751aa2fSNobuhiro Iwamatsu static struct phy_driver lan8710_driver = { 76*5751aa2fSNobuhiro Iwamatsu .name = "SMSC LAN8710/LAN8720", 77*5751aa2fSNobuhiro Iwamatsu .uid = 0x0007c0f0, 78*5751aa2fSNobuhiro Iwamatsu .mask = 0xffff0, 79*5751aa2fSNobuhiro Iwamatsu .features = PHY_GBIT_FEATURES, 80*5751aa2fSNobuhiro Iwamatsu .config = &genphy_config_aneg, 81*5751aa2fSNobuhiro Iwamatsu .startup = &smsc_startup, 82*5751aa2fSNobuhiro Iwamatsu .shutdown = &genphy_shutdown, 83*5751aa2fSNobuhiro Iwamatsu }; 84*5751aa2fSNobuhiro Iwamatsu 85*5751aa2fSNobuhiro Iwamatsu int phy_smsc_init(void) 86*5751aa2fSNobuhiro Iwamatsu { 87*5751aa2fSNobuhiro Iwamatsu phy_register(&lan8710_driver); 88*5751aa2fSNobuhiro Iwamatsu phy_register(&lan911x_driver); 89*5751aa2fSNobuhiro Iwamatsu phy_register(&lan8700_driver); 90*5751aa2fSNobuhiro Iwamatsu 91*5751aa2fSNobuhiro Iwamatsu return 0; 92*5751aa2fSNobuhiro Iwamatsu } 93