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