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