Linux Audio

Check our new training course

Loading...
Note: File does not exist in v6.2.
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * Copyright (c) 2024 AIROHA Inc
   4 * 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	7
  19#define FREQ_LOCK_MAX_ATTEMPT	10
  20
  21/* PCIe-PHY initialization time in ms needed by the hw to complete */
  22#define PHY_HW_INIT_TIME_MS	30
  23
  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 structure
  32 * @dev: pointer to device
  33 * @phy: pointer to generic phy
  34 * @csr_2l: Analogic lane IO mapped register base address
  35 * @pma0: IO mapped register base address of PMA0-PCIe
  36 * @pma1: IO mapped register base address of PMA1-PCIe
  37 * @p0_xr_dtime: IO mapped register base address of port0 Tx-Rx detection time
  38 * @p1_xr_dtime: IO mapped register base address of port1 Tx-Rx detection time
  39 * @rx_aeq: IO mapped register base address of Rx AEQ training
  40 */
  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 void
 103airoha_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 void
 264airoha_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, 0xd0d);
 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 | PCIE_TX_CAL_RST);
 475	airoha_phy_pma1_set_bits(pcie_phy, REG_PCIE_PMA_TX_RESET,
 476				 PCIE_TX_TOP_RST | PCIE_TX_CAL_RST);
 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				   CSR_2L_PXP_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 void
 813airoha_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 void
 865airoha_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 phy
1104 * @phy: the phy to be initialized
1105 *
1106 * Initialize the phy registers.
1107 * The hardware settings will be reset during suspend, it should be
1108 * 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");