]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
phy: qualcomm: qmp-combo: Add DP offsets and settings for Glymur platforms
authorAbel Vesa <abelvesa@kernel.org>
Tue, 9 Dec 2025 23:09:45 +0000 (15:09 -0800)
committerVinod Koul <vkoul@kernel.org>
Tue, 23 Dec 2025 17:41:07 +0000 (23:11 +0530)
Starting with Glymur, the PCIe and DP PHYs qserdes register offsets differ
for the same version number. So in order to be able to differentiate
between them, add these ones with DP prefix.

Add the necessary PHY setting tables for enabling the DP path within the
QMP subsystem.  Introduced some new callbacks for v8 specific sequences,
such as for clock configurations based on the different link speeds.

Wesley Cheng added some updated settings from the hardware programming
guides on existing PHY tables and clock settings.

Co-developed-by: Wesley Cheng <wesley.cheng@oss.qualcomm.com>
Signed-off-by: Abel Vesa <abel.vesa@linaro.org>
Signed-off-by: Wesley Cheng <wesley.cheng@oss.qualcomm.com>
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
Link: https://patch.msgid.link/20251209-linux-next-12825-v8-9-42133596bda0@oss.qualcomm.com
Signed-off-by: Vinod Koul <vkoul@kernel.org>
drivers/phy/qualcomm/phy-qcom-qmp-combo.c
drivers/phy/qualcomm/phy-qcom-qmp-dp-phy-v8.h [new file with mode: 0644]
drivers/phy/qualcomm/phy-qcom-qmp-dp-qserdes-com-v8.h [new file with mode: 0644]

index 32a3f3a4ab05f11986f479ca53266b3ed7c8197c..97c6ff46c37358fca60c3ee42579eb459f595f71 100644 (file)
@@ -48,6 +48,7 @@
 #include "phy-qcom-qmp-dp-phy-v4.h"
 #include "phy-qcom-qmp-dp-phy-v5.h"
 #include "phy-qcom-qmp-dp-phy-v6.h"
+#include "phy-qcom-qmp-dp-phy-v8.h"
 
 #include "phy-qcom-qmp-usb43-pcs-v8.h"
 
@@ -103,6 +104,7 @@ enum qphy_reg_layout {
        QPHY_TX_TRANSCEIVER_BIAS_EN,
 
        QPHY_AON_TOGGLE_ENABLE,
+       QPHY_DP_AON_TOGGLE_ENABLE,
        /* Keep last to ensure regs_layout arrays are properly initialized */
        QPHY_LAYOUT_SIZE
 };
