15751aa2fSNobuhiro Iwamatsu /* 25751aa2fSNobuhiro Iwamatsu * SMSC PHY drivers 35751aa2fSNobuhiro Iwamatsu * 4*1a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+ 55751aa2fSNobuhiro Iwamatsu * 65751aa2fSNobuhiro Iwamatsu * Base code from drivers/net/phy/davicom.c 75751aa2fSNobuhiro Iwamatsu * Copyright 2010-2011 Freescale Semiconductor, Inc. 85751aa2fSNobuhiro Iwamatsu * author Andy Fleming 95751aa2fSNobuhiro Iwamatsu * 105751aa2fSNobuhiro Iwamatsu * Some code get from linux kenrel 115751aa2fSNobuhiro Iwamatsu * Copyright (c) 2006 Herbert Valerio Riedel <hvr@gnu.org> 125751aa2fSNobuhiro Iwamatsu */ 135751aa2fSNobuhiro Iwamatsu #include <miiphy.h> 145751aa2fSNobuhiro Iwamatsu 155751aa2fSNobuhiro Iwamatsu static int smsc_parse_status(struct phy_device *phydev) 165751aa2fSNobuhiro Iwamatsu { 175751aa2fSNobuhiro Iwamatsu int mii_reg; 185751aa2fSNobuhiro Iwamatsu 195751aa2fSNobuhiro Iwamatsu mii_reg = phy_read(phydev, MDIO_DEVAD_NONE, MII_BMSR); 205751aa2fSNobuhiro Iwamatsu 215751aa2fSNobuhiro Iwamatsu if (mii_reg & (BMSR_100FULL | BMSR_100HALF)) 225751aa2fSNobuhiro Iwamatsu phydev->speed = SPEED_100; 235751aa2fSNobuhiro Iwamatsu else 245751aa2fSNobuhiro Iwamatsu phydev->speed = SPEED_10; 255751aa2fSNobuhiro Iwamatsu 265751aa2fSNobuhiro Iwamatsu if (mii_reg & (BMSR_10FULL | BMSR_100FULL)) 275751aa2fSNobuhiro Iwamatsu phydev->duplex = DUPLEX_FULL; 285751aa2fSNobuhiro Iwamatsu else 295751aa2fSNobuhiro Iwamatsu phydev->duplex = DUPLEX_HALF; 305751aa2fSNobuhiro Iwamatsu 315751aa2fSNobuhiro Iwamatsu return 0; 325751aa2fSNobuhiro Iwamatsu } 335751aa2fSNobuhiro Iwamatsu 345751aa2fSNobuhiro Iwamatsu static int smsc_startup(struct phy_device *phydev) 355751aa2fSNobuhiro Iwamatsu { 365751aa2fSNobuhiro Iwamatsu genphy_update_link(phydev); 375751aa2fSNobuhiro Iwamatsu smsc_parse_status(phydev); 385751aa2fSNobuhiro Iwamatsu return 0; 395751aa2fSNobuhiro Iwamatsu } 405751aa2fSNobuhiro Iwamatsu 415751aa2fSNobuhiro Iwamatsu static struct phy_driver lan8700_driver = { 425751aa2fSNobuhiro Iwamatsu .name = "SMSC LAN8700", 435751aa2fSNobuhiro Iwamatsu .uid = 0x0007c0c0, 445751aa2fSNobuhiro Iwamatsu .mask = 0xffff0, 455751aa2fSNobuhiro Iwamatsu .features = PHY_BASIC_FEATURES, 465751aa2fSNobuhiro Iwamatsu .config = &genphy_config_aneg, 475751aa2fSNobuhiro Iwamatsu .startup = &smsc_startup, 485751aa2fSNobuhiro Iwamatsu .shutdown = &genphy_shutdown, 495751aa2fSNobuhiro Iwamatsu }; 505751aa2fSNobuhiro Iwamatsu 515751aa2fSNobuhiro Iwamatsu static struct phy_driver lan911x_driver = { 525751aa2fSNobuhiro Iwamatsu .name = "SMSC LAN911x Internal PHY", 535751aa2fSNobuhiro Iwamatsu .uid = 0x0007c0d0, 545751aa2fSNobuhiro Iwamatsu .mask = 0xffff0, 555751aa2fSNobuhiro Iwamatsu .features = PHY_BASIC_FEATURES, 565751aa2fSNobuhiro Iwamatsu .config = &genphy_config_aneg, 575751aa2fSNobuhiro Iwamatsu .startup = &smsc_startup, 585751aa2fSNobuhiro Iwamatsu .shutdown = &genphy_shutdown, 595751aa2fSNobuhiro Iwamatsu }; 605751aa2fSNobuhiro Iwamatsu 615751aa2fSNobuhiro Iwamatsu static struct phy_driver lan8710_driver = { 625751aa2fSNobuhiro Iwamatsu .name = "SMSC LAN8710/LAN8720", 635751aa2fSNobuhiro Iwamatsu .uid = 0x0007c0f0, 645751aa2fSNobuhiro Iwamatsu .mask = 0xffff0, 655751aa2fSNobuhiro Iwamatsu .features = PHY_GBIT_FEATURES, 665751aa2fSNobuhiro Iwamatsu .config = &genphy_config_aneg, 675751aa2fSNobuhiro Iwamatsu .startup = &smsc_startup, 685751aa2fSNobuhiro Iwamatsu .shutdown = &genphy_shutdown, 695751aa2fSNobuhiro Iwamatsu }; 705751aa2fSNobuhiro Iwamatsu 715751aa2fSNobuhiro Iwamatsu int phy_smsc_init(void) 725751aa2fSNobuhiro Iwamatsu { 735751aa2fSNobuhiro Iwamatsu phy_register(&lan8710_driver); 745751aa2fSNobuhiro Iwamatsu phy_register(&lan911x_driver); 755751aa2fSNobuhiro Iwamatsu phy_register(&lan8700_driver); 765751aa2fSNobuhiro Iwamatsu 775751aa2fSNobuhiro Iwamatsu return 0; 785751aa2fSNobuhiro Iwamatsu } 79