This patch introduces new data structures to support DP functionality: - `qmp_phy_dp_cfg`: Platform-specific constant configuration for DP PHY, including init tables, function callbacks, swing/pre-emphasis tables, and regulator definitions. - `qmp_phy_dp_layout`: Runtime layout for DP PHY, including mapped registers, DP options from driver, and dynamically configured clocks. - `qmp_usbc_dp_offsets`: Platform-defined base offsets for DP sub-blocks.
These structures mirror the USB counterparts and enable clean separation of DP logic. Signed-off-by: Xiangxu Yin <xiangxu....@oss.qualcomm.com> --- drivers/phy/qualcomm/phy-qcom-qmp-usbc.c | 70 ++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/drivers/phy/qualcomm/phy-qcom-qmp-usbc.c b/drivers/phy/qualcomm/phy-qcom-qmp-usbc.c index 647e2f54b744bf099ea667e672c606dd7aef3bcf..bc0eaa7dba9cb84b54c7c5a264aac613f888cb99 100644 --- a/drivers/phy/qualcomm/phy-qcom-qmp-usbc.c +++ b/drivers/phy/qualcomm/phy-qcom-qmp-usbc.c @@ -291,6 +291,12 @@ enum qmp_phy_usbc_type { QMP_PHY_USBC_DP, }; +/* list of regulators */ +struct qmp_regulator_data { + const char *name; + unsigned int enable_load; +}; + struct qmp_phy_cfg { int type; const void *cfg; @@ -341,6 +347,67 @@ struct qmp_phy_usb_layout { struct clk_fixed_rate pipe_clk_fixed; }; +struct qmp_usbc_dp_offsets { + u16 dp_serdes; + u16 dp_txa; + u16 dp_txb; + u16 dp_phy; +}; + +struct qmp_usbc; + +struct qmp_phy_dp_cfg { + const struct qmp_usbc_dp_offsets *offsets; + + const struct qmp_phy_init_tbl *serdes_tbl; + int serdes_tbl_num; + const struct qmp_phy_init_tbl *tx_tbl; + int tx_tbl_num; + const struct qmp_phy_init_tbl *rx_tbl; + int rx_tbl_num; + const struct qmp_phy_init_tbl *pcs_tbl; + int pcs_tbl_num; + const struct qmp_phy_init_tbl *pcs_usb_tbl; + int pcs_usb_tbl_num; + const struct qmp_phy_init_tbl *dp_serdes_tbl; + int dp_serdes_tbl_num; + const struct qmp_phy_init_tbl *dp_tx_tbl; + int dp_tx_tbl_num; + + /* Init sequence for DP PHY block link rates */ + const struct qmp_phy_init_tbl *serdes_tbl_rbr; + int serdes_tbl_rbr_num; + const struct qmp_phy_init_tbl *serdes_tbl_hbr; + int serdes_tbl_hbr_num; + const struct qmp_phy_init_tbl *serdes_tbl_hbr2; + int serdes_tbl_hbr2_num; + + /* DP PHY swing and pre_emphasis tables */ + const u8 (*swing_tbl)[4][4]; + const u8 (*pre_emphasis_tbl)[4][4]; + + /* DP PHY callbacks */ + void (*dp_aux_init)(struct qmp_usbc *qmp); + void (*configure_dp_tx)(struct qmp_usbc *qmp); + int (*configure_dp_phy)(struct qmp_usbc *qmp); + int (*calibrate_dp_phy)(struct qmp_usbc *qmp); + + const struct qmp_regulator_data *vreg_list; + int num_vregs; +}; + +struct qmp_phy_dp_layout { + void __iomem *dp_phy; + void __iomem *dp_tx; + void __iomem *dp_tx2; + void __iomem *dp_serdes; + + unsigned int dp_aux_cfg; + struct phy_configure_opts_dp dp_opts; + struct clk_hw dp_link_hw; + struct clk_hw dp_pixel_hw; +}; + struct qmp_usbc { struct device *dev; int type; @@ -359,6 +426,7 @@ struct qmp_usbc { struct regmap *tcsr_map; u32 vls_clamp_reg; + u32 dp_phy_mode_reg; struct typec_switch_dev *sw; }; @@ -480,7 +548,9 @@ static const struct qmp_phy_cfg sdm660_phy_usb3_cfg = { }; #define to_usb_cfg(x) ((struct qmp_phy_usb_cfg *)((x)->cfg)) +#define to_dp_cfg(x) ((struct qmp_phy_dp_cfg *)((x)->cfg)) #define to_usb_layout(x) ((struct qmp_phy_usb_layout *)((x)->layout)) +#define to_dp_layout(x) ((struct qmp_phy_dp_layout *)((x)->layout)) static int qmp_usbc_generic_init(struct phy *phy) { -- 2.34.1