1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * Cadence Torrent SD0801 PHY driver. 4 * 5 * Copyright 2018 Cadence Design Systems, Inc. 6 * 7 */ 8 9 #include <dt-bindings/phy/phy.h> 10 #include <dt-bindings/phy/phy-cadence.h> 11 #include <linux/clk.h> 12 #include <linux/clk-provider.h> 13 #include <linux/delay.h> 14 #include <linux/err.h> 15 #include <linux/io.h> 16 #include <linux/iopoll.h> 17 #include <linux/kernel.h> 18 #include <linux/module.h> 19 #include <linux/of.h> 20 #include <linux/of_address.h> 21 #include <linux/of_device.h> 22 #include <linux/phy/phy.h> 23 #include <linux/platform_device.h> 24 #include <linux/reset.h> 25 #include <linux/regmap.h> 26 27 #define REF_CLK_19_2MHZ 19200000 28 #define REF_CLK_25MHZ 25000000 29 #define REF_CLK_100MHZ 100000000 30 31 #define MAX_NUM_LANES 4 32 #define DEFAULT_MAX_BIT_RATE 8100 /* in Mbps */ 33 34 #define NUM_SSC_MODE 3 35 #define NUM_REF_CLK 3 36 #define NUM_PHY_TYPE 6 37 38 #define POLL_TIMEOUT_US 5000 39 #define PLL_LOCK_TIMEOUT 100000 40 41 #define DP_PLL0 BIT(0) 42 #define DP_PLL1 BIT(1) 43 44 #define TORRENT_COMMON_CDB_OFFSET 0x0 45 46 #define TORRENT_TX_LANE_CDB_OFFSET(ln, block_offset, reg_offset) \ 47 ((0x4000 << (block_offset)) + \ 48 (((ln) << 9) << (reg_offset))) 49 50 #define TORRENT_RX_LANE_CDB_OFFSET(ln, block_offset, reg_offset) \ 51 ((0x8000 << (block_offset)) + \ 52 (((ln) << 9) << (reg_offset))) 53 54 #define TORRENT_PHY_PCS_COMMON_OFFSET(block_offset) \ 55 (0xC000 << (block_offset)) 56 57 #define TORRENT_PHY_PCS_LANE_CDB_OFFSET(ln, block_offset, reg_offset) \ 58 ((0xD000 << (block_offset)) + \ 59 (((ln) << 8) << (reg_offset))) 60 61 #define TORRENT_PHY_PMA_COMMON_OFFSET(block_offset) \ 62 (0xE000 << (block_offset)) 63 64 #define TORRENT_DPTX_PHY_OFFSET 0x0 65 66 /* 67 * register offsets from DPTX PHY register block base (i.e MHDP 68 * register base + 0x30a00) 69 */ 70 #define PHY_AUX_CTRL 0x04 71 #define PHY_RESET 0x20 72 #define PMA_TX_ELEC_IDLE_SHIFT 4 73 #define PHY_PMA_XCVR_PLLCLK_EN 0x24 74 #define PHY_PMA_XCVR_PLLCLK_EN_ACK 0x28 75 #define PHY_PMA_XCVR_POWER_STATE_REQ 0x2c 76 #define PHY_POWER_STATE_LN(ln) ((ln) * 8) 77 #define PMA_XCVR_POWER_STATE_REQ_LN_MASK 0x3FU 78 #define PHY_PMA_XCVR_POWER_STATE_ACK 0x30 79 #define PHY_PMA_CMN_READY 0x34 80 81 /* 82 * register offsets from SD0801 PHY register block base (i.e MHDP 83 * register base + 0x500000) 84 */ 85 #define CMN_SSM_BANDGAP_TMR 0x0021U 86 #define CMN_SSM_BIAS_TMR 0x0022U 87 #define CMN_PLLSM0_PLLPRE_TMR 0x002AU 88 #define CMN_PLLSM0_PLLLOCK_TMR 0x002CU 89 #define CMN_PLLSM1_PLLPRE_TMR 0x0032U 90 #define CMN_PLLSM1_PLLLOCK_TMR 0x0034U 91 #define CMN_CDIAG_CDB_PWRI_OVRD 0x0041U 92 #define CMN_CDIAG_XCVRC_PWRI_OVRD 0x0047U 93 #define CMN_CDIAG_REFCLK_OVRD 0x004CU 94 #define CMN_CDIAG_REFCLK_DRV0_CTRL 0x0050U 95 #define CMN_BGCAL_INIT_TMR 0x0064U 96 #define CMN_BGCAL_ITER_TMR 0x0065U 97 #define CMN_IBCAL_INIT_TMR 0x0074U 98 #define CMN_PLL0_VCOCAL_TCTRL 0x0082U 99 #define CMN_PLL0_VCOCAL_INIT_TMR 0x0084U 100 #define CMN_PLL0_VCOCAL_ITER_TMR 0x0085U 101 #define CMN_PLL0_VCOCAL_REFTIM_START 0x0086U 102 #define CMN_PLL0_VCOCAL_PLLCNT_START 0x0088U 103 #define CMN_PLL0_INTDIV_M0 0x0090U 104 #define CMN_PLL0_FRACDIVL_M0 0x0091U 105 #define CMN_PLL0_FRACDIVH_M0 0x0092U 106 #define CMN_PLL0_HIGH_THR_M0 0x0093U 107 #define CMN_PLL0_DSM_DIAG_M0 0x0094U 108 #define CMN_PLL0_DSM_FBH_OVRD_M0 0x0095U 109 #define CMN_PLL0_SS_CTRL1_M0 0x0098U 110 #define CMN_PLL0_SS_CTRL2_M0 0x0099U 111 #define CMN_PLL0_SS_CTRL3_M0 0x009AU 112 #define CMN_PLL0_SS_CTRL4_M0 0x009BU 113 #define CMN_PLL0_LOCK_REFCNT_START 0x009CU 114 #define CMN_PLL0_LOCK_PLLCNT_START 0x009EU 115 #define CMN_PLL0_LOCK_PLLCNT_THR 0x009FU 116 #define CMN_PLL0_INTDIV_M1 0x00A0U 117 #define CMN_PLL0_FRACDIVH_M1 0x00A2U 118 #define CMN_PLL0_HIGH_THR_M1 0x00A3U 119 #define CMN_PLL0_DSM_DIAG_M1 0x00A4U 120 #define CMN_PLL0_SS_CTRL1_M1 0x00A8U 121 #define CMN_PLL0_SS_CTRL2_M1 0x00A9U 122 #define CMN_PLL0_SS_CTRL3_M1 0x00AAU 123 #define CMN_PLL0_SS_CTRL4_M1 0x00ABU 124 #define CMN_PLL1_VCOCAL_TCTRL 0x00C2U 125 #define CMN_PLL1_VCOCAL_INIT_TMR 0x00C4U 126 #define CMN_PLL1_VCOCAL_ITER_TMR 0x00C5U 127 #define CMN_PLL1_VCOCAL_REFTIM_START 0x00C6U 128 #define CMN_PLL1_VCOCAL_PLLCNT_START 0x00C8U 129 #define CMN_PLL1_INTDIV_M0 0x00D0U 130 #define CMN_PLL1_FRACDIVL_M0 0x00D1U 131 #define CMN_PLL1_FRACDIVH_M0 0x00D2U 132 #define CMN_PLL1_HIGH_THR_M0 0x00D3U 133 #define CMN_PLL1_DSM_DIAG_M0 0x00D4U 134 #define CMN_PLL1_DSM_FBH_OVRD_M0 0x00D5U 135 #define CMN_PLL1_DSM_FBL_OVRD_M0 0x00D6U 136 #define CMN_PLL1_SS_CTRL1_M0 0x00D8U 137 #define CMN_PLL1_SS_CTRL2_M0 0x00D9U 138 #define CMN_PLL1_SS_CTRL3_M0 0x00DAU 139 #define CMN_PLL1_SS_CTRL4_M0 0x00DBU 140 #define CMN_PLL1_LOCK_REFCNT_START 0x00DCU 141 #define CMN_PLL1_LOCK_PLLCNT_START 0x00DEU 142 #define CMN_PLL1_LOCK_PLLCNT_THR 0x00DFU 143 #define CMN_TXPUCAL_TUNE 0x0103U 144 #define CMN_TXPUCAL_INIT_TMR 0x0104U 145 #define CMN_TXPUCAL_ITER_TMR 0x0105U 146 #define CMN_TXPDCAL_TUNE 0x010BU 147 #define CMN_TXPDCAL_INIT_TMR 0x010CU 148 #define CMN_TXPDCAL_ITER_TMR 0x010DU 149 #define CMN_RXCAL_INIT_TMR 0x0114U 150 #define CMN_RXCAL_ITER_TMR 0x0115U 151 #define CMN_SD_CAL_INIT_TMR 0x0124U 152 #define CMN_SD_CAL_ITER_TMR 0x0125U 153 #define CMN_SD_CAL_REFTIM_START 0x0126U 154 #define CMN_SD_CAL_PLLCNT_START 0x0128U 155 #define CMN_PDIAG_PLL0_CTRL_M0 0x01A0U 156 #define CMN_PDIAG_PLL0_CLK_SEL_M0 0x01A1U 157 #define CMN_PDIAG_PLL0_CP_PADJ_M0 0x01A4U 158 #define CMN_PDIAG_PLL0_CP_IADJ_M0 0x01A5U 159 #define CMN_PDIAG_PLL0_FILT_PADJ_M0 0x01A6U 160 #define CMN_PDIAG_PLL0_CTRL_M1 0x01B0U 161 #define CMN_PDIAG_PLL0_CLK_SEL_M1 0x01B1U 162 #define CMN_PDIAG_PLL0_CP_PADJ_M1 0x01B4U 163 #define CMN_PDIAG_PLL0_CP_IADJ_M1 0x01B5U 164 #define CMN_PDIAG_PLL0_FILT_PADJ_M1 0x01B6U 165 #define CMN_PDIAG_PLL1_CTRL_M0 0x01C0U 166 #define CMN_PDIAG_PLL1_CLK_SEL_M0 0x01C1U 167 #define CMN_PDIAG_PLL1_CP_PADJ_M0 0x01C4U 168 #define CMN_PDIAG_PLL1_CP_IADJ_M0 0x01C5U 169 #define CMN_PDIAG_PLL1_FILT_PADJ_M0 0x01C6U 170 #define CMN_DIAG_BIAS_OVRD1 0x01E1U 171 172 /* PMA TX Lane registers */ 173 #define TX_TXCC_CTRL 0x0040U 174 #define TX_TXCC_CPOST_MULT_00 0x004CU 175 #define TX_TXCC_CPOST_MULT_01 0x004DU 176 #define TX_TXCC_MGNFS_MULT_000 0x0050U 177 #define TX_TXCC_MGNFS_MULT_100 0x0054U 178 #define DRV_DIAG_TX_DRV 0x00C6U 179 #define XCVR_DIAG_PLLDRC_CTRL 0x00E5U 180 #define XCVR_DIAG_HSCLK_SEL 0x00E6U 181 #define XCVR_DIAG_HSCLK_DIV 0x00E7U 182 #define XCVR_DIAG_RXCLK_CTRL 0x00E9U 183 #define XCVR_DIAG_BIDI_CTRL 0x00EAU 184 #define XCVR_DIAG_PSC_OVRD 0x00EBU 185 #define TX_PSC_A0 0x0100U 186 #define TX_PSC_A1 0x0101U 187 #define TX_PSC_A2 0x0102U 188 #define TX_PSC_A3 0x0103U 189 #define TX_RCVDET_ST_TMR 0x0123U 190 #define TX_DIAG_ACYA 0x01E7U 191 #define TX_DIAG_ACYA_HBDC_MASK 0x0001U 192 193 /* PMA RX Lane registers */ 194 #define RX_PSC_A0 0x0000U 195 #define RX_PSC_A1 0x0001U 196 #define RX_PSC_A2 0x0002U 197 #define RX_PSC_A3 0x0003U 198 #define RX_PSC_CAL 0x0006U 199 #define RX_CDRLF_CNFG 0x0080U 200 #define RX_CDRLF_CNFG3 0x0082U 201 #define RX_SIGDET_HL_FILT_TMR 0x0090U 202 #define RX_REE_GCSM1_CTRL 0x0108U 203 #define RX_REE_GCSM1_EQENM_PH1 0x0109U 204 #define RX_REE_GCSM1_EQENM_PH2 0x010AU 205 #define RX_REE_GCSM2_CTRL 0x0110U 206 #define RX_REE_PERGCSM_CTRL 0x0118U 207 #define RX_REE_ATTEN_THR 0x0149U 208 #define RX_REE_TAP1_CLIP 0x0171U 209 #define RX_REE_TAP2TON_CLIP 0x0172U 210 #define RX_REE_SMGM_CTRL1 0x0177U 211 #define RX_REE_SMGM_CTRL2 0x0178U 212 #define RX_DIAG_DFE_CTRL 0x01E0U 213 #define RX_DIAG_DFE_AMP_TUNE_2 0x01E2U 214 #define RX_DIAG_DFE_AMP_TUNE_3 0x01E3U 215 #define RX_DIAG_NQST_CTRL 0x01E5U 216 #define RX_DIAG_SIGDET_TUNE 0x01E8U 217 #define RX_DIAG_PI_RATE 0x01F4U 218 #define RX_DIAG_PI_CAP 0x01F5U 219 #define RX_DIAG_ACYA 0x01FFU 220 221 /* PHY PCS common registers */ 222 #define PHY_PIPE_CMN_CTRL1 0x0000U 223 #define PHY_PLL_CFG 0x000EU 224 #define PHY_PIPE_USB3_GEN2_PRE_CFG0 0x0020U 225 #define PHY_PIPE_USB3_GEN2_POST_CFG0 0x0022U 226 #define PHY_PIPE_USB3_GEN2_POST_CFG1 0x0023U 227 228 /* PHY PCS lane registers */ 229 #define PHY_PCS_ISO_LINK_CTRL 0x000BU 230 231 /* PHY PMA common registers */ 232 #define PHY_PMA_CMN_CTRL1 0x0000U 233 #define PHY_PMA_CMN_CTRL2 0x0001U 234 #define PHY_PMA_PLL_RAW_CTRL 0x0003U 235 236 #define CDNS_TORRENT_OUTPUT_CLOCKS 3 237 238 static const char * const clk_names[] = { 239 [CDNS_TORRENT_REFCLK_DRIVER] = "refclk-driver", 240 [CDNS_TORRENT_DERIVED_REFCLK] = "refclk-der", 241 [CDNS_TORRENT_RECEIVED_REFCLK] = "refclk-rec", 242 }; 243 244 static const struct reg_field phy_pll_cfg = 245 REG_FIELD(PHY_PLL_CFG, 0, 1); 246 247 static const struct reg_field phy_pma_cmn_ctrl_1 = 248 REG_FIELD(PHY_PMA_CMN_CTRL1, 0, 0); 249 250 static const struct reg_field phy_pma_cmn_ctrl_2 = 251 REG_FIELD(PHY_PMA_CMN_CTRL2, 0, 7); 252 253 static const struct reg_field phy_pma_pll_raw_ctrl = 254 REG_FIELD(PHY_PMA_PLL_RAW_CTRL, 0, 1); 255 256 static const struct reg_field phy_reset_ctrl = 257 REG_FIELD(PHY_RESET, 8, 8); 258 259 static const struct reg_field phy_pcs_iso_link_ctrl_1 = 260 REG_FIELD(PHY_PCS_ISO_LINK_CTRL, 1, 1); 261 262 static const struct reg_field phy_pipe_cmn_ctrl1_0 = REG_FIELD(PHY_PIPE_CMN_CTRL1, 0, 0); 263 264 static const struct reg_field cmn_cdiag_refclk_ovrd_4 = 265 REG_FIELD(CMN_CDIAG_REFCLK_OVRD, 4, 4); 266 267 #define REFCLK_OUT_NUM_CMN_CONFIG 4 268 269 enum cdns_torrent_refclk_out_cmn { 270 CMN_CDIAG_REFCLK_DRV0_CTRL_1, 271 CMN_CDIAG_REFCLK_DRV0_CTRL_4, 272 CMN_CDIAG_REFCLK_DRV0_CTRL_5, 273 CMN_CDIAG_REFCLK_DRV0_CTRL_6, 274 }; 275 276 static const struct reg_field refclk_out_cmn_cfg[] = { 277 [CMN_CDIAG_REFCLK_DRV0_CTRL_1] = REG_FIELD(CMN_CDIAG_REFCLK_DRV0_CTRL, 1, 1), 278 [CMN_CDIAG_REFCLK_DRV0_CTRL_4] = REG_FIELD(CMN_CDIAG_REFCLK_DRV0_CTRL, 4, 4), 279 [CMN_CDIAG_REFCLK_DRV0_CTRL_5] = REG_FIELD(CMN_CDIAG_REFCLK_DRV0_CTRL, 5, 5), 280 [CMN_CDIAG_REFCLK_DRV0_CTRL_6] = REG_FIELD(CMN_CDIAG_REFCLK_DRV0_CTRL, 6, 6), 281 }; 282 283 static const int refclk_driver_parent_index[] = { 284 CDNS_TORRENT_DERIVED_REFCLK, 285 CDNS_TORRENT_RECEIVED_REFCLK 286 }; 287 288 static u32 cdns_torrent_refclk_driver_mux_table[] = { 1, 0 }; 289 290 enum cdns_torrent_phy_type { 291 TYPE_NONE, 292 TYPE_DP, 293 TYPE_PCIE, 294 TYPE_SGMII, 295 TYPE_QSGMII, 296 TYPE_USB, 297 }; 298 299 enum cdns_torrent_ref_clk { 300 CLK_19_2_MHZ, 301 CLK_25_MHZ, 302 CLK_100_MHZ 303 }; 304 305 enum cdns_torrent_ssc_mode { 306 NO_SSC, 307 EXTERNAL_SSC, 308 INTERNAL_SSC 309 }; 310 311 struct cdns_torrent_inst { 312 struct phy *phy; 313 u32 mlane; 314 enum cdns_torrent_phy_type phy_type; 315 u32 num_lanes; 316 struct reset_control *lnk_rst; 317 enum cdns_torrent_ssc_mode ssc_mode; 318 }; 319 320 struct cdns_torrent_phy { 321 void __iomem *base; /* DPTX registers base */ 322 void __iomem *sd_base; /* SD0801 registers base */ 323 u32 max_bit_rate; /* Maximum link bit rate to use (in Mbps) */ 324 u32 dp_pll; 325 struct reset_control *phy_rst; 326 struct reset_control *apb_rst; 327 struct device *dev; 328 struct clk *clk; 329 enum cdns_torrent_ref_clk ref_clk_rate; 330 struct cdns_torrent_inst phys[MAX_NUM_LANES]; 331 int nsubnodes; 332 const struct cdns_torrent_data *init_data; 333 struct regmap *regmap_common_cdb; 334 struct regmap *regmap_phy_pcs_common_cdb; 335 struct regmap *regmap_phy_pma_common_cdb; 336 struct regmap *regmap_tx_lane_cdb[MAX_NUM_LANES]; 337 struct regmap *regmap_rx_lane_cdb[MAX_NUM_LANES]; 338 struct regmap *regmap_phy_pcs_lane_cdb[MAX_NUM_LANES]; 339 struct regmap *regmap_dptx_phy_reg; 340 struct regmap_field *phy_pll_cfg; 341 struct regmap_field *phy_pipe_cmn_ctrl1_0; 342 struct regmap_field *cmn_cdiag_refclk_ovrd_4; 343 struct regmap_field *phy_pma_cmn_ctrl_1; 344 struct regmap_field *phy_pma_cmn_ctrl_2; 345 struct regmap_field *phy_pma_pll_raw_ctrl; 346 struct regmap_field *phy_reset_ctrl; 347 struct regmap_field *phy_pcs_iso_link_ctrl_1[MAX_NUM_LANES]; 348 struct clk_hw_onecell_data *clk_hw_data; 349 }; 350 351 enum phy_powerstate { 352 POWERSTATE_A0 = 0, 353 /* Powerstate A1 is unused */ 354 POWERSTATE_A2 = 2, 355 POWERSTATE_A3 = 3, 356 }; 357 358 struct cdns_torrent_refclk_driver { 359 struct clk_hw hw; 360 struct regmap_field *cmn_fields[REFCLK_OUT_NUM_CMN_CONFIG]; 361 struct clk_init_data clk_data; 362 }; 363 364 #define to_cdns_torrent_refclk_driver(_hw) \ 365 container_of(_hw, struct cdns_torrent_refclk_driver, hw) 366 367 struct cdns_torrent_derived_refclk { 368 struct clk_hw hw; 369 struct regmap_field *phy_pipe_cmn_ctrl1_0; 370 struct regmap_field *cmn_cdiag_refclk_ovrd_4; 371 struct clk_init_data clk_data; 372 }; 373 374 #define to_cdns_torrent_derived_refclk(_hw) \ 375 container_of(_hw, struct cdns_torrent_derived_refclk, hw) 376 377 struct cdns_torrent_received_refclk { 378 struct clk_hw hw; 379 struct regmap_field *phy_pipe_cmn_ctrl1_0; 380 struct regmap_field *cmn_cdiag_refclk_ovrd_4; 381 struct clk_init_data clk_data; 382 }; 383 384 #define to_cdns_torrent_received_refclk(_hw) \ 385 container_of(_hw, struct cdns_torrent_received_refclk, hw) 386 387 struct cdns_reg_pairs { 388 u32 val; 389 u32 off; 390 }; 391 392 struct cdns_torrent_vals { 393 struct cdns_reg_pairs *reg_pairs; 394 u32 num_regs; 395 }; 396 397 struct cdns_torrent_data { 398 u8 block_offset_shift; 399 u8 reg_offset_shift; 400 struct cdns_torrent_vals *link_cmn_vals[NUM_PHY_TYPE][NUM_PHY_TYPE] 401 [NUM_SSC_MODE]; 402 struct cdns_torrent_vals *xcvr_diag_vals[NUM_PHY_TYPE][NUM_PHY_TYPE] 403 [NUM_SSC_MODE]; 404 struct cdns_torrent_vals *pcs_cmn_vals[NUM_PHY_TYPE][NUM_PHY_TYPE] 405 [NUM_SSC_MODE]; 406 struct cdns_torrent_vals *cmn_vals[NUM_REF_CLK][NUM_PHY_TYPE] 407 [NUM_PHY_TYPE][NUM_SSC_MODE]; 408 struct cdns_torrent_vals *tx_ln_vals[NUM_REF_CLK][NUM_PHY_TYPE] 409 [NUM_PHY_TYPE][NUM_SSC_MODE]; 410 struct cdns_torrent_vals *rx_ln_vals[NUM_REF_CLK][NUM_PHY_TYPE] 411 [NUM_PHY_TYPE][NUM_SSC_MODE]; 412 }; 413 414 struct cdns_regmap_cdb_context { 415 struct device *dev; 416 void __iomem *base; 417 u8 reg_offset_shift; 418 }; 419 420 static int cdns_regmap_write(void *context, unsigned int reg, unsigned int val) 421 { 422 struct cdns_regmap_cdb_context *ctx = context; 423 u32 offset = reg << ctx->reg_offset_shift; 424 425 writew(val, ctx->base + offset); 426 427 return 0; 428 } 429 430 static int cdns_regmap_read(void *context, unsigned int reg, unsigned int *val) 431 { 432 struct cdns_regmap_cdb_context *ctx = context; 433 u32 offset = reg << ctx->reg_offset_shift; 434 435 *val = readw(ctx->base + offset); 436 return 0; 437 } 438 439 static int cdns_regmap_dptx_write(void *context, unsigned int reg, 440 unsigned int val) 441 { 442 struct cdns_regmap_cdb_context *ctx = context; 443 u32 offset = reg; 444 445 writel(val, ctx->base + offset); 446 447 return 0; 448 } 449 450 static int cdns_regmap_dptx_read(void *context, unsigned int reg, 451 unsigned int *val) 452 { 453 struct cdns_regmap_cdb_context *ctx = context; 454 u32 offset = reg; 455 456 *val = readl(ctx->base + offset); 457 return 0; 458 } 459 460 #define TORRENT_TX_LANE_CDB_REGMAP_CONF(n) \ 461 { \ 462 .name = "torrent_tx_lane" n "_cdb", \ 463 .reg_stride = 1, \ 464 .fast_io = true, \ 465 .reg_write = cdns_regmap_write, \ 466 .reg_read = cdns_regmap_read, \ 467 } 468 469 #define TORRENT_RX_LANE_CDB_REGMAP_CONF(n) \ 470 { \ 471 .name = "torrent_rx_lane" n "_cdb", \ 472 .reg_stride = 1, \ 473 .fast_io = true, \ 474 .reg_write = cdns_regmap_write, \ 475 .reg_read = cdns_regmap_read, \ 476 } 477 478 static const struct regmap_config cdns_torrent_tx_lane_cdb_config[] = { 479 TORRENT_TX_LANE_CDB_REGMAP_CONF("0"), 480 TORRENT_TX_LANE_CDB_REGMAP_CONF("1"), 481 TORRENT_TX_LANE_CDB_REGMAP_CONF("2"), 482 TORRENT_TX_LANE_CDB_REGMAP_CONF("3"), 483 }; 484 485 static const struct regmap_config cdns_torrent_rx_lane_cdb_config[] = { 486 TORRENT_RX_LANE_CDB_REGMAP_CONF("0"), 487 TORRENT_RX_LANE_CDB_REGMAP_CONF("1"), 488 TORRENT_RX_LANE_CDB_REGMAP_CONF("2"), 489 TORRENT_RX_LANE_CDB_REGMAP_CONF("3"), 490 }; 491 492 static const struct regmap_config cdns_torrent_common_cdb_config = { 493 .name = "torrent_common_cdb", 494 .reg_stride = 1, 495 .fast_io = true, 496 .reg_write = cdns_regmap_write, 497 .reg_read = cdns_regmap_read, 498 }; 499 500 #define TORRENT_PHY_PCS_LANE_CDB_REGMAP_CONF(n) \ 501 { \ 502 .name = "torrent_phy_pcs_lane" n "_cdb", \ 503 .reg_stride = 1, \ 504 .fast_io = true, \ 505 .reg_write = cdns_regmap_write, \ 506 .reg_read = cdns_regmap_read, \ 507 } 508 509 static const struct regmap_config cdns_torrent_phy_pcs_lane_cdb_config[] = { 510 TORRENT_PHY_PCS_LANE_CDB_REGMAP_CONF("0"), 511 TORRENT_PHY_PCS_LANE_CDB_REGMAP_CONF("1"), 512 TORRENT_PHY_PCS_LANE_CDB_REGMAP_CONF("2"), 513 TORRENT_PHY_PCS_LANE_CDB_REGMAP_CONF("3"), 514 }; 515 516 static const struct regmap_config cdns_torrent_phy_pcs_cmn_cdb_config = { 517 .name = "torrent_phy_pcs_cmn_cdb", 518 .reg_stride = 1, 519 .fast_io = true, 520 .reg_write = cdns_regmap_write, 521 .reg_read = cdns_regmap_read, 522 }; 523 524 static const struct regmap_config cdns_torrent_phy_pma_cmn_cdb_config = { 525 .name = "torrent_phy_pma_cmn_cdb", 526 .reg_stride = 1, 527 .fast_io = true, 528 .reg_write = cdns_regmap_write, 529 .reg_read = cdns_regmap_read, 530 }; 531 532 static const struct regmap_config cdns_torrent_dptx_phy_config = { 533 .name = "torrent_dptx_phy", 534 .reg_stride = 1, 535 .fast_io = true, 536 .reg_write = cdns_regmap_dptx_write, 537 .reg_read = cdns_regmap_dptx_read, 538 }; 539 540 /* PHY mmr access functions */ 541 542 static void cdns_torrent_phy_write(struct regmap *regmap, u32 offset, u32 val) 543 { 544 regmap_write(regmap, offset, val); 545 } 546 547 static u32 cdns_torrent_phy_read(struct regmap *regmap, u32 offset) 548 { 549 unsigned int val; 550 551 regmap_read(regmap, offset, &val); 552 return val; 553 } 554 555 /* DPTX mmr access functions */ 556 557 static void cdns_torrent_dp_write(struct regmap *regmap, u32 offset, u32 val) 558 { 559 regmap_write(regmap, offset, val); 560 } 561 562 static u32 cdns_torrent_dp_read(struct regmap *regmap, u32 offset) 563 { 564 u32 val; 565 566 regmap_read(regmap, offset, &val); 567 return val; 568 } 569 570 /* 571 * Structure used to store values of PHY registers for voltage-related 572 * coefficients, for particular voltage swing and pre-emphasis level. Values 573 * are shared across all physical lanes. 574 */ 575 struct coefficients { 576 /* Value of DRV_DIAG_TX_DRV register to use */ 577 u16 diag_tx_drv; 578 /* Value of TX_TXCC_MGNFS_MULT_000 register to use */ 579 u16 mgnfs_mult; 580 /* Value of TX_TXCC_CPOST_MULT_00 register to use */ 581 u16 cpost_mult; 582 }; 583 584 /* 585 * Array consists of values of voltage-related registers for sd0801 PHY. A value 586 * of 0xFFFF is a placeholder for invalid combination, and will never be used. 587 */ 588 static const struct coefficients vltg_coeff[4][4] = { 589 /* voltage swing 0, pre-emphasis 0->3 */ 590 { {.diag_tx_drv = 0x0003, .mgnfs_mult = 0x002A, 591 .cpost_mult = 0x0000}, 592 {.diag_tx_drv = 0x0003, .mgnfs_mult = 0x001F, 593 .cpost_mult = 0x0014}, 594 {.diag_tx_drv = 0x0003, .mgnfs_mult = 0x0012, 595 .cpost_mult = 0x0020}, 596 {.diag_tx_drv = 0x0003, .mgnfs_mult = 0x0000, 597 .cpost_mult = 0x002A} 598 }, 599 600 /* voltage swing 1, pre-emphasis 0->3 */ 601 { {.diag_tx_drv = 0x0003, .mgnfs_mult = 0x001F, 602 .cpost_mult = 0x0000}, 603 {.diag_tx_drv = 0x0003, .mgnfs_mult = 0x0013, 604 .cpost_mult = 0x0012}, 605 {.diag_tx_drv = 0x0003, .mgnfs_mult = 0x0000, 606 .cpost_mult = 0x001F}, 607 {.diag_tx_drv = 0xFFFF, .mgnfs_mult = 0xFFFF, 608 .cpost_mult = 0xFFFF} 609 }, 610 611 /* voltage swing 2, pre-emphasis 0->3 */ 612 { {.diag_tx_drv = 0x0003, .mgnfs_mult = 0x0013, 613 .cpost_mult = 0x0000}, 614 {.diag_tx_drv = 0x0003, .mgnfs_mult = 0x0000, 615 .cpost_mult = 0x0013}, 616 {.diag_tx_drv = 0xFFFF, .mgnfs_mult = 0xFFFF, 617 .cpost_mult = 0xFFFF}, 618 {.diag_tx_drv = 0xFFFF, .mgnfs_mult = 0xFFFF, 619 .cpost_mult = 0xFFFF} 620 }, 621 622 /* voltage swing 3, pre-emphasis 0->3 */ 623 { {.diag_tx_drv = 0x0003, .mgnfs_mult = 0x0000, 624 .cpost_mult = 0x0000}, 625 {.diag_tx_drv = 0xFFFF, .mgnfs_mult = 0xFFFF, 626 .cpost_mult = 0xFFFF}, 627 {.diag_tx_drv = 0xFFFF, .mgnfs_mult = 0xFFFF, 628 .cpost_mult = 0xFFFF}, 629 {.diag_tx_drv = 0xFFFF, .mgnfs_mult = 0xFFFF, 630 .cpost_mult = 0xFFFF} 631 } 632 }; 633 634 static const char *cdns_torrent_get_phy_type(enum cdns_torrent_phy_type phy_type) 635 { 636 switch (phy_type) { 637 case TYPE_DP: 638 return "DisplayPort"; 639 case TYPE_PCIE: 640 return "PCIe"; 641 case TYPE_SGMII: 642 return "SGMII"; 643 case TYPE_QSGMII: 644 return "QSGMII"; 645 case TYPE_USB: 646 return "USB"; 647 default: 648 return "None"; 649 } 650 } 651 652 /* 653 * Set registers responsible for enabling and configuring SSC, with second and 654 * third register values provided by parameters. 655 */ 656 static 657 void cdns_torrent_dp_enable_ssc_19_2mhz(struct cdns_torrent_phy *cdns_phy, 658 u32 ctrl2_val, u32 ctrl3_val) 659 { 660 struct regmap *regmap = cdns_phy->regmap_common_cdb; 661 662 cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL1_M0, 0x0001); 663 cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL1_M0, ctrl2_val); 664 cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL1_M0, ctrl3_val); 665 cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL4_M0, 0x0003); 666 cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL1_M0, 0x0001); 667 cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL1_M0, ctrl2_val); 668 cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL1_M0, ctrl3_val); 669 cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL4_M0, 0x0003); 670 } 671 672 static 673 void cdns_torrent_dp_pma_cmn_vco_cfg_19_2mhz(struct cdns_torrent_phy *cdns_phy, 674 u32 rate, bool ssc) 675 { 676 struct regmap *regmap = cdns_phy->regmap_common_cdb; 677 678 /* Assumes 19.2 MHz refclock */ 679 switch (rate) { 680 /* Setting VCO for 10.8GHz */ 681 case 2700: 682 case 5400: 683 cdns_torrent_phy_write(regmap, CMN_PLL0_INTDIV_M0, 0x0119); 684 cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVL_M0, 0x4000); 685 cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVH_M0, 0x0002); 686 cdns_torrent_phy_write(regmap, CMN_PLL0_HIGH_THR_M0, 0x00BC); 687 cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CTRL_M0, 0x0012); 688 cdns_torrent_phy_write(regmap, CMN_PLL1_INTDIV_M0, 0x0119); 689 cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVL_M0, 0x4000); 690 cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVH_M0, 0x0002); 691 cdns_torrent_phy_write(regmap, CMN_PLL1_HIGH_THR_M0, 0x00BC); 692 cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CTRL_M0, 0x0012); 693 if (ssc) 694 cdns_torrent_dp_enable_ssc_19_2mhz(cdns_phy, 0x033A, 0x006A); 695 break; 696 /* Setting VCO for 9.72GHz */ 697 case 1620: 698 case 2430: 699 case 3240: 700 cdns_torrent_phy_write(regmap, CMN_PLL0_INTDIV_M0, 0x01FA); 701 cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVL_M0, 0x4000); 702 cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVH_M0, 0x0002); 703 cdns_torrent_phy_write(regmap, CMN_PLL0_HIGH_THR_M0, 0x0152); 704 cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CTRL_M0, 0x0002); 705 cdns_torrent_phy_write(regmap, CMN_PLL1_INTDIV_M0, 0x01FA); 706 cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVL_M0, 0x4000); 707 cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVH_M0, 0x0002); 708 cdns_torrent_phy_write(regmap, CMN_PLL1_HIGH_THR_M0, 0x0152); 709 cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CTRL_M0, 0x0002); 710 if (ssc) 711 cdns_torrent_dp_enable_ssc_19_2mhz(cdns_phy, 0x05DD, 0x0069); 712 break; 713 /* Setting VCO for 8.64GHz */ 714 case 2160: 715 case 4320: 716 cdns_torrent_phy_write(regmap, CMN_PLL0_INTDIV_M0, 0x01C2); 717 cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVL_M0, 0x0000); 718 cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVH_M0, 0x0002); 719 cdns_torrent_phy_write(regmap, CMN_PLL0_HIGH_THR_M0, 0x012C); 720 cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CTRL_M0, 0x0002); 721 cdns_torrent_phy_write(regmap, CMN_PLL1_INTDIV_M0, 0x01C2); 722 cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVL_M0, 0x0000); 723 cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVH_M0, 0x0002); 724 cdns_torrent_phy_write(regmap, CMN_PLL1_HIGH_THR_M0, 0x012C); 725 cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CTRL_M0, 0x0002); 726 if (ssc) 727 cdns_torrent_dp_enable_ssc_19_2mhz(cdns_phy, 0x0536, 0x0069); 728 break; 729 /* Setting VCO for 8.1GHz */ 730 case 8100: 731 cdns_torrent_phy_write(regmap, CMN_PLL0_INTDIV_M0, 0x01A5); 732 cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVL_M0, 0xE000); 733 cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVH_M0, 0x0002); 734 cdns_torrent_phy_write(regmap, CMN_PLL0_HIGH_THR_M0, 0x011A); 735 cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CTRL_M0, 0x0002); 736 cdns_torrent_phy_write(regmap, CMN_PLL1_INTDIV_M0, 0x01A5); 737 cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVL_M0, 0xE000); 738 cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVH_M0, 0x0002); 739 cdns_torrent_phy_write(regmap, CMN_PLL1_HIGH_THR_M0, 0x011A); 740 cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CTRL_M0, 0x0002); 741 if (ssc) 742 cdns_torrent_dp_enable_ssc_19_2mhz(cdns_phy, 0x04D7, 0x006A); 743 break; 744 } 745 746 if (ssc) { 747 cdns_torrent_phy_write(regmap, CMN_PLL0_VCOCAL_PLLCNT_START, 0x025E); 748 cdns_torrent_phy_write(regmap, CMN_PLL0_LOCK_PLLCNT_THR, 0x0005); 749 cdns_torrent_phy_write(regmap, CMN_PLL1_VCOCAL_PLLCNT_START, 0x025E); 750 cdns_torrent_phy_write(regmap, CMN_PLL1_LOCK_PLLCNT_THR, 0x0005); 751 } else { 752 cdns_torrent_phy_write(regmap, CMN_PLL0_VCOCAL_PLLCNT_START, 0x0260); 753 cdns_torrent_phy_write(regmap, CMN_PLL1_VCOCAL_PLLCNT_START, 0x0260); 754 /* Set reset register values to disable SSC */ 755 cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL1_M0, 0x0002); 756 cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL2_M0, 0x0000); 757 cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL3_M0, 0x0000); 758 cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL4_M0, 0x0000); 759 cdns_torrent_phy_write(regmap, CMN_PLL0_LOCK_PLLCNT_THR, 0x0003); 760 cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL1_M0, 0x0002); 761 cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL2_M0, 0x0000); 762 cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL3_M0, 0x0000); 763 cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL4_M0, 0x0000); 764 cdns_torrent_phy_write(regmap, CMN_PLL1_LOCK_PLLCNT_THR, 0x0003); 765 } 766 767 cdns_torrent_phy_write(regmap, CMN_PLL0_LOCK_REFCNT_START, 0x0099); 768 cdns_torrent_phy_write(regmap, CMN_PLL0_LOCK_PLLCNT_START, 0x0099); 769 cdns_torrent_phy_write(regmap, CMN_PLL1_LOCK_REFCNT_START, 0x0099); 770 cdns_torrent_phy_write(regmap, CMN_PLL1_LOCK_PLLCNT_START, 0x0099); 771 } 772 773 /* 774 * Set registers responsible for enabling and configuring SSC, with second 775 * register value provided by a parameter. 776 */ 777 static void cdns_torrent_dp_enable_ssc_25mhz(struct cdns_torrent_phy *cdns_phy, 778 u32 ctrl2_val) 779 { 780 struct regmap *regmap = cdns_phy->regmap_common_cdb; 781 782 cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL1_M0, 0x0001); 783 cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL1_M0, ctrl2_val); 784 cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL1_M0, 0x007F); 785 cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL4_M0, 0x0003); 786 cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL1_M0, 0x0001); 787 cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL1_M0, ctrl2_val); 788 cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL1_M0, 0x007F); 789 cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL4_M0, 0x0003); 790 } 791 792 static 793 void cdns_torrent_dp_pma_cmn_vco_cfg_25mhz(struct cdns_torrent_phy *cdns_phy, 794 u32 rate, bool ssc) 795 { 796 struct regmap *regmap = cdns_phy->regmap_common_cdb; 797 798 /* Assumes 25 MHz refclock */ 799 switch (rate) { 800 /* Setting VCO for 10.8GHz */ 801 case 2700: 802 case 5400: 803 cdns_torrent_phy_write(regmap, CMN_PLL0_INTDIV_M0, 0x01B0); 804 cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVL_M0, 0x0000); 805 cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVH_M0, 0x0002); 806 cdns_torrent_phy_write(regmap, CMN_PLL0_HIGH_THR_M0, 0x0120); 807 cdns_torrent_phy_write(regmap, CMN_PLL1_INTDIV_M0, 0x01B0); 808 cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVL_M0, 0x0000); 809 cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVH_M0, 0x0002); 810 cdns_torrent_phy_write(regmap, CMN_PLL1_HIGH_THR_M0, 0x0120); 811 if (ssc) 812 cdns_torrent_dp_enable_ssc_25mhz(cdns_phy, 0x0423); 813 break; 814 /* Setting VCO for 9.72GHz */ 815 case 1620: 816 case 2430: 817 case 3240: 818 cdns_torrent_phy_write(regmap, CMN_PLL0_INTDIV_M0, 0x0184); 819 cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVL_M0, 0xCCCD); 820 cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVH_M0, 0x0002); 821 cdns_torrent_phy_write(regmap, CMN_PLL0_HIGH_THR_M0, 0x0104); 822 cdns_torrent_phy_write(regmap, CMN_PLL1_INTDIV_M0, 0x0184); 823 cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVL_M0, 0xCCCD); 824 cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVH_M0, 0x0002); 825 cdns_torrent_phy_write(regmap, CMN_PLL1_HIGH_THR_M0, 0x0104); 826 if (ssc) 827 cdns_torrent_dp_enable_ssc_25mhz(cdns_phy, 0x03B9); 828 break; 829 /* Setting VCO for 8.64GHz */ 830 case 2160: 831 case 4320: 832 cdns_torrent_phy_write(regmap, CMN_PLL0_INTDIV_M0, 0x0159); 833 cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVL_M0, 0x999A); 834 cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVH_M0, 0x0002); 835 cdns_torrent_phy_write(regmap, CMN_PLL0_HIGH_THR_M0, 0x00E7); 836 cdns_torrent_phy_write(regmap, CMN_PLL1_INTDIV_M0, 0x0159); 837 cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVL_M0, 0x999A); 838 cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVH_M0, 0x0002); 839 cdns_torrent_phy_write(regmap, CMN_PLL1_HIGH_THR_M0, 0x00E7); 840 if (ssc) 841 cdns_torrent_dp_enable_ssc_25mhz(cdns_phy, 0x034F); 842 break; 843 /* Setting VCO for 8.1GHz */ 844 case 8100: 845 cdns_torrent_phy_write(regmap, CMN_PLL0_INTDIV_M0, 0x0144); 846 cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVL_M0, 0x0000); 847 cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVH_M0, 0x0002); 848 cdns_torrent_phy_write(regmap, CMN_PLL0_HIGH_THR_M0, 0x00D8); 849 cdns_torrent_phy_write(regmap, CMN_PLL1_INTDIV_M0, 0x0144); 850 cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVL_M0, 0x0000); 851 cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVH_M0, 0x0002); 852 cdns_torrent_phy_write(regmap, CMN_PLL1_HIGH_THR_M0, 0x00D8); 853 if (ssc) 854 cdns_torrent_dp_enable_ssc_25mhz(cdns_phy, 0x031A); 855 break; 856 } 857 858 cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CTRL_M0, 0x0002); 859 cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CTRL_M0, 0x0002); 860 861 if (ssc) { 862 cdns_torrent_phy_write(regmap, 863 CMN_PLL0_VCOCAL_PLLCNT_START, 0x0315); 864 cdns_torrent_phy_write(regmap, 865 CMN_PLL0_LOCK_PLLCNT_THR, 0x0005); 866 cdns_torrent_phy_write(regmap, 867 CMN_PLL1_VCOCAL_PLLCNT_START, 0x0315); 868 cdns_torrent_phy_write(regmap, 869 CMN_PLL1_LOCK_PLLCNT_THR, 0x0005); 870 } else { 871 cdns_torrent_phy_write(regmap, 872 CMN_PLL0_VCOCAL_PLLCNT_START, 0x0317); 873 cdns_torrent_phy_write(regmap, 874 CMN_PLL1_VCOCAL_PLLCNT_START, 0x0317); 875 /* Set reset register values to disable SSC */ 876 cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL1_M0, 0x0002); 877 cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL2_M0, 0x0000); 878 cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL3_M0, 0x0000); 879 cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL4_M0, 0x0000); 880 cdns_torrent_phy_write(regmap, 881 CMN_PLL0_LOCK_PLLCNT_THR, 0x0003); 882 cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL1_M0, 0x0002); 883 cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL2_M0, 0x0000); 884 cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL3_M0, 0x0000); 885 cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL4_M0, 0x0000); 886 cdns_torrent_phy_write(regmap, 887 CMN_PLL1_LOCK_PLLCNT_THR, 0x0003); 888 } 889 890 cdns_torrent_phy_write(regmap, CMN_PLL0_LOCK_REFCNT_START, 0x00C7); 891 cdns_torrent_phy_write(regmap, CMN_PLL0_LOCK_PLLCNT_START, 0x00C7); 892 cdns_torrent_phy_write(regmap, CMN_PLL1_LOCK_REFCNT_START, 0x00C7); 893 cdns_torrent_phy_write(regmap, CMN_PLL1_LOCK_PLLCNT_START, 0x00C7); 894 } 895 896 static 897 void cdns_torrent_dp_pma_cmn_vco_cfg_100mhz(struct cdns_torrent_phy *cdns_phy, 898 u32 rate, bool ssc) 899 { 900 struct regmap *regmap = cdns_phy->regmap_common_cdb; 901 902 /* Assumes 100 MHz refclock */ 903 switch (rate) { 904 /* Setting VCO for 10.8GHz */ 905 case 2700: 906 case 5400: 907 if (cdns_phy->dp_pll & DP_PLL0) 908 cdns_torrent_phy_write(regmap, CMN_PLL0_DSM_FBH_OVRD_M0, 0x0022); 909 910 if (cdns_phy->dp_pll & DP_PLL1) { 911 cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CP_PADJ_M0, 0x0028); 912 cdns_torrent_phy_write(regmap, CMN_PLL1_DSM_FBH_OVRD_M0, 0x0022); 913 cdns_torrent_phy_write(regmap, CMN_PLL1_DSM_FBL_OVRD_M0, 0x000C); 914 } 915 break; 916 /* Setting VCO for 9.72GHz */ 917 case 1620: 918 case 2430: 919 case 3240: 920 if (cdns_phy->dp_pll & DP_PLL0) { 921 cdns_torrent_phy_write(regmap, CMN_PLL0_DSM_DIAG_M0, 0x0004); 922 cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CP_PADJ_M0, 0x0509); 923 cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CP_IADJ_M0, 0x0F00); 924 cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_FILT_PADJ_M0, 0x0F08); 925 cdns_torrent_phy_write(regmap, CMN_PLL0_INTDIV_M0, 0x0061); 926 cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVL_M0, 0x3333); 927 cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVH_M0, 0x0002); 928 cdns_torrent_phy_write(regmap, CMN_PLL0_HIGH_THR_M0, 0x0042); 929 cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CTRL_M0, 0x0002); 930 } 931 if (cdns_phy->dp_pll & DP_PLL1) { 932 cdns_torrent_phy_write(regmap, CMN_PLL1_DSM_DIAG_M0, 0x0004); 933 cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CP_PADJ_M0, 0x0509); 934 cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CP_IADJ_M0, 0x0F00); 935 cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_FILT_PADJ_M0, 0x0F08); 936 cdns_torrent_phy_write(regmap, CMN_PLL1_INTDIV_M0, 0x0061); 937 cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVL_M0, 0x3333); 938 cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVH_M0, 0x0002); 939 cdns_torrent_phy_write(regmap, CMN_PLL1_HIGH_THR_M0, 0x0042); 940 cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CTRL_M0, 0x0002); 941 } 942 break; 943 /* Setting VCO for 8.64GHz */ 944 case 2160: 945 case 4320: 946 if (cdns_phy->dp_pll & DP_PLL0) { 947 cdns_torrent_phy_write(regmap, CMN_PLL0_DSM_DIAG_M0, 0x0004); 948 cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CP_PADJ_M0, 0x0509); 949 cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CP_IADJ_M0, 0x0F00); 950 cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_FILT_PADJ_M0, 0x0F08); 951 cdns_torrent_phy_write(regmap, CMN_PLL0_INTDIV_M0, 0x0056); 952 cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVL_M0, 0x6666); 953 cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVH_M0, 0x0002); 954 cdns_torrent_phy_write(regmap, CMN_PLL0_HIGH_THR_M0, 0x003A); 955 cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CTRL_M0, 0x0002); 956 } 957 if (cdns_phy->dp_pll & DP_PLL1) { 958 cdns_torrent_phy_write(regmap, CMN_PLL1_DSM_DIAG_M0, 0x0004); 959 cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CP_PADJ_M0, 0x0509); 960 cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CP_IADJ_M0, 0x0F00); 961 cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_FILT_PADJ_M0, 0x0F08); 962 cdns_torrent_phy_write(regmap, CMN_PLL1_INTDIV_M0, 0x0056); 963 cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVL_M0, 0x6666); 964 cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVH_M0, 0x0002); 965 cdns_torrent_phy_write(regmap, CMN_PLL1_HIGH_THR_M0, 0x003A); 966 cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CTRL_M0, 0x0002); 967 } 968 break; 969 /* Setting VCO for 8.1GHz */ 970 case 8100: 971 if (cdns_phy->dp_pll & DP_PLL0) { 972 cdns_torrent_phy_write(regmap, CMN_PLL0_DSM_DIAG_M0, 0x0004); 973 cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CP_PADJ_M0, 0x0509); 974 cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CP_IADJ_M0, 0x0F00); 975 cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_FILT_PADJ_M0, 0x0F08); 976 cdns_torrent_phy_write(regmap, CMN_PLL0_INTDIV_M0, 0x0051); 977 cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVH_M0, 0x0002); 978 cdns_torrent_phy_write(regmap, CMN_PLL0_HIGH_THR_M0, 0x0036); 979 cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CTRL_M0, 0x0002); 980 } 981 if (cdns_phy->dp_pll & DP_PLL1) { 982 cdns_torrent_phy_write(regmap, CMN_PLL1_DSM_DIAG_M0, 0x0004); 983 cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CP_PADJ_M0, 0x0509); 984 cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CP_IADJ_M0, 0x0F00); 985 cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_FILT_PADJ_M0, 0x0F08); 986 cdns_torrent_phy_write(regmap, CMN_PLL1_INTDIV_M0, 0x0051); 987 cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVH_M0, 0x0002); 988 cdns_torrent_phy_write(regmap, CMN_PLL1_HIGH_THR_M0, 0x0036); 989 cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CTRL_M0, 0x0002); 990 } 991 break; 992 } 993 } 994 995 /* Set PLL used for DP configuration */ 996 static int cdns_torrent_dp_get_pll(struct cdns_torrent_phy *cdns_phy, 997 enum cdns_torrent_phy_type phy_t2) 998 { 999 switch (phy_t2) { 1000 case TYPE_PCIE: 1001 case TYPE_USB: 1002 cdns_phy->dp_pll = DP_PLL1; 1003 break; 1004 case TYPE_SGMII: 1005 case TYPE_QSGMII: 1006 cdns_phy->dp_pll = DP_PLL0; 1007 break; 1008 case TYPE_NONE: 1009 cdns_phy->dp_pll = DP_PLL0 | DP_PLL1; 1010 break; 1011 default: 1012 dev_err(cdns_phy->dev, "Unsupported PHY configuration\n"); 1013 return -EINVAL; 1014 } 1015 1016 return 0; 1017 } 1018 1019 /* 1020 * Enable or disable PLL for selected lanes. 1021 */ 1022 static int cdns_torrent_dp_set_pll_en(struct cdns_torrent_phy *cdns_phy, 1023 struct cdns_torrent_inst *inst, 1024 struct phy_configure_opts_dp *dp, 1025 bool enable) 1026 { 1027 struct regmap *regmap = cdns_phy->regmap_dptx_phy_reg; 1028 u32 rd_val, pll_ack_val; 1029 int ret; 1030 1031 /* 1032 * Used to determine, which bits to check for or enable in 1033 * PHY_PMA_XCVR_PLLCLK_EN register. 1034 */ 1035 u32 pll_bits; 1036 /* Used to enable or disable lanes. */ 1037 u32 pll_val; 1038 1039 /* Select values of registers and mask, depending on enabled lane count. */ 1040 pll_val = cdns_torrent_dp_read(regmap, PHY_PMA_XCVR_PLLCLK_EN); 1041 1042 if (enable) { 1043 pll_bits = ((1 << dp->lanes) - 1); 1044 pll_val |= pll_bits; 1045 pll_ack_val = pll_bits; 1046 } else { 1047 pll_bits = ((1 << inst->num_lanes) - 1); 1048 pll_val &= (~pll_bits); 1049 pll_ack_val = 0; 1050 } 1051 1052 cdns_torrent_dp_write(regmap, PHY_PMA_XCVR_PLLCLK_EN, pll_val); 1053 1054 /* Wait for acknowledgment from PHY. */ 1055 ret = regmap_read_poll_timeout(regmap, 1056 PHY_PMA_XCVR_PLLCLK_EN_ACK, 1057 rd_val, 1058 (rd_val & pll_bits) == pll_ack_val, 1059 0, POLL_TIMEOUT_US); 1060 ndelay(100); 1061 return ret; 1062 } 1063 1064 static int cdns_torrent_dp_set_power_state(struct cdns_torrent_phy *cdns_phy, 1065 struct cdns_torrent_inst *inst, 1066 u32 num_lanes, 1067 enum phy_powerstate powerstate) 1068 { 1069 /* Register value for power state for a single byte. */ 1070 u32 value_part, i; 1071 u32 value = 0; 1072 u32 mask = 0; 1073 u32 read_val; 1074 int ret; 1075 struct regmap *regmap = cdns_phy->regmap_dptx_phy_reg; 1076 1077 switch (powerstate) { 1078 case (POWERSTATE_A0): 1079 value_part = 0x01U; 1080 break; 1081 case (POWERSTATE_A2): 1082 value_part = 0x04U; 1083 break; 1084 default: 1085 /* Powerstate A3 */ 1086 value_part = 0x08U; 1087 break; 1088 } 1089 1090 /* Select values of registers and mask, depending on enabled lane count. */ 1091 1092 for (i = 0; i < num_lanes; i++) { 1093 value |= (value_part << PHY_POWER_STATE_LN(i)); 1094 mask |= (PMA_XCVR_POWER_STATE_REQ_LN_MASK << PHY_POWER_STATE_LN(i)); 1095 } 1096 1097 /* Set power state A<n>. */ 1098 cdns_torrent_dp_write(regmap, PHY_PMA_XCVR_POWER_STATE_REQ, value); 1099 /* Wait, until PHY acknowledges power state completion. */ 1100 ret = regmap_read_poll_timeout(regmap, PHY_PMA_XCVR_POWER_STATE_ACK, 1101 read_val, (read_val & mask) == value, 0, 1102 POLL_TIMEOUT_US); 1103 cdns_torrent_dp_write(regmap, PHY_PMA_XCVR_POWER_STATE_REQ, 0x00000000); 1104 ndelay(100); 1105 1106 return ret; 1107 } 1108 1109 static int cdns_torrent_dp_run(struct cdns_torrent_phy *cdns_phy, 1110 struct cdns_torrent_inst *inst, u32 num_lanes) 1111 { 1112 unsigned int read_val; 1113 int ret; 1114 struct regmap *regmap = cdns_phy->regmap_dptx_phy_reg; 1115 1116 /* 1117 * waiting for ACK of pma_xcvr_pllclk_en_ln_*, only for the 1118 * master lane 1119 */ 1120 ret = regmap_read_poll_timeout(regmap, PHY_PMA_XCVR_PLLCLK_EN_ACK, 1121 read_val, read_val & 1, 1122 0, POLL_TIMEOUT_US); 1123 if (ret == -ETIMEDOUT) { 1124 dev_err(cdns_phy->dev, 1125 "timeout waiting for link PLL clock enable ack\n"); 1126 return ret; 1127 } 1128 1129 ndelay(100); 1130 1131 ret = cdns_torrent_dp_set_power_state(cdns_phy, inst, num_lanes, 1132 POWERSTATE_A2); 1133 if (ret) 1134 return ret; 1135 1136 ret = cdns_torrent_dp_set_power_state(cdns_phy, inst, num_lanes, 1137 POWERSTATE_A0); 1138 1139 return ret; 1140 } 1141 1142 static int cdns_torrent_dp_wait_pma_cmn_ready(struct cdns_torrent_phy *cdns_phy) 1143 { 1144 unsigned int reg; 1145 int ret; 1146 struct regmap *regmap = cdns_phy->regmap_dptx_phy_reg; 1147 1148 ret = regmap_read_poll_timeout(regmap, PHY_PMA_CMN_READY, reg, 1149 reg & 1, 0, POLL_TIMEOUT_US); 1150 if (ret == -ETIMEDOUT) { 1151 dev_err(cdns_phy->dev, 1152 "timeout waiting for PMA common ready\n"); 1153 return -ETIMEDOUT; 1154 } 1155 1156 return 0; 1157 } 1158 1159 static void cdns_torrent_dp_pma_cmn_rate(struct cdns_torrent_phy *cdns_phy, 1160 struct cdns_torrent_inst *inst, 1161 u32 rate, u32 num_lanes) 1162 { 1163 unsigned int clk_sel_val = 0; 1164 unsigned int hsclk_div_val = 0; 1165 unsigned int i; 1166 1167 switch (rate) { 1168 case 1620: 1169 clk_sel_val = 0x0f01; 1170 hsclk_div_val = 2; 1171 break; 1172 case 2160: 1173 case 2430: 1174 case 2700: 1175 clk_sel_val = 0x0701; 1176 hsclk_div_val = 1; 1177 break; 1178 case 3240: 1179 clk_sel_val = 0x0b00; 1180 hsclk_div_val = 2; 1181 break; 1182 case 4320: 1183 case 5400: 1184 clk_sel_val = 0x0301; 1185 hsclk_div_val = 0; 1186 break; 1187 case 8100: 1188 clk_sel_val = 0x0200; 1189 hsclk_div_val = 0; 1190 break; 1191 } 1192 1193 if (cdns_phy->dp_pll & DP_PLL0) 1194 cdns_torrent_phy_write(cdns_phy->regmap_common_cdb, 1195 CMN_PDIAG_PLL0_CLK_SEL_M0, clk_sel_val); 1196 1197 if (cdns_phy->dp_pll & DP_PLL1) 1198 cdns_torrent_phy_write(cdns_phy->regmap_common_cdb, 1199 CMN_PDIAG_PLL1_CLK_SEL_M0, clk_sel_val); 1200 1201 /* PMA lane configuration to deal with multi-link operation */ 1202 for (i = 0; i < num_lanes; i++) 1203 cdns_torrent_phy_write(cdns_phy->regmap_tx_lane_cdb[inst->mlane + i], 1204 XCVR_DIAG_HSCLK_DIV, hsclk_div_val); 1205 } 1206 1207 /* 1208 * Perform register operations related to setting link rate, once powerstate is 1209 * set and PLL disable request was processed. 1210 */ 1211 static int cdns_torrent_dp_configure_rate(struct cdns_torrent_phy *cdns_phy, 1212 struct cdns_torrent_inst *inst, 1213 struct phy_configure_opts_dp *dp) 1214 { 1215 u32 read_val, field_val; 1216 int ret; 1217 1218 /* 1219 * Disable the associated PLL (cmn_pll0_en or cmn_pll1_en) before 1220 * re-programming the new data rate. 1221 */ 1222 ret = regmap_field_read(cdns_phy->phy_pma_pll_raw_ctrl, &field_val); 1223 if (ret) 1224 return ret; 1225 field_val &= ~(cdns_phy->dp_pll); 1226 regmap_field_write(cdns_phy->phy_pma_pll_raw_ctrl, field_val); 1227 1228 /* 1229 * Wait for PLL ready de-assertion. 1230 * For PLL0 - PHY_PMA_CMN_CTRL2[2] == 1 1231 * For PLL1 - PHY_PMA_CMN_CTRL2[3] == 1 1232 */ 1233 if (cdns_phy->dp_pll & DP_PLL0) { 1234 ret = regmap_field_read_poll_timeout(cdns_phy->phy_pma_cmn_ctrl_2, 1235 read_val, 1236 ((read_val >> 2) & 0x01) != 0, 1237 0, POLL_TIMEOUT_US); 1238 if (ret) 1239 return ret; 1240 } 1241 1242 if ((cdns_phy->dp_pll & DP_PLL1) && cdns_phy->nsubnodes != 1) { 1243 ret = regmap_field_read_poll_timeout(cdns_phy->phy_pma_cmn_ctrl_2, 1244 read_val, 1245 ((read_val >> 3) & 0x01) != 0, 1246 0, POLL_TIMEOUT_US); 1247 if (ret) 1248 return ret; 1249 } 1250 ndelay(200); 1251 1252 /* DP Rate Change - VCO Output settings. */ 1253 if (cdns_phy->ref_clk_rate == CLK_19_2_MHZ) 1254 /* PMA common configuration 19.2MHz */ 1255 cdns_torrent_dp_pma_cmn_vco_cfg_19_2mhz(cdns_phy, dp->link_rate, dp->ssc); 1256 else if (cdns_phy->ref_clk_rate == CLK_25_MHZ) 1257 /* PMA common configuration 25MHz */ 1258 cdns_torrent_dp_pma_cmn_vco_cfg_25mhz(cdns_phy, dp->link_rate, dp->ssc); 1259 else if (cdns_phy->ref_clk_rate == CLK_100_MHZ) 1260 /* PMA common configuration 100MHz */ 1261 cdns_torrent_dp_pma_cmn_vco_cfg_100mhz(cdns_phy, dp->link_rate, dp->ssc); 1262 1263 cdns_torrent_dp_pma_cmn_rate(cdns_phy, inst, dp->link_rate, dp->lanes); 1264 1265 /* Enable the associated PLL (cmn_pll0_en or cmn_pll1_en) */ 1266 ret = regmap_field_read(cdns_phy->phy_pma_pll_raw_ctrl, &field_val); 1267 if (ret) 1268 return ret; 1269 field_val |= cdns_phy->dp_pll; 1270 regmap_field_write(cdns_phy->phy_pma_pll_raw_ctrl, field_val); 1271 1272 /* 1273 * Wait for PLL ready assertion. 1274 * For PLL0 - PHY_PMA_CMN_CTRL2[0] == 1 1275 * For PLL1 - PHY_PMA_CMN_CTRL2[1] == 1 1276 */ 1277 if (cdns_phy->dp_pll & DP_PLL0) { 1278 ret = regmap_field_read_poll_timeout(cdns_phy->phy_pma_cmn_ctrl_2, 1279 read_val, 1280 (read_val & 0x01) != 0, 1281 0, POLL_TIMEOUT_US); 1282 if (ret) 1283 return ret; 1284 } 1285 1286 if ((cdns_phy->dp_pll & DP_PLL1) && cdns_phy->nsubnodes != 1) 1287 ret = regmap_field_read_poll_timeout(cdns_phy->phy_pma_cmn_ctrl_2, 1288 read_val, 1289 ((read_val >> 1) & 0x01) != 0, 1290 0, POLL_TIMEOUT_US); 1291 1292 return ret; 1293 } 1294 1295 /* 1296 * Verify, that parameters to configure PHY with are correct. 1297 */ 1298 static int cdns_torrent_dp_verify_config(struct cdns_torrent_inst *inst, 1299 struct phy_configure_opts_dp *dp) 1300 { 1301 u8 i; 1302 1303 /* If changing link rate was required, verify it's supported. */ 1304 if (dp->set_rate) { 1305 switch (dp->link_rate) { 1306 case 1620: 1307 case 2160: 1308 case 2430: 1309 case 2700: 1310 case 3240: 1311 case 4320: 1312 case 5400: 1313 case 8100: 1314 /* valid bit rate */ 1315 break; 1316 default: 1317 return -EINVAL; 1318 } 1319 } 1320 1321 /* Verify lane count. */ 1322 switch (dp->lanes) { 1323 case 1: 1324 case 2: 1325 case 4: 1326 /* valid lane count. */ 1327 break; 1328 default: 1329 return -EINVAL; 1330 } 1331 1332 /* Check against actual number of PHY's lanes. */ 1333 if (dp->lanes > inst->num_lanes) 1334 return -EINVAL; 1335 1336 /* 1337 * If changing voltages is required, check swing and pre-emphasis 1338 * levels, per-lane. 1339 */ 1340 if (dp->set_voltages) { 1341 /* Lane count verified previously. */ 1342 for (i = 0; i < dp->lanes; i++) { 1343 if (dp->voltage[i] > 3 || dp->pre[i] > 3) 1344 return -EINVAL; 1345 1346 /* Sum of voltage swing and pre-emphasis levels cannot 1347 * exceed 3. 1348 */ 1349 if (dp->voltage[i] + dp->pre[i] > 3) 1350 return -EINVAL; 1351 } 1352 } 1353 1354 return 0; 1355 } 1356 1357 /* Set power state A0 and PLL clock enable to 0 on enabled lanes. */ 1358 static void cdns_torrent_dp_set_a0_pll(struct cdns_torrent_phy *cdns_phy, 1359 struct cdns_torrent_inst *inst, 1360 u32 num_lanes) 1361 { 1362 struct regmap *regmap = cdns_phy->regmap_dptx_phy_reg; 1363 u32 pwr_state = cdns_torrent_dp_read(regmap, 1364 PHY_PMA_XCVR_POWER_STATE_REQ); 1365 u32 pll_clk_en = cdns_torrent_dp_read(regmap, 1366 PHY_PMA_XCVR_PLLCLK_EN); 1367 u32 i; 1368 1369 for (i = 0; i < num_lanes; i++) { 1370 pwr_state &= ~(PMA_XCVR_POWER_STATE_REQ_LN_MASK 1371 << PHY_POWER_STATE_LN(inst->mlane + i)); 1372 1373 pll_clk_en &= ~(0x01U << (inst->mlane + i)); 1374 } 1375 1376 cdns_torrent_dp_write(regmap, PHY_PMA_XCVR_POWER_STATE_REQ, pwr_state); 1377 cdns_torrent_dp_write(regmap, PHY_PMA_XCVR_PLLCLK_EN, pll_clk_en); 1378 } 1379 1380 /* Configure lane count as required. */ 1381 static int cdns_torrent_dp_set_lanes(struct cdns_torrent_phy *cdns_phy, 1382 struct cdns_torrent_inst *inst, 1383 struct phy_configure_opts_dp *dp) 1384 { 1385 u32 value, i; 1386 int ret; 1387 struct regmap *regmap = cdns_phy->regmap_dptx_phy_reg; 1388 u8 lane_mask = (1 << dp->lanes) - 1; 1389 u8 pma_tx_elec_idle_mask = 0; 1390 u32 clane = inst->mlane; 1391 1392 lane_mask <<= clane; 1393 1394 value = cdns_torrent_dp_read(regmap, PHY_RESET); 1395 /* clear pma_tx_elec_idle_ln_* bits. */ 1396 pma_tx_elec_idle_mask = ((1 << inst->num_lanes) - 1) << clane; 1397 1398 pma_tx_elec_idle_mask <<= PMA_TX_ELEC_IDLE_SHIFT; 1399 1400 value &= ~pma_tx_elec_idle_mask; 1401 1402 /* Assert pma_tx_elec_idle_ln_* for disabled lanes. */ 1403 value |= ((~lane_mask) << PMA_TX_ELEC_IDLE_SHIFT) & 1404 pma_tx_elec_idle_mask; 1405 1406 cdns_torrent_dp_write(regmap, PHY_RESET, value); 1407 1408 /* reset the link by asserting master lane phy_l0*_reset_n low */ 1409 cdns_torrent_dp_write(regmap, PHY_RESET, 1410 value & (~(1 << clane))); 1411 1412 /* 1413 * Assert lane reset on unused lanes and master lane so they remain in reset 1414 * and powered down when re-enabling the link 1415 */ 1416 for (i = 0; i < inst->num_lanes; i++) 1417 value &= (~(1 << (clane + i))); 1418 1419 for (i = 1; i < inst->num_lanes; i++) 1420 value |= ((1 << (clane + i)) & lane_mask); 1421 1422 cdns_torrent_dp_write(regmap, PHY_RESET, value); 1423 1424 cdns_torrent_dp_set_a0_pll(cdns_phy, inst, dp->lanes); 1425 1426 /* release phy_l0*_reset_n based on used laneCount */ 1427 for (i = 0; i < inst->num_lanes; i++) 1428 value &= (~(1 << (clane + i))); 1429 1430 for (i = 0; i < inst->num_lanes; i++) 1431 value |= ((1 << (clane + i)) & lane_mask); 1432 1433 cdns_torrent_dp_write(regmap, PHY_RESET, value); 1434 1435 /* Wait, until PHY gets ready after releasing PHY reset signal. */ 1436 ret = cdns_torrent_dp_wait_pma_cmn_ready(cdns_phy); 1437 if (ret) 1438 return ret; 1439 1440 ndelay(100); 1441 1442 /* release pma_xcvr_pllclk_en_ln_*, only for the master lane */ 1443 value = cdns_torrent_dp_read(regmap, PHY_PMA_XCVR_PLLCLK_EN); 1444 value |= (1 << clane); 1445 cdns_torrent_dp_write(regmap, PHY_PMA_XCVR_PLLCLK_EN, value); 1446 1447 ret = cdns_torrent_dp_run(cdns_phy, inst, dp->lanes); 1448 1449 return ret; 1450 } 1451 1452 /* Configure link rate as required. */ 1453 static int cdns_torrent_dp_set_rate(struct cdns_torrent_phy *cdns_phy, 1454 struct cdns_torrent_inst *inst, 1455 struct phy_configure_opts_dp *dp) 1456 { 1457 int ret; 1458 1459 ret = cdns_torrent_dp_set_power_state(cdns_phy, inst, dp->lanes, 1460 POWERSTATE_A3); 1461 if (ret) 1462 return ret; 1463 ret = cdns_torrent_dp_set_pll_en(cdns_phy, inst, dp, false); 1464 if (ret) 1465 return ret; 1466 ndelay(200); 1467 1468 ret = cdns_torrent_dp_configure_rate(cdns_phy, inst, dp); 1469 if (ret) 1470 return ret; 1471 ndelay(200); 1472 1473 ret = cdns_torrent_dp_set_pll_en(cdns_phy, inst, dp, true); 1474 if (ret) 1475 return ret; 1476 ret = cdns_torrent_dp_set_power_state(cdns_phy, inst, dp->lanes, 1477 POWERSTATE_A2); 1478 if (ret) 1479 return ret; 1480 ret = cdns_torrent_dp_set_power_state(cdns_phy, inst, dp->lanes, 1481 POWERSTATE_A0); 1482 if (ret) 1483 return ret; 1484 ndelay(900); 1485 1486 return ret; 1487 } 1488 1489 /* Configure voltage swing and pre-emphasis for all enabled lanes. */ 1490 static void cdns_torrent_dp_set_voltages(struct cdns_torrent_phy *cdns_phy, 1491 struct cdns_torrent_inst *inst, 1492 struct phy_configure_opts_dp *dp) 1493 { 1494 u8 lane; 1495 u16 val; 1496 1497 for (lane = 0; lane < dp->lanes; lane++) { 1498 val = cdns_torrent_phy_read(cdns_phy->regmap_tx_lane_cdb[inst->mlane + lane], 1499 TX_DIAG_ACYA); 1500 /* 1501 * Write 1 to register bit TX_DIAG_ACYA[0] to freeze the 1502 * current state of the analog TX driver. 1503 */ 1504 val |= TX_DIAG_ACYA_HBDC_MASK; 1505 cdns_torrent_phy_write(cdns_phy->regmap_tx_lane_cdb[inst->mlane + lane], 1506 TX_DIAG_ACYA, val); 1507 1508 cdns_torrent_phy_write(cdns_phy->regmap_tx_lane_cdb[inst->mlane + lane], 1509 TX_TXCC_CTRL, 0x08A4); 1510 val = vltg_coeff[dp->voltage[lane]][dp->pre[lane]].diag_tx_drv; 1511 cdns_torrent_phy_write(cdns_phy->regmap_tx_lane_cdb[inst->mlane + lane], 1512 DRV_DIAG_TX_DRV, val); 1513 val = vltg_coeff[dp->voltage[lane]][dp->pre[lane]].mgnfs_mult; 1514 cdns_torrent_phy_write(cdns_phy->regmap_tx_lane_cdb[inst->mlane + lane], 1515 TX_TXCC_MGNFS_MULT_000, 1516 val); 1517 val = vltg_coeff[dp->voltage[lane]][dp->pre[lane]].cpost_mult; 1518 cdns_torrent_phy_write(cdns_phy->regmap_tx_lane_cdb[inst->mlane + lane], 1519 TX_TXCC_CPOST_MULT_00, 1520 val); 1521 1522 val = cdns_torrent_phy_read(cdns_phy->regmap_tx_lane_cdb[inst->mlane + lane], 1523 TX_DIAG_ACYA); 1524 /* 1525 * Write 0 to register bit TX_DIAG_ACYA[0] to allow the state of 1526 * analog TX driver to reflect the new programmed one. 1527 */ 1528 val &= ~TX_DIAG_ACYA_HBDC_MASK; 1529 cdns_torrent_phy_write(cdns_phy->regmap_tx_lane_cdb[inst->mlane + lane], 1530 TX_DIAG_ACYA, val); 1531 } 1532 }; 1533 1534 static int cdns_torrent_dp_configure(struct phy *phy, 1535 union phy_configure_opts *opts) 1536 { 1537 struct cdns_torrent_inst *inst = phy_get_drvdata(phy); 1538 struct cdns_torrent_phy *cdns_phy = dev_get_drvdata(phy->dev.parent); 1539 int ret; 1540 1541 ret = cdns_torrent_dp_verify_config(inst, &opts->dp); 1542 if (ret) { 1543 dev_err(&phy->dev, "invalid params for phy configure\n"); 1544 return ret; 1545 } 1546 1547 if (opts->dp.set_lanes) { 1548 ret = cdns_torrent_dp_set_lanes(cdns_phy, inst, &opts->dp); 1549 if (ret) { 1550 dev_err(&phy->dev, "cdns_torrent_dp_set_lanes failed\n"); 1551 return ret; 1552 } 1553 } 1554 1555 if (opts->dp.set_rate) { 1556 ret = cdns_torrent_dp_set_rate(cdns_phy, inst, &opts->dp); 1557 if (ret) { 1558 dev_err(&phy->dev, "cdns_torrent_dp_set_rate failed\n"); 1559 return ret; 1560 } 1561 } 1562 1563 if (opts->dp.set_voltages) 1564 cdns_torrent_dp_set_voltages(cdns_phy, inst, &opts->dp); 1565 1566 return ret; 1567 } 1568 1569 static int cdns_torrent_phy_on(struct phy *phy) 1570 { 1571 struct cdns_torrent_inst *inst = phy_get_drvdata(phy); 1572 struct cdns_torrent_phy *cdns_phy = dev_get_drvdata(phy->dev.parent); 1573 u32 read_val; 1574 int ret; 1575 1576 if (cdns_phy->nsubnodes == 1) { 1577 /* Take the PHY lane group out of reset */ 1578 reset_control_deassert(inst->lnk_rst); 1579 1580 /* Take the PHY out of reset */ 1581 ret = reset_control_deassert(cdns_phy->phy_rst); 1582 if (ret) 1583 return ret; 1584 } 1585 1586 /* 1587 * Wait for cmn_ready assertion 1588 * PHY_PMA_CMN_CTRL1[0] == 1 1589 */ 1590 ret = regmap_field_read_poll_timeout(cdns_phy->phy_pma_cmn_ctrl_1, 1591 read_val, read_val, 1000, 1592 PLL_LOCK_TIMEOUT); 1593 if (ret) { 1594 dev_err(cdns_phy->dev, "Timeout waiting for CMN ready\n"); 1595 return ret; 1596 } 1597 1598 if (inst->phy_type == TYPE_PCIE || inst->phy_type == TYPE_USB) { 1599 ret = regmap_field_read_poll_timeout(cdns_phy->phy_pcs_iso_link_ctrl_1[inst->mlane], 1600 read_val, !read_val, 1000, 1601 PLL_LOCK_TIMEOUT); 1602 if (ret == -ETIMEDOUT) { 1603 dev_err(cdns_phy->dev, "Timeout waiting for PHY status ready\n"); 1604 return ret; 1605 } 1606 } 1607 1608 return 0; 1609 } 1610 1611 static int cdns_torrent_phy_off(struct phy *phy) 1612 { 1613 struct cdns_torrent_inst *inst = phy_get_drvdata(phy); 1614 struct cdns_torrent_phy *cdns_phy = dev_get_drvdata(phy->dev.parent); 1615 int ret; 1616 1617 if (cdns_phy->nsubnodes != 1) 1618 return 0; 1619 1620 ret = reset_control_assert(cdns_phy->phy_rst); 1621 if (ret) 1622 return ret; 1623 1624 return reset_control_assert(inst->lnk_rst); 1625 } 1626 1627 static void cdns_torrent_dp_common_init(struct cdns_torrent_phy *cdns_phy, 1628 struct cdns_torrent_inst *inst) 1629 { 1630 struct regmap *regmap = cdns_phy->regmap_dptx_phy_reg; 1631 unsigned char lane_bits; 1632 u32 val; 1633 1634 cdns_torrent_dp_write(regmap, PHY_AUX_CTRL, 0x0003); /* enable AUX */ 1635 1636 /* 1637 * Set lines power state to A0 1638 * Set lines pll clk enable to 0 1639 */ 1640 cdns_torrent_dp_set_a0_pll(cdns_phy, inst, inst->num_lanes); 1641 1642 /* 1643 * release phy_l0*_reset_n and pma_tx_elec_idle_ln_* based on 1644 * used lanes 1645 */ 1646 lane_bits = (1 << inst->num_lanes) - 1; 1647 1648 val = cdns_torrent_dp_read(regmap, PHY_RESET); 1649 val |= (0xF & lane_bits); 1650 val &= ~(lane_bits << 4); 1651 cdns_torrent_dp_write(regmap, PHY_RESET, val); 1652 1653 /* release pma_xcvr_pllclk_en_ln_*, only for the master lane */ 1654 val = cdns_torrent_dp_read(regmap, PHY_PMA_XCVR_PLLCLK_EN); 1655 val |= 1; 1656 cdns_torrent_dp_write(regmap, PHY_PMA_XCVR_PLLCLK_EN, val); 1657 1658 /* 1659 * PHY PMA registers configuration functions 1660 * Initialize PHY with max supported link rate, without SSC. 1661 */ 1662 if (cdns_phy->ref_clk_rate == CLK_19_2_MHZ) 1663 cdns_torrent_dp_pma_cmn_vco_cfg_19_2mhz(cdns_phy, 1664 cdns_phy->max_bit_rate, 1665 false); 1666 else if (cdns_phy->ref_clk_rate == CLK_25_MHZ) 1667 cdns_torrent_dp_pma_cmn_vco_cfg_25mhz(cdns_phy, 1668 cdns_phy->max_bit_rate, 1669 false); 1670 else if (cdns_phy->ref_clk_rate == CLK_100_MHZ) 1671 cdns_torrent_dp_pma_cmn_vco_cfg_100mhz(cdns_phy, 1672 cdns_phy->max_bit_rate, 1673 false); 1674 1675 cdns_torrent_dp_pma_cmn_rate(cdns_phy, inst, cdns_phy->max_bit_rate, 1676 inst->num_lanes); 1677 1678 /* take out of reset */ 1679 regmap_field_write(cdns_phy->phy_reset_ctrl, 0x1); 1680 } 1681 1682 static int cdns_torrent_dp_start(struct cdns_torrent_phy *cdns_phy, 1683 struct cdns_torrent_inst *inst, 1684 struct phy *phy) 1685 { 1686 int ret; 1687 1688 ret = cdns_torrent_phy_on(phy); 1689 if (ret) 1690 return ret; 1691 1692 ret = cdns_torrent_dp_wait_pma_cmn_ready(cdns_phy); 1693 if (ret) 1694 return ret; 1695 1696 ret = cdns_torrent_dp_run(cdns_phy, inst, inst->num_lanes); 1697 1698 return ret; 1699 } 1700 1701 static int cdns_torrent_dp_init(struct phy *phy) 1702 { 1703 struct cdns_torrent_inst *inst = phy_get_drvdata(phy); 1704 struct cdns_torrent_phy *cdns_phy = dev_get_drvdata(phy->dev.parent); 1705 int ret; 1706 1707 switch (cdns_phy->ref_clk_rate) { 1708 case CLK_19_2_MHZ: 1709 case CLK_25_MHZ: 1710 case CLK_100_MHZ: 1711 /* Valid Ref Clock Rate */ 1712 break; 1713 default: 1714 dev_err(cdns_phy->dev, "Unsupported Ref Clock Rate\n"); 1715 return -EINVAL; 1716 } 1717 1718 ret = cdns_torrent_dp_get_pll(cdns_phy, TYPE_NONE); 1719 if (ret) 1720 return ret; 1721 1722 cdns_torrent_dp_common_init(cdns_phy, inst); 1723 1724 return cdns_torrent_dp_start(cdns_phy, inst, phy); 1725 } 1726 1727 static int cdns_torrent_dp_multilink_init(struct cdns_torrent_phy *cdns_phy, 1728 struct cdns_torrent_inst *inst, 1729 struct phy *phy) 1730 { 1731 if (cdns_phy->ref_clk_rate != CLK_100_MHZ) { 1732 dev_err(cdns_phy->dev, "Unsupported Ref Clock Rate\n"); 1733 return -EINVAL; 1734 } 1735 1736 cdns_torrent_dp_common_init(cdns_phy, inst); 1737 1738 return cdns_torrent_dp_start(cdns_phy, inst, phy); 1739 } 1740 1741 static int cdns_torrent_derived_refclk_enable(struct clk_hw *hw) 1742 { 1743 struct cdns_torrent_derived_refclk *derived_refclk = to_cdns_torrent_derived_refclk(hw); 1744 1745 regmap_field_write(derived_refclk->cmn_cdiag_refclk_ovrd_4, 1); 1746 regmap_field_write(derived_refclk->phy_pipe_cmn_ctrl1_0, 1); 1747 1748 return 0; 1749 } 1750 1751 static void cdns_torrent_derived_refclk_disable(struct clk_hw *hw) 1752 { 1753 struct cdns_torrent_derived_refclk *derived_refclk = to_cdns_torrent_derived_refclk(hw); 1754 1755 regmap_field_write(derived_refclk->phy_pipe_cmn_ctrl1_0, 0); 1756 regmap_field_write(derived_refclk->cmn_cdiag_refclk_ovrd_4, 0); 1757 } 1758 1759 static int cdns_torrent_derived_refclk_is_enabled(struct clk_hw *hw) 1760 { 1761 struct cdns_torrent_derived_refclk *derived_refclk = to_cdns_torrent_derived_refclk(hw); 1762 int val; 1763 1764 regmap_field_read(derived_refclk->cmn_cdiag_refclk_ovrd_4, &val); 1765 1766 return !!val; 1767 } 1768 1769 static const struct clk_ops cdns_torrent_derived_refclk_ops = { 1770 .enable = cdns_torrent_derived_refclk_enable, 1771 .disable = cdns_torrent_derived_refclk_disable, 1772 .is_enabled = cdns_torrent_derived_refclk_is_enabled, 1773 }; 1774 1775 static int cdns_torrent_derived_refclk_register(struct cdns_torrent_phy *cdns_phy) 1776 { 1777 struct cdns_torrent_derived_refclk *derived_refclk; 1778 struct device *dev = cdns_phy->dev; 1779 struct clk_init_data *init; 1780 const char *parent_name; 1781 char clk_name[100]; 1782 struct clk_hw *hw; 1783 struct clk *clk; 1784 int ret; 1785 1786 derived_refclk = devm_kzalloc(dev, sizeof(*derived_refclk), GFP_KERNEL); 1787 if (!derived_refclk) 1788 return -ENOMEM; 1789 1790 snprintf(clk_name, sizeof(clk_name), "%s_%s", dev_name(dev), 1791 clk_names[CDNS_TORRENT_DERIVED_REFCLK]); 1792 1793 clk = devm_clk_get_optional(dev, "phy_en_refclk"); 1794 if (IS_ERR(clk)) { 1795 dev_err(dev, "No parent clock for derived_refclk\n"); 1796 return PTR_ERR(clk); 1797 } 1798 1799 init = &derived_refclk->clk_data; 1800 1801 if (clk) { 1802 parent_name = __clk_get_name(clk); 1803 init->parent_names = &parent_name; 1804 init->num_parents = 1; 1805 } 1806 init->ops = &cdns_torrent_derived_refclk_ops; 1807 init->flags = 0; 1808 init->name = clk_name; 1809 1810 derived_refclk->phy_pipe_cmn_ctrl1_0 = cdns_phy->phy_pipe_cmn_ctrl1_0; 1811 derived_refclk->cmn_cdiag_refclk_ovrd_4 = cdns_phy->cmn_cdiag_refclk_ovrd_4; 1812 1813 derived_refclk->hw.init = init; 1814 1815 hw = &derived_refclk->hw; 1816 ret = devm_clk_hw_register(dev, hw); 1817 if (ret) 1818 return ret; 1819 1820 cdns_phy->clk_hw_data->hws[CDNS_TORRENT_DERIVED_REFCLK] = hw; 1821 1822 return 0; 1823 } 1824 1825 static int cdns_torrent_received_refclk_enable(struct clk_hw *hw) 1826 { 1827 struct cdns_torrent_received_refclk *received_refclk = to_cdns_torrent_received_refclk(hw); 1828 1829 regmap_field_write(received_refclk->phy_pipe_cmn_ctrl1_0, 1); 1830 1831 return 0; 1832 } 1833 1834 static void cdns_torrent_received_refclk_disable(struct clk_hw *hw) 1835 { 1836 struct cdns_torrent_received_refclk *received_refclk = to_cdns_torrent_received_refclk(hw); 1837 1838 regmap_field_write(received_refclk->phy_pipe_cmn_ctrl1_0, 0); 1839 } 1840 1841 static int cdns_torrent_received_refclk_is_enabled(struct clk_hw *hw) 1842 { 1843 struct cdns_torrent_received_refclk *received_refclk = to_cdns_torrent_received_refclk(hw); 1844 int val, cmn_val; 1845 1846 regmap_field_read(received_refclk->phy_pipe_cmn_ctrl1_0, &val); 1847 regmap_field_read(received_refclk->cmn_cdiag_refclk_ovrd_4, &cmn_val); 1848 1849 return val && !cmn_val; 1850 } 1851 1852 static const struct clk_ops cdns_torrent_received_refclk_ops = { 1853 .enable = cdns_torrent_received_refclk_enable, 1854 .disable = cdns_torrent_received_refclk_disable, 1855 .is_enabled = cdns_torrent_received_refclk_is_enabled, 1856 }; 1857 1858 static int cdns_torrent_received_refclk_register(struct cdns_torrent_phy *cdns_phy) 1859 { 1860 struct cdns_torrent_received_refclk *received_refclk; 1861 struct device *dev = cdns_phy->dev; 1862 struct clk_init_data *init; 1863 const char *parent_name; 1864 char clk_name[100]; 1865 struct clk_hw *hw; 1866 struct clk *clk; 1867 int ret; 1868 1869 received_refclk = devm_kzalloc(dev, sizeof(*received_refclk), GFP_KERNEL); 1870 if (!received_refclk) 1871 return -ENOMEM; 1872 1873 snprintf(clk_name, sizeof(clk_name), "%s_%s", dev_name(dev), 1874 clk_names[CDNS_TORRENT_RECEIVED_REFCLK]); 1875 1876 clk = devm_clk_get_optional(dev, "phy_en_refclk"); 1877 if (IS_ERR(clk)) { 1878 dev_err(dev, "No parent clock for received_refclk\n"); 1879 return PTR_ERR(clk); 1880 } 1881 1882 init = &received_refclk->clk_data; 1883 1884 if (clk) { 1885 parent_name = __clk_get_name(clk); 1886 init->parent_names = &parent_name; 1887 init->num_parents = 1; 1888 } 1889 init->ops = &cdns_torrent_received_refclk_ops; 1890 init->flags = 0; 1891 init->name = clk_name; 1892 1893 received_refclk->phy_pipe_cmn_ctrl1_0 = cdns_phy->phy_pipe_cmn_ctrl1_0; 1894 received_refclk->cmn_cdiag_refclk_ovrd_4 = cdns_phy->cmn_cdiag_refclk_ovrd_4; 1895 1896 received_refclk->hw.init = init; 1897 1898 hw = &received_refclk->hw; 1899 ret = devm_clk_hw_register(dev, hw); 1900 if (ret) 1901 return ret; 1902 1903 cdns_phy->clk_hw_data->hws[CDNS_TORRENT_RECEIVED_REFCLK] = hw; 1904 1905 return 0; 1906 } 1907 1908 static int cdns_torrent_refclk_driver_enable(struct clk_hw *hw) 1909 { 1910 struct cdns_torrent_refclk_driver *refclk_driver = to_cdns_torrent_refclk_driver(hw); 1911 1912 regmap_field_write(refclk_driver->cmn_fields[CMN_CDIAG_REFCLK_DRV0_CTRL_6], 0); 1913 regmap_field_write(refclk_driver->cmn_fields[CMN_CDIAG_REFCLK_DRV0_CTRL_5], 1); 1914 regmap_field_write(refclk_driver->cmn_fields[CMN_CDIAG_REFCLK_DRV0_CTRL_1], 0); 1915 1916 return 0; 1917 } 1918 1919 static void cdns_torrent_refclk_driver_disable(struct clk_hw *hw) 1920 { 1921 struct cdns_torrent_refclk_driver *refclk_driver = to_cdns_torrent_refclk_driver(hw); 1922 1923 regmap_field_write(refclk_driver->cmn_fields[CMN_CDIAG_REFCLK_DRV0_CTRL_1], 1); 1924 } 1925 1926 static int cdns_torrent_refclk_driver_is_enabled(struct clk_hw *hw) 1927 { 1928 struct cdns_torrent_refclk_driver *refclk_driver = to_cdns_torrent_refclk_driver(hw); 1929 int val; 1930 1931 regmap_field_read(refclk_driver->cmn_fields[CMN_CDIAG_REFCLK_DRV0_CTRL_1], &val); 1932 1933 return !val; 1934 } 1935 1936 static u8 cdns_torrent_refclk_driver_get_parent(struct clk_hw *hw) 1937 { 1938 struct cdns_torrent_refclk_driver *refclk_driver = to_cdns_torrent_refclk_driver(hw); 1939 unsigned int val; 1940 1941 regmap_field_read(refclk_driver->cmn_fields[CMN_CDIAG_REFCLK_DRV0_CTRL_4], &val); 1942 return clk_mux_val_to_index(hw, cdns_torrent_refclk_driver_mux_table, 0, val); 1943 } 1944 1945 static int cdns_torrent_refclk_driver_set_parent(struct clk_hw *hw, u8 index) 1946 { 1947 struct cdns_torrent_refclk_driver *refclk_driver = to_cdns_torrent_refclk_driver(hw); 1948 unsigned int val; 1949 1950 val = cdns_torrent_refclk_driver_mux_table[index]; 1951 return regmap_field_write(refclk_driver->cmn_fields[CMN_CDIAG_REFCLK_DRV0_CTRL_4], val); 1952 } 1953 1954 static const struct clk_ops cdns_torrent_refclk_driver_ops = { 1955 .enable = cdns_torrent_refclk_driver_enable, 1956 .disable = cdns_torrent_refclk_driver_disable, 1957 .is_enabled = cdns_torrent_refclk_driver_is_enabled, 1958 .determine_rate = __clk_mux_determine_rate, 1959 .set_parent = cdns_torrent_refclk_driver_set_parent, 1960 .get_parent = cdns_torrent_refclk_driver_get_parent, 1961 }; 1962 1963 static int cdns_torrent_refclk_driver_register(struct cdns_torrent_phy *cdns_phy) 1964 { 1965 struct cdns_torrent_refclk_driver *refclk_driver; 1966 struct device *dev = cdns_phy->dev; 1967 struct regmap_field *field; 1968 struct clk_init_data *init; 1969 const char **parent_names; 1970 unsigned int num_parents; 1971 struct regmap *regmap; 1972 char clk_name[100]; 1973 struct clk_hw *hw; 1974 int i, ret; 1975 1976 refclk_driver = devm_kzalloc(dev, sizeof(*refclk_driver), GFP_KERNEL); 1977 if (!refclk_driver) 1978 return -ENOMEM; 1979 1980 num_parents = ARRAY_SIZE(refclk_driver_parent_index); 1981 parent_names = devm_kzalloc(dev, (sizeof(char *) * num_parents), GFP_KERNEL); 1982 if (!parent_names) 1983 return -ENOMEM; 1984 1985 for (i = 0; i < num_parents; i++) { 1986 hw = cdns_phy->clk_hw_data->hws[refclk_driver_parent_index[i]]; 1987 if (IS_ERR_OR_NULL(hw)) { 1988 dev_err(dev, "No parent clock for refclk driver clock\n"); 1989 return IS_ERR(hw) ? PTR_ERR(hw) : -ENOENT; 1990 } 1991 parent_names[i] = clk_hw_get_name(hw); 1992 } 1993 1994 snprintf(clk_name, sizeof(clk_name), "%s_%s", dev_name(dev), 1995 clk_names[CDNS_TORRENT_REFCLK_DRIVER]); 1996 1997 init = &refclk_driver->clk_data; 1998 1999 init->ops = &cdns_torrent_refclk_driver_ops; 2000 init->flags = CLK_SET_RATE_NO_REPARENT; 2001 init->parent_names = parent_names; 2002 init->num_parents = num_parents; 2003 init->name = clk_name; 2004 2005 regmap = cdns_phy->regmap_common_cdb; 2006 2007 for (i = 0; i < REFCLK_OUT_NUM_CMN_CONFIG; i++) { 2008 field = devm_regmap_field_alloc(dev, regmap, refclk_out_cmn_cfg[i]); 2009 if (IS_ERR(field)) { 2010 dev_err(dev, "Refclk driver CMN reg field init failed\n"); 2011 return PTR_ERR(field); 2012 } 2013 refclk_driver->cmn_fields[i] = field; 2014 } 2015 2016 /* Enable Derived reference clock as default */ 2017 regmap_field_write(refclk_driver->cmn_fields[CMN_CDIAG_REFCLK_DRV0_CTRL_4], 1); 2018 2019 refclk_driver->hw.init = init; 2020 2021 hw = &refclk_driver->hw; 2022 ret = devm_clk_hw_register(dev, hw); 2023 if (ret) 2024 return ret; 2025 2026 cdns_phy->clk_hw_data->hws[CDNS_TORRENT_REFCLK_DRIVER] = hw; 2027 2028 return 0; 2029 } 2030 2031 static struct regmap *cdns_regmap_init(struct device *dev, void __iomem *base, 2032 u32 block_offset, 2033 u8 reg_offset_shift, 2034 const struct regmap_config *config) 2035 { 2036 struct cdns_regmap_cdb_context *ctx; 2037 2038 ctx = devm_kzalloc(dev, sizeof(*ctx), GFP_KERNEL); 2039 if (!ctx) 2040 return ERR_PTR(-ENOMEM); 2041 2042 ctx->dev = dev; 2043 ctx->base = base + block_offset; 2044 ctx->reg_offset_shift = reg_offset_shift; 2045 2046 return devm_regmap_init(dev, NULL, ctx, config); 2047 } 2048 2049 static int cdns_torrent_dp_regfield_init(struct cdns_torrent_phy *cdns_phy) 2050 { 2051 struct device *dev = cdns_phy->dev; 2052 struct regmap_field *field; 2053 struct regmap *regmap; 2054 2055 regmap = cdns_phy->regmap_dptx_phy_reg; 2056 field = devm_regmap_field_alloc(dev, regmap, phy_reset_ctrl); 2057 if (IS_ERR(field)) { 2058 dev_err(dev, "PHY_RESET reg field init failed\n"); 2059 return PTR_ERR(field); 2060 } 2061 cdns_phy->phy_reset_ctrl = field; 2062 2063 return 0; 2064 } 2065 2066 static int cdns_torrent_regfield_init(struct cdns_torrent_phy *cdns_phy) 2067 { 2068 struct device *dev = cdns_phy->dev; 2069 struct regmap_field *field; 2070 struct regmap *regmap; 2071 int i; 2072 2073 regmap = cdns_phy->regmap_phy_pcs_common_cdb; 2074 field = devm_regmap_field_alloc(dev, regmap, phy_pll_cfg); 2075 if (IS_ERR(field)) { 2076 dev_err(dev, "PHY_PLL_CFG reg field init failed\n"); 2077 return PTR_ERR(field); 2078 } 2079 cdns_phy->phy_pll_cfg = field; 2080 2081 regmap = cdns_phy->regmap_phy_pcs_common_cdb; 2082 field = devm_regmap_field_alloc(dev, regmap, phy_pipe_cmn_ctrl1_0); 2083 if (IS_ERR(field)) { 2084 dev_err(dev, "phy_pipe_cmn_ctrl1_0 reg field init failed\n"); 2085 return PTR_ERR(field); 2086 } 2087 cdns_phy->phy_pipe_cmn_ctrl1_0 = field; 2088 2089 regmap = cdns_phy->regmap_common_cdb; 2090 field = devm_regmap_field_alloc(dev, regmap, cmn_cdiag_refclk_ovrd_4); 2091 if (IS_ERR(field)) { 2092 dev_err(dev, "cmn_cdiag_refclk_ovrd_4 reg field init failed\n"); 2093 return PTR_ERR(field); 2094 } 2095 cdns_phy->cmn_cdiag_refclk_ovrd_4 = field; 2096 2097 regmap = cdns_phy->regmap_phy_pma_common_cdb; 2098 field = devm_regmap_field_alloc(dev, regmap, phy_pma_cmn_ctrl_1); 2099 if (IS_ERR(field)) { 2100 dev_err(dev, "PHY_PMA_CMN_CTRL1 reg field init failed\n"); 2101 return PTR_ERR(field); 2102 } 2103 cdns_phy->phy_pma_cmn_ctrl_1 = field; 2104 2105 regmap = cdns_phy->regmap_phy_pma_common_cdb; 2106 field = devm_regmap_field_alloc(dev, regmap, phy_pma_cmn_ctrl_2); 2107 if (IS_ERR(field)) { 2108 dev_err(dev, "PHY_PMA_CMN_CTRL2 reg field init failed\n"); 2109 return PTR_ERR(field); 2110 } 2111 cdns_phy->phy_pma_cmn_ctrl_2 = field; 2112 2113 regmap = cdns_phy->regmap_phy_pma_common_cdb; 2114 field = devm_regmap_field_alloc(dev, regmap, phy_pma_pll_raw_ctrl); 2115 if (IS_ERR(field)) { 2116 dev_err(dev, "PHY_PMA_PLL_RAW_CTRL reg field init failed\n"); 2117 return PTR_ERR(field); 2118 } 2119 cdns_phy->phy_pma_pll_raw_ctrl = field; 2120 2121 for (i = 0; i < MAX_NUM_LANES; i++) { 2122 regmap = cdns_phy->regmap_phy_pcs_lane_cdb[i]; 2123 field = devm_regmap_field_alloc(dev, regmap, phy_pcs_iso_link_ctrl_1); 2124 if (IS_ERR(field)) { 2125 dev_err(dev, "PHY_PCS_ISO_LINK_CTRL reg field init for ln %d failed\n", i); 2126 return PTR_ERR(field); 2127 } 2128 cdns_phy->phy_pcs_iso_link_ctrl_1[i] = field; 2129 } 2130 2131 return 0; 2132 } 2133 2134 static int cdns_torrent_dp_regmap_init(struct cdns_torrent_phy *cdns_phy) 2135 { 2136 void __iomem *base = cdns_phy->base; 2137 struct device *dev = cdns_phy->dev; 2138 struct regmap *regmap; 2139 u8 reg_offset_shift; 2140 u32 block_offset; 2141 2142 reg_offset_shift = cdns_phy->init_data->reg_offset_shift; 2143 2144 block_offset = TORRENT_DPTX_PHY_OFFSET; 2145 regmap = cdns_regmap_init(dev, base, block_offset, 2146 reg_offset_shift, 2147 &cdns_torrent_dptx_phy_config); 2148 if (IS_ERR(regmap)) { 2149 dev_err(dev, "Failed to init DPTX PHY regmap\n"); 2150 return PTR_ERR(regmap); 2151 } 2152 cdns_phy->regmap_dptx_phy_reg = regmap; 2153 2154 return 0; 2155 } 2156 2157 static int cdns_torrent_regmap_init(struct cdns_torrent_phy *cdns_phy) 2158 { 2159 void __iomem *sd_base = cdns_phy->sd_base; 2160 u8 block_offset_shift, reg_offset_shift; 2161 struct device *dev = cdns_phy->dev; 2162 struct regmap *regmap; 2163 u32 block_offset; 2164 int i; 2165 2166 block_offset_shift = cdns_phy->init_data->block_offset_shift; 2167 reg_offset_shift = cdns_phy->init_data->reg_offset_shift; 2168 2169 for (i = 0; i < MAX_NUM_LANES; i++) { 2170 block_offset = TORRENT_TX_LANE_CDB_OFFSET(i, block_offset_shift, 2171 reg_offset_shift); 2172 regmap = cdns_regmap_init(dev, sd_base, block_offset, 2173 reg_offset_shift, 2174 &cdns_torrent_tx_lane_cdb_config[i]); 2175 if (IS_ERR(regmap)) { 2176 dev_err(dev, "Failed to init tx lane CDB regmap\n"); 2177 return PTR_ERR(regmap); 2178 } 2179 cdns_phy->regmap_tx_lane_cdb[i] = regmap; 2180 2181 block_offset = TORRENT_RX_LANE_CDB_OFFSET(i, block_offset_shift, 2182 reg_offset_shift); 2183 regmap = cdns_regmap_init(dev, sd_base, block_offset, 2184 reg_offset_shift, 2185 &cdns_torrent_rx_lane_cdb_config[i]); 2186 if (IS_ERR(regmap)) { 2187 dev_err(dev, "Failed to init rx lane CDB regmap\n"); 2188 return PTR_ERR(regmap); 2189 } 2190 cdns_phy->regmap_rx_lane_cdb[i] = regmap; 2191 2192 block_offset = TORRENT_PHY_PCS_LANE_CDB_OFFSET(i, block_offset_shift, 2193 reg_offset_shift); 2194 regmap = cdns_regmap_init(dev, sd_base, block_offset, 2195 reg_offset_shift, 2196 &cdns_torrent_phy_pcs_lane_cdb_config[i]); 2197 if (IS_ERR(regmap)) { 2198 dev_err(dev, "Failed to init PHY PCS lane CDB regmap\n"); 2199 return PTR_ERR(regmap); 2200 } 2201 cdns_phy->regmap_phy_pcs_lane_cdb[i] = regmap; 2202 } 2203 2204 block_offset = TORRENT_COMMON_CDB_OFFSET; 2205 regmap = cdns_regmap_init(dev, sd_base, block_offset, 2206 reg_offset_shift, 2207 &cdns_torrent_common_cdb_config); 2208 if (IS_ERR(regmap)) { 2209 dev_err(dev, "Failed to init common CDB regmap\n"); 2210 return PTR_ERR(regmap); 2211 } 2212 cdns_phy->regmap_common_cdb = regmap; 2213 2214 block_offset = TORRENT_PHY_PCS_COMMON_OFFSET(block_offset_shift); 2215 regmap = cdns_regmap_init(dev, sd_base, block_offset, 2216 reg_offset_shift, 2217 &cdns_torrent_phy_pcs_cmn_cdb_config); 2218 if (IS_ERR(regmap)) { 2219 dev_err(dev, "Failed to init PHY PCS common CDB regmap\n"); 2220 return PTR_ERR(regmap); 2221 } 2222 cdns_phy->regmap_phy_pcs_common_cdb = regmap; 2223 2224 block_offset = TORRENT_PHY_PMA_COMMON_OFFSET(block_offset_shift); 2225 regmap = cdns_regmap_init(dev, sd_base, block_offset, 2226 reg_offset_shift, 2227 &cdns_torrent_phy_pma_cmn_cdb_config); 2228 if (IS_ERR(regmap)) { 2229 dev_err(dev, "Failed to init PHY PMA common CDB regmap\n"); 2230 return PTR_ERR(regmap); 2231 } 2232 cdns_phy->regmap_phy_pma_common_cdb = regmap; 2233 2234 return 0; 2235 } 2236 2237 static int cdns_torrent_phy_init(struct phy *phy) 2238 { 2239 struct cdns_torrent_phy *cdns_phy = dev_get_drvdata(phy->dev.parent); 2240 const struct cdns_torrent_data *init_data = cdns_phy->init_data; 2241 struct cdns_torrent_vals *cmn_vals, *tx_ln_vals, *rx_ln_vals; 2242 enum cdns_torrent_ref_clk ref_clk = cdns_phy->ref_clk_rate; 2243 struct cdns_torrent_vals *link_cmn_vals, *xcvr_diag_vals; 2244 struct cdns_torrent_inst *inst = phy_get_drvdata(phy); 2245 enum cdns_torrent_phy_type phy_type = inst->phy_type; 2246 enum cdns_torrent_ssc_mode ssc = inst->ssc_mode; 2247 struct cdns_torrent_vals *pcs_cmn_vals; 2248 struct cdns_reg_pairs *reg_pairs; 2249 struct regmap *regmap; 2250 u32 num_regs; 2251 int i, j; 2252 2253 if (cdns_phy->nsubnodes > 1) { 2254 if (phy_type == TYPE_DP) 2255 return cdns_torrent_dp_multilink_init(cdns_phy, inst, phy); 2256 return 0; 2257 } 2258 2259 /** 2260 * Spread spectrum generation is not required or supported 2261 * for SGMII/QSGMII 2262 */ 2263 if (phy_type == TYPE_SGMII || phy_type == TYPE_QSGMII) 2264 ssc = NO_SSC; 2265 2266 /* PHY configuration specific registers for single link */ 2267 link_cmn_vals = init_data->link_cmn_vals[phy_type][TYPE_NONE][ssc]; 2268 if (link_cmn_vals) { 2269 reg_pairs = link_cmn_vals->reg_pairs; 2270 num_regs = link_cmn_vals->num_regs; 2271 regmap = cdns_phy->regmap_common_cdb; 2272 2273 /** 2274 * First array value in link_cmn_vals must be of 2275 * PHY_PLL_CFG register 2276 */ 2277 regmap_field_write(cdns_phy->phy_pll_cfg, reg_pairs[0].val); 2278 2279 for (i = 1; i < num_regs; i++) 2280 regmap_write(regmap, reg_pairs[i].off, 2281 reg_pairs[i].val); 2282 } 2283 2284 xcvr_diag_vals = init_data->xcvr_diag_vals[phy_type][TYPE_NONE][ssc]; 2285 if (xcvr_diag_vals) { 2286 reg_pairs = xcvr_diag_vals->reg_pairs; 2287 num_regs = xcvr_diag_vals->num_regs; 2288 for (i = 0; i < inst->num_lanes; i++) { 2289 regmap = cdns_phy->regmap_tx_lane_cdb[i + inst->mlane]; 2290 for (j = 0; j < num_regs; j++) 2291 regmap_write(regmap, reg_pairs[j].off, 2292 reg_pairs[j].val); 2293 } 2294 } 2295 2296 /* PHY PCS common registers configurations */ 2297 pcs_cmn_vals = init_data->pcs_cmn_vals[phy_type][TYPE_NONE][ssc]; 2298 if (pcs_cmn_vals) { 2299 reg_pairs = pcs_cmn_vals->reg_pairs; 2300 num_regs = pcs_cmn_vals->num_regs; 2301 regmap = cdns_phy->regmap_phy_pcs_common_cdb; 2302 for (i = 0; i < num_regs; i++) 2303 regmap_write(regmap, reg_pairs[i].off, 2304 reg_pairs[i].val); 2305 } 2306 2307 /* PMA common registers configurations */ 2308 cmn_vals = init_data->cmn_vals[ref_clk][phy_type][TYPE_NONE][ssc]; 2309 if (cmn_vals) { 2310 reg_pairs = cmn_vals->reg_pairs; 2311 num_regs = cmn_vals->num_regs; 2312 regmap = cdns_phy->regmap_common_cdb; 2313 for (i = 0; i < num_regs; i++) 2314 regmap_write(regmap, reg_pairs[i].off, 2315 reg_pairs[i].val); 2316 } 2317 2318 /* PMA TX lane registers configurations */ 2319 tx_ln_vals = init_data->tx_ln_vals[ref_clk][phy_type][TYPE_NONE][ssc]; 2320 if (tx_ln_vals) { 2321 reg_pairs = tx_ln_vals->reg_pairs; 2322 num_regs = tx_ln_vals->num_regs; 2323 for (i = 0; i < inst->num_lanes; i++) { 2324 regmap = cdns_phy->regmap_tx_lane_cdb[i + inst->mlane]; 2325 for (j = 0; j < num_regs; j++) 2326 regmap_write(regmap, reg_pairs[j].off, 2327 reg_pairs[j].val); 2328 } 2329 } 2330 2331 /* PMA RX lane registers configurations */ 2332 rx_ln_vals = init_data->rx_ln_vals[ref_clk][phy_type][TYPE_NONE][ssc]; 2333 if (rx_ln_vals) { 2334 reg_pairs = rx_ln_vals->reg_pairs; 2335 num_regs = rx_ln_vals->num_regs; 2336 for (i = 0; i < inst->num_lanes; i++) { 2337 regmap = cdns_phy->regmap_rx_lane_cdb[i + inst->mlane]; 2338 for (j = 0; j < num_regs; j++) 2339 regmap_write(regmap, reg_pairs[j].off, 2340 reg_pairs[j].val); 2341 } 2342 } 2343 2344 if (phy_type == TYPE_DP) 2345 return cdns_torrent_dp_init(phy); 2346 2347 return 0; 2348 } 2349 2350 static const struct phy_ops cdns_torrent_phy_ops = { 2351 .init = cdns_torrent_phy_init, 2352 .configure = cdns_torrent_dp_configure, 2353 .power_on = cdns_torrent_phy_on, 2354 .power_off = cdns_torrent_phy_off, 2355 .owner = THIS_MODULE, 2356 }; 2357 2358 static int cdns_torrent_noop_phy_on(struct phy *phy) 2359 { 2360 /* Give 5ms to 10ms delay for the PIPE clock to be stable */ 2361 usleep_range(5000, 10000); 2362 2363 return 0; 2364 } 2365 2366 static const struct phy_ops noop_ops = { 2367 .power_on = cdns_torrent_noop_phy_on, 2368 .owner = THIS_MODULE, 2369 }; 2370 2371 static 2372 int cdns_torrent_phy_configure_multilink(struct cdns_torrent_phy *cdns_phy) 2373 { 2374 const struct cdns_torrent_data *init_data = cdns_phy->init_data; 2375 struct cdns_torrent_vals *cmn_vals, *tx_ln_vals, *rx_ln_vals; 2376 enum cdns_torrent_ref_clk ref_clk = cdns_phy->ref_clk_rate; 2377 struct cdns_torrent_vals *link_cmn_vals, *xcvr_diag_vals; 2378 enum cdns_torrent_phy_type phy_t1, phy_t2; 2379 struct cdns_torrent_vals *pcs_cmn_vals; 2380 int i, j, node, mlane, num_lanes, ret; 2381 struct cdns_reg_pairs *reg_pairs; 2382 enum cdns_torrent_ssc_mode ssc; 2383 struct regmap *regmap; 2384 u32 num_regs; 2385 2386 /* Maximum 2 links (subnodes) are supported */ 2387 if (cdns_phy->nsubnodes != 2) 2388 return -EINVAL; 2389 2390 phy_t1 = cdns_phy->phys[0].phy_type; 2391 phy_t2 = cdns_phy->phys[1].phy_type; 2392 2393 /** 2394 * First configure the PHY for first link with phy_t1. Get the array 2395 * values as [phy_t1][phy_t2][ssc]. 2396 */ 2397 for (node = 0; node < cdns_phy->nsubnodes; node++) { 2398 if (node == 1) { 2399 /** 2400 * If first link with phy_t1 is configured, then 2401 * configure the PHY for second link with phy_t2. 2402 * Get the array values as [phy_t2][phy_t1][ssc]. 2403 */ 2404 swap(phy_t1, phy_t2); 2405 } 2406 2407 mlane = cdns_phy->phys[node].mlane; 2408 ssc = cdns_phy->phys[node].ssc_mode; 2409 num_lanes = cdns_phy->phys[node].num_lanes; 2410 2411 /** 2412 * PHY configuration specific registers: 2413 * link_cmn_vals depend on combination of PHY types being 2414 * configured and are common for both PHY types, so array 2415 * values should be same for [phy_t1][phy_t2][ssc] and 2416 * [phy_t2][phy_t1][ssc]. 2417 * xcvr_diag_vals also depend on combination of PHY types 2418 * being configured, but these can be different for particular 2419 * PHY type and are per lane. 2420 */ 2421 link_cmn_vals = init_data->link_cmn_vals[phy_t1][phy_t2][ssc]; 2422 if (link_cmn_vals) { 2423 reg_pairs = link_cmn_vals->reg_pairs; 2424 num_regs = link_cmn_vals->num_regs; 2425 regmap = cdns_phy->regmap_common_cdb; 2426 2427 /** 2428 * First array value in link_cmn_vals must be of 2429 * PHY_PLL_CFG register 2430 */ 2431 regmap_field_write(cdns_phy->phy_pll_cfg, 2432 reg_pairs[0].val); 2433 2434 for (i = 1; i < num_regs; i++) 2435 regmap_write(regmap, reg_pairs[i].off, 2436 reg_pairs[i].val); 2437 } 2438 2439 xcvr_diag_vals = init_data->xcvr_diag_vals[phy_t1][phy_t2][ssc]; 2440 if (xcvr_diag_vals) { 2441 reg_pairs = xcvr_diag_vals->reg_pairs; 2442 num_regs = xcvr_diag_vals->num_regs; 2443 for (i = 0; i < num_lanes; i++) { 2444 regmap = cdns_phy->regmap_tx_lane_cdb[i + mlane]; 2445 for (j = 0; j < num_regs; j++) 2446 regmap_write(regmap, reg_pairs[j].off, 2447 reg_pairs[j].val); 2448 } 2449 } 2450 2451 /* PHY PCS common registers configurations */ 2452 pcs_cmn_vals = init_data->pcs_cmn_vals[phy_t1][phy_t2][ssc]; 2453 if (pcs_cmn_vals) { 2454 reg_pairs = pcs_cmn_vals->reg_pairs; 2455 num_regs = pcs_cmn_vals->num_regs; 2456 regmap = cdns_phy->regmap_phy_pcs_common_cdb; 2457 for (i = 0; i < num_regs; i++) 2458 regmap_write(regmap, reg_pairs[i].off, 2459 reg_pairs[i].val); 2460 } 2461 2462 /* PMA common registers configurations */ 2463 cmn_vals = init_data->cmn_vals[ref_clk][phy_t1][phy_t2][ssc]; 2464 if (cmn_vals) { 2465 reg_pairs = cmn_vals->reg_pairs; 2466 num_regs = cmn_vals->num_regs; 2467 regmap = cdns_phy->regmap_common_cdb; 2468 for (i = 0; i < num_regs; i++) 2469 regmap_write(regmap, reg_pairs[i].off, 2470 reg_pairs[i].val); 2471 } 2472 2473 /* PMA TX lane registers configurations */ 2474 tx_ln_vals = init_data->tx_ln_vals[ref_clk][phy_t1][phy_t2][ssc]; 2475 if (tx_ln_vals) { 2476 reg_pairs = tx_ln_vals->reg_pairs; 2477 num_regs = tx_ln_vals->num_regs; 2478 for (i = 0; i < num_lanes; i++) { 2479 regmap = cdns_phy->regmap_tx_lane_cdb[i + mlane]; 2480 for (j = 0; j < num_regs; j++) 2481 regmap_write(regmap, reg_pairs[j].off, 2482 reg_pairs[j].val); 2483 } 2484 } 2485 2486 /* PMA RX lane registers configurations */ 2487 rx_ln_vals = init_data->rx_ln_vals[ref_clk][phy_t1][phy_t2][ssc]; 2488 if (rx_ln_vals) { 2489 reg_pairs = rx_ln_vals->reg_pairs; 2490 num_regs = rx_ln_vals->num_regs; 2491 for (i = 0; i < num_lanes; i++) { 2492 regmap = cdns_phy->regmap_rx_lane_cdb[i + mlane]; 2493 for (j = 0; j < num_regs; j++) 2494 regmap_write(regmap, reg_pairs[j].off, 2495 reg_pairs[j].val); 2496 } 2497 } 2498 2499 if (phy_t1 == TYPE_DP) { 2500 ret = cdns_torrent_dp_get_pll(cdns_phy, phy_t2); 2501 if (ret) 2502 return ret; 2503 } 2504 2505 reset_control_deassert(cdns_phy->phys[node].lnk_rst); 2506 } 2507 2508 /* Take the PHY out of reset */ 2509 ret = reset_control_deassert(cdns_phy->phy_rst); 2510 if (ret) 2511 return ret; 2512 2513 return 0; 2514 } 2515 2516 static void cdns_torrent_clk_cleanup(struct cdns_torrent_phy *cdns_phy) 2517 { 2518 struct device *dev = cdns_phy->dev; 2519 2520 of_clk_del_provider(dev->of_node); 2521 } 2522 2523 static int cdns_torrent_clk_register(struct cdns_torrent_phy *cdns_phy) 2524 { 2525 struct device *dev = cdns_phy->dev; 2526 struct device_node *node = dev->of_node; 2527 struct clk_hw_onecell_data *data; 2528 int ret; 2529 2530 data = devm_kzalloc(dev, struct_size(data, hws, CDNS_TORRENT_OUTPUT_CLOCKS), GFP_KERNEL); 2531 if (!data) 2532 return -ENOMEM; 2533 2534 data->num = CDNS_TORRENT_OUTPUT_CLOCKS; 2535 cdns_phy->clk_hw_data = data; 2536 2537 ret = cdns_torrent_derived_refclk_register(cdns_phy); 2538 if (ret) { 2539 dev_err(dev, "failed to register derived refclk\n"); 2540 return ret; 2541 } 2542 2543 ret = cdns_torrent_received_refclk_register(cdns_phy); 2544 if (ret) { 2545 dev_err(dev, "failed to register received refclk\n"); 2546 return ret; 2547 } 2548 2549 ret = cdns_torrent_refclk_driver_register(cdns_phy); 2550 if (ret) { 2551 dev_err(dev, "failed to register refclk driver\n"); 2552 return ret; 2553 } 2554 2555 ret = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, data); 2556 if (ret) { 2557 dev_err(dev, "Failed to add clock provider: %s\n", node->name); 2558 return ret; 2559 } 2560 2561 return 0; 2562 } 2563 2564 static int cdns_torrent_reset(struct cdns_torrent_phy *cdns_phy) 2565 { 2566 struct device *dev = cdns_phy->dev; 2567 2568 cdns_phy->phy_rst = devm_reset_control_get_exclusive_by_index(dev, 0); 2569 if (IS_ERR(cdns_phy->phy_rst)) { 2570 dev_err(dev, "%s: failed to get reset\n", 2571 dev->of_node->full_name); 2572 return PTR_ERR(cdns_phy->phy_rst); 2573 } 2574 2575 cdns_phy->apb_rst = devm_reset_control_get_optional_exclusive(dev, "torrent_apb"); 2576 if (IS_ERR(cdns_phy->apb_rst)) { 2577 dev_err(dev, "%s: failed to get apb reset\n", 2578 dev->of_node->full_name); 2579 return PTR_ERR(cdns_phy->apb_rst); 2580 } 2581 2582 return 0; 2583 } 2584 2585 static int cdns_torrent_clk(struct cdns_torrent_phy *cdns_phy) 2586 { 2587 struct device *dev = cdns_phy->dev; 2588 unsigned long ref_clk_rate; 2589 int ret; 2590 2591 cdns_phy->clk = devm_clk_get(dev, "refclk"); 2592 if (IS_ERR(cdns_phy->clk)) { 2593 dev_err(dev, "phy ref clock not found\n"); 2594 return PTR_ERR(cdns_phy->clk); 2595 } 2596 2597 ret = clk_prepare_enable(cdns_phy->clk); 2598 if (ret) { 2599 dev_err(cdns_phy->dev, "Failed to prepare ref clock\n"); 2600 return ret; 2601 } 2602 2603 ref_clk_rate = clk_get_rate(cdns_phy->clk); 2604 if (!ref_clk_rate) { 2605 dev_err(cdns_phy->dev, "Failed to get ref clock rate\n"); 2606 clk_disable_unprepare(cdns_phy->clk); 2607 return -EINVAL; 2608 } 2609 2610 switch (ref_clk_rate) { 2611 case REF_CLK_19_2MHZ: 2612 cdns_phy->ref_clk_rate = CLK_19_2_MHZ; 2613 break; 2614 case REF_CLK_25MHZ: 2615 cdns_phy->ref_clk_rate = CLK_25_MHZ; 2616 break; 2617 case REF_CLK_100MHZ: 2618 cdns_phy->ref_clk_rate = CLK_100_MHZ; 2619 break; 2620 default: 2621 dev_err(cdns_phy->dev, "Invalid Ref Clock Rate\n"); 2622 clk_disable_unprepare(cdns_phy->clk); 2623 return -EINVAL; 2624 } 2625 2626 return 0; 2627 } 2628 2629 static int cdns_torrent_phy_probe(struct platform_device *pdev) 2630 { 2631 struct cdns_torrent_phy *cdns_phy; 2632 struct device *dev = &pdev->dev; 2633 struct phy_provider *phy_provider; 2634 const struct cdns_torrent_data *data; 2635 struct device_node *child; 2636 int ret, subnodes, node = 0, i; 2637 u32 total_num_lanes = 0; 2638 int already_configured; 2639 u8 init_dp_regmap = 0; 2640 u32 phy_type; 2641 2642 /* Get init data for this PHY */ 2643 data = of_device_get_match_data(dev); 2644 if (!data) 2645 return -EINVAL; 2646 2647 cdns_phy = devm_kzalloc(dev, sizeof(*cdns_phy), GFP_KERNEL); 2648 if (!cdns_phy) 2649 return -ENOMEM; 2650 2651 dev_set_drvdata(dev, cdns_phy); 2652 cdns_phy->dev = dev; 2653 cdns_phy->init_data = data; 2654 2655 cdns_phy->sd_base = devm_platform_ioremap_resource(pdev, 0); 2656 if (IS_ERR(cdns_phy->sd_base)) 2657 return PTR_ERR(cdns_phy->sd_base); 2658 2659 subnodes = of_get_available_child_count(dev->of_node); 2660 if (subnodes == 0) { 2661 dev_err(dev, "No available link subnodes found\n"); 2662 return -EINVAL; 2663 } 2664 2665 ret = cdns_torrent_regmap_init(cdns_phy); 2666 if (ret) 2667 return ret; 2668 2669 ret = cdns_torrent_regfield_init(cdns_phy); 2670 if (ret) 2671 return ret; 2672 2673 ret = cdns_torrent_clk_register(cdns_phy); 2674 if (ret) 2675 return ret; 2676 2677 regmap_field_read(cdns_phy->phy_pma_cmn_ctrl_1, &already_configured); 2678 2679 if (!already_configured) { 2680 ret = cdns_torrent_reset(cdns_phy); 2681 if (ret) 2682 goto clk_cleanup; 2683 2684 ret = cdns_torrent_clk(cdns_phy); 2685 if (ret) 2686 goto clk_cleanup; 2687 2688 /* Enable APB */ 2689 reset_control_deassert(cdns_phy->apb_rst); 2690 } 2691 2692 for_each_available_child_of_node(dev->of_node, child) { 2693 struct phy *gphy; 2694 2695 /* PHY subnode name must be 'phy'. */ 2696 if (!(of_node_name_eq(child, "phy"))) 2697 continue; 2698 2699 cdns_phy->phys[node].lnk_rst = 2700 of_reset_control_array_get_exclusive(child); 2701 if (IS_ERR(cdns_phy->phys[node].lnk_rst)) { 2702 dev_err(dev, "%s: failed to get reset\n", 2703 child->full_name); 2704 ret = PTR_ERR(cdns_phy->phys[node].lnk_rst); 2705 goto put_lnk_rst; 2706 } 2707 2708 if (of_property_read_u32(child, "reg", 2709 &cdns_phy->phys[node].mlane)) { 2710 dev_err(dev, "%s: No \"reg\"-property.\n", 2711 child->full_name); 2712 ret = -EINVAL; 2713 goto put_child; 2714 } 2715 2716 if (of_property_read_u32(child, "cdns,phy-type", &phy_type)) { 2717 dev_err(dev, "%s: No \"cdns,phy-type\"-property.\n", 2718 child->full_name); 2719 ret = -EINVAL; 2720 goto put_child; 2721 } 2722 2723 switch (phy_type) { 2724 case PHY_TYPE_PCIE: 2725 cdns_phy->phys[node].phy_type = TYPE_PCIE; 2726 break; 2727 case PHY_TYPE_DP: 2728 cdns_phy->phys[node].phy_type = TYPE_DP; 2729 break; 2730 case PHY_TYPE_SGMII: 2731 cdns_phy->phys[node].phy_type = TYPE_SGMII; 2732 break; 2733 case PHY_TYPE_QSGMII: 2734 cdns_phy->phys[node].phy_type = TYPE_QSGMII; 2735 break; 2736 case PHY_TYPE_USB3: 2737 cdns_phy->phys[node].phy_type = TYPE_USB; 2738 break; 2739 default: 2740 dev_err(dev, "Unsupported protocol\n"); 2741 ret = -EINVAL; 2742 goto put_child; 2743 } 2744 2745 if (of_property_read_u32(child, "cdns,num-lanes", 2746 &cdns_phy->phys[node].num_lanes)) { 2747 dev_err(dev, "%s: No \"cdns,num-lanes\"-property.\n", 2748 child->full_name); 2749 ret = -EINVAL; 2750 goto put_child; 2751 } 2752 2753 total_num_lanes += cdns_phy->phys[node].num_lanes; 2754 2755 /* Get SSC mode */ 2756 cdns_phy->phys[node].ssc_mode = NO_SSC; 2757 of_property_read_u32(child, "cdns,ssc-mode", 2758 &cdns_phy->phys[node].ssc_mode); 2759 2760 if (!already_configured) 2761 gphy = devm_phy_create(dev, child, &cdns_torrent_phy_ops); 2762 else 2763 gphy = devm_phy_create(dev, child, &noop_ops); 2764 if (IS_ERR(gphy)) { 2765 ret = PTR_ERR(gphy); 2766 goto put_child; 2767 } 2768 2769 if (cdns_phy->phys[node].phy_type == TYPE_DP) { 2770 switch (cdns_phy->phys[node].num_lanes) { 2771 case 1: 2772 case 2: 2773 case 4: 2774 /* valid number of lanes */ 2775 break; 2776 default: 2777 dev_err(dev, "unsupported number of lanes: %d\n", 2778 cdns_phy->phys[node].num_lanes); 2779 ret = -EINVAL; 2780 goto put_child; 2781 } 2782 2783 cdns_phy->max_bit_rate = DEFAULT_MAX_BIT_RATE; 2784 of_property_read_u32(child, "cdns,max-bit-rate", 2785 &cdns_phy->max_bit_rate); 2786 2787 switch (cdns_phy->max_bit_rate) { 2788 case 1620: 2789 case 2160: 2790 case 2430: 2791 case 2700: 2792 case 3240: 2793 case 4320: 2794 case 5400: 2795 case 8100: 2796 /* valid bit rate */ 2797 break; 2798 default: 2799 dev_err(dev, "unsupported max bit rate: %dMbps\n", 2800 cdns_phy->max_bit_rate); 2801 ret = -EINVAL; 2802 goto put_child; 2803 } 2804 2805 /* DPTX registers */ 2806 cdns_phy->base = devm_platform_ioremap_resource(pdev, 1); 2807 if (IS_ERR(cdns_phy->base)) { 2808 ret = PTR_ERR(cdns_phy->base); 2809 goto put_child; 2810 } 2811 2812 if (!init_dp_regmap) { 2813 ret = cdns_torrent_dp_regmap_init(cdns_phy); 2814 if (ret) 2815 goto put_child; 2816 2817 ret = cdns_torrent_dp_regfield_init(cdns_phy); 2818 if (ret) 2819 goto put_child; 2820 2821 init_dp_regmap++; 2822 } 2823 2824 dev_dbg(dev, "DP max bit rate %d.%03d Gbps\n", 2825 cdns_phy->max_bit_rate / 1000, 2826 cdns_phy->max_bit_rate % 1000); 2827 2828 gphy->attrs.bus_width = cdns_phy->phys[node].num_lanes; 2829 gphy->attrs.max_link_rate = cdns_phy->max_bit_rate; 2830 gphy->attrs.mode = PHY_MODE_DP; 2831 } 2832 2833 cdns_phy->phys[node].phy = gphy; 2834 phy_set_drvdata(gphy, &cdns_phy->phys[node]); 2835 2836 node++; 2837 } 2838 cdns_phy->nsubnodes = node; 2839 2840 if (total_num_lanes > MAX_NUM_LANES) { 2841 dev_err(dev, "Invalid lane configuration\n"); 2842 ret = -EINVAL; 2843 goto put_lnk_rst; 2844 } 2845 2846 if (cdns_phy->nsubnodes > 1 && !already_configured) { 2847 ret = cdns_torrent_phy_configure_multilink(cdns_phy); 2848 if (ret) 2849 goto put_lnk_rst; 2850 } 2851 2852 phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate); 2853 if (IS_ERR(phy_provider)) { 2854 ret = PTR_ERR(phy_provider); 2855 goto put_lnk_rst; 2856 } 2857 2858 if (cdns_phy->nsubnodes > 1) 2859 dev_dbg(dev, "Multi-link: %s (%d lanes) & %s (%d lanes)", 2860 cdns_torrent_get_phy_type(cdns_phy->phys[0].phy_type), 2861 cdns_phy->phys[0].num_lanes, 2862 cdns_torrent_get_phy_type(cdns_phy->phys[1].phy_type), 2863 cdns_phy->phys[1].num_lanes); 2864 else 2865 dev_dbg(dev, "Single link: %s (%d lanes)", 2866 cdns_torrent_get_phy_type(cdns_phy->phys[0].phy_type), 2867 cdns_phy->phys[0].num_lanes); 2868 2869 return 0; 2870 2871 put_child: 2872 node++; 2873 put_lnk_rst: 2874 for (i = 0; i < node; i++) 2875 reset_control_put(cdns_phy->phys[i].lnk_rst); 2876 of_node_put(child); 2877 reset_control_assert(cdns_phy->apb_rst); 2878 clk_disable_unprepare(cdns_phy->clk); 2879 clk_cleanup: 2880 cdns_torrent_clk_cleanup(cdns_phy); 2881 return ret; 2882 } 2883 2884 static void cdns_torrent_phy_remove(struct platform_device *pdev) 2885 { 2886 struct cdns_torrent_phy *cdns_phy = platform_get_drvdata(pdev); 2887 int i; 2888 2889 reset_control_assert(cdns_phy->phy_rst); 2890 reset_control_assert(cdns_phy->apb_rst); 2891 for (i = 0; i < cdns_phy->nsubnodes; i++) { 2892 reset_control_assert(cdns_phy->phys[i].lnk_rst); 2893 reset_control_put(cdns_phy->phys[i].lnk_rst); 2894 } 2895 2896 clk_disable_unprepare(cdns_phy->clk); 2897 cdns_torrent_clk_cleanup(cdns_phy); 2898 } 2899 2900 /* USB and DP link configuration */ 2901 static struct cdns_reg_pairs usb_dp_link_cmn_regs[] = { 2902 {0x0002, PHY_PLL_CFG}, 2903 {0x8600, CMN_PDIAG_PLL0_CLK_SEL_M0} 2904 }; 2905 2906 static struct cdns_reg_pairs usb_dp_xcvr_diag_ln_regs[] = { 2907 {0x0000, XCVR_DIAG_HSCLK_SEL}, 2908 {0x0001, XCVR_DIAG_HSCLK_DIV}, 2909 {0x0041, XCVR_DIAG_PLLDRC_CTRL} 2910 }; 2911 2912 static struct cdns_reg_pairs dp_usb_xcvr_diag_ln_regs[] = { 2913 {0x0001, XCVR_DIAG_HSCLK_SEL}, 2914 {0x0009, XCVR_DIAG_PLLDRC_CTRL} 2915 }; 2916 2917 static struct cdns_torrent_vals usb_dp_link_cmn_vals = { 2918 .reg_pairs = usb_dp_link_cmn_regs, 2919 .num_regs = ARRAY_SIZE(usb_dp_link_cmn_regs), 2920 }; 2921 2922 static struct cdns_torrent_vals usb_dp_xcvr_diag_ln_vals = { 2923 .reg_pairs = usb_dp_xcvr_diag_ln_regs, 2924 .num_regs = ARRAY_SIZE(usb_dp_xcvr_diag_ln_regs), 2925 }; 2926 2927 static struct cdns_torrent_vals dp_usb_xcvr_diag_ln_vals = { 2928 .reg_pairs = dp_usb_xcvr_diag_ln_regs, 2929 .num_regs = ARRAY_SIZE(dp_usb_xcvr_diag_ln_regs), 2930 }; 2931 2932 /* PCIe and DP link configuration */ 2933 static struct cdns_reg_pairs pcie_dp_link_cmn_regs[] = { 2934 {0x0003, PHY_PLL_CFG}, 2935 {0x0601, CMN_PDIAG_PLL0_CLK_SEL_M0}, 2936 {0x0400, CMN_PDIAG_PLL0_CLK_SEL_M1} 2937 }; 2938 2939 static struct cdns_reg_pairs pcie_dp_xcvr_diag_ln_regs[] = { 2940 {0x0000, XCVR_DIAG_HSCLK_SEL}, 2941 {0x0001, XCVR_DIAG_HSCLK_DIV}, 2942 {0x0012, XCVR_DIAG_PLLDRC_CTRL} 2943 }; 2944 2945 static struct cdns_reg_pairs dp_pcie_xcvr_diag_ln_regs[] = { 2946 {0x0001, XCVR_DIAG_HSCLK_SEL}, 2947 {0x0009, XCVR_DIAG_PLLDRC_CTRL} 2948 }; 2949 2950 static struct cdns_torrent_vals pcie_dp_link_cmn_vals = { 2951 .reg_pairs = pcie_dp_link_cmn_regs, 2952 .num_regs = ARRAY_SIZE(pcie_dp_link_cmn_regs), 2953 }; 2954 2955 static struct cdns_torrent_vals pcie_dp_xcvr_diag_ln_vals = { 2956 .reg_pairs = pcie_dp_xcvr_diag_ln_regs, 2957 .num_regs = ARRAY_SIZE(pcie_dp_xcvr_diag_ln_regs), 2958 }; 2959 2960 static struct cdns_torrent_vals dp_pcie_xcvr_diag_ln_vals = { 2961 .reg_pairs = dp_pcie_xcvr_diag_ln_regs, 2962 .num_regs = ARRAY_SIZE(dp_pcie_xcvr_diag_ln_regs), 2963 }; 2964 2965 /* DP Multilink, 100 MHz Ref clk, no SSC */ 2966 static struct cdns_reg_pairs dp_100_no_ssc_cmn_regs[] = { 2967 {0x007F, CMN_TXPUCAL_TUNE}, 2968 {0x007F, CMN_TXPDCAL_TUNE} 2969 }; 2970 2971 static struct cdns_reg_pairs dp_100_no_ssc_tx_ln_regs[] = { 2972 {0x00FB, TX_PSC_A0}, 2973 {0x04AA, TX_PSC_A2}, 2974 {0x04AA, TX_PSC_A3}, 2975 {0x000F, XCVR_DIAG_BIDI_CTRL} 2976 }; 2977 2978 static struct cdns_reg_pairs dp_100_no_ssc_rx_ln_regs[] = { 2979 {0x0000, RX_PSC_A0}, 2980 {0x0000, RX_PSC_A2}, 2981 {0x0000, RX_PSC_A3}, 2982 {0x0000, RX_PSC_CAL}, 2983 {0x0000, RX_REE_GCSM1_CTRL}, 2984 {0x0000, RX_REE_GCSM2_CTRL}, 2985 {0x0000, RX_REE_PERGCSM_CTRL} 2986 }; 2987 2988 static struct cdns_torrent_vals dp_100_no_ssc_cmn_vals = { 2989 .reg_pairs = dp_100_no_ssc_cmn_regs, 2990 .num_regs = ARRAY_SIZE(dp_100_no_ssc_cmn_regs), 2991 }; 2992 2993 static struct cdns_torrent_vals dp_100_no_ssc_tx_ln_vals = { 2994 .reg_pairs = dp_100_no_ssc_tx_ln_regs, 2995 .num_regs = ARRAY_SIZE(dp_100_no_ssc_tx_ln_regs), 2996 }; 2997 2998 static struct cdns_torrent_vals dp_100_no_ssc_rx_ln_vals = { 2999 .reg_pairs = dp_100_no_ssc_rx_ln_regs, 3000 .num_regs = ARRAY_SIZE(dp_100_no_ssc_rx_ln_regs), 3001 }; 3002 3003 /* Single DisplayPort(DP) link configuration */ 3004 static struct cdns_reg_pairs sl_dp_link_cmn_regs[] = { 3005 {0x0000, PHY_PLL_CFG}, 3006 }; 3007 3008 static struct cdns_reg_pairs sl_dp_xcvr_diag_ln_regs[] = { 3009 {0x0000, XCVR_DIAG_HSCLK_SEL}, 3010 {0x0001, XCVR_DIAG_PLLDRC_CTRL} 3011 }; 3012 3013 static struct cdns_torrent_vals sl_dp_link_cmn_vals = { 3014 .reg_pairs = sl_dp_link_cmn_regs, 3015 .num_regs = ARRAY_SIZE(sl_dp_link_cmn_regs), 3016 }; 3017 3018 static struct cdns_torrent_vals sl_dp_xcvr_diag_ln_vals = { 3019 .reg_pairs = sl_dp_xcvr_diag_ln_regs, 3020 .num_regs = ARRAY_SIZE(sl_dp_xcvr_diag_ln_regs), 3021 }; 3022 3023 /* Single DP, 19.2 MHz Ref clk, no SSC */ 3024 static struct cdns_reg_pairs sl_dp_19_2_no_ssc_cmn_regs[] = { 3025 {0x0014, CMN_SSM_BIAS_TMR}, 3026 {0x0027, CMN_PLLSM0_PLLPRE_TMR}, 3027 {0x00A1, CMN_PLLSM0_PLLLOCK_TMR}, 3028 {0x0027, CMN_PLLSM1_PLLPRE_TMR}, 3029 {0x00A1, CMN_PLLSM1_PLLLOCK_TMR}, 3030 {0x0060, CMN_BGCAL_INIT_TMR}, 3031 {0x0060, CMN_BGCAL_ITER_TMR}, 3032 {0x0014, CMN_IBCAL_INIT_TMR}, 3033 {0x0018, CMN_TXPUCAL_INIT_TMR}, 3034 {0x0005, CMN_TXPUCAL_ITER_TMR}, 3035 {0x0018, CMN_TXPDCAL_INIT_TMR}, 3036 {0x0005, CMN_TXPDCAL_ITER_TMR}, 3037 {0x0240, CMN_RXCAL_INIT_TMR}, 3038 {0x0005, CMN_RXCAL_ITER_TMR}, 3039 {0x0002, CMN_SD_CAL_INIT_TMR}, 3040 {0x0002, CMN_SD_CAL_ITER_TMR}, 3041 {0x000B, CMN_SD_CAL_REFTIM_START}, 3042 {0x0137, CMN_SD_CAL_PLLCNT_START}, 3043 {0x0509, CMN_PDIAG_PLL0_CP_PADJ_M0}, 3044 {0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M0}, 3045 {0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M0}, 3046 {0x0004, CMN_PLL0_DSM_DIAG_M0}, 3047 {0x0509, CMN_PDIAG_PLL1_CP_PADJ_M0}, 3048 {0x0F00, CMN_PDIAG_PLL1_CP_IADJ_M0}, 3049 {0x0F08, CMN_PDIAG_PLL1_FILT_PADJ_M0}, 3050 {0x0004, CMN_PLL1_DSM_DIAG_M0}, 3051 {0x00C0, CMN_PLL0_VCOCAL_INIT_TMR}, 3052 {0x0004, CMN_PLL0_VCOCAL_ITER_TMR}, 3053 {0x00C0, CMN_PLL1_VCOCAL_INIT_TMR}, 3054 {0x0004, CMN_PLL1_VCOCAL_ITER_TMR}, 3055 {0x0260, CMN_PLL0_VCOCAL_REFTIM_START}, 3056 {0x0003, CMN_PLL0_VCOCAL_TCTRL}, 3057 {0x0260, CMN_PLL1_VCOCAL_REFTIM_START}, 3058 {0x0003, CMN_PLL1_VCOCAL_TCTRL} 3059 }; 3060 3061 static struct cdns_reg_pairs sl_dp_19_2_no_ssc_tx_ln_regs[] = { 3062 {0x0780, TX_RCVDET_ST_TMR}, 3063 {0x00FB, TX_PSC_A0}, 3064 {0x04AA, TX_PSC_A2}, 3065 {0x04AA, TX_PSC_A3}, 3066 {0x000F, XCVR_DIAG_BIDI_CTRL} 3067 }; 3068 3069 static struct cdns_reg_pairs sl_dp_19_2_no_ssc_rx_ln_regs[] = { 3070 {0x0000, RX_PSC_A0}, 3071 {0x0000, RX_PSC_A2}, 3072 {0x0000, RX_PSC_A3}, 3073 {0x0000, RX_PSC_CAL}, 3074 {0x0000, RX_REE_GCSM1_CTRL}, 3075 {0x0000, RX_REE_GCSM2_CTRL}, 3076 {0x0000, RX_REE_PERGCSM_CTRL} 3077 }; 3078 3079 static struct cdns_torrent_vals sl_dp_19_2_no_ssc_cmn_vals = { 3080 .reg_pairs = sl_dp_19_2_no_ssc_cmn_regs, 3081 .num_regs = ARRAY_SIZE(sl_dp_19_2_no_ssc_cmn_regs), 3082 }; 3083 3084 static struct cdns_torrent_vals sl_dp_19_2_no_ssc_tx_ln_vals = { 3085 .reg_pairs = sl_dp_19_2_no_ssc_tx_ln_regs, 3086 .num_regs = ARRAY_SIZE(sl_dp_19_2_no_ssc_tx_ln_regs), 3087 }; 3088 3089 static struct cdns_torrent_vals sl_dp_19_2_no_ssc_rx_ln_vals = { 3090 .reg_pairs = sl_dp_19_2_no_ssc_rx_ln_regs, 3091 .num_regs = ARRAY_SIZE(sl_dp_19_2_no_ssc_rx_ln_regs), 3092 }; 3093 3094 /* Single DP, 25 MHz Ref clk, no SSC */ 3095 static struct cdns_reg_pairs sl_dp_25_no_ssc_cmn_regs[] = { 3096 {0x0019, CMN_SSM_BIAS_TMR}, 3097 {0x0032, CMN_PLLSM0_PLLPRE_TMR}, 3098 {0x00D1, CMN_PLLSM0_PLLLOCK_TMR}, 3099 {0x0032, CMN_PLLSM1_PLLPRE_TMR}, 3100 {0x00D1, CMN_PLLSM1_PLLLOCK_TMR}, 3101 {0x007D, CMN_BGCAL_INIT_TMR}, 3102 {0x007D, CMN_BGCAL_ITER_TMR}, 3103 {0x0019, CMN_IBCAL_INIT_TMR}, 3104 {0x001E, CMN_TXPUCAL_INIT_TMR}, 3105 {0x0006, CMN_TXPUCAL_ITER_TMR}, 3106 {0x001E, CMN_TXPDCAL_INIT_TMR}, 3107 {0x0006, CMN_TXPDCAL_ITER_TMR}, 3108 {0x02EE, CMN_RXCAL_INIT_TMR}, 3109 {0x0006, CMN_RXCAL_ITER_TMR}, 3110 {0x0002, CMN_SD_CAL_INIT_TMR}, 3111 {0x0002, CMN_SD_CAL_ITER_TMR}, 3112 {0x000E, CMN_SD_CAL_REFTIM_START}, 3113 {0x012B, CMN_SD_CAL_PLLCNT_START}, 3114 {0x0509, CMN_PDIAG_PLL0_CP_PADJ_M0}, 3115 {0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M0}, 3116 {0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M0}, 3117 {0x0004, CMN_PLL0_DSM_DIAG_M0}, 3118 {0x0509, CMN_PDIAG_PLL1_CP_PADJ_M0}, 3119 {0x0F00, CMN_PDIAG_PLL1_CP_IADJ_M0}, 3120 {0x0F08, CMN_PDIAG_PLL1_FILT_PADJ_M0}, 3121 {0x0004, CMN_PLL1_DSM_DIAG_M0}, 3122 {0x00FA, CMN_PLL0_VCOCAL_INIT_TMR}, 3123 {0x0004, CMN_PLL0_VCOCAL_ITER_TMR}, 3124 {0x00FA, CMN_PLL1_VCOCAL_INIT_TMR}, 3125 {0x0004, CMN_PLL1_VCOCAL_ITER_TMR}, 3126 {0x0317, CMN_PLL0_VCOCAL_REFTIM_START}, 3127 {0x0003, CMN_PLL0_VCOCAL_TCTRL}, 3128 {0x0317, CMN_PLL1_VCOCAL_REFTIM_START}, 3129 {0x0003, CMN_PLL1_VCOCAL_TCTRL} 3130 }; 3131 3132 static struct cdns_reg_pairs sl_dp_25_no_ssc_tx_ln_regs[] = { 3133 {0x09C4, TX_RCVDET_ST_TMR}, 3134 {0x00FB, TX_PSC_A0}, 3135 {0x04AA, TX_PSC_A2}, 3136 {0x04AA, TX_PSC_A3}, 3137 {0x000F, XCVR_DIAG_BIDI_CTRL} 3138 }; 3139 3140 static struct cdns_reg_pairs sl_dp_25_no_ssc_rx_ln_regs[] = { 3141 {0x0000, RX_PSC_A0}, 3142 {0x0000, RX_PSC_A2}, 3143 {0x0000, RX_PSC_A3}, 3144 {0x0000, RX_PSC_CAL}, 3145 {0x0000, RX_REE_GCSM1_CTRL}, 3146 {0x0000, RX_REE_GCSM2_CTRL}, 3147 {0x0000, RX_REE_PERGCSM_CTRL} 3148 }; 3149 3150 static struct cdns_torrent_vals sl_dp_25_no_ssc_cmn_vals = { 3151 .reg_pairs = sl_dp_25_no_ssc_cmn_regs, 3152 .num_regs = ARRAY_SIZE(sl_dp_25_no_ssc_cmn_regs), 3153 }; 3154 3155 static struct cdns_torrent_vals sl_dp_25_no_ssc_tx_ln_vals = { 3156 .reg_pairs = sl_dp_25_no_ssc_tx_ln_regs, 3157 .num_regs = ARRAY_SIZE(sl_dp_25_no_ssc_tx_ln_regs), 3158 }; 3159 3160 static struct cdns_torrent_vals sl_dp_25_no_ssc_rx_ln_vals = { 3161 .reg_pairs = sl_dp_25_no_ssc_rx_ln_regs, 3162 .num_regs = ARRAY_SIZE(sl_dp_25_no_ssc_rx_ln_regs), 3163 }; 3164 3165 /* Single DP, 100 MHz Ref clk, no SSC */ 3166 static struct cdns_reg_pairs sl_dp_100_no_ssc_cmn_regs[] = { 3167 {0x0003, CMN_PLL0_VCOCAL_TCTRL}, 3168 {0x0003, CMN_PLL1_VCOCAL_TCTRL} 3169 }; 3170 3171 static struct cdns_reg_pairs sl_dp_100_no_ssc_tx_ln_regs[] = { 3172 {0x00FB, TX_PSC_A0}, 3173 {0x04AA, TX_PSC_A2}, 3174 {0x04AA, TX_PSC_A3}, 3175 {0x000F, XCVR_DIAG_BIDI_CTRL} 3176 }; 3177 3178 static struct cdns_reg_pairs sl_dp_100_no_ssc_rx_ln_regs[] = { 3179 {0x0000, RX_PSC_A0}, 3180 {0x0000, RX_PSC_A2}, 3181 {0x0000, RX_PSC_A3}, 3182 {0x0000, RX_PSC_CAL}, 3183 {0x0000, RX_REE_GCSM1_CTRL}, 3184 {0x0000, RX_REE_GCSM2_CTRL}, 3185 {0x0000, RX_REE_PERGCSM_CTRL} 3186 }; 3187 3188 static struct cdns_torrent_vals sl_dp_100_no_ssc_cmn_vals = { 3189 .reg_pairs = sl_dp_100_no_ssc_cmn_regs, 3190 .num_regs = ARRAY_SIZE(sl_dp_100_no_ssc_cmn_regs), 3191 }; 3192 3193 static struct cdns_torrent_vals sl_dp_100_no_ssc_tx_ln_vals = { 3194 .reg_pairs = sl_dp_100_no_ssc_tx_ln_regs, 3195 .num_regs = ARRAY_SIZE(sl_dp_100_no_ssc_tx_ln_regs), 3196 }; 3197 3198 static struct cdns_torrent_vals sl_dp_100_no_ssc_rx_ln_vals = { 3199 .reg_pairs = sl_dp_100_no_ssc_rx_ln_regs, 3200 .num_regs = ARRAY_SIZE(sl_dp_100_no_ssc_rx_ln_regs), 3201 }; 3202 3203 /* USB and SGMII/QSGMII link configuration */ 3204 static struct cdns_reg_pairs usb_sgmii_link_cmn_regs[] = { 3205 {0x0002, PHY_PLL_CFG}, 3206 {0x8600, CMN_PDIAG_PLL0_CLK_SEL_M0}, 3207 {0x0601, CMN_PDIAG_PLL1_CLK_SEL_M0} 3208 }; 3209 3210 static struct cdns_reg_pairs usb_sgmii_xcvr_diag_ln_regs[] = { 3211 {0x0000, XCVR_DIAG_HSCLK_SEL}, 3212 {0x0001, XCVR_DIAG_HSCLK_DIV}, 3213 {0x0041, XCVR_DIAG_PLLDRC_CTRL} 3214 }; 3215 3216 static struct cdns_reg_pairs sgmii_usb_xcvr_diag_ln_regs[] = { 3217 {0x0011, XCVR_DIAG_HSCLK_SEL}, 3218 {0x0003, XCVR_DIAG_HSCLK_DIV}, 3219 {0x009B, XCVR_DIAG_PLLDRC_CTRL} 3220 }; 3221 3222 static struct cdns_torrent_vals usb_sgmii_link_cmn_vals = { 3223 .reg_pairs = usb_sgmii_link_cmn_regs, 3224 .num_regs = ARRAY_SIZE(usb_sgmii_link_cmn_regs), 3225 }; 3226 3227 static struct cdns_torrent_vals usb_sgmii_xcvr_diag_ln_vals = { 3228 .reg_pairs = usb_sgmii_xcvr_diag_ln_regs, 3229 .num_regs = ARRAY_SIZE(usb_sgmii_xcvr_diag_ln_regs), 3230 }; 3231 3232 static struct cdns_torrent_vals sgmii_usb_xcvr_diag_ln_vals = { 3233 .reg_pairs = sgmii_usb_xcvr_diag_ln_regs, 3234 .num_regs = ARRAY_SIZE(sgmii_usb_xcvr_diag_ln_regs), 3235 }; 3236 3237 /* PCIe and USB Unique SSC link configuration */ 3238 static struct cdns_reg_pairs pcie_usb_link_cmn_regs[] = { 3239 {0x0003, PHY_PLL_CFG}, 3240 {0x0601, CMN_PDIAG_PLL0_CLK_SEL_M0}, 3241 {0x0400, CMN_PDIAG_PLL0_CLK_SEL_M1}, 3242 {0x8600, CMN_PDIAG_PLL1_CLK_SEL_M0} 3243 }; 3244 3245 static struct cdns_reg_pairs pcie_usb_xcvr_diag_ln_regs[] = { 3246 {0x0000, XCVR_DIAG_HSCLK_SEL}, 3247 {0x0001, XCVR_DIAG_HSCLK_DIV}, 3248 {0x0012, XCVR_DIAG_PLLDRC_CTRL} 3249 }; 3250 3251 static struct cdns_reg_pairs usb_pcie_xcvr_diag_ln_regs[] = { 3252 {0x0011, XCVR_DIAG_HSCLK_SEL}, 3253 {0x0001, XCVR_DIAG_HSCLK_DIV}, 3254 {0x00C9, XCVR_DIAG_PLLDRC_CTRL} 3255 }; 3256 3257 static struct cdns_torrent_vals pcie_usb_link_cmn_vals = { 3258 .reg_pairs = pcie_usb_link_cmn_regs, 3259 .num_regs = ARRAY_SIZE(pcie_usb_link_cmn_regs), 3260 }; 3261 3262 static struct cdns_torrent_vals pcie_usb_xcvr_diag_ln_vals = { 3263 .reg_pairs = pcie_usb_xcvr_diag_ln_regs, 3264 .num_regs = ARRAY_SIZE(pcie_usb_xcvr_diag_ln_regs), 3265 }; 3266 3267 static struct cdns_torrent_vals usb_pcie_xcvr_diag_ln_vals = { 3268 .reg_pairs = usb_pcie_xcvr_diag_ln_regs, 3269 .num_regs = ARRAY_SIZE(usb_pcie_xcvr_diag_ln_regs), 3270 }; 3271 3272 /* USB 100 MHz Ref clk, internal SSC */ 3273 static struct cdns_reg_pairs usb_100_int_ssc_cmn_regs[] = { 3274 {0x0004, CMN_PLL0_DSM_DIAG_M0}, 3275 {0x0004, CMN_PLL0_DSM_DIAG_M1}, 3276 {0x0004, CMN_PLL1_DSM_DIAG_M0}, 3277 {0x0509, CMN_PDIAG_PLL0_CP_PADJ_M0}, 3278 {0x0509, CMN_PDIAG_PLL0_CP_PADJ_M1}, 3279 {0x0509, CMN_PDIAG_PLL1_CP_PADJ_M0}, 3280 {0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M0}, 3281 {0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M1}, 3282 {0x0F00, CMN_PDIAG_PLL1_CP_IADJ_M0}, 3283 {0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M0}, 3284 {0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M1}, 3285 {0x0F08, CMN_PDIAG_PLL1_FILT_PADJ_M0}, 3286 {0x0064, CMN_PLL0_INTDIV_M0}, 3287 {0x0050, CMN_PLL0_INTDIV_M1}, 3288 {0x0064, CMN_PLL1_INTDIV_M0}, 3289 {0x0002, CMN_PLL0_FRACDIVH_M0}, 3290 {0x0002, CMN_PLL0_FRACDIVH_M1}, 3291 {0x0002, CMN_PLL1_FRACDIVH_M0}, 3292 {0x0044, CMN_PLL0_HIGH_THR_M0}, 3293 {0x0036, CMN_PLL0_HIGH_THR_M1}, 3294 {0x0044, CMN_PLL1_HIGH_THR_M0}, 3295 {0x0002, CMN_PDIAG_PLL0_CTRL_M0}, 3296 {0x0002, CMN_PDIAG_PLL0_CTRL_M1}, 3297 {0x0002, CMN_PDIAG_PLL1_CTRL_M0}, 3298 {0x0001, CMN_PLL0_SS_CTRL1_M0}, 3299 {0x0001, CMN_PLL0_SS_CTRL1_M1}, 3300 {0x0001, CMN_PLL1_SS_CTRL1_M0}, 3301 {0x011B, CMN_PLL0_SS_CTRL2_M0}, 3302 {0x011B, CMN_PLL0_SS_CTRL2_M1}, 3303 {0x011B, CMN_PLL1_SS_CTRL2_M0}, 3304 {0x006E, CMN_PLL0_SS_CTRL3_M0}, 3305 {0x0058, CMN_PLL0_SS_CTRL3_M1}, 3306 {0x006E, CMN_PLL1_SS_CTRL3_M0}, 3307 {0x000E, CMN_PLL0_SS_CTRL4_M0}, 3308 {0x0012, CMN_PLL0_SS_CTRL4_M1}, 3309 {0x000E, CMN_PLL1_SS_CTRL4_M0}, 3310 {0x0C5E, CMN_PLL0_VCOCAL_REFTIM_START}, 3311 {0x0C5E, CMN_PLL1_VCOCAL_REFTIM_START}, 3312 {0x0C56, CMN_PLL0_VCOCAL_PLLCNT_START}, 3313 {0x0C56, CMN_PLL1_VCOCAL_PLLCNT_START}, 3314 {0x00C7, CMN_PLL0_LOCK_REFCNT_START}, 3315 {0x00C7, CMN_PLL1_LOCK_REFCNT_START}, 3316 {0x00C7, CMN_PLL0_LOCK_PLLCNT_START}, 3317 {0x00C7, CMN_PLL1_LOCK_PLLCNT_START}, 3318 {0x0005, CMN_PLL0_LOCK_PLLCNT_THR}, 3319 {0x0005, CMN_PLL1_LOCK_PLLCNT_THR}, 3320 {0x8200, CMN_CDIAG_CDB_PWRI_OVRD}, 3321 {0x8200, CMN_CDIAG_XCVRC_PWRI_OVRD}, 3322 {0x007F, CMN_TXPUCAL_TUNE}, 3323 {0x007F, CMN_TXPDCAL_TUNE} 3324 }; 3325 3326 static struct cdns_torrent_vals usb_100_int_ssc_cmn_vals = { 3327 .reg_pairs = usb_100_int_ssc_cmn_regs, 3328 .num_regs = ARRAY_SIZE(usb_100_int_ssc_cmn_regs), 3329 }; 3330 3331 /* Single USB link configuration */ 3332 static struct cdns_reg_pairs sl_usb_link_cmn_regs[] = { 3333 {0x0000, PHY_PLL_CFG}, 3334 {0x8600, CMN_PDIAG_PLL0_CLK_SEL_M0} 3335 }; 3336 3337 static struct cdns_reg_pairs sl_usb_xcvr_diag_ln_regs[] = { 3338 {0x0000, XCVR_DIAG_HSCLK_SEL}, 3339 {0x0001, XCVR_DIAG_HSCLK_DIV}, 3340 {0x0041, XCVR_DIAG_PLLDRC_CTRL} 3341 }; 3342 3343 static struct cdns_torrent_vals sl_usb_link_cmn_vals = { 3344 .reg_pairs = sl_usb_link_cmn_regs, 3345 .num_regs = ARRAY_SIZE(sl_usb_link_cmn_regs), 3346 }; 3347 3348 static struct cdns_torrent_vals sl_usb_xcvr_diag_ln_vals = { 3349 .reg_pairs = sl_usb_xcvr_diag_ln_regs, 3350 .num_regs = ARRAY_SIZE(sl_usb_xcvr_diag_ln_regs), 3351 }; 3352 3353 /* USB PHY PCS common configuration */ 3354 static struct cdns_reg_pairs usb_phy_pcs_cmn_regs[] = { 3355 {0x0A0A, PHY_PIPE_USB3_GEN2_PRE_CFG0}, 3356 {0x1000, PHY_PIPE_USB3_GEN2_POST_CFG0}, 3357 {0x0010, PHY_PIPE_USB3_GEN2_POST_CFG1} 3358 }; 3359 3360 static struct cdns_torrent_vals usb_phy_pcs_cmn_vals = { 3361 .reg_pairs = usb_phy_pcs_cmn_regs, 3362 .num_regs = ARRAY_SIZE(usb_phy_pcs_cmn_regs), 3363 }; 3364 3365 /* USB 100 MHz Ref clk, no SSC */ 3366 static struct cdns_reg_pairs sl_usb_100_no_ssc_cmn_regs[] = { 3367 {0x0028, CMN_PDIAG_PLL1_CP_PADJ_M0}, 3368 {0x001E, CMN_PLL1_DSM_FBH_OVRD_M0}, 3369 {0x000C, CMN_PLL1_DSM_FBL_OVRD_M0}, 3370 {0x0003, CMN_PLL0_VCOCAL_TCTRL}, 3371 {0x0003, CMN_PLL1_VCOCAL_TCTRL}, 3372 {0x8200, CMN_CDIAG_CDB_PWRI_OVRD}, 3373 {0x8200, CMN_CDIAG_XCVRC_PWRI_OVRD} 3374 }; 3375 3376 static struct cdns_torrent_vals sl_usb_100_no_ssc_cmn_vals = { 3377 .reg_pairs = sl_usb_100_no_ssc_cmn_regs, 3378 .num_regs = ARRAY_SIZE(sl_usb_100_no_ssc_cmn_regs), 3379 }; 3380 3381 static struct cdns_reg_pairs usb_100_no_ssc_cmn_regs[] = { 3382 {0x8200, CMN_CDIAG_CDB_PWRI_OVRD}, 3383 {0x8200, CMN_CDIAG_XCVRC_PWRI_OVRD}, 3384 {0x007F, CMN_TXPUCAL_TUNE}, 3385 {0x007F, CMN_TXPDCAL_TUNE} 3386 }; 3387 3388 static struct cdns_reg_pairs usb_100_no_ssc_tx_ln_regs[] = { 3389 {0x02FF, TX_PSC_A0}, 3390 {0x06AF, TX_PSC_A1}, 3391 {0x06AE, TX_PSC_A2}, 3392 {0x06AE, TX_PSC_A3}, 3393 {0x2A82, TX_TXCC_CTRL}, 3394 {0x0014, TX_TXCC_CPOST_MULT_01}, 3395 {0x0003, XCVR_DIAG_PSC_OVRD} 3396 }; 3397 3398 static struct cdns_reg_pairs usb_100_no_ssc_rx_ln_regs[] = { 3399 {0x0D1D, RX_PSC_A0}, 3400 {0x0D1D, RX_PSC_A1}, 3401 {0x0D00, RX_PSC_A2}, 3402 {0x0500, RX_PSC_A3}, 3403 {0x0013, RX_SIGDET_HL_FILT_TMR}, 3404 {0x0000, RX_REE_GCSM1_CTRL}, 3405 {0x0C02, RX_REE_ATTEN_THR}, 3406 {0x0330, RX_REE_SMGM_CTRL1}, 3407 {0x0300, RX_REE_SMGM_CTRL2}, 3408 {0x0019, RX_REE_TAP1_CLIP}, 3409 {0x0019, RX_REE_TAP2TON_CLIP}, 3410 {0x1004, RX_DIAG_SIGDET_TUNE}, 3411 {0x00F9, RX_DIAG_NQST_CTRL}, 3412 {0x0C01, RX_DIAG_DFE_AMP_TUNE_2}, 3413 {0x0002, RX_DIAG_DFE_AMP_TUNE_3}, 3414 {0x0000, RX_DIAG_PI_CAP}, 3415 {0x0031, RX_DIAG_PI_RATE}, 3416 {0x0001, RX_DIAG_ACYA}, 3417 {0x018C, RX_CDRLF_CNFG}, 3418 {0x0003, RX_CDRLF_CNFG3} 3419 }; 3420 3421 static struct cdns_torrent_vals usb_100_no_ssc_cmn_vals = { 3422 .reg_pairs = usb_100_no_ssc_cmn_regs, 3423 .num_regs = ARRAY_SIZE(usb_100_no_ssc_cmn_regs), 3424 }; 3425 3426 static struct cdns_torrent_vals usb_100_no_ssc_tx_ln_vals = { 3427 .reg_pairs = usb_100_no_ssc_tx_ln_regs, 3428 .num_regs = ARRAY_SIZE(usb_100_no_ssc_tx_ln_regs), 3429 }; 3430 3431 static struct cdns_torrent_vals usb_100_no_ssc_rx_ln_vals = { 3432 .reg_pairs = usb_100_no_ssc_rx_ln_regs, 3433 .num_regs = ARRAY_SIZE(usb_100_no_ssc_rx_ln_regs), 3434 }; 3435 3436 /* Single link USB, 100 MHz Ref clk, internal SSC */ 3437 static struct cdns_reg_pairs sl_usb_100_int_ssc_cmn_regs[] = { 3438 {0x0004, CMN_PLL0_DSM_DIAG_M0}, 3439 {0x0004, CMN_PLL1_DSM_DIAG_M0}, 3440 {0x0509, CMN_PDIAG_PLL0_CP_PADJ_M0}, 3441 {0x0509, CMN_PDIAG_PLL1_CP_PADJ_M0}, 3442 {0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M0}, 3443 {0x0F00, CMN_PDIAG_PLL1_CP_IADJ_M0}, 3444 {0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M0}, 3445 {0x0F08, CMN_PDIAG_PLL1_FILT_PADJ_M0}, 3446 {0x0064, CMN_PLL0_INTDIV_M0}, 3447 {0x0064, CMN_PLL1_INTDIV_M0}, 3448 {0x0002, CMN_PLL0_FRACDIVH_M0}, 3449 {0x0002, CMN_PLL1_FRACDIVH_M0}, 3450 {0x0044, CMN_PLL0_HIGH_THR_M0}, 3451 {0x0044, CMN_PLL1_HIGH_THR_M0}, 3452 {0x0002, CMN_PDIAG_PLL0_CTRL_M0}, 3453 {0x0002, CMN_PDIAG_PLL1_CTRL_M0}, 3454 {0x0001, CMN_PLL0_SS_CTRL1_M0}, 3455 {0x0001, CMN_PLL1_SS_CTRL1_M0}, 3456 {0x011B, CMN_PLL0_SS_CTRL2_M0}, 3457 {0x011B, CMN_PLL1_SS_CTRL2_M0}, 3458 {0x006E, CMN_PLL0_SS_CTRL3_M0}, 3459 {0x006E, CMN_PLL1_SS_CTRL3_M0}, 3460 {0x000E, CMN_PLL0_SS_CTRL4_M0}, 3461 {0x000E, CMN_PLL1_SS_CTRL4_M0}, 3462 {0x0C5E, CMN_PLL0_VCOCAL_REFTIM_START}, 3463 {0x0C5E, CMN_PLL1_VCOCAL_REFTIM_START}, 3464 {0x0C56, CMN_PLL0_VCOCAL_PLLCNT_START}, 3465 {0x0C56, CMN_PLL1_VCOCAL_PLLCNT_START}, 3466 {0x0003, CMN_PLL0_VCOCAL_TCTRL}, 3467 {0x0003, CMN_PLL1_VCOCAL_TCTRL}, 3468 {0x00C7, CMN_PLL0_LOCK_REFCNT_START}, 3469 {0x00C7, CMN_PLL1_LOCK_REFCNT_START}, 3470 {0x00C7, CMN_PLL0_LOCK_PLLCNT_START}, 3471 {0x00C7, CMN_PLL1_LOCK_PLLCNT_START}, 3472 {0x0005, CMN_PLL0_LOCK_PLLCNT_THR}, 3473 {0x0005, CMN_PLL1_LOCK_PLLCNT_THR}, 3474 {0x8200, CMN_CDIAG_CDB_PWRI_OVRD}, 3475 {0x8200, CMN_CDIAG_XCVRC_PWRI_OVRD} 3476 }; 3477 3478 static struct cdns_torrent_vals sl_usb_100_int_ssc_cmn_vals = { 3479 .reg_pairs = sl_usb_100_int_ssc_cmn_regs, 3480 .num_regs = ARRAY_SIZE(sl_usb_100_int_ssc_cmn_regs), 3481 }; 3482 3483 /* PCIe and SGMII/QSGMII Unique SSC link configuration */ 3484 static struct cdns_reg_pairs pcie_sgmii_link_cmn_regs[] = { 3485 {0x0003, PHY_PLL_CFG}, 3486 {0x0601, CMN_PDIAG_PLL0_CLK_SEL_M0}, 3487 {0x0400, CMN_PDIAG_PLL0_CLK_SEL_M1}, 3488 {0x0601, CMN_PDIAG_PLL1_CLK_SEL_M0} 3489 }; 3490 3491 static struct cdns_reg_pairs pcie_sgmii_xcvr_diag_ln_regs[] = { 3492 {0x0000, XCVR_DIAG_HSCLK_SEL}, 3493 {0x0001, XCVR_DIAG_HSCLK_DIV}, 3494 {0x0012, XCVR_DIAG_PLLDRC_CTRL} 3495 }; 3496 3497 static struct cdns_reg_pairs sgmii_pcie_xcvr_diag_ln_regs[] = { 3498 {0x0011, XCVR_DIAG_HSCLK_SEL}, 3499 {0x0003, XCVR_DIAG_HSCLK_DIV}, 3500 {0x009B, XCVR_DIAG_PLLDRC_CTRL} 3501 }; 3502 3503 static struct cdns_torrent_vals pcie_sgmii_link_cmn_vals = { 3504 .reg_pairs = pcie_sgmii_link_cmn_regs, 3505 .num_regs = ARRAY_SIZE(pcie_sgmii_link_cmn_regs), 3506 }; 3507 3508 static struct cdns_torrent_vals pcie_sgmii_xcvr_diag_ln_vals = { 3509 .reg_pairs = pcie_sgmii_xcvr_diag_ln_regs, 3510 .num_regs = ARRAY_SIZE(pcie_sgmii_xcvr_diag_ln_regs), 3511 }; 3512 3513 static struct cdns_torrent_vals sgmii_pcie_xcvr_diag_ln_vals = { 3514 .reg_pairs = sgmii_pcie_xcvr_diag_ln_regs, 3515 .num_regs = ARRAY_SIZE(sgmii_pcie_xcvr_diag_ln_regs), 3516 }; 3517 3518 /* SGMII 100 MHz Ref clk, no SSC */ 3519 static struct cdns_reg_pairs sl_sgmii_100_no_ssc_cmn_regs[] = { 3520 {0x0028, CMN_PDIAG_PLL1_CP_PADJ_M0}, 3521 {0x001E, CMN_PLL1_DSM_FBH_OVRD_M0}, 3522 {0x000C, CMN_PLL1_DSM_FBL_OVRD_M0}, 3523 {0x0003, CMN_PLL0_VCOCAL_TCTRL}, 3524 {0x0003, CMN_PLL1_VCOCAL_TCTRL} 3525 }; 3526 3527 static struct cdns_torrent_vals sl_sgmii_100_no_ssc_cmn_vals = { 3528 .reg_pairs = sl_sgmii_100_no_ssc_cmn_regs, 3529 .num_regs = ARRAY_SIZE(sl_sgmii_100_no_ssc_cmn_regs), 3530 }; 3531 3532 static struct cdns_reg_pairs sgmii_100_no_ssc_cmn_regs[] = { 3533 {0x007F, CMN_TXPUCAL_TUNE}, 3534 {0x007F, CMN_TXPDCAL_TUNE} 3535 }; 3536 3537 static struct cdns_reg_pairs sgmii_100_no_ssc_tx_ln_regs[] = { 3538 {0x00F3, TX_PSC_A0}, 3539 {0x04A2, TX_PSC_A2}, 3540 {0x04A2, TX_PSC_A3}, 3541 {0x0000, TX_TXCC_CPOST_MULT_00}, 3542 {0x00B3, DRV_DIAG_TX_DRV} 3543 }; 3544 3545 static struct cdns_reg_pairs ti_sgmii_100_no_ssc_tx_ln_regs[] = { 3546 {0x00F3, TX_PSC_A0}, 3547 {0x04A2, TX_PSC_A2}, 3548 {0x04A2, TX_PSC_A3}, 3549 {0x0000, TX_TXCC_CPOST_MULT_00}, 3550 {0x00B3, DRV_DIAG_TX_DRV}, 3551 {0x4000, XCVR_DIAG_RXCLK_CTRL}, 3552 }; 3553 3554 static struct cdns_reg_pairs sgmii_100_no_ssc_rx_ln_regs[] = { 3555 {0x091D, RX_PSC_A0}, 3556 {0x0900, RX_PSC_A2}, 3557 {0x0100, RX_PSC_A3}, 3558 {0x03C7, RX_REE_GCSM1_EQENM_PH1}, 3559 {0x01C7, RX_REE_GCSM1_EQENM_PH2}, 3560 {0x0000, RX_DIAG_DFE_CTRL}, 3561 {0x0019, RX_REE_TAP1_CLIP}, 3562 {0x0019, RX_REE_TAP2TON_CLIP}, 3563 {0x0098, RX_DIAG_NQST_CTRL}, 3564 {0x0C01, RX_DIAG_DFE_AMP_TUNE_2}, 3565 {0x0000, RX_DIAG_DFE_AMP_TUNE_3}, 3566 {0x0000, RX_DIAG_PI_CAP}, 3567 {0x0010, RX_DIAG_PI_RATE}, 3568 {0x0001, RX_DIAG_ACYA}, 3569 {0x018C, RX_CDRLF_CNFG}, 3570 }; 3571 3572 static struct cdns_torrent_vals sgmii_100_no_ssc_cmn_vals = { 3573 .reg_pairs = sgmii_100_no_ssc_cmn_regs, 3574 .num_regs = ARRAY_SIZE(sgmii_100_no_ssc_cmn_regs), 3575 }; 3576 3577 static struct cdns_torrent_vals sgmii_100_no_ssc_tx_ln_vals = { 3578 .reg_pairs = sgmii_100_no_ssc_tx_ln_regs, 3579 .num_regs = ARRAY_SIZE(sgmii_100_no_ssc_tx_ln_regs), 3580 }; 3581 3582 static struct cdns_torrent_vals ti_sgmii_100_no_ssc_tx_ln_vals = { 3583 .reg_pairs = ti_sgmii_100_no_ssc_tx_ln_regs, 3584 .num_regs = ARRAY_SIZE(ti_sgmii_100_no_ssc_tx_ln_regs), 3585 }; 3586 3587 static struct cdns_torrent_vals sgmii_100_no_ssc_rx_ln_vals = { 3588 .reg_pairs = sgmii_100_no_ssc_rx_ln_regs, 3589 .num_regs = ARRAY_SIZE(sgmii_100_no_ssc_rx_ln_regs), 3590 }; 3591 3592 /* SGMII 100 MHz Ref clk, internal SSC */ 3593 static struct cdns_reg_pairs sgmii_100_int_ssc_cmn_regs[] = { 3594 {0x0004, CMN_PLL0_DSM_DIAG_M0}, 3595 {0x0004, CMN_PLL0_DSM_DIAG_M1}, 3596 {0x0004, CMN_PLL1_DSM_DIAG_M0}, 3597 {0x0509, CMN_PDIAG_PLL0_CP_PADJ_M0}, 3598 {0x0509, CMN_PDIAG_PLL0_CP_PADJ_M1}, 3599 {0x0509, CMN_PDIAG_PLL1_CP_PADJ_M0}, 3600 {0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M0}, 3601 {0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M1}, 3602 {0x0F00, CMN_PDIAG_PLL1_CP_IADJ_M0}, 3603 {0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M0}, 3604 {0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M1}, 3605 {0x0F08, CMN_PDIAG_PLL1_FILT_PADJ_M0}, 3606 {0x0064, CMN_PLL0_INTDIV_M0}, 3607 {0x0050, CMN_PLL0_INTDIV_M1}, 3608 {0x0064, CMN_PLL1_INTDIV_M0}, 3609 {0x0002, CMN_PLL0_FRACDIVH_M0}, 3610 {0x0002, CMN_PLL0_FRACDIVH_M1}, 3611 {0x0002, CMN_PLL1_FRACDIVH_M0}, 3612 {0x0044, CMN_PLL0_HIGH_THR_M0}, 3613 {0x0036, CMN_PLL0_HIGH_THR_M1}, 3614 {0x0044, CMN_PLL1_HIGH_THR_M0}, 3615 {0x0002, CMN_PDIAG_PLL0_CTRL_M0}, 3616 {0x0002, CMN_PDIAG_PLL0_CTRL_M1}, 3617 {0x0002, CMN_PDIAG_PLL1_CTRL_M0}, 3618 {0x0001, CMN_PLL0_SS_CTRL1_M0}, 3619 {0x0001, CMN_PLL0_SS_CTRL1_M1}, 3620 {0x0001, CMN_PLL1_SS_CTRL1_M0}, 3621 {0x011B, CMN_PLL0_SS_CTRL2_M0}, 3622 {0x011B, CMN_PLL0_SS_CTRL2_M1}, 3623 {0x011B, CMN_PLL1_SS_CTRL2_M0}, 3624 {0x006E, CMN_PLL0_SS_CTRL3_M0}, 3625 {0x0058, CMN_PLL0_SS_CTRL3_M1}, 3626 {0x006E, CMN_PLL1_SS_CTRL3_M0}, 3627 {0x000E, CMN_PLL0_SS_CTRL4_M0}, 3628 {0x0012, CMN_PLL0_SS_CTRL4_M1}, 3629 {0x000E, CMN_PLL1_SS_CTRL4_M0}, 3630 {0x0C5E, CMN_PLL0_VCOCAL_REFTIM_START}, 3631 {0x0C5E, CMN_PLL1_VCOCAL_REFTIM_START}, 3632 {0x0C56, CMN_PLL0_VCOCAL_PLLCNT_START}, 3633 {0x0C56, CMN_PLL1_VCOCAL_PLLCNT_START}, 3634 {0x00C7, CMN_PLL0_LOCK_REFCNT_START}, 3635 {0x00C7, CMN_PLL1_LOCK_REFCNT_START}, 3636 {0x00C7, CMN_PLL0_LOCK_PLLCNT_START}, 3637 {0x00C7, CMN_PLL1_LOCK_PLLCNT_START}, 3638 {0x0005, CMN_PLL0_LOCK_PLLCNT_THR}, 3639 {0x0005, CMN_PLL1_LOCK_PLLCNT_THR}, 3640 {0x007F, CMN_TXPUCAL_TUNE}, 3641 {0x007F, CMN_TXPDCAL_TUNE} 3642 }; 3643 3644 static struct cdns_torrent_vals sgmii_100_int_ssc_cmn_vals = { 3645 .reg_pairs = sgmii_100_int_ssc_cmn_regs, 3646 .num_regs = ARRAY_SIZE(sgmii_100_int_ssc_cmn_regs), 3647 }; 3648 3649 /* QSGMII 100 MHz Ref clk, no SSC */ 3650 static struct cdns_reg_pairs sl_qsgmii_100_no_ssc_cmn_regs[] = { 3651 {0x0028, CMN_PDIAG_PLL1_CP_PADJ_M0}, 3652 {0x001E, CMN_PLL1_DSM_FBH_OVRD_M0}, 3653 {0x000C, CMN_PLL1_DSM_FBL_OVRD_M0}, 3654 {0x0003, CMN_PLL0_VCOCAL_TCTRL}, 3655 {0x0003, CMN_PLL1_VCOCAL_TCTRL} 3656 }; 3657 3658 static struct cdns_torrent_vals sl_qsgmii_100_no_ssc_cmn_vals = { 3659 .reg_pairs = sl_qsgmii_100_no_ssc_cmn_regs, 3660 .num_regs = ARRAY_SIZE(sl_qsgmii_100_no_ssc_cmn_regs), 3661 }; 3662 3663 static struct cdns_reg_pairs qsgmii_100_no_ssc_cmn_regs[] = { 3664 {0x007F, CMN_TXPUCAL_TUNE}, 3665 {0x007F, CMN_TXPDCAL_TUNE} 3666 }; 3667 3668 static struct cdns_reg_pairs qsgmii_100_no_ssc_tx_ln_regs[] = { 3669 {0x00F3, TX_PSC_A0}, 3670 {0x04A2, TX_PSC_A2}, 3671 {0x04A2, TX_PSC_A3}, 3672 {0x0000, TX_TXCC_CPOST_MULT_00}, 3673 {0x0011, TX_TXCC_MGNFS_MULT_100}, 3674 {0x0003, DRV_DIAG_TX_DRV} 3675 }; 3676 3677 static struct cdns_reg_pairs ti_qsgmii_100_no_ssc_tx_ln_regs[] = { 3678 {0x00F3, TX_PSC_A0}, 3679 {0x04A2, TX_PSC_A2}, 3680 {0x04A2, TX_PSC_A3}, 3681 {0x0000, TX_TXCC_CPOST_MULT_00}, 3682 {0x0011, TX_TXCC_MGNFS_MULT_100}, 3683 {0x0003, DRV_DIAG_TX_DRV}, 3684 {0x4000, XCVR_DIAG_RXCLK_CTRL}, 3685 }; 3686 3687 static struct cdns_reg_pairs qsgmii_100_no_ssc_rx_ln_regs[] = { 3688 {0x091D, RX_PSC_A0}, 3689 {0x0900, RX_PSC_A2}, 3690 {0x0100, RX_PSC_A3}, 3691 {0x03C7, RX_REE_GCSM1_EQENM_PH1}, 3692 {0x01C7, RX_REE_GCSM1_EQENM_PH2}, 3693 {0x0000, RX_DIAG_DFE_CTRL}, 3694 {0x0019, RX_REE_TAP1_CLIP}, 3695 {0x0019, RX_REE_TAP2TON_CLIP}, 3696 {0x0098, RX_DIAG_NQST_CTRL}, 3697 {0x0C01, RX_DIAG_DFE_AMP_TUNE_2}, 3698 {0x0000, RX_DIAG_DFE_AMP_TUNE_3}, 3699 {0x0000, RX_DIAG_PI_CAP}, 3700 {0x0010, RX_DIAG_PI_RATE}, 3701 {0x0001, RX_DIAG_ACYA}, 3702 {0x018C, RX_CDRLF_CNFG}, 3703 }; 3704 3705 static struct cdns_torrent_vals qsgmii_100_no_ssc_cmn_vals = { 3706 .reg_pairs = qsgmii_100_no_ssc_cmn_regs, 3707 .num_regs = ARRAY_SIZE(qsgmii_100_no_ssc_cmn_regs), 3708 }; 3709 3710 static struct cdns_torrent_vals qsgmii_100_no_ssc_tx_ln_vals = { 3711 .reg_pairs = qsgmii_100_no_ssc_tx_ln_regs, 3712 .num_regs = ARRAY_SIZE(qsgmii_100_no_ssc_tx_ln_regs), 3713 }; 3714 3715 static struct cdns_torrent_vals ti_qsgmii_100_no_ssc_tx_ln_vals = { 3716 .reg_pairs = ti_qsgmii_100_no_ssc_tx_ln_regs, 3717 .num_regs = ARRAY_SIZE(ti_qsgmii_100_no_ssc_tx_ln_regs), 3718 }; 3719 3720 static struct cdns_torrent_vals qsgmii_100_no_ssc_rx_ln_vals = { 3721 .reg_pairs = qsgmii_100_no_ssc_rx_ln_regs, 3722 .num_regs = ARRAY_SIZE(qsgmii_100_no_ssc_rx_ln_regs), 3723 }; 3724 3725 /* QSGMII 100 MHz Ref clk, internal SSC */ 3726 static struct cdns_reg_pairs qsgmii_100_int_ssc_cmn_regs[] = { 3727 {0x0004, CMN_PLL0_DSM_DIAG_M0}, 3728 {0x0004, CMN_PLL0_DSM_DIAG_M1}, 3729 {0x0004, CMN_PLL1_DSM_DIAG_M0}, 3730 {0x0509, CMN_PDIAG_PLL0_CP_PADJ_M0}, 3731 {0x0509, CMN_PDIAG_PLL0_CP_PADJ_M1}, 3732 {0x0509, CMN_PDIAG_PLL1_CP_PADJ_M0}, 3733 {0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M0}, 3734 {0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M1}, 3735 {0x0F00, CMN_PDIAG_PLL1_CP_IADJ_M0}, 3736 {0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M0}, 3737 {0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M1}, 3738 {0x0F08, CMN_PDIAG_PLL1_FILT_PADJ_M0}, 3739 {0x0064, CMN_PLL0_INTDIV_M0}, 3740 {0x0050, CMN_PLL0_INTDIV_M1}, 3741 {0x0064, CMN_PLL1_INTDIV_M0}, 3742 {0x0002, CMN_PLL0_FRACDIVH_M0}, 3743 {0x0002, CMN_PLL0_FRACDIVH_M1}, 3744 {0x0002, CMN_PLL1_FRACDIVH_M0}, 3745 {0x0044, CMN_PLL0_HIGH_THR_M0}, 3746 {0x0036, CMN_PLL0_HIGH_THR_M1}, 3747 {0x0044, CMN_PLL1_HIGH_THR_M0}, 3748 {0x0002, CMN_PDIAG_PLL0_CTRL_M0}, 3749 {0x0002, CMN_PDIAG_PLL0_CTRL_M1}, 3750 {0x0002, CMN_PDIAG_PLL1_CTRL_M0}, 3751 {0x0001, CMN_PLL0_SS_CTRL1_M0}, 3752 {0x0001, CMN_PLL0_SS_CTRL1_M1}, 3753 {0x0001, CMN_PLL1_SS_CTRL1_M0}, 3754 {0x011B, CMN_PLL0_SS_CTRL2_M0}, 3755 {0x011B, CMN_PLL0_SS_CTRL2_M1}, 3756 {0x011B, CMN_PLL1_SS_CTRL2_M0}, 3757 {0x006E, CMN_PLL0_SS_CTRL3_M0}, 3758 {0x0058, CMN_PLL0_SS_CTRL3_M1}, 3759 {0x006E, CMN_PLL1_SS_CTRL3_M0}, 3760 {0x000E, CMN_PLL0_SS_CTRL4_M0}, 3761 {0x0012, CMN_PLL0_SS_CTRL4_M1}, 3762 {0x000E, CMN_PLL1_SS_CTRL4_M0}, 3763 {0x0C5E, CMN_PLL0_VCOCAL_REFTIM_START}, 3764 {0x0C5E, CMN_PLL1_VCOCAL_REFTIM_START}, 3765 {0x0C56, CMN_PLL0_VCOCAL_PLLCNT_START}, 3766 {0x0C56, CMN_PLL1_VCOCAL_PLLCNT_START}, 3767 {0x00C7, CMN_PLL0_LOCK_REFCNT_START}, 3768 {0x00C7, CMN_PLL1_LOCK_REFCNT_START}, 3769 {0x00C7, CMN_PLL0_LOCK_PLLCNT_START}, 3770 {0x00C7, CMN_PLL1_LOCK_PLLCNT_START}, 3771 {0x0005, CMN_PLL0_LOCK_PLLCNT_THR}, 3772 {0x0005, CMN_PLL1_LOCK_PLLCNT_THR}, 3773 {0x007F, CMN_TXPUCAL_TUNE}, 3774 {0x007F, CMN_TXPDCAL_TUNE} 3775 }; 3776 3777 static struct cdns_torrent_vals qsgmii_100_int_ssc_cmn_vals = { 3778 .reg_pairs = qsgmii_100_int_ssc_cmn_regs, 3779 .num_regs = ARRAY_SIZE(qsgmii_100_int_ssc_cmn_regs), 3780 }; 3781 3782 /* Single SGMII/QSGMII link configuration */ 3783 static struct cdns_reg_pairs sl_sgmii_link_cmn_regs[] = { 3784 {0x0000, PHY_PLL_CFG}, 3785 {0x0601, CMN_PDIAG_PLL0_CLK_SEL_M0} 3786 }; 3787 3788 static struct cdns_reg_pairs sl_sgmii_xcvr_diag_ln_regs[] = { 3789 {0x0000, XCVR_DIAG_HSCLK_SEL}, 3790 {0x0003, XCVR_DIAG_HSCLK_DIV}, 3791 {0x0013, XCVR_DIAG_PLLDRC_CTRL} 3792 }; 3793 3794 static struct cdns_torrent_vals sl_sgmii_link_cmn_vals = { 3795 .reg_pairs = sl_sgmii_link_cmn_regs, 3796 .num_regs = ARRAY_SIZE(sl_sgmii_link_cmn_regs), 3797 }; 3798 3799 static struct cdns_torrent_vals sl_sgmii_xcvr_diag_ln_vals = { 3800 .reg_pairs = sl_sgmii_xcvr_diag_ln_regs, 3801 .num_regs = ARRAY_SIZE(sl_sgmii_xcvr_diag_ln_regs), 3802 }; 3803 3804 /* Multi link PCIe, 100 MHz Ref clk, internal SSC */ 3805 static struct cdns_reg_pairs pcie_100_int_ssc_cmn_regs[] = { 3806 {0x0004, CMN_PLL0_DSM_DIAG_M0}, 3807 {0x0004, CMN_PLL0_DSM_DIAG_M1}, 3808 {0x0004, CMN_PLL1_DSM_DIAG_M0}, 3809 {0x0509, CMN_PDIAG_PLL0_CP_PADJ_M0}, 3810 {0x0509, CMN_PDIAG_PLL0_CP_PADJ_M1}, 3811 {0x0509, CMN_PDIAG_PLL1_CP_PADJ_M0}, 3812 {0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M0}, 3813 {0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M1}, 3814 {0x0F00, CMN_PDIAG_PLL1_CP_IADJ_M0}, 3815 {0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M0}, 3816 {0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M1}, 3817 {0x0F08, CMN_PDIAG_PLL1_FILT_PADJ_M0}, 3818 {0x0064, CMN_PLL0_INTDIV_M0}, 3819 {0x0050, CMN_PLL0_INTDIV_M1}, 3820 {0x0064, CMN_PLL1_INTDIV_M0}, 3821 {0x0002, CMN_PLL0_FRACDIVH_M0}, 3822 {0x0002, CMN_PLL0_FRACDIVH_M1}, 3823 {0x0002, CMN_PLL1_FRACDIVH_M0}, 3824 {0x0044, CMN_PLL0_HIGH_THR_M0}, 3825 {0x0036, CMN_PLL0_HIGH_THR_M1}, 3826 {0x0044, CMN_PLL1_HIGH_THR_M0}, 3827 {0x0002, CMN_PDIAG_PLL0_CTRL_M0}, 3828 {0x0002, CMN_PDIAG_PLL0_CTRL_M1}, 3829 {0x0002, CMN_PDIAG_PLL1_CTRL_M0}, 3830 {0x0001, CMN_PLL0_SS_CTRL1_M0}, 3831 {0x0001, CMN_PLL0_SS_CTRL1_M1}, 3832 {0x0001, CMN_PLL1_SS_CTRL1_M0}, 3833 {0x011B, CMN_PLL0_SS_CTRL2_M0}, 3834 {0x011B, CMN_PLL0_SS_CTRL2_M1}, 3835 {0x011B, CMN_PLL1_SS_CTRL2_M0}, 3836 {0x006E, CMN_PLL0_SS_CTRL3_M0}, 3837 {0x0058, CMN_PLL0_SS_CTRL3_M1}, 3838 {0x006E, CMN_PLL1_SS_CTRL3_M0}, 3839 {0x000E, CMN_PLL0_SS_CTRL4_M0}, 3840 {0x0012, CMN_PLL0_SS_CTRL4_M1}, 3841 {0x000E, CMN_PLL1_SS_CTRL4_M0}, 3842 {0x0C5E, CMN_PLL0_VCOCAL_REFTIM_START}, 3843 {0x0C5E, CMN_PLL1_VCOCAL_REFTIM_START}, 3844 {0x0C56, CMN_PLL0_VCOCAL_PLLCNT_START}, 3845 {0x0C56, CMN_PLL1_VCOCAL_PLLCNT_START}, 3846 {0x00C7, CMN_PLL0_LOCK_REFCNT_START}, 3847 {0x00C7, CMN_PLL1_LOCK_REFCNT_START}, 3848 {0x00C7, CMN_PLL0_LOCK_PLLCNT_START}, 3849 {0x00C7, CMN_PLL1_LOCK_PLLCNT_START}, 3850 {0x0005, CMN_PLL0_LOCK_PLLCNT_THR}, 3851 {0x0005, CMN_PLL1_LOCK_PLLCNT_THR} 3852 }; 3853 3854 static struct cdns_torrent_vals pcie_100_int_ssc_cmn_vals = { 3855 .reg_pairs = pcie_100_int_ssc_cmn_regs, 3856 .num_regs = ARRAY_SIZE(pcie_100_int_ssc_cmn_regs), 3857 }; 3858 3859 /* Single link PCIe, 100 MHz Ref clk, internal SSC */ 3860 static struct cdns_reg_pairs sl_pcie_100_int_ssc_cmn_regs[] = { 3861 {0x0004, CMN_PLL0_DSM_DIAG_M0}, 3862 {0x0004, CMN_PLL0_DSM_DIAG_M1}, 3863 {0x0004, CMN_PLL1_DSM_DIAG_M0}, 3864 {0x0509, CMN_PDIAG_PLL0_CP_PADJ_M0}, 3865 {0x0509, CMN_PDIAG_PLL0_CP_PADJ_M1}, 3866 {0x0509, CMN_PDIAG_PLL1_CP_PADJ_M0}, 3867 {0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M0}, 3868 {0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M1}, 3869 {0x0F00, CMN_PDIAG_PLL1_CP_IADJ_M0}, 3870 {0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M0}, 3871 {0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M1}, 3872 {0x0F08, CMN_PDIAG_PLL1_FILT_PADJ_M0}, 3873 {0x0064, CMN_PLL0_INTDIV_M0}, 3874 {0x0050, CMN_PLL0_INTDIV_M1}, 3875 {0x0050, CMN_PLL1_INTDIV_M0}, 3876 {0x0002, CMN_PLL0_FRACDIVH_M0}, 3877 {0x0002, CMN_PLL0_FRACDIVH_M1}, 3878 {0x0002, CMN_PLL1_FRACDIVH_M0}, 3879 {0x0044, CMN_PLL0_HIGH_THR_M0}, 3880 {0x0036, CMN_PLL0_HIGH_THR_M1}, 3881 {0x0036, CMN_PLL1_HIGH_THR_M0}, 3882 {0x0002, CMN_PDIAG_PLL0_CTRL_M0}, 3883 {0x0002, CMN_PDIAG_PLL0_CTRL_M1}, 3884 {0x0002, CMN_PDIAG_PLL1_CTRL_M0}, 3885 {0x0001, CMN_PLL0_SS_CTRL1_M0}, 3886 {0x0001, CMN_PLL0_SS_CTRL1_M1}, 3887 {0x0001, CMN_PLL1_SS_CTRL1_M0}, 3888 {0x011B, CMN_PLL0_SS_CTRL2_M0}, 3889 {0x011B, CMN_PLL0_SS_CTRL2_M1}, 3890 {0x011B, CMN_PLL1_SS_CTRL2_M0}, 3891 {0x006E, CMN_PLL0_SS_CTRL3_M0}, 3892 {0x0058, CMN_PLL0_SS_CTRL3_M1}, 3893 {0x0058, CMN_PLL1_SS_CTRL3_M0}, 3894 {0x000E, CMN_PLL0_SS_CTRL4_M0}, 3895 {0x0012, CMN_PLL0_SS_CTRL4_M1}, 3896 {0x0012, CMN_PLL1_SS_CTRL4_M0}, 3897 {0x0C5E, CMN_PLL0_VCOCAL_REFTIM_START}, 3898 {0x0C5E, CMN_PLL1_VCOCAL_REFTIM_START}, 3899 {0x0C56, CMN_PLL0_VCOCAL_PLLCNT_START}, 3900 {0x0C56, CMN_PLL1_VCOCAL_PLLCNT_START}, 3901 {0x00C7, CMN_PLL0_LOCK_REFCNT_START}, 3902 {0x00C7, CMN_PLL1_LOCK_REFCNT_START}, 3903 {0x00C7, CMN_PLL0_LOCK_PLLCNT_START}, 3904 {0x00C7, CMN_PLL1_LOCK_PLLCNT_START}, 3905 {0x0005, CMN_PLL0_LOCK_PLLCNT_THR}, 3906 {0x0005, CMN_PLL1_LOCK_PLLCNT_THR} 3907 }; 3908 3909 static struct cdns_torrent_vals sl_pcie_100_int_ssc_cmn_vals = { 3910 .reg_pairs = sl_pcie_100_int_ssc_cmn_regs, 3911 .num_regs = ARRAY_SIZE(sl_pcie_100_int_ssc_cmn_regs), 3912 }; 3913 3914 /* PCIe, 100 MHz Ref clk, no SSC & external SSC */ 3915 static struct cdns_reg_pairs pcie_100_ext_no_ssc_cmn_regs[] = { 3916 {0x0028, CMN_PDIAG_PLL1_CP_PADJ_M0}, 3917 {0x001E, CMN_PLL1_DSM_FBH_OVRD_M0}, 3918 {0x000C, CMN_PLL1_DSM_FBL_OVRD_M0} 3919 }; 3920 3921 static struct cdns_reg_pairs pcie_100_ext_no_ssc_rx_ln_regs[] = { 3922 {0x0019, RX_REE_TAP1_CLIP}, 3923 {0x0019, RX_REE_TAP2TON_CLIP}, 3924 {0x0001, RX_DIAG_ACYA} 3925 }; 3926 3927 static struct cdns_torrent_vals pcie_100_no_ssc_cmn_vals = { 3928 .reg_pairs = pcie_100_ext_no_ssc_cmn_regs, 3929 .num_regs = ARRAY_SIZE(pcie_100_ext_no_ssc_cmn_regs), 3930 }; 3931 3932 static struct cdns_torrent_vals pcie_100_no_ssc_rx_ln_vals = { 3933 .reg_pairs = pcie_100_ext_no_ssc_rx_ln_regs, 3934 .num_regs = ARRAY_SIZE(pcie_100_ext_no_ssc_rx_ln_regs), 3935 }; 3936 3937 static const struct cdns_torrent_data cdns_map_torrent = { 3938 .block_offset_shift = 0x2, 3939 .reg_offset_shift = 0x2, 3940 .link_cmn_vals = { 3941 [TYPE_DP] = { 3942 [TYPE_NONE] = { 3943 [NO_SSC] = &sl_dp_link_cmn_vals, 3944 }, 3945 [TYPE_PCIE] = { 3946 [NO_SSC] = &pcie_dp_link_cmn_vals, 3947 }, 3948 [TYPE_USB] = { 3949 [NO_SSC] = &usb_dp_link_cmn_vals, 3950 }, 3951 }, 3952 [TYPE_PCIE] = { 3953 [TYPE_NONE] = { 3954 [NO_SSC] = NULL, 3955 [EXTERNAL_SSC] = NULL, 3956 [INTERNAL_SSC] = NULL, 3957 }, 3958 [TYPE_SGMII] = { 3959 [NO_SSC] = &pcie_sgmii_link_cmn_vals, 3960 [EXTERNAL_SSC] = &pcie_sgmii_link_cmn_vals, 3961 [INTERNAL_SSC] = &pcie_sgmii_link_cmn_vals, 3962 }, 3963 [TYPE_QSGMII] = { 3964 [NO_SSC] = &pcie_sgmii_link_cmn_vals, 3965 [EXTERNAL_SSC] = &pcie_sgmii_link_cmn_vals, 3966 [INTERNAL_SSC] = &pcie_sgmii_link_cmn_vals, 3967 }, 3968 [TYPE_USB] = { 3969 [NO_SSC] = &pcie_usb_link_cmn_vals, 3970 [EXTERNAL_SSC] = &pcie_usb_link_cmn_vals, 3971 [INTERNAL_SSC] = &pcie_usb_link_cmn_vals, 3972 }, 3973 [TYPE_DP] = { 3974 [NO_SSC] = &pcie_dp_link_cmn_vals, 3975 }, 3976 }, 3977 [TYPE_SGMII] = { 3978 [TYPE_NONE] = { 3979 [NO_SSC] = &sl_sgmii_link_cmn_vals, 3980 }, 3981 [TYPE_PCIE] = { 3982 [NO_SSC] = &pcie_sgmii_link_cmn_vals, 3983 [EXTERNAL_SSC] = &pcie_sgmii_link_cmn_vals, 3984 [INTERNAL_SSC] = &pcie_sgmii_link_cmn_vals, 3985 }, 3986 [TYPE_USB] = { 3987 [NO_SSC] = &usb_sgmii_link_cmn_vals, 3988 [EXTERNAL_SSC] = &usb_sgmii_link_cmn_vals, 3989 [INTERNAL_SSC] = &usb_sgmii_link_cmn_vals, 3990 }, 3991 }, 3992 [TYPE_QSGMII] = { 3993 [TYPE_NONE] = { 3994 [NO_SSC] = &sl_sgmii_link_cmn_vals, 3995 }, 3996 [TYPE_PCIE] = { 3997 [NO_SSC] = &pcie_sgmii_link_cmn_vals, 3998 [EXTERNAL_SSC] = &pcie_sgmii_link_cmn_vals, 3999 [INTERNAL_SSC] = &pcie_sgmii_link_cmn_vals, 4000 }, 4001 [TYPE_USB] = { 4002 [NO_SSC] = &usb_sgmii_link_cmn_vals, 4003 [EXTERNAL_SSC] = &usb_sgmii_link_cmn_vals, 4004 [INTERNAL_SSC] = &usb_sgmii_link_cmn_vals, 4005 }, 4006 }, 4007 [TYPE_USB] = { 4008 [TYPE_NONE] = { 4009 [NO_SSC] = &sl_usb_link_cmn_vals, 4010 [EXTERNAL_SSC] = &sl_usb_link_cmn_vals, 4011 [INTERNAL_SSC] = &sl_usb_link_cmn_vals, 4012 }, 4013 [TYPE_PCIE] = { 4014 [NO_SSC] = &pcie_usb_link_cmn_vals, 4015 [EXTERNAL_SSC] = &pcie_usb_link_cmn_vals, 4016 [INTERNAL_SSC] = &pcie_usb_link_cmn_vals, 4017 }, 4018 [TYPE_SGMII] = { 4019 [NO_SSC] = &usb_sgmii_link_cmn_vals, 4020 [EXTERNAL_SSC] = &usb_sgmii_link_cmn_vals, 4021 [INTERNAL_SSC] = &usb_sgmii_link_cmn_vals, 4022 }, 4023 [TYPE_QSGMII] = { 4024 [NO_SSC] = &usb_sgmii_link_cmn_vals, 4025 [EXTERNAL_SSC] = &usb_sgmii_link_cmn_vals, 4026 [INTERNAL_SSC] = &usb_sgmii_link_cmn_vals, 4027 }, 4028 [TYPE_DP] = { 4029 [NO_SSC] = &usb_dp_link_cmn_vals, 4030 }, 4031 }, 4032 }, 4033 .xcvr_diag_vals = { 4034 [TYPE_DP] = { 4035 [TYPE_NONE] = { 4036 [NO_SSC] = &sl_dp_xcvr_diag_ln_vals, 4037 }, 4038 [TYPE_PCIE] = { 4039 [NO_SSC] = &dp_pcie_xcvr_diag_ln_vals, 4040 }, 4041 [TYPE_USB] = { 4042 [NO_SSC] = &dp_usb_xcvr_diag_ln_vals, 4043 }, 4044 }, 4045 [TYPE_PCIE] = { 4046 [TYPE_NONE] = { 4047 [NO_SSC] = NULL, 4048 [EXTERNAL_SSC] = NULL, 4049 [INTERNAL_SSC] = NULL, 4050 }, 4051 [TYPE_SGMII] = { 4052 [NO_SSC] = &pcie_sgmii_xcvr_diag_ln_vals, 4053 [EXTERNAL_SSC] = &pcie_sgmii_xcvr_diag_ln_vals, 4054 [INTERNAL_SSC] = &pcie_sgmii_xcvr_diag_ln_vals, 4055 }, 4056 [TYPE_QSGMII] = { 4057 [NO_SSC] = &pcie_sgmii_xcvr_diag_ln_vals, 4058 [EXTERNAL_SSC] = &pcie_sgmii_xcvr_diag_ln_vals, 4059 [INTERNAL_SSC] = &pcie_sgmii_xcvr_diag_ln_vals, 4060 }, 4061 [TYPE_USB] = { 4062 [NO_SSC] = &pcie_usb_xcvr_diag_ln_vals, 4063 [EXTERNAL_SSC] = &pcie_usb_xcvr_diag_ln_vals, 4064 [INTERNAL_SSC] = &pcie_usb_xcvr_diag_ln_vals, 4065 }, 4066 [TYPE_DP] = { 4067 [NO_SSC] = &pcie_dp_xcvr_diag_ln_vals, 4068 }, 4069 }, 4070 [TYPE_SGMII] = { 4071 [TYPE_NONE] = { 4072 [NO_SSC] = &sl_sgmii_xcvr_diag_ln_vals, 4073 }, 4074 [TYPE_PCIE] = { 4075 [NO_SSC] = &sgmii_pcie_xcvr_diag_ln_vals, 4076 [EXTERNAL_SSC] = &sgmii_pcie_xcvr_diag_ln_vals, 4077 [INTERNAL_SSC] = &sgmii_pcie_xcvr_diag_ln_vals, 4078 }, 4079 [TYPE_USB] = { 4080 [NO_SSC] = &sgmii_usb_xcvr_diag_ln_vals, 4081 [EXTERNAL_SSC] = &sgmii_usb_xcvr_diag_ln_vals, 4082 [INTERNAL_SSC] = &sgmii_usb_xcvr_diag_ln_vals, 4083 }, 4084 }, 4085 [TYPE_QSGMII] = { 4086 [TYPE_NONE] = { 4087 [NO_SSC] = &sl_sgmii_xcvr_diag_ln_vals, 4088 }, 4089 [TYPE_PCIE] = { 4090 [NO_SSC] = &sgmii_pcie_xcvr_diag_ln_vals, 4091 [EXTERNAL_SSC] = &sgmii_pcie_xcvr_diag_ln_vals, 4092 [INTERNAL_SSC] = &sgmii_pcie_xcvr_diag_ln_vals, 4093 }, 4094 [TYPE_USB] = { 4095 [NO_SSC] = &sgmii_usb_xcvr_diag_ln_vals, 4096 [EXTERNAL_SSC] = &sgmii_usb_xcvr_diag_ln_vals, 4097 [INTERNAL_SSC] = &sgmii_usb_xcvr_diag_ln_vals, 4098 }, 4099 }, 4100 [TYPE_USB] = { 4101 [TYPE_NONE] = { 4102 [NO_SSC] = &sl_usb_xcvr_diag_ln_vals, 4103 [EXTERNAL_SSC] = &sl_usb_xcvr_diag_ln_vals, 4104 [INTERNAL_SSC] = &sl_usb_xcvr_diag_ln_vals, 4105 }, 4106 [TYPE_PCIE] = { 4107 [NO_SSC] = &usb_pcie_xcvr_diag_ln_vals, 4108 [EXTERNAL_SSC] = &usb_pcie_xcvr_diag_ln_vals, 4109 [INTERNAL_SSC] = &usb_pcie_xcvr_diag_ln_vals, 4110 }, 4111 [TYPE_SGMII] = { 4112 [NO_SSC] = &usb_sgmii_xcvr_diag_ln_vals, 4113 [EXTERNAL_SSC] = &usb_sgmii_xcvr_diag_ln_vals, 4114 [INTERNAL_SSC] = &usb_sgmii_xcvr_diag_ln_vals, 4115 }, 4116 [TYPE_QSGMII] = { 4117 [NO_SSC] = &usb_sgmii_xcvr_diag_ln_vals, 4118 [EXTERNAL_SSC] = &usb_sgmii_xcvr_diag_ln_vals, 4119 [INTERNAL_SSC] = &usb_sgmii_xcvr_diag_ln_vals, 4120 }, 4121 [TYPE_DP] = { 4122 [NO_SSC] = &usb_dp_xcvr_diag_ln_vals, 4123 }, 4124 }, 4125 }, 4126 .pcs_cmn_vals = { 4127 [TYPE_USB] = { 4128 [TYPE_NONE] = { 4129 [NO_SSC] = &usb_phy_pcs_cmn_vals, 4130 [EXTERNAL_SSC] = &usb_phy_pcs_cmn_vals, 4131 [INTERNAL_SSC] = &usb_phy_pcs_cmn_vals, 4132 }, 4133 [TYPE_PCIE] = { 4134 [NO_SSC] = &usb_phy_pcs_cmn_vals, 4135 [EXTERNAL_SSC] = &usb_phy_pcs_cmn_vals, 4136 [INTERNAL_SSC] = &usb_phy_pcs_cmn_vals, 4137 }, 4138 [TYPE_SGMII] = { 4139 [NO_SSC] = &usb_phy_pcs_cmn_vals, 4140 [EXTERNAL_SSC] = &usb_phy_pcs_cmn_vals, 4141 [INTERNAL_SSC] = &usb_phy_pcs_cmn_vals, 4142 }, 4143 [TYPE_QSGMII] = { 4144 [NO_SSC] = &usb_phy_pcs_cmn_vals, 4145 [EXTERNAL_SSC] = &usb_phy_pcs_cmn_vals, 4146 [INTERNAL_SSC] = &usb_phy_pcs_cmn_vals, 4147 }, 4148 [TYPE_DP] = { 4149 [NO_SSC] = &usb_phy_pcs_cmn_vals, 4150 }, 4151 }, 4152 }, 4153 .cmn_vals = { 4154 [CLK_19_2_MHZ] = { 4155 [TYPE_DP] = { 4156 [TYPE_NONE] = { 4157 [NO_SSC] = &sl_dp_19_2_no_ssc_cmn_vals, 4158 }, 4159 }, 4160 }, 4161 [CLK_25_MHZ] = { 4162 [TYPE_DP] = { 4163 [TYPE_NONE] = { 4164 [NO_SSC] = &sl_dp_25_no_ssc_cmn_vals, 4165 }, 4166 }, 4167 }, 4168 [CLK_100_MHZ] = { 4169 [TYPE_DP] = { 4170 [TYPE_NONE] = { 4171 [NO_SSC] = &sl_dp_100_no_ssc_cmn_vals, 4172 }, 4173 [TYPE_PCIE] = { 4174 [NO_SSC] = &dp_100_no_ssc_cmn_vals, 4175 }, 4176 [TYPE_USB] = { 4177 [NO_SSC] = &sl_dp_100_no_ssc_cmn_vals, 4178 }, 4179 }, 4180 [TYPE_PCIE] = { 4181 [TYPE_NONE] = { 4182 [NO_SSC] = NULL, 4183 [EXTERNAL_SSC] = NULL, 4184 [INTERNAL_SSC] = &sl_pcie_100_int_ssc_cmn_vals, 4185 }, 4186 [TYPE_SGMII] = { 4187 [NO_SSC] = &pcie_100_no_ssc_cmn_vals, 4188 [EXTERNAL_SSC] = &pcie_100_no_ssc_cmn_vals, 4189 [INTERNAL_SSC] = &pcie_100_int_ssc_cmn_vals, 4190 }, 4191 [TYPE_QSGMII] = { 4192 [NO_SSC] = &pcie_100_no_ssc_cmn_vals, 4193 [EXTERNAL_SSC] = &pcie_100_no_ssc_cmn_vals, 4194 [INTERNAL_SSC] = &pcie_100_int_ssc_cmn_vals, 4195 }, 4196 [TYPE_USB] = { 4197 [NO_SSC] = &pcie_100_no_ssc_cmn_vals, 4198 [EXTERNAL_SSC] = &pcie_100_no_ssc_cmn_vals, 4199 [INTERNAL_SSC] = &pcie_100_int_ssc_cmn_vals, 4200 }, 4201 [TYPE_DP] = { 4202 [NO_SSC] = NULL, 4203 }, 4204 }, 4205 [TYPE_SGMII] = { 4206 [TYPE_NONE] = { 4207 [NO_SSC] = &sl_sgmii_100_no_ssc_cmn_vals, 4208 }, 4209 [TYPE_PCIE] = { 4210 [NO_SSC] = &sgmii_100_no_ssc_cmn_vals, 4211 [EXTERNAL_SSC] = &sgmii_100_no_ssc_cmn_vals, 4212 [INTERNAL_SSC] = &sgmii_100_int_ssc_cmn_vals, 4213 }, 4214 [TYPE_USB] = { 4215 [NO_SSC] = &sgmii_100_no_ssc_cmn_vals, 4216 [EXTERNAL_SSC] = &sgmii_100_no_ssc_cmn_vals, 4217 [INTERNAL_SSC] = &sgmii_100_no_ssc_cmn_vals, 4218 }, 4219 }, 4220 [TYPE_QSGMII] = { 4221 [TYPE_NONE] = { 4222 [NO_SSC] = &sl_qsgmii_100_no_ssc_cmn_vals, 4223 }, 4224 [TYPE_PCIE] = { 4225 [NO_SSC] = &qsgmii_100_no_ssc_cmn_vals, 4226 [EXTERNAL_SSC] = &qsgmii_100_no_ssc_cmn_vals, 4227 [INTERNAL_SSC] = &qsgmii_100_int_ssc_cmn_vals, 4228 }, 4229 [TYPE_USB] = { 4230 [NO_SSC] = &qsgmii_100_no_ssc_cmn_vals, 4231 [EXTERNAL_SSC] = &qsgmii_100_no_ssc_cmn_vals, 4232 [INTERNAL_SSC] = &qsgmii_100_no_ssc_cmn_vals, 4233 }, 4234 }, 4235 [TYPE_USB] = { 4236 [TYPE_NONE] = { 4237 [NO_SSC] = &sl_usb_100_no_ssc_cmn_vals, 4238 [EXTERNAL_SSC] = &sl_usb_100_no_ssc_cmn_vals, 4239 [INTERNAL_SSC] = &sl_usb_100_int_ssc_cmn_vals, 4240 }, 4241 [TYPE_PCIE] = { 4242 [NO_SSC] = &usb_100_no_ssc_cmn_vals, 4243 [EXTERNAL_SSC] = &usb_100_no_ssc_cmn_vals, 4244 [INTERNAL_SSC] = &usb_100_int_ssc_cmn_vals, 4245 }, 4246 [TYPE_SGMII] = { 4247 [NO_SSC] = &sl_usb_100_no_ssc_cmn_vals, 4248 [EXTERNAL_SSC] = &sl_usb_100_no_ssc_cmn_vals, 4249 [INTERNAL_SSC] = &sl_usb_100_int_ssc_cmn_vals, 4250 }, 4251 [TYPE_QSGMII] = { 4252 [NO_SSC] = &sl_usb_100_no_ssc_cmn_vals, 4253 [EXTERNAL_SSC] = &sl_usb_100_no_ssc_cmn_vals, 4254 [INTERNAL_SSC] = &sl_usb_100_int_ssc_cmn_vals, 4255 }, 4256 [TYPE_DP] = { 4257 [NO_SSC] = &usb_100_no_ssc_cmn_vals, 4258 }, 4259 }, 4260 }, 4261 }, 4262 .tx_ln_vals = { 4263 [CLK_19_2_MHZ] = { 4264 [TYPE_DP] = { 4265 [TYPE_NONE] = { 4266 [NO_SSC] = &sl_dp_19_2_no_ssc_tx_ln_vals, 4267 }, 4268 }, 4269 }, 4270 [CLK_25_MHZ] = { 4271 [TYPE_DP] = { 4272 [TYPE_NONE] = { 4273 [NO_SSC] = &sl_dp_25_no_ssc_tx_ln_vals, 4274 }, 4275 }, 4276 }, 4277 [CLK_100_MHZ] = { 4278 [TYPE_DP] = { 4279 [TYPE_NONE] = { 4280 [NO_SSC] = &sl_dp_100_no_ssc_tx_ln_vals, 4281 }, 4282 [TYPE_PCIE] = { 4283 [NO_SSC] = &dp_100_no_ssc_tx_ln_vals, 4284 }, 4285 [TYPE_USB] = { 4286 [NO_SSC] = &dp_100_no_ssc_tx_ln_vals, 4287 }, 4288 }, 4289 [TYPE_PCIE] = { 4290 [TYPE_NONE] = { 4291 [NO_SSC] = NULL, 4292 [EXTERNAL_SSC] = NULL, 4293 [INTERNAL_SSC] = NULL, 4294 }, 4295 [TYPE_SGMII] = { 4296 [NO_SSC] = NULL, 4297 [EXTERNAL_SSC] = NULL, 4298 [INTERNAL_SSC] = NULL, 4299 }, 4300 [TYPE_QSGMII] = { 4301 [NO_SSC] = NULL, 4302 [EXTERNAL_SSC] = NULL, 4303 [INTERNAL_SSC] = NULL, 4304 }, 4305 [TYPE_USB] = { 4306 [NO_SSC] = NULL, 4307 [EXTERNAL_SSC] = NULL, 4308 [INTERNAL_SSC] = NULL, 4309 }, 4310 [TYPE_DP] = { 4311 [NO_SSC] = NULL, 4312 }, 4313 }, 4314 [TYPE_SGMII] = { 4315 [TYPE_NONE] = { 4316 [NO_SSC] = &sgmii_100_no_ssc_tx_ln_vals, 4317 }, 4318 [TYPE_PCIE] = { 4319 [NO_SSC] = &sgmii_100_no_ssc_tx_ln_vals, 4320 [EXTERNAL_SSC] = &sgmii_100_no_ssc_tx_ln_vals, 4321 [INTERNAL_SSC] = &sgmii_100_no_ssc_tx_ln_vals, 4322 }, 4323 [TYPE_USB] = { 4324 [NO_SSC] = &sgmii_100_no_ssc_tx_ln_vals, 4325 [EXTERNAL_SSC] = &sgmii_100_no_ssc_tx_ln_vals, 4326 [INTERNAL_SSC] = &sgmii_100_no_ssc_tx_ln_vals, 4327 }, 4328 }, 4329 [TYPE_QSGMII] = { 4330 [TYPE_NONE] = { 4331 [NO_SSC] = &qsgmii_100_no_ssc_tx_ln_vals, 4332 }, 4333 [TYPE_PCIE] = { 4334 [NO_SSC] = &qsgmii_100_no_ssc_tx_ln_vals, 4335 [EXTERNAL_SSC] = &qsgmii_100_no_ssc_tx_ln_vals, 4336 [INTERNAL_SSC] = &qsgmii_100_no_ssc_tx_ln_vals, 4337 }, 4338 [TYPE_USB] = { 4339 [NO_SSC] = &qsgmii_100_no_ssc_tx_ln_vals, 4340 [EXTERNAL_SSC] = &qsgmii_100_no_ssc_tx_ln_vals, 4341 [INTERNAL_SSC] = &qsgmii_100_no_ssc_tx_ln_vals, 4342 }, 4343 }, 4344 [TYPE_USB] = { 4345 [TYPE_NONE] = { 4346 [NO_SSC] = &usb_100_no_ssc_tx_ln_vals, 4347 [EXTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals, 4348 [INTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals, 4349 }, 4350 [TYPE_PCIE] = { 4351 [NO_SSC] = &usb_100_no_ssc_tx_ln_vals, 4352 [EXTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals, 4353 [INTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals, 4354 }, 4355 [TYPE_SGMII] = { 4356 [NO_SSC] = &usb_100_no_ssc_tx_ln_vals, 4357 [EXTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals, 4358 [INTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals, 4359 }, 4360 [TYPE_QSGMII] = { 4361 [NO_SSC] = &usb_100_no_ssc_tx_ln_vals, 4362 [EXTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals, 4363 [INTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals, 4364 }, 4365 [TYPE_DP] = { 4366 [NO_SSC] = &usb_100_no_ssc_tx_ln_vals, 4367 }, 4368 }, 4369 }, 4370 }, 4371 .rx_ln_vals = { 4372 [CLK_19_2_MHZ] = { 4373 [TYPE_DP] = { 4374 [TYPE_NONE] = { 4375 [NO_SSC] = &sl_dp_19_2_no_ssc_rx_ln_vals, 4376 }, 4377 }, 4378 }, 4379 [CLK_25_MHZ] = { 4380 [TYPE_DP] = { 4381 [TYPE_NONE] = { 4382 [NO_SSC] = &sl_dp_25_no_ssc_rx_ln_vals, 4383 }, 4384 }, 4385 }, 4386 [CLK_100_MHZ] = { 4387 [TYPE_DP] = { 4388 [TYPE_NONE] = { 4389 [NO_SSC] = &sl_dp_100_no_ssc_rx_ln_vals, 4390 }, 4391 [TYPE_PCIE] = { 4392 [NO_SSC] = &dp_100_no_ssc_rx_ln_vals, 4393 }, 4394 [TYPE_USB] = { 4395 [NO_SSC] = &dp_100_no_ssc_rx_ln_vals, 4396 }, 4397 }, 4398 [TYPE_PCIE] = { 4399 [TYPE_NONE] = { 4400 [NO_SSC] = &pcie_100_no_ssc_rx_ln_vals, 4401 [EXTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals, 4402 [INTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals, 4403 }, 4404 [TYPE_SGMII] = { 4405 [NO_SSC] = &pcie_100_no_ssc_rx_ln_vals, 4406 [EXTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals, 4407 [INTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals, 4408 }, 4409 [TYPE_QSGMII] = { 4410 [NO_SSC] = &pcie_100_no_ssc_rx_ln_vals, 4411 [EXTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals, 4412 [INTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals, 4413 }, 4414 [TYPE_USB] = { 4415 [NO_SSC] = &pcie_100_no_ssc_rx_ln_vals, 4416 [EXTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals, 4417 [INTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals, 4418 }, 4419 [TYPE_DP] = { 4420 [NO_SSC] = &pcie_100_no_ssc_rx_ln_vals, 4421 }, 4422 }, 4423 [TYPE_SGMII] = { 4424 [TYPE_NONE] = { 4425 [NO_SSC] = &sgmii_100_no_ssc_rx_ln_vals, 4426 }, 4427 [TYPE_PCIE] = { 4428 [NO_SSC] = &sgmii_100_no_ssc_rx_ln_vals, 4429 [EXTERNAL_SSC] = &sgmii_100_no_ssc_rx_ln_vals, 4430 [INTERNAL_SSC] = &sgmii_100_no_ssc_rx_ln_vals, 4431 }, 4432 [TYPE_USB] = { 4433 [NO_SSC] = &sgmii_100_no_ssc_rx_ln_vals, 4434 [EXTERNAL_SSC] = &sgmii_100_no_ssc_rx_ln_vals, 4435 [INTERNAL_SSC] = &sgmii_100_no_ssc_rx_ln_vals, 4436 }, 4437 }, 4438 [TYPE_QSGMII] = { 4439 [TYPE_NONE] = { 4440 [NO_SSC] = &qsgmii_100_no_ssc_rx_ln_vals, 4441 }, 4442 [TYPE_PCIE] = { 4443 [NO_SSC] = &qsgmii_100_no_ssc_rx_ln_vals, 4444 [EXTERNAL_SSC] = &qsgmii_100_no_ssc_rx_ln_vals, 4445 [INTERNAL_SSC] = &qsgmii_100_no_ssc_rx_ln_vals, 4446 }, 4447 [TYPE_USB] = { 4448 [NO_SSC] = &qsgmii_100_no_ssc_rx_ln_vals, 4449 [EXTERNAL_SSC] = &qsgmii_100_no_ssc_rx_ln_vals, 4450 [INTERNAL_SSC] = &qsgmii_100_no_ssc_rx_ln_vals, 4451 }, 4452 }, 4453 [TYPE_USB] = { 4454 [TYPE_NONE] = { 4455 [NO_SSC] = &usb_100_no_ssc_rx_ln_vals, 4456 [EXTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals, 4457 [INTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals, 4458 }, 4459 [TYPE_PCIE] = { 4460 [NO_SSC] = &usb_100_no_ssc_rx_ln_vals, 4461 [EXTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals, 4462 [INTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals, 4463 }, 4464 [TYPE_SGMII] = { 4465 [NO_SSC] = &usb_100_no_ssc_rx_ln_vals, 4466 [EXTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals, 4467 [INTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals, 4468 }, 4469 [TYPE_QSGMII] = { 4470 [NO_SSC] = &usb_100_no_ssc_rx_ln_vals, 4471 [EXTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals, 4472 [INTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals, 4473 }, 4474 [TYPE_DP] = { 4475 [NO_SSC] = &usb_100_no_ssc_rx_ln_vals, 4476 }, 4477 }, 4478 }, 4479 }, 4480 }; 4481 4482 static const struct cdns_torrent_data ti_j721e_map_torrent = { 4483 .block_offset_shift = 0x0, 4484 .reg_offset_shift = 0x1, 4485 .link_cmn_vals = { 4486 [TYPE_DP] = { 4487 [TYPE_NONE] = { 4488 [NO_SSC] = &sl_dp_link_cmn_vals, 4489 }, 4490 [TYPE_PCIE] = { 4491 [NO_SSC] = &pcie_dp_link_cmn_vals, 4492 }, 4493 [TYPE_USB] = { 4494 [NO_SSC] = &usb_dp_link_cmn_vals, 4495 }, 4496 }, 4497 [TYPE_PCIE] = { 4498 [TYPE_NONE] = { 4499 [NO_SSC] = NULL, 4500 [EXTERNAL_SSC] = NULL, 4501 [INTERNAL_SSC] = NULL, 4502 }, 4503 [TYPE_SGMII] = { 4504 [NO_SSC] = &pcie_sgmii_link_cmn_vals, 4505 [EXTERNAL_SSC] = &pcie_sgmii_link_cmn_vals, 4506 [INTERNAL_SSC] = &pcie_sgmii_link_cmn_vals, 4507 }, 4508 [TYPE_QSGMII] = { 4509 [NO_SSC] = &pcie_sgmii_link_cmn_vals, 4510 [EXTERNAL_SSC] = &pcie_sgmii_link_cmn_vals, 4511 [INTERNAL_SSC] = &pcie_sgmii_link_cmn_vals, 4512 }, 4513 [TYPE_USB] = { 4514 [NO_SSC] = &pcie_usb_link_cmn_vals, 4515 [EXTERNAL_SSC] = &pcie_usb_link_cmn_vals, 4516 [INTERNAL_SSC] = &pcie_usb_link_cmn_vals, 4517 }, 4518 [TYPE_DP] = { 4519 [NO_SSC] = &pcie_dp_link_cmn_vals, 4520 }, 4521 }, 4522 [TYPE_SGMII] = { 4523 [TYPE_NONE] = { 4524 [NO_SSC] = &sl_sgmii_link_cmn_vals, 4525 }, 4526 [TYPE_PCIE] = { 4527 [NO_SSC] = &pcie_sgmii_link_cmn_vals, 4528 [EXTERNAL_SSC] = &pcie_sgmii_link_cmn_vals, 4529 [INTERNAL_SSC] = &pcie_sgmii_link_cmn_vals, 4530 }, 4531 [TYPE_USB] = { 4532 [NO_SSC] = &usb_sgmii_link_cmn_vals, 4533 [EXTERNAL_SSC] = &usb_sgmii_link_cmn_vals, 4534 [INTERNAL_SSC] = &usb_sgmii_link_cmn_vals, 4535 }, 4536 }, 4537 [TYPE_QSGMII] = { 4538 [TYPE_NONE] = { 4539 [NO_SSC] = &sl_sgmii_link_cmn_vals, 4540 }, 4541 [TYPE_PCIE] = { 4542 [NO_SSC] = &pcie_sgmii_link_cmn_vals, 4543 [EXTERNAL_SSC] = &pcie_sgmii_link_cmn_vals, 4544 [INTERNAL_SSC] = &pcie_sgmii_link_cmn_vals, 4545 }, 4546 [TYPE_USB] = { 4547 [NO_SSC] = &usb_sgmii_link_cmn_vals, 4548 [EXTERNAL_SSC] = &usb_sgmii_link_cmn_vals, 4549 [INTERNAL_SSC] = &usb_sgmii_link_cmn_vals, 4550 }, 4551 }, 4552 [TYPE_USB] = { 4553 [TYPE_NONE] = { 4554 [NO_SSC] = &sl_usb_link_cmn_vals, 4555 [EXTERNAL_SSC] = &sl_usb_link_cmn_vals, 4556 [INTERNAL_SSC] = &sl_usb_link_cmn_vals, 4557 }, 4558 [TYPE_PCIE] = { 4559 [NO_SSC] = &pcie_usb_link_cmn_vals, 4560 [EXTERNAL_SSC] = &pcie_usb_link_cmn_vals, 4561 [INTERNAL_SSC] = &pcie_usb_link_cmn_vals, 4562 }, 4563 [TYPE_SGMII] = { 4564 [NO_SSC] = &usb_sgmii_link_cmn_vals, 4565 [EXTERNAL_SSC] = &usb_sgmii_link_cmn_vals, 4566 [INTERNAL_SSC] = &usb_sgmii_link_cmn_vals, 4567 }, 4568 [TYPE_QSGMII] = { 4569 [NO_SSC] = &usb_sgmii_link_cmn_vals, 4570 [EXTERNAL_SSC] = &usb_sgmii_link_cmn_vals, 4571 [INTERNAL_SSC] = &usb_sgmii_link_cmn_vals, 4572 }, 4573 [TYPE_DP] = { 4574 [NO_SSC] = &usb_dp_link_cmn_vals, 4575 }, 4576 }, 4577 }, 4578 .xcvr_diag_vals = { 4579 [TYPE_DP] = { 4580 [TYPE_NONE] = { 4581 [NO_SSC] = &sl_dp_xcvr_diag_ln_vals, 4582 }, 4583 [TYPE_PCIE] = { 4584 [NO_SSC] = &dp_pcie_xcvr_diag_ln_vals, 4585 }, 4586 [TYPE_USB] = { 4587 [NO_SSC] = &dp_usb_xcvr_diag_ln_vals, 4588 }, 4589 }, 4590 [TYPE_PCIE] = { 4591 [TYPE_NONE] = { 4592 [NO_SSC] = NULL, 4593 [EXTERNAL_SSC] = NULL, 4594 [INTERNAL_SSC] = NULL, 4595 }, 4596 [TYPE_SGMII] = { 4597 [NO_SSC] = &pcie_sgmii_xcvr_diag_ln_vals, 4598 [EXTERNAL_SSC] = &pcie_sgmii_xcvr_diag_ln_vals, 4599 [INTERNAL_SSC] = &pcie_sgmii_xcvr_diag_ln_vals, 4600 }, 4601 [TYPE_QSGMII] = { 4602 [NO_SSC] = &pcie_sgmii_xcvr_diag_ln_vals, 4603 [EXTERNAL_SSC] = &pcie_sgmii_xcvr_diag_ln_vals, 4604 [INTERNAL_SSC] = &pcie_sgmii_xcvr_diag_ln_vals, 4605 }, 4606 [TYPE_USB] = { 4607 [NO_SSC] = &pcie_usb_xcvr_diag_ln_vals, 4608 [EXTERNAL_SSC] = &pcie_usb_xcvr_diag_ln_vals, 4609 [INTERNAL_SSC] = &pcie_usb_xcvr_diag_ln_vals, 4610 }, 4611 [TYPE_DP] = { 4612 [NO_SSC] = &pcie_dp_xcvr_diag_ln_vals, 4613 }, 4614 }, 4615 [TYPE_SGMII] = { 4616 [TYPE_NONE] = { 4617 [NO_SSC] = &sl_sgmii_xcvr_diag_ln_vals, 4618 }, 4619 [TYPE_PCIE] = { 4620 [NO_SSC] = &sgmii_pcie_xcvr_diag_ln_vals, 4621 [EXTERNAL_SSC] = &sgmii_pcie_xcvr_diag_ln_vals, 4622 [INTERNAL_SSC] = &sgmii_pcie_xcvr_diag_ln_vals, 4623 }, 4624 [TYPE_USB] = { 4625 [NO_SSC] = &sgmii_usb_xcvr_diag_ln_vals, 4626 [EXTERNAL_SSC] = &sgmii_usb_xcvr_diag_ln_vals, 4627 [INTERNAL_SSC] = &sgmii_usb_xcvr_diag_ln_vals, 4628 }, 4629 }, 4630 [TYPE_QSGMII] = { 4631 [TYPE_NONE] = { 4632 [NO_SSC] = &sl_sgmii_xcvr_diag_ln_vals, 4633 }, 4634 [TYPE_PCIE] = { 4635 [NO_SSC] = &sgmii_pcie_xcvr_diag_ln_vals, 4636 [EXTERNAL_SSC] = &sgmii_pcie_xcvr_diag_ln_vals, 4637 [INTERNAL_SSC] = &sgmii_pcie_xcvr_diag_ln_vals, 4638 }, 4639 [TYPE_USB] = { 4640 [NO_SSC] = &sgmii_usb_xcvr_diag_ln_vals, 4641 [EXTERNAL_SSC] = &sgmii_usb_xcvr_diag_ln_vals, 4642 [INTERNAL_SSC] = &sgmii_usb_xcvr_diag_ln_vals, 4643 }, 4644 }, 4645 [TYPE_USB] = { 4646 [TYPE_NONE] = { 4647 [NO_SSC] = &sl_usb_xcvr_diag_ln_vals, 4648 [EXTERNAL_SSC] = &sl_usb_xcvr_diag_ln_vals, 4649 [INTERNAL_SSC] = &sl_usb_xcvr_diag_ln_vals, 4650 }, 4651 [TYPE_PCIE] = { 4652 [NO_SSC] = &usb_pcie_xcvr_diag_ln_vals, 4653 [EXTERNAL_SSC] = &usb_pcie_xcvr_diag_ln_vals, 4654 [INTERNAL_SSC] = &usb_pcie_xcvr_diag_ln_vals, 4655 }, 4656 [TYPE_SGMII] = { 4657 [NO_SSC] = &usb_sgmii_xcvr_diag_ln_vals, 4658 [EXTERNAL_SSC] = &usb_sgmii_xcvr_diag_ln_vals, 4659 [INTERNAL_SSC] = &usb_sgmii_xcvr_diag_ln_vals, 4660 }, 4661 [TYPE_QSGMII] = { 4662 [NO_SSC] = &usb_sgmii_xcvr_diag_ln_vals, 4663 [EXTERNAL_SSC] = &usb_sgmii_xcvr_diag_ln_vals, 4664 [INTERNAL_SSC] = &usb_sgmii_xcvr_diag_ln_vals, 4665 }, 4666 [TYPE_DP] = { 4667 [NO_SSC] = &usb_dp_xcvr_diag_ln_vals, 4668 }, 4669 }, 4670 }, 4671 .pcs_cmn_vals = { 4672 [TYPE_USB] = { 4673 [TYPE_NONE] = { 4674 [NO_SSC] = &usb_phy_pcs_cmn_vals, 4675 [EXTERNAL_SSC] = &usb_phy_pcs_cmn_vals, 4676 [INTERNAL_SSC] = &usb_phy_pcs_cmn_vals, 4677 }, 4678 [TYPE_PCIE] = { 4679 [NO_SSC] = &usb_phy_pcs_cmn_vals, 4680 [EXTERNAL_SSC] = &usb_phy_pcs_cmn_vals, 4681 [INTERNAL_SSC] = &usb_phy_pcs_cmn_vals, 4682 }, 4683 [TYPE_SGMII] = { 4684 [NO_SSC] = &usb_phy_pcs_cmn_vals, 4685 [EXTERNAL_SSC] = &usb_phy_pcs_cmn_vals, 4686 [INTERNAL_SSC] = &usb_phy_pcs_cmn_vals, 4687 }, 4688 [TYPE_QSGMII] = { 4689 [NO_SSC] = &usb_phy_pcs_cmn_vals, 4690 [EXTERNAL_SSC] = &usb_phy_pcs_cmn_vals, 4691 [INTERNAL_SSC] = &usb_phy_pcs_cmn_vals, 4692 }, 4693 [TYPE_DP] = { 4694 [NO_SSC] = &usb_phy_pcs_cmn_vals, 4695 }, 4696 }, 4697 }, 4698 .cmn_vals = { 4699 [CLK_19_2_MHZ] = { 4700 [TYPE_DP] = { 4701 [TYPE_NONE] = { 4702 [NO_SSC] = &sl_dp_19_2_no_ssc_cmn_vals, 4703 }, 4704 }, 4705 }, 4706 [CLK_25_MHZ] = { 4707 [TYPE_DP] = { 4708 [TYPE_NONE] = { 4709 [NO_SSC] = &sl_dp_25_no_ssc_cmn_vals, 4710 }, 4711 }, 4712 }, 4713 [CLK_100_MHZ] = { 4714 [TYPE_DP] = { 4715 [TYPE_NONE] = { 4716 [NO_SSC] = &sl_dp_100_no_ssc_cmn_vals, 4717 }, 4718 [TYPE_PCIE] = { 4719 [NO_SSC] = &dp_100_no_ssc_cmn_vals, 4720 }, 4721 [TYPE_USB] = { 4722 [NO_SSC] = &sl_dp_100_no_ssc_cmn_vals, 4723 }, 4724 }, 4725 [TYPE_PCIE] = { 4726 [TYPE_NONE] = { 4727 [NO_SSC] = NULL, 4728 [EXTERNAL_SSC] = NULL, 4729 [INTERNAL_SSC] = &sl_pcie_100_int_ssc_cmn_vals, 4730 }, 4731 [TYPE_SGMII] = { 4732 [NO_SSC] = &pcie_100_no_ssc_cmn_vals, 4733 [EXTERNAL_SSC] = &pcie_100_no_ssc_cmn_vals, 4734 [INTERNAL_SSC] = &pcie_100_int_ssc_cmn_vals, 4735 }, 4736 [TYPE_QSGMII] = { 4737 [NO_SSC] = &pcie_100_no_ssc_cmn_vals, 4738 [EXTERNAL_SSC] = &pcie_100_no_ssc_cmn_vals, 4739 [INTERNAL_SSC] = &pcie_100_int_ssc_cmn_vals, 4740 }, 4741 [TYPE_USB] = { 4742 [NO_SSC] = &pcie_100_no_ssc_cmn_vals, 4743 [EXTERNAL_SSC] = &pcie_100_no_ssc_cmn_vals, 4744 [INTERNAL_SSC] = &pcie_100_int_ssc_cmn_vals, 4745 }, 4746 [TYPE_DP] = { 4747 [NO_SSC] = NULL, 4748 }, 4749 }, 4750 [TYPE_SGMII] = { 4751 [TYPE_NONE] = { 4752 [NO_SSC] = &sl_sgmii_100_no_ssc_cmn_vals, 4753 }, 4754 [TYPE_PCIE] = { 4755 [NO_SSC] = &sgmii_100_no_ssc_cmn_vals, 4756 [EXTERNAL_SSC] = &sgmii_100_no_ssc_cmn_vals, 4757 [INTERNAL_SSC] = &sgmii_100_int_ssc_cmn_vals, 4758 }, 4759 [TYPE_USB] = { 4760 [NO_SSC] = &sgmii_100_no_ssc_cmn_vals, 4761 [EXTERNAL_SSC] = &sgmii_100_no_ssc_cmn_vals, 4762 [INTERNAL_SSC] = &sgmii_100_no_ssc_cmn_vals, 4763 }, 4764 }, 4765 [TYPE_QSGMII] = { 4766 [TYPE_NONE] = { 4767 [NO_SSC] = &sl_qsgmii_100_no_ssc_cmn_vals, 4768 }, 4769 [TYPE_PCIE] = { 4770 [NO_SSC] = &qsgmii_100_no_ssc_cmn_vals, 4771 [EXTERNAL_SSC] = &qsgmii_100_no_ssc_cmn_vals, 4772 [INTERNAL_SSC] = &qsgmii_100_int_ssc_cmn_vals, 4773 }, 4774 [TYPE_USB] = { 4775 [NO_SSC] = &qsgmii_100_no_ssc_cmn_vals, 4776 [EXTERNAL_SSC] = &qsgmii_100_no_ssc_cmn_vals, 4777 [INTERNAL_SSC] = &qsgmii_100_no_ssc_cmn_vals, 4778 }, 4779 }, 4780 [TYPE_USB] = { 4781 [TYPE_NONE] = { 4782 [NO_SSC] = &sl_usb_100_no_ssc_cmn_vals, 4783 [EXTERNAL_SSC] = &sl_usb_100_no_ssc_cmn_vals, 4784 [INTERNAL_SSC] = &sl_usb_100_int_ssc_cmn_vals, 4785 }, 4786 [TYPE_PCIE] = { 4787 [NO_SSC] = &usb_100_no_ssc_cmn_vals, 4788 [EXTERNAL_SSC] = &usb_100_no_ssc_cmn_vals, 4789 [INTERNAL_SSC] = &usb_100_int_ssc_cmn_vals, 4790 }, 4791 [TYPE_SGMII] = { 4792 [NO_SSC] = &sl_usb_100_no_ssc_cmn_vals, 4793 [EXTERNAL_SSC] = &sl_usb_100_no_ssc_cmn_vals, 4794 [INTERNAL_SSC] = &sl_usb_100_int_ssc_cmn_vals, 4795 }, 4796 [TYPE_QSGMII] = { 4797 [NO_SSC] = &sl_usb_100_no_ssc_cmn_vals, 4798 [EXTERNAL_SSC] = &sl_usb_100_no_ssc_cmn_vals, 4799 [INTERNAL_SSC] = &sl_usb_100_int_ssc_cmn_vals, 4800 }, 4801 [TYPE_DP] = { 4802 [NO_SSC] = &usb_100_no_ssc_cmn_vals, 4803 }, 4804 }, 4805 }, 4806 }, 4807 .tx_ln_vals = { 4808 [CLK_19_2_MHZ] = { 4809 [TYPE_DP] = { 4810 [TYPE_NONE] = { 4811 [NO_SSC] = &sl_dp_19_2_no_ssc_tx_ln_vals, 4812 }, 4813 }, 4814 }, 4815 [CLK_25_MHZ] = { 4816 [TYPE_DP] = { 4817 [TYPE_NONE] = { 4818 [NO_SSC] = &sl_dp_25_no_ssc_tx_ln_vals, 4819 }, 4820 }, 4821 }, 4822 [CLK_100_MHZ] = { 4823 [TYPE_DP] = { 4824 [TYPE_NONE] = { 4825 [NO_SSC] = &sl_dp_100_no_ssc_tx_ln_vals, 4826 }, 4827 [TYPE_PCIE] = { 4828 [NO_SSC] = &dp_100_no_ssc_tx_ln_vals, 4829 }, 4830 [TYPE_USB] = { 4831 [NO_SSC] = &dp_100_no_ssc_tx_ln_vals, 4832 }, 4833 }, 4834 [TYPE_PCIE] = { 4835 [TYPE_NONE] = { 4836 [NO_SSC] = NULL, 4837 [EXTERNAL_SSC] = NULL, 4838 [INTERNAL_SSC] = NULL, 4839 }, 4840 [TYPE_SGMII] = { 4841 [NO_SSC] = NULL, 4842 [EXTERNAL_SSC] = NULL, 4843 [INTERNAL_SSC] = NULL, 4844 }, 4845 [TYPE_QSGMII] = { 4846 [NO_SSC] = NULL, 4847 [EXTERNAL_SSC] = NULL, 4848 [INTERNAL_SSC] = NULL, 4849 }, 4850 [TYPE_USB] = { 4851 [NO_SSC] = NULL, 4852 [EXTERNAL_SSC] = NULL, 4853 [INTERNAL_SSC] = NULL, 4854 }, 4855 [TYPE_DP] = { 4856 [NO_SSC] = NULL, 4857 }, 4858 }, 4859 [TYPE_SGMII] = { 4860 [TYPE_NONE] = { 4861 [NO_SSC] = &ti_sgmii_100_no_ssc_tx_ln_vals, 4862 }, 4863 [TYPE_PCIE] = { 4864 [NO_SSC] = &ti_sgmii_100_no_ssc_tx_ln_vals, 4865 [EXTERNAL_SSC] = &ti_sgmii_100_no_ssc_tx_ln_vals, 4866 [INTERNAL_SSC] = &ti_sgmii_100_no_ssc_tx_ln_vals, 4867 }, 4868 [TYPE_USB] = { 4869 [NO_SSC] = &ti_sgmii_100_no_ssc_tx_ln_vals, 4870 [EXTERNAL_SSC] = &ti_sgmii_100_no_ssc_tx_ln_vals, 4871 [INTERNAL_SSC] = &ti_sgmii_100_no_ssc_tx_ln_vals, 4872 }, 4873 }, 4874 [TYPE_QSGMII] = { 4875 [TYPE_NONE] = { 4876 [NO_SSC] = &ti_qsgmii_100_no_ssc_tx_ln_vals, 4877 }, 4878 [TYPE_PCIE] = { 4879 [NO_SSC] = &ti_qsgmii_100_no_ssc_tx_ln_vals, 4880 [EXTERNAL_SSC] = &ti_qsgmii_100_no_ssc_tx_ln_vals, 4881 [INTERNAL_SSC] = &ti_qsgmii_100_no_ssc_tx_ln_vals, 4882 }, 4883 [TYPE_USB] = { 4884 [NO_SSC] = &ti_qsgmii_100_no_ssc_tx_ln_vals, 4885 [EXTERNAL_SSC] = &ti_qsgmii_100_no_ssc_tx_ln_vals, 4886 [INTERNAL_SSC] = &ti_qsgmii_100_no_ssc_tx_ln_vals, 4887 }, 4888 }, 4889 [TYPE_USB] = { 4890 [TYPE_NONE] = { 4891 [NO_SSC] = &usb_100_no_ssc_tx_ln_vals, 4892 [EXTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals, 4893 [INTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals, 4894 }, 4895 [TYPE_PCIE] = { 4896 [NO_SSC] = &usb_100_no_ssc_tx_ln_vals, 4897 [EXTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals, 4898 [INTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals, 4899 }, 4900 [TYPE_SGMII] = { 4901 [NO_SSC] = &usb_100_no_ssc_tx_ln_vals, 4902 [EXTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals, 4903 [INTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals, 4904 }, 4905 [TYPE_QSGMII] = { 4906 [NO_SSC] = &usb_100_no_ssc_tx_ln_vals, 4907 [EXTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals, 4908 [INTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals, 4909 }, 4910 [TYPE_DP] = { 4911 [NO_SSC] = &usb_100_no_ssc_tx_ln_vals, 4912 }, 4913 }, 4914 }, 4915 }, 4916 .rx_ln_vals = { 4917 [CLK_19_2_MHZ] = { 4918 [TYPE_DP] = { 4919 [TYPE_NONE] = { 4920 [NO_SSC] = &sl_dp_19_2_no_ssc_rx_ln_vals, 4921 }, 4922 }, 4923 }, 4924 [CLK_25_MHZ] = { 4925 [TYPE_DP] = { 4926 [TYPE_NONE] = { 4927 [NO_SSC] = &sl_dp_25_no_ssc_rx_ln_vals, 4928 }, 4929 }, 4930 }, 4931 [CLK_100_MHZ] = { 4932 [TYPE_DP] = { 4933 [TYPE_NONE] = { 4934 [NO_SSC] = &sl_dp_100_no_ssc_rx_ln_vals, 4935 }, 4936 [TYPE_PCIE] = { 4937 [NO_SSC] = &dp_100_no_ssc_rx_ln_vals, 4938 }, 4939 [TYPE_USB] = { 4940 [NO_SSC] = &dp_100_no_ssc_rx_ln_vals, 4941 }, 4942 }, 4943 [TYPE_PCIE] = { 4944 [TYPE_NONE] = { 4945 [NO_SSC] = &pcie_100_no_ssc_rx_ln_vals, 4946 [EXTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals, 4947 [INTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals, 4948 }, 4949 [TYPE_SGMII] = { 4950 [NO_SSC] = &pcie_100_no_ssc_rx_ln_vals, 4951 [EXTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals, 4952 [INTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals, 4953 }, 4954 [TYPE_QSGMII] = { 4955 [NO_SSC] = &pcie_100_no_ssc_rx_ln_vals, 4956 [EXTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals, 4957 [INTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals, 4958 }, 4959 [TYPE_USB] = { 4960 [NO_SSC] = &pcie_100_no_ssc_rx_ln_vals, 4961 [EXTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals, 4962 [INTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals, 4963 }, 4964 [TYPE_DP] = { 4965 [NO_SSC] = &pcie_100_no_ssc_rx_ln_vals, 4966 }, 4967 }, 4968 [TYPE_SGMII] = { 4969 [TYPE_NONE] = { 4970 [NO_SSC] = &sgmii_100_no_ssc_rx_ln_vals, 4971 }, 4972 [TYPE_PCIE] = { 4973 [NO_SSC] = &sgmii_100_no_ssc_rx_ln_vals, 4974 [EXTERNAL_SSC] = &sgmii_100_no_ssc_rx_ln_vals, 4975 [INTERNAL_SSC] = &sgmii_100_no_ssc_rx_ln_vals, 4976 }, 4977 [TYPE_USB] = { 4978 [NO_SSC] = &sgmii_100_no_ssc_rx_ln_vals, 4979 [EXTERNAL_SSC] = &sgmii_100_no_ssc_rx_ln_vals, 4980 [INTERNAL_SSC] = &sgmii_100_no_ssc_rx_ln_vals, 4981 }, 4982 }, 4983 [TYPE_QSGMII] = { 4984 [TYPE_NONE] = { 4985 [NO_SSC] = &qsgmii_100_no_ssc_rx_ln_vals, 4986 }, 4987 [TYPE_PCIE] = { 4988 [NO_SSC] = &qsgmii_100_no_ssc_rx_ln_vals, 4989 [EXTERNAL_SSC] = &qsgmii_100_no_ssc_rx_ln_vals, 4990 [INTERNAL_SSC] = &qsgmii_100_no_ssc_rx_ln_vals, 4991 }, 4992 [TYPE_USB] = { 4993 [NO_SSC] = &qsgmii_100_no_ssc_rx_ln_vals, 4994 [EXTERNAL_SSC] = &qsgmii_100_no_ssc_rx_ln_vals, 4995 [INTERNAL_SSC] = &qsgmii_100_no_ssc_rx_ln_vals, 4996 }, 4997 }, 4998 [TYPE_USB] = { 4999 [TYPE_NONE] = { 5000 [NO_SSC] = &usb_100_no_ssc_rx_ln_vals, 5001 [EXTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals, 5002 [INTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals, 5003 }, 5004 [TYPE_PCIE] = { 5005 [NO_SSC] = &usb_100_no_ssc_rx_ln_vals, 5006 [EXTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals, 5007 [INTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals, 5008 }, 5009 [TYPE_SGMII] = { 5010 [NO_SSC] = &usb_100_no_ssc_rx_ln_vals, 5011 [EXTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals, 5012 [INTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals, 5013 }, 5014 [TYPE_QSGMII] = { 5015 [NO_SSC] = &usb_100_no_ssc_rx_ln_vals, 5016 [EXTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals, 5017 [INTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals, 5018 }, 5019 [TYPE_DP] = { 5020 [NO_SSC] = &usb_100_no_ssc_rx_ln_vals, 5021 }, 5022 }, 5023 }, 5024 }, 5025 }; 5026 5027 static const struct of_device_id cdns_torrent_phy_of_match[] = { 5028 { 5029 .compatible = "cdns,torrent-phy", 5030 .data = &cdns_map_torrent, 5031 }, 5032 { 5033 .compatible = "ti,j721e-serdes-10g", 5034 .data = &ti_j721e_map_torrent, 5035 }, 5036 {} 5037 }; 5038 MODULE_DEVICE_TABLE(of, cdns_torrent_phy_of_match); 5039 5040 static struct platform_driver cdns_torrent_phy_driver = { 5041 .probe = cdns_torrent_phy_probe, 5042 .remove_new = cdns_torrent_phy_remove, 5043 .driver = { 5044 .name = "cdns-torrent-phy", 5045 .of_match_table = cdns_torrent_phy_of_match, 5046 } 5047 }; 5048 module_platform_driver(cdns_torrent_phy_driver); 5049 5050 MODULE_AUTHOR("Cadence Design Systems, Inc."); 5051 MODULE_DESCRIPTION("Cadence Torrent PHY driver"); 5052 MODULE_LICENSE("GPL v2"); 5053