smsc.c 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * SMSC PHY drivers
  4. *
  5. * Base code from drivers/net/phy/davicom.c
  6. * Copyright 2010-2011 Freescale Semiconductor, Inc.
  7. * author Andy Fleming
  8. *
  9. * Some code copied from linux kernel
  10. * Copyright (c) 2006 Herbert Valerio Riedel <hvr@gnu.org>
  11. */
  12. #include <miiphy.h>
  13. /* This code does not check the partner abilities. */
  14. static int smsc_parse_status(struct phy_device *phydev)
  15. {
  16. int mii_reg;
  17. mii_reg = phy_read(phydev, MDIO_DEVAD_NONE, MII_BMSR);
  18. if (mii_reg & (BMSR_100FULL | BMSR_100HALF))
  19. phydev->speed = SPEED_100;
  20. else
  21. phydev->speed = SPEED_10;
  22. if (mii_reg & (BMSR_10FULL | BMSR_100FULL))
  23. phydev->duplex = DUPLEX_FULL;
  24. else
  25. phydev->duplex = DUPLEX_HALF;
  26. return 0;
  27. }
  28. static int smsc_startup(struct phy_device *phydev)
  29. {
  30. int ret;
  31. ret = genphy_update_link(phydev);
  32. if (ret)
  33. return ret;
  34. return smsc_parse_status(phydev);
  35. }
  36. static struct phy_driver lan8700_driver = {
  37. .name = "SMSC LAN8700",
  38. .uid = 0x0007c0c0,
  39. .mask = 0xffff0,
  40. .features = PHY_BASIC_FEATURES,
  41. .config = &genphy_config_aneg,
  42. .startup = &smsc_startup,
  43. .shutdown = &genphy_shutdown,
  44. };
  45. static struct phy_driver lan911x_driver = {
  46. .name = "SMSC LAN911x Internal PHY",
  47. .uid = 0x0007c0d0,
  48. .mask = 0xffff0,
  49. .features = PHY_BASIC_FEATURES,
  50. .config = &genphy_config_aneg,
  51. .startup = &smsc_startup,
  52. .shutdown = &genphy_shutdown,
  53. };
  54. static struct phy_driver lan8710_driver = {
  55. .name = "SMSC LAN8710/LAN8720",
  56. .uid = 0x0007c0f0,
  57. .mask = 0xffff0,
  58. .features = PHY_BASIC_FEATURES,
  59. .config = &genphy_config_aneg,
  60. .startup = &genphy_startup,
  61. .shutdown = &genphy_shutdown,
  62. };
  63. static struct phy_driver lan8740_driver = {
  64. .name = "SMSC LAN8740",
  65. .uid = 0x0007c110,
  66. .mask = 0xffff0,
  67. .features = PHY_BASIC_FEATURES,
  68. .config = &genphy_config_aneg,
  69. .startup = &genphy_startup,
  70. .shutdown = &genphy_shutdown,
  71. };
  72. static struct phy_driver lan8741_driver = {
  73. .name = "SMSC LAN8741",
  74. .uid = 0x0007c120,
  75. .mask = 0xffff0,
  76. .features = PHY_BASIC_FEATURES,
  77. .config = &genphy_config_aneg,
  78. .startup = &genphy_startup,
  79. .shutdown = &genphy_shutdown,
  80. };
  81. static struct phy_driver lan8742_driver = {
  82. .name = "SMSC LAN8742",
  83. .uid = 0x0007c130,
  84. .mask = 0xffff0,
  85. .features = PHY_BASIC_FEATURES,
  86. .config = &genphy_config_aneg,
  87. .startup = &genphy_startup,
  88. .shutdown = &genphy_shutdown,
  89. };
  90. int phy_smsc_init(void)
  91. {
  92. phy_register(&lan8710_driver);
  93. phy_register(&lan911x_driver);
  94. phy_register(&lan8700_driver);
  95. phy_register(&lan8740_driver);
  96. phy_register(&lan8741_driver);
  97. phy_register(&lan8742_driver);
  98. return 0;
  99. }