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