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. */
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 };
85*008ed16cSMichael Kurz
86*008ed16cSMichael Kurz static struct phy_driver lan8742_driver = {
87*008ed16cSMichael Kurz .name = "SMSC LAN8742",
88*008ed16cSMichael Kurz .uid = 0x0007c130,
89*008ed16cSMichael Kurz .mask = 0xffff0,
90*008ed16cSMichael Kurz .features = PHY_BASIC_FEATURES,
91*008ed16cSMichael Kurz .config = &genphy_config_aneg,
92*008ed16cSMichael Kurz .startup = &genphy_startup,
93*008ed16cSMichael Kurz .shutdown = &genphy_shutdown,
94*008ed16cSMichael Kurz };
95*008ed16cSMichael Kurz
phy_smsc_init(void)965751aa2fSNobuhiro Iwamatsu int phy_smsc_init(void)
975751aa2fSNobuhiro Iwamatsu {
985751aa2fSNobuhiro Iwamatsu phy_register(&lan8710_driver);
995751aa2fSNobuhiro Iwamatsu phy_register(&lan911x_driver);
1005751aa2fSNobuhiro Iwamatsu phy_register(&lan8700_driver);
10146c9d938SPurna Chandra Mandal phy_register(&lan8740_driver);
102*008ed16cSMichael Kurz phy_register(&lan8742_driver);
1035751aa2fSNobuhiro Iwamatsu
1045751aa2fSNobuhiro Iwamatsu return 0;
1055751aa2fSNobuhiro Iwamatsu }
106