atheros.c 3.3 KB

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