Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-only
0002 /*
0003  * Cadence Torrent SD0801 PHY driver.
0004  *
0005  * Copyright 2018 Cadence Design Systems, Inc.
0006  *
0007  */
0008 
0009 #include <dt-bindings/phy/phy.h>
0010 #include <dt-bindings/phy/phy-cadence.h>
0011 #include <linux/clk.h>
0012 #include <linux/clk-provider.h>
0013 #include <linux/delay.h>
0014 #include <linux/err.h>
0015 #include <linux/io.h>
0016 #include <linux/iopoll.h>
0017 #include <linux/kernel.h>
0018 #include <linux/module.h>
0019 #include <linux/of.h>
0020 #include <linux/of_address.h>
0021 #include <linux/of_device.h>
0022 #include <linux/phy/phy.h>
0023 #include <linux/platform_device.h>
0024 #include <linux/reset.h>
0025 #include <linux/regmap.h>
0026 
0027 #define REF_CLK_19_2MHZ     19200000
0028 #define REF_CLK_25MHZ       25000000
0029 #define REF_CLK_100MHZ      100000000
0030 
0031 #define MAX_NUM_LANES       4
0032 #define DEFAULT_MAX_BIT_RATE    8100 /* in Mbps */
0033 
0034 #define NUM_SSC_MODE        3
0035 #define NUM_REF_CLK     3
0036 #define NUM_PHY_TYPE        6
0037 
0038 #define POLL_TIMEOUT_US     5000
0039 #define PLL_LOCK_TIMEOUT    100000
0040 
0041 #define TORRENT_COMMON_CDB_OFFSET   0x0
0042 
0043 #define TORRENT_TX_LANE_CDB_OFFSET(ln, block_offset, reg_offset)    \
0044                 ((0x4000 << (block_offset)) +       \
0045                 (((ln) << 9) << (reg_offset)))
0046 
0047 #define TORRENT_RX_LANE_CDB_OFFSET(ln, block_offset, reg_offset)    \
0048                 ((0x8000 << (block_offset)) +       \
0049                 (((ln) << 9) << (reg_offset)))
0050 
0051 #define TORRENT_PHY_PCS_COMMON_OFFSET(block_offset) \
0052                 (0xC000 << (block_offset))
0053 
0054 #define TORRENT_PHY_PCS_LANE_CDB_OFFSET(ln, block_offset, reg_offset)   \
0055                 ((0xD000 << (block_offset)) +       \
0056                 (((ln) << 8) << (reg_offset)))
0057 
0058 #define TORRENT_PHY_PMA_COMMON_OFFSET(block_offset) \
0059                 (0xE000 << (block_offset))
0060 
0061 #define TORRENT_DPTX_PHY_OFFSET     0x0
0062 
0063 /*
0064  * register offsets from DPTX PHY register block base (i.e MHDP
0065  * register base + 0x30a00)
0066  */
0067 #define PHY_AUX_CTRL            0x04
0068 #define PHY_RESET           0x20
0069 #define PMA_TX_ELEC_IDLE_MASK       0xF0U
0070 #define PMA_TX_ELEC_IDLE_SHIFT      4
0071 #define PHY_L00_RESET_N_MASK        0x01U
0072 #define PHY_PMA_XCVR_PLLCLK_EN      0x24
0073 #define PHY_PMA_XCVR_PLLCLK_EN_ACK  0x28
0074 #define PHY_PMA_XCVR_POWER_STATE_REQ    0x2c
0075 #define PHY_POWER_STATE_LN_0    0x0000
0076 #define PHY_POWER_STATE_LN_1    0x0008
0077 #define PHY_POWER_STATE_LN_2    0x0010
0078 #define PHY_POWER_STATE_LN_3    0x0018
0079 #define PMA_XCVR_POWER_STATE_REQ_LN_MASK    0x3FU
0080 #define PHY_PMA_XCVR_POWER_STATE_ACK    0x30
0081 #define PHY_PMA_CMN_READY       0x34
0082 
0083 /*
0084  * register offsets from SD0801 PHY register block base (i.e MHDP
0085  * register base + 0x500000)
0086  */
0087 #define CMN_SSM_BANDGAP_TMR     0x0021U
0088 #define CMN_SSM_BIAS_TMR        0x0022U
0089 #define CMN_PLLSM0_PLLPRE_TMR       0x002AU
0090 #define CMN_PLLSM0_PLLLOCK_TMR      0x002CU
0091 #define CMN_PLLSM1_PLLPRE_TMR       0x0032U
0092 #define CMN_PLLSM1_PLLLOCK_TMR      0x0034U
0093 #define CMN_CDIAG_CDB_PWRI_OVRD     0x0041U
0094 #define CMN_CDIAG_XCVRC_PWRI_OVRD   0x0047U
0095 #define CMN_CDIAG_REFCLK_OVRD       0x004CU
0096 #define CMN_CDIAG_REFCLK_DRV0_CTRL  0x0050U
0097 #define CMN_BGCAL_INIT_TMR      0x0064U
0098 #define CMN_BGCAL_ITER_TMR      0x0065U
0099 #define CMN_IBCAL_INIT_TMR      0x0074U
0100 #define CMN_PLL0_VCOCAL_TCTRL       0x0082U
0101 #define CMN_PLL0_VCOCAL_INIT_TMR    0x0084U
0102 #define CMN_PLL0_VCOCAL_ITER_TMR    0x0085U
0103 #define CMN_PLL0_VCOCAL_REFTIM_START    0x0086U
0104 #define CMN_PLL0_VCOCAL_PLLCNT_START    0x0088U
0105 #define CMN_PLL0_INTDIV_M0      0x0090U
0106 #define CMN_PLL0_FRACDIVL_M0        0x0091U
0107 #define CMN_PLL0_FRACDIVH_M0        0x0092U
0108 #define CMN_PLL0_HIGH_THR_M0        0x0093U
0109 #define CMN_PLL0_DSM_DIAG_M0        0x0094U
0110 #define CMN_PLL0_DSM_FBH_OVRD_M0    0x0095U
0111 #define CMN_PLL0_SS_CTRL1_M0        0x0098U
0112 #define CMN_PLL0_SS_CTRL2_M0            0x0099U
0113 #define CMN_PLL0_SS_CTRL3_M0            0x009AU
0114 #define CMN_PLL0_SS_CTRL4_M0            0x009BU
0115 #define CMN_PLL0_LOCK_REFCNT_START      0x009CU
0116 #define CMN_PLL0_LOCK_PLLCNT_START  0x009EU
0117 #define CMN_PLL0_LOCK_PLLCNT_THR        0x009FU
0118 #define CMN_PLL0_INTDIV_M1      0x00A0U
0119 #define CMN_PLL0_FRACDIVH_M1        0x00A2U
0120 #define CMN_PLL0_HIGH_THR_M1        0x00A3U
0121 #define CMN_PLL0_DSM_DIAG_M1        0x00A4U
0122 #define CMN_PLL0_SS_CTRL1_M1        0x00A8U
0123 #define CMN_PLL0_SS_CTRL2_M1        0x00A9U
0124 #define CMN_PLL0_SS_CTRL3_M1        0x00AAU
0125 #define CMN_PLL0_SS_CTRL4_M1        0x00ABU
0126 #define CMN_PLL1_VCOCAL_TCTRL       0x00C2U
0127 #define CMN_PLL1_VCOCAL_INIT_TMR    0x00C4U
0128 #define CMN_PLL1_VCOCAL_ITER_TMR    0x00C5U
0129 #define CMN_PLL1_VCOCAL_REFTIM_START    0x00C6U
0130 #define CMN_PLL1_VCOCAL_PLLCNT_START    0x00C8U
0131 #define CMN_PLL1_INTDIV_M0      0x00D0U
0132 #define CMN_PLL1_FRACDIVL_M0        0x00D1U
0133 #define CMN_PLL1_FRACDIVH_M0        0x00D2U
0134 #define CMN_PLL1_HIGH_THR_M0        0x00D3U
0135 #define CMN_PLL1_DSM_DIAG_M0        0x00D4U
0136 #define CMN_PLL1_DSM_FBH_OVRD_M0    0x00D5U
0137 #define CMN_PLL1_DSM_FBL_OVRD_M0    0x00D6U
0138 #define CMN_PLL1_SS_CTRL1_M0        0x00D8U
0139 #define CMN_PLL1_SS_CTRL2_M0            0x00D9U
0140 #define CMN_PLL1_SS_CTRL3_M0            0x00DAU
0141 #define CMN_PLL1_SS_CTRL4_M0            0x00DBU
0142 #define CMN_PLL1_LOCK_REFCNT_START      0x00DCU
0143 #define CMN_PLL1_LOCK_PLLCNT_START  0x00DEU
0144 #define CMN_PLL1_LOCK_PLLCNT_THR        0x00DFU
0145 #define CMN_TXPUCAL_TUNE        0x0103U
0146 #define CMN_TXPUCAL_INIT_TMR        0x0104U
0147 #define CMN_TXPUCAL_ITER_TMR        0x0105U
0148 #define CMN_TXPDCAL_TUNE        0x010BU
0149 #define CMN_TXPDCAL_INIT_TMR        0x010CU
0150 #define CMN_TXPDCAL_ITER_TMR        0x010DU
0151 #define CMN_RXCAL_INIT_TMR      0x0114U
0152 #define CMN_RXCAL_ITER_TMR      0x0115U
0153 #define CMN_SD_CAL_INIT_TMR     0x0124U
0154 #define CMN_SD_CAL_ITER_TMR     0x0125U
0155 #define CMN_SD_CAL_REFTIM_START     0x0126U
0156 #define CMN_SD_CAL_PLLCNT_START     0x0128U
0157 #define CMN_PDIAG_PLL0_CTRL_M0      0x01A0U
0158 #define CMN_PDIAG_PLL0_CLK_SEL_M0   0x01A1U
0159 #define CMN_PDIAG_PLL0_CP_PADJ_M0   0x01A4U
0160 #define CMN_PDIAG_PLL0_CP_IADJ_M0   0x01A5U
0161 #define CMN_PDIAG_PLL0_FILT_PADJ_M0 0x01A6U
0162 #define CMN_PDIAG_PLL0_CTRL_M1      0x01B0U
0163 #define CMN_PDIAG_PLL0_CLK_SEL_M1   0x01B1U
0164 #define CMN_PDIAG_PLL0_CP_PADJ_M1   0x01B4U
0165 #define CMN_PDIAG_PLL0_CP_IADJ_M1   0x01B5U
0166 #define CMN_PDIAG_PLL0_FILT_PADJ_M1 0x01B6U
0167 #define CMN_PDIAG_PLL1_CTRL_M0      0x01C0U
0168 #define CMN_PDIAG_PLL1_CLK_SEL_M0   0x01C1U
0169 #define CMN_PDIAG_PLL1_CP_PADJ_M0   0x01C4U
0170 #define CMN_PDIAG_PLL1_CP_IADJ_M0   0x01C5U
0171 #define CMN_PDIAG_PLL1_FILT_PADJ_M0 0x01C6U
0172 #define CMN_DIAG_BIAS_OVRD1     0x01E1U
0173 
0174 /* PMA TX Lane registers */
0175 #define TX_TXCC_CTRL            0x0040U
0176 #define TX_TXCC_CPOST_MULT_00       0x004CU
0177 #define TX_TXCC_CPOST_MULT_01       0x004DU
0178 #define TX_TXCC_MGNFS_MULT_000      0x0050U
0179 #define TX_TXCC_MGNFS_MULT_100      0x0054U
0180 #define DRV_DIAG_TX_DRV         0x00C6U
0181 #define XCVR_DIAG_PLLDRC_CTRL       0x00E5U
0182 #define XCVR_DIAG_HSCLK_SEL     0x00E6U
0183 #define XCVR_DIAG_HSCLK_DIV     0x00E7U
0184 #define XCVR_DIAG_RXCLK_CTRL        0x00E9U
0185 #define XCVR_DIAG_BIDI_CTRL     0x00EAU
0186 #define XCVR_DIAG_PSC_OVRD      0x00EBU
0187 #define TX_PSC_A0           0x0100U
0188 #define TX_PSC_A1           0x0101U
0189 #define TX_PSC_A2           0x0102U
0190 #define TX_PSC_A3           0x0103U
0191 #define TX_RCVDET_ST_TMR        0x0123U
0192 #define TX_DIAG_ACYA            0x01E7U
0193 #define TX_DIAG_ACYA_HBDC_MASK      0x0001U
0194 
0195 /* PMA RX Lane registers */
0196 #define RX_PSC_A0           0x0000U
0197 #define RX_PSC_A1           0x0001U
0198 #define RX_PSC_A2           0x0002U
0199 #define RX_PSC_A3           0x0003U
0200 #define RX_PSC_CAL          0x0006U
0201 #define RX_CDRLF_CNFG           0x0080U
0202 #define RX_CDRLF_CNFG3          0x0082U
0203 #define RX_SIGDET_HL_FILT_TMR       0x0090U
0204 #define RX_REE_GCSM1_CTRL       0x0108U
0205 #define RX_REE_GCSM1_EQENM_PH1      0x0109U
0206 #define RX_REE_GCSM1_EQENM_PH2      0x010AU
0207 #define RX_REE_GCSM2_CTRL       0x0110U
0208 #define RX_REE_PERGCSM_CTRL     0x0118U
0209 #define RX_REE_ATTEN_THR        0x0149U
0210 #define RX_REE_TAP1_CLIP        0x0171U
0211 #define RX_REE_TAP2TON_CLIP     0x0172U
0212 #define RX_REE_SMGM_CTRL1       0x0177U
0213 #define RX_REE_SMGM_CTRL2       0x0178U
0214 #define RX_DIAG_DFE_CTRL        0x01E0U
0215 #define RX_DIAG_DFE_AMP_TUNE_2      0x01E2U
0216 #define RX_DIAG_DFE_AMP_TUNE_3      0x01E3U
0217 #define RX_DIAG_NQST_CTRL       0x01E5U
0218 #define RX_DIAG_SIGDET_TUNE     0x01E8U
0219 #define RX_DIAG_PI_RATE         0x01F4U
0220 #define RX_DIAG_PI_CAP          0x01F5U
0221 #define RX_DIAG_ACYA            0x01FFU
0222 
0223 /* PHY PCS common registers */
0224 #define PHY_PIPE_CMN_CTRL1      0x0000U
0225 #define PHY_PLL_CFG         0x000EU
0226 #define PHY_PIPE_USB3_GEN2_PRE_CFG0 0x0020U
0227 #define PHY_PIPE_USB3_GEN2_POST_CFG0    0x0022U
0228 #define PHY_PIPE_USB3_GEN2_POST_CFG1    0x0023U
0229 
0230 /* PHY PCS lane registers */
0231 #define PHY_PCS_ISO_LINK_CTRL       0x000BU
0232 
0233 /* PHY PMA common registers */
0234 #define PHY_PMA_CMN_CTRL1       0x0000U
0235 #define PHY_PMA_CMN_CTRL2       0x0001U
0236 #define PHY_PMA_PLL_RAW_CTRL        0x0003U
0237 
0238 #define CDNS_TORRENT_OUTPUT_CLOCKS  3
0239 
0240 static const char * const clk_names[] = {
0241     [CDNS_TORRENT_REFCLK_DRIVER] = "refclk-driver",
0242     [CDNS_TORRENT_DERIVED_REFCLK] = "refclk-der",
0243     [CDNS_TORRENT_RECEIVED_REFCLK] = "refclk-rec",
0244 };
0245 
0246 static const struct reg_field phy_pll_cfg =
0247                 REG_FIELD(PHY_PLL_CFG, 0, 1);
0248 
0249 static const struct reg_field phy_pma_cmn_ctrl_1 =
0250                 REG_FIELD(PHY_PMA_CMN_CTRL1, 0, 0);
0251 
0252 static const struct reg_field phy_pma_cmn_ctrl_2 =
0253                 REG_FIELD(PHY_PMA_CMN_CTRL2, 0, 7);
0254 
0255 static const struct reg_field phy_pma_pll_raw_ctrl =
0256                 REG_FIELD(PHY_PMA_PLL_RAW_CTRL, 0, 1);
0257 
0258 static const struct reg_field phy_reset_ctrl =
0259                 REG_FIELD(PHY_RESET, 8, 8);
0260 
0261 static const struct reg_field phy_pcs_iso_link_ctrl_1 =
0262                 REG_FIELD(PHY_PCS_ISO_LINK_CTRL, 1, 1);
0263 
0264 static const struct reg_field phy_pipe_cmn_ctrl1_0 = REG_FIELD(PHY_PIPE_CMN_CTRL1, 0, 0);
0265 
0266 static const struct reg_field cmn_cdiag_refclk_ovrd_4 =
0267                 REG_FIELD(CMN_CDIAG_REFCLK_OVRD, 4, 4);
0268 
0269 #define REFCLK_OUT_NUM_CMN_CONFIG   4
0270 
0271 enum cdns_torrent_refclk_out_cmn {
0272     CMN_CDIAG_REFCLK_DRV0_CTRL_1,
0273     CMN_CDIAG_REFCLK_DRV0_CTRL_4,
0274     CMN_CDIAG_REFCLK_DRV0_CTRL_5,
0275     CMN_CDIAG_REFCLK_DRV0_CTRL_6,
0276 };
0277 
0278 static const struct reg_field refclk_out_cmn_cfg[] = {
0279     [CMN_CDIAG_REFCLK_DRV0_CTRL_1]  = REG_FIELD(CMN_CDIAG_REFCLK_DRV0_CTRL, 1, 1),
0280     [CMN_CDIAG_REFCLK_DRV0_CTRL_4]  = REG_FIELD(CMN_CDIAG_REFCLK_DRV0_CTRL, 4, 4),
0281     [CMN_CDIAG_REFCLK_DRV0_CTRL_5]  = REG_FIELD(CMN_CDIAG_REFCLK_DRV0_CTRL, 5, 5),
0282     [CMN_CDIAG_REFCLK_DRV0_CTRL_6]  = REG_FIELD(CMN_CDIAG_REFCLK_DRV0_CTRL, 6, 6),
0283 };
0284 
0285 static const int refclk_driver_parent_index[] = {
0286     CDNS_TORRENT_DERIVED_REFCLK,
0287     CDNS_TORRENT_RECEIVED_REFCLK
0288 };
0289 
0290 static u32 cdns_torrent_refclk_driver_mux_table[] = { 1, 0 };
0291 
0292 enum cdns_torrent_phy_type {
0293     TYPE_NONE,
0294     TYPE_DP,
0295     TYPE_PCIE,
0296     TYPE_SGMII,
0297     TYPE_QSGMII,
0298     TYPE_USB,
0299 };
0300 
0301 enum cdns_torrent_ref_clk {
0302     CLK_19_2_MHZ,
0303     CLK_25_MHZ,
0304     CLK_100_MHZ
0305 };
0306 
0307 enum cdns_torrent_ssc_mode {
0308     NO_SSC,
0309     EXTERNAL_SSC,
0310     INTERNAL_SSC
0311 };
0312 
0313 struct cdns_torrent_inst {
0314     struct phy *phy;
0315     u32 mlane;
0316     enum cdns_torrent_phy_type phy_type;
0317     u32 num_lanes;
0318     struct reset_control *lnk_rst;
0319     enum cdns_torrent_ssc_mode ssc_mode;
0320 };
0321 
0322 struct cdns_torrent_phy {
0323     void __iomem *base; /* DPTX registers base */
0324     void __iomem *sd_base; /* SD0801 registers base */
0325     u32 max_bit_rate; /* Maximum link bit rate to use (in Mbps) */
0326     struct reset_control *phy_rst;
0327     struct reset_control *apb_rst;
0328     struct device *dev;
0329     struct clk *clk;
0330     enum cdns_torrent_ref_clk ref_clk_rate;
0331     struct cdns_torrent_inst phys[MAX_NUM_LANES];
0332     int nsubnodes;
0333     const struct cdns_torrent_data *init_data;
0334     struct regmap *regmap_common_cdb;
0335     struct regmap *regmap_phy_pcs_common_cdb;
0336     struct regmap *regmap_phy_pma_common_cdb;
0337     struct regmap *regmap_tx_lane_cdb[MAX_NUM_LANES];
0338     struct regmap *regmap_rx_lane_cdb[MAX_NUM_LANES];
0339     struct regmap *regmap_phy_pcs_lane_cdb[MAX_NUM_LANES];
0340     struct regmap *regmap_dptx_phy_reg;
0341     struct regmap_field *phy_pll_cfg;
0342     struct regmap_field *phy_pipe_cmn_ctrl1_0;
0343     struct regmap_field *cmn_cdiag_refclk_ovrd_4;
0344     struct regmap_field *phy_pma_cmn_ctrl_1;
0345     struct regmap_field *phy_pma_cmn_ctrl_2;
0346     struct regmap_field *phy_pma_pll_raw_ctrl;
0347     struct regmap_field *phy_reset_ctrl;
0348     struct regmap_field *phy_pcs_iso_link_ctrl_1[MAX_NUM_LANES];
0349     struct clk_hw_onecell_data *clk_hw_data;
0350 };
0351 
0352 enum phy_powerstate {
0353     POWERSTATE_A0 = 0,
0354     /* Powerstate A1 is unused */
0355     POWERSTATE_A2 = 2,
0356     POWERSTATE_A3 = 3,
0357 };
0358 
0359 struct cdns_torrent_refclk_driver {
0360     struct clk_hw       hw;
0361     struct regmap_field *cmn_fields[REFCLK_OUT_NUM_CMN_CONFIG];
0362     struct clk_init_data    clk_data;
0363 };
0364 
0365 #define to_cdns_torrent_refclk_driver(_hw)  \
0366             container_of(_hw, struct cdns_torrent_refclk_driver, hw)
0367 
0368 struct cdns_torrent_derived_refclk {
0369     struct clk_hw       hw;
0370     struct regmap_field *phy_pipe_cmn_ctrl1_0;
0371     struct regmap_field *cmn_cdiag_refclk_ovrd_4;
0372     struct clk_init_data    clk_data;
0373 };
0374 
0375 #define to_cdns_torrent_derived_refclk(_hw) \
0376             container_of(_hw, struct cdns_torrent_derived_refclk, hw)
0377 
0378 struct cdns_torrent_received_refclk {
0379     struct clk_hw       hw;
0380     struct regmap_field *phy_pipe_cmn_ctrl1_0;
0381     struct regmap_field *cmn_cdiag_refclk_ovrd_4;
0382     struct clk_init_data    clk_data;
0383 };
0384 
0385 #define to_cdns_torrent_received_refclk(_hw)    \
0386             container_of(_hw, struct cdns_torrent_received_refclk, hw)
0387 
0388 struct cdns_reg_pairs {
0389     u32 val;
0390     u32 off;
0391 };
0392 
0393 struct cdns_torrent_vals {
0394     struct cdns_reg_pairs *reg_pairs;
0395     u32 num_regs;
0396 };
0397 
0398 struct cdns_torrent_data {
0399     u8 block_offset_shift;
0400     u8 reg_offset_shift;
0401     struct cdns_torrent_vals *link_cmn_vals[NUM_PHY_TYPE][NUM_PHY_TYPE]
0402                            [NUM_SSC_MODE];
0403     struct cdns_torrent_vals *xcvr_diag_vals[NUM_PHY_TYPE][NUM_PHY_TYPE]
0404                         [NUM_SSC_MODE];
0405     struct cdns_torrent_vals *pcs_cmn_vals[NUM_PHY_TYPE][NUM_PHY_TYPE]
0406                           [NUM_SSC_MODE];
0407     struct cdns_torrent_vals *cmn_vals[NUM_REF_CLK][NUM_PHY_TYPE]
0408                       [NUM_PHY_TYPE][NUM_SSC_MODE];
0409     struct cdns_torrent_vals *tx_ln_vals[NUM_REF_CLK][NUM_PHY_TYPE]
0410                         [NUM_PHY_TYPE][NUM_SSC_MODE];
0411     struct cdns_torrent_vals *rx_ln_vals[NUM_REF_CLK][NUM_PHY_TYPE]
0412                         [NUM_PHY_TYPE][NUM_SSC_MODE];
0413 };
0414 
0415 struct cdns_regmap_cdb_context {
0416     struct device *dev;
0417     void __iomem *base;
0418     u8 reg_offset_shift;
0419 };
0420 
0421 static int cdns_regmap_write(void *context, unsigned int reg, unsigned int val)
0422 {
0423     struct cdns_regmap_cdb_context *ctx = context;
0424     u32 offset = reg << ctx->reg_offset_shift;
0425 
0426     writew(val, ctx->base + offset);
0427 
0428     return 0;
0429 }
0430 
0431 static int cdns_regmap_read(void *context, unsigned int reg, unsigned int *val)
0432 {
0433     struct cdns_regmap_cdb_context *ctx = context;
0434     u32 offset = reg << ctx->reg_offset_shift;
0435 
0436     *val = readw(ctx->base + offset);
0437     return 0;
0438 }
0439 
0440 static int cdns_regmap_dptx_write(void *context, unsigned int reg,
0441                   unsigned int val)
0442 {
0443     struct cdns_regmap_cdb_context *ctx = context;
0444     u32 offset = reg;
0445 
0446     writel(val, ctx->base + offset);
0447 
0448     return 0;
0449 }
0450 
0451 static int cdns_regmap_dptx_read(void *context, unsigned int reg,
0452                  unsigned int *val)
0453 {
0454     struct cdns_regmap_cdb_context *ctx = context;
0455     u32 offset = reg;
0456 
0457     *val = readl(ctx->base + offset);
0458     return 0;
0459 }
0460 
0461 #define TORRENT_TX_LANE_CDB_REGMAP_CONF(n) \
0462 { \
0463     .name = "torrent_tx_lane" n "_cdb", \
0464     .reg_stride = 1, \
0465     .fast_io = true, \
0466     .reg_write = cdns_regmap_write, \
0467     .reg_read = cdns_regmap_read, \
0468 }
0469 
0470 #define TORRENT_RX_LANE_CDB_REGMAP_CONF(n) \
0471 { \
0472     .name = "torrent_rx_lane" n "_cdb", \
0473     .reg_stride = 1, \
0474     .fast_io = true, \
0475     .reg_write = cdns_regmap_write, \
0476     .reg_read = cdns_regmap_read, \
0477 }
0478 
0479 static const struct regmap_config cdns_torrent_tx_lane_cdb_config[] = {
0480     TORRENT_TX_LANE_CDB_REGMAP_CONF("0"),
0481     TORRENT_TX_LANE_CDB_REGMAP_CONF("1"),
0482     TORRENT_TX_LANE_CDB_REGMAP_CONF("2"),
0483     TORRENT_TX_LANE_CDB_REGMAP_CONF("3"),
0484 };
0485 
0486 static const struct regmap_config cdns_torrent_rx_lane_cdb_config[] = {
0487     TORRENT_RX_LANE_CDB_REGMAP_CONF("0"),
0488     TORRENT_RX_LANE_CDB_REGMAP_CONF("1"),
0489     TORRENT_RX_LANE_CDB_REGMAP_CONF("2"),
0490     TORRENT_RX_LANE_CDB_REGMAP_CONF("3"),
0491 };
0492 
0493 static const struct regmap_config cdns_torrent_common_cdb_config = {
0494     .name = "torrent_common_cdb",
0495     .reg_stride = 1,
0496     .fast_io = true,
0497     .reg_write = cdns_regmap_write,
0498     .reg_read = cdns_regmap_read,
0499 };
0500 
0501 #define TORRENT_PHY_PCS_LANE_CDB_REGMAP_CONF(n) \
0502 { \
0503     .name = "torrent_phy_pcs_lane" n "_cdb", \
0504     .reg_stride = 1, \
0505     .fast_io = true, \
0506     .reg_write = cdns_regmap_write, \
0507     .reg_read = cdns_regmap_read, \
0508 }
0509 
0510 static const struct regmap_config cdns_torrent_phy_pcs_lane_cdb_config[] = {
0511     TORRENT_PHY_PCS_LANE_CDB_REGMAP_CONF("0"),
0512     TORRENT_PHY_PCS_LANE_CDB_REGMAP_CONF("1"),
0513     TORRENT_PHY_PCS_LANE_CDB_REGMAP_CONF("2"),
0514     TORRENT_PHY_PCS_LANE_CDB_REGMAP_CONF("3"),
0515 };
0516 
0517 static const struct regmap_config cdns_torrent_phy_pcs_cmn_cdb_config = {
0518     .name = "torrent_phy_pcs_cmn_cdb",
0519     .reg_stride = 1,
0520     .fast_io = true,
0521     .reg_write = cdns_regmap_write,
0522     .reg_read = cdns_regmap_read,
0523 };
0524 
0525 static const struct regmap_config cdns_torrent_phy_pma_cmn_cdb_config = {
0526     .name = "torrent_phy_pma_cmn_cdb",
0527     .reg_stride = 1,
0528     .fast_io = true,
0529     .reg_write = cdns_regmap_write,
0530     .reg_read = cdns_regmap_read,
0531 };
0532 
0533 static const struct regmap_config cdns_torrent_dptx_phy_config = {
0534     .name = "torrent_dptx_phy",
0535     .reg_stride = 1,
0536     .fast_io = true,
0537     .reg_write = cdns_regmap_dptx_write,
0538     .reg_read = cdns_regmap_dptx_read,
0539 };
0540 
0541 /* PHY mmr access functions */
0542 
0543 static void cdns_torrent_phy_write(struct regmap *regmap, u32 offset, u32 val)
0544 {
0545     regmap_write(regmap, offset, val);
0546 }
0547 
0548 static u32 cdns_torrent_phy_read(struct regmap *regmap, u32 offset)
0549 {
0550     unsigned int val;
0551 
0552     regmap_read(regmap, offset, &val);
0553     return val;
0554 }
0555 
0556 /* DPTX mmr access functions */
0557 
0558 static void cdns_torrent_dp_write(struct regmap *regmap, u32 offset, u32 val)
0559 {
0560     regmap_write(regmap, offset, val);
0561 }
0562 
0563 static u32 cdns_torrent_dp_read(struct regmap *regmap, u32 offset)
0564 {
0565     u32 val;
0566 
0567     regmap_read(regmap, offset, &val);
0568     return val;
0569 }
0570 
0571 /*
0572  * Structure used to store values of PHY registers for voltage-related
0573  * coefficients, for particular voltage swing and pre-emphasis level. Values
0574  * are shared across all physical lanes.
0575  */
0576 struct coefficients {
0577     /* Value of DRV_DIAG_TX_DRV register to use */
0578     u16 diag_tx_drv;
0579     /* Value of TX_TXCC_MGNFS_MULT_000 register to use */
0580     u16 mgnfs_mult;
0581     /* Value of TX_TXCC_CPOST_MULT_00 register to use */
0582     u16 cpost_mult;
0583 };
0584 
0585 /*
0586  * Array consists of values of voltage-related registers for sd0801 PHY. A value
0587  * of 0xFFFF is a placeholder for invalid combination, and will never be used.
0588  */
0589 static const struct coefficients vltg_coeff[4][4] = {
0590     /* voltage swing 0, pre-emphasis 0->3 */
0591     {   {.diag_tx_drv = 0x0003, .mgnfs_mult = 0x002A,
0592          .cpost_mult = 0x0000},
0593         {.diag_tx_drv = 0x0003, .mgnfs_mult = 0x001F,
0594          .cpost_mult = 0x0014},
0595         {.diag_tx_drv = 0x0003, .mgnfs_mult = 0x0012,
0596          .cpost_mult = 0x0020},
0597         {.diag_tx_drv = 0x0003, .mgnfs_mult = 0x0000,
0598          .cpost_mult = 0x002A}
0599     },
0600 
0601     /* voltage swing 1, pre-emphasis 0->3 */
0602     {   {.diag_tx_drv = 0x0003, .mgnfs_mult = 0x001F,
0603          .cpost_mult = 0x0000},
0604         {.diag_tx_drv = 0x0003, .mgnfs_mult = 0x0013,
0605          .cpost_mult = 0x0012},
0606         {.diag_tx_drv = 0x0003, .mgnfs_mult = 0x0000,
0607          .cpost_mult = 0x001F},
0608         {.diag_tx_drv = 0xFFFF, .mgnfs_mult = 0xFFFF,
0609          .cpost_mult = 0xFFFF}
0610     },
0611 
0612     /* voltage swing 2, pre-emphasis 0->3 */
0613     {   {.diag_tx_drv = 0x0003, .mgnfs_mult = 0x0013,
0614          .cpost_mult = 0x0000},
0615         {.diag_tx_drv = 0x0003, .mgnfs_mult = 0x0000,
0616          .cpost_mult = 0x0013},
0617         {.diag_tx_drv = 0xFFFF, .mgnfs_mult = 0xFFFF,
0618          .cpost_mult = 0xFFFF},
0619         {.diag_tx_drv = 0xFFFF, .mgnfs_mult = 0xFFFF,
0620          .cpost_mult = 0xFFFF}
0621     },
0622 
0623     /* voltage swing 3, pre-emphasis 0->3 */
0624     {   {.diag_tx_drv = 0x0003, .mgnfs_mult = 0x0000,
0625          .cpost_mult = 0x0000},
0626         {.diag_tx_drv = 0xFFFF, .mgnfs_mult = 0xFFFF,
0627          .cpost_mult = 0xFFFF},
0628         {.diag_tx_drv = 0xFFFF, .mgnfs_mult = 0xFFFF,
0629          .cpost_mult = 0xFFFF},
0630         {.diag_tx_drv = 0xFFFF, .mgnfs_mult = 0xFFFF,
0631          .cpost_mult = 0xFFFF}
0632     }
0633 };
0634 
0635 static const char *cdns_torrent_get_phy_type(enum cdns_torrent_phy_type phy_type)
0636 {
0637     switch (phy_type) {
0638     case TYPE_DP:
0639         return "DisplayPort";
0640     case TYPE_PCIE:
0641         return "PCIe";
0642     case TYPE_SGMII:
0643         return "SGMII";
0644     case TYPE_QSGMII:
0645         return "QSGMII";
0646     case TYPE_USB:
0647         return "USB";
0648     default:
0649         return "None";
0650     }
0651 }
0652 
0653 /*
0654  * Set registers responsible for enabling and configuring SSC, with second and
0655  * third register values provided by parameters.
0656  */
0657 static
0658 void cdns_torrent_dp_enable_ssc_19_2mhz(struct cdns_torrent_phy *cdns_phy,
0659                     u32 ctrl2_val, u32 ctrl3_val)
0660 {
0661     struct regmap *regmap = cdns_phy->regmap_common_cdb;
0662 
0663     cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL1_M0, 0x0001);
0664     cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL1_M0, ctrl2_val);
0665     cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL1_M0, ctrl3_val);
0666     cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL4_M0, 0x0003);
0667     cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL1_M0, 0x0001);
0668     cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL1_M0, ctrl2_val);
0669     cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL1_M0, ctrl3_val);
0670     cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL4_M0, 0x0003);
0671 }
0672 
0673 static
0674 void cdns_torrent_dp_pma_cmn_vco_cfg_19_2mhz(struct cdns_torrent_phy *cdns_phy,
0675                          u32 rate, bool ssc)
0676 {
0677     struct regmap *regmap = cdns_phy->regmap_common_cdb;
0678 
0679     /* Assumes 19.2 MHz refclock */
0680     switch (rate) {
0681     /* Setting VCO for 10.8GHz */
0682     case 2700:
0683     case 5400:
0684         cdns_torrent_phy_write(regmap, CMN_PLL0_INTDIV_M0, 0x0119);
0685         cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVL_M0, 0x4000);
0686         cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVH_M0, 0x0002);
0687         cdns_torrent_phy_write(regmap, CMN_PLL0_HIGH_THR_M0, 0x00BC);
0688         cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CTRL_M0, 0x0012);
0689         cdns_torrent_phy_write(regmap, CMN_PLL1_INTDIV_M0, 0x0119);
0690         cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVL_M0, 0x4000);
0691         cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVH_M0, 0x0002);
0692         cdns_torrent_phy_write(regmap, CMN_PLL1_HIGH_THR_M0, 0x00BC);
0693         cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CTRL_M0, 0x0012);
0694         if (ssc)
0695             cdns_torrent_dp_enable_ssc_19_2mhz(cdns_phy, 0x033A, 0x006A);
0696         break;
0697     /* Setting VCO for 9.72GHz */
0698     case 1620:
0699     case 2430:
0700     case 3240:
0701         cdns_torrent_phy_write(regmap, CMN_PLL0_INTDIV_M0, 0x01FA);
0702         cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVL_M0, 0x4000);
0703         cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVH_M0, 0x0002);
0704         cdns_torrent_phy_write(regmap, CMN_PLL0_HIGH_THR_M0, 0x0152);
0705         cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CTRL_M0, 0x0002);
0706         cdns_torrent_phy_write(regmap, CMN_PLL1_INTDIV_M0, 0x01FA);
0707         cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVL_M0, 0x4000);
0708         cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVH_M0, 0x0002);
0709         cdns_torrent_phy_write(regmap, CMN_PLL1_HIGH_THR_M0, 0x0152);
0710         cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CTRL_M0, 0x0002);
0711         if (ssc)
0712             cdns_torrent_dp_enable_ssc_19_2mhz(cdns_phy, 0x05DD, 0x0069);
0713         break;
0714     /* Setting VCO for 8.64GHz */
0715     case 2160:
0716     case 4320:
0717         cdns_torrent_phy_write(regmap, CMN_PLL0_INTDIV_M0, 0x01C2);
0718         cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVL_M0, 0x0000);
0719         cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVH_M0, 0x0002);
0720         cdns_torrent_phy_write(regmap, CMN_PLL0_HIGH_THR_M0, 0x012C);
0721         cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CTRL_M0, 0x0002);
0722         cdns_torrent_phy_write(regmap, CMN_PLL1_INTDIV_M0, 0x01C2);
0723         cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVL_M0, 0x0000);
0724         cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVH_M0, 0x0002);
0725         cdns_torrent_phy_write(regmap, CMN_PLL1_HIGH_THR_M0, 0x012C);
0726         cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CTRL_M0, 0x0002);
0727         if (ssc)
0728             cdns_torrent_dp_enable_ssc_19_2mhz(cdns_phy, 0x0536, 0x0069);
0729         break;
0730     /* Setting VCO for 8.1GHz */
0731     case 8100:
0732         cdns_torrent_phy_write(regmap, CMN_PLL0_INTDIV_M0, 0x01A5);
0733         cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVL_M0, 0xE000);
0734         cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVH_M0, 0x0002);
0735         cdns_torrent_phy_write(regmap, CMN_PLL0_HIGH_THR_M0, 0x011A);
0736         cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CTRL_M0, 0x0002);
0737         cdns_torrent_phy_write(regmap, CMN_PLL1_INTDIV_M0, 0x01A5);
0738         cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVL_M0, 0xE000);
0739         cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVH_M0, 0x0002);
0740         cdns_torrent_phy_write(regmap, CMN_PLL1_HIGH_THR_M0, 0x011A);
0741         cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CTRL_M0, 0x0002);
0742         if (ssc)
0743             cdns_torrent_dp_enable_ssc_19_2mhz(cdns_phy, 0x04D7, 0x006A);
0744         break;
0745     }
0746 
0747     if (ssc) {
0748         cdns_torrent_phy_write(regmap, CMN_PLL0_VCOCAL_PLLCNT_START, 0x025E);
0749         cdns_torrent_phy_write(regmap, CMN_PLL0_LOCK_PLLCNT_THR, 0x0005);
0750         cdns_torrent_phy_write(regmap, CMN_PLL1_VCOCAL_PLLCNT_START, 0x025E);
0751         cdns_torrent_phy_write(regmap, CMN_PLL1_LOCK_PLLCNT_THR, 0x0005);
0752     } else {
0753         cdns_torrent_phy_write(regmap, CMN_PLL0_VCOCAL_PLLCNT_START, 0x0260);
0754         cdns_torrent_phy_write(regmap, CMN_PLL1_VCOCAL_PLLCNT_START, 0x0260);
0755         /* Set reset register values to disable SSC */
0756         cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL1_M0, 0x0002);
0757         cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL2_M0, 0x0000);
0758         cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL3_M0, 0x0000);
0759         cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL4_M0, 0x0000);
0760         cdns_torrent_phy_write(regmap, CMN_PLL0_LOCK_PLLCNT_THR, 0x0003);
0761         cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL1_M0, 0x0002);
0762         cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL2_M0, 0x0000);
0763         cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL3_M0, 0x0000);
0764         cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL4_M0, 0x0000);
0765         cdns_torrent_phy_write(regmap, CMN_PLL1_LOCK_PLLCNT_THR, 0x0003);
0766     }
0767 
0768     cdns_torrent_phy_write(regmap, CMN_PLL0_LOCK_REFCNT_START, 0x0099);
0769     cdns_torrent_phy_write(regmap, CMN_PLL0_LOCK_PLLCNT_START, 0x0099);
0770     cdns_torrent_phy_write(regmap, CMN_PLL1_LOCK_REFCNT_START, 0x0099);
0771     cdns_torrent_phy_write(regmap, CMN_PLL1_LOCK_PLLCNT_START, 0x0099);
0772 }
0773 
0774 /*
0775  * Set registers responsible for enabling and configuring SSC, with second
0776  * register value provided by a parameter.
0777  */
0778 static void cdns_torrent_dp_enable_ssc_25mhz(struct cdns_torrent_phy *cdns_phy,
0779                          u32 ctrl2_val)
0780 {
0781     struct regmap *regmap = cdns_phy->regmap_common_cdb;
0782 
0783     cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL1_M0, 0x0001);
0784     cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL1_M0, ctrl2_val);
0785     cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL1_M0, 0x007F);
0786     cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL4_M0, 0x0003);
0787     cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL1_M0, 0x0001);
0788     cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL1_M0, ctrl2_val);
0789     cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL1_M0, 0x007F);
0790     cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL4_M0, 0x0003);
0791 }
0792 
0793 static
0794 void cdns_torrent_dp_pma_cmn_vco_cfg_25mhz(struct cdns_torrent_phy *cdns_phy,
0795                        u32 rate, bool ssc)
0796 {
0797     struct regmap *regmap = cdns_phy->regmap_common_cdb;
0798 
0799     /* Assumes 25 MHz refclock */
0800     switch (rate) {
0801     /* Setting VCO for 10.8GHz */
0802     case 2700:
0803     case 5400:
0804         cdns_torrent_phy_write(regmap, CMN_PLL0_INTDIV_M0, 0x01B0);
0805         cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVL_M0, 0x0000);
0806         cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVH_M0, 0x0002);
0807         cdns_torrent_phy_write(regmap, CMN_PLL0_HIGH_THR_M0, 0x0120);
0808         cdns_torrent_phy_write(regmap, CMN_PLL1_INTDIV_M0, 0x01B0);
0809         cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVL_M0, 0x0000);
0810         cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVH_M0, 0x0002);
0811         cdns_torrent_phy_write(regmap, CMN_PLL1_HIGH_THR_M0, 0x0120);
0812         if (ssc)
0813             cdns_torrent_dp_enable_ssc_25mhz(cdns_phy, 0x0423);
0814         break;
0815     /* Setting VCO for 9.72GHz */
0816     case 1620:
0817     case 2430:
0818     case 3240:
0819         cdns_torrent_phy_write(regmap, CMN_PLL0_INTDIV_M0, 0x0184);
0820         cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVL_M0, 0xCCCD);
0821         cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVH_M0, 0x0002);
0822         cdns_torrent_phy_write(regmap, CMN_PLL0_HIGH_THR_M0, 0x0104);
0823         cdns_torrent_phy_write(regmap, CMN_PLL1_INTDIV_M0, 0x0184);
0824         cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVL_M0, 0xCCCD);
0825         cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVH_M0, 0x0002);
0826         cdns_torrent_phy_write(regmap, CMN_PLL1_HIGH_THR_M0, 0x0104);
0827         if (ssc)
0828             cdns_torrent_dp_enable_ssc_25mhz(cdns_phy, 0x03B9);
0829         break;
0830     /* Setting VCO for 8.64GHz */
0831     case 2160:
0832     case 4320:
0833         cdns_torrent_phy_write(regmap, CMN_PLL0_INTDIV_M0, 0x0159);
0834         cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVL_M0, 0x999A);
0835         cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVH_M0, 0x0002);
0836         cdns_torrent_phy_write(regmap, CMN_PLL0_HIGH_THR_M0, 0x00E7);
0837         cdns_torrent_phy_write(regmap, CMN_PLL1_INTDIV_M0, 0x0159);
0838         cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVL_M0, 0x999A);
0839         cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVH_M0, 0x0002);
0840         cdns_torrent_phy_write(regmap, CMN_PLL1_HIGH_THR_M0, 0x00E7);
0841         if (ssc)
0842             cdns_torrent_dp_enable_ssc_25mhz(cdns_phy, 0x034F);
0843         break;
0844     /* Setting VCO for 8.1GHz */
0845     case 8100:
0846         cdns_torrent_phy_write(regmap, CMN_PLL0_INTDIV_M0, 0x0144);
0847         cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVL_M0, 0x0000);
0848         cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVH_M0, 0x0002);
0849         cdns_torrent_phy_write(regmap, CMN_PLL0_HIGH_THR_M0, 0x00D8);
0850         cdns_torrent_phy_write(regmap, CMN_PLL1_INTDIV_M0, 0x0144);
0851         cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVL_M0, 0x0000);
0852         cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVH_M0, 0x0002);
0853         cdns_torrent_phy_write(regmap, CMN_PLL1_HIGH_THR_M0, 0x00D8);
0854         if (ssc)
0855             cdns_torrent_dp_enable_ssc_25mhz(cdns_phy, 0x031A);
0856         break;
0857     }
0858 
0859     cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CTRL_M0, 0x0002);
0860     cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CTRL_M0, 0x0002);
0861 
0862     if (ssc) {
0863         cdns_torrent_phy_write(regmap,
0864                        CMN_PLL0_VCOCAL_PLLCNT_START, 0x0315);
0865         cdns_torrent_phy_write(regmap,
0866                        CMN_PLL0_LOCK_PLLCNT_THR, 0x0005);
0867         cdns_torrent_phy_write(regmap,
0868                        CMN_PLL1_VCOCAL_PLLCNT_START, 0x0315);
0869         cdns_torrent_phy_write(regmap,
0870                        CMN_PLL1_LOCK_PLLCNT_THR, 0x0005);
0871     } else {
0872         cdns_torrent_phy_write(regmap,
0873                        CMN_PLL0_VCOCAL_PLLCNT_START, 0x0317);
0874         cdns_torrent_phy_write(regmap,
0875                        CMN_PLL1_VCOCAL_PLLCNT_START, 0x0317);
0876         /* Set reset register values to disable SSC */
0877         cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL1_M0, 0x0002);
0878         cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL2_M0, 0x0000);
0879         cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL3_M0, 0x0000);
0880         cdns_torrent_phy_write(regmap, CMN_PLL0_SS_CTRL4_M0, 0x0000);
0881         cdns_torrent_phy_write(regmap,
0882                        CMN_PLL0_LOCK_PLLCNT_THR, 0x0003);
0883         cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL1_M0, 0x0002);
0884         cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL2_M0, 0x0000);
0885         cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL3_M0, 0x0000);
0886         cdns_torrent_phy_write(regmap, CMN_PLL1_SS_CTRL4_M0, 0x0000);
0887         cdns_torrent_phy_write(regmap,
0888                        CMN_PLL1_LOCK_PLLCNT_THR, 0x0003);
0889     }
0890 
0891     cdns_torrent_phy_write(regmap, CMN_PLL0_LOCK_REFCNT_START, 0x00C7);
0892     cdns_torrent_phy_write(regmap, CMN_PLL0_LOCK_PLLCNT_START, 0x00C7);
0893     cdns_torrent_phy_write(regmap, CMN_PLL1_LOCK_REFCNT_START, 0x00C7);
0894     cdns_torrent_phy_write(regmap, CMN_PLL1_LOCK_PLLCNT_START, 0x00C7);
0895 }
0896 
0897 static
0898 void cdns_torrent_dp_pma_cmn_vco_cfg_100mhz(struct cdns_torrent_phy *cdns_phy,
0899                         u32 rate, bool ssc)
0900 {
0901     struct regmap *regmap = cdns_phy->regmap_common_cdb;
0902 
0903     /* Assumes 100 MHz refclock */
0904     switch (rate) {
0905     /* Setting VCO for 10.8GHz */
0906     case 2700:
0907     case 5400:
0908         cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CP_PADJ_M0, 0x0028);
0909         cdns_torrent_phy_write(regmap, CMN_PLL0_DSM_FBH_OVRD_M0, 0x0022);
0910         cdns_torrent_phy_write(regmap, CMN_PLL1_DSM_FBH_OVRD_M0, 0x0022);
0911         cdns_torrent_phy_write(regmap, CMN_PLL1_DSM_FBL_OVRD_M0, 0x000C);
0912         break;
0913     /* Setting VCO for 9.72GHz */
0914     case 1620:
0915     case 2430:
0916     case 3240:
0917         cdns_torrent_phy_write(regmap, CMN_PLL0_DSM_DIAG_M0, 0x0004);
0918         cdns_torrent_phy_write(regmap, CMN_PLL1_DSM_DIAG_M0, 0x0004);
0919         cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CP_PADJ_M0, 0x0509);
0920         cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CP_PADJ_M0, 0x0509);
0921         cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CP_IADJ_M0, 0x0F00);
0922         cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CP_IADJ_M0, 0x0F00);
0923         cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_FILT_PADJ_M0, 0x0F08);
0924         cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_FILT_PADJ_M0, 0x0F08);
0925         cdns_torrent_phy_write(regmap, CMN_PLL0_INTDIV_M0, 0x0061);
0926         cdns_torrent_phy_write(regmap, CMN_PLL1_INTDIV_M0, 0x0061);
0927         cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVL_M0, 0x3333);
0928         cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVL_M0, 0x3333);
0929         cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVH_M0, 0x0002);
0930         cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVH_M0, 0x0002);
0931         cdns_torrent_phy_write(regmap, CMN_PLL0_HIGH_THR_M0, 0x0042);
0932         cdns_torrent_phy_write(regmap, CMN_PLL1_HIGH_THR_M0, 0x0042);
0933         cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CTRL_M0, 0x0002);
0934         cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CTRL_M0, 0x0002);
0935         break;
0936     /* Setting VCO for 8.64GHz */
0937     case 2160:
0938     case 4320:
0939         cdns_torrent_phy_write(regmap, CMN_PLL0_DSM_DIAG_M0, 0x0004);
0940         cdns_torrent_phy_write(regmap, CMN_PLL1_DSM_DIAG_M0, 0x0004);
0941         cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CP_PADJ_M0, 0x0509);
0942         cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CP_PADJ_M0, 0x0509);
0943         cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CP_IADJ_M0, 0x0F00);
0944         cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CP_IADJ_M0, 0x0F00);
0945         cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_FILT_PADJ_M0, 0x0F08);
0946         cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_FILT_PADJ_M0, 0x0F08);
0947         cdns_torrent_phy_write(regmap, CMN_PLL0_INTDIV_M0, 0x0056);
0948         cdns_torrent_phy_write(regmap, CMN_PLL1_INTDIV_M0, 0x0056);
0949         cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVL_M0, 0x6666);
0950         cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVL_M0, 0x6666);
0951         cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVH_M0, 0x0002);
0952         cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVH_M0, 0x0002);
0953         cdns_torrent_phy_write(regmap, CMN_PLL0_HIGH_THR_M0, 0x003A);
0954         cdns_torrent_phy_write(regmap, CMN_PLL1_HIGH_THR_M0, 0x003A);
0955         cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CTRL_M0, 0x0002);
0956         cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CTRL_M0, 0x0002);
0957         break;
0958     /* Setting VCO for 8.1GHz */
0959     case 8100:
0960         cdns_torrent_phy_write(regmap, CMN_PLL0_DSM_DIAG_M0, 0x0004);
0961         cdns_torrent_phy_write(regmap, CMN_PLL1_DSM_DIAG_M0, 0x0004);
0962         cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CP_PADJ_M0, 0x0509);
0963         cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CP_PADJ_M0, 0x0509);
0964         cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CP_IADJ_M0, 0x0F00);
0965         cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CP_IADJ_M0, 0x0F00);
0966         cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_FILT_PADJ_M0, 0x0F08);
0967         cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_FILT_PADJ_M0, 0x0F08);
0968         cdns_torrent_phy_write(regmap, CMN_PLL0_INTDIV_M0, 0x0051);
0969         cdns_torrent_phy_write(regmap, CMN_PLL1_INTDIV_M0, 0x0051);
0970         cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVH_M0, 0x0002);
0971         cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVH_M0, 0x0002);
0972         cdns_torrent_phy_write(regmap, CMN_PLL0_HIGH_THR_M0, 0x0036);
0973         cdns_torrent_phy_write(regmap, CMN_PLL1_HIGH_THR_M0, 0x0036);
0974         cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CTRL_M0, 0x0002);
0975         cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CTRL_M0, 0x0002);
0976         break;
0977     }
0978 }
0979 
0980 /*
0981  * Enable or disable PLL for selected lanes.
0982  */
0983 static int cdns_torrent_dp_set_pll_en(struct cdns_torrent_phy *cdns_phy,
0984                       struct phy_configure_opts_dp *dp,
0985                       bool enable)
0986 {
0987     u32 rd_val;
0988     u32 ret;
0989     struct regmap *regmap = cdns_phy->regmap_dptx_phy_reg;
0990 
0991     /*
0992      * Used to determine, which bits to check for or enable in
0993      * PHY_PMA_XCVR_PLLCLK_EN register.
0994      */
0995     u32 pll_bits;
0996     /* Used to enable or disable lanes. */
0997     u32 pll_val;
0998 
0999     /* Select values of registers and mask, depending on enabled lane
1000      * count.
1001      */
1002     switch (dp->lanes) {
1003     /* lane 0 */
1004     case (1):
1005         pll_bits = 0x00000001;
1006         break;
1007     /* lanes 0-1 */
1008     case (2):
1009         pll_bits = 0x00000003;
1010         break;
1011     /* lanes 0-3, all */
1012     default:
1013         pll_bits = 0x0000000F;
1014         break;
1015     }
1016 
1017     if (enable)
1018         pll_val = pll_bits;
1019     else
1020         pll_val = 0x00000000;
1021 
1022     cdns_torrent_dp_write(regmap, PHY_PMA_XCVR_PLLCLK_EN, pll_val);
1023 
1024     /* Wait for acknowledgment from PHY. */
1025     ret = regmap_read_poll_timeout(regmap,
1026                        PHY_PMA_XCVR_PLLCLK_EN_ACK,
1027                        rd_val,
1028                        (rd_val & pll_bits) == pll_val,
1029                        0, POLL_TIMEOUT_US);
1030     ndelay(100);
1031     return ret;
1032 }
1033 
1034 static int cdns_torrent_dp_set_power_state(struct cdns_torrent_phy *cdns_phy,
1035                        u32 num_lanes,
1036                        enum phy_powerstate powerstate)
1037 {
1038     /* Register value for power state for a single byte. */
1039     u32 value_part;
1040     u32 value;
1041     u32 mask;
1042     u32 read_val;
1043     u32 ret;
1044     struct regmap *regmap = cdns_phy->regmap_dptx_phy_reg;
1045 
1046     switch (powerstate) {
1047     case (POWERSTATE_A0):
1048         value_part = 0x01U;
1049         break;
1050     case (POWERSTATE_A2):
1051         value_part = 0x04U;
1052         break;
1053     default:
1054         /* Powerstate A3 */
1055         value_part = 0x08U;
1056         break;
1057     }
1058 
1059     /* Select values of registers and mask, depending on enabled
1060      * lane count.
1061      */
1062     switch (num_lanes) {
1063     /* lane 0 */
1064     case (1):
1065         value = value_part;
1066         mask = 0x0000003FU;
1067         break;
1068     /* lanes 0-1 */
1069     case (2):
1070         value = (value_part
1071              | (value_part << 8));
1072         mask = 0x00003F3FU;
1073         break;
1074     /* lanes 0-3, all */
1075     default:
1076         value = (value_part
1077              | (value_part << 8)
1078              | (value_part << 16)
1079              | (value_part << 24));
1080         mask = 0x3F3F3F3FU;
1081         break;
1082     }
1083 
1084     /* Set power state A<n>. */
1085     cdns_torrent_dp_write(regmap, PHY_PMA_XCVR_POWER_STATE_REQ, value);
1086     /* Wait, until PHY acknowledges power state completion. */
1087     ret = regmap_read_poll_timeout(regmap, PHY_PMA_XCVR_POWER_STATE_ACK,
1088                        read_val, (read_val & mask) == value, 0,
1089                        POLL_TIMEOUT_US);
1090     cdns_torrent_dp_write(regmap, PHY_PMA_XCVR_POWER_STATE_REQ, 0x00000000);
1091     ndelay(100);
1092 
1093     return ret;
1094 }
1095 
1096 static int cdns_torrent_dp_run(struct cdns_torrent_phy *cdns_phy, u32 num_lanes)
1097 {
1098     unsigned int read_val;
1099     int ret;
1100     struct regmap *regmap = cdns_phy->regmap_dptx_phy_reg;
1101 
1102     /*
1103      * waiting for ACK of pma_xcvr_pllclk_en_ln_*, only for the
1104      * master lane
1105      */
1106     ret = regmap_read_poll_timeout(regmap, PHY_PMA_XCVR_PLLCLK_EN_ACK,
1107                        read_val, read_val & 1,
1108                        0, POLL_TIMEOUT_US);
1109     if (ret == -ETIMEDOUT) {
1110         dev_err(cdns_phy->dev,
1111             "timeout waiting for link PLL clock enable ack\n");
1112         return ret;
1113     }
1114 
1115     ndelay(100);
1116 
1117     ret = cdns_torrent_dp_set_power_state(cdns_phy, num_lanes,
1118                           POWERSTATE_A2);
1119     if (ret)
1120         return ret;
1121 
1122     ret = cdns_torrent_dp_set_power_state(cdns_phy, num_lanes,
1123                           POWERSTATE_A0);
1124 
1125     return ret;
1126 }
1127 
1128 static int cdns_torrent_dp_wait_pma_cmn_ready(struct cdns_torrent_phy *cdns_phy)
1129 {
1130     unsigned int reg;
1131     int ret;
1132     struct regmap *regmap = cdns_phy->regmap_dptx_phy_reg;
1133 
1134     ret = regmap_read_poll_timeout(regmap, PHY_PMA_CMN_READY, reg,
1135                        reg & 1, 0, POLL_TIMEOUT_US);
1136     if (ret == -ETIMEDOUT) {
1137         dev_err(cdns_phy->dev,
1138             "timeout waiting for PMA common ready\n");
1139         return -ETIMEDOUT;
1140     }
1141 
1142     return 0;
1143 }
1144 
1145 static void cdns_torrent_dp_pma_cmn_rate(struct cdns_torrent_phy *cdns_phy,
1146                      u32 rate, u32 num_lanes)
1147 {
1148     unsigned int clk_sel_val = 0;
1149     unsigned int hsclk_div_val = 0;
1150     unsigned int i;
1151 
1152     switch (rate) {
1153     case 1620:
1154         clk_sel_val = 0x0f01;
1155         hsclk_div_val = 2;
1156         break;
1157     case 2160:
1158     case 2430:
1159     case 2700:
1160         clk_sel_val = 0x0701;
1161         hsclk_div_val = 1;
1162         break;
1163     case 3240:
1164         clk_sel_val = 0x0b00;
1165         hsclk_div_val = 2;
1166         break;
1167     case 4320:
1168     case 5400:
1169         clk_sel_val = 0x0301;
1170         hsclk_div_val = 0;
1171         break;
1172     case 8100:
1173         clk_sel_val = 0x0200;
1174         hsclk_div_val = 0;
1175         break;
1176     }
1177 
1178     cdns_torrent_phy_write(cdns_phy->regmap_common_cdb,
1179                    CMN_PDIAG_PLL0_CLK_SEL_M0, clk_sel_val);
1180     cdns_torrent_phy_write(cdns_phy->regmap_common_cdb,
1181                    CMN_PDIAG_PLL1_CLK_SEL_M0, clk_sel_val);
1182 
1183     /* PMA lane configuration to deal with multi-link operation */
1184     for (i = 0; i < num_lanes; i++)
1185         cdns_torrent_phy_write(cdns_phy->regmap_tx_lane_cdb[i],
1186                        XCVR_DIAG_HSCLK_DIV, hsclk_div_val);
1187 }
1188 
1189 /*
1190  * Perform register operations related to setting link rate, once powerstate is
1191  * set and PLL disable request was processed.
1192  */
1193 static int cdns_torrent_dp_configure_rate(struct cdns_torrent_phy *cdns_phy,
1194                       struct phy_configure_opts_dp *dp)
1195 {
1196     u32 read_val, ret;
1197 
1198     /* Disable the cmn_pll0_en before re-programming the new data rate. */
1199     regmap_field_write(cdns_phy->phy_pma_pll_raw_ctrl, 0x0);
1200 
1201     /*
1202      * Wait for PLL ready de-assertion.
1203      * For PLL0 - PHY_PMA_CMN_CTRL2[2] == 1
1204      */
1205     ret = regmap_field_read_poll_timeout(cdns_phy->phy_pma_cmn_ctrl_2,
1206                          read_val,
1207                          ((read_val >> 2) & 0x01) != 0,
1208                          0, POLL_TIMEOUT_US);
1209     if (ret)
1210         return ret;
1211     ndelay(200);
1212 
1213     /* DP Rate Change - VCO Output settings. */
1214     if (cdns_phy->ref_clk_rate == CLK_19_2_MHZ)
1215         /* PMA common configuration 19.2MHz */
1216         cdns_torrent_dp_pma_cmn_vco_cfg_19_2mhz(cdns_phy, dp->link_rate, dp->ssc);
1217     else if (cdns_phy->ref_clk_rate == CLK_25_MHZ)
1218         /* PMA common configuration 25MHz */
1219         cdns_torrent_dp_pma_cmn_vco_cfg_25mhz(cdns_phy, dp->link_rate, dp->ssc);
1220     else if (cdns_phy->ref_clk_rate == CLK_100_MHZ)
1221         /* PMA common configuration 100MHz */
1222         cdns_torrent_dp_pma_cmn_vco_cfg_100mhz(cdns_phy, dp->link_rate, dp->ssc);
1223 
1224     cdns_torrent_dp_pma_cmn_rate(cdns_phy, dp->link_rate, dp->lanes);
1225 
1226     /* Enable the cmn_pll0_en. */
1227     regmap_field_write(cdns_phy->phy_pma_pll_raw_ctrl, 0x3);
1228 
1229     /*
1230      * Wait for PLL ready assertion.
1231      * For PLL0 - PHY_PMA_CMN_CTRL2[0] == 1
1232      */
1233     ret = regmap_field_read_poll_timeout(cdns_phy->phy_pma_cmn_ctrl_2,
1234                          read_val,
1235                          (read_val & 0x01) != 0,
1236                          0, POLL_TIMEOUT_US);
1237     return ret;
1238 }
1239 
1240 /*
1241  * Verify, that parameters to configure PHY with are correct.
1242  */
1243 static int cdns_torrent_dp_verify_config(struct cdns_torrent_inst *inst,
1244                      struct phy_configure_opts_dp *dp)
1245 {
1246     u8 i;
1247 
1248     /* If changing link rate was required, verify it's supported. */
1249     if (dp->set_rate) {
1250         switch (dp->link_rate) {
1251         case 1620:
1252         case 2160:
1253         case 2430:
1254         case 2700:
1255         case 3240:
1256         case 4320:
1257         case 5400:
1258         case 8100:
1259             /* valid bit rate */
1260             break;
1261         default:
1262             return -EINVAL;
1263         }
1264     }
1265 
1266     /* Verify lane count. */
1267     switch (dp->lanes) {
1268     case 1:
1269     case 2:
1270     case 4:
1271         /* valid lane count. */
1272         break;
1273     default:
1274         return -EINVAL;
1275     }
1276 
1277     /* Check against actual number of PHY's lanes. */
1278     if (dp->lanes > inst->num_lanes)
1279         return -EINVAL;
1280 
1281     /*
1282      * If changing voltages is required, check swing and pre-emphasis
1283      * levels, per-lane.
1284      */
1285     if (dp->set_voltages) {
1286         /* Lane count verified previously. */
1287         for (i = 0; i < dp->lanes; i++) {
1288             if (dp->voltage[i] > 3 || dp->pre[i] > 3)
1289                 return -EINVAL;
1290 
1291             /* Sum of voltage swing and pre-emphasis levels cannot
1292              * exceed 3.
1293              */
1294             if (dp->voltage[i] + dp->pre[i] > 3)
1295                 return -EINVAL;
1296         }
1297     }
1298 
1299     return 0;
1300 }
1301 
1302 /* Set power state A0 and PLL clock enable to 0 on enabled lanes. */
1303 static void cdns_torrent_dp_set_a0_pll(struct cdns_torrent_phy *cdns_phy,
1304                        u32 num_lanes)
1305 {
1306     struct regmap *regmap = cdns_phy->regmap_dptx_phy_reg;
1307     u32 pwr_state = cdns_torrent_dp_read(regmap,
1308                          PHY_PMA_XCVR_POWER_STATE_REQ);
1309     u32 pll_clk_en = cdns_torrent_dp_read(regmap,
1310                           PHY_PMA_XCVR_PLLCLK_EN);
1311 
1312     /* Lane 0 is always enabled. */
1313     pwr_state &= ~(PMA_XCVR_POWER_STATE_REQ_LN_MASK <<
1314                PHY_POWER_STATE_LN_0);
1315     pll_clk_en &= ~0x01U;
1316 
1317     if (num_lanes > 1) {
1318         /* lane 1 */
1319         pwr_state &= ~(PMA_XCVR_POWER_STATE_REQ_LN_MASK <<
1320                    PHY_POWER_STATE_LN_1);
1321         pll_clk_en &= ~(0x01U << 1);
1322     }
1323 
1324     if (num_lanes > 2) {
1325         /* lanes 2 and 3 */
1326         pwr_state &= ~(PMA_XCVR_POWER_STATE_REQ_LN_MASK <<
1327                    PHY_POWER_STATE_LN_2);
1328         pwr_state &= ~(PMA_XCVR_POWER_STATE_REQ_LN_MASK <<
1329                    PHY_POWER_STATE_LN_3);
1330         pll_clk_en &= ~(0x01U << 2);
1331         pll_clk_en &= ~(0x01U << 3);
1332     }
1333 
1334     cdns_torrent_dp_write(regmap, PHY_PMA_XCVR_POWER_STATE_REQ, pwr_state);
1335     cdns_torrent_dp_write(regmap, PHY_PMA_XCVR_PLLCLK_EN, pll_clk_en);
1336 }
1337 
1338 /* Configure lane count as required. */
1339 static int cdns_torrent_dp_set_lanes(struct cdns_torrent_phy *cdns_phy,
1340                      struct phy_configure_opts_dp *dp)
1341 {
1342     u32 value;
1343     u32 ret;
1344     struct regmap *regmap = cdns_phy->regmap_dptx_phy_reg;
1345     u8 lane_mask = (1 << dp->lanes) - 1;
1346 
1347     value = cdns_torrent_dp_read(regmap, PHY_RESET);
1348     /* clear pma_tx_elec_idle_ln_* bits. */
1349     value &= ~PMA_TX_ELEC_IDLE_MASK;
1350     /* Assert pma_tx_elec_idle_ln_* for disabled lanes. */
1351     value |= ((~lane_mask) << PMA_TX_ELEC_IDLE_SHIFT) &
1352          PMA_TX_ELEC_IDLE_MASK;
1353     cdns_torrent_dp_write(regmap, PHY_RESET, value);
1354 
1355     /* reset the link by asserting phy_l00_reset_n low */
1356     cdns_torrent_dp_write(regmap, PHY_RESET,
1357                   value & (~PHY_L00_RESET_N_MASK));
1358 
1359     /*
1360      * Assert lane reset on unused lanes and lane 0 so they remain in reset
1361      * and powered down when re-enabling the link
1362      */
1363     value = (value & 0x0000FFF0) | (0x0000000E & lane_mask);
1364     cdns_torrent_dp_write(regmap, PHY_RESET, value);
1365 
1366     cdns_torrent_dp_set_a0_pll(cdns_phy, dp->lanes);
1367 
1368     /* release phy_l0*_reset_n based on used laneCount */
1369     value = (value & 0x0000FFF0) | (0x0000000F & lane_mask);
1370     cdns_torrent_dp_write(regmap, PHY_RESET, value);
1371 
1372     /* Wait, until PHY gets ready after releasing PHY reset signal. */
1373     ret = cdns_torrent_dp_wait_pma_cmn_ready(cdns_phy);
1374     if (ret)
1375         return ret;
1376 
1377     ndelay(100);
1378 
1379     /* release pma_xcvr_pllclk_en_ln_*, only for the master lane */
1380     cdns_torrent_dp_write(regmap, PHY_PMA_XCVR_PLLCLK_EN, 0x0001);
1381 
1382     ret = cdns_torrent_dp_run(cdns_phy, dp->lanes);
1383 
1384     return ret;
1385 }
1386 
1387 /* Configure link rate as required. */
1388 static int cdns_torrent_dp_set_rate(struct cdns_torrent_phy *cdns_phy,
1389                     struct phy_configure_opts_dp *dp)
1390 {
1391     u32 ret;
1392 
1393     ret = cdns_torrent_dp_set_power_state(cdns_phy, dp->lanes,
1394                           POWERSTATE_A3);
1395     if (ret)
1396         return ret;
1397     ret = cdns_torrent_dp_set_pll_en(cdns_phy, dp, false);
1398     if (ret)
1399         return ret;
1400     ndelay(200);
1401 
1402     ret = cdns_torrent_dp_configure_rate(cdns_phy, dp);
1403     if (ret)
1404         return ret;
1405     ndelay(200);
1406 
1407     ret = cdns_torrent_dp_set_pll_en(cdns_phy, dp, true);
1408     if (ret)
1409         return ret;
1410     ret = cdns_torrent_dp_set_power_state(cdns_phy, dp->lanes,
1411                           POWERSTATE_A2);
1412     if (ret)
1413         return ret;
1414     ret = cdns_torrent_dp_set_power_state(cdns_phy, dp->lanes,
1415                           POWERSTATE_A0);
1416     if (ret)
1417         return ret;
1418     ndelay(900);
1419 
1420     return ret;
1421 }
1422 
1423 /* Configure voltage swing and pre-emphasis for all enabled lanes. */
1424 static void cdns_torrent_dp_set_voltages(struct cdns_torrent_phy *cdns_phy,
1425                      struct phy_configure_opts_dp *dp)
1426 {
1427     u8 lane;
1428     u16 val;
1429 
1430     for (lane = 0; lane < dp->lanes; lane++) {
1431         val = cdns_torrent_phy_read(cdns_phy->regmap_tx_lane_cdb[lane],
1432                         TX_DIAG_ACYA);
1433         /*
1434          * Write 1 to register bit TX_DIAG_ACYA[0] to freeze the
1435          * current state of the analog TX driver.
1436          */
1437         val |= TX_DIAG_ACYA_HBDC_MASK;
1438         cdns_torrent_phy_write(cdns_phy->regmap_tx_lane_cdb[lane],
1439                        TX_DIAG_ACYA, val);
1440 
1441         cdns_torrent_phy_write(cdns_phy->regmap_tx_lane_cdb[lane],
1442                        TX_TXCC_CTRL, 0x08A4);
1443         val = vltg_coeff[dp->voltage[lane]][dp->pre[lane]].diag_tx_drv;
1444         cdns_torrent_phy_write(cdns_phy->regmap_tx_lane_cdb[lane],
1445                        DRV_DIAG_TX_DRV, val);
1446         val = vltg_coeff[dp->voltage[lane]][dp->pre[lane]].mgnfs_mult;
1447         cdns_torrent_phy_write(cdns_phy->regmap_tx_lane_cdb[lane],
1448                        TX_TXCC_MGNFS_MULT_000,
1449                        val);
1450         val = vltg_coeff[dp->voltage[lane]][dp->pre[lane]].cpost_mult;
1451         cdns_torrent_phy_write(cdns_phy->regmap_tx_lane_cdb[lane],
1452                        TX_TXCC_CPOST_MULT_00,
1453                        val);
1454 
1455         val = cdns_torrent_phy_read(cdns_phy->regmap_tx_lane_cdb[lane],
1456                         TX_DIAG_ACYA);
1457         /*
1458          * Write 0 to register bit TX_DIAG_ACYA[0] to allow the state of
1459          * analog TX driver to reflect the new programmed one.
1460          */
1461         val &= ~TX_DIAG_ACYA_HBDC_MASK;
1462         cdns_torrent_phy_write(cdns_phy->regmap_tx_lane_cdb[lane],
1463                        TX_DIAG_ACYA, val);
1464     }
1465 };
1466 
1467 static int cdns_torrent_dp_configure(struct phy *phy,
1468                      union phy_configure_opts *opts)
1469 {
1470     struct cdns_torrent_inst *inst = phy_get_drvdata(phy);
1471     struct cdns_torrent_phy *cdns_phy = dev_get_drvdata(phy->dev.parent);
1472     int ret;
1473 
1474     ret = cdns_torrent_dp_verify_config(inst, &opts->dp);
1475     if (ret) {
1476         dev_err(&phy->dev, "invalid params for phy configure\n");
1477         return ret;
1478     }
1479 
1480     if (opts->dp.set_lanes) {
1481         ret = cdns_torrent_dp_set_lanes(cdns_phy, &opts->dp);
1482         if (ret) {
1483             dev_err(&phy->dev, "cdns_torrent_dp_set_lanes failed\n");
1484             return ret;
1485         }
1486     }
1487 
1488     if (opts->dp.set_rate) {
1489         ret = cdns_torrent_dp_set_rate(cdns_phy, &opts->dp);
1490         if (ret) {
1491             dev_err(&phy->dev, "cdns_torrent_dp_set_rate failed\n");
1492             return ret;
1493         }
1494     }
1495 
1496     if (opts->dp.set_voltages)
1497         cdns_torrent_dp_set_voltages(cdns_phy, &opts->dp);
1498 
1499     return ret;
1500 }
1501 
1502 static int cdns_torrent_phy_on(struct phy *phy)
1503 {
1504     struct cdns_torrent_inst *inst = phy_get_drvdata(phy);
1505     struct cdns_torrent_phy *cdns_phy = dev_get_drvdata(phy->dev.parent);
1506     u32 read_val;
1507     int ret;
1508 
1509     if (cdns_phy->nsubnodes == 1) {
1510         /* Take the PHY lane group out of reset */
1511         reset_control_deassert(inst->lnk_rst);
1512 
1513         /* Take the PHY out of reset */
1514         ret = reset_control_deassert(cdns_phy->phy_rst);
1515         if (ret)
1516             return ret;
1517     }
1518 
1519     /*
1520      * Wait for cmn_ready assertion
1521      * PHY_PMA_CMN_CTRL1[0] == 1
1522      */
1523     ret = regmap_field_read_poll_timeout(cdns_phy->phy_pma_cmn_ctrl_1,
1524                          read_val, read_val, 1000,
1525                          PLL_LOCK_TIMEOUT);
1526     if (ret) {
1527         dev_err(cdns_phy->dev, "Timeout waiting for CMN ready\n");
1528         return ret;
1529     }
1530 
1531     if (inst->phy_type == TYPE_PCIE || inst->phy_type == TYPE_USB) {
1532         ret = regmap_field_read_poll_timeout(cdns_phy->phy_pcs_iso_link_ctrl_1[inst->mlane],
1533                              read_val, !read_val, 1000,
1534                              PLL_LOCK_TIMEOUT);
1535         if (ret == -ETIMEDOUT) {
1536             dev_err(cdns_phy->dev, "Timeout waiting for PHY status ready\n");
1537             return ret;
1538         }
1539     }
1540 
1541     return 0;
1542 }
1543 
1544 static int cdns_torrent_phy_off(struct phy *phy)
1545 {
1546     struct cdns_torrent_inst *inst = phy_get_drvdata(phy);
1547     struct cdns_torrent_phy *cdns_phy = dev_get_drvdata(phy->dev.parent);
1548     int ret;
1549 
1550     if (cdns_phy->nsubnodes != 1)
1551         return 0;
1552 
1553     ret = reset_control_assert(cdns_phy->phy_rst);
1554     if (ret)
1555         return ret;
1556 
1557     return reset_control_assert(inst->lnk_rst);
1558 }
1559 
1560 static void cdns_torrent_dp_common_init(struct cdns_torrent_phy *cdns_phy,
1561                     struct cdns_torrent_inst *inst)
1562 {
1563     struct regmap *regmap = cdns_phy->regmap_dptx_phy_reg;
1564     unsigned char lane_bits;
1565 
1566     cdns_torrent_dp_write(regmap, PHY_AUX_CTRL, 0x0003); /* enable AUX */
1567 
1568     /*
1569      * Set lines power state to A0
1570      * Set lines pll clk enable to 0
1571      */
1572     cdns_torrent_dp_set_a0_pll(cdns_phy, inst->num_lanes);
1573 
1574     /*
1575      * release phy_l0*_reset_n and pma_tx_elec_idle_ln_* based on
1576      * used lanes
1577      */
1578     lane_bits = (1 << inst->num_lanes) - 1;
1579     cdns_torrent_dp_write(regmap, PHY_RESET,
1580                   ((0xF & ~lane_bits) << 4) | (0xF & lane_bits));
1581 
1582     /* release pma_xcvr_pllclk_en_ln_*, only for the master lane */
1583     cdns_torrent_dp_write(regmap, PHY_PMA_XCVR_PLLCLK_EN, 0x0001);
1584 
1585     /*
1586      * PHY PMA registers configuration functions
1587      * Initialize PHY with max supported link rate, without SSC.
1588      */
1589     if (cdns_phy->ref_clk_rate == CLK_19_2_MHZ)
1590         cdns_torrent_dp_pma_cmn_vco_cfg_19_2mhz(cdns_phy,
1591                             cdns_phy->max_bit_rate,
1592                             false);
1593     else if (cdns_phy->ref_clk_rate == CLK_25_MHZ)
1594         cdns_torrent_dp_pma_cmn_vco_cfg_25mhz(cdns_phy,
1595                               cdns_phy->max_bit_rate,
1596                               false);
1597     else if (cdns_phy->ref_clk_rate == CLK_100_MHZ)
1598         cdns_torrent_dp_pma_cmn_vco_cfg_100mhz(cdns_phy,
1599                                cdns_phy->max_bit_rate,
1600                                false);
1601 
1602     cdns_torrent_dp_pma_cmn_rate(cdns_phy, cdns_phy->max_bit_rate,
1603                      inst->num_lanes);
1604 
1605     /* take out of reset */
1606     regmap_field_write(cdns_phy->phy_reset_ctrl, 0x1);
1607 }
1608 
1609 static int cdns_torrent_dp_start(struct cdns_torrent_phy *cdns_phy,
1610                  struct cdns_torrent_inst *inst,
1611                  struct phy *phy)
1612 {
1613     int ret;
1614 
1615     cdns_torrent_phy_on(phy);
1616 
1617     ret = cdns_torrent_dp_wait_pma_cmn_ready(cdns_phy);
1618     if (ret)
1619         return ret;
1620 
1621     ret = cdns_torrent_dp_run(cdns_phy, inst->num_lanes);
1622 
1623     return ret;
1624 }
1625 
1626 static int cdns_torrent_dp_init(struct phy *phy)
1627 {
1628     struct cdns_torrent_inst *inst = phy_get_drvdata(phy);
1629     struct cdns_torrent_phy *cdns_phy = dev_get_drvdata(phy->dev.parent);
1630 
1631     switch (cdns_phy->ref_clk_rate) {
1632     case CLK_19_2_MHZ:
1633     case CLK_25_MHZ:
1634     case CLK_100_MHZ:
1635         /* Valid Ref Clock Rate */
1636         break;
1637     default:
1638         dev_err(cdns_phy->dev, "Unsupported Ref Clock Rate\n");
1639         return -EINVAL;
1640     }
1641 
1642     cdns_torrent_dp_common_init(cdns_phy, inst);
1643 
1644     return cdns_torrent_dp_start(cdns_phy, inst, phy);
1645 }
1646 
1647 static int cdns_torrent_derived_refclk_enable(struct clk_hw *hw)
1648 {
1649     struct cdns_torrent_derived_refclk *derived_refclk = to_cdns_torrent_derived_refclk(hw);
1650 
1651     regmap_field_write(derived_refclk->cmn_cdiag_refclk_ovrd_4, 1);
1652     regmap_field_write(derived_refclk->phy_pipe_cmn_ctrl1_0, 1);
1653 
1654     return 0;
1655 }
1656 
1657 static void cdns_torrent_derived_refclk_disable(struct clk_hw *hw)
1658 {
1659     struct cdns_torrent_derived_refclk *derived_refclk = to_cdns_torrent_derived_refclk(hw);
1660 
1661     regmap_field_write(derived_refclk->phy_pipe_cmn_ctrl1_0, 0);
1662     regmap_field_write(derived_refclk->cmn_cdiag_refclk_ovrd_4, 0);
1663 }
1664 
1665 static int cdns_torrent_derived_refclk_is_enabled(struct clk_hw *hw)
1666 {
1667     struct cdns_torrent_derived_refclk *derived_refclk = to_cdns_torrent_derived_refclk(hw);
1668     int val;
1669 
1670     regmap_field_read(derived_refclk->cmn_cdiag_refclk_ovrd_4, &val);
1671 
1672     return !!val;
1673 }
1674 
1675 static const struct clk_ops cdns_torrent_derived_refclk_ops = {
1676     .enable = cdns_torrent_derived_refclk_enable,
1677     .disable = cdns_torrent_derived_refclk_disable,
1678     .is_enabled = cdns_torrent_derived_refclk_is_enabled,
1679 };
1680 
1681 static int cdns_torrent_derived_refclk_register(struct cdns_torrent_phy *cdns_phy)
1682 {
1683     struct cdns_torrent_derived_refclk *derived_refclk;
1684     struct device *dev = cdns_phy->dev;
1685     struct clk_init_data *init;
1686     const char *parent_name;
1687     char clk_name[100];
1688     struct clk_hw *hw;
1689     struct clk *clk;
1690     int ret;
1691 
1692     derived_refclk = devm_kzalloc(dev, sizeof(*derived_refclk), GFP_KERNEL);
1693     if (!derived_refclk)
1694         return -ENOMEM;
1695 
1696     snprintf(clk_name, sizeof(clk_name), "%s_%s", dev_name(dev),
1697          clk_names[CDNS_TORRENT_DERIVED_REFCLK]);
1698 
1699     clk = devm_clk_get_optional(dev, "phy_en_refclk");
1700     if (IS_ERR(clk)) {
1701         dev_err(dev, "No parent clock for derived_refclk\n");
1702         return PTR_ERR(clk);
1703     }
1704 
1705     init = &derived_refclk->clk_data;
1706 
1707     if (clk) {
1708         parent_name = __clk_get_name(clk);
1709         init->parent_names = &parent_name;
1710         init->num_parents = 1;
1711     }
1712     init->ops = &cdns_torrent_derived_refclk_ops;
1713     init->flags = 0;
1714     init->name = clk_name;
1715 
1716     derived_refclk->phy_pipe_cmn_ctrl1_0 = cdns_phy->phy_pipe_cmn_ctrl1_0;
1717     derived_refclk->cmn_cdiag_refclk_ovrd_4 = cdns_phy->cmn_cdiag_refclk_ovrd_4;
1718 
1719     derived_refclk->hw.init = init;
1720 
1721     hw = &derived_refclk->hw;
1722     ret = devm_clk_hw_register(dev, hw);
1723     if (ret)
1724         return ret;
1725 
1726     cdns_phy->clk_hw_data->hws[CDNS_TORRENT_DERIVED_REFCLK] = hw;
1727 
1728     return 0;
1729 }
1730 
1731 static int cdns_torrent_received_refclk_enable(struct clk_hw *hw)
1732 {
1733     struct cdns_torrent_received_refclk *received_refclk = to_cdns_torrent_received_refclk(hw);
1734 
1735     regmap_field_write(received_refclk->phy_pipe_cmn_ctrl1_0, 1);
1736 
1737     return 0;
1738 }
1739 
1740 static void cdns_torrent_received_refclk_disable(struct clk_hw *hw)
1741 {
1742     struct cdns_torrent_received_refclk *received_refclk = to_cdns_torrent_received_refclk(hw);
1743 
1744     regmap_field_write(received_refclk->phy_pipe_cmn_ctrl1_0, 0);
1745 }
1746 
1747 static int cdns_torrent_received_refclk_is_enabled(struct clk_hw *hw)
1748 {
1749     struct cdns_torrent_received_refclk *received_refclk = to_cdns_torrent_received_refclk(hw);
1750     int val, cmn_val;
1751 
1752     regmap_field_read(received_refclk->phy_pipe_cmn_ctrl1_0, &val);
1753     regmap_field_read(received_refclk->cmn_cdiag_refclk_ovrd_4, &cmn_val);
1754 
1755     return val && !cmn_val;
1756 }
1757 
1758 static const struct clk_ops cdns_torrent_received_refclk_ops = {
1759     .enable = cdns_torrent_received_refclk_enable,
1760     .disable = cdns_torrent_received_refclk_disable,
1761     .is_enabled = cdns_torrent_received_refclk_is_enabled,
1762 };
1763 
1764 static int cdns_torrent_received_refclk_register(struct cdns_torrent_phy *cdns_phy)
1765 {
1766     struct cdns_torrent_received_refclk *received_refclk;
1767     struct device *dev = cdns_phy->dev;
1768     struct clk_init_data *init;
1769     const char *parent_name;
1770     char clk_name[100];
1771     struct clk_hw *hw;
1772     struct clk *clk;
1773     int ret;
1774 
1775     received_refclk = devm_kzalloc(dev, sizeof(*received_refclk), GFP_KERNEL);
1776     if (!received_refclk)
1777         return -ENOMEM;
1778 
1779     snprintf(clk_name, sizeof(clk_name), "%s_%s", dev_name(dev),
1780          clk_names[CDNS_TORRENT_RECEIVED_REFCLK]);
1781 
1782     clk = devm_clk_get_optional(dev, "phy_en_refclk");
1783     if (IS_ERR(clk)) {
1784         dev_err(dev, "No parent clock for received_refclk\n");
1785         return PTR_ERR(clk);
1786     }
1787 
1788     init = &received_refclk->clk_data;
1789 
1790     if (clk) {
1791         parent_name = __clk_get_name(clk);
1792         init->parent_names = &parent_name;
1793         init->num_parents = 1;
1794     }
1795     init->ops = &cdns_torrent_received_refclk_ops;
1796     init->flags = 0;
1797     init->name = clk_name;
1798 
1799     received_refclk->phy_pipe_cmn_ctrl1_0 = cdns_phy->phy_pipe_cmn_ctrl1_0;
1800     received_refclk->cmn_cdiag_refclk_ovrd_4 = cdns_phy->cmn_cdiag_refclk_ovrd_4;
1801 
1802     received_refclk->hw.init = init;
1803 
1804     hw = &received_refclk->hw;
1805     ret = devm_clk_hw_register(dev, hw);
1806     if (ret)
1807         return ret;
1808 
1809     cdns_phy->clk_hw_data->hws[CDNS_TORRENT_RECEIVED_REFCLK] = hw;
1810 
1811     return 0;
1812 }
1813 
1814 static int cdns_torrent_refclk_driver_enable(struct clk_hw *hw)
1815 {
1816     struct cdns_torrent_refclk_driver *refclk_driver = to_cdns_torrent_refclk_driver(hw);
1817 
1818     regmap_field_write(refclk_driver->cmn_fields[CMN_CDIAG_REFCLK_DRV0_CTRL_6], 0);
1819     regmap_field_write(refclk_driver->cmn_fields[CMN_CDIAG_REFCLK_DRV0_CTRL_5], 1);
1820     regmap_field_write(refclk_driver->cmn_fields[CMN_CDIAG_REFCLK_DRV0_CTRL_1], 0);
1821 
1822     return 0;
1823 }
1824 
1825 static void cdns_torrent_refclk_driver_disable(struct clk_hw *hw)
1826 {
1827     struct cdns_torrent_refclk_driver *refclk_driver = to_cdns_torrent_refclk_driver(hw);
1828 
1829     regmap_field_write(refclk_driver->cmn_fields[CMN_CDIAG_REFCLK_DRV0_CTRL_1], 1);
1830 }
1831 
1832 static int cdns_torrent_refclk_driver_is_enabled(struct clk_hw *hw)
1833 {
1834     struct cdns_torrent_refclk_driver *refclk_driver = to_cdns_torrent_refclk_driver(hw);
1835     int val;
1836 
1837     regmap_field_read(refclk_driver->cmn_fields[CMN_CDIAG_REFCLK_DRV0_CTRL_1], &val);
1838 
1839     return !val;
1840 }
1841 
1842 static u8 cdns_torrent_refclk_driver_get_parent(struct clk_hw *hw)
1843 {
1844     struct cdns_torrent_refclk_driver *refclk_driver = to_cdns_torrent_refclk_driver(hw);
1845     unsigned int val;
1846 
1847     regmap_field_read(refclk_driver->cmn_fields[CMN_CDIAG_REFCLK_DRV0_CTRL_4], &val);
1848     return clk_mux_val_to_index(hw, cdns_torrent_refclk_driver_mux_table, 0, val);
1849 }
1850 
1851 static int cdns_torrent_refclk_driver_set_parent(struct clk_hw *hw, u8 index)
1852 {
1853     struct cdns_torrent_refclk_driver *refclk_driver = to_cdns_torrent_refclk_driver(hw);
1854     unsigned int val;
1855 
1856     val = cdns_torrent_refclk_driver_mux_table[index];
1857     return regmap_field_write(refclk_driver->cmn_fields[CMN_CDIAG_REFCLK_DRV0_CTRL_4], val);
1858 }
1859 
1860 static const struct clk_ops cdns_torrent_refclk_driver_ops = {
1861     .enable = cdns_torrent_refclk_driver_enable,
1862     .disable = cdns_torrent_refclk_driver_disable,
1863     .is_enabled = cdns_torrent_refclk_driver_is_enabled,
1864     .set_parent = cdns_torrent_refclk_driver_set_parent,
1865     .get_parent = cdns_torrent_refclk_driver_get_parent,
1866 };
1867 
1868 static int cdns_torrent_refclk_driver_register(struct cdns_torrent_phy *cdns_phy)
1869 {
1870     struct cdns_torrent_refclk_driver *refclk_driver;
1871     struct device *dev = cdns_phy->dev;
1872     struct regmap_field *field;
1873     struct clk_init_data *init;
1874     const char **parent_names;
1875     unsigned int num_parents;
1876     struct regmap *regmap;
1877     char clk_name[100];
1878     struct clk_hw *hw;
1879     int i, ret;
1880 
1881     refclk_driver = devm_kzalloc(dev, sizeof(*refclk_driver), GFP_KERNEL);
1882     if (!refclk_driver)
1883         return -ENOMEM;
1884 
1885     num_parents = ARRAY_SIZE(refclk_driver_parent_index);
1886     parent_names = devm_kzalloc(dev, (sizeof(char *) * num_parents), GFP_KERNEL);
1887     if (!parent_names)
1888         return -ENOMEM;
1889 
1890     for (i = 0; i < num_parents; i++) {
1891         hw = cdns_phy->clk_hw_data->hws[refclk_driver_parent_index[i]];
1892         if (IS_ERR_OR_NULL(hw)) {
1893             dev_err(dev, "No parent clock for refclk driver clock\n");
1894             return IS_ERR(hw) ? PTR_ERR(hw) : -ENOENT;
1895         }
1896         parent_names[i] = clk_hw_get_name(hw);
1897     }
1898 
1899     snprintf(clk_name, sizeof(clk_name), "%s_%s", dev_name(dev),
1900          clk_names[CDNS_TORRENT_REFCLK_DRIVER]);
1901 
1902     init = &refclk_driver->clk_data;
1903 
1904     init->ops = &cdns_torrent_refclk_driver_ops;
1905     init->flags = CLK_SET_RATE_NO_REPARENT;
1906     init->parent_names = parent_names;
1907     init->num_parents = num_parents;
1908     init->name = clk_name;
1909 
1910     regmap = cdns_phy->regmap_common_cdb;
1911 
1912     for (i = 0; i < REFCLK_OUT_NUM_CMN_CONFIG; i++) {
1913         field = devm_regmap_field_alloc(dev, regmap, refclk_out_cmn_cfg[i]);
1914         if (IS_ERR(field)) {
1915             dev_err(dev, "Refclk driver CMN reg field init failed\n");
1916             return PTR_ERR(field);
1917         }
1918         refclk_driver->cmn_fields[i] = field;
1919     }
1920 
1921     /* Enable Derived reference clock as default */
1922     regmap_field_write(refclk_driver->cmn_fields[CMN_CDIAG_REFCLK_DRV0_CTRL_4], 1);
1923 
1924     refclk_driver->hw.init = init;
1925 
1926     hw = &refclk_driver->hw;
1927     ret = devm_clk_hw_register(dev, hw);
1928     if (ret)
1929         return ret;
1930 
1931     cdns_phy->clk_hw_data->hws[CDNS_TORRENT_REFCLK_DRIVER] = hw;
1932 
1933     return 0;
1934 }
1935 
1936 static struct regmap *cdns_regmap_init(struct device *dev, void __iomem *base,
1937                        u32 block_offset,
1938                        u8 reg_offset_shift,
1939                        const struct regmap_config *config)
1940 {
1941     struct cdns_regmap_cdb_context *ctx;
1942 
1943     ctx = devm_kzalloc(dev, sizeof(*ctx), GFP_KERNEL);
1944     if (!ctx)
1945         return ERR_PTR(-ENOMEM);
1946 
1947     ctx->dev = dev;
1948     ctx->base = base + block_offset;
1949     ctx->reg_offset_shift = reg_offset_shift;
1950 
1951     return devm_regmap_init(dev, NULL, ctx, config);
1952 }
1953 
1954 static int cdns_torrent_dp_regfield_init(struct cdns_torrent_phy *cdns_phy)
1955 {
1956     struct device *dev = cdns_phy->dev;
1957     struct regmap_field *field;
1958     struct regmap *regmap;
1959 
1960     regmap = cdns_phy->regmap_dptx_phy_reg;
1961     field = devm_regmap_field_alloc(dev, regmap, phy_reset_ctrl);
1962     if (IS_ERR(field)) {
1963         dev_err(dev, "PHY_RESET reg field init failed\n");
1964         return PTR_ERR(field);
1965     }
1966     cdns_phy->phy_reset_ctrl = field;
1967 
1968     return 0;
1969 }
1970 
1971 static int cdns_torrent_regfield_init(struct cdns_torrent_phy *cdns_phy)
1972 {
1973     struct device *dev = cdns_phy->dev;
1974     struct regmap_field *field;
1975     struct regmap *regmap;
1976     int i;
1977 
1978     regmap = cdns_phy->regmap_phy_pcs_common_cdb;
1979     field = devm_regmap_field_alloc(dev, regmap, phy_pll_cfg);
1980     if (IS_ERR(field)) {
1981         dev_err(dev, "PHY_PLL_CFG reg field init failed\n");
1982         return PTR_ERR(field);
1983     }
1984     cdns_phy->phy_pll_cfg = field;
1985 
1986     regmap = cdns_phy->regmap_phy_pcs_common_cdb;
1987     field = devm_regmap_field_alloc(dev, regmap, phy_pipe_cmn_ctrl1_0);
1988     if (IS_ERR(field)) {
1989         dev_err(dev, "phy_pipe_cmn_ctrl1_0 reg field init failed\n");
1990         return PTR_ERR(field);
1991     }
1992     cdns_phy->phy_pipe_cmn_ctrl1_0 = field;
1993 
1994     regmap = cdns_phy->regmap_common_cdb;
1995     field = devm_regmap_field_alloc(dev, regmap, cmn_cdiag_refclk_ovrd_4);
1996     if (IS_ERR(field)) {
1997         dev_err(dev, "cmn_cdiag_refclk_ovrd_4 reg field init failed\n");
1998         return PTR_ERR(field);
1999     }
2000     cdns_phy->cmn_cdiag_refclk_ovrd_4 = field;
2001 
2002     regmap = cdns_phy->regmap_phy_pma_common_cdb;
2003     field = devm_regmap_field_alloc(dev, regmap, phy_pma_cmn_ctrl_1);
2004     if (IS_ERR(field)) {
2005         dev_err(dev, "PHY_PMA_CMN_CTRL1 reg field init failed\n");
2006         return PTR_ERR(field);
2007     }
2008     cdns_phy->phy_pma_cmn_ctrl_1 = field;
2009 
2010     regmap = cdns_phy->regmap_phy_pma_common_cdb;
2011     field = devm_regmap_field_alloc(dev, regmap, phy_pma_cmn_ctrl_2);
2012     if (IS_ERR(field)) {
2013         dev_err(dev, "PHY_PMA_CMN_CTRL2 reg field init failed\n");
2014         return PTR_ERR(field);
2015     }
2016     cdns_phy->phy_pma_cmn_ctrl_2 = field;
2017 
2018     regmap = cdns_phy->regmap_phy_pma_common_cdb;
2019     field = devm_regmap_field_alloc(dev, regmap, phy_pma_pll_raw_ctrl);
2020     if (IS_ERR(field)) {
2021         dev_err(dev, "PHY_PMA_PLL_RAW_CTRL reg field init failed\n");
2022         return PTR_ERR(field);
2023     }
2024     cdns_phy->phy_pma_pll_raw_ctrl = field;
2025 
2026     for (i = 0; i < MAX_NUM_LANES; i++) {
2027         regmap = cdns_phy->regmap_phy_pcs_lane_cdb[i];
2028         field = devm_regmap_field_alloc(dev, regmap, phy_pcs_iso_link_ctrl_1);
2029         if (IS_ERR(field)) {
2030             dev_err(dev, "PHY_PCS_ISO_LINK_CTRL reg field init for ln %d failed\n", i);
2031             return PTR_ERR(field);
2032         }
2033         cdns_phy->phy_pcs_iso_link_ctrl_1[i] = field;
2034     }
2035 
2036     return 0;
2037 }
2038 
2039 static int cdns_torrent_dp_regmap_init(struct cdns_torrent_phy *cdns_phy)
2040 {
2041     void __iomem *base = cdns_phy->base;
2042     struct device *dev = cdns_phy->dev;
2043     struct regmap *regmap;
2044     u8 reg_offset_shift;
2045     u32 block_offset;
2046 
2047     reg_offset_shift = cdns_phy->init_data->reg_offset_shift;
2048 
2049     block_offset = TORRENT_DPTX_PHY_OFFSET;
2050     regmap = cdns_regmap_init(dev, base, block_offset,
2051                   reg_offset_shift,
2052                   &cdns_torrent_dptx_phy_config);
2053     if (IS_ERR(regmap)) {
2054         dev_err(dev, "Failed to init DPTX PHY regmap\n");
2055         return PTR_ERR(regmap);
2056     }
2057     cdns_phy->regmap_dptx_phy_reg = regmap;
2058 
2059     return 0;
2060 }
2061 
2062 static int cdns_torrent_regmap_init(struct cdns_torrent_phy *cdns_phy)
2063 {
2064     void __iomem *sd_base = cdns_phy->sd_base;
2065     u8 block_offset_shift, reg_offset_shift;
2066     struct device *dev = cdns_phy->dev;
2067     struct regmap *regmap;
2068     u32 block_offset;
2069     int i;
2070 
2071     block_offset_shift = cdns_phy->init_data->block_offset_shift;
2072     reg_offset_shift = cdns_phy->init_data->reg_offset_shift;
2073 
2074     for (i = 0; i < MAX_NUM_LANES; i++) {
2075         block_offset = TORRENT_TX_LANE_CDB_OFFSET(i, block_offset_shift,
2076                               reg_offset_shift);
2077         regmap = cdns_regmap_init(dev, sd_base, block_offset,
2078                       reg_offset_shift,
2079                       &cdns_torrent_tx_lane_cdb_config[i]);
2080         if (IS_ERR(regmap)) {
2081             dev_err(dev, "Failed to init tx lane CDB regmap\n");
2082             return PTR_ERR(regmap);
2083         }
2084         cdns_phy->regmap_tx_lane_cdb[i] = regmap;
2085 
2086         block_offset = TORRENT_RX_LANE_CDB_OFFSET(i, block_offset_shift,
2087                               reg_offset_shift);
2088         regmap = cdns_regmap_init(dev, sd_base, block_offset,
2089                       reg_offset_shift,
2090                       &cdns_torrent_rx_lane_cdb_config[i]);
2091         if (IS_ERR(regmap)) {
2092             dev_err(dev, "Failed to init rx lane CDB regmap\n");
2093             return PTR_ERR(regmap);
2094         }
2095         cdns_phy->regmap_rx_lane_cdb[i] = regmap;
2096 
2097         block_offset = TORRENT_PHY_PCS_LANE_CDB_OFFSET(i, block_offset_shift,
2098                                    reg_offset_shift);
2099         regmap = cdns_regmap_init(dev, sd_base, block_offset,
2100                       reg_offset_shift,
2101                       &cdns_torrent_phy_pcs_lane_cdb_config[i]);
2102         if (IS_ERR(regmap)) {
2103             dev_err(dev, "Failed to init PHY PCS lane CDB regmap\n");
2104             return PTR_ERR(regmap);
2105         }
2106         cdns_phy->regmap_phy_pcs_lane_cdb[i] = regmap;
2107     }
2108 
2109     block_offset = TORRENT_COMMON_CDB_OFFSET;
2110     regmap = cdns_regmap_init(dev, sd_base, block_offset,
2111                   reg_offset_shift,
2112                   &cdns_torrent_common_cdb_config);
2113     if (IS_ERR(regmap)) {
2114         dev_err(dev, "Failed to init common CDB regmap\n");
2115         return PTR_ERR(regmap);
2116     }
2117     cdns_phy->regmap_common_cdb = regmap;
2118 
2119     block_offset = TORRENT_PHY_PCS_COMMON_OFFSET(block_offset_shift);
2120     regmap = cdns_regmap_init(dev, sd_base, block_offset,
2121                   reg_offset_shift,
2122                   &cdns_torrent_phy_pcs_cmn_cdb_config);
2123     if (IS_ERR(regmap)) {
2124         dev_err(dev, "Failed to init PHY PCS common CDB regmap\n");
2125         return PTR_ERR(regmap);
2126     }
2127     cdns_phy->regmap_phy_pcs_common_cdb = regmap;
2128 
2129     block_offset = TORRENT_PHY_PMA_COMMON_OFFSET(block_offset_shift);
2130     regmap = cdns_regmap_init(dev, sd_base, block_offset,
2131                   reg_offset_shift,
2132                   &cdns_torrent_phy_pma_cmn_cdb_config);
2133     if (IS_ERR(regmap)) {
2134         dev_err(dev, "Failed to init PHY PMA common CDB regmap\n");
2135         return PTR_ERR(regmap);
2136     }
2137     cdns_phy->regmap_phy_pma_common_cdb = regmap;
2138 
2139     return 0;
2140 }
2141 
2142 static int cdns_torrent_phy_init(struct phy *phy)
2143 {
2144     struct cdns_torrent_phy *cdns_phy = dev_get_drvdata(phy->dev.parent);
2145     const struct cdns_torrent_data *init_data = cdns_phy->init_data;
2146     struct cdns_torrent_vals *cmn_vals, *tx_ln_vals, *rx_ln_vals;
2147     enum cdns_torrent_ref_clk ref_clk = cdns_phy->ref_clk_rate;
2148     struct cdns_torrent_vals *link_cmn_vals, *xcvr_diag_vals;
2149     struct cdns_torrent_inst *inst = phy_get_drvdata(phy);
2150     enum cdns_torrent_phy_type phy_type = inst->phy_type;
2151     enum cdns_torrent_ssc_mode ssc = inst->ssc_mode;
2152     struct cdns_torrent_vals *pcs_cmn_vals;
2153     struct cdns_reg_pairs *reg_pairs;
2154     struct regmap *regmap;
2155     u32 num_regs;
2156     int i, j;
2157 
2158     if (cdns_phy->nsubnodes > 1)
2159         return 0;
2160 
2161     /**
2162      * Spread spectrum generation is not required or supported
2163      * for SGMII/QSGMII
2164      */
2165     if (phy_type == TYPE_SGMII || phy_type == TYPE_QSGMII)
2166         ssc = NO_SSC;
2167 
2168     /* PHY configuration specific registers for single link */
2169     link_cmn_vals = init_data->link_cmn_vals[phy_type][TYPE_NONE][ssc];
2170     if (link_cmn_vals) {
2171         reg_pairs = link_cmn_vals->reg_pairs;
2172         num_regs = link_cmn_vals->num_regs;
2173         regmap = cdns_phy->regmap_common_cdb;
2174 
2175         /**
2176          * First array value in link_cmn_vals must be of
2177          * PHY_PLL_CFG register
2178          */
2179         regmap_field_write(cdns_phy->phy_pll_cfg, reg_pairs[0].val);
2180 
2181         for (i = 1; i < num_regs; i++)
2182             regmap_write(regmap, reg_pairs[i].off,
2183                      reg_pairs[i].val);
2184     }
2185 
2186     xcvr_diag_vals = init_data->xcvr_diag_vals[phy_type][TYPE_NONE][ssc];
2187     if (xcvr_diag_vals) {
2188         reg_pairs = xcvr_diag_vals->reg_pairs;
2189         num_regs = xcvr_diag_vals->num_regs;
2190         for (i = 0; i < inst->num_lanes; i++) {
2191             regmap = cdns_phy->regmap_tx_lane_cdb[i + inst->mlane];
2192             for (j = 0; j < num_regs; j++)
2193                 regmap_write(regmap, reg_pairs[j].off,
2194                          reg_pairs[j].val);
2195         }
2196     }
2197 
2198     /* PHY PCS common registers configurations */
2199     pcs_cmn_vals = init_data->pcs_cmn_vals[phy_type][TYPE_NONE][ssc];
2200     if (pcs_cmn_vals) {
2201         reg_pairs = pcs_cmn_vals->reg_pairs;
2202         num_regs = pcs_cmn_vals->num_regs;
2203         regmap = cdns_phy->regmap_phy_pcs_common_cdb;
2204         for (i = 0; i < num_regs; i++)
2205             regmap_write(regmap, reg_pairs[i].off,
2206                      reg_pairs[i].val);
2207     }
2208 
2209     /* PMA common registers configurations */
2210     cmn_vals = init_data->cmn_vals[ref_clk][phy_type][TYPE_NONE][ssc];
2211     if (cmn_vals) {
2212         reg_pairs = cmn_vals->reg_pairs;
2213         num_regs = cmn_vals->num_regs;
2214         regmap = cdns_phy->regmap_common_cdb;
2215         for (i = 0; i < num_regs; i++)
2216             regmap_write(regmap, reg_pairs[i].off,
2217                      reg_pairs[i].val);
2218     }
2219 
2220     /* PMA TX lane registers configurations */
2221     tx_ln_vals = init_data->tx_ln_vals[ref_clk][phy_type][TYPE_NONE][ssc];
2222     if (tx_ln_vals) {
2223         reg_pairs = tx_ln_vals->reg_pairs;
2224         num_regs = tx_ln_vals->num_regs;
2225         for (i = 0; i < inst->num_lanes; i++) {
2226             regmap = cdns_phy->regmap_tx_lane_cdb[i + inst->mlane];
2227             for (j = 0; j < num_regs; j++)
2228                 regmap_write(regmap, reg_pairs[j].off,
2229                          reg_pairs[j].val);
2230         }
2231     }
2232 
2233     /* PMA RX lane registers configurations */
2234     rx_ln_vals = init_data->rx_ln_vals[ref_clk][phy_type][TYPE_NONE][ssc];
2235     if (rx_ln_vals) {
2236         reg_pairs = rx_ln_vals->reg_pairs;
2237         num_regs = rx_ln_vals->num_regs;
2238         for (i = 0; i < inst->num_lanes; i++) {
2239             regmap = cdns_phy->regmap_rx_lane_cdb[i + inst->mlane];
2240             for (j = 0; j < num_regs; j++)
2241                 regmap_write(regmap, reg_pairs[j].off,
2242                          reg_pairs[j].val);
2243         }
2244     }
2245 
2246     if (phy_type == TYPE_DP)
2247         return cdns_torrent_dp_init(phy);
2248 
2249     return 0;
2250 }
2251 
2252 static const struct phy_ops cdns_torrent_phy_ops = {
2253     .init       = cdns_torrent_phy_init,
2254     .configure  = cdns_torrent_dp_configure,
2255     .power_on   = cdns_torrent_phy_on,
2256     .power_off  = cdns_torrent_phy_off,
2257     .owner      = THIS_MODULE,
2258 };
2259 
2260 static int cdns_torrent_noop_phy_on(struct phy *phy)
2261 {
2262     /* Give 5ms to 10ms delay for the PIPE clock to be stable */
2263     usleep_range(5000, 10000);
2264 
2265     return 0;
2266 }
2267 
2268 static const struct phy_ops noop_ops = {
2269     .power_on   = cdns_torrent_noop_phy_on,
2270     .owner      = THIS_MODULE,
2271 };
2272 
2273 static
2274 int cdns_torrent_phy_configure_multilink(struct cdns_torrent_phy *cdns_phy)
2275 {
2276     const struct cdns_torrent_data *init_data = cdns_phy->init_data;
2277     struct cdns_torrent_vals *cmn_vals, *tx_ln_vals, *rx_ln_vals;
2278     enum cdns_torrent_ref_clk ref_clk = cdns_phy->ref_clk_rate;
2279     struct cdns_torrent_vals *link_cmn_vals, *xcvr_diag_vals;
2280     enum cdns_torrent_phy_type phy_t1, phy_t2;
2281     struct cdns_torrent_vals *pcs_cmn_vals;
2282     int i, j, node, mlane, num_lanes, ret;
2283     struct cdns_reg_pairs *reg_pairs;
2284     enum cdns_torrent_ssc_mode ssc;
2285     struct regmap *regmap;
2286     u32 num_regs;
2287 
2288     /* Maximum 2 links (subnodes) are supported */
2289     if (cdns_phy->nsubnodes != 2)
2290         return -EINVAL;
2291 
2292     phy_t1 = cdns_phy->phys[0].phy_type;
2293     phy_t2 = cdns_phy->phys[1].phy_type;
2294 
2295     /**
2296      * First configure the PHY for first link with phy_t1. Get the array
2297      * values as [phy_t1][phy_t2][ssc].
2298      */
2299     for (node = 0; node < cdns_phy->nsubnodes; node++) {
2300         if (node == 1) {
2301             /**
2302              * If first link with phy_t1 is configured, then
2303              * configure the PHY for second link with phy_t2.
2304              * Get the array values as [phy_t2][phy_t1][ssc].
2305              */
2306             swap(phy_t1, phy_t2);
2307         }
2308 
2309         mlane = cdns_phy->phys[node].mlane;
2310         ssc = cdns_phy->phys[node].ssc_mode;
2311         num_lanes = cdns_phy->phys[node].num_lanes;
2312 
2313         /**
2314          * PHY configuration specific registers:
2315          * link_cmn_vals depend on combination of PHY types being
2316          * configured and are common for both PHY types, so array
2317          * values should be same for [phy_t1][phy_t2][ssc] and
2318          * [phy_t2][phy_t1][ssc].
2319          * xcvr_diag_vals also depend on combination of PHY types
2320          * being configured, but these can be different for particular
2321          * PHY type and are per lane.
2322          */
2323         link_cmn_vals = init_data->link_cmn_vals[phy_t1][phy_t2][ssc];
2324         if (link_cmn_vals) {
2325             reg_pairs = link_cmn_vals->reg_pairs;
2326             num_regs = link_cmn_vals->num_regs;
2327             regmap = cdns_phy->regmap_common_cdb;
2328 
2329             /**
2330              * First array value in link_cmn_vals must be of
2331              * PHY_PLL_CFG register
2332              */
2333             regmap_field_write(cdns_phy->phy_pll_cfg,
2334                        reg_pairs[0].val);
2335 
2336             for (i = 1; i < num_regs; i++)
2337                 regmap_write(regmap, reg_pairs[i].off,
2338                          reg_pairs[i].val);
2339         }
2340 
2341         xcvr_diag_vals = init_data->xcvr_diag_vals[phy_t1][phy_t2][ssc];
2342         if (xcvr_diag_vals) {
2343             reg_pairs = xcvr_diag_vals->reg_pairs;
2344             num_regs = xcvr_diag_vals->num_regs;
2345             for (i = 0; i < num_lanes; i++) {
2346                 regmap = cdns_phy->regmap_tx_lane_cdb[i + mlane];
2347                 for (j = 0; j < num_regs; j++)
2348                     regmap_write(regmap, reg_pairs[j].off,
2349                              reg_pairs[j].val);
2350             }
2351         }
2352 
2353         /* PHY PCS common registers configurations */
2354         pcs_cmn_vals = init_data->pcs_cmn_vals[phy_t1][phy_t2][ssc];
2355         if (pcs_cmn_vals) {
2356             reg_pairs = pcs_cmn_vals->reg_pairs;
2357             num_regs = pcs_cmn_vals->num_regs;
2358             regmap = cdns_phy->regmap_phy_pcs_common_cdb;
2359             for (i = 0; i < num_regs; i++)
2360                 regmap_write(regmap, reg_pairs[i].off,
2361                          reg_pairs[i].val);
2362         }
2363 
2364         /* PMA common registers configurations */
2365         cmn_vals = init_data->cmn_vals[ref_clk][phy_t1][phy_t2][ssc];
2366         if (cmn_vals) {
2367             reg_pairs = cmn_vals->reg_pairs;
2368             num_regs = cmn_vals->num_regs;
2369             regmap = cdns_phy->regmap_common_cdb;
2370             for (i = 0; i < num_regs; i++)
2371                 regmap_write(regmap, reg_pairs[i].off,
2372                          reg_pairs[i].val);
2373         }
2374 
2375         /* PMA TX lane registers configurations */
2376         tx_ln_vals = init_data->tx_ln_vals[ref_clk][phy_t1][phy_t2][ssc];
2377         if (tx_ln_vals) {
2378             reg_pairs = tx_ln_vals->reg_pairs;
2379             num_regs = tx_ln_vals->num_regs;
2380             for (i = 0; i < num_lanes; i++) {
2381                 regmap = cdns_phy->regmap_tx_lane_cdb[i + mlane];
2382                 for (j = 0; j < num_regs; j++)
2383                     regmap_write(regmap, reg_pairs[j].off,
2384                              reg_pairs[j].val);
2385             }
2386         }
2387 
2388         /* PMA RX lane registers configurations */
2389         rx_ln_vals = init_data->rx_ln_vals[ref_clk][phy_t1][phy_t2][ssc];
2390         if (rx_ln_vals) {
2391             reg_pairs = rx_ln_vals->reg_pairs;
2392             num_regs = rx_ln_vals->num_regs;
2393             for (i = 0; i < num_lanes; i++) {
2394                 regmap = cdns_phy->regmap_rx_lane_cdb[i + mlane];
2395                 for (j = 0; j < num_regs; j++)
2396                     regmap_write(regmap, reg_pairs[j].off,
2397                              reg_pairs[j].val);
2398             }
2399         }
2400 
2401         reset_control_deassert(cdns_phy->phys[node].lnk_rst);
2402     }
2403 
2404     /* Take the PHY out of reset */
2405     ret = reset_control_deassert(cdns_phy->phy_rst);
2406     if (ret)
2407         return ret;
2408 
2409     return 0;
2410 }
2411 
2412 static void cdns_torrent_clk_cleanup(struct cdns_torrent_phy *cdns_phy)
2413 {
2414     struct device *dev = cdns_phy->dev;
2415 
2416     of_clk_del_provider(dev->of_node);
2417 }
2418 
2419 static int cdns_torrent_clk_register(struct cdns_torrent_phy *cdns_phy)
2420 {
2421     struct device *dev = cdns_phy->dev;
2422     struct device_node *node = dev->of_node;
2423     struct clk_hw_onecell_data *data;
2424     int ret;
2425 
2426     data = devm_kzalloc(dev, struct_size(data, hws, CDNS_TORRENT_OUTPUT_CLOCKS), GFP_KERNEL);
2427     if (!data)
2428         return -ENOMEM;
2429 
2430     data->num = CDNS_TORRENT_OUTPUT_CLOCKS;
2431     cdns_phy->clk_hw_data = data;
2432 
2433     ret = cdns_torrent_derived_refclk_register(cdns_phy);
2434     if (ret) {
2435         dev_err(dev, "failed to register derived refclk\n");
2436         return ret;
2437     }
2438 
2439     ret = cdns_torrent_received_refclk_register(cdns_phy);
2440     if (ret) {
2441         dev_err(dev, "failed to register received refclk\n");
2442         return ret;
2443     }
2444 
2445     ret = cdns_torrent_refclk_driver_register(cdns_phy);
2446     if (ret) {
2447         dev_err(dev, "failed to register refclk driver\n");
2448         return ret;
2449     }
2450 
2451     ret = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, data);
2452     if (ret) {
2453         dev_err(dev, "Failed to add clock provider: %s\n", node->name);
2454         return ret;
2455     }
2456 
2457     return 0;
2458 }
2459 
2460 static int cdns_torrent_reset(struct cdns_torrent_phy *cdns_phy)
2461 {
2462     struct device *dev = cdns_phy->dev;
2463 
2464     cdns_phy->phy_rst = devm_reset_control_get_exclusive_by_index(dev, 0);
2465     if (IS_ERR(cdns_phy->phy_rst)) {
2466         dev_err(dev, "%s: failed to get reset\n",
2467             dev->of_node->full_name);
2468         return PTR_ERR(cdns_phy->phy_rst);
2469     }
2470 
2471     cdns_phy->apb_rst = devm_reset_control_get_optional_exclusive(dev, "torrent_apb");
2472     if (IS_ERR(cdns_phy->apb_rst)) {
2473         dev_err(dev, "%s: failed to get apb reset\n",
2474             dev->of_node->full_name);
2475         return PTR_ERR(cdns_phy->apb_rst);
2476     }
2477 
2478     return 0;
2479 }
2480 
2481 static int cdns_torrent_clk(struct cdns_torrent_phy *cdns_phy)
2482 {
2483     struct device *dev = cdns_phy->dev;
2484     unsigned long ref_clk_rate;
2485     int ret;
2486 
2487     cdns_phy->clk = devm_clk_get(dev, "refclk");
2488     if (IS_ERR(cdns_phy->clk)) {
2489         dev_err(dev, "phy ref clock not found\n");
2490         return PTR_ERR(cdns_phy->clk);
2491     }
2492 
2493     ret = clk_prepare_enable(cdns_phy->clk);
2494     if (ret) {
2495         dev_err(cdns_phy->dev, "Failed to prepare ref clock\n");
2496         return ret;
2497     }
2498 
2499     ref_clk_rate = clk_get_rate(cdns_phy->clk);
2500     if (!ref_clk_rate) {
2501         dev_err(cdns_phy->dev, "Failed to get ref clock rate\n");
2502         clk_disable_unprepare(cdns_phy->clk);
2503         return -EINVAL;
2504     }
2505 
2506     switch (ref_clk_rate) {
2507     case REF_CLK_19_2MHZ:
2508         cdns_phy->ref_clk_rate = CLK_19_2_MHZ;
2509         break;
2510     case REF_CLK_25MHZ:
2511         cdns_phy->ref_clk_rate = CLK_25_MHZ;
2512         break;
2513     case REF_CLK_100MHZ:
2514         cdns_phy->ref_clk_rate = CLK_100_MHZ;
2515         break;
2516     default:
2517         dev_err(cdns_phy->dev, "Invalid Ref Clock Rate\n");
2518         clk_disable_unprepare(cdns_phy->clk);
2519         return -EINVAL;
2520     }
2521 
2522     return 0;
2523 }
2524 
2525 static int cdns_torrent_phy_probe(struct platform_device *pdev)
2526 {
2527     struct cdns_torrent_phy *cdns_phy;
2528     struct device *dev = &pdev->dev;
2529     struct phy_provider *phy_provider;
2530     const struct cdns_torrent_data *data;
2531     struct device_node *child;
2532     int ret, subnodes, node = 0, i;
2533     u32 total_num_lanes = 0;
2534     int already_configured;
2535     u8 init_dp_regmap = 0;
2536     u32 phy_type;
2537 
2538     /* Get init data for this PHY */
2539     data = of_device_get_match_data(dev);
2540     if (!data)
2541         return -EINVAL;
2542 
2543     cdns_phy = devm_kzalloc(dev, sizeof(*cdns_phy), GFP_KERNEL);
2544     if (!cdns_phy)
2545         return -ENOMEM;
2546 
2547     dev_set_drvdata(dev, cdns_phy);
2548     cdns_phy->dev = dev;
2549     cdns_phy->init_data = data;
2550 
2551     cdns_phy->sd_base = devm_platform_ioremap_resource(pdev, 0);
2552     if (IS_ERR(cdns_phy->sd_base))
2553         return PTR_ERR(cdns_phy->sd_base);
2554 
2555     subnodes = of_get_available_child_count(dev->of_node);
2556     if (subnodes == 0) {
2557         dev_err(dev, "No available link subnodes found\n");
2558         return -EINVAL;
2559     }
2560 
2561     ret = cdns_torrent_regmap_init(cdns_phy);
2562     if (ret)
2563         return ret;
2564 
2565     ret = cdns_torrent_regfield_init(cdns_phy);
2566     if (ret)
2567         return ret;
2568 
2569     ret = cdns_torrent_clk_register(cdns_phy);
2570     if (ret)
2571         return ret;
2572 
2573     regmap_field_read(cdns_phy->phy_pma_cmn_ctrl_1, &already_configured);
2574 
2575     if (!already_configured) {
2576         ret = cdns_torrent_reset(cdns_phy);
2577         if (ret)
2578             goto clk_cleanup;
2579 
2580         ret = cdns_torrent_clk(cdns_phy);
2581         if (ret)
2582             goto clk_cleanup;
2583 
2584         /* Enable APB */
2585         reset_control_deassert(cdns_phy->apb_rst);
2586     }
2587 
2588     for_each_available_child_of_node(dev->of_node, child) {
2589         struct phy *gphy;
2590 
2591         /* PHY subnode name must be 'phy'. */
2592         if (!(of_node_name_eq(child, "phy")))
2593             continue;
2594 
2595         cdns_phy->phys[node].lnk_rst =
2596                 of_reset_control_array_get_exclusive(child);
2597         if (IS_ERR(cdns_phy->phys[node].lnk_rst)) {
2598             dev_err(dev, "%s: failed to get reset\n",
2599                 child->full_name);
2600             ret = PTR_ERR(cdns_phy->phys[node].lnk_rst);
2601             goto put_lnk_rst;
2602         }
2603 
2604         if (of_property_read_u32(child, "reg",
2605                      &cdns_phy->phys[node].mlane)) {
2606             dev_err(dev, "%s: No \"reg\"-property.\n",
2607                 child->full_name);
2608             ret = -EINVAL;
2609             goto put_child;
2610         }
2611 
2612         if (of_property_read_u32(child, "cdns,phy-type", &phy_type)) {
2613             dev_err(dev, "%s: No \"cdns,phy-type\"-property.\n",
2614                 child->full_name);
2615             ret = -EINVAL;
2616             goto put_child;
2617         }
2618 
2619         switch (phy_type) {
2620         case PHY_TYPE_PCIE:
2621             cdns_phy->phys[node].phy_type = TYPE_PCIE;
2622             break;
2623         case PHY_TYPE_DP:
2624             cdns_phy->phys[node].phy_type = TYPE_DP;
2625             break;
2626         case PHY_TYPE_SGMII:
2627             cdns_phy->phys[node].phy_type = TYPE_SGMII;
2628             break;
2629         case PHY_TYPE_QSGMII:
2630             cdns_phy->phys[node].phy_type = TYPE_QSGMII;
2631             break;
2632         case PHY_TYPE_USB3:
2633             cdns_phy->phys[node].phy_type = TYPE_USB;
2634             break;
2635         default:
2636             dev_err(dev, "Unsupported protocol\n");
2637             ret = -EINVAL;
2638             goto put_child;
2639         }
2640 
2641         if (of_property_read_u32(child, "cdns,num-lanes",
2642                      &cdns_phy->phys[node].num_lanes)) {
2643             dev_err(dev, "%s: No \"cdns,num-lanes\"-property.\n",
2644                 child->full_name);
2645             ret = -EINVAL;
2646             goto put_child;
2647         }
2648 
2649         total_num_lanes += cdns_phy->phys[node].num_lanes;
2650 
2651         /* Get SSC mode */
2652         cdns_phy->phys[node].ssc_mode = NO_SSC;
2653         of_property_read_u32(child, "cdns,ssc-mode",
2654                      &cdns_phy->phys[node].ssc_mode);
2655 
2656         if (!already_configured)
2657             gphy = devm_phy_create(dev, child, &cdns_torrent_phy_ops);
2658         else
2659             gphy = devm_phy_create(dev, child, &noop_ops);
2660         if (IS_ERR(gphy)) {
2661             ret = PTR_ERR(gphy);
2662             goto put_child;
2663         }
2664 
2665         if (cdns_phy->phys[node].phy_type == TYPE_DP) {
2666             switch (cdns_phy->phys[node].num_lanes) {
2667             case 1:
2668             case 2:
2669             case 4:
2670             /* valid number of lanes */
2671                 break;
2672             default:
2673                 dev_err(dev, "unsupported number of lanes: %d\n",
2674                     cdns_phy->phys[node].num_lanes);
2675                 ret = -EINVAL;
2676                 goto put_child;
2677             }
2678 
2679             cdns_phy->max_bit_rate = DEFAULT_MAX_BIT_RATE;
2680             of_property_read_u32(child, "cdns,max-bit-rate",
2681                          &cdns_phy->max_bit_rate);
2682 
2683             switch (cdns_phy->max_bit_rate) {
2684             case 1620:
2685             case 2160:
2686             case 2430:
2687             case 2700:
2688             case 3240:
2689             case 4320:
2690             case 5400:
2691             case 8100:
2692             /* valid bit rate */
2693                 break;
2694             default:
2695                 dev_err(dev, "unsupported max bit rate: %dMbps\n",
2696                     cdns_phy->max_bit_rate);
2697                 ret = -EINVAL;
2698                 goto put_child;
2699             }
2700 
2701             /* DPTX registers */
2702             cdns_phy->base = devm_platform_ioremap_resource(pdev, 1);
2703             if (IS_ERR(cdns_phy->base)) {
2704                 ret = PTR_ERR(cdns_phy->base);
2705                 goto put_child;
2706             }
2707 
2708             if (!init_dp_regmap) {
2709                 ret = cdns_torrent_dp_regmap_init(cdns_phy);
2710                 if (ret)
2711                     goto put_child;
2712 
2713                 ret = cdns_torrent_dp_regfield_init(cdns_phy);
2714                 if (ret)
2715                     goto put_child;
2716 
2717                 init_dp_regmap++;
2718             }
2719 
2720             dev_dbg(dev, "DP max bit rate %d.%03d Gbps\n",
2721                 cdns_phy->max_bit_rate / 1000,
2722                 cdns_phy->max_bit_rate % 1000);
2723 
2724             gphy->attrs.bus_width = cdns_phy->phys[node].num_lanes;
2725             gphy->attrs.max_link_rate = cdns_phy->max_bit_rate;
2726             gphy->attrs.mode = PHY_MODE_DP;
2727         }
2728 
2729         cdns_phy->phys[node].phy = gphy;
2730         phy_set_drvdata(gphy, &cdns_phy->phys[node]);
2731 
2732         node++;
2733     }
2734     cdns_phy->nsubnodes = node;
2735 
2736     if (total_num_lanes > MAX_NUM_LANES) {
2737         dev_err(dev, "Invalid lane configuration\n");
2738         ret = -EINVAL;
2739         goto put_lnk_rst;
2740     }
2741 
2742     if (cdns_phy->nsubnodes > 1 && !already_configured) {
2743         ret = cdns_torrent_phy_configure_multilink(cdns_phy);
2744         if (ret)
2745             goto put_lnk_rst;
2746     }
2747 
2748     phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate);
2749     if (IS_ERR(phy_provider)) {
2750         ret = PTR_ERR(phy_provider);
2751         goto put_lnk_rst;
2752     }
2753 
2754     if (cdns_phy->nsubnodes > 1)
2755         dev_dbg(dev, "Multi-link: %s (%d lanes) & %s (%d lanes)",
2756             cdns_torrent_get_phy_type(cdns_phy->phys[0].phy_type),
2757             cdns_phy->phys[0].num_lanes,
2758             cdns_torrent_get_phy_type(cdns_phy->phys[1].phy_type),
2759             cdns_phy->phys[1].num_lanes);
2760     else
2761         dev_dbg(dev, "Single link: %s (%d lanes)",
2762             cdns_torrent_get_phy_type(cdns_phy->phys[0].phy_type),
2763             cdns_phy->phys[0].num_lanes);
2764 
2765     return 0;
2766 
2767 put_child:
2768     node++;
2769 put_lnk_rst:
2770     for (i = 0; i < node; i++)
2771         reset_control_put(cdns_phy->phys[i].lnk_rst);
2772     of_node_put(child);
2773     reset_control_assert(cdns_phy->apb_rst);
2774     clk_disable_unprepare(cdns_phy->clk);
2775 clk_cleanup:
2776     cdns_torrent_clk_cleanup(cdns_phy);
2777     return ret;
2778 }
2779 
2780 static int cdns_torrent_phy_remove(struct platform_device *pdev)
2781 {
2782     struct cdns_torrent_phy *cdns_phy = platform_get_drvdata(pdev);
2783     int i;
2784 
2785     reset_control_assert(cdns_phy->phy_rst);
2786     reset_control_assert(cdns_phy->apb_rst);
2787     for (i = 0; i < cdns_phy->nsubnodes; i++) {
2788         reset_control_assert(cdns_phy->phys[i].lnk_rst);
2789         reset_control_put(cdns_phy->phys[i].lnk_rst);
2790     }
2791 
2792     clk_disable_unprepare(cdns_phy->clk);
2793     cdns_torrent_clk_cleanup(cdns_phy);
2794 
2795     return 0;
2796 }
2797 
2798 /* Single DisplayPort(DP) link configuration */
2799 static struct cdns_reg_pairs sl_dp_link_cmn_regs[] = {
2800     {0x0000, PHY_PLL_CFG},
2801 };
2802 
2803 static struct cdns_reg_pairs sl_dp_xcvr_diag_ln_regs[] = {
2804     {0x0000, XCVR_DIAG_HSCLK_SEL},
2805     {0x0001, XCVR_DIAG_PLLDRC_CTRL}
2806 };
2807 
2808 static struct cdns_torrent_vals sl_dp_link_cmn_vals = {
2809     .reg_pairs = sl_dp_link_cmn_regs,
2810     .num_regs = ARRAY_SIZE(sl_dp_link_cmn_regs),
2811 };
2812 
2813 static struct cdns_torrent_vals sl_dp_xcvr_diag_ln_vals = {
2814     .reg_pairs = sl_dp_xcvr_diag_ln_regs,
2815     .num_regs = ARRAY_SIZE(sl_dp_xcvr_diag_ln_regs),
2816 };
2817 
2818 /* Single DP, 19.2 MHz Ref clk, no SSC */
2819 static struct cdns_reg_pairs sl_dp_19_2_no_ssc_cmn_regs[] = {
2820     {0x0014, CMN_SSM_BIAS_TMR},
2821     {0x0027, CMN_PLLSM0_PLLPRE_TMR},
2822     {0x00A1, CMN_PLLSM0_PLLLOCK_TMR},
2823     {0x0027, CMN_PLLSM1_PLLPRE_TMR},
2824     {0x00A1, CMN_PLLSM1_PLLLOCK_TMR},
2825     {0x0060, CMN_BGCAL_INIT_TMR},
2826     {0x0060, CMN_BGCAL_ITER_TMR},
2827     {0x0014, CMN_IBCAL_INIT_TMR},
2828     {0x0018, CMN_TXPUCAL_INIT_TMR},
2829     {0x0005, CMN_TXPUCAL_ITER_TMR},
2830     {0x0018, CMN_TXPDCAL_INIT_TMR},
2831     {0x0005, CMN_TXPDCAL_ITER_TMR},
2832     {0x0240, CMN_RXCAL_INIT_TMR},
2833     {0x0005, CMN_RXCAL_ITER_TMR},
2834     {0x0002, CMN_SD_CAL_INIT_TMR},
2835     {0x0002, CMN_SD_CAL_ITER_TMR},
2836     {0x000B, CMN_SD_CAL_REFTIM_START},
2837     {0x0137, CMN_SD_CAL_PLLCNT_START},
2838     {0x0509, CMN_PDIAG_PLL0_CP_PADJ_M0},
2839     {0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M0},
2840     {0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M0},
2841     {0x0004, CMN_PLL0_DSM_DIAG_M0},
2842     {0x0509, CMN_PDIAG_PLL1_CP_PADJ_M0},
2843     {0x0F00, CMN_PDIAG_PLL1_CP_IADJ_M0},
2844     {0x0F08, CMN_PDIAG_PLL1_FILT_PADJ_M0},
2845     {0x0004, CMN_PLL1_DSM_DIAG_M0},
2846     {0x00C0, CMN_PLL0_VCOCAL_INIT_TMR},
2847     {0x0004, CMN_PLL0_VCOCAL_ITER_TMR},
2848     {0x00C0, CMN_PLL1_VCOCAL_INIT_TMR},
2849     {0x0004, CMN_PLL1_VCOCAL_ITER_TMR},
2850     {0x0260, CMN_PLL0_VCOCAL_REFTIM_START},
2851     {0x0003, CMN_PLL0_VCOCAL_TCTRL},
2852     {0x0260, CMN_PLL1_VCOCAL_REFTIM_START},
2853     {0x0003, CMN_PLL1_VCOCAL_TCTRL}
2854 };
2855 
2856 static struct cdns_reg_pairs sl_dp_19_2_no_ssc_tx_ln_regs[] = {
2857     {0x0780, TX_RCVDET_ST_TMR},
2858     {0x00FB, TX_PSC_A0},
2859     {0x04AA, TX_PSC_A2},
2860     {0x04AA, TX_PSC_A3},
2861     {0x000F, XCVR_DIAG_BIDI_CTRL}
2862 };
2863 
2864 static struct cdns_reg_pairs sl_dp_19_2_no_ssc_rx_ln_regs[] = {
2865     {0x0000, RX_PSC_A0},
2866     {0x0000, RX_PSC_A2},
2867     {0x0000, RX_PSC_A3},
2868     {0x0000, RX_PSC_CAL},
2869     {0x0000, RX_REE_GCSM1_CTRL},
2870     {0x0000, RX_REE_GCSM2_CTRL},
2871     {0x0000, RX_REE_PERGCSM_CTRL}
2872 };
2873 
2874 static struct cdns_torrent_vals sl_dp_19_2_no_ssc_cmn_vals = {
2875     .reg_pairs = sl_dp_19_2_no_ssc_cmn_regs,
2876     .num_regs = ARRAY_SIZE(sl_dp_19_2_no_ssc_cmn_regs),
2877 };
2878 
2879 static struct cdns_torrent_vals sl_dp_19_2_no_ssc_tx_ln_vals = {
2880     .reg_pairs = sl_dp_19_2_no_ssc_tx_ln_regs,
2881     .num_regs = ARRAY_SIZE(sl_dp_19_2_no_ssc_tx_ln_regs),
2882 };
2883 
2884 static struct cdns_torrent_vals sl_dp_19_2_no_ssc_rx_ln_vals = {
2885     .reg_pairs = sl_dp_19_2_no_ssc_rx_ln_regs,
2886     .num_regs = ARRAY_SIZE(sl_dp_19_2_no_ssc_rx_ln_regs),
2887 };
2888 
2889 /* Single DP, 25 MHz Ref clk, no SSC */
2890 static struct cdns_reg_pairs sl_dp_25_no_ssc_cmn_regs[] = {
2891     {0x0019, CMN_SSM_BIAS_TMR},
2892     {0x0032, CMN_PLLSM0_PLLPRE_TMR},
2893     {0x00D1, CMN_PLLSM0_PLLLOCK_TMR},
2894     {0x0032, CMN_PLLSM1_PLLPRE_TMR},
2895     {0x00D1, CMN_PLLSM1_PLLLOCK_TMR},
2896     {0x007D, CMN_BGCAL_INIT_TMR},
2897     {0x007D, CMN_BGCAL_ITER_TMR},
2898     {0x0019, CMN_IBCAL_INIT_TMR},
2899     {0x001E, CMN_TXPUCAL_INIT_TMR},
2900     {0x0006, CMN_TXPUCAL_ITER_TMR},
2901     {0x001E, CMN_TXPDCAL_INIT_TMR},
2902     {0x0006, CMN_TXPDCAL_ITER_TMR},
2903     {0x02EE, CMN_RXCAL_INIT_TMR},
2904     {0x0006, CMN_RXCAL_ITER_TMR},
2905     {0x0002, CMN_SD_CAL_INIT_TMR},
2906     {0x0002, CMN_SD_CAL_ITER_TMR},
2907     {0x000E, CMN_SD_CAL_REFTIM_START},
2908     {0x012B, CMN_SD_CAL_PLLCNT_START},
2909     {0x0509, CMN_PDIAG_PLL0_CP_PADJ_M0},
2910     {0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M0},
2911     {0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M0},
2912     {0x0004, CMN_PLL0_DSM_DIAG_M0},
2913     {0x0509, CMN_PDIAG_PLL1_CP_PADJ_M0},
2914     {0x0F00, CMN_PDIAG_PLL1_CP_IADJ_M0},
2915     {0x0F08, CMN_PDIAG_PLL1_FILT_PADJ_M0},
2916     {0x0004, CMN_PLL1_DSM_DIAG_M0},
2917     {0x00FA, CMN_PLL0_VCOCAL_INIT_TMR},
2918     {0x0004, CMN_PLL0_VCOCAL_ITER_TMR},
2919     {0x00FA, CMN_PLL1_VCOCAL_INIT_TMR},
2920     {0x0004, CMN_PLL1_VCOCAL_ITER_TMR},
2921     {0x0317, CMN_PLL0_VCOCAL_REFTIM_START},
2922     {0x0003, CMN_PLL0_VCOCAL_TCTRL},
2923     {0x0317, CMN_PLL1_VCOCAL_REFTIM_START},
2924     {0x0003, CMN_PLL1_VCOCAL_TCTRL}
2925 };
2926 
2927 static struct cdns_reg_pairs sl_dp_25_no_ssc_tx_ln_regs[] = {
2928     {0x09C4, TX_RCVDET_ST_TMR},
2929     {0x00FB, TX_PSC_A0},
2930     {0x04AA, TX_PSC_A2},
2931     {0x04AA, TX_PSC_A3},
2932     {0x000F, XCVR_DIAG_BIDI_CTRL}
2933 };
2934 
2935 static struct cdns_reg_pairs sl_dp_25_no_ssc_rx_ln_regs[] = {
2936     {0x0000, RX_PSC_A0},
2937     {0x0000, RX_PSC_A2},
2938     {0x0000, RX_PSC_A3},
2939     {0x0000, RX_PSC_CAL},
2940     {0x0000, RX_REE_GCSM1_CTRL},
2941     {0x0000, RX_REE_GCSM2_CTRL},
2942     {0x0000, RX_REE_PERGCSM_CTRL}
2943 };
2944 
2945 static struct cdns_torrent_vals sl_dp_25_no_ssc_cmn_vals = {
2946     .reg_pairs = sl_dp_25_no_ssc_cmn_regs,
2947     .num_regs = ARRAY_SIZE(sl_dp_25_no_ssc_cmn_regs),
2948 };
2949 
2950 static struct cdns_torrent_vals sl_dp_25_no_ssc_tx_ln_vals = {
2951     .reg_pairs = sl_dp_25_no_ssc_tx_ln_regs,
2952     .num_regs = ARRAY_SIZE(sl_dp_25_no_ssc_tx_ln_regs),
2953 };
2954 
2955 static struct cdns_torrent_vals sl_dp_25_no_ssc_rx_ln_vals = {
2956     .reg_pairs = sl_dp_25_no_ssc_rx_ln_regs,
2957     .num_regs = ARRAY_SIZE(sl_dp_25_no_ssc_rx_ln_regs),
2958 };
2959 
2960 /* Single DP, 100 MHz Ref clk, no SSC */
2961 static struct cdns_reg_pairs sl_dp_100_no_ssc_cmn_regs[] = {
2962     {0x0003, CMN_PLL0_VCOCAL_TCTRL},
2963     {0x0003, CMN_PLL1_VCOCAL_TCTRL}
2964 };
2965 
2966 static struct cdns_reg_pairs sl_dp_100_no_ssc_tx_ln_regs[] = {
2967     {0x00FB, TX_PSC_A0},
2968     {0x04AA, TX_PSC_A2},
2969     {0x04AA, TX_PSC_A3},
2970     {0x000F, XCVR_DIAG_BIDI_CTRL}
2971 };
2972 
2973 static struct cdns_reg_pairs sl_dp_100_no_ssc_rx_ln_regs[] = {
2974     {0x0000, RX_PSC_A0},
2975     {0x0000, RX_PSC_A2},
2976     {0x0000, RX_PSC_A3},
2977     {0x0000, RX_PSC_CAL},
2978     {0x0000, RX_REE_GCSM1_CTRL},
2979     {0x0000, RX_REE_GCSM2_CTRL},
2980     {0x0000, RX_REE_PERGCSM_CTRL}
2981 };
2982 
2983 static struct cdns_torrent_vals sl_dp_100_no_ssc_cmn_vals = {
2984     .reg_pairs = sl_dp_100_no_ssc_cmn_regs,
2985     .num_regs = ARRAY_SIZE(sl_dp_100_no_ssc_cmn_regs),
2986 };
2987 
2988 static struct cdns_torrent_vals sl_dp_100_no_ssc_tx_ln_vals = {
2989     .reg_pairs = sl_dp_100_no_ssc_tx_ln_regs,
2990     .num_regs = ARRAY_SIZE(sl_dp_100_no_ssc_tx_ln_regs),
2991 };
2992 
2993 static struct cdns_torrent_vals sl_dp_100_no_ssc_rx_ln_vals = {
2994     .reg_pairs = sl_dp_100_no_ssc_rx_ln_regs,
2995     .num_regs = ARRAY_SIZE(sl_dp_100_no_ssc_rx_ln_regs),
2996 };
2997 
2998 /* USB and SGMII/QSGMII link configuration */
2999 static struct cdns_reg_pairs usb_sgmii_link_cmn_regs[] = {
3000     {0x0002, PHY_PLL_CFG},
3001     {0x8600, CMN_PDIAG_PLL0_CLK_SEL_M0},
3002     {0x0601, CMN_PDIAG_PLL1_CLK_SEL_M0}
3003 };
3004 
3005 static struct cdns_reg_pairs usb_sgmii_xcvr_diag_ln_regs[] = {
3006     {0x0000, XCVR_DIAG_HSCLK_SEL},
3007     {0x0001, XCVR_DIAG_HSCLK_DIV},
3008     {0x0041, XCVR_DIAG_PLLDRC_CTRL}
3009 };
3010 
3011 static struct cdns_reg_pairs sgmii_usb_xcvr_diag_ln_regs[] = {
3012     {0x0011, XCVR_DIAG_HSCLK_SEL},
3013     {0x0003, XCVR_DIAG_HSCLK_DIV},
3014     {0x009B, XCVR_DIAG_PLLDRC_CTRL}
3015 };
3016 
3017 static struct cdns_torrent_vals usb_sgmii_link_cmn_vals = {
3018     .reg_pairs = usb_sgmii_link_cmn_regs,
3019     .num_regs = ARRAY_SIZE(usb_sgmii_link_cmn_regs),
3020 };
3021 
3022 static struct cdns_torrent_vals usb_sgmii_xcvr_diag_ln_vals = {
3023     .reg_pairs = usb_sgmii_xcvr_diag_ln_regs,
3024     .num_regs = ARRAY_SIZE(usb_sgmii_xcvr_diag_ln_regs),
3025 };
3026 
3027 static struct cdns_torrent_vals sgmii_usb_xcvr_diag_ln_vals = {
3028     .reg_pairs = sgmii_usb_xcvr_diag_ln_regs,
3029     .num_regs = ARRAY_SIZE(sgmii_usb_xcvr_diag_ln_regs),
3030 };
3031 
3032 /* PCIe and USB Unique SSC link configuration */
3033 static struct cdns_reg_pairs pcie_usb_link_cmn_regs[] = {
3034     {0x0003, PHY_PLL_CFG},
3035     {0x0601, CMN_PDIAG_PLL0_CLK_SEL_M0},
3036     {0x0400, CMN_PDIAG_PLL0_CLK_SEL_M1},
3037     {0x8600, CMN_PDIAG_PLL1_CLK_SEL_M0}
3038 };
3039 
3040 static struct cdns_reg_pairs pcie_usb_xcvr_diag_ln_regs[] = {
3041     {0x0000, XCVR_DIAG_HSCLK_SEL},
3042     {0x0001, XCVR_DIAG_HSCLK_DIV},
3043     {0x0012, XCVR_DIAG_PLLDRC_CTRL}
3044 };
3045 
3046 static struct cdns_reg_pairs usb_pcie_xcvr_diag_ln_regs[] = {
3047     {0x0011, XCVR_DIAG_HSCLK_SEL},
3048     {0x0001, XCVR_DIAG_HSCLK_DIV},
3049     {0x00C9, XCVR_DIAG_PLLDRC_CTRL}
3050 };
3051 
3052 static struct cdns_torrent_vals pcie_usb_link_cmn_vals = {
3053     .reg_pairs = pcie_usb_link_cmn_regs,
3054     .num_regs = ARRAY_SIZE(pcie_usb_link_cmn_regs),
3055 };
3056 
3057 static struct cdns_torrent_vals pcie_usb_xcvr_diag_ln_vals = {
3058     .reg_pairs = pcie_usb_xcvr_diag_ln_regs,
3059     .num_regs = ARRAY_SIZE(pcie_usb_xcvr_diag_ln_regs),
3060 };
3061 
3062 static struct cdns_torrent_vals usb_pcie_xcvr_diag_ln_vals = {
3063     .reg_pairs = usb_pcie_xcvr_diag_ln_regs,
3064     .num_regs = ARRAY_SIZE(usb_pcie_xcvr_diag_ln_regs),
3065 };
3066 
3067 /* USB 100 MHz Ref clk, internal SSC */
3068 static struct cdns_reg_pairs usb_100_int_ssc_cmn_regs[] = {
3069     {0x0004, CMN_PLL0_DSM_DIAG_M0},
3070     {0x0004, CMN_PLL0_DSM_DIAG_M1},
3071     {0x0004, CMN_PLL1_DSM_DIAG_M0},
3072     {0x0509, CMN_PDIAG_PLL0_CP_PADJ_M0},
3073     {0x0509, CMN_PDIAG_PLL0_CP_PADJ_M1},
3074     {0x0509, CMN_PDIAG_PLL1_CP_PADJ_M0},
3075     {0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M0},
3076     {0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M1},
3077     {0x0F00, CMN_PDIAG_PLL1_CP_IADJ_M0},
3078     {0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M0},
3079     {0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M1},
3080     {0x0F08, CMN_PDIAG_PLL1_FILT_PADJ_M0},
3081     {0x0064, CMN_PLL0_INTDIV_M0},
3082     {0x0050, CMN_PLL0_INTDIV_M1},
3083     {0x0064, CMN_PLL1_INTDIV_M0},
3084     {0x0002, CMN_PLL0_FRACDIVH_M0},
3085     {0x0002, CMN_PLL0_FRACDIVH_M1},
3086     {0x0002, CMN_PLL1_FRACDIVH_M0},
3087     {0x0044, CMN_PLL0_HIGH_THR_M0},
3088     {0x0036, CMN_PLL0_HIGH_THR_M1},
3089     {0x0044, CMN_PLL1_HIGH_THR_M0},
3090     {0x0002, CMN_PDIAG_PLL0_CTRL_M0},
3091     {0x0002, CMN_PDIAG_PLL0_CTRL_M1},
3092     {0x0002, CMN_PDIAG_PLL1_CTRL_M0},
3093     {0x0001, CMN_PLL0_SS_CTRL1_M0},
3094     {0x0001, CMN_PLL0_SS_CTRL1_M1},
3095     {0x0001, CMN_PLL1_SS_CTRL1_M0},
3096     {0x011B, CMN_PLL0_SS_CTRL2_M0},
3097     {0x011B, CMN_PLL0_SS_CTRL2_M1},
3098     {0x011B, CMN_PLL1_SS_CTRL2_M0},
3099     {0x006E, CMN_PLL0_SS_CTRL3_M0},
3100     {0x0058, CMN_PLL0_SS_CTRL3_M1},
3101     {0x006E, CMN_PLL1_SS_CTRL3_M0},
3102     {0x000E, CMN_PLL0_SS_CTRL4_M0},
3103     {0x0012, CMN_PLL0_SS_CTRL4_M1},
3104     {0x000E, CMN_PLL1_SS_CTRL4_M0},
3105     {0x0C5E, CMN_PLL0_VCOCAL_REFTIM_START},
3106     {0x0C5E, CMN_PLL1_VCOCAL_REFTIM_START},
3107     {0x0C56, CMN_PLL0_VCOCAL_PLLCNT_START},
3108     {0x0C56, CMN_PLL1_VCOCAL_PLLCNT_START},
3109     {0x00C7, CMN_PLL0_LOCK_REFCNT_START},
3110     {0x00C7, CMN_PLL1_LOCK_REFCNT_START},
3111     {0x00C7, CMN_PLL0_LOCK_PLLCNT_START},
3112     {0x00C7, CMN_PLL1_LOCK_PLLCNT_START},
3113     {0x0005, CMN_PLL0_LOCK_PLLCNT_THR},
3114     {0x0005, CMN_PLL1_LOCK_PLLCNT_THR},
3115     {0x8200, CMN_CDIAG_CDB_PWRI_OVRD},
3116     {0x8200, CMN_CDIAG_XCVRC_PWRI_OVRD},
3117     {0x007F, CMN_TXPUCAL_TUNE},
3118     {0x007F, CMN_TXPDCAL_TUNE}
3119 };
3120 
3121 static struct cdns_torrent_vals usb_100_int_ssc_cmn_vals = {
3122     .reg_pairs = usb_100_int_ssc_cmn_regs,
3123     .num_regs = ARRAY_SIZE(usb_100_int_ssc_cmn_regs),
3124 };
3125 
3126 /* Single USB link configuration */
3127 static struct cdns_reg_pairs sl_usb_link_cmn_regs[] = {
3128     {0x0000, PHY_PLL_CFG},
3129     {0x8600, CMN_PDIAG_PLL0_CLK_SEL_M0}
3130 };
3131 
3132 static struct cdns_reg_pairs sl_usb_xcvr_diag_ln_regs[] = {
3133     {0x0000, XCVR_DIAG_HSCLK_SEL},
3134     {0x0001, XCVR_DIAG_HSCLK_DIV},
3135     {0x0041, XCVR_DIAG_PLLDRC_CTRL}
3136 };
3137 
3138 static struct cdns_torrent_vals sl_usb_link_cmn_vals = {
3139     .reg_pairs = sl_usb_link_cmn_regs,
3140     .num_regs = ARRAY_SIZE(sl_usb_link_cmn_regs),
3141 };
3142 
3143 static struct cdns_torrent_vals sl_usb_xcvr_diag_ln_vals = {
3144     .reg_pairs = sl_usb_xcvr_diag_ln_regs,
3145     .num_regs = ARRAY_SIZE(sl_usb_xcvr_diag_ln_regs),
3146 };
3147 
3148 /* USB PHY PCS common configuration */
3149 static struct cdns_reg_pairs usb_phy_pcs_cmn_regs[] = {
3150     {0x0A0A, PHY_PIPE_USB3_GEN2_PRE_CFG0},
3151     {0x1000, PHY_PIPE_USB3_GEN2_POST_CFG0},
3152     {0x0010, PHY_PIPE_USB3_GEN2_POST_CFG1}
3153 };
3154 
3155 static struct cdns_torrent_vals usb_phy_pcs_cmn_vals = {
3156     .reg_pairs = usb_phy_pcs_cmn_regs,
3157     .num_regs = ARRAY_SIZE(usb_phy_pcs_cmn_regs),
3158 };
3159 
3160 /* USB 100 MHz Ref clk, no SSC */
3161 static struct cdns_reg_pairs sl_usb_100_no_ssc_cmn_regs[] = {
3162     {0x0028, CMN_PDIAG_PLL1_CP_PADJ_M0},
3163     {0x001E, CMN_PLL1_DSM_FBH_OVRD_M0},
3164     {0x000C, CMN_PLL1_DSM_FBL_OVRD_M0},
3165     {0x0003, CMN_PLL0_VCOCAL_TCTRL},
3166     {0x0003, CMN_PLL1_VCOCAL_TCTRL},
3167     {0x8200, CMN_CDIAG_CDB_PWRI_OVRD},
3168     {0x8200, CMN_CDIAG_XCVRC_PWRI_OVRD}
3169 };
3170 
3171 static struct cdns_torrent_vals sl_usb_100_no_ssc_cmn_vals = {
3172     .reg_pairs = sl_usb_100_no_ssc_cmn_regs,
3173     .num_regs = ARRAY_SIZE(sl_usb_100_no_ssc_cmn_regs),
3174 };
3175 
3176 static struct cdns_reg_pairs usb_100_no_ssc_cmn_regs[] = {
3177     {0x8200, CMN_CDIAG_CDB_PWRI_OVRD},
3178     {0x8200, CMN_CDIAG_XCVRC_PWRI_OVRD},
3179     {0x007F, CMN_TXPUCAL_TUNE},
3180     {0x007F, CMN_TXPDCAL_TUNE}
3181 };
3182 
3183 static struct cdns_reg_pairs usb_100_no_ssc_tx_ln_regs[] = {
3184     {0x02FF, TX_PSC_A0},
3185     {0x06AF, TX_PSC_A1},
3186     {0x06AE, TX_PSC_A2},
3187     {0x06AE, TX_PSC_A3},
3188     {0x2A82, TX_TXCC_CTRL},
3189     {0x0014, TX_TXCC_CPOST_MULT_01},
3190     {0x0003, XCVR_DIAG_PSC_OVRD}
3191 };
3192 
3193 static struct cdns_reg_pairs usb_100_no_ssc_rx_ln_regs[] = {
3194     {0x0D1D, RX_PSC_A0},
3195     {0x0D1D, RX_PSC_A1},
3196     {0x0D00, RX_PSC_A2},
3197     {0x0500, RX_PSC_A3},
3198     {0x0013, RX_SIGDET_HL_FILT_TMR},
3199     {0x0000, RX_REE_GCSM1_CTRL},
3200     {0x0C02, RX_REE_ATTEN_THR},
3201     {0x0330, RX_REE_SMGM_CTRL1},
3202     {0x0300, RX_REE_SMGM_CTRL2},
3203     {0x0019, RX_REE_TAP1_CLIP},
3204     {0x0019, RX_REE_TAP2TON_CLIP},
3205     {0x1004, RX_DIAG_SIGDET_TUNE},
3206     {0x00F9, RX_DIAG_NQST_CTRL},
3207     {0x0C01, RX_DIAG_DFE_AMP_TUNE_2},
3208     {0x0002, RX_DIAG_DFE_AMP_TUNE_3},
3209     {0x0000, RX_DIAG_PI_CAP},
3210     {0x0031, RX_DIAG_PI_RATE},
3211     {0x0001, RX_DIAG_ACYA},
3212     {0x018C, RX_CDRLF_CNFG},
3213     {0x0003, RX_CDRLF_CNFG3}
3214 };
3215 
3216 static struct cdns_torrent_vals usb_100_no_ssc_cmn_vals = {
3217     .reg_pairs = usb_100_no_ssc_cmn_regs,
3218     .num_regs = ARRAY_SIZE(usb_100_no_ssc_cmn_regs),
3219 };
3220 
3221 static struct cdns_torrent_vals usb_100_no_ssc_tx_ln_vals = {
3222     .reg_pairs = usb_100_no_ssc_tx_ln_regs,
3223     .num_regs = ARRAY_SIZE(usb_100_no_ssc_tx_ln_regs),
3224 };
3225 
3226 static struct cdns_torrent_vals usb_100_no_ssc_rx_ln_vals = {
3227     .reg_pairs = usb_100_no_ssc_rx_ln_regs,
3228     .num_regs = ARRAY_SIZE(usb_100_no_ssc_rx_ln_regs),
3229 };
3230 
3231 /* Single link USB, 100 MHz Ref clk, internal SSC */
3232 static struct cdns_reg_pairs sl_usb_100_int_ssc_cmn_regs[] = {
3233     {0x0004, CMN_PLL0_DSM_DIAG_M0},
3234     {0x0004, CMN_PLL1_DSM_DIAG_M0},
3235     {0x0509, CMN_PDIAG_PLL0_CP_PADJ_M0},
3236     {0x0509, CMN_PDIAG_PLL1_CP_PADJ_M0},
3237     {0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M0},
3238     {0x0F00, CMN_PDIAG_PLL1_CP_IADJ_M0},
3239     {0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M0},
3240     {0x0F08, CMN_PDIAG_PLL1_FILT_PADJ_M0},
3241     {0x0064, CMN_PLL0_INTDIV_M0},
3242     {0x0064, CMN_PLL1_INTDIV_M0},
3243     {0x0002, CMN_PLL0_FRACDIVH_M0},
3244     {0x0002, CMN_PLL1_FRACDIVH_M0},
3245     {0x0044, CMN_PLL0_HIGH_THR_M0},
3246     {0x0044, CMN_PLL1_HIGH_THR_M0},
3247     {0x0002, CMN_PDIAG_PLL0_CTRL_M0},
3248     {0x0002, CMN_PDIAG_PLL1_CTRL_M0},
3249     {0x0001, CMN_PLL0_SS_CTRL1_M0},
3250     {0x0001, CMN_PLL1_SS_CTRL1_M0},
3251     {0x011B, CMN_PLL0_SS_CTRL2_M0},
3252     {0x011B, CMN_PLL1_SS_CTRL2_M0},
3253     {0x006E, CMN_PLL0_SS_CTRL3_M0},
3254     {0x006E, CMN_PLL1_SS_CTRL3_M0},
3255     {0x000E, CMN_PLL0_SS_CTRL4_M0},
3256     {0x000E, CMN_PLL1_SS_CTRL4_M0},
3257     {0x0C5E, CMN_PLL0_VCOCAL_REFTIM_START},
3258     {0x0C5E, CMN_PLL1_VCOCAL_REFTIM_START},
3259     {0x0C56, CMN_PLL0_VCOCAL_PLLCNT_START},
3260     {0x0C56, CMN_PLL1_VCOCAL_PLLCNT_START},
3261     {0x0003, CMN_PLL0_VCOCAL_TCTRL},
3262     {0x0003, CMN_PLL1_VCOCAL_TCTRL},
3263     {0x00C7, CMN_PLL0_LOCK_REFCNT_START},
3264     {0x00C7, CMN_PLL1_LOCK_REFCNT_START},
3265     {0x00C7, CMN_PLL0_LOCK_PLLCNT_START},
3266     {0x00C7, CMN_PLL1_LOCK_PLLCNT_START},
3267     {0x0005, CMN_PLL0_LOCK_PLLCNT_THR},
3268     {0x0005, CMN_PLL1_LOCK_PLLCNT_THR},
3269     {0x8200, CMN_CDIAG_CDB_PWRI_OVRD},
3270     {0x8200, CMN_CDIAG_XCVRC_PWRI_OVRD}
3271 };
3272 
3273 static struct cdns_torrent_vals sl_usb_100_int_ssc_cmn_vals = {
3274     .reg_pairs = sl_usb_100_int_ssc_cmn_regs,
3275     .num_regs = ARRAY_SIZE(sl_usb_100_int_ssc_cmn_regs),
3276 };
3277 
3278 /* PCIe and SGMII/QSGMII Unique SSC link configuration */
3279 static struct cdns_reg_pairs pcie_sgmii_link_cmn_regs[] = {
3280     {0x0003, PHY_PLL_CFG},
3281     {0x0601, CMN_PDIAG_PLL0_CLK_SEL_M0},
3282     {0x0400, CMN_PDIAG_PLL0_CLK_SEL_M1},
3283     {0x0601, CMN_PDIAG_PLL1_CLK_SEL_M0}
3284 };
3285 
3286 static struct cdns_reg_pairs pcie_sgmii_xcvr_diag_ln_regs[] = {
3287     {0x0000, XCVR_DIAG_HSCLK_SEL},
3288     {0x0001, XCVR_DIAG_HSCLK_DIV},
3289     {0x0012, XCVR_DIAG_PLLDRC_CTRL}
3290 };
3291 
3292 static struct cdns_reg_pairs sgmii_pcie_xcvr_diag_ln_regs[] = {
3293     {0x0011, XCVR_DIAG_HSCLK_SEL},
3294     {0x0003, XCVR_DIAG_HSCLK_DIV},
3295     {0x009B, XCVR_DIAG_PLLDRC_CTRL}
3296 };
3297 
3298 static struct cdns_torrent_vals pcie_sgmii_link_cmn_vals = {
3299     .reg_pairs = pcie_sgmii_link_cmn_regs,
3300     .num_regs = ARRAY_SIZE(pcie_sgmii_link_cmn_regs),
3301 };
3302 
3303 static struct cdns_torrent_vals pcie_sgmii_xcvr_diag_ln_vals = {
3304     .reg_pairs = pcie_sgmii_xcvr_diag_ln_regs,
3305     .num_regs = ARRAY_SIZE(pcie_sgmii_xcvr_diag_ln_regs),
3306 };
3307 
3308 static struct cdns_torrent_vals sgmii_pcie_xcvr_diag_ln_vals = {
3309     .reg_pairs = sgmii_pcie_xcvr_diag_ln_regs,
3310     .num_regs = ARRAY_SIZE(sgmii_pcie_xcvr_diag_ln_regs),
3311 };
3312 
3313 /* SGMII 100 MHz Ref clk, no SSC */
3314 static struct cdns_reg_pairs sl_sgmii_100_no_ssc_cmn_regs[] = {
3315     {0x0028, CMN_PDIAG_PLL1_CP_PADJ_M0},
3316     {0x001E, CMN_PLL1_DSM_FBH_OVRD_M0},
3317     {0x000C, CMN_PLL1_DSM_FBL_OVRD_M0},
3318     {0x0003, CMN_PLL0_VCOCAL_TCTRL},
3319     {0x0003, CMN_PLL1_VCOCAL_TCTRL}
3320 };
3321 
3322 static struct cdns_torrent_vals sl_sgmii_100_no_ssc_cmn_vals = {
3323     .reg_pairs = sl_sgmii_100_no_ssc_cmn_regs,
3324     .num_regs = ARRAY_SIZE(sl_sgmii_100_no_ssc_cmn_regs),
3325 };
3326 
3327 static struct cdns_reg_pairs sgmii_100_no_ssc_cmn_regs[] = {
3328     {0x007F, CMN_TXPUCAL_TUNE},
3329     {0x007F, CMN_TXPDCAL_TUNE}
3330 };
3331 
3332 static struct cdns_reg_pairs sgmii_100_no_ssc_tx_ln_regs[] = {
3333     {0x00F3, TX_PSC_A0},
3334     {0x04A2, TX_PSC_A2},
3335     {0x04A2, TX_PSC_A3},
3336     {0x0000, TX_TXCC_CPOST_MULT_00},
3337     {0x00B3, DRV_DIAG_TX_DRV}
3338 };
3339 
3340 static struct cdns_reg_pairs ti_sgmii_100_no_ssc_tx_ln_regs[] = {
3341     {0x00F3, TX_PSC_A0},
3342     {0x04A2, TX_PSC_A2},
3343     {0x04A2, TX_PSC_A3},
3344     {0x0000, TX_TXCC_CPOST_MULT_00},
3345     {0x00B3, DRV_DIAG_TX_DRV},
3346     {0x4000, XCVR_DIAG_RXCLK_CTRL},
3347 };
3348 
3349 static struct cdns_reg_pairs sgmii_100_no_ssc_rx_ln_regs[] = {
3350     {0x091D, RX_PSC_A0},
3351     {0x0900, RX_PSC_A2},
3352     {0x0100, RX_PSC_A3},
3353     {0x03C7, RX_REE_GCSM1_EQENM_PH1},
3354     {0x01C7, RX_REE_GCSM1_EQENM_PH2},
3355     {0x0000, RX_DIAG_DFE_CTRL},
3356     {0x0019, RX_REE_TAP1_CLIP},
3357     {0x0019, RX_REE_TAP2TON_CLIP},
3358     {0x0098, RX_DIAG_NQST_CTRL},
3359     {0x0C01, RX_DIAG_DFE_AMP_TUNE_2},
3360     {0x0000, RX_DIAG_DFE_AMP_TUNE_3},
3361     {0x0000, RX_DIAG_PI_CAP},
3362     {0x0010, RX_DIAG_PI_RATE},
3363     {0x0001, RX_DIAG_ACYA},
3364     {0x018C, RX_CDRLF_CNFG},
3365 };
3366 
3367 static struct cdns_torrent_vals sgmii_100_no_ssc_cmn_vals = {
3368     .reg_pairs = sgmii_100_no_ssc_cmn_regs,
3369     .num_regs = ARRAY_SIZE(sgmii_100_no_ssc_cmn_regs),
3370 };
3371 
3372 static struct cdns_torrent_vals sgmii_100_no_ssc_tx_ln_vals = {
3373     .reg_pairs = sgmii_100_no_ssc_tx_ln_regs,
3374     .num_regs = ARRAY_SIZE(sgmii_100_no_ssc_tx_ln_regs),
3375 };
3376 
3377 static struct cdns_torrent_vals ti_sgmii_100_no_ssc_tx_ln_vals = {
3378     .reg_pairs = ti_sgmii_100_no_ssc_tx_ln_regs,
3379     .num_regs = ARRAY_SIZE(ti_sgmii_100_no_ssc_tx_ln_regs),
3380 };
3381 
3382 static struct cdns_torrent_vals sgmii_100_no_ssc_rx_ln_vals = {
3383     .reg_pairs = sgmii_100_no_ssc_rx_ln_regs,
3384     .num_regs = ARRAY_SIZE(sgmii_100_no_ssc_rx_ln_regs),
3385 };
3386 
3387 /* SGMII 100 MHz Ref clk, internal SSC */
3388 static struct cdns_reg_pairs sgmii_100_int_ssc_cmn_regs[] = {
3389     {0x0004, CMN_PLL0_DSM_DIAG_M0},
3390     {0x0004, CMN_PLL0_DSM_DIAG_M1},
3391     {0x0004, CMN_PLL1_DSM_DIAG_M0},
3392     {0x0509, CMN_PDIAG_PLL0_CP_PADJ_M0},
3393     {0x0509, CMN_PDIAG_PLL0_CP_PADJ_M1},
3394     {0x0509, CMN_PDIAG_PLL1_CP_PADJ_M0},
3395     {0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M0},
3396     {0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M1},
3397     {0x0F00, CMN_PDIAG_PLL1_CP_IADJ_M0},
3398     {0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M0},
3399     {0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M1},
3400     {0x0F08, CMN_PDIAG_PLL1_FILT_PADJ_M0},
3401     {0x0064, CMN_PLL0_INTDIV_M0},
3402     {0x0050, CMN_PLL0_INTDIV_M1},
3403     {0x0064, CMN_PLL1_INTDIV_M0},
3404     {0x0002, CMN_PLL0_FRACDIVH_M0},
3405     {0x0002, CMN_PLL0_FRACDIVH_M1},
3406     {0x0002, CMN_PLL1_FRACDIVH_M0},
3407     {0x0044, CMN_PLL0_HIGH_THR_M0},
3408     {0x0036, CMN_PLL0_HIGH_THR_M1},
3409     {0x0044, CMN_PLL1_HIGH_THR_M0},
3410     {0x0002, CMN_PDIAG_PLL0_CTRL_M0},
3411     {0x0002, CMN_PDIAG_PLL0_CTRL_M1},
3412     {0x0002, CMN_PDIAG_PLL1_CTRL_M0},
3413     {0x0001, CMN_PLL0_SS_CTRL1_M0},
3414     {0x0001, CMN_PLL0_SS_CTRL1_M1},
3415     {0x0001, CMN_PLL1_SS_CTRL1_M0},
3416     {0x011B, CMN_PLL0_SS_CTRL2_M0},
3417     {0x011B, CMN_PLL0_SS_CTRL2_M1},
3418     {0x011B, CMN_PLL1_SS_CTRL2_M0},
3419     {0x006E, CMN_PLL0_SS_CTRL3_M0},
3420     {0x0058, CMN_PLL0_SS_CTRL3_M1},
3421     {0x006E, CMN_PLL1_SS_CTRL3_M0},
3422     {0x000E, CMN_PLL0_SS_CTRL4_M0},
3423     {0x0012, CMN_PLL0_SS_CTRL4_M1},
3424     {0x000E, CMN_PLL1_SS_CTRL4_M0},
3425     {0x0C5E, CMN_PLL0_VCOCAL_REFTIM_START},
3426     {0x0C5E, CMN_PLL1_VCOCAL_REFTIM_START},
3427     {0x0C56, CMN_PLL0_VCOCAL_PLLCNT_START},
3428     {0x0C56, CMN_PLL1_VCOCAL_PLLCNT_START},
3429     {0x00C7, CMN_PLL0_LOCK_REFCNT_START},
3430     {0x00C7, CMN_PLL1_LOCK_REFCNT_START},
3431     {0x00C7, CMN_PLL0_LOCK_PLLCNT_START},
3432     {0x00C7, CMN_PLL1_LOCK_PLLCNT_START},
3433     {0x0005, CMN_PLL0_LOCK_PLLCNT_THR},
3434     {0x0005, CMN_PLL1_LOCK_PLLCNT_THR},
3435     {0x007F, CMN_TXPUCAL_TUNE},
3436     {0x007F, CMN_TXPDCAL_TUNE}
3437 };
3438 
3439 static struct cdns_torrent_vals sgmii_100_int_ssc_cmn_vals = {
3440     .reg_pairs = sgmii_100_int_ssc_cmn_regs,
3441     .num_regs = ARRAY_SIZE(sgmii_100_int_ssc_cmn_regs),
3442 };
3443 
3444 /* QSGMII 100 MHz Ref clk, no SSC */
3445 static struct cdns_reg_pairs sl_qsgmii_100_no_ssc_cmn_regs[] = {
3446     {0x0028, CMN_PDIAG_PLL1_CP_PADJ_M0},
3447     {0x001E, CMN_PLL1_DSM_FBH_OVRD_M0},
3448     {0x000C, CMN_PLL1_DSM_FBL_OVRD_M0},
3449     {0x0003, CMN_PLL0_VCOCAL_TCTRL},
3450     {0x0003, CMN_PLL1_VCOCAL_TCTRL}
3451 };
3452 
3453 static struct cdns_torrent_vals sl_qsgmii_100_no_ssc_cmn_vals = {
3454     .reg_pairs = sl_qsgmii_100_no_ssc_cmn_regs,
3455     .num_regs = ARRAY_SIZE(sl_qsgmii_100_no_ssc_cmn_regs),
3456 };
3457 
3458 static struct cdns_reg_pairs qsgmii_100_no_ssc_cmn_regs[] = {
3459     {0x007F, CMN_TXPUCAL_TUNE},
3460     {0x007F, CMN_TXPDCAL_TUNE}
3461 };
3462 
3463 static struct cdns_reg_pairs qsgmii_100_no_ssc_tx_ln_regs[] = {
3464     {0x00F3, TX_PSC_A0},
3465     {0x04A2, TX_PSC_A2},
3466     {0x04A2, TX_PSC_A3},
3467     {0x0000, TX_TXCC_CPOST_MULT_00},
3468     {0x0011, TX_TXCC_MGNFS_MULT_100},
3469     {0x0003, DRV_DIAG_TX_DRV}
3470 };
3471 
3472 static struct cdns_reg_pairs ti_qsgmii_100_no_ssc_tx_ln_regs[] = {
3473     {0x00F3, TX_PSC_A0},
3474     {0x04A2, TX_PSC_A2},
3475     {0x04A2, TX_PSC_A3},
3476     {0x0000, TX_TXCC_CPOST_MULT_00},
3477     {0x0011, TX_TXCC_MGNFS_MULT_100},
3478     {0x0003, DRV_DIAG_TX_DRV},
3479     {0x4000, XCVR_DIAG_RXCLK_CTRL},
3480 };
3481 
3482 static struct cdns_reg_pairs qsgmii_100_no_ssc_rx_ln_regs[] = {
3483     {0x091D, RX_PSC_A0},
3484     {0x0900, RX_PSC_A2},
3485     {0x0100, RX_PSC_A3},
3486     {0x03C7, RX_REE_GCSM1_EQENM_PH1},
3487     {0x01C7, RX_REE_GCSM1_EQENM_PH2},
3488     {0x0000, RX_DIAG_DFE_CTRL},
3489     {0x0019, RX_REE_TAP1_CLIP},
3490     {0x0019, RX_REE_TAP2TON_CLIP},
3491     {0x0098, RX_DIAG_NQST_CTRL},
3492     {0x0C01, RX_DIAG_DFE_AMP_TUNE_2},
3493     {0x0000, RX_DIAG_DFE_AMP_TUNE_3},
3494     {0x0000, RX_DIAG_PI_CAP},
3495     {0x0010, RX_DIAG_PI_RATE},
3496     {0x0001, RX_DIAG_ACYA},
3497     {0x018C, RX_CDRLF_CNFG},
3498 };
3499 
3500 static struct cdns_torrent_vals qsgmii_100_no_ssc_cmn_vals = {
3501     .reg_pairs = qsgmii_100_no_ssc_cmn_regs,
3502     .num_regs = ARRAY_SIZE(qsgmii_100_no_ssc_cmn_regs),
3503 };
3504 
3505 static struct cdns_torrent_vals qsgmii_100_no_ssc_tx_ln_vals = {
3506     .reg_pairs = qsgmii_100_no_ssc_tx_ln_regs,
3507     .num_regs = ARRAY_SIZE(qsgmii_100_no_ssc_tx_ln_regs),
3508 };
3509 
3510 static struct cdns_torrent_vals ti_qsgmii_100_no_ssc_tx_ln_vals = {
3511     .reg_pairs = ti_qsgmii_100_no_ssc_tx_ln_regs,
3512     .num_regs = ARRAY_SIZE(ti_qsgmii_100_no_ssc_tx_ln_regs),
3513 };
3514 
3515 static struct cdns_torrent_vals qsgmii_100_no_ssc_rx_ln_vals = {
3516     .reg_pairs = qsgmii_100_no_ssc_rx_ln_regs,
3517     .num_regs = ARRAY_SIZE(qsgmii_100_no_ssc_rx_ln_regs),
3518 };
3519 
3520 /* QSGMII 100 MHz Ref clk, internal SSC */
3521 static struct cdns_reg_pairs qsgmii_100_int_ssc_cmn_regs[] = {
3522     {0x0004, CMN_PLL0_DSM_DIAG_M0},
3523     {0x0004, CMN_PLL0_DSM_DIAG_M1},
3524     {0x0004, CMN_PLL1_DSM_DIAG_M0},
3525     {0x0509, CMN_PDIAG_PLL0_CP_PADJ_M0},
3526     {0x0509, CMN_PDIAG_PLL0_CP_PADJ_M1},
3527     {0x0509, CMN_PDIAG_PLL1_CP_PADJ_M0},
3528     {0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M0},
3529     {0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M1},
3530     {0x0F00, CMN_PDIAG_PLL1_CP_IADJ_M0},
3531     {0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M0},
3532     {0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M1},
3533     {0x0F08, CMN_PDIAG_PLL1_FILT_PADJ_M0},
3534     {0x0064, CMN_PLL0_INTDIV_M0},
3535     {0x0050, CMN_PLL0_INTDIV_M1},
3536     {0x0064, CMN_PLL1_INTDIV_M0},
3537     {0x0002, CMN_PLL0_FRACDIVH_M0},
3538     {0x0002, CMN_PLL0_FRACDIVH_M1},
3539     {0x0002, CMN_PLL1_FRACDIVH_M0},
3540     {0x0044, CMN_PLL0_HIGH_THR_M0},
3541     {0x0036, CMN_PLL0_HIGH_THR_M1},
3542     {0x0044, CMN_PLL1_HIGH_THR_M0},
3543     {0x0002, CMN_PDIAG_PLL0_CTRL_M0},
3544     {0x0002, CMN_PDIAG_PLL0_CTRL_M1},
3545     {0x0002, CMN_PDIAG_PLL1_CTRL_M0},
3546     {0x0001, CMN_PLL0_SS_CTRL1_M0},
3547     {0x0001, CMN_PLL0_SS_CTRL1_M1},
3548     {0x0001, CMN_PLL1_SS_CTRL1_M0},
3549     {0x011B, CMN_PLL0_SS_CTRL2_M0},
3550     {0x011B, CMN_PLL0_SS_CTRL2_M1},
3551     {0x011B, CMN_PLL1_SS_CTRL2_M0},
3552     {0x006E, CMN_PLL0_SS_CTRL3_M0},
3553     {0x0058, CMN_PLL0_SS_CTRL3_M1},
3554     {0x006E, CMN_PLL1_SS_CTRL3_M0},
3555     {0x000E, CMN_PLL0_SS_CTRL4_M0},
3556     {0x0012, CMN_PLL0_SS_CTRL4_M1},
3557     {0x000E, CMN_PLL1_SS_CTRL4_M0},
3558     {0x0C5E, CMN_PLL0_VCOCAL_REFTIM_START},
3559     {0x0C5E, CMN_PLL1_VCOCAL_REFTIM_START},
3560     {0x0C56, CMN_PLL0_VCOCAL_PLLCNT_START},
3561     {0x0C56, CMN_PLL1_VCOCAL_PLLCNT_START},
3562     {0x00C7, CMN_PLL0_LOCK_REFCNT_START},
3563     {0x00C7, CMN_PLL1_LOCK_REFCNT_START},
3564     {0x00C7, CMN_PLL0_LOCK_PLLCNT_START},
3565     {0x00C7, CMN_PLL1_LOCK_PLLCNT_START},
3566     {0x0005, CMN_PLL0_LOCK_PLLCNT_THR},
3567     {0x0005, CMN_PLL1_LOCK_PLLCNT_THR},
3568     {0x007F, CMN_TXPUCAL_TUNE},
3569     {0x007F, CMN_TXPDCAL_TUNE}
3570 };
3571 
3572 static struct cdns_torrent_vals qsgmii_100_int_ssc_cmn_vals = {
3573     .reg_pairs = qsgmii_100_int_ssc_cmn_regs,
3574     .num_regs = ARRAY_SIZE(qsgmii_100_int_ssc_cmn_regs),
3575 };
3576 
3577 /* Single SGMII/QSGMII link configuration */
3578 static struct cdns_reg_pairs sl_sgmii_link_cmn_regs[] = {
3579     {0x0000, PHY_PLL_CFG},
3580     {0x0601, CMN_PDIAG_PLL0_CLK_SEL_M0}
3581 };
3582 
3583 static struct cdns_reg_pairs sl_sgmii_xcvr_diag_ln_regs[] = {
3584     {0x0000, XCVR_DIAG_HSCLK_SEL},
3585     {0x0003, XCVR_DIAG_HSCLK_DIV},
3586     {0x0013, XCVR_DIAG_PLLDRC_CTRL}
3587 };
3588 
3589 static struct cdns_torrent_vals sl_sgmii_link_cmn_vals = {
3590     .reg_pairs = sl_sgmii_link_cmn_regs,
3591     .num_regs = ARRAY_SIZE(sl_sgmii_link_cmn_regs),
3592 };
3593 
3594 static struct cdns_torrent_vals sl_sgmii_xcvr_diag_ln_vals = {
3595     .reg_pairs = sl_sgmii_xcvr_diag_ln_regs,
3596     .num_regs = ARRAY_SIZE(sl_sgmii_xcvr_diag_ln_regs),
3597 };
3598 
3599 /* Multi link PCIe, 100 MHz Ref clk, internal SSC */
3600 static struct cdns_reg_pairs pcie_100_int_ssc_cmn_regs[] = {
3601     {0x0004, CMN_PLL0_DSM_DIAG_M0},
3602     {0x0004, CMN_PLL0_DSM_DIAG_M1},
3603     {0x0004, CMN_PLL1_DSM_DIAG_M0},
3604     {0x0509, CMN_PDIAG_PLL0_CP_PADJ_M0},
3605     {0x0509, CMN_PDIAG_PLL0_CP_PADJ_M1},
3606     {0x0509, CMN_PDIAG_PLL1_CP_PADJ_M0},
3607     {0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M0},
3608     {0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M1},
3609     {0x0F00, CMN_PDIAG_PLL1_CP_IADJ_M0},
3610     {0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M0},
3611     {0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M1},
3612     {0x0F08, CMN_PDIAG_PLL1_FILT_PADJ_M0},
3613     {0x0064, CMN_PLL0_INTDIV_M0},
3614     {0x0050, CMN_PLL0_INTDIV_M1},
3615     {0x0064, CMN_PLL1_INTDIV_M0},
3616     {0x0002, CMN_PLL0_FRACDIVH_M0},
3617     {0x0002, CMN_PLL0_FRACDIVH_M1},
3618     {0x0002, CMN_PLL1_FRACDIVH_M0},
3619     {0x0044, CMN_PLL0_HIGH_THR_M0},
3620     {0x0036, CMN_PLL0_HIGH_THR_M1},
3621     {0x0044, CMN_PLL1_HIGH_THR_M0},
3622     {0x0002, CMN_PDIAG_PLL0_CTRL_M0},
3623     {0x0002, CMN_PDIAG_PLL0_CTRL_M1},
3624     {0x0002, CMN_PDIAG_PLL1_CTRL_M0},
3625     {0x0001, CMN_PLL0_SS_CTRL1_M0},
3626     {0x0001, CMN_PLL0_SS_CTRL1_M1},
3627     {0x0001, CMN_PLL1_SS_CTRL1_M0},
3628     {0x011B, CMN_PLL0_SS_CTRL2_M0},
3629     {0x011B, CMN_PLL0_SS_CTRL2_M1},
3630     {0x011B, CMN_PLL1_SS_CTRL2_M0},
3631     {0x006E, CMN_PLL0_SS_CTRL3_M0},
3632     {0x0058, CMN_PLL0_SS_CTRL3_M1},
3633     {0x006E, CMN_PLL1_SS_CTRL3_M0},
3634     {0x000E, CMN_PLL0_SS_CTRL4_M0},
3635     {0x0012, CMN_PLL0_SS_CTRL4_M1},
3636     {0x000E, CMN_PLL1_SS_CTRL4_M0},
3637     {0x0C5E, CMN_PLL0_VCOCAL_REFTIM_START},
3638     {0x0C5E, CMN_PLL1_VCOCAL_REFTIM_START},
3639     {0x0C56, CMN_PLL0_VCOCAL_PLLCNT_START},
3640     {0x0C56, CMN_PLL1_VCOCAL_PLLCNT_START},
3641     {0x00C7, CMN_PLL0_LOCK_REFCNT_START},
3642     {0x00C7, CMN_PLL1_LOCK_REFCNT_START},
3643     {0x00C7, CMN_PLL0_LOCK_PLLCNT_START},
3644     {0x00C7, CMN_PLL1_LOCK_PLLCNT_START},
3645     {0x0005, CMN_PLL0_LOCK_PLLCNT_THR},
3646     {0x0005, CMN_PLL1_LOCK_PLLCNT_THR}
3647 };
3648 
3649 static struct cdns_torrent_vals pcie_100_int_ssc_cmn_vals = {
3650     .reg_pairs = pcie_100_int_ssc_cmn_regs,
3651     .num_regs = ARRAY_SIZE(pcie_100_int_ssc_cmn_regs),
3652 };
3653 
3654 /* Single link PCIe, 100 MHz Ref clk, internal SSC */
3655 static struct cdns_reg_pairs sl_pcie_100_int_ssc_cmn_regs[] = {
3656     {0x0004, CMN_PLL0_DSM_DIAG_M0},
3657     {0x0004, CMN_PLL0_DSM_DIAG_M1},
3658     {0x0004, CMN_PLL1_DSM_DIAG_M0},
3659     {0x0509, CMN_PDIAG_PLL0_CP_PADJ_M0},
3660     {0x0509, CMN_PDIAG_PLL0_CP_PADJ_M1},
3661     {0x0509, CMN_PDIAG_PLL1_CP_PADJ_M0},
3662     {0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M0},
3663     {0x0F00, CMN_PDIAG_PLL0_CP_IADJ_M1},
3664     {0x0F00, CMN_PDIAG_PLL1_CP_IADJ_M0},
3665     {0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M0},
3666     {0x0F08, CMN_PDIAG_PLL0_FILT_PADJ_M1},
3667     {0x0F08, CMN_PDIAG_PLL1_FILT_PADJ_M0},
3668     {0x0064, CMN_PLL0_INTDIV_M0},
3669     {0x0050, CMN_PLL0_INTDIV_M1},
3670     {0x0050, CMN_PLL1_INTDIV_M0},
3671     {0x0002, CMN_PLL0_FRACDIVH_M0},
3672     {0x0002, CMN_PLL0_FRACDIVH_M1},
3673     {0x0002, CMN_PLL1_FRACDIVH_M0},
3674     {0x0044, CMN_PLL0_HIGH_THR_M0},
3675     {0x0036, CMN_PLL0_HIGH_THR_M1},
3676     {0x0036, CMN_PLL1_HIGH_THR_M0},
3677     {0x0002, CMN_PDIAG_PLL0_CTRL_M0},
3678     {0x0002, CMN_PDIAG_PLL0_CTRL_M1},
3679     {0x0002, CMN_PDIAG_PLL1_CTRL_M0},
3680     {0x0001, CMN_PLL0_SS_CTRL1_M0},
3681     {0x0001, CMN_PLL0_SS_CTRL1_M1},
3682     {0x0001, CMN_PLL1_SS_CTRL1_M0},
3683     {0x011B, CMN_PLL0_SS_CTRL2_M0},
3684     {0x011B, CMN_PLL0_SS_CTRL2_M1},
3685     {0x011B, CMN_PLL1_SS_CTRL2_M0},
3686     {0x006E, CMN_PLL0_SS_CTRL3_M0},
3687     {0x0058, CMN_PLL0_SS_CTRL3_M1},
3688     {0x0058, CMN_PLL1_SS_CTRL3_M0},
3689     {0x000E, CMN_PLL0_SS_CTRL4_M0},
3690     {0x0012, CMN_PLL0_SS_CTRL4_M1},
3691     {0x0012, CMN_PLL1_SS_CTRL4_M0},
3692     {0x0C5E, CMN_PLL0_VCOCAL_REFTIM_START},
3693     {0x0C5E, CMN_PLL1_VCOCAL_REFTIM_START},
3694     {0x0C56, CMN_PLL0_VCOCAL_PLLCNT_START},
3695     {0x0C56, CMN_PLL1_VCOCAL_PLLCNT_START},
3696     {0x00C7, CMN_PLL0_LOCK_REFCNT_START},
3697     {0x00C7, CMN_PLL1_LOCK_REFCNT_START},
3698     {0x00C7, CMN_PLL0_LOCK_PLLCNT_START},
3699     {0x00C7, CMN_PLL1_LOCK_PLLCNT_START},
3700     {0x0005, CMN_PLL0_LOCK_PLLCNT_THR},
3701     {0x0005, CMN_PLL1_LOCK_PLLCNT_THR}
3702 };
3703 
3704 static struct cdns_torrent_vals sl_pcie_100_int_ssc_cmn_vals = {
3705     .reg_pairs = sl_pcie_100_int_ssc_cmn_regs,
3706     .num_regs = ARRAY_SIZE(sl_pcie_100_int_ssc_cmn_regs),
3707 };
3708 
3709 /* PCIe, 100 MHz Ref clk, no SSC & external SSC */
3710 static struct cdns_reg_pairs pcie_100_ext_no_ssc_cmn_regs[] = {
3711     {0x0028, CMN_PDIAG_PLL1_CP_PADJ_M0},
3712     {0x001E, CMN_PLL1_DSM_FBH_OVRD_M0},
3713     {0x000C, CMN_PLL1_DSM_FBL_OVRD_M0}
3714 };
3715 
3716 static struct cdns_reg_pairs pcie_100_ext_no_ssc_rx_ln_regs[] = {
3717     {0x0019, RX_REE_TAP1_CLIP},
3718     {0x0019, RX_REE_TAP2TON_CLIP},
3719     {0x0001, RX_DIAG_ACYA}
3720 };
3721 
3722 static struct cdns_torrent_vals pcie_100_no_ssc_cmn_vals = {
3723     .reg_pairs = pcie_100_ext_no_ssc_cmn_regs,
3724     .num_regs = ARRAY_SIZE(pcie_100_ext_no_ssc_cmn_regs),
3725 };
3726 
3727 static struct cdns_torrent_vals pcie_100_no_ssc_rx_ln_vals = {
3728     .reg_pairs = pcie_100_ext_no_ssc_rx_ln_regs,
3729     .num_regs = ARRAY_SIZE(pcie_100_ext_no_ssc_rx_ln_regs),
3730 };
3731 
3732 static const struct cdns_torrent_data cdns_map_torrent = {
3733     .block_offset_shift = 0x2,
3734     .reg_offset_shift = 0x2,
3735     .link_cmn_vals = {
3736         [TYPE_DP] = {
3737             [TYPE_NONE] = {
3738                 [NO_SSC] = &sl_dp_link_cmn_vals,
3739             },
3740         },
3741         [TYPE_PCIE] = {
3742             [TYPE_NONE] = {
3743                 [NO_SSC] = NULL,
3744                 [EXTERNAL_SSC] = NULL,
3745                 [INTERNAL_SSC] = NULL,
3746             },
3747             [TYPE_SGMII] = {
3748                 [NO_SSC] = &pcie_sgmii_link_cmn_vals,
3749                 [EXTERNAL_SSC] = &pcie_sgmii_link_cmn_vals,
3750                 [INTERNAL_SSC] = &pcie_sgmii_link_cmn_vals,
3751             },
3752             [TYPE_QSGMII] = {
3753                 [NO_SSC] = &pcie_sgmii_link_cmn_vals,
3754                 [EXTERNAL_SSC] = &pcie_sgmii_link_cmn_vals,
3755                 [INTERNAL_SSC] = &pcie_sgmii_link_cmn_vals,
3756             },
3757             [TYPE_USB] = {
3758                 [NO_SSC] = &pcie_usb_link_cmn_vals,
3759                 [EXTERNAL_SSC] = &pcie_usb_link_cmn_vals,
3760                 [INTERNAL_SSC] = &pcie_usb_link_cmn_vals,
3761             },
3762         },
3763         [TYPE_SGMII] = {
3764             [TYPE_NONE] = {
3765                 [NO_SSC] = &sl_sgmii_link_cmn_vals,
3766             },
3767             [TYPE_PCIE] = {
3768                 [NO_SSC] = &pcie_sgmii_link_cmn_vals,
3769                 [EXTERNAL_SSC] = &pcie_sgmii_link_cmn_vals,
3770                 [INTERNAL_SSC] = &pcie_sgmii_link_cmn_vals,
3771             },
3772             [TYPE_USB] = {
3773                 [NO_SSC] = &usb_sgmii_link_cmn_vals,
3774                 [EXTERNAL_SSC] = &usb_sgmii_link_cmn_vals,
3775                 [INTERNAL_SSC] = &usb_sgmii_link_cmn_vals,
3776             },
3777         },
3778         [TYPE_QSGMII] = {
3779             [TYPE_NONE] = {
3780                 [NO_SSC] = &sl_sgmii_link_cmn_vals,
3781             },
3782             [TYPE_PCIE] = {
3783                 [NO_SSC] = &pcie_sgmii_link_cmn_vals,
3784                 [EXTERNAL_SSC] = &pcie_sgmii_link_cmn_vals,
3785                 [INTERNAL_SSC] = &pcie_sgmii_link_cmn_vals,
3786             },
3787             [TYPE_USB] = {
3788                 [NO_SSC] = &usb_sgmii_link_cmn_vals,
3789                 [EXTERNAL_SSC] = &usb_sgmii_link_cmn_vals,
3790                 [INTERNAL_SSC] = &usb_sgmii_link_cmn_vals,
3791             },
3792         },
3793         [TYPE_USB] = {
3794             [TYPE_NONE] = {
3795                 [NO_SSC] = &sl_usb_link_cmn_vals,
3796                 [EXTERNAL_SSC] = &sl_usb_link_cmn_vals,
3797                 [INTERNAL_SSC] = &sl_usb_link_cmn_vals,
3798             },
3799             [TYPE_PCIE] = {
3800                 [NO_SSC] = &pcie_usb_link_cmn_vals,
3801                 [EXTERNAL_SSC] = &pcie_usb_link_cmn_vals,
3802                 [INTERNAL_SSC] = &pcie_usb_link_cmn_vals,
3803             },
3804             [TYPE_SGMII] = {
3805                 [NO_SSC] = &usb_sgmii_link_cmn_vals,
3806                 [EXTERNAL_SSC] = &usb_sgmii_link_cmn_vals,
3807                 [INTERNAL_SSC] = &usb_sgmii_link_cmn_vals,
3808             },
3809             [TYPE_QSGMII] = {
3810                 [NO_SSC] = &usb_sgmii_link_cmn_vals,
3811                 [EXTERNAL_SSC] = &usb_sgmii_link_cmn_vals,
3812                 [INTERNAL_SSC] = &usb_sgmii_link_cmn_vals,
3813             },
3814         },
3815     },
3816     .xcvr_diag_vals = {
3817         [TYPE_DP] = {
3818             [TYPE_NONE] = {
3819                 [NO_SSC] = &sl_dp_xcvr_diag_ln_vals,
3820             },
3821         },
3822         [TYPE_PCIE] = {
3823             [TYPE_NONE] = {
3824                 [NO_SSC] = NULL,
3825                 [EXTERNAL_SSC] = NULL,
3826                 [INTERNAL_SSC] = NULL,
3827             },
3828             [TYPE_SGMII] = {
3829                 [NO_SSC] = &pcie_sgmii_xcvr_diag_ln_vals,
3830                 [EXTERNAL_SSC] = &pcie_sgmii_xcvr_diag_ln_vals,
3831                 [INTERNAL_SSC] = &pcie_sgmii_xcvr_diag_ln_vals,
3832             },
3833             [TYPE_QSGMII] = {
3834                 [NO_SSC] = &pcie_sgmii_xcvr_diag_ln_vals,
3835                 [EXTERNAL_SSC] = &pcie_sgmii_xcvr_diag_ln_vals,
3836                 [INTERNAL_SSC] = &pcie_sgmii_xcvr_diag_ln_vals,
3837             },
3838             [TYPE_USB] = {
3839                 [NO_SSC] = &pcie_usb_xcvr_diag_ln_vals,
3840                 [EXTERNAL_SSC] = &pcie_usb_xcvr_diag_ln_vals,
3841                 [INTERNAL_SSC] = &pcie_usb_xcvr_diag_ln_vals,
3842             },
3843         },
3844         [TYPE_SGMII] = {
3845             [TYPE_NONE] = {
3846                 [NO_SSC] = &sl_sgmii_xcvr_diag_ln_vals,
3847             },
3848             [TYPE_PCIE] = {
3849                 [NO_SSC] = &sgmii_pcie_xcvr_diag_ln_vals,
3850                 [EXTERNAL_SSC] = &sgmii_pcie_xcvr_diag_ln_vals,
3851                 [INTERNAL_SSC] = &sgmii_pcie_xcvr_diag_ln_vals,
3852             },
3853             [TYPE_USB] = {
3854                 [NO_SSC] = &sgmii_usb_xcvr_diag_ln_vals,
3855                 [EXTERNAL_SSC] = &sgmii_usb_xcvr_diag_ln_vals,
3856                 [INTERNAL_SSC] = &sgmii_usb_xcvr_diag_ln_vals,
3857             },
3858         },
3859         [TYPE_QSGMII] = {
3860             [TYPE_NONE] = {
3861                 [NO_SSC] = &sl_sgmii_xcvr_diag_ln_vals,
3862             },
3863             [TYPE_PCIE] = {
3864                 [NO_SSC] = &sgmii_pcie_xcvr_diag_ln_vals,
3865                 [EXTERNAL_SSC] = &sgmii_pcie_xcvr_diag_ln_vals,
3866                 [INTERNAL_SSC] = &sgmii_pcie_xcvr_diag_ln_vals,
3867             },
3868             [TYPE_USB] = {
3869                 [NO_SSC] = &sgmii_usb_xcvr_diag_ln_vals,
3870                 [EXTERNAL_SSC] = &sgmii_usb_xcvr_diag_ln_vals,
3871                 [INTERNAL_SSC] = &sgmii_usb_xcvr_diag_ln_vals,
3872             },
3873         },
3874         [TYPE_USB] = {
3875             [TYPE_NONE] = {
3876                 [NO_SSC] = &sl_usb_xcvr_diag_ln_vals,
3877                 [EXTERNAL_SSC] = &sl_usb_xcvr_diag_ln_vals,
3878                 [INTERNAL_SSC] = &sl_usb_xcvr_diag_ln_vals,
3879             },
3880             [TYPE_PCIE] = {
3881                 [NO_SSC] = &usb_pcie_xcvr_diag_ln_vals,
3882                 [EXTERNAL_SSC] = &usb_pcie_xcvr_diag_ln_vals,
3883                 [INTERNAL_SSC] = &usb_pcie_xcvr_diag_ln_vals,
3884             },
3885             [TYPE_SGMII] = {
3886                 [NO_SSC] = &usb_sgmii_xcvr_diag_ln_vals,
3887                 [EXTERNAL_SSC] = &usb_sgmii_xcvr_diag_ln_vals,
3888                 [INTERNAL_SSC] = &usb_sgmii_xcvr_diag_ln_vals,
3889             },
3890             [TYPE_QSGMII] = {
3891                 [NO_SSC] = &usb_sgmii_xcvr_diag_ln_vals,
3892                 [EXTERNAL_SSC] = &usb_sgmii_xcvr_diag_ln_vals,
3893                 [INTERNAL_SSC] = &usb_sgmii_xcvr_diag_ln_vals,
3894             },
3895         },
3896     },
3897     .pcs_cmn_vals = {
3898         [TYPE_USB] = {
3899             [TYPE_NONE] = {
3900                 [NO_SSC] = &usb_phy_pcs_cmn_vals,
3901                 [EXTERNAL_SSC] = &usb_phy_pcs_cmn_vals,
3902                 [INTERNAL_SSC] = &usb_phy_pcs_cmn_vals,
3903             },
3904             [TYPE_PCIE] = {
3905                 [NO_SSC] = &usb_phy_pcs_cmn_vals,
3906                 [EXTERNAL_SSC] = &usb_phy_pcs_cmn_vals,
3907                 [INTERNAL_SSC] = &usb_phy_pcs_cmn_vals,
3908             },
3909             [TYPE_SGMII] = {
3910                 [NO_SSC] = &usb_phy_pcs_cmn_vals,
3911                 [EXTERNAL_SSC] = &usb_phy_pcs_cmn_vals,
3912                 [INTERNAL_SSC] = &usb_phy_pcs_cmn_vals,
3913             },
3914             [TYPE_QSGMII] = {
3915                 [NO_SSC] = &usb_phy_pcs_cmn_vals,
3916                 [EXTERNAL_SSC] = &usb_phy_pcs_cmn_vals,
3917                 [INTERNAL_SSC] = &usb_phy_pcs_cmn_vals,
3918             },
3919         },
3920     },
3921     .cmn_vals = {
3922         [CLK_19_2_MHZ] = {
3923             [TYPE_DP] = {
3924                 [TYPE_NONE] = {
3925                     [NO_SSC] = &sl_dp_19_2_no_ssc_cmn_vals,
3926                 },
3927             },
3928         },
3929         [CLK_25_MHZ] = {
3930             [TYPE_DP] = {
3931                 [TYPE_NONE] = {
3932                     [NO_SSC] = &sl_dp_25_no_ssc_cmn_vals,
3933                 },
3934             },
3935         },
3936         [CLK_100_MHZ] = {
3937             [TYPE_DP] = {
3938                 [TYPE_NONE] = {
3939                     [NO_SSC] = &sl_dp_100_no_ssc_cmn_vals,
3940                 },
3941             },
3942             [TYPE_PCIE] = {
3943                 [TYPE_NONE] = {
3944                     [NO_SSC] = NULL,
3945                     [EXTERNAL_SSC] = NULL,
3946                     [INTERNAL_SSC] = &sl_pcie_100_int_ssc_cmn_vals,
3947                 },
3948                 [TYPE_SGMII] = {
3949                     [NO_SSC] = &pcie_100_no_ssc_cmn_vals,
3950                     [EXTERNAL_SSC] = &pcie_100_no_ssc_cmn_vals,
3951                     [INTERNAL_SSC] = &pcie_100_int_ssc_cmn_vals,
3952                 },
3953                 [TYPE_QSGMII] = {
3954                     [NO_SSC] = &pcie_100_no_ssc_cmn_vals,
3955                     [EXTERNAL_SSC] = &pcie_100_no_ssc_cmn_vals,
3956                     [INTERNAL_SSC] = &pcie_100_int_ssc_cmn_vals,
3957                 },
3958                 [TYPE_USB] = {
3959                     [NO_SSC] = &pcie_100_no_ssc_cmn_vals,
3960                     [EXTERNAL_SSC] = &pcie_100_no_ssc_cmn_vals,
3961                     [INTERNAL_SSC] = &pcie_100_int_ssc_cmn_vals,
3962                 },
3963             },
3964             [TYPE_SGMII] = {
3965                 [TYPE_NONE] = {
3966                     [NO_SSC] = &sl_sgmii_100_no_ssc_cmn_vals,
3967                 },
3968                 [TYPE_PCIE] = {
3969                     [NO_SSC] = &sgmii_100_no_ssc_cmn_vals,
3970                     [EXTERNAL_SSC] = &sgmii_100_no_ssc_cmn_vals,
3971                     [INTERNAL_SSC] = &sgmii_100_int_ssc_cmn_vals,
3972                 },
3973                 [TYPE_USB] = {
3974                     [NO_SSC] = &sgmii_100_no_ssc_cmn_vals,
3975                     [EXTERNAL_SSC] = &sgmii_100_no_ssc_cmn_vals,
3976                     [INTERNAL_SSC] = &sgmii_100_no_ssc_cmn_vals,
3977                 },
3978             },
3979             [TYPE_QSGMII] = {
3980                 [TYPE_NONE] = {
3981                     [NO_SSC] = &sl_qsgmii_100_no_ssc_cmn_vals,
3982                 },
3983                 [TYPE_PCIE] = {
3984                     [NO_SSC] = &qsgmii_100_no_ssc_cmn_vals,
3985                     [EXTERNAL_SSC] = &qsgmii_100_no_ssc_cmn_vals,
3986                     [INTERNAL_SSC] = &qsgmii_100_int_ssc_cmn_vals,
3987                 },
3988                 [TYPE_USB] = {
3989                     [NO_SSC] = &qsgmii_100_no_ssc_cmn_vals,
3990                     [EXTERNAL_SSC] = &qsgmii_100_no_ssc_cmn_vals,
3991                     [INTERNAL_SSC] = &qsgmii_100_no_ssc_cmn_vals,
3992                 },
3993             },
3994             [TYPE_USB] = {
3995                 [TYPE_NONE] = {
3996                     [NO_SSC] = &sl_usb_100_no_ssc_cmn_vals,
3997                     [EXTERNAL_SSC] = &sl_usb_100_no_ssc_cmn_vals,
3998                     [INTERNAL_SSC] = &sl_usb_100_int_ssc_cmn_vals,
3999                 },
4000                 [TYPE_PCIE] = {
4001                     [NO_SSC] = &usb_100_no_ssc_cmn_vals,
4002                     [EXTERNAL_SSC] = &usb_100_no_ssc_cmn_vals,
4003                     [INTERNAL_SSC] = &usb_100_int_ssc_cmn_vals,
4004                 },
4005                 [TYPE_SGMII] = {
4006                     [NO_SSC] = &sl_usb_100_no_ssc_cmn_vals,
4007                     [EXTERNAL_SSC] = &sl_usb_100_no_ssc_cmn_vals,
4008                     [INTERNAL_SSC] = &sl_usb_100_int_ssc_cmn_vals,
4009                 },
4010                 [TYPE_QSGMII] = {
4011                     [NO_SSC] = &sl_usb_100_no_ssc_cmn_vals,
4012                     [EXTERNAL_SSC] = &sl_usb_100_no_ssc_cmn_vals,
4013                     [INTERNAL_SSC] = &sl_usb_100_int_ssc_cmn_vals,
4014                 },
4015             },
4016         },
4017     },
4018     .tx_ln_vals = {
4019         [CLK_19_2_MHZ] = {
4020             [TYPE_DP] = {
4021                 [TYPE_NONE] = {
4022                     [NO_SSC] = &sl_dp_19_2_no_ssc_tx_ln_vals,
4023                 },
4024             },
4025         },
4026         [CLK_25_MHZ] = {
4027             [TYPE_DP] = {
4028                 [TYPE_NONE] = {
4029                     [NO_SSC] = &sl_dp_25_no_ssc_tx_ln_vals,
4030                 },
4031             },
4032         },
4033         [CLK_100_MHZ] = {
4034             [TYPE_DP] = {
4035                 [TYPE_NONE] = {
4036                     [NO_SSC] = &sl_dp_100_no_ssc_tx_ln_vals,
4037                 },
4038             },
4039             [TYPE_PCIE] = {
4040                 [TYPE_NONE] = {
4041                     [NO_SSC] = NULL,
4042                     [EXTERNAL_SSC] = NULL,
4043                     [INTERNAL_SSC] = NULL,
4044                 },
4045                 [TYPE_SGMII] = {
4046                     [NO_SSC] = NULL,
4047                     [EXTERNAL_SSC] = NULL,
4048                     [INTERNAL_SSC] = NULL,
4049                 },
4050                 [TYPE_QSGMII] = {
4051                     [NO_SSC] = NULL,
4052                     [EXTERNAL_SSC] = NULL,
4053                     [INTERNAL_SSC] = NULL,
4054                 },
4055                 [TYPE_USB] = {
4056                     [NO_SSC] = NULL,
4057                     [EXTERNAL_SSC] = NULL,
4058                     [INTERNAL_SSC] = NULL,
4059                 },
4060             },
4061             [TYPE_SGMII] = {
4062                 [TYPE_NONE] = {
4063                     [NO_SSC] = &sgmii_100_no_ssc_tx_ln_vals,
4064                 },
4065                 [TYPE_PCIE] = {
4066                     [NO_SSC] = &sgmii_100_no_ssc_tx_ln_vals,
4067                     [EXTERNAL_SSC] = &sgmii_100_no_ssc_tx_ln_vals,
4068                     [INTERNAL_SSC] = &sgmii_100_no_ssc_tx_ln_vals,
4069                 },
4070                 [TYPE_USB] = {
4071                     [NO_SSC] = &sgmii_100_no_ssc_tx_ln_vals,
4072                     [EXTERNAL_SSC] = &sgmii_100_no_ssc_tx_ln_vals,
4073                     [INTERNAL_SSC] = &sgmii_100_no_ssc_tx_ln_vals,
4074                 },
4075             },
4076             [TYPE_QSGMII] = {
4077                 [TYPE_NONE] = {
4078                     [NO_SSC] = &qsgmii_100_no_ssc_tx_ln_vals,
4079                 },
4080                 [TYPE_PCIE] = {
4081                     [NO_SSC] = &qsgmii_100_no_ssc_tx_ln_vals,
4082                     [EXTERNAL_SSC] = &qsgmii_100_no_ssc_tx_ln_vals,
4083                     [INTERNAL_SSC] = &qsgmii_100_no_ssc_tx_ln_vals,
4084                 },
4085                 [TYPE_USB] = {
4086                     [NO_SSC] = &qsgmii_100_no_ssc_tx_ln_vals,
4087                     [EXTERNAL_SSC] = &qsgmii_100_no_ssc_tx_ln_vals,
4088                     [INTERNAL_SSC] = &qsgmii_100_no_ssc_tx_ln_vals,
4089                 },
4090             },
4091             [TYPE_USB] = {
4092                 [TYPE_NONE] = {
4093                     [NO_SSC] = &usb_100_no_ssc_tx_ln_vals,
4094                     [EXTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals,
4095                     [INTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals,
4096                 },
4097                 [TYPE_PCIE] = {
4098                     [NO_SSC] = &usb_100_no_ssc_tx_ln_vals,
4099                     [EXTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals,
4100                     [INTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals,
4101                 },
4102                 [TYPE_SGMII] = {
4103                     [NO_SSC] = &usb_100_no_ssc_tx_ln_vals,
4104                     [EXTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals,
4105                     [INTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals,
4106                 },
4107                 [TYPE_QSGMII] = {
4108                     [NO_SSC] = &usb_100_no_ssc_tx_ln_vals,
4109                     [EXTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals,
4110                     [INTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals,
4111                 },
4112             },
4113         },
4114     },
4115     .rx_ln_vals = {
4116         [CLK_19_2_MHZ] = {
4117             [TYPE_DP] = {
4118                 [TYPE_NONE] = {
4119                     [NO_SSC] = &sl_dp_19_2_no_ssc_rx_ln_vals,
4120                 },
4121             },
4122         },
4123         [CLK_25_MHZ] = {
4124             [TYPE_DP] = {
4125                 [TYPE_NONE] = {
4126                     [NO_SSC] = &sl_dp_25_no_ssc_rx_ln_vals,
4127                 },
4128             },
4129         },
4130         [CLK_100_MHZ] = {
4131             [TYPE_DP] = {
4132                 [TYPE_NONE] = {
4133                     [NO_SSC] = &sl_dp_100_no_ssc_rx_ln_vals,
4134                 },
4135             },
4136             [TYPE_PCIE] = {
4137                 [TYPE_NONE] = {
4138                     [NO_SSC] = &pcie_100_no_ssc_rx_ln_vals,
4139                     [EXTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals,
4140                     [INTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals,
4141                 },
4142                 [TYPE_SGMII] = {
4143                     [NO_SSC] = &pcie_100_no_ssc_rx_ln_vals,
4144                     [EXTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals,
4145                     [INTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals,
4146                 },
4147                 [TYPE_QSGMII] = {
4148                     [NO_SSC] = &pcie_100_no_ssc_rx_ln_vals,
4149                     [EXTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals,
4150                     [INTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals,
4151                 },
4152                 [TYPE_USB] = {
4153                     [NO_SSC] = &pcie_100_no_ssc_rx_ln_vals,
4154                     [EXTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals,
4155                     [INTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals,
4156                 },
4157             },
4158             [TYPE_SGMII] = {
4159                 [TYPE_NONE] = {
4160                     [NO_SSC] = &sgmii_100_no_ssc_rx_ln_vals,
4161                 },
4162                 [TYPE_PCIE] = {
4163                     [NO_SSC] = &sgmii_100_no_ssc_rx_ln_vals,
4164                     [EXTERNAL_SSC] = &sgmii_100_no_ssc_rx_ln_vals,
4165                     [INTERNAL_SSC] = &sgmii_100_no_ssc_rx_ln_vals,
4166                 },
4167                 [TYPE_USB] = {
4168                     [NO_SSC] = &sgmii_100_no_ssc_rx_ln_vals,
4169                     [EXTERNAL_SSC] = &sgmii_100_no_ssc_rx_ln_vals,
4170                     [INTERNAL_SSC] = &sgmii_100_no_ssc_rx_ln_vals,
4171                 },
4172             },
4173             [TYPE_QSGMII] = {
4174                 [TYPE_NONE] = {
4175                     [NO_SSC] = &qsgmii_100_no_ssc_rx_ln_vals,
4176                 },
4177                 [TYPE_PCIE] = {
4178                     [NO_SSC] = &qsgmii_100_no_ssc_rx_ln_vals,
4179                     [EXTERNAL_SSC] = &qsgmii_100_no_ssc_rx_ln_vals,
4180                     [INTERNAL_SSC] = &qsgmii_100_no_ssc_rx_ln_vals,
4181                 },
4182                 [TYPE_USB] = {
4183                     [NO_SSC] = &qsgmii_100_no_ssc_rx_ln_vals,
4184                     [EXTERNAL_SSC] = &qsgmii_100_no_ssc_rx_ln_vals,
4185                     [INTERNAL_SSC] = &qsgmii_100_no_ssc_rx_ln_vals,
4186                 },
4187             },
4188             [TYPE_USB] = {
4189                 [TYPE_NONE] = {
4190                     [NO_SSC] = &usb_100_no_ssc_rx_ln_vals,
4191                     [EXTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals,
4192                     [INTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals,
4193                 },
4194                 [TYPE_PCIE] = {
4195                     [NO_SSC] = &usb_100_no_ssc_rx_ln_vals,
4196                     [EXTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals,
4197                     [INTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals,
4198                 },
4199                 [TYPE_SGMII] = {
4200                     [NO_SSC] = &usb_100_no_ssc_rx_ln_vals,
4201                     [EXTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals,
4202                     [INTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals,
4203                 },
4204                 [TYPE_QSGMII] = {
4205                     [NO_SSC] = &usb_100_no_ssc_rx_ln_vals,
4206                     [EXTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals,
4207                     [INTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals,
4208                 },
4209             },
4210         },
4211     },
4212 };
4213 
4214 static const struct cdns_torrent_data ti_j721e_map_torrent = {
4215     .block_offset_shift = 0x0,
4216     .reg_offset_shift = 0x1,
4217     .link_cmn_vals = {
4218         [TYPE_DP] = {
4219             [TYPE_NONE] = {
4220                 [NO_SSC] = &sl_dp_link_cmn_vals,
4221             },
4222         },
4223         [TYPE_PCIE] = {
4224             [TYPE_NONE] = {
4225                 [NO_SSC] = NULL,
4226                 [EXTERNAL_SSC] = NULL,
4227                 [INTERNAL_SSC] = NULL,
4228             },
4229             [TYPE_SGMII] = {
4230                 [NO_SSC] = &pcie_sgmii_link_cmn_vals,
4231                 [EXTERNAL_SSC] = &pcie_sgmii_link_cmn_vals,
4232                 [INTERNAL_SSC] = &pcie_sgmii_link_cmn_vals,
4233             },
4234             [TYPE_QSGMII] = {
4235                 [NO_SSC] = &pcie_sgmii_link_cmn_vals,
4236                 [EXTERNAL_SSC] = &pcie_sgmii_link_cmn_vals,
4237                 [INTERNAL_SSC] = &pcie_sgmii_link_cmn_vals,
4238             },
4239             [TYPE_USB] = {
4240                 [NO_SSC] = &pcie_usb_link_cmn_vals,
4241                 [EXTERNAL_SSC] = &pcie_usb_link_cmn_vals,
4242                 [INTERNAL_SSC] = &pcie_usb_link_cmn_vals,
4243             },
4244         },
4245         [TYPE_SGMII] = {
4246             [TYPE_NONE] = {
4247                 [NO_SSC] = &sl_sgmii_link_cmn_vals,
4248             },
4249             [TYPE_PCIE] = {
4250                 [NO_SSC] = &pcie_sgmii_link_cmn_vals,
4251                 [EXTERNAL_SSC] = &pcie_sgmii_link_cmn_vals,
4252                 [INTERNAL_SSC] = &pcie_sgmii_link_cmn_vals,
4253             },
4254             [TYPE_USB] = {
4255                 [NO_SSC] = &usb_sgmii_link_cmn_vals,
4256                 [EXTERNAL_SSC] = &usb_sgmii_link_cmn_vals,
4257                 [INTERNAL_SSC] = &usb_sgmii_link_cmn_vals,
4258             },
4259         },
4260         [TYPE_QSGMII] = {
4261             [TYPE_NONE] = {
4262                 [NO_SSC] = &sl_sgmii_link_cmn_vals,
4263             },
4264             [TYPE_PCIE] = {
4265                 [NO_SSC] = &pcie_sgmii_link_cmn_vals,
4266                 [EXTERNAL_SSC] = &pcie_sgmii_link_cmn_vals,
4267                 [INTERNAL_SSC] = &pcie_sgmii_link_cmn_vals,
4268             },
4269             [TYPE_USB] = {
4270                 [NO_SSC] = &usb_sgmii_link_cmn_vals,
4271                 [EXTERNAL_SSC] = &usb_sgmii_link_cmn_vals,
4272                 [INTERNAL_SSC] = &usb_sgmii_link_cmn_vals,
4273             },
4274         },
4275         [TYPE_USB] = {
4276             [TYPE_NONE] = {
4277                 [NO_SSC] = &sl_usb_link_cmn_vals,
4278                 [EXTERNAL_SSC] = &sl_usb_link_cmn_vals,
4279                 [INTERNAL_SSC] = &sl_usb_link_cmn_vals,
4280             },
4281             [TYPE_PCIE] = {
4282                 [NO_SSC] = &pcie_usb_link_cmn_vals,
4283                 [EXTERNAL_SSC] = &pcie_usb_link_cmn_vals,
4284                 [INTERNAL_SSC] = &pcie_usb_link_cmn_vals,
4285             },
4286             [TYPE_SGMII] = {
4287                 [NO_SSC] = &usb_sgmii_link_cmn_vals,
4288                 [EXTERNAL_SSC] = &usb_sgmii_link_cmn_vals,
4289                 [INTERNAL_SSC] = &usb_sgmii_link_cmn_vals,
4290             },
4291             [TYPE_QSGMII] = {
4292                 [NO_SSC] = &usb_sgmii_link_cmn_vals,
4293                 [EXTERNAL_SSC] = &usb_sgmii_link_cmn_vals,
4294                 [INTERNAL_SSC] = &usb_sgmii_link_cmn_vals,
4295             },
4296         },
4297     },
4298     .xcvr_diag_vals = {
4299         [TYPE_DP] = {
4300             [TYPE_NONE] = {
4301                 [NO_SSC] = &sl_dp_xcvr_diag_ln_vals,
4302             },
4303         },
4304         [TYPE_PCIE] = {
4305             [TYPE_NONE] = {
4306                 [NO_SSC] = NULL,
4307                 [EXTERNAL_SSC] = NULL,
4308                 [INTERNAL_SSC] = NULL,
4309             },
4310             [TYPE_SGMII] = {
4311                 [NO_SSC] = &pcie_sgmii_xcvr_diag_ln_vals,
4312                 [EXTERNAL_SSC] = &pcie_sgmii_xcvr_diag_ln_vals,
4313                 [INTERNAL_SSC] = &pcie_sgmii_xcvr_diag_ln_vals,
4314             },
4315             [TYPE_QSGMII] = {
4316                 [NO_SSC] = &pcie_sgmii_xcvr_diag_ln_vals,
4317                 [EXTERNAL_SSC] = &pcie_sgmii_xcvr_diag_ln_vals,
4318                 [INTERNAL_SSC] = &pcie_sgmii_xcvr_diag_ln_vals,
4319             },
4320             [TYPE_USB] = {
4321                 [NO_SSC] = &pcie_usb_xcvr_diag_ln_vals,
4322                 [EXTERNAL_SSC] = &pcie_usb_xcvr_diag_ln_vals,
4323                 [INTERNAL_SSC] = &pcie_usb_xcvr_diag_ln_vals,
4324             },
4325         },
4326         [TYPE_SGMII] = {
4327             [TYPE_NONE] = {
4328                 [NO_SSC] = &sl_sgmii_xcvr_diag_ln_vals,
4329             },
4330             [TYPE_PCIE] = {
4331                 [NO_SSC] = &sgmii_pcie_xcvr_diag_ln_vals,
4332                 [EXTERNAL_SSC] = &sgmii_pcie_xcvr_diag_ln_vals,
4333                 [INTERNAL_SSC] = &sgmii_pcie_xcvr_diag_ln_vals,
4334             },
4335             [TYPE_USB] = {
4336                 [NO_SSC] = &sgmii_usb_xcvr_diag_ln_vals,
4337                 [EXTERNAL_SSC] = &sgmii_usb_xcvr_diag_ln_vals,
4338                 [INTERNAL_SSC] = &sgmii_usb_xcvr_diag_ln_vals,
4339             },
4340         },
4341         [TYPE_QSGMII] = {
4342             [TYPE_NONE] = {
4343                 [NO_SSC] = &sl_sgmii_xcvr_diag_ln_vals,
4344             },
4345             [TYPE_PCIE] = {
4346                 [NO_SSC] = &sgmii_pcie_xcvr_diag_ln_vals,
4347                 [EXTERNAL_SSC] = &sgmii_pcie_xcvr_diag_ln_vals,
4348                 [INTERNAL_SSC] = &sgmii_pcie_xcvr_diag_ln_vals,
4349             },
4350             [TYPE_USB] = {
4351                 [NO_SSC] = &sgmii_usb_xcvr_diag_ln_vals,
4352                 [EXTERNAL_SSC] = &sgmii_usb_xcvr_diag_ln_vals,
4353                 [INTERNAL_SSC] = &sgmii_usb_xcvr_diag_ln_vals,
4354             },
4355         },
4356         [TYPE_USB] = {
4357             [TYPE_NONE] = {
4358                 [NO_SSC] = &sl_usb_xcvr_diag_ln_vals,
4359                 [EXTERNAL_SSC] = &sl_usb_xcvr_diag_ln_vals,
4360                 [INTERNAL_SSC] = &sl_usb_xcvr_diag_ln_vals,
4361             },
4362             [TYPE_PCIE] = {
4363                 [NO_SSC] = &usb_pcie_xcvr_diag_ln_vals,
4364                 [EXTERNAL_SSC] = &usb_pcie_xcvr_diag_ln_vals,
4365                 [INTERNAL_SSC] = &usb_pcie_xcvr_diag_ln_vals,
4366             },
4367             [TYPE_SGMII] = {
4368                 [NO_SSC] = &usb_sgmii_xcvr_diag_ln_vals,
4369                 [EXTERNAL_SSC] = &usb_sgmii_xcvr_diag_ln_vals,
4370                 [INTERNAL_SSC] = &usb_sgmii_xcvr_diag_ln_vals,
4371             },
4372             [TYPE_QSGMII] = {
4373                 [NO_SSC] = &usb_sgmii_xcvr_diag_ln_vals,
4374                 [EXTERNAL_SSC] = &usb_sgmii_xcvr_diag_ln_vals,
4375                 [INTERNAL_SSC] = &usb_sgmii_xcvr_diag_ln_vals,
4376             },
4377         },
4378     },
4379     .pcs_cmn_vals = {
4380         [TYPE_USB] = {
4381             [TYPE_NONE] = {
4382                 [NO_SSC] = &usb_phy_pcs_cmn_vals,
4383                 [EXTERNAL_SSC] = &usb_phy_pcs_cmn_vals,
4384                 [INTERNAL_SSC] = &usb_phy_pcs_cmn_vals,
4385             },
4386             [TYPE_PCIE] = {
4387                 [NO_SSC] = &usb_phy_pcs_cmn_vals,
4388                 [EXTERNAL_SSC] = &usb_phy_pcs_cmn_vals,
4389                 [INTERNAL_SSC] = &usb_phy_pcs_cmn_vals,
4390             },
4391             [TYPE_SGMII] = {
4392                 [NO_SSC] = &usb_phy_pcs_cmn_vals,
4393                 [EXTERNAL_SSC] = &usb_phy_pcs_cmn_vals,
4394                 [INTERNAL_SSC] = &usb_phy_pcs_cmn_vals,
4395             },
4396             [TYPE_QSGMII] = {
4397                 [NO_SSC] = &usb_phy_pcs_cmn_vals,
4398                 [EXTERNAL_SSC] = &usb_phy_pcs_cmn_vals,
4399                 [INTERNAL_SSC] = &usb_phy_pcs_cmn_vals,
4400             },
4401         },
4402     },
4403     .cmn_vals = {
4404         [CLK_19_2_MHZ] = {
4405             [TYPE_DP] = {
4406                 [TYPE_NONE] = {
4407                     [NO_SSC] = &sl_dp_19_2_no_ssc_cmn_vals,
4408                 },
4409             },
4410         },
4411         [CLK_25_MHZ] = {
4412             [TYPE_DP] = {
4413                 [TYPE_NONE] = {
4414                     [NO_SSC] = &sl_dp_25_no_ssc_cmn_vals,
4415                 },
4416             },
4417         },
4418         [CLK_100_MHZ] = {
4419             [TYPE_DP] = {
4420                 [TYPE_NONE] = {
4421                     [NO_SSC] = &sl_dp_100_no_ssc_cmn_vals,
4422                 },
4423             },
4424             [TYPE_PCIE] = {
4425                 [TYPE_NONE] = {
4426                     [NO_SSC] = NULL,
4427                     [EXTERNAL_SSC] = NULL,
4428                     [INTERNAL_SSC] = &sl_pcie_100_int_ssc_cmn_vals,
4429                 },
4430                 [TYPE_SGMII] = {
4431                     [NO_SSC] = &pcie_100_no_ssc_cmn_vals,
4432                     [EXTERNAL_SSC] = &pcie_100_no_ssc_cmn_vals,
4433                     [INTERNAL_SSC] = &pcie_100_int_ssc_cmn_vals,
4434                 },
4435                 [TYPE_QSGMII] = {
4436                     [NO_SSC] = &pcie_100_no_ssc_cmn_vals,
4437                     [EXTERNAL_SSC] = &pcie_100_no_ssc_cmn_vals,
4438                     [INTERNAL_SSC] = &pcie_100_int_ssc_cmn_vals,
4439                 },
4440                 [TYPE_USB] = {
4441                     [NO_SSC] = &pcie_100_no_ssc_cmn_vals,
4442                     [EXTERNAL_SSC] = &pcie_100_no_ssc_cmn_vals,
4443                     [INTERNAL_SSC] = &pcie_100_int_ssc_cmn_vals,
4444                 },
4445             },
4446             [TYPE_SGMII] = {
4447                 [TYPE_NONE] = {
4448                     [NO_SSC] = &sl_sgmii_100_no_ssc_cmn_vals,
4449                 },
4450                 [TYPE_PCIE] = {
4451                     [NO_SSC] = &sgmii_100_no_ssc_cmn_vals,
4452                     [EXTERNAL_SSC] = &sgmii_100_no_ssc_cmn_vals,
4453                     [INTERNAL_SSC] = &sgmii_100_int_ssc_cmn_vals,
4454                 },
4455                 [TYPE_USB] = {
4456                     [NO_SSC] = &sgmii_100_no_ssc_cmn_vals,
4457                     [EXTERNAL_SSC] = &sgmii_100_no_ssc_cmn_vals,
4458                     [INTERNAL_SSC] = &sgmii_100_no_ssc_cmn_vals,
4459                 },
4460             },
4461             [TYPE_QSGMII] = {
4462                 [TYPE_NONE] = {
4463                     [NO_SSC] = &sl_qsgmii_100_no_ssc_cmn_vals,
4464                 },
4465                 [TYPE_PCIE] = {
4466                     [NO_SSC] = &qsgmii_100_no_ssc_cmn_vals,
4467                     [EXTERNAL_SSC] = &qsgmii_100_no_ssc_cmn_vals,
4468                     [INTERNAL_SSC] = &qsgmii_100_int_ssc_cmn_vals,
4469                 },
4470                 [TYPE_USB] = {
4471                     [NO_SSC] = &qsgmii_100_no_ssc_cmn_vals,
4472                     [EXTERNAL_SSC] = &qsgmii_100_no_ssc_cmn_vals,
4473                     [INTERNAL_SSC] = &qsgmii_100_no_ssc_cmn_vals,
4474                 },
4475             },
4476             [TYPE_USB] = {
4477                 [TYPE_NONE] = {
4478                     [NO_SSC] = &sl_usb_100_no_ssc_cmn_vals,
4479                     [EXTERNAL_SSC] = &sl_usb_100_no_ssc_cmn_vals,
4480                     [INTERNAL_SSC] = &sl_usb_100_int_ssc_cmn_vals,
4481                 },
4482                 [TYPE_PCIE] = {
4483                     [NO_SSC] = &usb_100_no_ssc_cmn_vals,
4484                     [EXTERNAL_SSC] = &usb_100_no_ssc_cmn_vals,
4485                     [INTERNAL_SSC] = &usb_100_int_ssc_cmn_vals,
4486                 },
4487                 [TYPE_SGMII] = {
4488                     [NO_SSC] = &sl_usb_100_no_ssc_cmn_vals,
4489                     [EXTERNAL_SSC] = &sl_usb_100_no_ssc_cmn_vals,
4490                     [INTERNAL_SSC] = &sl_usb_100_int_ssc_cmn_vals,
4491                 },
4492                 [TYPE_QSGMII] = {
4493                     [NO_SSC] = &sl_usb_100_no_ssc_cmn_vals,
4494                     [EXTERNAL_SSC] = &sl_usb_100_no_ssc_cmn_vals,
4495                     [INTERNAL_SSC] = &sl_usb_100_int_ssc_cmn_vals,
4496                 },
4497             },
4498         },
4499     },
4500     .tx_ln_vals = {
4501         [CLK_19_2_MHZ] = {
4502             [TYPE_DP] = {
4503                 [TYPE_NONE] = {
4504                     [NO_SSC] = &sl_dp_19_2_no_ssc_tx_ln_vals,
4505                 },
4506             },
4507         },
4508         [CLK_25_MHZ] = {
4509             [TYPE_DP] = {
4510                 [TYPE_NONE] = {
4511                     [NO_SSC] = &sl_dp_25_no_ssc_tx_ln_vals,
4512                 },
4513             },
4514         },
4515         [CLK_100_MHZ] = {
4516             [TYPE_DP] = {
4517                 [TYPE_NONE] = {
4518                     [NO_SSC] = &sl_dp_100_no_ssc_tx_ln_vals,
4519                 },
4520             },
4521             [TYPE_PCIE] = {
4522                 [TYPE_NONE] = {
4523                     [NO_SSC] = NULL,
4524                     [EXTERNAL_SSC] = NULL,
4525                     [INTERNAL_SSC] = NULL,
4526                 },
4527                 [TYPE_SGMII] = {
4528                     [NO_SSC] = NULL,
4529                     [EXTERNAL_SSC] = NULL,
4530                     [INTERNAL_SSC] = NULL,
4531                 },
4532                 [TYPE_QSGMII] = {
4533                     [NO_SSC] = NULL,
4534                     [EXTERNAL_SSC] = NULL,
4535                     [INTERNAL_SSC] = NULL,
4536                 },
4537                 [TYPE_USB] = {
4538                     [NO_SSC] = NULL,
4539                     [EXTERNAL_SSC] = NULL,
4540                     [INTERNAL_SSC] = NULL,
4541                 },
4542             },
4543             [TYPE_SGMII] = {
4544                 [TYPE_NONE] = {
4545                     [NO_SSC] = &ti_sgmii_100_no_ssc_tx_ln_vals,
4546                 },
4547                 [TYPE_PCIE] = {
4548                     [NO_SSC] = &ti_sgmii_100_no_ssc_tx_ln_vals,
4549                     [EXTERNAL_SSC] = &ti_sgmii_100_no_ssc_tx_ln_vals,
4550                     [INTERNAL_SSC] = &ti_sgmii_100_no_ssc_tx_ln_vals,
4551                 },
4552                 [TYPE_USB] = {
4553                     [NO_SSC] = &ti_sgmii_100_no_ssc_tx_ln_vals,
4554                     [EXTERNAL_SSC] = &ti_sgmii_100_no_ssc_tx_ln_vals,
4555                     [INTERNAL_SSC] = &ti_sgmii_100_no_ssc_tx_ln_vals,
4556                 },
4557             },
4558             [TYPE_QSGMII] = {
4559                 [TYPE_NONE] = {
4560                     [NO_SSC] = &ti_qsgmii_100_no_ssc_tx_ln_vals,
4561                 },
4562                 [TYPE_PCIE] = {
4563                     [NO_SSC] = &ti_qsgmii_100_no_ssc_tx_ln_vals,
4564                     [EXTERNAL_SSC] = &ti_qsgmii_100_no_ssc_tx_ln_vals,
4565                     [INTERNAL_SSC] = &ti_qsgmii_100_no_ssc_tx_ln_vals,
4566                 },
4567                 [TYPE_USB] = {
4568                     [NO_SSC] = &ti_qsgmii_100_no_ssc_tx_ln_vals,
4569                     [EXTERNAL_SSC] = &ti_qsgmii_100_no_ssc_tx_ln_vals,
4570                     [INTERNAL_SSC] = &ti_qsgmii_100_no_ssc_tx_ln_vals,
4571                 },
4572             },
4573             [TYPE_USB] = {
4574                 [TYPE_NONE] = {
4575                     [NO_SSC] = &usb_100_no_ssc_tx_ln_vals,
4576                     [EXTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals,
4577                     [INTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals,
4578                 },
4579                 [TYPE_PCIE] = {
4580                     [NO_SSC] = &usb_100_no_ssc_tx_ln_vals,
4581                     [EXTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals,
4582                     [INTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals,
4583                 },
4584                 [TYPE_SGMII] = {
4585                     [NO_SSC] = &usb_100_no_ssc_tx_ln_vals,
4586                     [EXTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals,
4587                     [INTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals,
4588                 },
4589                 [TYPE_QSGMII] = {
4590                     [NO_SSC] = &usb_100_no_ssc_tx_ln_vals,
4591                     [EXTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals,
4592                     [INTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals,
4593                 },
4594             },
4595         },
4596     },
4597     .rx_ln_vals = {
4598         [CLK_19_2_MHZ] = {
4599             [TYPE_DP] = {
4600                 [TYPE_NONE] = {
4601                     [NO_SSC] = &sl_dp_19_2_no_ssc_rx_ln_vals,
4602                 },
4603             },
4604         },
4605         [CLK_25_MHZ] = {
4606             [TYPE_DP] = {
4607                 [TYPE_NONE] = {
4608                     [NO_SSC] = &sl_dp_25_no_ssc_rx_ln_vals,
4609                 },
4610             },
4611         },
4612         [CLK_100_MHZ] = {
4613             [TYPE_DP] = {
4614                 [TYPE_NONE] = {
4615                     [NO_SSC] = &sl_dp_100_no_ssc_rx_ln_vals,
4616                 },
4617             },
4618             [TYPE_PCIE] = {
4619                 [TYPE_NONE] = {
4620                     [NO_SSC] = &pcie_100_no_ssc_rx_ln_vals,
4621                     [EXTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals,
4622                     [INTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals,
4623                 },
4624                 [TYPE_SGMII] = {
4625                     [NO_SSC] = &pcie_100_no_ssc_rx_ln_vals,
4626                     [EXTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals,
4627                     [INTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals,
4628                 },
4629                 [TYPE_QSGMII] = {
4630                     [NO_SSC] = &pcie_100_no_ssc_rx_ln_vals,
4631                     [EXTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals,
4632                     [INTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals,
4633                 },
4634                 [TYPE_USB] = {
4635                     [NO_SSC] = &pcie_100_no_ssc_rx_ln_vals,
4636                     [EXTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals,
4637                     [INTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals,
4638                 },
4639             },
4640             [TYPE_SGMII] = {
4641                 [TYPE_NONE] = {
4642                     [NO_SSC] = &sgmii_100_no_ssc_rx_ln_vals,
4643                 },
4644                 [TYPE_PCIE] = {
4645                     [NO_SSC] = &sgmii_100_no_ssc_rx_ln_vals,
4646                     [EXTERNAL_SSC] = &sgmii_100_no_ssc_rx_ln_vals,
4647                     [INTERNAL_SSC] = &sgmii_100_no_ssc_rx_ln_vals,
4648                 },
4649                 [TYPE_USB] = {
4650                     [NO_SSC] = &sgmii_100_no_ssc_rx_ln_vals,
4651                     [EXTERNAL_SSC] = &sgmii_100_no_ssc_rx_ln_vals,
4652                     [INTERNAL_SSC] = &sgmii_100_no_ssc_rx_ln_vals,
4653                 },
4654             },
4655             [TYPE_QSGMII] = {
4656                 [TYPE_NONE] = {
4657                     [NO_SSC] = &qsgmii_100_no_ssc_rx_ln_vals,
4658                 },
4659                 [TYPE_PCIE] = {
4660                     [NO_SSC] = &qsgmii_100_no_ssc_rx_ln_vals,
4661                     [EXTERNAL_SSC] = &qsgmii_100_no_ssc_rx_ln_vals,
4662                     [INTERNAL_SSC] = &qsgmii_100_no_ssc_rx_ln_vals,
4663                 },
4664                 [TYPE_USB] = {
4665                     [NO_SSC] = &qsgmii_100_no_ssc_rx_ln_vals,
4666                     [EXTERNAL_SSC] = &qsgmii_100_no_ssc_rx_ln_vals,
4667                     [INTERNAL_SSC] = &qsgmii_100_no_ssc_rx_ln_vals,
4668                 },
4669             },
4670             [TYPE_USB] = {
4671                 [TYPE_NONE] = {
4672                     [NO_SSC] = &usb_100_no_ssc_rx_ln_vals,
4673                     [EXTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals,
4674                     [INTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals,
4675                 },
4676                 [TYPE_PCIE] = {
4677                     [NO_SSC] = &usb_100_no_ssc_rx_ln_vals,
4678                     [EXTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals,
4679                     [INTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals,
4680                 },
4681                 [TYPE_SGMII] = {
4682                     [NO_SSC] = &usb_100_no_ssc_rx_ln_vals,
4683                     [EXTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals,
4684                     [INTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals,
4685                 },
4686                 [TYPE_QSGMII] = {
4687                     [NO_SSC] = &usb_100_no_ssc_rx_ln_vals,
4688                     [EXTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals,
4689                     [INTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals,
4690                 },
4691             },
4692         },
4693     },
4694 };
4695 
4696 static const struct of_device_id cdns_torrent_phy_of_match[] = {
4697     {
4698         .compatible = "cdns,torrent-phy",
4699         .data = &cdns_map_torrent,
4700     },
4701     {
4702         .compatible = "ti,j721e-serdes-10g",
4703         .data = &ti_j721e_map_torrent,
4704     },
4705     {}
4706 };
4707 MODULE_DEVICE_TABLE(of, cdns_torrent_phy_of_match);
4708 
4709 static struct platform_driver cdns_torrent_phy_driver = {
4710     .probe  = cdns_torrent_phy_probe,
4711     .remove = cdns_torrent_phy_remove,
4712     .driver = {
4713         .name   = "cdns-torrent-phy",
4714         .of_match_table = cdns_torrent_phy_of_match,
4715     }
4716 };
4717 module_platform_driver(cdns_torrent_phy_driver);
4718 
4719 MODULE_AUTHOR("Cadence Design Systems, Inc.");
4720 MODULE_DESCRIPTION("Cadence Torrent PHY driver");
4721 MODULE_LICENSE("GPL v2");