Merge tag 'phy-for-6.5_v2' of git://git.kernel.org/pub/scm/linux/kernel/git/phy/linux-phy
[linux-2.6-microblaze.git] / drivers / phy / cadence / phy-cadence-torrent.c
index 62e59d1..37b6b5c 100644 (file)
@@ -38,6 +38,9 @@
 #define POLL_TIMEOUT_US                5000
 #define PLL_LOCK_TIMEOUT       100000
 
+#define DP_PLL0                        BIT(0)
+#define DP_PLL1                        BIT(1)
+
 #define TORRENT_COMMON_CDB_OFFSET      0x0
 
 #define TORRENT_TX_LANE_CDB_OFFSET(ln, block_offset, reg_offset)       \
  */
 #define PHY_AUX_CTRL                   0x04
 #define PHY_RESET                      0x20
-#define PMA_TX_ELEC_IDLE_MASK          0xF0U
 #define PMA_TX_ELEC_IDLE_SHIFT         4
-#define PHY_L00_RESET_N_MASK           0x01U
 #define PHY_PMA_XCVR_PLLCLK_EN         0x24
 #define PHY_PMA_XCVR_PLLCLK_EN_ACK     0x28
 #define PHY_PMA_XCVR_POWER_STATE_REQ   0x2c
-#define PHY_POWER_STATE_LN_0   0x0000
-#define PHY_POWER_STATE_LN_1   0x0008
-#define PHY_POWER_STATE_LN_2   0x0010
-#define PHY_POWER_STATE_LN_3   0x0018
+#define PHY_POWER_STATE_LN(ln)         ((ln) * 8)
 #define PMA_XCVR_POWER_STATE_REQ_LN_MASK       0x3FU
 #define PHY_PMA_XCVR_POWER_STATE_ACK   0x30
 #define PHY_PMA_CMN_READY              0x34
@@ -323,6 +321,7 @@ struct cdns_torrent_phy {
        void __iomem *base;     /* DPTX registers base */
        void __iomem *sd_base; /* SD0801 registers base */
        u32 max_bit_rate; /* Maximum link bit rate to use (in Mbps) */
+       u32 dp_pll;
        struct reset_control *phy_rst;
        struct reset_control *apb_rst;
        struct device *dev;
@@ -905,88 +904,129 @@ void cdns_torrent_dp_pma_cmn_vco_cfg_100mhz(struct cdns_torrent_phy *cdns_phy,
        /* Setting VCO for 10.8GHz */
        case 2700:
        case 5400:
-               cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CP_PADJ_M0, 0x0028);
-               cdns_torrent_phy_write(regmap, CMN_PLL0_DSM_FBH_OVRD_M0, 0x0022);
-               cdns_torrent_phy_write(regmap, CMN_PLL1_DSM_FBH_OVRD_M0, 0x0022);
-               cdns_torrent_phy_write(regmap, CMN_PLL1_DSM_FBL_OVRD_M0, 0x000C);
+               if (cdns_phy->dp_pll & DP_PLL0)
+                       cdns_torrent_phy_write(regmap, CMN_PLL0_DSM_FBH_OVRD_M0, 0x0022);
+
+               if (cdns_phy->dp_pll & DP_PLL1) {
+                       cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CP_PADJ_M0, 0x0028);
+                       cdns_torrent_phy_write(regmap, CMN_PLL1_DSM_FBH_OVRD_M0, 0x0022);
+                       cdns_torrent_phy_write(regmap, CMN_PLL1_DSM_FBL_OVRD_M0, 0x000C);
+               }
                break;
        /* Setting VCO for 9.72GHz */
        case 1620:
        case 2430:
        case 3240:
-               cdns_torrent_phy_write(regmap, CMN_PLL0_DSM_DIAG_M0, 0x0004);
-               cdns_torrent_phy_write(regmap, CMN_PLL1_DSM_DIAG_M0, 0x0004);
-               cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CP_PADJ_M0, 0x0509);
-               cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CP_PADJ_M0, 0x0509);
-               cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CP_IADJ_M0, 0x0F00);
-               cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CP_IADJ_M0, 0x0F00);
-               cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_FILT_PADJ_M0, 0x0F08);
-               cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_FILT_PADJ_M0, 0x0F08);
-               cdns_torrent_phy_write(regmap, CMN_PLL0_INTDIV_M0, 0x0061);
-               cdns_torrent_phy_write(regmap, CMN_PLL1_INTDIV_M0, 0x0061);
-               cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVL_M0, 0x3333);
-               cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVL_M0, 0x3333);
-               cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVH_M0, 0x0002);
-               cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVH_M0, 0x0002);
-               cdns_torrent_phy_write(regmap, CMN_PLL0_HIGH_THR_M0, 0x0042);
-               cdns_torrent_phy_write(regmap, CMN_PLL1_HIGH_THR_M0, 0x0042);
-               cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CTRL_M0, 0x0002);
-               cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CTRL_M0, 0x0002);
+               if (cdns_phy->dp_pll & DP_PLL0) {
+                       cdns_torrent_phy_write(regmap, CMN_PLL0_DSM_DIAG_M0, 0x0004);
+                       cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CP_PADJ_M0, 0x0509);
+                       cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CP_IADJ_M0, 0x0F00);
+                       cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_FILT_PADJ_M0, 0x0F08);
+                       cdns_torrent_phy_write(regmap, CMN_PLL0_INTDIV_M0, 0x0061);
+                       cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVL_M0, 0x3333);
+                       cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVH_M0, 0x0002);
+                       cdns_torrent_phy_write(regmap, CMN_PLL0_HIGH_THR_M0, 0x0042);
+                       cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CTRL_M0, 0x0002);
+               }
+               if (cdns_phy->dp_pll & DP_PLL1) {
+                       cdns_torrent_phy_write(regmap, CMN_PLL1_DSM_DIAG_M0, 0x0004);
+                       cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CP_PADJ_M0, 0x0509);
+                       cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CP_IADJ_M0, 0x0F00);
+                       cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_FILT_PADJ_M0, 0x0F08);
+                       cdns_torrent_phy_write(regmap, CMN_PLL1_INTDIV_M0, 0x0061);
+                       cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVL_M0, 0x3333);
+                       cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVH_M0, 0x0002);
+                       cdns_torrent_phy_write(regmap, CMN_PLL1_HIGH_THR_M0, 0x0042);
+                       cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CTRL_M0, 0x0002);
+               }
                break;
        /* Setting VCO for 8.64GHz */
        case 2160:
        case 4320:
-               cdns_torrent_phy_write(regmap, CMN_PLL0_DSM_DIAG_M0, 0x0004);
-               cdns_torrent_phy_write(regmap, CMN_PLL1_DSM_DIAG_M0, 0x0004);
-               cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CP_PADJ_M0, 0x0509);
-               cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CP_PADJ_M0, 0x0509);
-               cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CP_IADJ_M0, 0x0F00);
-               cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CP_IADJ_M0, 0x0F00);
-               cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_FILT_PADJ_M0, 0x0F08);
-               cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_FILT_PADJ_M0, 0x0F08);
-               cdns_torrent_phy_write(regmap, CMN_PLL0_INTDIV_M0, 0x0056);
-               cdns_torrent_phy_write(regmap, CMN_PLL1_INTDIV_M0, 0x0056);
-               cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVL_M0, 0x6666);
-               cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVL_M0, 0x6666);
-               cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVH_M0, 0x0002);
-               cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVH_M0, 0x0002);
-               cdns_torrent_phy_write(regmap, CMN_PLL0_HIGH_THR_M0, 0x003A);
-               cdns_torrent_phy_write(regmap, CMN_PLL1_HIGH_THR_M0, 0x003A);
-               cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CTRL_M0, 0x0002);
-               cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CTRL_M0, 0x0002);
+               if (cdns_phy->dp_pll & DP_PLL0) {
+                       cdns_torrent_phy_write(regmap, CMN_PLL0_DSM_DIAG_M0, 0x0004);
+                       cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CP_PADJ_M0, 0x0509);
+                       cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CP_IADJ_M0, 0x0F00);
+                       cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_FILT_PADJ_M0, 0x0F08);
+                       cdns_torrent_phy_write(regmap, CMN_PLL0_INTDIV_M0, 0x0056);
+                       cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVL_M0, 0x6666);
+                       cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVH_M0, 0x0002);
+                       cdns_torrent_phy_write(regmap, CMN_PLL0_HIGH_THR_M0, 0x003A);
+                       cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CTRL_M0, 0x0002);
+               }
+               if (cdns_phy->dp_pll & DP_PLL1) {
+                       cdns_torrent_phy_write(regmap, CMN_PLL1_DSM_DIAG_M0, 0x0004);
+                       cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CP_PADJ_M0, 0x0509);
+                       cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CP_IADJ_M0, 0x0F00);
+                       cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_FILT_PADJ_M0, 0x0F08);
+                       cdns_torrent_phy_write(regmap, CMN_PLL1_INTDIV_M0, 0x0056);
+                       cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVL_M0, 0x6666);
+                       cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVH_M0, 0x0002);
+                       cdns_torrent_phy_write(regmap, CMN_PLL1_HIGH_THR_M0, 0x003A);
+                       cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CTRL_M0, 0x0002);
+               }
                break;
        /* Setting VCO for 8.1GHz */
        case 8100:
