dwmac-qcom-serdes.c 57 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /* Copyright (c) 2023-2024 Qualcomm Innovation Center, Inc. All rights reserved. */
  3. #include <linux/delay.h>
  4. #include <linux/module.h>
  5. #include <linux/debugfs.h>
  6. #include <linux/kthread.h>
  7. #include "dwmac-qcom-serdes.h"
  8. static int qcom_ethqos_serdes3_sgmii_1Gb(struct qcom_ethqos *ethqos)
  9. {
  10. int retry = 500;
  11. unsigned int val;
  12. int ret = 0;
  13. /****************MODULE: SGMII_PHY_SGMII_PCS**********************************/
  14. writel_relaxed(0x01, ethqos->sgmii_base + QSERDES3_PCS_SW_RESET);
  15. writel_relaxed(0x01, ethqos->sgmii_base + QSERDES3_PCS_POWER_DOWN_CONTROL);
  16. /***************** MODULE: QSERDES3_COM_SGMII_QMP_PLL*********/
  17. writel_relaxed(0x0F, ethqos->sgmii_base + QSERDES3_COM_PLL_IVCO);
  18. writel_relaxed(0x06, ethqos->sgmii_base + QSERDES3_COM_CP_CTRL_MODE0);
  19. writel_relaxed(0x16, ethqos->sgmii_base + QSERDES3_COM_PLL_RCTRL_MODE0);
  20. writel_relaxed(0x36, ethqos->sgmii_base + QSERDES3_COM_PLL_CCTRL_MODE0);
  21. writel_relaxed(0x1A, ethqos->sgmii_base + QSERDES3_COM_SYSCLK_EN_SEL);
  22. writel_relaxed(0x0A, ethqos->sgmii_base + QSERDES3_COM_LOCK_CMP1_MODE0);
  23. writel_relaxed(0x1A, ethqos->sgmii_base + QSERDES3_COM_LOCK_CMP2_MODE0);
  24. writel_relaxed(0x82, ethqos->sgmii_base + QSERDES3_COM_DEC_START_MODE0);
  25. writel_relaxed(0x55, ethqos->sgmii_base + QSERDES3_COM_DIV_FRAC_START1_MODE0);
  26. writel_relaxed(0x55, ethqos->sgmii_base + QSERDES3_COM_DIV_FRAC_START2_MODE0);
  27. writel_relaxed(0x03, ethqos->sgmii_base + QSERDES3_COM_DIV_FRAC_START3_MODE0);
  28. writel_relaxed(0x24, ethqos->sgmii_base + QSERDES3_COM_VCO_TUNE1_MODE0);
  29. writel_relaxed(0x02, ethqos->sgmii_base + QSERDES3_COM_VCO_TUNE2_MODE0);
  30. writel_relaxed(0x00, ethqos->sgmii_base + QSERDES3_COM_VCO_TUNE_INITVAL2);
  31. writel_relaxed(0x04, ethqos->sgmii_base + QSERDES3_COM_HSCLK_SEL);
  32. writel_relaxed(0x00, ethqos->sgmii_base + QSERDES3_COM_HSCLK_HS_SWITCH_SEL);
  33. writel_relaxed(0x0A, ethqos->sgmii_base + QSERDES3_COM_CORECLK_DIV_MODE0);
  34. writel_relaxed(0x00, ethqos->sgmii_base + QSERDES3_COM_CORE_CLK_EN);
  35. writel_relaxed(0xB9, ethqos->sgmii_base + QSERDES3_COM_BIN_VCOCAL_CMP_CODE1_MODE0);
  36. writel_relaxed(0x1E, ethqos->sgmii_base + QSERDES3_COM_BIN_VCOCAL_CMP_CODE2_MODE0);
  37. writel_relaxed(0x11, ethqos->sgmii_base + QSERDES3_COM_BIN_VCOCAL_HSCLK_SEL);
  38. /******************MODULE: QSERDES3_TX0_SGMII_QMP_TX***********************/
  39. writel_relaxed(0x05, ethqos->sgmii_base + QSERDES3_TX_TX_BAND);
  40. writel_relaxed(0x0A, ethqos->sgmii_base + QSERDES3_TX_SLEW_CNTL);
  41. writel_relaxed(0x09, ethqos->sgmii_base + QSERDES3_TX_RES_CODE_LANE_OFFSET_TX);
  42. writel_relaxed(0x09, ethqos->sgmii_base + QSERDES3_TX_RES_CODE_LANE_OFFSET_RX);
  43. writel_relaxed(0x05, ethqos->sgmii_base + QSERDES3_TX_LANE_MODE_1);
  44. writel_relaxed(0x00, ethqos->sgmii_base + QSERDES3_TX_LANE_MODE_3);
  45. writel_relaxed(0x12, ethqos->sgmii_base + QSERDES3_TX_RCV_DETECT_LVL_2);
  46. writel_relaxed(0x0C, ethqos->sgmii_base + QSERDES3_TX_TRAN_DRVR_EMP_EN);
  47. /*****************MODULE: QSERDES3_RX0_SGMII_QMP_RX*******************/
  48. writel_relaxed(0x0A, ethqos->sgmii_base + QSERDES3_RX_UCDR_FO_GAIN);
  49. writel_relaxed(0x06, ethqos->sgmii_base + QSERDES3_RX_UCDR_SO_GAIN);
  50. writel_relaxed(0x0A, ethqos->sgmii_base + QSERDES3_RX_UCDR_FASTLOCK_FO_GAIN);
  51. writel_relaxed(0x7F, ethqos->sgmii_base + QSERDES3_RX_UCDR_SO_SATURATION_AND_ENABLE);
  52. writel_relaxed(0x00, ethqos->sgmii_base + QSERDES3_RX_UCDR_FASTLOCK_COUNT_LOW);
  53. writel_relaxed(0x01, ethqos->sgmii_base + QSERDES3_RX_UCDR_FASTLOCK_COUNT_HIGH);
  54. writel_relaxed(0x81, ethqos->sgmii_base + QSERDES3_RX_UCDR_PI_CONTROLS);
  55. writel_relaxed(0x80, ethqos->sgmii_base + QSERDES3_RX_UCDR_PI_CTRL2);
  56. writel_relaxed(0x04, ethqos->sgmii_base + QSERDES3_RX_RX_TERM_BW);
  57. writel_relaxed(0x08, ethqos->sgmii_base + QSERDES3_RX_VGA_CAL_CNTRL2);
  58. writel_relaxed(0x0F, ethqos->sgmii_base + QSERDES3_RX_GM_CAL);
  59. writel_relaxed(0x04, ethqos->sgmii_base + QSERDES3_RX_RX_EQU_ADAPTOR_CNTRL1);
  60. writel_relaxed(0x00, ethqos->sgmii_base + QSERDES3_RX_RX_EQU_ADAPTOR_CNTRL2);
  61. writel_relaxed(0x4A, ethqos->sgmii_base + QSERDES3_RX_RX_EQU_ADAPTOR_CNTRL3);
  62. writel_relaxed(0x0A, ethqos->sgmii_base + QSERDES3_RX_RX_EQU_ADAPTOR_CNTRL4);
  63. writel_relaxed(0x80, ethqos->sgmii_base + QSERDES3_RX_RX_IDAC_TSETTLE_LOW);
  64. writel_relaxed(0x01, ethqos->sgmii_base + QSERDES3_RX_RX_IDAC_TSETTLE_HIGH);
  65. writel_relaxed(0x20, ethqos->sgmii_base + QSERDES3_RX_RX_IDAC_MEASURE_TIME);
  66. writel_relaxed(0x17, ethqos->sgmii_base + QSERDES3_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1);
  67. writel_relaxed(0x00, ethqos->sgmii_base + QSERDES3_RX_RX_OFFSET_ADAPTOR_CNTRL2);
  68. writel_relaxed(0x0F, ethqos->sgmii_base + QSERDES3_RX_SIGDET_CNTRL);
  69. writel_relaxed(0x1E, ethqos->sgmii_base + QSERDES3_RX_SIGDET_DEGLITCH_CNTRL);
  70. writel_relaxed(0x05, ethqos->sgmii_base + QSERDES3_RX_RX_BAND);
  71. writel_relaxed(0xE0, ethqos->sgmii_base + QSERDES3_RX_RX_MODE_00_LOW);
  72. writel_relaxed(0xC8, ethqos->sgmii_base + QSERDES3_RX_RX_MODE_00_HIGH);
  73. writel_relaxed(0xC8, ethqos->sgmii_base + QSERDES3_RX_RX_MODE_00_HIGH2);
  74. writel_relaxed(0x09, ethqos->sgmii_base + QSERDES3_RX_RX_MODE_00_HIGH3);
  75. writel_relaxed(0xB1, ethqos->sgmii_base + QSERDES3_RX_RX_MODE_00_HIGH4);
  76. writel_relaxed(0xE0, ethqos->sgmii_base + QSERDES3_RX_RX_MODE_01_LOW);
  77. writel_relaxed(0xC8, ethqos->sgmii_base + QSERDES3_RX_RX_MODE_01_HIGH);
  78. writel_relaxed(0xC8, ethqos->sgmii_base + QSERDES3_RX_RX_MODE_01_HIGH2);
  79. writel_relaxed(0x09, ethqos->sgmii_base + QSERDES3_RX_RX_MODE_01_HIGH3);
  80. writel_relaxed(0xB1, ethqos->sgmii_base + QSERDES3_RX_RX_MODE_01_HIGH4);
  81. writel_relaxed(0xE0, ethqos->sgmii_base + QSERDES3_RX_RX_MODE_10_LOW);
  82. writel_relaxed(0xC8, ethqos->sgmii_base + QSERDES3_RX_RX_MODE_10_HIGH);
  83. writel_relaxed(0xC8, ethqos->sgmii_base + QSERDES3_RX_RX_MODE_10_HIGH2);
  84. writel_relaxed(0x3B, ethqos->sgmii_base + QSERDES3_RX_RX_MODE_10_HIGH3);
  85. writel_relaxed(0xB7, ethqos->sgmii_base + QSERDES3_RX_RX_MODE_10_HIGH4);
  86. writel_relaxed(0x0C, ethqos->sgmii_base + QSERDES3_RX_DCC_CTRL1);
  87. /****************MODULE: SGMII_PHY_SGMII_PCS**********************************/
  88. writel_relaxed(0x0C, ethqos->sgmii_base + QSERDES3_PCS_LINE_RESET_TIME);
  89. writel_relaxed(0x1F, ethqos->sgmii_base + QSERDES3_PCS_TX_LARGE_AMP_DRV_LVL);
  90. writel_relaxed(0x03, ethqos->sgmii_base + QSERDES3_PCS_TX_SMALL_AMP_DRV_LVL);
  91. writel_relaxed(0x83, ethqos->sgmii_base + QSERDES3_PCS_TX_MID_TERM_CTRL1);
  92. writel_relaxed(0x08, ethqos->sgmii_base + QSERDES3_PCS_TX_MID_TERM_CTRL2);
  93. writel_relaxed(0x0C, ethqos->sgmii_base + QSERDES3_PCS_SGMII_MISC_CTRL8);
  94. writel_relaxed(0x00, ethqos->sgmii_base + QSERDES3_PCS_SW_RESET);
  95. writel_relaxed(0x01, ethqos->sgmii_base + QSERDES3_PCS_PHY_START);
  96. do {
  97. val = readl_relaxed(ethqos->sgmii_base + QSERDES3_COM_C_READY_STATUS);
  98. val &= QSERDES3_COM_C_READY;
  99. if (val)
  100. break;
  101. usleep_range(1000, 1500);
  102. retry--;
  103. } while (retry > 0);
  104. if (!retry) {
  105. ETHQOSERR("QSERDES3_COM_C_READY_STATUS timedout with retry = %d\n", retry);
  106. ret = -1;
  107. goto err_ret;
  108. }
  109. retry = 500;
  110. do {
  111. val = readl_relaxed(ethqos->sgmii_base + QSERDES3_PCS_PCS_READY_STATUS);
  112. val &= QSERDES3_PCS_READY;
  113. if (val)
  114. break;
  115. usleep_range(1000, 1500);
  116. retry--;
  117. } while (retry > 0);
  118. if (!retry) {
  119. ETHQOSERR("PCS_READY timedout with retry = %d\n", retry);
  120. ret = -1;
  121. goto err_ret;
  122. }
  123. retry = 500;
  124. do {
  125. val = readl_relaxed(ethqos->sgmii_base + QSERDES3_PCS_PCS_READY_STATUS);
  126. val &= QSERDES3_PCS_SGMIIPHY_READY;
  127. if (val)
  128. break;
  129. usleep_range(1000, 1500);
  130. retry--;
  131. } while (retry > 0);
  132. if (!retry) {
  133. ETHQOSERR("SGMIIPHY_READY timedout with retry = %d\n", retry);
  134. ret = -1;
  135. goto err_ret;
  136. }
  137. retry = 5000;
  138. do {
  139. val = readl_relaxed(ethqos->sgmii_base + QSERDES3_COM_CMN_STATUS);
  140. val &= QSERDES3_COM_C_PLL_LOCKED;
  141. if (val)
  142. break;
  143. usleep_range(1000, 1500);
  144. retry--;
  145. } while (retry > 0);
  146. if (!retry) {
  147. ETHQOSERR("PLL Lock Status timedout with retry = %d\n", retry);
  148. ret = -1;
  149. goto err_ret;
  150. }
  151. err_ret:
  152. return ret;
  153. }
  154. static int qcom_ethqos_serdes3_sgmii_2_5Gb(struct qcom_ethqos *ethqos)
  155. {
  156. int retry = 500;
  157. unsigned int val;
  158. int ret = 0;
  159. /****************MODULE: SGMII_PHY_SGMII_PCS**********************************/
  160. writel_relaxed(0x01, ethqos->sgmii_base + QSERDES3_PCS_SW_RESET);
  161. writel_relaxed(0x01, ethqos->sgmii_base + QSERDES3_PCS_POWER_DOWN_CONTROL);
  162. /***************** MODULE: QSERDES_COM_SGMII_QMP_PLL*********/
  163. writel_relaxed(0x0F, ethqos->sgmii_base + QSERDES3_COM_PLL_IVCO);
  164. writel_relaxed(0x06, ethqos->sgmii_base + QSERDES3_COM_CP_CTRL_MODE0);
  165. writel_relaxed(0x16, ethqos->sgmii_base + QSERDES3_COM_PLL_RCTRL_MODE0);
  166. writel_relaxed(0x36, ethqos->sgmii_base + QSERDES3_COM_PLL_CCTRL_MODE0);
  167. writel_relaxed(0x1A, ethqos->sgmii_base + QSERDES3_COM_SYSCLK_EN_SEL);
  168. writel_relaxed(0x1A, ethqos->sgmii_base + QSERDES3_COM_LOCK_CMP1_MODE0);
  169. writel_relaxed(0x41, ethqos->sgmii_base + QSERDES3_COM_LOCK_CMP2_MODE0);
  170. writel_relaxed(0x7A, ethqos->sgmii_base + QSERDES3_COM_DEC_START_MODE0);
  171. writel_relaxed(0x00, ethqos->sgmii_base + QSERDES3_COM_DIV_FRAC_START1_MODE0);
  172. writel_relaxed(0x20, ethqos->sgmii_base + QSERDES3_COM_DIV_FRAC_START2_MODE0);
  173. writel_relaxed(0x01, ethqos->sgmii_base + QSERDES3_COM_DIV_FRAC_START3_MODE0);
  174. writel_relaxed(0xA1, ethqos->sgmii_base + QSERDES3_COM_VCO_TUNE1_MODE0);
  175. writel_relaxed(0x02, ethqos->sgmii_base + QSERDES3_COM_VCO_TUNE2_MODE0);
  176. writel_relaxed(0x00, ethqos->sgmii_base + QSERDES3_COM_VCO_TUNE_INITVAL2);
  177. writel_relaxed(0x03, ethqos->sgmii_base + QSERDES3_COM_HSCLK_SEL);
  178. writel_relaxed(0x00, ethqos->sgmii_base + QSERDES3_COM_HSCLK_HS_SWITCH_SEL);
  179. writel_relaxed(0x05, ethqos->sgmii_base + QSERDES3_COM_CORECLK_DIV_MODE0);
  180. writel_relaxed(0x00, ethqos->sgmii_base + QSERDES3_COM_CORE_CLK_EN);
  181. writel_relaxed(0xCD, ethqos->sgmii_base + QSERDES3_COM_BIN_VCOCAL_CMP_CODE1_MODE0);
  182. writel_relaxed(0x1C, ethqos->sgmii_base + QSERDES3_COM_BIN_VCOCAL_CMP_CODE2_MODE0);
  183. writel_relaxed(0x11, ethqos->sgmii_base + QSERDES3_COM_BIN_VCOCAL_HSCLK_SEL);
  184. /******************MODULE: QSERDES_TX0_SGMII_QMP_TX***********************/
  185. writel_relaxed(0x04, ethqos->sgmii_base + QSERDES3_TX_TX_BAND);
  186. writel_relaxed(0x0A, ethqos->sgmii_base + QSERDES3_TX_SLEW_CNTL);
  187. writel_relaxed(0x09, ethqos->sgmii_base + QSERDES3_TX_RES_CODE_LANE_OFFSET_TX);
  188. writel_relaxed(0x02, ethqos->sgmii_base + QSERDES3_TX_RES_CODE_LANE_OFFSET_RX);
  189. writel_relaxed(0x05, ethqos->sgmii_base + QSERDES3_TX_LANE_MODE_1);
  190. writel_relaxed(0x00, ethqos->sgmii_base + QSERDES3_TX_LANE_MODE_3);
  191. writel_relaxed(0x12, ethqos->sgmii_base + QSERDES3_TX_RCV_DETECT_LVL_2);
  192. writel_relaxed(0x0C, ethqos->sgmii_base + QSERDES3_TX_TRAN_DRVR_EMP_EN);
  193. /*****************MODULE: QSERDES_RX0_SGMII_QMP_RX*******************/
  194. writel_relaxed(0x0A, ethqos->sgmii_base + QSERDES3_RX_UCDR_FO_GAIN);
  195. writel_relaxed(0x06, ethqos->sgmii_base + QSERDES3_RX_UCDR_SO_GAIN);
  196. writel_relaxed(0x0A, ethqos->sgmii_base + QSERDES3_RX_UCDR_FASTLOCK_FO_GAIN);
  197. writel_relaxed(0x7F, ethqos->sgmii_base + QSERDES3_RX_UCDR_SO_SATURATION_AND_ENABLE);
  198. writel_relaxed(0x00, ethqos->sgmii_base + QSERDES3_RX_UCDR_FASTLOCK_COUNT_LOW);
  199. writel_relaxed(0x01, ethqos->sgmii_base + QSERDES3_RX_UCDR_FASTLOCK_COUNT_HIGH);
  200. writel_relaxed(0x81, ethqos->sgmii_base + QSERDES3_RX_UCDR_PI_CONTROLS);
  201. writel_relaxed(0x80, ethqos->sgmii_base + QSERDES3_RX_UCDR_PI_CTRL2);
  202. writel_relaxed(0x00, ethqos->sgmii_base + QSERDES3_RX_RX_TERM_BW);
  203. writel_relaxed(0x08, ethqos->sgmii_base + QSERDES3_RX_VGA_CAL_CNTRL2);
  204. writel_relaxed(0x0F, ethqos->sgmii_base + QSERDES3_RX_GM_CAL);
  205. writel_relaxed(0x04, ethqos->sgmii_base + QSERDES3_RX_RX_EQU_ADAPTOR_CNTRL1);
  206. writel_relaxed(0x00, ethqos->sgmii_base + QSERDES3_RX_RX_EQU_ADAPTOR_CNTRL2);
  207. writel_relaxed(0x4A, ethqos->sgmii_base + QSERDES3_RX_RX_EQU_ADAPTOR_CNTRL3);
  208. writel_relaxed(0x0A, ethqos->sgmii_base + QSERDES3_RX_RX_EQU_ADAPTOR_CNTRL4);
  209. writel_relaxed(0x80, ethqos->sgmii_base + QSERDES3_RX_RX_IDAC_TSETTLE_LOW);
  210. writel_relaxed(0x01, ethqos->sgmii_base + QSERDES3_RX_RX_IDAC_TSETTLE_HIGH);
  211. writel_relaxed(0x20, ethqos->sgmii_base + QSERDES3_RX_RX_IDAC_MEASURE_TIME);
  212. writel_relaxed(0x17, ethqos->sgmii_base + QSERDES3_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1);
  213. writel_relaxed(0x00, ethqos->sgmii_base + QSERDES3_RX_RX_OFFSET_ADAPTOR_CNTRL2);
  214. writel_relaxed(0x0F, ethqos->sgmii_base + QSERDES3_RX_SIGDET_CNTRL);
  215. writel_relaxed(0x1E, ethqos->sgmii_base + QSERDES3_RX_SIGDET_DEGLITCH_CNTRL);
  216. writel_relaxed(0x18, ethqos->sgmii_base + QSERDES3_RX_RX_BAND);
  217. writel_relaxed(0x18, ethqos->sgmii_base + QSERDES3_RX_RX_MODE_00_LOW);
  218. writel_relaxed(0xC8, ethqos->sgmii_base + QSERDES3_RX_RX_MODE_00_HIGH);
  219. writel_relaxed(0xC8, ethqos->sgmii_base + QSERDES3_RX_RX_MODE_00_HIGH2);
  220. writel_relaxed(0x0C, ethqos->sgmii_base + QSERDES3_RX_RX_MODE_00_HIGH3);
  221. writel_relaxed(0xB8, ethqos->sgmii_base + QSERDES3_RX_RX_MODE_00_HIGH4);
  222. writel_relaxed(0xE0, ethqos->sgmii_base + QSERDES3_RX_RX_MODE_01_LOW);
  223. writel_relaxed(0xC8, ethqos->sgmii_base + QSERDES3_RX_RX_MODE_01_HIGH);
  224. writel_relaxed(0xC8, ethqos->sgmii_base + QSERDES3_RX_RX_MODE_01_HIGH2);
  225. writel_relaxed(0x09, ethqos->sgmii_base + QSERDES3_RX_RX_MODE_01_HIGH3);
  226. writel_relaxed(0xB1, ethqos->sgmii_base + QSERDES3_RX_RX_MODE_01_HIGH4);
  227. writel_relaxed(0xE0, ethqos->sgmii_base + QSERDES3_RX_RX_MODE_10_LOW);
  228. writel_relaxed(0xC8, ethqos->sgmii_base + QSERDES3_RX_RX_MODE_10_HIGH);
  229. writel_relaxed(0xC8, ethqos->sgmii_base + QSERDES3_RX_RX_MODE_10_HIGH2);
  230. writel_relaxed(0x3B, ethqos->sgmii_base + QSERDES3_RX_RX_MODE_10_HIGH3);
  231. writel_relaxed(0xB7, ethqos->sgmii_base + QSERDES3_RX_RX_MODE_10_HIGH4);
  232. writel_relaxed(0x0C, ethqos->sgmii_base + QSERDES3_RX_DCC_CTRL1);
  233. /****************MODULE: SGMII_PHY_SGMII_PCS**********************************/
  234. writel_relaxed(0x0C, ethqos->sgmii_base + QSERDES3_PCS_LINE_RESET_TIME);
  235. writel_relaxed(0x1F, ethqos->sgmii_base + QSERDES3_PCS_TX_LARGE_AMP_DRV_LVL);
  236. writel_relaxed(0x03, ethqos->sgmii_base + QSERDES3_PCS_TX_SMALL_AMP_DRV_LVL);
  237. writel_relaxed(0x83, ethqos->sgmii_base + QSERDES3_PCS_TX_MID_TERM_CTRL1);
  238. writel_relaxed(0x08, ethqos->sgmii_base + QSERDES3_PCS_TX_MID_TERM_CTRL2);
  239. writel_relaxed(0x8C, ethqos->sgmii_base + QSERDES3_PCS_SGMII_MISC_CTRL8);
  240. writel_relaxed(0x00, ethqos->sgmii_base + QSERDES3_PCS_SW_RESET);
  241. writel_relaxed(0x01, ethqos->sgmii_base + QSERDES3_PCS_PHY_START);
  242. do {
  243. val = readl_relaxed(ethqos->sgmii_base + QSERDES3_COM_C_READY_STATUS);
  244. val &= QSERDES3_COM_C_READY;
  245. if (val)
  246. break;
  247. usleep_range(1000, 1500);
  248. retry--;
  249. } while (retry > 0);
  250. if (!retry) {
  251. ETHQOSERR("QSERDES3_COM_C_READY_STATUS timedout with retry = %d\n", retry);
  252. ret = -1;
  253. goto err_ret;
  254. }
  255. retry = 500;
  256. do {
  257. val = readl_relaxed(ethqos->sgmii_base + QSERDES3_PCS_PCS_READY_STATUS);
  258. val &= QSERDES3_PCS_READY;
  259. if (val)
  260. break;
  261. usleep_range(1000, 1500);
  262. retry--;
  263. } while (retry > 0);
  264. if (!retry) {
  265. ETHQOSERR("PCS_READY timedout with retry = %d\n", retry);
  266. ret = -1;
  267. goto err_ret;
  268. }
  269. retry = 500;
  270. do {
  271. val = readl_relaxed(ethqos->sgmii_base + QSERDES3_PCS_PCS_READY_STATUS);
  272. val &= QSERDES3_PCS_SGMIIPHY_READY;
  273. if (val)
  274. break;
  275. usleep_range(1000, 1500);
  276. retry--;
  277. } while (retry > 0);
  278. if (!retry) {
  279. ETHQOSERR("SGMIIPHY_READY timedout with retry = %d\n", retry);
  280. ret = -1;
  281. goto err_ret;
  282. }
  283. retry = 5000;
  284. do {
  285. val = readl_relaxed(ethqos->sgmii_base + QSERDES3_COM_CMN_STATUS);
  286. val &= QSERDES3_COM_C_PLL_LOCKED;
  287. if (val)
  288. break;
  289. usleep_range(1000, 1500);
  290. retry--;
  291. } while (retry > 0);
  292. if (!retry) {
  293. ETHQOSERR("PLL Lock Status timedout with retry = %d\n", retry);
  294. ret = -1;
  295. goto err_ret;
  296. }
  297. err_ret:
  298. return ret;
  299. }
  300. static int qcom_ethqos_serdes_sgmii_1Gb(struct qcom_ethqos *ethqos)
  301. {
  302. int ret = 0;
  303. int retry = 5000;
  304. unsigned int val;
  305. if (ethqos->emac_ver == EMAC_HW_v3_1_0)
  306. return qcom_ethqos_serdes3_sgmii_1Gb(ethqos);
  307. /****************MODULE: SGMII_PHY_SGMII_PCS**********************************/
  308. writel_relaxed(0x01, ethqos->sgmii_base + SGMII_PHY_PCS_SW_RESET);
  309. msleep(50);
  310. writel_relaxed(0x01, ethqos->sgmii_base + SGMII_PHY_PCS_POWER_DOWN_CONTROL);
  311. /***************** MODULE: QSERDES_COM_SGMII_QMP_PLL*********/
  312. writel_relaxed(0x0E, ethqos->sgmii_base + SGMII_PHY_0_QSERDES_COM_BG_TIMER);
  313. writel_relaxed(0x0F, ethqos->sgmii_base + SGMII_PHY_0_QSERDES_COM_PLL_IVCO);
  314. writel_relaxed(0x06, ethqos->sgmii_base + QSERDES_COM_CP_CTRL_MODE0);
  315. writel_relaxed(0x16, ethqos->sgmii_base + QSERDES_COM_PLL_RCTRL_MODE0);
  316. writel_relaxed(0x36, ethqos->sgmii_base + QSERDES_COM_PLL_CCTRL_MODE0);
  317. writel_relaxed(0x1A, ethqos->sgmii_base + QSERDES_COM_SYSCLK_EN_SEL);
  318. writel_relaxed(0x0A, ethqos->sgmii_base + QSERDES_COM_LOCK_CMP1_MODE0);
  319. writel_relaxed(0x1A, ethqos->sgmii_base + QSERDES_COM_LOCK_CMP2_MODE0);
  320. writel_relaxed(0x82, ethqos->sgmii_base + QSERDES_COM_DEC_START_MODE0);
  321. writel_relaxed(0x55, ethqos->sgmii_base + QSERDES_COM_DIV_FRAC_START1_MODE0);
  322. writel_relaxed(0x55, ethqos->sgmii_base + QSERDES_COM_DIV_FRAC_START2_MODE0);
  323. writel_relaxed(0x03, ethqos->sgmii_base + QSERDES_COM_DIV_FRAC_START3_MODE0);
  324. writel_relaxed(0x84, ethqos->sgmii_base + QSERDES_COM_VCO_TUNE1_MODE0);
  325. writel_relaxed(0x01, ethqos->sgmii_base + QSERDES_COM_VCO_TUNE2_MODE0);
  326. writel_relaxed(0x00, ethqos->sgmii_base + QSERDES_COM_VCO_TUNE_INITVAL2);
  327. writel_relaxed(0x04, ethqos->sgmii_base + QSERDES_COM_HSCLK_SEL_1);
  328. writel_relaxed(0x00, ethqos->sgmii_base + QSERDES_COM_HSCLK_HS_SWITCH_SEL_1);
  329. writel_relaxed(0x0A, ethqos->sgmii_base + QSERDES_COM_CORECLK_DIV_MODE0);
  330. writel_relaxed(0x00, ethqos->sgmii_base + QSERDES_COM_CORE_CLK_EN);
  331. writel_relaxed(0x16, ethqos->sgmii_base + QSERDES_COM_CMN_CONFIG_1);
  332. writel_relaxed(0xB9, ethqos->sgmii_base + QSERDES_COM_BIN_VCOCAL_CMP_CODE1_MODE0);
  333. writel_relaxed(0x1E, ethqos->sgmii_base + QSERDES_COM_BIN_VCOCAL_CMP_CODE2_MODE0);
  334. writel_relaxed(0x11, ethqos->sgmii_base + QSERDES_COM_BIN_VCOCAL_HSCLK_SEL_1);
  335. /******************MODULE: QSERDES_TX0_SGMII_QMP_TX***********************/
  336. writel_relaxed(0x05, ethqos->sgmii_base + QSERDES_TX0_TX_BAND);
  337. writel_relaxed(0x0A, ethqos->sgmii_base + QSERDES_TX0_SLEW_CNTL);
  338. writel_relaxed(0x09, ethqos->sgmii_base + QSERDES_TX0_RES_CODE_LANE_OFFSET_TX);
  339. writel_relaxed(0x09, ethqos->sgmii_base + QSERDES_TX0_RES_CODE_LANE_OFFSET_RX);
  340. writel_relaxed(0x05, ethqos->sgmii_base + QSERDES_TX0_LANE_MODE_1);
  341. writel_relaxed(0x02, ethqos->sgmii_base + QSERDES_TX0_LANE_MODE_2);
  342. writel_relaxed(0x00, ethqos->sgmii_base + QSERDES_TX0_LANE_MODE_3);
  343. writel_relaxed(0x12, ethqos->sgmii_base + QSERDES_TX0_RCV_DETECT_LVL_2);
  344. writel_relaxed(0x1F, ethqos->sgmii_base + QSERDES_TX_TX_DRV_LVL);
  345. writel_relaxed(0x0C, ethqos->sgmii_base + QSERDES_TX_TX_EMP_POST1_LVL);
  346. writel_relaxed(0x0C, ethqos->sgmii_base + QSERDES_TX0_TRAN_DRVR_EMP_EN);
  347. /*****************MODULE: QSERDES_RX0_SGMII_QMP_RX*******************/
  348. writel_relaxed(0x0A, ethqos->sgmii_base + QSERDES_RX0_UCDR_FO_GAIN);
  349. writel_relaxed(0x06, ethqos->sgmii_base + QSERDES_RX0_UCDR_SO_GAIN);
  350. writel_relaxed(0x0A, ethqos->sgmii_base + QSERDES_RX0_UCDR_FASTLOCK_FO_GAIN);
  351. writel_relaxed(0x7F, ethqos->sgmii_base + QSERDES_RX0_UCDR_SO_SATURATION_AND_ENABLE);
  352. writel_relaxed(0x00, ethqos->sgmii_base + QSERDES_RX0_UCDR_FASTLOCK_COUNT_LOW);
  353. writel_relaxed(0x01, ethqos->sgmii_base + QSERDES_RX0_UCDR_FASTLOCK_COUNT_HIGH);
  354. writel_relaxed(0x81, ethqos->sgmii_base + QSERDES_RX0_UCDR_PI_CONTROLS);
  355. writel_relaxed(0x80, ethqos->sgmii_base + QSERDES_RX0_UCDR_PI_CTRL2);
  356. writel_relaxed(0x00, ethqos->sgmii_base + QSERDES_RX0_RX_TERM_BW);
  357. writel_relaxed(0x08, ethqos->sgmii_base + QSERDES_RX0_VGA_CAL_CNTRL2);
  358. writel_relaxed(0x0F, ethqos->sgmii_base + QSERDES_RX0_GM_CAL);
  359. writel_relaxed(0x04, ethqos->sgmii_base + QSERDES_RX0_RX_EQU_ADAPTOR_CNTRL1);
  360. writel_relaxed(0x00, ethqos->sgmii_base + QSERDES_RX0_RX_EQU_ADAPTOR_CNTRL2);
  361. writel_relaxed(0x4A, ethqos->sgmii_base + QSERDES_RX0_RX_EQU_ADAPTOR_CNTRL3);
  362. writel_relaxed(0x0A, ethqos->sgmii_base + QSERDES_RX0_RX_EQU_ADAPTOR_CNTRL4);
  363. writel_relaxed(0x80, ethqos->sgmii_base + QSERDES_RX0_RX_IDAC_TSETTLE_LOW);
  364. writel_relaxed(0x01, ethqos->sgmii_base + QSERDES_RX0_RX_IDAC_TSETTLE_HIGH);
  365. writel_relaxed(0x20, ethqos->sgmii_base + QSERDES_RX0_RX_IDAC_MEASURE_TIME);
  366. writel_relaxed(0x17, ethqos->sgmii_base + QSERDES_RX0_RX_EQ_OFFSET_ADAPTOR_CNTRL1);
  367. writel_relaxed(0x00, ethqos->sgmii_base + QSERDES_RX0_RX_OFFSET_ADAPTOR_CNTRL2);
  368. writel_relaxed(0x0F, ethqos->sgmii_base + QSERDES_RX0_SIGDET_CNTRL);
  369. writel_relaxed(0x1E, ethqos->sgmii_base + QSERDES_RX0_SIGDET_DEGLITCH_CNTRL);
  370. writel_relaxed(0x05, ethqos->sgmii_base + QSERDES_RX0_RX_BAND);
  371. writel_relaxed(0x18, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_00_LOW);
  372. writel_relaxed(0xC8, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_00_HIGH);
  373. writel_relaxed(0xC8, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_00_HIGH2);
  374. writel_relaxed(0x0C, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_00_HIGH3);
  375. writel_relaxed(0xB8, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_00_HIGH4);
  376. writel_relaxed(0xE0, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_01_LOW);
  377. writel_relaxed(0xC8, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_01_HIGH);
  378. writel_relaxed(0xC8, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_01_HIGH2);
  379. writel_relaxed(0x09, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_01_HIGH3);
  380. writel_relaxed(0xB1, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_01_HIGH4);
  381. writel_relaxed(0xE0, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_10_LOW);
  382. writel_relaxed(0xC8, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_10_HIGH);
  383. writel_relaxed(0xC8, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_10_HIGH2);
  384. writel_relaxed(0x3B, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_10_HIGH3);
  385. writel_relaxed(0xB7, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_10_HIGH4);
  386. writel_relaxed(0x0C, ethqos->sgmii_base + QSERDES_RX0_DCC_CTRL1);
  387. /****************MODULE: SGMII_PHY_SGMII_PCS**********************************/
  388. writel_relaxed(0x0C, ethqos->sgmii_base + SGMII_PHY_PCS_LINE_RESET_TIME);
  389. writel_relaxed(0x03, ethqos->sgmii_base + SGMII_PHY_PCS_TX_SMALL_AMP_DRV_LVL);
  390. writel_relaxed(0x1F, ethqos->sgmii_base + SGMII_PHY_PCS_TX_LARGE_AMP_DRV_LVL);
  391. writel_relaxed(0x83, ethqos->sgmii_base + SGMII_PHY_PCS_TX_MID_TERM_CTRL1);
  392. writel_relaxed(0x08, ethqos->sgmii_base + SGMII_PHY_PCS_TX_MID_TERM_CTRL2);
  393. writel_relaxed(0x00, ethqos->sgmii_base + QSERDES_RX0_SIGDET_CAL_CTRL1);
  394. writel_relaxed(0x00, ethqos->sgmii_base + QSERDES_RX0_SIGDET_CAL_CTRL2_AND_CDR_LOCK_EDGE);
  395. writel_relaxed(0x00, ethqos->sgmii_base + SGMII_PHY_PCS_SGMII_MISC_CTRL7);
  396. writel_relaxed(0x0C, ethqos->sgmii_base + SGMII_PHY_PCS_SGMII_MISC_CTRL8);
  397. writel_relaxed(0x00, ethqos->sgmii_base + SGMII_PHY_PCS_SW_RESET);
  398. msleep(220);
  399. writel_relaxed(0x01, ethqos->sgmii_base + SGMII_PHY_PCS_PHY_START);
  400. msleep(220);
  401. do {
  402. val = readl_relaxed(ethqos->sgmii_base + QSERDES_COM_CMN_STATUS);
  403. val &= BIT(1);
  404. if (val)
  405. break;
  406. usleep_range(1000, 1500);
  407. retry--;
  408. } while (retry > 0);
  409. if (!retry) {
  410. ETHQOSERR(" %s : PLL Lock Status timedout with retry = %d\n",
  411. __func__,
  412. retry);
  413. ret = -1;
  414. goto err_ret;
  415. }
  416. retry = 500;
  417. do {
  418. val = readl_relaxed(ethqos->sgmii_base + QSERDES_COM_C_READY_STATUS);
  419. val &= BIT(0);
  420. if (val)
  421. break;
  422. usleep_range(1000, 1500);
  423. retry--;
  424. } while (retry > 0);
  425. if (!retry) {
  426. ETHQOSERR("%s : C_READY_STATUS timedout with retry = %d\n",
  427. __func__,
  428. retry);
  429. ret = -1;
  430. goto err_ret;
  431. }
  432. retry = 500;
  433. do {
  434. val = readl_relaxed(ethqos->sgmii_base + SGMII_PHY_PCS_READY_STATUS);
  435. val &= BIT(7);
  436. if (val)
  437. break;
  438. usleep_range(1000, 1500);
  439. retry--;
  440. } while (retry > 0);
  441. if (!retry) {
  442. ETHQOSERR("%s : PCS_READY timedout with retry = %d\n",
  443. __func__,
  444. retry);
  445. ret = -1;
  446. goto err_ret;
  447. }
  448. retry = 500;
  449. do {
  450. val = readl_relaxed(ethqos->sgmii_base + SGMII_PHY_PCS_READY_STATUS);
  451. val &= BIT(0);
  452. if (val)
  453. break;
  454. usleep_range(1000, 1500);
  455. retry--;
  456. } while (retry > 0);
  457. if (!retry) {
  458. ETHQOSERR("%s : SGMIIPHY_READY timedout with retry = %d\n",
  459. __func__,
  460. retry);
  461. ret = -1;
  462. goto err_ret;
  463. }
  464. return ret;
  465. err_ret:
  466. return ret;
  467. }
  468. static int qcom_ethqos_serdes_sgmii_25Gb(struct qcom_ethqos *ethqos)
  469. {
  470. int ret = 0;
  471. int retry = 5000;
  472. unsigned int val;
  473. if (ethqos->emac_ver == EMAC_HW_v3_1_0)
  474. return qcom_ethqos_serdes3_sgmii_2_5Gb(ethqos);
  475. /****************MODULE: SGMII_PHY_SGMII_PCS**********************************/
  476. writel_relaxed(0x01, ethqos->sgmii_base + SGMII_PHY_PCS_SW_RESET);
  477. msleep(220);
  478. writel_relaxed(0x01, ethqos->sgmii_base + SGMII_PHY_PCS_POWER_DOWN_CONTROL);
  479. /***************** MODULE: QSERDES_COM_SGMII_QMP_PLL*********/
  480. writel_relaxed(0x0E, ethqos->sgmii_base + SGMII_PHY_0_QSERDES_COM_BG_TIMER);
  481. writel_relaxed(0x0F, ethqos->sgmii_base + SGMII_PHY_0_QSERDES_COM_PLL_IVCO);
  482. writel_relaxed(0x06, ethqos->sgmii_base + QSERDES_COM_CP_CTRL_MODE0);
  483. writel_relaxed(0x16, ethqos->sgmii_base + QSERDES_COM_PLL_RCTRL_MODE0);
  484. writel_relaxed(0x36, ethqos->sgmii_base + QSERDES_COM_PLL_CCTRL_MODE0);
  485. writel_relaxed(0x1A, ethqos->sgmii_base + QSERDES_COM_SYSCLK_EN_SEL);
  486. writel_relaxed(0x1A, ethqos->sgmii_base + QSERDES_COM_LOCK_CMP1_MODE0);
  487. writel_relaxed(0x41, ethqos->sgmii_base + QSERDES_COM_LOCK_CMP2_MODE0);
  488. writel_relaxed(0x7A, ethqos->sgmii_base + QSERDES_COM_DEC_START_MODE0);
  489. writel_relaxed(0x00, ethqos->sgmii_base + QSERDES_COM_DIV_FRAC_START1_MODE0);
  490. writel_relaxed(0x20, ethqos->sgmii_base + QSERDES_COM_DIV_FRAC_START2_MODE0);
  491. writel_relaxed(0x01, ethqos->sgmii_base + QSERDES_COM_DIV_FRAC_START3_MODE0);
  492. writel_relaxed(0x01, ethqos->sgmii_base + QSERDES_COM_VCO_TUNE1_MODE0);
  493. writel_relaxed(0x02, ethqos->sgmii_base + QSERDES_COM_VCO_TUNE2_MODE0);
  494. writel_relaxed(0x00, ethqos->sgmii_base + QSERDES_COM_VCO_TUNE_INITVAL2);
  495. writel_relaxed(0x03, ethqos->sgmii_base + QSERDES_COM_HSCLK_SEL_1);
  496. writel_relaxed(0x00, ethqos->sgmii_base + QSERDES_COM_HSCLK_HS_SWITCH_SEL_1);
  497. writel_relaxed(0x05, ethqos->sgmii_base + QSERDES_COM_CORECLK_DIV_MODE0);
  498. writel_relaxed(0x00, ethqos->sgmii_base + QSERDES_COM_CORE_CLK_EN);
  499. writel_relaxed(0x16, ethqos->sgmii_base + QSERDES_COM_CMN_CONFIG_1);
  500. writel_relaxed(0xCD, ethqos->sgmii_base + QSERDES_COM_BIN_VCOCAL_CMP_CODE1_MODE0);
  501. writel_relaxed(0x1C, ethqos->sgmii_base + QSERDES_COM_BIN_VCOCAL_CMP_CODE2_MODE0);
  502. writel_relaxed(0x11, ethqos->sgmii_base + QSERDES_COM_BIN_VCOCAL_HSCLK_SEL_1);
  503. /******************MODULE: QSERDES_TX0_SGMII_QMP_TX***********************/
  504. writel_relaxed(0x04, ethqos->sgmii_base + QSERDES_TX0_TX_BAND);
  505. writel_relaxed(0x0A, ethqos->sgmii_base + QSERDES_TX0_SLEW_CNTL);
  506. writel_relaxed(0x09, ethqos->sgmii_base + QSERDES_TX0_RES_CODE_LANE_OFFSET_TX);
  507. writel_relaxed(0x09, ethqos->sgmii_base + QSERDES_TX0_RES_CODE_LANE_OFFSET_RX);
  508. writel_relaxed(0x05, ethqos->sgmii_base + QSERDES_TX0_LANE_MODE_1);
  509. writel_relaxed(0x02, ethqos->sgmii_base + QSERDES_TX0_LANE_MODE_2);
  510. writel_relaxed(0x00, ethqos->sgmii_base + QSERDES_TX0_LANE_MODE_3);
  511. writel_relaxed(0x12, ethqos->sgmii_base + QSERDES_TX0_RCV_DETECT_LVL_2);
  512. writel_relaxed(0x0C, ethqos->sgmii_base + QSERDES_TX0_TRAN_DRVR_EMP_EN);
  513. /*****************MODULE: QSERDES_RX0_SGMII_QMP_RX*******************/
  514. writel_relaxed(0x0A, ethqos->sgmii_base + QSERDES_RX0_UCDR_FO_GAIN);
  515. writel_relaxed(0x06, ethqos->sgmii_base + QSERDES_RX0_UCDR_SO_GAIN);
  516. writel_relaxed(0x0A, ethqos->sgmii_base + QSERDES_RX0_UCDR_FASTLOCK_FO_GAIN);
  517. writel_relaxed(0x7F, ethqos->sgmii_base + QSERDES_RX0_UCDR_SO_SATURATION_AND_ENABLE);
  518. writel_relaxed(0x00, ethqos->sgmii_base + QSERDES_RX0_UCDR_FASTLOCK_COUNT_LOW);
  519. writel_relaxed(0x01, ethqos->sgmii_base + QSERDES_RX0_UCDR_FASTLOCK_COUNT_HIGH);
  520. writel_relaxed(0x81, ethqos->sgmii_base + QSERDES_RX0_UCDR_PI_CONTROLS);
  521. writel_relaxed(0x80, ethqos->sgmii_base + QSERDES_RX0_UCDR_PI_CTRL2);
  522. writel_relaxed(0x00, ethqos->sgmii_base + QSERDES_RX0_RX_TERM_BW);
  523. writel_relaxed(0x08, ethqos->sgmii_base + QSERDES_RX0_VGA_CAL_CNTRL2);
  524. writel_relaxed(0x0F, ethqos->sgmii_base + QSERDES_RX0_GM_CAL);
  525. writel_relaxed(0x04, ethqos->sgmii_base + QSERDES_RX0_RX_EQU_ADAPTOR_CNTRL1);
  526. writel_relaxed(0x00, ethqos->sgmii_base + QSERDES_RX0_RX_EQU_ADAPTOR_CNTRL2);
  527. writel_relaxed(0x4A, ethqos->sgmii_base + QSERDES_RX0_RX_EQU_ADAPTOR_CNTRL3);
  528. writel_relaxed(0x0A, ethqos->sgmii_base + QSERDES_RX0_RX_EQU_ADAPTOR_CNTRL4);
  529. writel_relaxed(0x80, ethqos->sgmii_base + QSERDES_RX0_RX_IDAC_TSETTLE_LOW);
  530. writel_relaxed(0x01, ethqos->sgmii_base + QSERDES_RX0_RX_IDAC_TSETTLE_HIGH);
  531. writel_relaxed(0x20, ethqos->sgmii_base + QSERDES_RX0_RX_IDAC_MEASURE_TIME);
  532. writel_relaxed(0x17, ethqos->sgmii_base + QSERDES_RX0_RX_EQ_OFFSET_ADAPTOR_CNTRL1);
  533. writel_relaxed(0x00, ethqos->sgmii_base + QSERDES_RX0_RX_OFFSET_ADAPTOR_CNTRL2);
  534. writel_relaxed(0x0F, ethqos->sgmii_base + QSERDES_RX0_SIGDET_CNTRL);
  535. writel_relaxed(0x1E, ethqos->sgmii_base + QSERDES_RX0_SIGDET_DEGLITCH_CNTRL);
  536. writel_relaxed(0x18, ethqos->sgmii_base + QSERDES_RX0_RX_BAND);
  537. writel_relaxed(0x18, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_00_LOW);
  538. writel_relaxed(0xC8, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_00_HIGH);
  539. writel_relaxed(0xC8, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_00_HIGH2);
  540. writel_relaxed(0x0C, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_00_HIGH3);
  541. writel_relaxed(0xB8, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_00_HIGH4);
  542. writel_relaxed(0xE0, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_01_LOW);
  543. writel_relaxed(0xC8, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_01_HIGH);
  544. writel_relaxed(0xC8, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_01_HIGH2);
  545. writel_relaxed(0x09, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_01_HIGH3);
  546. writel_relaxed(0xB1, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_01_HIGH4);
  547. writel_relaxed(0xE0, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_10_LOW);
  548. writel_relaxed(0xC8, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_10_HIGH);
  549. writel_relaxed(0xC8, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_10_HIGH2);
  550. writel_relaxed(0x3B, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_10_HIGH3);
  551. writel_relaxed(0xB7, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_10_HIGH4);
  552. writel_relaxed(0x0C, ethqos->sgmii_base + QSERDES_RX0_DCC_CTRL1);
  553. /****************MODULE: SGMII_PHY_SGMII_PCS**********************************/
  554. writel_relaxed(0x0C, ethqos->sgmii_base + SGMII_PHY_PCS_LINE_RESET_TIME);
  555. writel_relaxed(0x03, ethqos->sgmii_base + SGMII_PHY_PCS_TX_SMALL_AMP_DRV_LVL);
  556. writel_relaxed(0x1F, ethqos->sgmii_base + SGMII_PHY_PCS_TX_LARGE_AMP_DRV_LVL);
  557. writel_relaxed(0x83, ethqos->sgmii_base + SGMII_PHY_PCS_TX_MID_TERM_CTRL1);
  558. writel_relaxed(0x08, ethqos->sgmii_base + SGMII_PHY_PCS_TX_MID_TERM_CTRL2);
  559. writel_relaxed(0x00, ethqos->sgmii_base + QSERDES_RX0_SIGDET_CAL_CTRL1);
  560. writel_relaxed(0x00, ethqos->sgmii_base + QSERDES_RX0_SIGDET_CAL_CTRL2_AND_CDR_LOCK_EDGE);
  561. writel_relaxed(0x00, ethqos->sgmii_base + SGMII_PHY_PCS_SGMII_MISC_CTRL7);
  562. writel_relaxed(0x8c, ethqos->sgmii_base + SGMII_PHY_PCS_SGMII_MISC_CTRL8);
  563. writel_relaxed(0x00, ethqos->sgmii_base + SGMII_PHY_PCS_SW_RESET);
  564. msleep(220);
  565. writel_relaxed(0x01, ethqos->sgmii_base + SGMII_PHY_PCS_PHY_START);
  566. msleep(220);
  567. do {
  568. val = readl_relaxed(ethqos->sgmii_base + QSERDES_COM_CMN_STATUS);
  569. val &= BIT(1);
  570. if (val)
  571. break;
  572. usleep_range(1000, 1500);
  573. retry--;
  574. } while (retry > 0);
  575. if (!retry) {
  576. ETHQOSERR("%s : PLL Lock Status timedout with retry = %d\n",
  577. __func__,
  578. retry);
  579. ret = -1;
  580. goto err_ret;
  581. }
  582. retry = 500;
  583. do {
  584. val = readl_relaxed(ethqos->sgmii_base + QSERDES_COM_C_READY_STATUS);
  585. val &= BIT(0);
  586. if (val)
  587. break;
  588. usleep_range(1000, 1500);
  589. retry--;
  590. } while (retry > 0);
  591. if (!retry) {
  592. ETHQOSERR("%s : C_READY_STATUS timedout with retry = %d\n",
  593. __func__,
  594. retry);
  595. ret = -1;
  596. goto err_ret;
  597. }
  598. retry = 500;
  599. do {
  600. val = readl_relaxed(ethqos->sgmii_base + SGMII_PHY_PCS_READY_STATUS);
  601. val &= BIT(7);
  602. if (val)
  603. break;
  604. usleep_range(1000, 1500);
  605. retry--;
  606. } while (retry > 0);
  607. if (!retry) {
  608. ETHQOSERR("%s : PCS_READY timedout with retry = %d\n",
  609. __func__,
  610. retry);
  611. ret = -1;
  612. goto err_ret;
  613. }
  614. retry = 500;
  615. do {
  616. val = readl_relaxed(ethqos->sgmii_base + SGMII_PHY_PCS_READY_STATUS);
  617. val &= BIT(0);
  618. if (val)
  619. break;
  620. usleep_range(1000, 1500);
  621. retry--;
  622. } while (retry > 0);
  623. if (!retry) {
  624. ETHQOSERR("%s : SGMIIPHY_READY timedout with retry = %d\n",
  625. __func__,
  626. retry);
  627. ret = -1;
  628. goto err_ret;
  629. }
  630. return ret;
  631. err_ret:
  632. return ret;
  633. }
  634. static int qcom_ethqos_serdes_usxgmii_25Gb(struct qcom_ethqos *ethqos)
  635. {
  636. int ret = 0;
  637. int retry = 5000;
  638. unsigned int val;
  639. /****************MODULE: SGMII_PHY_SGMII_PCS**********************************/
  640. writel_relaxed(0x01, ethqos->sgmii_base + SGMII_PHY_PCS_SW_RESET);
  641. writel_relaxed(0x01, ethqos->sgmii_base + SGMII_PHY_PCS_POWER_DOWN_CONTROL);
  642. /***************** MODULE: QSERDES_COM_SGMII_QMP_PLL*********/
  643. writel_relaxed(0x0E, ethqos->sgmii_base + SGMII_PHY_0_QSERDES_COM_BG_TIMER);
  644. writel_relaxed(0x0F, ethqos->sgmii_base + SGMII_PHY_0_QSERDES_COM_PLL_IVCO);
  645. writel_relaxed(0x06, ethqos->sgmii_base + QSERDES_COM_CP_CTRL_MODE0);
  646. writel_relaxed(0x16, ethqos->sgmii_base + QSERDES_COM_PLL_RCTRL_MODE0);
  647. writel_relaxed(0x36, ethqos->sgmii_base + QSERDES_COM_PLL_CCTRL_MODE0);
  648. writel_relaxed(0x1A, ethqos->sgmii_base + QSERDES_COM_SYSCLK_EN_SEL);
  649. writel_relaxed(0x1A, ethqos->sgmii_base + QSERDES_COM_LOCK_CMP1_MODE0);
  650. writel_relaxed(0x41, ethqos->sgmii_base + QSERDES_COM_LOCK_CMP2_MODE0);
  651. writel_relaxed(0x7A, ethqos->sgmii_base + QSERDES_COM_DEC_START_MODE0);
  652. writel_relaxed(0x00, ethqos->sgmii_base + QSERDES_COM_DIV_FRAC_START1_MODE0);
  653. writel_relaxed(0x20, ethqos->sgmii_base + QSERDES_COM_DIV_FRAC_START2_MODE0);
  654. writel_relaxed(0x01, ethqos->sgmii_base + QSERDES_COM_DIV_FRAC_START3_MODE0);
  655. writel_relaxed(0x01, ethqos->sgmii_base + QSERDES_COM_VCO_TUNE1_MODE0);
  656. writel_relaxed(0x02, ethqos->sgmii_base + QSERDES_COM_VCO_TUNE2_MODE0);
  657. writel_relaxed(0x00, ethqos->sgmii_base + QSERDES_COM_VCO_TUNE_INITVAL2);
  658. writel_relaxed(0x03, ethqos->sgmii_base + QSERDES_COM_HSCLK_SEL_1);
  659. writel_relaxed(0x00, ethqos->sgmii_base + QSERDES_COM_HSCLK_HS_SWITCH_SEL_1);
  660. writel_relaxed(0x05, ethqos->sgmii_base + QSERDES_COM_CORECLK_DIV_MODE0);
  661. writel_relaxed(0x00, ethqos->sgmii_base + QSERDES_COM_CORE_CLK_EN);
  662. writel_relaxed(0x16, ethqos->sgmii_base + QSERDES_COM_CMN_CONFIG_1);
  663. writel_relaxed(0xCD, ethqos->sgmii_base + QSERDES_COM_BIN_VCOCAL_CMP_CODE1_MODE0);
  664. writel_relaxed(0x1C, ethqos->sgmii_base + QSERDES_COM_BIN_VCOCAL_CMP_CODE2_MODE0);
  665. writel_relaxed(0x11, ethqos->sgmii_base + QSERDES_COM_BIN_VCOCAL_HSCLK_SEL_1);
  666. /******************MODULE: QSERDES_TX0_SGMII_QMP_TX***********************/
  667. writel_relaxed(0x04, ethqos->sgmii_base + QSERDES_TX0_TX_BAND);
  668. writel_relaxed(0x0A, ethqos->sgmii_base + QSERDES_TX0_SLEW_CNTL);
  669. writel_relaxed(0x09, ethqos->sgmii_base + QSERDES_TX0_RES_CODE_LANE_OFFSET_TX);
  670. writel_relaxed(0x09, ethqos->sgmii_base + QSERDES_TX0_RES_CODE_LANE_OFFSET_RX);
  671. writel_relaxed(0x05, ethqos->sgmii_base + QSERDES_TX0_LANE_MODE_1);
  672. writel_relaxed(0x02, ethqos->sgmii_base + QSERDES_TX0_LANE_MODE_2);
  673. writel_relaxed(0x00, ethqos->sgmii_base + QSERDES_TX0_LANE_MODE_3);
  674. writel_relaxed(0x12, ethqos->sgmii_base + QSERDES_TX0_RCV_DETECT_LVL_2);
  675. writel_relaxed(0x0C, ethqos->sgmii_base + QSERDES_TX0_TRAN_DRVR_EMP_EN);
  676. /*****************MODULE: QSERDES_RX0_SGMII_QMP_RX*******************/
  677. writel_relaxed(0x0A, ethqos->sgmii_base + QSERDES_RX0_UCDR_FO_GAIN);
  678. writel_relaxed(0x06, ethqos->sgmii_base + QSERDES_RX0_UCDR_SO_GAIN);
  679. writel_relaxed(0x0A, ethqos->sgmii_base + QSERDES_RX0_UCDR_FASTLOCK_FO_GAIN);
  680. writel_relaxed(0x7F, ethqos->sgmii_base + QSERDES_RX0_UCDR_SO_SATURATION_AND_ENABLE);
  681. writel_relaxed(0x00, ethqos->sgmii_base + QSERDES_RX0_UCDR_FASTLOCK_COUNT_LOW);
  682. writel_relaxed(0x01, ethqos->sgmii_base + QSERDES_RX0_UCDR_FASTLOCK_COUNT_HIGH);
  683. writel_relaxed(0x81, ethqos->sgmii_base + QSERDES_RX0_UCDR_PI_CONTROLS);
  684. writel_relaxed(0x80, ethqos->sgmii_base + QSERDES_RX0_UCDR_PI_CTRL2);
  685. writel_relaxed(0x02, ethqos->sgmii_base + QSERDES_RX0_RX_TERM_BW);
  686. writel_relaxed(0x08, ethqos->sgmii_base + QSERDES_RX0_VGA_CAL_CNTRL2);
  687. writel_relaxed(0x0F, ethqos->sgmii_base + QSERDES_RX0_GM_CAL);
  688. writel_relaxed(0x04, ethqos->sgmii_base + QSERDES_RX0_RX_EQU_ADAPTOR_CNTRL1);
  689. writel_relaxed(0x00, ethqos->sgmii_base + QSERDES_RX0_RX_EQU_ADAPTOR_CNTRL2);
  690. writel_relaxed(0x4A, ethqos->sgmii_base + QSERDES_RX0_RX_EQU_ADAPTOR_CNTRL3);
  691. writel_relaxed(0x0A, ethqos->sgmii_base + QSERDES_RX0_RX_EQU_ADAPTOR_CNTRL4);
  692. writel_relaxed(0x80, ethqos->sgmii_base + QSERDES_RX0_RX_IDAC_TSETTLE_LOW);
  693. writel_relaxed(0x01, ethqos->sgmii_base + QSERDES_RX0_RX_IDAC_TSETTLE_HIGH);
  694. writel_relaxed(0x20, ethqos->sgmii_base + QSERDES_RX0_RX_IDAC_MEASURE_TIME);
  695. writel_relaxed(0x17, ethqos->sgmii_base + QSERDES_RX0_RX_EQ_OFFSET_ADAPTOR_CNTRL1);
  696. writel_relaxed(0x00, ethqos->sgmii_base + QSERDES_RX0_RX_OFFSET_ADAPTOR_CNTRL2);
  697. writel_relaxed(0x0F, ethqos->sgmii_base + QSERDES_RX0_SIGDET_CNTRL);
  698. writel_relaxed(0x1E, ethqos->sgmii_base + QSERDES_RX0_SIGDET_DEGLITCH_CNTRL);
  699. writel_relaxed(0x18, ethqos->sgmii_base + QSERDES_RX0_RX_BAND);
  700. writel_relaxed(0xe0, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_00_LOW);
  701. writel_relaxed(0xC8, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_00_HIGH);
  702. writel_relaxed(0xC8, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_00_HIGH2);
  703. writel_relaxed(0x09, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_00_HIGH3);
  704. writel_relaxed(0xB1, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_00_HIGH4);
  705. writel_relaxed(0xE0, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_01_LOW);
  706. writel_relaxed(0xC8, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_01_HIGH);
  707. writel_relaxed(0xC8, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_01_HIGH2);
  708. writel_relaxed(0x09, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_01_HIGH3);
  709. writel_relaxed(0xB1, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_01_HIGH4);
  710. writel_relaxed(0xE0, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_10_LOW);
  711. writel_relaxed(0xC8, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_10_HIGH);
  712. writel_relaxed(0xC8, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_10_HIGH2);
  713. writel_relaxed(0x3B, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_10_HIGH3);
  714. writel_relaxed(0xB7, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_10_HIGH4);
  715. writel_relaxed(0x0C, ethqos->sgmii_base + QSERDES_RX0_DCC_CTRL1);
  716. /****************MODULE: SGMII_PHY_SGMII_PCS**********************************/
  717. writel_relaxed(0x0C, ethqos->sgmii_base + SGMII_PHY_PCS_LINE_RESET_TIME);
  718. writel_relaxed(0x1F, ethqos->sgmii_base + SGMII_PHY_PCS_TX_LARGE_AMP_DRV_LVL);
  719. writel_relaxed(0x03, ethqos->sgmii_base + SGMII_PHY_PCS_TX_SMALL_AMP_DRV_LVL);
  720. writel_relaxed(0x83, ethqos->sgmii_base + SGMII_PHY_PCS_TX_MID_TERM_CTRL1);
  721. writel_relaxed(0x08, ethqos->sgmii_base + SGMII_PHY_PCS_TX_MID_TERM_CTRL2);
  722. writel_relaxed(0x8c, ethqos->sgmii_base + SGMII_PHY_PCS_SGMII_MISC_CTRL8);
  723. writel_relaxed(0x00, ethqos->sgmii_base + SGMII_PHY_PCS_SW_RESET);
  724. writel_relaxed(0x01, ethqos->sgmii_base + SGMII_PHY_PCS_PHY_START);
  725. do {
  726. val = readl_relaxed(ethqos->sgmii_base + QSERDES_COM_CMN_STATUS);
  727. val &= BIT(1);
  728. if (val)
  729. break;
  730. usleep_range(1000, 1500);
  731. retry--;
  732. } while (retry > 0);
  733. if (!retry) {
  734. ETHQOSERR("PLL Lock Status timedout with retry = %d\n", retry);
  735. ret = -1;
  736. goto err_ret;
  737. }
  738. retry = 500;
  739. do {
  740. val = readl_relaxed(ethqos->sgmii_base + QSERDES_COM_C_READY_STATUS);
  741. val &= BIT(0);
  742. if (val)
  743. break;
  744. usleep_range(1000, 1500);
  745. retry--;
  746. } while (retry > 0);
  747. if (!retry) {
  748. ETHQOSERR("C_READY_STATUS timedout with retry = %d\n", retry);
  749. ret = -1;
  750. goto err_ret;
  751. }
  752. retry = 500;
  753. do {
  754. val = readl_relaxed(ethqos->sgmii_base + SGMII_PHY_PCS_READY_STATUS);
  755. val &= BIT(7);
  756. if (val)
  757. break;
  758. usleep_range(1000, 1500);
  759. retry--;
  760. } while (retry > 0);
  761. if (!retry) {
  762. ETHQOSERR("PCS_READY timedout with retry = %d\n", retry);
  763. ret = -1;
  764. goto err_ret;
  765. }
  766. retry = 500;
  767. do {
  768. val = readl_relaxed(ethqos->sgmii_base + SGMII_PHY_PCS_READY_STATUS);
  769. val &= BIT(0);
  770. if (val)
  771. break;
  772. usleep_range(1000, 1500);
  773. retry--;
  774. } while (retry > 0);
  775. if (!retry) {
  776. ETHQOSERR("SGMIIPHY_READY timedout with retry = %d\n", retry);
  777. ret = -1;
  778. goto err_ret;
  779. }
  780. ETHQOSINFO("%s : Serdes is up on USXGMII 2.5 Gbps mode", __func__);
  781. return ret;
  782. err_ret:
  783. return ret;
  784. }
  785. static int qcom_ethqos_serdes_usxgmii_5Gb(struct qcom_ethqos *ethqos)
  786. {
  787. int ret = 0;
  788. int retry = 5000;
  789. unsigned int val;
  790. /****************MODULE: SGMII_PHY_SGMII_PCS**********************************/
  791. writel_relaxed(0x01, ethqos->sgmii_base + SGMII_PHY_PCS_SW_RESET);
  792. writel_relaxed(0x01, ethqos->sgmii_base + SGMII_PHY_PCS_POWER_DOWN_CONTROL);
  793. /***************** MODULE: QSERDES_COM_SGMII_QMP_PLL*********/
  794. writel_relaxed(0x0E, ethqos->sgmii_base + SGMII_PHY_0_QSERDES_COM_BG_TIMER);
  795. writel_relaxed(0x0F, ethqos->sgmii_base + SGMII_PHY_0_QSERDES_COM_PLL_IVCO);
  796. writel_relaxed(0x06, ethqos->sgmii_base + QSERDES_COM_CP_CTRL_MODE0);
  797. writel_relaxed(0x16, ethqos->sgmii_base + QSERDES_COM_PLL_RCTRL_MODE0);
  798. writel_relaxed(0x36, ethqos->sgmii_base + QSERDES_COM_PLL_CCTRL_MODE0);
  799. writel_relaxed(0x1A, ethqos->sgmii_base + QSERDES_COM_SYSCLK_EN_SEL);
  800. writel_relaxed(0x1A, ethqos->sgmii_base + QSERDES_COM_LOCK_CMP1_MODE0);
  801. writel_relaxed(0x41, ethqos->sgmii_base + QSERDES_COM_LOCK_CMP2_MODE0);
  802. writel_relaxed(0x7A, ethqos->sgmii_base + QSERDES_COM_DEC_START_MODE0);
  803. writel_relaxed(0x00, ethqos->sgmii_base + QSERDES_COM_DIV_FRAC_START1_MODE0);
  804. writel_relaxed(0x20, ethqos->sgmii_base + QSERDES_COM_DIV_FRAC_START2_MODE0);
  805. writel_relaxed(0x01, ethqos->sgmii_base + QSERDES_COM_DIV_FRAC_START3_MODE0);
  806. writel_relaxed(0x01, ethqos->sgmii_base + QSERDES_COM_VCO_TUNE1_MODE0);
  807. writel_relaxed(0x02, ethqos->sgmii_base + QSERDES_COM_VCO_TUNE2_MODE0);
  808. writel_relaxed(0x00, ethqos->sgmii_base + QSERDES_COM_VCO_TUNE_INITVAL2);
  809. writel_relaxed(0x03, ethqos->sgmii_base + QSERDES_COM_HSCLK_SEL_1);
  810. writel_relaxed(0x00, ethqos->sgmii_base + QSERDES_COM_HSCLK_HS_SWITCH_SEL_1);
  811. writel_relaxed(0x05, ethqos->sgmii_base + QSERDES_COM_CORECLK_DIV_MODE0);
  812. writel_relaxed(0x00, ethqos->sgmii_base + QSERDES_COM_CORE_CLK_EN);
  813. writel_relaxed(0x16, ethqos->sgmii_base + QSERDES_COM_CMN_CONFIG_1);
  814. writel_relaxed(0xCD, ethqos->sgmii_base + QSERDES_COM_BIN_VCOCAL_CMP_CODE1_MODE0);
  815. writel_relaxed(0x1C, ethqos->sgmii_base + QSERDES_COM_BIN_VCOCAL_CMP_CODE2_MODE0);
  816. writel_relaxed(0x11, ethqos->sgmii_base + QSERDES_COM_BIN_VCOCAL_HSCLK_SEL_1);
  817. /******************MODULE: QSERDES_TX0_SGMII_QMP_TX***********************/
  818. writel_relaxed(0x04, ethqos->sgmii_base + QSERDES_TX0_TX_BAND);
  819. writel_relaxed(0x0A, ethqos->sgmii_base + QSERDES_TX0_SLEW_CNTL);
  820. writel_relaxed(0x09, ethqos->sgmii_base + QSERDES_TX0_RES_CODE_LANE_OFFSET_TX);
  821. writel_relaxed(0x09, ethqos->sgmii_base + QSERDES_TX0_RES_CODE_LANE_OFFSET_RX);
  822. writel_relaxed(0x05, ethqos->sgmii_base + QSERDES_TX0_LANE_MODE_1);
  823. writel_relaxed(0x02, ethqos->sgmii_base + QSERDES_TX0_LANE_MODE_2);
  824. writel_relaxed(0x00, ethqos->sgmii_base + QSERDES_TX0_LANE_MODE_3);
  825. writel_relaxed(0x12, ethqos->sgmii_base + QSERDES_TX0_RCV_DETECT_LVL_2);
  826. writel_relaxed(0x0C, ethqos->sgmii_base + QSERDES_TX0_TRAN_DRVR_EMP_EN);
  827. /*****************MODULE: QSERDES_RX0_SGMII_QMP_RX*******************/
  828. writel_relaxed(0x0A, ethqos->sgmii_base + QSERDES_RX0_UCDR_FO_GAIN);
  829. writel_relaxed(0x06, ethqos->sgmii_base + QSERDES_RX0_UCDR_SO_GAIN);
  830. writel_relaxed(0x0A, ethqos->sgmii_base + QSERDES_RX0_UCDR_FASTLOCK_FO_GAIN);
  831. writel_relaxed(0x7F, ethqos->sgmii_base + QSERDES_RX0_UCDR_SO_SATURATION_AND_ENABLE);
  832. writel_relaxed(0x00, ethqos->sgmii_base + QSERDES_RX0_UCDR_FASTLOCK_COUNT_LOW);
  833. writel_relaxed(0x01, ethqos->sgmii_base + QSERDES_RX0_UCDR_FASTLOCK_COUNT_HIGH);
  834. writel_relaxed(0x81, ethqos->sgmii_base + QSERDES_RX0_UCDR_PI_CONTROLS);
  835. writel_relaxed(0x80, ethqos->sgmii_base + QSERDES_RX0_UCDR_PI_CTRL2);
  836. writel_relaxed(0x02, ethqos->sgmii_base + QSERDES_RX0_RX_TERM_BW);
  837. writel_relaxed(0x08, ethqos->sgmii_base + QSERDES_RX0_VGA_CAL_CNTRL2);
  838. writel_relaxed(0x0F, ethqos->sgmii_base + QSERDES_RX0_GM_CAL);
  839. writel_relaxed(0x04, ethqos->sgmii_base + QSERDES_RX0_RX_EQU_ADAPTOR_CNTRL1);
  840. writel_relaxed(0x00, ethqos->sgmii_base + QSERDES_RX0_RX_EQU_ADAPTOR_CNTRL2);
  841. writel_relaxed(0x4A, ethqos->sgmii_base + QSERDES_RX0_RX_EQU_ADAPTOR_CNTRL3);
  842. writel_relaxed(0x0A, ethqos->sgmii_base + QSERDES_RX0_RX_EQU_ADAPTOR_CNTRL4);
  843. writel_relaxed(0x80, ethqos->sgmii_base + QSERDES_RX0_RX_IDAC_TSETTLE_LOW);
  844. writel_relaxed(0x01, ethqos->sgmii_base + QSERDES_RX0_RX_IDAC_TSETTLE_HIGH);
  845. writel_relaxed(0x20, ethqos->sgmii_base + QSERDES_RX0_RX_IDAC_MEASURE_TIME);
  846. writel_relaxed(0x17, ethqos->sgmii_base + QSERDES_RX0_RX_EQ_OFFSET_ADAPTOR_CNTRL1);
  847. writel_relaxed(0x00, ethqos->sgmii_base + QSERDES_RX0_RX_OFFSET_ADAPTOR_CNTRL2);
  848. writel_relaxed(0x0F, ethqos->sgmii_base + QSERDES_RX0_SIGDET_CNTRL);
  849. writel_relaxed(0x1E, ethqos->sgmii_base + QSERDES_RX0_SIGDET_DEGLITCH_CNTRL);
  850. writel_relaxed(0x18, ethqos->sgmii_base + QSERDES_RX0_RX_BAND);
  851. writel_relaxed(0xe0, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_00_LOW);
  852. writel_relaxed(0xC8, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_00_HIGH);
  853. writel_relaxed(0xC8, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_00_HIGH2);
  854. writel_relaxed(0x09, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_00_HIGH3);
  855. writel_relaxed(0xB1, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_00_HIGH4);
  856. writel_relaxed(0xE0, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_01_LOW);
  857. writel_relaxed(0xC8, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_01_HIGH);
  858. writel_relaxed(0xC8, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_01_HIGH2);
  859. writel_relaxed(0x09, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_01_HIGH3);
  860. writel_relaxed(0xB1, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_01_HIGH4);
  861. writel_relaxed(0xE0, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_10_LOW);
  862. writel_relaxed(0xC8, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_10_HIGH);
  863. writel_relaxed(0xC8, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_10_HIGH2);
  864. writel_relaxed(0x3B, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_10_HIGH3);
  865. writel_relaxed(0xB7, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_10_HIGH4);
  866. writel_relaxed(0x0C, ethqos->sgmii_base + QSERDES_RX0_DCC_CTRL1);
  867. /****************MODULE: SGMII_PHY_SGMII_PCS**********************************/
  868. writel_relaxed(0x0C, ethqos->sgmii_base + SGMII_PHY_PCS_LINE_RESET_TIME);
  869. writel_relaxed(0x1F, ethqos->sgmii_base + SGMII_PHY_PCS_TX_LARGE_AMP_DRV_LVL);
  870. writel_relaxed(0x03, ethqos->sgmii_base + SGMII_PHY_PCS_TX_SMALL_AMP_DRV_LVL);
  871. writel_relaxed(0x83, ethqos->sgmii_base + SGMII_PHY_PCS_TX_MID_TERM_CTRL1);
  872. writel_relaxed(0x08, ethqos->sgmii_base + SGMII_PHY_PCS_TX_MID_TERM_CTRL2);
  873. writel_relaxed(0x8c, ethqos->sgmii_base + SGMII_PHY_PCS_SGMII_MISC_CTRL8);
  874. writel_relaxed(0x00, ethqos->sgmii_base + SGMII_PHY_PCS_SW_RESET);
  875. writel_relaxed(0x01, ethqos->sgmii_base + SGMII_PHY_PCS_PHY_START);
  876. do {
  877. val = readl_relaxed(ethqos->sgmii_base + QSERDES_COM_CMN_STATUS);
  878. val &= BIT(1);
  879. if (val)
  880. break;
  881. usleep_range(1000, 1500);
  882. retry--;
  883. } while (retry > 0);
  884. if (!retry) {
  885. ETHQOSERR("PLL Lock Status timedout with retry = %d\n", retry);
  886. ret = -1;
  887. goto err_ret;
  888. }
  889. retry = 500;
  890. do {
  891. val = readl_relaxed(ethqos->sgmii_base + QSERDES_COM_C_READY_STATUS);
  892. val &= BIT(0);
  893. if (val)
  894. break;
  895. usleep_range(1000, 1500);
  896. retry--;
  897. } while (retry > 0);
  898. if (!retry) {
  899. ETHQOSERR("C_READY_STATUS timedout with retry = %d\n", retry);
  900. ret = -1;
  901. goto err_ret;
  902. }
  903. retry = 500;
  904. do {
  905. val = readl_relaxed(ethqos->sgmii_base + SGMII_PHY_PCS_READY_STATUS);
  906. val &= BIT(7);
  907. if (val)
  908. break;
  909. usleep_range(1000, 1500);
  910. retry--;
  911. } while (retry > 0);
  912. if (!retry) {
  913. ETHQOSERR("PCS_READY timedout with retry = %d\n", retry);
  914. ret = -1;
  915. goto err_ret;
  916. }
  917. retry = 500;
  918. do {
  919. val = readl_relaxed(ethqos->sgmii_base + SGMII_PHY_PCS_READY_STATUS);
  920. val &= BIT(0);
  921. if (val)
  922. break;
  923. usleep_range(1000, 1500);
  924. retry--;
  925. } while (retry > 0);
  926. if (!retry) {
  927. ETHQOSERR("SGMIIPHY_READY timedout with retry = %d\n", retry);
  928. ret = -1;
  929. goto err_ret;
  930. }
  931. return ret;
  932. err_ret:
  933. return ret;
  934. }
  935. static int qcom_ethqos_serdes_usxgmii_10Gb_1Gb(struct qcom_ethqos *ethqos)
  936. {
  937. int ret = 0;
  938. int retry = 5000;
  939. unsigned int val;
  940. /****************MODULE: SGMII_PHY_SGMII_PCS**********************************/
  941. writel_relaxed(0x01, ethqos->sgmii_base + SGMII_PHY_PCS_SW_RESET);
  942. writel_relaxed(0x01, ethqos->sgmii_base + SGMII_PHY_PCS_POWER_DOWN_CONTROL);
  943. /***************** MODULE: QSERDES_COM_SGMII_QMP_PLL*********/
  944. writel_relaxed(0x0E, ethqos->sgmii_base + SGMII_PHY_0_QSERDES_COM_BG_TIMER);
  945. writel_relaxed(0x0F, ethqos->sgmii_base + SGMII_PHY_0_QSERDES_COM_PLL_IVCO);
  946. writel_relaxed(0x06, ethqos->sgmii_base + QSERDES_COM_CP_CTRL_MODE0);
  947. writel_relaxed(0x16, ethqos->sgmii_base + QSERDES_COM_PLL_RCTRL_MODE0);
  948. writel_relaxed(0x36, ethqos->sgmii_base + QSERDES_COM_PLL_CCTRL_MODE0);
  949. writel_relaxed(0x1A, ethqos->sgmii_base + QSERDES_COM_SYSCLK_EN_SEL);
  950. writel_relaxed(0x1A, ethqos->sgmii_base + QSERDES_COM_LOCK_CMP1_MODE0);
  951. writel_relaxed(0x41, ethqos->sgmii_base + QSERDES_COM_LOCK_CMP2_MODE0);
  952. writel_relaxed(0x7A, ethqos->sgmii_base + QSERDES_COM_DEC_START_MODE0);
  953. writel_relaxed(0x00, ethqos->sgmii_base + QSERDES_COM_DIV_FRAC_START1_MODE0);
  954. writel_relaxed(0x20, ethqos->sgmii_base + QSERDES_COM_DIV_FRAC_START2_MODE0);
  955. writel_relaxed(0x01, ethqos->sgmii_base + QSERDES_COM_DIV_FRAC_START3_MODE0);
  956. writel_relaxed(0x01, ethqos->sgmii_base + QSERDES_COM_VCO_TUNE1_MODE0);
  957. writel_relaxed(0x02, ethqos->sgmii_base + QSERDES_COM_VCO_TUNE2_MODE0);
  958. writel_relaxed(0x00, ethqos->sgmii_base + QSERDES_COM_VCO_TUNE_INITVAL2);
  959. writel_relaxed(0x03, ethqos->sgmii_base + QSERDES_COM_HSCLK_SEL_1);
  960. writel_relaxed(0x00, ethqos->sgmii_base + QSERDES_COM_HSCLK_HS_SWITCH_SEL_1);
  961. writel_relaxed(0x05, ethqos->sgmii_base + QSERDES_COM_CORECLK_DIV_MODE0);
  962. writel_relaxed(0x00, ethqos->sgmii_base + QSERDES_COM_CORE_CLK_EN);
  963. writel_relaxed(0x16, ethqos->sgmii_base + QSERDES_COM_CMN_CONFIG_1);
  964. writel_relaxed(0xCD, ethqos->sgmii_base + QSERDES_COM_BIN_VCOCAL_CMP_CODE1_MODE0);
  965. writel_relaxed(0x1C, ethqos->sgmii_base + QSERDES_COM_BIN_VCOCAL_CMP_CODE2_MODE0);
  966. writel_relaxed(0x11, ethqos->sgmii_base + QSERDES_COM_BIN_VCOCAL_HSCLK_SEL_1);
  967. /******************MODULE: QSERDES_TX0_SGMII_QMP_TX***********************/
  968. writel_relaxed(0x04, ethqos->sgmii_base + QSERDES_TX0_TX_BAND);
  969. writel_relaxed(0x0A, ethqos->sgmii_base + QSERDES_TX0_SLEW_CNTL);
  970. writel_relaxed(0x09, ethqos->sgmii_base + QSERDES_TX0_RES_CODE_LANE_OFFSET_TX);
  971. writel_relaxed(0x09, ethqos->sgmii_base + QSERDES_TX0_RES_CODE_LANE_OFFSET_RX);
  972. writel_relaxed(0x05, ethqos->sgmii_base + QSERDES_TX0_LANE_MODE_1);
  973. writel_relaxed(0x02, ethqos->sgmii_base + QSERDES_TX0_LANE_MODE_2);
  974. writel_relaxed(0x00, ethqos->sgmii_base + QSERDES_TX0_LANE_MODE_3);
  975. writel_relaxed(0x12, ethqos->sgmii_base + QSERDES_TX0_RCV_DETECT_LVL_2);
  976. writel_relaxed(0x0C, ethqos->sgmii_base + QSERDES_TX0_TRAN_DRVR_EMP_EN);
  977. /*****************MODULE: QSERDES_RX0_SGMII_QMP_RX*******************/
  978. writel_relaxed(0x0A, ethqos->sgmii_base + QSERDES_RX0_UCDR_FO_GAIN);
  979. writel_relaxed(0x06, ethqos->sgmii_base + QSERDES_RX0_UCDR_SO_GAIN);
  980. writel_relaxed(0x0A, ethqos->sgmii_base + QSERDES_RX0_UCDR_FASTLOCK_FO_GAIN);
  981. writel_relaxed(0x7F, ethqos->sgmii_base + QSERDES_RX0_UCDR_SO_SATURATION_AND_ENABLE);
  982. writel_relaxed(0x00, ethqos->sgmii_base + QSERDES_RX0_UCDR_FASTLOCK_COUNT_LOW);
  983. writel_relaxed(0x01, ethqos->sgmii_base + QSERDES_RX0_UCDR_FASTLOCK_COUNT_HIGH);
  984. writel_relaxed(0x81, ethqos->sgmii_base + QSERDES_RX0_UCDR_PI_CONTROLS);
  985. writel_relaxed(0x80, ethqos->sgmii_base + QSERDES_RX0_UCDR_PI_CTRL2);
  986. writel_relaxed(0x02, ethqos->sgmii_base + QSERDES_RX0_RX_TERM_BW);
  987. writel_relaxed(0x08, ethqos->sgmii_base + QSERDES_RX0_VGA_CAL_CNTRL2);
  988. writel_relaxed(0x0F, ethqos->sgmii_base + QSERDES_RX0_GM_CAL);
  989. writel_relaxed(0x04, ethqos->sgmii_base + QSERDES_RX0_RX_EQU_ADAPTOR_CNTRL1);
  990. writel_relaxed(0x00, ethqos->sgmii_base + QSERDES_RX0_RX_EQU_ADAPTOR_CNTRL2);
  991. writel_relaxed(0x4A, ethqos->sgmii_base + QSERDES_RX0_RX_EQU_ADAPTOR_CNTRL3);
  992. writel_relaxed(0x0A, ethqos->sgmii_base + QSERDES_RX0_RX_EQU_ADAPTOR_CNTRL4);
  993. writel_relaxed(0x80, ethqos->sgmii_base + QSERDES_RX0_RX_IDAC_TSETTLE_LOW);
  994. writel_relaxed(0x01, ethqos->sgmii_base + QSERDES_RX0_RX_IDAC_TSETTLE_HIGH);
  995. writel_relaxed(0x20, ethqos->sgmii_base + QSERDES_RX0_RX_IDAC_MEASURE_TIME);
  996. writel_relaxed(0x17, ethqos->sgmii_base + QSERDES_RX0_RX_EQ_OFFSET_ADAPTOR_CNTRL1);
  997. writel_relaxed(0x00, ethqos->sgmii_base + QSERDES_RX0_RX_OFFSET_ADAPTOR_CNTRL2);
  998. writel_relaxed(0x0F, ethqos->sgmii_base + QSERDES_RX0_SIGDET_CNTRL);
  999. writel_relaxed(0x1E, ethqos->sgmii_base + QSERDES_RX0_SIGDET_DEGLITCH_CNTRL);
  1000. writel_relaxed(0x18, ethqos->sgmii_base + QSERDES_RX0_RX_BAND);
  1001. writel_relaxed(0xe0, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_00_LOW);
  1002. writel_relaxed(0xC8, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_00_HIGH);
  1003. writel_relaxed(0xC8, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_00_HIGH2);
  1004. writel_relaxed(0x09, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_00_HIGH3);
  1005. writel_relaxed(0xB1, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_00_HIGH4);
  1006. writel_relaxed(0xE0, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_01_LOW);
  1007. writel_relaxed(0xC8, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_01_HIGH);
  1008. writel_relaxed(0xC8, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_01_HIGH2);
  1009. writel_relaxed(0x09, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_01_HIGH3);
  1010. writel_relaxed(0xB1, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_01_HIGH4);
  1011. writel_relaxed(0xE0, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_10_LOW);
  1012. writel_relaxed(0xC8, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_10_HIGH);
  1013. writel_relaxed(0xC8, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_10_HIGH2);
  1014. writel_relaxed(0x3B, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_10_HIGH3);
  1015. writel_relaxed(0xB7, ethqos->sgmii_base + QSERDES_RX0_RX_MODE_10_HIGH4);
  1016. writel_relaxed(0x0C, ethqos->sgmii_base + QSERDES_RX0_DCC_CTRL1);
  1017. /****************MODULE: SGMII_PHY_SGMII_PCS**********************************/
  1018. writel_relaxed(0x0C, ethqos->sgmii_base + SGMII_PHY_PCS_LINE_RESET_TIME);
  1019. writel_relaxed(0x1F, ethqos->sgmii_base + SGMII_PHY_PCS_TX_LARGE_AMP_DRV_LVL);
  1020. writel_relaxed(0x03, ethqos->sgmii_base + SGMII_PHY_PCS_TX_SMALL_AMP_DRV_LVL);
  1021. writel_relaxed(0x83, ethqos->sgmii_base + SGMII_PHY_PCS_TX_MID_TERM_CTRL1);
  1022. writel_relaxed(0x08, ethqos->sgmii_base + SGMII_PHY_PCS_TX_MID_TERM_CTRL2);
  1023. writel_relaxed(0x8c, ethqos->sgmii_base + SGMII_PHY_PCS_SGMII_MISC_CTRL8);
  1024. writel_relaxed(0x00, ethqos->sgmii_base + SGMII_PHY_PCS_SW_RESET);
  1025. writel_relaxed(0x01, ethqos->sgmii_base + SGMII_PHY_PCS_PHY_START);
  1026. do {
  1027. val = readl_relaxed(ethqos->sgmii_base + QSERDES_COM_CMN_STATUS);
  1028. val &= BIT(1);
  1029. if (val)
  1030. break;
  1031. usleep_range(1000, 1500);
  1032. retry--;
  1033. } while (retry > 0);
  1034. if (!retry) {
  1035. ETHQOSERR("PLL Lock Status timedout with retry = %d\n", retry);
  1036. ret = -1;
  1037. goto err_ret;
  1038. }
  1039. retry = 500;
  1040. do {
  1041. val = readl_relaxed(ethqos->sgmii_base + QSERDES_COM_C_READY_STATUS);
  1042. val &= BIT(0);
  1043. if (val)
  1044. break;
  1045. usleep_range(1000, 1500);
  1046. retry--;
  1047. } while (retry > 0);
  1048. if (!retry) {
  1049. ETHQOSERR("C_READY_STATUS timedout with retry = %d\n", retry);
  1050. ret = -1;
  1051. goto err_ret;
  1052. }
  1053. retry = 500;
  1054. do {
  1055. val = readl_relaxed(ethqos->sgmii_base + SGMII_PHY_PCS_READY_STATUS);
  1056. val &= BIT(7);
  1057. if (val)
  1058. break;
  1059. usleep_range(1000, 1500);
  1060. retry--;
  1061. } while (retry > 0);
  1062. if (!retry) {
  1063. ETHQOSERR("PCS_READY timedout with retry = %d\n", retry);
  1064. ret = -1;
  1065. goto err_ret;
  1066. }
  1067. retry = 500;
  1068. do {
  1069. val = readl_relaxed(ethqos->sgmii_base + SGMII_PHY_PCS_READY_STATUS);
  1070. val &= BIT(0);
  1071. if (val)
  1072. break;
  1073. usleep_range(1000, 1500);
  1074. retry--;
  1075. } while (retry > 0);
  1076. if (!retry) {
  1077. ETHQOSERR("SGMIIPHY_READY timedout with retry = %d\n", retry);
  1078. ret = -1;
  1079. goto err_ret;
  1080. }
  1081. return ret;
  1082. err_ret:
  1083. return ret;
  1084. }
  1085. static int qcom_ethqos_serdes_update_sgmii(struct qcom_ethqos *ethqos,
  1086. int speed)
  1087. {
  1088. int ret = 0;
  1089. switch (speed) {
  1090. case SPEED_1000:
  1091. if (ethqos->curr_serdes_speed == SPEED_2500)
  1092. ret = qcom_ethqos_serdes_sgmii_1Gb(ethqos);
  1093. ethqos->curr_serdes_speed = SPEED_1000;
  1094. break;
  1095. case SPEED_2500:
  1096. if (ethqos->curr_serdes_speed != SPEED_2500)
  1097. ret = qcom_ethqos_serdes_sgmii_25Gb(ethqos);
  1098. ethqos->curr_serdes_speed = SPEED_2500;
  1099. break;
  1100. case SPEED_100:
  1101. case SPEED_10:
  1102. if (ethqos->curr_serdes_speed != SPEED_1000) {
  1103. ETHQOSINFO("%s : Serdes Speed set to 1GB speed", __func__);
  1104. ret = qcom_ethqos_serdes_sgmii_1Gb(ethqos);
  1105. ethqos->curr_serdes_speed = SPEED_1000;
  1106. }
  1107. break;
  1108. default:
  1109. ETHQOSERR("%s : Serdes Speed not set for speed = %d\n",
  1110. __func__,
  1111. speed);
  1112. ethqos->curr_serdes_speed = 0;
  1113. break;
  1114. }
  1115. ETHQOSINFO("%s : Exit serdes speed = %d",
  1116. __func__,
  1117. ethqos->curr_serdes_speed);
  1118. return ret;
  1119. }
  1120. static int qcom_ethqos_serdes_update_usxgmii(struct qcom_ethqos *ethqos,
  1121. int speed)
  1122. {
  1123. int ret = 0;
  1124. switch (speed) {
  1125. case SPEED_2500:
  1126. ret = qcom_ethqos_serdes_usxgmii_25Gb(ethqos);
  1127. break;
  1128. case SPEED_5000:
  1129. ret = qcom_ethqos_serdes_usxgmii_5Gb(ethqos);
  1130. break;
  1131. case SPEED_1000:
  1132. case SPEED_10000:
  1133. ret = qcom_ethqos_serdes_usxgmii_10Gb_1Gb(ethqos);
  1134. break;
  1135. default:
  1136. ETHQOSINFO("%s : Serdes Speed 1GB set by default", __func__);
  1137. ret = qcom_ethqos_serdes_usxgmii_10Gb_1Gb(ethqos);
  1138. break;
  1139. }
  1140. ETHQOSINFO("%s : exit ret = %d", __func__, ret);
  1141. return ret;
  1142. }
  1143. int qcom_ethqos_serdes_update(struct qcom_ethqos *ethqos,
  1144. int speed,
  1145. int interface)
  1146. {
  1147. int ret = 0;
  1148. switch (interface) {
  1149. case PHY_INTERFACE_MODE_SGMII:
  1150. ret = qcom_ethqos_serdes_update_sgmii(ethqos, speed);
  1151. break;
  1152. case PHY_INTERFACE_MODE_USXGMII:
  1153. ret = qcom_ethqos_serdes_update_usxgmii(ethqos, speed);
  1154. break;
  1155. default:
  1156. ETHQOSINFO("%s : PHY interface not supported", __func__);
  1157. ret = EINVAL;
  1158. break;
  1159. }
  1160. return ret;
  1161. }
  1162. EXPORT_SYMBOL_GPL(qcom_ethqos_serdes_update);
  1163. int qcom_ethqos_serdes_configure_dt(struct qcom_ethqos *ethqos)
  1164. {
  1165. struct resource *res = NULL;
  1166. struct platform_device *pdev = ethqos->pdev;
  1167. int ret;
  1168. res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "serdes");
  1169. ethqos->sgmii_base = devm_ioremap_resource(&pdev->dev, res);
  1170. if (IS_ERR(ethqos->sgmii_base)) {
  1171. dev_err(&pdev->dev, "Can't get sgmii base\n");
  1172. ret = PTR_ERR(ethqos->sgmii_base);
  1173. goto err_mem;
  1174. }
  1175. ethqos->sgmiref_clk = devm_clk_get(&pdev->dev, "sgmi_ref");
  1176. if (IS_ERR(ethqos->sgmiref_clk)) {
  1177. ETHQOSERR("%s : configure_serdes_dt Failed sgmi_ref", __func__);
  1178. ret = PTR_ERR(ethqos->sgmiref_clk);
  1179. goto err_mem;
  1180. }
  1181. ethqos->phyaux_clk = devm_clk_get(&pdev->dev, "phyaux");
  1182. if (IS_ERR(ethqos->phyaux_clk)) {
  1183. ETHQOSERR("%s : configure_serdes_dt Failed phyaux", __func__);
  1184. ret = PTR_ERR(ethqos->phyaux_clk);
  1185. goto err_mem;
  1186. }
  1187. ret = clk_prepare_enable(ethqos->sgmiref_clk);
  1188. if (ret)
  1189. goto err_mem;
  1190. ret = clk_prepare_enable(ethqos->phyaux_clk);
  1191. if (ret)
  1192. goto err_mem;
  1193. return 0;
  1194. err_mem:
  1195. ETHQOSERR("%s : configure_serdes_dt Failed", __func__);
  1196. return -1;
  1197. }
  1198. EXPORT_SYMBOL_GPL(qcom_ethqos_serdes_configure_dt);
  1199. MODULE_LICENSE("GPL");