15751aa2fSNobuhiro Iwamatsu /* 25751aa2fSNobuhiro Iwamatsu * SMSC PHY drivers 35751aa2fSNobuhiro Iwamatsu * 41a459660SWolfgang 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 * 101bce2aebSRobert P. J. Day * Some code copied from linux kernel 115751aa2fSNobuhiro Iwamatsu * Copyright (c) 2006 Herbert Valerio Riedel <hvr@gnu.org> 125751aa2fSNobuhiro Iwamatsu */ 135751aa2fSNobuhiro Iwamatsu #include <miiphy.h> 145751aa2fSNobuhiro Iwamatsu 15f27f3b52SDavid Dueck /* This code does not check the partner abilities. */ 165751aa2fSNobuhiro Iwamatsu static int smsc_parse_status(struct phy_device *phydev) 175751aa2fSNobuhiro Iwamatsu { 185751aa2fSNobuhiro Iwamatsu int mii_reg; 195751aa2fSNobuhiro Iwamatsu 205751aa2fSNobuhiro Iwamatsu mii_reg = phy_read(phydev, MDIO_DEVAD_NONE, MII_BMSR); 215751aa2fSNobuhiro Iwamatsu 225751aa2fSNobuhiro Iwamatsu if (mii_reg & (BMSR_100FULL | BMSR_100HALF)) 235751aa2fSNobuhiro Iwamatsu phydev->speed = SPEED_100; 245751aa2fSNobuhiro Iwamatsu else 255751aa2fSNobuhiro Iwamatsu phydev->speed = SPEED_10; 265751aa2fSNobuhiro Iwamatsu 275751aa2fSNobuhiro Iwamatsu if (mii_reg & (BMSR_10FULL | BMSR_100FULL)) 285751aa2fSNobuhiro Iwamatsu phydev->duplex = DUPLEX_FULL; 295751aa2fSNobuhiro Iwamatsu else 305751aa2fSNobuhiro Iwamatsu phydev->duplex = DUPLEX_HALF; 315751aa2fSNobuhiro Iwamatsu 325751aa2fSNobuhiro Iwamatsu return 0; 335751aa2fSNobuhiro Iwamatsu } 345751aa2fSNobuhiro Iwamatsu 355751aa2fSNobuhiro Iwamatsu static int smsc_startup(struct phy_device *phydev) 365751aa2fSNobuhiro Iwamatsu { 375751aa2fSNobuhiro Iwamatsu genphy_update_link(phydev); 385751aa2fSNobuhiro Iwamatsu smsc_parse_status(phydev); 395751aa2fSNobuhiro Iwamatsu return 0; 405751aa2fSNobuhiro Iwamatsu } 415751aa2fSNobuhiro Iwamatsu 425751aa2fSNobuhiro Iwamatsu static struct phy_driver lan8700_driver = { 435751aa2fSNobuhiro Iwamatsu .name = "SMSC LAN8700", 445751aa2fSNobuhiro Iwamatsu .uid = 0x0007c0c0, 455751aa2fSNobuhiro Iwamatsu .mask = 0xffff0, 465751aa2fSNobuhiro Iwamatsu .features = PHY_BASIC_FEATURES, 475751aa2fSNobuhiro Iwamatsu .config = &genphy_config_aneg, 485751aa2fSNobuhiro Iwamatsu .startup = &smsc_startup, 495751aa2fSNobuhiro Iwamatsu .shutdown = &genphy_shutdown, 505751aa2fSNobuhiro Iwamatsu }; 515751aa2fSNobuhiro Iwamatsu 525751aa2fSNobuhiro Iwamatsu static struct phy_driver lan911x_driver = { 535751aa2fSNobuhiro Iwamatsu .name = "SMSC LAN911x Internal PHY", 545751aa2fSNobuhiro Iwamatsu .uid = 0x0007c0d0, 555751aa2fSNobuhiro Iwamatsu .mask = 0xffff0, 565751aa2fSNobuhiro Iwamatsu .features = PHY_BASIC_FEATURES, 575751aa2fSNobuhiro Iwamatsu .config = &genphy_config_aneg, 585751aa2fSNobuhiro Iwamatsu .startup = &smsc_startup, 595751aa2fSNobuhiro Iwamatsu .shutdown = &genphy_shutdown, 605751aa2fSNobuhiro Iwamatsu }; 615751aa2fSNobuhiro Iwamatsu 625751aa2fSNobuhiro Iwamatsu static struct phy_driver lan8710_driver = { 635751aa2fSNobuhiro Iwamatsu .name = "SMSC LAN8710/LAN8720", 645751aa2fSNobuhiro Iwamatsu .uid = 0x0007c0f0, 655751aa2fSNobuhiro Iwamatsu .mask = 0xffff0, 6625634210SFabio Estevam .features = PHY_BASIC_FEATURES, 675751aa2fSNobuhiro Iwamatsu .config = &genphy_config_aneg, 68f27f3b52SDavid Dueck .startup = &genphy_startup, 695751aa2fSNobuhiro Iwamatsu .shutdown = &genphy_shutdown, 705751aa2fSNobuhiro Iwamatsu }; 715751aa2fSNobuhiro Iwamatsu 72*46c9d938SPurna Chandra Mandal static struct phy_driver lan8740_driver = { 73*46c9d938SPurna Chandra Mandal .name = "SMSC LAN8740", 74*46c9d938SPurna Chandra Mandal .uid = 0x0007c110, 75*46c9d938SPurna Chandra Mandal .mask = 0xffff0, 76*46c9d938SPurna Chandra Mandal .features = PHY_BASIC_FEATURES, 77*46c9d938SPurna Chandra Mandal .config = &genphy_config_aneg, 78*46c9d938SPurna Chandra Mandal .startup = &genphy_startup, 79*46c9d938SPurna Chandra Mandal .shutdown = &genphy_shutdown, 80*46c9d938SPurna Chandra Mandal }; 815751aa2fSNobuhiro Iwamatsu int phy_smsc_init(void) 825751aa2fSNobuhiro Iwamatsu { 835751aa2fSNobuhiro Iwamatsu phy_register(&lan8710_driver); 845751aa2fSNobuhiro Iwamatsu phy_register(&lan911x_driver); 855751aa2fSNobuhiro Iwamatsu phy_register(&lan8700_driver); 86*46c9d938SPurna Chandra Mandal phy_register(&lan8740_driver); 875751aa2fSNobuhiro Iwamatsu 885751aa2fSNobuhiro Iwamatsu return 0; 895751aa2fSNobuhiro Iwamatsu } 90