xref: /rk3399_rockchip-uboot/drivers/net/phy/smsc.c (revision 5751aa2f248a72c3cec7048cec8dfad33dab0979)
1*5751aa2fSNobuhiro Iwamatsu /*
2*5751aa2fSNobuhiro Iwamatsu  * SMSC PHY drivers
3*5751aa2fSNobuhiro Iwamatsu  *
4*5751aa2fSNobuhiro Iwamatsu  * This program is free software; you can redistribute it and/or
5*5751aa2fSNobuhiro Iwamatsu  * modify it under the terms of the GNU General Public License as
6*5751aa2fSNobuhiro Iwamatsu  * published by the Free Software Foundation; either version 2 of
7*5751aa2fSNobuhiro Iwamatsu  * the License, or (at your option) any later version.
8*5751aa2fSNobuhiro Iwamatsu  *
9*5751aa2fSNobuhiro Iwamatsu  * This program is distributed in the hope that it will be useful,
10*5751aa2fSNobuhiro Iwamatsu  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11*5751aa2fSNobuhiro Iwamatsu  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12*5751aa2fSNobuhiro Iwamatsu  * GNU General Public License for more details.
13*5751aa2fSNobuhiro Iwamatsu  *
14*5751aa2fSNobuhiro Iwamatsu  * You should have received a copy of the GNU General Public License
15*5751aa2fSNobuhiro Iwamatsu  * along with this program; if not, write to the Free Software
16*5751aa2fSNobuhiro Iwamatsu  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
17*5751aa2fSNobuhiro Iwamatsu  * MA 02111-1307 USA
18*5751aa2fSNobuhiro Iwamatsu  *
19*5751aa2fSNobuhiro Iwamatsu  * Base code from drivers/net/phy/davicom.c
20*5751aa2fSNobuhiro Iwamatsu  *   Copyright 2010-2011 Freescale Semiconductor, Inc.
21*5751aa2fSNobuhiro Iwamatsu  *   author Andy Fleming
22*5751aa2fSNobuhiro Iwamatsu  *
23*5751aa2fSNobuhiro Iwamatsu  * Some code get from linux kenrel
24*5751aa2fSNobuhiro Iwamatsu  * Copyright (c) 2006 Herbert Valerio Riedel <hvr@gnu.org>
25*5751aa2fSNobuhiro Iwamatsu  *
26*5751aa2fSNobuhiro Iwamatsu  */
27*5751aa2fSNobuhiro Iwamatsu #include <miiphy.h>
28*5751aa2fSNobuhiro Iwamatsu 
29*5751aa2fSNobuhiro Iwamatsu static int smsc_parse_status(struct phy_device *phydev)
30*5751aa2fSNobuhiro Iwamatsu {
31*5751aa2fSNobuhiro Iwamatsu 	int mii_reg;
32*5751aa2fSNobuhiro Iwamatsu 
33*5751aa2fSNobuhiro Iwamatsu 	mii_reg = phy_read(phydev, MDIO_DEVAD_NONE, MII_BMSR);
34*5751aa2fSNobuhiro Iwamatsu 
35*5751aa2fSNobuhiro Iwamatsu 	if (mii_reg & (BMSR_100FULL | BMSR_100HALF))
36*5751aa2fSNobuhiro Iwamatsu 		phydev->speed = SPEED_100;
37*5751aa2fSNobuhiro Iwamatsu 	else
38*5751aa2fSNobuhiro Iwamatsu 		phydev->speed = SPEED_10;
39*5751aa2fSNobuhiro Iwamatsu 
40*5751aa2fSNobuhiro Iwamatsu 	if (mii_reg & (BMSR_10FULL | BMSR_100FULL))
41*5751aa2fSNobuhiro Iwamatsu 		phydev->duplex = DUPLEX_FULL;
42*5751aa2fSNobuhiro Iwamatsu 	else
43*5751aa2fSNobuhiro Iwamatsu 		phydev->duplex = DUPLEX_HALF;
44*5751aa2fSNobuhiro Iwamatsu 
45*5751aa2fSNobuhiro Iwamatsu 	return 0;
46*5751aa2fSNobuhiro Iwamatsu }
47*5751aa2fSNobuhiro Iwamatsu 
48*5751aa2fSNobuhiro Iwamatsu static int smsc_startup(struct phy_device *phydev)
49*5751aa2fSNobuhiro Iwamatsu {
50*5751aa2fSNobuhiro Iwamatsu 	genphy_update_link(phydev);
51*5751aa2fSNobuhiro Iwamatsu 	smsc_parse_status(phydev);
52*5751aa2fSNobuhiro Iwamatsu 	return 0;
53*5751aa2fSNobuhiro Iwamatsu }
54*5751aa2fSNobuhiro Iwamatsu 
55*5751aa2fSNobuhiro Iwamatsu static struct phy_driver lan8700_driver = {
56*5751aa2fSNobuhiro Iwamatsu 	.name = "SMSC LAN8700",
57*5751aa2fSNobuhiro Iwamatsu 	.uid = 0x0007c0c0,
58*5751aa2fSNobuhiro Iwamatsu 	.mask = 0xffff0,
59*5751aa2fSNobuhiro Iwamatsu 	.features = PHY_BASIC_FEATURES,
60*5751aa2fSNobuhiro Iwamatsu 	.config = &genphy_config_aneg,
61*5751aa2fSNobuhiro Iwamatsu 	.startup = &smsc_startup,
62*5751aa2fSNobuhiro Iwamatsu 	.shutdown = &genphy_shutdown,
63*5751aa2fSNobuhiro Iwamatsu };
64*5751aa2fSNobuhiro Iwamatsu 
65*5751aa2fSNobuhiro Iwamatsu static struct phy_driver lan911x_driver = {
66*5751aa2fSNobuhiro Iwamatsu 	.name = "SMSC LAN911x Internal PHY",
67*5751aa2fSNobuhiro Iwamatsu 	.uid = 0x0007c0d0,
68*5751aa2fSNobuhiro Iwamatsu 	.mask = 0xffff0,
69*5751aa2fSNobuhiro Iwamatsu 	.features = PHY_BASIC_FEATURES,
70*5751aa2fSNobuhiro Iwamatsu 	.config = &genphy_config_aneg,
71*5751aa2fSNobuhiro Iwamatsu 	.startup = &smsc_startup,
72*5751aa2fSNobuhiro Iwamatsu 	.shutdown = &genphy_shutdown,
73*5751aa2fSNobuhiro Iwamatsu };
74*5751aa2fSNobuhiro Iwamatsu 
75*5751aa2fSNobuhiro Iwamatsu static struct phy_driver lan8710_driver = {
76*5751aa2fSNobuhiro Iwamatsu 	.name = "SMSC LAN8710/LAN8720",
77*5751aa2fSNobuhiro Iwamatsu 	.uid = 0x0007c0f0,
78*5751aa2fSNobuhiro Iwamatsu 	.mask = 0xffff0,
79*5751aa2fSNobuhiro Iwamatsu 	.features = PHY_GBIT_FEATURES,
80*5751aa2fSNobuhiro Iwamatsu 	.config = &genphy_config_aneg,
81*5751aa2fSNobuhiro Iwamatsu 	.startup = &smsc_startup,
82*5751aa2fSNobuhiro Iwamatsu 	.shutdown = &genphy_shutdown,
83*5751aa2fSNobuhiro Iwamatsu };
84*5751aa2fSNobuhiro Iwamatsu 
85*5751aa2fSNobuhiro Iwamatsu int phy_smsc_init(void)
86*5751aa2fSNobuhiro Iwamatsu {
87*5751aa2fSNobuhiro Iwamatsu 	phy_register(&lan8710_driver);
88*5751aa2fSNobuhiro Iwamatsu 	phy_register(&lan911x_driver);
89*5751aa2fSNobuhiro Iwamatsu 	phy_register(&lan8700_driver);
90*5751aa2fSNobuhiro Iwamatsu 
91*5751aa2fSNobuhiro Iwamatsu 	return 0;
92*5751aa2fSNobuhiro Iwamatsu }
93