]>
Commit | Line | Data |
---|---|---|
5751aa2f NI |
1 | /* |
2 | * SMSC PHY drivers | |
3 | * | |
1a459660 | 4 | * SPDX-License-Identifier: GPL-2.0+ |
5751aa2f NI |
5 | * |
6 | * Base code from drivers/net/phy/davicom.c | |
7 | * Copyright 2010-2011 Freescale Semiconductor, Inc. | |
8 | * author Andy Fleming | |
9 | * | |
10 | * Some code get from linux kenrel | |
11 | * Copyright (c) 2006 Herbert Valerio Riedel <hvr@gnu.org> | |
5751aa2f NI |
12 | */ |
13 | #include <miiphy.h> | |
14 | ||
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 | genphy_update_link(phydev); | |
37 | smsc_parse_status(phydev); | |
38 | return 0; | |
39 | } | |
40 | ||
41 | static struct phy_driver lan8700_driver = { | |
42 | .name = "SMSC LAN8700", | |
43 | .uid = 0x0007c0c0, | |
44 | .mask = 0xffff0, | |
45 | .features = PHY_BASIC_FEATURES, | |
46 | .config = &genphy_config_aneg, | |
47 | .startup = &smsc_startup, | |
48 | .shutdown = &genphy_shutdown, | |
49 | }; | |
50 | ||
51 | static struct phy_driver lan911x_driver = { | |
52 | .name = "SMSC LAN911x Internal PHY", | |
53 | .uid = 0x0007c0d0, | |
54 | .mask = 0xffff0, | |
55 | .features = PHY_BASIC_FEATURES, | |
56 | .config = &genphy_config_aneg, | |
57 | .startup = &smsc_startup, | |
58 | .shutdown = &genphy_shutdown, | |
59 | }; | |
60 | ||
61 | static struct phy_driver lan8710_driver = { | |
62 | .name = "SMSC LAN8710/LAN8720", | |
63 | .uid = 0x0007c0f0, | |
64 | .mask = 0xffff0, | |
65 | .features = PHY_GBIT_FEATURES, | |
66 | .config = &genphy_config_aneg, | |
67 | .startup = &smsc_startup, | |
68 | .shutdown = &genphy_shutdown, | |
69 | }; | |
70 | ||
71 | int phy_smsc_init(void) | |
72 | { | |
73 | phy_register(&lan8710_driver); | |
74 | phy_register(&lan911x_driver); | |
75 | phy_register(&lan8700_driver); | |
76 | ||
77 | return 0; | |
78 | } |