phy: qcom-qmp-combo: Square out 8550 POWER_STATE_CONFIG1
[platform/kernel/linux-starfive.git] / drivers / phy / qualcomm / phy-qcom-qmp-combo.c
index bebce8c..8fd240d 100644 (file)
@@ -12,7 +12,6 @@
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/of.h>
-#include <linux/of_device.h>
 #include <linux/of_address.h>
 #include <linux/phy/phy.h>
 #include <linux/platform_device.h>
@@ -106,6 +105,20 @@ enum qphy_reg_layout {
        QPHY_PCS_AUTONOMOUS_MODE_CTRL,
        QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR,
        QPHY_PCS_POWER_DOWN_CONTROL,
+
+       QPHY_COM_RESETSM_CNTRL,
+       QPHY_COM_C_READY_STATUS,
+       QPHY_COM_CMN_STATUS,
+       QPHY_COM_BIAS_EN_CLKBUFLR_EN,
+
+       QPHY_DP_PHY_STATUS,
+
+       QPHY_TX_TX_POL_INV,
+       QPHY_TX_TX_DRV_LVL,
+       QPHY_TX_TX_EMP_POST1_LVL,
+       QPHY_TX_HIGHZ_DRVR_EN,
+       QPHY_TX_TRANSCEIVER_BIAS_EN,
+
        /* Keep last to ensure regs_layout arrays are properly initialized */
        QPHY_LAYOUT_SIZE
 };
@@ -117,9 +130,22 @@ static const unsigned int qmp_v3_usb3phy_regs_layout[QPHY_LAYOUT_SIZE] = {
        [QPHY_PCS_POWER_DOWN_CONTROL]   = QPHY_V3_PCS_POWER_DOWN_CONTROL,
        [QPHY_PCS_AUTONOMOUS_MODE_CTRL] = QPHY_V3_PCS_AUTONOMOUS_MODE_CTRL,
        [QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR] = QPHY_V3_PCS_LFPS_RXTERM_IRQ_CLEAR,
+
+       [QPHY_COM_RESETSM_CNTRL]        = QSERDES_V3_COM_RESETSM_CNTRL,
+       [QPHY_COM_C_READY_STATUS]       = QSERDES_V3_COM_C_READY_STATUS,
+       [QPHY_COM_CMN_STATUS]           = QSERDES_V3_COM_CMN_STATUS,
+       [QPHY_COM_BIAS_EN_CLKBUFLR_EN]  = QSERDES_V3_COM_BIAS_EN_CLKBUFLR_EN,
+
+       [QPHY_DP_PHY_STATUS]            = QSERDES_V3_DP_PHY_STATUS,
+
+       [QPHY_TX_TX_POL_INV]            = QSERDES_V3_TX_TX_POL_INV,
+       [QPHY_TX_TX_DRV_LVL]            = QSERDES_V3_TX_TX_DRV_LVL,
+       [QPHY_TX_TX_EMP_POST1_LVL]      = QSERDES_V3_TX_TX_EMP_POST1_LVL,
+       [QPHY_TX_HIGHZ_DRVR_EN]         = QSERDES_V3_TX_HIGHZ_DRVR_EN,
+       [QPHY_TX_TRANSCEIVER_BIAS_EN]   = QSERDES_V3_TX_TRANSCEIVER_BIAS_EN,
 };
 
-static const unsigned int qmp_v4_usb3phy_regs_layout[QPHY_LAYOUT_SIZE] = {
+static const unsigned int qmp_v45_usb3phy_regs_layout[QPHY_LAYOUT_SIZE] = {
        [QPHY_SW_RESET]                 = QPHY_V4_PCS_SW_RESET,
        [QPHY_START_CTRL]               = QPHY_V4_PCS_START_CONTROL,
        [QPHY_PCS_STATUS]               = QPHY_V4_PCS_PCS_STATUS1,
@@ -128,6 +154,67 @@ static const unsigned int qmp_v4_usb3phy_regs_layout[QPHY_LAYOUT_SIZE] = {
        /* In PCS_USB */
        [QPHY_PCS_AUTONOMOUS_MODE_CTRL] = QPHY_V4_PCS_USB3_AUTONOMOUS_MODE_CTRL,
        [QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR] = QPHY_V4_PCS_USB3_LFPS_RXTERM_IRQ_CLEAR,
+
+       [QPHY_COM_RESETSM_CNTRL]        = QSERDES_V4_COM_RESETSM_CNTRL,
+       [QPHY_COM_C_READY_STATUS]       = QSERDES_V4_COM_C_READY_STATUS,
+       [QPHY_COM_CMN_STATUS]           = QSERDES_V4_COM_CMN_STATUS,
+       [QPHY_COM_BIAS_EN_CLKBUFLR_EN]  = QSERDES_V4_COM_BIAS_EN_CLKBUFLR_EN,
+
+       [QPHY_DP_PHY_STATUS]            = QSERDES_V4_DP_PHY_STATUS,
+
+       [QPHY_TX_TX_POL_INV]            = QSERDES_V4_TX_TX_POL_INV,
+       [QPHY_TX_TX_DRV_LVL]            = QSERDES_V4_TX_TX_DRV_LVL,
+       [QPHY_TX_TX_EMP_POST1_LVL]      = QSERDES_V4_TX_TX_EMP_POST1_LVL,
+       [QPHY_TX_HIGHZ_DRVR_EN]         = QSERDES_V4_TX_HIGHZ_DRVR_EN,
+       [QPHY_TX_TRANSCEIVER_BIAS_EN]   = QSERDES_V4_TX_TRANSCEIVER_BIAS_EN,
+};
+
+static const unsigned int qmp_v5_5nm_usb3phy_regs_layout[QPHY_LAYOUT_SIZE] = {
+       [QPHY_SW_RESET]                 = QPHY_V5_PCS_SW_RESET,
+       [QPHY_START_CTRL]               = QPHY_V5_PCS_START_CONTROL,
+       [QPHY_PCS_STATUS]               = QPHY_V5_PCS_PCS_STATUS1,
+       [QPHY_PCS_POWER_DOWN_CONTROL]   = QPHY_V5_PCS_POWER_DOWN_CONTROL,
+
+       /* In PCS_USB */
+       [QPHY_PCS_AUTONOMOUS_MODE_CTRL] = QPHY_V5_PCS_USB3_AUTONOMOUS_MODE_CTRL,
+       [QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR] = QPHY_V5_PCS_USB3_LFPS_RXTERM_IRQ_CLEAR,
+
+       [QPHY_COM_RESETSM_CNTRL]        = QSERDES_V5_COM_RESETSM_CNTRL,
+       [QPHY_COM_C_READY_STATUS]       = QSERDES_V5_COM_C_READY_STATUS,
+       [QPHY_COM_CMN_STATUS]           = QSERDES_V5_COM_CMN_STATUS,
+       [QPHY_COM_BIAS_EN_CLKBUFLR_EN]  = QSERDES_V5_COM_BIAS_EN_CLKBUFLR_EN,
+
+       [QPHY_DP_PHY_STATUS]            = QSERDES_V5_DP_PHY_STATUS,
+
+       [QPHY_TX_TX_POL_INV]            = QSERDES_V5_5NM_TX_TX_POL_INV,
+       [QPHY_TX_TX_DRV_LVL]            = QSERDES_V5_5NM_TX_TX_DRV_LVL,
+       [QPHY_TX_TX_EMP_POST1_LVL]      = QSERDES_V5_5NM_TX_TX_EMP_POST1_LVL,
+       [QPHY_TX_HIGHZ_DRVR_EN]         = QSERDES_V5_5NM_TX_HIGHZ_DRVR_EN,
+       [QPHY_TX_TRANSCEIVER_BIAS_EN]   = QSERDES_V5_5NM_TX_TRANSCEIVER_BIAS_EN,
+};
+
+static const unsigned int qmp_v6_usb3phy_regs_layout[QPHY_LAYOUT_SIZE] = {
+       [QPHY_SW_RESET]                 = QPHY_V5_PCS_SW_RESET,
+       [QPHY_START_CTRL]               = QPHY_V5_PCS_START_CONTROL,
+       [QPHY_PCS_STATUS]               = QPHY_V5_PCS_PCS_STATUS1,
+       [QPHY_PCS_POWER_DOWN_CONTROL]   = QPHY_V5_PCS_POWER_DOWN_CONTROL,
+
+       /* In PCS_USB */
+       [QPHY_PCS_AUTONOMOUS_MODE_CTRL] = QPHY_V5_PCS_USB3_AUTONOMOUS_MODE_CTRL,
+       [QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR] = QPHY_V5_PCS_USB3_LFPS_RXTERM_IRQ_CLEAR,
+
+       [QPHY_COM_RESETSM_CNTRL]        = QSERDES_V6_COM_RESETSM_CNTRL,
+       [QPHY_COM_C_READY_STATUS]       = QSERDES_V6_COM_C_READY_STATUS,
+       [QPHY_COM_CMN_STATUS]           = QSERDES_V6_COM_CMN_STATUS,
+       [QPHY_COM_BIAS_EN_CLKBUFLR_EN]  = QSERDES_V6_COM_PLL_BIAS_EN_CLK_BUFLR_EN,
+
+       [QPHY_DP_PHY_STATUS]            = QSERDES_V6_DP_PHY_STATUS,
+
+       [QPHY_TX_TX_POL_INV]            = QSERDES_V6_TX_TX_POL_INV,
+       [QPHY_TX_TX_DRV_LVL]            = QSERDES_V6_TX_TX_DRV_LVL,
+       [QPHY_TX_TX_EMP_POST1_LVL]      = QSERDES_V6_TX_TX_EMP_POST1_LVL,
+       [QPHY_TX_HIGHZ_DRVR_EN]         = QSERDES_V6_TX_HIGHZ_DRVR_EN,
+       [QPHY_TX_TRANSCEIVER_BIAS_EN]   = QSERDES_V6_TX_TRANSCEIVER_BIAS_EN,
 };
 
 static const struct qmp_phy_init_tbl qmp_v3_usb3_serdes_tbl[] = {
@@ -772,10 +859,10 @@ static const struct qmp_phy_init_tbl sm8550_usb3_pcs_tbl[] = {
        QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_PCS_TX_RX_CONFIG, 0x0c),
        QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_EQ_CONFIG1, 0x4b),
        QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_EQ_CONFIG5, 0x10),
-       QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_USB3_POWER_STATE_CONFIG1, 0x68),
 };
 
 static const struct qmp_phy_init_tbl sm8550_usb3_pcs_usb_tbl[] = {
+       QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_USB3_POWER_STATE_CONFIG1, 0x68),
        QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_USB3_LFPS_DET_HIGH_COUNT_VAL, 0xf8),
        QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_USB3_RXEQTRAINING_DFE_TIME_S2, 0x07),
        QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_USB3_RCVR_DTCT_DLY_U3_L, 0x40),
