101-22-net-mediatek-add-support-for-GMAC-USB3-PHY-mux-mode-.patch 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. From 542d455466bdf32e1bb70230ebcdefd8ed09643b Mon Sep 17 00:00:00 2001
  2. From: Weijie Gao <[email protected]>
  3. Date: Wed, 19 Jul 2023 17:17:22 +0800
  4. Subject: [PATCH 22/29] net: mediatek: add support for GMAC/USB3 PHY mux mode
  5. for MT7981
  6. MT7981 has its GMAC2 PHY shared with USB3. To enable GMAC2, mux
  7. register must be set to connect the SGMII phy to GMAC2.
  8. Signed-off-by: Weijie Gao <[email protected]>
  9. ---
  10. drivers/net/mtk_eth.c | 33 ++++++++++++++++++++++++++++++++-
  11. drivers/net/mtk_eth.h | 16 ++++++++++++++++
  12. 2 files changed, 48 insertions(+), 1 deletion(-)
  13. --- a/drivers/net/mtk_eth.c
  14. +++ b/drivers/net/mtk_eth.c
  15. @@ -103,6 +103,8 @@ struct mtk_eth_priv {
  16. struct regmap *ethsys_regmap;
  17. + struct regmap *infra_regmap;
  18. +
  19. struct mii_dev *mdio_bus;
  20. int (*mii_read)(struct mtk_eth_priv *priv, u8 phy, u8 reg);
  21. int (*mii_write)(struct mtk_eth_priv *priv, u8 phy, u8 reg, u16 val);
  22. @@ -186,6 +188,17 @@ static void mtk_ethsys_rmw(struct mtk_et
  23. regmap_write(priv->ethsys_regmap, reg, val);
  24. }
  25. +static void mtk_infra_rmw(struct mtk_eth_priv *priv, u32 reg, u32 clr,
  26. + u32 set)
  27. +{
  28. + uint val;
  29. +
  30. + regmap_read(priv->infra_regmap, reg, &val);
  31. + val &= ~clr;
  32. + val |= set;
  33. + regmap_write(priv->infra_regmap, reg, val);
  34. +}
  35. +
  36. /* Direct MDIO clause 22/45 access via SoC */
  37. static int mtk_mii_rw(struct mtk_eth_priv *priv, u8 phy, u8 reg, u16 data,
  38. u32 cmd, u32 st)
  39. @@ -1139,6 +1152,11 @@ static void mtk_mac_init(struct mtk_eth_
  40. break;
  41. case PHY_INTERFACE_MODE_SGMII:
  42. case PHY_INTERFACE_MODE_2500BASEX:
  43. + if (MTK_HAS_CAPS(priv->soc->caps, MTK_GMAC2_U3_QPHY)) {
  44. + mtk_infra_rmw(priv, USB_PHY_SWITCH_REG, QPHY_SEL_MASK,
  45. + SGMII_QPHY_SEL);
  46. + }
  47. +
  48. ge_mode = GE_MODE_RGMII;
  49. mtk_ethsys_rmw(priv, ETHSYS_SYSCFG0_REG, SYSCFG0_SGMII_SEL_M,
  50. SYSCFG0_SGMII_SEL(priv->gmac_id));
  51. @@ -1497,6 +1515,19 @@ static int mtk_eth_of_to_plat(struct ude
  52. if (IS_ERR(priv->ethsys_regmap))
  53. return PTR_ERR(priv->ethsys_regmap);
  54. + if (MTK_HAS_CAPS(priv->soc->caps, MTK_INFRA)) {
  55. + /* get corresponding infracfg phandle */
  56. + ret = dev_read_phandle_with_args(dev, "mediatek,infracfg",
  57. + NULL, 0, 0, &args);
  58. +
  59. + if (ret)
  60. + return ret;
  61. +
  62. + priv->infra_regmap = syscon_node_to_regmap(args.node);
  63. + if (IS_ERR(priv->infra_regmap))
  64. + return PTR_ERR(priv->infra_regmap);
  65. + }
  66. +
  67. /* Reset controllers */
  68. ret = reset_get_by_name(dev, "fe", &priv->rst_fe);
  69. if (ret) {
  70. @@ -1614,7 +1645,7 @@ static const struct mtk_soc_data mt7986_
  71. };
  72. static const struct mtk_soc_data mt7981_data = {
  73. - .caps = MT7986_CAPS,
  74. + .caps = MT7981_CAPS,
  75. .ana_rgc3 = 0x128,
  76. .pdma_base = PDMA_V2_BASE,
  77. .txd_size = sizeof(struct mtk_tx_dma_v2),
  78. --- a/drivers/net/mtk_eth.h
  79. +++ b/drivers/net/mtk_eth.h
  80. @@ -15,27 +15,38 @@
  81. enum mkt_eth_capabilities {
  82. MTK_TRGMII_BIT,
  83. MTK_TRGMII_MT7621_CLK_BIT,
  84. + MTK_U3_COPHY_V2_BIT,
  85. + MTK_INFRA_BIT,
  86. MTK_NETSYS_V2_BIT,
  87. /* PATH BITS */
  88. MTK_ETH_PATH_GMAC1_TRGMII_BIT,
  89. + MTK_ETH_PATH_GMAC2_SGMII_BIT,
  90. };
  91. #define MTK_TRGMII BIT(MTK_TRGMII_BIT)
  92. #define MTK_TRGMII_MT7621_CLK BIT(MTK_TRGMII_MT7621_CLK_BIT)
  93. +#define MTK_U3_COPHY_V2 BIT(MTK_U3_COPHY_V2_BIT)
  94. +#define MTK_INFRA BIT(MTK_INFRA_BIT)
  95. #define MTK_NETSYS_V2 BIT(MTK_NETSYS_V2_BIT)
  96. /* Supported path present on SoCs */
  97. #define MTK_ETH_PATH_GMAC1_TRGMII BIT(MTK_ETH_PATH_GMAC1_TRGMII_BIT)
  98. +#define MTK_ETH_PATH_GMAC2_SGMII BIT(MTK_ETH_PATH_GMAC2_SGMII_BIT)
  99. +
  100. #define MTK_GMAC1_TRGMII (MTK_ETH_PATH_GMAC1_TRGMII | MTK_TRGMII)
  101. +#define MTK_GMAC2_U3_QPHY (MTK_ETH_PATH_GMAC2_SGMII | MTK_U3_COPHY_V2 | MTK_INFRA)
  102. +
  103. #define MTK_HAS_CAPS(caps, _x) (((caps) & (_x)) == (_x))
  104. #define MT7621_CAPS (MTK_GMAC1_TRGMII | MTK_TRGMII_MT7621_CLK)
  105. #define MT7623_CAPS (MTK_GMAC1_TRGMII)
  106. +#define MT7981_CAPS (MTK_GMAC2_U3_QPHY | MTK_NETSYS_V2)
  107. +
  108. #define MT7986_CAPS (MTK_NETSYS_V2)
  109. /* Frame Engine Register Bases */
  110. @@ -56,6 +67,11 @@ enum mkt_eth_capabilities {
  111. #define ETHSYS_CLKCFG0_REG 0x2c
  112. #define ETHSYS_TRGMII_CLK_SEL362_5 BIT(11)
  113. +/* Top misc registers */
  114. +#define USB_PHY_SWITCH_REG 0x218
  115. +#define QPHY_SEL_MASK 0x3
  116. +#define SGMII_QPHY_SEL 0x2
  117. +
  118. /* SYSCFG0_GE_MODE: GE Modes */
  119. #define GE_MODE_RGMII 0
  120. #define GE_MODE_MII 1