mediatek-ge-soc.c 46 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555
  1. // SPDX-License-Identifier: GPL-2.0+
  2. #include <linux/bitfield.h>
  3. #include <linux/bitmap.h>
  4. #include <linux/mfd/syscon.h>
  5. #include <linux/module.h>
  6. #include <linux/nvmem-consumer.h>
  7. #include <linux/pinctrl/consumer.h>
  8. #include <linux/phy.h>
  9. #include <linux/regmap.h>
  10. #define MTK_GPHY_ID_MT7981 0x03a29461
  11. #define MTK_GPHY_ID_MT7988 0x03a29481
  12. #define MTK_EXT_PAGE_ACCESS 0x1f
  13. #define MTK_PHY_PAGE_STANDARD 0x0000
  14. #define MTK_PHY_PAGE_EXTENDED_3 0x0003
  15. #define MTK_PHY_LPI_REG_14 0x14
  16. #define MTK_PHY_LPI_WAKE_TIMER_1000_MASK GENMASK(8, 0)
  17. #define MTK_PHY_LPI_REG_1c 0x1c
  18. #define MTK_PHY_SMI_DET_ON_THRESH_MASK GENMASK(13, 8)
  19. #define MTK_PHY_PAGE_EXTENDED_2A30 0x2a30
  20. #define MTK_PHY_PAGE_EXTENDED_52B5 0x52b5
  21. #define ANALOG_INTERNAL_OPERATION_MAX_US 20
  22. #define TXRESERVE_MIN 0
  23. #define TXRESERVE_MAX 7
  24. #define MTK_PHY_ANARG_RG 0x10
  25. #define MTK_PHY_TCLKOFFSET_MASK GENMASK(12, 8)
  26. /* Registers on MDIO_MMD_VEND1 */
  27. #define MTK_PHY_TXVLD_DA_RG 0x12
  28. #define MTK_PHY_DA_TX_I2MPB_A_GBE_MASK GENMASK(15, 10)
  29. #define MTK_PHY_DA_TX_I2MPB_A_TBT_MASK GENMASK(5, 0)
  30. #define MTK_PHY_TX_I2MPB_TEST_MODE_A2 0x16
  31. #define MTK_PHY_DA_TX_I2MPB_A_HBT_MASK GENMASK(15, 10)
  32. #define MTK_PHY_DA_TX_I2MPB_A_TST_MASK GENMASK(5, 0)
  33. #define MTK_PHY_TX_I2MPB_TEST_MODE_B1 0x17
  34. #define MTK_PHY_DA_TX_I2MPB_B_GBE_MASK GENMASK(13, 8)
  35. #define MTK_PHY_DA_TX_I2MPB_B_TBT_MASK GENMASK(5, 0)
  36. #define MTK_PHY_TX_I2MPB_TEST_MODE_B2 0x18
  37. #define MTK_PHY_DA_TX_I2MPB_B_HBT_MASK GENMASK(13, 8)
  38. #define MTK_PHY_DA_TX_I2MPB_B_TST_MASK GENMASK(5, 0)
  39. #define MTK_PHY_TX_I2MPB_TEST_MODE_C1 0x19
  40. #define MTK_PHY_DA_TX_I2MPB_C_GBE_MASK GENMASK(13, 8)
  41. #define MTK_PHY_DA_TX_I2MPB_C_TBT_MASK GENMASK(5, 0)
  42. #define MTK_PHY_TX_I2MPB_TEST_MODE_C2 0x20
  43. #define MTK_PHY_DA_TX_I2MPB_C_HBT_MASK GENMASK(13, 8)
  44. #define MTK_PHY_DA_TX_I2MPB_C_TST_MASK GENMASK(5, 0)
  45. #define MTK_PHY_TX_I2MPB_TEST_MODE_D1 0x21
  46. #define MTK_PHY_DA_TX_I2MPB_D_GBE_MASK GENMASK(13, 8)
  47. #define MTK_PHY_DA_TX_I2MPB_D_TBT_MASK GENMASK(5, 0)
  48. #define MTK_PHY_TX_I2MPB_TEST_MODE_D2 0x22
  49. #define MTK_PHY_DA_TX_I2MPB_D_HBT_MASK GENMASK(13, 8)
  50. #define MTK_PHY_DA_TX_I2MPB_D_TST_MASK GENMASK(5, 0)
  51. #define MTK_PHY_RXADC_CTRL_RG7 0xc6
  52. #define MTK_PHY_DA_AD_BUF_BIAS_LP_MASK GENMASK(9, 8)
  53. #define MTK_PHY_RXADC_CTRL_RG9 0xc8
  54. #define MTK_PHY_DA_RX_PSBN_TBT_MASK GENMASK(14, 12)
  55. #define MTK_PHY_DA_RX_PSBN_HBT_MASK GENMASK(10, 8)
  56. #define MTK_PHY_DA_RX_PSBN_GBE_MASK GENMASK(6, 4)
  57. #define MTK_PHY_DA_RX_PSBN_LP_MASK GENMASK(2, 0)
  58. #define MTK_PHY_LDO_OUTPUT_V 0xd7
  59. #define MTK_PHY_RG_ANA_CAL_RG0 0xdb
  60. #define MTK_PHY_RG_CAL_CKINV BIT(12)
  61. #define MTK_PHY_RG_ANA_CALEN BIT(8)
  62. #define MTK_PHY_RG_ZCALEN_A BIT(0)
  63. #define MTK_PHY_RG_ANA_CAL_RG1 0xdc
  64. #define MTK_PHY_RG_ZCALEN_B BIT(12)
  65. #define MTK_PHY_RG_ZCALEN_C BIT(8)
  66. #define MTK_PHY_RG_ZCALEN_D BIT(4)
  67. #define MTK_PHY_RG_TXVOS_CALEN BIT(0)
  68. #define MTK_PHY_RG_ANA_CAL_RG5 0xe0
  69. #define MTK_PHY_RG_REXT_TRIM_MASK GENMASK(13, 8)
  70. #define MTK_PHY_RG_TX_FILTER 0xfe
  71. #define MTK_PHY_RG_LPI_PCS_DSP_CTRL_REG120 0x120
  72. #define MTK_PHY_LPI_SIG_EN_LO_THRESH1000_MASK GENMASK(12, 8)
  73. #define MTK_PHY_LPI_SIG_EN_HI_THRESH1000_MASK GENMASK(4, 0)
  74. #define MTK_PHY_RG_LPI_PCS_DSP_CTRL_REG122 0x122
  75. #define MTK_PHY_LPI_NORM_MSE_HI_THRESH1000_MASK GENMASK(7, 0)
  76. #define MTK_PHY_RG_TESTMUX_ADC_CTRL 0x144
  77. #define MTK_PHY_RG_TXEN_DIG_MASK GENMASK(5, 5)
  78. #define MTK_PHY_RG_CR_TX_AMP_OFFSET_A_B 0x172
  79. #define MTK_PHY_CR_TX_AMP_OFFSET_A_MASK GENMASK(13, 8)
  80. #define MTK_PHY_CR_TX_AMP_OFFSET_B_MASK GENMASK(6, 0)
  81. #define MTK_PHY_RG_CR_TX_AMP_OFFSET_C_D 0x173
  82. #define MTK_PHY_CR_TX_AMP_OFFSET_C_MASK GENMASK(13, 8)
  83. #define MTK_PHY_CR_TX_AMP_OFFSET_D_MASK GENMASK(6, 0)
  84. #define MTK_PHY_RG_AD_CAL_COMP 0x17a
  85. #define MTK_PHY_AD_CAL_COMP_OUT_SHIFT (8)
  86. #define MTK_PHY_RG_AD_CAL_CLK 0x17b
  87. #define MTK_PHY_DA_CAL_CLK BIT(0)
  88. #define MTK_PHY_RG_AD_CALIN 0x17c
  89. #define MTK_PHY_DA_CALIN_FLAG BIT(0)
  90. #define MTK_PHY_RG_DASN_DAC_IN0_A 0x17d
  91. #define MTK_PHY_DASN_DAC_IN0_A_MASK GENMASK(9, 0)
  92. #define MTK_PHY_RG_DASN_DAC_IN0_B 0x17e
  93. #define MTK_PHY_DASN_DAC_IN0_B_MASK GENMASK(9, 0)
  94. #define MTK_PHY_RG_DASN_DAC_IN0_C 0x17f
  95. #define MTK_PHY_DASN_DAC_IN0_C_MASK GENMASK(9, 0)
  96. #define MTK_PHY_RG_DASN_DAC_IN0_D 0x180
  97. #define MTK_PHY_DASN_DAC_IN0_D_MASK GENMASK(9, 0)
  98. #define MTK_PHY_RG_DASN_DAC_IN1_A 0x181
  99. #define MTK_PHY_DASN_DAC_IN1_A_MASK GENMASK(9, 0)
  100. #define MTK_PHY_RG_DASN_DAC_IN1_B 0x182
  101. #define MTK_PHY_DASN_DAC_IN1_B_MASK GENMASK(9, 0)
  102. #define MTK_PHY_RG_DASN_DAC_IN1_C 0x183
  103. #define MTK_PHY_DASN_DAC_IN1_C_MASK GENMASK(9, 0)
  104. #define MTK_PHY_RG_DASN_DAC_IN1_D 0x184
  105. #define MTK_PHY_DASN_DAC_IN1_D_MASK GENMASK(9, 0)
  106. #define MTK_PHY_RG_DEV1E_REG19b 0x19b
  107. #define MTK_PHY_BYPASS_DSP_LPI_READY BIT(8)
  108. #define MTK_PHY_RG_LP_IIR2_K1_L 0x22a
  109. #define MTK_PHY_RG_LP_IIR2_K1_U 0x22b
  110. #define MTK_PHY_RG_LP_IIR2_K2_L 0x22c
  111. #define MTK_PHY_RG_LP_IIR2_K2_U 0x22d
  112. #define MTK_PHY_RG_LP_IIR2_K3_L 0x22e
  113. #define MTK_PHY_RG_LP_IIR2_K3_U 0x22f
  114. #define MTK_PHY_RG_LP_IIR2_K4_L 0x230
  115. #define MTK_PHY_RG_LP_IIR2_K4_U 0x231
  116. #define MTK_PHY_RG_LP_IIR2_K5_L 0x232
  117. #define MTK_PHY_RG_LP_IIR2_K5_U 0x233
  118. #define MTK_PHY_RG_DEV1E_REG234 0x234
  119. #define MTK_PHY_TR_OPEN_LOOP_EN_MASK GENMASK(0, 0)
  120. #define MTK_PHY_LPF_X_AVERAGE_MASK GENMASK(7, 4)
  121. #define MTK_PHY_TR_LP_IIR_EEE_EN BIT(12)
  122. #define MTK_PHY_RG_LPF_CNT_VAL 0x235
  123. #define MTK_PHY_RG_DEV1E_REG238 0x238
  124. #define MTK_PHY_LPI_SLV_SEND_TX_TIMER_MASK GENMASK(8, 0)
  125. #define MTK_PHY_LPI_SLV_SEND_TX_EN BIT(12)
  126. #define MTK_PHY_RG_DEV1E_REG239 0x239
  127. #define MTK_PHY_LPI_SEND_LOC_TIMER_MASK GENMASK(8, 0)
  128. #define MTK_PHY_LPI_TXPCS_LOC_RCV BIT(12)
  129. #define MTK_PHY_RG_DEV1E_REG27C 0x27c
  130. #define MTK_PHY_VGASTATE_FFE_THR_ST1_MASK GENMASK(12, 8)
  131. #define MTK_PHY_RG_DEV1E_REG27D 0x27d
  132. #define MTK_PHY_VGASTATE_FFE_THR_ST2_MASK GENMASK(4, 0)
  133. #define MTK_PHY_RG_DEV1E_REG2C7 0x2c7
  134. #define MTK_PHY_MAX_GAIN_MASK GENMASK(4, 0)
  135. #define MTK_PHY_MIN_GAIN_MASK GENMASK(12, 8)
  136. #define MTK_PHY_RG_DEV1E_REG2D1 0x2d1
  137. #define MTK_PHY_VCO_SLICER_THRESH_BITS_HIGH_EEE_MASK GENMASK(7, 0)
  138. #define MTK_PHY_LPI_SKIP_SD_SLV_TR BIT(8)
  139. #define MTK_PHY_LPI_TR_READY BIT(9)
  140. #define MTK_PHY_LPI_VCO_EEE_STG0_EN BIT(10)
  141. #define MTK_PHY_RG_DEV1E_REG323 0x323
  142. #define MTK_PHY_EEE_WAKE_MAS_INT_DC BIT(0)
  143. #define MTK_PHY_EEE_WAKE_SLV_INT_DC BIT(4)
  144. #define MTK_PHY_RG_DEV1E_REG324 0x324
  145. #define MTK_PHY_SMI_DETCNT_MAX_MASK GENMASK(5, 0)
  146. #define MTK_PHY_SMI_DET_MAX_EN BIT(8)
  147. #define MTK_PHY_RG_DEV1E_REG326 0x326
  148. #define MTK_PHY_LPI_MODE_SD_ON BIT(0)
  149. #define MTK_PHY_RESET_RANDUPD_CNT BIT(1)
  150. #define MTK_PHY_TREC_UPDATE_ENAB_CLR BIT(2)
  151. #define MTK_PHY_LPI_QUIT_WAIT_DFE_SIG_DET_OFF BIT(4)
  152. #define MTK_PHY_TR_READY_SKIP_AFE_WAKEUP BIT(5)
  153. #define MTK_PHY_LDO_PUMP_EN_PAIRAB 0x502
  154. #define MTK_PHY_LDO_PUMP_EN_PAIRCD 0x503
  155. #define MTK_PHY_DA_TX_R50_PAIR_A 0x53d
  156. #define MTK_PHY_DA_TX_R50_PAIR_B 0x53e
  157. #define MTK_PHY_DA_TX_R50_PAIR_C 0x53f
  158. #define MTK_PHY_DA_TX_R50_PAIR_D 0x540
  159. /* Registers on MDIO_MMD_VEND2 */
  160. #define MTK_PHY_LED0_ON_CTRL 0x24
  161. #define MTK_PHY_LED1_ON_CTRL 0x26
  162. #define MTK_PHY_LED_ON_MASK GENMASK(6, 0)
  163. #define MTK_PHY_LED_ON_LINK1000 BIT(0)
  164. #define MTK_PHY_LED_ON_LINK100 BIT(1)
  165. #define MTK_PHY_LED_ON_LINK10 BIT(2)
  166. #define MTK_PHY_LED_ON_LINK (MTK_PHY_LED_ON_LINK10 |\
  167. MTK_PHY_LED_ON_LINK100 |\
  168. MTK_PHY_LED_ON_LINK1000)
  169. #define MTK_PHY_LED_ON_LINKDOWN BIT(3)
  170. #define MTK_PHY_LED_ON_FDX BIT(4) /* Full duplex */
  171. #define MTK_PHY_LED_ON_HDX BIT(5) /* Half duplex */
  172. #define MTK_PHY_LED_ON_FORCE_ON BIT(6)
  173. #define MTK_PHY_LED_ON_POLARITY BIT(14)
  174. #define MTK_PHY_LED_ON_ENABLE BIT(15)
  175. #define MTK_PHY_LED0_BLINK_CTRL 0x25
  176. #define MTK_PHY_LED1_BLINK_CTRL 0x27
  177. #define MTK_PHY_LED_BLINK_1000TX BIT(0)
  178. #define MTK_PHY_LED_BLINK_1000RX BIT(1)
  179. #define MTK_PHY_LED_BLINK_100TX BIT(2)
  180. #define MTK_PHY_LED_BLINK_100RX BIT(3)
  181. #define MTK_PHY_LED_BLINK_10TX BIT(4)
  182. #define MTK_PHY_LED_BLINK_10RX BIT(5)
  183. #define MTK_PHY_LED_BLINK_RX (MTK_PHY_LED_BLINK_10RX |\
  184. MTK_PHY_LED_BLINK_100RX |\
  185. MTK_PHY_LED_BLINK_1000RX)
  186. #define MTK_PHY_LED_BLINK_TX (MTK_PHY_LED_BLINK_10TX |\
  187. MTK_PHY_LED_BLINK_100TX |\
  188. MTK_PHY_LED_BLINK_1000TX)
  189. #define MTK_PHY_LED_BLINK_COLLISION BIT(6)
  190. #define MTK_PHY_LED_BLINK_RX_CRC_ERR BIT(7)
  191. #define MTK_PHY_LED_BLINK_RX_IDLE_ERR BIT(8)
  192. #define MTK_PHY_LED_BLINK_FORCE_BLINK BIT(9)
  193. #define MTK_PHY_LED1_DEFAULT_POLARITIES BIT(1)
  194. #define MTK_PHY_RG_BG_RASEL 0x115
  195. #define MTK_PHY_RG_BG_RASEL_MASK GENMASK(2, 0)
  196. /* 'boottrap' register reflecting the configuration of the 4 PHY LEDs */
  197. #define RG_GPIO_MISC_TPBANK0 0x6f0
  198. #define RG_GPIO_MISC_TPBANK0_BOOTMODE GENMASK(11, 8)
  199. /* These macro privides efuse parsing for internal phy. */
  200. #define EFS_DA_TX_I2MPB_A(x) (((x) >> 0) & GENMASK(5, 0))
  201. #define EFS_DA_TX_I2MPB_B(x) (((x) >> 6) & GENMASK(5, 0))
  202. #define EFS_DA_TX_I2MPB_C(x) (((x) >> 12) & GENMASK(5, 0))
  203. #define EFS_DA_TX_I2MPB_D(x) (((x) >> 18) & GENMASK(5, 0))
  204. #define EFS_DA_TX_AMP_OFFSET_A(x) (((x) >> 24) & GENMASK(5, 0))
  205. #define EFS_DA_TX_AMP_OFFSET_B(x) (((x) >> 0) & GENMASK(5, 0))
  206. #define EFS_DA_TX_AMP_OFFSET_C(x) (((x) >> 6) & GENMASK(5, 0))
  207. #define EFS_DA_TX_AMP_OFFSET_D(x) (((x) >> 12) & GENMASK(5, 0))
  208. #define EFS_DA_TX_R50_A(x) (((x) >> 18) & GENMASK(5, 0))
  209. #define EFS_DA_TX_R50_B(x) (((x) >> 24) & GENMASK(5, 0))
  210. #define EFS_DA_TX_R50_C(x) (((x) >> 0) & GENMASK(5, 0))
  211. #define EFS_DA_TX_R50_D(x) (((x) >> 6) & GENMASK(5, 0))
  212. #define EFS_RG_BG_RASEL(x) (((x) >> 4) & GENMASK(2, 0))
  213. #define EFS_RG_REXT_TRIM(x) (((x) >> 7) & GENMASK(5, 0))
  214. enum {
  215. NO_PAIR,
  216. PAIR_A,
  217. PAIR_B,
  218. PAIR_C,
  219. PAIR_D,
  220. };
  221. enum calibration_mode {
  222. EFUSE_K,
  223. SW_K
  224. };
  225. enum CAL_ITEM {
  226. REXT,
  227. TX_OFFSET,
  228. TX_AMP,
  229. TX_R50,
  230. TX_VCM
  231. };
  232. enum CAL_MODE {
  233. EFUSE_M,
  234. SW_M
  235. };
  236. #define MTK_PHY_LED_STATE_FORCE_ON 0
  237. #define MTK_PHY_LED_STATE_FORCE_BLINK 1
  238. #define MTK_PHY_LED_STATE_NETDEV 2
  239. struct mtk_socphy_priv {
  240. unsigned long led_state;
  241. };
  242. struct mtk_socphy_shared {
  243. u32 boottrap;
  244. struct mtk_socphy_priv priv[4];
  245. };
  246. static int mtk_socphy_read_page(struct phy_device *phydev)
  247. {
  248. return __phy_read(phydev, MTK_EXT_PAGE_ACCESS);
  249. }
  250. static int mtk_socphy_write_page(struct phy_device *phydev, int page)
  251. {
  252. return __phy_write(phydev, MTK_EXT_PAGE_ACCESS, page);
  253. }
  254. /* One calibration cycle consists of:
  255. * 1.Set DA_CALIN_FLAG high to start calibration. Keep it high
  256. * until AD_CAL_COMP is ready to output calibration result.
  257. * 2.Wait until DA_CAL_CLK is available.
  258. * 3.Fetch AD_CAL_COMP_OUT.
  259. */
  260. static int cal_cycle(struct phy_device *phydev, int devad,
  261. u32 regnum, u16 mask, u16 cal_val)
  262. {
  263. int reg_val;
  264. int ret;
  265. phy_modify_mmd(phydev, devad, regnum,
  266. mask, cal_val);
  267. phy_set_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_AD_CALIN,
  268. MTK_PHY_DA_CALIN_FLAG);
  269. ret = phy_read_mmd_poll_timeout(phydev, MDIO_MMD_VEND1,
  270. MTK_PHY_RG_AD_CAL_CLK, reg_val,
  271. reg_val & MTK_PHY_DA_CAL_CLK, 500,
  272. ANALOG_INTERNAL_OPERATION_MAX_US, false);
  273. if (ret) {
  274. phydev_err(phydev, "Calibration cycle timeout\n");
  275. return ret;
  276. }
  277. phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_AD_CALIN,
  278. MTK_PHY_DA_CALIN_FLAG);
  279. ret = phy_read_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_AD_CAL_COMP) >>
  280. MTK_PHY_AD_CAL_COMP_OUT_SHIFT;
  281. phydev_dbg(phydev, "cal_val: 0x%x, ret: %d\n", cal_val, ret);
  282. return ret;
  283. }
  284. static int rext_fill_result(struct phy_device *phydev, u16 *buf)
  285. {
  286. phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG5,
  287. MTK_PHY_RG_REXT_TRIM_MASK, buf[0] << 8);
  288. phy_modify_mmd(phydev, MDIO_MMD_VEND2, MTK_PHY_RG_BG_RASEL,
  289. MTK_PHY_RG_BG_RASEL_MASK, buf[1]);
  290. return 0;
  291. }
  292. static int rext_cal_efuse(struct phy_device *phydev, u32 *buf)
  293. {
  294. u16 rext_cal_val[2];
  295. rext_cal_val[0] = EFS_RG_REXT_TRIM(buf[3]);
  296. rext_cal_val[1] = EFS_RG_BG_RASEL(buf[3]);
  297. rext_fill_result(phydev, rext_cal_val);
  298. return 0;
  299. }
  300. static int tx_offset_fill_result(struct phy_device *phydev, u16 *buf)
  301. {
  302. phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_CR_TX_AMP_OFFSET_A_B,
  303. MTK_PHY_CR_TX_AMP_OFFSET_A_MASK, buf[0] << 8);
  304. phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_CR_TX_AMP_OFFSET_A_B,
  305. MTK_PHY_CR_TX_AMP_OFFSET_B_MASK, buf[1]);
  306. phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_CR_TX_AMP_OFFSET_C_D,
  307. MTK_PHY_CR_TX_AMP_OFFSET_C_MASK, buf[2] << 8);
  308. phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_CR_TX_AMP_OFFSET_C_D,
  309. MTK_PHY_CR_TX_AMP_OFFSET_D_MASK, buf[3]);
  310. return 0;
  311. }
  312. static int tx_offset_cal_efuse(struct phy_device *phydev, u32 *buf)
  313. {
  314. u16 tx_offset_cal_val[4];
  315. tx_offset_cal_val[0] = EFS_DA_TX_AMP_OFFSET_A(buf[0]);
  316. tx_offset_cal_val[1] = EFS_DA_TX_AMP_OFFSET_B(buf[1]);
  317. tx_offset_cal_val[2] = EFS_DA_TX_AMP_OFFSET_C(buf[1]);
  318. tx_offset_cal_val[3] = EFS_DA_TX_AMP_OFFSET_D(buf[1]);
  319. tx_offset_fill_result(phydev, tx_offset_cal_val);
  320. return 0;
  321. }
  322. static int tx_amp_fill_result(struct phy_device *phydev, u16 *buf)
  323. {
  324. int i;
  325. int bias[16] = {};
  326. const int vals_9461[16] = { 7, 1, 4, 7,
  327. 7, 1, 4, 7,
  328. 7, 1, 4, 7,
  329. 7, 1, 4, 7 };
  330. const int vals_9481[16] = { 10, 6, 6, 10,
  331. 10, 6, 6, 10,
  332. 10, 6, 6, 10,
  333. 10, 6, 6, 10 };
  334. switch (phydev->drv->phy_id) {
  335. case MTK_GPHY_ID_MT7981:
  336. /* We add some calibration to efuse values
  337. * due to board level influence.
  338. * GBE: +7, TBT: +1, HBT: +4, TST: +7
  339. */
  340. memcpy(bias, (const void *)vals_9461, sizeof(bias));
  341. break;
  342. case MTK_GPHY_ID_MT7988:
  343. memcpy(bias, (const void *)vals_9481, sizeof(bias));
  344. break;
  345. }
  346. /* Prevent overflow */
  347. for (i = 0; i < 12; i++) {
  348. if (buf[i >> 2] + bias[i] > 63) {
  349. buf[i >> 2] = 63;
  350. bias[i] = 0;
  351. }
  352. }
  353. phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TXVLD_DA_RG,
  354. MTK_PHY_DA_TX_I2MPB_A_GBE_MASK, (buf[0] + bias[0]) << 10);
  355. phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TXVLD_DA_RG,
  356. MTK_PHY_DA_TX_I2MPB_A_TBT_MASK, buf[0] + bias[1]);
  357. phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_A2,
  358. MTK_PHY_DA_TX_I2MPB_A_HBT_MASK, (buf[0] + bias[2]) << 10);
  359. phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_A2,
  360. MTK_PHY_DA_TX_I2MPB_A_TST_MASK, buf[0] + bias[3]);
  361. phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_B1,
  362. MTK_PHY_DA_TX_I2MPB_B_GBE_MASK, (buf[1] + bias[4]) << 8);
  363. phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_B1,
  364. MTK_PHY_DA_TX_I2MPB_B_TBT_MASK, buf[1] + bias[5]);
  365. phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_B2,
  366. MTK_PHY_DA_TX_I2MPB_B_HBT_MASK, (buf[1] + bias[6]) << 8);
  367. phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_B2,
  368. MTK_PHY_DA_TX_I2MPB_B_TST_MASK, buf[1] + bias[7]);
  369. phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_C1,
  370. MTK_PHY_DA_TX_I2MPB_C_GBE_MASK, (buf[2] + bias[8]) << 8);
  371. phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_C1,
  372. MTK_PHY_DA_TX_I2MPB_C_TBT_MASK, buf[2] + bias[9]);
  373. phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_C2,
  374. MTK_PHY_DA_TX_I2MPB_C_HBT_MASK, (buf[2] + bias[10]) << 8);
  375. phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_C2,
  376. MTK_PHY_DA_TX_I2MPB_C_TST_MASK, buf[2] + bias[11]);
  377. phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_D1,
  378. MTK_PHY_DA_TX_I2MPB_D_GBE_MASK, (buf[3] + bias[12]) << 8);
  379. phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_D1,
  380. MTK_PHY_DA_TX_I2MPB_D_TBT_MASK, buf[3] + bias[13]);
  381. phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_D2,
  382. MTK_PHY_DA_TX_I2MPB_D_HBT_MASK, (buf[3] + bias[14]) << 8);
  383. phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_TX_I2MPB_TEST_MODE_D2,
  384. MTK_PHY_DA_TX_I2MPB_D_TST_MASK, buf[3] + bias[15]);
  385. return 0;
  386. }
  387. static int tx_amp_cal_efuse(struct phy_device *phydev, u32 *buf)
  388. {
  389. u16 tx_amp_cal_val[4];
  390. tx_amp_cal_val[0] = EFS_DA_TX_I2MPB_A(buf[0]);
  391. tx_amp_cal_val[1] = EFS_DA_TX_I2MPB_B(buf[0]);
  392. tx_amp_cal_val[2] = EFS_DA_TX_I2MPB_C(buf[0]);
  393. tx_amp_cal_val[3] = EFS_DA_TX_I2MPB_D(buf[0]);
  394. tx_amp_fill_result(phydev, tx_amp_cal_val);
  395. return 0;
  396. }
  397. static int tx_r50_fill_result(struct phy_device *phydev, u16 tx_r50_cal_val,
  398. u8 txg_calen_x)
  399. {
  400. int bias = 0;
  401. u16 reg, val;
  402. if (phydev->drv->phy_id == MTK_GPHY_ID_MT7988)
  403. bias = -1;
  404. val = clamp_val(bias + tx_r50_cal_val, 0, 63);
  405. switch (txg_calen_x) {
  406. case PAIR_A:
  407. reg = MTK_PHY_DA_TX_R50_PAIR_A;
  408. break;
  409. case PAIR_B:
  410. reg = MTK_PHY_DA_TX_R50_PAIR_B;
  411. break;
  412. case PAIR_C:
  413. reg = MTK_PHY_DA_TX_R50_PAIR_C;
  414. break;
  415. case PAIR_D:
  416. reg = MTK_PHY_DA_TX_R50_PAIR_D;
  417. break;
  418. default:
  419. return -EINVAL;
  420. }
  421. phy_write_mmd(phydev, MDIO_MMD_VEND1, reg, val | val << 8);
  422. return 0;
  423. }
  424. static int tx_r50_cal_efuse(struct phy_device *phydev, u32 *buf,
  425. u8 txg_calen_x)
  426. {
  427. u16 tx_r50_cal_val;
  428. switch (txg_calen_x) {
  429. case PAIR_A:
  430. tx_r50_cal_val = EFS_DA_TX_R50_A(buf[1]);
  431. break;
  432. case PAIR_B:
  433. tx_r50_cal_val = EFS_DA_TX_R50_B(buf[1]);
  434. break;
  435. case PAIR_C:
  436. tx_r50_cal_val = EFS_DA_TX_R50_C(buf[2]);
  437. break;
  438. case PAIR_D:
  439. tx_r50_cal_val = EFS_DA_TX_R50_D(buf[2]);
  440. break;
  441. default:
  442. return -EINVAL;
  443. }
  444. tx_r50_fill_result(phydev, tx_r50_cal_val, txg_calen_x);
  445. return 0;
  446. }
  447. static int tx_vcm_cal_sw(struct phy_device *phydev, u8 rg_txreserve_x)
  448. {
  449. u8 lower_idx, upper_idx, txreserve_val;
  450. u8 lower_ret, upper_ret;
  451. int ret;
  452. phy_set_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG0,
  453. MTK_PHY_RG_ANA_CALEN);
  454. phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG0,
  455. MTK_PHY_RG_CAL_CKINV);
  456. phy_set_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG1,
  457. MTK_PHY_RG_TXVOS_CALEN);
  458. switch (rg_txreserve_x) {
  459. case PAIR_A:
  460. phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1,
  461. MTK_PHY_RG_DASN_DAC_IN0_A,
  462. MTK_PHY_DASN_DAC_IN0_A_MASK);
  463. phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1,
  464. MTK_PHY_RG_DASN_DAC_IN1_A,
  465. MTK_PHY_DASN_DAC_IN1_A_MASK);
  466. phy_set_bits_mmd(phydev, MDIO_MMD_VEND1,
  467. MTK_PHY_RG_ANA_CAL_RG0,
  468. MTK_PHY_RG_ZCALEN_A);
  469. break;
  470. case PAIR_B:
  471. phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1,
  472. MTK_PHY_RG_DASN_DAC_IN0_B,
  473. MTK_PHY_DASN_DAC_IN0_B_MASK);
  474. phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1,
  475. MTK_PHY_RG_DASN_DAC_IN1_B,
  476. MTK_PHY_DASN_DAC_IN1_B_MASK);
  477. phy_set_bits_mmd(phydev, MDIO_MMD_VEND1,
  478. MTK_PHY_RG_ANA_CAL_RG1,
  479. MTK_PHY_RG_ZCALEN_B);
  480. break;
  481. case PAIR_C:
  482. phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1,
  483. MTK_PHY_RG_DASN_DAC_IN0_C,
  484. MTK_PHY_DASN_DAC_IN0_C_MASK);
  485. phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1,
  486. MTK_PHY_RG_DASN_DAC_IN1_C,
  487. MTK_PHY_DASN_DAC_IN1_C_MASK);
  488. phy_set_bits_mmd(phydev, MDIO_MMD_VEND1,
  489. MTK_PHY_RG_ANA_CAL_RG1,
  490. MTK_PHY_RG_ZCALEN_C);
  491. break;
  492. case PAIR_D:
  493. phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1,
  494. MTK_PHY_RG_DASN_DAC_IN0_D,
  495. MTK_PHY_DASN_DAC_IN0_D_MASK);
  496. phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1,
  497. MTK_PHY_RG_DASN_DAC_IN1_D,
  498. MTK_PHY_DASN_DAC_IN1_D_MASK);
  499. phy_set_bits_mmd(phydev, MDIO_MMD_VEND1,
  500. MTK_PHY_RG_ANA_CAL_RG1,
  501. MTK_PHY_RG_ZCALEN_D);
  502. break;
  503. default:
  504. ret = -EINVAL;
  505. goto restore;
  506. }
  507. lower_idx = TXRESERVE_MIN;
  508. upper_idx = TXRESERVE_MAX;
  509. phydev_dbg(phydev, "Start TX-VCM SW cal.\n");
  510. while ((upper_idx - lower_idx) > 1) {
  511. txreserve_val = DIV_ROUND_CLOSEST(lower_idx + upper_idx, 2);
  512. ret = cal_cycle(phydev, MDIO_MMD_VEND1, MTK_PHY_RXADC_CTRL_RG9,
  513. MTK_PHY_DA_RX_PSBN_TBT_MASK |
  514. MTK_PHY_DA_RX_PSBN_HBT_MASK |
  515. MTK_PHY_DA_RX_PSBN_GBE_MASK |
  516. MTK_PHY_DA_RX_PSBN_LP_MASK,
  517. txreserve_val << 12 | txreserve_val << 8 |
  518. txreserve_val << 4 | txreserve_val);
  519. if (ret == 1) {
  520. upper_idx = txreserve_val;
  521. upper_ret = ret;
  522. } else if (ret == 0) {
  523. lower_idx = txreserve_val;
  524. lower_ret = ret;
  525. } else {
  526. goto restore;
  527. }
  528. }
  529. if (lower_idx == TXRESERVE_MIN) {
  530. lower_ret = cal_cycle(phydev, MDIO_MMD_VEND1,
  531. MTK_PHY_RXADC_CTRL_RG9,
  532. MTK_PHY_DA_RX_PSBN_TBT_MASK |
  533. MTK_PHY_DA_RX_PSBN_HBT_MASK |
  534. MTK_PHY_DA_RX_PSBN_GBE_MASK |
  535. MTK_PHY_DA_RX_PSBN_LP_MASK,
  536. lower_idx << 12 | lower_idx << 8 |
  537. lower_idx << 4 | lower_idx);
  538. ret = lower_ret;
  539. } else if (upper_idx == TXRESERVE_MAX) {
  540. upper_ret = cal_cycle(phydev, MDIO_MMD_VEND1,
  541. MTK_PHY_RXADC_CTRL_RG9,
  542. MTK_PHY_DA_RX_PSBN_TBT_MASK |
  543. MTK_PHY_DA_RX_PSBN_HBT_MASK |
  544. MTK_PHY_DA_RX_PSBN_GBE_MASK |
  545. MTK_PHY_DA_RX_PSBN_LP_MASK,
  546. upper_idx << 12 | upper_idx << 8 |
  547. upper_idx << 4 | upper_idx);
  548. ret = upper_ret;
  549. }
  550. if (ret < 0)
  551. goto restore;
  552. /* We calibrate TX-VCM in different logic. Check upper index and then
  553. * lower index. If this calibration is valid, apply lower index's result.
  554. */
  555. ret = upper_ret - lower_ret;
  556. if (ret == 1) {
  557. ret = 0;
  558. /* Make sure we use upper_idx in our calibration system */
  559. cal_cycle(phydev, MDIO_MMD_VEND1, MTK_PHY_RXADC_CTRL_RG9,
  560. MTK_PHY_DA_RX_PSBN_TBT_MASK |
  561. MTK_PHY_DA_RX_PSBN_HBT_MASK |
  562. MTK_PHY_DA_RX_PSBN_GBE_MASK |
  563. MTK_PHY_DA_RX_PSBN_LP_MASK,
  564. upper_idx << 12 | upper_idx << 8 |
  565. upper_idx << 4 | upper_idx);
  566. phydev_dbg(phydev, "TX-VCM SW cal result: 0x%x\n", upper_idx);
  567. } else if (lower_idx == TXRESERVE_MIN && upper_ret == 1 &&
  568. lower_ret == 1) {
  569. ret = 0;
  570. cal_cycle(phydev, MDIO_MMD_VEND1, MTK_PHY_RXADC_CTRL_RG9,
  571. MTK_PHY_DA_RX_PSBN_TBT_MASK |
  572. MTK_PHY_DA_RX_PSBN_HBT_MASK |
  573. MTK_PHY_DA_RX_PSBN_GBE_MASK |
  574. MTK_PHY_DA_RX_PSBN_LP_MASK,
  575. lower_idx << 12 | lower_idx << 8 |
  576. lower_idx << 4 | lower_idx);
  577. phydev_warn(phydev, "TX-VCM SW cal result at low margin 0x%x\n",
  578. lower_idx);
  579. } else if (upper_idx == TXRESERVE_MAX && upper_ret == 0 &&
  580. lower_ret == 0) {
  581. ret = 0;
  582. phydev_warn(phydev, "TX-VCM SW cal result at high margin 0x%x\n",
  583. upper_idx);
  584. } else {
  585. ret = -EINVAL;
  586. }
  587. restore:
  588. phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG0,
  589. MTK_PHY_RG_ANA_CALEN);
  590. phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG1,
  591. MTK_PHY_RG_TXVOS_CALEN);
  592. phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG0,
  593. MTK_PHY_RG_ZCALEN_A);
  594. phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_ANA_CAL_RG1,
  595. MTK_PHY_RG_ZCALEN_B | MTK_PHY_RG_ZCALEN_C |
  596. MTK_PHY_RG_ZCALEN_D);
  597. return ret;
  598. }
  599. static void mt798x_phy_common_finetune(struct phy_device *phydev)
  600. {
  601. phy_select_page(phydev, MTK_PHY_PAGE_EXTENDED_52B5);
  602. /* SlvDSPreadyTime = 24, MasDSPreadyTime = 24 */
  603. __phy_write(phydev, 0x11, 0xc71);
  604. __phy_write(phydev, 0x12, 0xc);
  605. __phy_write(phydev, 0x10, 0x8fae);
  606. /* EnabRandUpdTrig = 1 */
  607. __phy_write(phydev, 0x11, 0x2f00);
  608. __phy_write(phydev, 0x12, 0xe);
  609. __phy_write(phydev, 0x10, 0x8fb0);
  610. /* NormMseLoThresh = 85 */
  611. __phy_write(phydev, 0x11, 0x55a0);
  612. __phy_write(phydev, 0x12, 0x0);
  613. __phy_write(phydev, 0x10, 0x83aa);
  614. /* FfeUpdGainForce = 1(Enable), FfeUpdGainForceVal = 4 */
  615. __phy_write(phydev, 0x11, 0x240);
  616. __phy_write(phydev, 0x12, 0x0);
  617. __phy_write(phydev, 0x10, 0x9680);
  618. /* TrFreeze = 0 (mt7988 default) */
  619. __phy_write(phydev, 0x11, 0x0);
  620. __phy_write(phydev, 0x12, 0x0);
  621. __phy_write(phydev, 0x10, 0x9686);
  622. /* SSTrKp100 = 5 */
  623. /* SSTrKf100 = 6 */
  624. /* SSTrKp1000Mas = 5 */
  625. /* SSTrKf1000Mas = 6 */
  626. /* SSTrKp1000Slv = 5 */
  627. /* SSTrKf1000Slv = 6 */
  628. __phy_write(phydev, 0x11, 0xbaef);
  629. __phy_write(phydev, 0x12, 0x2e);
  630. __phy_write(phydev, 0x10, 0x968c);
  631. phy_restore_page(phydev, MTK_PHY_PAGE_STANDARD, 0);
  632. }
  633. static void mt7981_phy_finetune(struct phy_device *phydev)
  634. {
  635. u16 val[8] = { 0x01ce, 0x01c1,
  636. 0x020f, 0x0202,
  637. 0x03d0, 0x03c0,
  638. 0x0013, 0x0005 };
  639. int i, k;
  640. /* 100M eye finetune:
  641. * Keep middle level of TX MLT3 shapper as default.
  642. * Only change TX MLT3 overshoot level here.
  643. */
  644. for (k = 0, i = 1; i < 12; i++) {
  645. if (i % 3 == 0)
  646. continue;
  647. phy_write_mmd(phydev, MDIO_MMD_VEND1, i, val[k++]);
  648. }
  649. phy_select_page(phydev, MTK_PHY_PAGE_EXTENDED_52B5);
  650. /* ResetSyncOffset = 6 */
  651. __phy_write(phydev, 0x11, 0x600);
  652. __phy_write(phydev, 0x12, 0x0);
  653. __phy_write(phydev, 0x10, 0x8fc0);
  654. /* VgaDecRate = 1 */
  655. __phy_write(phydev, 0x11, 0x4c2a);
  656. __phy_write(phydev, 0x12, 0x3e);
  657. __phy_write(phydev, 0x10, 0x8fa4);
  658. /* MrvlTrFix100Kp = 3, MrvlTrFix100Kf = 2,
  659. * MrvlTrFix1000Kp = 3, MrvlTrFix1000Kf = 2
  660. */
  661. __phy_write(phydev, 0x11, 0xd10a);
  662. __phy_write(phydev, 0x12, 0x34);
  663. __phy_write(phydev, 0x10, 0x8f82);
  664. /* VcoSlicerThreshBitsHigh */
  665. __phy_write(phydev, 0x11, 0x5555);
  666. __phy_write(phydev, 0x12, 0x55);
  667. __phy_write(phydev, 0x10, 0x8ec0);
  668. phy_restore_page(phydev, MTK_PHY_PAGE_STANDARD, 0);
  669. /* TR_OPEN_LOOP_EN = 1, lpf_x_average = 9 */
  670. phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG234,
  671. MTK_PHY_TR_OPEN_LOOP_EN_MASK | MTK_PHY_LPF_X_AVERAGE_MASK,
  672. BIT(0) | FIELD_PREP(MTK_PHY_LPF_X_AVERAGE_MASK, 0x9));
  673. /* rg_tr_lpf_cnt_val = 512 */
  674. phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_LPF_CNT_VAL, 0x200);
  675. /* IIR2 related */
  676. phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_LP_IIR2_K1_L, 0x82);
  677. phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_LP_IIR2_K1_U, 0x0);
  678. phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_LP_IIR2_K2_L, 0x103);
  679. phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_LP_IIR2_K2_U, 0x0);
  680. phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_LP_IIR2_K3_L, 0x82);
  681. phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_LP_IIR2_K3_U, 0x0);
  682. phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_LP_IIR2_K4_L, 0xd177);
  683. phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_LP_IIR2_K4_U, 0x3);
  684. phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_LP_IIR2_K5_L, 0x2c82);
  685. phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_LP_IIR2_K5_U, 0xe);
  686. /* FFE peaking */
  687. phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG27C,
  688. MTK_PHY_VGASTATE_FFE_THR_ST1_MASK, 0x1b << 8);
  689. phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG27D,
  690. MTK_PHY_VGASTATE_FFE_THR_ST2_MASK, 0x1e);
  691. /* Disable LDO pump */
  692. phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_LDO_PUMP_EN_PAIRAB, 0x0);
  693. phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_LDO_PUMP_EN_PAIRCD, 0x0);
  694. /* Adjust LDO output voltage */
  695. phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_LDO_OUTPUT_V, 0x2222);
  696. }
  697. static void mt7988_phy_finetune(struct phy_device *phydev)
  698. {
  699. u16 val[12] = { 0x0187, 0x01cd, 0x01c8, 0x0182,
  700. 0x020d, 0x0206, 0x0384, 0x03d0,
  701. 0x03c6, 0x030a, 0x0011, 0x0005 };
  702. int i;
  703. /* Set default MLT3 shaper first */
  704. for (i = 0; i < 12; i++)
  705. phy_write_mmd(phydev, MDIO_MMD_VEND1, i, val[i]);
  706. /* TCT finetune */
  707. phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_TX_FILTER, 0x5);
  708. phy_select_page(phydev, MTK_PHY_PAGE_EXTENDED_52B5);
  709. /* ResetSyncOffset = 5 */
  710. __phy_write(phydev, 0x11, 0x500);
  711. __phy_write(phydev, 0x12, 0x0);
  712. __phy_write(phydev, 0x10, 0x8fc0);
  713. /* VgaDecRate is 1 at default on mt7988 */
  714. /* MrvlTrFix100Kp = 6, MrvlTrFix100Kf = 7,
  715. * MrvlTrFix1000Kp = 6, MrvlTrFix1000Kf = 7
  716. */
  717. __phy_write(phydev, 0x11, 0xb90a);
  718. __phy_write(phydev, 0x12, 0x6f);
  719. __phy_write(phydev, 0x10, 0x8f82);
  720. /* RemAckCntLimitCtrl = 1 */
  721. __phy_write(phydev, 0x11, 0xfbba);
  722. __phy_write(phydev, 0x12, 0xc3);
  723. __phy_write(phydev, 0x10, 0x87f8);
  724. phy_restore_page(phydev, MTK_PHY_PAGE_STANDARD, 0);
  725. /* TR_OPEN_LOOP_EN = 1, lpf_x_average = 10 */
  726. phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG234,
  727. MTK_PHY_TR_OPEN_LOOP_EN_MASK | MTK_PHY_LPF_X_AVERAGE_MASK,
  728. BIT(0) | FIELD_PREP(MTK_PHY_LPF_X_AVERAGE_MASK, 0xa));
  729. /* rg_tr_lpf_cnt_val = 1023 */
  730. phy_write_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_LPF_CNT_VAL, 0x3ff);
  731. }
  732. static void mt798x_phy_eee(struct phy_device *phydev)
  733. {
  734. phy_modify_mmd(phydev, MDIO_MMD_VEND1,
  735. MTK_PHY_RG_LPI_PCS_DSP_CTRL_REG120,
  736. MTK_PHY_LPI_SIG_EN_LO_THRESH1000_MASK |
  737. MTK_PHY_LPI_SIG_EN_HI_THRESH1000_MASK,
  738. FIELD_PREP(MTK_PHY_LPI_SIG_EN_LO_THRESH1000_MASK, 0x0) |
  739. FIELD_PREP(MTK_PHY_LPI_SIG_EN_HI_THRESH1000_MASK, 0x14));
  740. phy_modify_mmd(phydev, MDIO_MMD_VEND1,
  741. MTK_PHY_RG_LPI_PCS_DSP_CTRL_REG122,
  742. MTK_PHY_LPI_NORM_MSE_HI_THRESH1000_MASK,
  743. FIELD_PREP(MTK_PHY_LPI_NORM_MSE_HI_THRESH1000_MASK,
  744. 0xff));
  745. phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1,
  746. MTK_PHY_RG_TESTMUX_ADC_CTRL,
  747. MTK_PHY_RG_TXEN_DIG_MASK);
  748. phy_set_bits_mmd(phydev, MDIO_MMD_VEND1,
  749. MTK_PHY_RG_DEV1E_REG19b, MTK_PHY_BYPASS_DSP_LPI_READY);
  750. phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1,
  751. MTK_PHY_RG_DEV1E_REG234, MTK_PHY_TR_LP_IIR_EEE_EN);
  752. phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG238,
  753. MTK_PHY_LPI_SLV_SEND_TX_TIMER_MASK |
  754. MTK_PHY_LPI_SLV_SEND_TX_EN,
  755. FIELD_PREP(MTK_PHY_LPI_SLV_SEND_TX_TIMER_MASK, 0x120));
  756. /* Keep MTK_PHY_LPI_SEND_LOC_TIMER as 375 */
  757. phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG239,
  758. MTK_PHY_LPI_TXPCS_LOC_RCV);
  759. /* This also fixes some IoT issues, such as CH340 */
  760. phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG2C7,
  761. MTK_PHY_MAX_GAIN_MASK | MTK_PHY_MIN_GAIN_MASK,
  762. FIELD_PREP(MTK_PHY_MAX_GAIN_MASK, 0x8) |
  763. FIELD_PREP(MTK_PHY_MIN_GAIN_MASK, 0x13));
  764. phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG2D1,
  765. MTK_PHY_VCO_SLICER_THRESH_BITS_HIGH_EEE_MASK,
  766. FIELD_PREP(MTK_PHY_VCO_SLICER_THRESH_BITS_HIGH_EEE_MASK,
  767. 0x33) |
  768. MTK_PHY_LPI_SKIP_SD_SLV_TR | MTK_PHY_LPI_TR_READY |
  769. MTK_PHY_LPI_VCO_EEE_STG0_EN);
  770. phy_set_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG323,
  771. MTK_PHY_EEE_WAKE_MAS_INT_DC |
  772. MTK_PHY_EEE_WAKE_SLV_INT_DC);
  773. phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG324,
  774. MTK_PHY_SMI_DETCNT_MAX_MASK,
  775. FIELD_PREP(MTK_PHY_SMI_DETCNT_MAX_MASK, 0x3f) |
  776. MTK_PHY_SMI_DET_MAX_EN);
  777. phy_set_bits_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG326,
  778. MTK_PHY_LPI_MODE_SD_ON | MTK_PHY_RESET_RANDUPD_CNT |
  779. MTK_PHY_TREC_UPDATE_ENAB_CLR |
  780. MTK_PHY_LPI_QUIT_WAIT_DFE_SIG_DET_OFF |
  781. MTK_PHY_TR_READY_SKIP_AFE_WAKEUP);
  782. phy_select_page(phydev, MTK_PHY_PAGE_EXTENDED_52B5);
  783. /* Regsigdet_sel_1000 = 0 */
  784. __phy_write(phydev, 0x11, 0xb);
  785. __phy_write(phydev, 0x12, 0x0);
  786. __phy_write(phydev, 0x10, 0x9690);
  787. /* REG_EEE_st2TrKf1000 = 2 */
  788. __phy_write(phydev, 0x11, 0x114f);
  789. __phy_write(phydev, 0x12, 0x2);
  790. __phy_write(phydev, 0x10, 0x969a);
  791. /* RegEEE_slv_wake_tr_timer_tar = 6, RegEEE_slv_remtx_timer_tar = 20 */
  792. __phy_write(phydev, 0x11, 0x3028);
  793. __phy_write(phydev, 0x12, 0x0);
  794. __phy_write(phydev, 0x10, 0x969e);
  795. /* RegEEE_slv_wake_int_timer_tar = 8 */
  796. __phy_write(phydev, 0x11, 0x5010);
  797. __phy_write(phydev, 0x12, 0x0);
  798. __phy_write(phydev, 0x10, 0x96a0);
  799. /* RegEEE_trfreeze_timer2 = 586 */
  800. __phy_write(phydev, 0x11, 0x24a);
  801. __phy_write(phydev, 0x12, 0x0);
  802. __phy_write(phydev, 0x10, 0x96a8);
  803. /* RegEEE100Stg1_tar = 16 */
  804. __phy_write(phydev, 0x11, 0x3210);
  805. __phy_write(phydev, 0x12, 0x0);
  806. __phy_write(phydev, 0x10, 0x96b8);
  807. /* REGEEE_wake_slv_tr_wait_dfesigdet_en = 0 */
  808. __phy_write(phydev, 0x11, 0x1463);
  809. __phy_write(phydev, 0x12, 0x0);
  810. __phy_write(phydev, 0x10, 0x96ca);
  811. /* DfeTailEnableVgaThresh1000 = 27 */
  812. __phy_write(phydev, 0x11, 0x36);
  813. __phy_write(phydev, 0x12, 0x0);
  814. __phy_write(phydev, 0x10, 0x8f80);
  815. phy_restore_page(phydev, MTK_PHY_PAGE_STANDARD, 0);
  816. phy_select_page(phydev, MTK_PHY_PAGE_EXTENDED_3);
  817. __phy_modify(phydev, MTK_PHY_LPI_REG_14, MTK_PHY_LPI_WAKE_TIMER_1000_MASK,
  818. FIELD_PREP(MTK_PHY_LPI_WAKE_TIMER_1000_MASK, 0x19c));
  819. __phy_modify(phydev, MTK_PHY_LPI_REG_1c, MTK_PHY_SMI_DET_ON_THRESH_MASK,
  820. FIELD_PREP(MTK_PHY_SMI_DET_ON_THRESH_MASK, 0xc));
  821. phy_restore_page(phydev, MTK_PHY_PAGE_STANDARD, 0);
  822. phy_modify_mmd(phydev, MDIO_MMD_VEND1,
  823. MTK_PHY_RG_LPI_PCS_DSP_CTRL_REG122,
  824. MTK_PHY_LPI_NORM_MSE_HI_THRESH1000_MASK,
  825. FIELD_PREP(MTK_PHY_LPI_NORM_MSE_HI_THRESH1000_MASK, 0xff));
  826. }
  827. static int cal_sw(struct phy_device *phydev, enum CAL_ITEM cal_item,
  828. u8 start_pair, u8 end_pair)
  829. {
  830. u8 pair_n;
  831. int ret;
  832. for (pair_n = start_pair; pair_n <= end_pair; pair_n++) {
  833. /* TX_OFFSET & TX_AMP have no SW calibration. */
  834. switch (cal_item) {
  835. case TX_VCM:
  836. ret = tx_vcm_cal_sw(phydev, pair_n);
  837. break;
  838. default:
  839. return -EINVAL;
  840. }
  841. if (ret)
  842. return ret;
  843. }
  844. return 0;
  845. }
  846. static int cal_efuse(struct phy_device *phydev, enum CAL_ITEM cal_item,
  847. u8 start_pair, u8 end_pair, u32 *buf)
  848. {
  849. u8 pair_n;
  850. int ret;
  851. for (pair_n = start_pair; pair_n <= end_pair; pair_n++) {
  852. /* TX_VCM has no efuse calibration. */
  853. switch (cal_item) {
  854. case REXT:
  855. ret = rext_cal_efuse(phydev, buf);
  856. break;
  857. case TX_OFFSET:
  858. ret = tx_offset_cal_efuse(phydev, buf);
  859. break;
  860. case TX_AMP:
  861. ret = tx_amp_cal_efuse(phydev, buf);
  862. break;
  863. case TX_R50:
  864. ret = tx_r50_cal_efuse(phydev, buf, pair_n);
  865. break;
  866. default:
  867. return -EINVAL;
  868. }
  869. if (ret)
  870. return ret;
  871. }
  872. return 0;
  873. }
  874. static int start_cal(struct phy_device *phydev, enum CAL_ITEM cal_item,
  875. enum CAL_MODE cal_mode, u8 start_pair,
  876. u8 end_pair, u32 *buf)
  877. {
  878. int ret;
  879. switch (cal_mode) {
  880. case EFUSE_M:
  881. ret = cal_efuse(phydev, cal_item, start_pair,
  882. end_pair, buf);
  883. break;
  884. case SW_M:
  885. ret = cal_sw(phydev, cal_item, start_pair, end_pair);
  886. break;
  887. default:
  888. return -EINVAL;
  889. }
  890. if (ret) {
  891. phydev_err(phydev, "cal %d failed\n", cal_item);
  892. return -EIO;
  893. }
  894. return 0;
  895. }
  896. static int mt798x_phy_calibration(struct phy_device *phydev)
  897. {
  898. int ret = 0;
  899. u32 *buf;
  900. size_t len;
  901. struct nvmem_cell *cell;
  902. cell = nvmem_cell_get(&phydev->mdio.dev, "phy-cal-data");
  903. if (IS_ERR(cell)) {
  904. if (PTR_ERR(cell) == -EPROBE_DEFER)
  905. return PTR_ERR(cell);
  906. return 0;
  907. }
  908. buf = (u32 *)nvmem_cell_read(cell, &len);
  909. if (IS_ERR(buf))
  910. return PTR_ERR(buf);
  911. nvmem_cell_put(cell);
  912. if (!buf[0] || !buf[1] || !buf[2] || !buf[3] || len < 4 * sizeof(u32)) {
  913. phydev_err(phydev, "invalid efuse data\n");
  914. ret = -EINVAL;
  915. goto out;
  916. }
  917. ret = start_cal(phydev, REXT, EFUSE_M, NO_PAIR, NO_PAIR, buf);
  918. if (ret)
  919. goto out;
  920. ret = start_cal(phydev, TX_OFFSET, EFUSE_M, NO_PAIR, NO_PAIR, buf);
  921. if (ret)
  922. goto out;
  923. ret = start_cal(phydev, TX_AMP, EFUSE_M, NO_PAIR, NO_PAIR, buf);
  924. if (ret)
  925. goto out;
  926. ret = start_cal(phydev, TX_R50, EFUSE_M, PAIR_A, PAIR_D, buf);
  927. if (ret)
  928. goto out;
  929. ret = start_cal(phydev, TX_VCM, SW_M, PAIR_A, PAIR_A, buf);
  930. if (ret)
  931. goto out;
  932. out:
  933. kfree(buf);
  934. return ret;
  935. }
  936. static int mt798x_phy_config_init(struct phy_device *phydev)
  937. {
  938. switch (phydev->drv->phy_id) {
  939. case MTK_GPHY_ID_MT7981:
  940. mt7981_phy_finetune(phydev);
  941. break;
  942. case MTK_GPHY_ID_MT7988:
  943. mt7988_phy_finetune(phydev);
  944. break;
  945. }
  946. mt798x_phy_common_finetune(phydev);
  947. mt798x_phy_eee(phydev);
  948. return mt798x_phy_calibration(phydev);
  949. }
  950. static int mt798x_phy_hw_led_on_set(struct phy_device *phydev, u8 index,
  951. bool on)
  952. {
  953. unsigned int bit_on = MTK_PHY_LED_STATE_FORCE_ON + (index ? 16 : 0);
  954. struct mtk_socphy_priv *priv = phydev->priv;
  955. bool changed;
  956. if (on)
  957. changed = !test_and_set_bit(bit_on, &priv->led_state);
  958. else
  959. changed = !!test_and_clear_bit(bit_on, &priv->led_state);
  960. changed |= !!test_and_clear_bit(MTK_PHY_LED_STATE_NETDEV +
  961. (index ? 16 : 0), &priv->led_state);
  962. if (changed)
  963. return phy_modify_mmd(phydev, MDIO_MMD_VEND2, index ?
  964. MTK_PHY_LED1_ON_CTRL : MTK_PHY_LED0_ON_CTRL,
  965. MTK_PHY_LED_ON_MASK,
  966. on ? MTK_PHY_LED_ON_FORCE_ON : 0);
  967. else
  968. return 0;
  969. }
  970. static int mt798x_phy_hw_led_blink_set(struct phy_device *phydev, u8 index,
  971. bool blinking)
  972. {
  973. unsigned int bit_blink = MTK_PHY_LED_STATE_FORCE_BLINK + (index ? 16 : 0);
  974. struct mtk_socphy_priv *priv = phydev->priv;
  975. bool changed;
  976. if (blinking)
  977. changed = !test_and_set_bit(bit_blink, &priv->led_state);
  978. else
  979. changed = !!test_and_clear_bit(bit_blink, &priv->led_state);
  980. changed |= !!test_bit(MTK_PHY_LED_STATE_NETDEV +
  981. (index ? 16 : 0), &priv->led_state);
  982. if (changed)
  983. return phy_write_mmd(phydev, MDIO_MMD_VEND2, index ?
  984. MTK_PHY_LED1_BLINK_CTRL : MTK_PHY_LED0_BLINK_CTRL,
  985. blinking ? MTK_PHY_LED_BLINK_FORCE_BLINK : 0);
  986. else
  987. return 0;
  988. }
  989. static int mt798x_phy_led_blink_set(struct phy_device *phydev, u8 index,
  990. unsigned long *delay_on,
  991. unsigned long *delay_off)
  992. {
  993. bool blinking = false;
  994. int err = 0;
  995. if (index > 1)
  996. return -EINVAL;
  997. if (delay_on && delay_off && (*delay_on > 0) && (*delay_off > 0)) {
  998. blinking = true;
  999. *delay_on = 50;
  1000. *delay_off = 50;
  1001. }
  1002. err = mt798x_phy_hw_led_blink_set(phydev, index, blinking);
  1003. if (err)
  1004. return err;
  1005. return mt798x_phy_hw_led_on_set(phydev, index, false);
  1006. }
  1007. static int mt798x_phy_led_brightness_set(struct phy_device *phydev,
  1008. u8 index, enum led_brightness value)
  1009. {
  1010. int err;
  1011. err = mt798x_phy_hw_led_blink_set(phydev, index, false);
  1012. if (err)
  1013. return err;
  1014. return mt798x_phy_hw_led_on_set(phydev, index, (value != LED_OFF));
  1015. }
  1016. static const unsigned long supported_triggers = (BIT(TRIGGER_NETDEV_FULL_DUPLEX) |
  1017. BIT(TRIGGER_NETDEV_HALF_DUPLEX) |
  1018. BIT(TRIGGER_NETDEV_LINK) |
  1019. BIT(TRIGGER_NETDEV_LINK_10) |
  1020. BIT(TRIGGER_NETDEV_LINK_100) |
  1021. BIT(TRIGGER_NETDEV_LINK_1000) |
  1022. BIT(TRIGGER_NETDEV_RX) |
  1023. BIT(TRIGGER_NETDEV_TX));
  1024. static int mt798x_phy_led_hw_is_supported(struct phy_device *phydev, u8 index,
  1025. unsigned long rules)
  1026. {
  1027. if (index > 1)
  1028. return -EINVAL;
  1029. /* All combinations of the supported triggers are allowed */
  1030. if (rules & ~supported_triggers)
  1031. return -EOPNOTSUPP;
  1032. return 0;
  1033. };
  1034. static int mt798x_phy_led_hw_control_get(struct phy_device *phydev, u8 index,
  1035. unsigned long *rules)
  1036. {
  1037. unsigned int bit_blink = MTK_PHY_LED_STATE_FORCE_BLINK + (index ? 16 : 0);
  1038. unsigned int bit_netdev = MTK_PHY_LED_STATE_NETDEV + (index ? 16 : 0);
  1039. unsigned int bit_on = MTK_PHY_LED_STATE_FORCE_ON + (index ? 16 : 0);
  1040. struct mtk_socphy_priv *priv = phydev->priv;
  1041. int on, blink;
  1042. if (index > 1)
  1043. return -EINVAL;
  1044. on = phy_read_mmd(phydev, MDIO_MMD_VEND2,
  1045. index ? MTK_PHY_LED1_ON_CTRL : MTK_PHY_LED0_ON_CTRL);
  1046. if (on < 0)
  1047. return -EIO;
  1048. blink = phy_read_mmd(phydev, MDIO_MMD_VEND2,
  1049. index ? MTK_PHY_LED1_BLINK_CTRL :
  1050. MTK_PHY_LED0_BLINK_CTRL);
  1051. if (blink < 0)
  1052. return -EIO;
  1053. if ((on & (MTK_PHY_LED_ON_LINK | MTK_PHY_LED_ON_FDX | MTK_PHY_LED_ON_HDX |
  1054. MTK_PHY_LED_ON_LINKDOWN)) ||
  1055. (blink & (MTK_PHY_LED_BLINK_RX | MTK_PHY_LED_BLINK_TX)))
  1056. set_bit(bit_netdev, &priv->led_state);
  1057. else
  1058. clear_bit(bit_netdev, &priv->led_state);
  1059. if (on & MTK_PHY_LED_ON_FORCE_ON)
  1060. set_bit(bit_on, &priv->led_state);
  1061. else
  1062. clear_bit(bit_on, &priv->led_state);
  1063. if (blink & MTK_PHY_LED_BLINK_FORCE_BLINK)
  1064. set_bit(bit_blink, &priv->led_state);
  1065. else
  1066. clear_bit(bit_blink, &priv->led_state);
  1067. if (!rules)
  1068. return 0;
  1069. if (on & MTK_PHY_LED_ON_LINK)
  1070. *rules |= BIT(TRIGGER_NETDEV_LINK);
  1071. if (on & MTK_PHY_LED_ON_LINK10)
  1072. *rules |= BIT(TRIGGER_NETDEV_LINK_10);
  1073. if (on & MTK_PHY_LED_ON_LINK100)
  1074. *rules |= BIT(TRIGGER_NETDEV_LINK_100);
  1075. if (on & MTK_PHY_LED_ON_LINK1000)
  1076. *rules |= BIT(TRIGGER_NETDEV_LINK_1000);
  1077. if (on & MTK_PHY_LED_ON_FDX)
  1078. *rules |= BIT(TRIGGER_NETDEV_FULL_DUPLEX);
  1079. if (on & MTK_PHY_LED_ON_HDX)
  1080. *rules |= BIT(TRIGGER_NETDEV_HALF_DUPLEX);
  1081. if (blink & MTK_PHY_LED_BLINK_RX)
  1082. *rules |= BIT(TRIGGER_NETDEV_RX);
  1083. if (blink & MTK_PHY_LED_BLINK_TX)
  1084. *rules |= BIT(TRIGGER_NETDEV_TX);
  1085. return 0;
  1086. };
  1087. static int mt798x_phy_led_hw_control_set(struct phy_device *phydev, u8 index,
  1088. unsigned long rules)
  1089. {
  1090. unsigned int bit_netdev = MTK_PHY_LED_STATE_NETDEV + (index ? 16 : 0);
  1091. struct mtk_socphy_priv *priv = phydev->priv;
  1092. u16 on = 0, blink = 0;
  1093. int ret;
  1094. if (index > 1)
  1095. return -EINVAL;
  1096. if (rules & BIT(TRIGGER_NETDEV_FULL_DUPLEX))
  1097. on |= MTK_PHY_LED_ON_FDX;
  1098. if (rules & BIT(TRIGGER_NETDEV_HALF_DUPLEX))
  1099. on |= MTK_PHY_LED_ON_HDX;
  1100. if (rules & (BIT(TRIGGER_NETDEV_LINK_10) | BIT(TRIGGER_NETDEV_LINK)))
  1101. on |= MTK_PHY_LED_ON_LINK10;
  1102. if (rules & (BIT(TRIGGER_NETDEV_LINK_100) | BIT(TRIGGER_NETDEV_LINK)))
  1103. on |= MTK_PHY_LED_ON_LINK100;
  1104. if (rules & (BIT(TRIGGER_NETDEV_LINK_1000) | BIT(TRIGGER_NETDEV_LINK)))
  1105. on |= MTK_PHY_LED_ON_LINK1000;
  1106. if (rules & BIT(TRIGGER_NETDEV_RX)) {
  1107. blink |= (on & MTK_PHY_LED_ON_LINK) ?
  1108. (((on & MTK_PHY_LED_ON_LINK10) ? MTK_PHY_LED_BLINK_10RX : 0) |
  1109. ((on & MTK_PHY_LED_ON_LINK100) ? MTK_PHY_LED_BLINK_100RX : 0) |
  1110. ((on & MTK_PHY_LED_ON_LINK1000) ? MTK_PHY_LED_BLINK_1000RX : 0)) :
  1111. MTK_PHY_LED_BLINK_RX;
  1112. }
  1113. if (rules & BIT(TRIGGER_NETDEV_TX)) {
  1114. blink |= (on & MTK_PHY_LED_ON_LINK) ?
  1115. (((on & MTK_PHY_LED_ON_LINK10) ? MTK_PHY_LED_BLINK_10TX : 0) |
  1116. ((on & MTK_PHY_LED_ON_LINK100) ? MTK_PHY_LED_BLINK_100TX : 0) |
  1117. ((on & MTK_PHY_LED_ON_LINK1000) ? MTK_PHY_LED_BLINK_1000TX : 0)) :
  1118. MTK_PHY_LED_BLINK_TX;
  1119. }
  1120. if (blink || on)
  1121. set_bit(bit_netdev, &priv->led_state);
  1122. else
  1123. clear_bit(bit_netdev, &priv->led_state);
  1124. ret = phy_modify_mmd(phydev, MDIO_MMD_VEND2, index ?
  1125. MTK_PHY_LED1_ON_CTRL :
  1126. MTK_PHY_LED0_ON_CTRL,
  1127. MTK_PHY_LED_ON_FDX |
  1128. MTK_PHY_LED_ON_HDX |
  1129. MTK_PHY_LED_ON_LINK,
  1130. on);
  1131. if (ret)
  1132. return ret;
  1133. return phy_write_mmd(phydev, MDIO_MMD_VEND2, index ?
  1134. MTK_PHY_LED1_BLINK_CTRL :
  1135. MTK_PHY_LED0_BLINK_CTRL, blink);
  1136. };
  1137. static bool mt7988_phy_led_get_polarity(struct phy_device *phydev, int led_num)
  1138. {
  1139. struct mtk_socphy_shared *priv = phydev->shared->priv;
  1140. u32 polarities;
  1141. if (led_num == 0)
  1142. polarities = ~(priv->boottrap);
  1143. else
  1144. polarities = MTK_PHY_LED1_DEFAULT_POLARITIES;
  1145. if (polarities & BIT(phydev->mdio.addr))
  1146. return true;
  1147. return false;
  1148. }
  1149. static int mt7988_phy_fix_leds_polarities(struct phy_device *phydev)
  1150. {
  1151. struct pinctrl *pinctrl;
  1152. int index;
  1153. /* Setup LED polarity according to bootstrap use of LED pins */
  1154. for (index = 0; index < 2; ++index)
  1155. phy_modify_mmd(phydev, MDIO_MMD_VEND2, index ?
  1156. MTK_PHY_LED1_ON_CTRL : MTK_PHY_LED0_ON_CTRL,
  1157. MTK_PHY_LED_ON_POLARITY,
  1158. mt7988_phy_led_get_polarity(phydev, index) ?
  1159. MTK_PHY_LED_ON_POLARITY : 0);
  1160. /* Only now setup pinctrl to avoid bogus blinking */
  1161. pinctrl = devm_pinctrl_get_select(&phydev->mdio.dev, "gbe-led");
  1162. if (IS_ERR(pinctrl))
  1163. dev_err(&phydev->mdio.bus->dev, "Failed to setup PHY LED pinctrl\n");
  1164. return 0;
  1165. }
  1166. static int mt7988_phy_probe_shared(struct phy_device *phydev)
  1167. {
  1168. struct device_node *np = dev_of_node(&phydev->mdio.bus->dev);
  1169. struct mtk_socphy_shared *shared = phydev->shared->priv;
  1170. struct regmap *regmap;
  1171. u32 reg;
  1172. int ret;
  1173. /* The LED0 of the 4 PHYs in MT7988 are wired to SoC pins LED_A, LED_B,
  1174. * LED_C and LED_D respectively. At the same time those pins are used to
  1175. * bootstrap configuration of the reference clock source (LED_A),
  1176. * DRAM DDRx16b x2/x1 (LED_B) and boot device (LED_C, LED_D).
  1177. * In practise this is done using a LED and a resistor pulling the pin
  1178. * either to GND or to VIO.
  1179. * The detected value at boot time is accessible at run-time using the
  1180. * TPBANK0 register located in the gpio base of the pinctrl, in order
  1181. * to read it here it needs to be referenced by a phandle called
  1182. * 'mediatek,pio' in the MDIO bus hosting the PHY.
  1183. * The 4 bits in TPBANK0 are kept as package shared data and are used to
  1184. * set LED polarity for each of the LED0.
  1185. */
  1186. regmap = syscon_regmap_lookup_by_phandle(np, "mediatek,pio");
  1187. if (IS_ERR(regmap))
  1188. return PTR_ERR(regmap);
  1189. ret = regmap_read(regmap, RG_GPIO_MISC_TPBANK0, &reg);
  1190. if (ret)
  1191. return ret;
  1192. shared->boottrap = FIELD_GET(RG_GPIO_MISC_TPBANK0_BOOTMODE, reg);
  1193. return 0;
  1194. }
  1195. static void mt798x_phy_leds_state_init(struct phy_device *phydev)
  1196. {
  1197. int i;
  1198. for (i = 0; i < 2; ++i)
  1199. mt798x_phy_led_hw_control_get(phydev, i, NULL);
  1200. }
  1201. static int mt7988_phy_probe(struct phy_device *phydev)
  1202. {
  1203. struct mtk_socphy_shared *shared;
  1204. struct mtk_socphy_priv *priv;
  1205. int err;
  1206. if (phydev->mdio.addr > 3)
  1207. return -EINVAL;
  1208. err = devm_phy_package_join(&phydev->mdio.dev, phydev, 0,
  1209. sizeof(struct mtk_socphy_shared));
  1210. if (err)
  1211. return err;
  1212. if (phy_package_probe_once(phydev)) {
  1213. err = mt7988_phy_probe_shared(phydev);
  1214. if (err)
  1215. return err;
  1216. }
  1217. shared = phydev->shared->priv;
  1218. priv = &shared->priv[phydev->mdio.addr];
  1219. phydev->priv = priv;
  1220. mt798x_phy_leds_state_init(phydev);
  1221. err = mt7988_phy_fix_leds_polarities(phydev);
  1222. if (err)
  1223. return err;
  1224. /* Disable TX power saving at probing to:
  1225. * 1. Meet common mode compliance test criteria
  1226. * 2. Make sure that TX-VCM calibration works fine
  1227. */
  1228. phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RXADC_CTRL_RG7,
  1229. MTK_PHY_DA_AD_BUF_BIAS_LP_MASK, 0x3 << 8);
  1230. return mt798x_phy_calibration(phydev);
  1231. }
  1232. static int mt7981_phy_probe(struct phy_device *phydev)
  1233. {
  1234. struct mtk_socphy_priv *priv;
  1235. priv = devm_kzalloc(&phydev->mdio.dev, sizeof(struct mtk_socphy_priv),
  1236. GFP_KERNEL);
  1237. if (!priv)
  1238. return -ENOMEM;
  1239. phydev->priv = priv;
  1240. mt798x_phy_leds_state_init(phydev);
  1241. return mt798x_phy_calibration(phydev);
  1242. }
  1243. static struct phy_driver mtk_socphy_driver[] = {
  1244. {
  1245. PHY_ID_MATCH_EXACT(MTK_GPHY_ID_MT7981),
  1246. .name = "MediaTek MT7981 PHY",
  1247. .config_init = mt798x_phy_config_init,
  1248. .config_intr = genphy_no_config_intr,
  1249. .handle_interrupt = genphy_handle_interrupt_no_ack,
  1250. .probe = mt7981_phy_probe,
  1251. .suspend = genphy_suspend,
  1252. .resume = genphy_resume,
  1253. .read_page = mtk_socphy_read_page,
  1254. .write_page = mtk_socphy_write_page,
  1255. .led_blink_set = mt798x_phy_led_blink_set,
  1256. .led_brightness_set = mt798x_phy_led_brightness_set,
  1257. .led_hw_is_supported = mt798x_phy_led_hw_is_supported,
  1258. .led_hw_control_set = mt798x_phy_led_hw_control_set,
  1259. .led_hw_control_get = mt798x_phy_led_hw_control_get,
  1260. },
  1261. {
  1262. PHY_ID_MATCH_EXACT(MTK_GPHY_ID_MT7988),
  1263. .name = "MediaTek MT7988 PHY",
  1264. .config_init = mt798x_phy_config_init,
  1265. .config_intr = genphy_no_config_intr,
  1266. .handle_interrupt = genphy_handle_interrupt_no_ack,
  1267. .probe = mt7988_phy_probe,
  1268. .suspend = genphy_suspend,
  1269. .resume = genphy_resume,
  1270. .read_page = mtk_socphy_read_page,
  1271. .write_page = mtk_socphy_write_page,
  1272. .led_blink_set = mt798x_phy_led_blink_set,
  1273. .led_brightness_set = mt798x_phy_led_brightness_set,
  1274. .led_hw_is_supported = mt798x_phy_led_hw_is_supported,
  1275. .led_hw_control_set = mt798x_phy_led_hw_control_set,
  1276. .led_hw_control_get = mt798x_phy_led_hw_control_get,
  1277. },
  1278. };
  1279. module_phy_driver(mtk_socphy_driver);
  1280. static struct mdio_device_id __maybe_unused mtk_socphy_tbl[] = {
  1281. { PHY_ID_MATCH_EXACT(MTK_GPHY_ID_MT7981) },
  1282. { PHY_ID_MATCH_EXACT(MTK_GPHY_ID_MT7988) },
  1283. { }
  1284. };
  1285. MODULE_DESCRIPTION("MediaTek SoC Gigabit Ethernet PHY driver");
  1286. MODULE_AUTHOR("Daniel Golle <daniel@makrotopia.org>");
  1287. MODULE_AUTHOR("SkyLake Huang <SkyLake.Huang@mediatek.com>");
  1288. MODULE_LICENSE("GPL");
  1289. MODULE_DEVICE_TABLE(mdio, mtk_socphy_tbl);