@@ -277,12 +279,16 @@ static const unsigned int qmp_v8_n3_usb43dpphy_regs_layout[QPHY_LAYOUT_SIZE] = {
 
        [QPHY_PCS_CLAMP_ENABLE]                 = QPHY_V8_PCS_AON_USB3_AON_CLAMP_ENABLE,
        [QPHY_AON_TOGGLE_ENABLE]                = QPHY_V8_PCS_AON_USB3_AON_TOGGLE_ENABLE,
+       [QPHY_DP_AON_TOGGLE_ENABLE]             = QPHY_V8_PCS_AON_DP_AON_TOGGLE_ENABLE,
 
        [QPHY_COM_RESETSM_CNTRL]                = QSERDES_V8_COM_RESETSM_CNTRL,
        [QPHY_COM_C_READY_STATUS]               = QSERDES_V8_COM_C_READY_STATUS,
        [QPHY_COM_CMN_STATUS]                   = QSERDES_V8_COM_CMN_STATUS,
        [QPHY_COM_BIAS_EN_CLKBUFLR_EN]  = QSERDES_V8_COM_BIAS_EN_CLKBUFLR_EN,
 
+       [QPHY_DP_PHY_STATUS]                    = QSERDES_V8_DP_PHY_STATUS,
+       [QPHY_DP_PHY_VCO_DIV]                   = QSERDES_V8_DP_PHY_VCO_DIV,
+
        [QPHY_TX_TX_DRV_LVL]                    = QSERDES_V8_LALB_TX0_DRV_LVL,
        [QPHY_TX_TX_EMP_POST1_LVL]              = QSERDES_V8_LALB_TX0_EMP_POST1_LVL,
        [QPHY_TX_HIGHZ_DRVR_EN]                 = QSERDES_V8_LALB_HIGHZ_DRVR_EN,
@@ -1378,6 +1384,38 @@ static const struct qmp_phy_init_tbl qmp_v6_n4_dp_serdes_tbl[] = {
        QMP_PHY_INIT_CFG(QSERDES_V6_COM_CORE_CLK_EN, 0x0f),
 };
 
+static const struct qmp_phy_init_tbl qmp_v8_dp_serdes_tbl[] = {
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_SSC_STEP_SIZE2_MODE0, 0x00),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_CP_CTRL_MODE0, 0x06),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_PLL_RCTRL_MODE1, 0x10),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_PLL_CCTRL_MODE1, 0x01),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_CORECLK_DIV_MODE0, 0x0a),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_DIV_FRAC_START1_MODE0, 0x00),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_INTEGLOOP_GAIN0_MODE0, 0x3f),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_INTEGLOOP_GAIN1_MODE0, 0x00),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_BG_TIMER, 0x0a),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_SSC_EN_CENTER, 0x00),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_SSC_ADJ_PER1, 0x00),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_SSC_PER1, 0x00),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_SSC_PER2, 0x00),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_CLK_ENABLE1, 0x0c),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_SYS_CLK_CTRL, 0x02),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_SYSCLK_BUF_ENABLE, 0x06),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_PLL_IVCO, 0x07),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_SYSCLK_EN_SEL, 0x3b),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_LOCK_CMP_EN, 0x00),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_VCO_TUNE_CTRL, 0x00),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_VCO_TUNE_MAP, 0x00),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_CLK_SELECT, 0x30),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_CORE_CLK_EN, 0x00),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_CMN_CONFIG_1, 0x56),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_SVS_MODE_CLK_SEL, 0x15),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_CMN_MODE_CONTD1, 0x24),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_DCC_CAL_1, 0x40),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_DCC_CAL_3, 0x60),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_PSM_CAL_EN, 0x01),
+};
+
 static const struct qmp_phy_init_tbl qmp_v6_dp_tx_tbl[] = {
        QMP_PHY_INIT_CFG(QSERDES_V6_TX_VMODE_CTRL1, 0x40),
        QMP_PHY_INIT_CFG(QSERDES_V6_TX_PRE_STALL_LDO_BOOST_EN, 0x30),
@@ -1405,6 +1443,33 @@ static const struct qmp_phy_init_tbl qmp_v6_n4_dp_tx_tbl[] = {
        QMP_PHY_INIT_CFG(QSERDES_V6_N4_TX_TX_BAND, 0x1),
 };
 
+static const struct qmp_phy_init_tbl qmp_v8_n3p_dp_tx_tbl[] = {
+       QMP_PHY_INIT_CFG(QSERDES_V8_LALB_TRANSMITTER_EN_CTRL, 0x3f),
+       QMP_PHY_INIT_CFG(QSERDES_V8_LALB_VMODE_CTRL1, 0x40),
+       QMP_PHY_INIT_CFG(QSERDES_V8_LALB_ANA_INTERFACE_SELECT1, 0x07),
+       QMP_PHY_INIT_CFG(QSERDES_V8_LALB_ANA_INTERFACE_SELECT2, 0x18),
+       QMP_PHY_INIT_CFG(QSERDES_V8_LALB_PCS_INTERFACE_SELECT1, 0x50),
+       QMP_PHY_INIT_CFG(QSERDES_V8_LALB_LANE_MODE_1, 0x0d),
+       QMP_PHY_INIT_CFG(QSERDES_V8_LALB_CLKBUF_ENABLE, 0x07),
+       QMP_PHY_INIT_CFG(QSERDES_V8_LALB_RESET_TSYNC_EN_CTRL, 0x0a),
+       QMP_PHY_INIT_CFG(QSERDES_V8_LALB_TX_LVL_UPDATE_CTRL, 0x0f),
+       QMP_PHY_INIT_CFG(QSERDES_V8_LALB_TRAN_DRVR_EMP_EN, 0x5f),
+       QMP_PHY_INIT_CFG(QSERDES_V8_LALB_TX0_EMP_POST1_LVL, 0x20),
+       QMP_PHY_INIT_CFG(QSERDES_V8_LALB_TX1_EMP_POST1_LVL, 0x20),
+       QMP_PHY_INIT_CFG(QSERDES_V8_LALB_TX0_PRE1_EMPH, 0x20),
+       QMP_PHY_INIT_CFG(QSERDES_V8_LALB_TX1_PRE1_EMPH, 0x20),
+       QMP_PHY_INIT_CFG(QSERDES_V8_LALB_TX0_DRV_LVL, 0x00),
+       QMP_PHY_INIT_CFG(QSERDES_V8_LALB_TX1_DRV_LVL, 0x00),
+       QMP_PHY_INIT_CFG(QSERDES_V8_LALB_HIGHZ_DRVR_EN, 0x30),
+       QMP_PHY_INIT_CFG(QSERDES_V8_LALB_LANE_MODE_2, 0x50),
+       QMP_PHY_INIT_CFG(QSERDES_V8_LALB_LANE_MODE_3, 0x51),
+       QMP_PHY_INIT_CFG(QSERDES_V8_LALB_TX_DCC_ANA_CTRL2, 0x00),
+       QMP_PHY_INIT_CFG(QSERDES_V8_LALB_TX0_RESTRIM_CAL_CTRL, 0x20),
+       QMP_PHY_INIT_CFG(QSERDES_V8_LALB_TX1_RESTRIM_CAL_CTRL, 0x02),
+       QMP_PHY_INIT_CFG(QSERDES_V8_LALB_TX0_RESTRIM_POST_CAL_OFFSET, 0x10),
+       QMP_PHY_INIT_CFG(QSERDES_V8_LALB_TX1_RESTRIM_POST_CAL_OFFSET, 0x10),
+};
+
 static const struct qmp_phy_init_tbl qmp_v6_dp_serdes_tbl_rbr[] = {
        QMP_PHY_INIT_CFG(QSERDES_V6_COM_HSCLK_SEL_1, 0x05),
        QMP_PHY_INIT_CFG(QSERDES_V6_COM_DEC_START_MODE0, 0x34),
@@ -1521,6 +1586,109 @@ static const struct qmp_phy_init_tbl qmp_v6_n4_dp_serdes_tbl_hbr3[] = {
        QMP_PHY_INIT_CFG(QSERDES_V6_COM_SSC_STEP_SIZE2_MODE0, 0x01),
 };
 
+static const struct qmp_phy_init_tbl qmp_v8_dp_serdes_tbl_rbr[] = {
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_HSCLK_SEL_1, 0x05),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_BIN_VCOCAL_CMP_CODE1_MODE0, 0x7a),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_BIN_VCOCAL_CMP_CODE2_MODE0, 0x02),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_SSC_STEP_SIZE1_MODE0, 0x83),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_LOCK_CMP1_MODE0, 0x37),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_LOCK_CMP2_MODE0, 0x04),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_DEC_START_MODE0, 0x54),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_DIV_FRAC_START2_MODE0, 0x00),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_DIV_FRAC_START3_MODE0, 0x06),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_VCO_TUNE1_MODE0, 0xfe),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_VCO_TUNE2_MODE0, 0x00),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_BIN_VCOCAL_HSCLK_SEL_1, 0x05),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_CMN_MODE_CONTD3, 0x07),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_CLK_FWD_CONFIG_1, 0x30),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_IP_CTRL_AND_DP_SEL, 0xa4),
+};
+
+static const struct qmp_phy_init_tbl qmp_v8_dp_serdes_tbl_hbr[] = {
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_HSCLK_SEL_1, 0x04),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_BIN_VCOCAL_CMP_CODE1_MODE0, 0x21),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_BIN_VCOCAL_CMP_CODE2_MODE0, 0x04),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_SSC_STEP_SIZE1_MODE0, 0x18),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_LOCK_CMP1_MODE0, 0x07),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_LOCK_CMP2_MODE0, 0x07),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_DEC_START_MODE0, 0x46),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_DIV_FRAC_START2_MODE0, 0x00),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_DIV_FRAC_START3_MODE0, 0x05),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_VCO_TUNE1_MODE0, 0xae),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_VCO_TUNE2_MODE0, 0x02),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_BIN_VCOCAL_HSCLK_SEL_1, 0x04),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_CMN_MODE_CONTD3, 0x07),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_CLK_FWD_CONFIG_1, 0x3f),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_IP_CTRL_AND_DP_SEL, 0xa3),
+};
+
+static const struct qmp_phy_init_tbl qmp_v8_dp_serdes_tbl_hbr2[] = {
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_HSCLK_SEL_1, 0x03),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_BIN_VCOCAL_CMP_CODE1_MODE0, 0xf6),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_BIN_VCOCAL_CMP_CODE2_MODE0, 0x20),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_SSC_STEP_SIZE1_MODE0, 0x0),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_PLL_RCTRL_MODE0, 0x16),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_PLL_CCTRL_MODE0, 0x36),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_LOCK_CMP1_MODE0, 0x10),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_LOCK_CMP2_MODE0, 0x0e),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_DEC_START_MODE0, 0x46),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_DIV_FRAC_START2_MODE0, 0x00),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_DIV_FRAC_START3_MODE0, 0x05),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_VCO_TUNE1_MODE0, 0xae),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_VCO_TUNE2_MODE0, 0x02),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_BIN_VCOCAL_HSCLK_SEL_1, 0x00),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_IP_CTRL_AND_DP_SEL, 0xbf),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_BIAS_EN_CLKBUFLR_EN, 0x1c),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_RESETSM_CNTRL, 0x20),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_CMN_MODE_CONTD3, 0x03),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_CLK_FWD_CONFIG_1, 0x3f),
+};
+
+static const struct qmp_phy_init_tbl qmp_v8_dp_serdes_tbl_hbr3[] = {
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_HSCLK_SEL_1, 0x02),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_BIN_VCOCAL_CMP_CODE1_MODE0, 0x63),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_BIN_VCOCAL_CMP_CODE2_MODE0, 0x0c),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_SSC_STEP_SIZE1_MODE0, 0x5b),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_SSC_STEP_SIZE2_MODE0, 0x02),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_CP_CTRL_MODE0, 0x06),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_PLL_RCTRL_MODE0, 0x16),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_PLL_CCTRL_MODE0, 0x36),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_CORECLK_DIV_MODE0, 0x0a),
+
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_LOCK_CMP1_MODE0, 0x17),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_LOCK_CMP2_MODE0, 0x15),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_DEC_START_MODE0, 0x4f),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_DIV_FRAC_START1_MODE0, 0x00),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_DIV_FRAC_START2_MODE0, 0xa0),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_DIV_FRAC_START3_MODE0, 0x01),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_INTEGLOOP_GAIN0_MODE0, 0x3f),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_INTEGLOOP_GAIN1_MODE0, 0x00),
+
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_VCO_TUNE1_MODE0, 0xa0),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_VCO_TUNE2_MODE0, 0x01),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_SSC_ADJ_PER1, 0x00),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_SSC_PER1, 0x6b),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_SSC_PER2, 0x02),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_CLK_ENABLE1, 0x0c),
+
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_SYS_CLK_CTRL, 0x02),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_SYSCLK_BUF_ENABLE, 0x06),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_PLL_IVCO, 0x07),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_SYSCLK_EN_SEL, 0x04),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_VCO_TUNE_CTRL, 0x00),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_VCO_TUNE_MAP, 0x00),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_CLK_SELECT, 0x30),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_CORE_CLK_EN, 0x00),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_CMN_CONFIG_1, 0x16),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_SVS_MODE_CLK_SEL, 0x15),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_CLK_FWD_CONFIG_1, 0x30),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_BIAS_EN_CLKBUFLR_EN, 0x10),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_CMN_MODE_CONTD3, 0x05),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_CMN_MODE_CONTD1, 0x24),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_BIN_VCOCAL_HSCLK_SEL_1, 0x02),
+       QMP_PHY_INIT_CFG(QSERDES_V8_USB43_COM_IP_CTRL_AND_DP_SEL, 0x84),
+};
+
 static const struct qmp_phy_init_tbl sc8280xp_usb43dp_serdes_tbl[] = {
        QMP_PHY_INIT_CFG(QSERDES_V5_COM_SSC_EN_CENTER, 0x01),
        QMP_PHY_INIT_CFG(QSERDES_V5_COM_SSC_PER1, 0x31),
@@ -2070,6 +2238,7 @@ struct qmp_phy_cfg {
        const u8 (*pre_emphasis_hbr3_hbr2)[4][4];
 
        /* DP PHY callbacks */
+       int (*configure_dp_clocks)(struct qmp_combo *qmp);
        int (*configure_dp_phy)(struct qmp_combo *qmp);
        void (*configure_dp_tx)(struct qmp_combo *qmp);
        int (*calibrate_dp_phy)(struct qmp_combo *qmp);
@@ -2147,6 +2316,7 @@ struct qmp_combo {
 
 static void qmp_v3_dp_aux_init(struct qmp_combo *qmp);
 static void qmp_v3_configure_dp_tx(struct qmp_combo *qmp);
+static int qmp_v3_configure_dp_clocks(struct qmp_combo *qmp);
 static int qmp_v3_configure_dp_phy(struct qmp_combo *qmp);
 static int qmp_v3_calibrate_dp_phy(struct qmp_combo *qmp);
 
@@ -2155,6 +2325,10 @@ 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 void qmp_v8_dp_aux_init(struct qmp_combo *qmp);
+static int qmp_v8_configure_dp_clocks(struct qmp_combo *qmp);
+static int qmp_v8_configure_dp_phy(struct qmp_combo *qmp);
+
 static inline void qphy_setbits(void __iomem *base, u32 offset, u32 val)
 {
        u32 reg;
@@ -2288,6 +2462,7 @@ static const struct qmp_phy_cfg sar2130p_usb3dpphy_cfg = {
 
        .dp_aux_init            = qmp_v4_dp_aux_init,
        .configure_dp_tx        = qmp_v4_configure_dp_tx,
+       .configure_dp_clocks    = qmp_v3_configure_dp_clocks,
        .configure_dp_phy       = qmp_v4_configure_dp_phy,
        .calibrate_dp_phy       = qmp_v4_calibrate_dp_phy,
 
@@ -2423,6 +2598,7 @@ static const struct qmp_phy_cfg sc8180x_usb3dpphy_cfg = {
 
        .dp_aux_init            = qmp_v4_dp_aux_init,
        .configure_dp_tx        = qmp_v4_configure_dp_tx,
+       .configure_dp_clocks    = qmp_v3_configure_dp_clocks,
        .configure_dp_phy       = qmp_v4_configure_dp_phy,
        .calibrate_dp_phy       = qmp_v4_calibrate_dp_phy,
 
@@ -2469,6 +2645,7 @@ 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_clocks    = qmp_v3_configure_dp_clocks,
        .configure_dp_phy       = qmp_v4_configure_dp_phy,
        .calibrate_dp_phy       = qmp_v4_calibrate_dp_phy,
 
@@ -2514,6 +2691,7 @@ static const struct qmp_phy_cfg x1e80100_usb3dpphy_cfg = {
 
        .dp_aux_init            = qmp_v4_dp_aux_init,
        .configure_dp_tx        = qmp_v4_configure_dp_tx,
+       .configure_dp_clocks    = qmp_v3_configure_dp_clocks,
        .configure_dp_phy       = qmp_v4_configure_dp_phy,
        .calibrate_dp_phy       = qmp_v4_calibrate_dp_phy,
 
@@ -2602,6 +2780,7 @@ static const struct qmp_phy_cfg sm8250_usb3dpphy_cfg = {
 
        .dp_aux_init            = qmp_v4_dp_aux_init,
        .configure_dp_tx        = qmp_v4_configure_dp_tx,
+       .configure_dp_clocks    = qmp_v3_configure_dp_clocks,
        .configure_dp_phy       = qmp_v4_configure_dp_phy,
        .calibrate_dp_phy       = qmp_v4_calibrate_dp_phy,
 
@@ -2650,6 +2829,7 @@ static const struct qmp_phy_cfg sm8350_usb3dpphy_cfg = {
 
        .dp_aux_init            = qmp_v4_dp_aux_init,
        .configure_dp_tx        = qmp_v4_configure_dp_tx,
+       .configure_dp_clocks    = qmp_v3_configure_dp_clocks,
        .configure_dp_phy       = qmp_v4_configure_dp_phy,
        .calibrate_dp_phy       = qmp_v4_calibrate_dp_phy,
 
@@ -2697,6 +2877,7 @@ static const struct qmp_phy_cfg sm8550_usb3dpphy_cfg = {
 
        .dp_aux_init            = qmp_v4_dp_aux_init,
        .configure_dp_tx        = qmp_v4_configure_dp_tx,
+       .configure_dp_clocks    = qmp_v3_configure_dp_clocks,
        .configure_dp_phy       = qmp_v4_configure_dp_phy,
        .calibrate_dp_phy       = qmp_v4_calibrate_dp_phy,
 
@@ -2742,6 +2923,7 @@ static const struct qmp_phy_cfg sm8650_usb3dpphy_cfg = {
 
        .dp_aux_init            = qmp_v4_dp_aux_init,
        .configure_dp_tx        = qmp_v4_configure_dp_tx,
+       .configure_dp_clocks    = qmp_v3_configure_dp_clocks,
        .configure_dp_phy       = qmp_v4_configure_dp_phy,
        .calibrate_dp_phy       = qmp_v4_calibrate_dp_phy,
 
@@ -2787,6 +2969,7 @@ static const struct qmp_phy_cfg sm8750_usb3dpphy_cfg = {
 
        .dp_aux_init            = qmp_v4_dp_aux_init,
        .configure_dp_tx        = qmp_v4_configure_dp_tx,
+       .configure_dp_clocks    = qmp_v3_configure_dp_clocks,
        .configure_dp_phy       = qmp_v4_configure_dp_phy,
        .calibrate_dp_phy       = qmp_v4_calibrate_dp_phy,
 
@@ -2811,6 +2994,31 @@ static const struct qmp_phy_cfg glymur_usb3dpphy_cfg = {
        .pcs_misc_tbl           = glymur_usb43dp_pcs_misc_tbl,
        .pcs_misc_tbl_num       = ARRAY_SIZE(glymur_usb43dp_pcs_misc_tbl),
 
+       .dp_serdes_tbl          = qmp_v8_dp_serdes_tbl,
+       .dp_serdes_tbl_num      = ARRAY_SIZE(qmp_v8_dp_serdes_tbl),
+       .dp_tx_tbl              = qmp_v8_n3p_dp_tx_tbl,
+       .dp_tx_tbl_num          = ARRAY_SIZE(qmp_v8_n3p_dp_tx_tbl),
+
+       .serdes_tbl_rbr         = qmp_v8_dp_serdes_tbl_rbr,
+       .serdes_tbl_rbr_num     = ARRAY_SIZE(qmp_v8_dp_serdes_tbl_rbr),
+       .serdes_tbl_hbr         = qmp_v8_dp_serdes_tbl_hbr,
+       .serdes_tbl_hbr_num     = ARRAY_SIZE(qmp_v8_dp_serdes_tbl_hbr),
+       .serdes_tbl_hbr2        = qmp_v8_dp_serdes_tbl_hbr2,
+       .serdes_tbl_hbr2_num    = ARRAY_SIZE(qmp_v8_dp_serdes_tbl_hbr2),
+       .serdes_tbl_hbr3        = qmp_v8_dp_serdes_tbl_hbr3,
+       .serdes_tbl_hbr3_num    = ARRAY_SIZE(qmp_v8_dp_serdes_tbl_hbr3),
+
+       .swing_hbr_rbr          = &qmp_dp_v6_voltage_swing_hbr_rbr,
+       .pre_emphasis_hbr_rbr   = &qmp_dp_v6_pre_emphasis_hbr_rbr,
+       .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_v8_dp_aux_init,
+       .configure_dp_tx        = qmp_v4_configure_dp_tx,
+       .configure_dp_clocks    = qmp_v8_configure_dp_clocks,
+       .configure_dp_phy       = qmp_v8_configure_dp_phy,
+       .calibrate_dp_phy       = qmp_v4_calibrate_dp_phy,
+
        .regs                   = qmp_v8_n3_usb43dpphy_regs_layout,
        .reset_list             = msm8996_usb3phy_reset_l,
        .num_resets             = ARRAY_SIZE(msm8996_usb3phy_reset_l),
@@ -2980,7 +3188,7 @@ static bool qmp_combo_configure_dp_mode(struct qmp_combo *qmp)
        return reverse;
 }
 
-static int qmp_combo_configure_dp_clocks(struct qmp_combo *qmp)
+static int qmp_v3_configure_dp_clocks(struct qmp_combo *qmp)
 {
        const struct phy_configure_opts_dp *dp_opts = &qmp->dp_opts;
        u32 phy_vco_div;
@@ -3027,7 +3235,7 @@ static int qmp_v3_configure_dp_phy(struct qmp_combo *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);
+       ret = qmp_v3_configure_dp_clocks(qmp);
        if (ret)
                return ret;
 
@@ -3113,6 +3321,35 @@ static void qmp_v4_dp_aux_init(struct qmp_combo *qmp)
               qmp->dp_dp_phy + QSERDES_V4_DP_PHY_AUX_INTERRUPT_MASK);
 }
 
+static void qmp_v8_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_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(0x1c, 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);
+       writel(0x06, 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);
+}
+
 static void qmp_v4_configure_dp_tx(struct qmp_combo *qmp)
 {
        const struct qmp_phy_cfg *cfg = qmp->cfg;
@@ -3127,6 +3364,58 @@ static void qmp_v4_configure_dp_tx(struct qmp_combo *qmp)
        qmp_combo_configure_dp_swing(qmp);
 }
 
+static int qmp_v8_configure_dp_clocks(struct qmp_combo *qmp)
+{
+       const struct phy_configure_opts_dp *dp_opts = &qmp->dp_opts;
+       u32 phy_vco_div;
+       unsigned long pixel_freq;
+       const struct qmp_phy_cfg *cfg = qmp->cfg;
+
+       switch (dp_opts->link_rate) {
+       case 1620:
+               phy_vco_div = 0x4;
+               pixel_freq = 1620000000UL / 2;
+               break;
+       case 2700:
+               phy_vco_div = 0x2;
+               pixel_freq = 2700000000UL / 2;
+               break;
+       case 5400:
+               phy_vco_div = 0x4;
+               pixel_freq = 5400000000UL / 4;
+               break;
+       case 8100:
+               phy_vco_div = 0x3;
+               pixel_freq = 8100000000UL / 6;
+               break;
+       default:
+               /* Other link rates aren't supported */
+               return -EINVAL;
+       }
+       writel(phy_vco_div, qmp->dp_dp_phy + cfg->regs[QPHY_DP_PHY_VCO_DIV]);
+
+       /* disable core reset tsync */
+       writel(0x09, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG);
+
+       writel(0x04, qmp->dp_dp_phy + QSERDES_V8_DP_PHY_AUXLESS_SETUP_CYC);
+       writel(0x08, qmp->dp_dp_phy + QSERDES_V8_DP_PHY_AUXLESS_SILENCE_CYC);
+       writel(0x08, qmp->dp_dp_phy + QSERDES_V8_DP_PHY_LFPS_CYC);
+       writel(0x11, qmp->dp_dp_phy + QSERDES_V8_DP_PHY_LFPS_PERIOD);
+
+       writel(0x3e, qmp->dp_dp_phy + QSERDES_V8_DP_PHY_TSYNC_OVRD);
+       writel(0x05, qmp->dp_dp_phy + QSERDES_V8_DP_PHY_TX2_TX3_LANE_CTL);
+       writel(0x05, qmp->dp_dp_phy + QSERDES_V8_DP_PHY_TX0_TX1_LANE_CTL);
+       writel(0x01, qmp->dp_dp_phy + QSERDES_V8_DP_PHY_AUXLESS_CFG1);
+       writel(0x11, qmp->dp_dp_phy + QSERDES_V8_DP_PHY_LFPS_PERIOD);
+       writel(0x1f, qmp->dp_dp_phy + QSERDES_V8_DP_PHY_LN0_DRV_LVL);
+       writel(0x1f, qmp->dp_dp_phy + QSERDES_V8_DP_PHY_LN1_DRV_LVL);
+
+       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_v456_configure_dp_phy(struct qmp_combo *qmp)
 {
        const struct qmp_phy_cfg *cfg = qmp->cfg;
@@ -3143,7 +3432,7 @@ 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);
 
-       ret = qmp_combo_configure_dp_clocks(qmp);
+       ret = qmp->cfg->configure_dp_clocks(qmp);
        if (ret)
                return ret;
 
@@ -3257,6 +3546,62 @@ static int qmp_v4_configure_dp_phy(struct qmp_combo *qmp)
        return 0;
 }
 
+static int qmp_v8_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);
+       if (ret < 0)
+               return ret;
+
+       if (dp_opts->lanes == 1) {
+               bias0_en = reverse ? 0x3e : 0x15;
+               bias1_en = reverse ? 0x15 : 0x3e;
+               drvr0_en = reverse ? 0x13 : 0x10;
+               drvr1_en = reverse ? 0x10 : 0x13;
+       } else if (dp_opts->lanes == 2) {
+               bias0_en = reverse ? 0x3f : 0x15;
+               bias1_en = reverse ? 0x15 : 0x3f;
+               drvr0_en = 0x10;
+               drvr1_en = 0x10;
+       } else {
+               bias0_en = 0x3f;
+               bias1_en = 0x3f;
+               drvr0_en = 0x34;
+               drvr1_en = 0x34;
+       }
+
+       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(0x08, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG);
+       udelay(100);
+       writel(0x09, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG);
+       udelay(500);
+
+       if (readl_poll_timeout(qmp->dp_dp_phy + cfg->regs[QPHY_DP_PHY_STATUS],
+                       status,
+                       ((status & BIT(1)) > 0),
+                       500,
+                       10000))
+               return -ETIMEDOUT;
+
+       writel(0x00, qmp->dp_tx + cfg->regs[QPHY_TX_TX_DRV_LVL]);
+       writel(0x00, qmp->dp_tx2 + cfg->regs[QPHY_TX_TX_DRV_LVL]);
+
+       writel(0x2b, qmp->dp_tx + cfg->regs[QPHY_TX_TX_EMP_POST1_LVL]);
+       writel(0x2b, qmp->dp_tx2 + cfg->regs[QPHY_TX_TX_EMP_POST1_LVL]);
+
+       return 0;
+}
+
 /*
  * We need to calibrate the aux setting here as many times
  * as the caller tries
@@ -3351,8 +3696,10 @@ static int qmp_combo_com_init(struct qmp_combo *qmp, bool force)
                        SW_USB3PHY_RESET_MUX | SW_USB3PHY_RESET);
 
        /* override hardware control for reset of qmp phy */
-       if (pcs_aon && cfg->regs[QPHY_AON_TOGGLE_ENABLE])
+       if (pcs_aon && cfg->regs[QPHY_AON_TOGGLE_ENABLE]) {
                qphy_clrbits(pcs_aon, cfg->regs[QPHY_AON_TOGGLE_ENABLE], 0x1);
+               qphy_clrbits(pcs_aon, cfg->regs[QPHY_DP_AON_TOGGLE_ENABLE], 0x1);
+       }
 
        /* Use software based port select and switch on typec orientation */
        val = SW_PORTSELECT_MUX;
diff --git a/drivers/phy/qualcomm/phy-qcom-qmp-dp-phy-v8.h b/drivers/phy/qualcomm/phy-qcom-qmp-dp-phy-v8.h
new file mode 100644 (file)
index 0000000..b6a8ab5
--- /dev/null
@@ -0,0 +1,25 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (c) 2017, The Linux Foundation. All rights reserved.
+ */
+
+#ifndef QCOM_PHY_QMP_DP_PHY_V8_H_
+#define QCOM_PHY_QMP_DP_PHY_V8_H_
+
+/* Only for QMP V8 PHY - DP PHY registers */
+#define QSERDES_V8_DP_PHY_VCO_DIV                      0x070
+#define QSERDES_V8_DP_PHY_AUX_INTERRUPT_STATUS         0x0e0
+#define QSERDES_V8_DP_PHY_TSYNC_OVRD                   0x074
+#define QSERDES_V8_DP_PHY_TX0_TX1_LANE_CTL             0x078
+#define QSERDES_V8_DP_PHY_TX2_TX3_LANE_CTL             0x0bc
+#define QSERDES_V8_DP_PHY_AUXLESS_CFG1                 0x0c8
+#define QSERDES_V8_DP_PHY_LFPS_PERIOD                  0x0d0
+#define QSERDES_V8_DP_PHY_LFPS_CYC                     0x0d4
+#define QSERDES_V8_DP_PHY_AUXLESS_SETUP_CYC            0x0d8
+#define QSERDES_V8_DP_PHY_AUXLESS_SILENCE_CYC          0x0d8
+#define QSERDES_V8_DP_PHY_LN0_DRV_LVL                  0x0e0
+#define QSERDES_V8_DP_PHY_LN1_DRV_LVL                  0x0e4
+#define QSERDES_V8_DP_PHY_STATUS                       0x114
+
+
+#endif
diff --git a/drivers/phy/qualcomm/phy-qcom-qmp-dp-qserdes-com-v8.h b/drivers/phy/qualcomm/phy-qcom-qmp-dp-qserdes-com-v8.h
new file mode 100644 (file)
index 0000000..2bef1ee
--- /dev/null
@@ -0,0 +1,52 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2025 Linaro Ltd.
+ */
+
+#ifndef QCOM_PHY_QMP_DP_QSERDES_COM_V8_H_
+#define QCOM_PHY_QMP_DP_QSERDES_COM_V8_H_
+
+/* Only for DP QMP V8 PHY - QSERDES COM registers */
+#define DP_QSERDES_V8_COM_HSCLK_SEL_1                  0x03c
+#define DP_QSERDES_V8_COM_BIN_VCOCAL_CMP_CODE1_MODE0   0x058
+#define DP_QSERDES_V8_COM_BIN_VCOCAL_CMP_CODE2_MODE0   0x05c
+#define DP_QSERDES_V8_COM_SSC_STEP_SIZE1_MODE0         0x060
+#define DP_QSERDES_V8_COM_SSC_STEP_SIZE2_MODE0         0x064
+#define DP_QSERDES_V8_COM_CP_CTRL_MODE0                        0x070
+#define DP_QSERDES_V8_COM_PLL_RCTRL_MODE0              0x074
+#define DP_QSERDES_V8_COM_PLL_CCTRL_MODE0              0x078
+#define DP_QSERDES_V8_COM_CORECLK_DIV_MODE0            0x07c
+#define DP_QSERDES_V8_COM_LOCK_CMP1_MODE0              0x080
+#define DP_QSERDES_V8_COM_LOCK_CMP2_MODE0              0x084
+#define DP_QSERDES_V8_COM_DEC_START_MODE0              0x088
+#define DP_QSERDES_V8_COM_DIV_FRAC_START1_MODE0                0x090
+#define DP_QSERDES_V8_COM_DIV_FRAC_START2_MODE0                0x094
+#define DP_QSERDES_V8_COM_DIV_FRAC_START3_MODE0                0x098
+#define DP_QSERDES_V8_COM_INTEGLOOP_GAIN0_MODE0                0x0a0
+#define DP_QSERDES_V8_COM_VCO_TUNE1_MODE0              0x0a8
+#define DP_QSERDES_V8_COM_INTEGLOOP_GAIN1_MODE0                0x0a4
+#define DP_QSERDES_V8_COM_VCO_TUNE2_MODE0              0x0ac
+#define DP_QSERDES_V8_COM_BG_TIMER                     0x0bc
+#define DP_QSERDES_V8_COM_SSC_EN_CENTER                        0x0c0
+#define DP_QSERDES_V8_COM_SSC_ADJ_PER1                 0x0c4
+#define DP_QSERDES_V8_COM_SSC_PER1                     0x0cc
+#define DP_QSERDES_V8_COM_SSC_PER2                     0x0d0
+#define DP_QSERDES_V8_COM_BIAS_EN_CLKBUFLR_EN          0x0dc
+#define DP_QSERDES_V8_COM_CLK_ENABLE1                  0x0e0
+#define DP_QSERDES_V8_COM_SYS_CLK_CTRL                 0x0e4
+#define DP_QSERDES_V8_COM_SYSCLK_BUF_ENABLE            0x0e8
+#define DP_QSERDES_V8_COM_PLL_IVCO                     0x0f4
+#define DP_QSERDES_V8_COM_SYSCLK_EN_SEL                        0x110
+#define DP_QSERDES_V8_COM_RESETSM_CNTRL                        0x118
+#define DP_QSERDES_V8_COM_LOCK_CMP_EN                  0x120
+#define DP_QSERDES_V8_COM_VCO_TUNE_CTRL                        0x13c
+#define DP_QSERDES_V8_COM_VCO_TUNE_MAP                 0x140
+#define DP_QSERDES_V8_COM_CLK_SELECT                   0x164
+#define DP_QSERDES_V8_COM_CORE_CLK_EN                  0x170
+#define DP_QSERDES_V8_COM_CMN_CONFIG_1                 0x174
+#define DP_QSERDES_V8_COM_SVS_MODE_CLK_SEL             0x180
+#define DP_QSERDES_V8_COM_CLK_FWD_CONFIG_1             0x2f4
+#define DP_QSERDES_V8_COM_CMN_STATUS                   0x314
+#define DP_QSERDES_V8_COM_C_READY_STATUS               0x33c
+
+#endif