730-net-phy-add-driver-for-MediaTek-SoC-built-in-GE-PHYs.patch 45 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443
  1. From a6f143af419bfc3f52d82e88ac033d9833e720af Mon Sep 17 00:00:00 2001
  2. From: Daniel Golle <[email protected]>
  3. Date: Mon, 13 Feb 2023 02:33:14 +0000
  4. Subject: [PATCH] net: phy: add driver for MediaTek SoC built-in GE PHYs
  5. Some of MediaTek's Filogic SoCs come with built-in gigabit Ethernet
  6. PHYs which require calibration data from the SoC's efuse.
  7. Add support for these PHYs to the mediatek-ge driver if built for
  8. MediaTek's ARM64 SoCs.
  9. Signed-off-by: Daniel Golle <[email protected]>
  10. ---
  11. MAINTAINERS | 8 +
  12. drivers/net/phy/Kconfig | 12 +
  13. drivers/net/phy/mediatek-ge.c | 1351 +++++++++++++++++++++++++++++++++
  14. 3 files changed, 1371 insertions(+)
  15. --- a/MAINTAINERS
  16. +++ b/MAINTAINERS
  17. @@ -11797,6 +11797,14 @@ S: Maintained
  18. F: drivers/net/pcs/pcs-mtk-lynxi.c
  19. F: include/linux/pcs/pcs-mtk-lynxi.h
  20. +MEDIATEK ETHERNET PHY DRIVERS
  21. +M: Daniel Golle <[email protected]>
  22. +M: Qingfang Deng <[email protected]>
  23. +M: SkyLake Huang <[email protected]>
  24. +L: [email protected]
  25. +S: Maintained
  26. +F: drivers/net/phy/mediatek-ge.c
  27. +
  28. MEDIATEK I2C CONTROLLER DRIVER
  29. M: Qii Wang <[email protected]>
  30. L: [email protected]
  31. --- a/drivers/net/phy/Kconfig
  32. +++ b/drivers/net/phy/Kconfig
  33. @@ -292,6 +292,18 @@ config MEDIATEK_GE_PHY
  34. help
  35. Supports the MediaTek Gigabit Ethernet PHYs.
  36. +config MEDIATEK_GE_PHY_SOC
  37. + bool "MediaTek SoC Ethernet PHYs"
  38. + depends on (ARM64 && ARCH_MEDIATEK && MEDIATEK_GE_PHY) || COMPILE_TEST
  39. + select NVMEM_MTK_EFUSE
  40. + help
  41. + Supports MediaTek SoC built-in Gigabit Ethernet PHYs.
  42. +
  43. + Include support for built-in Ethernet PHYs which are present in
  44. + the MT7981 and MT7988 SoCs. These PHYs need calibration data
  45. + present in the SoCs efuse and will dynamically calibrate VCM
  46. + (common-mode voltage) during startup.
  47. +
  48. config MICREL_PHY
  49. tristate "Micrel PHYs"
  50. help
  51. --- a/drivers/net/phy/mediatek-ge.c
  52. +++ b/drivers/net/phy/mediatek-ge.c
  53. @@ -2,6 +2,9 @@
  54. #include <linux/of.h>
  55. #include <linux/bitfield.h>
  56. #include <linux/module.h>
  57. +#include <linux/nvmem-consumer.h>
  58. +#include <linux/of_address.h>
  59. +#include <linux/of_platform.h>
  60. #include <linux/phy.h>
  61. #define MTK_EXT_PAGE_ACCESS 0x1f
  62. @@ -12,6 +15,275 @@
  63. #define MTK_PHY_PAGE_EXTENDED_2A30 0x2a30
  64. #define MTK_PHY_PAGE_EXTENDED_52B5 0x52b5
  65. +#define ANALOG_INTERNAL_OPERATION_MAX_US (20)
  66. +#define ZCAL_CTRL_MIN (0)
  67. +#define ZCAL_CTRL_MAX (63)
  68. +#define TXRESERVE_MIN (0)
  69. +#define TXRESERVE_MAX (7)
  70. +
  71. +#define MTK_PHY_ANARG_RG (0x10)
  72. +#define MTK_PHY_TCLKOFFSET_MASK GENMASK(12, 8)
  73. +
  74. +/* Registers on MDIO_MMD_VEND1 */
  75. +enum {
  76. + MTK_PHY_MIDDLE_LEVEL_SHAPPER_0TO1 = 0,
  77. + MTK_PHY_1st_OVERSHOOT_LEVEL_0TO1,
  78. + MTK_PHY_2nd_OVERSHOOT_LEVEL_0TO1,
  79. + MTK_PHY_MIDDLE_LEVEL_SHAPPER_1TO0,
  80. + MTK_PHY_1st_OVERSHOOT_LEVEL_1TO0,
  81. + MTK_PHY_2nd_OVERSHOOT_LEVEL_1TO0,
  82. + MTK_PHY_MIDDLE_LEVEL_SHAPPER_0TON1, /* N means negative */
  83. + MTK_PHY_1st_OVERSHOOT_LEVEL_0TON1,
  84. + MTK_PHY_2nd_OVERSHOOT_LEVEL_0TON1,
  85. + MTK_PHY_MIDDLE_LEVEL_SHAPPER_N1TO0,
  86. + MTK_PHY_1st_OVERSHOOT_LEVEL_N1TO0,
  87. + MTK_PHY_2nd_OVERSHOOT_LEVEL_N1TO0,
  88. + MTK_PHY_TX_MLT3_END,
  89. +};
  90. +
  91. +#define MTK_PHY_TXVLD_DA_RG (0x12)
  92. +#define MTK_PHY_DA_TX_I2MPB_A_GBE_MASK GENMASK(15, 10)
  93. +#define MTK_PHY_DA_TX_I2MPB_A_TBT_MASK GENMASK(5, 0)
  94. +
  95. +#define MTK_PHY_TX_I2MPB_TEST_MODE_A2 (0x16)
  96. +#define MTK_PHY_DA_TX_I2MPB_A_HBT_MASK GENMASK(15, 10)
  97. +#define MTK_PHY_DA_TX_I2MPB_A_TST_MASK GENMASK(5, 0)
  98. +
  99. +#define MTK_PHY_TX_I2MPB_TEST_MODE_B1 (0x17)
  100. +#define MTK_PHY_DA_TX_I2MPB_B_GBE_MASK GENMASK(13, 8)
  101. +#define MTK_PHY_DA_TX_I2MPB_B_TBT_MASK GENMASK(5, 0)
  102. +
  103. +#define MTK_PHY_TX_I2MPB_TEST_MODE_B2 (0x18)
  104. +#define MTK_PHY_DA_TX_I2MPB_B_HBT_MASK GENMASK(13, 8)
  105. +#define MTK_PHY_DA_TX_I2MPB_B_TST_MASK GENMASK(5, 0)
  106. +
  107. +#define MTK_PHY_TX_I2MPB_TEST_MODE_C1 (0x19)
  108. +#define MTK_PHY_DA_TX_I2MPB_C_GBE_MASK GENMASK(13, 8)
  109. +#define MTK_PHY_DA_TX_I2MPB_C_TBT_MASK GENMASK(5, 0)
  110. +
  111. +#define MTK_PHY_TX_I2MPB_TEST_MODE_C2 (0x20)
  112. +#define MTK_PHY_DA_TX_I2MPB_C_HBT_MASK GENMASK(13, 8)
  113. +#define MTK_PHY_DA_TX_I2MPB_C_TST_MASK GENMASK(5, 0)
  114. +
  115. +#define MTK_PHY_TX_I2MPB_TEST_MODE_D1 (0x21)
  116. +#define MTK_PHY_DA_TX_I2MPB_D_GBE_MASK GENMASK(13, 8)
  117. +#define MTK_PHY_DA_TX_I2MPB_D_TBT_MASK GENMASK(5, 0)
  118. +
  119. +#define MTK_PHY_TX_I2MPB_TEST_MODE_D2 (0x22)
  120. +#define MTK_PHY_DA_TX_I2MPB_D_HBT_MASK GENMASK(13, 8)
  121. +#define MTK_PHY_DA_TX_I2MPB_D_TST_MASK GENMASK(5, 0)
  122. +
  123. +#define MTK_PHY_TANA_CAL_MODE (0xc1)
  124. +#define MTK_PHY_TANA_CAL_MODE_SHIFT (8)
  125. +
  126. +#define MTK_PHY_RXADC_CTRL_RG7 (0xc6)
  127. +#define MTK_PHY_DA_AD_BUF_BIAS_LP_MASK GENMASK(9, 8)
  128. +
  129. +#define MTK_PHY_RXADC_CTRL_RG9 (0xc8)
  130. +#define MTK_PHY_DA_RX_PSBN_TBT_MASK GENMASK(14, 12)
  131. +#define MTK_PHY_DA_RX_PSBN_HBT_MASK GENMASK(10, 8)
  132. +#define MTK_PHY_DA_RX_PSBN_GBE_MASK GENMASK(6, 4)
  133. +#define MTK_PHY_DA_RX_PSBN_LP_MASK GENMASK(2, 0)
  134. +
  135. +#define MTK_PHY_LDO_OUTPUT_V (0xd7)
  136. +
  137. +#define MTK_PHY_RG_ANA_CAL_RG0 (0xdb)
  138. +#define MTK_PHY_RG_CAL_CKINV BIT(12)
  139. +#define MTK_PHY_RG_ANA_CALEN BIT(8)
  140. +#define MTK_PHY_RG_REXT_CALEN BIT(4)
  141. +#define MTK_PHY_RG_ZCALEN_A BIT(0)
  142. +
  143. +#define MTK_PHY_RG_ANA_CAL_RG1 (0xdc)
  144. +#define MTK_PHY_RG_ZCALEN_B BIT(12)
  145. +#define MTK_PHY_RG_ZCALEN_C BIT(8)
  146. +#define MTK_PHY_RG_ZCALEN_D BIT(4)
  147. +#define MTK_PHY_RG_TXVOS_CALEN BIT(0)
  148. +
  149. +#define MTK_PHY_RG_ANA_CAL_RG2 (0xdd)
  150. +#define MTK_PHY_RG_TXG_CALEN_A BIT(12)
  151. +#define MTK_PHY_RG_TXG_CALEN_B BIT(8)
  152. +#define MTK_PHY_RG_TXG_CALEN_C BIT(4)
  153. +#define MTK_PHY_RG_TXG_CALEN_D BIT(0)
  154. +
  155. +#define MTK_PHY_RG_ANA_CAL_RG5 (0xe0)
  156. +#define MTK_PHY_RG_REXT_TRIM_MASK GENMASK(13, 8)
  157. +#define MTK_PHY_RG_ZCAL_CTRL_MASK GENMASK(5, 0)
  158. +
  159. +#define MTK_PHY_RG_TX_FILTER (0xfe)
  160. +
  161. +#define MTK_PHY_RG_CR_TX_AMP_OFFSET_A_B (0x172)
  162. +#define MTK_PHY_CR_TX_AMP_OFFSET_A_MASK GENMASK(13, 8)
  163. +#define MTK_PHY_CR_TX_AMP_OFFSET_B_MASK GENMASK(6, 0)
  164. +
  165. +#define MTK_PHY_RG_CR_TX_AMP_OFFSET_C_D (0x173)
  166. +#define MTK_PHY_CR_TX_AMP_OFFSET_C_MASK GENMASK(13, 8)
  167. +#define MTK_PHY_CR_TX_AMP_OFFSET_D_MASK GENMASK(6, 0)
  168. +
  169. +#define MTK_PHY_RG_AD_CAL_COMP (0x17a)
  170. +#define MTK_PHY_AD_CAL_COMP_OUT_SHIFT (8)
  171. +
  172. +#define MTK_PHY_RG_AD_CAL_CLK (0x17b)
  173. +#define MTK_PHY_DA_CAL_CLK BIT(0)
  174. +
  175. +#define MTK_PHY_RG_AD_CALIN (0x17c)
  176. +#define MTK_PHY_DA_CALIN_FLAG BIT(0)
  177. +
  178. +#define MTK_PHY_RG_DASN_DAC_IN0_A (0x17d)
  179. +#define MTK_PHY_DASN_DAC_IN0_A_MASK GENMASK(9, 0)
  180. +
  181. +#define MTK_PHY_RG_DASN_DAC_IN0_B (0x17e)
  182. +#define MTK_PHY_DASN_DAC_IN0_B_MASK GENMASK(9, 0)
  183. +
  184. +#define MTK_PHY_RG_DASN_DAC_IN0_C (0x17f)
  185. +#define MTK_PHY_DASN_DAC_IN0_C_MASK GENMASK(9, 0)
  186. +
  187. +#define MTK_PHY_RG_DASN_DAC_IN0_D (0x180)
  188. +#define MTK_PHY_DASN_DAC_IN0_D_MASK GENMASK(9, 0)
  189. +
  190. +#define MTK_PHY_RG_DASN_DAC_IN1_A (0x181)
  191. +#define MTK_PHY_DASN_DAC_IN1_A_MASK GENMASK(9, 0)
  192. +
  193. +#define MTK_PHY_RG_DASN_DAC_IN1_B (0x182)
  194. +#define MTK_PHY_DASN_DAC_IN1_B_MASK GENMASK(9, 0)
  195. +
  196. +#define MTK_PHY_RG_DASN_DAC_IN1_C (0x183)
  197. +#define MTK_PHY_DASN_DAC_IN1_C_MASK GENMASK(9, 0)
  198. +
  199. +#define MTK_PHY_RG_DASN_DAC_IN1_D (0x180)
  200. +#define MTK_PHY_DASN_DAC_IN1_D_MASK GENMASK(9, 0)
  201. +
  202. +#define MTK_PHY_RG_LP_IIR2_K1_L (0x22a)
  203. +#define MTK_PHY_RG_LP_IIR2_K1_U (0x22b)
  204. +#define MTK_PHY_RG_LP_IIR2_K2_L (0x22c)
  205. +#define MTK_PHY_RG_LP_IIR2_K2_U (0x22d)
  206. +#define MTK_PHY_RG_LP_IIR2_K3_L (0x22e)
  207. +#define MTK_PHY_RG_LP_IIR2_K3_U (0x22f)
  208. +#define MTK_PHY_RG_LP_IIR2_K4_L (0x230)
  209. +#define MTK_PHY_RG_LP_IIR2_K4_U (0x231)
  210. +#define MTK_PHY_RG_LP_IIR2_K5_L (0x232)
  211. +#define MTK_PHY_RG_LP_IIR2_K5_U (0x233)
  212. +
  213. +#define MTK_PHY_RG_DEV1E_REG234 (0x234)
  214. +#define MTK_PHY_TR_OPEN_LOOP_EN_MASK GENMASK(0, 0)
  215. +#define MTK_PHY_LPF_X_AVERAGE_MASK GENMASK(7, 4)
  216. +
  217. +#define MTK_PHY_RG_LPF_CNT_VAL (0x235)
  218. +
  219. +#define MTK_PHY_RG_DEV1E_REG27C (0x27c)
  220. +#define MTK_PHY_VGASTATE_FFE_THR_ST1_MASK GENMASK(12, 8)
  221. +#define MTK_PHY_RG_DEV1E_REG27D (0x27d)
  222. +#define MTK_PHY_VGASTATE_FFE_THR_ST2_MASK GENMASK(4, 0)
  223. +
  224. +#define MTK_PHY_LDO_PUMP_EN_PAIRAB (0x502)
  225. +#define MTK_PHY_LDO_PUMP_EN_PAIRCD (0x503)
  226. +
  227. +#define MTK_PHY_DA_TX_R50_PAIR_A (0x53d)
  228. +#define MTK_PHY_DA_TX_R50_PAIR_B (0x53e)
  229. +#define MTK_PHY_DA_TX_R50_PAIR_C (0x53f)
  230. +#define MTK_PHY_DA_TX_R50_PAIR_D (0x540)
  231. +
  232. +/* Registers on MDIO_MMD_VEND2 */
  233. +#define MTK_PHY_LED0_ON_CTRL (0x24)
  234. +#define MTK_PHY_LED0_ON_MASK GENMASK(6, 0)
  235. +#define MTK_PHY_LED0_ON_LINK1000 BIT(0)
  236. +#define MTK_PHY_LED0_ON_LINK100 BIT(1)
  237. +#define MTK_PHY_LED0_ON_LINK10 BIT(2)
  238. +#define MTK_PHY_LED0_ON_LINKDOWN BIT(3)
  239. +#define MTK_PHY_LED0_ON_FDX BIT(4) /* Full duplex */
  240. +#define MTK_PHY_LED0_ON_HDX BIT(5) /* Half duplex */
  241. +#define MTK_PHY_LED0_FORCE_ON BIT(6)
  242. +#define MTK_PHY_LED0_POLARITY BIT(14)
  243. +#define MTK_PHY_LED0_ENABLE BIT(15)
  244. +
  245. +#define MTK_PHY_LED0_BLINK_CTRL (0x25)
  246. +#define MTK_PHY_LED0_1000TX BIT(0)
  247. +#define MTK_PHY_LED0_1000RX BIT(1)
  248. +#define MTK_PHY_LED0_100TX BIT(2)
  249. +#define MTK_PHY_LED0_100RX BIT(3)
  250. +#define MTK_PHY_LED0_10TX BIT(4)
  251. +#define MTK_PHY_LED0_10RX BIT(5)
  252. +#define MTK_PHY_LED0_COLLISION BIT(6)
  253. +#define MTK_PHY_LED0_RX_CRC_ERR BIT(7)
  254. +#define MTK_PHY_LED0_RX_IDLE_ERR BIT(8)
  255. +#define MTK_PHY_LED0_FORCE_BLINK BIT(9)
  256. +
  257. +#define MTK_PHY_ANA_TEST_BUS_CTRL_RG (0x100)
  258. +#define MTK_PHY_ANA_TEST_MODE_MASK GENMASK(15, 8)
  259. +
  260. +#define MTK_PHY_RG_DASN_TXT_DMY2 (0x110)
  261. +#define MTK_PHY_TST_DMY2_MASK GENMASK(5, 0)
  262. +
  263. +#define MTK_PHY_RG_BG_RASEL (0x115)
  264. +#define MTK_PHY_RG_BG_RASEL_MASK GENMASK(2, 0)
  265. +
  266. +/* These macro privides efuse parsing for internal phy. */
  267. +#define EFS_DA_TX_I2MPB_A(x) (((x) >> 0) & GENMASK(5, 0))
  268. +#define EFS_DA_TX_I2MPB_B(x) (((x) >> 6) & GENMASK(5, 0))
  269. +#define EFS_DA_TX_I2MPB_C(x) (((x) >> 12) & GENMASK(5, 0))
  270. +#define EFS_DA_TX_I2MPB_D(x) (((x) >> 18) & GENMASK(5, 0))
  271. +#define EFS_DA_TX_AMP_OFFSET_A(x) (((x) >> 24) & GENMASK(5, 0))
  272. +
  273. +#define EFS_DA_TX_AMP_OFFSET_B(x) (((x) >> 0) & GENMASK(5, 0))
  274. +#define EFS_DA_TX_AMP_OFFSET_C(x) (((x) >> 6) & GENMASK(5, 0))
  275. +#define EFS_DA_TX_AMP_OFFSET_D(x) (((x) >> 12) & GENMASK(5, 0))
  276. +#define EFS_DA_TX_R50_A(x) (((x) >> 18) & GENMASK(5, 0))
  277. +#define EFS_DA_TX_R50_B(x) (((x) >> 24) & GENMASK(5, 0))
  278. +
  279. +#define EFS_DA_TX_R50_C(x) (((x) >> 0) & GENMASK(5, 0))
  280. +#define EFS_DA_TX_R50_D(x) (((x) >> 6) & GENMASK(5, 0))
  281. +#define EFS_DA_TX_R50_A_10M(x) (((x) >> 12) & GENMASK(5, 0))
  282. +#define EFS_DA_TX_R50_B_10M(x) (((x) >> 18) & GENMASK(5, 0))
  283. +
  284. +#define EFS_RG_BG_RASEL(x) (((x) >> 4) & GENMASK(2, 0))
  285. +#define EFS_RG_REXT_TRIM(x) (((x) >> 7) & GENMASK(5, 0))
  286. +
  287. +enum {
  288. + NO_PAIR,
  289. + PAIR_A,
  290. + PAIR_B,
  291. + PAIR_C,
  292. + PAIR_D,
  293. +};
  294. +
  295. +enum {
  296. + GPHY_PORT0,
  297. + GPHY_PORT1,
  298. + GPHY_PORT2,
  299. + GPHY_PORT3,
  300. +};
  301. +
  302. +enum calibration_mode {
  303. + EFUSE_K,
  304. + SW_K
  305. +};
  306. +
  307. +enum CAL_ITEM {
  308. + REXT,
  309. + TX_OFFSET,
  310. + TX_AMP,
  311. + TX_R50,
  312. + TX_VCM
  313. +};
  314. +
  315. +enum CAL_MODE {
  316. + SW_EFUSE_M,
  317. + EFUSE_M,
  318. + SW_M
  319. +};
  320. +
  321. +const u8 mt798x_zcal_to_r50[64] = {
  322. + 7, 8, 9, 9, 10, 10, 11, 11,
  323. + 12, 13, 13, 14, 14, 15, 16, 16,
  324. + 17, 18, 18, 19, 20, 21, 21, 22,
  325. + 23, 24, 24, 25, 26, 27, 28, 29,
  326. + 30, 31, 32, 33, 34, 35, 36, 37,
  327. + 38, 40, 41, 42, 43, 45, 46, 48,
  328. + 49, 51, 52, 54, 55, 57, 59, 61,
  329. + 62, 63, 63, 63, 63, 63, 63, 63
  330. +};
  331. +
  332. +const char pair[4] = {'A', 'B', 'C', 'D'};
  333. +
  334. static int mtk_gephy_read_page(struct phy_device *phydev)
  335. {
  336. return __phy_read(phydev, MTK_EXT_PAGE_ACCESS);
  337. @@ -102,6 +374,1059 @@ static int mt7531_phy_config_init(struct
  338. return 0;
  339. }
  340. +#ifdef CONFIG_MEDIATEK_GE_PHY_SOC
  341. +/* One calibration cycle consists of:
  342. + * 1.Set DA_CALIN_FLAG high to start calibration. Keep it high
  343. + * until AD_CAL_COMP is ready to output calibration result.
  344. + * 2.Wait until DA_CAL_CLK is available.
  345. + * 3.Fetch AD_CAL_COMP_OUT.
  346. + */
  347. +static int cal_cycle(struct phy_device *phydev, int devad,
  348. + u32 regnum, u16 mask, u16 cal_val)
  349. +{
  350. + unsigned long timeout;
  351. + int reg_val;
  352. + int ret;
  353. +
  354. + phy_modify_mmd(phydev, devad, regnum,
  355. + mask, cal_val);
  356. + phy_set_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_AD_CALIN,
  357. + MTK_PHY_DA_CALIN_FLAG);
  358. +
  359. + timeout = jiffies + usecs_to_jiffies(ANALOG_INTERNAL_OPERATION_MAX_US);
  360. + do {
  361. + reg_val = phy_read_mmd(phydev, MDIO_MMD_VEND1,
  362. + MTK_PHY_RG_AD_CAL_CLK);
  363. + } while (time_before(jiffies, timeout) && !(reg_val & BIT(0)));
  364. +
  365. + if (!(reg_val & BIT(0))) {
  366. + dev_err(&phydev->mdio.dev, "Calibration cycle timeout\n");
  367. + return -ETIMEDOUT;
  368. + }
  369. +
  370. + phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_AD_CALIN,
  371. + MTK_PHY_DA_CALIN_FLAG);
  372. + ret = phy_read_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_AD_CAL_COMP) >>
  373. + MTK_PHY_AD_CAL_COMP_OUT_SHIFT;
  374. + dev_dbg(&phydev->mdio.dev, "cal_val: 0x%x, ret: %d\n", cal_val, ret);
  375. +
  376. + return ret;
  377. +}
  378. +
  379. +static int rext_fill_result(struct phy_device *phydev, u16 *buf)
  380. +{
  381. + phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG5,
  382. + MTK_PHY_RG_REXT_TRIM_MASK, buf[0] << 8);
  383. + phy_modify_mmd(phydev, MDIO_MMD_VEND2, MTK_PHY_RG_BG_RASEL,
  384. + MTK_PHY_RG_BG_RASEL_MASK, buf[1]);
  385. +
  386. + return 0;
  387. +}
  388. +
  389. +static int rext_cal_efuse(struct phy_device *phydev, u32 *buf)
  390. +{
  391. + u16 rext_cal_val[2];
  392. +
  393. + rext_cal_val[0] = EFS_RG_REXT_TRIM(buf[3]);
  394. + rext_cal_val[1] = EFS_RG_BG_RASEL(buf[3]);
  395. + rext_fill_result(phydev, rext_cal_val);
  396. +
  397. + return 0;
  398. +}
  399. +
  400. +static int rext_cal_sw(struct phy_device *phydev)
  401. +{
  402. + u8 rg_zcal_ctrl_def;
  403. + u8 zcal_lower, zcal_upper, rg_zcal_ctrl;
  404. + u8 lower_ret, upper_ret;
  405. + u16 rext_cal_val[2];
  406. + int ret;
  407. +
  408. + phy_modify_mmd(phydev, MDIO_MMD_VEND2, MTK_PHY_ANA_TEST_BUS_CTRL_RG,
  409. + MTK_PHY_ANA_TEST_MODE_MASK, MTK_PHY_TANA_CAL_MODE << 8);
  410. + phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG1,
  411. + MTK_PHY_RG_TXVOS_CALEN);
  412. + phy_set_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG0,
  413. + MTK_PHY_RG_CAL_CKINV | MTK_PHY_RG_ANA_CALEN |
  414. + MTK_PHY_RG_REXT_CALEN);
  415. + phy_modify_mmd(phydev, MDIO_MMD_VEND2, MTK_PHY_RG_DASN_TXT_DMY2,
  416. + MTK_PHY_TST_DMY2_MASK, 0x1);
  417. +
  418. + rg_zcal_ctrl_def = phy_read_mmd(phydev, MDIO_MMD_VEND1,
  419. + MTK_PHY_RG_ANA_CAL_RG5) &
  420. + MTK_PHY_RG_ZCAL_CTRL_MASK;
  421. + zcal_lower = ZCAL_CTRL_MIN;
  422. + zcal_upper = ZCAL_CTRL_MAX;
  423. +
  424. + dev_dbg(&phydev->mdio.dev, "Start REXT SW cal.\n");
  425. + while ((zcal_upper - zcal_lower) > 1) {
  426. + rg_zcal_ctrl = DIV_ROUND_CLOSEST(zcal_lower + zcal_upper, 2);
  427. + ret = cal_cycle(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG5,
  428. + MTK_PHY_RG_ZCAL_CTRL_MASK, rg_zcal_ctrl);
  429. + if (ret == 1) {
  430. + zcal_upper = rg_zcal_ctrl;
  431. + upper_ret = ret;
  432. + } else if (ret == 0) {
  433. + zcal_lower = rg_zcal_ctrl;
  434. + lower_ret = ret;
  435. + } else {
  436. + goto restore;
  437. + }
  438. + }
  439. +
  440. + if (zcal_lower == ZCAL_CTRL_MIN) {
  441. + lower_ret = cal_cycle(phydev, MDIO_MMD_VEND1,
  442. + MTK_PHY_RG_ANA_CAL_RG5,
  443. + MTK_PHY_RG_ZCAL_CTRL_MASK, zcal_lower);
  444. + ret = lower_ret;
  445. + } else if (zcal_upper == ZCAL_CTRL_MAX) {
  446. + upper_ret = cal_cycle(phydev, MDIO_MMD_VEND1,
  447. + MTK_PHY_RG_ANA_CAL_RG5,
  448. + MTK_PHY_RG_ZCAL_CTRL_MASK, zcal_upper);
  449. + ret = upper_ret;
  450. + }
  451. + if (ret < 0)
  452. + goto restore;
  453. +
  454. + ret = upper_ret - lower_ret;
  455. + if (ret == 1) {
  456. + rext_cal_val[0] = zcal_upper;
  457. + rext_cal_val[1] = zcal_upper >> 3;
  458. + rext_fill_result(phydev, rext_cal_val);
  459. + dev_info(&phydev->mdio.dev, "REXT SW cal result: 0x%x\n",
  460. + zcal_upper);
  461. + ret = 0;
  462. + } else {
  463. + ret = -EINVAL;
  464. + }
  465. +
  466. +restore:
  467. + phy_clear_bits_mmd(phydev, MDIO_MMD_VEND2,
  468. + MTK_PHY_ANA_TEST_BUS_CTRL_RG,
  469. + MTK_PHY_ANA_TEST_MODE_MASK);
  470. + phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG0,
  471. + MTK_PHY_RG_CAL_CKINV | MTK_PHY_RG_ANA_CALEN |
  472. + MTK_PHY_RG_REXT_CALEN);
  473. + phy_clear_bits_mmd(phydev, MDIO_MMD_VEND2, MTK_PHY_RG_DASN_TXT_DMY2,
  474. + MTK_PHY_TST_DMY2_MASK);
  475. + phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG5,
  476. + MTK_PHY_RG_ZCAL_CTRL_MASK, rg_zcal_ctrl_def);
  477. +
  478. + return ret;
  479. +}
  480. +
  481. +static int tx_offset_fill_result(struct phy_device *phydev, u16 *buf)
  482. +{
  483. + phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_CR_TX_AMP_OFFSET_A_B,
  484. + MTK_PHY_CR_TX_AMP_OFFSET_A_MASK, buf[0] << 8);
  485. + phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_CR_TX_AMP_OFFSET_A_B,
  486. + MTK_PHY_CR_TX_AMP_OFFSET_B_MASK, buf[1]);
  487. + phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_CR_TX_AMP_OFFSET_C_D,
  488. + MTK_PHY_CR_TX_AMP_OFFSET_C_MASK, buf[2] << 8);
  489. + phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_CR_TX_AMP_OFFSET_C_D,
  490. + MTK_PHY_CR_TX_AMP_OFFSET_D_MASK, buf[3]);
  491. +
  492. + return 0;
  493. +}
  494. +
  495. +static int tx_offset_cal_efuse(struct phy_device *phydev, u32 *buf)
  496. +{
  497. + u16 tx_offset_cal_val[4];
  498. +
  499. + tx_offset_cal_val[0] = EFS_DA_TX_AMP_OFFSET_A(buf[0]);
  500. + tx_offset_cal_val[1] = EFS_DA_TX_AMP_OFFSET_B(buf[1]);
  501. + tx_offset_cal_val[2] = EFS_DA_TX_AMP_OFFSET_C(buf[1]);
  502. + tx_offset_cal_val[3] = EFS_DA_TX_AMP_OFFSET_D(buf[1]);
  503. +
  504. + tx_offset_fill_result(phydev, tx_offset_cal_val);
  505. +
  506. + return 0;
  507. +}
  508. +
  509. +static int tx_amp_fill_result(struct phy_device *phydev, u16 *buf)
  510. +{
  511. + int i;
  512. + int bias[16] = {0};
  513. + const int vals_9461[16] = { 7, 1, 4, 7,
  514. + 7, 1, 4, 7,
  515. + 7, 1, 4, 7,
  516. + 7, 1, 4, 7 };
  517. + const int vals_9481[16] = { 10, 6, 6, 10,
  518. + 10, 6, 6, 10,
  519. + 10, 6, 6, 10,
  520. + 10, 6, 6, 10 };
  521. +
  522. + switch (phydev->drv->phy_id) {
  523. + case 0x03a29461:
  524. + /* We add some calibration to efuse values
  525. + * due to board level influence.
  526. + * GBE: +7, TBT: +1, HBT: +4, TST: +7
  527. + */
  528. + memcpy(bias, (const void *)vals_9461, sizeof(bias));
  529. + for (i = 0; i <= 12; i += 4) {
  530. + if (likely(buf[i >> 2] + bias[i] >= 32)) {
  531. + bias[i] -= 13;
  532. + } else {
  533. + phy_modify_mmd(phydev, MDIO_MMD_VEND1,
  534. + 0x5c, 0x7 << i, bias[i] << i);
  535. + bias[i + 1] += 13;
  536. + bias[i + 2] += 13;
  537. + bias[i + 3] += 13;
  538. + }
  539. + }
  540. + break;
  541. + case 0x03a29481:
  542. + memcpy(bias, (const void *)vals_9481, sizeof(bias));
  543. + break;
  544. + default:
  545. + break;
  546. + }
  547. +
  548. + /* Prevent overflow */
  549. + for (i = 0; i < 12; i++) {
  550. + if (buf[i >> 2] + bias[i] > 63) {
  551. + buf[i >> 2] = 63;
  552. + bias[i] = 0;
  553. + } else if (buf[i >> 2] + bias[i] < 0) {
  554. + /* Bias caused by board design may change in the future.
  555. + * So check negative cases, too.
  556. + */
  557. + buf[i >> 2] = 0;
  558. + bias[i] = 0;
  559. + }
  560. + }
  561. +
  562. + phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TXVLD_DA_RG,
  563. + MTK_PHY_DA_TX_I2MPB_A_GBE_MASK, (buf[0] + bias[0]) << 10);
  564. + phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TXVLD_DA_RG,
  565. + MTK_PHY_DA_TX_I2MPB_A_TBT_MASK, buf[0] + bias[1]);
  566. + phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_A2,
  567. + MTK_PHY_DA_TX_I2MPB_A_HBT_MASK, (buf[0] + bias[2]) << 10);
  568. + phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_A2,
  569. + MTK_PHY_DA_TX_I2MPB_A_TST_MASK, buf[0] + bias[3]);
  570. +
  571. + phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_B1,
  572. + MTK_PHY_DA_TX_I2MPB_B_GBE_MASK, (buf[1] + bias[4]) << 8);
  573. + phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_B1,
  574. + MTK_PHY_DA_TX_I2MPB_B_TBT_MASK, buf[1] + bias[5]);
  575. + phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_B2,
  576. + MTK_PHY_DA_TX_I2MPB_B_HBT_MASK, (buf[1] + bias[6]) << 8);
  577. + phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_B2,
  578. + MTK_PHY_DA_TX_I2MPB_B_TST_MASK, buf[1] + bias[7]);
  579. +
  580. + phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_C1,
  581. + MTK_PHY_DA_TX_I2MPB_C_GBE_MASK, (buf[2] + bias[8]) << 8);
  582. + phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_C1,
  583. + MTK_PHY_DA_TX_I2MPB_C_TBT_MASK, buf[2] + bias[9]);
  584. + phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_C2,
  585. + MTK_PHY_DA_TX_I2MPB_C_HBT_MASK, (buf[2] + bias[10]) << 8);
  586. + phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_C2,
  587. + MTK_PHY_DA_TX_I2MPB_C_TST_MASK, buf[2] + bias[11]);
  588. +
  589. + phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_D1,
  590. + MTK_PHY_DA_TX_I2MPB_D_GBE_MASK, (buf[3] + bias[12]) << 8);
  591. + phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_D1,
  592. + MTK_PHY_DA_TX_I2MPB_D_TBT_MASK, buf[3] + bias[13]);
  593. + phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_D2,
  594. + MTK_PHY_DA_TX_I2MPB_D_HBT_MASK, (buf[3] + bias[14]) << 8);
  595. + phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_D2,
  596. + MTK_PHY_DA_TX_I2MPB_D_TST_MASK, buf[3] + bias[15]);
  597. +
  598. + return 0;
  599. +}
  600. +
  601. +static int tx_amp_cal_efuse(struct phy_device *phydev, u32 *buf)
  602. +{
  603. + u16 tx_amp_cal_val[4];
  604. +
  605. + tx_amp_cal_val[0] = EFS_DA_TX_I2MPB_A(buf[0]);
  606. + tx_amp_cal_val[1] = EFS_DA_TX_I2MPB_B(buf[0]);
  607. + tx_amp_cal_val[2] = EFS_DA_TX_I2MPB_C(buf[0]);
  608. + tx_amp_cal_val[3] = EFS_DA_TX_I2MPB_D(buf[0]);
  609. + tx_amp_fill_result(phydev, tx_amp_cal_val);
  610. +
  611. + return 0;
  612. +}
  613. +
  614. +static int tx_r50_fill_result(struct phy_device *phydev, u16 tx_r50_cal_val,
  615. + u8 txg_calen_x)
  616. +{
  617. + int bias = 0;
  618. + u16 reg, val;
  619. +
  620. + switch (phydev->drv->phy_id) {
  621. + case 0x03a29481:
  622. + {
  623. + bias = -2;
  624. + break;
  625. + }
  626. + /* 0x03a29461 enters default case */
  627. + default:
  628. + break;
  629. + }
  630. +
  631. + val = clamp_val(bias + tx_r50_cal_val, 0, 63);
  632. +
  633. + switch (txg_calen_x) {
  634. + case PAIR_A:
  635. + reg = MTK_PHY_DA_TX_R50_PAIR_A;
  636. + break;
  637. + case PAIR_B:
  638. + reg = MTK_PHY_DA_TX_R50_PAIR_B;
  639. + break;
  640. + case PAIR_C:
  641. + reg = MTK_PHY_DA_TX_R50_PAIR_C;
  642. + break;
  643. + case PAIR_D:
  644. + reg = MTK_PHY_DA_TX_R50_PAIR_D;
  645. + break;
  646. + }
  647. +
  648. + phy_write_mmd(phydev, MDIO_MMD_VEND1, reg, val | val << 8);
  649. +
  650. + return 0;
  651. +}
  652. +
  653. +static int tx_r50_cal_efuse(struct phy_device *phydev, u32 *buf,
  654. + u8 txg_calen_x)
  655. +{
  656. + u16 tx_r50_cal_val;
  657. +
  658. + switch (txg_calen_x) {
  659. + case PAIR_A:
  660. + tx_r50_cal_val = EFS_DA_TX_R50_A(buf[1]);
  661. + break;
  662. + case PAIR_B:
  663. + tx_r50_cal_val = EFS_DA_TX_R50_B(buf[1]);
  664. + break;
  665. + case PAIR_C:
  666. + tx_r50_cal_val = EFS_DA_TX_R50_C(buf[2]);
  667. + break;
  668. + case PAIR_D:
  669. + tx_r50_cal_val = EFS_DA_TX_R50_D(buf[2]);
  670. + break;
  671. + }
  672. + tx_r50_fill_result(phydev, tx_r50_cal_val, txg_calen_x);
  673. +
  674. + return 0;
  675. +}
  676. +
  677. +static int tx_r50_cal_sw(struct phy_device *phydev, u8 txg_calen_x)
  678. +{
  679. + u8 zcal_lower, zcal_upper, rg_zcal_ctrl;
  680. + u8 lower_ret, upper_ret;
  681. + u8 rg_zcal_ctrl_def;
  682. + u16 tx_r50_cal_val;
  683. + int ret;
  684. +
  685. + phy_modify_mmd(phydev, MDIO_MMD_VEND2, MTK_PHY_ANA_TEST_BUS_CTRL_RG,
  686. + MTK_PHY_ANA_TEST_MODE_MASK, MTK_PHY_TANA_CAL_MODE << 8);
  687. + phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG1,
  688. + MTK_PHY_RG_TXVOS_CALEN);
  689. + phy_set_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG0,
  690. + MTK_PHY_RG_CAL_CKINV | MTK_PHY_RG_ANA_CALEN);
  691. + phy_set_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG2,
  692. + BIT(txg_calen_x * 4));
  693. + phy_modify_mmd(phydev, MDIO_MMD_VEND2, MTK_PHY_RG_DASN_TXT_DMY2,
  694. + MTK_PHY_TST_DMY2_MASK, 0x1);
  695. +
  696. + rg_zcal_ctrl_def = phy_read_mmd(phydev, MDIO_MMD_VEND1,
  697. + MTK_PHY_RG_ANA_CAL_RG5) &
  698. + MTK_PHY_RG_ZCAL_CTRL_MASK;
  699. + zcal_lower = ZCAL_CTRL_MIN;
  700. + zcal_upper = ZCAL_CTRL_MAX;
  701. +
  702. + dev_dbg(&phydev->mdio.dev, "Start TX-R50 Pair%c SW cal.\n",
  703. + pair[txg_calen_x]);
  704. + while ((zcal_upper - zcal_lower) > 1) {
  705. + rg_zcal_ctrl = DIV_ROUND_CLOSEST(zcal_lower + zcal_upper, 2);
  706. + ret = cal_cycle(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG5,
  707. + MTK_PHY_RG_ZCAL_CTRL_MASK, rg_zcal_ctrl);
  708. + if (ret == 1) {
  709. + zcal_upper = rg_zcal_ctrl;
  710. + upper_ret = ret;
  711. + } else if (ret == 0) {
  712. + zcal_lower = rg_zcal_ctrl;
  713. + lower_ret = ret;
  714. + } else {
  715. + goto restore;
  716. + }
  717. + }
  718. +
  719. + if (zcal_lower == ZCAL_CTRL_MIN) {
  720. + lower_ret = cal_cycle(phydev, MDIO_MMD_VEND1,
  721. + MTK_PHY_RG_ANA_CAL_RG5,
  722. + MTK_PHY_RG_ZCAL_CTRL_MASK, zcal_lower);
  723. + ret = lower_ret;
  724. + } else if (zcal_upper == ZCAL_CTRL_MAX) {
  725. + upper_ret = cal_cycle(phydev, MDIO_MMD_VEND1,
  726. + MTK_PHY_RG_ANA_CAL_RG5,
  727. + MTK_PHY_RG_ZCAL_CTRL_MASK, zcal_upper);
  728. + ret = upper_ret;
  729. + }
  730. + if (ret < 0)
  731. + goto restore;
  732. +
  733. + ret = upper_ret - lower_ret;
  734. + if (ret == 1) {
  735. + tx_r50_cal_val = mt798x_zcal_to_r50[zcal_upper];
  736. + tx_r50_fill_result(phydev, tx_r50_cal_val, txg_calen_x);
  737. + dev_info(&phydev->mdio.dev,
  738. + "TX-R50 Pair%c SW cal result: 0x%x\n",
  739. + pair[txg_calen_x], zcal_lower);
  740. + ret = 0;
  741. + } else {
  742. + ret = -EINVAL;
  743. + }
  744. +
  745. +restore:
  746. + phy_clear_bits_mmd(phydev, MDIO_MMD_VEND2, MTK_PHY_ANA_TEST_BUS_CTRL_RG,
  747. + MTK_PHY_ANA_TEST_MODE_MASK);
  748. + phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG0,
  749. + MTK_PHY_RG_CAL_CKINV | MTK_PHY_RG_ANA_CALEN);
  750. + phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG2,
  751. + BIT(txg_calen_x * 4));
  752. + phy_clear_bits_mmd(phydev, MDIO_MMD_VEND2, MTK_PHY_RG_DASN_TXT_DMY2,
  753. + MTK_PHY_TST_DMY2_MASK);
  754. + phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG5,
  755. + MTK_PHY_RG_ZCAL_CTRL_MASK, rg_zcal_ctrl_def);
  756. +
  757. + return ret;
  758. +}
  759. +
  760. +static int tx_vcm_cal_sw(struct phy_device *phydev, u8 rg_txreserve_x)
  761. +{
  762. + u8 lower_idx, upper_idx, txreserve_val;
  763. + u8 lower_ret, upper_ret;
  764. + int ret;
  765. +
  766. + phy_set_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG0,
  767. + MTK_PHY_RG_ANA_CALEN);
  768. + phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG0,
  769. + MTK_PHY_RG_CAL_CKINV);
  770. + phy_set_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG1,
  771. + MTK_PHY_RG_TXVOS_CALEN);
  772. +
  773. + switch (rg_txreserve_x) {
  774. + case PAIR_A:
  775. + phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1,
  776. + MTK_PHY_RG_DASN_DAC_IN0_A,
  777. + MTK_PHY_DASN_DAC_IN0_A_MASK);
  778. + phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1,
  779. + MTK_PHY_RG_DASN_DAC_IN1_A,
  780. + MTK_PHY_DASN_DAC_IN1_A_MASK);
  781. + phy_set_bits_mmd(phydev, MDIO_MMD_VEND1,
  782. + MTK_PHY_RG_ANA_CAL_RG0,
  783. + MTK_PHY_RG_ZCALEN_A);
  784. + break;
  785. + case PAIR_B:
  786. + phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1,
  787. + MTK_PHY_RG_DASN_DAC_IN0_B,
  788. + MTK_PHY_DASN_DAC_IN0_B_MASK);
  789. + phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1,
  790. + MTK_PHY_RG_DASN_DAC_IN1_B,
  791. + MTK_PHY_DASN_DAC_IN1_B_MASK);
  792. + phy_set_bits_mmd(phydev, MDIO_MMD_VEND1,
  793. + MTK_PHY_RG_ANA_CAL_RG1,
  794. + MTK_PHY_RG_ZCALEN_B);
  795. + break;
  796. + case PAIR_C:
  797. + phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1,
  798. + MTK_PHY_RG_DASN_DAC_IN0_C,
  799. + MTK_PHY_DASN_DAC_IN0_C_MASK);
  800. + phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1,
  801. + MTK_PHY_RG_DASN_DAC_IN1_C,
  802. + MTK_PHY_DASN_DAC_IN1_C_MASK);
  803. + phy_set_bits_mmd(phydev, MDIO_MMD_VEND1,
  804. + MTK_PHY_RG_ANA_CAL_RG1,
  805. + MTK_PHY_RG_ZCALEN_C);
  806. + break;
  807. + case PAIR_D:
  808. + phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1,
  809. + MTK_PHY_RG_DASN_DAC_IN0_D,
  810. + MTK_PHY_DASN_DAC_IN0_D_MASK);
  811. + phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1,
  812. + MTK_PHY_RG_DASN_DAC_IN1_D,
  813. + MTK_PHY_DASN_DAC_IN1_D_MASK);
  814. + phy_set_bits_mmd(phydev, MDIO_MMD_VEND1,
  815. + MTK_PHY_RG_ANA_CAL_RG1,
  816. + MTK_PHY_RG_ZCALEN_D);
  817. + break;
  818. + default:
  819. + ret = -EINVAL;
  820. + goto restore;
  821. + }
  822. +
  823. + lower_idx = TXRESERVE_MIN;
  824. + upper_idx = TXRESERVE_MAX;
  825. +
  826. + dev_dbg(&phydev->mdio.dev, "Start TX-VCM SW cal.\n");
  827. + while ((upper_idx - lower_idx) > 1) {
  828. + txreserve_val = DIV_ROUND_CLOSEST(lower_idx + upper_idx, 2);
  829. + ret = cal_cycle(phydev, MDIO_MMD_VEND1, MTK_PHY_RXADC_CTRL_RG9,
  830. + MTK_PHY_DA_RX_PSBN_TBT_MASK |
  831. + MTK_PHY_DA_RX_PSBN_HBT_MASK |
  832. + MTK_PHY_DA_RX_PSBN_GBE_MASK |
  833. + MTK_PHY_DA_RX_PSBN_LP_MASK,
  834. + txreserve_val << 12 | txreserve_val << 8 |
  835. + txreserve_val << 4 | txreserve_val);
  836. + if (ret == 1) {
  837. + upper_idx = txreserve_val;
  838. + upper_ret = ret;
  839. + } else if (ret == 0) {
  840. + lower_idx = txreserve_val;
  841. + lower_ret = ret;
  842. + } else {
  843. + goto restore;
  844. + }
  845. + }
  846. +
  847. + if (lower_idx == TXRESERVE_MIN) {
  848. + lower_ret = cal_cycle(phydev, MDIO_MMD_VEND1,
  849. + MTK_PHY_RXADC_CTRL_RG9,
  850. + MTK_PHY_DA_RX_PSBN_TBT_MASK |
  851. + MTK_PHY_DA_RX_PSBN_HBT_MASK |
  852. + MTK_PHY_DA_RX_PSBN_GBE_MASK |
  853. + MTK_PHY_DA_RX_PSBN_LP_MASK,
  854. + lower_idx << 12 | lower_idx << 8 |
  855. + lower_idx << 4 | lower_idx);
  856. + ret = lower_ret;
  857. + } else if (upper_idx == TXRESERVE_MAX) {
  858. + upper_ret = cal_cycle(phydev, MDIO_MMD_VEND1,
  859. + MTK_PHY_RXADC_CTRL_RG9,
  860. + MTK_PHY_DA_RX_PSBN_TBT_MASK |
  861. + MTK_PHY_DA_RX_PSBN_HBT_MASK |
  862. + MTK_PHY_DA_RX_PSBN_GBE_MASK |
  863. + MTK_PHY_DA_RX_PSBN_LP_MASK,
  864. + upper_idx << 12 | upper_idx << 8 |
  865. + upper_idx << 4 | upper_idx);
  866. + ret = upper_ret;
  867. + }
  868. + if (ret < 0)
  869. + goto restore;
  870. +
  871. + /* We calibrate TX-VCM in different logic. Check upper index and then
  872. + * lower index. If this calibration is valid, apply lower index's result.
  873. + */
  874. + ret = upper_ret - lower_ret;
  875. + if (ret == 1) {
  876. + ret = 0;
  877. + /* Make sure we use upper_idx in our calibration system */
  878. + cal_cycle(phydev, MDIO_MMD_VEND1, MTK_PHY_RXADC_CTRL_RG9,
  879. + MTK_PHY_DA_RX_PSBN_TBT_MASK |
  880. + MTK_PHY_DA_RX_PSBN_HBT_MASK |
  881. + MTK_PHY_DA_RX_PSBN_GBE_MASK |
  882. + MTK_PHY_DA_RX_PSBN_LP_MASK,
  883. + upper_idx << 12 | upper_idx << 8 |
  884. + upper_idx << 4 | upper_idx);
  885. + dev_info(&phydev->mdio.dev, "TX-VCM SW cal result: 0x%x\n",
  886. + upper_idx);
  887. + } else if (lower_idx == TXRESERVE_MIN && upper_ret == 1 &&
  888. + lower_ret == 1) {
  889. + ret = 0;
  890. + cal_cycle(phydev, MDIO_MMD_VEND1, MTK_PHY_RXADC_CTRL_RG9,
  891. + MTK_PHY_DA_RX_PSBN_TBT_MASK |
  892. + MTK_PHY_DA_RX_PSBN_HBT_MASK |
  893. + MTK_PHY_DA_RX_PSBN_GBE_MASK |
  894. + MTK_PHY_DA_RX_PSBN_LP_MASK,
  895. + lower_idx << 12 | lower_idx << 8 |
  896. + lower_idx << 4 | lower_idx);
  897. + dev_warn(&phydev->mdio.dev,
  898. + "TX-VCM SW cal result at low margin 0x%x\n",
  899. + lower_idx);
  900. + } else if (upper_idx == TXRESERVE_MAX && upper_ret == 0 &&
  901. + lower_ret == 0) {
  902. + ret = 0;
  903. + dev_warn(&phydev->mdio.dev,
  904. + "TX-VCM SW cal result at high margin 0x%x\n",
  905. + upper_idx);
  906. + } else {
  907. + ret = -EINVAL;
  908. + }
  909. +
  910. +restore:
  911. + phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG0,
  912. + MTK_PHY_RG_ANA_CALEN);
  913. + phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG1,
  914. + MTK_PHY_RG_TXVOS_CALEN);
  915. + phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG0,
  916. + MTK_PHY_RG_ZCALEN_A);
  917. + phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG1,
  918. + MTK_PHY_RG_ZCALEN_B | MTK_PHY_RG_ZCALEN_C |
  919. + MTK_PHY_RG_ZCALEN_D);
  920. +
  921. + return ret;
  922. +}
  923. +
  924. +static inline void mt7981_phy_finetune(struct phy_device *phydev)
  925. +{
  926. + u32 i;
  927. +
  928. + /* 100M eye finetune:
  929. + * Keep middle level of TX MLT3 shapper as default.
  930. + * Only change TX MLT3 overshoot level here.
  931. + */
  932. + phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_1st_OVERSHOOT_LEVEL_0TO1,
  933. + 0x1ce);
  934. + phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_2nd_OVERSHOOT_LEVEL_0TO1,
  935. + 0x1c1);
  936. + phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_1st_OVERSHOOT_LEVEL_1TO0,
  937. + 0x20f);
  938. + phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_2nd_OVERSHOOT_LEVEL_1TO0,
  939. + 0x202);
  940. + phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_1st_OVERSHOOT_LEVEL_0TON1,
  941. + 0x3d0);
  942. + phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_2nd_OVERSHOOT_LEVEL_0TON1,
  943. + 0x3c0);
  944. + phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_1st_OVERSHOOT_LEVEL_N1TO0,
  945. + 0x13);
  946. + phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_2nd_OVERSHOOT_LEVEL_N1TO0,
  947. + 0x5);
  948. +
  949. + /* TX-AMP finetune:
  950. + * 100M +4, 1000M +6 to default value.
  951. + * If efuse values aren't valid, TX-AMP uses the below values.
  952. + */
  953. + phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TXVLD_DA_RG, 0x9824);
  954. + phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_A2,
  955. + 0x9026);
  956. + phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_B1,
  957. + 0x2624);
  958. + phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_B2,
  959. + 0x2426);
  960. + phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_C1,
  961. + 0x2624);
  962. + phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_C2,
  963. + 0x2426);
  964. + phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_D1,
  965. + 0x2624);
  966. + phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_D2,
  967. + 0x2426);
  968. +
  969. + phy_select_page(phydev, MTK_PHY_PAGE_EXTENDED_52B5);
  970. + /* EnabRandUpdTrig = 1 */
  971. + __phy_write(phydev, 0x11, 0x2f00);
  972. + __phy_write(phydev, 0x12, 0xe);
  973. + __phy_write(phydev, 0x10, 0x8fb0);
  974. +
  975. + /* SlvDSPreadyTime = 0xc */
  976. + __phy_write(phydev, 0x11, 0x671);
  977. + __phy_write(phydev, 0x12, 0xc);
  978. + __phy_write(phydev, 0x10, 0x8fae);
  979. +
  980. + /* NormMseLoThresh = 85 */
  981. + __phy_write(phydev, 0x11, 0x55a0);
  982. + __phy_write(phydev, 0x12, 0x0);
  983. + __phy_write(phydev, 0x10, 0x83aa);
  984. +
  985. + /* InhibitDisableDfeTail1000 = 1 */
  986. + __phy_write(phydev, 0x11, 0x2b);
  987. + __phy_write(phydev, 0x12, 0x0);
  988. + __phy_write(phydev, 0x10, 0x8f80);
  989. +
  990. + /* SSTr related */
  991. + __phy_write(phydev, 0x11, 0xbaef);
  992. + __phy_write(phydev, 0x12, 0x2e);
  993. + __phy_write(phydev, 0x10, 0x968c);
  994. +
  995. + /* VcoSlicerThreshBitsHigh */
  996. + __phy_write(phydev, 0x11, 0x5555);
  997. + __phy_write(phydev, 0x12, 0x55);
  998. + __phy_write(phydev, 0x10, 0x8ec0);
  999. +
  1000. + /* ResetSyncOffset = 6 */
  1001. + __phy_write(phydev, 0x11, 0x600);
  1002. + __phy_write(phydev, 0x12, 0x0);
  1003. + __phy_write(phydev, 0x10, 0x8fc0);
  1004. +
  1005. + /* VgaDecRate = 1 */
  1006. + __phy_write(phydev, 0x11, 0x4c2a);
  1007. + __phy_write(phydev, 0x12, 0x3e);
  1008. + __phy_write(phydev, 0x10, 0x8fa4);
  1009. +
  1010. + phy_restore_page(phydev, MTK_PHY_PAGE_STANDARD, 0);
  1011. + /* TR_OPEN_LOOP_EN = 1, lpf_x_average = 9*/
  1012. + phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG234,
  1013. + MTK_PHY_TR_OPEN_LOOP_EN_MASK | MTK_PHY_LPF_X_AVERAGE_MASK,
  1014. + BIT(0) | FIELD_PREP(MTK_PHY_LPF_X_AVERAGE_MASK, 0x9));
  1015. +
  1016. + /* rg_tr_lpf_cnt_val = 512 */
  1017. + phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_LPF_CNT_VAL, 0x200);
  1018. +
  1019. + /* IIR2 related */
  1020. + phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_LP_IIR2_K1_L, 0x82);
  1021. + phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_LP_IIR2_K1_U, 0x0);
  1022. + phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_LP_IIR2_K2_L, 0x103);
  1023. + phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_LP_IIR2_K2_U, 0x0);
  1024. + phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_LP_IIR2_K3_L, 0x82);
  1025. + phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_LP_IIR2_K3_U, 0x0);
  1026. + phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_LP_IIR2_K4_L, 0xd177);
  1027. + phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_LP_IIR2_K4_U, 0x3);
  1028. + phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_LP_IIR2_K5_L, 0x2c82);
  1029. + phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_LP_IIR2_K5_U, 0xe);
  1030. +
  1031. + /* FFE peaking */
  1032. + phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG27C,
  1033. + MTK_PHY_VGASTATE_FFE_THR_ST1_MASK, 0x1b << 8);
  1034. + phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG27D,
  1035. + MTK_PHY_VGASTATE_FFE_THR_ST2_MASK, 0x1e);
  1036. +
  1037. + /* TX shape */
  1038. + /* 10/100/1000 TX shaper is enabled by default */
  1039. + for (i = 0x202; i < 0x230; i += 2) {
  1040. + if (i == 0x20c || i == 0x218 || i == 0x224)
  1041. + continue;
  1042. + phy_write_mmd(phydev, MDIO_MMD_VEND2, i, 0x2219);
  1043. + phy_write_mmd(phydev, MDIO_MMD_VEND2, i + 1, 0x23);
  1044. + }
  1045. +}
  1046. +
  1047. +static inline void mt7988_phy_finetune(struct phy_device *phydev)
  1048. +{
  1049. + u16 val[12] = { 0x0187, 0x01cd, 0x01c8, 0x0182,
  1050. + 0x020d, 0x0206, 0x0384, 0x03d0,
  1051. + 0x03c6, 0x030a, 0x0011, 0x0005 };
  1052. + int i;
  1053. +
  1054. + for (i = 0; i < MTK_PHY_TX_MLT3_END; i++)
  1055. + phy_write_mmd(phydev, MDIO_MMD_VEND1, i, val[i]);
  1056. +
  1057. + /* TCT finetune */
  1058. + phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_TX_FILTER, 0x5);
  1059. +
  1060. + /* Disable TX power saving */
  1061. + phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RXADC_CTRL_RG7,
  1062. + MTK_PHY_DA_AD_BUF_BIAS_LP_MASK, 0x3 << 8);
  1063. +
  1064. + phy_select_page(phydev, MTK_PHY_PAGE_EXTENDED_52B5);
  1065. + /* EnabRandUpdTrig = 1 */
  1066. + __phy_write(phydev, 0x11, 0x2f00);
  1067. + __phy_write(phydev, 0x12, 0xe);
  1068. + __phy_write(phydev, 0x10, 0x8fb0);
  1069. +
  1070. + /* SlvDSPreadyTime = 0xc */
  1071. + __phy_write(phydev, 0x11, 0x671);
  1072. + __phy_write(phydev, 0x12, 0xc);
  1073. + __phy_write(phydev, 0x10, 0x8fae);
  1074. +
  1075. + /* NormMseLoThresh = 85 */
  1076. + __phy_write(phydev, 0x11, 0x55a0);
  1077. + __phy_write(phydev, 0x12, 0x0);
  1078. + __phy_write(phydev, 0x10, 0x83aa);
  1079. +
  1080. + /* InhibitDisableDfeTail1000 = 1 */
  1081. + __phy_write(phydev, 0x11, 0x2b);
  1082. + __phy_write(phydev, 0x12, 0x0);
  1083. + __phy_write(phydev, 0x10, 0x8f80);
  1084. +
  1085. + /* SSTr related */
  1086. + __phy_write(phydev, 0x11, 0xbaef);
  1087. + __phy_write(phydev, 0x12, 0x2e);
  1088. + __phy_write(phydev, 0x10, 0x968c);
  1089. +
  1090. + /* MrvlTrFix100Kp = 3, MrvlTrFix100Kf = 2,
  1091. + * MrvlTrFix1000Kp = 3, MrvlTrFix1000Kf = 2
  1092. + */
  1093. + __phy_write(phydev, 0x11, 0xd10a);
  1094. + __phy_write(phydev, 0x12, 0x34);
  1095. + __phy_write(phydev, 0x10, 0x8f82);
  1096. +
  1097. + /* VcoSlicerThreshBitsHigh */
  1098. + __phy_write(phydev, 0x11, 0x5555);
  1099. + __phy_write(phydev, 0x12, 0x55);
  1100. + __phy_write(phydev, 0x10, 0x8ec0);
  1101. +
  1102. + /* ResetSyncOffset = 5 */
  1103. + __phy_write(phydev, 0x11, 0x500);
  1104. + __phy_write(phydev, 0x12, 0x0);
  1105. + __phy_write(phydev, 0x10, 0x8fc0);
  1106. + phy_restore_page(phydev, MTK_PHY_PAGE_STANDARD, 0);
  1107. +
  1108. + phy_select_page(phydev, MTK_PHY_PAGE_EXTENDED_2A30);
  1109. + /* TxClkOffset = 2 */
  1110. + __phy_modify(phydev, MTK_PHY_ANARG_RG, MTK_PHY_TCLKOFFSET_MASK,
  1111. + FIELD_PREP(MTK_PHY_TCLKOFFSET_MASK, 0x2));
  1112. + phy_restore_page(phydev, MTK_PHY_PAGE_STANDARD, 0);
  1113. +
  1114. + /* TR_OPEN_LOOP_EN = 1, lpf_x_average = 9*/
  1115. + phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG234,
  1116. + MTK_PHY_TR_OPEN_LOOP_EN_MASK | MTK_PHY_LPF_X_AVERAGE_MASK,
  1117. + BIT(0) | FIELD_PREP(MTK_PHY_LPF_X_AVERAGE_MASK, 0x9));
  1118. +
  1119. + /* rg_tr_lpf_cnt_val = 512 */
  1120. + phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_LPF_CNT_VAL, 0x200);
  1121. +
  1122. + /* IIR2 related */
  1123. + phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_LP_IIR2_K1_L, 0x82);
  1124. + phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_LP_IIR2_K1_U, 0x0);
  1125. + phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_LP_IIR2_K2_L, 0x103);
  1126. + phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_LP_IIR2_K2_U, 0x0);
  1127. + phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_LP_IIR2_K3_L, 0x82);
  1128. + phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_LP_IIR2_K3_U, 0x0);
  1129. + phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_LP_IIR2_K4_L, 0xd177);
  1130. + phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_LP_IIR2_K4_U, 0x3);
  1131. + phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_LP_IIR2_K5_L, 0x2c82);
  1132. + phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_LP_IIR2_K5_U, 0xe);
  1133. +
  1134. + /* FFE peaking */
  1135. + phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG27C,
  1136. + MTK_PHY_VGASTATE_FFE_THR_ST1_MASK, 0x1b << 8);
  1137. + phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG27D,
  1138. + MTK_PHY_VGASTATE_FFE_THR_ST2_MASK, 0x1e);
  1139. +
  1140. + /* TX shape */
  1141. + /* 10/100/1000 TX shaper is enabled by default */
  1142. + for (i = 0x202; i < 0x230; i += 2) {
  1143. + if (i == 0x20c || i == 0x218 || i == 0x224)
  1144. + continue;
  1145. + phy_write_mmd(phydev, MDIO_MMD_VEND2, i, 0x2219);
  1146. + phy_write_mmd(phydev, MDIO_MMD_VEND2, i + 1, 0x23);
  1147. + }
  1148. +
  1149. + /* Disable LDO pump */
  1150. + phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_LDO_PUMP_EN_PAIRAB, 0x0);
  1151. + phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_LDO_PUMP_EN_PAIRCD, 0x0);
  1152. +
  1153. + /* Adjust LDO output voltage */
  1154. + phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_LDO_OUTPUT_V, 0x2222);
  1155. +}
  1156. +
  1157. +static inline int cal_sw(struct phy_device *phydev, enum CAL_ITEM cal_item,
  1158. + u8 start_pair, u8 end_pair)
  1159. +{
  1160. + u8 pair_n;
  1161. + int ret;
  1162. +
  1163. + for (pair_n = start_pair; pair_n <= end_pair; pair_n++) {
  1164. + /* TX_OFFSET & TX_AMP have no SW calibration. */
  1165. + switch (cal_item) {
  1166. + case REXT:
  1167. + ret = rext_cal_sw(phydev);
  1168. + break;
  1169. + case TX_R50:
  1170. + ret = tx_r50_cal_sw(phydev, pair_n);
  1171. + break;
  1172. + case TX_VCM:
  1173. + ret = tx_vcm_cal_sw(phydev, pair_n);
  1174. + break;
  1175. + default:
  1176. + return -EINVAL;
  1177. + }
  1178. + if (ret)
  1179. + return ret;
  1180. + }
  1181. + return 0;
  1182. +}
  1183. +
  1184. +static inline int cal_efuse(struct phy_device *phydev, enum CAL_ITEM cal_item,
  1185. + u8 start_pair, u8 end_pair, u32 *buf)
  1186. +{
  1187. + u8 pair_n;
  1188. + int ret;
  1189. +
  1190. + for (pair_n = start_pair; pair_n <= end_pair; pair_n++) {
  1191. + /* TX_VCM has no efuse calibration. */
  1192. + switch (cal_item) {
  1193. + case REXT:
  1194. + ret = rext_cal_efuse(phydev, buf);
  1195. + break;
  1196. + case TX_OFFSET:
  1197. + ret = tx_offset_cal_efuse(phydev, buf);
  1198. + break;
  1199. + case TX_AMP:
  1200. + ret = tx_amp_cal_efuse(phydev, buf);
  1201. + break;
  1202. + case TX_R50:
  1203. + ret = tx_r50_cal_efuse(phydev, buf, pair_n);
  1204. + break;
  1205. + default:
  1206. + return -EINVAL;
  1207. + }
  1208. + if (ret)
  1209. + return ret;
  1210. + }
  1211. +
  1212. + return 0;
  1213. +}
  1214. +
  1215. +static int start_cal(struct phy_device *phydev, enum CAL_ITEM cal_item,
  1216. + bool efs_valid, enum CAL_MODE cal_mode, u8 start_pair,
  1217. + u8 end_pair, u32 *buf)
  1218. +{
  1219. + char cal_prop[5][20] = { "mediatek,rext", "mediatek,tx_offset",
  1220. + "mediatek,tx_amp", "mediatek,tx_r50",
  1221. + "mediatek,tx_vcm" };
  1222. + const char *dts_cal_mode;
  1223. + u8 final_cal_mode = 0;
  1224. + bool is_cal = true;
  1225. + int ret, cal_ret;
  1226. +
  1227. + ret = of_property_read_string(phydev->mdio.dev.of_node,
  1228. + cal_prop[cal_item], &dts_cal_mode);
  1229. +
  1230. + switch (cal_mode) {
  1231. + case SW_EFUSE_M:
  1232. + if ((efs_valid && ret) ||
  1233. + (efs_valid && !ret && strcmp("efuse", dts_cal_mode) == 0)) {
  1234. + cal_ret = cal_efuse(phydev, cal_item, start_pair,
  1235. + end_pair, buf);
  1236. + final_cal_mode = EFUSE_K;
  1237. + } else if ((!efs_valid && ret) ||
  1238. + (!ret && strcmp("sw", dts_cal_mode) == 0)) {
  1239. + cal_ret = cal_sw(phydev, cal_item, start_pair, end_pair);
  1240. + final_cal_mode = SW_K;
  1241. + } else {
  1242. + is_cal = false;
  1243. + }
  1244. + break;
  1245. + case EFUSE_M:
  1246. + if ((efs_valid && ret) ||
  1247. + (efs_valid && !ret && strcmp("efuse", dts_cal_mode) == 0)) {
  1248. + cal_ret = cal_efuse(phydev, cal_item, start_pair,
  1249. + end_pair, buf);
  1250. + final_cal_mode = EFUSE_K;
  1251. + } else {
  1252. + is_cal = false;
  1253. + }
  1254. + break;
  1255. + case SW_M:
  1256. + if (ret || (!ret && strcmp("sw", dts_cal_mode) == 0)) {
  1257. + cal_ret = cal_sw(phydev, cal_item, start_pair, end_pair);
  1258. + final_cal_mode = SW_K;
  1259. + } else {
  1260. + is_cal = false;
  1261. + }
  1262. + break;
  1263. + default:
  1264. + return -EINVAL;
  1265. + }
  1266. +
  1267. + if (cal_ret) {
  1268. + dev_err(&phydev->mdio.dev, "[%s]cal failed\n", cal_prop[cal_item]);
  1269. + return -EIO;
  1270. + }
  1271. +
  1272. + if (!is_cal) {
  1273. + dev_dbg(&phydev->mdio.dev, "[%s]K mode: %s(not supported)\n",
  1274. + cal_prop[cal_item], dts_cal_mode);
  1275. + return -EIO;
  1276. + }
  1277. +
  1278. + dev_dbg(&phydev->mdio.dev, "[%s]K mode: %s(dts: %s), efs-valid: %s\n",
  1279. + cal_prop[cal_item],
  1280. + final_cal_mode ? "SW" : "EFUSE",
  1281. + ret ? "not set" : dts_cal_mode,
  1282. + efs_valid ? "yes" : "no");
  1283. + return 0;
  1284. +}
  1285. +
  1286. +static int mt798x_phy_calibration(struct phy_device *phydev)
  1287. +{
  1288. + int ret = 0;
  1289. + u32 *buf;
  1290. + bool efs_valid = true;
  1291. + size_t len;
  1292. + struct nvmem_cell *cell;
  1293. +
  1294. + if (phydev->interface != PHY_INTERFACE_MODE_GMII)
  1295. + return -EINVAL;
  1296. +
  1297. + cell = nvmem_cell_get(&phydev->mdio.dev, "phy-cal-data");
  1298. + if (IS_ERR(cell)) {
  1299. + if (PTR_ERR(cell) == -EPROBE_DEFER)
  1300. + return PTR_ERR(cell);
  1301. + return 0;
  1302. + }
  1303. +
  1304. + buf = (u32 *)nvmem_cell_read(cell, &len);
  1305. + if (IS_ERR(buf))
  1306. + return PTR_ERR(buf);
  1307. + nvmem_cell_put(cell);
  1308. +
  1309. + if (!buf[0] || !buf[1] || !buf[2] || !buf[3])
  1310. + efs_valid = false;
  1311. +
  1312. + if (len < 4 * sizeof(u32)) {
  1313. + dev_err(&phydev->mdio.dev, "invalid calibration data\n");
  1314. + ret = -EINVAL;
  1315. + goto out;
  1316. + }
  1317. +
  1318. + ret = start_cal(phydev, REXT, efs_valid, SW_EFUSE_M,
  1319. + NO_PAIR, NO_PAIR, buf);
  1320. + if (ret)
  1321. + goto out;
  1322. + ret = start_cal(phydev, TX_OFFSET, efs_valid, EFUSE_M,
  1323. + NO_PAIR, NO_PAIR, buf);
  1324. + if (ret)
  1325. + goto out;
  1326. + ret = start_cal(phydev, TX_AMP, efs_valid, EFUSE_M,
  1327. + NO_PAIR, NO_PAIR, buf);
  1328. + if (ret)
  1329. + goto out;
  1330. + ret = start_cal(phydev, TX_R50, efs_valid, EFUSE_M,
  1331. + PAIR_A, PAIR_D, buf);
  1332. + if (ret)
  1333. + goto out;
  1334. + ret = start_cal(phydev, TX_VCM, efs_valid, SW_M,
  1335. + PAIR_A, PAIR_A, buf);
  1336. + if (ret)
  1337. + goto out;
  1338. +
  1339. +out:
  1340. + kfree(buf);
  1341. + return ret;
  1342. +}
  1343. +
  1344. +static int mt7981_phy_probe(struct phy_device *phydev)
  1345. +{
  1346. + mt7981_phy_finetune(phydev);
  1347. +
  1348. + return mt798x_phy_calibration(phydev);
  1349. +}
  1350. +
  1351. +static int mt7988_phy_probe(struct phy_device *phydev)
  1352. +{
  1353. + struct device_node *np;
  1354. + void __iomem *boottrap;
  1355. + u32 reg;
  1356. + int port;
  1357. +
  1358. + /* Setup LED polarity according to boottrap's polarity */
  1359. + np = of_find_compatible_node(NULL, NULL, "mediatek,boottrap");
  1360. + if (!np)
  1361. + return -ENOENT;
  1362. + boottrap = of_iomap(np, 0);
  1363. + if (!boottrap)
  1364. + return -ENOMEM;
  1365. + reg = readl(boottrap);
  1366. + port = phydev->mdio.addr;
  1367. + if ((port == GPHY_PORT0 && reg & BIT(8)) ||
  1368. + (port == GPHY_PORT1 && reg & BIT(9)) ||
  1369. + (port == GPHY_PORT2 && reg & BIT(10)) ||
  1370. + (port == GPHY_PORT3 && reg & BIT(11))) {
  1371. + phy_write_mmd(phydev, MDIO_MMD_VEND2, MTK_PHY_LED0_ON_CTRL,
  1372. + MTK_PHY_LED0_ENABLE | MTK_PHY_LED0_ON_LINK10 |
  1373. + MTK_PHY_LED0_ON_LINK100 |
  1374. + MTK_PHY_LED0_ON_LINK1000);
  1375. + } else {
  1376. + phy_write_mmd(phydev, MDIO_MMD_VEND2, MTK_PHY_LED0_ON_CTRL,
  1377. + MTK_PHY_LED0_ENABLE | MTK_PHY_LED0_POLARITY |
  1378. + MTK_PHY_LED0_ON_LINK10 |
  1379. + MTK_PHY_LED0_ON_LINK100 |
  1380. + MTK_PHY_LED0_ON_LINK1000);
  1381. + }
  1382. + phy_write_mmd(phydev, MDIO_MMD_VEND2, MTK_PHY_LED0_BLINK_CTRL,
  1383. + MTK_PHY_LED0_1000TX | MTK_PHY_LED0_1000RX |
  1384. + MTK_PHY_LED0_100TX | MTK_PHY_LED0_100RX |
  1385. + MTK_PHY_LED0_10TX | MTK_PHY_LED0_10RX);
  1386. +
  1387. + mt7988_phy_finetune(phydev);
  1388. +
  1389. + return mt798x_phy_calibration(phydev);
  1390. +}
  1391. +#endif
  1392. +
  1393. static struct phy_driver mtk_gephy_driver[] = {
  1394. {
  1395. PHY_ID_MATCH_EXACT(0x03a29412),
  1396. @@ -131,6 +1456,30 @@ static struct phy_driver mtk_gephy_drive
  1397. .read_page = mtk_gephy_read_page,
  1398. .write_page = mtk_gephy_write_page,
  1399. },
  1400. +#ifdef CONFIG_MEDIATEK_GE_PHY_SOC
  1401. + {
  1402. + PHY_ID_MATCH_EXACT(0x03a29461),
  1403. + .name = "MediaTek MT7981 PHY",
  1404. + .probe = mt7981_phy_probe,
  1405. + .config_intr = genphy_no_config_intr,
  1406. + .handle_interrupt = genphy_handle_interrupt_no_ack,
  1407. + .suspend = genphy_suspend,
  1408. + .resume = genphy_resume,
  1409. + .read_page = mtk_gephy_read_page,
  1410. + .write_page = mtk_gephy_write_page,
  1411. + },
  1412. + {
  1413. + PHY_ID_MATCH_EXACT(0x03a29481),
  1414. + .name = "MediaTek MT7988 PHY",
  1415. + .probe = mt7988_phy_probe,
  1416. + .config_intr = genphy_no_config_intr,
  1417. + .handle_interrupt = genphy_handle_interrupt_no_ack,
  1418. + .suspend = genphy_suspend,
  1419. + .resume = genphy_resume,
  1420. + .read_page = mtk_gephy_read_page,
  1421. + .write_page = mtk_gephy_write_page,
  1422. + },
  1423. +#endif
  1424. };
  1425. module_phy_driver(mtk_gephy_driver);
  1426. @@ -141,6 +1490,8 @@ static struct mdio_device_id __maybe_unu
  1427. };
  1428. MODULE_DESCRIPTION("MediaTek Gigabit Ethernet PHY driver");
  1429. +MODULE_AUTHOR("Daniel Golle <[email protected]>");
  1430. +MODULE_AUTHOR("SkyLake Huang <[email protected]>");
  1431. MODULE_AUTHOR("DENG, Qingfang <[email protected]>");
  1432. MODULE_LICENSE("GPL");