-               cdns_torrent_phy_write(regmap, CMN_PLL0_DSM_DIAG_M0, 0x0004);
-               cdns_torrent_phy_write(regmap, CMN_PLL1_DSM_DIAG_M0, 0x0004);
-               cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CP_PADJ_M0, 0x0509);
-               cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CP_PADJ_M0, 0x0509);
-               cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CP_IADJ_M0, 0x0F00);
-               cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CP_IADJ_M0, 0x0F00);
-               cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_FILT_PADJ_M0, 0x0F08);
-               cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_FILT_PADJ_M0, 0x0F08);
-               cdns_torrent_phy_write(regmap, CMN_PLL0_INTDIV_M0, 0x0051);
-               cdns_torrent_phy_write(regmap, CMN_PLL1_INTDIV_M0, 0x0051);
-               cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVH_M0, 0x0002);
-               cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVH_M0, 0x0002);
-               cdns_torrent_phy_write(regmap, CMN_PLL0_HIGH_THR_M0, 0x0036);
-               cdns_torrent_phy_write(regmap, CMN_PLL1_HIGH_THR_M0, 0x0036);
-               cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CTRL_M0, 0x0002);
-               cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CTRL_M0, 0x0002);
+               if (cdns_phy->dp_pll & DP_PLL0) {
+                       cdns_torrent_phy_write(regmap, CMN_PLL0_DSM_DIAG_M0, 0x0004);
+                       cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CP_PADJ_M0, 0x0509);
+                       cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CP_IADJ_M0, 0x0F00);
+                       cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_FILT_PADJ_M0, 0x0F08);
+                       cdns_torrent_phy_write(regmap, CMN_PLL0_INTDIV_M0, 0x0051);
+                       cdns_torrent_phy_write(regmap, CMN_PLL0_FRACDIVH_M0, 0x0002);
+                       cdns_torrent_phy_write(regmap, CMN_PLL0_HIGH_THR_M0, 0x0036);
+                       cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL0_CTRL_M0, 0x0002);
+               }
+               if (cdns_phy->dp_pll & DP_PLL1) {
+                       cdns_torrent_phy_write(regmap, CMN_PLL1_DSM_DIAG_M0, 0x0004);
+                       cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CP_PADJ_M0, 0x0509);
+                       cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CP_IADJ_M0, 0x0F00);
+                       cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_FILT_PADJ_M0, 0x0F08);
+                       cdns_torrent_phy_write(regmap, CMN_PLL1_INTDIV_M0, 0x0051);
+                       cdns_torrent_phy_write(regmap, CMN_PLL1_FRACDIVH_M0, 0x0002);
+                       cdns_torrent_phy_write(regmap, CMN_PLL1_HIGH_THR_M0, 0x0036);
+                       cdns_torrent_phy_write(regmap, CMN_PDIAG_PLL1_CTRL_M0, 0x0002);
+               }
                break;
        }
 }
 
