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