@@ -1271,9 +1358,6 @@ struct qmp_phy_cfg {
        int (*calibrate_dp_phy)(struct qmp_combo *qmp);
        void (*dp_aux_init)(struct qmp_combo *qmp);
 
-       /* clock ids to be requested */
-       const char * const *clk_list;
-       int num_clks;
        /* resets to be requested */
        const char * const *reset_list;
        int num_resets;
@@ -1315,6 +1399,7 @@ struct qmp_combo {
 
        struct clk *pipe_clk;
        struct clk_bulk_data *clks;
+       int num_clks;
        struct reset_control_bulk_data *resets;
        struct regulator_bulk_data *vregs;
 
@@ -1350,11 +1435,6 @@ static void qmp_v4_configure_dp_tx(struct qmp_combo *qmp);
 static int qmp_v4_configure_dp_phy(struct qmp_combo *qmp);
 static int qmp_v4_calibrate_dp_phy(struct qmp_combo *qmp);
 
-static int qmp_v5_configure_dp_phy(struct qmp_combo *qmp);
-
-static void qmp_v6_dp_aux_init(struct qmp_combo *qmp);
-static int qmp_v6_configure_dp_phy(struct qmp_combo *qmp);
-
 static inline void qphy_setbits(void __iomem *base, u32 offset, u32 val)
 {
        u32 reg;
@@ -1380,19 +1460,10 @@ static inline void qphy_clrbits(void __iomem *base, u32 offset, u32 val)
 }
 
 /* list of clocks required by phy */
-static const char * const qmp_v3_phy_clk_l[] = {
+static const char * const qmp_combo_phy_clk_l[] = {
        "aux", "cfg_ahb", "ref", "com_aux",
 };
 
-static const char * const qmp_v4_phy_clk_l[] = {
-       "aux", "ref", "com_aux",
-};
-
-/* the primary usb3 phy on sm8250 doesn't have a ref clock */
-static const char * const qmp_v4_sm8250_usbphy_clk_l[] = {
-       "aux", "ref_clk_src", "com_aux"
-};
-
 /* list of resets */
 static const char * const msm8996_usb3phy_reset_l[] = {
        "phy", "common",
@@ -1433,6 +1504,8 @@ static const struct qmp_combo_offsets qmp_combo_offsets_v5 = {
 };
 
 static const struct qmp_phy_cfg sc7180_usb3dpphy_cfg = {
+       .offsets                = &qmp_combo_offsets_v3,
+
        .serdes_tbl             = qmp_v3_usb3_serdes_tbl,
        .serdes_tbl_num         = ARRAY_SIZE(qmp_v3_usb3_serdes_tbl),
        .tx_tbl                 = qmp_v3_usb3_tx_tbl,
@@ -1466,8 +1539,6 @@ static const struct qmp_phy_cfg sc7180_usb3dpphy_cfg = {
        .configure_dp_phy       = qmp_v3_configure_dp_phy,
        .calibrate_dp_phy       = qmp_v3_calibrate_dp_phy,
 
-       .clk_list               = qmp_v3_phy_clk_l,
-       .num_clks               = ARRAY_SIZE(qmp_v3_phy_clk_l),
        .reset_list             = sc7180_usb3phy_reset_l,
        .num_resets             = ARRAY_SIZE(sc7180_usb3phy_reset_l),
        .vreg_list              = qmp_phy_vreg_l,
@@ -1478,6 +1549,8 @@ static const struct qmp_phy_cfg sc7180_usb3dpphy_cfg = {
 };
 
 static const struct qmp_phy_cfg sdm845_usb3dpphy_cfg = {
+       .offsets                = &qmp_combo_offsets_v3,
+
        .serdes_tbl             = qmp_v3_usb3_serdes_tbl,
        .serdes_tbl_num         = ARRAY_SIZE(qmp_v3_usb3_serdes_tbl),
        .tx_tbl                 = qmp_v3_usb3_tx_tbl,
@@ -1511,8 +1584,6 @@ static const struct qmp_phy_cfg sdm845_usb3dpphy_cfg = {
        .configure_dp_phy       = qmp_v3_configure_dp_phy,
        .calibrate_dp_phy       = qmp_v3_calibrate_dp_phy,
 
-       .clk_list               = qmp_v3_phy_clk_l,
-       .num_clks               = ARRAY_SIZE(qmp_v3_phy_clk_l),
        .reset_list             = msm8996_usb3phy_reset_l,
        .num_resets             = ARRAY_SIZE(msm8996_usb3phy_reset_l),
        .vreg_list              = qmp_phy_vreg_l,
@@ -1523,6 +1594,8 @@ static const struct qmp_phy_cfg sdm845_usb3dpphy_cfg = {
 };
 
 static const struct qmp_phy_cfg sc8180x_usb3dpphy_cfg = {
+       .offsets                = &qmp_combo_offsets_v3,
+
        .serdes_tbl             = sm8150_usb3_serdes_tbl,
        .serdes_tbl_num         = ARRAY_SIZE(sm8150_usb3_serdes_tbl),
        .tx_tbl                 = sm8150_usb3_tx_tbl,
@@ -1558,13 +1631,11 @@ static const struct qmp_phy_cfg sc8180x_usb3dpphy_cfg = {
        .configure_dp_phy       = qmp_v4_configure_dp_phy,
        .calibrate_dp_phy       = qmp_v4_calibrate_dp_phy,
 
-       .clk_list               = qmp_v4_phy_clk_l,
-       .num_clks               = ARRAY_SIZE(qmp_v4_phy_clk_l),
        .reset_list             = msm8996_usb3phy_reset_l,
        .num_resets             = ARRAY_SIZE(msm8996_usb3phy_reset_l),
        .vreg_list              = qmp_phy_vreg_l,
        .num_vregs              = ARRAY_SIZE(qmp_phy_vreg_l),
-       .regs                   = qmp_v4_usb3phy_regs_layout,
+       .regs                   = qmp_v45_usb3phy_regs_layout,
        .pcs_usb_offset         = 0x300,
 
        .has_pwrdn_delay        = true,
@@ -1603,16 +1674,14 @@ static const struct qmp_phy_cfg sc8280xp_usb43dpphy_cfg = {
 
        .dp_aux_init            = qmp_v4_dp_aux_init,
        .configure_dp_tx        = qmp_v4_configure_dp_tx,
-       .configure_dp_phy       = qmp_v5_configure_dp_phy,
+       .configure_dp_phy       = qmp_v4_configure_dp_phy,
        .calibrate_dp_phy       = qmp_v4_calibrate_dp_phy,
 
-       .clk_list               = qmp_v4_phy_clk_l,
-       .num_clks               = ARRAY_SIZE(qmp_v4_phy_clk_l),
        .reset_list             = msm8996_usb3phy_reset_l,
        .num_resets             = ARRAY_SIZE(msm8996_usb3phy_reset_l),
        .vreg_list              = qmp_phy_vreg_l,
        .num_vregs              = ARRAY_SIZE(qmp_phy_vreg_l),
-       .regs                   = qmp_v4_usb3phy_regs_layout,
+       .regs                   = qmp_v5_5nm_usb3phy_regs_layout,
 };
 
 static const struct qmp_phy_cfg sm6350_usb3dpphy_cfg = {
@@ -1651,8 +1720,6 @@ static const struct qmp_phy_cfg sm6350_usb3dpphy_cfg = {
        .configure_dp_phy       = qmp_v3_configure_dp_phy,
        .calibrate_dp_phy       = qmp_v3_calibrate_dp_phy,
 
-       .clk_list               = qmp_v4_phy_clk_l,
-       .num_clks               = ARRAY_SIZE(qmp_v4_phy_clk_l),
        .reset_list             = msm8996_usb3phy_reset_l,
        .num_resets             = ARRAY_SIZE(msm8996_usb3phy_reset_l),
        .vreg_list              = qmp_phy_vreg_l,
@@ -1661,6 +1728,8 @@ static const struct qmp_phy_cfg sm6350_usb3dpphy_cfg = {
 };
 
 static const struct qmp_phy_cfg sm8250_usb3dpphy_cfg = {
+       .offsets                = &qmp_combo_offsets_v3,
+
        .serdes_tbl             = sm8150_usb3_serdes_tbl,
        .serdes_tbl_num         = ARRAY_SIZE(sm8150_usb3_serdes_tbl),
        .tx_tbl                 = sm8250_usb3_tx_tbl,
@@ -1696,13 +1765,11 @@ static const struct qmp_phy_cfg sm8250_usb3dpphy_cfg = {
        .configure_dp_phy       = qmp_v4_configure_dp_phy,
        .calibrate_dp_phy       = qmp_v4_calibrate_dp_phy,
 
-       .clk_list               = qmp_v4_sm8250_usbphy_clk_l,
-       .num_clks               = ARRAY_SIZE(qmp_v4_sm8250_usbphy_clk_l),
        .reset_list             = msm8996_usb3phy_reset_l,
        .num_resets             = ARRAY_SIZE(msm8996_usb3phy_reset_l),
        .vreg_list              = qmp_phy_vreg_l,
        .num_vregs              = ARRAY_SIZE(qmp_phy_vreg_l),
-       .regs                   = qmp_v4_usb3phy_regs_layout,
+       .regs                   = qmp_v45_usb3phy_regs_layout,
        .pcs_usb_offset         = 0x300,
 
        .has_pwrdn_delay        = true,
@@ -1746,13 +1813,11 @@ static const struct qmp_phy_cfg sm8350_usb3dpphy_cfg = {
        .configure_dp_phy       = qmp_v4_configure_dp_phy,
        .calibrate_dp_phy       = qmp_v4_calibrate_dp_phy,
 
-       .clk_list               = qmp_v4_phy_clk_l,
-       .num_clks               = ARRAY_SIZE(qmp_v4_phy_clk_l),
        .reset_list             = msm8996_usb3phy_reset_l,
        .num_resets             = ARRAY_SIZE(msm8996_usb3phy_reset_l),
        .vreg_list              = qmp_phy_vreg_l,
        .num_vregs              = ARRAY_SIZE(qmp_phy_vreg_l),
-       .regs                   = qmp_v4_usb3phy_regs_layout,
+       .regs                   = qmp_v45_usb3phy_regs_layout,
 
        .has_pwrdn_delay        = true,
 };
@@ -1790,14 +1855,12 @@ static const struct qmp_phy_cfg sm8550_usb3dpphy_cfg = {
        .swing_hbr3_hbr2        = &qmp_dp_v5_voltage_swing_hbr3_hbr2,
        .pre_emphasis_hbr3_hbr2 = &qmp_dp_v5_pre_emphasis_hbr3_hbr2,
 
-       .dp_aux_init            = qmp_v6_dp_aux_init,
+       .dp_aux_init            = qmp_v4_dp_aux_init,
        .configure_dp_tx        = qmp_v4_configure_dp_tx,
-       .configure_dp_phy       = qmp_v6_configure_dp_phy,
+       .configure_dp_phy       = qmp_v4_configure_dp_phy,
        .calibrate_dp_phy       = qmp_v4_calibrate_dp_phy,
 
-       .regs                   = qmp_v4_usb3phy_regs_layout,
-       .clk_list               = qmp_v4_phy_clk_l,
-       .num_clks               = ARRAY_SIZE(qmp_v4_phy_clk_l),
+       .regs                   = qmp_v6_usb3phy_regs_layout,
        .reset_list             = msm8996_usb3phy_reset_l,
        .num_resets             = ARRAY_SIZE(msm8996_usb3phy_reset_l),
        .vreg_list              = qmp_phy_vreg_l,
@@ -1865,6 +1928,8 @@ static int qmp_combo_dp_serdes_init(struct qmp_combo *qmp)
 
 static void qmp_v3_dp_aux_init(struct qmp_combo *qmp)
 {
+       const struct qmp_phy_cfg *cfg = qmp->cfg;
+
        writel(DP_PHY_PD_CTL_PWRDN | DP_PHY_PD_CTL_AUX_PWRDN |
               DP_PHY_PD_CTL_PLL_PWRDN | DP_PHY_PD_CTL_DP_CLAMP_EN,
               qmp->dp_dp_phy + QSERDES_DP_PHY_PD_CTL);
@@ -1872,7 +1937,7 @@ static void qmp_v3_dp_aux_init(struct qmp_combo *qmp)
        /* Turn on BIAS current for PHY/PLL */
        writel(QSERDES_V3_COM_BIAS_EN | QSERDES_V3_COM_BIAS_EN_MUX |
               QSERDES_V3_COM_CLKBUF_L_EN | QSERDES_V3_COM_EN_SYSCLK_TX_SEL,
-              qmp->dp_serdes + QSERDES_V3_COM_BIAS_EN_CLKBUFLR_EN);
+              qmp->dp_serdes + cfg->regs[QPHY_COM_BIAS_EN_CLKBUFLR_EN]);
 
        writel(DP_PHY_PD_CTL_PSR_PWRDN, qmp->dp_dp_phy + QSERDES_DP_PHY_PD_CTL);
 
@@ -1886,7 +1951,7 @@ static void qmp_v3_dp_aux_init(struct qmp_combo *qmp)
               QSERDES_V3_COM_BIAS_EN_MUX | QSERDES_V3_COM_CLKBUF_R_EN |
               QSERDES_V3_COM_CLKBUF_L_EN | QSERDES_V3_COM_EN_SYSCLK_TX_SEL |
               QSERDES_V3_COM_CLKBUF_RX_DRIVE_L,
-              qmp->dp_serdes + QSERDES_V3_COM_BIAS_EN_CLKBUFLR_EN);
+              qmp->dp_serdes + cfg->regs[QPHY_COM_BIAS_EN_CLKBUFLR_EN]);
 
        writel(0x00, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG0);
        writel(0x13, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG1);
@@ -1906,8 +1971,7 @@ static void qmp_v3_dp_aux_init(struct qmp_combo *qmp)
               qmp->dp_dp_phy + QSERDES_V3_DP_PHY_AUX_INTERRUPT_MASK);
 }
 
-static int qmp_combo_configure_dp_swing(struct qmp_combo *qmp,
-               unsigned int drv_lvl_reg, unsigned int emp_post_reg)
+static int qmp_combo_configure_dp_swing(struct qmp_combo *qmp)
 {
        const struct phy_configure_opts_dp *dp_opts = &qmp->dp_opts;
        const struct qmp_phy_cfg *cfg = qmp->cfg;
@@ -1936,10 +2000,10 @@ static int qmp_combo_configure_dp_swing(struct qmp_combo *qmp,
        voltage_swing_cfg |= DP_PHY_TXn_TX_DRV_LVL_MUX_EN;
        pre_emphasis_cfg |= DP_PHY_TXn_TX_EMP_POST1_LVL_MUX_EN;
 
-       writel(voltage_swing_cfg, qmp->dp_tx + drv_lvl_reg);
-       writel(pre_emphasis_cfg, qmp->dp_tx + emp_post_reg);
-       writel(voltage_swing_cfg, qmp->dp_tx2 + drv_lvl_reg);
-       writel(pre_emphasis_cfg, qmp->dp_tx2 + emp_post_reg);
+       writel(voltage_swing_cfg, qmp->dp_tx + cfg->regs[QPHY_TX_TX_DRV_LVL]);
+       writel(pre_emphasis_cfg, qmp->dp_tx + cfg->regs[QPHY_TX_TX_EMP_POST1_LVL]);
+       writel(voltage_swing_cfg, qmp->dp_tx2 + cfg->regs[QPHY_TX_TX_DRV_LVL]);
+       writel(pre_emphasis_cfg, qmp->dp_tx2 + cfg->regs[QPHY_TX_TX_EMP_POST1_LVL]);
 
        return 0;
 }
@@ -1949,8 +2013,7 @@ static void qmp_v3_configure_dp_tx(struct qmp_combo *qmp)
        const struct phy_configure_opts_dp *dp_opts = &qmp->dp_opts;
        u32 bias_en, drvr_en;
 
-       if (qmp_combo_configure_dp_swing(qmp, QSERDES_V3_TX_TX_DRV_LVL,
-                               QSERDES_V3_TX_TX_EMP_POST1_LVL) < 0)
+       if (qmp_combo_configure_dp_swing(qmp) < 0)
                return;
 
        if (dp_opts->lanes == 1) {
@@ -1991,17 +2054,12 @@ static bool qmp_combo_configure_dp_mode(struct qmp_combo *qmp)
        return reverse;
 }
 
-static int qmp_v3_configure_dp_phy(struct qmp_combo *qmp)
+static int qmp_combo_configure_dp_clocks(struct qmp_combo *qmp)
 {
        const struct phy_configure_opts_dp *dp_opts = &qmp->dp_opts;
-       u32 phy_vco_div, status;
+       u32 phy_vco_div;
        unsigned long pixel_freq;
 
-       qmp_combo_configure_dp_mode(qmp);
-
-       writel(0x05, qmp->dp_dp_phy + QSERDES_V3_DP_PHY_TX0_TX1_LANE_CTL);
-       writel(0x05, qmp->dp_dp_phy + QSERDES_V3_DP_PHY_TX2_TX3_LANE_CTL);
-
        switch (dp_opts->link_rate) {
        case 1620:
                phy_vco_div = 0x1;
@@ -2023,20 +2081,38 @@ static int qmp_v3_configure_dp_phy(struct qmp_combo *qmp)
                /* Other link rates aren't supported */
                return -EINVAL;
        }
-       writel(phy_vco_div, qmp->dp_dp_phy + QSERDES_V3_DP_PHY_VCO_DIV);
+       writel(phy_vco_div, qmp->dp_dp_phy + QSERDES_V4_DP_PHY_VCO_DIV);
 
        clk_set_rate(qmp->dp_link_hw.clk, dp_opts->link_rate * 100000);
        clk_set_rate(qmp->dp_pixel_hw.clk, pixel_freq);
 
+       return 0;
+}
+
+static int qmp_v3_configure_dp_phy(struct qmp_combo *qmp)
+{
+       const struct qmp_phy_cfg *cfg = qmp->cfg;
+       u32 status;
+       int ret;
+
+       qmp_combo_configure_dp_mode(qmp);
+
+       writel(0x05, qmp->dp_dp_phy + QSERDES_V3_DP_PHY_TX0_TX1_LANE_CTL);
+       writel(0x05, qmp->dp_dp_phy + QSERDES_V3_DP_PHY_TX2_TX3_LANE_CTL);
+
+       ret = qmp_combo_configure_dp_clocks(qmp);
+       if (ret)
+               return ret;
+
        writel(0x04, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG2);
        writel(0x01, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG);
        writel(0x05, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG);
        writel(0x01, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG);
        writel(0x09, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG);
 
-       writel(0x20, qmp->dp_serdes + QSERDES_V3_COM_RESETSM_CNTRL);
+       writel(0x20, qmp->dp_serdes + cfg->regs[QPHY_COM_RESETSM_CNTRL]);
 
-       if (readl_poll_timeout(qmp->dp_serdes + QSERDES_V3_COM_C_READY_STATUS,
+       if (readl_poll_timeout(qmp->dp_serdes + cfg->regs[QPHY_COM_C_READY_STATUS],
                        status,
                        ((status & BIT(0)) > 0),
                        500,
@@ -2045,7 +2121,7 @@ static int qmp_v3_configure_dp_phy(struct qmp_combo *qmp)
 
        writel(0x19, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG);
 
-       if (readl_poll_timeout(qmp->dp_dp_phy + QSERDES_V3_DP_PHY_STATUS,
+       if (readl_poll_timeout(qmp->dp_dp_phy + cfg->regs[QPHY_DP_PHY_STATUS],
                        status,
                        ((status & BIT(1)) > 0),
                        500,
@@ -2056,7 +2132,7 @@ static int qmp_v3_configure_dp_phy(struct qmp_combo *qmp)
        udelay(2000);
        writel(0x19, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG);
 
-       return readl_poll_timeout(qmp->dp_dp_phy + QSERDES_V3_DP_PHY_STATUS,
+       return readl_poll_timeout(qmp->dp_dp_phy + cfg->regs[QPHY_DP_PHY_STATUS],
                        status,
                        ((status & BIT(1)) > 0),
                        500,
@@ -2083,39 +2159,14 @@ static int qmp_v3_calibrate_dp_phy(struct qmp_combo *qmp)
 
 static void qmp_v4_dp_aux_init(struct qmp_combo *qmp)
 {
-       writel(DP_PHY_PD_CTL_PWRDN | DP_PHY_PD_CTL_PSR_PWRDN | DP_PHY_PD_CTL_AUX_PWRDN |
-              DP_PHY_PD_CTL_PLL_PWRDN | DP_PHY_PD_CTL_DP_CLAMP_EN,
-              qmp->dp_dp_phy + QSERDES_DP_PHY_PD_CTL);
-
-       /* Turn on BIAS current for PHY/PLL */
-       writel(0x17, qmp->dp_serdes + QSERDES_V4_COM_BIAS_EN_CLKBUFLR_EN);
-
-       writel(0x00, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG0);
-       writel(0x13, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG1);
-       writel(0xa4, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG2);
-       writel(0x00, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG3);
-       writel(0x0a, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG4);
-       writel(0x26, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG5);
-       writel(0x0a, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG6);
-       writel(0x03, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG7);
-       writel(0xb7, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG8);
-       writel(0x03, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG9);
-       qmp->dp_aux_cfg = 0;
-
-       writel(PHY_AUX_STOP_ERR_MASK | PHY_AUX_DEC_ERR_MASK |
-              PHY_AUX_SYNC_ERR_MASK | PHY_AUX_ALIGN_ERR_MASK |
-              PHY_AUX_REQ_ERR_MASK,
-              qmp->dp_dp_phy + QSERDES_V4_DP_PHY_AUX_INTERRUPT_MASK);
-}
+       const struct qmp_phy_cfg *cfg = qmp->cfg;
 
-static void qmp_v6_dp_aux_init(struct qmp_combo *qmp)
-{
        writel(DP_PHY_PD_CTL_PWRDN | DP_PHY_PD_CTL_PSR_PWRDN | DP_PHY_PD_CTL_AUX_PWRDN |
               DP_PHY_PD_CTL_PLL_PWRDN | DP_PHY_PD_CTL_DP_CLAMP_EN,
               qmp->dp_dp_phy + QSERDES_DP_PHY_PD_CTL);
 
        /* Turn on BIAS current for PHY/PLL */
-       writel(0x17, qmp->dp_serdes + QSERDES_V6_COM_PLL_BIAS_EN_CLK_BUFLR_EN);
+       writel(0x17, qmp->dp_serdes + cfg->regs[QPHY_COM_BIAS_EN_CLKBUFLR_EN]);
 
        writel(0x00, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG0);
        writel(0x13, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG1);
@@ -2137,26 +2188,23 @@ static void qmp_v6_dp_aux_init(struct qmp_combo *qmp)
 
 static void qmp_v4_configure_dp_tx(struct qmp_combo *qmp)
 {
+       const struct qmp_phy_cfg *cfg = qmp->cfg;
+
        /* Program default values before writing proper values */
-       writel(0x27, qmp->dp_tx + QSERDES_V4_TX_TX_DRV_LVL);
-       writel(0x27, qmp->dp_tx2 + QSERDES_V4_TX_TX_DRV_LVL);
+       writel(0x27, qmp->dp_tx + cfg->regs[QPHY_TX_TX_DRV_LVL]);
+       writel(0x27, qmp->dp_tx2 + cfg->regs[QPHY_TX_TX_DRV_LVL]);
 
-       writel(0x20, qmp->dp_tx + QSERDES_V4_TX_TX_EMP_POST1_LVL);
-       writel(0x20, qmp->dp_tx2 + QSERDES_V4_TX_TX_EMP_POST1_LVL);
+       writel(0x20, qmp->dp_tx + cfg->regs[QPHY_TX_TX_EMP_POST1_LVL]);
+       writel(0x20, qmp->dp_tx2 + cfg->regs[QPHY_TX_TX_EMP_POST1_LVL]);
 
-       qmp_combo_configure_dp_swing(qmp, QSERDES_V4_TX_TX_DRV_LVL,
-                       QSERDES_V4_TX_TX_EMP_POST1_LVL);
+       qmp_combo_configure_dp_swing(qmp);
 }
 
-static int qmp_v456_configure_dp_phy(struct qmp_combo *qmp,
-                                    unsigned int com_resetm_ctrl_reg,
-                                    unsigned int com_c_ready_status_reg,
-                                    unsigned int com_cmn_status_reg,
-                                    unsigned int dp_phy_status_reg)
+static int qmp_v456_configure_dp_phy(struct qmp_combo *qmp)
 {
-       const struct phy_configure_opts_dp *dp_opts = &qmp->dp_opts;
-       u32 phy_vco_div, status;
-       unsigned long pixel_freq;
+       const struct qmp_phy_cfg *cfg = qmp->cfg;
+       u32 status;
+       int ret;
 
        writel(0x0f, qmp->dp_dp_phy + QSERDES_V4_DP_PHY_CFG_1);
 
@@ -2168,54 +2216,32 @@ static int qmp_v456_configure_dp_phy(struct qmp_combo *qmp,
        writel(0x05, qmp->dp_dp_phy + QSERDES_V4_DP_PHY_TX0_TX1_LANE_CTL);
        writel(0x05, qmp->dp_dp_phy + QSERDES_V4_DP_PHY_TX2_TX3_LANE_CTL);
 
-       switch (dp_opts->link_rate) {
-       case 1620:
-               phy_vco_div = 0x1;
-               pixel_freq = 1620000000UL / 2;
-               break;
-       case 2700:
-               phy_vco_div = 0x1;
-               pixel_freq = 2700000000UL / 2;
-               break;
-       case 5400:
-               phy_vco_div = 0x2;
-               pixel_freq = 5400000000UL / 4;
-               break;
-       case 8100:
-               phy_vco_div = 0x0;
-               pixel_freq = 8100000000UL / 6;
-               break;
-       default:
-               /* Other link rates aren't supported */
-               return -EINVAL;
-       }
-       writel(phy_vco_div, qmp->dp_dp_phy + QSERDES_V4_DP_PHY_VCO_DIV);
-
-       clk_set_rate(qmp->dp_link_hw.clk, dp_opts->link_rate * 100000);
-       clk_set_rate(qmp->dp_pixel_hw.clk, pixel_freq);
+       ret = qmp_combo_configure_dp_clocks(qmp);
+       if (ret)
+               return ret;
 
        writel(0x01, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG);
        writel(0x05, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG);
        writel(0x01, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG);
        writel(0x09, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG);
 
-       writel(0x20, qmp->dp_serdes + com_resetm_ctrl_reg);
+       writel(0x20, qmp->dp_serdes + cfg->regs[QPHY_COM_RESETSM_CNTRL]);
 
-       if (readl_poll_timeout(qmp->dp_serdes + com_c_ready_status_reg,
+       if (readl_poll_timeout(qmp->dp_serdes + cfg->regs[QPHY_COM_C_READY_STATUS],
                        status,
                        ((status & BIT(0)) > 0),
                        500,
                        10000))
                return -ETIMEDOUT;
 
-       if (readl_poll_timeout(qmp->dp_serdes + com_cmn_status_reg,
+       if (readl_poll_timeout(qmp->dp_serdes + cfg->regs[QPHY_COM_CMN_STATUS],
                        status,
                        ((status & BIT(0)) > 0),
                        500,
                        10000))
                return -ETIMEDOUT;
 
-       if (readl_poll_timeout(qmp->dp_serdes + com_cmn_status_reg,
+       if (readl_poll_timeout(qmp->dp_serdes + cfg->regs[QPHY_COM_CMN_STATUS],
                        status,
                        ((status & BIT(1)) > 0),
                        500,
@@ -2224,14 +2250,14 @@ static int qmp_v456_configure_dp_phy(struct qmp_combo *qmp,
 
        writel(0x19, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG);
 
-       if (readl_poll_timeout(qmp->dp_dp_phy + dp_phy_status_reg,
+       if (readl_poll_timeout(qmp->dp_dp_phy + cfg->regs[QPHY_DP_PHY_STATUS],
                        status,
                        ((status & BIT(0)) > 0),
                        500,
                        10000))
                return -ETIMEDOUT;
 
-       if (readl_poll_timeout(qmp->dp_dp_phy + dp_phy_status_reg,
+       if (readl_poll_timeout(qmp->dp_dp_phy + cfg->regs[QPHY_DP_PHY_STATUS],
                        status,
                        ((status & BIT(1)) > 0),
                        500,
@@ -2243,16 +2269,14 @@ static int qmp_v456_configure_dp_phy(struct qmp_combo *qmp,
 
 static int qmp_v4_configure_dp_phy(struct qmp_combo *qmp)
 {
+       const struct qmp_phy_cfg *cfg = qmp->cfg;
        bool reverse = (qmp->orientation == TYPEC_ORIENTATION_REVERSE);
        const struct phy_configure_opts_dp *dp_opts = &qmp->dp_opts;
        u32 bias0_en, drvr0_en, bias1_en, drvr1_en;
        u32 status;
        int ret;
 
-       ret = qmp_v456_configure_dp_phy(qmp, QSERDES_V4_COM_RESETSM_CNTRL,
-                                       QSERDES_V4_COM_C_READY_STATUS,
-                                       QSERDES_V4_COM_CMN_STATUS,
-                                       QSERDES_V4_DP_PHY_STATUS);
+       ret = qmp_v456_configure_dp_phy(qmp);
        if (ret < 0)
                return ret;
 
@@ -2278,150 +2302,32 @@ static int qmp_v4_configure_dp_phy(struct qmp_combo *qmp)
                drvr1_en = 0x10;
        }
 
-       writel(drvr0_en, qmp->dp_tx + QSERDES_V4_TX_HIGHZ_DRVR_EN);
-       writel(bias0_en, qmp->dp_tx + QSERDES_V4_TX_TRANSCEIVER_BIAS_EN);
-       writel(drvr1_en, qmp->dp_tx2 + QSERDES_V4_TX_HIGHZ_DRVR_EN);
-       writel(bias1_en, qmp->dp_tx2 + QSERDES_V4_TX_TRANSCEIVER_BIAS_EN);
+       writel(drvr0_en, qmp->dp_tx + cfg->regs[QPHY_TX_HIGHZ_DRVR_EN]);
+       writel(bias0_en, qmp->dp_tx + cfg->regs[QPHY_TX_TRANSCEIVER_BIAS_EN]);
+       writel(drvr1_en, qmp->dp_tx2 + cfg->regs[QPHY_TX_HIGHZ_DRVR_EN]);
+       writel(bias1_en, qmp->dp_tx2 + cfg->regs[QPHY_TX_TRANSCEIVER_BIAS_EN]);
 
        writel(0x18, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG);
        udelay(2000);
        writel(0x19, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG);
 
-       if (readl_poll_timeout(qmp->dp_dp_phy + QSERDES_V4_DP_PHY_STATUS,
+       if (readl_poll_timeout(qmp->dp_dp_phy + cfg->regs[QPHY_DP_PHY_STATUS],
                        status,
                        ((status & BIT(1)) > 0),
                        500,
                        10000))
                return -ETIMEDOUT;
 
-       writel(0x0a, qmp->dp_tx + QSERDES_V4_TX_TX_POL_INV);
-       writel(0x0a, qmp->dp_tx2 + QSERDES_V4_TX_TX_POL_INV);
+       writel(0x0a, qmp->dp_tx + cfg->regs[QPHY_TX_TX_POL_INV]);
+       writel(0x0a, qmp->dp_tx2 + cfg->regs[QPHY_TX_TX_POL_INV]);
 
-       writel(0x27, qmp->dp_tx + QSERDES_V4_TX_TX_DRV_LVL);
-       writel(0x27, qmp->dp_tx2 + QSERDES_V4_TX_TX_DRV_LVL);
+       writel(0x27, qmp->dp_tx + cfg->regs[QPHY_TX_TX_DRV_LVL]);
+       writel(0x27, qmp->dp_tx2 + cfg->regs[QPHY_TX_TX_DRV_LVL]);
 
-       writel(0x20, qmp->dp_tx + QSERDES_V4_TX_TX_EMP_POST1_LVL);
-       writel(0x20, qmp->dp_tx2 + QSERDES_V4_TX_TX_EMP_POST1_LVL);
+       writel(0x20, qmp->dp_tx + cfg->regs[QPHY_TX_TX_EMP_POST1_LVL]);
+       writel(0x20, qmp->dp_tx2 + cfg->regs[QPHY_TX_TX_EMP_POST1_LVL]);
 
        return 0;
-}
-
-static int qmp_v5_configure_dp_phy(struct qmp_combo *qmp)
-{
-       bool reverse = (qmp->orientation == TYPEC_ORIENTATION_REVERSE);
-       const struct phy_configure_opts_dp *dp_opts = &qmp->dp_opts;
-       u32 bias0_en, drvr0_en, bias1_en, drvr1_en;
-       u32 status;
-       int ret;
-
-       ret = qmp_v456_configure_dp_phy(qmp, QSERDES_V4_COM_RESETSM_CNTRL,
-                                       QSERDES_V4_COM_C_READY_STATUS,
-                                       QSERDES_V4_COM_CMN_STATUS,
-                                       QSERDES_V4_DP_PHY_STATUS);
-       if (ret < 0)
-               return ret;
-
-       if (dp_opts->lanes == 1) {
-               bias0_en = reverse ? 0x3e : 0x1a;
-               drvr0_en = reverse ? 0x13 : 0x10;
-               bias1_en = reverse ? 0x15 : 0x3e;
-               drvr1_en = reverse ? 0x10 : 0x13;
-       } else if (dp_opts->lanes == 2) {
-               bias0_en = reverse ? 0x3f : 0x15;
-               drvr0_en = 0x10;
-               bias1_en = reverse ? 0x15 : 0x3f;
-               drvr1_en = 0x10;
-       } else {
-               bias0_en = 0x3f;
-               bias1_en = 0x3f;
-               drvr0_en = 0x10;
-               drvr1_en = 0x10;
-       }
-
-       writel(drvr0_en, qmp->dp_tx + QSERDES_V5_5NM_TX_HIGHZ_DRVR_EN);
-       writel(bias0_en, qmp->dp_tx + QSERDES_V5_5NM_TX_TRANSCEIVER_BIAS_EN);
-       writel(drvr1_en, qmp->dp_tx2 + QSERDES_V5_5NM_TX_HIGHZ_DRVR_EN);
-       writel(bias1_en, qmp->dp_tx2 + QSERDES_V5_5NM_TX_TRANSCEIVER_BIAS_EN);
-
-       writel(0x18, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG);
-       udelay(2000);
-       writel(0x19, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG);
-
-       if (readl_poll_timeout(qmp->dp_dp_phy + QSERDES_V4_DP_PHY_STATUS,
-                       status,
-                       ((status & BIT(1)) > 0),
-                       500,
-                       10000))
-               return -ETIMEDOUT;
-
-       writel(0x0a, qmp->dp_tx + QSERDES_V5_5NM_TX_TX_POL_INV);
-       writel(0x0a, qmp->dp_tx2 + QSERDES_V5_5NM_TX_TX_POL_INV);
-
-       writel(0x27, qmp->dp_tx + QSERDES_V5_5NM_TX_TX_DRV_LVL);
-       writel(0x27, qmp->dp_tx2 + QSERDES_V5_5NM_TX_TX_DRV_LVL);
-
-       writel(0x20, qmp->dp_tx + QSERDES_V5_5NM_TX_TX_EMP_POST1_LVL);
-       writel(0x20, qmp->dp_tx2 + QSERDES_V5_5NM_TX_TX_EMP_POST1_LVL);
-
-       return 0;
-}
-
-static int qmp_v6_configure_dp_phy(struct qmp_combo *qmp)
-{
-       bool reverse = (qmp->orientation == TYPEC_ORIENTATION_REVERSE);
-       const struct phy_configure_opts_dp *dp_opts = &qmp->dp_opts;
-       u32 bias0_en, drvr0_en, bias1_en, drvr1_en;
-       u32 status;
-       int ret;
-
-       ret = qmp_v456_configure_dp_phy(qmp, QSERDES_V6_COM_RESETSM_CNTRL,
-                                       QSERDES_V6_COM_C_READY_STATUS,
-                                       QSERDES_V6_COM_CMN_STATUS,
-                                       QSERDES_V6_DP_PHY_STATUS);
-       if (ret < 0)
-               return ret;
-
-       if (dp_opts->lanes == 1) {
-               bias0_en = reverse ? 0x3e : 0x1a;
-               drvr0_en = reverse ? 0x13 : 0x10;
-               bias1_en = reverse ? 0x15 : 0x3e;
-               drvr1_en = reverse ? 0x10 : 0x13;
-       } else if (dp_opts->lanes == 2) {
-               bias0_en = reverse ? 0x3f : 0x15;
-               drvr0_en = 0x10;
-               bias1_en = reverse ? 0x15 : 0x3f;
-               drvr1_en = 0x10;
-       } else {
-               bias0_en = 0x3f;
-               bias1_en = 0x3f;
-               drvr0_en = 0x10;
-               drvr1_en = 0x10;
-       }
-
-       writel(drvr0_en, qmp->dp_tx + QSERDES_V4_TX_HIGHZ_DRVR_EN);
-       writel(bias0_en, qmp->dp_tx + QSERDES_V4_TX_TRANSCEIVER_BIAS_EN);
-       writel(drvr1_en, qmp->dp_tx2 + QSERDES_V4_TX_HIGHZ_DRVR_EN);
-       writel(bias1_en, qmp->dp_tx2 + QSERDES_V4_TX_TRANSCEIVER_BIAS_EN);
-
-       writel(0x18, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG);
-       udelay(2000);
-       writel(0x19, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG);
-
-       if (readl_poll_timeout(qmp->dp_dp_phy + QSERDES_V6_DP_PHY_STATUS,
-                              status,
-                              ((status & BIT(1)) > 0),
-                              500,
-                              10000))
-               return -ETIMEDOUT;
-
-       writel(0x0a, qmp->dp_tx + QSERDES_V4_TX_TX_POL_INV);
-       writel(0x0a, qmp->dp_tx2 + QSERDES_V4_TX_TX_POL_INV);
-
-       writel(0x27, qmp->dp_tx + QSERDES_V4_TX_TX_DRV_LVL);
-       writel(0x27, qmp->dp_tx2 + QSERDES_V4_TX_TX_DRV_LVL);
-
-       writel(0x20, qmp->dp_tx + QSERDES_V4_TX_TX_EMP_POST1_LVL);
-       writel(0x20, qmp->dp_tx2 + QSERDES_V4_TX_TX_EMP_POST1_LVL);
 
        return 0;
 }
@@ -2507,7 +2413,7 @@ static int qmp_combo_com_init(struct qmp_combo *qmp, bool force)
                goto err_disable_regulators;
        }
 
-       ret = clk_bulk_prepare_enable(cfg->num_clks, qmp->clks);
+       ret = clk_bulk_prepare_enable(qmp->num_clks, qmp->clks);
        if (ret)
                goto err_assert_reset;
 
@@ -2557,7 +2463,7 @@ static int qmp_combo_com_exit(struct qmp_combo *qmp, bool force)
 
        reset_control_bulk_assert(cfg->num_resets, qmp->resets);
 
-       clk_bulk_disable_unprepare(cfg->num_clks, qmp->clks);
+       clk_bulk_disable_unprepare(qmp->num_clks, qmp->clks);
 
        regulator_bulk_disable(cfg->num_vregs, qmp->vregs);
 
@@ -2836,7 +2742,6 @@ static void qmp_combo_disable_autonomous_mode(struct qmp_combo *qmp)
 static int __maybe_unused qmp_combo_runtime_suspend(struct device *dev)
 {
        struct qmp_combo *qmp = dev_get_drvdata(dev);
-       const struct qmp_phy_cfg *cfg = qmp->cfg;
 
        dev_vdbg(dev, "Suspending QMP phy, mode:%d\n", qmp->mode);
 
@@ -2848,7 +2753,7 @@ static int __maybe_unused qmp_combo_runtime_suspend(struct device *dev)
        qmp_combo_enable_autonomous_mode(qmp);
 
        clk_disable_unprepare(qmp->pipe_clk);
-       clk_bulk_disable_unprepare(cfg->num_clks, qmp->clks);
+       clk_bulk_disable_unprepare(qmp->num_clks, qmp->clks);
 
        return 0;
 }
@@ -2856,7 +2761,6 @@ static int __maybe_unused qmp_combo_runtime_suspend(struct device *dev)
 static int __maybe_unused qmp_combo_runtime_resume(struct device *dev)
 {
        struct qmp_combo *qmp = dev_get_drvdata(dev);
-       const struct qmp_phy_cfg *cfg = qmp->cfg;
        int ret = 0;
 
        dev_vdbg(dev, "Resuming QMP phy, mode:%d\n", qmp->mode);
@@ -2866,14 +2770,14 @@ static int __maybe_unused qmp_combo_runtime_resume(struct device *dev)
                return 0;
        }
 
-       ret = clk_bulk_prepare_enable(cfg->num_clks, qmp->clks);
+       ret = clk_bulk_prepare_enable(qmp->num_clks, qmp->clks);
        if (ret)
                return ret;
 
        ret = clk_prepare_enable(qmp->pipe_clk);
        if (ret) {
                dev_err(dev, "pipe_clk enable failed, err=%d\n", ret);
-               clk_bulk_disable_unprepare(cfg->num_clks, qmp->clks);
+               clk_bulk_disable_unprepare(qmp->num_clks, qmp->clks);
                return ret;
        }
 
@@ -2944,9 +2848,8 @@ static int qmp_combo_reset_init(struct qmp_combo *qmp)
 
 static int qmp_combo_clk_init(struct qmp_combo *qmp)
 {
-       const struct qmp_phy_cfg *cfg = qmp->cfg;
        struct device *dev = qmp->dev;
-       int num = cfg->num_clks;
+       int num = ARRAY_SIZE(qmp_combo_phy_clk_l);
        int i;
 
        qmp->clks = devm_kcalloc(dev, num, sizeof(*qmp->clks), GFP_KERNEL);
@@ -2954,9 +2857,11 @@ static int qmp_combo_clk_init(struct qmp_combo *qmp)
                return -ENOMEM;
 
        for (i = 0; i < num; i++)
-               qmp->clks[i].id = cfg->clk_list[i];
+               qmp->clks[i].id = qmp_combo_phy_clk_l[i];
+
+       qmp->num_clks = num;
 
-       return devm_clk_bulk_get(dev, num, qmp->clks);
+       return devm_clk_bulk_get_optional(dev, num, qmp->clks);
 }
 
 static void phy_clk_release_provider(void *res)
@@ -3421,6 +3326,12 @@ static int qmp_combo_parse_dt_legacy(struct qmp_combo *qmp, struct device_node *
        if (ret)
                return ret;
 
+       ret = devm_clk_bulk_get_all(qmp->dev, &qmp->clks);
+       if (ret < 0)
+               return ret;
+
+       qmp->num_clks = ret;
+
        return 0;
 }
 
@@ -3431,6 +3342,7 @@ static int qmp_combo_parse_dt(struct qmp_combo *qmp)
        const struct qmp_combo_offsets *offs = cfg->offsets;
        struct device *dev = qmp->dev;
        void __iomem *base;
+       int ret;
 
        if (!offs)
                return -EINVAL;
@@ -3460,6 +3372,10 @@ static int qmp_combo_parse_dt(struct qmp_combo *qmp)
        }
        qmp->dp_dp_phy = base + offs->dp_dp_phy;
 
+       ret = qmp_combo_clk_init(qmp);
+       if (ret)
+               return ret;
+
        qmp->pipe_clk = devm_clk_get(dev, "usb3_pipe");
        if (IS_ERR(qmp->pipe_clk)) {
                return dev_err_probe(dev, PTR_ERR(qmp->pipe_clk),
@@ -3508,10 +3424,6 @@ static int qmp_combo_probe(struct platform_device *pdev)
 
        mutex_init(&qmp->phy_mutex);
 
-       ret = qmp_combo_clk_init(qmp);
-       if (ret)
-               return ret;
-
        ret = qmp_combo_reset_init(qmp);
        if (ret)
                return ret;
@@ -3603,6 +3515,10 @@ static const struct of_device_id qmp_combo_of_match_table[] = {
                .data = &sc7180_usb3dpphy_cfg,
        },
        {
+               .compatible = "qcom,sc7280-qmp-usb3-dp-phy",
+               .data = &sm8250_usb3dpphy_cfg,
+       },
+       {
                .compatible = "qcom,sc8180x-qmp-usb3-dp-phy",
                .data = &sc8180x_usb3dpphy_cfg,
        },
@@ -3619,6 +3535,10 @@ static const struct of_device_id qmp_combo_of_match_table[] = {
                .data = &sm6350_usb3dpphy_cfg,
        },
        {
+               .compatible = "qcom,sm8150-qmp-usb3-dp-phy",
+               .data = &sc8180x_usb3dpphy_cfg,
+       },
+       {
                .compatible = "qcom,sm8250-qmp-usb3-dp-phy",
                .data = &sm8250_usb3dpphy_cfg,
        },