+/* Set PLL used for DP configuration */
+static int cdns_torrent_dp_get_pll(struct cdns_torrent_phy *cdns_phy,
+                                  enum cdns_torrent_phy_type phy_t2)
+{
+       switch (phy_t2) {
+       case TYPE_PCIE:
+       case TYPE_USB:
+               cdns_phy->dp_pll = DP_PLL1;
+               break;
+       case TYPE_SGMII:
+       case TYPE_QSGMII:
+               cdns_phy->dp_pll = DP_PLL0;
+               break;
+       case TYPE_NONE:
+               cdns_phy->dp_pll = DP_PLL0 | DP_PLL1;
+               break;
+       default:
+               dev_err(cdns_phy->dev, "Unsupported PHY configuration\n");
+               return -EINVAL;
+       }
+
+       return 0;
+}
+
 /*
  * Enable or disable PLL for selected lanes.
  */
 static int cdns_torrent_dp_set_pll_en(struct cdns_torrent_phy *cdns_phy,
+                                     struct cdns_torrent_inst *inst,
                                      struct phy_configure_opts_dp *dp,
                                      bool enable)
 {
-       u32 rd_val;
-       u32 ret;
        struct regmap *regmap = cdns_phy->regmap_dptx_phy_reg;
+       u32 rd_val, pll_ack_val;
+       int ret;
 
        /*
         * Used to determine, which bits to check for or enable in
@@ -996,28 +1036,18 @@ static int cdns_torrent_dp_set_pll_en(struct cdns_torrent_phy *cdns_phy,
        /* Used to enable or disable lanes. */
        u32 pll_val;
 
-       /* Select values of registers and mask, depending on enabled lane
-        * count.
-        */
-       switch (dp->lanes) {
-       /* lane 0 */
-       case (1):
-               pll_bits = 0x00000001;
-               break;
-       /* lanes 0-1 */
-       case (2):
-               pll_bits = 0x00000003;
-               break;
-       /* lanes 0-3, all */
-       default:
-               pll_bits = 0x0000000F;
-               break;
-       }
+       /* Select values of registers and mask, depending on enabled lane count. */
+       pll_val = cdns_torrent_dp_read(regmap, PHY_PMA_XCVR_PLLCLK_EN);
 
-       if (enable)
-               pll_val = pll_bits;
-       else
-               pll_val = 0x00000000;
+       if (enable) {
+               pll_bits = ((1 << dp->lanes) - 1);
+               pll_val |= pll_bits;
+               pll_ack_val = pll_bits;
+       } else {
+               pll_bits = ((1 << inst->num_lanes) - 1);
+               pll_val &= (~pll_bits);
+               pll_ack_val = 0;
+       }
 
        cdns_torrent_dp_write(regmap, PHY_PMA_XCVR_PLLCLK_EN, pll_val);
 
@@ -1025,22 +1055,23 @@ static int cdns_torrent_dp_set_pll_en(struct cdns_torrent_phy *cdns_phy,
        ret = regmap_read_poll_timeout(regmap,
                                       PHY_PMA_XCVR_PLLCLK_EN_ACK,
                                       rd_val,
-                                      (rd_val & pll_bits) == pll_val,
+                                      (rd_val & pll_bits) == pll_ack_val,
                                       0, POLL_TIMEOUT_US);
        ndelay(100);
        return ret;
 }
 
 static int cdns_torrent_dp_set_power_state(struct cdns_torrent_phy *cdns_phy,
+                                          struct cdns_torrent_inst *inst,
                                           u32 num_lanes,
                                           enum phy_powerstate powerstate)
 {
        /* Register value for power state for a single byte. */
-       u32 value_part;
-       u32 value;
-       u32 mask;
+       u32 value_part, i;
+       u32 value = 0;
+       u32 mask = 0;
        u32 read_val;
-       u32 ret;
+       int ret;
        struct regmap *regmap = cdns_phy->regmap_dptx_phy_reg;
 
        switch (powerstate) {
@@ -1056,29 +1087,11 @@ static int cdns_torrent_dp_set_power_state(struct cdns_torrent_phy *cdns_phy,
                break;
        }
 
-       /* Select values of registers and mask, depending on enabled
-        * lane count.
-        */
-       switch (num_lanes) {
-       /* lane 0 */
-       case (1):
-               value = value_part;
-               mask = 0x0000003FU;
-               break;
-       /* lanes 0-1 */
-       case (2):
-               value = (value_part
-                        | (value_part << 8));
-               mask = 0x00003F3FU;
-               break;
-       /* lanes 0-3, all */
-       default:
-               value = (value_part
-                        | (value_part << 8)
-                        | (value_part << 16)
-                        | (value_part << 24));
-               mask = 0x3F3F3F3FU;
-               break;
+       /* Select values of registers and mask, depending on enabled lane count. */
+
+       for (i = 0; i < num_lanes; i++) {
+               value |= (value_part << PHY_POWER_STATE_LN(i));
+               mask |= (PMA_XCVR_POWER_STATE_REQ_LN_MASK << PHY_POWER_STATE_LN(i));
        }
 
        /* Set power state A<n>. */
@@ -1093,7 +1106,8 @@ static int cdns_torrent_dp_set_power_state(struct cdns_torrent_phy *cdns_phy,
        return ret;
 }
 
-static int cdns_torrent_dp_run(struct cdns_torrent_phy *cdns_phy, u32 num_lanes)
+static int cdns_torrent_dp_run(struct cdns_torrent_phy *cdns_phy,
+                              struct cdns_torrent_inst *inst, u32 num_lanes)
 {
        unsigned int read_val;
        int ret;
@@ -1114,12 +1128,12 @@ static int cdns_torrent_dp_run(struct cdns_torrent_phy *cdns_phy, u32 num_lanes)
 
        ndelay(100);
 
-       ret = cdns_torrent_dp_set_power_state(cdns_phy, num_lanes,
+       ret = cdns_torrent_dp_set_power_state(cdns_phy, inst, num_lanes,
                                              POWERSTATE_A2);
        if (ret)
                return ret;
 
-       ret = cdns_torrent_dp_set_power_state(cdns_phy, num_lanes,
+       ret = cdns_torrent_dp_set_power_state(cdns_phy, inst, num_lanes,
                                              POWERSTATE_A0);
 
        return ret;
@@ -1143,6 +1157,7 @@ static int cdns_torrent_dp_wait_pma_cmn_ready(struct cdns_torrent_phy *cdns_phy)
 }
 
 static void cdns_torrent_dp_pma_cmn_rate(struct cdns_torrent_phy *cdns_phy,
+                                        struct cdns_torrent_inst *inst,
                                         u32 rate, u32 num_lanes)
 {
        unsigned int clk_sel_val = 0;
@@ -1175,14 +1190,17 @@ static void cdns_torrent_dp_pma_cmn_rate(struct cdns_torrent_phy *cdns_phy,
                break;
        }
 
-       cdns_torrent_phy_write(cdns_phy->regmap_common_cdb,
-                              CMN_PDIAG_PLL0_CLK_SEL_M0, clk_sel_val);
-       cdns_torrent_phy_write(cdns_phy->regmap_common_cdb,
-                              CMN_PDIAG_PLL1_CLK_SEL_M0, clk_sel_val);
+       if (cdns_phy->dp_pll & DP_PLL0)
+               cdns_torrent_phy_write(cdns_phy->regmap_common_cdb,
+                                      CMN_PDIAG_PLL0_CLK_SEL_M0, clk_sel_val);
+
+       if (cdns_phy->dp_pll & DP_PLL1)
+               cdns_torrent_phy_write(cdns_phy->regmap_common_cdb,
+                                      CMN_PDIAG_PLL1_CLK_SEL_M0, clk_sel_val);
 
        /* PMA lane configuration to deal with multi-link operation */
        for (i = 0; i < num_lanes; i++)
-               cdns_torrent_phy_write(cdns_phy->regmap_tx_lane_cdb[i],
+               cdns_torrent_phy_write(cdns_phy->regmap_tx_lane_cdb[inst->mlane + i],
                                       XCVR_DIAG_HSCLK_DIV, hsclk_div_val);
 }
 
@@ -1191,23 +1209,44 @@ static void cdns_torrent_dp_pma_cmn_rate(struct cdns_torrent_phy *cdns_phy,
  * set and PLL disable request was processed.
  */
 static int cdns_torrent_dp_configure_rate(struct cdns_torrent_phy *cdns_phy,
+                                         struct cdns_torrent_inst *inst,
                                          struct phy_configure_opts_dp *dp)
 {
-       u32 read_val, ret;
+       u32 read_val, field_val;
+       int ret;
 
-       /* Disable the cmn_pll0_en before re-programming the new data rate. */
-       regmap_field_write(cdns_phy->phy_pma_pll_raw_ctrl, 0x0);
+       /*
+        * Disable the associated PLL (cmn_pll0_en or cmn_pll1_en) before
+        * re-programming the new data rate.
+        */
+       ret = regmap_field_read(cdns_phy->phy_pma_pll_raw_ctrl, &field_val);
+       if (ret)
+               return ret;
+       field_val &= ~(cdns_phy->dp_pll);
+       regmap_field_write(cdns_phy->phy_pma_pll_raw_ctrl, field_val);
 
        /*
         * Wait for PLL ready de-assertion.
         * For PLL0 - PHY_PMA_CMN_CTRL2[2] == 1
+        * For PLL1 - PHY_PMA_CMN_CTRL2[3] == 1
         */
-       ret = regmap_field_read_poll_timeout(cdns_phy->phy_pma_cmn_ctrl_2,
-                                            read_val,
-                                            ((read_val >> 2) & 0x01) != 0,
-                                            0, POLL_TIMEOUT_US);
-       if (ret)
-               return ret;
+       if (cdns_phy->dp_pll & DP_PLL0) {
+               ret = regmap_field_read_poll_timeout(cdns_phy->phy_pma_cmn_ctrl_2,
+                                                    read_val,
+                                                    ((read_val >> 2) & 0x01) != 0,
+                                                    0, POLL_TIMEOUT_US);
+               if (ret)
+                       return ret;
+       }
+
+       if ((cdns_phy->dp_pll & DP_PLL1) && cdns_phy->nsubnodes != 1) {
+               ret = regmap_field_read_poll_timeout(cdns_phy->phy_pma_cmn_ctrl_2,
+                                                    read_val,
+                                                    ((read_val >> 3) & 0x01) != 0,
+                                                    0, POLL_TIMEOUT_US);
+               if (ret)
+                       return ret;
+       }
        ndelay(200);
 
        /* DP Rate Change - VCO Output settings. */
@@ -1221,19 +1260,35 @@ static int cdns_torrent_dp_configure_rate(struct cdns_torrent_phy *cdns_phy,
                /* PMA common configuration 100MHz */
                cdns_torrent_dp_pma_cmn_vco_cfg_100mhz(cdns_phy, dp->link_rate, dp->ssc);
 
-       cdns_torrent_dp_pma_cmn_rate(cdns_phy, dp->link_rate, dp->lanes);
+       cdns_torrent_dp_pma_cmn_rate(cdns_phy, inst, dp->link_rate, dp->lanes);
 
-       /* Enable the cmn_pll0_en. */
-       regmap_field_write(cdns_phy->phy_pma_pll_raw_ctrl, 0x3);
+       /* Enable the associated PLL (cmn_pll0_en or cmn_pll1_en) */
+       ret = regmap_field_read(cdns_phy->phy_pma_pll_raw_ctrl, &field_val);
+       if (ret)
+               return ret;
+       field_val |= cdns_phy->dp_pll;
+       regmap_field_write(cdns_phy->phy_pma_pll_raw_ctrl, field_val);
 
        /*
         * Wait for PLL ready assertion.
         * For PLL0 - PHY_PMA_CMN_CTRL2[0] == 1
+        * For PLL1 - PHY_PMA_CMN_CTRL2[1] == 1
         */
-       ret = regmap_field_read_poll_timeout(cdns_phy->phy_pma_cmn_ctrl_2,
-                                            read_val,
-                                            (read_val & 0x01) != 0,
-                                            0, POLL_TIMEOUT_US);
+       if (cdns_phy->dp_pll & DP_PLL0) {
+               ret = regmap_field_read_poll_timeout(cdns_phy->phy_pma_cmn_ctrl_2,
+                                                    read_val,
+                                                    (read_val & 0x01) != 0,
+                                                    0, POLL_TIMEOUT_US);
+               if (ret)
+                       return ret;
+       }
+
+       if ((cdns_phy->dp_pll & DP_PLL1) && cdns_phy->nsubnodes != 1)
+               ret = regmap_field_read_poll_timeout(cdns_phy->phy_pma_cmn_ctrl_2,
+                                                    read_val,
+                                                    ((read_val >> 1) & 0x01) != 0,
+                                                    0, POLL_TIMEOUT_US);
+
        return ret;
 }
 
@@ -1301,6 +1356,7 @@ static int cdns_torrent_dp_verify_config(struct cdns_torrent_inst *inst,
 
 /* Set power state A0 and PLL clock enable to 0 on enabled lanes. */
 static void cdns_torrent_dp_set_a0_pll(struct cdns_torrent_phy *cdns_phy,
+                                      struct cdns_torrent_inst *inst,
                                       u32 num_lanes)
 {
        struct regmap *regmap = cdns_phy->regmap_dptx_phy_reg;
@@ -1308,27 +1364,13 @@ static void cdns_torrent_dp_set_a0_pll(struct cdns_torrent_phy *cdns_phy,
                                             PHY_PMA_XCVR_POWER_STATE_REQ);
        u32 pll_clk_en = cdns_torrent_dp_read(regmap,
                                              PHY_PMA_XCVR_PLLCLK_EN);
+       u32 i;
 
-       /* Lane 0 is always enabled. */
-       pwr_state &= ~(PMA_XCVR_POWER_STATE_REQ_LN_MASK <<
-                      PHY_POWER_STATE_LN_0);
-       pll_clk_en &= ~0x01U;
-
-       if (num_lanes > 1) {
-               /* lane 1 */
-               pwr_state &= ~(PMA_XCVR_POWER_STATE_REQ_LN_MASK <<
-                              PHY_POWER_STATE_LN_1);
-               pll_clk_en &= ~(0x01U << 1);
-       }
+       for (i = 0; i < num_lanes; i++) {
+               pwr_state &= ~(PMA_XCVR_POWER_STATE_REQ_LN_MASK
+                            << PHY_POWER_STATE_LN(inst->mlane + i));
 
-       if (num_lanes > 2) {
-               /* lanes 2 and 3 */
-               pwr_state &= ~(PMA_XCVR_POWER_STATE_REQ_LN_MASK <<
-                              PHY_POWER_STATE_LN_2);
-               pwr_state &= ~(PMA_XCVR_POWER_STATE_REQ_LN_MASK <<
-                              PHY_POWER_STATE_LN_3);
-               pll_clk_en &= ~(0x01U << 2);
-               pll_clk_en &= ~(0x01U << 3);
+               pll_clk_en &= ~(0x01U << (inst->mlane + i));
        }
 
        cdns_torrent_dp_write(regmap, PHY_PMA_XCVR_POWER_STATE_REQ, pwr_state);
@@ -1337,36 +1379,57 @@ static void cdns_torrent_dp_set_a0_pll(struct cdns_torrent_phy *cdns_phy,
 
 /* Configure lane count as required. */
 static int cdns_torrent_dp_set_lanes(struct cdns_torrent_phy *cdns_phy,
+                                    struct cdns_torrent_inst *inst,
                                     struct phy_configure_opts_dp *dp)
 {
-       u32 value;
-       u32 ret;
+       u32 value, i;
+       int ret;
        struct regmap *regmap = cdns_phy->regmap_dptx_phy_reg;
        u8 lane_mask = (1 << dp->lanes) - 1;
+       u8 pma_tx_elec_idle_mask = 0;
+       u32 clane = inst->mlane;
+
+       lane_mask <<= clane;
 
        value = cdns_torrent_dp_read(regmap, PHY_RESET);
        /* clear pma_tx_elec_idle_ln_* bits. */
-       value &= ~PMA_TX_ELEC_IDLE_MASK;
+       pma_tx_elec_idle_mask = ((1 << inst->num_lanes) - 1) << clane;
+
+       pma_tx_elec_idle_mask <<= PMA_TX_ELEC_IDLE_SHIFT;
+
+       value &= ~pma_tx_elec_idle_mask;
+
        /* Assert pma_tx_elec_idle_ln_* for disabled lanes. */
        value |= ((~lane_mask) << PMA_TX_ELEC_IDLE_SHIFT) &
-                PMA_TX_ELEC_IDLE_MASK;
+                pma_tx_elec_idle_mask;
+
        cdns_torrent_dp_write(regmap, PHY_RESET, value);
 
-       /* reset the link by asserting phy_l00_reset_n low */
+       /* reset the link by asserting master lane phy_l0*_reset_n low */
        cdns_torrent_dp_write(regmap, PHY_RESET,
-                             value & (~PHY_L00_RESET_N_MASK));
+                             value & (~(1 << clane)));
 
        /*
-        * Assert lane reset on unused lanes and lane 0 so they remain in reset
+        * Assert lane reset on unused lanes and master lane so they remain in reset
         * and powered down when re-enabling the link
         */
-       value = (value & 0x0000FFF0) | (0x0000000E & lane_mask);
+       for (i = 0; i < inst->num_lanes; i++)
+               value &= (~(1 << (clane + i)));
+
+       for (i = 1; i < inst->num_lanes; i++)
+               value |= ((1 << (clane + i)) & lane_mask);
+
        cdns_torrent_dp_write(regmap, PHY_RESET, value);
 
-       cdns_torrent_dp_set_a0_pll(cdns_phy, dp->lanes);
+       cdns_torrent_dp_set_a0_pll(cdns_phy, inst, dp->lanes);
 
        /* release phy_l0*_reset_n based on used laneCount */
-       value = (value & 0x0000FFF0) | (0x0000000F & lane_mask);
+       for (i = 0; i < inst->num_lanes; i++)
+               value &= (~(1 << (clane + i)));
+
+       for (i = 0; i < inst->num_lanes; i++)
+               value |= ((1 << (clane + i)) & lane_mask);
+
        cdns_torrent_dp_write(regmap, PHY_RESET, value);
 
        /* Wait, until PHY gets ready after releasing PHY reset signal. */
@@ -1377,41 +1440,44 @@ static int cdns_torrent_dp_set_lanes(struct cdns_torrent_phy *cdns_phy,
        ndelay(100);
 
        /* release pma_xcvr_pllclk_en_ln_*, only for the master lane */
-       cdns_torrent_dp_write(regmap, PHY_PMA_XCVR_PLLCLK_EN, 0x0001);
+       value = cdns_torrent_dp_read(regmap, PHY_PMA_XCVR_PLLCLK_EN);
+       value |= (1 << clane);
+       cdns_torrent_dp_write(regmap, PHY_PMA_XCVR_PLLCLK_EN, value);
 
-       ret = cdns_torrent_dp_run(cdns_phy, dp->lanes);
+       ret = cdns_torrent_dp_run(cdns_phy, inst, dp->lanes);
 
        return ret;
 }
 
 /* Configure link rate as required. */
 static int cdns_torrent_dp_set_rate(struct cdns_torrent_phy *cdns_phy,
+                                   struct cdns_torrent_inst *inst,
                                    struct phy_configure_opts_dp *dp)
 {
-       u32 ret;
+       int ret;
 
-       ret = cdns_torrent_dp_set_power_state(cdns_phy, dp->lanes,
+       ret = cdns_torrent_dp_set_power_state(cdns_phy, inst, dp->lanes,
                                              POWERSTATE_A3);
        if (ret)
                return ret;
-       ret = cdns_torrent_dp_set_pll_en(cdns_phy, dp, false);
+       ret = cdns_torrent_dp_set_pll_en(cdns_phy, inst, dp, false);
        if (ret)
                return ret;
        ndelay(200);
 
-       ret = cdns_torrent_dp_configure_rate(cdns_phy, dp);
+       ret = cdns_torrent_dp_configure_rate(cdns_phy, inst, dp);
        if (ret)
                return ret;
        ndelay(200);
 
-       ret = cdns_torrent_dp_set_pll_en(cdns_phy, dp, true);
+       ret = cdns_torrent_dp_set_pll_en(cdns_phy, inst, dp, true);
        if (ret)
                return ret;
-       ret = cdns_torrent_dp_set_power_state(cdns_phy, dp->lanes,
+       ret = cdns_torrent_dp_set_power_state(cdns_phy, inst, dp->lanes,
                                              POWERSTATE_A2);
        if (ret)
                return ret;
-       ret = cdns_torrent_dp_set_power_state(cdns_phy, dp->lanes,
+       ret = cdns_torrent_dp_set_power_state(cdns_phy, inst, dp->lanes,
                                              POWERSTATE_A0);
        if (ret)
                return ret;
@@ -1422,44 +1488,45 @@ static int cdns_torrent_dp_set_rate(struct cdns_torrent_phy *cdns_phy,
 
 /* Configure voltage swing and pre-emphasis for all enabled lanes. */
 static void cdns_torrent_dp_set_voltages(struct cdns_torrent_phy *cdns_phy,
+                                        struct cdns_torrent_inst *inst,
                                         struct phy_configure_opts_dp *dp)
 {
        u8 lane;
        u16 val;
 
        for (lane = 0; lane < dp->lanes; lane++) {
-               val = cdns_torrent_phy_read(cdns_phy->regmap_tx_lane_cdb[lane],
+               val = cdns_torrent_phy_read(cdns_phy->regmap_tx_lane_cdb[inst->mlane + lane],
                                            TX_DIAG_ACYA);
                /*
                 * Write 1 to register bit TX_DIAG_ACYA[0] to freeze the
                 * current state of the analog TX driver.
                 */
                val |= TX_DIAG_ACYA_HBDC_MASK;
-               cdns_torrent_phy_write(cdns_phy->regmap_tx_lane_cdb[lane],
+               cdns_torrent_phy_write(cdns_phy->regmap_tx_lane_cdb[inst->mlane + lane],
                                       TX_DIAG_ACYA, val);
 
-               cdns_torrent_phy_write(cdns_phy->regmap_tx_lane_cdb[lane],
+               cdns_torrent_phy_write(cdns_phy->regmap_tx_lane_cdb[inst->mlane + lane],
                                       TX_TXCC_CTRL, 0x08A4);
                val = vltg_coeff[dp->voltage[lane]][dp->pre[lane]].diag_tx_drv;
-               cdns_torrent_phy_write(cdns_phy->regmap_tx_lane_cdb[lane],
+               cdns_torrent_phy_write(cdns_phy->regmap_tx_lane_cdb[inst->mlane + lane],
                                       DRV_DIAG_TX_DRV, val);
                val = vltg_coeff[dp->voltage[lane]][dp->pre[lane]].mgnfs_mult;
-               cdns_torrent_phy_write(cdns_phy->regmap_tx_lane_cdb[lane],
+               cdns_torrent_phy_write(cdns_phy->regmap_tx_lane_cdb[inst->mlane + lane],
                                       TX_TXCC_MGNFS_MULT_000,
                                       val);
                val = vltg_coeff[dp->voltage[lane]][dp->pre[lane]].cpost_mult;
-               cdns_torrent_phy_write(cdns_phy->regmap_tx_lane_cdb[lane],
+               cdns_torrent_phy_write(cdns_phy->regmap_tx_lane_cdb[inst->mlane + lane],
                                       TX_TXCC_CPOST_MULT_00,
                                       val);
 
-               val = cdns_torrent_phy_read(cdns_phy->regmap_tx_lane_cdb[lane],
+               val = cdns_torrent_phy_read(cdns_phy->regmap_tx_lane_cdb[inst->mlane + lane],
                                            TX_DIAG_ACYA);
                /*
                 * Write 0 to register bit TX_DIAG_ACYA[0] to allow the state of
                 * analog TX driver to reflect the new programmed one.
                 */
                val &= ~TX_DIAG_ACYA_HBDC_MASK;
-               cdns_torrent_phy_write(cdns_phy->regmap_tx_lane_cdb[lane],
+               cdns_torrent_phy_write(cdns_phy->regmap_tx_lane_cdb[inst->mlane + lane],
                                       TX_DIAG_ACYA, val);
        }
 };
@@ -1478,7 +1545,7 @@ static int cdns_torrent_dp_configure(struct phy *phy,
        }
 
        if (opts->dp.set_lanes) {
-               ret = cdns_torrent_dp_set_lanes(cdns_phy, &opts->dp);
+               ret = cdns_torrent_dp_set_lanes(cdns_phy, inst, &opts->dp);
                if (ret) {
                        dev_err(&phy->dev, "cdns_torrent_dp_set_lanes failed\n");
                        return ret;
@@ -1486,7 +1553,7 @@ static int cdns_torrent_dp_configure(struct phy *phy,
        }
 
        if (opts->dp.set_rate) {
-               ret = cdns_torrent_dp_set_rate(cdns_phy, &opts->dp);
+               ret = cdns_torrent_dp_set_rate(cdns_phy, inst, &opts->dp);
                if (ret) {
                        dev_err(&phy->dev, "cdns_torrent_dp_set_rate failed\n");
                        return ret;
@@ -1494,7 +1561,7 @@ static int cdns_torrent_dp_configure(struct phy *phy,
        }
 
        if (opts->dp.set_voltages)
-               cdns_torrent_dp_set_voltages(cdns_phy, &opts->dp);
+               cdns_torrent_dp_set_voltages(cdns_phy, inst, &opts->dp);
 
        return ret;
 }
@@ -1562,6 +1629,7 @@ static void cdns_torrent_dp_common_init(struct cdns_torrent_phy *cdns_phy,
 {
        struct regmap *regmap = cdns_phy->regmap_dptx_phy_reg;
        unsigned char lane_bits;
+       u32 val;
 
        cdns_torrent_dp_write(regmap, PHY_AUX_CTRL, 0x0003); /* enable AUX */
 
@@ -1569,18 +1637,23 @@ static void cdns_torrent_dp_common_init(struct cdns_torrent_phy *cdns_phy,
         * Set lines power state to A0
         * Set lines pll clk enable to 0
         */
-       cdns_torrent_dp_set_a0_pll(cdns_phy, inst->num_lanes);
+       cdns_torrent_dp_set_a0_pll(cdns_phy, inst, inst->num_lanes);
 
        /*
         * release phy_l0*_reset_n and pma_tx_elec_idle_ln_* based on
         * used lanes
         */
        lane_bits = (1 << inst->num_lanes) - 1;
-       cdns_torrent_dp_write(regmap, PHY_RESET,
-                             ((0xF & ~lane_bits) << 4) | (0xF & lane_bits));
+
+       val = cdns_torrent_dp_read(regmap, PHY_RESET);
+       val |= (0xF & lane_bits);
+       val &= ~(lane_bits << 4);
+       cdns_torrent_dp_write(regmap, PHY_RESET, val);
 
        /* release pma_xcvr_pllclk_en_ln_*, only for the master lane */
-       cdns_torrent_dp_write(regmap, PHY_PMA_XCVR_PLLCLK_EN, 0x0001);
+       val = cdns_torrent_dp_read(regmap, PHY_PMA_XCVR_PLLCLK_EN);
+       val |= 1;
+       cdns_torrent_dp_write(regmap, PHY_PMA_XCVR_PLLCLK_EN, val);
 
        /*
         * PHY PMA registers configuration functions
@@ -1599,7 +1672,7 @@ static void cdns_torrent_dp_common_init(struct cdns_torrent_phy *cdns_phy,
                                                       cdns_phy->max_bit_rate,
                                                       false);
 
-       cdns_torrent_dp_pma_cmn_rate(cdns_phy, cdns_phy->max_bit_rate,
+       cdns_torrent_dp_pma_cmn_rate(cdns_phy, inst, cdns_phy->max_bit_rate,
                                     inst->num_lanes);
 
        /* take out of reset */
@@ -1612,13 +1685,15 @@ static int cdns_torrent_dp_start(struct cdns_torrent_phy *cdns_phy,
 {
        int ret;
 
-       cdns_torrent_phy_on(phy);
+       ret = cdns_torrent_phy_on(phy);
+       if (ret)
+               return ret;
 
        ret = cdns_torrent_dp_wait_pma_cmn_ready(cdns_phy);
        if (ret)
                return ret;
 
-       ret = cdns_torrent_dp_run(cdns_phy, inst->num_lanes);
+       ret = cdns_torrent_dp_run(cdns_phy, inst, inst->num_lanes);
 
        return ret;
 }
@@ -1627,6 +1702,7 @@ static int cdns_torrent_dp_init(struct phy *phy)
 {
        struct cdns_torrent_inst *inst = phy_get_drvdata(phy);
        struct cdns_torrent_phy *cdns_phy = dev_get_drvdata(phy->dev.parent);
+       int ret;
 
        switch (cdns_phy->ref_clk_rate) {
        case CLK_19_2_MHZ:
@@ -1639,6 +1715,24 @@ static int cdns_torrent_dp_init(struct phy *phy)
                return -EINVAL;
        }
 
+       ret = cdns_torrent_dp_get_pll(cdns_phy, TYPE_NONE);
+       if (ret)
+               return ret;
+
+       cdns_torrent_dp_common_init(cdns_phy, inst);
+
+       return cdns_torrent_dp_start(cdns_phy, inst, phy);
+}
+
+static int cdns_torrent_dp_multilink_init(struct cdns_torrent_phy *cdns_phy,
+                                         struct cdns_torrent_inst *inst,
+                                         struct phy *phy)
+{
+       if (cdns_phy->ref_clk_rate != CLK_100_MHZ) {
+               dev_err(cdns_phy->dev, "Unsupported Ref Clock Rate\n");
+               return -EINVAL;
+       }
+
        cdns_torrent_dp_common_init(cdns_phy, inst);
 
        return cdns_torrent_dp_start(cdns_phy, inst, phy);
@@ -2156,8 +2250,11 @@ static int cdns_torrent_phy_init(struct phy *phy)
        u32 num_regs;
        int i, j;
 
-       if (cdns_phy->nsubnodes > 1)
+       if (cdns_phy->nsubnodes > 1) {
+               if (phy_type == TYPE_DP)
+                       return cdns_torrent_dp_multilink_init(cdns_phy, inst, phy);
                return 0;
+       }
 
        /**
         * Spread spectrum generation is not required or supported
@@ -2399,6 +2496,12 @@ int cdns_torrent_phy_configure_multilink(struct cdns_torrent_phy *cdns_phy)
                        }
                }
 
+               if (phy_t1 == TYPE_DP) {
+                       ret = cdns_torrent_dp_get_pll(cdns_phy, phy_t2);
+                       if (ret)
+                               return ret;
+               }
+
                reset_control_deassert(cdns_phy->phys[node].lnk_rst);
        }
 
@@ -2794,6 +2897,109 @@ static void cdns_torrent_phy_remove(struct platform_device *pdev)
        cdns_torrent_clk_cleanup(cdns_phy);
 }
 
+/* USB and DP link configuration */
+static struct cdns_reg_pairs usb_dp_link_cmn_regs[] = {
+       {0x0002, PHY_PLL_CFG},
+       {0x8600, CMN_PDIAG_PLL0_CLK_SEL_M0}
+};
+
+static struct cdns_reg_pairs usb_dp_xcvr_diag_ln_regs[] = {
+       {0x0000, XCVR_DIAG_HSCLK_SEL},
+       {0x0001, XCVR_DIAG_HSCLK_DIV},
+       {0x0041, XCVR_DIAG_PLLDRC_CTRL}
+};
+
+static struct cdns_reg_pairs dp_usb_xcvr_diag_ln_regs[] = {
+       {0x0001, XCVR_DIAG_HSCLK_SEL},
+       {0x0009, XCVR_DIAG_PLLDRC_CTRL}
+};
+
+static struct cdns_torrent_vals usb_dp_link_cmn_vals = {
+       .reg_pairs = usb_dp_link_cmn_regs,
+       .num_regs = ARRAY_SIZE(usb_dp_link_cmn_regs),
+};
+
+static struct cdns_torrent_vals usb_dp_xcvr_diag_ln_vals = {
+       .reg_pairs = usb_dp_xcvr_diag_ln_regs,
+       .num_regs = ARRAY_SIZE(usb_dp_xcvr_diag_ln_regs),
+};
+
+static struct cdns_torrent_vals dp_usb_xcvr_diag_ln_vals = {
+       .reg_pairs = dp_usb_xcvr_diag_ln_regs,
+       .num_regs = ARRAY_SIZE(dp_usb_xcvr_diag_ln_regs),
+};
+
+/* PCIe and DP link configuration */
+static struct cdns_reg_pairs pcie_dp_link_cmn_regs[] = {
+       {0x0003, PHY_PLL_CFG},
+       {0x0601, CMN_PDIAG_PLL0_CLK_SEL_M0},
+       {0x0400, CMN_PDIAG_PLL0_CLK_SEL_M1}
+};
+
+static struct cdns_reg_pairs pcie_dp_xcvr_diag_ln_regs[] = {
+       {0x0000, XCVR_DIAG_HSCLK_SEL},
+       {0x0001, XCVR_DIAG_HSCLK_DIV},
+       {0x0012, XCVR_DIAG_PLLDRC_CTRL}
+};
+
+static struct cdns_reg_pairs dp_pcie_xcvr_diag_ln_regs[] = {
+       {0x0001, XCVR_DIAG_HSCLK_SEL},
+       {0x0009, XCVR_DIAG_PLLDRC_CTRL}
+};
+
+static struct cdns_torrent_vals pcie_dp_link_cmn_vals = {
+       .reg_pairs = pcie_dp_link_cmn_regs,
+       .num_regs = ARRAY_SIZE(pcie_dp_link_cmn_regs),
+};
+
+static struct cdns_torrent_vals pcie_dp_xcvr_diag_ln_vals = {
+       .reg_pairs = pcie_dp_xcvr_diag_ln_regs,
+       .num_regs = ARRAY_SIZE(pcie_dp_xcvr_diag_ln_regs),
+};
+
+static struct cdns_torrent_vals dp_pcie_xcvr_diag_ln_vals = {
+       .reg_pairs = dp_pcie_xcvr_diag_ln_regs,
+       .num_regs = ARRAY_SIZE(dp_pcie_xcvr_diag_ln_regs),
+};
+
+/* DP Multilink, 100 MHz Ref clk, no SSC */
+static struct cdns_reg_pairs dp_100_no_ssc_cmn_regs[] = {
+       {0x007F, CMN_TXPUCAL_TUNE},
+       {0x007F, CMN_TXPDCAL_TUNE}
+};
+
+static struct cdns_reg_pairs dp_100_no_ssc_tx_ln_regs[] = {
+       {0x00FB, TX_PSC_A0},
+       {0x04AA, TX_PSC_A2},
+       {0x04AA, TX_PSC_A3},
+       {0x000F, XCVR_DIAG_BIDI_CTRL}
+};
+
+static struct cdns_reg_pairs dp_100_no_ssc_rx_ln_regs[] = {
+       {0x0000, RX_PSC_A0},
+       {0x0000, RX_PSC_A2},
+       {0x0000, RX_PSC_A3},
+       {0x0000, RX_PSC_CAL},
+       {0x0000, RX_REE_GCSM1_CTRL},
+       {0x0000, RX_REE_GCSM2_CTRL},
+       {0x0000, RX_REE_PERGCSM_CTRL}
+};
+
+static struct cdns_torrent_vals dp_100_no_ssc_cmn_vals = {
+       .reg_pairs = dp_100_no_ssc_cmn_regs,
+       .num_regs = ARRAY_SIZE(dp_100_no_ssc_cmn_regs),
+};
+
+static struct cdns_torrent_vals dp_100_no_ssc_tx_ln_vals = {
+       .reg_pairs = dp_100_no_ssc_tx_ln_regs,
+       .num_regs = ARRAY_SIZE(dp_100_no_ssc_tx_ln_regs),
+};
+
+static struct cdns_torrent_vals dp_100_no_ssc_rx_ln_vals = {
+       .reg_pairs = dp_100_no_ssc_rx_ln_regs,
+       .num_regs = ARRAY_SIZE(dp_100_no_ssc_rx_ln_regs),
+};
+
 /* Single DisplayPort(DP) link configuration */
 static struct cdns_reg_pairs sl_dp_link_cmn_regs[] = {
        {0x0000, PHY_PLL_CFG},
@@ -3736,6 +3942,12 @@ static const struct cdns_torrent_data cdns_map_torrent = {
                        [TYPE_NONE] = {
                                [NO_SSC] = &sl_dp_link_cmn_vals,
                        },
+                       [TYPE_PCIE] = {
+                               [NO_SSC] = &pcie_dp_link_cmn_vals,
+                       },
+                       [TYPE_USB] = {
+                               [NO_SSC] = &usb_dp_link_cmn_vals,
+                       },
                },
                [TYPE_PCIE] = {
                        [TYPE_NONE] = {
@@ -3758,6 +3970,9 @@ static const struct cdns_torrent_data cdns_map_torrent = {
                                [EXTERNAL_SSC] = &pcie_usb_link_cmn_vals,
                                [INTERNAL_SSC] = &pcie_usb_link_cmn_vals,
                        },
+                       [TYPE_DP] = {
+                               [NO_SSC] = &pcie_dp_link_cmn_vals,
+                       },
                },
                [TYPE_SGMII] = {
                        [TYPE_NONE] = {
@@ -3810,6 +4025,9 @@ static const struct cdns_torrent_data cdns_map_torrent = {
                                [EXTERNAL_SSC] = &usb_sgmii_link_cmn_vals,
                                [INTERNAL_SSC] = &usb_sgmii_link_cmn_vals,
                        },
+                       [TYPE_DP] = {
+                               [NO_SSC] = &usb_dp_link_cmn_vals,
+                       },
                },
        },
        .xcvr_diag_vals = {
@@ -3817,6 +4035,12 @@ static const struct cdns_torrent_data cdns_map_torrent = {
                        [TYPE_NONE] = {
                                [NO_SSC] = &sl_dp_xcvr_diag_ln_vals,
                        },
+                       [TYPE_PCIE] = {
+                               [NO_SSC] = &dp_pcie_xcvr_diag_ln_vals,
+                       },
+                       [TYPE_USB] = {
+                               [NO_SSC] = &dp_usb_xcvr_diag_ln_vals,
+                       },
                },
                [TYPE_PCIE] = {
                        [TYPE_NONE] = {
@@ -3839,6 +4063,9 @@ static const struct cdns_torrent_data cdns_map_torrent = {
                                [EXTERNAL_SSC] = &pcie_usb_xcvr_diag_ln_vals,
                                [INTERNAL_SSC] = &pcie_usb_xcvr_diag_ln_vals,
                        },
+                       [TYPE_DP] = {
+                               [NO_SSC] = &pcie_dp_xcvr_diag_ln_vals,
+                       },
                },
                [TYPE_SGMII] = {
                        [TYPE_NONE] = {
@@ -3891,6 +4118,9 @@ static const struct cdns_torrent_data cdns_map_torrent = {
                                [EXTERNAL_SSC] = &usb_sgmii_xcvr_diag_ln_vals,
                                [INTERNAL_SSC] = &usb_sgmii_xcvr_diag_ln_vals,
                        },
+                       [TYPE_DP] = {
+                               [NO_SSC] = &usb_dp_xcvr_diag_ln_vals,
+                       },
                },
        },
        .pcs_cmn_vals = {
@@ -3915,6 +4145,9 @@ static const struct cdns_torrent_data cdns_map_torrent = {
                                [EXTERNAL_SSC] = &usb_phy_pcs_cmn_vals,
                                [INTERNAL_SSC] = &usb_phy_pcs_cmn_vals,
                        },
+                       [TYPE_DP] = {
+                               [NO_SSC] = &usb_phy_pcs_cmn_vals,
+                       },
                },
        },
        .cmn_vals = {
@@ -3937,6 +4170,12 @@ static const struct cdns_torrent_data cdns_map_torrent = {
                                [TYPE_NONE] = {
                                        [NO_SSC] = &sl_dp_100_no_ssc_cmn_vals,
                                },
+                               [TYPE_PCIE] = {
+                                       [NO_SSC] = &dp_100_no_ssc_cmn_vals,
+                               },
+                               [TYPE_USB] = {
+                                       [NO_SSC] = &sl_dp_100_no_ssc_cmn_vals,
+                               },
                        },
                        [TYPE_PCIE] = {
                                [TYPE_NONE] = {
@@ -3959,6 +4198,9 @@ static const struct cdns_torrent_data cdns_map_torrent = {
                                        [EXTERNAL_SSC] = &pcie_100_no_ssc_cmn_vals,
                                        [INTERNAL_SSC] = &pcie_100_int_ssc_cmn_vals,
                                },
+                               [TYPE_DP] = {
+                                       [NO_SSC] = NULL,
+                               },
                        },
                        [TYPE_SGMII] = {
                                [TYPE_NONE] = {
@@ -4011,6 +4253,9 @@ static const struct cdns_torrent_data cdns_map_torrent = {
                                        [EXTERNAL_SSC] = &sl_usb_100_no_ssc_cmn_vals,
                                        [INTERNAL_SSC] = &sl_usb_100_int_ssc_cmn_vals,
                                },
+                               [TYPE_DP] = {
+                                       [NO_SSC] = &usb_100_no_ssc_cmn_vals,
+                               },
                        },
                },
        },
@@ -4034,6 +4279,12 @@ static const struct cdns_torrent_data cdns_map_torrent = {
                                [TYPE_NONE] = {
                                        [NO_SSC] = &sl_dp_100_no_ssc_tx_ln_vals,
                                },
+                               [TYPE_PCIE] = {
+                                       [NO_SSC] = &dp_100_no_ssc_tx_ln_vals,
+                               },
+                               [TYPE_USB] = {
+                                       [NO_SSC] = &dp_100_no_ssc_tx_ln_vals,
+                               },
                        },
                        [TYPE_PCIE] = {
                                [TYPE_NONE] = {
@@ -4056,6 +4307,9 @@ static const struct cdns_torrent_data cdns_map_torrent = {
                                        [EXTERNAL_SSC] = NULL,
                                        [INTERNAL_SSC] = NULL,
                                },
+                               [TYPE_DP] = {
+                                       [NO_SSC] = NULL,
+                               },
                        },
                        [TYPE_SGMII] = {
                                [TYPE_NONE] = {
@@ -4108,6 +4362,9 @@ static const struct cdns_torrent_data cdns_map_torrent = {
                                        [EXTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals,
                                        [INTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals,
                                },
+                               [TYPE_DP] = {
+                                       [NO_SSC] = &usb_100_no_ssc_tx_ln_vals,
+                               },
                        },
                },
        },
@@ -4131,6 +4388,12 @@ static const struct cdns_torrent_data cdns_map_torrent = {
                                [TYPE_NONE] = {
                                        [NO_SSC] = &sl_dp_100_no_ssc_rx_ln_vals,
                                },
+                               [TYPE_PCIE] = {
+                                       [NO_SSC] = &dp_100_no_ssc_rx_ln_vals,
+                               },
+                               [TYPE_USB] = {
+                                       [NO_SSC] = &dp_100_no_ssc_rx_ln_vals,
+                               },
                        },
                        [TYPE_PCIE] = {
                                [TYPE_NONE] = {
@@ -4153,6 +4416,9 @@ static const struct cdns_torrent_data cdns_map_torrent = {
                                        [EXTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals,
                                        [INTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals,
                                },
+                               [TYPE_DP] = {
+                                       [NO_SSC] = &pcie_100_no_ssc_rx_ln_vals,
+                               },
                        },
                        [TYPE_SGMII] = {
                                [TYPE_NONE] = {
@@ -4205,6 +4471,9 @@ static const struct cdns_torrent_data cdns_map_torrent = {
                                        [EXTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals,
                                        [INTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals,
                                },
+                               [TYPE_DP] = {
+                                       [NO_SSC] = &usb_100_no_ssc_rx_ln_vals,
+                               },
                        },
                },
        },
@@ -4218,6 +4487,12 @@ static const struct cdns_torrent_data ti_j721e_map_torrent = {
                        [TYPE_NONE] = {
                                [NO_SSC] = &sl_dp_link_cmn_vals,
                        },
+                       [TYPE_PCIE] = {
+                               [NO_SSC] = &pcie_dp_link_cmn_vals,
+                       },
+                       [TYPE_USB] = {
+                               [NO_SSC] = &usb_dp_link_cmn_vals,
+                       },
                },
                [TYPE_PCIE] = {
                        [TYPE_NONE] = {
@@ -4240,6 +4515,9 @@ static const struct cdns_torrent_data ti_j721e_map_torrent = {
                                [EXTERNAL_SSC] = &pcie_usb_link_cmn_vals,
                                [INTERNAL_SSC] = &pcie_usb_link_cmn_vals,
                        },
+                       [TYPE_DP] = {
+                               [NO_SSC] = &pcie_dp_link_cmn_vals,
+                       },
                },
                [TYPE_SGMII] = {
                        [TYPE_NONE] = {
@@ -4292,6 +4570,9 @@ static const struct cdns_torrent_data ti_j721e_map_torrent = {
                                [EXTERNAL_SSC] = &usb_sgmii_link_cmn_vals,
                                [INTERNAL_SSC] = &usb_sgmii_link_cmn_vals,
                        },
+                       [TYPE_DP] = {
+                               [NO_SSC] = &usb_dp_link_cmn_vals,
+                       },
                },
        },
        .xcvr_diag_vals = {
@@ -4299,6 +4580,12 @@ static const struct cdns_torrent_data ti_j721e_map_torrent = {
                        [TYPE_NONE] = {
                                [NO_SSC] = &sl_dp_xcvr_diag_ln_vals,
                        },
+                       [TYPE_PCIE] = {
+                               [NO_SSC] = &dp_pcie_xcvr_diag_ln_vals,
+                       },
+                       [TYPE_USB] = {
+                               [NO_SSC] = &dp_usb_xcvr_diag_ln_vals,
+                       },
                },
                [TYPE_PCIE] = {
                        [TYPE_NONE] = {
@@ -4321,6 +4608,9 @@ static const struct cdns_torrent_data ti_j721e_map_torrent = {
                                [EXTERNAL_SSC] = &pcie_usb_xcvr_diag_ln_vals,
                                [INTERNAL_SSC] = &pcie_usb_xcvr_diag_ln_vals,
                        },
+                       [TYPE_DP] = {
+                               [NO_SSC] = &pcie_dp_xcvr_diag_ln_vals,
+                       },
                },
                [TYPE_SGMII] = {
                        [TYPE_NONE] = {
@@ -4373,6 +4663,9 @@ static const struct cdns_torrent_data ti_j721e_map_torrent = {
                                [EXTERNAL_SSC] = &usb_sgmii_xcvr_diag_ln_vals,
                                [INTERNAL_SSC] = &usb_sgmii_xcvr_diag_ln_vals,
                        },
+                       [TYPE_DP] = {
+                               [NO_SSC] = &usb_dp_xcvr_diag_ln_vals,
+                       },
                },
        },
        .pcs_cmn_vals = {
@@ -4397,6 +4690,9 @@ static const struct cdns_torrent_data ti_j721e_map_torrent = {
                                [EXTERNAL_SSC] = &usb_phy_pcs_cmn_vals,
                                [INTERNAL_SSC] = &usb_phy_pcs_cmn_vals,
                        },
+                       [TYPE_DP] = {
+                               [NO_SSC] = &usb_phy_pcs_cmn_vals,
+                       },
                },
        },
        .cmn_vals = {
@@ -4419,6 +4715,12 @@ static const struct cdns_torrent_data ti_j721e_map_torrent = {
                                [TYPE_NONE] = {
                                        [NO_SSC] = &sl_dp_100_no_ssc_cmn_vals,
                                },
+                               [TYPE_PCIE] = {
+                                       [NO_SSC] = &dp_100_no_ssc_cmn_vals,
+                               },
+                               [TYPE_USB] = {
+                                       [NO_SSC] = &sl_dp_100_no_ssc_cmn_vals,
+                               },
                        },
                        [TYPE_PCIE] = {
                                [TYPE_NONE] = {
@@ -4441,6 +4743,9 @@ static const struct cdns_torrent_data ti_j721e_map_torrent = {
                                        [EXTERNAL_SSC] = &pcie_100_no_ssc_cmn_vals,
                                        [INTERNAL_SSC] = &pcie_100_int_ssc_cmn_vals,
                                },
+                               [TYPE_DP] = {
+                                       [NO_SSC] = NULL,
+                               },
                        },
                        [TYPE_SGMII] = {
                                [TYPE_NONE] = {
@@ -4493,6 +4798,9 @@ static const struct cdns_torrent_data ti_j721e_map_torrent = {
                                        [EXTERNAL_SSC] = &sl_usb_100_no_ssc_cmn_vals,
                                        [INTERNAL_SSC] = &sl_usb_100_int_ssc_cmn_vals,
                                },
+                               [TYPE_DP] = {
+                                       [NO_SSC] = &usb_100_no_ssc_cmn_vals,
+                               },
                        },
                },
        },
@@ -4516,6 +4824,12 @@ static const struct cdns_torrent_data ti_j721e_map_torrent = {
                                [TYPE_NONE] = {
                                        [NO_SSC] = &sl_dp_100_no_ssc_tx_ln_vals,
                                },
+                               [TYPE_PCIE] = {
+                                       [NO_SSC] = &dp_100_no_ssc_tx_ln_vals,
+                               },
+                               [TYPE_USB] = {
+                                       [NO_SSC] = &dp_100_no_ssc_tx_ln_vals,
+                               },
                        },
                        [TYPE_PCIE] = {
                                [TYPE_NONE] = {
@@ -4538,6 +4852,9 @@ static const struct cdns_torrent_data ti_j721e_map_torrent = {
                                        [EXTERNAL_SSC] = NULL,
                                        [INTERNAL_SSC] = NULL,
                                },
+                               [TYPE_DP] = {
+                                       [NO_SSC] = NULL,
+                               },
                        },
                        [TYPE_SGMII] = {
                                [TYPE_NONE] = {
@@ -4590,6 +4907,9 @@ static const struct cdns_torrent_data ti_j721e_map_torrent = {
                                        [EXTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals,
                                        [INTERNAL_SSC] = &usb_100_no_ssc_tx_ln_vals,
                                },
+                               [TYPE_DP] = {
+                                       [NO_SSC] = &usb_100_no_ssc_tx_ln_vals,
+                               },
                        },
                },
        },
@@ -4613,6 +4933,12 @@ static const struct cdns_torrent_data ti_j721e_map_torrent = {
                                [TYPE_NONE] = {
                                        [NO_SSC] = &sl_dp_100_no_ssc_rx_ln_vals,
                                },
+                               [TYPE_PCIE] = {
+                                       [NO_SSC] = &dp_100_no_ssc_rx_ln_vals,
+                               },
+                               [TYPE_USB] = {
+                                       [NO_SSC] = &dp_100_no_ssc_rx_ln_vals,
+                               },
                        },
                        [TYPE_PCIE] = {
                                [TYPE_NONE] = {
@@ -4635,6 +4961,9 @@ static const struct cdns_torrent_data ti_j721e_map_torrent = {
                                        [EXTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals,
                                        [INTERNAL_SSC] = &pcie_100_no_ssc_rx_ln_vals,
                                },
+                               [TYPE_DP] = {
+                                       [NO_SSC] = &pcie_100_no_ssc_rx_ln_vals,
+                               },
                        },
                        [TYPE_SGMII] = {
                                [TYPE_NONE] = {
@@ -4687,6 +5016,9 @@ static const struct cdns_torrent_data ti_j721e_map_torrent = {
                                        [EXTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals,
                                        [INTERNAL_SSC] = &usb_100_no_ssc_rx_ln_vals,
                                },
+                               [TYPE_DP] = {
+                                       [NO_SSC] = &usb_100_no_ssc_rx_ln_vals,
+                               },
                        },
                },
        },