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

Reply via email to