smsc.c 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. /*
  2. * SMSC PHY drivers
  3. *
  4. * SPDX-License-Identifier: GPL-2.0+
  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 copied from linux kernel
  11. * Copyright (c) 2006 Herbert Valerio Riedel <hvr@gnu.org>
  12. */
  13. #include <miiphy.h>
  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. genphy_update_link(phydev);
  31. smsc_parse_status(phydev);
  32. return 0;
  33. }
  34. static struct phy_driver lan8700_driver = {
  35. .name = "SMSC LAN8700",
  36. .uid = 0x0007c0c0,
  37. .mask = 0xffff0,
  38. .features = PHY_BASIC_FEATURES,
  39. .config = &genphy_config_aneg,
  40. .startup = &smsc_startup,
  41. .shutdown = &genphy_shutdown,
  42. };
  43. static struct phy_driver lan911x_driver = {
  44. .name = "SMSC LAN911x Internal PHY",
  45. .uid = 0x0007c0d0,
  46. .mask = 0xffff0,
  47. .features = PHY_BASIC_FEATURES,
  48. .config = &genphy_config_aneg,
  49. .startup = &smsc_startup,
  50. .shutdown = &genphy_shutdown,
  51. };
  52. static struct phy_driver lan8710_driver = {
  53. .name = "SMSC LAN8710/LAN8720",
  54. .uid = 0x0007c0f0,
  55. .mask = 0xffff0,
  56. .features = PHY_BASIC_FEATURES,
  57. .config = &genphy_config_aneg,
  58. .startup = &smsc_startup,
  59. .shutdown = &genphy_shutdown,
  60. };
  61. int phy_smsc_init(void)
  62. {
  63. phy_register(&lan8710_driver);
  64. phy_register(&lan911x_driver);
  65. phy_register(&lan8700_driver);
  66. return 0;
  67. }