phy-airoha-pcie.c 49 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2024 AIROHA Inc
  4. * Author: Lorenzo Bianconi <lorenzo@kernel.org>
  5. */
  6. #include <linux/bitfield.h>
  7. #include <linux/delay.h>
  8. #include <linux/io.h>
  9. #include <linux/module.h>
  10. #include <linux/of.h>
  11. #include <linux/phy/phy.h>
  12. #include <linux/platform_device.h>
  13. #include <linux/slab.h>
  14. #include "phy-airoha-pcie-regs.h"
  15. #define LEQ_LEN_CTRL_MAX_VAL 7
  16. #define FREQ_LOCK_MAX_ATTEMPT 10
  17. /* PCIe-PHY initialization time in ms needed by the hw to complete */
  18. #define PHY_HW_INIT_TIME_MS 30
  19. enum airoha_pcie_port_gen {
  20. PCIE_PORT_GEN1 = 1,
  21. PCIE_PORT_GEN2,
  22. PCIE_PORT_GEN3,
  23. };
  24. /**
  25. * struct airoha_pcie_phy - PCIe phy driver main structure
  26. * @dev: pointer to device
  27. * @phy: pointer to generic phy
  28. * @csr_2l: Analogic lane IO mapped register base address
  29. * @pma0: IO mapped register base address of PMA0-PCIe
  30. * @pma1: IO mapped register base address of PMA1-PCIe
  31. * @p0_xr_dtime: IO mapped register base address of port0 Tx-Rx detection time
  32. * @p1_xr_dtime: IO mapped register base address of port1 Tx-Rx detection time
  33. * @rx_aeq: IO mapped register base address of Rx AEQ training
  34. */
  35. struct airoha_pcie_phy {
  36. struct device *dev;
  37. struct phy *phy;
  38. void __iomem *csr_2l;
  39. void __iomem *pma0;
  40. void __iomem *pma1;
  41. void __iomem *p0_xr_dtime;
  42. void __iomem *p1_xr_dtime;
  43. void __iomem *rx_aeq;
  44. };
  45. static void airoha_phy_clear_bits(void __iomem *reg, u32 mask)
  46. {
  47. u32 val = readl(reg) & ~mask;
  48. writel(val, reg);
  49. }
  50. static void airoha_phy_set_bits(void __iomem *reg, u32 mask)
  51. {
  52. u32 val = readl(reg) | mask;
  53. writel(val, reg);
  54. }
  55. static void airoha_phy_update_bits(void __iomem *reg, u32 mask, u32 val)
  56. {
  57. u32 tmp = readl(reg);
  58. tmp &= ~mask;
  59. tmp |= val & mask;
  60. writel(tmp, reg);
  61. }
  62. #define airoha_phy_update_field(reg, mask, val) \
  63. do { \
  64. BUILD_BUG_ON_MSG(!__builtin_constant_p((mask)), \
  65. "mask is not constant"); \
  66. airoha_phy_update_bits((reg), (mask), \
  67. FIELD_PREP((mask), (val))); \
  68. } while (0)
  69. #define airoha_phy_csr_2l_clear_bits(pcie_phy, reg, mask) \
  70. airoha_phy_clear_bits((pcie_phy)->csr_2l + (reg), (mask))
  71. #define airoha_phy_csr_2l_set_bits(pcie_phy, reg, mask) \
  72. airoha_phy_set_bits((pcie_phy)->csr_2l + (reg), (mask))
  73. #define airoha_phy_csr_2l_update_field(pcie_phy, reg, mask, val) \
  74. airoha_phy_update_field((pcie_phy)->csr_2l + (reg), (mask), (val))
  75. #define airoha_phy_pma0_clear_bits(pcie_phy, reg, mask) \
  76. airoha_phy_clear_bits((pcie_phy)->pma0 + (reg), (mask))
  77. #define airoha_phy_pma1_clear_bits(pcie_phy, reg, mask) \
  78. airoha_phy_clear_bits((pcie_phy)->pma1 + (reg), (mask))
  79. #define airoha_phy_pma0_set_bits(pcie_phy, reg, mask) \
  80. airoha_phy_set_bits((pcie_phy)->pma0 + (reg), (mask))
  81. #define airoha_phy_pma1_set_bits(pcie_phy, reg, mask) \
  82. airoha_phy_set_bits((pcie_phy)->pma1 + (reg), (mask))
  83. #define airoha_phy_pma0_update_field(pcie_phy, reg, mask, val) \
  84. airoha_phy_update_field((pcie_phy)->pma0 + (reg), (mask), (val))
  85. #define airoha_phy_pma1_update_field(pcie_phy, reg, mask, val) \
  86. airoha_phy_update_field((pcie_phy)->pma1 + (reg), (mask), (val))
  87. static void
  88. airoha_phy_init_lane0_rx_fw_pre_calib(struct airoha_pcie_phy *pcie_phy,
  89. enum airoha_pcie_port_gen gen)
  90. {
  91. u32 fl_out_target = gen == PCIE_PORT_GEN3 ? 41600 : 41941;
  92. u32 lock_cyclecnt = gen == PCIE_PORT_GEN3 ? 26000 : 32767;
  93. u32 pr_idac, val, cdr_pr_idac_tmp = 0;
  94. int i;
  95. airoha_phy_pma0_set_bits(pcie_phy,
  96. REG_PCIE_PMA_SS_LCPLL_PWCTL_SETTING_1,
  97. PCIE_LCPLL_MAN_PWDB);
  98. airoha_phy_pma0_update_field(pcie_phy, REG_PCIE_PMA_SS_RX_FREQ_DET2,
  99. PCIE_LOCK_TARGET_BEG,
  100. fl_out_target - 100);
  101. airoha_phy_pma0_update_field(pcie_phy, REG_PCIE_PMA_SS_RX_FREQ_DET2,
  102. PCIE_LOCK_TARGET_END,
  103. fl_out_target + 100);
  104. airoha_phy_pma0_update_field(pcie_phy, REG_PCIE_PMA_SS_RX_FREQ_DET1,
  105. PCIE_PLL_FT_LOCK_CYCLECNT, lock_cyclecnt);
  106. airoha_phy_pma0_update_field(pcie_phy, REG_PCIE_PMA_SS_RX_FREQ_DET4,
  107. PCIE_LOCK_LOCKTH, 0x3);
  108. airoha_phy_pma0_update_field(pcie_phy, REG_PCIE_PMA_SS_RX_FREQ_DET3,
  109. PCIE_UNLOCK_TARGET_BEG,
  110. fl_out_target - 100);
  111. airoha_phy_pma0_update_field(pcie_phy, REG_PCIE_PMA_SS_RX_FREQ_DET3,
  112. PCIE_UNLOCK_TARGET_END,
  113. fl_out_target + 100);
  114. airoha_phy_pma0_update_field(pcie_phy, REG_PCIE_PMA_SS_RX_FREQ_DET1,
  115. PCIE_PLL_FT_UNLOCK_CYCLECNT,
  116. lock_cyclecnt);
  117. airoha_phy_pma0_update_field(pcie_phy, REG_PCIE_PMA_SS_RX_FREQ_DET4,
  118. PCIE_UNLOCK_LOCKTH, 0x3);
  119. airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_CDR0_PR_INJ_MODE,
  120. CSR_2L_PXP_CDR0_INJ_FORCE_OFF);
  121. airoha_phy_pma0_set_bits(pcie_phy,
  122. REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_LPF_C,
  123. PCIE_FORCE_SEL_DA_PXP_CDR_PR_LPF_R_EN);
  124. airoha_phy_pma0_set_bits(pcie_phy,
  125. REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_LPF_C,
  126. PCIE_FORCE_DA_PXP_CDR_PR_LPF_R_EN);
  127. airoha_phy_pma0_set_bits(pcie_phy,
  128. REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_LPF_C,
  129. PCIE_FORCE_SEL_DA_PXP_CDR_PR_LPF_C_EN);
  130. airoha_phy_pma0_clear_bits(pcie_phy,
  131. REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_LPF_C,
  132. PCIE_FORCE_DA_PXP_CDR_PR_LPF_C_EN);
  133. airoha_phy_pma0_set_bits(pcie_phy,
  134. REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_IDAC,
  135. PCIE_FORCE_SEL_DA_PXP_CDR_PR_IDAC);
  136. airoha_phy_pma0_set_bits(pcie_phy,
  137. REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_PIEYE_PWDB,
  138. PCIE_FORCE_SEL_DA_PXP_CDR_PR_PWDB);
  139. airoha_phy_pma0_clear_bits(pcie_phy,
  140. REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_PIEYE_PWDB,
  141. PCIE_FORCE_DA_PXP_CDR_PR_PWDB);
  142. airoha_phy_pma0_set_bits(pcie_phy,
  143. REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_PIEYE_PWDB,
  144. PCIE_FORCE_DA_PXP_CDR_PR_PWDB);
  145. for (i = 0; i < LEQ_LEN_CTRL_MAX_VAL; i++) {
  146. airoha_phy_pma0_update_field(pcie_phy,
  147. REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_IDAC,
  148. PCIE_FORCE_DA_PXP_CDR_PR_IDAC, i << 8);
  149. airoha_phy_pma0_clear_bits(pcie_phy,
  150. REG_PCIE_PMA_SS_RX_FREQ_DET4,
  151. PCIE_FREQLOCK_DET_EN);
  152. airoha_phy_pma0_update_field(pcie_phy,
  153. REG_PCIE_PMA_SS_RX_FREQ_DET4,
  154. PCIE_FREQLOCK_DET_EN, 0x3);
  155. usleep_range(10000, 15000);
  156. val = FIELD_GET(PCIE_RO_FL_OUT,
  157. readl(pcie_phy->pma0 +
  158. REG_PCIE_PMA_RO_RX_FREQDET));
  159. if (val > fl_out_target)
  160. cdr_pr_idac_tmp = i << 8;
  161. }
  162. for (i = LEQ_LEN_CTRL_MAX_VAL; i >= 0; i--) {
  163. pr_idac = cdr_pr_idac_tmp | (0x1 << i);
  164. airoha_phy_pma0_update_field(pcie_phy,
  165. REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_IDAC,
  166. PCIE_FORCE_DA_PXP_CDR_PR_IDAC, pr_idac);
  167. airoha_phy_pma0_clear_bits(pcie_phy,
  168. REG_PCIE_PMA_SS_RX_FREQ_DET4,
  169. PCIE_FREQLOCK_DET_EN);
  170. airoha_phy_pma0_update_field(pcie_phy,
  171. REG_PCIE_PMA_SS_RX_FREQ_DET4,
  172. PCIE_FREQLOCK_DET_EN, 0x3);
  173. usleep_range(10000, 15000);
  174. val = FIELD_GET(PCIE_RO_FL_OUT,
  175. readl(pcie_phy->pma0 +
  176. REG_PCIE_PMA_RO_RX_FREQDET));
  177. if (val < fl_out_target)
  178. pr_idac &= ~(0x1 << i);
  179. cdr_pr_idac_tmp = pr_idac;
  180. }
  181. airoha_phy_pma0_update_field(pcie_phy,
  182. REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_IDAC,
  183. PCIE_FORCE_DA_PXP_CDR_PR_IDAC,
  184. cdr_pr_idac_tmp);
  185. for (i = 0; i < FREQ_LOCK_MAX_ATTEMPT; i++) {
  186. u32 val;
  187. airoha_phy_pma0_clear_bits(pcie_phy,
  188. REG_PCIE_PMA_SS_RX_FREQ_DET4,
  189. PCIE_FREQLOCK_DET_EN);
  190. airoha_phy_pma0_update_field(pcie_phy,
  191. REG_PCIE_PMA_SS_RX_FREQ_DET4,
  192. PCIE_FREQLOCK_DET_EN, 0x3);
  193. usleep_range(10000, 15000);
  194. val = readl(pcie_phy->pma0 + REG_PCIE_PMA_RO_RX_FREQDET);
  195. if (val & PCIE_RO_FBCK_LOCK)
  196. break;
  197. }
  198. /* turn off force mode and update band values */
  199. airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_CDR0_PR_INJ_MODE,
  200. CSR_2L_PXP_CDR0_INJ_FORCE_OFF);
  201. airoha_phy_pma0_clear_bits(pcie_phy,
  202. REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_LPF_C,
  203. PCIE_FORCE_SEL_DA_PXP_CDR_PR_LPF_R_EN);
  204. airoha_phy_pma0_clear_bits(pcie_phy,
  205. REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_LPF_C,
  206. PCIE_FORCE_SEL_DA_PXP_CDR_PR_LPF_C_EN);
  207. airoha_phy_pma0_clear_bits(pcie_phy,
  208. REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_PIEYE_PWDB,
  209. PCIE_FORCE_SEL_DA_PXP_CDR_PR_PWDB);
  210. airoha_phy_pma0_clear_bits(pcie_phy,
  211. REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_IDAC,
  212. PCIE_FORCE_SEL_DA_PXP_CDR_PR_IDAC);
  213. if (gen == PCIE_PORT_GEN3) {
  214. airoha_phy_pma0_update_field(pcie_phy,
  215. REG_PCIE_PMA_DIG_RESERVE_14,
  216. PCIE_FLL_IDAC_PCIEG3,
  217. cdr_pr_idac_tmp);
  218. } else {
  219. airoha_phy_pma0_update_field(pcie_phy,
  220. REG_PCIE_PMA_DIG_RESERVE_13,
  221. PCIE_FLL_IDAC_PCIEG1,
  222. cdr_pr_idac_tmp);
  223. airoha_phy_pma0_update_field(pcie_phy,
  224. REG_PCIE_PMA_DIG_RESERVE_13,
  225. PCIE_FLL_IDAC_PCIEG2,
  226. cdr_pr_idac_tmp);
  227. }
  228. }
  229. static void
  230. airoha_phy_init_lane1_rx_fw_pre_calib(struct airoha_pcie_phy *pcie_phy,
  231. enum airoha_pcie_port_gen gen)
  232. {
  233. u32 fl_out_target = gen == PCIE_PORT_GEN3 ? 41600 : 41941;
  234. u32 lock_cyclecnt = gen == PCIE_PORT_GEN3 ? 26000 : 32767;
  235. u32 pr_idac, val, cdr_pr_idac_tmp = 0;
  236. int i;
  237. airoha_phy_pma1_set_bits(pcie_phy,
  238. REG_PCIE_PMA_SS_LCPLL_PWCTL_SETTING_1,
  239. PCIE_LCPLL_MAN_PWDB);
  240. airoha_phy_pma1_update_field(pcie_phy, REG_PCIE_PMA_SS_RX_FREQ_DET2,
  241. PCIE_LOCK_TARGET_BEG,
  242. fl_out_target - 100);
  243. airoha_phy_pma1_update_field(pcie_phy, REG_PCIE_PMA_SS_RX_FREQ_DET2,
  244. PCIE_LOCK_TARGET_END,
  245. fl_out_target + 100);
  246. airoha_phy_pma1_update_field(pcie_phy, REG_PCIE_PMA_SS_RX_FREQ_DET1,
  247. PCIE_PLL_FT_LOCK_CYCLECNT, lock_cyclecnt);
  248. airoha_phy_pma1_update_field(pcie_phy, REG_PCIE_PMA_SS_RX_FREQ_DET4,
  249. PCIE_LOCK_LOCKTH, 0x3);
  250. airoha_phy_pma1_update_field(pcie_phy, REG_PCIE_PMA_SS_RX_FREQ_DET3,
  251. PCIE_UNLOCK_TARGET_BEG,
  252. fl_out_target - 100);
  253. airoha_phy_pma1_update_field(pcie_phy, REG_PCIE_PMA_SS_RX_FREQ_DET3,
  254. PCIE_UNLOCK_TARGET_END,
  255. fl_out_target + 100);
  256. airoha_phy_pma1_update_field(pcie_phy, REG_PCIE_PMA_SS_RX_FREQ_DET1,
  257. PCIE_PLL_FT_UNLOCK_CYCLECNT,
  258. lock_cyclecnt);
  259. airoha_phy_pma1_update_field(pcie_phy, REG_PCIE_PMA_SS_RX_FREQ_DET4,
  260. PCIE_UNLOCK_LOCKTH, 0x3);
  261. airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_CDR1_PR_INJ_MODE,
  262. CSR_2L_PXP_CDR1_INJ_FORCE_OFF);
  263. airoha_phy_pma1_set_bits(pcie_phy,
  264. REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_LPF_C,
  265. PCIE_FORCE_SEL_DA_PXP_CDR_PR_LPF_R_EN);
  266. airoha_phy_pma1_set_bits(pcie_phy,
  267. REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_LPF_C,
  268. PCIE_FORCE_DA_PXP_CDR_PR_LPF_R_EN);
  269. airoha_phy_pma1_set_bits(pcie_phy,
  270. REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_LPF_C,
  271. PCIE_FORCE_SEL_DA_PXP_CDR_PR_LPF_C_EN);
  272. airoha_phy_pma1_clear_bits(pcie_phy,
  273. REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_LPF_C,
  274. PCIE_FORCE_DA_PXP_CDR_PR_LPF_C_EN);
  275. airoha_phy_pma1_set_bits(pcie_phy,
  276. REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_IDAC,
  277. PCIE_FORCE_SEL_DA_PXP_CDR_PR_IDAC);
  278. airoha_phy_pma1_set_bits(pcie_phy,
  279. REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_PIEYE_PWDB,
  280. PCIE_FORCE_SEL_DA_PXP_CDR_PR_PWDB);
  281. airoha_phy_pma1_clear_bits(pcie_phy,
  282. REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_PIEYE_PWDB,
  283. PCIE_FORCE_DA_PXP_CDR_PR_PWDB);
  284. airoha_phy_pma1_set_bits(pcie_phy,
  285. REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_PIEYE_PWDB,
  286. PCIE_FORCE_DA_PXP_CDR_PR_PWDB);
  287. for (i = 0; i < LEQ_LEN_CTRL_MAX_VAL; i++) {
  288. airoha_phy_pma1_update_field(pcie_phy,
  289. REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_IDAC,
  290. PCIE_FORCE_DA_PXP_CDR_PR_IDAC, i << 8);
  291. airoha_phy_pma1_clear_bits(pcie_phy,
  292. REG_PCIE_PMA_SS_RX_FREQ_DET4,
  293. PCIE_FREQLOCK_DET_EN);
  294. airoha_phy_pma1_update_field(pcie_phy,
  295. REG_PCIE_PMA_SS_RX_FREQ_DET4,
  296. PCIE_FREQLOCK_DET_EN, 0x3);
  297. usleep_range(10000, 15000);
  298. val = FIELD_GET(PCIE_RO_FL_OUT,
  299. readl(pcie_phy->pma1 +
  300. REG_PCIE_PMA_RO_RX_FREQDET));
  301. if (val > fl_out_target)
  302. cdr_pr_idac_tmp = i << 8;
  303. }
  304. for (i = LEQ_LEN_CTRL_MAX_VAL; i >= 0; i--) {
  305. pr_idac = cdr_pr_idac_tmp | (0x1 << i);
  306. airoha_phy_pma1_update_field(pcie_phy,
  307. REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_IDAC,
  308. PCIE_FORCE_DA_PXP_CDR_PR_IDAC, pr_idac);
  309. airoha_phy_pma1_clear_bits(pcie_phy,
  310. REG_PCIE_PMA_SS_RX_FREQ_DET4,
  311. PCIE_FREQLOCK_DET_EN);
  312. airoha_phy_pma1_update_field(pcie_phy,
  313. REG_PCIE_PMA_SS_RX_FREQ_DET4,
  314. PCIE_FREQLOCK_DET_EN, 0x3);
  315. usleep_range(10000, 15000);
  316. val = FIELD_GET(PCIE_RO_FL_OUT,
  317. readl(pcie_phy->pma1 +
  318. REG_PCIE_PMA_RO_RX_FREQDET));
  319. if (val < fl_out_target)
  320. pr_idac &= ~(0x1 << i);
  321. cdr_pr_idac_tmp = pr_idac;
  322. }
  323. airoha_phy_pma1_update_field(pcie_phy,
  324. REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_IDAC,
  325. PCIE_FORCE_DA_PXP_CDR_PR_IDAC,
  326. cdr_pr_idac_tmp);
  327. for (i = 0; i < FREQ_LOCK_MAX_ATTEMPT; i++) {
  328. u32 val;
  329. airoha_phy_pma1_clear_bits(pcie_phy,
  330. REG_PCIE_PMA_SS_RX_FREQ_DET4,
  331. PCIE_FREQLOCK_DET_EN);
  332. airoha_phy_pma1_update_field(pcie_phy,
  333. REG_PCIE_PMA_SS_RX_FREQ_DET4,
  334. PCIE_FREQLOCK_DET_EN, 0x3);
  335. usleep_range(10000, 15000);
  336. val = readl(pcie_phy->pma1 + REG_PCIE_PMA_RO_RX_FREQDET);
  337. if (val & PCIE_RO_FBCK_LOCK)
  338. break;
  339. }
  340. /* turn off force mode and update band values */
  341. airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_CDR1_PR_INJ_MODE,
  342. CSR_2L_PXP_CDR1_INJ_FORCE_OFF);
  343. airoha_phy_pma1_clear_bits(pcie_phy,
  344. REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_LPF_C,
  345. PCIE_FORCE_SEL_DA_PXP_CDR_PR_LPF_R_EN);
  346. airoha_phy_pma1_clear_bits(pcie_phy,
  347. REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_LPF_C,
  348. PCIE_FORCE_SEL_DA_PXP_CDR_PR_LPF_C_EN);
  349. airoha_phy_pma1_clear_bits(pcie_phy,
  350. REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_PIEYE_PWDB,
  351. PCIE_FORCE_SEL_DA_PXP_CDR_PR_PWDB);
  352. airoha_phy_pma1_clear_bits(pcie_phy,
  353. REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_IDAC,
  354. PCIE_FORCE_SEL_DA_PXP_CDR_PR_IDAC);
  355. if (gen == PCIE_PORT_GEN3) {
  356. airoha_phy_pma1_update_field(pcie_phy,
  357. REG_PCIE_PMA_DIG_RESERVE_14,
  358. PCIE_FLL_IDAC_PCIEG3,
  359. cdr_pr_idac_tmp);
  360. } else {
  361. airoha_phy_pma1_update_field(pcie_phy,
  362. REG_PCIE_PMA_DIG_RESERVE_13,
  363. PCIE_FLL_IDAC_PCIEG1,
  364. cdr_pr_idac_tmp);
  365. airoha_phy_pma1_update_field(pcie_phy,
  366. REG_PCIE_PMA_DIG_RESERVE_13,
  367. PCIE_FLL_IDAC_PCIEG2,
  368. cdr_pr_idac_tmp);
  369. }
  370. }
  371. static void airoha_pcie_phy_init_default(struct airoha_pcie_phy *pcie_phy)
  372. {
  373. airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_CMN,
  374. CSR_2L_PXP_CMN_TRIM_MASK, 0x10);
  375. writel(0xcccbcccb, pcie_phy->pma0 + REG_PCIE_PMA_DIG_RESERVE_21);
  376. writel(0xcccb, pcie_phy->pma0 + REG_PCIE_PMA_DIG_RESERVE_22);
  377. writel(0xcccbcccb, pcie_phy->pma1 + REG_PCIE_PMA_DIG_RESERVE_21);
  378. writel(0xcccb, pcie_phy->pma1 + REG_PCIE_PMA_DIG_RESERVE_22);
  379. airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_CMN,
  380. CSR_2L_PXP_CMN_LANE_EN);
  381. }
  382. static void airoha_pcie_phy_init_clk_out(struct airoha_pcie_phy *pcie_phy)
  383. {
  384. airoha_phy_csr_2l_update_field(pcie_phy,
  385. REG_CSR_2L_TXPLL_POSTDIV_D256,
  386. CSR_2L_PXP_CLKTX0_AMP, 0x5);
  387. airoha_phy_csr_2l_update_field(pcie_phy,
  388. REG_CSR_2L_CLKTX0_FORCE_OUT1,
  389. CSR_2L_PXP_CLKTX1_AMP, 0x5);
  390. airoha_phy_csr_2l_update_field(pcie_phy,
  391. REG_CSR_2L_TXPLL_POSTDIV_D256,
  392. CSR_2L_PXP_CLKTX0_OFFSET, 0x2);
  393. airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_CLKTX1_OFFSET,
  394. CSR_2L_PXP_CLKTX1_OFFSET, 0x2);
  395. airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_CLKTX0_FORCE_OUT1,
  396. CSR_2L_PXP_CLKTX0_HZ);
  397. airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_CLKTX1_OFFSET,
  398. CSR_2L_PXP_CLKTX1_HZ);
  399. airoha_phy_csr_2l_update_field(pcie_phy,
  400. REG_CSR_2L_CLKTX0_FORCE_OUT1,
  401. CSR_2L_PXP_CLKTX0_IMP_SEL, 0x12);
  402. airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_CLKTX1_IMP_SEL,
  403. CSR_2L_PXP_CLKTX1_IMP_SEL, 0x12);
  404. airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_TXPLL_POSTDIV_D256,
  405. CSR_2L_PXP_CLKTX0_SR);
  406. airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_CLKTX1_OFFSET,
  407. CSR_2L_PXP_CLKTX1_SR);
  408. airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_PLL_CMN_RESERVE0,
  409. CSR_2L_PXP_PLL_RESERVE_MASK, 0xd0d);
  410. }
  411. static void airoha_pcie_phy_init_csr_2l(struct airoha_pcie_phy *pcie_phy)
  412. {
  413. airoha_phy_pma0_set_bits(pcie_phy, REG_PCIE_PMA_SW_RESET,
  414. PCIE_SW_XFI_RXPCS_RST | PCIE_SW_REF_RST |
  415. PCIE_SW_RX_RST);
  416. airoha_phy_pma1_set_bits(pcie_phy, REG_PCIE_PMA_SW_RESET,
  417. PCIE_SW_XFI_RXPCS_RST | PCIE_SW_REF_RST |
  418. PCIE_SW_RX_RST);
  419. airoha_phy_pma0_set_bits(pcie_phy, REG_PCIE_PMA_TX_RESET,
  420. PCIE_TX_TOP_RST | PCIE_TX_CAL_RST);
  421. airoha_phy_pma1_set_bits(pcie_phy, REG_PCIE_PMA_TX_RESET,
  422. PCIE_TX_TOP_RST | PCIE_TX_CAL_RST);
  423. }
  424. static void airoha_pcie_phy_init_rx(struct airoha_pcie_phy *pcie_phy)
  425. {
  426. writel(0x2a00090b, pcie_phy->pma0 + REG_PCIE_PMA_DIG_RESERVE_17);
  427. writel(0x2a00090b, pcie_phy->pma1 + REG_PCIE_PMA_DIG_RESERVE_17);
  428. airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_CDR0_PR_MONPI,
  429. CSR_2L_PXP_CDR0_PR_XFICK_EN);
  430. airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_CDR1_PR_MONPI,
  431. CSR_2L_PXP_CDR1_PR_XFICK_EN);
  432. airoha_phy_csr_2l_clear_bits(pcie_phy,
  433. REG_CSR_2L_CDR0_PD_PICAL_CKD8_INV,
  434. CSR_2L_PXP_CDR0_PD_EDGE_DISABLE);
  435. airoha_phy_csr_2l_clear_bits(pcie_phy,
  436. REG_CSR_2L_CDR1_PD_PICAL_CKD8_INV,
  437. CSR_2L_PXP_CDR1_PD_EDGE_DISABLE);
  438. airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_RX0_PHYCK_DIV,
  439. CSR_2L_PXP_RX0_PHYCK_SEL, 0x1);
  440. airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_RX1_PHYCK_DIV,
  441. CSR_2L_PXP_RX1_PHYCK_SEL, 0x1);
  442. }
  443. static void airoha_pcie_phy_init_jcpll(struct airoha_pcie_phy *pcie_phy)
  444. {
  445. airoha_phy_pma0_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_PXP_JCPLL_CKOUT,
  446. PCIE_FORCE_SEL_DA_PXP_JCPLL_EN);
  447. airoha_phy_pma0_clear_bits(pcie_phy,
  448. REG_PCIE_PMA_FORCE_PXP_JCPLL_CKOUT,
  449. PCIE_FORCE_DA_PXP_JCPLL_EN);
  450. airoha_phy_pma1_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_PXP_JCPLL_CKOUT,
  451. PCIE_FORCE_SEL_DA_PXP_JCPLL_EN);
  452. airoha_phy_pma1_clear_bits(pcie_phy,
  453. REG_PCIE_PMA_FORCE_PXP_JCPLL_CKOUT,
  454. PCIE_FORCE_DA_PXP_JCPLL_EN);
  455. airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_JCPLL_TCL_VTP_EN,
  456. CSR_2L_PXP_JCPLL_SPARE_LOW, 0x20);
  457. airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_JCPLL_RST_DLY,
  458. CSR_2L_PXP_JCPLL_RST);
  459. writel(0x0, pcie_phy->csr_2l + REG_CSR_2L_JCPLL_SSC_DELTA1);
  460. airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_JCPLL_SSC_PERIOD,
  461. CSR_2L_PXP_JCPLL_SSC_PERIOD);
  462. airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_JCPLL_SSC,
  463. CSR_2L_PXP_JCPLL_SSC_PHASE_INI);
  464. airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_JCPLL_SSC,
  465. CSR_2L_PXP_JCPLL_SSC_TRI_EN);
  466. airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_JCPLL_LPF_BR,
  467. CSR_2L_PXP_JCPLL_LPF_BR, 0xa);
  468. airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_JCPLL_LPF_BR,
  469. CSR_2L_PXP_JCPLL_LPF_BP, 0xc);
  470. airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_JCPLL_LPF_BR,
  471. CSR_2L_PXP_JCPLL_LPF_BC, 0x1f);
  472. airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_JCPLL_LPF_BWC,
  473. CSR_2L_PXP_JCPLL_LPF_BWC, 0x1e);
  474. airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_JCPLL_LPF_BR,
  475. CSR_2L_PXP_JCPLL_LPF_BWR, 0xa);
  476. airoha_phy_csr_2l_update_field(pcie_phy,
  477. REG_CSR_2L_JCPLL_MMD_PREDIV_MODE,
  478. CSR_2L_PXP_JCPLL_MMD_PREDIV_MODE,
  479. 0x1);
  480. airoha_phy_csr_2l_clear_bits(pcie_phy, CSR_2L_PXP_JCPLL_MONCK,
  481. CSR_2L_PXP_JCPLL_REFIN_DIV);
  482. airoha_phy_pma0_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_DA_PXP_RX_FE_VOS,
  483. PCIE_FORCE_SEL_DA_PXP_JCPLL_SDM_PCW);
  484. airoha_phy_pma1_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_DA_PXP_RX_FE_VOS,
  485. PCIE_FORCE_SEL_DA_PXP_JCPLL_SDM_PCW);
  486. airoha_phy_pma0_update_field(pcie_phy,
  487. REG_PCIE_PMA_FORCE_DA_PXP_JCPLL_SDM_PCW,
  488. PCIE_FORCE_DA_PXP_JCPLL_SDM_PCW,
  489. 0x50000000);
  490. airoha_phy_pma1_update_field(pcie_phy,
  491. REG_PCIE_PMA_FORCE_DA_PXP_JCPLL_SDM_PCW,
  492. PCIE_FORCE_DA_PXP_JCPLL_SDM_PCW,
  493. 0x50000000);
  494. airoha_phy_csr_2l_set_bits(pcie_phy,
  495. REG_CSR_2L_JCPLL_MMD_PREDIV_MODE,
  496. CSR_2L_PXP_JCPLL_POSTDIV_D5);
  497. airoha_phy_csr_2l_set_bits(pcie_phy,
  498. REG_CSR_2L_JCPLL_MMD_PREDIV_MODE,
  499. CSR_2L_PXP_JCPLL_POSTDIV_D2);
  500. airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_JCPLL_RST_DLY,
  501. CSR_2L_PXP_JCPLL_RST_DLY, 0x4);
  502. airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_JCPLL_RST_DLY,
  503. CSR_2L_PXP_JCPLL_SDM_DI_LS);
  504. airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_JCPLL_TCL_KBAND_VREF,
  505. CSR_2L_PXP_JCPLL_VCO_KBAND_MEAS_EN);
  506. airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_JCPLL_IB_EXT,
  507. CSR_2L_PXP_JCPLL_CHP_IOFST);
  508. airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_JCPLL_IB_EXT,
  509. CSR_2L_PXP_JCPLL_CHP_IBIAS, 0xc);
  510. airoha_phy_csr_2l_update_field(pcie_phy,
  511. REG_CSR_2L_JCPLL_MMD_PREDIV_MODE,
  512. CSR_2L_PXP_JCPLL_MMD_PREDIV_MODE,
  513. 0x1);
  514. airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_JCPLL_VCODIV,
  515. CSR_2L_PXP_JCPLL_VCO_HALFLSB_EN);
  516. airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_JCPLL_VCODIV,
  517. CSR_2L_PXP_JCPLL_VCO_CFIX, 0x1);
  518. airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_JCPLL_VCODIV,
  519. CSR_2L_PXP_JCPLL_VCO_SCAPWR, 0x4);
  520. airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_JCPLL_IB_EXT,
  521. REG_CSR_2L_JCPLL_LPF_SHCK_EN);
  522. airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_JCPLL_KBAND_KFC,
  523. CSR_2L_PXP_JCPLL_POSTDIV_EN);
  524. airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_JCPLL_KBAND_KFC,
  525. CSR_2L_PXP_JCPLL_KBAND_KFC);
  526. airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_JCPLL_KBAND_KFC,
  527. CSR_2L_PXP_JCPLL_KBAND_KF, 0x3);
  528. airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_JCPLL_KBAND_KFC,
  529. CSR_2L_PXP_JCPLL_KBAND_KS);
  530. airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_JCPLL_LPF_BWC,
  531. CSR_2L_PXP_JCPLL_KBAND_DIV, 0x1);
  532. airoha_phy_pma0_set_bits(pcie_phy, REG_PCIE_PMA_SCAN_MODE,
  533. PCIE_FORCE_SEL_DA_PXP_JCPLL_KBAND_LOAD_EN);
  534. airoha_phy_pma0_clear_bits(pcie_phy, REG_PCIE_PMA_SCAN_MODE,
  535. PCIE_FORCE_DA_PXP_JCPLL_KBAND_LOAD_EN);
  536. airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_JCPLL_LPF_BWC,
  537. CSR_2L_PXP_JCPLL_KBAND_CODE, 0xe4);
  538. airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_JCPLL_SDM_HREN,
  539. CSR_2L_PXP_JCPLL_TCL_AMP_EN);
  540. airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_JCPLL_TCL_CMP,
  541. CSR_2L_PXP_JCPLL_TCL_LPF_EN);
  542. airoha_phy_csr_2l_update_field(pcie_phy,
  543. REG_CSR_2L_JCPLL_TCL_KBAND_VREF,
  544. CSR_2L_PXP_JCPLL_TCL_KBAND_VREF, 0xf);
  545. airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_JCPLL_SDM_HREN,
  546. CSR_2L_PXP_JCPLL_TCL_AMP_GAIN, 0x1);
  547. airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_JCPLL_SDM_HREN,
  548. CSR_2L_PXP_JCPLL_TCL_AMP_VREF, 0x5);
  549. airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_JCPLL_TCL_CMP,
  550. CSR_2L_PXP_JCPLL_TCL_LPF_BW, 0x1);
  551. airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_JCPLL_VCO_TCLVAR,
  552. CSR_2L_PXP_JCPLL_VCO_TCLVAR, 0x3);
  553. airoha_phy_pma0_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_PXP_JCPLL_CKOUT,
  554. PCIE_FORCE_SEL_DA_PXP_JCPLL_CKOUT_EN);
  555. airoha_phy_pma0_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_PXP_JCPLL_CKOUT,
  556. PCIE_FORCE_DA_PXP_JCPLL_CKOUT_EN);
  557. airoha_phy_pma1_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_PXP_JCPLL_CKOUT,
  558. PCIE_FORCE_SEL_DA_PXP_JCPLL_CKOUT_EN);
  559. airoha_phy_pma1_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_PXP_JCPLL_CKOUT,
  560. PCIE_FORCE_DA_PXP_JCPLL_CKOUT_EN);
  561. airoha_phy_pma0_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_PXP_JCPLL_CKOUT,
  562. PCIE_FORCE_SEL_DA_PXP_JCPLL_EN);
  563. airoha_phy_pma0_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_PXP_JCPLL_CKOUT,
  564. PCIE_FORCE_DA_PXP_JCPLL_EN);
  565. airoha_phy_pma1_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_PXP_JCPLL_CKOUT,
  566. PCIE_FORCE_SEL_DA_PXP_JCPLL_EN);
  567. airoha_phy_pma1_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_PXP_JCPLL_CKOUT,
  568. PCIE_FORCE_DA_PXP_JCPLL_EN);
  569. }
  570. static void airoha_pcie_phy_txpll(struct airoha_pcie_phy *pcie_phy)
  571. {
  572. airoha_phy_pma0_set_bits(pcie_phy,
  573. REG_PCIE_PMA_FORCE_DA_PXP_TXPLL_CKOUT,
  574. PCIE_FORCE_SEL_DA_PXP_TXPLL_EN);
  575. airoha_phy_pma0_clear_bits(pcie_phy,
  576. REG_PCIE_PMA_FORCE_DA_PXP_TXPLL_CKOUT,
  577. PCIE_FORCE_DA_PXP_TXPLL_EN);
  578. airoha_phy_pma1_set_bits(pcie_phy,
  579. REG_PCIE_PMA_FORCE_DA_PXP_TXPLL_CKOUT,
  580. PCIE_FORCE_SEL_DA_PXP_TXPLL_EN);
  581. airoha_phy_pma1_clear_bits(pcie_phy,
  582. REG_PCIE_PMA_FORCE_DA_PXP_TXPLL_CKOUT,
  583. PCIE_FORCE_DA_PXP_TXPLL_EN);
  584. airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_TXPLL_REFIN_DIV,
  585. CSR_2L_PXP_TXPLL_PLL_RSTB);
  586. writel(0x0, pcie_phy->csr_2l + REG_CSR_2L_TXPLL_SSC_DELTA1);
  587. airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_TXPLL_SSC_PERIOD,
  588. CSR_2L_PXP_txpll_SSC_PERIOD);
  589. airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_TXPLL_CHP_IOFST,
  590. CSR_2L_PXP_TXPLL_CHP_IOFST, 0x1);
  591. airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_750M_SYS_CK,
  592. CSR_2L_PXP_TXPLL_CHP_IBIAS, 0x2d);
  593. airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_TXPLL_REFIN_DIV,
  594. CSR_2L_PXP_TXPLL_REFIN_DIV);
  595. airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_TXPLL_TCL_LPF_BW,
  596. CSR_2L_PXP_TXPLL_VCO_CFIX, 0x3);
  597. airoha_phy_pma0_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_IDAC,
  598. PCIE_FORCE_SEL_DA_PXP_TXPLL_SDM_PCW);
  599. airoha_phy_pma1_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_IDAC,
  600. PCIE_FORCE_SEL_DA_PXP_TXPLL_SDM_PCW);
  601. airoha_phy_pma0_update_field(pcie_phy,
  602. REG_PCIE_PMA_FORCE_DA_PXP_TXPLL_SDM_PCW,
  603. PCIE_FORCE_DA_PXP_TXPLL_SDM_PCW,
  604. 0xc800000);
  605. airoha_phy_pma1_update_field(pcie_phy,
  606. REG_PCIE_PMA_FORCE_DA_PXP_TXPLL_SDM_PCW,
  607. PCIE_FORCE_DA_PXP_TXPLL_SDM_PCW,
  608. 0xc800000);
  609. airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_TXPLL_SDM_DI_LS,
  610. CSR_2L_PXP_TXPLL_SDM_IFM);
  611. airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_TXPLL_SSC,
  612. CSR_2L_PXP_TXPLL_SSC_PHASE_INI);
  613. airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_TXPLL_REFIN_DIV,
  614. CSR_2L_PXP_TXPLL_RST_DLY, 0x4);
  615. airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_TXPLL_SDM_DI_LS,
  616. CSR_2L_PXP_TXPLL_SDM_DI_LS);
  617. airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_TXPLL_SDM_DI_LS,
  618. CSR_2L_PXP_TXPLL_SDM_ORD, 0x3);
  619. airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_TXPLL_TCL_KBAND_VREF,
  620. CSR_2L_PXP_TXPLL_VCO_KBAND_MEAS_EN);
  621. writel(0x0, pcie_phy->csr_2l + REG_CSR_2L_TXPLL_SSC_DELTA1);
  622. airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_TXPLL_CHP_IOFST,
  623. CSR_2L_PXP_TXPLL_LPF_BP, 0x1);
  624. airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_TXPLL_CHP_IOFST,
  625. CSR_2L_PXP_TXPLL_LPF_BC, 0x18);
  626. airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_TXPLL_CHP_IOFST,
  627. CSR_2L_PXP_TXPLL_LPF_BR, 0x5);
  628. airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_TXPLL_CHP_IOFST,
  629. CSR_2L_PXP_TXPLL_CHP_IOFST, 0x1);
  630. airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_750M_SYS_CK,
  631. CSR_2L_PXP_TXPLL_CHP_IBIAS, 0x2d);
  632. airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_TXPLL_TCL_VTP,
  633. CSR_2L_PXP_TXPLL_SPARE_L, 0x1);
  634. airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_TXPLL_LPF_BWR,
  635. CSR_2L_PXP_TXPLL_LPF_BWC);
  636. airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_TXPLL_POSTDIV,
  637. CSR_2L_PXP_TXPLL_MMD_PREDIV_MODE);
  638. airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_TXPLL_REFIN_DIV,
  639. CSR_2L_PXP_TXPLL_REFIN_DIV);
  640. airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_TXPLL_TCL_LPF_BW,
  641. CSR_2L_PXP_TXPLL_VCO_HALFLSB_EN);
  642. airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_TXPLL_VCO_SCAPWR,
  643. CSR_2L_PXP_TXPLL_VCO_SCAPWR, 0x7);
  644. airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_TXPLL_TCL_LPF_BW,
  645. CSR_2L_PXP_TXPLL_VCO_CFIX, 0x3);
  646. airoha_phy_pma0_set_bits(pcie_phy,
  647. REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_IDAC,
  648. PCIE_FORCE_SEL_DA_PXP_TXPLL_SDM_PCW);
  649. airoha_phy_pma1_set_bits(pcie_phy,
  650. REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_IDAC,
  651. PCIE_FORCE_SEL_DA_PXP_TXPLL_SDM_PCW);
  652. airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_TXPLL_SSC,
  653. CSR_2L_PXP_TXPLL_SSC_PHASE_INI);
  654. airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_TXPLL_LPF_BWR,
  655. CSR_2L_PXP_TXPLL_LPF_BWR);
  656. airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_TXPLL_PHY_CK2,
  657. CSR_2L_PXP_TXPLL_REFIN_INTERNAL);
  658. airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_TXPLL_TCL_KBAND_VREF,
  659. CSR_2L_PXP_TXPLL_VCO_KBAND_MEAS_EN);
  660. airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_TXPLL_VTP,
  661. CSR_2L_PXP_TXPLL_VTP_EN);
  662. airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_TXPLL_POSTDIV,
  663. CSR_2L_PXP_TXPLL_PHY_CK1_EN);
  664. airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_TXPLL_PHY_CK2,
  665. CSR_2L_PXP_TXPLL_REFIN_INTERNAL);
  666. airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_TXPLL_SSC,
  667. CSR_2L_PXP_TXPLL_SSC_EN);
  668. airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_750M_SYS_CK,
  669. CSR_2L_PXP_TXPLL_LPF_SHCK_EN);
  670. airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_TXPLL_POSTDIV,
  671. CSR_2L_PXP_TXPLL_POSTDIV_EN);
  672. airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_TXPLL_KBAND_DIV,
  673. CSR_2L_PXP_TXPLL_KBAND_KFC);
  674. airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_TXPLL_KBAND_DIV,
  675. CSR_2L_PXP_TXPLL_KBAND_KF, 0x3);
  676. airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_TXPLL_KBAND_DIV,
  677. CSR_2L_PXP_txpll_KBAND_KS, 0x1);
  678. airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_TXPLL_KBAND_DIV,
  679. CSR_2L_PXP_TXPLL_KBAND_DIV, 0x4);
  680. airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_TXPLL_LPF_BWR,
  681. CSR_2L_PXP_TXPLL_KBAND_CODE, 0xe4);
  682. airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_TXPLL_SDM_OUT,
  683. CSR_2L_PXP_TXPLL_TCL_AMP_EN);
  684. airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_TXPLL_TCL_AMP_VREF,
  685. CSR_2L_PXP_TXPLL_TCL_LPF_EN);
  686. airoha_phy_csr_2l_update_field(pcie_phy,
  687. REG_CSR_2L_TXPLL_TCL_KBAND_VREF,
  688. CSR_2L_PXP_TXPLL_TCL_KBAND_VREF, 0xf);
  689. airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_TXPLL_SDM_OUT,
  690. CSR_2L_PXP_TXPLL_TCL_AMP_GAIN, 0x3);
  691. airoha_phy_csr_2l_update_field(pcie_phy,
  692. REG_CSR_2L_TXPLL_TCL_AMP_VREF,
  693. CSR_2L_PXP_TXPLL_TCL_AMP_VREF, 0xb);
  694. airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_TXPLL_TCL_LPF_BW,
  695. CSR_2L_PXP_TXPLL_TCL_LPF_BW, 0x3);
  696. airoha_phy_pma0_set_bits(pcie_phy,
  697. REG_PCIE_PMA_FORCE_DA_PXP_TXPLL_CKOUT,
  698. PCIE_FORCE_SEL_DA_PXP_TXPLL_CKOUT_EN);
  699. airoha_phy_pma0_set_bits(pcie_phy,
  700. REG_PCIE_PMA_FORCE_DA_PXP_TXPLL_CKOUT,
  701. PCIE_FORCE_DA_PXP_TXPLL_CKOUT_EN);
  702. airoha_phy_pma1_set_bits(pcie_phy,
  703. REG_PCIE_PMA_FORCE_DA_PXP_TXPLL_CKOUT,
  704. PCIE_FORCE_SEL_DA_PXP_TXPLL_CKOUT_EN);
  705. airoha_phy_pma1_set_bits(pcie_phy,
  706. REG_PCIE_PMA_FORCE_DA_PXP_TXPLL_CKOUT,
  707. PCIE_FORCE_DA_PXP_TXPLL_CKOUT_EN);
  708. airoha_phy_pma0_set_bits(pcie_phy,
  709. REG_PCIE_PMA_FORCE_DA_PXP_TXPLL_CKOUT,
  710. PCIE_FORCE_SEL_DA_PXP_TXPLL_EN);
  711. airoha_phy_pma0_set_bits(pcie_phy,
  712. REG_PCIE_PMA_FORCE_DA_PXP_TXPLL_CKOUT,
  713. PCIE_FORCE_DA_PXP_TXPLL_EN);
  714. airoha_phy_pma1_set_bits(pcie_phy,
  715. REG_PCIE_PMA_FORCE_DA_PXP_TXPLL_CKOUT,
  716. PCIE_FORCE_SEL_DA_PXP_TXPLL_EN);
  717. airoha_phy_pma1_set_bits(pcie_phy,
  718. REG_PCIE_PMA_FORCE_DA_PXP_TXPLL_CKOUT,
  719. PCIE_FORCE_DA_PXP_TXPLL_EN);
  720. }
  721. static void airoha_pcie_phy_init_ssc_jcpll(struct airoha_pcie_phy *pcie_phy)
  722. {
  723. airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_JCPLL_SSC_DELTA1,
  724. CSR_2L_PXP_JCPLL_SSC_DELTA1, 0x106);
  725. airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_JCPLL_SSC_DELTA1,
  726. CSR_2L_PXP_JCPLL_SSC_DELTA, 0x106);
  727. airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_JCPLL_SSC_PERIOD,
  728. CSR_2L_PXP_JCPLL_SSC_PERIOD, 0x31b);
  729. airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_JCPLL_SSC,
  730. CSR_2L_PXP_JCPLL_SSC_PHASE_INI);
  731. airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_JCPLL_SSC,
  732. CSR_2L_PXP_JCPLL_SSC_EN);
  733. airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_JCPLL_SDM_IFM,
  734. CSR_2L_PXP_JCPLL_SDM_IFM);
  735. airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_JCPLL_SDM_HREN,
  736. CSR_2L_PXP_JCPLL_SDM_HREN);
  737. airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_JCPLL_RST_DLY,
  738. CSR_2L_PXP_JCPLL_SDM_DI_EN);
  739. airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_JCPLL_SSC,
  740. CSR_2L_PXP_JCPLL_SSC_TRI_EN);
  741. }
  742. static void
  743. airoha_pcie_phy_set_rxlan0_signal_detect(struct airoha_pcie_phy *pcie_phy)
  744. {
  745. airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_CDR0_PR_COR_HBW,
  746. CSR_2L_PXP_CDR0_PR_LDO_FORCE_ON);
  747. usleep_range(100, 200);
  748. airoha_phy_pma0_update_field(pcie_phy, REG_PCIE_PMA_DIG_RESERVE_19,
  749. PCIE_PCP_RX_REV0_PCIE_GEN1, 0x18b0);
  750. airoha_phy_pma0_update_field(pcie_phy, REG_PCIE_PMA_DIG_RESERVE_20,
  751. PCIE_PCP_RX_REV0_PCIE_GEN2, 0x18b0);
  752. airoha_phy_pma0_update_field(pcie_phy, REG_PCIE_PMA_DIG_RESERVE_20,
  753. PCIE_PCP_RX_REV0_PCIE_GEN3, 0x1030);
  754. airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_RX0_SIGDET_DCTEST,
  755. CSR_2L_PXP_RX0_SIGDET_PEAK, 0x2);
  756. airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_RX0_SIGDET_VTH_SEL,
  757. CSR_2L_PXP_RX0_SIGDET_VTH_SEL, 0x5);
  758. airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_RX0_REV0,
  759. CSR_2L_PXP_VOS_PNINV, 0x2);
  760. airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_RX0_SIGDET_DCTEST,
  761. CSR_2L_PXP_RX0_SIGDET_LPF_CTRL, 0x1);
  762. airoha_phy_pma0_update_field(pcie_phy, REG_PCIE_PMA_SS_RX_CAL2,
  763. PCIE_CAL_OUT_OS, 0x0);
  764. airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_PXP_RX0_FE_VB_EQ2,
  765. CSR_2L_PXP_RX0_FE_VCM_GEN_PWDB);
  766. airoha_phy_pma0_set_bits(pcie_phy,
  767. REG_PCIE_PMA_FORCE_DA_PXP_RX_FE_GAIN_CTRL,
  768. PCIE_FORCE_SEL_DA_PXP_RX_FE_PWDB);
  769. airoha_phy_pma0_update_field(pcie_phy,
  770. REG_PCIE_PMA_FORCE_DA_PXP_RX_FE_GAIN_CTRL,
  771. PCIE_FORCE_DA_PXP_RX_FE_GAIN_CTRL, 0x3);
  772. airoha_phy_pma0_update_field(pcie_phy, REG_PCIE_PMA_RX_FORCE_MODE0,
  773. PCIE_FORCE_DA_XPON_RX_FE_GAIN_CTRL, 0x1);
  774. airoha_phy_pma0_update_field(pcie_phy, REG_PCIE_PMA_SS_RX_SIGDET0,
  775. PCIE_SIGDET_WIN_NONVLD_TIMES, 0x3);
  776. airoha_phy_pma0_clear_bits(pcie_phy, REG_PCIE_PMA_SEQUENCE_DISB_CTRL1,
  777. PCIE_DISB_RX_SDCAL_EN);
  778. airoha_phy_pma0_set_bits(pcie_phy,
  779. REG_PCIE_PMA_CTRL_SEQUENCE_FORCE_CTRL1,
  780. PCIE_FORCE_RX_SDCAL_EN);
  781. usleep_range(150, 200);
  782. airoha_phy_pma0_clear_bits(pcie_phy,
  783. REG_PCIE_PMA_CTRL_SEQUENCE_FORCE_CTRL1,
  784. PCIE_FORCE_RX_SDCAL_EN);
  785. }
  786. static void
  787. airoha_pcie_phy_set_rxlan1_signal_detect(struct airoha_pcie_phy *pcie_phy)
  788. {
  789. airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_CDR1_PR_COR_HBW,
  790. CSR_2L_PXP_CDR1_PR_LDO_FORCE_ON);
  791. usleep_range(100, 200);
  792. airoha_phy_pma1_update_field(pcie_phy, REG_PCIE_PMA_DIG_RESERVE_19,
  793. PCIE_PCP_RX_REV0_PCIE_GEN1, 0x18b0);
  794. airoha_phy_pma1_update_field(pcie_phy, REG_PCIE_PMA_DIG_RESERVE_20,
  795. PCIE_PCP_RX_REV0_PCIE_GEN2, 0x18b0);
  796. airoha_phy_pma1_update_field(pcie_phy, REG_PCIE_PMA_DIG_RESERVE_20,
  797. PCIE_PCP_RX_REV0_PCIE_GEN3, 0x1030);
  798. airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_RX1_SIGDET_NOVTH,
  799. CSR_2L_PXP_RX1_SIGDET_PEAK, 0x2);
  800. airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_RX1_SIGDET_NOVTH,
  801. CSR_2L_PXP_RX1_SIGDET_VTH_SEL, 0x5);
  802. airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_RX1_REV0,
  803. CSR_2L_PXP_VOS_PNINV, 0x2);
  804. airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_RX1_DAC_RANGE_EYE,
  805. CSR_2L_PXP_RX1_SIGDET_LPF_CTRL, 0x1);
  806. airoha_phy_pma1_update_field(pcie_phy, REG_PCIE_PMA_SS_RX_CAL2,
  807. PCIE_CAL_OUT_OS, 0x0);
  808. airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_RX1_FE_VB_EQ1,
  809. CSR_2L_PXP_RX1_FE_VCM_GEN_PWDB);
  810. airoha_phy_pma1_set_bits(pcie_phy,
  811. REG_PCIE_PMA_FORCE_DA_PXP_RX_FE_GAIN_CTRL,
  812. PCIE_FORCE_SEL_DA_PXP_RX_FE_PWDB);
  813. airoha_phy_pma1_update_field(pcie_phy,
  814. REG_PCIE_PMA_FORCE_DA_PXP_RX_FE_GAIN_CTRL,
  815. PCIE_FORCE_DA_PXP_RX_FE_GAIN_CTRL, 0x3);
  816. airoha_phy_pma1_update_field(pcie_phy, REG_PCIE_PMA_RX_FORCE_MODE0,
  817. PCIE_FORCE_DA_XPON_RX_FE_GAIN_CTRL, 0x1);
  818. airoha_phy_pma1_update_field(pcie_phy, REG_PCIE_PMA_SS_RX_SIGDET0,
  819. PCIE_SIGDET_WIN_NONVLD_TIMES, 0x3);
  820. airoha_phy_pma1_clear_bits(pcie_phy, REG_PCIE_PMA_SEQUENCE_DISB_CTRL1,
  821. PCIE_DISB_RX_SDCAL_EN);
  822. airoha_phy_pma1_set_bits(pcie_phy,
  823. REG_PCIE_PMA_CTRL_SEQUENCE_FORCE_CTRL1,
  824. PCIE_FORCE_RX_SDCAL_EN);
  825. usleep_range(150, 200);
  826. airoha_phy_pma1_clear_bits(pcie_phy,
  827. REG_PCIE_PMA_CTRL_SEQUENCE_FORCE_CTRL1,
  828. PCIE_FORCE_RX_SDCAL_EN);
  829. }
  830. static void airoha_pcie_phy_set_rxflow(struct airoha_pcie_phy *pcie_phy)
  831. {
  832. airoha_phy_pma0_set_bits(pcie_phy,
  833. REG_PCIE_PMA_FORCE_DA_PXP_RX_SCAN_RST,
  834. PCIE_FORCE_DA_PXP_RX_SIGDET_PWDB |
  835. PCIE_FORCE_SEL_DA_PXP_RX_SIGDET_PWDB);
  836. airoha_phy_pma1_set_bits(pcie_phy,
  837. REG_PCIE_PMA_FORCE_DA_PXP_RX_SCAN_RST,
  838. PCIE_FORCE_DA_PXP_RX_SIGDET_PWDB |
  839. PCIE_FORCE_SEL_DA_PXP_RX_SIGDET_PWDB);
  840. airoha_phy_pma0_set_bits(pcie_phy,
  841. REG_PCIE_PMA_FORCE_DA_PXP_CDR_PD_PWDB,
  842. PCIE_FORCE_DA_PXP_CDR_PD_PWDB |
  843. PCIE_FORCE_SEL_DA_PXP_CDR_PD_PWDB);
  844. airoha_phy_pma0_set_bits(pcie_phy,
  845. REG_PCIE_PMA_FORCE_DA_PXP_RX_FE_PWDB,
  846. PCIE_FORCE_DA_PXP_RX_FE_PWDB |
  847. PCIE_FORCE_SEL_DA_PXP_RX_FE_PWDB);
  848. airoha_phy_pma1_set_bits(pcie_phy,
  849. REG_PCIE_PMA_FORCE_DA_PXP_CDR_PD_PWDB,
  850. PCIE_FORCE_DA_PXP_CDR_PD_PWDB |
  851. PCIE_FORCE_SEL_DA_PXP_CDR_PD_PWDB);
  852. airoha_phy_pma1_set_bits(pcie_phy,
  853. REG_PCIE_PMA_FORCE_DA_PXP_RX_FE_PWDB,
  854. PCIE_FORCE_DA_PXP_RX_FE_PWDB |
  855. PCIE_FORCE_SEL_DA_PXP_RX_FE_PWDB);
  856. airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_RX0_PHYCK_DIV,
  857. CSR_2L_PXP_RX0_PHYCK_RSTB |
  858. CSR_2L_PXP_RX0_TDC_CK_SEL);
  859. airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_RX1_PHYCK_DIV,
  860. CSR_2L_PXP_RX1_PHYCK_RSTB |
  861. CSR_2L_PXP_RX1_TDC_CK_SEL);
  862. airoha_phy_pma0_set_bits(pcie_phy, REG_PCIE_PMA_SW_RESET,
  863. PCIE_SW_RX_FIFO_RST | PCIE_SW_TX_RST |
  864. PCIE_SW_PMA_RST | PCIE_SW_ALLPCS_RST |
  865. PCIE_SW_TX_FIFO_RST);
  866. airoha_phy_pma1_set_bits(pcie_phy, REG_PCIE_PMA_SW_RESET,
  867. PCIE_SW_RX_FIFO_RST | PCIE_SW_TX_RST |
  868. PCIE_SW_PMA_RST | PCIE_SW_ALLPCS_RST |
  869. PCIE_SW_TX_FIFO_RST);
  870. airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_PXP_RX0_FE_VB_EQ2,
  871. CSR_2L_PXP_RX0_FE_VB_EQ2_EN |
  872. CSR_2L_PXP_RX0_FE_VB_EQ3_EN);
  873. airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_RX0_SIGDET_VTH_SEL,
  874. CSR_2L_PXP_RX0_FE_VB_EQ1_EN);
  875. airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_RX1_FE_VB_EQ1,
  876. CSR_2L_PXP_RX1_FE_VB_EQ1_EN |
  877. CSR_2L_PXP_RX1_FE_VB_EQ2_EN |
  878. CSR_2L_PXP_RX1_FE_VB_EQ3_EN);
  879. airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_RX0_REV0,
  880. CSR_2L_PXP_FE_GAIN_NORMAL_MODE, 0x4);
  881. airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_RX0_REV0,
  882. CSR_2L_PXP_FE_GAIN_TRAIN_MODE, 0x4);
  883. airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_RX1_REV0,
  884. CSR_2L_PXP_FE_GAIN_NORMAL_MODE, 0x4);
  885. airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_RX1_REV0,
  886. CSR_2L_PXP_FE_GAIN_TRAIN_MODE, 0x4);
  887. }
  888. static void airoha_pcie_phy_set_pr(struct airoha_pcie_phy *pcie_phy)
  889. {
  890. airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_CDR0_PR_VREG_IBAND,
  891. CSR_2L_PXP_CDR0_PR_VREG_IBAND, 0x5);
  892. airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_CDR0_PR_VREG_IBAND,
  893. CSR_2L_PXP_CDR0_PR_VREG_CKBUF, 0x5);
  894. airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_CDR0_PR_CKREF_DIV,
  895. CSR_2L_PXP_CDR0_PR_CKREF_DIV);
  896. airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_CDR0_PR_COR_HBW,
  897. CSR_2L_PXP_CDR0_PR_CKREF_DIV1);
  898. airoha_phy_csr_2l_update_field(pcie_phy,
  899. REG_CSR_2L_CDR1_PR_VREG_IBAND_VAL,
  900. CSR_2L_PXP_CDR1_PR_VREG_IBAND, 0x5);
  901. airoha_phy_csr_2l_update_field(pcie_phy,
  902. REG_CSR_2L_CDR1_PR_VREG_IBAND_VAL,
  903. CSR_2L_PXP_CDR1_PR_VREG_CKBUF, 0x5);
  904. airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_CDR1_PR_CKREF_DIV,
  905. CSR_2L_PXP_CDR1_PR_CKREF_DIV);
  906. airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_CDR1_PR_COR_HBW,
  907. CSR_2L_PXP_CDR1_PR_CKREF_DIV1);
  908. airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_CDR0_LPF_RATIO,
  909. CSR_2L_PXP_CDR0_LPF_TOP_LIM, 0x20000);
  910. airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_CDR1_LPF_RATIO,
  911. CSR_2L_PXP_CDR1_LPF_TOP_LIM, 0x20000);
  912. airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_CDR0_PR_BETA_DAC,
  913. CSR_2L_PXP_CDR0_PR_BETA_SEL, 0x2);
  914. airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_CDR1_PR_BETA_DAC,
  915. CSR_2L_PXP_CDR1_PR_BETA_SEL, 0x2);
  916. airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_CDR0_PR_BETA_DAC,
  917. CSR_2L_PXP_CDR0_PR_KBAND_DIV, 0x4);
  918. airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_CDR1_PR_BETA_DAC,
  919. CSR_2L_PXP_CDR1_PR_KBAND_DIV, 0x4);
  920. }
  921. static void airoha_pcie_phy_set_txflow(struct airoha_pcie_phy *pcie_phy)
  922. {
  923. airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_TX0_CKLDO,
  924. CSR_2L_PXP_TX0_CKLDO_EN);
  925. airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_TX1_CKLDO,
  926. CSR_2L_PXP_TX1_CKLDO_EN);
  927. airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_TX0_CKLDO,
  928. CSR_2L_PXP_TX0_DMEDGEGEN_EN);
  929. airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_TX1_CKLDO,
  930. CSR_2L_PXP_TX1_DMEDGEGEN_EN);
  931. airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_TX1_MULTLANE,
  932. CSR_2L_PXP_TX1_MULTLANE_EN);
  933. }
  934. static void airoha_pcie_phy_set_rx_mode(struct airoha_pcie_phy *pcie_phy)
  935. {
  936. writel(0x804000, pcie_phy->pma0 + REG_PCIE_PMA_DIG_RESERVE_27);
  937. airoha_phy_pma0_update_field(pcie_phy, REG_PCIE_PMA_DIG_RESERVE_18,
  938. PCIE_PXP_RX_VTH_SEL_PCIE_G1, 0x5);
  939. airoha_phy_pma0_update_field(pcie_phy, REG_PCIE_PMA_DIG_RESERVE_18,
  940. PCIE_PXP_RX_VTH_SEL_PCIE_G2, 0x5);
  941. airoha_phy_pma0_update_field(pcie_phy, REG_PCIE_PMA_DIG_RESERVE_18,
  942. PCIE_PXP_RX_VTH_SEL_PCIE_G3, 0x5);
  943. airoha_phy_pma0_set_bits(pcie_phy, REG_PCIE_PMA_DIG_RESERVE_30,
  944. 0x77700);
  945. airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_CDR0_PR_MONCK,
  946. CSR_2L_PXP_CDR0_PR_MONCK_ENABLE);
  947. airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_CDR0_PR_MONCK,
  948. CSR_2L_PXP_CDR0_PR_RESERVE0, 0x2);
  949. airoha_phy_csr_2l_update_field(pcie_phy,
  950. REG_CSR_2L_PXP_RX0_OSCAL_CTLE1IOS,
  951. CSR_2L_PXP_RX0_PR_OSCAL_VGA1IOS, 0x19);
  952. airoha_phy_csr_2l_update_field(pcie_phy,
  953. REG_CSR_2L_PXP_RX0_OSCA_VGA1VOS,
  954. CSR_2L_PXP_RX0_PR_OSCAL_VGA1VOS, 0x19);
  955. airoha_phy_csr_2l_update_field(pcie_phy,
  956. REG_CSR_2L_PXP_RX0_OSCA_VGA1VOS,
  957. CSR_2L_PXP_RX0_PR_OSCAL_VGA2IOS, 0x14);
  958. writel(0x804000, pcie_phy->pma1 + REG_PCIE_PMA_DIG_RESERVE_27);
  959. airoha_phy_pma1_update_field(pcie_phy, REG_PCIE_PMA_DIG_RESERVE_18,
  960. PCIE_PXP_RX_VTH_SEL_PCIE_G1, 0x5);
  961. airoha_phy_pma1_update_field(pcie_phy, REG_PCIE_PMA_DIG_RESERVE_18,
  962. PCIE_PXP_RX_VTH_SEL_PCIE_G2, 0x5);
  963. airoha_phy_pma1_update_field(pcie_phy, REG_PCIE_PMA_DIG_RESERVE_18,
  964. PCIE_PXP_RX_VTH_SEL_PCIE_G3, 0x5);
  965. airoha_phy_pma1_set_bits(pcie_phy, REG_PCIE_PMA_DIG_RESERVE_30,
  966. 0x77700);
  967. airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_CDR1_PR_MONCK,
  968. CSR_2L_PXP_CDR1_PR_MONCK_ENABLE);
  969. airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_CDR1_PR_MONCK,
  970. CSR_2L_PXP_CDR1_PR_RESERVE0, 0x2);
  971. airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_RX1_OSCAL_VGA1IOS,
  972. CSR_2L_PXP_RX1_PR_OSCAL_VGA1IOS, 0x19);
  973. airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_RX1_OSCAL_VGA1IOS,
  974. CSR_2L_PXP_RX1_PR_OSCAL_VGA1VOS, 0x19);
  975. airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_RX1_OSCAL_VGA1IOS,
  976. CSR_2L_PXP_RX1_PR_OSCAL_VGA2IOS, 0x14);
  977. }
  978. static void airoha_pcie_phy_load_kflow(struct airoha_pcie_phy *pcie_phy)
  979. {
  980. airoha_phy_pma0_update_field(pcie_phy, REG_PCIE_PMA_DIG_RESERVE_12,
  981. PCIE_FORCE_PMA_RX_SPEED, 0xa);
  982. airoha_phy_pma1_update_field(pcie_phy, REG_PCIE_PMA_DIG_RESERVE_12,
  983. PCIE_FORCE_PMA_RX_SPEED, 0xa);
  984. airoha_phy_init_lane0_rx_fw_pre_calib(pcie_phy, PCIE_PORT_GEN3);
  985. airoha_phy_init_lane1_rx_fw_pre_calib(pcie_phy, PCIE_PORT_GEN3);
  986. airoha_phy_pma0_clear_bits(pcie_phy, REG_PCIE_PMA_DIG_RESERVE_12,
  987. PCIE_FORCE_PMA_RX_SPEED);
  988. airoha_phy_pma1_clear_bits(pcie_phy, REG_PCIE_PMA_DIG_RESERVE_12,
  989. PCIE_FORCE_PMA_RX_SPEED);
  990. usleep_range(100, 200);
  991. airoha_phy_init_lane0_rx_fw_pre_calib(pcie_phy, PCIE_PORT_GEN2);
  992. airoha_phy_init_lane1_rx_fw_pre_calib(pcie_phy, PCIE_PORT_GEN2);
  993. }
  994. /**
  995. * airoha_pcie_phy_init() - Initialize the phy
  996. * @phy: the phy to be initialized
  997. *
  998. * Initialize the phy registers.
  999. * The hardware settings will be reset during suspend, it should be
  1000. * reinitialized when the consumer calls phy_init() again on resume.
  1001. */
  1002. static int airoha_pcie_phy_init(struct phy *phy)
  1003. {
  1004. struct airoha_pcie_phy *pcie_phy = phy_get_drvdata(phy);
  1005. u32 val;
  1006. /* Setup Tx-Rx detection time */
  1007. val = FIELD_PREP(PCIE_XTP_RXDET_VCM_OFF_STB_T_SEL, 0x33) |
  1008. FIELD_PREP(PCIE_XTP_RXDET_EN_STB_T_SEL, 0x1) |
  1009. FIELD_PREP(PCIE_XTP_RXDET_FINISH_STB_T_SEL, 0x2) |
  1010. FIELD_PREP(PCIE_XTP_TXPD_TX_DATA_EN_DLY, 0x3) |
  1011. FIELD_PREP(PCIE_XTP_RXDET_LATCH_STB_T_SEL, 0x1);
  1012. writel(val, pcie_phy->p0_xr_dtime + REG_PCIE_PEXTP_DIG_GLB44);
  1013. writel(val, pcie_phy->p1_xr_dtime + REG_PCIE_PEXTP_DIG_GLB44);
  1014. /* Setup Rx AEQ training time */
  1015. val = FIELD_PREP(PCIE_XTP_LN_RX_PDOWN_L1P2_EXIT_WAIT, 0x32) |
  1016. FIELD_PREP(PCIE_XTP_LN_RX_PDOWN_E0_AEQEN_WAIT, 0x5050);
  1017. writel(val, pcie_phy->rx_aeq + REG_PCIE_PEXTP_DIG_LN_RX30_P0);
  1018. writel(val, pcie_phy->rx_aeq + REG_PCIE_PEXTP_DIG_LN_RX30_P1);
  1019. /* enable load FLL-K flow */
  1020. airoha_phy_pma0_set_bits(pcie_phy, REG_PCIE_PMA_DIG_RESERVE_14,
  1021. PCIE_FLL_LOAD_EN);
  1022. airoha_phy_pma1_set_bits(pcie_phy, REG_PCIE_PMA_DIG_RESERVE_14,
  1023. PCIE_FLL_LOAD_EN);
  1024. airoha_pcie_phy_init_default(pcie_phy);
  1025. airoha_pcie_phy_init_clk_out(pcie_phy);
  1026. airoha_pcie_phy_init_csr_2l(pcie_phy);
  1027. usleep_range(100, 200);
  1028. airoha_pcie_phy_init_rx(pcie_phy);
  1029. /* phase 1, no ssc for K TXPLL */
  1030. airoha_pcie_phy_init_jcpll(pcie_phy);
  1031. usleep_range(500, 600);
  1032. /* TX PLL settings */
  1033. airoha_pcie_phy_txpll(pcie_phy);
  1034. usleep_range(200, 300);
  1035. /* SSC JCPLL setting */
  1036. airoha_pcie_phy_init_ssc_jcpll(pcie_phy);
  1037. usleep_range(100, 200);
  1038. /* Rx lan0 signal detect */
  1039. airoha_pcie_phy_set_rxlan0_signal_detect(pcie_phy);
  1040. /* Rx lan1 signal detect */
  1041. airoha_pcie_phy_set_rxlan1_signal_detect(pcie_phy);
  1042. /* RX FLOW */
  1043. airoha_pcie_phy_set_rxflow(pcie_phy);
  1044. usleep_range(100, 200);
  1045. airoha_pcie_phy_set_pr(pcie_phy);
  1046. /* TX FLOW */
  1047. airoha_pcie_phy_set_txflow(pcie_phy);
  1048. usleep_range(100, 200);
  1049. /* RX mode setting */
  1050. airoha_pcie_phy_set_rx_mode(pcie_phy);
  1051. /* Load K-Flow */
  1052. airoha_pcie_phy_load_kflow(pcie_phy);
  1053. airoha_phy_pma0_clear_bits(pcie_phy, REG_PCIE_PMA_SS_DA_XPON_PWDB0,
  1054. PCIE_DA_XPON_CDR_PR_PWDB);
  1055. airoha_phy_pma1_clear_bits(pcie_phy, REG_PCIE_PMA_SS_DA_XPON_PWDB0,
  1056. PCIE_DA_XPON_CDR_PR_PWDB);
  1057. usleep_range(100, 200);
  1058. airoha_phy_pma0_set_bits(pcie_phy, REG_PCIE_PMA_SS_DA_XPON_PWDB0,
  1059. PCIE_DA_XPON_CDR_PR_PWDB);
  1060. airoha_phy_pma1_set_bits(pcie_phy, REG_PCIE_PMA_SS_DA_XPON_PWDB0,
  1061. PCIE_DA_XPON_CDR_PR_PWDB);
  1062. /* Wait for the PCIe PHY to complete initialization before returning */
  1063. msleep(PHY_HW_INIT_TIME_MS);
  1064. return 0;
  1065. }
  1066. static int airoha_pcie_phy_exit(struct phy *phy)
  1067. {
  1068. struct airoha_pcie_phy *pcie_phy = phy_get_drvdata(phy);
  1069. airoha_phy_pma0_clear_bits(pcie_phy, REG_PCIE_PMA_SW_RESET,
  1070. PCIE_PMA_SW_RST);
  1071. airoha_phy_pma1_clear_bits(pcie_phy, REG_PCIE_PMA_SW_RESET,
  1072. PCIE_PMA_SW_RST);
  1073. airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_JCPLL_SSC,
  1074. CSR_2L_PXP_JCPLL_SSC_PHASE_INI |
  1075. CSR_2L_PXP_JCPLL_SSC_TRI_EN |
  1076. CSR_2L_PXP_JCPLL_SSC_EN);
  1077. return 0;
  1078. }
  1079. static const struct phy_ops airoha_pcie_phy_ops = {
  1080. .init = airoha_pcie_phy_init,
  1081. .exit = airoha_pcie_phy_exit,
  1082. .owner = THIS_MODULE,
  1083. };
  1084. static int airoha_pcie_phy_probe(struct platform_device *pdev)
  1085. {
  1086. struct airoha_pcie_phy *pcie_phy;
  1087. struct device *dev = &pdev->dev;
  1088. struct phy_provider *provider;
  1089. pcie_phy = devm_kzalloc(dev, sizeof(*pcie_phy), GFP_KERNEL);
  1090. if (!pcie_phy)
  1091. return -ENOMEM;
  1092. pcie_phy->csr_2l = devm_platform_ioremap_resource_byname(pdev, "csr-2l");
  1093. if (IS_ERR(pcie_phy->csr_2l))
  1094. return dev_err_probe(dev, PTR_ERR(pcie_phy->csr_2l),
  1095. "Failed to map phy-csr-2l base\n");
  1096. pcie_phy->pma0 = devm_platform_ioremap_resource_byname(pdev, "pma0");
  1097. if (IS_ERR(pcie_phy->pma0))
  1098. return dev_err_probe(dev, PTR_ERR(pcie_phy->pma0),
  1099. "Failed to map phy-pma0 base\n");
  1100. pcie_phy->pma1 = devm_platform_ioremap_resource_byname(pdev, "pma1");
  1101. if (IS_ERR(pcie_phy->pma1))
  1102. return dev_err_probe(dev, PTR_ERR(pcie_phy->pma1),
  1103. "Failed to map phy-pma1 base\n");
  1104. pcie_phy->phy = devm_phy_create(dev, dev->of_node, &airoha_pcie_phy_ops);
  1105. if (IS_ERR(pcie_phy->phy))
  1106. return dev_err_probe(dev, PTR_ERR(pcie_phy->phy),
  1107. "Failed to create PCIe phy\n");
  1108. pcie_phy->p0_xr_dtime =
  1109. devm_platform_ioremap_resource_byname(pdev, "p0-xr-dtime");
  1110. if (IS_ERR(pcie_phy->p0_xr_dtime))
  1111. return dev_err_probe(dev, PTR_ERR(pcie_phy->p0_xr_dtime),
  1112. "Failed to map P0 Tx-Rx dtime base\n");
  1113. pcie_phy->p1_xr_dtime =
  1114. devm_platform_ioremap_resource_byname(pdev, "p1-xr-dtime");
  1115. if (IS_ERR(pcie_phy->p1_xr_dtime))
  1116. return dev_err_probe(dev, PTR_ERR(pcie_phy->p1_xr_dtime),
  1117. "Failed to map P1 Tx-Rx dtime base\n");
  1118. pcie_phy->rx_aeq = devm_platform_ioremap_resource_byname(pdev, "rx-aeq");
  1119. if (IS_ERR(pcie_phy->rx_aeq))
  1120. return dev_err_probe(dev, PTR_ERR(pcie_phy->rx_aeq),
  1121. "Failed to map Rx AEQ base\n");
  1122. pcie_phy->dev = dev;
  1123. phy_set_drvdata(pcie_phy->phy, pcie_phy);
  1124. provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate);
  1125. if (IS_ERR(provider))
  1126. return dev_err_probe(dev, PTR_ERR(provider),
  1127. "PCIe phy probe failed\n");
  1128. return 0;
  1129. }
  1130. static const struct of_device_id airoha_pcie_phy_of_match[] = {
  1131. { .compatible = "airoha,en7581-pcie-phy" },
  1132. { /* sentinel */ }
  1133. };
  1134. MODULE_DEVICE_TABLE(of, airoha_pcie_phy_of_match);
  1135. static struct platform_driver airoha_pcie_phy_driver = {
  1136. .probe = airoha_pcie_phy_probe,
  1137. .driver = {
  1138. .name = "airoha-pcie-phy",
  1139. .of_match_table = airoha_pcie_phy_of_match,
  1140. },
  1141. };
  1142. module_platform_driver(airoha_pcie_phy_driver);
  1143. MODULE_DESCRIPTION("Airoha PCIe PHY driver");
  1144. MODULE_AUTHOR("Lorenzo Bianconi <lorenzo@kernel.org>");
  1145. MODULE_LICENSE("GPL");