smsc.c 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  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 <common.h>
  13. #include <miiphy.h>
  14. /* This code does not check the partner abilities. */
  15. static int smsc_parse_status(struct phy_device *phydev)
  16. {
  17. int mii_reg;
  18. mii_reg = phy_read(phydev, MDIO_DEVAD_NONE, MII_BMSR);
  19. if (mii_reg & (BMSR_100FULL | BMSR_100HALF))
  20. phydev->speed = SPEED_100;
  21. else
  22. phydev->speed = SPEED_10;
  23. if (mii_reg & (BMSR_10FULL | BMSR_100FULL))
  24. phydev->duplex = DUPLEX_FULL;
  25. else
  26. phydev->duplex = DUPLEX_HALF;
  27. return 0;
  28. }
  29. static int smsc_startup(struct phy_device *phydev)
  30. {
  31. int ret;
  32. ret = genphy_update_link(phydev);
  33. if (ret)
  34. return ret;
  35. return smsc_parse_status(phydev);
  36. }
  37. static struct phy_driver lan8700_driver = {
  38. .name = "SMSC LAN8700",
  39. .uid = 0x0007c0c0,
  40. .mask = 0xffff0,
  41. .features = PHY_BASIC_FEATURES,
  42. .config = &genphy_config_aneg,
  43. .startup = &smsc_startup,
  44. .shutdown = &genphy_shutdown,
  45. };
  46. static struct phy_driver lan911x_driver = {
  47. .name = "SMSC LAN911x Internal PHY",
  48. .uid = 0x0007c0d0,
  49. .mask = 0xffff0,
  50. .features = PHY_BASIC_FEATURES,
  51. .config = &genphy_config_aneg,
  52. .startup = &smsc_startup,
  53. .shutdown = &genphy_shutdown,
  54. };
  55. static struct phy_driver lan8710_driver = {
  56. .name = "SMSC LAN8710/LAN8720",
  57. .uid = 0x0007c0f0,
  58. .mask = 0xffff0,
  59. .features = PHY_BASIC_FEATURES,
  60. .config = &genphy_config_aneg,
  61. .startup = &genphy_startup,
  62. .shutdown = &genphy_shutdown,
  63. };
  64. static struct phy_driver lan8740_driver = {
  65. .name = "SMSC LAN8740",
  66. .uid = 0x0007c110,
  67. .mask = 0xffff0,
  68. .features = PHY_BASIC_FEATURES,
  69. .config = &genphy_config_aneg,
  70. .startup = &genphy_startup,
  71. .shutdown = &genphy_shutdown,
  72. };
  73. static struct phy_driver lan8741_driver = {
  74. .name = "SMSC LAN8741",
  75. .uid = 0x0007c120,
  76. .mask = 0xffff0,
  77. .features = PHY_BASIC_FEATURES,
  78. .config = &genphy_config_aneg,
  79. .startup = &genphy_startup,
  80. .shutdown = &genphy_shutdown,
  81. };
  82. static struct phy_driver lan8742_driver = {
  83. .name = "SMSC LAN8742",
  84. .uid = 0x0007c130,
  85. .mask = 0xffff0,
  86. .features = PHY_BASIC_FEATURES,
  87. .config = &genphy_config_aneg,
  88. .startup = &genphy_startup,
  89. .shutdown = &genphy_shutdown,
  90. };
  91. int phy_smsc_init(void)
  92. {
  93. phy_register(&lan8710_driver);
  94. phy_register(&lan911x_driver);
  95. phy_register(&lan8700_driver);
  96. phy_register(&lan8740_driver);
  97. phy_register(&lan8741_driver);
  98. phy_register(&lan8742_driver);
  99. return 0;
  100. }