// SPDX-License-Identifier: GPL-2.0-only /* * Copyright (c) 2024 AIROHA Inc * Author: Lorenzo Bianconi */ #include #include #include #include #include #include #include #include #include "phy-airoha-pcie-regs.h" #define LEQ_LEN_CTRL_MAX_VAL 7 #define FREQ_LOCK_MAX_ATTEMPT 10 /* PCIe-PHY initialization time in ms needed by the hw to complete */ #define PHY_HW_INIT_TIME_MS 30 enum airoha_pcie_port_gen { PCIE_PORT_GEN1 = 1, PCIE_PORT_GEN2, PCIE_PORT_GEN3, }; /** * struct airoha_pcie_phy - PCIe phy driver main structure * @dev: pointer to device * @phy: pointer to generic phy * @csr_2l: Analogic lane IO mapped register base address * @pma0: IO mapped register base address of PMA0-PCIe * @pma1: IO mapped register base address of PMA1-PCIe * @p0_xr_dtime: IO mapped register base address of port0 Tx-Rx detection time * @p1_xr_dtime: IO mapped register base address of port1 Tx-Rx detection time * @rx_aeq: IO mapped register base address of Rx AEQ training */ struct airoha_pcie_phy { struct device *dev; struct phy *phy; void __iomem *csr_2l; void __iomem *pma0; void __iomem *pma1; void __iomem *p0_xr_dtime; void __iomem *p1_xr_dtime; void __iomem *rx_aeq; }; static void airoha_phy_clear_bits(void __iomem *reg, u32 mask) { u32 val = readl(reg) & ~mask; writel(val, reg); } static void airoha_phy_set_bits(void __iomem *reg, u32 mask) { u32 val = readl(reg) | mask; writel(val, reg); } static void airoha_phy_update_bits(void __iomem *reg, u32 mask, u32 val) { u32 tmp = readl(reg); tmp &= ~mask; tmp |= val & mask; writel(tmp, reg); } #define airoha_phy_update_field(reg, mask, val) \ do { \ BUILD_BUG_ON_MSG(!__builtin_constant_p((mask)), \ "mask is not constant"); \ airoha_phy_update_bits((reg), (mask), \ FIELD_PREP((mask), (val))); \ } while (0) #define airoha_phy_csr_2l_clear_bits(pcie_phy, reg, mask) \ airoha_phy_clear_bits((pcie_phy)->csr_2l + (reg), (mask)) #define airoha_phy_csr_2l_set_bits(pcie_phy, reg, mask) \ airoha_phy_set_bits((pcie_phy)->csr_2l + (reg), (mask)) #define airoha_phy_csr_2l_update_field(pcie_phy, reg, mask, val) \ airoha_phy_update_field((pcie_phy)->csr_2l + (reg), (mask), (val)) #define airoha_phy_pma0_clear_bits(pcie_phy, reg, mask) \ airoha_phy_clear_bits((pcie_phy)->pma0 + (reg), (mask)) #define airoha_phy_pma1_clear_bits(pcie_phy, reg, mask) \ airoha_phy_clear_bits((pcie_phy)->pma1 + (reg), (mask)) #define airoha_phy_pma0_set_bits(pcie_phy, reg, mask) \ airoha_phy_set_bits((pcie_phy)->pma0 + (reg), (mask)) #define airoha_phy_pma1_set_bits(pcie_phy, reg, mask) \ airoha_phy_set_bits((pcie_phy)->pma1 + (reg), (mask)) #define airoha_phy_pma0_update_field(pcie_phy, reg, mask, val) \ airoha_phy_update_field((pcie_phy)->pma0 + (reg), (mask), (val)) #define airoha_phy_pma1_update_field(pcie_phy, reg, mask, val) \ airoha_phy_update_field((pcie_phy)->pma1 + (reg), (mask), (val)) static void airoha_phy_init_lane0_rx_fw_pre_calib(struct airoha_pcie_phy *pcie_phy, enum airoha_pcie_port_gen gen) { u32 fl_out_target = gen == PCIE_PORT_GEN3 ? 41600 : 41941; u32 lock_cyclecnt = gen == PCIE_PORT_GEN3 ? 26000 : 32767; u32 pr_idac, val, cdr_pr_idac_tmp = 0; int i; airoha_phy_pma0_set_bits(pcie_phy, REG_PCIE_PMA_SS_LCPLL_PWCTL_SETTING_1, PCIE_LCPLL_MAN_PWDB); airoha_phy_pma0_update_field(pcie_phy, REG_PCIE_PMA_SS_RX_FREQ_DET2, PCIE_LOCK_TARGET_BEG, fl_out_target - 100); airoha_phy_pma0_update_field(pcie_phy, REG_PCIE_PMA_SS_RX_FREQ_DET2, PCIE_LOCK_TARGET_END, fl_out_target + 100); airoha_phy_pma0_update_field(pcie_phy, REG_PCIE_PMA_SS_RX_FREQ_DET1, PCIE_PLL_FT_LOCK_CYCLECNT, lock_cyclecnt); airoha_phy_pma0_update_field(pcie_phy, REG_PCIE_PMA_SS_RX_FREQ_DET4, PCIE_LOCK_LOCKTH, 0x3); airoha_phy_pma0_update_field(pcie_phy, REG_PCIE_PMA_SS_RX_FREQ_DET3, PCIE_UNLOCK_TARGET_BEG, fl_out_target - 100); airoha_phy_pma0_update_field(pcie_phy, REG_PCIE_PMA_SS_RX_FREQ_DET3, PCIE_UNLOCK_TARGET_END, fl_out_target + 100); airoha_phy_pma0_update_field(pcie_phy, REG_PCIE_PMA_SS_RX_FREQ_DET1, PCIE_PLL_FT_UNLOCK_CYCLECNT, lock_cyclecnt); airoha_phy_pma0_update_field(pcie_phy, REG_PCIE_PMA_SS_RX_FREQ_DET4, PCIE_UNLOCK_LOCKTH, 0x3); airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_CDR0_PR_INJ_MODE, CSR_2L_PXP_CDR0_INJ_FORCE_OFF); airoha_phy_pma0_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_LPF_C, PCIE_FORCE_SEL_DA_PXP_CDR_PR_LPF_R_EN); airoha_phy_pma0_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_LPF_C, PCIE_FORCE_DA_PXP_CDR_PR_LPF_R_EN); airoha_phy_pma0_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_LPF_C, PCIE_FORCE_SEL_DA_PXP_CDR_PR_LPF_C_EN); airoha_phy_pma0_clear_bits(pcie_phy, REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_LPF_C, PCIE_FORCE_DA_PXP_CDR_PR_LPF_C_EN); airoha_phy_pma0_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_IDAC, PCIE_FORCE_SEL_DA_PXP_CDR_PR_IDAC); airoha_phy_pma0_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_PIEYE_PWDB, PCIE_FORCE_SEL_DA_PXP_CDR_PR_PWDB); airoha_phy_pma0_clear_bits(pcie_phy, REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_PIEYE_PWDB, PCIE_FORCE_DA_PXP_CDR_PR_PWDB); airoha_phy_pma0_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_PIEYE_PWDB, PCIE_FORCE_DA_PXP_CDR_PR_PWDB); for (i = 0; i < LEQ_LEN_CTRL_MAX_VAL; i++) { airoha_phy_pma0_update_field(pcie_phy, REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_IDAC, PCIE_FORCE_DA_PXP_CDR_PR_IDAC, i << 8); airoha_phy_pma0_clear_bits(pcie_phy, REG_PCIE_PMA_SS_RX_FREQ_DET4, PCIE_FREQLOCK_DET_EN); airoha_phy_pma0_update_field(pcie_phy, REG_PCIE_PMA_SS_RX_FREQ_DET4, PCIE_FREQLOCK_DET_EN, 0x3); usleep_range(10000, 15000); val = FIELD_GET(PCIE_RO_FL_OUT, readl(pcie_phy->pma0 + REG_PCIE_PMA_RO_RX_FREQDET)); if (val > fl_out_target) cdr_pr_idac_tmp = i << 8; } for (i = LEQ_LEN_CTRL_MAX_VAL; i >= 0; i--) { pr_idac = cdr_pr_idac_tmp | (0x1 << i); airoha_phy_pma0_update_field(pcie_phy, REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_IDAC, PCIE_FORCE_DA_PXP_CDR_PR_IDAC, pr_idac); airoha_phy_pma0_clear_bits(pcie_phy, REG_PCIE_PMA_SS_RX_FREQ_DET4, PCIE_FREQLOCK_DET_EN); airoha_phy_pma0_update_field(pcie_phy, REG_PCIE_PMA_SS_RX_FREQ_DET4, PCIE_FREQLOCK_DET_EN, 0x3); usleep_range(10000, 15000); val = FIELD_GET(PCIE_RO_FL_OUT, readl(pcie_phy->pma0 + REG_PCIE_PMA_RO_RX_FREQDET)); if (val < fl_out_target) pr_idac &= ~(0x1 << i); cdr_pr_idac_tmp = pr_idac; } airoha_phy_pma0_update_field(pcie_phy, REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_IDAC, PCIE_FORCE_DA_PXP_CDR_PR_IDAC, cdr_pr_idac_tmp); for (i = 0; i < FREQ_LOCK_MAX_ATTEMPT; i++) { u32 val; airoha_phy_pma0_clear_bits(pcie_phy, REG_PCIE_PMA_SS_RX_FREQ_DET4, PCIE_FREQLOCK_DET_EN); airoha_phy_pma0_update_field(pcie_phy, REG_PCIE_PMA_SS_RX_FREQ_DET4, PCIE_FREQLOCK_DET_EN, 0x3); usleep_range(10000, 15000); val = readl(pcie_phy->pma0 + REG_PCIE_PMA_RO_RX_FREQDET); if (val & PCIE_RO_FBCK_LOCK) break; } /* turn off force mode and update band values */ airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_CDR0_PR_INJ_MODE, CSR_2L_PXP_CDR0_INJ_FORCE_OFF); airoha_phy_pma0_clear_bits(pcie_phy, REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_LPF_C, PCIE_FORCE_SEL_DA_PXP_CDR_PR_LPF_R_EN); airoha_phy_pma0_clear_bits(pcie_phy, REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_LPF_C, PCIE_FORCE_SEL_DA_PXP_CDR_PR_LPF_C_EN); airoha_phy_pma0_clear_bits(pcie_phy, REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_PIEYE_PWDB, PCIE_FORCE_SEL_DA_PXP_CDR_PR_PWDB); airoha_phy_pma0_clear_bits(pcie_phy, REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_IDAC, PCIE_FORCE_SEL_DA_PXP_CDR_PR_IDAC); if (gen == PCIE_PORT_GEN3) { airoha_phy_pma0_update_field(pcie_phy, REG_PCIE_PMA_DIG_RESERVE_14, PCIE_FLL_IDAC_PCIEG3, cdr_pr_idac_tmp); } else { airoha_phy_pma0_update_field(pcie_phy, REG_PCIE_PMA_DIG_RESERVE_13, PCIE_FLL_IDAC_PCIEG1, cdr_pr_idac_tmp); airoha_phy_pma0_update_field(pcie_phy, REG_PCIE_PMA_DIG_RESERVE_13, PCIE_FLL_IDAC_PCIEG2, cdr_pr_idac_tmp); } } static void airoha_phy_init_lane1_rx_fw_pre_calib(struct airoha_pcie_phy *pcie_phy, enum airoha_pcie_port_gen gen) { u32 fl_out_target = gen == PCIE_PORT_GEN3 ? 41600 : 41941; u32 lock_cyclecnt = gen == PCIE_PORT_GEN3 ? 26000 : 32767; u32 pr_idac, val, cdr_pr_idac_tmp = 0; int i; airoha_phy_pma1_set_bits(pcie_phy, REG_PCIE_PMA_SS_LCPLL_PWCTL_SETTING_1, PCIE_LCPLL_MAN_PWDB); airoha_phy_pma1_update_field(pcie_phy, REG_PCIE_PMA_SS_RX_FREQ_DET2, PCIE_LOCK_TARGET_BEG, fl_out_target - 100); airoha_phy_pma1_update_field(pcie_phy, REG_PCIE_PMA_SS_RX_FREQ_DET2, PCIE_LOCK_TARGET_END, fl_out_target + 100); airoha_phy_pma1_update_field(pcie_phy, REG_PCIE_PMA_SS_RX_FREQ_DET1, PCIE_PLL_FT_LOCK_CYCLECNT, lock_cyclecnt); airoha_phy_pma1_update_field(pcie_phy, REG_PCIE_PMA_SS_RX_FREQ_DET4, PCIE_LOCK_LOCKTH, 0x3); airoha_phy_pma1_update_field(pcie_phy, REG_PCIE_PMA_SS_RX_FREQ_DET3, PCIE_UNLOCK_TARGET_BEG, fl_out_target - 100); airoha_phy_pma1_update_field(pcie_phy, REG_PCIE_PMA_SS_RX_FREQ_DET3, PCIE_UNLOCK_TARGET_END, fl_out_target + 100); airoha_phy_pma1_update_field(pcie_phy, REG_PCIE_PMA_SS_RX_FREQ_DET1, PCIE_PLL_FT_UNLOCK_CYCLECNT, lock_cyclecnt); airoha_phy_pma1_update_field(pcie_phy, REG_PCIE_PMA_SS_RX_FREQ_DET4, PCIE_UNLOCK_LOCKTH, 0x3); airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_CDR1_PR_INJ_MODE, CSR_2L_PXP_CDR1_INJ_FORCE_OFF); airoha_phy_pma1_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_LPF_C, PCIE_FORCE_SEL_DA_PXP_CDR_PR_LPF_R_EN); airoha_phy_pma1_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_LPF_C, PCIE_FORCE_DA_PXP_CDR_PR_LPF_R_EN); airoha_phy_pma1_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_LPF_C, PCIE_FORCE_SEL_DA_PXP_CDR_PR_LPF_C_EN); airoha_phy_pma1_clear_bits(pcie_phy, REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_LPF_C, PCIE_FORCE_DA_PXP_CDR_PR_LPF_C_EN); airoha_phy_pma1_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_IDAC, PCIE_FORCE_SEL_DA_PXP_CDR_PR_IDAC); airoha_phy_pma1_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_PIEYE_PWDB, PCIE_FORCE_SEL_DA_PXP_CDR_PR_PWDB); airoha_phy_pma1_clear_bits(pcie_phy, REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_PIEYE_PWDB, PCIE_FORCE_DA_PXP_CDR_PR_PWDB); airoha_phy_pma1_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_PIEYE_PWDB, PCIE_FORCE_DA_PXP_CDR_PR_PWDB); for (i = 0; i < LEQ_LEN_CTRL_MAX_VAL; i++) { airoha_phy_pma1_update_field(pcie_phy, REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_IDAC, PCIE_FORCE_DA_PXP_CDR_PR_IDAC, i << 8); airoha_phy_pma1_clear_bits(pcie_phy, REG_PCIE_PMA_SS_RX_FREQ_DET4, PCIE_FREQLOCK_DET_EN); airoha_phy_pma1_update_field(pcie_phy, REG_PCIE_PMA_SS_RX_FREQ_DET4, PCIE_FREQLOCK_DET_EN, 0x3); usleep_range(10000, 15000); val = FIELD_GET(PCIE_RO_FL_OUT, readl(pcie_phy->pma1 + REG_PCIE_PMA_RO_RX_FREQDET)); if (val > fl_out_target) cdr_pr_idac_tmp = i << 8; } for (i = LEQ_LEN_CTRL_MAX_VAL; i >= 0; i--) { pr_idac = cdr_pr_idac_tmp | (0x1 << i); airoha_phy_pma1_update_field(pcie_phy, REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_IDAC, PCIE_FORCE_DA_PXP_CDR_PR_IDAC, pr_idac); airoha_phy_pma1_clear_bits(pcie_phy, REG_PCIE_PMA_SS_RX_FREQ_DET4, PCIE_FREQLOCK_DET_EN); airoha_phy_pma1_update_field(pcie_phy, REG_PCIE_PMA_SS_RX_FREQ_DET4, PCIE_FREQLOCK_DET_EN, 0x3); usleep_range(10000, 15000); val = FIELD_GET(PCIE_RO_FL_OUT, readl(pcie_phy->pma1 + REG_PCIE_PMA_RO_RX_FREQDET)); if (val < fl_out_target) pr_idac &= ~(0x1 << i); cdr_pr_idac_tmp = pr_idac; } airoha_phy_pma1_update_field(pcie_phy, REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_IDAC, PCIE_FORCE_DA_PXP_CDR_PR_IDAC, cdr_pr_idac_tmp); for (i = 0; i < FREQ_LOCK_MAX_ATTEMPT; i++) { u32 val; airoha_phy_pma1_clear_bits(pcie_phy, REG_PCIE_PMA_SS_RX_FREQ_DET4, PCIE_FREQLOCK_DET_EN); airoha_phy_pma1_update_field(pcie_phy, REG_PCIE_PMA_SS_RX_FREQ_DET4, PCIE_FREQLOCK_DET_EN, 0x3); usleep_range(10000, 15000); val = readl(pcie_phy->pma1 + REG_PCIE_PMA_RO_RX_FREQDET); if (val & PCIE_RO_FBCK_LOCK) break; } /* turn off force mode and update band values */ airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_CDR1_PR_INJ_MODE, CSR_2L_PXP_CDR1_INJ_FORCE_OFF); airoha_phy_pma1_clear_bits(pcie_phy, REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_LPF_C, PCIE_FORCE_SEL_DA_PXP_CDR_PR_LPF_R_EN); airoha_phy_pma1_clear_bits(pcie_phy, REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_LPF_C, PCIE_FORCE_SEL_DA_PXP_CDR_PR_LPF_C_EN); airoha_phy_pma1_clear_bits(pcie_phy, REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_PIEYE_PWDB, PCIE_FORCE_SEL_DA_PXP_CDR_PR_PWDB); airoha_phy_pma1_clear_bits(pcie_phy, REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_IDAC, PCIE_FORCE_SEL_DA_PXP_CDR_PR_IDAC); if (gen == PCIE_PORT_GEN3) { airoha_phy_pma1_update_field(pcie_phy, REG_PCIE_PMA_DIG_RESERVE_14, PCIE_FLL_IDAC_PCIEG3, cdr_pr_idac_tmp); } else { airoha_phy_pma1_update_field(pcie_phy, REG_PCIE_PMA_DIG_RESERVE_13, PCIE_FLL_IDAC_PCIEG1, cdr_pr_idac_tmp); airoha_phy_pma1_update_field(pcie_phy, REG_PCIE_PMA_DIG_RESERVE_13, PCIE_FLL_IDAC_PCIEG2, cdr_pr_idac_tmp); } } static void airoha_pcie_phy_init_default(struct airoha_pcie_phy *pcie_phy) { airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_CMN, CSR_2L_PXP_CMN_TRIM_MASK, 0x10); writel(0xcccbcccb, pcie_phy->pma0 + REG_PCIE_PMA_DIG_RESERVE_21); writel(0xcccb, pcie_phy->pma0 + REG_PCIE_PMA_DIG_RESERVE_22); writel(0xcccbcccb, pcie_phy->pma1 + REG_PCIE_PMA_DIG_RESERVE_21); writel(0xcccb, pcie_phy->pma1 + REG_PCIE_PMA_DIG_RESERVE_22); airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_CMN, CSR_2L_PXP_CMN_LANE_EN); } static void airoha_pcie_phy_init_clk_out(struct airoha_pcie_phy *pcie_phy) { airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_TXPLL_POSTDIV_D256, CSR_2L_PXP_CLKTX0_AMP, 0x5); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_CLKTX0_FORCE_OUT1, CSR_2L_PXP_CLKTX1_AMP, 0x5); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_TXPLL_POSTDIV_D256, CSR_2L_PXP_CLKTX0_OFFSET, 0x2); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_CLKTX1_OFFSET, CSR_2L_PXP_CLKTX1_OFFSET, 0x2); airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_CLKTX0_FORCE_OUT1, CSR_2L_PXP_CLKTX0_HZ); airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_CLKTX1_OFFSET, CSR_2L_PXP_CLKTX1_HZ); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_CLKTX0_FORCE_OUT1, CSR_2L_PXP_CLKTX0_IMP_SEL, 0x12); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_CLKTX1_IMP_SEL, CSR_2L_PXP_CLKTX1_IMP_SEL, 0x12); airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_TXPLL_POSTDIV_D256, CSR_2L_PXP_CLKTX0_SR); airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_CLKTX1_OFFSET, CSR_2L_PXP_CLKTX1_SR); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_PLL_CMN_RESERVE0, CSR_2L_PXP_PLL_RESERVE_MASK, 0xd0d); } static void airoha_pcie_phy_init_csr_2l(struct airoha_pcie_phy *pcie_phy) { airoha_phy_pma0_set_bits(pcie_phy, REG_PCIE_PMA_SW_RESET, PCIE_SW_XFI_RXPCS_RST | PCIE_SW_REF_RST | PCIE_SW_RX_RST); airoha_phy_pma1_set_bits(pcie_phy, REG_PCIE_PMA_SW_RESET, PCIE_SW_XFI_RXPCS_RST | PCIE_SW_REF_RST | PCIE_SW_RX_RST); airoha_phy_pma0_set_bits(pcie_phy, REG_PCIE_PMA_TX_RESET, PCIE_TX_TOP_RST | PCIE_TX_CAL_RST); airoha_phy_pma1_set_bits(pcie_phy, REG_PCIE_PMA_TX_RESET, PCIE_TX_TOP_RST | PCIE_TX_CAL_RST); } static void airoha_pcie_phy_init_rx(struct airoha_pcie_phy *pcie_phy) { writel(0x2a00090b, pcie_phy->pma0 + REG_PCIE_PMA_DIG_RESERVE_17); writel(0x2a00090b, pcie_phy->pma1 + REG_PCIE_PMA_DIG_RESERVE_17); airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_CDR0_PR_MONPI, CSR_2L_PXP_CDR0_PR_XFICK_EN); airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_CDR1_PR_MONPI, CSR_2L_PXP_CDR1_PR_XFICK_EN); airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_CDR0_PD_PICAL_CKD8_INV, CSR_2L_PXP_CDR0_PD_EDGE_DISABLE); airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_CDR1_PD_PICAL_CKD8_INV, CSR_2L_PXP_CDR1_PD_EDGE_DISABLE); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_RX0_PHYCK_DIV, CSR_2L_PXP_RX0_PHYCK_SEL, 0x1); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_RX1_PHYCK_DIV, CSR_2L_PXP_RX1_PHYCK_SEL, 0x1); } static void airoha_pcie_phy_init_jcpll(struct airoha_pcie_phy *pcie_phy) { airoha_phy_pma0_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_PXP_JCPLL_CKOUT, PCIE_FORCE_SEL_DA_PXP_JCPLL_EN); airoha_phy_pma0_clear_bits(pcie_phy, REG_PCIE_PMA_FORCE_PXP_JCPLL_CKOUT, PCIE_FORCE_DA_PXP_JCPLL_EN); airoha_phy_pma1_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_PXP_JCPLL_CKOUT, PCIE_FORCE_SEL_DA_PXP_JCPLL_EN); airoha_phy_pma1_clear_bits(pcie_phy, REG_PCIE_PMA_FORCE_PXP_JCPLL_CKOUT, PCIE_FORCE_DA_PXP_JCPLL_EN); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_JCPLL_TCL_VTP_EN, CSR_2L_PXP_JCPLL_SPARE_LOW, 0x20); airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_JCPLL_RST_DLY, CSR_2L_PXP_JCPLL_RST); writel(0x0, pcie_phy->csr_2l + REG_CSR_2L_JCPLL_SSC_DELTA1); airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_JCPLL_SSC_PERIOD, CSR_2L_PXP_JCPLL_SSC_PERIOD); airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_JCPLL_SSC, CSR_2L_PXP_JCPLL_SSC_PHASE_INI); airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_JCPLL_SSC, CSR_2L_PXP_JCPLL_SSC_TRI_EN); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_JCPLL_LPF_BR, CSR_2L_PXP_JCPLL_LPF_BR, 0xa); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_JCPLL_LPF_BR, CSR_2L_PXP_JCPLL_LPF_BP, 0xc); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_JCPLL_LPF_BR, CSR_2L_PXP_JCPLL_LPF_BC, 0x1f); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_JCPLL_LPF_BWC, CSR_2L_PXP_JCPLL_LPF_BWC, 0x1e); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_JCPLL_LPF_BR, CSR_2L_PXP_JCPLL_LPF_BWR, 0xa); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_JCPLL_MMD_PREDIV_MODE, CSR_2L_PXP_JCPLL_MMD_PREDIV_MODE, 0x1); airoha_phy_csr_2l_clear_bits(pcie_phy, CSR_2L_PXP_JCPLL_MONCK, CSR_2L_PXP_JCPLL_REFIN_DIV); airoha_phy_pma0_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_DA_PXP_RX_FE_VOS, PCIE_FORCE_SEL_DA_PXP_JCPLL_SDM_PCW); airoha_phy_pma1_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_DA_PXP_RX_FE_VOS, PCIE_FORCE_SEL_DA_PXP_JCPLL_SDM_PCW); airoha_phy_pma0_update_field(pcie_phy, REG_PCIE_PMA_FORCE_DA_PXP_JCPLL_SDM_PCW, PCIE_FORCE_DA_PXP_JCPLL_SDM_PCW, 0x50000000); airoha_phy_pma1_update_field(pcie_phy, REG_PCIE_PMA_FORCE_DA_PXP_JCPLL_SDM_PCW, PCIE_FORCE_DA_PXP_JCPLL_SDM_PCW, 0x50000000); airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_JCPLL_MMD_PREDIV_MODE, CSR_2L_PXP_JCPLL_POSTDIV_D5); airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_JCPLL_MMD_PREDIV_MODE, CSR_2L_PXP_JCPLL_POSTDIV_D2); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_JCPLL_RST_DLY, CSR_2L_PXP_JCPLL_RST_DLY, 0x4); airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_JCPLL_RST_DLY, CSR_2L_PXP_JCPLL_SDM_DI_LS); airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_JCPLL_TCL_KBAND_VREF, CSR_2L_PXP_JCPLL_VCO_KBAND_MEAS_EN); airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_JCPLL_IB_EXT, CSR_2L_PXP_JCPLL_CHP_IOFST); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_JCPLL_IB_EXT, CSR_2L_PXP_JCPLL_CHP_IBIAS, 0xc); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_JCPLL_MMD_PREDIV_MODE, CSR_2L_PXP_JCPLL_MMD_PREDIV_MODE, 0x1); airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_JCPLL_VCODIV, CSR_2L_PXP_JCPLL_VCO_HALFLSB_EN); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_JCPLL_VCODIV, CSR_2L_PXP_JCPLL_VCO_CFIX, 0x1); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_JCPLL_VCODIV, CSR_2L_PXP_JCPLL_VCO_SCAPWR, 0x4); airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_JCPLL_IB_EXT, REG_CSR_2L_JCPLL_LPF_SHCK_EN); airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_JCPLL_KBAND_KFC, CSR_2L_PXP_JCPLL_POSTDIV_EN); airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_JCPLL_KBAND_KFC, CSR_2L_PXP_JCPLL_KBAND_KFC); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_JCPLL_KBAND_KFC, CSR_2L_PXP_JCPLL_KBAND_KF, 0x3); airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_JCPLL_KBAND_KFC, CSR_2L_PXP_JCPLL_KBAND_KS); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_JCPLL_LPF_BWC, CSR_2L_PXP_JCPLL_KBAND_DIV, 0x1); airoha_phy_pma0_set_bits(pcie_phy, REG_PCIE_PMA_SCAN_MODE, PCIE_FORCE_SEL_DA_PXP_JCPLL_KBAND_LOAD_EN); airoha_phy_pma0_clear_bits(pcie_phy, REG_PCIE_PMA_SCAN_MODE, PCIE_FORCE_DA_PXP_JCPLL_KBAND_LOAD_EN); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_JCPLL_LPF_BWC, CSR_2L_PXP_JCPLL_KBAND_CODE, 0xe4); airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_JCPLL_SDM_HREN, CSR_2L_PXP_JCPLL_TCL_AMP_EN); airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_JCPLL_TCL_CMP, CSR_2L_PXP_JCPLL_TCL_LPF_EN); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_JCPLL_TCL_KBAND_VREF, CSR_2L_PXP_JCPLL_TCL_KBAND_VREF, 0xf); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_JCPLL_SDM_HREN, CSR_2L_PXP_JCPLL_TCL_AMP_GAIN, 0x1); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_JCPLL_SDM_HREN, CSR_2L_PXP_JCPLL_TCL_AMP_VREF, 0x5); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_JCPLL_TCL_CMP, CSR_2L_PXP_JCPLL_TCL_LPF_BW, 0x1); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_JCPLL_VCO_TCLVAR, CSR_2L_PXP_JCPLL_VCO_TCLVAR, 0x3); airoha_phy_pma0_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_PXP_JCPLL_CKOUT, PCIE_FORCE_SEL_DA_PXP_JCPLL_CKOUT_EN); airoha_phy_pma0_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_PXP_JCPLL_CKOUT, PCIE_FORCE_DA_PXP_JCPLL_CKOUT_EN); airoha_phy_pma1_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_PXP_JCPLL_CKOUT, PCIE_FORCE_SEL_DA_PXP_JCPLL_CKOUT_EN); airoha_phy_pma1_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_PXP_JCPLL_CKOUT, PCIE_FORCE_DA_PXP_JCPLL_CKOUT_EN); airoha_phy_pma0_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_PXP_JCPLL_CKOUT, PCIE_FORCE_SEL_DA_PXP_JCPLL_EN); airoha_phy_pma0_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_PXP_JCPLL_CKOUT, PCIE_FORCE_DA_PXP_JCPLL_EN); airoha_phy_pma1_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_PXP_JCPLL_CKOUT, PCIE_FORCE_SEL_DA_PXP_JCPLL_EN); airoha_phy_pma1_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_PXP_JCPLL_CKOUT, PCIE_FORCE_DA_PXP_JCPLL_EN); } static void airoha_pcie_phy_txpll(struct airoha_pcie_phy *pcie_phy) { airoha_phy_pma0_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_DA_PXP_TXPLL_CKOUT, PCIE_FORCE_SEL_DA_PXP_TXPLL_EN); airoha_phy_pma0_clear_bits(pcie_phy, REG_PCIE_PMA_FORCE_DA_PXP_TXPLL_CKOUT, PCIE_FORCE_DA_PXP_TXPLL_EN); airoha_phy_pma1_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_DA_PXP_TXPLL_CKOUT, PCIE_FORCE_SEL_DA_PXP_TXPLL_EN); airoha_phy_pma1_clear_bits(pcie_phy, REG_PCIE_PMA_FORCE_DA_PXP_TXPLL_CKOUT, PCIE_FORCE_DA_PXP_TXPLL_EN); airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_TXPLL_REFIN_DIV, CSR_2L_PXP_TXPLL_PLL_RSTB); writel(0x0, pcie_phy->csr_2l + REG_CSR_2L_TXPLL_SSC_DELTA1); airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_TXPLL_SSC_PERIOD, CSR_2L_PXP_txpll_SSC_PERIOD); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_TXPLL_CHP_IOFST, CSR_2L_PXP_TXPLL_CHP_IOFST, 0x1); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_750M_SYS_CK, CSR_2L_PXP_TXPLL_CHP_IBIAS, 0x2d); airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_TXPLL_REFIN_DIV, CSR_2L_PXP_TXPLL_REFIN_DIV); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_TXPLL_TCL_LPF_BW, CSR_2L_PXP_TXPLL_VCO_CFIX, 0x3); airoha_phy_pma0_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_IDAC, PCIE_FORCE_SEL_DA_PXP_TXPLL_SDM_PCW); airoha_phy_pma1_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_IDAC, PCIE_FORCE_SEL_DA_PXP_TXPLL_SDM_PCW); airoha_phy_pma0_update_field(pcie_phy, REG_PCIE_PMA_FORCE_DA_PXP_TXPLL_SDM_PCW, PCIE_FORCE_DA_PXP_TXPLL_SDM_PCW, 0xc800000); airoha_phy_pma1_update_field(pcie_phy, REG_PCIE_PMA_FORCE_DA_PXP_TXPLL_SDM_PCW, PCIE_FORCE_DA_PXP_TXPLL_SDM_PCW, 0xc800000); airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_TXPLL_SDM_DI_LS, CSR_2L_PXP_TXPLL_SDM_IFM); airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_TXPLL_SSC, CSR_2L_PXP_TXPLL_SSC_PHASE_INI); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_TXPLL_REFIN_DIV, CSR_2L_PXP_TXPLL_RST_DLY, 0x4); airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_TXPLL_SDM_DI_LS, CSR_2L_PXP_TXPLL_SDM_DI_LS); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_TXPLL_SDM_DI_LS, CSR_2L_PXP_TXPLL_SDM_ORD, 0x3); airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_TXPLL_TCL_KBAND_VREF, CSR_2L_PXP_TXPLL_VCO_KBAND_MEAS_EN); writel(0x0, pcie_phy->csr_2l + REG_CSR_2L_TXPLL_SSC_DELTA1); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_TXPLL_CHP_IOFST, CSR_2L_PXP_TXPLL_LPF_BP, 0x1); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_TXPLL_CHP_IOFST, CSR_2L_PXP_TXPLL_LPF_BC, 0x18); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_TXPLL_CHP_IOFST, CSR_2L_PXP_TXPLL_LPF_BR, 0x5); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_TXPLL_CHP_IOFST, CSR_2L_PXP_TXPLL_CHP_IOFST, 0x1); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_750M_SYS_CK, CSR_2L_PXP_TXPLL_CHP_IBIAS, 0x2d); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_TXPLL_TCL_VTP, CSR_2L_PXP_TXPLL_SPARE_L, 0x1); airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_TXPLL_LPF_BWR, CSR_2L_PXP_TXPLL_LPF_BWC); airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_TXPLL_POSTDIV, CSR_2L_PXP_TXPLL_MMD_PREDIV_MODE); airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_TXPLL_REFIN_DIV, CSR_2L_PXP_TXPLL_REFIN_DIV); airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_TXPLL_TCL_LPF_BW, CSR_2L_PXP_TXPLL_VCO_HALFLSB_EN); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_TXPLL_VCO_SCAPWR, CSR_2L_PXP_TXPLL_VCO_SCAPWR, 0x7); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_TXPLL_TCL_LPF_BW, CSR_2L_PXP_TXPLL_VCO_CFIX, 0x3); airoha_phy_pma0_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_IDAC, PCIE_FORCE_SEL_DA_PXP_TXPLL_SDM_PCW); airoha_phy_pma1_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_DA_PXP_CDR_PR_IDAC, PCIE_FORCE_SEL_DA_PXP_TXPLL_SDM_PCW); airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_TXPLL_SSC, CSR_2L_PXP_TXPLL_SSC_PHASE_INI); airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_TXPLL_LPF_BWR, CSR_2L_PXP_TXPLL_LPF_BWR); airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_TXPLL_PHY_CK2, CSR_2L_PXP_TXPLL_REFIN_INTERNAL); airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_TXPLL_TCL_KBAND_VREF, CSR_2L_PXP_TXPLL_VCO_KBAND_MEAS_EN); airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_TXPLL_VTP, CSR_2L_PXP_TXPLL_VTP_EN); airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_TXPLL_POSTDIV, CSR_2L_PXP_TXPLL_PHY_CK1_EN); airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_TXPLL_PHY_CK2, CSR_2L_PXP_TXPLL_REFIN_INTERNAL); airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_TXPLL_SSC, CSR_2L_PXP_TXPLL_SSC_EN); airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_750M_SYS_CK, CSR_2L_PXP_TXPLL_LPF_SHCK_EN); airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_TXPLL_POSTDIV, CSR_2L_PXP_TXPLL_POSTDIV_EN); airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_TXPLL_KBAND_DIV, CSR_2L_PXP_TXPLL_KBAND_KFC); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_TXPLL_KBAND_DIV, CSR_2L_PXP_TXPLL_KBAND_KF, 0x3); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_TXPLL_KBAND_DIV, CSR_2L_PXP_txpll_KBAND_KS, 0x1); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_TXPLL_KBAND_DIV, CSR_2L_PXP_TXPLL_KBAND_DIV, 0x4); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_TXPLL_LPF_BWR, CSR_2L_PXP_TXPLL_KBAND_CODE, 0xe4); airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_TXPLL_SDM_OUT, CSR_2L_PXP_TXPLL_TCL_AMP_EN); airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_TXPLL_TCL_AMP_VREF, CSR_2L_PXP_TXPLL_TCL_LPF_EN); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_TXPLL_TCL_KBAND_VREF, CSR_2L_PXP_TXPLL_TCL_KBAND_VREF, 0xf); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_TXPLL_SDM_OUT, CSR_2L_PXP_TXPLL_TCL_AMP_GAIN, 0x3); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_TXPLL_TCL_AMP_VREF, CSR_2L_PXP_TXPLL_TCL_AMP_VREF, 0xb); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_TXPLL_TCL_LPF_BW, CSR_2L_PXP_TXPLL_TCL_LPF_BW, 0x3); airoha_phy_pma0_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_DA_PXP_TXPLL_CKOUT, PCIE_FORCE_SEL_DA_PXP_TXPLL_CKOUT_EN); airoha_phy_pma0_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_DA_PXP_TXPLL_CKOUT, PCIE_FORCE_DA_PXP_TXPLL_CKOUT_EN); airoha_phy_pma1_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_DA_PXP_TXPLL_CKOUT, PCIE_FORCE_SEL_DA_PXP_TXPLL_CKOUT_EN); airoha_phy_pma1_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_DA_PXP_TXPLL_CKOUT, PCIE_FORCE_DA_PXP_TXPLL_CKOUT_EN); airoha_phy_pma0_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_DA_PXP_TXPLL_CKOUT, PCIE_FORCE_SEL_DA_PXP_TXPLL_EN); airoha_phy_pma0_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_DA_PXP_TXPLL_CKOUT, PCIE_FORCE_DA_PXP_TXPLL_EN); airoha_phy_pma1_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_DA_PXP_TXPLL_CKOUT, PCIE_FORCE_SEL_DA_PXP_TXPLL_EN); airoha_phy_pma1_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_DA_PXP_TXPLL_CKOUT, PCIE_FORCE_DA_PXP_TXPLL_EN); } static void airoha_pcie_phy_init_ssc_jcpll(struct airoha_pcie_phy *pcie_phy) { airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_JCPLL_SSC_DELTA1, CSR_2L_PXP_JCPLL_SSC_DELTA1, 0x106); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_JCPLL_SSC_DELTA1, CSR_2L_PXP_JCPLL_SSC_DELTA, 0x106); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_JCPLL_SSC_PERIOD, CSR_2L_PXP_JCPLL_SSC_PERIOD, 0x31b); airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_JCPLL_SSC, CSR_2L_PXP_JCPLL_SSC_PHASE_INI); airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_JCPLL_SSC, CSR_2L_PXP_JCPLL_SSC_EN); airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_JCPLL_SDM_IFM, CSR_2L_PXP_JCPLL_SDM_IFM); airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_JCPLL_SDM_HREN, CSR_2L_PXP_JCPLL_SDM_HREN); airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_JCPLL_RST_DLY, CSR_2L_PXP_JCPLL_SDM_DI_EN); airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_JCPLL_SSC, CSR_2L_PXP_JCPLL_SSC_TRI_EN); } static void airoha_pcie_phy_set_rxlan0_signal_detect(struct airoha_pcie_phy *pcie_phy) { airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_CDR0_PR_COR_HBW, CSR_2L_PXP_CDR0_PR_LDO_FORCE_ON); usleep_range(100, 200); airoha_phy_pma0_update_field(pcie_phy, REG_PCIE_PMA_DIG_RESERVE_19, PCIE_PCP_RX_REV0_PCIE_GEN1, 0x18b0); airoha_phy_pma0_update_field(pcie_phy, REG_PCIE_PMA_DIG_RESERVE_20, PCIE_PCP_RX_REV0_PCIE_GEN2, 0x18b0); airoha_phy_pma0_update_field(pcie_phy, REG_PCIE_PMA_DIG_RESERVE_20, PCIE_PCP_RX_REV0_PCIE_GEN3, 0x1030); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_RX0_SIGDET_DCTEST, CSR_2L_PXP_RX0_SIGDET_PEAK, 0x2); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_RX0_SIGDET_VTH_SEL, CSR_2L_PXP_RX0_SIGDET_VTH_SEL, 0x5); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_RX0_REV0, CSR_2L_PXP_VOS_PNINV, 0x2); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_RX0_SIGDET_DCTEST, CSR_2L_PXP_RX0_SIGDET_LPF_CTRL, 0x1); airoha_phy_pma0_update_field(pcie_phy, REG_PCIE_PMA_SS_RX_CAL2, PCIE_CAL_OUT_OS, 0x0); airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_PXP_RX0_FE_VB_EQ2, CSR_2L_PXP_RX0_FE_VCM_GEN_PWDB); airoha_phy_pma0_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_DA_PXP_RX_FE_GAIN_CTRL, PCIE_FORCE_SEL_DA_PXP_RX_FE_PWDB); airoha_phy_pma0_update_field(pcie_phy, REG_PCIE_PMA_FORCE_DA_PXP_RX_FE_GAIN_CTRL, PCIE_FORCE_DA_PXP_RX_FE_GAIN_CTRL, 0x3); airoha_phy_pma0_update_field(pcie_phy, REG_PCIE_PMA_RX_FORCE_MODE0, PCIE_FORCE_DA_XPON_RX_FE_GAIN_CTRL, 0x1); airoha_phy_pma0_update_field(pcie_phy, REG_PCIE_PMA_SS_RX_SIGDET0, PCIE_SIGDET_WIN_NONVLD_TIMES, 0x3); airoha_phy_pma0_clear_bits(pcie_phy, REG_PCIE_PMA_SEQUENCE_DISB_CTRL1, PCIE_DISB_RX_SDCAL_EN); airoha_phy_pma0_set_bits(pcie_phy, REG_PCIE_PMA_CTRL_SEQUENCE_FORCE_CTRL1, PCIE_FORCE_RX_SDCAL_EN); usleep_range(150, 200); airoha_phy_pma0_clear_bits(pcie_phy, REG_PCIE_PMA_CTRL_SEQUENCE_FORCE_CTRL1, PCIE_FORCE_RX_SDCAL_EN); } static void airoha_pcie_phy_set_rxlan1_signal_detect(struct airoha_pcie_phy *pcie_phy) { airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_CDR1_PR_COR_HBW, CSR_2L_PXP_CDR1_PR_LDO_FORCE_ON); usleep_range(100, 200); airoha_phy_pma1_update_field(pcie_phy, REG_PCIE_PMA_DIG_RESERVE_19, PCIE_PCP_RX_REV0_PCIE_GEN1, 0x18b0); airoha_phy_pma1_update_field(pcie_phy, REG_PCIE_PMA_DIG_RESERVE_20, PCIE_PCP_RX_REV0_PCIE_GEN2, 0x18b0); airoha_phy_pma1_update_field(pcie_phy, REG_PCIE_PMA_DIG_RESERVE_20, PCIE_PCP_RX_REV0_PCIE_GEN3, 0x1030); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_RX1_SIGDET_NOVTH, CSR_2L_PXP_RX1_SIGDET_PEAK, 0x2); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_RX1_SIGDET_NOVTH, CSR_2L_PXP_RX1_SIGDET_VTH_SEL, 0x5); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_RX1_REV0, CSR_2L_PXP_VOS_PNINV, 0x2); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_RX1_DAC_RANGE_EYE, CSR_2L_PXP_RX1_SIGDET_LPF_CTRL, 0x1); airoha_phy_pma1_update_field(pcie_phy, REG_PCIE_PMA_SS_RX_CAL2, PCIE_CAL_OUT_OS, 0x0); airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_RX1_FE_VB_EQ1, CSR_2L_PXP_RX1_FE_VCM_GEN_PWDB); airoha_phy_pma1_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_DA_PXP_RX_FE_GAIN_CTRL, PCIE_FORCE_SEL_DA_PXP_RX_FE_PWDB); airoha_phy_pma1_update_field(pcie_phy, REG_PCIE_PMA_FORCE_DA_PXP_RX_FE_GAIN_CTRL, PCIE_FORCE_DA_PXP_RX_FE_GAIN_CTRL, 0x3); airoha_phy_pma1_update_field(pcie_phy, REG_PCIE_PMA_RX_FORCE_MODE0, PCIE_FORCE_DA_XPON_RX_FE_GAIN_CTRL, 0x1); airoha_phy_pma1_update_field(pcie_phy, REG_PCIE_PMA_SS_RX_SIGDET0, PCIE_SIGDET_WIN_NONVLD_TIMES, 0x3); airoha_phy_pma1_clear_bits(pcie_phy, REG_PCIE_PMA_SEQUENCE_DISB_CTRL1, PCIE_DISB_RX_SDCAL_EN); airoha_phy_pma1_set_bits(pcie_phy, REG_PCIE_PMA_CTRL_SEQUENCE_FORCE_CTRL1, PCIE_FORCE_RX_SDCAL_EN); usleep_range(150, 200); airoha_phy_pma1_clear_bits(pcie_phy, REG_PCIE_PMA_CTRL_SEQUENCE_FORCE_CTRL1, PCIE_FORCE_RX_SDCAL_EN); } static void airoha_pcie_phy_set_rxflow(struct airoha_pcie_phy *pcie_phy) { airoha_phy_pma0_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_DA_PXP_RX_SCAN_RST, PCIE_FORCE_DA_PXP_RX_SIGDET_PWDB | PCIE_FORCE_SEL_DA_PXP_RX_SIGDET_PWDB); airoha_phy_pma1_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_DA_PXP_RX_SCAN_RST, PCIE_FORCE_DA_PXP_RX_SIGDET_PWDB | PCIE_FORCE_SEL_DA_PXP_RX_SIGDET_PWDB); airoha_phy_pma0_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_DA_PXP_CDR_PD_PWDB, PCIE_FORCE_DA_PXP_CDR_PD_PWDB | PCIE_FORCE_SEL_DA_PXP_CDR_PD_PWDB); airoha_phy_pma0_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_DA_PXP_RX_FE_PWDB, PCIE_FORCE_DA_PXP_RX_FE_PWDB | PCIE_FORCE_SEL_DA_PXP_RX_FE_PWDB); airoha_phy_pma1_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_DA_PXP_CDR_PD_PWDB, PCIE_FORCE_DA_PXP_CDR_PD_PWDB | PCIE_FORCE_SEL_DA_PXP_CDR_PD_PWDB); airoha_phy_pma1_set_bits(pcie_phy, REG_PCIE_PMA_FORCE_DA_PXP_RX_FE_PWDB, PCIE_FORCE_DA_PXP_RX_FE_PWDB | PCIE_FORCE_SEL_DA_PXP_RX_FE_PWDB); airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_RX0_PHYCK_DIV, CSR_2L_PXP_RX0_PHYCK_RSTB | CSR_2L_PXP_RX0_TDC_CK_SEL); airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_RX1_PHYCK_DIV, CSR_2L_PXP_RX1_PHYCK_RSTB | CSR_2L_PXP_RX1_TDC_CK_SEL); airoha_phy_pma0_set_bits(pcie_phy, REG_PCIE_PMA_SW_RESET, PCIE_SW_RX_FIFO_RST | PCIE_SW_TX_RST | PCIE_SW_PMA_RST | PCIE_SW_ALLPCS_RST | PCIE_SW_TX_FIFO_RST); airoha_phy_pma1_set_bits(pcie_phy, REG_PCIE_PMA_SW_RESET, PCIE_SW_RX_FIFO_RST | PCIE_SW_TX_RST | PCIE_SW_PMA_RST | PCIE_SW_ALLPCS_RST | PCIE_SW_TX_FIFO_RST); airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_PXP_RX0_FE_VB_EQ2, CSR_2L_PXP_RX0_FE_VB_EQ2_EN | CSR_2L_PXP_RX0_FE_VB_EQ3_EN); airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_RX0_SIGDET_VTH_SEL, CSR_2L_PXP_RX0_FE_VB_EQ1_EN); airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_RX1_FE_VB_EQ1, CSR_2L_PXP_RX1_FE_VB_EQ1_EN | CSR_2L_PXP_RX1_FE_VB_EQ2_EN | CSR_2L_PXP_RX1_FE_VB_EQ3_EN); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_RX0_REV0, CSR_2L_PXP_FE_GAIN_NORMAL_MODE, 0x4); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_RX0_REV0, CSR_2L_PXP_FE_GAIN_TRAIN_MODE, 0x4); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_RX1_REV0, CSR_2L_PXP_FE_GAIN_NORMAL_MODE, 0x4); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_RX1_REV0, CSR_2L_PXP_FE_GAIN_TRAIN_MODE, 0x4); } static void airoha_pcie_phy_set_pr(struct airoha_pcie_phy *pcie_phy) { airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_CDR0_PR_VREG_IBAND, CSR_2L_PXP_CDR0_PR_VREG_IBAND, 0x5); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_CDR0_PR_VREG_IBAND, CSR_2L_PXP_CDR0_PR_VREG_CKBUF, 0x5); airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_CDR0_PR_CKREF_DIV, CSR_2L_PXP_CDR0_PR_CKREF_DIV); airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_CDR0_PR_COR_HBW, CSR_2L_PXP_CDR0_PR_CKREF_DIV1); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_CDR1_PR_VREG_IBAND_VAL, CSR_2L_PXP_CDR1_PR_VREG_IBAND, 0x5); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_CDR1_PR_VREG_IBAND_VAL, CSR_2L_PXP_CDR1_PR_VREG_CKBUF, 0x5); airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_CDR1_PR_CKREF_DIV, CSR_2L_PXP_CDR1_PR_CKREF_DIV); airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_CDR1_PR_COR_HBW, CSR_2L_PXP_CDR1_PR_CKREF_DIV1); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_CDR0_LPF_RATIO, CSR_2L_PXP_CDR0_LPF_TOP_LIM, 0x20000); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_CDR1_LPF_RATIO, CSR_2L_PXP_CDR1_LPF_TOP_LIM, 0x20000); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_CDR0_PR_BETA_DAC, CSR_2L_PXP_CDR0_PR_BETA_SEL, 0x2); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_CDR1_PR_BETA_DAC, CSR_2L_PXP_CDR1_PR_BETA_SEL, 0x2); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_CDR0_PR_BETA_DAC, CSR_2L_PXP_CDR0_PR_KBAND_DIV, 0x4); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_CDR1_PR_BETA_DAC, CSR_2L_PXP_CDR1_PR_KBAND_DIV, 0x4); } static void airoha_pcie_phy_set_txflow(struct airoha_pcie_phy *pcie_phy) { airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_TX0_CKLDO, CSR_2L_PXP_TX0_CKLDO_EN); airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_TX1_CKLDO, CSR_2L_PXP_TX1_CKLDO_EN); airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_TX0_CKLDO, CSR_2L_PXP_TX0_DMEDGEGEN_EN); airoha_phy_csr_2l_set_bits(pcie_phy, REG_CSR_2L_TX1_CKLDO, CSR_2L_PXP_TX1_DMEDGEGEN_EN); airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_TX1_MULTLANE, CSR_2L_PXP_TX1_MULTLANE_EN); } static void airoha_pcie_phy_set_rx_mode(struct airoha_pcie_phy *pcie_phy) { writel(0x804000, pcie_phy->pma0 + REG_PCIE_PMA_DIG_RESERVE_27); airoha_phy_pma0_update_field(pcie_phy, REG_PCIE_PMA_DIG_RESERVE_18, PCIE_PXP_RX_VTH_SEL_PCIE_G1, 0x5); airoha_phy_pma0_update_field(pcie_phy, REG_PCIE_PMA_DIG_RESERVE_18, PCIE_PXP_RX_VTH_SEL_PCIE_G2, 0x5); airoha_phy_pma0_update_field(pcie_phy, REG_PCIE_PMA_DIG_RESERVE_18, PCIE_PXP_RX_VTH_SEL_PCIE_G3, 0x5); airoha_phy_pma0_set_bits(pcie_phy, REG_PCIE_PMA_DIG_RESERVE_30, 0x77700); airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_CDR0_PR_MONCK, CSR_2L_PXP_CDR0_PR_MONCK_ENABLE); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_CDR0_PR_MONCK, CSR_2L_PXP_CDR0_PR_RESERVE0, 0x2); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_PXP_RX0_OSCAL_CTLE1IOS, CSR_2L_PXP_RX0_PR_OSCAL_VGA1IOS, 0x19); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_PXP_RX0_OSCA_VGA1VOS, CSR_2L_PXP_RX0_PR_OSCAL_VGA1VOS, 0x19); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_PXP_RX0_OSCA_VGA1VOS, CSR_2L_PXP_RX0_PR_OSCAL_VGA2IOS, 0x14); writel(0x804000, pcie_phy->pma1 + REG_PCIE_PMA_DIG_RESERVE_27); airoha_phy_pma1_update_field(pcie_phy, REG_PCIE_PMA_DIG_RESERVE_18, PCIE_PXP_RX_VTH_SEL_PCIE_G1, 0x5); airoha_phy_pma1_update_field(pcie_phy, REG_PCIE_PMA_DIG_RESERVE_18, PCIE_PXP_RX_VTH_SEL_PCIE_G2, 0x5); airoha_phy_pma1_update_field(pcie_phy, REG_PCIE_PMA_DIG_RESERVE_18, PCIE_PXP_RX_VTH_SEL_PCIE_G3, 0x5); airoha_phy_pma1_set_bits(pcie_phy, REG_PCIE_PMA_DIG_RESERVE_30, 0x77700); airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_CDR1_PR_MONCK, CSR_2L_PXP_CDR1_PR_MONCK_ENABLE); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_CDR1_PR_MONCK, CSR_2L_PXP_CDR1_PR_RESERVE0, 0x2); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_RX1_OSCAL_VGA1IOS, CSR_2L_PXP_RX1_PR_OSCAL_VGA1IOS, 0x19); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_RX1_OSCAL_VGA1IOS, CSR_2L_PXP_RX1_PR_OSCAL_VGA1VOS, 0x19); airoha_phy_csr_2l_update_field(pcie_phy, REG_CSR_2L_RX1_OSCAL_VGA1IOS, CSR_2L_PXP_RX1_PR_OSCAL_VGA2IOS, 0x14); } static void airoha_pcie_phy_load_kflow(struct airoha_pcie_phy *pcie_phy) { airoha_phy_pma0_update_field(pcie_phy, REG_PCIE_PMA_DIG_RESERVE_12, PCIE_FORCE_PMA_RX_SPEED, 0xa); airoha_phy_pma1_update_field(pcie_phy, REG_PCIE_PMA_DIG_RESERVE_12, PCIE_FORCE_PMA_RX_SPEED, 0xa); airoha_phy_init_lane0_rx_fw_pre_calib(pcie_phy, PCIE_PORT_GEN3); airoha_phy_init_lane1_rx_fw_pre_calib(pcie_phy, PCIE_PORT_GEN3); airoha_phy_pma0_clear_bits(pcie_phy, REG_PCIE_PMA_DIG_RESERVE_12, PCIE_FORCE_PMA_RX_SPEED); airoha_phy_pma1_clear_bits(pcie_phy, REG_PCIE_PMA_DIG_RESERVE_12, PCIE_FORCE_PMA_RX_SPEED); usleep_range(100, 200); airoha_phy_init_lane0_rx_fw_pre_calib(pcie_phy, PCIE_PORT_GEN2); airoha_phy_init_lane1_rx_fw_pre_calib(pcie_phy, PCIE_PORT_GEN2); } /** * airoha_pcie_phy_init() - Initialize the phy * @phy: the phy to be initialized * * Initialize the phy registers. * The hardware settings will be reset during suspend, it should be * reinitialized when the consumer calls phy_init() again on resume. */ static int airoha_pcie_phy_init(struct phy *phy) { struct airoha_pcie_phy *pcie_phy = phy_get_drvdata(phy); u32 val; /* Setup Tx-Rx detection time */ val = FIELD_PREP(PCIE_XTP_RXDET_VCM_OFF_STB_T_SEL, 0x33) | FIELD_PREP(PCIE_XTP_RXDET_EN_STB_T_SEL, 0x1) | FIELD_PREP(PCIE_XTP_RXDET_FINISH_STB_T_SEL, 0x2) | FIELD_PREP(PCIE_XTP_TXPD_TX_DATA_EN_DLY, 0x3) | FIELD_PREP(PCIE_XTP_RXDET_LATCH_STB_T_SEL, 0x1); writel(val, pcie_phy->p0_xr_dtime + REG_PCIE_PEXTP_DIG_GLB44); writel(val, pcie_phy->p1_xr_dtime + REG_PCIE_PEXTP_DIG_GLB44); /* Setup Rx AEQ training time */ val = FIELD_PREP(PCIE_XTP_LN_RX_PDOWN_L1P2_EXIT_WAIT, 0x32) | FIELD_PREP(PCIE_XTP_LN_RX_PDOWN_E0_AEQEN_WAIT, 0x5050); writel(val, pcie_phy->rx_aeq + REG_PCIE_PEXTP_DIG_LN_RX30_P0); writel(val, pcie_phy->rx_aeq + REG_PCIE_PEXTP_DIG_LN_RX30_P1); /* enable load FLL-K flow */ airoha_phy_pma0_set_bits(pcie_phy, REG_PCIE_PMA_DIG_RESERVE_14, PCIE_FLL_LOAD_EN); airoha_phy_pma1_set_bits(pcie_phy, REG_PCIE_PMA_DIG_RESERVE_14, PCIE_FLL_LOAD_EN); airoha_pcie_phy_init_default(pcie_phy); airoha_pcie_phy_init_clk_out(pcie_phy); airoha_pcie_phy_init_csr_2l(pcie_phy); usleep_range(100, 200); airoha_pcie_phy_init_rx(pcie_phy); /* phase 1, no ssc for K TXPLL */ airoha_pcie_phy_init_jcpll(pcie_phy); usleep_range(500, 600); /* TX PLL settings */ airoha_pcie_phy_txpll(pcie_phy); usleep_range(200, 300); /* SSC JCPLL setting */ airoha_pcie_phy_init_ssc_jcpll(pcie_phy); usleep_range(100, 200); /* Rx lan0 signal detect */ airoha_pcie_phy_set_rxlan0_signal_detect(pcie_phy); /* Rx lan1 signal detect */ airoha_pcie_phy_set_rxlan1_signal_detect(pcie_phy); /* RX FLOW */ airoha_pcie_phy_set_rxflow(pcie_phy); usleep_range(100, 200); airoha_pcie_phy_set_pr(pcie_phy); /* TX FLOW */ airoha_pcie_phy_set_txflow(pcie_phy); usleep_range(100, 200); /* RX mode setting */ airoha_pcie_phy_set_rx_mode(pcie_phy); /* Load K-Flow */ airoha_pcie_phy_load_kflow(pcie_phy); airoha_phy_pma0_clear_bits(pcie_phy, REG_PCIE_PMA_SS_DA_XPON_PWDB0, PCIE_DA_XPON_CDR_PR_PWDB); airoha_phy_pma1_clear_bits(pcie_phy, REG_PCIE_PMA_SS_DA_XPON_PWDB0, PCIE_DA_XPON_CDR_PR_PWDB); usleep_range(100, 200); airoha_phy_pma0_set_bits(pcie_phy, REG_PCIE_PMA_SS_DA_XPON_PWDB0, PCIE_DA_XPON_CDR_PR_PWDB); airoha_phy_pma1_set_bits(pcie_phy, REG_PCIE_PMA_SS_DA_XPON_PWDB0, PCIE_DA_XPON_CDR_PR_PWDB); /* Wait for the PCIe PHY to complete initialization before returning */ msleep(PHY_HW_INIT_TIME_MS); return 0; } static int airoha_pcie_phy_exit(struct phy *phy) { struct airoha_pcie_phy *pcie_phy = phy_get_drvdata(phy); airoha_phy_pma0_clear_bits(pcie_phy, REG_PCIE_PMA_SW_RESET, PCIE_PMA_SW_RST); airoha_phy_pma1_clear_bits(pcie_phy, REG_PCIE_PMA_SW_RESET, PCIE_PMA_SW_RST); airoha_phy_csr_2l_clear_bits(pcie_phy, REG_CSR_2L_JCPLL_SSC, CSR_2L_PXP_JCPLL_SSC_PHASE_INI | CSR_2L_PXP_JCPLL_SSC_TRI_EN | CSR_2L_PXP_JCPLL_SSC_EN); return 0; } static const struct phy_ops airoha_pcie_phy_ops = { .init = airoha_pcie_phy_init, .exit = airoha_pcie_phy_exit, .owner = THIS_MODULE, }; static int airoha_pcie_phy_probe(struct platform_device *pdev) { struct airoha_pcie_phy *pcie_phy; struct device *dev = &pdev->dev; struct phy_provider *provider; pcie_phy = devm_kzalloc(dev, sizeof(*pcie_phy), GFP_KERNEL); if (!pcie_phy) return -ENOMEM; pcie_phy->csr_2l = devm_platform_ioremap_resource_byname(pdev, "csr-2l"); if (IS_ERR(pcie_phy->csr_2l)) return dev_err_probe(dev, PTR_ERR(pcie_phy->csr_2l), "Failed to map phy-csr-2l base\n"); pcie_phy->pma0 = devm_platform_ioremap_resource_byname(pdev, "pma0"); if (IS_ERR(pcie_phy->pma0)) return dev_err_probe(dev, PTR_ERR(pcie_phy->pma0), "Failed to map phy-pma0 base\n"); pcie_phy->pma1 = devm_platform_ioremap_resource_byname(pdev, "pma1"); if (IS_ERR(pcie_phy->pma1)) return dev_err_probe(dev, PTR_ERR(pcie_phy->pma1), "Failed to map phy-pma1 base\n"); pcie_phy->phy = devm_phy_create(dev, dev->of_node, &airoha_pcie_phy_ops); if (IS_ERR(pcie_phy->phy)) return dev_err_probe(dev, PTR_ERR(pcie_phy->phy), "Failed to create PCIe phy\n"); pcie_phy->p0_xr_dtime = devm_platform_ioremap_resource_byname(pdev, "p0-xr-dtime"); if (IS_ERR(pcie_phy->p0_xr_dtime)) return dev_err_probe(dev, PTR_ERR(pcie_phy->p0_xr_dtime), "Failed to map P0 Tx-Rx dtime base\n"); pcie_phy->p1_xr_dtime = devm_platform_ioremap_resource_byname(pdev, "p1-xr-dtime"); if (IS_ERR(pcie_phy->p1_xr_dtime)) return dev_err_probe(dev, PTR_ERR(pcie_phy->p1_xr_dtime), "Failed to map P1 Tx-Rx dtime base\n"); pcie_phy->rx_aeq = devm_platform_ioremap_resource_byname(pdev, "rx-aeq"); if (IS_ERR(pcie_phy->rx_aeq)) return dev_err_probe(dev, PTR_ERR(pcie_phy->rx_aeq), "Failed to map Rx AEQ base\n"); pcie_phy->dev = dev; phy_set_drvdata(pcie_phy->phy, pcie_phy); provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate); if (IS_ERR(provider)) return dev_err_probe(dev, PTR_ERR(provider), "PCIe phy probe failed\n"); return 0; } static const struct of_device_id airoha_pcie_phy_of_match[] = { { .compatible = "airoha,en7581-pcie-phy" }, { /* sentinel */ } }; MODULE_DEVICE_TABLE(of, airoha_pcie_phy_of_match); static struct platform_driver airoha_pcie_phy_driver = { .probe = airoha_pcie_phy_probe, .driver = { .name = "airoha-pcie-phy", .of_match_table = airoha_pcie_phy_of_match, }, }; module_platform_driver(airoha_pcie_phy_driver); MODULE_DESCRIPTION("Airoha PCIe PHY driver"); MODULE_AUTHOR("Lorenzo Bianconi "); MODULE_LICENSE("GPL");