drivers/phy/qualcomm/phy-qcom-qmp-combo.c

Source file repositories/reference/linux-study-clean/drivers/phy/qualcomm/phy-qcom-qmp-combo.c

File Facts

System
Linux kernel
Corpus path
drivers/phy/qualcomm/phy-qcom-qmp-combo.c
Extension
.c
Size
193795 bytes
Lines
5067
Domain
Driver Families
Bucket
drivers/phy
Inferred role
Driver Families: implementation source
Status
source implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

struct qmp_combo_lane_mapping {
	unsigned int lanes_count;
	enum typec_orientation orientation;
	u32 lanes[4];
};

static const struct qmp_combo_lane_mapping usb3_data_lanes[] = {
	{ 2, TYPEC_ORIENTATION_NORMAL, { 1, 0 }},
	{ 2, TYPEC_ORIENTATION_REVERSE, { 2, 3 }},
};

static const struct qmp_combo_lane_mapping dp_data_lanes[] = {
	{ 1, TYPEC_ORIENTATION_NORMAL, { 3 }},
	{ 1, TYPEC_ORIENTATION_REVERSE, { 0 }},
	{ 2, TYPEC_ORIENTATION_NORMAL, { 3, 2 }},
	{ 2, TYPEC_ORIENTATION_REVERSE, { 0, 1 }},
	{ 4, TYPEC_ORIENTATION_NORMAL, { 3, 2, 1, 0 }},
	{ 4, TYPEC_ORIENTATION_REVERSE, { 0, 1, 2, 3 }},
};

struct qmp_combo;

struct qmp_combo_offsets {
	u16 com;
	u16 txa;
	u16 rxa;
	u16 txb;
	u16 rxb;
	u16 usb3_serdes;
	u16 usb3_pcs_misc;
	u16 usb3_pcs;
	u16 usb3_pcs_aon;
	u16 usb3_pcs_usb;
	u16 dp_serdes;
	u16 dp_txa;
	u16 dp_txb;
	u16 dp_dp_phy;
};

struct qmp_phy_cfg {
	const struct qmp_combo_offsets *offsets;

	/* Init sequence for PHY blocks - serdes, tx, rx, pcs */
	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 *pcs_misc_tbl;
	int pcs_misc_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;
	const struct qmp_phy_init_tbl *serdes_tbl_hbr3;
	int serdes_tbl_hbr3_num;

	/* DP PHY swing and pre_emphasis tables */
	const u8 (*swing_hbr_rbr)[4][4];
	const u8 (*swing_hbr3_hbr2)[4][4];
	const u8 (*pre_emphasis_hbr_rbr)[4][4];
	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);
	void (*dp_aux_init)(struct qmp_combo *qmp);

	/* resets to be requested */
	const char * const *reset_list;
	int num_resets;
	/* regulators to be requested */
	const struct regulator_bulk_data *vreg_list;
	int num_vregs;

Annotation

Implementation Notes