1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * Cadence Sierra PHY Driver 4 * 5 * Copyright (c) 2018 Cadence Design Systems 6 * Author: Alan Douglas <adouglas@cadence.com> 7 * 8 */ 9 #include <linux/clk.h> 10 #include <linux/clk-provider.h> 11 #include <linux/delay.h> 12 #include <linux/err.h> 13 #include <linux/io.h> 14 #include <linux/module.h> 15 #include <linux/phy/phy.h> 16 #include <linux/platform_device.h> 17 #include <linux/pm_runtime.h> 18 #include <linux/regmap.h> 19 #include <linux/reset.h> 20 #include <linux/slab.h> 21 #include <linux/of.h> 22 #include <linux/of_platform.h> 23 #include <dt-bindings/phy/phy.h> 24 #include <dt-bindings/phy/phy-cadence.h> 25 26 #define NUM_SSC_MODE 3 27 #define NUM_PHY_TYPE 5 28 29 /* PHY register offsets */ 30 #define SIERRA_COMMON_CDB_OFFSET 0x0 31 #define SIERRA_MACRO_ID_REG 0x0 32 #define SIERRA_CMN_PLLLC_GEN_PREG 0x42 33 #define SIERRA_CMN_PLLLC_MODE_PREG 0x48 34 #define SIERRA_CMN_PLLLC_LF_COEFF_MODE1_PREG 0x49 35 #define SIERRA_CMN_PLLLC_LF_COEFF_MODE0_PREG 0x4A 36 #define SIERRA_CMN_PLLLC_LOCK_CNTSTART_PREG 0x4B 37 #define SIERRA_CMN_PLLLC_CLK1_PREG 0x4D 38 #define SIERRA_CMN_PLLLC_BWCAL_MODE1_PREG 0x4F 39 #define SIERRA_CMN_PLLLC_BWCAL_MODE0_PREG 0x50 40 #define SIERRA_CMN_PLLLC_DSMCORR_PREG 0x51 41 #define SIERRA_CMN_PLLLC_SS_PREG 0x52 42 #define SIERRA_CMN_PLLLC_SS_AMP_STEP_SIZE_PREG 0x53 43 #define SIERRA_CMN_PLLLC_SSTWOPT_PREG 0x54 44 #define SIERRA_CMN_PLLLC_SS_TIME_STEPSIZE_MODE_PREG 0x62 45 #define SIERRA_CMN_PLLLC_LOCK_DELAY_CTRL_PREG 0x63 46 #define SIERRA_CMN_REFRCV_PREG 0x98 47 #define SIERRA_CMN_REFRCV1_PREG 0xB8 48 #define SIERRA_CMN_PLLLC1_GEN_PREG 0xC2 49 #define SIERRA_CMN_PLLLC1_FBDIV_INT_PREG 0xC3 50 #define SIERRA_CMN_PLLLC1_LF_COEFF_MODE0_PREG 0xCA 51 #define SIERRA_CMN_PLLLC1_CLK0_PREG 0xCE 52 #define SIERRA_CMN_PLLLC1_BWCAL_MODE0_PREG 0xD0 53 #define SIERRA_CMN_PLLLC1_SS_TIME_STEPSIZE_MODE_PREG 0xE2 54 55 #define SIERRA_LANE_CDB_OFFSET(ln, block_offset, reg_offset) \ 56 ((0x4000 << (block_offset)) + \ 57 (((ln) << 9) << (reg_offset))) 58 59 #define SIERRA_DET_STANDEC_A_PREG 0x000 60 #define SIERRA_DET_STANDEC_B_PREG 0x001 61 #define SIERRA_DET_STANDEC_C_PREG 0x002 62 #define SIERRA_DET_STANDEC_D_PREG 0x003 63 #define SIERRA_DET_STANDEC_E_PREG 0x004 64 #define SIERRA_PSM_LANECAL_DLY_A1_RESETS_PREG 0x008 65 #define SIERRA_PSM_A0IN_TMR_PREG 0x009 66 #define SIERRA_PSM_A3IN_TMR_PREG 0x00C 67 #define SIERRA_PSM_DIAG_PREG 0x015 68 #define SIERRA_PSC_LN_A3_PREG 0x023 69 #define SIERRA_PSC_LN_A4_PREG 0x024 70 #define SIERRA_PSC_LN_IDLE_PREG 0x026 71 #define SIERRA_PSC_TX_A0_PREG 0x028 72 #define SIERRA_PSC_TX_A1_PREG 0x029 73 #define SIERRA_PSC_TX_A2_PREG 0x02A 74 #define SIERRA_PSC_TX_A3_PREG 0x02B 75 #define SIERRA_PSC_RX_A0_PREG 0x030 76 #define SIERRA_PSC_RX_A1_PREG 0x031 77 #define SIERRA_PSC_RX_A2_PREG 0x032 78 #define SIERRA_PSC_RX_A3_PREG 0x033 79 #define SIERRA_PLLCTRL_FBDIV_MODE01_PREG 0x039 80 #define SIERRA_PLLCTRL_SUBRATE_PREG 0x03A 81 #define SIERRA_PLLCTRL_GEN_A_PREG 0x03B 82 #define SIERRA_PLLCTRL_GEN_D_PREG 0x03E 83 #define SIERRA_PLLCTRL_CPGAIN_MODE_PREG 0x03F 84 #define SIERRA_PLLCTRL_STATUS_PREG 0x044 85 #define SIERRA_CLKPATH_BIASTRIM_PREG 0x04B 86 #define SIERRA_DFE_BIASTRIM_PREG 0x04C 87 #define SIERRA_DRVCTRL_ATTEN_PREG 0x06A 88 #define SIERRA_DRVCTRL_BOOST_PREG 0x06F 89 #define SIERRA_TX_RCVDET_OVRD_PREG 0x072 90 #define SIERRA_CLKPATHCTRL_TMR_PREG 0x081 91 #define SIERRA_RX_CREQ_FLTR_A_MODE3_PREG 0x085 92 #define SIERRA_RX_CREQ_FLTR_A_MODE2_PREG 0x086 93 #define SIERRA_RX_CREQ_FLTR_A_MODE1_PREG 0x087 94 #define SIERRA_RX_CREQ_FLTR_A_MODE0_PREG 0x088 95 #define SIERRA_CREQ_DCBIASATTEN_OVR_PREG 0x08C 96 #define SIERRA_CREQ_CCLKDET_MODE01_PREG 0x08E 97 #define SIERRA_RX_CTLE_CAL_PREG 0x08F 98 #define SIERRA_RX_CTLE_MAINTENANCE_PREG 0x091 99 #define SIERRA_CREQ_FSMCLK_SEL_PREG 0x092 100 #define SIERRA_CREQ_EQ_CTRL_PREG 0x093 101 #define SIERRA_CREQ_SPARE_PREG 0x096 102 #define SIERRA_CREQ_EQ_OPEN_EYE_THRESH_PREG 0x097 103 #define SIERRA_CTLELUT_CTRL_PREG 0x098 104 #define SIERRA_DFE_ECMP_RATESEL_PREG 0x0C0 105 #define SIERRA_DFE_SMP_RATESEL_PREG 0x0C1 106 #define SIERRA_DEQ_PHALIGN_CTRL 0x0C4 107 #define SIERRA_DEQ_CONCUR_CTRL1_PREG 0x0C8 108 #define SIERRA_DEQ_CONCUR_CTRL2_PREG 0x0C9 109 #define SIERRA_DEQ_EPIPWR_CTRL2_PREG 0x0CD 110 #define SIERRA_DEQ_FAST_MAINT_CYCLES_PREG 0x0CE 111 #define SIERRA_DEQ_ERRCMP_CTRL_PREG 0x0D0 112 #define SIERRA_DEQ_OFFSET_CTRL_PREG 0x0D8 113 #define SIERRA_DEQ_GAIN_CTRL_PREG 0x0E0 114 #define SIERRA_DEQ_VGATUNE_CTRL_PREG 0x0E1 115 #define SIERRA_DEQ_GLUT0 0x0E8 116 #define SIERRA_DEQ_GLUT1 0x0E9 117 #define SIERRA_DEQ_GLUT2 0x0EA 118 #define SIERRA_DEQ_GLUT3 0x0EB 119 #define SIERRA_DEQ_GLUT4 0x0EC 120 #define SIERRA_DEQ_GLUT5 0x0ED 121 #define SIERRA_DEQ_GLUT6 0x0EE 122 #define SIERRA_DEQ_GLUT7 0x0EF 123 #define SIERRA_DEQ_GLUT8 0x0F0 124 #define SIERRA_DEQ_GLUT9 0x0F1 125 #define SIERRA_DEQ_GLUT10 0x0F2 126 #define SIERRA_DEQ_GLUT11 0x0F3 127 #define SIERRA_DEQ_GLUT12 0x0F4 128 #define SIERRA_DEQ_GLUT13 0x0F5 129 #define SIERRA_DEQ_GLUT14 0x0F6 130 #define SIERRA_DEQ_GLUT15 0x0F7 131 #define SIERRA_DEQ_GLUT16 0x0F8 132 #define SIERRA_DEQ_ALUT0 0x108 133 #define SIERRA_DEQ_ALUT1 0x109 134 #define SIERRA_DEQ_ALUT2 0x10A 135 #define SIERRA_DEQ_ALUT3 0x10B 136 #define SIERRA_DEQ_ALUT4 0x10C 137 #define SIERRA_DEQ_ALUT5 0x10D 138 #define SIERRA_DEQ_ALUT6 0x10E 139 #define SIERRA_DEQ_ALUT7 0x10F 140 #define SIERRA_DEQ_ALUT8 0x110 141 #define SIERRA_DEQ_ALUT9 0x111 142 #define SIERRA_DEQ_ALUT10 0x112 143 #define SIERRA_DEQ_ALUT11 0x113 144 #define SIERRA_DEQ_ALUT12 0x114 145 #define SIERRA_DEQ_ALUT13 0x115 146 #define SIERRA_DEQ_DFETAP_CTRL_PREG 0x128 147 #define SIERRA_DEQ_DFETAP0 0x129 148 #define SIERRA_DEQ_DFETAP1 0x12B 149 #define SIERRA_DEQ_DFETAP2 0x12D 150 #define SIERRA_DEQ_DFETAP3 0x12F 151 #define SIERRA_DEQ_DFETAP4 0x131 152 #define SIERRA_DFE_EN_1010_IGNORE_PREG 0x134 153 #define SIERRA_DEQ_PRECUR_PREG 0x138 154 #define SIERRA_DEQ_POSTCUR_PREG 0x140 155 #define SIERRA_DEQ_POSTCUR_DECR_PREG 0x142 156 #define SIERRA_DEQ_TAU_CTRL1_SLOW_MAINT_PREG 0x150 157 #define SIERRA_DEQ_TAU_CTRL2_PREG 0x151 158 #define SIERRA_DEQ_TAU_CTRL3_PREG 0x152 159 #define SIERRA_DEQ_OPENEYE_CTRL_PREG 0x158 160 #define SIERRA_DEQ_PICTRL_PREG 0x161 161 #define SIERRA_CPICAL_TMRVAL_MODE1_PREG 0x170 162 #define SIERRA_CPICAL_TMRVAL_MODE0_PREG 0x171 163 #define SIERRA_CPICAL_PICNT_MODE1_PREG 0x174 164 #define SIERRA_CPI_OUTBUF_RATESEL_PREG 0x17C 165 #define SIERRA_CPI_RESBIAS_BIN_PREG 0x17E 166 #define SIERRA_CPI_TRIM_PREG 0x17F 167 #define SIERRA_CPICAL_RES_STARTCODE_MODE23_PREG 0x183 168 #define SIERRA_EPI_CTRL_PREG 0x187 169 #define SIERRA_LFPSDET_SUPPORT_PREG 0x188 170 #define SIERRA_LFPSFILT_NS_PREG 0x18A 171 #define SIERRA_LFPSFILT_RD_PREG 0x18B 172 #define SIERRA_LFPSFILT_MP_PREG 0x18C 173 #define SIERRA_SIGDET_SUPPORT_PREG 0x190 174 #define SIERRA_SDFILT_H2L_A_PREG 0x191 175 #define SIERRA_SDFILT_L2H_PREG 0x193 176 #define SIERRA_RXBUFFER_CTLECTRL_PREG 0x19E 177 #define SIERRA_RXBUFFER_RCDFECTRL_PREG 0x19F 178 #define SIERRA_RXBUFFER_DFECTRL_PREG 0x1A0 179 #define SIERRA_DEQ_TAU_CTRL1_FAST_MAINT_PREG 0x14F 180 #define SIERRA_DEQ_TAU_CTRL1_SLOW_MAINT_PREG 0x150 181 182 /* PHY PCS common registers */ 183 #define SIERRA_PHY_PCS_COMMON_OFFSET(block_offset) \ 184 (0xc000 << (block_offset)) 185 #define SIERRA_PHY_PIPE_CMN_CTRL1 0x0 186 #define SIERRA_PHY_PLL_CFG 0xe 187 188 /* PHY PCS lane registers */ 189 #define SIERRA_PHY_PCS_LANE_CDB_OFFSET(ln, block_offset, reg_offset) \ 190 ((0xD000 << (block_offset)) + \ 191 (((ln) << 8) << (reg_offset))) 192 193 #define SIERRA_PHY_ISO_LINK_CTRL 0xB 194 195 /* PHY PMA common registers */ 196 #define SIERRA_PHY_PMA_COMMON_OFFSET(block_offset) \ 197 (0xE000 << (block_offset)) 198 #define SIERRA_PHY_PMA_CMN_CTRL 0x000 199 200 /* PHY PMA lane registers */ 201 #define SIERRA_PHY_PMA_LANE_CDB_OFFSET(ln, block_offset, reg_offset) \ 202 ((0xF000 << (block_offset)) + \ 203 (((ln) << 8) << (reg_offset))) 204 205 #define SIERRA_PHY_PMA_XCVR_CTRL 0x000 206 207 #define SIERRA_MACRO_ID 0x00007364 208 #define SIERRA_MAX_LANES 16 209 #define PLL_LOCK_TIME 100000 210 211 #define CDNS_SIERRA_OUTPUT_CLOCKS 3 212 #define CDNS_SIERRA_INPUT_CLOCKS 3 213 enum cdns_sierra_clock_input { 214 PHY_CLK, 215 CMN_REFCLK_DIG_DIV, 216 CMN_REFCLK1_DIG_DIV, 217 }; 218 219 #define SIERRA_NUM_CMN_PLLC 2 220 #define SIERRA_NUM_CMN_PLLC_PARENTS 2 221 222 static const struct reg_field macro_id_type = 223 REG_FIELD(SIERRA_MACRO_ID_REG, 0, 15); 224 static const struct reg_field phy_pll_cfg_1 = 225 REG_FIELD(SIERRA_PHY_PLL_CFG, 1, 1); 226 static const struct reg_field pma_cmn_ready = 227 REG_FIELD(SIERRA_PHY_PMA_CMN_CTRL, 0, 0); 228 static const struct reg_field pllctrl_lock = 229 REG_FIELD(SIERRA_PLLCTRL_STATUS_PREG, 0, 0); 230 static const struct reg_field phy_iso_link_ctrl_1 = 231 REG_FIELD(SIERRA_PHY_ISO_LINK_CTRL, 1, 1); 232 static const struct reg_field cmn_plllc_clk1outdiv_preg = 233 REG_FIELD(SIERRA_CMN_PLLLC_CLK1_PREG, 0, 6); 234 static const struct reg_field cmn_plllc_clk1_en_preg = 235 REG_FIELD(SIERRA_CMN_PLLLC_CLK1_PREG, 12, 12); 236 237 static const char * const clk_names[] = { 238 [CDNS_SIERRA_PLL_CMNLC] = "pll_cmnlc", 239 [CDNS_SIERRA_PLL_CMNLC1] = "pll_cmnlc1", 240 [CDNS_SIERRA_DERIVED_REFCLK] = "refclk_der", 241 }; 242 243 enum cdns_sierra_cmn_plllc { 244 CMN_PLLLC, 245 CMN_PLLLC1, 246 }; 247 248 struct cdns_sierra_pll_mux_reg_fields { 249 struct reg_field pfdclk_sel_preg; 250 struct reg_field plllc1en_field; 251 struct reg_field termen_field; 252 }; 253 254 static const struct cdns_sierra_pll_mux_reg_fields cmn_plllc_pfdclk1_sel_preg[] = { 255 [CMN_PLLLC] = { 256 .pfdclk_sel_preg = REG_FIELD(SIERRA_CMN_PLLLC_GEN_PREG, 1, 1), 257 .plllc1en_field = REG_FIELD(SIERRA_CMN_REFRCV1_PREG, 8, 8), 258 .termen_field = REG_FIELD(SIERRA_CMN_REFRCV1_PREG, 0, 0), 259 }, 260 [CMN_PLLLC1] = { 261 .pfdclk_sel_preg = REG_FIELD(SIERRA_CMN_PLLLC1_GEN_PREG, 1, 1), 262 .plllc1en_field = REG_FIELD(SIERRA_CMN_REFRCV_PREG, 8, 8), 263 .termen_field = REG_FIELD(SIERRA_CMN_REFRCV_PREG, 0, 0), 264 }, 265 }; 266 267 struct cdns_sierra_pll_mux { 268 struct clk_hw hw; 269 struct regmap_field *pfdclk_sel_preg; 270 struct regmap_field *plllc1en_field; 271 struct regmap_field *termen_field; 272 struct clk_init_data clk_data; 273 }; 274 275 #define to_cdns_sierra_pll_mux(_hw) \ 276 container_of(_hw, struct cdns_sierra_pll_mux, hw) 277 278 #define PLL0_REFCLK_NAME "pll0_refclk" 279 #define PLL1_REFCLK_NAME "pll1_refclk" 280 281 static const struct clk_parent_data pll_mux_parent_data[][SIERRA_NUM_CMN_PLLC_PARENTS] = { 282 [CMN_PLLLC] = { 283 { .fw_name = PLL0_REFCLK_NAME }, 284 { .fw_name = PLL1_REFCLK_NAME } 285 }, 286 [CMN_PLLLC1] = { 287 { .fw_name = PLL1_REFCLK_NAME }, 288 { .fw_name = PLL0_REFCLK_NAME } 289 }, 290 }; 291 292 static u32 cdns_sierra_pll_mux_table[][SIERRA_NUM_CMN_PLLC_PARENTS] = { 293 [CMN_PLLLC] = { 0, 1 }, 294 [CMN_PLLLC1] = { 1, 0 }, 295 }; 296 297 struct cdns_sierra_derived_refclk { 298 struct clk_hw hw; 299 struct regmap_field *cmn_plllc_clk1outdiv_preg; 300 struct regmap_field *cmn_plllc_clk1_en_preg; 301 struct clk_init_data clk_data; 302 }; 303 304 #define to_cdns_sierra_derived_refclk(_hw) \ 305 container_of(_hw, struct cdns_sierra_derived_refclk, hw) 306 307 enum cdns_sierra_phy_type { 308 TYPE_NONE, 309 TYPE_PCIE, 310 TYPE_USB, 311 TYPE_SGMII, 312 TYPE_QSGMII 313 }; 314 315 enum cdns_sierra_ssc_mode { 316 NO_SSC, 317 EXTERNAL_SSC, 318 INTERNAL_SSC 319 }; 320 321 struct cdns_sierra_inst { 322 struct phy *phy; 323 enum cdns_sierra_phy_type phy_type; 324 u32 num_lanes; 325 u32 mlane; 326 struct reset_control *lnk_rst; 327 enum cdns_sierra_ssc_mode ssc_mode; 328 }; 329 330 struct cdns_reg_pairs { 331 u16 val; 332 u32 off; 333 }; 334 335 struct cdns_sierra_vals { 336 const struct cdns_reg_pairs *reg_pairs; 337 u32 num_regs; 338 }; 339 340 struct cdns_sierra_data { 341 u32 id_value; 342 u8 block_offset_shift; 343 u8 reg_offset_shift; 344 struct cdns_sierra_vals *pcs_cmn_vals[NUM_PHY_TYPE][NUM_PHY_TYPE] 345 [NUM_SSC_MODE]; 346 struct cdns_sierra_vals *phy_pma_ln_vals[NUM_PHY_TYPE][NUM_PHY_TYPE] 347 [NUM_SSC_MODE]; 348 struct cdns_sierra_vals *pma_cmn_vals[NUM_PHY_TYPE][NUM_PHY_TYPE] 349 [NUM_SSC_MODE]; 350 struct cdns_sierra_vals *pma_ln_vals[NUM_PHY_TYPE][NUM_PHY_TYPE] 351 [NUM_SSC_MODE]; 352 }; 353 354 struct cdns_regmap_cdb_context { 355 struct device *dev; 356 void __iomem *base; 357 u8 reg_offset_shift; 358 }; 359 360 struct cdns_sierra_phy { 361 struct device *dev; 362 const struct cdns_sierra_data *init_data; 363 struct cdns_sierra_inst phys[SIERRA_MAX_LANES]; 364 struct reset_control *phy_rst; 365 struct reset_control *apb_rst; 366 struct regmap *regmap_lane_cdb[SIERRA_MAX_LANES]; 367 struct regmap *regmap_phy_pcs_common_cdb; 368 struct regmap *regmap_phy_pcs_lane_cdb[SIERRA_MAX_LANES]; 369 struct regmap *regmap_phy_pma_common_cdb; 370 struct regmap *regmap_phy_pma_lane_cdb[SIERRA_MAX_LANES]; 371 struct regmap *regmap_common_cdb; 372 struct regmap_field *macro_id_type; 373 struct regmap_field *phy_pll_cfg_1; 374 struct regmap_field *pma_cmn_ready; 375 struct regmap_field *pllctrl_lock[SIERRA_MAX_LANES]; 376 struct regmap_field *phy_iso_link_ctrl_1[SIERRA_MAX_LANES]; 377 struct regmap_field *cmn_refrcv_refclk_plllc1en_preg[SIERRA_NUM_CMN_PLLC]; 378 struct regmap_field *cmn_refrcv_refclk_termen_preg[SIERRA_NUM_CMN_PLLC]; 379 struct regmap_field *cmn_plllc_pfdclk1_sel_preg[SIERRA_NUM_CMN_PLLC]; 380 struct clk *input_clks[CDNS_SIERRA_INPUT_CLOCKS]; 381 int nsubnodes; 382 u32 num_lanes; 383 bool autoconf; 384 int already_configured; 385 struct clk *pll_clks[SIERRA_NUM_CMN_PLLC]; 386 struct clk_hw_onecell_data clk_data; 387 }; 388 389 static int cdns_regmap_write(void *context, unsigned int reg, unsigned int val) 390 { 391 struct cdns_regmap_cdb_context *ctx = context; 392 u32 offset = reg << ctx->reg_offset_shift; 393 394 writew(val, ctx->base + offset); 395 396 return 0; 397 } 398 399 static int cdns_regmap_read(void *context, unsigned int reg, unsigned int *val) 400 { 401 struct cdns_regmap_cdb_context *ctx = context; 402 u32 offset = reg << ctx->reg_offset_shift; 403 404 *val = readw(ctx->base + offset); 405 return 0; 406 } 407 408 #define SIERRA_LANE_CDB_REGMAP_CONF(n) \ 409 { \ 410 .name = "sierra_lane" n "_cdb", \ 411 .reg_stride = 1, \ 412 .fast_io = true, \ 413 .reg_write = cdns_regmap_write, \ 414 .reg_read = cdns_regmap_read, \ 415 } 416 417 static const struct regmap_config cdns_sierra_lane_cdb_config[] = { 418 SIERRA_LANE_CDB_REGMAP_CONF("0"), 419 SIERRA_LANE_CDB_REGMAP_CONF("1"), 420 SIERRA_LANE_CDB_REGMAP_CONF("2"), 421 SIERRA_LANE_CDB_REGMAP_CONF("3"), 422 SIERRA_LANE_CDB_REGMAP_CONF("4"), 423 SIERRA_LANE_CDB_REGMAP_CONF("5"), 424 SIERRA_LANE_CDB_REGMAP_CONF("6"), 425 SIERRA_LANE_CDB_REGMAP_CONF("7"), 426 SIERRA_LANE_CDB_REGMAP_CONF("8"), 427 SIERRA_LANE_CDB_REGMAP_CONF("9"), 428 SIERRA_LANE_CDB_REGMAP_CONF("10"), 429 SIERRA_LANE_CDB_REGMAP_CONF("11"), 430 SIERRA_LANE_CDB_REGMAP_CONF("12"), 431 SIERRA_LANE_CDB_REGMAP_CONF("13"), 432 SIERRA_LANE_CDB_REGMAP_CONF("14"), 433 SIERRA_LANE_CDB_REGMAP_CONF("15"), 434 }; 435 436 static const struct regmap_config cdns_sierra_common_cdb_config = { 437 .name = "sierra_common_cdb", 438 .reg_stride = 1, 439 .fast_io = true, 440 .reg_write = cdns_regmap_write, 441 .reg_read = cdns_regmap_read, 442 }; 443 444 static const struct regmap_config cdns_sierra_phy_pcs_cmn_cdb_config = { 445 .name = "sierra_phy_pcs_cmn_cdb", 446 .reg_stride = 1, 447 .fast_io = true, 448 .reg_write = cdns_regmap_write, 449 .reg_read = cdns_regmap_read, 450 }; 451 452 #define SIERRA_PHY_PCS_LANE_CDB_REGMAP_CONF(n) \ 453 { \ 454 .name = "sierra_phy_pcs_lane" n "_cdb", \ 455 .reg_stride = 1, \ 456 .fast_io = true, \ 457 .reg_write = cdns_regmap_write, \ 458 .reg_read = cdns_regmap_read, \ 459 } 460 461 static const struct regmap_config cdns_sierra_phy_pcs_lane_cdb_config[] = { 462 SIERRA_PHY_PCS_LANE_CDB_REGMAP_CONF("0"), 463 SIERRA_PHY_PCS_LANE_CDB_REGMAP_CONF("1"), 464 SIERRA_PHY_PCS_LANE_CDB_REGMAP_CONF("2"), 465 SIERRA_PHY_PCS_LANE_CDB_REGMAP_CONF("3"), 466 SIERRA_PHY_PCS_LANE_CDB_REGMAP_CONF("4"), 467 SIERRA_PHY_PCS_LANE_CDB_REGMAP_CONF("5"), 468 SIERRA_PHY_PCS_LANE_CDB_REGMAP_CONF("6"), 469 SIERRA_PHY_PCS_LANE_CDB_REGMAP_CONF("7"), 470 SIERRA_PHY_PCS_LANE_CDB_REGMAP_CONF("8"), 471 SIERRA_PHY_PCS_LANE_CDB_REGMAP_CONF("9"), 472 SIERRA_PHY_PCS_LANE_CDB_REGMAP_CONF("10"), 473 SIERRA_PHY_PCS_LANE_CDB_REGMAP_CONF("11"), 474 SIERRA_PHY_PCS_LANE_CDB_REGMAP_CONF("12"), 475 SIERRA_PHY_PCS_LANE_CDB_REGMAP_CONF("13"), 476 SIERRA_PHY_PCS_LANE_CDB_REGMAP_CONF("14"), 477 SIERRA_PHY_PCS_LANE_CDB_REGMAP_CONF("15"), 478 }; 479 480 static const struct regmap_config cdns_sierra_phy_pma_cmn_cdb_config = { 481 .name = "sierra_phy_pma_cmn_cdb", 482 .reg_stride = 1, 483 .fast_io = true, 484 .reg_write = cdns_regmap_write, 485 .reg_read = cdns_regmap_read, 486 }; 487 488 #define SIERRA_PHY_PMA_LANE_CDB_REGMAP_CONF(n) \ 489 { \ 490 .name = "sierra_phy_pma_lane" n "_cdb", \ 491 .reg_stride = 1, \ 492 .fast_io = true, \ 493 .reg_write = cdns_regmap_write, \ 494 .reg_read = cdns_regmap_read, \ 495 } 496 497 static const struct regmap_config cdns_sierra_phy_pma_lane_cdb_config[] = { 498 SIERRA_PHY_PMA_LANE_CDB_REGMAP_CONF("0"), 499 SIERRA_PHY_PMA_LANE_CDB_REGMAP_CONF("1"), 500 SIERRA_PHY_PMA_LANE_CDB_REGMAP_CONF("2"), 501 SIERRA_PHY_PMA_LANE_CDB_REGMAP_CONF("3"), 502 SIERRA_PHY_PMA_LANE_CDB_REGMAP_CONF("4"), 503 SIERRA_PHY_PMA_LANE_CDB_REGMAP_CONF("5"), 504 SIERRA_PHY_PMA_LANE_CDB_REGMAP_CONF("6"), 505 SIERRA_PHY_PMA_LANE_CDB_REGMAP_CONF("7"), 506 SIERRA_PHY_PMA_LANE_CDB_REGMAP_CONF("8"), 507 SIERRA_PHY_PMA_LANE_CDB_REGMAP_CONF("9"), 508 SIERRA_PHY_PMA_LANE_CDB_REGMAP_CONF("10"), 509 SIERRA_PHY_PMA_LANE_CDB_REGMAP_CONF("11"), 510 SIERRA_PHY_PMA_LANE_CDB_REGMAP_CONF("12"), 511 SIERRA_PHY_PMA_LANE_CDB_REGMAP_CONF("13"), 512 SIERRA_PHY_PMA_LANE_CDB_REGMAP_CONF("14"), 513 SIERRA_PHY_PMA_LANE_CDB_REGMAP_CONF("15"), 514 }; 515 516 static int cdns_sierra_phy_init(struct phy *gphy) 517 { 518 struct cdns_sierra_inst *ins = phy_get_drvdata(gphy); 519 struct cdns_sierra_phy *phy = dev_get_drvdata(gphy->dev.parent); 520 const struct cdns_sierra_data *init_data = phy->init_data; 521 struct cdns_sierra_vals *pma_cmn_vals, *pma_ln_vals; 522 enum cdns_sierra_phy_type phy_type = ins->phy_type; 523 enum cdns_sierra_ssc_mode ssc = ins->ssc_mode; 524 struct cdns_sierra_vals *phy_pma_ln_vals; 525 const struct cdns_reg_pairs *reg_pairs; 526 struct cdns_sierra_vals *pcs_cmn_vals; 527 struct regmap *regmap; 528 u32 num_regs; 529 int i, j; 530 531 /* Initialise the PHY registers, unless auto configured */ 532 if (phy->autoconf || phy->already_configured || phy->nsubnodes > 1) 533 return 0; 534 535 clk_set_rate(phy->input_clks[CMN_REFCLK_DIG_DIV], 25000000); 536 clk_set_rate(phy->input_clks[CMN_REFCLK1_DIG_DIV], 25000000); 537 538 /* PHY PCS common registers configurations */ 539 pcs_cmn_vals = init_data->pcs_cmn_vals[phy_type][TYPE_NONE][ssc]; 540 if (pcs_cmn_vals) { 541 reg_pairs = pcs_cmn_vals->reg_pairs; 542 num_regs = pcs_cmn_vals->num_regs; 543 regmap = phy->regmap_phy_pcs_common_cdb; 544 for (i = 0; i < num_regs; i++) 545 regmap_write(regmap, reg_pairs[i].off, reg_pairs[i].val); 546 } 547 548 /* PHY PMA lane registers configurations */ 549 phy_pma_ln_vals = init_data->phy_pma_ln_vals[phy_type][TYPE_NONE][ssc]; 550 if (phy_pma_ln_vals) { 551 reg_pairs = phy_pma_ln_vals->reg_pairs; 552 num_regs = phy_pma_ln_vals->num_regs; 553 for (i = 0; i < ins->num_lanes; i++) { 554 regmap = phy->regmap_phy_pma_lane_cdb[i + ins->mlane]; 555 for (j = 0; j < num_regs; j++) 556 regmap_write(regmap, reg_pairs[j].off, reg_pairs[j].val); 557 } 558 } 559 560 /* PMA common registers configurations */ 561 pma_cmn_vals = init_data->pma_cmn_vals[phy_type][TYPE_NONE][ssc]; 562 if (pma_cmn_vals) { 563 reg_pairs = pma_cmn_vals->reg_pairs; 564 num_regs = pma_cmn_vals->num_regs; 565 regmap = phy->regmap_common_cdb; 566 for (i = 0; i < num_regs; i++) 567 regmap_write(regmap, reg_pairs[i].off, reg_pairs[i].val); 568 } 569 570 /* PMA lane registers configurations */ 571 pma_ln_vals = init_data->pma_ln_vals[phy_type][TYPE_NONE][ssc]; 572 if (pma_ln_vals) { 573 reg_pairs = pma_ln_vals->reg_pairs; 574 num_regs = pma_ln_vals->num_regs; 575 for (i = 0; i < ins->num_lanes; i++) { 576 regmap = phy->regmap_lane_cdb[i + ins->mlane]; 577 for (j = 0; j < num_regs; j++) 578 regmap_write(regmap, reg_pairs[j].off, reg_pairs[j].val); 579 } 580 } 581 582 return 0; 583 } 584 585 static int cdns_sierra_phy_on(struct phy *gphy) 586 { 587 struct cdns_sierra_phy *sp = dev_get_drvdata(gphy->dev.parent); 588 struct cdns_sierra_inst *ins = phy_get_drvdata(gphy); 589 struct device *dev = sp->dev; 590 u32 val; 591 int ret; 592 593 if (sp->nsubnodes == 1) { 594 /* Take the PHY out of reset */ 595 ret = reset_control_deassert(sp->phy_rst); 596 if (ret) { 597 dev_err(dev, "Failed to take the PHY out of reset\n"); 598 return ret; 599 } 600 } 601 602 /* Take the PHY lane group out of reset */ 603 ret = reset_control_deassert(ins->lnk_rst); 604 if (ret) { 605 dev_err(dev, "Failed to take the PHY lane out of reset\n"); 606 return ret; 607 } 608 609 if (ins->phy_type == TYPE_PCIE || ins->phy_type == TYPE_USB) { 610 ret = regmap_field_read_poll_timeout(sp->phy_iso_link_ctrl_1[ins->mlane], 611 val, !val, 1000, PLL_LOCK_TIME); 612 if (ret) { 613 dev_err(dev, "Timeout waiting for PHY status ready\n"); 614 return ret; 615 } 616 } 617 618 /* 619 * Wait for cmn_ready assertion 620 * PHY_PMA_CMN_CTRL[0] == 1 621 */ 622 ret = regmap_field_read_poll_timeout(sp->pma_cmn_ready, val, val, 623 1000, PLL_LOCK_TIME); 624 if (ret) { 625 dev_err(dev, "Timeout waiting for CMN ready\n"); 626 return ret; 627 } 628 629 ret = regmap_field_read_poll_timeout(sp->pllctrl_lock[ins->mlane], 630 val, val, 1000, PLL_LOCK_TIME); 631 if (ret < 0) 632 dev_err(dev, "PLL lock of lane failed\n"); 633 634 return ret; 635 } 636 637 static int cdns_sierra_phy_off(struct phy *gphy) 638 { 639 struct cdns_sierra_inst *ins = phy_get_drvdata(gphy); 640 641 return reset_control_assert(ins->lnk_rst); 642 } 643 644 static int cdns_sierra_phy_reset(struct phy *gphy) 645 { 646 struct cdns_sierra_phy *sp = dev_get_drvdata(gphy->dev.parent); 647 648 reset_control_assert(sp->phy_rst); 649 reset_control_deassert(sp->phy_rst); 650 return 0; 651 }; 652 653 static const struct phy_ops ops = { 654 .init = cdns_sierra_phy_init, 655 .power_on = cdns_sierra_phy_on, 656 .power_off = cdns_sierra_phy_off, 657 .reset = cdns_sierra_phy_reset, 658 .owner = THIS_MODULE, 659 }; 660 661 static int cdns_sierra_noop_phy_on(struct phy *gphy) 662 { 663 usleep_range(5000, 10000); 664 665 return 0; 666 } 667 668 static const struct phy_ops noop_ops = { 669 .power_on = cdns_sierra_noop_phy_on, 670 .owner = THIS_MODULE, 671 }; 672 673 static u8 cdns_sierra_pll_mux_get_parent(struct clk_hw *hw) 674 { 675 struct cdns_sierra_pll_mux *mux = to_cdns_sierra_pll_mux(hw); 676 struct regmap_field *plllc1en_field = mux->plllc1en_field; 677 struct regmap_field *termen_field = mux->termen_field; 678 struct regmap_field *field = mux->pfdclk_sel_preg; 679 unsigned int val; 680 int index; 681 682 regmap_field_read(field, &val); 683 684 if (strstr(clk_hw_get_name(hw), clk_names[CDNS_SIERRA_PLL_CMNLC1])) { 685 index = clk_mux_val_to_index(hw, cdns_sierra_pll_mux_table[CMN_PLLLC1], 0, val); 686 if (index == 1) { 687 regmap_field_write(plllc1en_field, 1); 688 regmap_field_write(termen_field, 1); 689 } 690 } else { 691 index = clk_mux_val_to_index(hw, cdns_sierra_pll_mux_table[CMN_PLLLC], 0, val); 692 } 693 694 return index; 695 } 696 697 static int cdns_sierra_pll_mux_set_parent(struct clk_hw *hw, u8 index) 698 { 699 struct cdns_sierra_pll_mux *mux = to_cdns_sierra_pll_mux(hw); 700 struct regmap_field *plllc1en_field = mux->plllc1en_field; 701 struct regmap_field *termen_field = mux->termen_field; 702 struct regmap_field *field = mux->pfdclk_sel_preg; 703 int val, ret; 704 705 ret = regmap_field_write(plllc1en_field, 0); 706 ret |= regmap_field_write(termen_field, 0); 707 if (index == 1) { 708 ret |= regmap_field_write(plllc1en_field, 1); 709 ret |= regmap_field_write(termen_field, 1); 710 } 711 712 if (strstr(clk_hw_get_name(hw), clk_names[CDNS_SIERRA_PLL_CMNLC1])) 713 val = cdns_sierra_pll_mux_table[CMN_PLLLC1][index]; 714 else 715 val = cdns_sierra_pll_mux_table[CMN_PLLLC][index]; 716 717 ret |= regmap_field_write(field, val); 718 719 return ret; 720 } 721 722 static const struct clk_ops cdns_sierra_pll_mux_ops = { 723 .determine_rate = __clk_mux_determine_rate, 724 .set_parent = cdns_sierra_pll_mux_set_parent, 725 .get_parent = cdns_sierra_pll_mux_get_parent, 726 }; 727 728 static int cdns_sierra_pll_mux_register(struct cdns_sierra_phy *sp, 729 struct regmap_field *pfdclk1_sel_field, 730 struct regmap_field *plllc1en_field, 731 struct regmap_field *termen_field, 732 int clk_index) 733 { 734 struct cdns_sierra_pll_mux *mux; 735 struct device *dev = sp->dev; 736 struct clk_init_data *init; 737 char clk_name[100]; 738 int ret; 739 740 mux = devm_kzalloc(dev, sizeof(*mux), GFP_KERNEL); 741 if (!mux) 742 return -ENOMEM; 743 744 snprintf(clk_name, sizeof(clk_name), "%s_%s", dev_name(dev), clk_names[clk_index]); 745 746 init = &mux->clk_data; 747 748 init->ops = &cdns_sierra_pll_mux_ops; 749 init->flags = CLK_SET_RATE_NO_REPARENT; 750 init->parent_data = pll_mux_parent_data[clk_index]; 751 init->num_parents = SIERRA_NUM_CMN_PLLC_PARENTS; 752 init->name = clk_name; 753 754 mux->pfdclk_sel_preg = pfdclk1_sel_field; 755 mux->plllc1en_field = plllc1en_field; 756 mux->termen_field = termen_field; 757 mux->hw.init = init; 758 759 ret = devm_clk_hw_register(dev, &mux->hw); 760 if (ret) 761 return ret; 762 763 sp->clk_data.hws[clk_index] = &mux->hw; 764 765 sp->pll_clks[clk_index] = devm_clk_hw_get_clk(dev, &mux->hw, 766 clk_names[clk_index]); 767 768 return 0; 769 } 770 771 static int cdns_sierra_phy_register_pll_mux(struct cdns_sierra_phy *sp) 772 { 773 struct regmap_field *pfdclk1_sel_field; 774 struct regmap_field *plllc1en_field; 775 struct regmap_field *termen_field; 776 struct device *dev = sp->dev; 777 int ret = 0, i, clk_index; 778 779 clk_index = CDNS_SIERRA_PLL_CMNLC; 780 for (i = 0; i < SIERRA_NUM_CMN_PLLC; i++, clk_index++) { 781 pfdclk1_sel_field = sp->cmn_plllc_pfdclk1_sel_preg[i]; 782 plllc1en_field = sp->cmn_refrcv_refclk_plllc1en_preg[i]; 783 termen_field = sp->cmn_refrcv_refclk_termen_preg[i]; 784 785 ret = cdns_sierra_pll_mux_register(sp, pfdclk1_sel_field, plllc1en_field, 786 termen_field, clk_index); 787 if (ret) { 788 dev_err(dev, "Fail to register cmn plllc mux\n"); 789 return ret; 790 } 791 } 792 793 return 0; 794 } 795 796 static int cdns_sierra_derived_refclk_enable(struct clk_hw *hw) 797 { 798 struct cdns_sierra_derived_refclk *derived_refclk = to_cdns_sierra_derived_refclk(hw); 799 800 regmap_field_write(derived_refclk->cmn_plllc_clk1_en_preg, 0x1); 801 802 /* Programming to get 100Mhz clock output in ref_der_clk_out 5GHz VCO/50 = 100MHz */ 803 regmap_field_write(derived_refclk->cmn_plllc_clk1outdiv_preg, 0x2E); 804 805 return 0; 806 } 807 808 static void cdns_sierra_derived_refclk_disable(struct clk_hw *hw) 809 { 810 struct cdns_sierra_derived_refclk *derived_refclk = to_cdns_sierra_derived_refclk(hw); 811 812 regmap_field_write(derived_refclk->cmn_plllc_clk1_en_preg, 0); 813 } 814 815 static int cdns_sierra_derived_refclk_is_enabled(struct clk_hw *hw) 816 { 817 struct cdns_sierra_derived_refclk *derived_refclk = to_cdns_sierra_derived_refclk(hw); 818 int val; 819 820 regmap_field_read(derived_refclk->cmn_plllc_clk1_en_preg, &val); 821 822 return !!val; 823 } 824 825 static const struct clk_ops cdns_sierra_derived_refclk_ops = { 826 .enable = cdns_sierra_derived_refclk_enable, 827 .disable = cdns_sierra_derived_refclk_disable, 828 .is_enabled = cdns_sierra_derived_refclk_is_enabled, 829 }; 830 831 static int cdns_sierra_derived_refclk_register(struct cdns_sierra_phy *sp) 832 { 833 struct cdns_sierra_derived_refclk *derived_refclk; 834 struct device *dev = sp->dev; 835 struct regmap_field *field; 836 struct clk_init_data *init; 837 struct regmap *regmap; 838 char clk_name[100]; 839 int ret; 840 841 derived_refclk = devm_kzalloc(dev, sizeof(*derived_refclk), GFP_KERNEL); 842 if (!derived_refclk) 843 return -ENOMEM; 844 845 snprintf(clk_name, sizeof(clk_name), "%s_%s", dev_name(dev), 846 clk_names[CDNS_SIERRA_DERIVED_REFCLK]); 847 848 init = &derived_refclk->clk_data; 849 850 init->ops = &cdns_sierra_derived_refclk_ops; 851 init->flags = 0; 852 init->name = clk_name; 853 854 regmap = sp->regmap_common_cdb; 855 856 field = devm_regmap_field_alloc(dev, regmap, cmn_plllc_clk1outdiv_preg); 857 if (IS_ERR(field)) { 858 dev_err(dev, "cmn_plllc_clk1outdiv_preg reg field init failed\n"); 859 return PTR_ERR(field); 860 } 861 derived_refclk->cmn_plllc_clk1outdiv_preg = field; 862 863 field = devm_regmap_field_alloc(dev, regmap, cmn_plllc_clk1_en_preg); 864 if (IS_ERR(field)) { 865 dev_err(dev, "cmn_plllc_clk1_en_preg reg field init failed\n"); 866 return PTR_ERR(field); 867 } 868 derived_refclk->cmn_plllc_clk1_en_preg = field; 869 870 derived_refclk->hw.init = init; 871 872 ret = devm_clk_hw_register(dev, &derived_refclk->hw); 873 if (ret) 874 return ret; 875 876 sp->clk_data.hws[CDNS_SIERRA_DERIVED_REFCLK] = &derived_refclk->hw; 877 878 return 0; 879 } 880 881 static void cdns_sierra_clk_unregister(struct cdns_sierra_phy *sp) 882 { 883 struct device *dev = sp->dev; 884 struct device_node *node = dev->of_node; 885 886 of_clk_del_provider(node); 887 } 888 889 static int cdns_sierra_clk_register(struct cdns_sierra_phy *sp) 890 { 891 struct device *dev = sp->dev; 892 struct device_node *node = dev->of_node; 893 int ret; 894 895 ret = cdns_sierra_phy_register_pll_mux(sp); 896 if (ret) { 897 dev_err(dev, "Failed to pll mux clocks\n"); 898 return ret; 899 } 900 901 ret = cdns_sierra_derived_refclk_register(sp); 902 if (ret) { 903 dev_err(dev, "Failed to register derived refclk\n"); 904 return ret; 905 } 906 907 sp->clk_data.num = CDNS_SIERRA_OUTPUT_CLOCKS; 908 ret = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, 909 &sp->clk_data); 910 if (ret) 911 dev_err(dev, "Failed to add clock provider: %s\n", node->name); 912 913 return ret; 914 } 915 916 static int cdns_sierra_get_optional(struct cdns_sierra_inst *inst, 917 struct device_node *child) 918 { 919 u32 phy_type; 920 921 if (of_property_read_u32(child, "reg", &inst->mlane)) 922 return -EINVAL; 923 924 if (of_property_read_u32(child, "cdns,num-lanes", &inst->num_lanes)) 925 return -EINVAL; 926 927 if (of_property_read_u32(child, "cdns,phy-type", &phy_type)) 928 return -EINVAL; 929 930 switch (phy_type) { 931 case PHY_TYPE_PCIE: 932 inst->phy_type = TYPE_PCIE; 933 break; 934 case PHY_TYPE_USB3: 935 inst->phy_type = TYPE_USB; 936 break; 937 case PHY_TYPE_SGMII: 938 inst->phy_type = TYPE_SGMII; 939 break; 940 case PHY_TYPE_QSGMII: 941 inst->phy_type = TYPE_QSGMII; 942 break; 943 default: 944 return -EINVAL; 945 } 946 947 inst->ssc_mode = EXTERNAL_SSC; 948 of_property_read_u32(child, "cdns,ssc-mode", &inst->ssc_mode); 949 950 return 0; 951 } 952 953 static struct regmap *cdns_regmap_init(struct device *dev, void __iomem *base, 954 u32 block_offset, u8 reg_offset_shift, 955 const struct regmap_config *config) 956 { 957 struct cdns_regmap_cdb_context *ctx; 958 959 ctx = devm_kzalloc(dev, sizeof(*ctx), GFP_KERNEL); 960 if (!ctx) 961 return ERR_PTR(-ENOMEM); 962 963 ctx->dev = dev; 964 ctx->base = base + block_offset; 965 ctx->reg_offset_shift = reg_offset_shift; 966 967 return devm_regmap_init(dev, NULL, ctx, config); 968 } 969 970 static int cdns_regfield_init(struct cdns_sierra_phy *sp) 971 { 972 struct device *dev = sp->dev; 973 struct regmap_field *field; 974 struct reg_field reg_field; 975 struct regmap *regmap; 976 int i; 977 978 regmap = sp->regmap_common_cdb; 979 field = devm_regmap_field_alloc(dev, regmap, macro_id_type); 980 if (IS_ERR(field)) { 981 dev_err(dev, "MACRO_ID_TYPE reg field init failed\n"); 982 return PTR_ERR(field); 983 } 984 sp->macro_id_type = field; 985 986 for (i = 0; i < SIERRA_NUM_CMN_PLLC; i++) { 987 reg_field = cmn_plllc_pfdclk1_sel_preg[i].pfdclk_sel_preg; 988 field = devm_regmap_field_alloc(dev, regmap, reg_field); 989 if (IS_ERR(field)) { 990 dev_err(dev, "PLLLC%d_PFDCLK1_SEL failed\n", i); 991 return PTR_ERR(field); 992 } 993 sp->cmn_plllc_pfdclk1_sel_preg[i] = field; 994 995 reg_field = cmn_plllc_pfdclk1_sel_preg[i].plllc1en_field; 996 field = devm_regmap_field_alloc(dev, regmap, reg_field); 997 if (IS_ERR(field)) { 998 dev_err(dev, "REFRCV%d_REFCLK_PLLLC1EN failed\n", i); 999 return PTR_ERR(field); 1000 } 1001 sp->cmn_refrcv_refclk_plllc1en_preg[i] = field; 1002 1003 reg_field = cmn_plllc_pfdclk1_sel_preg[i].termen_field; 1004 field = devm_regmap_field_alloc(dev, regmap, reg_field); 1005 if (IS_ERR(field)) { 1006 dev_err(dev, "REFRCV%d_REFCLK_TERMEN failed\n", i); 1007 return PTR_ERR(field); 1008 } 1009 sp->cmn_refrcv_refclk_termen_preg[i] = field; 1010 } 1011 1012 regmap = sp->regmap_phy_pcs_common_cdb; 1013 field = devm_regmap_field_alloc(dev, regmap, phy_pll_cfg_1); 1014 if (IS_ERR(field)) { 1015 dev_err(dev, "PHY_PLL_CFG_1 reg field init failed\n"); 1016 return PTR_ERR(field); 1017 } 1018 sp->phy_pll_cfg_1 = field; 1019 1020 regmap = sp->regmap_phy_pma_common_cdb; 1021 field = devm_regmap_field_alloc(dev, regmap, pma_cmn_ready); 1022 if (IS_ERR(field)) { 1023 dev_err(dev, "PHY_PMA_CMN_CTRL reg field init failed\n"); 1024 return PTR_ERR(field); 1025 } 1026 sp->pma_cmn_ready = field; 1027 1028 for (i = 0; i < SIERRA_MAX_LANES; i++) { 1029 regmap = sp->regmap_lane_cdb[i]; 1030 field = devm_regmap_field_alloc(dev, regmap, pllctrl_lock); 1031 if (IS_ERR(field)) { 1032 dev_err(dev, "P%d_ENABLE reg field init failed\n", i); 1033 return PTR_ERR(field); 1034 } 1035 sp->pllctrl_lock[i] = field; 1036 } 1037 1038 for (i = 0; i < SIERRA_MAX_LANES; i++) { 1039 regmap = sp->regmap_phy_pcs_lane_cdb[i]; 1040 field = devm_regmap_field_alloc(dev, regmap, phy_iso_link_ctrl_1); 1041 if (IS_ERR(field)) { 1042 dev_err(dev, "PHY_ISO_LINK_CTRL reg field init for lane %d failed\n", i); 1043 return PTR_ERR(field); 1044 } 1045 sp->phy_iso_link_ctrl_1[i] = field; 1046 } 1047 1048 return 0; 1049 } 1050 1051 static int cdns_regmap_init_blocks(struct cdns_sierra_phy *sp, 1052 void __iomem *base, u8 block_offset_shift, 1053 u8 reg_offset_shift) 1054 { 1055 struct device *dev = sp->dev; 1056 struct regmap *regmap; 1057 u32 block_offset; 1058 int i; 1059 1060 for (i = 0; i < SIERRA_MAX_LANES; i++) { 1061 block_offset = SIERRA_LANE_CDB_OFFSET(i, block_offset_shift, 1062 reg_offset_shift); 1063 regmap = cdns_regmap_init(dev, base, block_offset, 1064 reg_offset_shift, 1065 &cdns_sierra_lane_cdb_config[i]); 1066 if (IS_ERR(regmap)) { 1067 dev_err(dev, "Failed to init lane CDB regmap\n"); 1068 return PTR_ERR(regmap); 1069 } 1070 sp->regmap_lane_cdb[i] = regmap; 1071 } 1072 1073 regmap = cdns_regmap_init(dev, base, SIERRA_COMMON_CDB_OFFSET, 1074 reg_offset_shift, 1075 &cdns_sierra_common_cdb_config); 1076 if (IS_ERR(regmap)) { 1077 dev_err(dev, "Failed to init common CDB regmap\n"); 1078 return PTR_ERR(regmap); 1079 } 1080 sp->regmap_common_cdb = regmap; 1081 1082 block_offset = SIERRA_PHY_PCS_COMMON_OFFSET(block_offset_shift); 1083 regmap = cdns_regmap_init(dev, base, block_offset, reg_offset_shift, 1084 &cdns_sierra_phy_pcs_cmn_cdb_config); 1085 if (IS_ERR(regmap)) { 1086 dev_err(dev, "Failed to init PHY PCS common CDB regmap\n"); 1087 return PTR_ERR(regmap); 1088 } 1089 sp->regmap_phy_pcs_common_cdb = regmap; 1090 1091 for (i = 0; i < SIERRA_MAX_LANES; i++) { 1092 block_offset = SIERRA_PHY_PCS_LANE_CDB_OFFSET(i, block_offset_shift, 1093 reg_offset_shift); 1094 regmap = cdns_regmap_init(dev, base, block_offset, 1095 reg_offset_shift, 1096 &cdns_sierra_phy_pcs_lane_cdb_config[i]); 1097 if (IS_ERR(regmap)) { 1098 dev_err(dev, "Failed to init PHY PCS lane CDB regmap\n"); 1099 return PTR_ERR(regmap); 1100 } 1101 sp->regmap_phy_pcs_lane_cdb[i] = regmap; 1102 } 1103 1104 block_offset = SIERRA_PHY_PMA_COMMON_OFFSET(block_offset_shift); 1105 regmap = cdns_regmap_init(dev, base, block_offset, reg_offset_shift, 1106 &cdns_sierra_phy_pma_cmn_cdb_config); 1107 if (IS_ERR(regmap)) { 1108 dev_err(dev, "Failed to init PHY PMA common CDB regmap\n"); 1109 return PTR_ERR(regmap); 1110 } 1111 sp->regmap_phy_pma_common_cdb = regmap; 1112 1113 for (i = 0; i < SIERRA_MAX_LANES; i++) { 1114 block_offset = SIERRA_PHY_PMA_LANE_CDB_OFFSET(i, block_offset_shift, 1115 reg_offset_shift); 1116 regmap = cdns_regmap_init(dev, base, block_offset, 1117 reg_offset_shift, 1118 &cdns_sierra_phy_pma_lane_cdb_config[i]); 1119 if (IS_ERR(regmap)) { 1120 dev_err(dev, "Failed to init PHY PMA lane CDB regmap\n"); 1121 return PTR_ERR(regmap); 1122 } 1123 sp->regmap_phy_pma_lane_cdb[i] = regmap; 1124 } 1125 1126 return 0; 1127 } 1128 1129 static int cdns_sierra_phy_get_clocks(struct cdns_sierra_phy *sp, 1130 struct device *dev) 1131 { 1132 struct clk *clk; 1133 int ret; 1134 1135 clk = devm_clk_get_optional(dev, "cmn_refclk_dig_div"); 1136 if (IS_ERR(clk)) { 1137 dev_err(dev, "cmn_refclk_dig_div clock not found\n"); 1138 ret = PTR_ERR(clk); 1139 return ret; 1140 } 1141 sp->input_clks[CMN_REFCLK_DIG_DIV] = clk; 1142 1143 clk = devm_clk_get_optional(dev, "cmn_refclk1_dig_div"); 1144 if (IS_ERR(clk)) { 1145 dev_err(dev, "cmn_refclk1_dig_div clock not found\n"); 1146 ret = PTR_ERR(clk); 1147 return ret; 1148 } 1149 sp->input_clks[CMN_REFCLK1_DIG_DIV] = clk; 1150 1151 return 0; 1152 } 1153 1154 static int cdns_sierra_phy_clk(struct cdns_sierra_phy *sp) 1155 { 1156 struct device *dev = sp->dev; 1157 struct clk *clk; 1158 int ret; 1159 1160 clk = devm_clk_get_optional(dev, "phy_clk"); 1161 if (IS_ERR(clk)) { 1162 dev_err(dev, "failed to get clock phy_clk\n"); 1163 return PTR_ERR(clk); 1164 } 1165 sp->input_clks[PHY_CLK] = clk; 1166 1167 ret = clk_prepare_enable(sp->input_clks[PHY_CLK]); 1168 if (ret) 1169 return ret; 1170 1171 return 0; 1172 } 1173 1174 static int cdns_sierra_phy_enable_clocks(struct cdns_sierra_phy *sp) 1175 { 1176 int ret; 1177 1178 ret = clk_prepare_enable(sp->pll_clks[CDNS_SIERRA_PLL_CMNLC]); 1179 if (ret) 1180 return ret; 1181 1182 ret = clk_prepare_enable(sp->pll_clks[CDNS_SIERRA_PLL_CMNLC1]); 1183 if (ret) 1184 goto err_pll_cmnlc1; 1185 1186 return 0; 1187 1188 err_pll_cmnlc1: 1189 clk_disable_unprepare(sp->pll_clks[CDNS_SIERRA_PLL_CMNLC]); 1190 1191 return ret; 1192 } 1193 1194 static void cdns_sierra_phy_disable_clocks(struct cdns_sierra_phy *sp) 1195 { 1196 clk_disable_unprepare(sp->pll_clks[CDNS_SIERRA_PLL_CMNLC1]); 1197 clk_disable_unprepare(sp->pll_clks[CDNS_SIERRA_PLL_CMNLC]); 1198 if (!sp->already_configured) 1199 clk_disable_unprepare(sp->input_clks[PHY_CLK]); 1200 } 1201 1202 static int cdns_sierra_phy_get_resets(struct cdns_sierra_phy *sp, 1203 struct device *dev) 1204 { 1205 struct reset_control *rst; 1206 1207 rst = devm_reset_control_get_exclusive(dev, "sierra_reset"); 1208 if (IS_ERR(rst)) { 1209 dev_err(dev, "failed to get reset\n"); 1210 return PTR_ERR(rst); 1211 } 1212 sp->phy_rst = rst; 1213 1214 rst = devm_reset_control_get_optional_exclusive(dev, "sierra_apb"); 1215 if (IS_ERR(rst)) { 1216 dev_err(dev, "failed to get apb reset\n"); 1217 return PTR_ERR(rst); 1218 } 1219 sp->apb_rst = rst; 1220 1221 return 0; 1222 } 1223 1224 static int cdns_sierra_phy_configure_multilink(struct cdns_sierra_phy *sp) 1225 { 1226 const struct cdns_sierra_data *init_data = sp->init_data; 1227 struct cdns_sierra_vals *pma_cmn_vals, *pma_ln_vals; 1228 enum cdns_sierra_phy_type phy_t1, phy_t2; 1229 struct cdns_sierra_vals *phy_pma_ln_vals; 1230 const struct cdns_reg_pairs *reg_pairs; 1231 struct cdns_sierra_vals *pcs_cmn_vals; 1232 int i, j, node, mlane, num_lanes, ret; 1233 enum cdns_sierra_ssc_mode ssc; 1234 struct regmap *regmap; 1235 u32 num_regs; 1236 1237 /* Maximum 2 links (subnodes) are supported */ 1238 if (sp->nsubnodes != 2) 1239 return -EINVAL; 1240 1241 clk_set_rate(sp->input_clks[CMN_REFCLK_DIG_DIV], 25000000); 1242 clk_set_rate(sp->input_clks[CMN_REFCLK1_DIG_DIV], 25000000); 1243 1244 /* PHY configured to use both PLL LC and LC1 */ 1245 regmap_field_write(sp->phy_pll_cfg_1, 0x1); 1246 1247 phy_t1 = sp->phys[0].phy_type; 1248 phy_t2 = sp->phys[1].phy_type; 1249 1250 /* 1251 * PHY configuration for multi-link operation is done in two steps. 1252 * e.g. Consider a case for a 4 lane PHY with PCIe using 2 lanes and QSGMII other 2 lanes. 1253 * Sierra PHY has 2 PLLs, viz. PLLLC and PLLLC1. So in this case, PLLLC is used for PCIe 1254 * and PLLLC1 is used for QSGMII. PHY is configured in two steps as described below. 1255 * 1256 * [1] For first step, phy_t1 = TYPE_PCIE and phy_t2 = TYPE_QSGMII 1257 * So the register values are selected as [TYPE_PCIE][TYPE_QSGMII][ssc]. 1258 * This will configure PHY registers associated for PCIe (i.e. first protocol) 1259 * involving PLLLC registers and registers for first 2 lanes of PHY. 1260 * [2] In second step, the variables phy_t1 and phy_t2 are swapped. So now, 1261 * phy_t1 = TYPE_QSGMII and phy_t2 = TYPE_PCIE. And the register values are selected as 1262 * [TYPE_QSGMII][TYPE_PCIE][ssc]. 1263 * This will configure PHY registers associated for QSGMII (i.e. second protocol) 1264 * involving PLLLC1 registers and registers for other 2 lanes of PHY. 1265 * 1266 * This completes the PHY configuration for multilink operation. This approach enables 1267 * dividing the large number of PHY register configurations into protocol specific 1268 * smaller groups. 1269 */ 1270 for (node = 0; node < sp->nsubnodes; node++) { 1271 if (node == 1) { 1272 /* 1273 * If first link with phy_t1 is configured, then configure the PHY for 1274 * second link with phy_t2. Get the array values as [phy_t2][phy_t1][ssc]. 1275 */ 1276 swap(phy_t1, phy_t2); 1277 } 1278 1279 mlane = sp->phys[node].mlane; 1280 ssc = sp->phys[node].ssc_mode; 1281 num_lanes = sp->phys[node].num_lanes; 1282 1283 /* PHY PCS common registers configurations */ 1284 pcs_cmn_vals = init_data->pcs_cmn_vals[phy_t1][phy_t2][ssc]; 1285 if (pcs_cmn_vals) { 1286 reg_pairs = pcs_cmn_vals->reg_pairs; 1287 num_regs = pcs_cmn_vals->num_regs; 1288 regmap = sp->regmap_phy_pcs_common_cdb; 1289 for (i = 0; i < num_regs; i++) 1290 regmap_write(regmap, reg_pairs[i].off, reg_pairs[i].val); 1291 } 1292 1293 /* PHY PMA lane registers configurations */ 1294 phy_pma_ln_vals = init_data->phy_pma_ln_vals[phy_t1][phy_t2][ssc]; 1295 if (phy_pma_ln_vals) { 1296 reg_pairs = phy_pma_ln_vals->reg_pairs; 1297 num_regs = phy_pma_ln_vals->num_regs; 1298 for (i = 0; i < num_lanes; i++) { 1299 regmap = sp->regmap_phy_pma_lane_cdb[i + mlane]; 1300 for (j = 0; j < num_regs; j++) 1301 regmap_write(regmap, reg_pairs[j].off, reg_pairs[j].val); 1302 } 1303 } 1304 1305 /* PMA common registers configurations */ 1306 pma_cmn_vals = init_data->pma_cmn_vals[phy_t1][phy_t2][ssc]; 1307 if (pma_cmn_vals) { 1308 reg_pairs = pma_cmn_vals->reg_pairs; 1309 num_regs = pma_cmn_vals->num_regs; 1310 regmap = sp->regmap_common_cdb; 1311 for (i = 0; i < num_regs; i++) 1312 regmap_write(regmap, reg_pairs[i].off, reg_pairs[i].val); 1313 } 1314 1315 /* PMA lane registers configurations */ 1316 pma_ln_vals = init_data->pma_ln_vals[phy_t1][phy_t2][ssc]; 1317 if (pma_ln_vals) { 1318 reg_pairs = pma_ln_vals->reg_pairs; 1319 num_regs = pma_ln_vals->num_regs; 1320 for (i = 0; i < num_lanes; i++) { 1321 regmap = sp->regmap_lane_cdb[i + mlane]; 1322 for (j = 0; j < num_regs; j++) 1323 regmap_write(regmap, reg_pairs[j].off, reg_pairs[j].val); 1324 } 1325 } 1326 1327 if (phy_t1 == TYPE_SGMII || phy_t1 == TYPE_QSGMII) 1328 reset_control_deassert(sp->phys[node].lnk_rst); 1329 } 1330 1331 /* Take the PHY out of reset */ 1332 ret = reset_control_deassert(sp->phy_rst); 1333 if (ret) 1334 return ret; 1335 1336 return 0; 1337 } 1338 1339 static int cdns_sierra_phy_probe(struct platform_device *pdev) 1340 { 1341 struct cdns_sierra_phy *sp; 1342 struct phy_provider *phy_provider; 1343 struct device *dev = &pdev->dev; 1344 const struct cdns_sierra_data *data; 1345 unsigned int id_value; 1346 int ret, node = 0; 1347 void __iomem *base; 1348 struct device_node *dn = dev->of_node, *child; 1349 1350 if (of_get_child_count(dn) == 0) 1351 return -ENODEV; 1352 1353 /* Get init data for this PHY */ 1354 data = of_device_get_match_data(dev); 1355 if (!data) 1356 return -EINVAL; 1357 1358 sp = devm_kzalloc(dev, struct_size(sp, clk_data.hws, 1359 CDNS_SIERRA_OUTPUT_CLOCKS), 1360 GFP_KERNEL); 1361 if (!sp) 1362 return -ENOMEM; 1363 dev_set_drvdata(dev, sp); 1364 sp->dev = dev; 1365 sp->init_data = data; 1366 1367 base = devm_platform_ioremap_resource(pdev, 0); 1368 if (IS_ERR(base)) { 1369 dev_err(dev, "missing \"reg\"\n"); 1370 return PTR_ERR(base); 1371 } 1372 1373 ret = cdns_regmap_init_blocks(sp, base, data->block_offset_shift, 1374 data->reg_offset_shift); 1375 if (ret) 1376 return ret; 1377 1378 ret = cdns_regfield_init(sp); 1379 if (ret) 1380 return ret; 1381 1382 platform_set_drvdata(pdev, sp); 1383 1384 ret = cdns_sierra_phy_get_clocks(sp, dev); 1385 if (ret) 1386 return ret; 1387 1388 ret = cdns_sierra_clk_register(sp); 1389 if (ret) 1390 return ret; 1391 1392 ret = cdns_sierra_phy_enable_clocks(sp); 1393 if (ret) 1394 goto unregister_clk; 1395 1396 regmap_field_read(sp->pma_cmn_ready, &sp->already_configured); 1397 1398 if (!sp->already_configured) { 1399 ret = cdns_sierra_phy_clk(sp); 1400 if (ret) 1401 goto clk_disable; 1402 1403 ret = cdns_sierra_phy_get_resets(sp, dev); 1404 if (ret) 1405 goto clk_disable; 1406 1407 /* Enable APB */ 1408 reset_control_deassert(sp->apb_rst); 1409 } 1410 1411 /* Check that PHY is present */ 1412 regmap_field_read(sp->macro_id_type, &id_value); 1413 if (sp->init_data->id_value != id_value) { 1414 ret = -EINVAL; 1415 goto ctrl_assert; 1416 } 1417 1418 sp->autoconf = of_property_read_bool(dn, "cdns,autoconf"); 1419 1420 for_each_available_child_of_node(dn, child) { 1421 struct phy *gphy; 1422 1423 if (!(of_node_name_eq(child, "phy") || 1424 of_node_name_eq(child, "link"))) 1425 continue; 1426 1427 sp->phys[node].lnk_rst = 1428 of_reset_control_array_get_exclusive(child); 1429 1430 if (IS_ERR(sp->phys[node].lnk_rst)) { 1431 dev_err(dev, "failed to get reset %s\n", 1432 child->full_name); 1433 ret = PTR_ERR(sp->phys[node].lnk_rst); 1434 of_node_put(child); 1435 goto put_control; 1436 } 1437 1438 if (!sp->autoconf) { 1439 ret = cdns_sierra_get_optional(&sp->phys[node], child); 1440 if (ret) { 1441 dev_err(dev, "missing property in node %s\n", 1442 child->name); 1443 of_node_put(child); 1444 reset_control_put(sp->phys[node].lnk_rst); 1445 goto put_control; 1446 } 1447 } 1448 1449 sp->num_lanes += sp->phys[node].num_lanes; 1450 1451 if (!sp->already_configured) 1452 gphy = devm_phy_create(dev, child, &ops); 1453 else 1454 gphy = devm_phy_create(dev, child, &noop_ops); 1455 if (IS_ERR(gphy)) { 1456 ret = PTR_ERR(gphy); 1457 of_node_put(child); 1458 reset_control_put(sp->phys[node].lnk_rst); 1459 goto put_control; 1460 } 1461 sp->phys[node].phy = gphy; 1462 phy_set_drvdata(gphy, &sp->phys[node]); 1463 1464 node++; 1465 } 1466 sp->nsubnodes = node; 1467 1468 if (sp->num_lanes > SIERRA_MAX_LANES) { 1469 ret = -EINVAL; 1470 dev_err(dev, "Invalid lane configuration\n"); 1471 goto put_control; 1472 } 1473 1474 /* If more than one subnode, configure the PHY as multilink */ 1475 if (!sp->already_configured && !sp->autoconf && sp->nsubnodes > 1) { 1476 ret = cdns_sierra_phy_configure_multilink(sp); 1477 if (ret) 1478 goto put_control; 1479 } 1480 1481 pm_runtime_enable(dev); 1482 phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate); 1483 if (IS_ERR(phy_provider)) { 1484 ret = PTR_ERR(phy_provider); 1485 goto put_control; 1486 } 1487 1488 return 0; 1489 1490 put_control: 1491 while (--node >= 0) 1492 reset_control_put(sp->phys[node].lnk_rst); 1493 ctrl_assert: 1494 if (!sp->already_configured) 1495 reset_control_assert(sp->apb_rst); 1496 clk_disable: 1497 cdns_sierra_phy_disable_clocks(sp); 1498 unregister_clk: 1499 cdns_sierra_clk_unregister(sp); 1500 return ret; 1501 } 1502 1503 static void cdns_sierra_phy_remove(struct platform_device *pdev) 1504 { 1505 struct cdns_sierra_phy *phy = platform_get_drvdata(pdev); 1506 int i; 1507 1508 reset_control_assert(phy->phy_rst); 1509 reset_control_assert(phy->apb_rst); 1510 pm_runtime_disable(&pdev->dev); 1511 1512 cdns_sierra_phy_disable_clocks(phy); 1513 /* 1514 * The device level resets will be put automatically. 1515 * Need to put the subnode resets here though. 1516 */ 1517 for (i = 0; i < phy->nsubnodes; i++) { 1518 reset_control_assert(phy->phys[i].lnk_rst); 1519 reset_control_put(phy->phys[i].lnk_rst); 1520 } 1521 1522 cdns_sierra_clk_unregister(phy); 1523 } 1524 1525 /* SGMII PHY PMA lane configuration */ 1526 static struct cdns_reg_pairs sgmii_phy_pma_ln_regs[] = { 1527 {0x9010, SIERRA_PHY_PMA_XCVR_CTRL} 1528 }; 1529 1530 static struct cdns_sierra_vals sgmii_phy_pma_ln_vals = { 1531 .reg_pairs = sgmii_phy_pma_ln_regs, 1532 .num_regs = ARRAY_SIZE(sgmii_phy_pma_ln_regs), 1533 }; 1534 1535 /* SGMII refclk 100MHz, no ssc, opt3 and GE1 links using PLL LC1 */ 1536 static const struct cdns_reg_pairs sgmii_100_no_ssc_plllc1_opt3_cmn_regs[] = { 1537 {0x002D, SIERRA_CMN_PLLLC1_FBDIV_INT_PREG}, 1538 {0x2085, SIERRA_CMN_PLLLC1_LF_COEFF_MODE0_PREG}, 1539 {0x1005, SIERRA_CMN_PLLLC1_CLK0_PREG}, 1540 {0x0000, SIERRA_CMN_PLLLC1_BWCAL_MODE0_PREG}, 1541 {0x0800, SIERRA_CMN_PLLLC1_SS_TIME_STEPSIZE_MODE_PREG} 1542 }; 1543 1544 static const struct cdns_reg_pairs sgmii_100_no_ssc_plllc1_opt3_ln_regs[] = { 1545 {0x688E, SIERRA_DET_STANDEC_D_PREG}, 1546 {0x0004, SIERRA_PSC_LN_IDLE_PREG}, 1547 {0x0FFE, SIERRA_PSC_RX_A0_PREG}, 1548 {0x0106, SIERRA_PLLCTRL_FBDIV_MODE01_PREG}, 1549 {0x0013, SIERRA_PLLCTRL_SUBRATE_PREG}, 1550 {0x0003, SIERRA_PLLCTRL_GEN_A_PREG}, 1551 {0x0106, SIERRA_PLLCTRL_GEN_D_PREG}, 1552 {0x5231, SIERRA_PLLCTRL_CPGAIN_MODE_PREG }, 1553 {0x0000, SIERRA_DRVCTRL_ATTEN_PREG}, 1554 {0x9702, SIERRA_DRVCTRL_BOOST_PREG}, 1555 {0x0051, SIERRA_RX_CREQ_FLTR_A_MODE0_PREG}, 1556 {0x3C0E, SIERRA_CREQ_CCLKDET_MODE01_PREG}, 1557 {0x3220, SIERRA_CREQ_FSMCLK_SEL_PREG}, 1558 {0x0000, SIERRA_CREQ_EQ_CTRL_PREG}, 1559 {0x0002, SIERRA_DEQ_PHALIGN_CTRL}, 1560 {0x0186, SIERRA_DEQ_GLUT0}, 1561 {0x0186, SIERRA_DEQ_GLUT1}, 1562 {0x0186, SIERRA_DEQ_GLUT2}, 1563 {0x0186, SIERRA_DEQ_GLUT3}, 1564 {0x0186, SIERRA_DEQ_GLUT4}, 1565 {0x0861, SIERRA_DEQ_ALUT0}, 1566 {0x07E0, SIERRA_DEQ_ALUT1}, 1567 {0x079E, SIERRA_DEQ_ALUT2}, 1568 {0x071D, SIERRA_DEQ_ALUT3}, 1569 {0x03F5, SIERRA_DEQ_DFETAP_CTRL_PREG}, 1570 {0x0C01, SIERRA_DEQ_TAU_CTRL1_FAST_MAINT_PREG}, 1571 {0x3C40, SIERRA_DEQ_TAU_CTRL1_SLOW_MAINT_PREG}, 1572 {0x1C04, SIERRA_DEQ_TAU_CTRL2_PREG}, 1573 {0x0033, SIERRA_DEQ_PICTRL_PREG}, 1574 {0x0000, SIERRA_CPI_OUTBUF_RATESEL_PREG}, 1575 {0x0B6D, SIERRA_CPI_RESBIAS_BIN_PREG}, 1576 {0x0102, SIERRA_RXBUFFER_CTLECTRL_PREG}, 1577 {0x0002, SIERRA_RXBUFFER_RCDFECTRL_PREG} 1578 }; 1579 1580 static struct cdns_sierra_vals sgmii_100_no_ssc_plllc1_opt3_cmn_vals = { 1581 .reg_pairs = sgmii_100_no_ssc_plllc1_opt3_cmn_regs, 1582 .num_regs = ARRAY_SIZE(sgmii_100_no_ssc_plllc1_opt3_cmn_regs), 1583 }; 1584 1585 static struct cdns_sierra_vals sgmii_100_no_ssc_plllc1_opt3_ln_vals = { 1586 .reg_pairs = sgmii_100_no_ssc_plllc1_opt3_ln_regs, 1587 .num_regs = ARRAY_SIZE(sgmii_100_no_ssc_plllc1_opt3_ln_regs), 1588 }; 1589 1590 /* QSGMII PHY PMA lane configuration */ 1591 static struct cdns_reg_pairs qsgmii_phy_pma_ln_regs[] = { 1592 {0x9010, SIERRA_PHY_PMA_XCVR_CTRL} 1593 }; 1594 1595 static struct cdns_sierra_vals qsgmii_phy_pma_ln_vals = { 1596 .reg_pairs = qsgmii_phy_pma_ln_regs, 1597 .num_regs = ARRAY_SIZE(qsgmii_phy_pma_ln_regs), 1598 }; 1599 1600 /* QSGMII refclk 100MHz, 20b, opt1, No BW cal, no ssc, PLL LC1 */ 1601 static const struct cdns_reg_pairs qsgmii_100_no_ssc_plllc1_cmn_regs[] = { 1602 {0x2085, SIERRA_CMN_PLLLC1_LF_COEFF_MODE0_PREG}, 1603 {0x0000, SIERRA_CMN_PLLLC1_BWCAL_MODE0_PREG}, 1604 {0x0000, SIERRA_CMN_PLLLC1_SS_TIME_STEPSIZE_MODE_PREG} 1605 }; 1606 1607 static const struct cdns_reg_pairs qsgmii_100_no_ssc_plllc1_ln_regs[] = { 1608 {0xFC08, SIERRA_DET_STANDEC_A_PREG}, 1609 {0x0252, SIERRA_DET_STANDEC_E_PREG}, 1610 {0x0004, SIERRA_PSC_LN_IDLE_PREG}, 1611 {0x0FFE, SIERRA_PSC_RX_A0_PREG}, 1612 {0x0011, SIERRA_PLLCTRL_SUBRATE_PREG}, 1613 {0x0001, SIERRA_PLLCTRL_GEN_A_PREG}, 1614 {0x5233, SIERRA_PLLCTRL_CPGAIN_MODE_PREG}, 1615 {0x0000, SIERRA_DRVCTRL_ATTEN_PREG}, 1616 {0x0089, SIERRA_RX_CREQ_FLTR_A_MODE0_PREG}, 1617 {0x3C3C, SIERRA_CREQ_CCLKDET_MODE01_PREG}, 1618 {0x3222, SIERRA_CREQ_FSMCLK_SEL_PREG}, 1619 {0x0000, SIERRA_CREQ_EQ_CTRL_PREG}, 1620 {0x8422, SIERRA_CTLELUT_CTRL_PREG}, 1621 {0x4111, SIERRA_DFE_ECMP_RATESEL_PREG}, 1622 {0x4111, SIERRA_DFE_SMP_RATESEL_PREG}, 1623 {0x0002, SIERRA_DEQ_PHALIGN_CTRL}, 1624 {0x9595, SIERRA_DEQ_VGATUNE_CTRL_PREG}, 1625 {0x0186, SIERRA_DEQ_GLUT0}, 1626 {0x0186, SIERRA_DEQ_GLUT1}, 1627 {0x0186, SIERRA_DEQ_GLUT2}, 1628 {0x0186, SIERRA_DEQ_GLUT3}, 1629 {0x0186, SIERRA_DEQ_GLUT4}, 1630 {0x0861, SIERRA_DEQ_ALUT0}, 1631 {0x07E0, SIERRA_DEQ_ALUT1}, 1632 {0x079E, SIERRA_DEQ_ALUT2}, 1633 {0x071D, SIERRA_DEQ_ALUT3}, 1634 {0x03F5, SIERRA_DEQ_DFETAP_CTRL_PREG}, 1635 {0x0C01, SIERRA_DEQ_TAU_CTRL1_FAST_MAINT_PREG}, 1636 {0x3C40, SIERRA_DEQ_TAU_CTRL1_SLOW_MAINT_PREG}, 1637 {0x1C04, SIERRA_DEQ_TAU_CTRL2_PREG}, 1638 {0x0033, SIERRA_DEQ_PICTRL_PREG}, 1639 {0x0660, SIERRA_CPICAL_TMRVAL_MODE0_PREG}, 1640 {0x00D5, SIERRA_CPI_OUTBUF_RATESEL_PREG}, 1641 {0x0B6D, SIERRA_CPI_RESBIAS_BIN_PREG}, 1642 {0x0102, SIERRA_RXBUFFER_CTLECTRL_PREG}, 1643 {0x0002, SIERRA_RXBUFFER_RCDFECTRL_PREG} 1644 }; 1645 1646 static struct cdns_sierra_vals qsgmii_100_no_ssc_plllc1_cmn_vals = { 1647 .reg_pairs = qsgmii_100_no_ssc_plllc1_cmn_regs, 1648 .num_regs = ARRAY_SIZE(qsgmii_100_no_ssc_plllc1_cmn_regs), 1649 }; 1650 1651 static struct cdns_sierra_vals qsgmii_100_no_ssc_plllc1_ln_vals = { 1652 .reg_pairs = qsgmii_100_no_ssc_plllc1_ln_regs, 1653 .num_regs = ARRAY_SIZE(qsgmii_100_no_ssc_plllc1_ln_regs), 1654 }; 1655 1656 /* PCIE PHY PCS common configuration */ 1657 static struct cdns_reg_pairs pcie_phy_pcs_cmn_regs[] = { 1658 {0x0430, SIERRA_PHY_PIPE_CMN_CTRL1} 1659 }; 1660 1661 static struct cdns_sierra_vals pcie_phy_pcs_cmn_vals = { 1662 .reg_pairs = pcie_phy_pcs_cmn_regs, 1663 .num_regs = ARRAY_SIZE(pcie_phy_pcs_cmn_regs), 1664 }; 1665 1666 /* refclk100MHz_32b_PCIe_cmn_pll_no_ssc, pcie_links_using_plllc, pipe_bw_3 */ 1667 static const struct cdns_reg_pairs pcie_100_no_ssc_plllc_cmn_regs[] = { 1668 {0x2105, SIERRA_CMN_PLLLC_LF_COEFF_MODE1_PREG}, 1669 {0x2105, SIERRA_CMN_PLLLC_LF_COEFF_MODE0_PREG}, 1670 {0x8A06, SIERRA_CMN_PLLLC_BWCAL_MODE1_PREG}, 1671 {0x8A06, SIERRA_CMN_PLLLC_BWCAL_MODE0_PREG} 1672 }; 1673 1674 /* 1675 * refclk100MHz_32b_PCIe_ln_no_ssc, multilink, using_plllc, 1676 * cmn_pllcy_anaclk0_1Ghz, xcvr_pllclk_fullrt_500mhz 1677 */ 1678 static const struct cdns_reg_pairs ml_pcie_100_no_ssc_ln_regs[] = { 1679 {0xFC08, SIERRA_DET_STANDEC_A_PREG}, 1680 {0x001D, SIERRA_PSM_A3IN_TMR_PREG}, 1681 {0x0004, SIERRA_PSC_LN_A3_PREG}, 1682 {0x0004, SIERRA_PSC_LN_A4_PREG}, 1683 {0x0004, SIERRA_PSC_LN_IDLE_PREG}, 1684 {0x1555, SIERRA_DFE_BIASTRIM_PREG}, 1685 {0x9703, SIERRA_DRVCTRL_BOOST_PREG}, 1686 {0x8055, SIERRA_RX_CREQ_FLTR_A_MODE3_PREG}, 1687 {0x80BB, SIERRA_RX_CREQ_FLTR_A_MODE2_PREG}, 1688 {0x8351, SIERRA_RX_CREQ_FLTR_A_MODE1_PREG}, 1689 {0x8349, SIERRA_RX_CREQ_FLTR_A_MODE0_PREG}, 1690 {0x0002, SIERRA_CREQ_DCBIASATTEN_OVR_PREG}, 1691 {0x9800, SIERRA_RX_CTLE_CAL_PREG}, 1692 {0x5624, SIERRA_DEQ_CONCUR_CTRL2_PREG}, 1693 {0x000F, SIERRA_DEQ_EPIPWR_CTRL2_PREG}, 1694 {0x00FF, SIERRA_DEQ_FAST_MAINT_CYCLES_PREG}, 1695 {0x4C4C, SIERRA_DEQ_ERRCMP_CTRL_PREG}, 1696 {0x02FA, SIERRA_DEQ_OFFSET_CTRL_PREG}, 1697 {0x02FA, SIERRA_DEQ_GAIN_CTRL_PREG}, 1698 {0x0041, SIERRA_DEQ_GLUT0}, 1699 {0x0082, SIERRA_DEQ_GLUT1}, 1700 {0x00C3, SIERRA_DEQ_GLUT2}, 1701 {0x0145, SIERRA_DEQ_GLUT3}, 1702 {0x0186, SIERRA_DEQ_GLUT4}, 1703 {0x09E7, SIERRA_DEQ_ALUT0}, 1704 {0x09A6, SIERRA_DEQ_ALUT1}, 1705 {0x0965, SIERRA_DEQ_ALUT2}, 1706 {0x08E3, SIERRA_DEQ_ALUT3}, 1707 {0x00FA, SIERRA_DEQ_DFETAP0}, 1708 {0x00FA, SIERRA_DEQ_DFETAP1}, 1709 {0x00FA, SIERRA_DEQ_DFETAP2}, 1710 {0x00FA, SIERRA_DEQ_DFETAP3}, 1711 {0x00FA, SIERRA_DEQ_DFETAP4}, 1712 {0x000F, SIERRA_DEQ_PRECUR_PREG}, 1713 {0x0280, SIERRA_DEQ_POSTCUR_PREG}, 1714 {0x8F00, SIERRA_DEQ_POSTCUR_DECR_PREG}, 1715 {0x3C0F, SIERRA_DEQ_TAU_CTRL1_SLOW_MAINT_PREG}, 1716 {0x1C0C, SIERRA_DEQ_TAU_CTRL2_PREG}, 1717 {0x0100, SIERRA_DEQ_TAU_CTRL3_PREG}, 1718 {0x5E82, SIERRA_DEQ_OPENEYE_CTRL_PREG}, 1719 {0x002B, SIERRA_CPI_TRIM_PREG}, 1720 {0x0003, SIERRA_EPI_CTRL_PREG}, 1721 {0x803F, SIERRA_SDFILT_H2L_A_PREG}, 1722 {0x0004, SIERRA_RXBUFFER_CTLECTRL_PREG}, 1723 {0x2010, SIERRA_RXBUFFER_RCDFECTRL_PREG}, 1724 {0x4432, SIERRA_RXBUFFER_DFECTRL_PREG} 1725 }; 1726 1727 static struct cdns_sierra_vals pcie_100_no_ssc_plllc_cmn_vals = { 1728 .reg_pairs = pcie_100_no_ssc_plllc_cmn_regs, 1729 .num_regs = ARRAY_SIZE(pcie_100_no_ssc_plllc_cmn_regs), 1730 }; 1731 1732 static struct cdns_sierra_vals ml_pcie_100_no_ssc_ln_vals = { 1733 .reg_pairs = ml_pcie_100_no_ssc_ln_regs, 1734 .num_regs = ARRAY_SIZE(ml_pcie_100_no_ssc_ln_regs), 1735 }; 1736 1737 /* 1738 * TI J721E: 1739 * refclk100MHz_32b_PCIe_ln_no_ssc, multilink, using_plllc, 1740 * cmn_pllcy_anaclk0_1Ghz, xcvr_pllclk_fullrt_500mhz 1741 */ 1742 static const struct cdns_reg_pairs ti_ml_pcie_100_no_ssc_ln_regs[] = { 1743 {0xFC08, SIERRA_DET_STANDEC_A_PREG}, 1744 {0x001D, SIERRA_PSM_A3IN_TMR_PREG}, 1745 {0x0004, SIERRA_PSC_LN_A3_PREG}, 1746 {0x0004, SIERRA_PSC_LN_A4_PREG}, 1747 {0x0004, SIERRA_PSC_LN_IDLE_PREG}, 1748 {0x1555, SIERRA_DFE_BIASTRIM_PREG}, 1749 {0x9703, SIERRA_DRVCTRL_BOOST_PREG}, 1750 {0x8055, SIERRA_RX_CREQ_FLTR_A_MODE3_PREG}, 1751 {0x80BB, SIERRA_RX_CREQ_FLTR_A_MODE2_PREG}, 1752 {0x8351, SIERRA_RX_CREQ_FLTR_A_MODE1_PREG}, 1753 {0x8349, SIERRA_RX_CREQ_FLTR_A_MODE0_PREG}, 1754 {0x0002, SIERRA_CREQ_DCBIASATTEN_OVR_PREG}, 1755 {0x9800, SIERRA_RX_CTLE_CAL_PREG}, 1756 {0x5624, SIERRA_DEQ_CONCUR_CTRL2_PREG}, 1757 {0x000F, SIERRA_DEQ_EPIPWR_CTRL2_PREG}, 1758 {0x00FF, SIERRA_DEQ_FAST_MAINT_CYCLES_PREG}, 1759 {0x4C4C, SIERRA_DEQ_ERRCMP_CTRL_PREG}, 1760 {0x02FA, SIERRA_DEQ_OFFSET_CTRL_PREG}, 1761 {0x02FA, SIERRA_DEQ_GAIN_CTRL_PREG}, 1762 {0x0041, SIERRA_DEQ_GLUT0}, 1763 {0x0082, SIERRA_DEQ_GLUT1}, 1764 {0x00C3, SIERRA_DEQ_GLUT2}, 1765 {0x0145, SIERRA_DEQ_GLUT3}, 1766 {0x0186, SIERRA_DEQ_GLUT4}, 1767 {0x09E7, SIERRA_DEQ_ALUT0}, 1768 {0x09A6, SIERRA_DEQ_ALUT1}, 1769 {0x0965, SIERRA_DEQ_ALUT2}, 1770 {0x08E3, SIERRA_DEQ_ALUT3}, 1771 {0x00FA, SIERRA_DEQ_DFETAP0}, 1772 {0x00FA, SIERRA_DEQ_DFETAP1}, 1773 {0x00FA, SIERRA_DEQ_DFETAP2}, 1774 {0x00FA, SIERRA_DEQ_DFETAP3}, 1775 {0x00FA, SIERRA_DEQ_DFETAP4}, 1776 {0x000F, SIERRA_DEQ_PRECUR_PREG}, 1777 {0x0280, SIERRA_DEQ_POSTCUR_PREG}, 1778 {0x8F00, SIERRA_DEQ_POSTCUR_DECR_PREG}, 1779 {0x3C0F, SIERRA_DEQ_TAU_CTRL1_SLOW_MAINT_PREG}, 1780 {0x1C0C, SIERRA_DEQ_TAU_CTRL2_PREG}, 1781 {0x0100, SIERRA_DEQ_TAU_CTRL3_PREG}, 1782 {0x5E82, SIERRA_DEQ_OPENEYE_CTRL_PREG}, 1783 {0x002B, SIERRA_CPI_TRIM_PREG}, 1784 {0x0003, SIERRA_EPI_CTRL_PREG}, 1785 {0x803F, SIERRA_SDFILT_H2L_A_PREG}, 1786 {0x0004, SIERRA_RXBUFFER_CTLECTRL_PREG}, 1787 {0x2010, SIERRA_RXBUFFER_RCDFECTRL_PREG}, 1788 {0x4432, SIERRA_RXBUFFER_DFECTRL_PREG}, 1789 {0x0002, SIERRA_TX_RCVDET_OVRD_PREG} 1790 }; 1791 1792 static struct cdns_sierra_vals ti_ml_pcie_100_no_ssc_ln_vals = { 1793 .reg_pairs = ti_ml_pcie_100_no_ssc_ln_regs, 1794 .num_regs = ARRAY_SIZE(ti_ml_pcie_100_no_ssc_ln_regs), 1795 }; 1796 1797 /* refclk100MHz_32b_PCIe_cmn_pll_int_ssc, pcie_links_using_plllc, pipe_bw_3 */ 1798 static const struct cdns_reg_pairs pcie_100_int_ssc_plllc_cmn_regs[] = { 1799 {0x000E, SIERRA_CMN_PLLLC_MODE_PREG}, 1800 {0x4006, SIERRA_CMN_PLLLC_LF_COEFF_MODE1_PREG}, 1801 {0x4006, SIERRA_CMN_PLLLC_LF_COEFF_MODE0_PREG}, 1802 {0x0000, SIERRA_CMN_PLLLC_BWCAL_MODE1_PREG}, 1803 {0x0000, SIERRA_CMN_PLLLC_BWCAL_MODE0_PREG}, 1804 {0x0581, SIERRA_CMN_PLLLC_DSMCORR_PREG}, 1805 {0x7F80, SIERRA_CMN_PLLLC_SS_PREG}, 1806 {0x0041, SIERRA_CMN_PLLLC_SS_AMP_STEP_SIZE_PREG}, 1807 {0x0464, SIERRA_CMN_PLLLC_SSTWOPT_PREG}, 1808 {0x0D0D, SIERRA_CMN_PLLLC_SS_TIME_STEPSIZE_MODE_PREG}, 1809 {0x0060, SIERRA_CMN_PLLLC_LOCK_DELAY_CTRL_PREG} 1810 }; 1811 1812 /* 1813 * refclk100MHz_32b_PCIe_ln_int_ssc, multilink, using_plllc, 1814 * cmn_pllcy_anaclk0_1Ghz, xcvr_pllclk_fullrt_500mhz 1815 */ 1816 static const struct cdns_reg_pairs ml_pcie_100_int_ssc_ln_regs[] = { 1817 {0xFC08, SIERRA_DET_STANDEC_A_PREG}, 1818 {0x001D, SIERRA_PSM_A3IN_TMR_PREG}, 1819 {0x0004, SIERRA_PSC_LN_A3_PREG}, 1820 {0x0004, SIERRA_PSC_LN_A4_PREG}, 1821 {0x0004, SIERRA_PSC_LN_IDLE_PREG}, 1822 {0x1555, SIERRA_DFE_BIASTRIM_PREG}, 1823 {0x9703, SIERRA_DRVCTRL_BOOST_PREG}, 1824 {0x813E, SIERRA_CLKPATHCTRL_TMR_PREG}, 1825 {0x8047, SIERRA_RX_CREQ_FLTR_A_MODE3_PREG}, 1826 {0x808F, SIERRA_RX_CREQ_FLTR_A_MODE2_PREG}, 1827 {0x808F, SIERRA_RX_CREQ_FLTR_A_MODE1_PREG}, 1828 {0x808F, SIERRA_RX_CREQ_FLTR_A_MODE0_PREG}, 1829 {0x0002, SIERRA_CREQ_DCBIASATTEN_OVR_PREG}, 1830 {0x9800, SIERRA_RX_CTLE_CAL_PREG}, 1831 {0x033C, SIERRA_RX_CTLE_MAINTENANCE_PREG}, 1832 {0x44CC, SIERRA_CREQ_EQ_OPEN_EYE_THRESH_PREG}, 1833 {0x5624, SIERRA_DEQ_CONCUR_CTRL2_PREG}, 1834 {0x000F, SIERRA_DEQ_EPIPWR_CTRL2_PREG}, 1835 {0x00FF, SIERRA_DEQ_FAST_MAINT_CYCLES_PREG}, 1836 {0x4C4C, SIERRA_DEQ_ERRCMP_CTRL_PREG}, 1837 {0x02FA, SIERRA_DEQ_OFFSET_CTRL_PREG}, 1838 {0x02FA, SIERRA_DEQ_GAIN_CTRL_PREG}, 1839 {0x0041, SIERRA_DEQ_GLUT0}, 1840 {0x0082, SIERRA_DEQ_GLUT1}, 1841 {0x00C3, SIERRA_DEQ_GLUT2}, 1842 {0x0145, SIERRA_DEQ_GLUT3}, 1843 {0x0186, SIERRA_DEQ_GLUT4}, 1844 {0x09E7, SIERRA_DEQ_ALUT0}, 1845 {0x09A6, SIERRA_DEQ_ALUT1}, 1846 {0x0965, SIERRA_DEQ_ALUT2}, 1847 {0x08E3, SIERRA_DEQ_ALUT3}, 1848 {0x00FA, SIERRA_DEQ_DFETAP0}, 1849 {0x00FA, SIERRA_DEQ_DFETAP1}, 1850 {0x00FA, SIERRA_DEQ_DFETAP2}, 1851 {0x00FA, SIERRA_DEQ_DFETAP3}, 1852 {0x00FA, SIERRA_DEQ_DFETAP4}, 1853 {0x000F, SIERRA_DEQ_PRECUR_PREG}, 1854 {0x0280, SIERRA_DEQ_POSTCUR_PREG}, 1855 {0x8F00, SIERRA_DEQ_POSTCUR_DECR_PREG}, 1856 {0x3C0F, SIERRA_DEQ_TAU_CTRL1_SLOW_MAINT_PREG}, 1857 {0x1C0C, SIERRA_DEQ_TAU_CTRL2_PREG}, 1858 {0x0100, SIERRA_DEQ_TAU_CTRL3_PREG}, 1859 {0x5E82, SIERRA_DEQ_OPENEYE_CTRL_PREG}, 1860 {0x002B, SIERRA_CPI_TRIM_PREG}, 1861 {0x0003, SIERRA_EPI_CTRL_PREG}, 1862 {0x803F, SIERRA_SDFILT_H2L_A_PREG}, 1863 {0x0004, SIERRA_RXBUFFER_CTLECTRL_PREG}, 1864 {0x2010, SIERRA_RXBUFFER_RCDFECTRL_PREG}, 1865 {0x4432, SIERRA_RXBUFFER_DFECTRL_PREG} 1866 }; 1867 1868 static struct cdns_sierra_vals pcie_100_int_ssc_plllc_cmn_vals = { 1869 .reg_pairs = pcie_100_int_ssc_plllc_cmn_regs, 1870 .num_regs = ARRAY_SIZE(pcie_100_int_ssc_plllc_cmn_regs), 1871 }; 1872 1873 static struct cdns_sierra_vals ml_pcie_100_int_ssc_ln_vals = { 1874 .reg_pairs = ml_pcie_100_int_ssc_ln_regs, 1875 .num_regs = ARRAY_SIZE(ml_pcie_100_int_ssc_ln_regs), 1876 }; 1877 1878 /* 1879 * TI J721E: 1880 * refclk100MHz_32b_PCIe_ln_int_ssc, multilink, using_plllc, 1881 * cmn_pllcy_anaclk0_1Ghz, xcvr_pllclk_fullrt_500mhz 1882 */ 1883 static const struct cdns_reg_pairs ti_ml_pcie_100_int_ssc_ln_regs[] = { 1884 {0xFC08, SIERRA_DET_STANDEC_A_PREG}, 1885 {0x001D, SIERRA_PSM_A3IN_TMR_PREG}, 1886 {0x0004, SIERRA_PSC_LN_A3_PREG}, 1887 {0x0004, SIERRA_PSC_LN_A4_PREG}, 1888 {0x0004, SIERRA_PSC_LN_IDLE_PREG}, 1889 {0x1555, SIERRA_DFE_BIASTRIM_PREG}, 1890 {0x9703, SIERRA_DRVCTRL_BOOST_PREG}, 1891 {0x813E, SIERRA_CLKPATHCTRL_TMR_PREG}, 1892 {0x8047, SIERRA_RX_CREQ_FLTR_A_MODE3_PREG}, 1893 {0x808F, SIERRA_RX_CREQ_FLTR_A_MODE2_PREG}, 1894 {0x808F, SIERRA_RX_CREQ_FLTR_A_MODE1_PREG}, 1895 {0x808F, SIERRA_RX_CREQ_FLTR_A_MODE0_PREG}, 1896 {0x0002, SIERRA_CREQ_DCBIASATTEN_OVR_PREG}, 1897 {0x9800, SIERRA_RX_CTLE_CAL_PREG}, 1898 {0x033C, SIERRA_RX_CTLE_MAINTENANCE_PREG}, 1899 {0x44CC, SIERRA_CREQ_EQ_OPEN_EYE_THRESH_PREG}, 1900 {0x5624, SIERRA_DEQ_CONCUR_CTRL2_PREG}, 1901 {0x000F, SIERRA_DEQ_EPIPWR_CTRL2_PREG}, 1902 {0x00FF, SIERRA_DEQ_FAST_MAINT_CYCLES_PREG}, 1903 {0x4C4C, SIERRA_DEQ_ERRCMP_CTRL_PREG}, 1904 {0x02FA, SIERRA_DEQ_OFFSET_CTRL_PREG}, 1905 {0x02FA, SIERRA_DEQ_GAIN_CTRL_PREG}, 1906 {0x0041, SIERRA_DEQ_GLUT0}, 1907 {0x0082, SIERRA_DEQ_GLUT1}, 1908 {0x00C3, SIERRA_DEQ_GLUT2}, 1909 {0x0145, SIERRA_DEQ_GLUT3}, 1910 {0x0186, SIERRA_DEQ_GLUT4}, 1911 {0x09E7, SIERRA_DEQ_ALUT0}, 1912 {0x09A6, SIERRA_DEQ_ALUT1}, 1913 {0x0965, SIERRA_DEQ_ALUT2}, 1914 {0x08E3, SIERRA_DEQ_ALUT3}, 1915 {0x00FA, SIERRA_DEQ_DFETAP0}, 1916 {0x00FA, SIERRA_DEQ_DFETAP1}, 1917 {0x00FA, SIERRA_DEQ_DFETAP2}, 1918 {0x00FA, SIERRA_DEQ_DFETAP3}, 1919 {0x00FA, SIERRA_DEQ_DFETAP4}, 1920 {0x000F, SIERRA_DEQ_PRECUR_PREG}, 1921 {0x0280, SIERRA_DEQ_POSTCUR_PREG}, 1922 {0x8F00, SIERRA_DEQ_POSTCUR_DECR_PREG}, 1923 {0x3C0F, SIERRA_DEQ_TAU_CTRL1_SLOW_MAINT_PREG}, 1924 {0x1C0C, SIERRA_DEQ_TAU_CTRL2_PREG}, 1925 {0x0100, SIERRA_DEQ_TAU_CTRL3_PREG}, 1926 {0x5E82, SIERRA_DEQ_OPENEYE_CTRL_PREG}, 1927 {0x002B, SIERRA_CPI_TRIM_PREG}, 1928 {0x0003, SIERRA_EPI_CTRL_PREG}, 1929 {0x803F, SIERRA_SDFILT_H2L_A_PREG}, 1930 {0x0004, SIERRA_RXBUFFER_CTLECTRL_PREG}, 1931 {0x2010, SIERRA_RXBUFFER_RCDFECTRL_PREG}, 1932 {0x4432, SIERRA_RXBUFFER_DFECTRL_PREG}, 1933 {0x0002, SIERRA_TX_RCVDET_OVRD_PREG} 1934 }; 1935 1936 static struct cdns_sierra_vals ti_ml_pcie_100_int_ssc_ln_vals = { 1937 .reg_pairs = ti_ml_pcie_100_int_ssc_ln_regs, 1938 .num_regs = ARRAY_SIZE(ti_ml_pcie_100_int_ssc_ln_regs), 1939 }; 1940 1941 /* refclk100MHz_32b_PCIe_cmn_pll_ext_ssc, pcie_links_using_plllc, pipe_bw_3 */ 1942 static const struct cdns_reg_pairs pcie_100_ext_ssc_plllc_cmn_regs[] = { 1943 {0x2106, SIERRA_CMN_PLLLC_LF_COEFF_MODE1_PREG}, 1944 {0x2106, SIERRA_CMN_PLLLC_LF_COEFF_MODE0_PREG}, 1945 {0x8A06, SIERRA_CMN_PLLLC_BWCAL_MODE1_PREG}, 1946 {0x8A06, SIERRA_CMN_PLLLC_BWCAL_MODE0_PREG}, 1947 {0x1B1B, SIERRA_CMN_PLLLC_SS_TIME_STEPSIZE_MODE_PREG} 1948 }; 1949 1950 /* 1951 * refclk100MHz_32b_PCIe_ln_ext_ssc, multilink, using_plllc, 1952 * cmn_pllcy_anaclk0_1Ghz, xcvr_pllclk_fullrt_500mhz 1953 */ 1954 static const struct cdns_reg_pairs ml_pcie_100_ext_ssc_ln_regs[] = { 1955 {0xFC08, SIERRA_DET_STANDEC_A_PREG}, 1956 {0x001D, SIERRA_PSM_A3IN_TMR_PREG}, 1957 {0x0004, SIERRA_PSC_LN_A3_PREG}, 1958 {0x0004, SIERRA_PSC_LN_A4_PREG}, 1959 {0x0004, SIERRA_PSC_LN_IDLE_PREG}, 1960 {0x1555, SIERRA_DFE_BIASTRIM_PREG}, 1961 {0x9703, SIERRA_DRVCTRL_BOOST_PREG}, 1962 {0x813E, SIERRA_CLKPATHCTRL_TMR_PREG}, 1963 {0x8047, SIERRA_RX_CREQ_FLTR_A_MODE3_PREG}, 1964 {0x808F, SIERRA_RX_CREQ_FLTR_A_MODE2_PREG}, 1965 {0x808F, SIERRA_RX_CREQ_FLTR_A_MODE1_PREG}, 1966 {0x808F, SIERRA_RX_CREQ_FLTR_A_MODE0_PREG}, 1967 {0x0002, SIERRA_CREQ_DCBIASATTEN_OVR_PREG}, 1968 {0x9800, SIERRA_RX_CTLE_CAL_PREG}, 1969 {0x033C, SIERRA_RX_CTLE_MAINTENANCE_PREG}, 1970 {0x44CC, SIERRA_CREQ_EQ_OPEN_EYE_THRESH_PREG}, 1971 {0x5624, SIERRA_DEQ_CONCUR_CTRL2_PREG}, 1972 {0x000F, SIERRA_DEQ_EPIPWR_CTRL2_PREG}, 1973 {0x00FF, SIERRA_DEQ_FAST_MAINT_CYCLES_PREG}, 1974 {0x4C4C, SIERRA_DEQ_ERRCMP_CTRL_PREG}, 1975 {0x02FA, SIERRA_DEQ_OFFSET_CTRL_PREG}, 1976 {0x02FA, SIERRA_DEQ_GAIN_CTRL_PREG}, 1977 {0x0041, SIERRA_DEQ_GLUT0}, 1978 {0x0082, SIERRA_DEQ_GLUT1}, 1979 {0x00C3, SIERRA_DEQ_GLUT2}, 1980 {0x0145, SIERRA_DEQ_GLUT3}, 1981 {0x0186, SIERRA_DEQ_GLUT4}, 1982 {0x09E7, SIERRA_DEQ_ALUT0}, 1983 {0x09A6, SIERRA_DEQ_ALUT1}, 1984 {0x0965, SIERRA_DEQ_ALUT2}, 1985 {0x08E3, SIERRA_DEQ_ALUT3}, 1986 {0x00FA, SIERRA_DEQ_DFETAP0}, 1987 {0x00FA, SIERRA_DEQ_DFETAP1}, 1988 {0x00FA, SIERRA_DEQ_DFETAP2}, 1989 {0x00FA, SIERRA_DEQ_DFETAP3}, 1990 {0x00FA, SIERRA_DEQ_DFETAP4}, 1991 {0x000F, SIERRA_DEQ_PRECUR_PREG}, 1992 {0x0280, SIERRA_DEQ_POSTCUR_PREG}, 1993 {0x8F00, SIERRA_DEQ_POSTCUR_DECR_PREG}, 1994 {0x3C0F, SIERRA_DEQ_TAU_CTRL1_SLOW_MAINT_PREG}, 1995 {0x1C0C, SIERRA_DEQ_TAU_CTRL2_PREG}, 1996 {0x0100, SIERRA_DEQ_TAU_CTRL3_PREG}, 1997 {0x5E82, SIERRA_DEQ_OPENEYE_CTRL_PREG}, 1998 {0x002B, SIERRA_CPI_TRIM_PREG}, 1999 {0x0003, SIERRA_EPI_CTRL_PREG}, 2000 {0x803F, SIERRA_SDFILT_H2L_A_PREG}, 2001 {0x0004, SIERRA_RXBUFFER_CTLECTRL_PREG}, 2002 {0x2010, SIERRA_RXBUFFER_RCDFECTRL_PREG}, 2003 {0x4432, SIERRA_RXBUFFER_DFECTRL_PREG} 2004 }; 2005 2006 static struct cdns_sierra_vals pcie_100_ext_ssc_plllc_cmn_vals = { 2007 .reg_pairs = pcie_100_ext_ssc_plllc_cmn_regs, 2008 .num_regs = ARRAY_SIZE(pcie_100_ext_ssc_plllc_cmn_regs), 2009 }; 2010 2011 static struct cdns_sierra_vals ml_pcie_100_ext_ssc_ln_vals = { 2012 .reg_pairs = ml_pcie_100_ext_ssc_ln_regs, 2013 .num_regs = ARRAY_SIZE(ml_pcie_100_ext_ssc_ln_regs), 2014 }; 2015 2016 /* 2017 * TI J721E: 2018 * refclk100MHz_32b_PCIe_ln_ext_ssc, multilink, using_plllc, 2019 * cmn_pllcy_anaclk0_1Ghz, xcvr_pllclk_fullrt_500mhz 2020 */ 2021 static const struct cdns_reg_pairs ti_ml_pcie_100_ext_ssc_ln_regs[] = { 2022 {0xFC08, SIERRA_DET_STANDEC_A_PREG}, 2023 {0x001D, SIERRA_PSM_A3IN_TMR_PREG}, 2024 {0x0004, SIERRA_PSC_LN_A3_PREG}, 2025 {0x0004, SIERRA_PSC_LN_A4_PREG}, 2026 {0x0004, SIERRA_PSC_LN_IDLE_PREG}, 2027 {0x1555, SIERRA_DFE_BIASTRIM_PREG}, 2028 {0x9703, SIERRA_DRVCTRL_BOOST_PREG}, 2029 {0x813E, SIERRA_CLKPATHCTRL_TMR_PREG}, 2030 {0x8047, SIERRA_RX_CREQ_FLTR_A_MODE3_PREG}, 2031 {0x808F, SIERRA_RX_CREQ_FLTR_A_MODE2_PREG}, 2032 {0x808F, SIERRA_RX_CREQ_FLTR_A_MODE1_PREG}, 2033 {0x808F, SIERRA_RX_CREQ_FLTR_A_MODE0_PREG}, 2034 {0x0002, SIERRA_CREQ_DCBIASATTEN_OVR_PREG}, 2035 {0x9800, SIERRA_RX_CTLE_CAL_PREG}, 2036 {0x033C, SIERRA_RX_CTLE_MAINTENANCE_PREG}, 2037 {0x44CC, SIERRA_CREQ_EQ_OPEN_EYE_THRESH_PREG}, 2038 {0x5624, SIERRA_DEQ_CONCUR_CTRL2_PREG}, 2039 {0x000F, SIERRA_DEQ_EPIPWR_CTRL2_PREG}, 2040 {0x00FF, SIERRA_DEQ_FAST_MAINT_CYCLES_PREG}, 2041 {0x4C4C, SIERRA_DEQ_ERRCMP_CTRL_PREG}, 2042 {0x02FA, SIERRA_DEQ_OFFSET_CTRL_PREG}, 2043 {0x02FA, SIERRA_DEQ_GAIN_CTRL_PREG}, 2044 {0x0041, SIERRA_DEQ_GLUT0}, 2045 {0x0082, SIERRA_DEQ_GLUT1}, 2046 {0x00C3, SIERRA_DEQ_GLUT2}, 2047 {0x0145, SIERRA_DEQ_GLUT3}, 2048 {0x0186, SIERRA_DEQ_GLUT4}, 2049 {0x09E7, SIERRA_DEQ_ALUT0}, 2050 {0x09A6, SIERRA_DEQ_ALUT1}, 2051 {0x0965, SIERRA_DEQ_ALUT2}, 2052 {0x08E3, SIERRA_DEQ_ALUT3}, 2053 {0x00FA, SIERRA_DEQ_DFETAP0}, 2054 {0x00FA, SIERRA_DEQ_DFETAP1}, 2055 {0x00FA, SIERRA_DEQ_DFETAP2}, 2056 {0x00FA, SIERRA_DEQ_DFETAP3}, 2057 {0x00FA, SIERRA_DEQ_DFETAP4}, 2058 {0x000F, SIERRA_DEQ_PRECUR_PREG}, 2059 {0x0280, SIERRA_DEQ_POSTCUR_PREG}, 2060 {0x8F00, SIERRA_DEQ_POSTCUR_DECR_PREG}, 2061 {0x3C0F, SIERRA_DEQ_TAU_CTRL1_SLOW_MAINT_PREG}, 2062 {0x1C0C, SIERRA_DEQ_TAU_CTRL2_PREG}, 2063 {0x0100, SIERRA_DEQ_TAU_CTRL3_PREG}, 2064 {0x5E82, SIERRA_DEQ_OPENEYE_CTRL_PREG}, 2065 {0x002B, SIERRA_CPI_TRIM_PREG}, 2066 {0x0003, SIERRA_EPI_CTRL_PREG}, 2067 {0x803F, SIERRA_SDFILT_H2L_A_PREG}, 2068 {0x0004, SIERRA_RXBUFFER_CTLECTRL_PREG}, 2069 {0x2010, SIERRA_RXBUFFER_RCDFECTRL_PREG}, 2070 {0x4432, SIERRA_RXBUFFER_DFECTRL_PREG}, 2071 {0x0002, SIERRA_TX_RCVDET_OVRD_PREG} 2072 }; 2073 2074 static struct cdns_sierra_vals ti_ml_pcie_100_ext_ssc_ln_vals = { 2075 .reg_pairs = ti_ml_pcie_100_ext_ssc_ln_regs, 2076 .num_regs = ARRAY_SIZE(ti_ml_pcie_100_ext_ssc_ln_regs), 2077 }; 2078 2079 /* refclk100MHz_32b_PCIe_cmn_pll_no_ssc */ 2080 static const struct cdns_reg_pairs cdns_pcie_cmn_regs_no_ssc[] = { 2081 {0x2105, SIERRA_CMN_PLLLC_LF_COEFF_MODE1_PREG}, 2082 {0x2105, SIERRA_CMN_PLLLC_LF_COEFF_MODE0_PREG}, 2083 {0x8A06, SIERRA_CMN_PLLLC_BWCAL_MODE1_PREG}, 2084 {0x8A06, SIERRA_CMN_PLLLC_BWCAL_MODE0_PREG} 2085 }; 2086 2087 /* refclk100MHz_32b_PCIe_ln_no_ssc */ 2088 static const struct cdns_reg_pairs cdns_pcie_ln_regs_no_ssc[] = { 2089 {0xFC08, SIERRA_DET_STANDEC_A_PREG}, 2090 {0x001D, SIERRA_PSM_A3IN_TMR_PREG}, 2091 {0x1555, SIERRA_DFE_BIASTRIM_PREG}, 2092 {0x9703, SIERRA_DRVCTRL_BOOST_PREG}, 2093 {0x8055, SIERRA_RX_CREQ_FLTR_A_MODE3_PREG}, 2094 {0x80BB, SIERRA_RX_CREQ_FLTR_A_MODE2_PREG}, 2095 {0x8351, SIERRA_RX_CREQ_FLTR_A_MODE1_PREG}, 2096 {0x8349, SIERRA_RX_CREQ_FLTR_A_MODE0_PREG}, 2097 {0x0002, SIERRA_CREQ_DCBIASATTEN_OVR_PREG}, 2098 {0x9800, SIERRA_RX_CTLE_CAL_PREG}, 2099 {0x5624, SIERRA_DEQ_CONCUR_CTRL2_PREG}, 2100 {0x000F, SIERRA_DEQ_EPIPWR_CTRL2_PREG}, 2101 {0x00FF, SIERRA_DEQ_FAST_MAINT_CYCLES_PREG}, 2102 {0x4C4C, SIERRA_DEQ_ERRCMP_CTRL_PREG}, 2103 {0x02FA, SIERRA_DEQ_OFFSET_CTRL_PREG}, 2104 {0x02FA, SIERRA_DEQ_GAIN_CTRL_PREG}, 2105 {0x0041, SIERRA_DEQ_GLUT0}, 2106 {0x0082, SIERRA_DEQ_GLUT1}, 2107 {0x00C3, SIERRA_DEQ_GLUT2}, 2108 {0x0145, SIERRA_DEQ_GLUT3}, 2109 {0x0186, SIERRA_DEQ_GLUT4}, 2110 {0x09E7, SIERRA_DEQ_ALUT0}, 2111 {0x09A6, SIERRA_DEQ_ALUT1}, 2112 {0x0965, SIERRA_DEQ_ALUT2}, 2113 {0x08E3, SIERRA_DEQ_ALUT3}, 2114 {0x00FA, SIERRA_DEQ_DFETAP0}, 2115 {0x00FA, SIERRA_DEQ_DFETAP1}, 2116 {0x00FA, SIERRA_DEQ_DFETAP2}, 2117 {0x00FA, SIERRA_DEQ_DFETAP3}, 2118 {0x00FA, SIERRA_DEQ_DFETAP4}, 2119 {0x000F, SIERRA_DEQ_PRECUR_PREG}, 2120 {0x0280, SIERRA_DEQ_POSTCUR_PREG}, 2121 {0x8F00, SIERRA_DEQ_POSTCUR_DECR_PREG}, 2122 {0x3C0F, SIERRA_DEQ_TAU_CTRL1_SLOW_MAINT_PREG}, 2123 {0x1C0C, SIERRA_DEQ_TAU_CTRL2_PREG}, 2124 {0x0100, SIERRA_DEQ_TAU_CTRL3_PREG}, 2125 {0x5E82, SIERRA_DEQ_OPENEYE_CTRL_PREG}, 2126 {0x002B, SIERRA_CPI_TRIM_PREG}, 2127 {0x0003, SIERRA_EPI_CTRL_PREG}, 2128 {0x803F, SIERRA_SDFILT_H2L_A_PREG}, 2129 {0x0004, SIERRA_RXBUFFER_CTLECTRL_PREG}, 2130 {0x2010, SIERRA_RXBUFFER_RCDFECTRL_PREG}, 2131 {0x4432, SIERRA_RXBUFFER_DFECTRL_PREG} 2132 }; 2133 2134 static struct cdns_sierra_vals pcie_100_no_ssc_cmn_vals = { 2135 .reg_pairs = cdns_pcie_cmn_regs_no_ssc, 2136 .num_regs = ARRAY_SIZE(cdns_pcie_cmn_regs_no_ssc), 2137 }; 2138 2139 static struct cdns_sierra_vals pcie_100_no_ssc_ln_vals = { 2140 .reg_pairs = cdns_pcie_ln_regs_no_ssc, 2141 .num_regs = ARRAY_SIZE(cdns_pcie_ln_regs_no_ssc), 2142 }; 2143 2144 /* refclk100MHz_32b_PCIe_cmn_pll_int_ssc */ 2145 static const struct cdns_reg_pairs cdns_pcie_cmn_regs_int_ssc[] = { 2146 {0x000E, SIERRA_CMN_PLLLC_MODE_PREG}, 2147 {0x4006, SIERRA_CMN_PLLLC_LF_COEFF_MODE1_PREG}, 2148 {0x4006, SIERRA_CMN_PLLLC_LF_COEFF_MODE0_PREG}, 2149 {0x0000, SIERRA_CMN_PLLLC_BWCAL_MODE1_PREG}, 2150 {0x0000, SIERRA_CMN_PLLLC_BWCAL_MODE0_PREG}, 2151 {0x0581, SIERRA_CMN_PLLLC_DSMCORR_PREG}, 2152 {0x7F80, SIERRA_CMN_PLLLC_SS_PREG}, 2153 {0x0041, SIERRA_CMN_PLLLC_SS_AMP_STEP_SIZE_PREG}, 2154 {0x0464, SIERRA_CMN_PLLLC_SSTWOPT_PREG}, 2155 {0x0D0D, SIERRA_CMN_PLLLC_SS_TIME_STEPSIZE_MODE_PREG}, 2156 {0x0060, SIERRA_CMN_PLLLC_LOCK_DELAY_CTRL_PREG} 2157 }; 2158 2159 /* refclk100MHz_32b_PCIe_ln_int_ssc */ 2160 static const struct cdns_reg_pairs cdns_pcie_ln_regs_int_ssc[] = { 2161 {0xFC08, SIERRA_DET_STANDEC_A_PREG}, 2162 {0x001D, SIERRA_PSM_A3IN_TMR_PREG}, 2163 {0x1555, SIERRA_DFE_BIASTRIM_PREG}, 2164 {0x9703, SIERRA_DRVCTRL_BOOST_PREG}, 2165 {0x813E, SIERRA_CLKPATHCTRL_TMR_PREG}, 2166 {0x8047, SIERRA_RX_CREQ_FLTR_A_MODE3_PREG}, 2167 {0x808F, SIERRA_RX_CREQ_FLTR_A_MODE2_PREG}, 2168 {0x808F, SIERRA_RX_CREQ_FLTR_A_MODE1_PREG}, 2169 {0x808F, SIERRA_RX_CREQ_FLTR_A_MODE0_PREG}, 2170 {0x0002, SIERRA_CREQ_DCBIASATTEN_OVR_PREG}, 2171 {0x9800, SIERRA_RX_CTLE_CAL_PREG}, 2172 {0x033C, SIERRA_RX_CTLE_MAINTENANCE_PREG}, 2173 {0x44CC, SIERRA_CREQ_EQ_OPEN_EYE_THRESH_PREG}, 2174 {0x5624, SIERRA_DEQ_CONCUR_CTRL2_PREG}, 2175 {0x000F, SIERRA_DEQ_EPIPWR_CTRL2_PREG}, 2176 {0x00FF, SIERRA_DEQ_FAST_MAINT_CYCLES_PREG}, 2177 {0x4C4C, SIERRA_DEQ_ERRCMP_CTRL_PREG}, 2178 {0x02FA, SIERRA_DEQ_OFFSET_CTRL_PREG}, 2179 {0x02FA, SIERRA_DEQ_GAIN_CTRL_PREG}, 2180 {0x0041, SIERRA_DEQ_GLUT0}, 2181 {0x0082, SIERRA_DEQ_GLUT1}, 2182 {0x00C3, SIERRA_DEQ_GLUT2}, 2183 {0x0145, SIERRA_DEQ_GLUT3}, 2184 {0x0186, SIERRA_DEQ_GLUT4}, 2185 {0x09E7, SIERRA_DEQ_ALUT0}, 2186 {0x09A6, SIERRA_DEQ_ALUT1}, 2187 {0x0965, SIERRA_DEQ_ALUT2}, 2188 {0x08E3, SIERRA_DEQ_ALUT3}, 2189 {0x00FA, SIERRA_DEQ_DFETAP0}, 2190 {0x00FA, SIERRA_DEQ_DFETAP1}, 2191 {0x00FA, SIERRA_DEQ_DFETAP2}, 2192 {0x00FA, SIERRA_DEQ_DFETAP3}, 2193 {0x00FA, SIERRA_DEQ_DFETAP4}, 2194 {0x000F, SIERRA_DEQ_PRECUR_PREG}, 2195 {0x0280, SIERRA_DEQ_POSTCUR_PREG}, 2196 {0x8F00, SIERRA_DEQ_POSTCUR_DECR_PREG}, 2197 {0x3C0F, SIERRA_DEQ_TAU_CTRL1_SLOW_MAINT_PREG}, 2198 {0x1C0C, SIERRA_DEQ_TAU_CTRL2_PREG}, 2199 {0x0100, SIERRA_DEQ_TAU_CTRL3_PREG}, 2200 {0x5E82, SIERRA_DEQ_OPENEYE_CTRL_PREG}, 2201 {0x002B, SIERRA_CPI_TRIM_PREG}, 2202 {0x0003, SIERRA_EPI_CTRL_PREG}, 2203 {0x803F, SIERRA_SDFILT_H2L_A_PREG}, 2204 {0x0004, SIERRA_RXBUFFER_CTLECTRL_PREG}, 2205 {0x2010, SIERRA_RXBUFFER_RCDFECTRL_PREG}, 2206 {0x4432, SIERRA_RXBUFFER_DFECTRL_PREG} 2207 }; 2208 2209 static struct cdns_sierra_vals pcie_100_int_ssc_cmn_vals = { 2210 .reg_pairs = cdns_pcie_cmn_regs_int_ssc, 2211 .num_regs = ARRAY_SIZE(cdns_pcie_cmn_regs_int_ssc), 2212 }; 2213 2214 static struct cdns_sierra_vals pcie_100_int_ssc_ln_vals = { 2215 .reg_pairs = cdns_pcie_ln_regs_int_ssc, 2216 .num_regs = ARRAY_SIZE(cdns_pcie_ln_regs_int_ssc), 2217 }; 2218 2219 /* refclk100MHz_32b_PCIe_cmn_pll_ext_ssc */ 2220 static const struct cdns_reg_pairs cdns_pcie_cmn_regs_ext_ssc[] = { 2221 {0x2106, SIERRA_CMN_PLLLC_LF_COEFF_MODE1_PREG}, 2222 {0x2106, SIERRA_CMN_PLLLC_LF_COEFF_MODE0_PREG}, 2223 {0x8A06, SIERRA_CMN_PLLLC_BWCAL_MODE1_PREG}, 2224 {0x8A06, SIERRA_CMN_PLLLC_BWCAL_MODE0_PREG}, 2225 {0x1B1B, SIERRA_CMN_PLLLC_SS_TIME_STEPSIZE_MODE_PREG} 2226 }; 2227 2228 /* refclk100MHz_32b_PCIe_ln_ext_ssc */ 2229 static const struct cdns_reg_pairs cdns_pcie_ln_regs_ext_ssc[] = { 2230 {0xFC08, SIERRA_DET_STANDEC_A_PREG}, 2231 {0x001D, SIERRA_PSM_A3IN_TMR_PREG}, 2232 {0x1555, SIERRA_DFE_BIASTRIM_PREG}, 2233 {0x9703, SIERRA_DRVCTRL_BOOST_PREG}, 2234 {0x813E, SIERRA_CLKPATHCTRL_TMR_PREG}, 2235 {0x8047, SIERRA_RX_CREQ_FLTR_A_MODE3_PREG}, 2236 {0x808F, SIERRA_RX_CREQ_FLTR_A_MODE2_PREG}, 2237 {0x808F, SIERRA_RX_CREQ_FLTR_A_MODE1_PREG}, 2238 {0x808F, SIERRA_RX_CREQ_FLTR_A_MODE0_PREG}, 2239 {0x0002, SIERRA_CREQ_DCBIASATTEN_OVR_PREG}, 2240 {0x9800, SIERRA_RX_CTLE_CAL_PREG}, 2241 {0x033C, SIERRA_RX_CTLE_MAINTENANCE_PREG}, 2242 {0x44CC, SIERRA_CREQ_EQ_OPEN_EYE_THRESH_PREG}, 2243 {0x5624, SIERRA_DEQ_CONCUR_CTRL2_PREG}, 2244 {0x000F, SIERRA_DEQ_EPIPWR_CTRL2_PREG}, 2245 {0x00FF, SIERRA_DEQ_FAST_MAINT_CYCLES_PREG}, 2246 {0x4C4C, SIERRA_DEQ_ERRCMP_CTRL_PREG}, 2247 {0x02FA, SIERRA_DEQ_OFFSET_CTRL_PREG}, 2248 {0x02FA, SIERRA_DEQ_GAIN_CTRL_PREG}, 2249 {0x0041, SIERRA_DEQ_GLUT0}, 2250 {0x0082, SIERRA_DEQ_GLUT1}, 2251 {0x00C3, SIERRA_DEQ_GLUT2}, 2252 {0x0145, SIERRA_DEQ_GLUT3}, 2253 {0x0186, SIERRA_DEQ_GLUT4}, 2254 {0x09E7, SIERRA_DEQ_ALUT0}, 2255 {0x09A6, SIERRA_DEQ_ALUT1}, 2256 {0x0965, SIERRA_DEQ_ALUT2}, 2257 {0x08E3, SIERRA_DEQ_ALUT3}, 2258 {0x00FA, SIERRA_DEQ_DFETAP0}, 2259 {0x00FA, SIERRA_DEQ_DFETAP1}, 2260 {0x00FA, SIERRA_DEQ_DFETAP2}, 2261 {0x00FA, SIERRA_DEQ_DFETAP3}, 2262 {0x00FA, SIERRA_DEQ_DFETAP4}, 2263 {0x000F, SIERRA_DEQ_PRECUR_PREG}, 2264 {0x0280, SIERRA_DEQ_POSTCUR_PREG}, 2265 {0x8F00, SIERRA_DEQ_POSTCUR_DECR_PREG}, 2266 {0x3C0F, SIERRA_DEQ_TAU_CTRL1_SLOW_MAINT_PREG}, 2267 {0x1C0C, SIERRA_DEQ_TAU_CTRL2_PREG}, 2268 {0x0100, SIERRA_DEQ_TAU_CTRL3_PREG}, 2269 {0x5E82, SIERRA_DEQ_OPENEYE_CTRL_PREG}, 2270 {0x002B, SIERRA_CPI_TRIM_PREG}, 2271 {0x0003, SIERRA_EPI_CTRL_PREG}, 2272 {0x803F, SIERRA_SDFILT_H2L_A_PREG}, 2273 {0x0004, SIERRA_RXBUFFER_CTLECTRL_PREG}, 2274 {0x2010, SIERRA_RXBUFFER_RCDFECTRL_PREG}, 2275 {0x4432, SIERRA_RXBUFFER_DFECTRL_PREG} 2276 }; 2277 2278 static struct cdns_sierra_vals pcie_100_ext_ssc_cmn_vals = { 2279 .reg_pairs = cdns_pcie_cmn_regs_ext_ssc, 2280 .num_regs = ARRAY_SIZE(cdns_pcie_cmn_regs_ext_ssc), 2281 }; 2282 2283 static struct cdns_sierra_vals pcie_100_ext_ssc_ln_vals = { 2284 .reg_pairs = cdns_pcie_ln_regs_ext_ssc, 2285 .num_regs = ARRAY_SIZE(cdns_pcie_ln_regs_ext_ssc), 2286 }; 2287 2288 /* refclk100MHz_20b_USB_cmn_pll_ext_ssc */ 2289 static const struct cdns_reg_pairs cdns_usb_cmn_regs_ext_ssc[] = { 2290 {0x2085, SIERRA_CMN_PLLLC_LF_COEFF_MODE1_PREG}, 2291 {0x2085, SIERRA_CMN_PLLLC_LF_COEFF_MODE0_PREG}, 2292 {0x0000, SIERRA_CMN_PLLLC_BWCAL_MODE0_PREG}, 2293 {0x0000, SIERRA_CMN_PLLLC_SS_TIME_STEPSIZE_MODE_PREG} 2294 }; 2295 2296 /* refclk100MHz_20b_USB_ln_ext_ssc */ 2297 static const struct cdns_reg_pairs cdns_usb_ln_regs_ext_ssc[] = { 2298 {0xFE0A, SIERRA_DET_STANDEC_A_PREG}, 2299 {0x000F, SIERRA_DET_STANDEC_B_PREG}, 2300 {0x55A5, SIERRA_DET_STANDEC_C_PREG}, 2301 {0x69ad, SIERRA_DET_STANDEC_D_PREG}, 2302 {0x0241, SIERRA_DET_STANDEC_E_PREG}, 2303 {0x0110, SIERRA_PSM_LANECAL_DLY_A1_RESETS_PREG}, 2304 {0x0014, SIERRA_PSM_A0IN_TMR_PREG}, 2305 {0xCF00, SIERRA_PSM_DIAG_PREG}, 2306 {0x001F, SIERRA_PSC_TX_A0_PREG}, 2307 {0x0007, SIERRA_PSC_TX_A1_PREG}, 2308 {0x0003, SIERRA_PSC_TX_A2_PREG}, 2309 {0x0003, SIERRA_PSC_TX_A3_PREG}, 2310 {0x0FFF, SIERRA_PSC_RX_A0_PREG}, 2311 {0x0003, SIERRA_PSC_RX_A1_PREG}, 2312 {0x0003, SIERRA_PSC_RX_A2_PREG}, 2313 {0x0001, SIERRA_PSC_RX_A3_PREG}, 2314 {0x0001, SIERRA_PLLCTRL_SUBRATE_PREG}, 2315 {0x0406, SIERRA_PLLCTRL_GEN_D_PREG}, 2316 {0x5233, SIERRA_PLLCTRL_CPGAIN_MODE_PREG}, 2317 {0x00CA, SIERRA_CLKPATH_BIASTRIM_PREG}, 2318 {0x2512, SIERRA_DFE_BIASTRIM_PREG}, 2319 {0x0000, SIERRA_DRVCTRL_ATTEN_PREG}, 2320 {0x823E, SIERRA_CLKPATHCTRL_TMR_PREG}, 2321 {0x078F, SIERRA_RX_CREQ_FLTR_A_MODE1_PREG}, 2322 {0x078F, SIERRA_RX_CREQ_FLTR_A_MODE0_PREG}, 2323 {0x7B3C, SIERRA_CREQ_CCLKDET_MODE01_PREG}, 2324 {0x023C, SIERRA_RX_CTLE_MAINTENANCE_PREG}, 2325 {0x3232, SIERRA_CREQ_FSMCLK_SEL_PREG}, 2326 {0x0000, SIERRA_CREQ_EQ_CTRL_PREG}, 2327 {0x0000, SIERRA_CREQ_SPARE_PREG}, 2328 {0xCC44, SIERRA_CREQ_EQ_OPEN_EYE_THRESH_PREG}, 2329 {0x8452, SIERRA_CTLELUT_CTRL_PREG}, 2330 {0x4121, SIERRA_DFE_ECMP_RATESEL_PREG}, 2331 {0x4121, SIERRA_DFE_SMP_RATESEL_PREG}, 2332 {0x0003, SIERRA_DEQ_PHALIGN_CTRL}, 2333 {0x3200, SIERRA_DEQ_CONCUR_CTRL1_PREG}, 2334 {0x5064, SIERRA_DEQ_CONCUR_CTRL2_PREG}, 2335 {0x0030, SIERRA_DEQ_EPIPWR_CTRL2_PREG}, 2336 {0x0048, SIERRA_DEQ_FAST_MAINT_CYCLES_PREG}, 2337 {0x5A5A, SIERRA_DEQ_ERRCMP_CTRL_PREG}, 2338 {0x02F5, SIERRA_DEQ_OFFSET_CTRL_PREG}, 2339 {0x02F5, SIERRA_DEQ_GAIN_CTRL_PREG}, 2340 {0x9999, SIERRA_DEQ_VGATUNE_CTRL_PREG}, 2341 {0x0014, SIERRA_DEQ_GLUT0}, 2342 {0x0014, SIERRA_DEQ_GLUT1}, 2343 {0x0014, SIERRA_DEQ_GLUT2}, 2344 {0x0014, SIERRA_DEQ_GLUT3}, 2345 {0x0014, SIERRA_DEQ_GLUT4}, 2346 {0x0014, SIERRA_DEQ_GLUT5}, 2347 {0x0014, SIERRA_DEQ_GLUT6}, 2348 {0x0014, SIERRA_DEQ_GLUT7}, 2349 {0x0014, SIERRA_DEQ_GLUT8}, 2350 {0x0014, SIERRA_DEQ_GLUT9}, 2351 {0x0014, SIERRA_DEQ_GLUT10}, 2352 {0x0014, SIERRA_DEQ_GLUT11}, 2353 {0x0014, SIERRA_DEQ_GLUT12}, 2354 {0x0014, SIERRA_DEQ_GLUT13}, 2355 {0x0014, SIERRA_DEQ_GLUT14}, 2356 {0x0014, SIERRA_DEQ_GLUT15}, 2357 {0x0014, SIERRA_DEQ_GLUT16}, 2358 {0x0BAE, SIERRA_DEQ_ALUT0}, 2359 {0x0AEB, SIERRA_DEQ_ALUT1}, 2360 {0x0A28, SIERRA_DEQ_ALUT2}, 2361 {0x0965, SIERRA_DEQ_ALUT3}, 2362 {0x08A2, SIERRA_DEQ_ALUT4}, 2363 {0x07DF, SIERRA_DEQ_ALUT5}, 2364 {0x071C, SIERRA_DEQ_ALUT6}, 2365 {0x0659, SIERRA_DEQ_ALUT7}, 2366 {0x0596, SIERRA_DEQ_ALUT8}, 2367 {0x0514, SIERRA_DEQ_ALUT9}, 2368 {0x0492, SIERRA_DEQ_ALUT10}, 2369 {0x0410, SIERRA_DEQ_ALUT11}, 2370 {0x038E, SIERRA_DEQ_ALUT12}, 2371 {0x030C, SIERRA_DEQ_ALUT13}, 2372 {0x03F4, SIERRA_DEQ_DFETAP_CTRL_PREG}, 2373 {0x0001, SIERRA_DFE_EN_1010_IGNORE_PREG}, 2374 {0x3C01, SIERRA_DEQ_TAU_CTRL1_FAST_MAINT_PREG}, 2375 {0x3C40, SIERRA_DEQ_TAU_CTRL1_SLOW_MAINT_PREG}, 2376 {0x1C08, SIERRA_DEQ_TAU_CTRL2_PREG}, 2377 {0x0033, SIERRA_DEQ_PICTRL_PREG}, 2378 {0x0400, SIERRA_CPICAL_TMRVAL_MODE1_PREG}, 2379 {0x0330, SIERRA_CPICAL_TMRVAL_MODE0_PREG}, 2380 {0x01FF, SIERRA_CPICAL_PICNT_MODE1_PREG}, 2381 {0x0009, SIERRA_CPI_OUTBUF_RATESEL_PREG}, 2382 {0x3232, SIERRA_CPICAL_RES_STARTCODE_MODE23_PREG}, 2383 {0x0005, SIERRA_LFPSDET_SUPPORT_PREG}, 2384 {0x000F, SIERRA_LFPSFILT_NS_PREG}, 2385 {0x0009, SIERRA_LFPSFILT_RD_PREG}, 2386 {0x0001, SIERRA_LFPSFILT_MP_PREG}, 2387 {0x6013, SIERRA_SIGDET_SUPPORT_PREG}, 2388 {0x8013, SIERRA_SDFILT_H2L_A_PREG}, 2389 {0x8009, SIERRA_SDFILT_L2H_PREG}, 2390 {0x0024, SIERRA_RXBUFFER_CTLECTRL_PREG}, 2391 {0x0020, SIERRA_RXBUFFER_RCDFECTRL_PREG}, 2392 {0x4243, SIERRA_RXBUFFER_DFECTRL_PREG} 2393 }; 2394 2395 static struct cdns_sierra_vals usb_100_ext_ssc_cmn_vals = { 2396 .reg_pairs = cdns_usb_cmn_regs_ext_ssc, 2397 .num_regs = ARRAY_SIZE(cdns_usb_cmn_regs_ext_ssc), 2398 }; 2399 2400 static struct cdns_sierra_vals usb_100_ext_ssc_ln_vals = { 2401 .reg_pairs = cdns_usb_ln_regs_ext_ssc, 2402 .num_regs = ARRAY_SIZE(cdns_usb_ln_regs_ext_ssc), 2403 }; 2404 2405 static const struct cdns_sierra_data cdns_map_sierra = { 2406 .id_value = SIERRA_MACRO_ID, 2407 .block_offset_shift = 0x2, 2408 .reg_offset_shift = 0x2, 2409 .pcs_cmn_vals = { 2410 [TYPE_PCIE] = { 2411 [TYPE_NONE] = { 2412 [NO_SSC] = &pcie_phy_pcs_cmn_vals, 2413 [EXTERNAL_SSC] = &pcie_phy_pcs_cmn_vals, 2414 [INTERNAL_SSC] = &pcie_phy_pcs_cmn_vals, 2415 }, 2416 [TYPE_SGMII] = { 2417 [NO_SSC] = &pcie_phy_pcs_cmn_vals, 2418 [EXTERNAL_SSC] = &pcie_phy_pcs_cmn_vals, 2419 [INTERNAL_SSC] = &pcie_phy_pcs_cmn_vals, 2420 }, 2421 [TYPE_QSGMII] = { 2422 [NO_SSC] = &pcie_phy_pcs_cmn_vals, 2423 [EXTERNAL_SSC] = &pcie_phy_pcs_cmn_vals, 2424 [INTERNAL_SSC] = &pcie_phy_pcs_cmn_vals, 2425 }, 2426 }, 2427 }, 2428 .pma_cmn_vals = { 2429 [TYPE_PCIE] = { 2430 [TYPE_NONE] = { 2431 [NO_SSC] = &pcie_100_no_ssc_cmn_vals, 2432 [EXTERNAL_SSC] = &pcie_100_ext_ssc_cmn_vals, 2433 [INTERNAL_SSC] = &pcie_100_int_ssc_cmn_vals, 2434 }, 2435 [TYPE_SGMII] = { 2436 [NO_SSC] = &pcie_100_no_ssc_plllc_cmn_vals, 2437 [EXTERNAL_SSC] = &pcie_100_ext_ssc_plllc_cmn_vals, 2438 [INTERNAL_SSC] = &pcie_100_int_ssc_plllc_cmn_vals, 2439 }, 2440 [TYPE_QSGMII] = { 2441 [NO_SSC] = &pcie_100_no_ssc_plllc_cmn_vals, 2442 [EXTERNAL_SSC] = &pcie_100_ext_ssc_plllc_cmn_vals, 2443 [INTERNAL_SSC] = &pcie_100_int_ssc_plllc_cmn_vals, 2444 }, 2445 }, 2446 [TYPE_USB] = { 2447 [TYPE_NONE] = { 2448 [EXTERNAL_SSC] = &usb_100_ext_ssc_cmn_vals, 2449 }, 2450 }, 2451 [TYPE_SGMII] = { 2452 [TYPE_PCIE] = { 2453 [NO_SSC] = &sgmii_100_no_ssc_plllc1_opt3_cmn_vals, 2454 [EXTERNAL_SSC] = &sgmii_100_no_ssc_plllc1_opt3_cmn_vals, 2455 [INTERNAL_SSC] = &sgmii_100_no_ssc_plllc1_opt3_cmn_vals, 2456 }, 2457 }, 2458 [TYPE_QSGMII] = { 2459 [TYPE_PCIE] = { 2460 [NO_SSC] = &qsgmii_100_no_ssc_plllc1_cmn_vals, 2461 [EXTERNAL_SSC] = &qsgmii_100_no_ssc_plllc1_cmn_vals, 2462 [INTERNAL_SSC] = &qsgmii_100_no_ssc_plllc1_cmn_vals, 2463 }, 2464 }, 2465 }, 2466 .pma_ln_vals = { 2467 [TYPE_PCIE] = { 2468 [TYPE_NONE] = { 2469 [NO_SSC] = &pcie_100_no_ssc_ln_vals, 2470 [EXTERNAL_SSC] = &pcie_100_ext_ssc_ln_vals, 2471 [INTERNAL_SSC] = &pcie_100_int_ssc_ln_vals, 2472 }, 2473 [TYPE_SGMII] = { 2474 [NO_SSC] = &ml_pcie_100_no_ssc_ln_vals, 2475 [EXTERNAL_SSC] = &ml_pcie_100_ext_ssc_ln_vals, 2476 [INTERNAL_SSC] = &ml_pcie_100_int_ssc_ln_vals, 2477 }, 2478 [TYPE_QSGMII] = { 2479 [NO_SSC] = &ml_pcie_100_no_ssc_ln_vals, 2480 [EXTERNAL_SSC] = &ml_pcie_100_ext_ssc_ln_vals, 2481 [INTERNAL_SSC] = &ml_pcie_100_int_ssc_ln_vals, 2482 }, 2483 }, 2484 [TYPE_USB] = { 2485 [TYPE_NONE] = { 2486 [EXTERNAL_SSC] = &usb_100_ext_ssc_ln_vals, 2487 }, 2488 }, 2489 [TYPE_SGMII] = { 2490 [TYPE_PCIE] = { 2491 [NO_SSC] = &sgmii_100_no_ssc_plllc1_opt3_ln_vals, 2492 [EXTERNAL_SSC] = &sgmii_100_no_ssc_plllc1_opt3_ln_vals, 2493 [INTERNAL_SSC] = &sgmii_100_no_ssc_plllc1_opt3_ln_vals, 2494 }, 2495 }, 2496 [TYPE_QSGMII] = { 2497 [TYPE_PCIE] = { 2498 [NO_SSC] = &qsgmii_100_no_ssc_plllc1_ln_vals, 2499 [EXTERNAL_SSC] = &qsgmii_100_no_ssc_plllc1_ln_vals, 2500 [INTERNAL_SSC] = &qsgmii_100_no_ssc_plllc1_ln_vals, 2501 }, 2502 }, 2503 }, 2504 }; 2505 2506 static const struct cdns_sierra_data cdns_ti_map_sierra = { 2507 .id_value = SIERRA_MACRO_ID, 2508 .block_offset_shift = 0x0, 2509 .reg_offset_shift = 0x1, 2510 .pcs_cmn_vals = { 2511 [TYPE_PCIE] = { 2512 [TYPE_NONE] = { 2513 [NO_SSC] = &pcie_phy_pcs_cmn_vals, 2514 [EXTERNAL_SSC] = &pcie_phy_pcs_cmn_vals, 2515 [INTERNAL_SSC] = &pcie_phy_pcs_cmn_vals, 2516 }, 2517 [TYPE_SGMII] = { 2518 [NO_SSC] = &pcie_phy_pcs_cmn_vals, 2519 [EXTERNAL_SSC] = &pcie_phy_pcs_cmn_vals, 2520 [INTERNAL_SSC] = &pcie_phy_pcs_cmn_vals, 2521 }, 2522 [TYPE_QSGMII] = { 2523 [NO_SSC] = &pcie_phy_pcs_cmn_vals, 2524 [EXTERNAL_SSC] = &pcie_phy_pcs_cmn_vals, 2525 [INTERNAL_SSC] = &pcie_phy_pcs_cmn_vals, 2526 }, 2527 }, 2528 }, 2529 .phy_pma_ln_vals = { 2530 [TYPE_SGMII] = { 2531 [TYPE_PCIE] = { 2532 [NO_SSC] = &sgmii_phy_pma_ln_vals, 2533 [EXTERNAL_SSC] = &sgmii_phy_pma_ln_vals, 2534 [INTERNAL_SSC] = &sgmii_phy_pma_ln_vals, 2535 }, 2536 }, 2537 [TYPE_QSGMII] = { 2538 [TYPE_PCIE] = { 2539 [NO_SSC] = &qsgmii_phy_pma_ln_vals, 2540 [EXTERNAL_SSC] = &qsgmii_phy_pma_ln_vals, 2541 [INTERNAL_SSC] = &qsgmii_phy_pma_ln_vals, 2542 }, 2543 }, 2544 }, 2545 .pma_cmn_vals = { 2546 [TYPE_PCIE] = { 2547 [TYPE_NONE] = { 2548 [NO_SSC] = &pcie_100_no_ssc_cmn_vals, 2549 [EXTERNAL_SSC] = &pcie_100_ext_ssc_cmn_vals, 2550 [INTERNAL_SSC] = &pcie_100_int_ssc_cmn_vals, 2551 }, 2552 [TYPE_SGMII] = { 2553 [NO_SSC] = &pcie_100_no_ssc_plllc_cmn_vals, 2554 [EXTERNAL_SSC] = &pcie_100_ext_ssc_plllc_cmn_vals, 2555 [INTERNAL_SSC] = &pcie_100_int_ssc_plllc_cmn_vals, 2556 }, 2557 [TYPE_QSGMII] = { 2558 [NO_SSC] = &pcie_100_no_ssc_plllc_cmn_vals, 2559 [EXTERNAL_SSC] = &pcie_100_ext_ssc_plllc_cmn_vals, 2560 [INTERNAL_SSC] = &pcie_100_int_ssc_plllc_cmn_vals, 2561 }, 2562 }, 2563 [TYPE_USB] = { 2564 [TYPE_NONE] = { 2565 [EXTERNAL_SSC] = &usb_100_ext_ssc_cmn_vals, 2566 }, 2567 }, 2568 [TYPE_SGMII] = { 2569 [TYPE_PCIE] = { 2570 [NO_SSC] = &sgmii_100_no_ssc_plllc1_opt3_cmn_vals, 2571 [EXTERNAL_SSC] = &sgmii_100_no_ssc_plllc1_opt3_cmn_vals, 2572 [INTERNAL_SSC] = &sgmii_100_no_ssc_plllc1_opt3_cmn_vals, 2573 }, 2574 }, 2575 [TYPE_QSGMII] = { 2576 [TYPE_PCIE] = { 2577 [NO_SSC] = &qsgmii_100_no_ssc_plllc1_cmn_vals, 2578 [EXTERNAL_SSC] = &qsgmii_100_no_ssc_plllc1_cmn_vals, 2579 [INTERNAL_SSC] = &qsgmii_100_no_ssc_plllc1_cmn_vals, 2580 }, 2581 }, 2582 }, 2583 .pma_ln_vals = { 2584 [TYPE_PCIE] = { 2585 [TYPE_NONE] = { 2586 [NO_SSC] = &pcie_100_no_ssc_ln_vals, 2587 [EXTERNAL_SSC] = &pcie_100_ext_ssc_ln_vals, 2588 [INTERNAL_SSC] = &pcie_100_int_ssc_ln_vals, 2589 }, 2590 [TYPE_SGMII] = { 2591 [NO_SSC] = &ti_ml_pcie_100_no_ssc_ln_vals, 2592 [EXTERNAL_SSC] = &ti_ml_pcie_100_ext_ssc_ln_vals, 2593 [INTERNAL_SSC] = &ti_ml_pcie_100_int_ssc_ln_vals, 2594 }, 2595 [TYPE_QSGMII] = { 2596 [NO_SSC] = &ti_ml_pcie_100_no_ssc_ln_vals, 2597 [EXTERNAL_SSC] = &ti_ml_pcie_100_ext_ssc_ln_vals, 2598 [INTERNAL_SSC] = &ti_ml_pcie_100_int_ssc_ln_vals, 2599 }, 2600 }, 2601 [TYPE_USB] = { 2602 [TYPE_NONE] = { 2603 [EXTERNAL_SSC] = &usb_100_ext_ssc_ln_vals, 2604 }, 2605 }, 2606 [TYPE_SGMII] = { 2607 [TYPE_PCIE] = { 2608 [NO_SSC] = &sgmii_100_no_ssc_plllc1_opt3_ln_vals, 2609 [EXTERNAL_SSC] = &sgmii_100_no_ssc_plllc1_opt3_ln_vals, 2610 [INTERNAL_SSC] = &sgmii_100_no_ssc_plllc1_opt3_ln_vals, 2611 }, 2612 }, 2613 [TYPE_QSGMII] = { 2614 [TYPE_PCIE] = { 2615 [NO_SSC] = &qsgmii_100_no_ssc_plllc1_ln_vals, 2616 [EXTERNAL_SSC] = &qsgmii_100_no_ssc_plllc1_ln_vals, 2617 [INTERNAL_SSC] = &qsgmii_100_no_ssc_plllc1_ln_vals, 2618 }, 2619 }, 2620 }, 2621 }; 2622 2623 static const struct of_device_id cdns_sierra_id_table[] = { 2624 { 2625 .compatible = "cdns,sierra-phy-t0", 2626 .data = &cdns_map_sierra, 2627 }, 2628 { 2629 .compatible = "ti,sierra-phy-t0", 2630 .data = &cdns_ti_map_sierra, 2631 }, 2632 {} 2633 }; 2634 MODULE_DEVICE_TABLE(of, cdns_sierra_id_table); 2635 2636 static struct platform_driver cdns_sierra_driver = { 2637 .probe = cdns_sierra_phy_probe, 2638 .remove_new = cdns_sierra_phy_remove, 2639 .driver = { 2640 .name = "cdns-sierra-phy", 2641 .of_match_table = cdns_sierra_id_table, 2642 }, 2643 }; 2644 module_platform_driver(cdns_sierra_driver); 2645 2646 MODULE_ALIAS("platform:cdns_sierra"); 2647 MODULE_AUTHOR("Cadence Design Systems"); 2648 MODULE_DESCRIPTION("CDNS sierra phy driver"); 2649 MODULE_LICENSE("GPL v2"); 2650