diff options
Diffstat (limited to 'drivers/phy/qualcomm/phy-qcom-qmp.c')
| -rw-r--r-- | drivers/phy/qualcomm/phy-qcom-qmp.c | 124 | 
1 files changed, 124 insertions, 0 deletions
| diff --git a/drivers/phy/qualcomm/phy-qcom-qmp.c b/drivers/phy/qualcomm/phy-qcom-qmp.c index dbd6422a3233..6171b44da050 100644 --- a/drivers/phy/qualcomm/phy-qcom-qmp.c +++ b/drivers/phy/qualcomm/phy-qcom-qmp.c @@ -946,6 +946,88 @@ static const struct qmp_phy_init_tbl qmp_v3_usb3_tx_tbl[] = {  	QMP_PHY_INIT_CFG(QSERDES_V3_TX_RES_CODE_LANE_OFFSET_TX, 0x06),  }; +static const struct qmp_phy_init_tbl qmp_v3_dp_serdes_tbl[] = { +	QMP_PHY_INIT_CFG(QSERDES_V3_COM_SVS_MODE_CLK_SEL, 0x01), +	QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYSCLK_EN_SEL, 0x37), +	QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYS_CLK_CTRL, 0x02), +	QMP_PHY_INIT_CFG(QSERDES_V3_COM_CLK_ENABLE1, 0x0e), +	QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYSCLK_BUF_ENABLE, 0x06), +	QMP_PHY_INIT_CFG(QSERDES_V3_COM_CLK_SELECT, 0x30), +	QMP_PHY_INIT_CFG(QSERDES_V3_COM_CMN_CONFIG, 0x02), +	QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START1_MODE0, 0x00), +	QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN0_MODE0, 0x3f), +	QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN1_MODE0, 0x00), +	QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_MAP, 0x00), +	QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP3_MODE0, 0x00), +	QMP_PHY_INIT_CFG(QSERDES_V3_COM_BG_TIMER, 0x0a), +	QMP_PHY_INIT_CFG(QSERDES_V3_COM_CORECLK_DIV_MODE0, 0x0a), +	QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_CTRL, 0x00), +	QMP_PHY_INIT_CFG(QSERDES_V3_COM_BIAS_EN_CLKBUFLR_EN, 0x3f), +	QMP_PHY_INIT_CFG(QSERDES_V3_COM_CORE_CLK_EN, 0x1f), +	QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_IVCO, 0x07), +	QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_CCTRL_MODE0, 0x36), +	QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_RCTRL_MODE0, 0x16), +	QMP_PHY_INIT_CFG(QSERDES_V3_COM_CP_CTRL_MODE0, 0x06), +}; + +static const struct qmp_phy_init_tbl qmp_v3_dp_serdes_tbl_rbr[] = { +	QMP_PHY_INIT_CFG(QSERDES_V3_COM_HSCLK_SEL, 0x0c), +	QMP_PHY_INIT_CFG(QSERDES_V3_COM_DEC_START_MODE0, 0x69), +	QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START2_MODE0, 0x80), +	QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START3_MODE0, 0x07), +	QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP1_MODE0, 0x6f), +	QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP2_MODE0, 0x08), +	QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP_EN, 0x00), +}; + +static const struct qmp_phy_init_tbl qmp_v3_dp_serdes_tbl_hbr[] = { +	QMP_PHY_INIT_CFG(QSERDES_V3_COM_HSCLK_SEL, 0x04), +	QMP_PHY_INIT_CFG(QSERDES_V3_COM_DEC_START_MODE0, 0x69), +	QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START2_MODE0, 0x80), +	QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START3_MODE0, 0x07), +	QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP1_MODE0, 0x0f), +	QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP2_MODE0, 0x0e), +	QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP_EN, 0x00), +}; + +static const struct qmp_phy_init_tbl qmp_v3_dp_serdes_tbl_hbr2[] = { +	QMP_PHY_INIT_CFG(QSERDES_V3_COM_HSCLK_SEL, 0x00), +	QMP_PHY_INIT_CFG(QSERDES_V3_COM_DEC_START_MODE0, 0x8c), +	QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START2_MODE0, 0x00), +	QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START3_MODE0, 0x0a), +	QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP1_MODE0, 0x1f), +	QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP2_MODE0, 0x1c), +	QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP_EN, 0x00), +}; + +static const struct qmp_phy_init_tbl qmp_v3_dp_serdes_tbl_hbr3[] = { +	QMP_PHY_INIT_CFG(QSERDES_V3_COM_HSCLK_SEL, 0x03), +	QMP_PHY_INIT_CFG(QSERDES_V3_COM_DEC_START_MODE0, 0x69), +	QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START2_MODE0, 0x80), +	QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START3_MODE0, 0x07), +	QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP1_MODE0, 0x2f), +	QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP2_MODE0, 0x2a), +	QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP_EN, 0x08), +}; + +static const struct qmp_phy_init_tbl qmp_v3_dp_tx_tbl[] = { +	QMP_PHY_INIT_CFG(QSERDES_V3_TX_TRANSCEIVER_BIAS_EN, 0x1a), +	QMP_PHY_INIT_CFG(QSERDES_V3_TX_VMODE_CTRL1, 0x40), +	QMP_PHY_INIT_CFG(QSERDES_V3_TX_PRE_STALL_LDO_BOOST_EN, 0x30), +	QMP_PHY_INIT_CFG(QSERDES_V3_TX_INTERFACE_SELECT, 0x3d), +	QMP_PHY_INIT_CFG(QSERDES_V3_TX_CLKBUF_ENABLE, 0x0f), +	QMP_PHY_INIT_CFG(QSERDES_V3_TX_RESET_TSYNC_EN, 0x03), +	QMP_PHY_INIT_CFG(QSERDES_V3_TX_TRAN_DRVR_EMP_EN, 0x03), +	QMP_PHY_INIT_CFG(QSERDES_V3_TX_PARRATE_REC_DETECT_IDLE_EN, 0x00), +	QMP_PHY_INIT_CFG(QSERDES_V3_TX_TX_INTERFACE_MODE, 0x00), +	QMP_PHY_INIT_CFG(QSERDES_V3_TX_TX_BAND, 0x4), +	QMP_PHY_INIT_CFG(QSERDES_V3_TX_TX_POL_INV, 0x0a), +	QMP_PHY_INIT_CFG(QSERDES_V3_TX_TX_DRV_LVL, 0x38), +	QMP_PHY_INIT_CFG(QSERDES_V3_TX_TX_EMP_POST1_LVL, 0x20), +	QMP_PHY_INIT_CFG(QSERDES_V3_TX_RES_CODE_LANE_OFFSET_TX, 0x06), +	QMP_PHY_INIT_CFG(QSERDES_V3_TX_RES_CODE_LANE_OFFSET_RX, 0x07), +}; +  static const struct qmp_phy_init_tbl qmp_v3_usb3_rx_tbl[] = {  	QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_FASTLOCK_FO_GAIN, 0x0b),  	QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0f), @@ -2225,6 +2307,41 @@ static const struct qmp_phy_cfg sc7180_usb3phy_cfg = {  	.is_dual_lane_phy	= true,  }; +static const struct qmp_phy_cfg sc7180_dpphy_cfg = { +	.type			= PHY_TYPE_DP, +	.nlanes			= 1, + +	.serdes_tbl		= qmp_v3_dp_serdes_tbl, +	.serdes_tbl_num		= ARRAY_SIZE(qmp_v3_dp_serdes_tbl), +	.tx_tbl			= qmp_v3_dp_tx_tbl, +	.tx_tbl_num		= ARRAY_SIZE(qmp_v3_dp_tx_tbl), + +	.serdes_tbl_rbr		= qmp_v3_dp_serdes_tbl_rbr, +	.serdes_tbl_rbr_num	= ARRAY_SIZE(qmp_v3_dp_serdes_tbl_rbr), +	.serdes_tbl_hbr		= qmp_v3_dp_serdes_tbl_hbr, +	.serdes_tbl_hbr_num	= ARRAY_SIZE(qmp_v3_dp_serdes_tbl_hbr), +	.serdes_tbl_hbr2	= qmp_v3_dp_serdes_tbl_hbr2, +	.serdes_tbl_hbr2_num	= ARRAY_SIZE(qmp_v3_dp_serdes_tbl_hbr2), +	.serdes_tbl_hbr3	= qmp_v3_dp_serdes_tbl_hbr3, +	.serdes_tbl_hbr3_num	= ARRAY_SIZE(qmp_v3_dp_serdes_tbl_hbr3), + +	.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, +	.num_vregs		= ARRAY_SIZE(qmp_phy_vreg_l), +	.regs			= qmp_v3_usb3phy_regs_layout, + +	.has_phy_dp_com_ctrl	= true, +	.is_dual_lane_phy	= true, +}; + +static const struct qmp_phy_combo_cfg sc7180_usb3dpphy_cfg = { +	.usb_cfg		= &sc7180_usb3phy_cfg, +	.dp_cfg			= &sc7180_dpphy_cfg, +}; +  static const struct qmp_phy_cfg qmp_v3_usb3_uniphy_cfg = {  	.type			= PHY_TYPE_USB3,  	.nlanes			= 1, @@ -3745,6 +3862,9 @@ static const struct of_device_id qcom_qmp_phy_of_match_table[] = {  		.compatible = "qcom,sc7180-qmp-usb3-phy",  		.data = &sc7180_usb3phy_cfg,  	}, { +		.compatible = "qcom,sc7180-qmp-usb3-dp-phy", +		/* It's a combo phy */ +	}, {  		.compatible = "qcom,sdm845-qhp-pcie-phy",  		.data = &sdm845_qhp_pciephy_cfg,  	}, { @@ -3786,6 +3906,10 @@ static const struct of_device_id qcom_qmp_phy_of_match_table[] = {  MODULE_DEVICE_TABLE(of, qcom_qmp_phy_of_match_table);  static const struct of_device_id qcom_qmp_combo_phy_of_match_table[] = { +	{ +		.compatible = "qcom,sc7180-qmp-usb3-dp-phy", +		.data = &sc7180_usb3dpphy_cfg, +	},  	{ }  }; |