[PATCH v2 06/13] phy: qcom: qmp-usbc: Add DP PHY struct definitions
Xiangxu Yin
xiangxu.yin at oss.qualcomm.com
Tue Jul 22 07:22:07 UTC 2025
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.yin at 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
More information about the dri-devel
mailing list