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