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 { 37b733c278SMichal Simek int ret; 38b733c278SMichal Simek 39b733c278SMichal Simek ret = genphy_update_link(phydev); 40b733c278SMichal Simek if (ret) 41b733c278SMichal Simek return ret; 42b733c278SMichal Simek 43b733c278SMichal Simek return smsc_parse_status(phydev); 445751aa2fSNobuhiro Iwamatsu } 455751aa2fSNobuhiro Iwamatsu 465751aa2fSNobuhiro Iwamatsu static struct phy_driver lan8700_driver = { 475751aa2fSNobuhiro Iwamatsu .name = "SMSC LAN8700", 485751aa2fSNobuhiro Iwamatsu .uid = 0x0007c0c0, 495751aa2fSNobuhiro Iwamatsu .mask = 0xffff0, 505751aa2fSNobuhiro Iwamatsu .features = PHY_BASIC_FEATURES, 515751aa2fSNobuhiro Iwamatsu .config = &genphy_config_aneg, 525751aa2fSNobuhiro Iwamatsu .startup = &smsc_startup, 535751aa2fSNobuhiro Iwamatsu .shutdown = &genphy_shutdown, 545751aa2fSNobuhiro Iwamatsu }; 555751aa2fSNobuhiro Iwamatsu 565751aa2fSNobuhiro Iwamatsu static struct phy_driver lan911x_driver = { 575751aa2fSNobuhiro Iwamatsu .name = "SMSC LAN911x Internal PHY", 585751aa2fSNobuhiro Iwamatsu .uid = 0x0007c0d0, 595751aa2fSNobuhiro Iwamatsu .mask = 0xffff0, 605751aa2fSNobuhiro Iwamatsu .features = PHY_BASIC_FEATURES, 615751aa2fSNobuhiro Iwamatsu .config = &genphy_config_aneg, 625751aa2fSNobuhiro Iwamatsu .startup = &smsc_startup, 635751aa2fSNobuhiro Iwamatsu .shutdown = &genphy_shutdown, 645751aa2fSNobuhiro Iwamatsu }; 655751aa2fSNobuhiro Iwamatsu 665751aa2fSNobuhiro Iwamatsu static struct phy_driver lan8710_driver = { 675751aa2fSNobuhiro Iwamatsu .name = "SMSC LAN8710/LAN8720", 685751aa2fSNobuhiro Iwamatsu .uid = 0x0007c0f0, 695751aa2fSNobuhiro Iwamatsu .mask = 0xffff0, 7025634210SFabio Estevam .features = PHY_BASIC_FEATURES, 715751aa2fSNobuhiro Iwamatsu .config = &genphy_config_aneg, 72f27f3b52SDavid Dueck .startup = &genphy_startup, 735751aa2fSNobuhiro Iwamatsu .shutdown = &genphy_shutdown, 745751aa2fSNobuhiro Iwamatsu }; 755751aa2fSNobuhiro Iwamatsu 7646c9d938SPurna Chandra Mandal static struct phy_driver lan8740_driver = { 7746c9d938SPurna Chandra Mandal .name = "SMSC LAN8740", 7846c9d938SPurna Chandra Mandal .uid = 0x0007c110, 7946c9d938SPurna Chandra Mandal .mask = 0xffff0, 8046c9d938SPurna Chandra Mandal .features = PHY_BASIC_FEATURES, 8146c9d938SPurna Chandra Mandal .config = &genphy_config_aneg, 8246c9d938SPurna Chandra Mandal .startup = &genphy_startup, 8346c9d938SPurna Chandra Mandal .shutdown = &genphy_shutdown, 8446c9d938SPurna Chandra Mandal }; 85*008ed16cSMichael Kurz 86*008ed16cSMichael Kurz static struct phy_driver lan8742_driver = { 87*008ed16cSMichael Kurz .name = "SMSC LAN8742", 88*008ed16cSMichael Kurz .uid = 0x0007c130, 89*008ed16cSMichael Kurz .mask = 0xffff0, 90*008ed16cSMichael Kurz .features = PHY_BASIC_FEATURES, 91*008ed16cSMichael Kurz .config = &genphy_config_aneg, 92*008ed16cSMichael Kurz .startup = &genphy_startup, 93*008ed16cSMichael Kurz .shutdown = &genphy_shutdown, 94*008ed16cSMichael Kurz }; 95*008ed16cSMichael Kurz 965751aa2fSNobuhiro Iwamatsu int phy_smsc_init(void) 975751aa2fSNobuhiro Iwamatsu { 985751aa2fSNobuhiro Iwamatsu phy_register(&lan8710_driver); 995751aa2fSNobuhiro Iwamatsu phy_register(&lan911x_driver); 1005751aa2fSNobuhiro Iwamatsu phy_register(&lan8700_driver); 10146c9d938SPurna Chandra Mandal phy_register(&lan8740_driver); 102*008ed16cSMichael Kurz phy_register(&lan8742_driver); 1035751aa2fSNobuhiro Iwamatsu 1045751aa2fSNobuhiro Iwamatsu return 0; 1055751aa2fSNobuhiro Iwamatsu } 106