1 /* 2 * SMSC PHY drivers 3 * 4 * SPDX-License-Identifier: GPL-2.0+ 5 * 6 * Base code from drivers/net/phy/davicom.c 7 * Copyright 2010-2011 Freescale Semiconductor, Inc. 8 * author Andy Fleming 9 * 10 * Some code copied from linux kernel 11 * Copyright (c) 2006 Herbert Valerio Riedel <hvr@gnu.org> 12 */ 13 #include <miiphy.h> 14 15 /* This code does not check the partner abilities. */ 16 static int smsc_parse_status(struct phy_device *phydev) 17 { 18 int mii_reg; 19 20 mii_reg = phy_read(phydev, MDIO_DEVAD_NONE, MII_BMSR); 21 22 if (mii_reg & (BMSR_100FULL | BMSR_100HALF)) 23 phydev->speed = SPEED_100; 24 else 25 phydev->speed = SPEED_10; 26 27 if (mii_reg & (BMSR_10FULL | BMSR_100FULL)) 28 phydev->duplex = DUPLEX_FULL; 29 else 30 phydev->duplex = DUPLEX_HALF; 31 32 return 0; 33 } 34 35 static int smsc_startup(struct phy_device *phydev) 36 { 37 int ret; 38 39 ret = genphy_update_link(phydev); 40 if (ret) 41 return ret; 42 43 return smsc_parse_status(phydev); 44 } 45 46 static struct phy_driver lan8700_driver = { 47 .name = "SMSC LAN8700", 48 .uid = 0x0007c0c0, 49 .mask = 0xffff0, 50 .features = PHY_BASIC_FEATURES, 51 .config = &genphy_config_aneg, 52 .startup = &smsc_startup, 53 .shutdown = &genphy_shutdown, 54 }; 55 56 static struct phy_driver lan911x_driver = { 57 .name = "SMSC LAN911x Internal PHY", 58 .uid = 0x0007c0d0, 59 .mask = 0xffff0, 60 .features = PHY_BASIC_FEATURES, 61 .config = &genphy_config_aneg, 62 .startup = &smsc_startup, 63 .shutdown = &genphy_shutdown, 64 }; 65 66 static struct phy_driver lan8710_driver = { 67 .name = "SMSC LAN8710/LAN8720", 68 .uid = 0x0007c0f0, 69 .mask = 0xffff0, 70 .features = PHY_BASIC_FEATURES, 71 .config = &genphy_config_aneg, 72 .startup = &genphy_startup, 73 .shutdown = &genphy_shutdown, 74 }; 75 76 static struct phy_driver lan8740_driver = { 77 .name = "SMSC LAN8740", 78 .uid = 0x0007c110, 79 .mask = 0xffff0, 80 .features = PHY_BASIC_FEATURES, 81 .config = &genphy_config_aneg, 82 .startup = &genphy_startup, 83 .shutdown = &genphy_shutdown, 84 }; 85 int phy_smsc_init(void) 86 { 87 phy_register(&lan8710_driver); 88 phy_register(&lan911x_driver); 89 phy_register(&lan8700_driver); 90 phy_register(&lan8740_driver); 91 92 return 0; 93 } 94