mtk-ge-soc.c 46 KB

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