xref: /openbmc/u-boot/drivers/net/phy/smsc.c (revision 1a459660)
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