002-0006-net-mediatek-use-a-struct-to-cover-variations-of-all.patch 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. From ba6af13fd58c0ec418720d959152e0db47e91b02 Mon Sep 17 00:00:00 2001
  2. From: Weijie Gao <[email protected]>
  3. Date: Wed, 31 Aug 2022 19:04:19 +0800
  4. Subject: [PATCH 06/32] net: mediatek: use a struct to cover variations of all
  5. SoCs
  6. Using a single soc id to control different initialization and TX/RX flow
  7. for all SoCs is not extensible if more hardware variations are added in
  8. the future.
  9. This patch introduces a struct to replace the original mtk_soc to allow
  10. the driver be able handle newer hardwares.
  11. Reviewed-by: Simon Glass <[email protected]>
  12. Signed-off-by: Weijie Gao <[email protected]>
  13. ---
  14. drivers/net/mtk_eth.c | 56 ++++++++++++++++++++++++++++++-------------
  15. drivers/net/mtk_eth.h | 25 ++++++++++++++++++-
  16. 2 files changed, 64 insertions(+), 17 deletions(-)
  17. --- a/drivers/net/mtk_eth.c
  18. +++ b/drivers/net/mtk_eth.c
  19. @@ -142,11 +142,15 @@ enum mtk_switch {
  20. SW_MT7531
  21. };
  22. -enum mtk_soc {
  23. - SOC_MT7623,
  24. - SOC_MT7629,
  25. - SOC_MT7622,
  26. - SOC_MT7621
  27. +/* struct mtk_soc_data - This is the structure holding all differences
  28. + * among various plaforms
  29. + * @caps Flags shown the extra capability for the SoC
  30. + * @ana_rgc3: The offset for register ANA_RGC3 related to
  31. + * sgmiisys syscon
  32. + */
  33. +struct mtk_soc_data {
  34. + u32 caps;
  35. + u32 ana_rgc3;
  36. };
  37. struct mtk_eth_priv {
  38. @@ -171,7 +175,7 @@ struct mtk_eth_priv {
  39. int (*mmd_write)(struct mtk_eth_priv *priv, u8 addr, u8 devad, u16 reg,
  40. u16 val);
  41. - enum mtk_soc soc;
  42. + const struct mtk_soc_data *soc;
  43. int gmac_id;
  44. int force_mode;
  45. int speed;
  46. @@ -679,7 +683,7 @@ static int mt7530_setup(struct mtk_eth_p
  47. u32 val, txdrv;
  48. int i;
  49. - if (priv->soc != SOC_MT7621) {
  50. + if (!MTK_HAS_CAPS(priv->soc->caps, MTK_TRGMII_MT7621_CLK)) {
  51. /* Select 250MHz clk for RGMII mode */
  52. mtk_ethsys_rmw(priv, ETHSYS_CLKCFG0_REG,
  53. ETHSYS_TRGMII_CLK_SEL362_5, 0);
  54. @@ -1108,9 +1112,8 @@ static int mtk_phy_probe(struct udevice
  55. static void mtk_sgmii_init(struct mtk_eth_priv *priv)
  56. {
  57. /* Set SGMII GEN2 speed(2.5G) */
  58. - clrsetbits_le32(priv->sgmii_base + ((priv->soc == SOC_MT7622) ?
  59. - SGMSYS_GEN2_SPEED : SGMSYS_GEN2_SPEED_V2),
  60. - SGMSYS_SPEED_2500, SGMSYS_SPEED_2500);
  61. + setbits_le32(priv->sgmii_base + priv->soc->ana_rgc3,
  62. + SGMSYS_SPEED_2500);
  63. /* Disable SGMII AN */
  64. clrsetbits_le32(priv->sgmii_base + SGMSYS_PCS_CONTROL_1,
  65. @@ -1182,7 +1185,8 @@ static void mtk_mac_init(struct mtk_eth_
  66. mtk_gmac_write(priv, GMAC_PORT_MCR(priv->gmac_id), mcr);
  67. }
  68. - if (priv->soc == SOC_MT7623) {
  69. + if (MTK_HAS_CAPS(priv->soc->caps, MTK_GMAC1_TRGMII) &&
  70. + !MTK_HAS_CAPS(priv->soc->caps, MTK_TRGMII_MT7621_CLK)) {
  71. /* Lower Tx Driving for TRGMII path */
  72. for (i = 0 ; i < NUM_TRGMII_CTRL; i++)
  73. mtk_gmac_write(priv, GMAC_TRGMII_TD_ODT(i),
  74. @@ -1431,7 +1435,11 @@ static int mtk_eth_of_to_plat(struct ude
  75. ofnode subnode;
  76. int ret;
  77. - priv->soc = dev_get_driver_data(dev);
  78. + priv->soc = (const struct mtk_soc_data *)dev_get_driver_data(dev);
  79. + if (!priv->soc) {
  80. + dev_err(dev, "missing soc compatible data\n");
  81. + return -EINVAL;
  82. + }
  83. pdata->iobase = (phys_addr_t)dev_remap_addr(dev);
  84. @@ -1544,11 +1552,27 @@ static int mtk_eth_of_to_plat(struct ude
  85. return 0;
  86. }
  87. +static const struct mtk_soc_data mt7629_data = {
  88. + .ana_rgc3 = 0x128,
  89. +};
  90. +
  91. +static const struct mtk_soc_data mt7623_data = {
  92. + .caps = MT7623_CAPS,
  93. +};
  94. +
  95. +static const struct mtk_soc_data mt7622_data = {
  96. + .ana_rgc3 = 0x2028,
  97. +};
  98. +
  99. +static const struct mtk_soc_data mt7621_data = {
  100. + .caps = MT7621_CAPS,
  101. +};
  102. +
  103. static const struct udevice_id mtk_eth_ids[] = {
  104. - { .compatible = "mediatek,mt7629-eth", .data = SOC_MT7629 },
  105. - { .compatible = "mediatek,mt7623-eth", .data = SOC_MT7623 },
  106. - { .compatible = "mediatek,mt7622-eth", .data = SOC_MT7622 },
  107. - { .compatible = "mediatek,mt7621-eth", .data = SOC_MT7621 },
  108. + { .compatible = "mediatek,mt7629-eth", .data = (ulong)&mt7629_data },
  109. + { .compatible = "mediatek,mt7623-eth", .data = (ulong)&mt7623_data },
  110. + { .compatible = "mediatek,mt7622-eth", .data = (ulong)&mt7622_data },
  111. + { .compatible = "mediatek,mt7621-eth", .data = (ulong)&mt7621_data },
  112. {}
  113. };
  114. --- a/drivers/net/mtk_eth.h
  115. +++ b/drivers/net/mtk_eth.h
  116. @@ -9,8 +9,31 @@
  117. #ifndef _MTK_ETH_H_
  118. #define _MTK_ETH_H_
  119. -/* Frame Engine Register Bases */
  120. #include <linux/bitops.h>
  121. +
  122. +enum mkt_eth_capabilities {
  123. + MTK_TRGMII_BIT,
  124. + MTK_TRGMII_MT7621_CLK_BIT,
  125. +
  126. + /* PATH BITS */
  127. + MTK_ETH_PATH_GMAC1_TRGMII_BIT,
  128. +};
  129. +
  130. +#define MTK_TRGMII BIT(MTK_TRGMII_BIT)
  131. +#define MTK_TRGMII_MT7621_CLK BIT(MTK_TRGMII_MT7621_CLK_BIT)
  132. +
  133. +/* Supported path present on SoCs */
  134. +#define MTK_ETH_PATH_GMAC1_TRGMII BIT(MTK_ETH_PATH_GMAC1_TRGMII_BIT)
  135. +
  136. +#define MTK_GMAC1_TRGMII (MTK_ETH_PATH_GMAC1_TRGMII | MTK_TRGMII)
  137. +
  138. +#define MTK_HAS_CAPS(caps, _x) (((caps) & (_x)) == (_x))
  139. +
  140. +#define MT7621_CAPS (MTK_GMAC1_TRGMII | MTK_TRGMII_MT7621_CLK)
  141. +
  142. +#define MT7623_CAPS (MTK_GMAC1_TRGMII)
  143. +
  144. +/* Frame Engine Register Bases */
  145. #define PDMA_BASE 0x0800
  146. #define GDMA1_BASE 0x0500
  147. #define GDMA2_BASE 0x1500