xref: /openbmc/u-boot/drivers/net/phy/smsc.c (revision fc82e768)
183d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
25751aa2fSNobuhiro Iwamatsu /*
35751aa2fSNobuhiro Iwamatsu  * SMSC PHY drivers
45751aa2fSNobuhiro Iwamatsu  *
55751aa2fSNobuhiro Iwamatsu  * Base code from drivers/net/phy/davicom.c
65751aa2fSNobuhiro Iwamatsu  *   Copyright 2010-2011 Freescale Semiconductor, Inc.
75751aa2fSNobuhiro Iwamatsu  *   author Andy Fleming
85751aa2fSNobuhiro Iwamatsu  *
91bce2aebSRobert P. J. Day  * Some code copied from linux kernel
105751aa2fSNobuhiro Iwamatsu  * Copyright (c) 2006 Herbert Valerio Riedel <hvr@gnu.org>
115751aa2fSNobuhiro Iwamatsu  */
12*05b60ac5SJoe Hershberger #include <common.h>
135751aa2fSNobuhiro Iwamatsu #include <miiphy.h>
145751aa2fSNobuhiro Iwamatsu 
15f27f3b52SDavid Dueck /* This code does not check the partner abilities. */
smsc_parse_status(struct phy_device * phydev)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 
smsc_startup(struct phy_device * phydev)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 };
85008ed16cSMichael Kurz 
86a0fd381fSArno Steffens static struct phy_driver lan8741_driver = {
87a0fd381fSArno Steffens 	.name = "SMSC LAN8741",
88a0fd381fSArno Steffens 	.uid = 0x0007c120,
89a0fd381fSArno Steffens 	.mask = 0xffff0,
90a0fd381fSArno Steffens 	.features = PHY_BASIC_FEATURES,
91a0fd381fSArno Steffens 	.config = &genphy_config_aneg,
92a0fd381fSArno Steffens 	.startup = &genphy_startup,
93a0fd381fSArno Steffens 	.shutdown = &genphy_shutdown,
94a0fd381fSArno Steffens };
95a0fd381fSArno Steffens 
96008ed16cSMichael Kurz static struct phy_driver lan8742_driver = {
97008ed16cSMichael Kurz 	.name = "SMSC LAN8742",
98008ed16cSMichael Kurz 	.uid = 0x0007c130,
99008ed16cSMichael Kurz 	.mask = 0xffff0,
100008ed16cSMichael Kurz 	.features = PHY_BASIC_FEATURES,
101008ed16cSMichael Kurz 	.config = &genphy_config_aneg,
102008ed16cSMichael Kurz 	.startup = &genphy_startup,
103008ed16cSMichael Kurz 	.shutdown = &genphy_shutdown,
104008ed16cSMichael Kurz };
105008ed16cSMichael Kurz 
phy_smsc_init(void)1065751aa2fSNobuhiro Iwamatsu int phy_smsc_init(void)
1075751aa2fSNobuhiro Iwamatsu {
1085751aa2fSNobuhiro Iwamatsu 	phy_register(&lan8710_driver);
1095751aa2fSNobuhiro Iwamatsu 	phy_register(&lan911x_driver);
1105751aa2fSNobuhiro Iwamatsu 	phy_register(&lan8700_driver);
11146c9d938SPurna Chandra Mandal 	phy_register(&lan8740_driver);
112a0fd381fSArno Steffens 	phy_register(&lan8741_driver);
113008ed16cSMichael Kurz 	phy_register(&lan8742_driver);
1145751aa2fSNobuhiro Iwamatsu 
1155751aa2fSNobuhiro Iwamatsu 	return 0;
1165751aa2fSNobuhiro Iwamatsu }
117