mtk-ge.c 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. // SPDX-License-Identifier: GPL-2.0+
  2. #include <linux/bitfield.h>
  3. #include <linux/module.h>
  4. #include <linux/phy.h>
  5. #include "mtk.h"
  6. #define MTK_GPHY_ID_MT7530 0x03a29412
  7. #define MTK_GPHY_ID_MT7531 0x03a29441
  8. #define MTK_PHY_PAGE_EXTENDED_2 0x0002
  9. #define MTK_PHY_PAGE_EXTENDED_3 0x0003
  10. #define MTK_PHY_RG_LPI_PCS_DSP_CTRL_REG11 0x11
  11. #define MTK_PHY_PAGE_EXTENDED_2A30 0x2a30
  12. /* Registers on Token Ring debug nodes */
  13. /* ch_addr = 0x1, node_addr = 0xf, data_addr = 0x17 */
  14. #define SLAVE_DSP_READY_TIME_MASK GENMASK(22, 15)
  15. /* Registers on MDIO_MMD_VEND1 */
  16. #define MTK_PHY_GBE_MODE_TX_DELAY_SEL 0x13
  17. #define MTK_PHY_TEST_MODE_TX_DELAY_SEL 0x14
  18. #define MTK_TX_DELAY_PAIR_B_MASK GENMASK(10, 8)
  19. #define MTK_TX_DELAY_PAIR_D_MASK GENMASK(2, 0)
  20. #define MTK_PHY_MCC_CTRL_AND_TX_POWER_CTRL 0xa6
  21. #define MTK_MCC_NEARECHO_OFFSET_MASK GENMASK(15, 8)
  22. #define MTK_PHY_RXADC_CTRL_RG7 0xc6
  23. #define MTK_PHY_DA_AD_BUF_BIAS_LP_MASK GENMASK(9, 8)
  24. #define MTK_PHY_RG_LPI_PCS_DSP_CTRL_REG123 0x123
  25. #define MTK_PHY_LPI_NORM_MSE_LO_THRESH100_MASK GENMASK(15, 8)
  26. #define MTK_PHY_LPI_NORM_MSE_HI_THRESH100_MASK GENMASK(7, 0)
  27. static void mtk_gephy_config_init(struct phy_device *phydev)
  28. {
  29. /* Enable HW auto downshift */
  30. phy_modify_paged(phydev, MTK_PHY_PAGE_EXTENDED_1,
  31. MTK_PHY_AUX_CTRL_AND_STATUS,
  32. 0, MTK_PHY_ENABLE_DOWNSHIFT);
  33. /* Increase SlvDPSready time */
  34. mtk_tr_modify(phydev, 0x1, 0xf, 0x17, SLAVE_DSP_READY_TIME_MASK,
  35. FIELD_PREP(SLAVE_DSP_READY_TIME_MASK, 0x5e));
  36. /* Adjust 100_mse_threshold */
  37. phy_modify_mmd(phydev, MDIO_MMD_VEND1,
  38. MTK_PHY_RG_LPI_PCS_DSP_CTRL_REG123,
  39. MTK_PHY_LPI_NORM_MSE_LO_THRESH100_MASK |
  40. MTK_PHY_LPI_NORM_MSE_HI_THRESH100_MASK,
  41. FIELD_PREP(MTK_PHY_LPI_NORM_MSE_LO_THRESH100_MASK,
  42. 0xff) |
  43. FIELD_PREP(MTK_PHY_LPI_NORM_MSE_HI_THRESH100_MASK,
  44. 0xff));
  45. /* If echo time is narrower than 0x3, it will be regarded as noise */
  46. phy_modify_mmd(phydev, MDIO_MMD_VEND1,
  47. MTK_PHY_MCC_CTRL_AND_TX_POWER_CTRL,
  48. MTK_MCC_NEARECHO_OFFSET_MASK,
  49. FIELD_PREP(MTK_MCC_NEARECHO_OFFSET_MASK, 0x3));
  50. }
  51. static int mt7530_phy_config_init(struct phy_device *phydev)
  52. {
  53. mtk_gephy_config_init(phydev);
  54. /* Increase post_update_timer */
  55. phy_write_paged(phydev, MTK_PHY_PAGE_EXTENDED_3,
  56. MTK_PHY_RG_LPI_PCS_DSP_CTRL_REG11, 0x4b);
  57. return 0;
  58. }
  59. static int mt7531_phy_config_init(struct phy_device *phydev)
  60. {
  61. mtk_gephy_config_init(phydev);
  62. /* PHY link down power saving enable */
  63. phy_set_bits(phydev, 0x17, BIT(4));
  64. phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RXADC_CTRL_RG7,
  65. MTK_PHY_DA_AD_BUF_BIAS_LP_MASK,
  66. FIELD_PREP(MTK_PHY_DA_AD_BUF_BIAS_LP_MASK, 0x3));
  67. /* Set TX Pair delay selection */
  68. phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_GBE_MODE_TX_DELAY_SEL,
  69. MTK_TX_DELAY_PAIR_B_MASK | MTK_TX_DELAY_PAIR_D_MASK,
  70. FIELD_PREP(MTK_TX_DELAY_PAIR_B_MASK, 0x4) |
  71. FIELD_PREP(MTK_TX_DELAY_PAIR_D_MASK, 0x4));
  72. phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TEST_MODE_TX_DELAY_SEL,
  73. MTK_TX_DELAY_PAIR_B_MASK | MTK_TX_DELAY_PAIR_D_MASK,
  74. FIELD_PREP(MTK_TX_DELAY_PAIR_B_MASK, 0x4) |
  75. FIELD_PREP(MTK_TX_DELAY_PAIR_D_MASK, 0x4));
  76. return 0;
  77. }
  78. static struct phy_driver mtk_gephy_driver[] = {
  79. {
  80. PHY_ID_MATCH_EXACT(MTK_GPHY_ID_MT7530),
  81. .name = "MediaTek MT7530 PHY",
  82. .config_init = mt7530_phy_config_init,
  83. /* Interrupts are handled by the switch, not the PHY
  84. * itself.
  85. */
  86. .config_intr = genphy_no_config_intr,
  87. .handle_interrupt = genphy_handle_interrupt_no_ack,
  88. .suspend = genphy_suspend,
  89. .resume = genphy_resume,
  90. .read_page = mtk_phy_read_page,
  91. .write_page = mtk_phy_write_page,
  92. },
  93. {
  94. PHY_ID_MATCH_EXACT(MTK_GPHY_ID_MT7531),
  95. .name = "MediaTek MT7531 PHY",
  96. .config_init = mt7531_phy_config_init,
  97. /* Interrupts are handled by the switch, not the PHY
  98. * itself.
  99. */
  100. .config_intr = genphy_no_config_intr,
  101. .handle_interrupt = genphy_handle_interrupt_no_ack,
  102. .suspend = genphy_suspend,
  103. .resume = genphy_resume,
  104. .read_page = mtk_phy_read_page,
  105. .write_page = mtk_phy_write_page,
  106. },
  107. };
  108. module_phy_driver(mtk_gephy_driver);
  109. static const struct mdio_device_id __maybe_unused mtk_gephy_tbl[] = {
  110. { PHY_ID_MATCH_EXACT(MTK_GPHY_ID_MT7530) },
  111. { PHY_ID_MATCH_EXACT(MTK_GPHY_ID_MT7531) },
  112. { }
  113. };
  114. MODULE_DESCRIPTION("MediaTek Gigabit Ethernet PHY driver");
  115. MODULE_AUTHOR("DENG, Qingfang <dqfext@gmail.com>");
  116. MODULE_LICENSE("GPL");
  117. MODULE_DEVICE_TABLE(mdio, mtk_gephy_tbl);