atheros.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Atheros PHY drivers
  4. *
  5. * Copyright 2011, 2013 Freescale Semiconductor, Inc.
  6. * author Andy Fleming
  7. */
  8. #include <common.h>
  9. #include <phy.h>
  10. #define AR803x_PHY_DEBUG_ADDR_REG 0x1d
  11. #define AR803x_PHY_DEBUG_DATA_REG 0x1e
  12. #define AR803x_DEBUG_REG_5 0x5
  13. #define AR803x_RGMII_TX_CLK_DLY 0x100
  14. #define AR803x_DEBUG_REG_0 0x0
  15. #define AR803x_RGMII_RX_CLK_DLY 0x8000
  16. static int ar8021_config(struct phy_device *phydev)
  17. {
  18. phy_write(phydev, MDIO_DEVAD_NONE, 0x00, 0x1200);
  19. phy_write(phydev, MDIO_DEVAD_NONE, 0x1d, 0x05);
  20. phy_write(phydev, MDIO_DEVAD_NONE, 0x1e, 0x3D47);
  21. phydev->supported = phydev->drv->features;
  22. return 0;
  23. }
  24. static int ar8031_config(struct phy_device *phydev)
  25. {
  26. if (phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID ||
  27. phydev->interface == PHY_INTERFACE_MODE_RGMII_ID) {
  28. phy_write(phydev, MDIO_DEVAD_NONE, AR803x_PHY_DEBUG_ADDR_REG,
  29. AR803x_DEBUG_REG_5);
  30. phy_write(phydev, MDIO_DEVAD_NONE, AR803x_PHY_DEBUG_DATA_REG,
  31. AR803x_RGMII_TX_CLK_DLY);
  32. }
  33. if (phydev->interface == PHY_INTERFACE_MODE_RGMII_RXID ||
  34. phydev->interface == PHY_INTERFACE_MODE_RGMII_ID) {
  35. phy_write(phydev, MDIO_DEVAD_NONE, AR803x_PHY_DEBUG_ADDR_REG,
  36. AR803x_DEBUG_REG_0);
  37. phy_write(phydev, MDIO_DEVAD_NONE, AR803x_PHY_DEBUG_DATA_REG,
  38. AR803x_RGMII_RX_CLK_DLY);
  39. }
  40. phydev->supported = phydev->drv->features;
  41. genphy_config_aneg(phydev);
  42. genphy_restart_aneg(phydev);
  43. return 0;
  44. }
  45. static int ar8035_config(struct phy_device *phydev)
  46. {
  47. int regval;
  48. phy_write(phydev, MDIO_DEVAD_NONE, 0xd, 0x0007);
  49. phy_write(phydev, MDIO_DEVAD_NONE, 0xe, 0x8016);
  50. phy_write(phydev, MDIO_DEVAD_NONE, 0xd, 0x4007);
  51. regval = phy_read(phydev, MDIO_DEVAD_NONE, 0xe);
  52. phy_write(phydev, MDIO_DEVAD_NONE, 0xe, (regval|0x0018));
  53. phy_write(phydev, MDIO_DEVAD_NONE, 0x1d, 0x05);
  54. regval = phy_read(phydev, MDIO_DEVAD_NONE, 0x1e);
  55. phy_write(phydev, MDIO_DEVAD_NONE, 0x1e, (regval|0x0100));
  56. if ((phydev->interface == PHY_INTERFACE_MODE_RGMII_ID) ||
  57. (phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID)) {
  58. /* select debug reg 5 */
  59. phy_write(phydev, MDIO_DEVAD_NONE, 0x1D, 0x5);
  60. /* enable tx delay */
  61. phy_write(phydev, MDIO_DEVAD_NONE, 0x1E, 0x0100);
  62. }
  63. if ((phydev->interface == PHY_INTERFACE_MODE_RGMII_ID) ||
  64. (phydev->interface == PHY_INTERFACE_MODE_RGMII_RXID)) {
  65. /* select debug reg 0 */
  66. phy_write(phydev, MDIO_DEVAD_NONE, 0x1D, 0x0);
  67. /* enable rx delay */
  68. phy_write(phydev, MDIO_DEVAD_NONE, 0x1E, 0x8000);
  69. }
  70. phydev->supported = phydev->drv->features;
  71. genphy_config_aneg(phydev);
  72. genphy_restart_aneg(phydev);
  73. return 0;
  74. }
  75. static struct phy_driver AR8021_driver = {
  76. .name = "AR8021",
  77. .uid = 0x4dd040,
  78. .mask = 0x4ffff0,
  79. .features = PHY_GBIT_FEATURES,
  80. .config = ar8021_config,
  81. .startup = genphy_startup,
  82. .shutdown = genphy_shutdown,
  83. };
  84. static struct phy_driver AR8031_driver = {
  85. .name = "AR8031/AR8033",
  86. .uid = 0x4dd074,
  87. .mask = 0xffffffef,
  88. .features = PHY_GBIT_FEATURES,
  89. .config = ar8031_config,
  90. .startup = genphy_startup,
  91. .shutdown = genphy_shutdown,
  92. };
  93. static struct phy_driver AR8035_driver = {
  94. .name = "AR8035",
  95. .uid = 0x4dd072,
  96. .mask = 0xffffffef,
  97. .features = PHY_GBIT_FEATURES,
  98. .config = ar8035_config,
  99. .startup = genphy_startup,
  100. .shutdown = genphy_shutdown,
  101. };
  102. int phy_atheros_init(void)
  103. {
  104. phy_register(&AR8021_driver);
  105. phy_register(&AR8031_driver);
  106. phy_register(&AR8035_driver);
  107. return 0;
  108. }