162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (c) 2017, The Linux Foundation. All rights reserved.
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#include <linux/clk.h>
762306a36Sopenharmony_ci#include <linux/clk-provider.h>
862306a36Sopenharmony_ci#include <linux/delay.h>
962306a36Sopenharmony_ci#include <linux/err.h>
1062306a36Sopenharmony_ci#include <linux/io.h>
1162306a36Sopenharmony_ci#include <linux/iopoll.h>
1262306a36Sopenharmony_ci#include <linux/kernel.h>
1362306a36Sopenharmony_ci#include <linux/module.h>
1462306a36Sopenharmony_ci#include <linux/of.h>
1562306a36Sopenharmony_ci#include <linux/of_address.h>
1662306a36Sopenharmony_ci#include <linux/phy/phy.h>
1762306a36Sopenharmony_ci#include <linux/platform_device.h>
1862306a36Sopenharmony_ci#include <linux/regulator/consumer.h>
1962306a36Sopenharmony_ci#include <linux/reset.h>
2062306a36Sopenharmony_ci#include <linux/slab.h>
2162306a36Sopenharmony_ci#include <linux/usb/typec.h>
2262306a36Sopenharmony_ci#include <linux/usb/typec_mux.h>
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci#include <drm/drm_bridge.h>
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci#include <dt-bindings/phy/phy-qcom-qmp.h>
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ci#include "phy-qcom-qmp.h"
2962306a36Sopenharmony_ci#include "phy-qcom-qmp-pcs-misc-v3.h"
3062306a36Sopenharmony_ci#include "phy-qcom-qmp-pcs-usb-v4.h"
3162306a36Sopenharmony_ci#include "phy-qcom-qmp-pcs-usb-v5.h"
3262306a36Sopenharmony_ci#include "phy-qcom-qmp-pcs-usb-v6.h"
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci/* QPHY_SW_RESET bit */
3562306a36Sopenharmony_ci#define SW_RESET				BIT(0)
3662306a36Sopenharmony_ci/* QPHY_POWER_DOWN_CONTROL */
3762306a36Sopenharmony_ci#define SW_PWRDN				BIT(0)
3862306a36Sopenharmony_ci/* QPHY_START_CONTROL bits */
3962306a36Sopenharmony_ci#define SERDES_START				BIT(0)
4062306a36Sopenharmony_ci#define PCS_START				BIT(1)
4162306a36Sopenharmony_ci/* QPHY_PCS_STATUS bit */
4262306a36Sopenharmony_ci#define PHYSTATUS				BIT(6)
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci/* QPHY_V3_DP_COM_RESET_OVRD_CTRL register bits */
4562306a36Sopenharmony_ci/* DP PHY soft reset */
4662306a36Sopenharmony_ci#define SW_DPPHY_RESET				BIT(0)
4762306a36Sopenharmony_ci/* mux to select DP PHY reset control, 0:HW control, 1: software reset */
4862306a36Sopenharmony_ci#define SW_DPPHY_RESET_MUX			BIT(1)
4962306a36Sopenharmony_ci/* USB3 PHY soft reset */
5062306a36Sopenharmony_ci#define SW_USB3PHY_RESET			BIT(2)
5162306a36Sopenharmony_ci/* mux to select USB3 PHY reset control, 0:HW control, 1: software reset */
5262306a36Sopenharmony_ci#define SW_USB3PHY_RESET_MUX			BIT(3)
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_ci/* QPHY_V3_DP_COM_PHY_MODE_CTRL register bits */
5562306a36Sopenharmony_ci#define USB3_MODE				BIT(0) /* enables USB3 mode */
5662306a36Sopenharmony_ci#define DP_MODE					BIT(1) /* enables DP mode */
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ci/* QPHY_PCS_AUTONOMOUS_MODE_CTRL register bits */
5962306a36Sopenharmony_ci#define ARCVR_DTCT_EN				BIT(0)
6062306a36Sopenharmony_ci#define ALFPS_DTCT_EN				BIT(1)
6162306a36Sopenharmony_ci#define ARCVR_DTCT_EVENT_SEL			BIT(4)
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ci/* QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR register bits */
6462306a36Sopenharmony_ci#define IRQ_CLEAR				BIT(0)
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_ci/* QPHY_V3_PCS_MISC_CLAMP_ENABLE register bits */
6762306a36Sopenharmony_ci#define CLAMP_EN				BIT(0) /* enables i/o clamp_n */
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ci/* QPHY_V3_DP_COM_TYPEC_CTRL register bits */
7062306a36Sopenharmony_ci#define SW_PORTSELECT_VAL			BIT(0)
7162306a36Sopenharmony_ci#define SW_PORTSELECT_MUX			BIT(1)
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_ci#define PHY_INIT_COMPLETE_TIMEOUT		10000
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_cistruct qmp_phy_init_tbl {
7662306a36Sopenharmony_ci	unsigned int offset;
7762306a36Sopenharmony_ci	unsigned int val;
7862306a36Sopenharmony_ci	/*
7962306a36Sopenharmony_ci	 * mask of lanes for which this register is written
8062306a36Sopenharmony_ci	 * for cases when second lane needs different values
8162306a36Sopenharmony_ci	 */
8262306a36Sopenharmony_ci	u8 lane_mask;
8362306a36Sopenharmony_ci};
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_ci#define QMP_PHY_INIT_CFG(o, v)		\
8662306a36Sopenharmony_ci	{				\
8762306a36Sopenharmony_ci		.offset = o,		\
8862306a36Sopenharmony_ci		.val = v,		\
8962306a36Sopenharmony_ci		.lane_mask = 0xff,	\
9062306a36Sopenharmony_ci	}
9162306a36Sopenharmony_ci
9262306a36Sopenharmony_ci#define QMP_PHY_INIT_CFG_LANE(o, v, l)	\
9362306a36Sopenharmony_ci	{				\
9462306a36Sopenharmony_ci		.offset = o,		\
9562306a36Sopenharmony_ci		.val = v,		\
9662306a36Sopenharmony_ci		.lane_mask = l,		\
9762306a36Sopenharmony_ci	}
9862306a36Sopenharmony_ci
9962306a36Sopenharmony_ci/* set of registers with offsets different per-PHY */
10062306a36Sopenharmony_cienum qphy_reg_layout {
10162306a36Sopenharmony_ci	/* PCS registers */
10262306a36Sopenharmony_ci	QPHY_SW_RESET,
10362306a36Sopenharmony_ci	QPHY_START_CTRL,
10462306a36Sopenharmony_ci	QPHY_PCS_STATUS,
10562306a36Sopenharmony_ci	QPHY_PCS_AUTONOMOUS_MODE_CTRL,
10662306a36Sopenharmony_ci	QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR,
10762306a36Sopenharmony_ci	QPHY_PCS_POWER_DOWN_CONTROL,
10862306a36Sopenharmony_ci
10962306a36Sopenharmony_ci	QPHY_COM_RESETSM_CNTRL,
11062306a36Sopenharmony_ci	QPHY_COM_C_READY_STATUS,
11162306a36Sopenharmony_ci	QPHY_COM_CMN_STATUS,
11262306a36Sopenharmony_ci	QPHY_COM_BIAS_EN_CLKBUFLR_EN,
11362306a36Sopenharmony_ci
11462306a36Sopenharmony_ci	QPHY_DP_PHY_STATUS,
11562306a36Sopenharmony_ci
11662306a36Sopenharmony_ci	QPHY_TX_TX_POL_INV,
11762306a36Sopenharmony_ci	QPHY_TX_TX_DRV_LVL,
11862306a36Sopenharmony_ci	QPHY_TX_TX_EMP_POST1_LVL,
11962306a36Sopenharmony_ci	QPHY_TX_HIGHZ_DRVR_EN,
12062306a36Sopenharmony_ci	QPHY_TX_TRANSCEIVER_BIAS_EN,
12162306a36Sopenharmony_ci
12262306a36Sopenharmony_ci	/* Keep last to ensure regs_layout arrays are properly initialized */
12362306a36Sopenharmony_ci	QPHY_LAYOUT_SIZE
12462306a36Sopenharmony_ci};
12562306a36Sopenharmony_ci
12662306a36Sopenharmony_cistatic const unsigned int qmp_v3_usb3phy_regs_layout[QPHY_LAYOUT_SIZE] = {
12762306a36Sopenharmony_ci	[QPHY_SW_RESET]			= QPHY_V3_PCS_SW_RESET,
12862306a36Sopenharmony_ci	[QPHY_START_CTRL]		= QPHY_V3_PCS_START_CONTROL,
12962306a36Sopenharmony_ci	[QPHY_PCS_STATUS]		= QPHY_V3_PCS_PCS_STATUS,
13062306a36Sopenharmony_ci	[QPHY_PCS_POWER_DOWN_CONTROL]	= QPHY_V3_PCS_POWER_DOWN_CONTROL,
13162306a36Sopenharmony_ci	[QPHY_PCS_AUTONOMOUS_MODE_CTRL]	= QPHY_V3_PCS_AUTONOMOUS_MODE_CTRL,
13262306a36Sopenharmony_ci	[QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR] = QPHY_V3_PCS_LFPS_RXTERM_IRQ_CLEAR,
13362306a36Sopenharmony_ci
13462306a36Sopenharmony_ci	[QPHY_COM_RESETSM_CNTRL]	= QSERDES_V3_COM_RESETSM_CNTRL,
13562306a36Sopenharmony_ci	[QPHY_COM_C_READY_STATUS]	= QSERDES_V3_COM_C_READY_STATUS,
13662306a36Sopenharmony_ci	[QPHY_COM_CMN_STATUS]		= QSERDES_V3_COM_CMN_STATUS,
13762306a36Sopenharmony_ci	[QPHY_COM_BIAS_EN_CLKBUFLR_EN]	= QSERDES_V3_COM_BIAS_EN_CLKBUFLR_EN,
13862306a36Sopenharmony_ci
13962306a36Sopenharmony_ci	[QPHY_DP_PHY_STATUS]		= QSERDES_V3_DP_PHY_STATUS,
14062306a36Sopenharmony_ci
14162306a36Sopenharmony_ci	[QPHY_TX_TX_POL_INV]		= QSERDES_V3_TX_TX_POL_INV,
14262306a36Sopenharmony_ci	[QPHY_TX_TX_DRV_LVL]		= QSERDES_V3_TX_TX_DRV_LVL,
14362306a36Sopenharmony_ci	[QPHY_TX_TX_EMP_POST1_LVL]	= QSERDES_V3_TX_TX_EMP_POST1_LVL,
14462306a36Sopenharmony_ci	[QPHY_TX_HIGHZ_DRVR_EN]		= QSERDES_V3_TX_HIGHZ_DRVR_EN,
14562306a36Sopenharmony_ci	[QPHY_TX_TRANSCEIVER_BIAS_EN]	= QSERDES_V3_TX_TRANSCEIVER_BIAS_EN,
14662306a36Sopenharmony_ci};
14762306a36Sopenharmony_ci
14862306a36Sopenharmony_cistatic const unsigned int qmp_v45_usb3phy_regs_layout[QPHY_LAYOUT_SIZE] = {
14962306a36Sopenharmony_ci	[QPHY_SW_RESET]			= QPHY_V4_PCS_SW_RESET,
15062306a36Sopenharmony_ci	[QPHY_START_CTRL]		= QPHY_V4_PCS_START_CONTROL,
15162306a36Sopenharmony_ci	[QPHY_PCS_STATUS]		= QPHY_V4_PCS_PCS_STATUS1,
15262306a36Sopenharmony_ci	[QPHY_PCS_POWER_DOWN_CONTROL]	= QPHY_V4_PCS_POWER_DOWN_CONTROL,
15362306a36Sopenharmony_ci
15462306a36Sopenharmony_ci	/* In PCS_USB */
15562306a36Sopenharmony_ci	[QPHY_PCS_AUTONOMOUS_MODE_CTRL]	= QPHY_V4_PCS_USB3_AUTONOMOUS_MODE_CTRL,
15662306a36Sopenharmony_ci	[QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR] = QPHY_V4_PCS_USB3_LFPS_RXTERM_IRQ_CLEAR,
15762306a36Sopenharmony_ci
15862306a36Sopenharmony_ci	[QPHY_COM_RESETSM_CNTRL]	= QSERDES_V4_COM_RESETSM_CNTRL,
15962306a36Sopenharmony_ci	[QPHY_COM_C_READY_STATUS]	= QSERDES_V4_COM_C_READY_STATUS,
16062306a36Sopenharmony_ci	[QPHY_COM_CMN_STATUS]		= QSERDES_V4_COM_CMN_STATUS,
16162306a36Sopenharmony_ci	[QPHY_COM_BIAS_EN_CLKBUFLR_EN]	= QSERDES_V4_COM_BIAS_EN_CLKBUFLR_EN,
16262306a36Sopenharmony_ci
16362306a36Sopenharmony_ci	[QPHY_DP_PHY_STATUS]		= QSERDES_V4_DP_PHY_STATUS,
16462306a36Sopenharmony_ci
16562306a36Sopenharmony_ci	[QPHY_TX_TX_POL_INV]		= QSERDES_V4_TX_TX_POL_INV,
16662306a36Sopenharmony_ci	[QPHY_TX_TX_DRV_LVL]		= QSERDES_V4_TX_TX_DRV_LVL,
16762306a36Sopenharmony_ci	[QPHY_TX_TX_EMP_POST1_LVL]	= QSERDES_V4_TX_TX_EMP_POST1_LVL,
16862306a36Sopenharmony_ci	[QPHY_TX_HIGHZ_DRVR_EN]		= QSERDES_V4_TX_HIGHZ_DRVR_EN,
16962306a36Sopenharmony_ci	[QPHY_TX_TRANSCEIVER_BIAS_EN]	= QSERDES_V4_TX_TRANSCEIVER_BIAS_EN,
17062306a36Sopenharmony_ci};
17162306a36Sopenharmony_ci
17262306a36Sopenharmony_cistatic const unsigned int qmp_v5_5nm_usb3phy_regs_layout[QPHY_LAYOUT_SIZE] = {
17362306a36Sopenharmony_ci	[QPHY_SW_RESET]			= QPHY_V5_PCS_SW_RESET,
17462306a36Sopenharmony_ci	[QPHY_START_CTRL]		= QPHY_V5_PCS_START_CONTROL,
17562306a36Sopenharmony_ci	[QPHY_PCS_STATUS]		= QPHY_V5_PCS_PCS_STATUS1,
17662306a36Sopenharmony_ci	[QPHY_PCS_POWER_DOWN_CONTROL]	= QPHY_V5_PCS_POWER_DOWN_CONTROL,
17762306a36Sopenharmony_ci
17862306a36Sopenharmony_ci	/* In PCS_USB */
17962306a36Sopenharmony_ci	[QPHY_PCS_AUTONOMOUS_MODE_CTRL]	= QPHY_V5_PCS_USB3_AUTONOMOUS_MODE_CTRL,
18062306a36Sopenharmony_ci	[QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR] = QPHY_V5_PCS_USB3_LFPS_RXTERM_IRQ_CLEAR,
18162306a36Sopenharmony_ci
18262306a36Sopenharmony_ci	[QPHY_COM_RESETSM_CNTRL]	= QSERDES_V5_COM_RESETSM_CNTRL,
18362306a36Sopenharmony_ci	[QPHY_COM_C_READY_STATUS]	= QSERDES_V5_COM_C_READY_STATUS,
18462306a36Sopenharmony_ci	[QPHY_COM_CMN_STATUS]		= QSERDES_V5_COM_CMN_STATUS,
18562306a36Sopenharmony_ci	[QPHY_COM_BIAS_EN_CLKBUFLR_EN]	= QSERDES_V5_COM_BIAS_EN_CLKBUFLR_EN,
18662306a36Sopenharmony_ci
18762306a36Sopenharmony_ci	[QPHY_DP_PHY_STATUS]		= QSERDES_V5_DP_PHY_STATUS,
18862306a36Sopenharmony_ci
18962306a36Sopenharmony_ci	[QPHY_TX_TX_POL_INV]		= QSERDES_V5_5NM_TX_TX_POL_INV,
19062306a36Sopenharmony_ci	[QPHY_TX_TX_DRV_LVL]		= QSERDES_V5_5NM_TX_TX_DRV_LVL,
19162306a36Sopenharmony_ci	[QPHY_TX_TX_EMP_POST1_LVL]	= QSERDES_V5_5NM_TX_TX_EMP_POST1_LVL,
19262306a36Sopenharmony_ci	[QPHY_TX_HIGHZ_DRVR_EN]		= QSERDES_V5_5NM_TX_HIGHZ_DRVR_EN,
19362306a36Sopenharmony_ci	[QPHY_TX_TRANSCEIVER_BIAS_EN]	= QSERDES_V5_5NM_TX_TRANSCEIVER_BIAS_EN,
19462306a36Sopenharmony_ci};
19562306a36Sopenharmony_ci
19662306a36Sopenharmony_cistatic const unsigned int qmp_v6_usb3phy_regs_layout[QPHY_LAYOUT_SIZE] = {
19762306a36Sopenharmony_ci	[QPHY_SW_RESET]			= QPHY_V5_PCS_SW_RESET,
19862306a36Sopenharmony_ci	[QPHY_START_CTRL]		= QPHY_V5_PCS_START_CONTROL,
19962306a36Sopenharmony_ci	[QPHY_PCS_STATUS]		= QPHY_V5_PCS_PCS_STATUS1,
20062306a36Sopenharmony_ci	[QPHY_PCS_POWER_DOWN_CONTROL]	= QPHY_V5_PCS_POWER_DOWN_CONTROL,
20162306a36Sopenharmony_ci
20262306a36Sopenharmony_ci	/* In PCS_USB */
20362306a36Sopenharmony_ci	[QPHY_PCS_AUTONOMOUS_MODE_CTRL]	= QPHY_V5_PCS_USB3_AUTONOMOUS_MODE_CTRL,
20462306a36Sopenharmony_ci	[QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR] = QPHY_V5_PCS_USB3_LFPS_RXTERM_IRQ_CLEAR,
20562306a36Sopenharmony_ci
20662306a36Sopenharmony_ci	[QPHY_COM_RESETSM_CNTRL]	= QSERDES_V6_COM_RESETSM_CNTRL,
20762306a36Sopenharmony_ci	[QPHY_COM_C_READY_STATUS]	= QSERDES_V6_COM_C_READY_STATUS,
20862306a36Sopenharmony_ci	[QPHY_COM_CMN_STATUS]		= QSERDES_V6_COM_CMN_STATUS,
20962306a36Sopenharmony_ci	[QPHY_COM_BIAS_EN_CLKBUFLR_EN]	= QSERDES_V6_COM_PLL_BIAS_EN_CLK_BUFLR_EN,
21062306a36Sopenharmony_ci
21162306a36Sopenharmony_ci	[QPHY_DP_PHY_STATUS]		= QSERDES_V6_DP_PHY_STATUS,
21262306a36Sopenharmony_ci
21362306a36Sopenharmony_ci	[QPHY_TX_TX_POL_INV]		= QSERDES_V6_TX_TX_POL_INV,
21462306a36Sopenharmony_ci	[QPHY_TX_TX_DRV_LVL]		= QSERDES_V6_TX_TX_DRV_LVL,
21562306a36Sopenharmony_ci	[QPHY_TX_TX_EMP_POST1_LVL]	= QSERDES_V6_TX_TX_EMP_POST1_LVL,
21662306a36Sopenharmony_ci	[QPHY_TX_HIGHZ_DRVR_EN]		= QSERDES_V6_TX_HIGHZ_DRVR_EN,
21762306a36Sopenharmony_ci	[QPHY_TX_TRANSCEIVER_BIAS_EN]	= QSERDES_V6_TX_TRANSCEIVER_BIAS_EN,
21862306a36Sopenharmony_ci};
21962306a36Sopenharmony_ci
22062306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl qmp_v3_usb3_serdes_tbl[] = {
22162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_IVCO, 0x07),
22262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYSCLK_EN_SEL, 0x14),
22362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_BIAS_EN_CLKBUFLR_EN, 0x08),
22462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_CLK_SELECT, 0x30),
22562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYS_CLK_CTRL, 0x02),
22662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_RESETSM_CNTRL2, 0x08),
22762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_CMN_CONFIG, 0x16),
22862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_SVS_MODE_CLK_SEL, 0x01),
22962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_HSCLK_SEL, 0x80),
23062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_DEC_START_MODE0, 0x82),
23162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START1_MODE0, 0xab),
23262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START2_MODE0, 0xea),
23362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START3_MODE0, 0x02),
23462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_CP_CTRL_MODE0, 0x06),
23562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_RCTRL_MODE0, 0x16),
23662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_CCTRL_MODE0, 0x36),
23762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN1_MODE0, 0x00),
23862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN0_MODE0, 0x3f),
23962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE2_MODE0, 0x01),
24062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE1_MODE0, 0xc9),
24162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_CORECLK_DIV_MODE0, 0x0a),
24262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP3_MODE0, 0x00),
24362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP2_MODE0, 0x34),
24462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP1_MODE0, 0x15),
24562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP_EN, 0x04),
24662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_CORE_CLK_EN, 0x00),
24762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP_CFG, 0x00),
24862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_MAP, 0x00),
24962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYSCLK_BUF_ENABLE, 0x0a),
25062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_EN_CENTER, 0x01),
25162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_PER1, 0x31),
25262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_PER2, 0x01),
25362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_ADJ_PER1, 0x00),
25462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_ADJ_PER2, 0x00),
25562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_STEP_SIZE1, 0x85),
25662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_STEP_SIZE2, 0x07),
25762306a36Sopenharmony_ci};
25862306a36Sopenharmony_ci
25962306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl qmp_v3_usb3_tx_tbl[] = {
26062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_TX_HIGHZ_DRVR_EN, 0x10),
26162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_TX_RCV_DETECT_LVL_2, 0x12),
26262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_TX_LANE_MODE_1, 0x16),
26362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_TX_RES_CODE_LANE_OFFSET_RX, 0x09),
26462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_TX_RES_CODE_LANE_OFFSET_TX, 0x06),
26562306a36Sopenharmony_ci};
26662306a36Sopenharmony_ci
26762306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl qmp_v3_dp_serdes_tbl[] = {
26862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_SVS_MODE_CLK_SEL, 0x01),
26962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYSCLK_EN_SEL, 0x37),
27062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYS_CLK_CTRL, 0x02),
27162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_CLK_ENABLE1, 0x0e),
27262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYSCLK_BUF_ENABLE, 0x06),
27362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_CLK_SELECT, 0x30),
27462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_CMN_CONFIG, 0x02),
27562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START1_MODE0, 0x00),
27662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN0_MODE0, 0x3f),
27762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN1_MODE0, 0x00),
27862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_MAP, 0x00),
27962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP3_MODE0, 0x00),
28062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_BG_TIMER, 0x0a),
28162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_CORECLK_DIV_MODE0, 0x0a),
28262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_CTRL, 0x00),
28362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_BIAS_EN_CLKBUFLR_EN, 0x3f),
28462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_CORE_CLK_EN, 0x1f),
28562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_IVCO, 0x07),
28662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_CCTRL_MODE0, 0x36),
28762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_RCTRL_MODE0, 0x16),
28862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_CP_CTRL_MODE0, 0x06),
28962306a36Sopenharmony_ci};
29062306a36Sopenharmony_ci
29162306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl qmp_v3_dp_serdes_tbl_rbr[] = {
29262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_HSCLK_SEL, 0x0c),
29362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_DEC_START_MODE0, 0x69),
29462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START2_MODE0, 0x80),
29562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START3_MODE0, 0x07),
29662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP1_MODE0, 0x6f),
29762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP2_MODE0, 0x08),
29862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP_EN, 0x00),
29962306a36Sopenharmony_ci};
30062306a36Sopenharmony_ci
30162306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl qmp_v3_dp_serdes_tbl_hbr[] = {
30262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_HSCLK_SEL, 0x04),
30362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_DEC_START_MODE0, 0x69),
30462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START2_MODE0, 0x80),
30562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START3_MODE0, 0x07),
30662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP1_MODE0, 0x0f),
30762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP2_MODE0, 0x0e),
30862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP_EN, 0x00),
30962306a36Sopenharmony_ci};
31062306a36Sopenharmony_ci
31162306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl qmp_v3_dp_serdes_tbl_hbr2[] = {
31262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_HSCLK_SEL, 0x00),
31362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_DEC_START_MODE0, 0x8c),
31462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START2_MODE0, 0x00),
31562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START3_MODE0, 0x0a),
31662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP1_MODE0, 0x1f),
31762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP2_MODE0, 0x1c),
31862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP_EN, 0x00),
31962306a36Sopenharmony_ci};
32062306a36Sopenharmony_ci
32162306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl qmp_v3_dp_serdes_tbl_hbr3[] = {
32262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_HSCLK_SEL, 0x03),
32362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_DEC_START_MODE0, 0x69),
32462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START2_MODE0, 0x80),
32562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START3_MODE0, 0x07),
32662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP1_MODE0, 0x2f),
32762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP2_MODE0, 0x2a),
32862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP_EN, 0x08),
32962306a36Sopenharmony_ci};
33062306a36Sopenharmony_ci
33162306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl qmp_v3_dp_tx_tbl[] = {
33262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_TX_TRANSCEIVER_BIAS_EN, 0x1a),
33362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_TX_VMODE_CTRL1, 0x40),
33462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_TX_PRE_STALL_LDO_BOOST_EN, 0x30),
33562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_TX_INTERFACE_SELECT, 0x3d),
33662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_TX_CLKBUF_ENABLE, 0x0f),
33762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_TX_RESET_TSYNC_EN, 0x03),
33862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_TX_TRAN_DRVR_EMP_EN, 0x03),
33962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_TX_PARRATE_REC_DETECT_IDLE_EN, 0x00),
34062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_TX_TX_INTERFACE_MODE, 0x00),
34162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_TX_TX_BAND, 0x4),
34262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_TX_TX_POL_INV, 0x0a),
34362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_TX_TX_DRV_LVL, 0x38),
34462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_TX_TX_EMP_POST1_LVL, 0x20),
34562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_TX_RES_CODE_LANE_OFFSET_TX, 0x06),
34662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_TX_RES_CODE_LANE_OFFSET_RX, 0x07),
34762306a36Sopenharmony_ci};
34862306a36Sopenharmony_ci
34962306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl qmp_v3_usb3_rx_tbl[] = {
35062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_FASTLOCK_FO_GAIN, 0x0b),
35162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0f),
35262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL3, 0x4e),
35362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL4, 0x18),
35462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x77),
35562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_OFFSET_ADAPTOR_CNTRL2, 0x80),
35662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_CNTRL, 0x03),
35762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_DEGLITCH_CNTRL, 0x16),
35862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x75),
35962306a36Sopenharmony_ci};
36062306a36Sopenharmony_ci
36162306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl qmp_v3_usb3_pcs_tbl[] = {
36262306a36Sopenharmony_ci	/* FLL settings */
36362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNTRL2, 0x83),
36462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNT_VAL_L, 0x09),
36562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNT_VAL_H_TOL, 0xa2),
36662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_MAN_CODE, 0x40),
36762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNTRL1, 0x02),
36862306a36Sopenharmony_ci
36962306a36Sopenharmony_ci	/* Lock Det settings */
37062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_LOCK_DETECT_CONFIG1, 0xd1),
37162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_LOCK_DETECT_CONFIG2, 0x1f),
37262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_LOCK_DETECT_CONFIG3, 0x47),
37362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_POWER_STATE_CONFIG2, 0x1b),
37462306a36Sopenharmony_ci
37562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_RX_SIGDET_LVL, 0xba),
37662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V0, 0x9f),
37762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V1, 0x9f),
37862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V2, 0xb7),
37962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V3, 0x4e),
38062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V4, 0x65),
38162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_LS, 0x6b),
38262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V0, 0x15),
38362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V0, 0x0d),
38462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V1, 0x15),
38562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V1, 0x0d),
38662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V2, 0x15),
38762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V2, 0x0d),
38862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V3, 0x15),
38962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V3, 0x1d),
39062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V4, 0x15),
39162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V4, 0x0d),
39262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_LS, 0x15),
39362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_LS, 0x0d),
39462306a36Sopenharmony_ci
39562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_RATE_SLEW_CNTRL, 0x02),
39662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_PWRUP_RESET_DLY_TIME_AUXCLK, 0x04),
39762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_TSYNC_RSYNC_TIME, 0x44),
39862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_PWRUP_RESET_DLY_TIME_AUXCLK, 0x04),
39962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_P1U2_L, 0xe7),
40062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_P1U2_H, 0x03),
40162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_U3_L, 0x40),
40262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_U3_H, 0x00),
40362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_RXEQTRAINING_WAIT_TIME, 0x75),
40462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_LFPS_TX_ECSTART_EQTLOCK, 0x86),
40562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_RXEQTRAINING_RUN_TIME, 0x13),
40662306a36Sopenharmony_ci};
40762306a36Sopenharmony_ci
40862306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sm6350_usb3_rx_tbl[] = {
40962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_FASTLOCK_FO_GAIN, 0x0b),
41062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0f),
41162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL3, 0x4e),
41262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL4, 0x18),
41362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x77),
41462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_OFFSET_ADAPTOR_CNTRL2, 0x80),
41562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_CNTRL, 0x03),
41662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_DEGLITCH_CNTRL, 0x16),
41762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_MODE_00, 0x05),
41862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x75),
41962306a36Sopenharmony_ci};
42062306a36Sopenharmony_ci
42162306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sm6350_usb3_pcs_tbl[] = {
42262306a36Sopenharmony_ci	/* FLL settings */
42362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNTRL2, 0x83),
42462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNT_VAL_L, 0x09),
42562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNT_VAL_H_TOL, 0xa2),
42662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_MAN_CODE, 0x40),
42762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNTRL1, 0x02),
42862306a36Sopenharmony_ci
42962306a36Sopenharmony_ci	/* Lock Det settings */
43062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_LOCK_DETECT_CONFIG1, 0xd1),
43162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_LOCK_DETECT_CONFIG2, 0x1f),
43262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_LOCK_DETECT_CONFIG3, 0x47),
43362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_POWER_STATE_CONFIG2, 0x1b),
43462306a36Sopenharmony_ci
43562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_RX_SIGDET_LVL, 0xcc),
43662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V0, 0x9f),
43762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V1, 0x9f),
43862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V2, 0xb7),
43962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V3, 0x4e),
44062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V4, 0x65),
44162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_LS, 0x6b),
44262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V0, 0x15),
44362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V0, 0x0d),
44462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V1, 0x15),
44562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V1, 0x0d),
44662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V2, 0x15),
44762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V2, 0x0d),
44862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V3, 0x15),
44962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V3, 0x1d),
45062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V4, 0x15),
45162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V4, 0x0d),
45262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_LS, 0x15),
45362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_LS, 0x0d),
45462306a36Sopenharmony_ci
45562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_RATE_SLEW_CNTRL, 0x02),
45662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_PWRUP_RESET_DLY_TIME_AUXCLK, 0x04),
45762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_TSYNC_RSYNC_TIME, 0x44),
45862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_PWRUP_RESET_DLY_TIME_AUXCLK, 0x04),
45962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_P1U2_L, 0xe7),
46062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_P1U2_H, 0x03),
46162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_U3_L, 0x40),
46262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_U3_H, 0x00),
46362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_RXEQTRAINING_WAIT_TIME, 0x75),
46462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_LFPS_TX_ECSTART_EQTLOCK, 0x86),
46562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_RXEQTRAINING_RUN_TIME, 0x13),
46662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_LFPS_DET_HIGH_COUNT_VAL, 0x04),
46762306a36Sopenharmony_ci
46862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_REFGEN_REQ_CONFIG1, 0x21),
46962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_REFGEN_REQ_CONFIG2, 0x60),
47062306a36Sopenharmony_ci};
47162306a36Sopenharmony_ci
47262306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sm8150_usb3_serdes_tbl[] = {
47362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_EN_CENTER, 0x01),
47462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_PER1, 0x31),
47562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_PER2, 0x01),
47662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_STEP_SIZE1_MODE0, 0xde),
47762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_STEP_SIZE2_MODE0, 0x07),
47862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_STEP_SIZE1_MODE1, 0xde),
47962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_STEP_SIZE2_MODE1, 0x07),
48062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_SYSCLK_BUF_ENABLE, 0x0a),
48162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_CMN_IPTRIM, 0x20),
48262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_CP_CTRL_MODE0, 0x06),
48362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_CP_CTRL_MODE1, 0x06),
48462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_RCTRL_MODE0, 0x16),
48562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_RCTRL_MODE1, 0x16),
48662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_CCTRL_MODE0, 0x36),
48762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_CCTRL_MODE1, 0x36),
48862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_SYSCLK_EN_SEL, 0x1a),
48962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP_EN, 0x04),
49062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP1_MODE0, 0x14),
49162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP2_MODE0, 0x34),
49262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP1_MODE1, 0x34),
49362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP2_MODE1, 0x82),
49462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_DEC_START_MODE0, 0x82),
49562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_DEC_START_MODE1, 0x82),
49662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START1_MODE0, 0xab),
49762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START2_MODE0, 0xea),
49862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START3_MODE0, 0x02),
49962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE_MAP, 0x02),
50062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START1_MODE1, 0xab),
50162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START2_MODE1, 0xea),
50262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START3_MODE1, 0x02),
50362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE1_MODE0, 0x24),
50462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE1_MODE1, 0x24),
50562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE2_MODE1, 0x02),
50662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_HSCLK_SEL, 0x01),
50762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_CORECLK_DIV_MODE1, 0x08),
50862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE1_MODE0, 0xca),
50962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE2_MODE0, 0x1e),
51062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE1_MODE1, 0xca),
51162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE2_MODE1, 0x1e),
51262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_HSCLK_SEL, 0x11),
51362306a36Sopenharmony_ci};
51462306a36Sopenharmony_ci
51562306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sm8150_usb3_tx_tbl[] = {
51662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_TX_RES_CODE_LANE_TX, 0x00),
51762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_TX_RES_CODE_LANE_RX, 0x00),
51862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_TX_LANE_MODE_1, 0xd5),
51962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_TX_RCV_DETECT_LVL_2, 0x12),
52062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_TX_PI_QEC_CTRL, 0x20),
52162306a36Sopenharmony_ci};
52262306a36Sopenharmony_ci
52362306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sm8150_usb3_rx_tbl[] = {
52462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SO_GAIN, 0x05),
52562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_FO_GAIN, 0x2f),
52662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x7f),
52762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_COUNT_LOW, 0xff),
52862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_COUNT_HIGH, 0x0f),
52962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_PI_CONTROLS, 0x99),
53062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_THRESH1, 0x04),
53162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_THRESH2, 0x08),
53262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_GAIN1, 0x05),
53362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_GAIN2, 0x05),
53462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_VGA_CAL_CNTRL1, 0x54),
53562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_VGA_CAL_CNTRL2, 0x0e),
53662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0f),
53762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL3, 0x4a),
53862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL4, 0x0a),
53962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_LOW, 0xc0),
54062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_HIGH, 0x00),
54162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x77),
54262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_CNTRL, 0x04),
54362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_DEGLITCH_CNTRL, 0x0e),
54462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_LOW, 0xbf),
54562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH, 0xbf),
54662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH2, 0x3f),
54762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH3, 0x7f),
54862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH4, 0x94),
54962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_LOW, 0xdc),
55062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH, 0xdc),
55162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH2, 0x5c),
55262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH3, 0x0b),
55362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH4, 0xb3),
55462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_DFE_EN_TIMER, 0x04),
55562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_DFE_CTLE_POST_CAL_OFFSET, 0x38),
55662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_AUX_DATA_TCOARSE_TFINE, 0xa0),
55762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_DCC_CTRL1, 0x0c),
55862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_GM_CAL, 0x1f),
55962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_VTH_CODE, 0x10),
56062306a36Sopenharmony_ci};
56162306a36Sopenharmony_ci
56262306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sm8150_usb3_pcs_tbl[] = {
56362306a36Sopenharmony_ci	/* Lock Det settings */
56462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG1, 0xd0),
56562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG2, 0x07),
56662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG6, 0x13),
56762306a36Sopenharmony_ci
56862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V4_PCS_REFGEN_REQ_CONFIG1, 0x21),
56962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V4_PCS_RX_SIGDET_LVL, 0xaa),
57062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V4_PCS_CDR_RESET_TIME, 0x0a),
57162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V4_PCS_ALIGN_DETECT_CONFIG1, 0x88),
57262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V4_PCS_ALIGN_DETECT_CONFIG2, 0x13),
57362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V4_PCS_PCS_TX_RX_CONFIG, 0x0c),
57462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V4_PCS_EQ_CONFIG1, 0x4b),
57562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V4_PCS_EQ_CONFIG5, 0x10),
57662306a36Sopenharmony_ci};
57762306a36Sopenharmony_ci
57862306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sm8150_usb3_pcs_usb_tbl[] = {
57962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V4_PCS_USB3_LFPS_DET_HIGH_COUNT_VAL, 0xf8),
58062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V4_PCS_USB3_RXEQTRAINING_DFE_TIME_S2, 0x07),
58162306a36Sopenharmony_ci};
58262306a36Sopenharmony_ci
58362306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sm8250_usb3_tx_tbl[] = {
58462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_TX_RES_CODE_LANE_TX, 0x60),
58562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_TX_RES_CODE_LANE_RX, 0x60),
58662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_TX_RES_CODE_LANE_OFFSET_TX, 0x11),
58762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_TX_RES_CODE_LANE_OFFSET_RX, 0x02),
58862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_TX_LANE_MODE_1, 0xd5),
58962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_TX_RCV_DETECT_LVL_2, 0x12),
59062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG_LANE(QSERDES_V4_TX_PI_QEC_CTRL, 0x40, 1),
59162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG_LANE(QSERDES_V4_TX_PI_QEC_CTRL, 0x54, 2),
59262306a36Sopenharmony_ci};
59362306a36Sopenharmony_ci
59462306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sm8250_usb3_rx_tbl[] = {
59562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SO_GAIN, 0x06),
59662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_FO_GAIN, 0x2f),
59762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x7f),
59862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_COUNT_LOW, 0xff),
59962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_COUNT_HIGH, 0x0f),
60062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_PI_CONTROLS, 0x99),
60162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_THRESH1, 0x04),
60262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_THRESH2, 0x08),
60362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_GAIN1, 0x05),
60462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_GAIN2, 0x05),
60562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_VGA_CAL_CNTRL1, 0x54),
60662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_VGA_CAL_CNTRL2, 0x0c),
60762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0f),
60862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL3, 0x4a),
60962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL4, 0x0a),
61062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_LOW, 0xc0),
61162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_HIGH, 0x00),
61262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x77),
61362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_CNTRL, 0x04),
61462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_DEGLITCH_CNTRL, 0x0e),
61562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG_LANE(QSERDES_V4_RX_RX_MODE_00_LOW, 0xff, 1),
61662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG_LANE(QSERDES_V4_RX_RX_MODE_00_LOW, 0x7f, 2),
61762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG_LANE(QSERDES_V4_RX_RX_MODE_00_HIGH, 0x7f, 1),
61862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG_LANE(QSERDES_V4_RX_RX_MODE_00_HIGH, 0xff, 2),
61962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH2, 0x7f),
62062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH3, 0x7f),
62162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH4, 0x97),
62262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_LOW, 0xdc),
62362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH, 0xdc),
62462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH2, 0x5c),
62562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH3, 0x7b),
62662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH4, 0xb4),
62762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_DFE_EN_TIMER, 0x04),
62862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_DFE_CTLE_POST_CAL_OFFSET, 0x38),
62962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_AUX_DATA_TCOARSE_TFINE, 0xa0),
63062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_DCC_CTRL1, 0x0c),
63162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_GM_CAL, 0x1f),
63262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_VTH_CODE, 0x10),
63362306a36Sopenharmony_ci};
63462306a36Sopenharmony_ci
63562306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sm8250_usb3_pcs_tbl[] = {
63662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG1, 0xd0),
63762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG2, 0x07),
63862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG3, 0x20),
63962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG6, 0x13),
64062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V4_PCS_REFGEN_REQ_CONFIG1, 0x21),
64162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V4_PCS_RX_SIGDET_LVL, 0xa9),
64262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V4_PCS_CDR_RESET_TIME, 0x0a),
64362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V4_PCS_ALIGN_DETECT_CONFIG1, 0x88),
64462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V4_PCS_ALIGN_DETECT_CONFIG2, 0x13),
64562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V4_PCS_PCS_TX_RX_CONFIG, 0x0c),
64662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V4_PCS_EQ_CONFIG1, 0x4b),
64762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V4_PCS_EQ_CONFIG5, 0x10),
64862306a36Sopenharmony_ci};
64962306a36Sopenharmony_ci
65062306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sm8250_usb3_pcs_usb_tbl[] = {
65162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V4_PCS_USB3_LFPS_DET_HIGH_COUNT_VAL, 0xf8),
65262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V4_PCS_USB3_RXEQTRAINING_DFE_TIME_S2, 0x07),
65362306a36Sopenharmony_ci};
65462306a36Sopenharmony_ci
65562306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sm8350_usb3_tx_tbl[] = {
65662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_TX_RES_CODE_LANE_TX, 0x00),
65762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_TX_RES_CODE_LANE_RX, 0x00),
65862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_TX_RES_CODE_LANE_OFFSET_TX, 0x16),
65962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_TX_RES_CODE_LANE_OFFSET_RX, 0x0e),
66062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_TX_LANE_MODE_1, 0x35),
66162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_TX_LANE_MODE_3, 0x3f),
66262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_TX_LANE_MODE_4, 0x7f),
66362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_TX_LANE_MODE_5, 0x3f),
66462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_TX_RCV_DETECT_LVL_2, 0x12),
66562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_TX_PI_QEC_CTRL, 0x21),
66662306a36Sopenharmony_ci};
66762306a36Sopenharmony_ci
66862306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sm8350_usb3_rx_tbl[] = {
66962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_FO_GAIN, 0x0a),
67062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_SO_GAIN, 0x05),
67162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_FASTLOCK_FO_GAIN, 0x2f),
67262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x7f),
67362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_FASTLOCK_COUNT_LOW, 0xff),
67462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_FASTLOCK_COUNT_HIGH, 0x0f),
67562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_PI_CONTROLS, 0x99),
67662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_SB2_THRESH1, 0x08),
67762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_SB2_THRESH2, 0x08),
67862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_SB2_GAIN1, 0x00),
67962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_SB2_GAIN2, 0x04),
68062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_VGA_CAL_CNTRL1, 0x54),
68162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_VGA_CAL_CNTRL2, 0x0f),
68262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0f),
68362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_EQU_ADAPTOR_CNTRL3, 0x4a),
68462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_EQU_ADAPTOR_CNTRL4, 0x0a),
68562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_IDAC_TSETTLE_LOW, 0xc0),
68662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_IDAC_TSETTLE_HIGH, 0x00),
68762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x47),
68862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_SIGDET_CNTRL, 0x04),
68962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_SIGDET_DEGLITCH_CNTRL, 0x0e),
69062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_00_LOW, 0xbb),
69162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_00_HIGH, 0x7b),
69262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_00_HIGH2, 0xbb),
69362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG_LANE(QSERDES_V5_RX_RX_MODE_00_HIGH3, 0x3d, 1),
69462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG_LANE(QSERDES_V5_RX_RX_MODE_00_HIGH3, 0x3c, 2),
69562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_00_HIGH4, 0xdb),
69662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_01_LOW, 0x64),
69762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_01_HIGH, 0x24),
69862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_01_HIGH2, 0xd2),
69962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_01_HIGH3, 0x13),
70062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_01_HIGH4, 0xa9),
70162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_DFE_EN_TIMER, 0x04),
70262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_DFE_CTLE_POST_CAL_OFFSET, 0x38),
70362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_AUX_DATA_TCOARSE_TFINE, 0xa0),
70462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_DCC_CTRL1, 0x0c),
70562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_GM_CAL, 0x00),
70662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_VTH_CODE, 0x10),
70762306a36Sopenharmony_ci};
70862306a36Sopenharmony_ci
70962306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sm8350_usb3_pcs_tbl[] = {
71062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V4_PCS_RCVR_DTCT_DLY_P1U2_L, 0xe7),
71162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V4_PCS_RCVR_DTCT_DLY_P1U2_H, 0x03),
71262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG1, 0xd0),
71362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG2, 0x07),
71462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG3, 0x20),
71562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG6, 0x13),
71662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V4_PCS_REFGEN_REQ_CONFIG1, 0x21),
71762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V4_PCS_RX_SIGDET_LVL, 0xaa),
71862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V4_PCS_CDR_RESET_TIME, 0x0a),
71962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V4_PCS_ALIGN_DETECT_CONFIG1, 0x88),
72062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V4_PCS_ALIGN_DETECT_CONFIG2, 0x13),
72162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V4_PCS_PCS_TX_RX_CONFIG, 0x0c),
72262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V4_PCS_EQ_CONFIG1, 0x4b),
72362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V4_PCS_EQ_CONFIG5, 0x10),
72462306a36Sopenharmony_ci};
72562306a36Sopenharmony_ci
72662306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sm8350_usb3_pcs_usb_tbl[] = {
72762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V5_PCS_USB3_RCVR_DTCT_DLY_U3_L, 0x40),
72862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V5_PCS_USB3_RCVR_DTCT_DLY_U3_H, 0x00),
72962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V5_PCS_USB3_LFPS_DET_HIGH_COUNT_VAL, 0xf8),
73062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V5_PCS_USB3_RXEQTRAINING_DFE_TIME_S2, 0x07),
73162306a36Sopenharmony_ci};
73262306a36Sopenharmony_ci
73362306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sm8550_usb3_serdes_tbl[] = {
73462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_SSC_STEP_SIZE1_MODE1, 0xc0),
73562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_SSC_STEP_SIZE2_MODE1, 0x01),
73662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_CP_CTRL_MODE1, 0x02),
73762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_RCTRL_MODE1, 0x16),
73862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_CCTRL_MODE1, 0x36),
73962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_CORECLK_DIV_MODE1, 0x04),
74062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP1_MODE1, 0x16),
74162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP2_MODE1, 0x41),
74262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_DEC_START_MODE1, 0x41),
74362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_DEC_START_MSB_MODE1, 0x00),
74462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_DIV_FRAC_START1_MODE1, 0x55),
74562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_DIV_FRAC_START2_MODE1, 0x75),
74662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_DIV_FRAC_START3_MODE1, 0x01),
74762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_HSCLK_SEL_1, 0x01),
74862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_VCO_TUNE1_MODE1, 0x25),
74962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_VCO_TUNE2_MODE1, 0x02),
75062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_BIN_VCOCAL_CMP_CODE1_MODE1, 0x5c),
75162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_BIN_VCOCAL_CMP_CODE2_MODE1, 0x0f),
75262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_BIN_VCOCAL_CMP_CODE1_MODE0, 0x5c),
75362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_BIN_VCOCAL_CMP_CODE2_MODE0, 0x0f),
75462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_SSC_STEP_SIZE1_MODE0, 0xc0),
75562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_SSC_STEP_SIZE2_MODE0, 0x01),
75662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_CP_CTRL_MODE0, 0x02),
75762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_RCTRL_MODE0, 0x16),
75862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_CCTRL_MODE0, 0x36),
75962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP1_MODE0, 0x08),
76062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP2_MODE0, 0x1a),
76162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_DEC_START_MODE0, 0x41),
76262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_DEC_START_MSB_MODE0, 0x00),
76362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_DIV_FRAC_START1_MODE0, 0x55),
76462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_DIV_FRAC_START2_MODE0, 0x75),
76562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_DIV_FRAC_START3_MODE0, 0x01),
76662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_VCO_TUNE1_MODE0, 0x25),
76762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_VCO_TUNE2_MODE0, 0x02),
76862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_BG_TIMER, 0x0a),
76962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_SSC_EN_CENTER, 0x01),
77062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_SSC_PER1, 0x62),
77162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_SSC_PER2, 0x02),
77262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_SYSCLK_BUF_ENABLE, 0x0c),
77362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_SYSCLK_EN_SEL, 0x1a),
77462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP_CFG, 0x14),
77562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_VCO_TUNE_MAP, 0x04),
77662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_CORE_CLK_EN, 0x20),
77762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_CMN_CONFIG_1, 0x16),
77862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_AUTO_GAIN_ADJ_CTRL_1, 0xb6),
77962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_AUTO_GAIN_ADJ_CTRL_2, 0x4b),
78062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_AUTO_GAIN_ADJ_CTRL_3, 0x37),
78162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_ADDITIONAL_MISC, 0x0c),
78262306a36Sopenharmony_ci};
78362306a36Sopenharmony_ci
78462306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sm8550_usb3_tx_tbl[] = {
78562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_TX_RES_CODE_LANE_TX, 0x00),
78662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_TX_RES_CODE_LANE_RX, 0x00),
78762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_TX_RES_CODE_LANE_OFFSET_TX, 0x1f),
78862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_TX_RES_CODE_LANE_OFFSET_RX, 0x09),
78962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_TX_LANE_MODE_1, 0xf5),
79062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_TX_LANE_MODE_3, 0x3f),
79162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_TX_LANE_MODE_4, 0x3f),
79262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_TX_LANE_MODE_5, 0x5f),
79362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_TX_RCV_DETECT_LVL_2, 0x12),
79462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG_LANE(QSERDES_V6_TX_PI_QEC_CTRL, 0x21, 1),
79562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG_LANE(QSERDES_V6_TX_PI_QEC_CTRL, 0x05, 2),
79662306a36Sopenharmony_ci};
79762306a36Sopenharmony_ci
79862306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sm8550_usb3_rx_tbl[] = {
79962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_RX_UCDR_FO_GAIN, 0x0a),
80062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_RX_UCDR_SO_GAIN, 0x06),
80162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_RX_UCDR_FASTLOCK_FO_GAIN, 0x2f),
80262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x7f),
80362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_RX_UCDR_FASTLOCK_COUNT_LOW, 0xff),
80462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_RX_UCDR_FASTLOCK_COUNT_HIGH, 0x0f),
80562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_RX_UCDR_PI_CONTROLS, 0x99),
80662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_RX_UCDR_SB2_THRESH1, 0x08),
80762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_RX_UCDR_SB2_THRESH2, 0x08),
80862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_RX_UCDR_SB2_GAIN1, 0x00),
80962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_RX_UCDR_SB2_GAIN2, 0x0a),
81062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_RX_AUX_DATA_TCOARSE_TFINE, 0xa0),
81162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_RX_VGA_CAL_CNTRL1, 0x54),
81262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_RX_VGA_CAL_CNTRL2, 0x0f),
81362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_RX_GM_CAL, 0x13),
81462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0f),
81562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_RX_RX_EQU_ADAPTOR_CNTRL3, 0x4a),
81662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_RX_RX_EQU_ADAPTOR_CNTRL4, 0x0a),
81762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_RX_RX_IDAC_TSETTLE_LOW, 0x07),
81862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_RX_RX_IDAC_TSETTLE_HIGH, 0x00),
81962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x47),
82062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_RX_SIGDET_CNTRL, 0x04),
82162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_RX_SIGDET_DEGLITCH_CNTRL, 0x0e),
82262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_RX_RX_MODE_01_LOW, 0xdc),
82362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_RX_RX_MODE_01_HIGH, 0x5c),
82462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_RX_RX_MODE_01_HIGH2, 0x9c),
82562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_RX_RX_MODE_01_HIGH3, 0x1d),
82662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_RX_RX_MODE_01_HIGH4, 0x09),
82762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_RX_DFE_EN_TIMER, 0x04),
82862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_RX_DFE_CTLE_POST_CAL_OFFSET, 0x38),
82962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_RX_DCC_CTRL1, 0x0c),
83062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_RX_VTH_CODE, 0x10),
83162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_RX_SIGDET_CAL_CTRL1, 0x14),
83262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_RX_SIGDET_CAL_TRIM, 0x08),
83362306a36Sopenharmony_ci
83462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG_LANE(QSERDES_V6_RX_RX_MODE_00_LOW, 0x3f, 1),
83562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG_LANE(QSERDES_V6_RX_RX_MODE_00_HIGH, 0xbf, 1),
83662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG_LANE(QSERDES_V6_RX_RX_MODE_00_HIGH2, 0xff, 1),
83762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG_LANE(QSERDES_V6_RX_RX_MODE_00_HIGH3, 0xdf, 1),
83862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG_LANE(QSERDES_V6_RX_RX_MODE_00_HIGH4, 0xed, 1),
83962306a36Sopenharmony_ci
84062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG_LANE(QSERDES_V6_RX_RX_MODE_00_LOW, 0xbf, 2),
84162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG_LANE(QSERDES_V6_RX_RX_MODE_00_HIGH, 0xbf, 2),
84262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG_LANE(QSERDES_V6_RX_RX_MODE_00_HIGH2, 0xbf, 2),
84362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG_LANE(QSERDES_V6_RX_RX_MODE_00_HIGH3, 0xdf, 2),
84462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG_LANE(QSERDES_V6_RX_RX_MODE_00_HIGH4, 0xfd, 2),
84562306a36Sopenharmony_ci};
84662306a36Sopenharmony_ci
84762306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sm8550_usb3_pcs_tbl[] = {
84862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_LOCK_DETECT_CONFIG1, 0xc4),
84962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_LOCK_DETECT_CONFIG2, 0x89),
85062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_LOCK_DETECT_CONFIG3, 0x20),
85162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_LOCK_DETECT_CONFIG6, 0x13),
85262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_REFGEN_REQ_CONFIG1, 0x21),
85362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_RX_SIGDET_LVL, 0x99),
85462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_RCVR_DTCT_DLY_P1U2_L, 0xe7),
85562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_RCVR_DTCT_DLY_P1U2_H, 0x03),
85662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_CDR_RESET_TIME, 0x0a),
85762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_ALIGN_DETECT_CONFIG1, 0x88),
85862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_ALIGN_DETECT_CONFIG2, 0x13),
85962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_PCS_TX_RX_CONFIG, 0x0c),
86062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_EQ_CONFIG1, 0x4b),
86162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_EQ_CONFIG5, 0x10),
86262306a36Sopenharmony_ci};
86362306a36Sopenharmony_ci
86462306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sm8550_usb3_pcs_usb_tbl[] = {
86562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_USB3_POWER_STATE_CONFIG1, 0x68),
86662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_USB3_LFPS_DET_HIGH_COUNT_VAL, 0xf8),
86762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_USB3_RXEQTRAINING_DFE_TIME_S2, 0x07),
86862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_USB3_RCVR_DTCT_DLY_U3_L, 0x40),
86962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_USB3_RCVR_DTCT_DLY_U3_H, 0x00),
87062306a36Sopenharmony_ci};
87162306a36Sopenharmony_ci
87262306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl qmp_v4_dp_serdes_tbl[] = {
87362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_SVS_MODE_CLK_SEL, 0x05),
87462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_SYSCLK_EN_SEL, 0x3b),
87562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_SYS_CLK_CTRL, 0x02),
87662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_CLK_ENABLE1, 0x0c),
87762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_SYSCLK_BUF_ENABLE, 0x06),
87862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_CLK_SELECT, 0x30),
87962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_IVCO, 0x0f),
88062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_CCTRL_MODE0, 0x36),
88162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_RCTRL_MODE0, 0x16),
88262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_CP_CTRL_MODE0, 0x06),
88362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_CMN_CONFIG, 0x02),
88462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_INTEGLOOP_GAIN0_MODE0, 0x3f),
88562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_INTEGLOOP_GAIN1_MODE0, 0x00),
88662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE_MAP, 0x00),
88762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START1_MODE0, 0x00),
88862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_BG_TIMER, 0x0a),
88962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_CORECLK_DIV_MODE0, 0x0a),
89062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE_CTRL, 0x00),
89162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIAS_EN_CLKBUFLR_EN, 0x17),
89262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_CORE_CLK_EN, 0x1f),
89362306a36Sopenharmony_ci};
89462306a36Sopenharmony_ci
89562306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl qmp_v4_dp_serdes_tbl_rbr[] = {
89662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_HSCLK_SEL, 0x05),
89762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_DEC_START_MODE0, 0x69),
89862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START2_MODE0, 0x80),
89962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START3_MODE0, 0x07),
90062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP1_MODE0, 0x6f),
90162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP2_MODE0, 0x08),
90262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP_EN, 0x04),
90362306a36Sopenharmony_ci};
90462306a36Sopenharmony_ci
90562306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl qmp_v4_dp_serdes_tbl_hbr[] = {
90662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_HSCLK_SEL, 0x03),
90762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_DEC_START_MODE0, 0x69),
90862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START2_MODE0, 0x80),
90962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START3_MODE0, 0x07),
91062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP1_MODE0, 0x0f),
91162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP2_MODE0, 0x0e),
91262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP_EN, 0x08),
91362306a36Sopenharmony_ci};
91462306a36Sopenharmony_ci
91562306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl qmp_v4_dp_serdes_tbl_hbr2[] = {
91662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_HSCLK_SEL, 0x01),
91762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_DEC_START_MODE0, 0x8c),
91862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START2_MODE0, 0x00),
91962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START3_MODE0, 0x0a),
92062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP1_MODE0, 0x1f),
92162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP2_MODE0, 0x1c),
92262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP_EN, 0x08),
92362306a36Sopenharmony_ci};
92462306a36Sopenharmony_ci
92562306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl qmp_v4_dp_serdes_tbl_hbr3[] = {
92662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_HSCLK_SEL, 0x00),
92762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_DEC_START_MODE0, 0x69),
92862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START2_MODE0, 0x80),
92962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START3_MODE0, 0x07),
93062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP1_MODE0, 0x2f),
93162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP2_MODE0, 0x2a),
93262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP_EN, 0x08),
93362306a36Sopenharmony_ci};
93462306a36Sopenharmony_ci
93562306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl qmp_v4_dp_tx_tbl[] = {
93662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_TX_VMODE_CTRL1, 0x40),
93762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_TX_PRE_STALL_LDO_BOOST_EN, 0x30),
93862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_TX_INTERFACE_SELECT, 0x3b),
93962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_TX_CLKBUF_ENABLE, 0x0f),
94062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_TX_RESET_TSYNC_EN, 0x03),
94162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_TX_TRAN_DRVR_EMP_EN, 0x0f),
94262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_TX_PARRATE_REC_DETECT_IDLE_EN, 0x00),
94362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_TX_TX_INTERFACE_MODE, 0x00),
94462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_TX_RES_CODE_LANE_OFFSET_TX, 0x11),
94562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_TX_RES_CODE_LANE_OFFSET_RX, 0x11),
94662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_TX_TX_BAND, 0x4),
94762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_TX_TX_POL_INV, 0x0a),
94862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_TX_TX_DRV_LVL, 0x2a),
94962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_TX_TX_EMP_POST1_LVL, 0x20),
95062306a36Sopenharmony_ci};
95162306a36Sopenharmony_ci
95262306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl qmp_v5_dp_serdes_tbl[] = {
95362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_SVS_MODE_CLK_SEL, 0x05),
95462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_SYSCLK_EN_SEL, 0x3b),
95562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_SYS_CLK_CTRL, 0x02),
95662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_CLK_ENABLE1, 0x0c),
95762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_SYSCLK_BUF_ENABLE, 0x06),
95862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_CLK_SELECT, 0x30),
95962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_IVCO, 0x0f),
96062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_CCTRL_MODE0, 0x36),
96162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_CCTRL_MODE1, 0x36),
96262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_RCTRL_MODE0, 0x16),
96362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_RCTRL_MODE1, 0x16),
96462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_CP_CTRL_MODE0, 0x06),
96562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_CP_CTRL_MODE1, 0x06),
96662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_CMN_CONFIG, 0x02),
96762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_INTEGLOOP_GAIN0_MODE0, 0x3f),
96862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_INTEGLOOP_GAIN1_MODE0, 0x00),
96962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE_MAP, 0x02),
97062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START1_MODE0, 0x00),
97162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_BG_TIMER, 0x0a),
97262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_CORECLK_DIV_MODE0, 0x0a),
97362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE_CTRL, 0x00),
97462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIAS_EN_CLKBUFLR_EN, 0x17),
97562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_CORE_CLK_EN, 0x1f),
97662306a36Sopenharmony_ci};
97762306a36Sopenharmony_ci
97862306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl qmp_v5_dp_tx_tbl[] = {
97962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_TX_VMODE_CTRL1, 0x40),
98062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_TX_PRE_STALL_LDO_BOOST_EN, 0x30),
98162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_TX_INTERFACE_SELECT, 0x3b),
98262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_TX_CLKBUF_ENABLE, 0x0f),
98362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_TX_RESET_TSYNC_EN, 0x03),
98462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_TX_TRAN_DRVR_EMP_EN, 0x0f),
98562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_TX_PARRATE_REC_DETECT_IDLE_EN, 0x00),
98662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_TX_TX_INTERFACE_MODE, 0x00),
98762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_TX_RES_CODE_LANE_OFFSET_TX, 0x11),
98862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_TX_RES_CODE_LANE_OFFSET_RX, 0x11),
98962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_TX_TX_BAND, 0x04),
99062306a36Sopenharmony_ci};
99162306a36Sopenharmony_ci
99262306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl qmp_v5_5nm_dp_tx_tbl[] = {
99362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_5NM_TX_LANE_MODE_3, 0x51),
99462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_5NM_TX_TRANSCEIVER_BIAS_EN, 0x1a),
99562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_5NM_TX_VMODE_CTRL1, 0x40),
99662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_5NM_TX_PRE_STALL_LDO_BOOST_EN, 0x0),
99762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_5NM_TX_INTERFACE_SELECT, 0xff),
99862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_5NM_TX_CLKBUF_ENABLE, 0x0f),
99962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_5NM_TX_RESET_TSYNC_EN, 0x03),
100062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_5NM_TX_TRAN_DRVR_EMP_EN, 0xf),
100162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_5NM_TX_PARRATE_REC_DETECT_IDLE_EN, 0x00),
100262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_5NM_TX_RES_CODE_LANE_OFFSET_TX, 0x11),
100362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_5NM_TX_RES_CODE_LANE_OFFSET_RX, 0x11),
100462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_5NM_TX_TX_BAND, 0x01),
100562306a36Sopenharmony_ci};
100662306a36Sopenharmony_ci
100762306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl qmp_v6_dp_serdes_tbl[] = {
100862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_SVS_MODE_CLK_SEL, 0x15),
100962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_SYSCLK_EN_SEL, 0x3b),
101062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_SYS_CLK_CTRL, 0x02),
101162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_CLK_ENABLE1, 0x0c),
101262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_SYSCLK_BUF_ENABLE, 0x06),
101362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_CLK_SELECT, 0x30),
101462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_IVCO, 0x0f),
101562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_CCTRL_MODE0, 0x36),
101662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_RCTRL_MODE0, 0x16),
101762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_CP_CTRL_MODE0, 0x06),
101862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_DIV_FRAC_START1_MODE0, 0x00),
101962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_CMN_CONFIG_1, 0x12),
102062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_INTEGLOOP_GAIN0_MODE0, 0x3f),
102162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_INTEGLOOP_GAIN1_MODE0, 0x00),
102262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_VCO_TUNE_MAP, 0x00),
102362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_BG_TIMER, 0x0a),
102462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_CORE_CLK_DIV_MODE0, 0x14),
102562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_VCO_TUNE_CTRL, 0x00),
102662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_BIAS_EN_CLK_BUFLR_EN, 0x17),
102762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_CORE_CLK_EN, 0x0f),
102862306a36Sopenharmony_ci};
102962306a36Sopenharmony_ci
103062306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl qmp_v6_dp_tx_tbl[] = {
103162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_TX_VMODE_CTRL1, 0x40),
103262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_TX_PRE_STALL_LDO_BOOST_EN, 0x30),
103362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_TX_INTERFACE_SELECT, 0x3b),
103462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_TX_CLKBUF_ENABLE, 0x0f),
103562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_TX_RESET_TSYNC_EN, 0x03),
103662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_TX_TRAN_DRVR_EMP_EN, 0x0f),
103762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_TX_PARRATE_REC_DETECT_IDLE_EN, 0x00),
103862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_TX_TX_INTERFACE_MODE, 0x00),
103962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_TX_RES_CODE_LANE_OFFSET_TX, 0x0c),
104062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_TX_RES_CODE_LANE_OFFSET_RX, 0x0c),
104162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_TX_TX_BAND, 0x4),
104262306a36Sopenharmony_ci};
104362306a36Sopenharmony_ci
104462306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl qmp_v6_dp_serdes_tbl_rbr[] = {
104562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_HSCLK_SEL_1, 0x05),
104662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_DEC_START_MODE0, 0x34),
104762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_DIV_FRAC_START2_MODE0, 0xc0),
104862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_DIV_FRAC_START3_MODE0, 0x0b),
104962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP1_MODE0, 0x37),
105062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP2_MODE0, 0x04),
105162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP_EN, 0x04),
105262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_BIN_VCOCAL_CMP_CODE1_MODE0, 0x71),
105362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_BIN_VCOCAL_CMP_CODE2_MODE0, 0x0c),
105462306a36Sopenharmony_ci};
105562306a36Sopenharmony_ci
105662306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl qmp_v6_dp_serdes_tbl_hbr[] = {
105762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_HSCLK_SEL_1, 0x03),
105862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_DEC_START_MODE0, 0x34),
105962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_DIV_FRAC_START2_MODE0, 0xc0),
106062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_DIV_FRAC_START3_MODE0, 0x0b),
106162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP1_MODE0, 0x07),
106262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP2_MODE0, 0x07),
106362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP_EN, 0x08),
106462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_BIN_VCOCAL_CMP_CODE1_MODE0, 0x71),
106562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_BIN_VCOCAL_CMP_CODE2_MODE0, 0x0c),
106662306a36Sopenharmony_ci};
106762306a36Sopenharmony_ci
106862306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl qmp_v6_dp_serdes_tbl_hbr2[] = {
106962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_HSCLK_SEL_1, 0x01),
107062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_DEC_START_MODE0, 0x46),
107162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_DIV_FRAC_START2_MODE0, 0x00),
107262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_DIV_FRAC_START3_MODE0, 0x05),
107362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP1_MODE0, 0x0f),
107462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP2_MODE0, 0x0e),
107562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP_EN, 0x08),
107662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_BIN_VCOCAL_CMP_CODE1_MODE0, 0x97),
107762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_BIN_VCOCAL_CMP_CODE2_MODE0, 0x10),
107862306a36Sopenharmony_ci};
107962306a36Sopenharmony_ci
108062306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl qmp_v6_dp_serdes_tbl_hbr3[] = {
108162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_HSCLK_SEL_1, 0x00),
108262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_DEC_START_MODE0, 0x34),
108362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_DIV_FRAC_START2_MODE0, 0xc0),
108462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_DIV_FRAC_START3_MODE0, 0x0b),
108562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP1_MODE0, 0x17),
108662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP2_MODE0, 0x15),
108762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP_EN, 0x08),
108862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_BIN_VCOCAL_CMP_CODE1_MODE0, 0x71),
108962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_BIN_VCOCAL_CMP_CODE2_MODE0, 0x0c),
109062306a36Sopenharmony_ci};
109162306a36Sopenharmony_ci
109262306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sc8280xp_usb43dp_serdes_tbl[] = {
109362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_COM_SSC_EN_CENTER, 0x01),
109462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_COM_SSC_PER1, 0x31),
109562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_COM_SSC_PER2, 0x01),
109662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_COM_SSC_STEP_SIZE1_MODE0, 0xfd),
109762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_COM_SSC_STEP_SIZE2_MODE0, 0x0d),
109862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_COM_SSC_STEP_SIZE1_MODE1, 0xfd),
109962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_COM_SSC_STEP_SIZE2_MODE1, 0x0d),
110062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_COM_SYSCLK_BUF_ENABLE, 0x0a),
110162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_COM_CP_CTRL_MODE0, 0x02),
110262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_COM_CP_CTRL_MODE1, 0x02),
110362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_COM_PLL_RCTRL_MODE0, 0x16),
110462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_COM_PLL_RCTRL_MODE1, 0x16),
110562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_COM_PLL_CCTRL_MODE0, 0x36),
110662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_COM_PLL_CCTRL_MODE1, 0x36),
110762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_COM_SYSCLK_EN_SEL, 0x1a),
110862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_COM_LOCK_CMP_EN, 0x04),
110962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_COM_LOCK_CMP1_MODE0, 0x14),
111062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_COM_LOCK_CMP2_MODE0, 0x34),
111162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_COM_LOCK_CMP1_MODE1, 0x34),
111262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_COM_LOCK_CMP2_MODE1, 0x82),
111362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_COM_DEC_START_MODE0, 0x04),
111462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_COM_DEC_START_MSB_MODE0, 0x01),
111562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_COM_DEC_START_MODE1, 0x04),
111662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_COM_DEC_START_MSB_MODE1, 0x01),
111762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_COM_DIV_FRAC_START1_MODE0, 0x55),
111862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_COM_DIV_FRAC_START2_MODE0, 0xd5),
111962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_COM_DIV_FRAC_START3_MODE0, 0x05),
112062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_COM_DIV_FRAC_START1_MODE1, 0x55),
112162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_COM_DIV_FRAC_START2_MODE1, 0xd5),
112262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_COM_DIV_FRAC_START3_MODE1, 0x05),
112362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_COM_VCO_TUNE_MAP, 0x02),
112462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_COM_VCO_TUNE1_MODE0, 0xd4),
112562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_COM_VCO_TUNE2_MODE0, 0x00),
112662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_COM_VCO_TUNE1_MODE1, 0xd4),
112762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_COM_VCO_TUNE2_MODE1, 0x00),
112862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_COM_HSCLK_SEL, 0x13),
112962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_COM_HSCLK_HS_SWITCH_SEL, 0x00),
113062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_COM_CORECLK_DIV_MODE0, 0x0a),
113162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_COM_CORECLK_DIV_MODE1, 0x04),
113262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_COM_CORE_CLK_EN, 0x60),
113362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_COM_CMN_CONFIG, 0x76),
113462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_COM_PLL_IVCO, 0xff),
113562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_COM_INTEGLOOP_GAIN0_MODE0, 0x20),
113662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_COM_INTEGLOOP_GAIN0_MODE1, 0x20),
113762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_COM_VCO_TUNE_INITVAL2, 0x00),
113862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_COM_VCO_TUNE_MAXVAL2, 0x01),
113962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_COM_SVS_MODE_CLK_SEL, 0x0a),
114062306a36Sopenharmony_ci};
114162306a36Sopenharmony_ci
114262306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sc8280xp_usb43dp_tx_tbl[] = {
114362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_5NM_TX_LANE_MODE_1, 0x05),
114462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_5NM_TX_LANE_MODE_2, 0xc2),
114562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_5NM_TX_LANE_MODE_3, 0x10),
114662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_5NM_TX_RES_CODE_LANE_OFFSET_TX, 0x1f),
114762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_5NM_TX_RES_CODE_LANE_OFFSET_RX, 0x0a),
114862306a36Sopenharmony_ci};
114962306a36Sopenharmony_ci
115062306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sc8280xp_usb43dp_rx_tbl[] = {
115162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_SIGDET_CNTRL, 0x04),
115262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_SIGDET_DEGLITCH_CNTRL, 0x0e),
115362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_SIGDET_ENABLES, 0x00),
115462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_RX_MODE_RATE_0_1_B0, 0xd2),
115562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_RX_MODE_RATE_0_1_B1, 0xd2),
115662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_RX_MODE_RATE_0_1_B2, 0xdb),
115762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_RX_MODE_RATE_0_1_B3, 0x21),
115862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_RX_MODE_RATE_0_1_B4, 0x3f),
115962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_RX_MODE_RATE_0_1_B5, 0x80),
116062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_RX_MODE_RATE_0_1_B6, 0x45),
116162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_RX_MODE_RATE_0_1_B7, 0x00),
116262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_RX_MODE_RATE2_B0, 0x6b),
116362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_RX_MODE_RATE2_B1, 0x63),
116462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_RX_MODE_RATE2_B2, 0xb6),
116562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_RX_MODE_RATE2_B3, 0x23),
116662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_RX_MODE_RATE2_B4, 0x35),
116762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_RX_MODE_RATE2_B5, 0x30),
116862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_RX_MODE_RATE2_B6, 0x8e),
116962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_RX_MODE_RATE2_B7, 0x00),
117062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_RX_IVCM_CAL_CODE_OVERRIDE, 0x00),
117162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_RX_IVCM_CAL_CTRL2, 0x80),
117262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_RX_SUMMER_CAL_SPD_MODE, 0x1b),
117362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_DFE_CTLE_POST_CAL_OFFSET, 0x38),
117462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_UCDR_PI_CONTROLS, 0x15),
117562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_UCDR_SB2_GAIN2_RATE2, 0x0a),
117662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_RX_IVCM_POSTCAL_OFFSET, 0x7c),
117762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_VGA_CAL_CNTRL1, 0x00),
117862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_VGA_CAL_MAN_VAL, 0x0d),
117962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_DFE_DAC_ENABLE1, 0x00),
118062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_DFE_3, 0x45),
118162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_GM_CAL, 0x09),
118262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_UCDR_FO_GAIN_RATE2, 0x09),
118362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_UCDR_SO_GAIN_RATE2, 0x05),
118462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_Q_PI_INTRINSIC_BIAS_RATE32, 0x3f),
118562306a36Sopenharmony_ci};
118662306a36Sopenharmony_ci
118762306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sc8280xp_usb43dp_pcs_tbl[] = {
118862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V5_PCS_RCVR_DTCT_DLY_P1U2_L, 0xe7),
118962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V5_PCS_RCVR_DTCT_DLY_P1U2_H, 0x03),
119062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V5_PCS_LOCK_DETECT_CONFIG1, 0xd0),
119162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V5_PCS_LOCK_DETECT_CONFIG2, 0x07),
119262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V5_PCS_LOCK_DETECT_CONFIG3, 0x20),
119362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V5_PCS_LOCK_DETECT_CONFIG6, 0x13),
119462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V5_PCS_REFGEN_REQ_CONFIG1, 0x21),
119562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V5_PCS_RX_SIGDET_LVL, 0xaa),
119662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V5_PCS_RX_CONFIG, 0x0a),
119762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V5_PCS_ALIGN_DETECT_CONFIG1, 0x88),
119862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V5_PCS_ALIGN_DETECT_CONFIG2, 0x13),
119962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V5_PCS_PCS_TX_RX_CONFIG, 0x0c),
120062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V5_PCS_EQ_CONFIG1, 0x4b),
120162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V5_PCS_EQ_CONFIG5, 0x10),
120262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V5_PCS_USB3_LFPS_DET_HIGH_COUNT_VAL, 0xf8),
120362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V5_PCS_USB3_RXEQTRAINING_DFE_TIME_S2, 0x07),
120462306a36Sopenharmony_ci};
120562306a36Sopenharmony_ci
120662306a36Sopenharmony_ci/* list of regulators */
120762306a36Sopenharmony_cistruct qmp_regulator_data {
120862306a36Sopenharmony_ci	const char *name;
120962306a36Sopenharmony_ci	unsigned int enable_load;
121062306a36Sopenharmony_ci};
121162306a36Sopenharmony_ci
121262306a36Sopenharmony_cistatic struct qmp_regulator_data qmp_phy_vreg_l[] = {
121362306a36Sopenharmony_ci	{ .name = "vdda-phy", .enable_load = 21800 },
121462306a36Sopenharmony_ci	{ .name = "vdda-pll", .enable_load = 36000 },
121562306a36Sopenharmony_ci};
121662306a36Sopenharmony_ci
121762306a36Sopenharmony_cistatic const u8 qmp_dp_v3_pre_emphasis_hbr3_hbr2[4][4] = {
121862306a36Sopenharmony_ci	{ 0x00, 0x0c, 0x15, 0x1a },
121962306a36Sopenharmony_ci	{ 0x02, 0x0e, 0x16, 0xff },
122062306a36Sopenharmony_ci	{ 0x02, 0x11, 0xff, 0xff },
122162306a36Sopenharmony_ci	{ 0x04, 0xff, 0xff, 0xff }
122262306a36Sopenharmony_ci};
122362306a36Sopenharmony_ci
122462306a36Sopenharmony_cistatic const u8 qmp_dp_v3_voltage_swing_hbr3_hbr2[4][4] = {
122562306a36Sopenharmony_ci	{ 0x02, 0x12, 0x16, 0x1a },
122662306a36Sopenharmony_ci	{ 0x09, 0x19, 0x1f, 0xff },
122762306a36Sopenharmony_ci	{ 0x10, 0x1f, 0xff, 0xff },
122862306a36Sopenharmony_ci	{ 0x1f, 0xff, 0xff, 0xff }
122962306a36Sopenharmony_ci};
123062306a36Sopenharmony_ci
123162306a36Sopenharmony_cistatic const u8 qmp_dp_v3_pre_emphasis_hbr_rbr[4][4] = {
123262306a36Sopenharmony_ci	{ 0x00, 0x0c, 0x14, 0x19 },
123362306a36Sopenharmony_ci	{ 0x00, 0x0b, 0x12, 0xff },
123462306a36Sopenharmony_ci	{ 0x00, 0x0b, 0xff, 0xff },
123562306a36Sopenharmony_ci	{ 0x04, 0xff, 0xff, 0xff }
123662306a36Sopenharmony_ci};
123762306a36Sopenharmony_ci
123862306a36Sopenharmony_cistatic const u8 qmp_dp_v3_voltage_swing_hbr_rbr[4][4] = {
123962306a36Sopenharmony_ci	{ 0x08, 0x0f, 0x16, 0x1f },
124062306a36Sopenharmony_ci	{ 0x11, 0x1e, 0x1f, 0xff },
124162306a36Sopenharmony_ci	{ 0x19, 0x1f, 0xff, 0xff },
124262306a36Sopenharmony_ci	{ 0x1f, 0xff, 0xff, 0xff }
124362306a36Sopenharmony_ci};
124462306a36Sopenharmony_ci
124562306a36Sopenharmony_cistatic const u8 qmp_dp_v4_pre_emphasis_hbr3_hbr2[4][4] = {
124662306a36Sopenharmony_ci	{ 0x00, 0x0c, 0x15, 0x1b },
124762306a36Sopenharmony_ci	{ 0x02, 0x0e, 0x16, 0xff },
124862306a36Sopenharmony_ci	{ 0x02, 0x11, 0xff, 0xff },
124962306a36Sopenharmony_ci	{ 0x04, 0xff, 0xff, 0xff }
125062306a36Sopenharmony_ci};
125162306a36Sopenharmony_ci
125262306a36Sopenharmony_cistatic const u8 qmp_dp_v4_pre_emphasis_hbr_rbr[4][4] = {
125362306a36Sopenharmony_ci	{ 0x00, 0x0d, 0x14, 0x1a },
125462306a36Sopenharmony_ci	{ 0x00, 0x0e, 0x15, 0xff },
125562306a36Sopenharmony_ci	{ 0x00, 0x0d, 0xff, 0xff },
125662306a36Sopenharmony_ci	{ 0x03, 0xff, 0xff, 0xff }
125762306a36Sopenharmony_ci};
125862306a36Sopenharmony_ci
125962306a36Sopenharmony_cistatic const u8 qmp_dp_v4_voltage_swing_hbr_rbr[4][4] = {
126062306a36Sopenharmony_ci	{ 0x08, 0x0f, 0x16, 0x1f },
126162306a36Sopenharmony_ci	{ 0x11, 0x1e, 0x1f, 0xff },
126262306a36Sopenharmony_ci	{ 0x16, 0x1f, 0xff, 0xff },
126362306a36Sopenharmony_ci	{ 0x1f, 0xff, 0xff, 0xff }
126462306a36Sopenharmony_ci};
126562306a36Sopenharmony_ci
126662306a36Sopenharmony_cistatic const u8 qmp_dp_v5_pre_emphasis_hbr3_hbr2[4][4] = {
126762306a36Sopenharmony_ci	{ 0x20, 0x2c, 0x35, 0x3b },
126862306a36Sopenharmony_ci	{ 0x22, 0x2e, 0x36, 0xff },
126962306a36Sopenharmony_ci	{ 0x22, 0x31, 0xff, 0xff },
127062306a36Sopenharmony_ci	{ 0x24, 0xff, 0xff, 0xff }
127162306a36Sopenharmony_ci};
127262306a36Sopenharmony_ci
127362306a36Sopenharmony_cistatic const u8 qmp_dp_v5_voltage_swing_hbr3_hbr2[4][4] = {
127462306a36Sopenharmony_ci	{ 0x22, 0x32, 0x36, 0x3a },
127562306a36Sopenharmony_ci	{ 0x29, 0x39, 0x3f, 0xff },
127662306a36Sopenharmony_ci	{ 0x30, 0x3f, 0xff, 0xff },
127762306a36Sopenharmony_ci	{ 0x3f, 0xff, 0xff, 0xff }
127862306a36Sopenharmony_ci};
127962306a36Sopenharmony_ci
128062306a36Sopenharmony_cistatic const u8 qmp_dp_v5_pre_emphasis_hbr_rbr[4][4] = {
128162306a36Sopenharmony_ci	{ 0x20, 0x2d, 0x34, 0x3a },
128262306a36Sopenharmony_ci	{ 0x20, 0x2e, 0x35, 0xff },
128362306a36Sopenharmony_ci	{ 0x20, 0x2e, 0xff, 0xff },
128462306a36Sopenharmony_ci	{ 0x24, 0xff, 0xff, 0xff }
128562306a36Sopenharmony_ci};
128662306a36Sopenharmony_ci
128762306a36Sopenharmony_cistatic const u8 qmp_dp_v5_voltage_swing_hbr_rbr[4][4] = {
128862306a36Sopenharmony_ci	{ 0x28, 0x2f, 0x36, 0x3f },
128962306a36Sopenharmony_ci	{ 0x31, 0x3e, 0x3f, 0xff },
129062306a36Sopenharmony_ci	{ 0x36, 0x3f, 0xff, 0xff },
129162306a36Sopenharmony_ci	{ 0x3f, 0xff, 0xff, 0xff }
129262306a36Sopenharmony_ci};
129362306a36Sopenharmony_ci
129462306a36Sopenharmony_cistatic const u8 qmp_dp_v6_pre_emphasis_hbr_rbr[4][4] = {
129562306a36Sopenharmony_ci	{ 0x20, 0x2d, 0x34, 0x3a },
129662306a36Sopenharmony_ci	{ 0x20, 0x2e, 0x35, 0xff },
129762306a36Sopenharmony_ci	{ 0x20, 0x2e, 0xff, 0xff },
129862306a36Sopenharmony_ci	{ 0x22, 0xff, 0xff, 0xff }
129962306a36Sopenharmony_ci};
130062306a36Sopenharmony_ci
130162306a36Sopenharmony_cistruct qmp_combo;
130262306a36Sopenharmony_ci
130362306a36Sopenharmony_cistruct qmp_combo_offsets {
130462306a36Sopenharmony_ci	u16 com;
130562306a36Sopenharmony_ci	u16 txa;
130662306a36Sopenharmony_ci	u16 rxa;
130762306a36Sopenharmony_ci	u16 txb;
130862306a36Sopenharmony_ci	u16 rxb;
130962306a36Sopenharmony_ci	u16 usb3_serdes;
131062306a36Sopenharmony_ci	u16 usb3_pcs_misc;
131162306a36Sopenharmony_ci	u16 usb3_pcs;
131262306a36Sopenharmony_ci	u16 usb3_pcs_usb;
131362306a36Sopenharmony_ci	u16 dp_serdes;
131462306a36Sopenharmony_ci	u16 dp_txa;
131562306a36Sopenharmony_ci	u16 dp_txb;
131662306a36Sopenharmony_ci	u16 dp_dp_phy;
131762306a36Sopenharmony_ci};
131862306a36Sopenharmony_ci
131962306a36Sopenharmony_cistruct qmp_phy_cfg {
132062306a36Sopenharmony_ci	const struct qmp_combo_offsets *offsets;
132162306a36Sopenharmony_ci
132262306a36Sopenharmony_ci	/* Init sequence for PHY blocks - serdes, tx, rx, pcs */
132362306a36Sopenharmony_ci	const struct qmp_phy_init_tbl *serdes_tbl;
132462306a36Sopenharmony_ci	int serdes_tbl_num;
132562306a36Sopenharmony_ci	const struct qmp_phy_init_tbl *tx_tbl;
132662306a36Sopenharmony_ci	int tx_tbl_num;
132762306a36Sopenharmony_ci	const struct qmp_phy_init_tbl *rx_tbl;
132862306a36Sopenharmony_ci	int rx_tbl_num;
132962306a36Sopenharmony_ci	const struct qmp_phy_init_tbl *pcs_tbl;
133062306a36Sopenharmony_ci	int pcs_tbl_num;
133162306a36Sopenharmony_ci	const struct qmp_phy_init_tbl *pcs_usb_tbl;
133262306a36Sopenharmony_ci	int pcs_usb_tbl_num;
133362306a36Sopenharmony_ci
133462306a36Sopenharmony_ci	const struct qmp_phy_init_tbl *dp_serdes_tbl;
133562306a36Sopenharmony_ci	int dp_serdes_tbl_num;
133662306a36Sopenharmony_ci	const struct qmp_phy_init_tbl *dp_tx_tbl;
133762306a36Sopenharmony_ci	int dp_tx_tbl_num;
133862306a36Sopenharmony_ci
133962306a36Sopenharmony_ci	/* Init sequence for DP PHY block link rates */
134062306a36Sopenharmony_ci	const struct qmp_phy_init_tbl *serdes_tbl_rbr;
134162306a36Sopenharmony_ci	int serdes_tbl_rbr_num;
134262306a36Sopenharmony_ci	const struct qmp_phy_init_tbl *serdes_tbl_hbr;
134362306a36Sopenharmony_ci	int serdes_tbl_hbr_num;
134462306a36Sopenharmony_ci	const struct qmp_phy_init_tbl *serdes_tbl_hbr2;
134562306a36Sopenharmony_ci	int serdes_tbl_hbr2_num;
134662306a36Sopenharmony_ci	const struct qmp_phy_init_tbl *serdes_tbl_hbr3;
134762306a36Sopenharmony_ci	int serdes_tbl_hbr3_num;
134862306a36Sopenharmony_ci
134962306a36Sopenharmony_ci	/* DP PHY swing and pre_emphasis tables */
135062306a36Sopenharmony_ci	const u8 (*swing_hbr_rbr)[4][4];
135162306a36Sopenharmony_ci	const u8 (*swing_hbr3_hbr2)[4][4];
135262306a36Sopenharmony_ci	const u8 (*pre_emphasis_hbr_rbr)[4][4];
135362306a36Sopenharmony_ci	const u8 (*pre_emphasis_hbr3_hbr2)[4][4];
135462306a36Sopenharmony_ci
135562306a36Sopenharmony_ci	/* DP PHY callbacks */
135662306a36Sopenharmony_ci	int (*configure_dp_phy)(struct qmp_combo *qmp);
135762306a36Sopenharmony_ci	void (*configure_dp_tx)(struct qmp_combo *qmp);
135862306a36Sopenharmony_ci	int (*calibrate_dp_phy)(struct qmp_combo *qmp);
135962306a36Sopenharmony_ci	void (*dp_aux_init)(struct qmp_combo *qmp);
136062306a36Sopenharmony_ci
136162306a36Sopenharmony_ci	/* resets to be requested */
136262306a36Sopenharmony_ci	const char * const *reset_list;
136362306a36Sopenharmony_ci	int num_resets;
136462306a36Sopenharmony_ci	/* regulators to be requested */
136562306a36Sopenharmony_ci	const struct qmp_regulator_data *vreg_list;
136662306a36Sopenharmony_ci	int num_vregs;
136762306a36Sopenharmony_ci
136862306a36Sopenharmony_ci	/* array of registers with different offsets */
136962306a36Sopenharmony_ci	const unsigned int *regs;
137062306a36Sopenharmony_ci
137162306a36Sopenharmony_ci	/* true, if PHY needs delay after POWER_DOWN */
137262306a36Sopenharmony_ci	bool has_pwrdn_delay;
137362306a36Sopenharmony_ci
137462306a36Sopenharmony_ci	/* Offset from PCS to PCS_USB region */
137562306a36Sopenharmony_ci	unsigned int pcs_usb_offset;
137662306a36Sopenharmony_ci
137762306a36Sopenharmony_ci};
137862306a36Sopenharmony_ci
137962306a36Sopenharmony_cistruct qmp_combo {
138062306a36Sopenharmony_ci	struct device *dev;
138162306a36Sopenharmony_ci
138262306a36Sopenharmony_ci	const struct qmp_phy_cfg *cfg;
138362306a36Sopenharmony_ci
138462306a36Sopenharmony_ci	void __iomem *com;
138562306a36Sopenharmony_ci
138662306a36Sopenharmony_ci	void __iomem *serdes;
138762306a36Sopenharmony_ci	void __iomem *tx;
138862306a36Sopenharmony_ci	void __iomem *rx;
138962306a36Sopenharmony_ci	void __iomem *pcs;
139062306a36Sopenharmony_ci	void __iomem *tx2;
139162306a36Sopenharmony_ci	void __iomem *rx2;
139262306a36Sopenharmony_ci	void __iomem *pcs_misc;
139362306a36Sopenharmony_ci	void __iomem *pcs_usb;
139462306a36Sopenharmony_ci
139562306a36Sopenharmony_ci	void __iomem *dp_serdes;
139662306a36Sopenharmony_ci	void __iomem *dp_tx;
139762306a36Sopenharmony_ci	void __iomem *dp_tx2;
139862306a36Sopenharmony_ci	void __iomem *dp_dp_phy;
139962306a36Sopenharmony_ci
140062306a36Sopenharmony_ci	struct clk *pipe_clk;
140162306a36Sopenharmony_ci	struct clk_bulk_data *clks;
140262306a36Sopenharmony_ci	int num_clks;
140362306a36Sopenharmony_ci	struct reset_control_bulk_data *resets;
140462306a36Sopenharmony_ci	struct regulator_bulk_data *vregs;
140562306a36Sopenharmony_ci
140662306a36Sopenharmony_ci	struct mutex phy_mutex;
140762306a36Sopenharmony_ci	int init_count;
140862306a36Sopenharmony_ci
140962306a36Sopenharmony_ci	struct phy *usb_phy;
141062306a36Sopenharmony_ci	enum phy_mode mode;
141162306a36Sopenharmony_ci	unsigned int usb_init_count;
141262306a36Sopenharmony_ci
141362306a36Sopenharmony_ci	struct phy *dp_phy;
141462306a36Sopenharmony_ci	unsigned int dp_aux_cfg;
141562306a36Sopenharmony_ci	struct phy_configure_opts_dp dp_opts;
141662306a36Sopenharmony_ci	unsigned int dp_init_count;
141762306a36Sopenharmony_ci
141862306a36Sopenharmony_ci	struct clk_fixed_rate pipe_clk_fixed;
141962306a36Sopenharmony_ci	struct clk_hw dp_link_hw;
142062306a36Sopenharmony_ci	struct clk_hw dp_pixel_hw;
142162306a36Sopenharmony_ci
142262306a36Sopenharmony_ci	struct drm_bridge bridge;
142362306a36Sopenharmony_ci
142462306a36Sopenharmony_ci	struct typec_switch_dev *sw;
142562306a36Sopenharmony_ci	enum typec_orientation orientation;
142662306a36Sopenharmony_ci};
142762306a36Sopenharmony_ci
142862306a36Sopenharmony_cistatic void qmp_v3_dp_aux_init(struct qmp_combo *qmp);
142962306a36Sopenharmony_cistatic void qmp_v3_configure_dp_tx(struct qmp_combo *qmp);
143062306a36Sopenharmony_cistatic int qmp_v3_configure_dp_phy(struct qmp_combo *qmp);
143162306a36Sopenharmony_cistatic int qmp_v3_calibrate_dp_phy(struct qmp_combo *qmp);
143262306a36Sopenharmony_ci
143362306a36Sopenharmony_cistatic void qmp_v4_dp_aux_init(struct qmp_combo *qmp);
143462306a36Sopenharmony_cistatic void qmp_v4_configure_dp_tx(struct qmp_combo *qmp);
143562306a36Sopenharmony_cistatic int qmp_v4_configure_dp_phy(struct qmp_combo *qmp);
143662306a36Sopenharmony_cistatic int qmp_v4_calibrate_dp_phy(struct qmp_combo *qmp);
143762306a36Sopenharmony_ci
143862306a36Sopenharmony_cistatic inline void qphy_setbits(void __iomem *base, u32 offset, u32 val)
143962306a36Sopenharmony_ci{
144062306a36Sopenharmony_ci	u32 reg;
144162306a36Sopenharmony_ci
144262306a36Sopenharmony_ci	reg = readl(base + offset);
144362306a36Sopenharmony_ci	reg |= val;
144462306a36Sopenharmony_ci	writel(reg, base + offset);
144562306a36Sopenharmony_ci
144662306a36Sopenharmony_ci	/* ensure that above write is through */
144762306a36Sopenharmony_ci	readl(base + offset);
144862306a36Sopenharmony_ci}
144962306a36Sopenharmony_ci
145062306a36Sopenharmony_cistatic inline void qphy_clrbits(void __iomem *base, u32 offset, u32 val)
145162306a36Sopenharmony_ci{
145262306a36Sopenharmony_ci	u32 reg;
145362306a36Sopenharmony_ci
145462306a36Sopenharmony_ci	reg = readl(base + offset);
145562306a36Sopenharmony_ci	reg &= ~val;
145662306a36Sopenharmony_ci	writel(reg, base + offset);
145762306a36Sopenharmony_ci
145862306a36Sopenharmony_ci	/* ensure that above write is through */
145962306a36Sopenharmony_ci	readl(base + offset);
146062306a36Sopenharmony_ci}
146162306a36Sopenharmony_ci
146262306a36Sopenharmony_ci/* list of clocks required by phy */
146362306a36Sopenharmony_cistatic const char * const qmp_combo_phy_clk_l[] = {
146462306a36Sopenharmony_ci	"aux", "cfg_ahb", "ref", "com_aux",
146562306a36Sopenharmony_ci};
146662306a36Sopenharmony_ci
146762306a36Sopenharmony_ci/* list of resets */
146862306a36Sopenharmony_cistatic const char * const msm8996_usb3phy_reset_l[] = {
146962306a36Sopenharmony_ci	"phy", "common",
147062306a36Sopenharmony_ci};
147162306a36Sopenharmony_ci
147262306a36Sopenharmony_cistatic const char * const sc7180_usb3phy_reset_l[] = {
147362306a36Sopenharmony_ci	"phy",
147462306a36Sopenharmony_ci};
147562306a36Sopenharmony_ci
147662306a36Sopenharmony_cistatic const struct qmp_combo_offsets qmp_combo_offsets_v3 = {
147762306a36Sopenharmony_ci	.com		= 0x0000,
147862306a36Sopenharmony_ci	.txa		= 0x1200,
147962306a36Sopenharmony_ci	.rxa		= 0x1400,
148062306a36Sopenharmony_ci	.txb		= 0x1600,
148162306a36Sopenharmony_ci	.rxb		= 0x1800,
148262306a36Sopenharmony_ci	.usb3_serdes	= 0x1000,
148362306a36Sopenharmony_ci	.usb3_pcs_misc	= 0x1a00,
148462306a36Sopenharmony_ci	.usb3_pcs	= 0x1c00,
148562306a36Sopenharmony_ci	.usb3_pcs_usb	= 0x1f00,
148662306a36Sopenharmony_ci	.dp_serdes	= 0x2000,
148762306a36Sopenharmony_ci	.dp_txa		= 0x2200,
148862306a36Sopenharmony_ci	.dp_txb		= 0x2600,
148962306a36Sopenharmony_ci	.dp_dp_phy	= 0x2a00,
149062306a36Sopenharmony_ci};
149162306a36Sopenharmony_ci
149262306a36Sopenharmony_cistatic const struct qmp_combo_offsets qmp_combo_offsets_v5 = {
149362306a36Sopenharmony_ci	.com		= 0x0000,
149462306a36Sopenharmony_ci	.txa		= 0x0400,
149562306a36Sopenharmony_ci	.rxa		= 0x0600,
149662306a36Sopenharmony_ci	.txb		= 0x0a00,
149762306a36Sopenharmony_ci	.rxb		= 0x0c00,
149862306a36Sopenharmony_ci	.usb3_serdes	= 0x1000,
149962306a36Sopenharmony_ci	.usb3_pcs_misc	= 0x1200,
150062306a36Sopenharmony_ci	.usb3_pcs	= 0x1400,
150162306a36Sopenharmony_ci	.usb3_pcs_usb	= 0x1700,
150262306a36Sopenharmony_ci	.dp_serdes	= 0x2000,
150362306a36Sopenharmony_ci	.dp_dp_phy	= 0x2200,
150462306a36Sopenharmony_ci};
150562306a36Sopenharmony_ci
150662306a36Sopenharmony_cistatic const struct qmp_phy_cfg sc7180_usb3dpphy_cfg = {
150762306a36Sopenharmony_ci	.offsets		= &qmp_combo_offsets_v3,
150862306a36Sopenharmony_ci
150962306a36Sopenharmony_ci	.serdes_tbl		= qmp_v3_usb3_serdes_tbl,
151062306a36Sopenharmony_ci	.serdes_tbl_num		= ARRAY_SIZE(qmp_v3_usb3_serdes_tbl),
151162306a36Sopenharmony_ci	.tx_tbl			= qmp_v3_usb3_tx_tbl,
151262306a36Sopenharmony_ci	.tx_tbl_num		= ARRAY_SIZE(qmp_v3_usb3_tx_tbl),
151362306a36Sopenharmony_ci	.rx_tbl			= qmp_v3_usb3_rx_tbl,
151462306a36Sopenharmony_ci	.rx_tbl_num		= ARRAY_SIZE(qmp_v3_usb3_rx_tbl),
151562306a36Sopenharmony_ci	.pcs_tbl		= qmp_v3_usb3_pcs_tbl,
151662306a36Sopenharmony_ci	.pcs_tbl_num		= ARRAY_SIZE(qmp_v3_usb3_pcs_tbl),
151762306a36Sopenharmony_ci
151862306a36Sopenharmony_ci	.dp_serdes_tbl		= qmp_v3_dp_serdes_tbl,
151962306a36Sopenharmony_ci	.dp_serdes_tbl_num	= ARRAY_SIZE(qmp_v3_dp_serdes_tbl),
152062306a36Sopenharmony_ci	.dp_tx_tbl		= qmp_v3_dp_tx_tbl,
152162306a36Sopenharmony_ci	.dp_tx_tbl_num		= ARRAY_SIZE(qmp_v3_dp_tx_tbl),
152262306a36Sopenharmony_ci
152362306a36Sopenharmony_ci	.serdes_tbl_rbr		= qmp_v3_dp_serdes_tbl_rbr,
152462306a36Sopenharmony_ci	.serdes_tbl_rbr_num	= ARRAY_SIZE(qmp_v3_dp_serdes_tbl_rbr),
152562306a36Sopenharmony_ci	.serdes_tbl_hbr		= qmp_v3_dp_serdes_tbl_hbr,
152662306a36Sopenharmony_ci	.serdes_tbl_hbr_num	= ARRAY_SIZE(qmp_v3_dp_serdes_tbl_hbr),
152762306a36Sopenharmony_ci	.serdes_tbl_hbr2	= qmp_v3_dp_serdes_tbl_hbr2,
152862306a36Sopenharmony_ci	.serdes_tbl_hbr2_num	= ARRAY_SIZE(qmp_v3_dp_serdes_tbl_hbr2),
152962306a36Sopenharmony_ci	.serdes_tbl_hbr3	= qmp_v3_dp_serdes_tbl_hbr3,
153062306a36Sopenharmony_ci	.serdes_tbl_hbr3_num	= ARRAY_SIZE(qmp_v3_dp_serdes_tbl_hbr3),
153162306a36Sopenharmony_ci
153262306a36Sopenharmony_ci	.swing_hbr_rbr		= &qmp_dp_v3_voltage_swing_hbr_rbr,
153362306a36Sopenharmony_ci	.pre_emphasis_hbr_rbr	= &qmp_dp_v3_pre_emphasis_hbr_rbr,
153462306a36Sopenharmony_ci	.swing_hbr3_hbr2	= &qmp_dp_v3_voltage_swing_hbr3_hbr2,
153562306a36Sopenharmony_ci	.pre_emphasis_hbr3_hbr2 = &qmp_dp_v3_pre_emphasis_hbr3_hbr2,
153662306a36Sopenharmony_ci
153762306a36Sopenharmony_ci	.dp_aux_init		= qmp_v3_dp_aux_init,
153862306a36Sopenharmony_ci	.configure_dp_tx	= qmp_v3_configure_dp_tx,
153962306a36Sopenharmony_ci	.configure_dp_phy	= qmp_v3_configure_dp_phy,
154062306a36Sopenharmony_ci	.calibrate_dp_phy	= qmp_v3_calibrate_dp_phy,
154162306a36Sopenharmony_ci
154262306a36Sopenharmony_ci	.reset_list		= sc7180_usb3phy_reset_l,
154362306a36Sopenharmony_ci	.num_resets		= ARRAY_SIZE(sc7180_usb3phy_reset_l),
154462306a36Sopenharmony_ci	.vreg_list		= qmp_phy_vreg_l,
154562306a36Sopenharmony_ci	.num_vregs		= ARRAY_SIZE(qmp_phy_vreg_l),
154662306a36Sopenharmony_ci	.regs			= qmp_v3_usb3phy_regs_layout,
154762306a36Sopenharmony_ci
154862306a36Sopenharmony_ci	.has_pwrdn_delay	= true,
154962306a36Sopenharmony_ci};
155062306a36Sopenharmony_ci
155162306a36Sopenharmony_cistatic const struct qmp_phy_cfg sdm845_usb3dpphy_cfg = {
155262306a36Sopenharmony_ci	.offsets		= &qmp_combo_offsets_v3,
155362306a36Sopenharmony_ci
155462306a36Sopenharmony_ci	.serdes_tbl		= qmp_v3_usb3_serdes_tbl,
155562306a36Sopenharmony_ci	.serdes_tbl_num		= ARRAY_SIZE(qmp_v3_usb3_serdes_tbl),
155662306a36Sopenharmony_ci	.tx_tbl			= qmp_v3_usb3_tx_tbl,
155762306a36Sopenharmony_ci	.tx_tbl_num		= ARRAY_SIZE(qmp_v3_usb3_tx_tbl),
155862306a36Sopenharmony_ci	.rx_tbl			= qmp_v3_usb3_rx_tbl,
155962306a36Sopenharmony_ci	.rx_tbl_num		= ARRAY_SIZE(qmp_v3_usb3_rx_tbl),
156062306a36Sopenharmony_ci	.pcs_tbl		= qmp_v3_usb3_pcs_tbl,
156162306a36Sopenharmony_ci	.pcs_tbl_num		= ARRAY_SIZE(qmp_v3_usb3_pcs_tbl),
156262306a36Sopenharmony_ci
156362306a36Sopenharmony_ci	.dp_serdes_tbl		= qmp_v3_dp_serdes_tbl,
156462306a36Sopenharmony_ci	.dp_serdes_tbl_num	= ARRAY_SIZE(qmp_v3_dp_serdes_tbl),
156562306a36Sopenharmony_ci	.dp_tx_tbl		= qmp_v3_dp_tx_tbl,
156662306a36Sopenharmony_ci	.dp_tx_tbl_num		= ARRAY_SIZE(qmp_v3_dp_tx_tbl),
156762306a36Sopenharmony_ci
156862306a36Sopenharmony_ci	.serdes_tbl_rbr		= qmp_v3_dp_serdes_tbl_rbr,
156962306a36Sopenharmony_ci	.serdes_tbl_rbr_num	= ARRAY_SIZE(qmp_v3_dp_serdes_tbl_rbr),
157062306a36Sopenharmony_ci	.serdes_tbl_hbr		= qmp_v3_dp_serdes_tbl_hbr,
157162306a36Sopenharmony_ci	.serdes_tbl_hbr_num	= ARRAY_SIZE(qmp_v3_dp_serdes_tbl_hbr),
157262306a36Sopenharmony_ci	.serdes_tbl_hbr2	= qmp_v3_dp_serdes_tbl_hbr2,
157362306a36Sopenharmony_ci	.serdes_tbl_hbr2_num	= ARRAY_SIZE(qmp_v3_dp_serdes_tbl_hbr2),
157462306a36Sopenharmony_ci	.serdes_tbl_hbr3	= qmp_v3_dp_serdes_tbl_hbr3,
157562306a36Sopenharmony_ci	.serdes_tbl_hbr3_num	= ARRAY_SIZE(qmp_v3_dp_serdes_tbl_hbr3),
157662306a36Sopenharmony_ci
157762306a36Sopenharmony_ci	.swing_hbr_rbr		= &qmp_dp_v3_voltage_swing_hbr_rbr,
157862306a36Sopenharmony_ci	.pre_emphasis_hbr_rbr	= &qmp_dp_v3_pre_emphasis_hbr_rbr,
157962306a36Sopenharmony_ci	.swing_hbr3_hbr2	= &qmp_dp_v3_voltage_swing_hbr3_hbr2,
158062306a36Sopenharmony_ci	.pre_emphasis_hbr3_hbr2 = &qmp_dp_v3_pre_emphasis_hbr3_hbr2,
158162306a36Sopenharmony_ci
158262306a36Sopenharmony_ci	.dp_aux_init		= qmp_v3_dp_aux_init,
158362306a36Sopenharmony_ci	.configure_dp_tx	= qmp_v3_configure_dp_tx,
158462306a36Sopenharmony_ci	.configure_dp_phy	= qmp_v3_configure_dp_phy,
158562306a36Sopenharmony_ci	.calibrate_dp_phy	= qmp_v3_calibrate_dp_phy,
158662306a36Sopenharmony_ci
158762306a36Sopenharmony_ci	.reset_list		= msm8996_usb3phy_reset_l,
158862306a36Sopenharmony_ci	.num_resets		= ARRAY_SIZE(msm8996_usb3phy_reset_l),
158962306a36Sopenharmony_ci	.vreg_list		= qmp_phy_vreg_l,
159062306a36Sopenharmony_ci	.num_vregs		= ARRAY_SIZE(qmp_phy_vreg_l),
159162306a36Sopenharmony_ci	.regs			= qmp_v3_usb3phy_regs_layout,
159262306a36Sopenharmony_ci
159362306a36Sopenharmony_ci	.has_pwrdn_delay	= true,
159462306a36Sopenharmony_ci};
159562306a36Sopenharmony_ci
159662306a36Sopenharmony_cistatic const struct qmp_phy_cfg sc8180x_usb3dpphy_cfg = {
159762306a36Sopenharmony_ci	.offsets		= &qmp_combo_offsets_v3,
159862306a36Sopenharmony_ci
159962306a36Sopenharmony_ci	.serdes_tbl		= sm8150_usb3_serdes_tbl,
160062306a36Sopenharmony_ci	.serdes_tbl_num		= ARRAY_SIZE(sm8150_usb3_serdes_tbl),
160162306a36Sopenharmony_ci	.tx_tbl			= sm8150_usb3_tx_tbl,
160262306a36Sopenharmony_ci	.tx_tbl_num		= ARRAY_SIZE(sm8150_usb3_tx_tbl),
160362306a36Sopenharmony_ci	.rx_tbl			= sm8150_usb3_rx_tbl,
160462306a36Sopenharmony_ci	.rx_tbl_num		= ARRAY_SIZE(sm8150_usb3_rx_tbl),
160562306a36Sopenharmony_ci	.pcs_tbl		= sm8150_usb3_pcs_tbl,
160662306a36Sopenharmony_ci	.pcs_tbl_num		= ARRAY_SIZE(sm8150_usb3_pcs_tbl),
160762306a36Sopenharmony_ci	.pcs_usb_tbl		= sm8150_usb3_pcs_usb_tbl,
160862306a36Sopenharmony_ci	.pcs_usb_tbl_num	= ARRAY_SIZE(sm8150_usb3_pcs_usb_tbl),
160962306a36Sopenharmony_ci
161062306a36Sopenharmony_ci	.dp_serdes_tbl		= qmp_v4_dp_serdes_tbl,
161162306a36Sopenharmony_ci	.dp_serdes_tbl_num	= ARRAY_SIZE(qmp_v4_dp_serdes_tbl),
161262306a36Sopenharmony_ci	.dp_tx_tbl		= qmp_v4_dp_tx_tbl,
161362306a36Sopenharmony_ci	.dp_tx_tbl_num		= ARRAY_SIZE(qmp_v4_dp_tx_tbl),
161462306a36Sopenharmony_ci
161562306a36Sopenharmony_ci	.serdes_tbl_rbr		= qmp_v4_dp_serdes_tbl_rbr,
161662306a36Sopenharmony_ci	.serdes_tbl_rbr_num	= ARRAY_SIZE(qmp_v4_dp_serdes_tbl_rbr),
161762306a36Sopenharmony_ci	.serdes_tbl_hbr		= qmp_v4_dp_serdes_tbl_hbr,
161862306a36Sopenharmony_ci	.serdes_tbl_hbr_num	= ARRAY_SIZE(qmp_v4_dp_serdes_tbl_hbr),
161962306a36Sopenharmony_ci	.serdes_tbl_hbr2	= qmp_v4_dp_serdes_tbl_hbr2,
162062306a36Sopenharmony_ci	.serdes_tbl_hbr2_num	= ARRAY_SIZE(qmp_v4_dp_serdes_tbl_hbr2),
162162306a36Sopenharmony_ci	.serdes_tbl_hbr3	= qmp_v4_dp_serdes_tbl_hbr3,
162262306a36Sopenharmony_ci	.serdes_tbl_hbr3_num	= ARRAY_SIZE(qmp_v4_dp_serdes_tbl_hbr3),
162362306a36Sopenharmony_ci
162462306a36Sopenharmony_ci	.swing_hbr_rbr		= &qmp_dp_v3_voltage_swing_hbr_rbr,
162562306a36Sopenharmony_ci	.pre_emphasis_hbr_rbr	= &qmp_dp_v3_pre_emphasis_hbr_rbr,
162662306a36Sopenharmony_ci	.swing_hbr3_hbr2	= &qmp_dp_v3_voltage_swing_hbr3_hbr2,
162762306a36Sopenharmony_ci	.pre_emphasis_hbr3_hbr2 = &qmp_dp_v3_pre_emphasis_hbr3_hbr2,
162862306a36Sopenharmony_ci
162962306a36Sopenharmony_ci	.dp_aux_init		= qmp_v4_dp_aux_init,
163062306a36Sopenharmony_ci	.configure_dp_tx	= qmp_v4_configure_dp_tx,
163162306a36Sopenharmony_ci	.configure_dp_phy	= qmp_v4_configure_dp_phy,
163262306a36Sopenharmony_ci	.calibrate_dp_phy	= qmp_v4_calibrate_dp_phy,
163362306a36Sopenharmony_ci
163462306a36Sopenharmony_ci	.reset_list		= msm8996_usb3phy_reset_l,
163562306a36Sopenharmony_ci	.num_resets		= ARRAY_SIZE(msm8996_usb3phy_reset_l),
163662306a36Sopenharmony_ci	.vreg_list		= qmp_phy_vreg_l,
163762306a36Sopenharmony_ci	.num_vregs		= ARRAY_SIZE(qmp_phy_vreg_l),
163862306a36Sopenharmony_ci	.regs			= qmp_v45_usb3phy_regs_layout,
163962306a36Sopenharmony_ci	.pcs_usb_offset		= 0x300,
164062306a36Sopenharmony_ci
164162306a36Sopenharmony_ci	.has_pwrdn_delay	= true,
164262306a36Sopenharmony_ci};
164362306a36Sopenharmony_ci
164462306a36Sopenharmony_cistatic const struct qmp_phy_cfg sc8280xp_usb43dpphy_cfg = {
164562306a36Sopenharmony_ci	.offsets		= &qmp_combo_offsets_v5,
164662306a36Sopenharmony_ci
164762306a36Sopenharmony_ci	.serdes_tbl		= sc8280xp_usb43dp_serdes_tbl,
164862306a36Sopenharmony_ci	.serdes_tbl_num		= ARRAY_SIZE(sc8280xp_usb43dp_serdes_tbl),
164962306a36Sopenharmony_ci	.tx_tbl			= sc8280xp_usb43dp_tx_tbl,
165062306a36Sopenharmony_ci	.tx_tbl_num		= ARRAY_SIZE(sc8280xp_usb43dp_tx_tbl),
165162306a36Sopenharmony_ci	.rx_tbl			= sc8280xp_usb43dp_rx_tbl,
165262306a36Sopenharmony_ci	.rx_tbl_num		= ARRAY_SIZE(sc8280xp_usb43dp_rx_tbl),
165362306a36Sopenharmony_ci	.pcs_tbl		= sc8280xp_usb43dp_pcs_tbl,
165462306a36Sopenharmony_ci	.pcs_tbl_num		= ARRAY_SIZE(sc8280xp_usb43dp_pcs_tbl),
165562306a36Sopenharmony_ci
165662306a36Sopenharmony_ci	.dp_serdes_tbl		= qmp_v5_dp_serdes_tbl,
165762306a36Sopenharmony_ci	.dp_serdes_tbl_num	= ARRAY_SIZE(qmp_v5_dp_serdes_tbl),
165862306a36Sopenharmony_ci	.dp_tx_tbl		= qmp_v5_5nm_dp_tx_tbl,
165962306a36Sopenharmony_ci	.dp_tx_tbl_num		= ARRAY_SIZE(qmp_v5_5nm_dp_tx_tbl),
166062306a36Sopenharmony_ci
166162306a36Sopenharmony_ci	.serdes_tbl_rbr		= qmp_v4_dp_serdes_tbl_rbr,
166262306a36Sopenharmony_ci	.serdes_tbl_rbr_num	= ARRAY_SIZE(qmp_v4_dp_serdes_tbl_rbr),
166362306a36Sopenharmony_ci	.serdes_tbl_hbr		= qmp_v4_dp_serdes_tbl_hbr,
166462306a36Sopenharmony_ci	.serdes_tbl_hbr_num	= ARRAY_SIZE(qmp_v4_dp_serdes_tbl_hbr),
166562306a36Sopenharmony_ci	.serdes_tbl_hbr2	= qmp_v4_dp_serdes_tbl_hbr2,
166662306a36Sopenharmony_ci	.serdes_tbl_hbr2_num	= ARRAY_SIZE(qmp_v4_dp_serdes_tbl_hbr2),
166762306a36Sopenharmony_ci	.serdes_tbl_hbr3	= qmp_v4_dp_serdes_tbl_hbr3,
166862306a36Sopenharmony_ci	.serdes_tbl_hbr3_num	= ARRAY_SIZE(qmp_v4_dp_serdes_tbl_hbr3),
166962306a36Sopenharmony_ci
167062306a36Sopenharmony_ci	.swing_hbr_rbr		= &qmp_dp_v5_voltage_swing_hbr_rbr,
167162306a36Sopenharmony_ci	.pre_emphasis_hbr_rbr	= &qmp_dp_v5_pre_emphasis_hbr_rbr,
167262306a36Sopenharmony_ci	.swing_hbr3_hbr2	= &qmp_dp_v5_voltage_swing_hbr3_hbr2,
167362306a36Sopenharmony_ci	.pre_emphasis_hbr3_hbr2 = &qmp_dp_v5_pre_emphasis_hbr3_hbr2,
167462306a36Sopenharmony_ci
167562306a36Sopenharmony_ci	.dp_aux_init		= qmp_v4_dp_aux_init,
167662306a36Sopenharmony_ci	.configure_dp_tx	= qmp_v4_configure_dp_tx,
167762306a36Sopenharmony_ci	.configure_dp_phy	= qmp_v4_configure_dp_phy,
167862306a36Sopenharmony_ci	.calibrate_dp_phy	= qmp_v4_calibrate_dp_phy,
167962306a36Sopenharmony_ci
168062306a36Sopenharmony_ci	.reset_list		= msm8996_usb3phy_reset_l,
168162306a36Sopenharmony_ci	.num_resets		= ARRAY_SIZE(msm8996_usb3phy_reset_l),
168262306a36Sopenharmony_ci	.vreg_list		= qmp_phy_vreg_l,
168362306a36Sopenharmony_ci	.num_vregs		= ARRAY_SIZE(qmp_phy_vreg_l),
168462306a36Sopenharmony_ci	.regs			= qmp_v5_5nm_usb3phy_regs_layout,
168562306a36Sopenharmony_ci};
168662306a36Sopenharmony_ci
168762306a36Sopenharmony_cistatic const struct qmp_phy_cfg sm6350_usb3dpphy_cfg = {
168862306a36Sopenharmony_ci	.offsets		= &qmp_combo_offsets_v3,
168962306a36Sopenharmony_ci
169062306a36Sopenharmony_ci	.serdes_tbl		= qmp_v3_usb3_serdes_tbl,
169162306a36Sopenharmony_ci	.serdes_tbl_num		= ARRAY_SIZE(qmp_v3_usb3_serdes_tbl),
169262306a36Sopenharmony_ci	.tx_tbl			= qmp_v3_usb3_tx_tbl,
169362306a36Sopenharmony_ci	.tx_tbl_num		= ARRAY_SIZE(qmp_v3_usb3_tx_tbl),
169462306a36Sopenharmony_ci	.rx_tbl			= sm6350_usb3_rx_tbl,
169562306a36Sopenharmony_ci	.rx_tbl_num		= ARRAY_SIZE(sm6350_usb3_rx_tbl),
169662306a36Sopenharmony_ci	.pcs_tbl		= sm6350_usb3_pcs_tbl,
169762306a36Sopenharmony_ci	.pcs_tbl_num		= ARRAY_SIZE(sm6350_usb3_pcs_tbl),
169862306a36Sopenharmony_ci
169962306a36Sopenharmony_ci	.dp_serdes_tbl		= qmp_v3_dp_serdes_tbl,
170062306a36Sopenharmony_ci	.dp_serdes_tbl_num	= ARRAY_SIZE(qmp_v3_dp_serdes_tbl),
170162306a36Sopenharmony_ci	.dp_tx_tbl		= qmp_v3_dp_tx_tbl,
170262306a36Sopenharmony_ci	.dp_tx_tbl_num		= ARRAY_SIZE(qmp_v3_dp_tx_tbl),
170362306a36Sopenharmony_ci
170462306a36Sopenharmony_ci	.serdes_tbl_rbr		= qmp_v3_dp_serdes_tbl_rbr,
170562306a36Sopenharmony_ci	.serdes_tbl_rbr_num	= ARRAY_SIZE(qmp_v3_dp_serdes_tbl_rbr),
170662306a36Sopenharmony_ci	.serdes_tbl_hbr		= qmp_v3_dp_serdes_tbl_hbr,
170762306a36Sopenharmony_ci	.serdes_tbl_hbr_num	= ARRAY_SIZE(qmp_v3_dp_serdes_tbl_hbr),
170862306a36Sopenharmony_ci	.serdes_tbl_hbr2	= qmp_v3_dp_serdes_tbl_hbr2,
170962306a36Sopenharmony_ci	.serdes_tbl_hbr2_num	= ARRAY_SIZE(qmp_v3_dp_serdes_tbl_hbr2),
171062306a36Sopenharmony_ci	.serdes_tbl_hbr3	= qmp_v3_dp_serdes_tbl_hbr3,
171162306a36Sopenharmony_ci	.serdes_tbl_hbr3_num	= ARRAY_SIZE(qmp_v3_dp_serdes_tbl_hbr3),
171262306a36Sopenharmony_ci
171362306a36Sopenharmony_ci	.swing_hbr_rbr		= &qmp_dp_v3_voltage_swing_hbr_rbr,
171462306a36Sopenharmony_ci	.pre_emphasis_hbr_rbr	= &qmp_dp_v3_pre_emphasis_hbr_rbr,
171562306a36Sopenharmony_ci	.swing_hbr3_hbr2	= &qmp_dp_v3_voltage_swing_hbr3_hbr2,
171662306a36Sopenharmony_ci	.pre_emphasis_hbr3_hbr2 = &qmp_dp_v3_pre_emphasis_hbr3_hbr2,
171762306a36Sopenharmony_ci
171862306a36Sopenharmony_ci	.dp_aux_init		= qmp_v3_dp_aux_init,
171962306a36Sopenharmony_ci	.configure_dp_tx	= qmp_v3_configure_dp_tx,
172062306a36Sopenharmony_ci	.configure_dp_phy	= qmp_v3_configure_dp_phy,
172162306a36Sopenharmony_ci	.calibrate_dp_phy	= qmp_v3_calibrate_dp_phy,
172262306a36Sopenharmony_ci
172362306a36Sopenharmony_ci	.reset_list		= msm8996_usb3phy_reset_l,
172462306a36Sopenharmony_ci	.num_resets		= ARRAY_SIZE(msm8996_usb3phy_reset_l),
172562306a36Sopenharmony_ci	.vreg_list		= qmp_phy_vreg_l,
172662306a36Sopenharmony_ci	.num_vregs		= ARRAY_SIZE(qmp_phy_vreg_l),
172762306a36Sopenharmony_ci	.regs			= qmp_v3_usb3phy_regs_layout,
172862306a36Sopenharmony_ci};
172962306a36Sopenharmony_ci
173062306a36Sopenharmony_cistatic const struct qmp_phy_cfg sm8250_usb3dpphy_cfg = {
173162306a36Sopenharmony_ci	.offsets		= &qmp_combo_offsets_v3,
173262306a36Sopenharmony_ci
173362306a36Sopenharmony_ci	.serdes_tbl		= sm8150_usb3_serdes_tbl,
173462306a36Sopenharmony_ci	.serdes_tbl_num		= ARRAY_SIZE(sm8150_usb3_serdes_tbl),
173562306a36Sopenharmony_ci	.tx_tbl			= sm8250_usb3_tx_tbl,
173662306a36Sopenharmony_ci	.tx_tbl_num		= ARRAY_SIZE(sm8250_usb3_tx_tbl),
173762306a36Sopenharmony_ci	.rx_tbl			= sm8250_usb3_rx_tbl,
173862306a36Sopenharmony_ci	.rx_tbl_num		= ARRAY_SIZE(sm8250_usb3_rx_tbl),
173962306a36Sopenharmony_ci	.pcs_tbl		= sm8250_usb3_pcs_tbl,
174062306a36Sopenharmony_ci	.pcs_tbl_num		= ARRAY_SIZE(sm8250_usb3_pcs_tbl),
174162306a36Sopenharmony_ci	.pcs_usb_tbl		= sm8250_usb3_pcs_usb_tbl,
174262306a36Sopenharmony_ci	.pcs_usb_tbl_num	= ARRAY_SIZE(sm8250_usb3_pcs_usb_tbl),
174362306a36Sopenharmony_ci
174462306a36Sopenharmony_ci	.dp_serdes_tbl		= qmp_v4_dp_serdes_tbl,
174562306a36Sopenharmony_ci	.dp_serdes_tbl_num	= ARRAY_SIZE(qmp_v4_dp_serdes_tbl),
174662306a36Sopenharmony_ci	.dp_tx_tbl		= qmp_v4_dp_tx_tbl,
174762306a36Sopenharmony_ci	.dp_tx_tbl_num		= ARRAY_SIZE(qmp_v4_dp_tx_tbl),
174862306a36Sopenharmony_ci
174962306a36Sopenharmony_ci	.serdes_tbl_rbr		= qmp_v4_dp_serdes_tbl_rbr,
175062306a36Sopenharmony_ci	.serdes_tbl_rbr_num	= ARRAY_SIZE(qmp_v4_dp_serdes_tbl_rbr),
175162306a36Sopenharmony_ci	.serdes_tbl_hbr		= qmp_v4_dp_serdes_tbl_hbr,
175262306a36Sopenharmony_ci	.serdes_tbl_hbr_num	= ARRAY_SIZE(qmp_v4_dp_serdes_tbl_hbr),
175362306a36Sopenharmony_ci	.serdes_tbl_hbr2	= qmp_v4_dp_serdes_tbl_hbr2,
175462306a36Sopenharmony_ci	.serdes_tbl_hbr2_num	= ARRAY_SIZE(qmp_v4_dp_serdes_tbl_hbr2),
175562306a36Sopenharmony_ci	.serdes_tbl_hbr3	= qmp_v4_dp_serdes_tbl_hbr3,
175662306a36Sopenharmony_ci	.serdes_tbl_hbr3_num	= ARRAY_SIZE(qmp_v4_dp_serdes_tbl_hbr3),
175762306a36Sopenharmony_ci
175862306a36Sopenharmony_ci	.swing_hbr_rbr		= &qmp_dp_v3_voltage_swing_hbr_rbr,
175962306a36Sopenharmony_ci	.pre_emphasis_hbr_rbr	= &qmp_dp_v3_pre_emphasis_hbr_rbr,
176062306a36Sopenharmony_ci	.swing_hbr3_hbr2	= &qmp_dp_v3_voltage_swing_hbr3_hbr2,
176162306a36Sopenharmony_ci	.pre_emphasis_hbr3_hbr2 = &qmp_dp_v3_pre_emphasis_hbr3_hbr2,
176262306a36Sopenharmony_ci
176362306a36Sopenharmony_ci	.dp_aux_init		= qmp_v4_dp_aux_init,
176462306a36Sopenharmony_ci	.configure_dp_tx	= qmp_v4_configure_dp_tx,
176562306a36Sopenharmony_ci	.configure_dp_phy	= qmp_v4_configure_dp_phy,
176662306a36Sopenharmony_ci	.calibrate_dp_phy	= qmp_v4_calibrate_dp_phy,
176762306a36Sopenharmony_ci
176862306a36Sopenharmony_ci	.reset_list		= msm8996_usb3phy_reset_l,
176962306a36Sopenharmony_ci	.num_resets		= ARRAY_SIZE(msm8996_usb3phy_reset_l),
177062306a36Sopenharmony_ci	.vreg_list		= qmp_phy_vreg_l,
177162306a36Sopenharmony_ci	.num_vregs		= ARRAY_SIZE(qmp_phy_vreg_l),
177262306a36Sopenharmony_ci	.regs			= qmp_v45_usb3phy_regs_layout,
177362306a36Sopenharmony_ci	.pcs_usb_offset		= 0x300,
177462306a36Sopenharmony_ci
177562306a36Sopenharmony_ci	.has_pwrdn_delay	= true,
177662306a36Sopenharmony_ci};
177762306a36Sopenharmony_ci
177862306a36Sopenharmony_cistatic const struct qmp_phy_cfg sm8350_usb3dpphy_cfg = {
177962306a36Sopenharmony_ci	.offsets		= &qmp_combo_offsets_v3,
178062306a36Sopenharmony_ci
178162306a36Sopenharmony_ci	.serdes_tbl		= sm8150_usb3_serdes_tbl,
178262306a36Sopenharmony_ci	.serdes_tbl_num		= ARRAY_SIZE(sm8150_usb3_serdes_tbl),
178362306a36Sopenharmony_ci	.tx_tbl			= sm8350_usb3_tx_tbl,
178462306a36Sopenharmony_ci	.tx_tbl_num		= ARRAY_SIZE(sm8350_usb3_tx_tbl),
178562306a36Sopenharmony_ci	.rx_tbl			= sm8350_usb3_rx_tbl,
178662306a36Sopenharmony_ci	.rx_tbl_num		= ARRAY_SIZE(sm8350_usb3_rx_tbl),
178762306a36Sopenharmony_ci	.pcs_tbl		= sm8350_usb3_pcs_tbl,
178862306a36Sopenharmony_ci	.pcs_tbl_num		= ARRAY_SIZE(sm8350_usb3_pcs_tbl),
178962306a36Sopenharmony_ci	.pcs_usb_tbl		= sm8350_usb3_pcs_usb_tbl,
179062306a36Sopenharmony_ci	.pcs_usb_tbl_num	= ARRAY_SIZE(sm8350_usb3_pcs_usb_tbl),
179162306a36Sopenharmony_ci
179262306a36Sopenharmony_ci	.dp_serdes_tbl		= qmp_v4_dp_serdes_tbl,
179362306a36Sopenharmony_ci	.dp_serdes_tbl_num	= ARRAY_SIZE(qmp_v4_dp_serdes_tbl),
179462306a36Sopenharmony_ci	.dp_tx_tbl		= qmp_v5_dp_tx_tbl,
179562306a36Sopenharmony_ci	.dp_tx_tbl_num		= ARRAY_SIZE(qmp_v5_dp_tx_tbl),
179662306a36Sopenharmony_ci
179762306a36Sopenharmony_ci	.serdes_tbl_rbr		= qmp_v4_dp_serdes_tbl_rbr,
179862306a36Sopenharmony_ci	.serdes_tbl_rbr_num	= ARRAY_SIZE(qmp_v4_dp_serdes_tbl_rbr),
179962306a36Sopenharmony_ci	.serdes_tbl_hbr		= qmp_v4_dp_serdes_tbl_hbr,
180062306a36Sopenharmony_ci	.serdes_tbl_hbr_num	= ARRAY_SIZE(qmp_v4_dp_serdes_tbl_hbr),
180162306a36Sopenharmony_ci	.serdes_tbl_hbr2	= qmp_v4_dp_serdes_tbl_hbr2,
180262306a36Sopenharmony_ci	.serdes_tbl_hbr2_num	= ARRAY_SIZE(qmp_v4_dp_serdes_tbl_hbr2),
180362306a36Sopenharmony_ci	.serdes_tbl_hbr3	= qmp_v4_dp_serdes_tbl_hbr3,
180462306a36Sopenharmony_ci	.serdes_tbl_hbr3_num	= ARRAY_SIZE(qmp_v4_dp_serdes_tbl_hbr3),
180562306a36Sopenharmony_ci
180662306a36Sopenharmony_ci	.swing_hbr_rbr		= &qmp_dp_v4_voltage_swing_hbr_rbr,
180762306a36Sopenharmony_ci	.pre_emphasis_hbr_rbr	= &qmp_dp_v4_pre_emphasis_hbr_rbr,
180862306a36Sopenharmony_ci	.swing_hbr3_hbr2	= &qmp_dp_v3_voltage_swing_hbr3_hbr2,
180962306a36Sopenharmony_ci	.pre_emphasis_hbr3_hbr2 = &qmp_dp_v4_pre_emphasis_hbr3_hbr2,
181062306a36Sopenharmony_ci
181162306a36Sopenharmony_ci	.dp_aux_init		= qmp_v4_dp_aux_init,
181262306a36Sopenharmony_ci	.configure_dp_tx	= qmp_v4_configure_dp_tx,
181362306a36Sopenharmony_ci	.configure_dp_phy	= qmp_v4_configure_dp_phy,
181462306a36Sopenharmony_ci	.calibrate_dp_phy	= qmp_v4_calibrate_dp_phy,
181562306a36Sopenharmony_ci
181662306a36Sopenharmony_ci	.reset_list		= msm8996_usb3phy_reset_l,
181762306a36Sopenharmony_ci	.num_resets		= ARRAY_SIZE(msm8996_usb3phy_reset_l),
181862306a36Sopenharmony_ci	.vreg_list		= qmp_phy_vreg_l,
181962306a36Sopenharmony_ci	.num_vregs		= ARRAY_SIZE(qmp_phy_vreg_l),
182062306a36Sopenharmony_ci	.regs			= qmp_v45_usb3phy_regs_layout,
182162306a36Sopenharmony_ci
182262306a36Sopenharmony_ci	.has_pwrdn_delay	= true,
182362306a36Sopenharmony_ci};
182462306a36Sopenharmony_ci
182562306a36Sopenharmony_cistatic const struct qmp_phy_cfg sm8550_usb3dpphy_cfg = {
182662306a36Sopenharmony_ci	.offsets		= &qmp_combo_offsets_v3,
182762306a36Sopenharmony_ci
182862306a36Sopenharmony_ci	.serdes_tbl		= sm8550_usb3_serdes_tbl,
182962306a36Sopenharmony_ci	.serdes_tbl_num		= ARRAY_SIZE(sm8550_usb3_serdes_tbl),
183062306a36Sopenharmony_ci	.tx_tbl			= sm8550_usb3_tx_tbl,
183162306a36Sopenharmony_ci	.tx_tbl_num		= ARRAY_SIZE(sm8550_usb3_tx_tbl),
183262306a36Sopenharmony_ci	.rx_tbl			= sm8550_usb3_rx_tbl,
183362306a36Sopenharmony_ci	.rx_tbl_num		= ARRAY_SIZE(sm8550_usb3_rx_tbl),
183462306a36Sopenharmony_ci	.pcs_tbl		= sm8550_usb3_pcs_tbl,
183562306a36Sopenharmony_ci	.pcs_tbl_num		= ARRAY_SIZE(sm8550_usb3_pcs_tbl),
183662306a36Sopenharmony_ci	.pcs_usb_tbl		= sm8550_usb3_pcs_usb_tbl,
183762306a36Sopenharmony_ci	.pcs_usb_tbl_num	= ARRAY_SIZE(sm8550_usb3_pcs_usb_tbl),
183862306a36Sopenharmony_ci
183962306a36Sopenharmony_ci	.dp_serdes_tbl		= qmp_v6_dp_serdes_tbl,
184062306a36Sopenharmony_ci	.dp_serdes_tbl_num	= ARRAY_SIZE(qmp_v6_dp_serdes_tbl),
184162306a36Sopenharmony_ci	.dp_tx_tbl		= qmp_v6_dp_tx_tbl,
184262306a36Sopenharmony_ci	.dp_tx_tbl_num		= ARRAY_SIZE(qmp_v6_dp_tx_tbl),
184362306a36Sopenharmony_ci
184462306a36Sopenharmony_ci	.serdes_tbl_rbr		= qmp_v6_dp_serdes_tbl_rbr,
184562306a36Sopenharmony_ci	.serdes_tbl_rbr_num	= ARRAY_SIZE(qmp_v6_dp_serdes_tbl_rbr),
184662306a36Sopenharmony_ci	.serdes_tbl_hbr		= qmp_v6_dp_serdes_tbl_hbr,
184762306a36Sopenharmony_ci	.serdes_tbl_hbr_num	= ARRAY_SIZE(qmp_v6_dp_serdes_tbl_hbr),
184862306a36Sopenharmony_ci	.serdes_tbl_hbr2	= qmp_v6_dp_serdes_tbl_hbr2,
184962306a36Sopenharmony_ci	.serdes_tbl_hbr2_num	= ARRAY_SIZE(qmp_v6_dp_serdes_tbl_hbr2),
185062306a36Sopenharmony_ci	.serdes_tbl_hbr3	= qmp_v6_dp_serdes_tbl_hbr3,
185162306a36Sopenharmony_ci	.serdes_tbl_hbr3_num	= ARRAY_SIZE(qmp_v6_dp_serdes_tbl_hbr3),
185262306a36Sopenharmony_ci
185362306a36Sopenharmony_ci	.swing_hbr_rbr		= &qmp_dp_v5_voltage_swing_hbr_rbr,
185462306a36Sopenharmony_ci	.pre_emphasis_hbr_rbr	= &qmp_dp_v6_pre_emphasis_hbr_rbr,
185562306a36Sopenharmony_ci	.swing_hbr3_hbr2	= &qmp_dp_v5_voltage_swing_hbr3_hbr2,
185662306a36Sopenharmony_ci	.pre_emphasis_hbr3_hbr2 = &qmp_dp_v5_pre_emphasis_hbr3_hbr2,
185762306a36Sopenharmony_ci
185862306a36Sopenharmony_ci	.dp_aux_init		= qmp_v4_dp_aux_init,
185962306a36Sopenharmony_ci	.configure_dp_tx	= qmp_v4_configure_dp_tx,
186062306a36Sopenharmony_ci	.configure_dp_phy	= qmp_v4_configure_dp_phy,
186162306a36Sopenharmony_ci	.calibrate_dp_phy	= qmp_v4_calibrate_dp_phy,
186262306a36Sopenharmony_ci
186362306a36Sopenharmony_ci	.regs			= qmp_v6_usb3phy_regs_layout,
186462306a36Sopenharmony_ci	.reset_list		= msm8996_usb3phy_reset_l,
186562306a36Sopenharmony_ci	.num_resets		= ARRAY_SIZE(msm8996_usb3phy_reset_l),
186662306a36Sopenharmony_ci	.vreg_list		= qmp_phy_vreg_l,
186762306a36Sopenharmony_ci	.num_vregs		= ARRAY_SIZE(qmp_phy_vreg_l),
186862306a36Sopenharmony_ci};
186962306a36Sopenharmony_ci
187062306a36Sopenharmony_cistatic void qmp_combo_configure_lane(void __iomem *base,
187162306a36Sopenharmony_ci					const struct qmp_phy_init_tbl tbl[],
187262306a36Sopenharmony_ci					int num,
187362306a36Sopenharmony_ci					u8 lane_mask)
187462306a36Sopenharmony_ci{
187562306a36Sopenharmony_ci	int i;
187662306a36Sopenharmony_ci	const struct qmp_phy_init_tbl *t = tbl;
187762306a36Sopenharmony_ci
187862306a36Sopenharmony_ci	if (!t)
187962306a36Sopenharmony_ci		return;
188062306a36Sopenharmony_ci
188162306a36Sopenharmony_ci	for (i = 0; i < num; i++, t++) {
188262306a36Sopenharmony_ci		if (!(t->lane_mask & lane_mask))
188362306a36Sopenharmony_ci			continue;
188462306a36Sopenharmony_ci
188562306a36Sopenharmony_ci		writel(t->val, base + t->offset);
188662306a36Sopenharmony_ci	}
188762306a36Sopenharmony_ci}
188862306a36Sopenharmony_ci
188962306a36Sopenharmony_cistatic void qmp_combo_configure(void __iomem *base,
189062306a36Sopenharmony_ci				   const struct qmp_phy_init_tbl tbl[],
189162306a36Sopenharmony_ci				   int num)
189262306a36Sopenharmony_ci{
189362306a36Sopenharmony_ci	qmp_combo_configure_lane(base, tbl, num, 0xff);
189462306a36Sopenharmony_ci}
189562306a36Sopenharmony_ci
189662306a36Sopenharmony_cistatic int qmp_combo_dp_serdes_init(struct qmp_combo *qmp)
189762306a36Sopenharmony_ci{
189862306a36Sopenharmony_ci	const struct qmp_phy_cfg *cfg = qmp->cfg;
189962306a36Sopenharmony_ci	void __iomem *serdes = qmp->dp_serdes;
190062306a36Sopenharmony_ci	const struct phy_configure_opts_dp *dp_opts = &qmp->dp_opts;
190162306a36Sopenharmony_ci
190262306a36Sopenharmony_ci	qmp_combo_configure(serdes, cfg->dp_serdes_tbl, cfg->dp_serdes_tbl_num);
190362306a36Sopenharmony_ci
190462306a36Sopenharmony_ci	switch (dp_opts->link_rate) {
190562306a36Sopenharmony_ci	case 1620:
190662306a36Sopenharmony_ci		qmp_combo_configure(serdes, cfg->serdes_tbl_rbr,
190762306a36Sopenharmony_ci				cfg->serdes_tbl_rbr_num);
190862306a36Sopenharmony_ci		break;
190962306a36Sopenharmony_ci	case 2700:
191062306a36Sopenharmony_ci		qmp_combo_configure(serdes, cfg->serdes_tbl_hbr,
191162306a36Sopenharmony_ci				cfg->serdes_tbl_hbr_num);
191262306a36Sopenharmony_ci		break;
191362306a36Sopenharmony_ci	case 5400:
191462306a36Sopenharmony_ci		qmp_combo_configure(serdes, cfg->serdes_tbl_hbr2,
191562306a36Sopenharmony_ci				cfg->serdes_tbl_hbr2_num);
191662306a36Sopenharmony_ci		break;
191762306a36Sopenharmony_ci	case 8100:
191862306a36Sopenharmony_ci		qmp_combo_configure(serdes, cfg->serdes_tbl_hbr3,
191962306a36Sopenharmony_ci				cfg->serdes_tbl_hbr3_num);
192062306a36Sopenharmony_ci		break;
192162306a36Sopenharmony_ci	default:
192262306a36Sopenharmony_ci		/* Other link rates aren't supported */
192362306a36Sopenharmony_ci		return -EINVAL;
192462306a36Sopenharmony_ci	}
192562306a36Sopenharmony_ci
192662306a36Sopenharmony_ci	return 0;
192762306a36Sopenharmony_ci}
192862306a36Sopenharmony_ci
192962306a36Sopenharmony_cistatic void qmp_v3_dp_aux_init(struct qmp_combo *qmp)
193062306a36Sopenharmony_ci{
193162306a36Sopenharmony_ci	const struct qmp_phy_cfg *cfg = qmp->cfg;
193262306a36Sopenharmony_ci
193362306a36Sopenharmony_ci	writel(DP_PHY_PD_CTL_PWRDN | DP_PHY_PD_CTL_AUX_PWRDN |
193462306a36Sopenharmony_ci	       DP_PHY_PD_CTL_PLL_PWRDN | DP_PHY_PD_CTL_DP_CLAMP_EN,
193562306a36Sopenharmony_ci	       qmp->dp_dp_phy + QSERDES_DP_PHY_PD_CTL);
193662306a36Sopenharmony_ci
193762306a36Sopenharmony_ci	/* Turn on BIAS current for PHY/PLL */
193862306a36Sopenharmony_ci	writel(QSERDES_V3_COM_BIAS_EN | QSERDES_V3_COM_BIAS_EN_MUX |
193962306a36Sopenharmony_ci	       QSERDES_V3_COM_CLKBUF_L_EN | QSERDES_V3_COM_EN_SYSCLK_TX_SEL,
194062306a36Sopenharmony_ci	       qmp->dp_serdes + cfg->regs[QPHY_COM_BIAS_EN_CLKBUFLR_EN]);
194162306a36Sopenharmony_ci
194262306a36Sopenharmony_ci	writel(DP_PHY_PD_CTL_PSR_PWRDN, qmp->dp_dp_phy + QSERDES_DP_PHY_PD_CTL);
194362306a36Sopenharmony_ci
194462306a36Sopenharmony_ci	writel(DP_PHY_PD_CTL_PWRDN | DP_PHY_PD_CTL_AUX_PWRDN |
194562306a36Sopenharmony_ci	       DP_PHY_PD_CTL_LANE_0_1_PWRDN |
194662306a36Sopenharmony_ci	       DP_PHY_PD_CTL_LANE_2_3_PWRDN | DP_PHY_PD_CTL_PLL_PWRDN |
194762306a36Sopenharmony_ci	       DP_PHY_PD_CTL_DP_CLAMP_EN,
194862306a36Sopenharmony_ci	       qmp->dp_dp_phy + QSERDES_DP_PHY_PD_CTL);
194962306a36Sopenharmony_ci
195062306a36Sopenharmony_ci	writel(QSERDES_V3_COM_BIAS_EN |
195162306a36Sopenharmony_ci	       QSERDES_V3_COM_BIAS_EN_MUX | QSERDES_V3_COM_CLKBUF_R_EN |
195262306a36Sopenharmony_ci	       QSERDES_V3_COM_CLKBUF_L_EN | QSERDES_V3_COM_EN_SYSCLK_TX_SEL |
195362306a36Sopenharmony_ci	       QSERDES_V3_COM_CLKBUF_RX_DRIVE_L,
195462306a36Sopenharmony_ci	       qmp->dp_serdes + cfg->regs[QPHY_COM_BIAS_EN_CLKBUFLR_EN]);
195562306a36Sopenharmony_ci
195662306a36Sopenharmony_ci	writel(0x00, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG0);
195762306a36Sopenharmony_ci	writel(0x13, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG1);
195862306a36Sopenharmony_ci	writel(0x24, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG2);
195962306a36Sopenharmony_ci	writel(0x00, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG3);
196062306a36Sopenharmony_ci	writel(0x0a, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG4);
196162306a36Sopenharmony_ci	writel(0x26, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG5);
196262306a36Sopenharmony_ci	writel(0x0a, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG6);
196362306a36Sopenharmony_ci	writel(0x03, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG7);
196462306a36Sopenharmony_ci	writel(0xbb, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG8);
196562306a36Sopenharmony_ci	writel(0x03, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG9);
196662306a36Sopenharmony_ci	qmp->dp_aux_cfg = 0;
196762306a36Sopenharmony_ci
196862306a36Sopenharmony_ci	writel(PHY_AUX_STOP_ERR_MASK | PHY_AUX_DEC_ERR_MASK |
196962306a36Sopenharmony_ci	       PHY_AUX_SYNC_ERR_MASK | PHY_AUX_ALIGN_ERR_MASK |
197062306a36Sopenharmony_ci	       PHY_AUX_REQ_ERR_MASK,
197162306a36Sopenharmony_ci	       qmp->dp_dp_phy + QSERDES_V3_DP_PHY_AUX_INTERRUPT_MASK);
197262306a36Sopenharmony_ci}
197362306a36Sopenharmony_ci
197462306a36Sopenharmony_cistatic int qmp_combo_configure_dp_swing(struct qmp_combo *qmp)
197562306a36Sopenharmony_ci{
197662306a36Sopenharmony_ci	const struct phy_configure_opts_dp *dp_opts = &qmp->dp_opts;
197762306a36Sopenharmony_ci	const struct qmp_phy_cfg *cfg = qmp->cfg;
197862306a36Sopenharmony_ci	unsigned int v_level = 0, p_level = 0;
197962306a36Sopenharmony_ci	u8 voltage_swing_cfg, pre_emphasis_cfg;
198062306a36Sopenharmony_ci	int i;
198162306a36Sopenharmony_ci
198262306a36Sopenharmony_ci	for (i = 0; i < dp_opts->lanes; i++) {
198362306a36Sopenharmony_ci		v_level = max(v_level, dp_opts->voltage[i]);
198462306a36Sopenharmony_ci		p_level = max(p_level, dp_opts->pre[i]);
198562306a36Sopenharmony_ci	}
198662306a36Sopenharmony_ci
198762306a36Sopenharmony_ci	if (dp_opts->link_rate <= 2700) {
198862306a36Sopenharmony_ci		voltage_swing_cfg = (*cfg->swing_hbr_rbr)[v_level][p_level];
198962306a36Sopenharmony_ci		pre_emphasis_cfg = (*cfg->pre_emphasis_hbr_rbr)[v_level][p_level];
199062306a36Sopenharmony_ci	} else {
199162306a36Sopenharmony_ci		voltage_swing_cfg = (*cfg->swing_hbr3_hbr2)[v_level][p_level];
199262306a36Sopenharmony_ci		pre_emphasis_cfg = (*cfg->pre_emphasis_hbr3_hbr2)[v_level][p_level];
199362306a36Sopenharmony_ci	}
199462306a36Sopenharmony_ci
199562306a36Sopenharmony_ci	/* TODO: Move check to config check */
199662306a36Sopenharmony_ci	if (voltage_swing_cfg == 0xFF && pre_emphasis_cfg == 0xFF)
199762306a36Sopenharmony_ci		return -EINVAL;
199862306a36Sopenharmony_ci
199962306a36Sopenharmony_ci	/* Enable MUX to use Cursor values from these registers */
200062306a36Sopenharmony_ci	voltage_swing_cfg |= DP_PHY_TXn_TX_DRV_LVL_MUX_EN;
200162306a36Sopenharmony_ci	pre_emphasis_cfg |= DP_PHY_TXn_TX_EMP_POST1_LVL_MUX_EN;
200262306a36Sopenharmony_ci
200362306a36Sopenharmony_ci	writel(voltage_swing_cfg, qmp->dp_tx + cfg->regs[QPHY_TX_TX_DRV_LVL]);
200462306a36Sopenharmony_ci	writel(pre_emphasis_cfg, qmp->dp_tx + cfg->regs[QPHY_TX_TX_EMP_POST1_LVL]);
200562306a36Sopenharmony_ci	writel(voltage_swing_cfg, qmp->dp_tx2 + cfg->regs[QPHY_TX_TX_DRV_LVL]);
200662306a36Sopenharmony_ci	writel(pre_emphasis_cfg, qmp->dp_tx2 + cfg->regs[QPHY_TX_TX_EMP_POST1_LVL]);
200762306a36Sopenharmony_ci
200862306a36Sopenharmony_ci	return 0;
200962306a36Sopenharmony_ci}
201062306a36Sopenharmony_ci
201162306a36Sopenharmony_cistatic void qmp_v3_configure_dp_tx(struct qmp_combo *qmp)
201262306a36Sopenharmony_ci{
201362306a36Sopenharmony_ci	const struct phy_configure_opts_dp *dp_opts = &qmp->dp_opts;
201462306a36Sopenharmony_ci	u32 bias_en, drvr_en;
201562306a36Sopenharmony_ci
201662306a36Sopenharmony_ci	if (qmp_combo_configure_dp_swing(qmp) < 0)
201762306a36Sopenharmony_ci		return;
201862306a36Sopenharmony_ci
201962306a36Sopenharmony_ci	if (dp_opts->lanes == 1) {
202062306a36Sopenharmony_ci		bias_en = 0x3e;
202162306a36Sopenharmony_ci		drvr_en = 0x13;
202262306a36Sopenharmony_ci	} else {
202362306a36Sopenharmony_ci		bias_en = 0x3f;
202462306a36Sopenharmony_ci		drvr_en = 0x10;
202562306a36Sopenharmony_ci	}
202662306a36Sopenharmony_ci
202762306a36Sopenharmony_ci	writel(drvr_en, qmp->dp_tx + QSERDES_V3_TX_HIGHZ_DRVR_EN);
202862306a36Sopenharmony_ci	writel(bias_en, qmp->dp_tx + QSERDES_V3_TX_TRANSCEIVER_BIAS_EN);
202962306a36Sopenharmony_ci	writel(drvr_en, qmp->dp_tx2 + QSERDES_V3_TX_HIGHZ_DRVR_EN);
203062306a36Sopenharmony_ci	writel(bias_en, qmp->dp_tx2 + QSERDES_V3_TX_TRANSCEIVER_BIAS_EN);
203162306a36Sopenharmony_ci}
203262306a36Sopenharmony_ci
203362306a36Sopenharmony_cistatic bool qmp_combo_configure_dp_mode(struct qmp_combo *qmp)
203462306a36Sopenharmony_ci{
203562306a36Sopenharmony_ci	bool reverse = (qmp->orientation == TYPEC_ORIENTATION_REVERSE);
203662306a36Sopenharmony_ci	const struct phy_configure_opts_dp *dp_opts = &qmp->dp_opts;
203762306a36Sopenharmony_ci	u32 val;
203862306a36Sopenharmony_ci
203962306a36Sopenharmony_ci	val = DP_PHY_PD_CTL_PWRDN | DP_PHY_PD_CTL_AUX_PWRDN |
204062306a36Sopenharmony_ci	      DP_PHY_PD_CTL_PLL_PWRDN | DP_PHY_PD_CTL_DP_CLAMP_EN;
204162306a36Sopenharmony_ci
204262306a36Sopenharmony_ci	if (dp_opts->lanes == 4 || reverse)
204362306a36Sopenharmony_ci		val |= DP_PHY_PD_CTL_LANE_0_1_PWRDN;
204462306a36Sopenharmony_ci	if (dp_opts->lanes == 4 || !reverse)
204562306a36Sopenharmony_ci		val |= DP_PHY_PD_CTL_LANE_2_3_PWRDN;
204662306a36Sopenharmony_ci
204762306a36Sopenharmony_ci	writel(val, qmp->dp_dp_phy + QSERDES_DP_PHY_PD_CTL);
204862306a36Sopenharmony_ci
204962306a36Sopenharmony_ci	if (reverse)
205062306a36Sopenharmony_ci		writel(0x4c, qmp->pcs + QSERDES_DP_PHY_MODE);
205162306a36Sopenharmony_ci	else
205262306a36Sopenharmony_ci		writel(0x5c, qmp->pcs + QSERDES_DP_PHY_MODE);
205362306a36Sopenharmony_ci
205462306a36Sopenharmony_ci	return reverse;
205562306a36Sopenharmony_ci}
205662306a36Sopenharmony_ci
205762306a36Sopenharmony_cistatic int qmp_combo_configure_dp_clocks(struct qmp_combo *qmp)
205862306a36Sopenharmony_ci{
205962306a36Sopenharmony_ci	const struct phy_configure_opts_dp *dp_opts = &qmp->dp_opts;
206062306a36Sopenharmony_ci	u32 phy_vco_div;
206162306a36Sopenharmony_ci	unsigned long pixel_freq;
206262306a36Sopenharmony_ci
206362306a36Sopenharmony_ci	switch (dp_opts->link_rate) {
206462306a36Sopenharmony_ci	case 1620:
206562306a36Sopenharmony_ci		phy_vco_div = 0x1;
206662306a36Sopenharmony_ci		pixel_freq = 1620000000UL / 2;
206762306a36Sopenharmony_ci		break;
206862306a36Sopenharmony_ci	case 2700:
206962306a36Sopenharmony_ci		phy_vco_div = 0x1;
207062306a36Sopenharmony_ci		pixel_freq = 2700000000UL / 2;
207162306a36Sopenharmony_ci		break;
207262306a36Sopenharmony_ci	case 5400:
207362306a36Sopenharmony_ci		phy_vco_div = 0x2;
207462306a36Sopenharmony_ci		pixel_freq = 5400000000UL / 4;
207562306a36Sopenharmony_ci		break;
207662306a36Sopenharmony_ci	case 8100:
207762306a36Sopenharmony_ci		phy_vco_div = 0x0;
207862306a36Sopenharmony_ci		pixel_freq = 8100000000UL / 6;
207962306a36Sopenharmony_ci		break;
208062306a36Sopenharmony_ci	default:
208162306a36Sopenharmony_ci		/* Other link rates aren't supported */
208262306a36Sopenharmony_ci		return -EINVAL;
208362306a36Sopenharmony_ci	}
208462306a36Sopenharmony_ci	writel(phy_vco_div, qmp->dp_dp_phy + QSERDES_V4_DP_PHY_VCO_DIV);
208562306a36Sopenharmony_ci
208662306a36Sopenharmony_ci	clk_set_rate(qmp->dp_link_hw.clk, dp_opts->link_rate * 100000);
208762306a36Sopenharmony_ci	clk_set_rate(qmp->dp_pixel_hw.clk, pixel_freq);
208862306a36Sopenharmony_ci
208962306a36Sopenharmony_ci	return 0;
209062306a36Sopenharmony_ci}
209162306a36Sopenharmony_ci
209262306a36Sopenharmony_cistatic int qmp_v3_configure_dp_phy(struct qmp_combo *qmp)
209362306a36Sopenharmony_ci{
209462306a36Sopenharmony_ci	const struct qmp_phy_cfg *cfg = qmp->cfg;
209562306a36Sopenharmony_ci	u32 status;
209662306a36Sopenharmony_ci	int ret;
209762306a36Sopenharmony_ci
209862306a36Sopenharmony_ci	qmp_combo_configure_dp_mode(qmp);
209962306a36Sopenharmony_ci
210062306a36Sopenharmony_ci	writel(0x05, qmp->dp_dp_phy + QSERDES_V3_DP_PHY_TX0_TX1_LANE_CTL);
210162306a36Sopenharmony_ci	writel(0x05, qmp->dp_dp_phy + QSERDES_V3_DP_PHY_TX2_TX3_LANE_CTL);
210262306a36Sopenharmony_ci
210362306a36Sopenharmony_ci	ret = qmp_combo_configure_dp_clocks(qmp);
210462306a36Sopenharmony_ci	if (ret)
210562306a36Sopenharmony_ci		return ret;
210662306a36Sopenharmony_ci
210762306a36Sopenharmony_ci	writel(0x04, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG2);
210862306a36Sopenharmony_ci	writel(0x01, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG);
210962306a36Sopenharmony_ci	writel(0x05, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG);
211062306a36Sopenharmony_ci	writel(0x01, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG);
211162306a36Sopenharmony_ci	writel(0x09, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG);
211262306a36Sopenharmony_ci
211362306a36Sopenharmony_ci	writel(0x20, qmp->dp_serdes + cfg->regs[QPHY_COM_RESETSM_CNTRL]);
211462306a36Sopenharmony_ci
211562306a36Sopenharmony_ci	if (readl_poll_timeout(qmp->dp_serdes + cfg->regs[QPHY_COM_C_READY_STATUS],
211662306a36Sopenharmony_ci			status,
211762306a36Sopenharmony_ci			((status & BIT(0)) > 0),
211862306a36Sopenharmony_ci			500,
211962306a36Sopenharmony_ci			10000))
212062306a36Sopenharmony_ci		return -ETIMEDOUT;
212162306a36Sopenharmony_ci
212262306a36Sopenharmony_ci	writel(0x19, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG);
212362306a36Sopenharmony_ci
212462306a36Sopenharmony_ci	if (readl_poll_timeout(qmp->dp_dp_phy + cfg->regs[QPHY_DP_PHY_STATUS],
212562306a36Sopenharmony_ci			status,
212662306a36Sopenharmony_ci			((status & BIT(1)) > 0),
212762306a36Sopenharmony_ci			500,
212862306a36Sopenharmony_ci			10000))
212962306a36Sopenharmony_ci		return -ETIMEDOUT;
213062306a36Sopenharmony_ci
213162306a36Sopenharmony_ci	writel(0x18, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG);
213262306a36Sopenharmony_ci	udelay(2000);
213362306a36Sopenharmony_ci	writel(0x19, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG);
213462306a36Sopenharmony_ci
213562306a36Sopenharmony_ci	return readl_poll_timeout(qmp->dp_dp_phy + cfg->regs[QPHY_DP_PHY_STATUS],
213662306a36Sopenharmony_ci			status,
213762306a36Sopenharmony_ci			((status & BIT(1)) > 0),
213862306a36Sopenharmony_ci			500,
213962306a36Sopenharmony_ci			10000);
214062306a36Sopenharmony_ci}
214162306a36Sopenharmony_ci
214262306a36Sopenharmony_ci/*
214362306a36Sopenharmony_ci * We need to calibrate the aux setting here as many times
214462306a36Sopenharmony_ci * as the caller tries
214562306a36Sopenharmony_ci */
214662306a36Sopenharmony_cistatic int qmp_v3_calibrate_dp_phy(struct qmp_combo *qmp)
214762306a36Sopenharmony_ci{
214862306a36Sopenharmony_ci	static const u8 cfg1_settings[] = { 0x13, 0x23, 0x1d };
214962306a36Sopenharmony_ci	u8 val;
215062306a36Sopenharmony_ci
215162306a36Sopenharmony_ci	qmp->dp_aux_cfg++;
215262306a36Sopenharmony_ci	qmp->dp_aux_cfg %= ARRAY_SIZE(cfg1_settings);
215362306a36Sopenharmony_ci	val = cfg1_settings[qmp->dp_aux_cfg];
215462306a36Sopenharmony_ci
215562306a36Sopenharmony_ci	writel(val, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG1);
215662306a36Sopenharmony_ci
215762306a36Sopenharmony_ci	return 0;
215862306a36Sopenharmony_ci}
215962306a36Sopenharmony_ci
216062306a36Sopenharmony_cistatic void qmp_v4_dp_aux_init(struct qmp_combo *qmp)
216162306a36Sopenharmony_ci{
216262306a36Sopenharmony_ci	const struct qmp_phy_cfg *cfg = qmp->cfg;
216362306a36Sopenharmony_ci
216462306a36Sopenharmony_ci	writel(DP_PHY_PD_CTL_PWRDN | DP_PHY_PD_CTL_PSR_PWRDN | DP_PHY_PD_CTL_AUX_PWRDN |
216562306a36Sopenharmony_ci	       DP_PHY_PD_CTL_PLL_PWRDN | DP_PHY_PD_CTL_DP_CLAMP_EN,
216662306a36Sopenharmony_ci	       qmp->dp_dp_phy + QSERDES_DP_PHY_PD_CTL);
216762306a36Sopenharmony_ci
216862306a36Sopenharmony_ci	/* Turn on BIAS current for PHY/PLL */
216962306a36Sopenharmony_ci	writel(0x17, qmp->dp_serdes + cfg->regs[QPHY_COM_BIAS_EN_CLKBUFLR_EN]);
217062306a36Sopenharmony_ci
217162306a36Sopenharmony_ci	writel(0x00, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG0);
217262306a36Sopenharmony_ci	writel(0x13, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG1);
217362306a36Sopenharmony_ci	writel(0xa4, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG2);
217462306a36Sopenharmony_ci	writel(0x00, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG3);
217562306a36Sopenharmony_ci	writel(0x0a, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG4);
217662306a36Sopenharmony_ci	writel(0x26, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG5);
217762306a36Sopenharmony_ci	writel(0x0a, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG6);
217862306a36Sopenharmony_ci	writel(0x03, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG7);
217962306a36Sopenharmony_ci	writel(0xb7, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG8);
218062306a36Sopenharmony_ci	writel(0x03, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG9);
218162306a36Sopenharmony_ci	qmp->dp_aux_cfg = 0;
218262306a36Sopenharmony_ci
218362306a36Sopenharmony_ci	writel(PHY_AUX_STOP_ERR_MASK | PHY_AUX_DEC_ERR_MASK |
218462306a36Sopenharmony_ci	       PHY_AUX_SYNC_ERR_MASK | PHY_AUX_ALIGN_ERR_MASK |
218562306a36Sopenharmony_ci	       PHY_AUX_REQ_ERR_MASK,
218662306a36Sopenharmony_ci	       qmp->dp_dp_phy + QSERDES_V4_DP_PHY_AUX_INTERRUPT_MASK);
218762306a36Sopenharmony_ci}
218862306a36Sopenharmony_ci
218962306a36Sopenharmony_cistatic void qmp_v4_configure_dp_tx(struct qmp_combo *qmp)
219062306a36Sopenharmony_ci{
219162306a36Sopenharmony_ci	const struct qmp_phy_cfg *cfg = qmp->cfg;
219262306a36Sopenharmony_ci
219362306a36Sopenharmony_ci	/* Program default values before writing proper values */
219462306a36Sopenharmony_ci	writel(0x27, qmp->dp_tx + cfg->regs[QPHY_TX_TX_DRV_LVL]);
219562306a36Sopenharmony_ci	writel(0x27, qmp->dp_tx2 + cfg->regs[QPHY_TX_TX_DRV_LVL]);
219662306a36Sopenharmony_ci
219762306a36Sopenharmony_ci	writel(0x20, qmp->dp_tx + cfg->regs[QPHY_TX_TX_EMP_POST1_LVL]);
219862306a36Sopenharmony_ci	writel(0x20, qmp->dp_tx2 + cfg->regs[QPHY_TX_TX_EMP_POST1_LVL]);
219962306a36Sopenharmony_ci
220062306a36Sopenharmony_ci	qmp_combo_configure_dp_swing(qmp);
220162306a36Sopenharmony_ci}
220262306a36Sopenharmony_ci
220362306a36Sopenharmony_cistatic int qmp_v456_configure_dp_phy(struct qmp_combo *qmp)
220462306a36Sopenharmony_ci{
220562306a36Sopenharmony_ci	const struct qmp_phy_cfg *cfg = qmp->cfg;
220662306a36Sopenharmony_ci	u32 status;
220762306a36Sopenharmony_ci	int ret;
220862306a36Sopenharmony_ci
220962306a36Sopenharmony_ci	writel(0x0f, qmp->dp_dp_phy + QSERDES_V4_DP_PHY_CFG_1);
221062306a36Sopenharmony_ci
221162306a36Sopenharmony_ci	qmp_combo_configure_dp_mode(qmp);
221262306a36Sopenharmony_ci
221362306a36Sopenharmony_ci	writel(0x13, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG1);
221462306a36Sopenharmony_ci	writel(0xa4, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG2);
221562306a36Sopenharmony_ci
221662306a36Sopenharmony_ci	writel(0x05, qmp->dp_dp_phy + QSERDES_V4_DP_PHY_TX0_TX1_LANE_CTL);
221762306a36Sopenharmony_ci	writel(0x05, qmp->dp_dp_phy + QSERDES_V4_DP_PHY_TX2_TX3_LANE_CTL);
221862306a36Sopenharmony_ci
221962306a36Sopenharmony_ci	ret = qmp_combo_configure_dp_clocks(qmp);
222062306a36Sopenharmony_ci	if (ret)
222162306a36Sopenharmony_ci		return ret;
222262306a36Sopenharmony_ci
222362306a36Sopenharmony_ci	writel(0x01, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG);
222462306a36Sopenharmony_ci	writel(0x05, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG);
222562306a36Sopenharmony_ci	writel(0x01, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG);
222662306a36Sopenharmony_ci	writel(0x09, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG);
222762306a36Sopenharmony_ci
222862306a36Sopenharmony_ci	writel(0x20, qmp->dp_serdes + cfg->regs[QPHY_COM_RESETSM_CNTRL]);
222962306a36Sopenharmony_ci
223062306a36Sopenharmony_ci	if (readl_poll_timeout(qmp->dp_serdes + cfg->regs[QPHY_COM_C_READY_STATUS],
223162306a36Sopenharmony_ci			status,
223262306a36Sopenharmony_ci			((status & BIT(0)) > 0),
223362306a36Sopenharmony_ci			500,
223462306a36Sopenharmony_ci			10000))
223562306a36Sopenharmony_ci		return -ETIMEDOUT;
223662306a36Sopenharmony_ci
223762306a36Sopenharmony_ci	if (readl_poll_timeout(qmp->dp_serdes + cfg->regs[QPHY_COM_CMN_STATUS],
223862306a36Sopenharmony_ci			status,
223962306a36Sopenharmony_ci			((status & BIT(0)) > 0),
224062306a36Sopenharmony_ci			500,
224162306a36Sopenharmony_ci			10000))
224262306a36Sopenharmony_ci		return -ETIMEDOUT;
224362306a36Sopenharmony_ci
224462306a36Sopenharmony_ci	if (readl_poll_timeout(qmp->dp_serdes + cfg->regs[QPHY_COM_CMN_STATUS],
224562306a36Sopenharmony_ci			status,
224662306a36Sopenharmony_ci			((status & BIT(1)) > 0),
224762306a36Sopenharmony_ci			500,
224862306a36Sopenharmony_ci			10000))
224962306a36Sopenharmony_ci		return -ETIMEDOUT;
225062306a36Sopenharmony_ci
225162306a36Sopenharmony_ci	writel(0x19, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG);
225262306a36Sopenharmony_ci
225362306a36Sopenharmony_ci	if (readl_poll_timeout(qmp->dp_dp_phy + cfg->regs[QPHY_DP_PHY_STATUS],
225462306a36Sopenharmony_ci			status,
225562306a36Sopenharmony_ci			((status & BIT(0)) > 0),
225662306a36Sopenharmony_ci			500,
225762306a36Sopenharmony_ci			10000))
225862306a36Sopenharmony_ci		return -ETIMEDOUT;
225962306a36Sopenharmony_ci
226062306a36Sopenharmony_ci	if (readl_poll_timeout(qmp->dp_dp_phy + cfg->regs[QPHY_DP_PHY_STATUS],
226162306a36Sopenharmony_ci			status,
226262306a36Sopenharmony_ci			((status & BIT(1)) > 0),
226362306a36Sopenharmony_ci			500,
226462306a36Sopenharmony_ci			10000))
226562306a36Sopenharmony_ci		return -ETIMEDOUT;
226662306a36Sopenharmony_ci
226762306a36Sopenharmony_ci	return 0;
226862306a36Sopenharmony_ci}
226962306a36Sopenharmony_ci
227062306a36Sopenharmony_cistatic int qmp_v4_configure_dp_phy(struct qmp_combo *qmp)
227162306a36Sopenharmony_ci{
227262306a36Sopenharmony_ci	const struct qmp_phy_cfg *cfg = qmp->cfg;
227362306a36Sopenharmony_ci	bool reverse = (qmp->orientation == TYPEC_ORIENTATION_REVERSE);
227462306a36Sopenharmony_ci	const struct phy_configure_opts_dp *dp_opts = &qmp->dp_opts;
227562306a36Sopenharmony_ci	u32 bias0_en, drvr0_en, bias1_en, drvr1_en;
227662306a36Sopenharmony_ci	u32 status;
227762306a36Sopenharmony_ci	int ret;
227862306a36Sopenharmony_ci
227962306a36Sopenharmony_ci	ret = qmp_v456_configure_dp_phy(qmp);
228062306a36Sopenharmony_ci	if (ret < 0)
228162306a36Sopenharmony_ci		return ret;
228262306a36Sopenharmony_ci
228362306a36Sopenharmony_ci	/*
228462306a36Sopenharmony_ci	 * At least for 7nm DP PHY this has to be done after enabling link
228562306a36Sopenharmony_ci	 * clock.
228662306a36Sopenharmony_ci	 */
228762306a36Sopenharmony_ci
228862306a36Sopenharmony_ci	if (dp_opts->lanes == 1) {
228962306a36Sopenharmony_ci		bias0_en = reverse ? 0x3e : 0x15;
229062306a36Sopenharmony_ci		bias1_en = reverse ? 0x15 : 0x3e;
229162306a36Sopenharmony_ci		drvr0_en = reverse ? 0x13 : 0x10;
229262306a36Sopenharmony_ci		drvr1_en = reverse ? 0x10 : 0x13;
229362306a36Sopenharmony_ci	} else if (dp_opts->lanes == 2) {
229462306a36Sopenharmony_ci		bias0_en = reverse ? 0x3f : 0x15;
229562306a36Sopenharmony_ci		bias1_en = reverse ? 0x15 : 0x3f;
229662306a36Sopenharmony_ci		drvr0_en = 0x10;
229762306a36Sopenharmony_ci		drvr1_en = 0x10;
229862306a36Sopenharmony_ci	} else {
229962306a36Sopenharmony_ci		bias0_en = 0x3f;
230062306a36Sopenharmony_ci		bias1_en = 0x3f;
230162306a36Sopenharmony_ci		drvr0_en = 0x10;
230262306a36Sopenharmony_ci		drvr1_en = 0x10;
230362306a36Sopenharmony_ci	}
230462306a36Sopenharmony_ci
230562306a36Sopenharmony_ci	writel(drvr0_en, qmp->dp_tx + cfg->regs[QPHY_TX_HIGHZ_DRVR_EN]);
230662306a36Sopenharmony_ci	writel(bias0_en, qmp->dp_tx + cfg->regs[QPHY_TX_TRANSCEIVER_BIAS_EN]);
230762306a36Sopenharmony_ci	writel(drvr1_en, qmp->dp_tx2 + cfg->regs[QPHY_TX_HIGHZ_DRVR_EN]);
230862306a36Sopenharmony_ci	writel(bias1_en, qmp->dp_tx2 + cfg->regs[QPHY_TX_TRANSCEIVER_BIAS_EN]);
230962306a36Sopenharmony_ci
231062306a36Sopenharmony_ci	writel(0x18, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG);
231162306a36Sopenharmony_ci	udelay(2000);
231262306a36Sopenharmony_ci	writel(0x19, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG);
231362306a36Sopenharmony_ci
231462306a36Sopenharmony_ci	if (readl_poll_timeout(qmp->dp_dp_phy + cfg->regs[QPHY_DP_PHY_STATUS],
231562306a36Sopenharmony_ci			status,
231662306a36Sopenharmony_ci			((status & BIT(1)) > 0),
231762306a36Sopenharmony_ci			500,
231862306a36Sopenharmony_ci			10000))
231962306a36Sopenharmony_ci		return -ETIMEDOUT;
232062306a36Sopenharmony_ci
232162306a36Sopenharmony_ci	writel(0x0a, qmp->dp_tx + cfg->regs[QPHY_TX_TX_POL_INV]);
232262306a36Sopenharmony_ci	writel(0x0a, qmp->dp_tx2 + cfg->regs[QPHY_TX_TX_POL_INV]);
232362306a36Sopenharmony_ci
232462306a36Sopenharmony_ci	writel(0x27, qmp->dp_tx + cfg->regs[QPHY_TX_TX_DRV_LVL]);
232562306a36Sopenharmony_ci	writel(0x27, qmp->dp_tx2 + cfg->regs[QPHY_TX_TX_DRV_LVL]);
232662306a36Sopenharmony_ci
232762306a36Sopenharmony_ci	writel(0x20, qmp->dp_tx + cfg->regs[QPHY_TX_TX_EMP_POST1_LVL]);
232862306a36Sopenharmony_ci	writel(0x20, qmp->dp_tx2 + cfg->regs[QPHY_TX_TX_EMP_POST1_LVL]);
232962306a36Sopenharmony_ci
233062306a36Sopenharmony_ci	return 0;
233162306a36Sopenharmony_ci
233262306a36Sopenharmony_ci	return 0;
233362306a36Sopenharmony_ci}
233462306a36Sopenharmony_ci
233562306a36Sopenharmony_ci/*
233662306a36Sopenharmony_ci * We need to calibrate the aux setting here as many times
233762306a36Sopenharmony_ci * as the caller tries
233862306a36Sopenharmony_ci */
233962306a36Sopenharmony_cistatic int qmp_v4_calibrate_dp_phy(struct qmp_combo *qmp)
234062306a36Sopenharmony_ci{
234162306a36Sopenharmony_ci	static const u8 cfg1_settings[] = { 0x20, 0x13, 0x23, 0x1d };
234262306a36Sopenharmony_ci	u8 val;
234362306a36Sopenharmony_ci
234462306a36Sopenharmony_ci	qmp->dp_aux_cfg++;
234562306a36Sopenharmony_ci	qmp->dp_aux_cfg %= ARRAY_SIZE(cfg1_settings);
234662306a36Sopenharmony_ci	val = cfg1_settings[qmp->dp_aux_cfg];
234762306a36Sopenharmony_ci
234862306a36Sopenharmony_ci	writel(val, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG1);
234962306a36Sopenharmony_ci
235062306a36Sopenharmony_ci	return 0;
235162306a36Sopenharmony_ci}
235262306a36Sopenharmony_ci
235362306a36Sopenharmony_cistatic int qmp_combo_dp_configure(struct phy *phy, union phy_configure_opts *opts)
235462306a36Sopenharmony_ci{
235562306a36Sopenharmony_ci	const struct phy_configure_opts_dp *dp_opts = &opts->dp;
235662306a36Sopenharmony_ci	struct qmp_combo *qmp = phy_get_drvdata(phy);
235762306a36Sopenharmony_ci	const struct qmp_phy_cfg *cfg = qmp->cfg;
235862306a36Sopenharmony_ci
235962306a36Sopenharmony_ci	mutex_lock(&qmp->phy_mutex);
236062306a36Sopenharmony_ci
236162306a36Sopenharmony_ci	memcpy(&qmp->dp_opts, dp_opts, sizeof(*dp_opts));
236262306a36Sopenharmony_ci	if (qmp->dp_opts.set_voltages) {
236362306a36Sopenharmony_ci		cfg->configure_dp_tx(qmp);
236462306a36Sopenharmony_ci		qmp->dp_opts.set_voltages = 0;
236562306a36Sopenharmony_ci	}
236662306a36Sopenharmony_ci
236762306a36Sopenharmony_ci	mutex_unlock(&qmp->phy_mutex);
236862306a36Sopenharmony_ci
236962306a36Sopenharmony_ci	return 0;
237062306a36Sopenharmony_ci}
237162306a36Sopenharmony_ci
237262306a36Sopenharmony_cistatic int qmp_combo_dp_calibrate(struct phy *phy)
237362306a36Sopenharmony_ci{
237462306a36Sopenharmony_ci	struct qmp_combo *qmp = phy_get_drvdata(phy);
237562306a36Sopenharmony_ci	const struct qmp_phy_cfg *cfg = qmp->cfg;
237662306a36Sopenharmony_ci	int ret = 0;
237762306a36Sopenharmony_ci
237862306a36Sopenharmony_ci	mutex_lock(&qmp->phy_mutex);
237962306a36Sopenharmony_ci
238062306a36Sopenharmony_ci	if (cfg->calibrate_dp_phy)
238162306a36Sopenharmony_ci		ret = cfg->calibrate_dp_phy(qmp);
238262306a36Sopenharmony_ci
238362306a36Sopenharmony_ci	mutex_unlock(&qmp->phy_mutex);
238462306a36Sopenharmony_ci
238562306a36Sopenharmony_ci	return ret;
238662306a36Sopenharmony_ci}
238762306a36Sopenharmony_ci
238862306a36Sopenharmony_cistatic int qmp_combo_com_init(struct qmp_combo *qmp, bool force)
238962306a36Sopenharmony_ci{
239062306a36Sopenharmony_ci	const struct qmp_phy_cfg *cfg = qmp->cfg;
239162306a36Sopenharmony_ci	void __iomem *com = qmp->com;
239262306a36Sopenharmony_ci	int ret;
239362306a36Sopenharmony_ci	u32 val;
239462306a36Sopenharmony_ci
239562306a36Sopenharmony_ci	if (!force && qmp->init_count++)
239662306a36Sopenharmony_ci		return 0;
239762306a36Sopenharmony_ci
239862306a36Sopenharmony_ci	ret = regulator_bulk_enable(cfg->num_vregs, qmp->vregs);
239962306a36Sopenharmony_ci	if (ret) {
240062306a36Sopenharmony_ci		dev_err(qmp->dev, "failed to enable regulators, err=%d\n", ret);
240162306a36Sopenharmony_ci		goto err_decrement_count;
240262306a36Sopenharmony_ci	}
240362306a36Sopenharmony_ci
240462306a36Sopenharmony_ci	ret = reset_control_bulk_assert(cfg->num_resets, qmp->resets);
240562306a36Sopenharmony_ci	if (ret) {
240662306a36Sopenharmony_ci		dev_err(qmp->dev, "reset assert failed\n");
240762306a36Sopenharmony_ci		goto err_disable_regulators;
240862306a36Sopenharmony_ci	}
240962306a36Sopenharmony_ci
241062306a36Sopenharmony_ci	ret = reset_control_bulk_deassert(cfg->num_resets, qmp->resets);
241162306a36Sopenharmony_ci	if (ret) {
241262306a36Sopenharmony_ci		dev_err(qmp->dev, "reset deassert failed\n");
241362306a36Sopenharmony_ci		goto err_disable_regulators;
241462306a36Sopenharmony_ci	}
241562306a36Sopenharmony_ci
241662306a36Sopenharmony_ci	ret = clk_bulk_prepare_enable(qmp->num_clks, qmp->clks);
241762306a36Sopenharmony_ci	if (ret)
241862306a36Sopenharmony_ci		goto err_assert_reset;
241962306a36Sopenharmony_ci
242062306a36Sopenharmony_ci	qphy_setbits(com, QPHY_V3_DP_COM_POWER_DOWN_CTRL, SW_PWRDN);
242162306a36Sopenharmony_ci
242262306a36Sopenharmony_ci	/* override hardware control for reset of qmp phy */
242362306a36Sopenharmony_ci	qphy_setbits(com, QPHY_V3_DP_COM_RESET_OVRD_CTRL,
242462306a36Sopenharmony_ci			SW_DPPHY_RESET_MUX | SW_DPPHY_RESET |
242562306a36Sopenharmony_ci			SW_USB3PHY_RESET_MUX | SW_USB3PHY_RESET);
242662306a36Sopenharmony_ci
242762306a36Sopenharmony_ci	/* Use software based port select and switch on typec orientation */
242862306a36Sopenharmony_ci	val = SW_PORTSELECT_MUX;
242962306a36Sopenharmony_ci	if (qmp->orientation == TYPEC_ORIENTATION_REVERSE)
243062306a36Sopenharmony_ci		val |= SW_PORTSELECT_VAL;
243162306a36Sopenharmony_ci	writel(val, com + QPHY_V3_DP_COM_TYPEC_CTRL);
243262306a36Sopenharmony_ci	writel(USB3_MODE | DP_MODE, com + QPHY_V3_DP_COM_PHY_MODE_CTRL);
243362306a36Sopenharmony_ci
243462306a36Sopenharmony_ci	/* bring both QMP USB and QMP DP PHYs PCS block out of reset */
243562306a36Sopenharmony_ci	qphy_clrbits(com, QPHY_V3_DP_COM_RESET_OVRD_CTRL,
243662306a36Sopenharmony_ci			SW_DPPHY_RESET_MUX | SW_DPPHY_RESET |
243762306a36Sopenharmony_ci			SW_USB3PHY_RESET_MUX | SW_USB3PHY_RESET);
243862306a36Sopenharmony_ci
243962306a36Sopenharmony_ci	qphy_clrbits(com, QPHY_V3_DP_COM_SWI_CTRL, 0x03);
244062306a36Sopenharmony_ci	qphy_clrbits(com, QPHY_V3_DP_COM_SW_RESET, SW_RESET);
244162306a36Sopenharmony_ci
244262306a36Sopenharmony_ci	qphy_setbits(qmp->pcs, cfg->regs[QPHY_PCS_POWER_DOWN_CONTROL],
244362306a36Sopenharmony_ci			SW_PWRDN);
244462306a36Sopenharmony_ci
244562306a36Sopenharmony_ci	return 0;
244662306a36Sopenharmony_ci
244762306a36Sopenharmony_cierr_assert_reset:
244862306a36Sopenharmony_ci	reset_control_bulk_assert(cfg->num_resets, qmp->resets);
244962306a36Sopenharmony_cierr_disable_regulators:
245062306a36Sopenharmony_ci	regulator_bulk_disable(cfg->num_vregs, qmp->vregs);
245162306a36Sopenharmony_cierr_decrement_count:
245262306a36Sopenharmony_ci	qmp->init_count--;
245362306a36Sopenharmony_ci
245462306a36Sopenharmony_ci	return ret;
245562306a36Sopenharmony_ci}
245662306a36Sopenharmony_ci
245762306a36Sopenharmony_cistatic int qmp_combo_com_exit(struct qmp_combo *qmp, bool force)
245862306a36Sopenharmony_ci{
245962306a36Sopenharmony_ci	const struct qmp_phy_cfg *cfg = qmp->cfg;
246062306a36Sopenharmony_ci
246162306a36Sopenharmony_ci	if (!force && --qmp->init_count)
246262306a36Sopenharmony_ci		return 0;
246362306a36Sopenharmony_ci
246462306a36Sopenharmony_ci	reset_control_bulk_assert(cfg->num_resets, qmp->resets);
246562306a36Sopenharmony_ci
246662306a36Sopenharmony_ci	clk_bulk_disable_unprepare(qmp->num_clks, qmp->clks);
246762306a36Sopenharmony_ci
246862306a36Sopenharmony_ci	regulator_bulk_disable(cfg->num_vregs, qmp->vregs);
246962306a36Sopenharmony_ci
247062306a36Sopenharmony_ci	return 0;
247162306a36Sopenharmony_ci}
247262306a36Sopenharmony_ci
247362306a36Sopenharmony_cistatic int qmp_combo_dp_init(struct phy *phy)
247462306a36Sopenharmony_ci{
247562306a36Sopenharmony_ci	struct qmp_combo *qmp = phy_get_drvdata(phy);
247662306a36Sopenharmony_ci	const struct qmp_phy_cfg *cfg = qmp->cfg;
247762306a36Sopenharmony_ci	int ret;
247862306a36Sopenharmony_ci
247962306a36Sopenharmony_ci	mutex_lock(&qmp->phy_mutex);
248062306a36Sopenharmony_ci
248162306a36Sopenharmony_ci	ret = qmp_combo_com_init(qmp, false);
248262306a36Sopenharmony_ci	if (ret)
248362306a36Sopenharmony_ci		goto out_unlock;
248462306a36Sopenharmony_ci
248562306a36Sopenharmony_ci	cfg->dp_aux_init(qmp);
248662306a36Sopenharmony_ci
248762306a36Sopenharmony_ci	qmp->dp_init_count++;
248862306a36Sopenharmony_ci
248962306a36Sopenharmony_ciout_unlock:
249062306a36Sopenharmony_ci	mutex_unlock(&qmp->phy_mutex);
249162306a36Sopenharmony_ci	return ret;
249262306a36Sopenharmony_ci}
249362306a36Sopenharmony_ci
249462306a36Sopenharmony_cistatic int qmp_combo_dp_exit(struct phy *phy)
249562306a36Sopenharmony_ci{
249662306a36Sopenharmony_ci	struct qmp_combo *qmp = phy_get_drvdata(phy);
249762306a36Sopenharmony_ci
249862306a36Sopenharmony_ci	mutex_lock(&qmp->phy_mutex);
249962306a36Sopenharmony_ci
250062306a36Sopenharmony_ci	qmp_combo_com_exit(qmp, false);
250162306a36Sopenharmony_ci
250262306a36Sopenharmony_ci	qmp->dp_init_count--;
250362306a36Sopenharmony_ci
250462306a36Sopenharmony_ci	mutex_unlock(&qmp->phy_mutex);
250562306a36Sopenharmony_ci
250662306a36Sopenharmony_ci	return 0;
250762306a36Sopenharmony_ci}
250862306a36Sopenharmony_ci
250962306a36Sopenharmony_cistatic int qmp_combo_dp_power_on(struct phy *phy)
251062306a36Sopenharmony_ci{
251162306a36Sopenharmony_ci	struct qmp_combo *qmp = phy_get_drvdata(phy);
251262306a36Sopenharmony_ci	const struct qmp_phy_cfg *cfg = qmp->cfg;
251362306a36Sopenharmony_ci	void __iomem *tx = qmp->dp_tx;
251462306a36Sopenharmony_ci	void __iomem *tx2 = qmp->dp_tx2;
251562306a36Sopenharmony_ci
251662306a36Sopenharmony_ci	mutex_lock(&qmp->phy_mutex);
251762306a36Sopenharmony_ci
251862306a36Sopenharmony_ci	qmp_combo_dp_serdes_init(qmp);
251962306a36Sopenharmony_ci
252062306a36Sopenharmony_ci	qmp_combo_configure_lane(tx, cfg->dp_tx_tbl, cfg->dp_tx_tbl_num, 1);
252162306a36Sopenharmony_ci	qmp_combo_configure_lane(tx2, cfg->dp_tx_tbl, cfg->dp_tx_tbl_num, 2);
252262306a36Sopenharmony_ci
252362306a36Sopenharmony_ci	/* Configure special DP tx tunings */
252462306a36Sopenharmony_ci	cfg->configure_dp_tx(qmp);
252562306a36Sopenharmony_ci
252662306a36Sopenharmony_ci	/* Configure link rate, swing, etc. */
252762306a36Sopenharmony_ci	cfg->configure_dp_phy(qmp);
252862306a36Sopenharmony_ci
252962306a36Sopenharmony_ci	mutex_unlock(&qmp->phy_mutex);
253062306a36Sopenharmony_ci
253162306a36Sopenharmony_ci	return 0;
253262306a36Sopenharmony_ci}
253362306a36Sopenharmony_ci
253462306a36Sopenharmony_cistatic int qmp_combo_dp_power_off(struct phy *phy)
253562306a36Sopenharmony_ci{
253662306a36Sopenharmony_ci	struct qmp_combo *qmp = phy_get_drvdata(phy);
253762306a36Sopenharmony_ci
253862306a36Sopenharmony_ci	mutex_lock(&qmp->phy_mutex);
253962306a36Sopenharmony_ci
254062306a36Sopenharmony_ci	/* Assert DP PHY power down */
254162306a36Sopenharmony_ci	writel(DP_PHY_PD_CTL_PSR_PWRDN, qmp->dp_dp_phy + QSERDES_DP_PHY_PD_CTL);
254262306a36Sopenharmony_ci
254362306a36Sopenharmony_ci	mutex_unlock(&qmp->phy_mutex);
254462306a36Sopenharmony_ci
254562306a36Sopenharmony_ci	return 0;
254662306a36Sopenharmony_ci}
254762306a36Sopenharmony_ci
254862306a36Sopenharmony_cistatic int qmp_combo_usb_power_on(struct phy *phy)
254962306a36Sopenharmony_ci{
255062306a36Sopenharmony_ci	struct qmp_combo *qmp = phy_get_drvdata(phy);
255162306a36Sopenharmony_ci	const struct qmp_phy_cfg *cfg = qmp->cfg;
255262306a36Sopenharmony_ci	void __iomem *serdes = qmp->serdes;
255362306a36Sopenharmony_ci	void __iomem *tx = qmp->tx;
255462306a36Sopenharmony_ci	void __iomem *rx = qmp->rx;
255562306a36Sopenharmony_ci	void __iomem *tx2 = qmp->tx2;
255662306a36Sopenharmony_ci	void __iomem *rx2 = qmp->rx2;
255762306a36Sopenharmony_ci	void __iomem *pcs = qmp->pcs;
255862306a36Sopenharmony_ci	void __iomem *pcs_usb = qmp->pcs_usb;
255962306a36Sopenharmony_ci	void __iomem *status;
256062306a36Sopenharmony_ci	unsigned int val;
256162306a36Sopenharmony_ci	int ret;
256262306a36Sopenharmony_ci
256362306a36Sopenharmony_ci	qmp_combo_configure(serdes, cfg->serdes_tbl, cfg->serdes_tbl_num);
256462306a36Sopenharmony_ci
256562306a36Sopenharmony_ci	ret = clk_prepare_enable(qmp->pipe_clk);
256662306a36Sopenharmony_ci	if (ret) {
256762306a36Sopenharmony_ci		dev_err(qmp->dev, "pipe_clk enable failed err=%d\n", ret);
256862306a36Sopenharmony_ci		return ret;
256962306a36Sopenharmony_ci	}
257062306a36Sopenharmony_ci
257162306a36Sopenharmony_ci	/* Tx, Rx, and PCS configurations */
257262306a36Sopenharmony_ci	qmp_combo_configure_lane(tx, cfg->tx_tbl, cfg->tx_tbl_num, 1);
257362306a36Sopenharmony_ci	qmp_combo_configure_lane(tx2, cfg->tx_tbl, cfg->tx_tbl_num, 2);
257462306a36Sopenharmony_ci
257562306a36Sopenharmony_ci	qmp_combo_configure_lane(rx, cfg->rx_tbl, cfg->rx_tbl_num, 1);
257662306a36Sopenharmony_ci	qmp_combo_configure_lane(rx2, cfg->rx_tbl, cfg->rx_tbl_num, 2);
257762306a36Sopenharmony_ci
257862306a36Sopenharmony_ci	qmp_combo_configure(pcs, cfg->pcs_tbl, cfg->pcs_tbl_num);
257962306a36Sopenharmony_ci
258062306a36Sopenharmony_ci	if (pcs_usb)
258162306a36Sopenharmony_ci		qmp_combo_configure(pcs_usb, cfg->pcs_usb_tbl, cfg->pcs_usb_tbl_num);
258262306a36Sopenharmony_ci
258362306a36Sopenharmony_ci	if (cfg->has_pwrdn_delay)
258462306a36Sopenharmony_ci		usleep_range(10, 20);
258562306a36Sopenharmony_ci
258662306a36Sopenharmony_ci	/* Pull PHY out of reset state */
258762306a36Sopenharmony_ci	qphy_clrbits(pcs, cfg->regs[QPHY_SW_RESET], SW_RESET);
258862306a36Sopenharmony_ci
258962306a36Sopenharmony_ci	/* start SerDes and Phy-Coding-Sublayer */
259062306a36Sopenharmony_ci	qphy_setbits(pcs, cfg->regs[QPHY_START_CTRL], SERDES_START | PCS_START);
259162306a36Sopenharmony_ci
259262306a36Sopenharmony_ci	status = pcs + cfg->regs[QPHY_PCS_STATUS];
259362306a36Sopenharmony_ci	ret = readl_poll_timeout(status, val, !(val & PHYSTATUS), 200,
259462306a36Sopenharmony_ci			PHY_INIT_COMPLETE_TIMEOUT);
259562306a36Sopenharmony_ci	if (ret) {
259662306a36Sopenharmony_ci		dev_err(qmp->dev, "phy initialization timed-out\n");
259762306a36Sopenharmony_ci		goto err_disable_pipe_clk;
259862306a36Sopenharmony_ci	}
259962306a36Sopenharmony_ci
260062306a36Sopenharmony_ci	return 0;
260162306a36Sopenharmony_ci
260262306a36Sopenharmony_cierr_disable_pipe_clk:
260362306a36Sopenharmony_ci	clk_disable_unprepare(qmp->pipe_clk);
260462306a36Sopenharmony_ci
260562306a36Sopenharmony_ci	return ret;
260662306a36Sopenharmony_ci}
260762306a36Sopenharmony_ci
260862306a36Sopenharmony_cistatic int qmp_combo_usb_power_off(struct phy *phy)
260962306a36Sopenharmony_ci{
261062306a36Sopenharmony_ci	struct qmp_combo *qmp = phy_get_drvdata(phy);
261162306a36Sopenharmony_ci	const struct qmp_phy_cfg *cfg = qmp->cfg;
261262306a36Sopenharmony_ci
261362306a36Sopenharmony_ci	clk_disable_unprepare(qmp->pipe_clk);
261462306a36Sopenharmony_ci
261562306a36Sopenharmony_ci	/* PHY reset */
261662306a36Sopenharmony_ci	qphy_setbits(qmp->pcs, cfg->regs[QPHY_SW_RESET], SW_RESET);
261762306a36Sopenharmony_ci
261862306a36Sopenharmony_ci	/* stop SerDes and Phy-Coding-Sublayer */
261962306a36Sopenharmony_ci	qphy_clrbits(qmp->pcs, cfg->regs[QPHY_START_CTRL],
262062306a36Sopenharmony_ci			SERDES_START | PCS_START);
262162306a36Sopenharmony_ci
262262306a36Sopenharmony_ci	/* Put PHY into POWER DOWN state: active low */
262362306a36Sopenharmony_ci	qphy_clrbits(qmp->pcs, cfg->regs[QPHY_PCS_POWER_DOWN_CONTROL],
262462306a36Sopenharmony_ci			SW_PWRDN);
262562306a36Sopenharmony_ci
262662306a36Sopenharmony_ci	return 0;
262762306a36Sopenharmony_ci}
262862306a36Sopenharmony_ci
262962306a36Sopenharmony_cistatic int qmp_combo_usb_init(struct phy *phy)
263062306a36Sopenharmony_ci{
263162306a36Sopenharmony_ci	struct qmp_combo *qmp = phy_get_drvdata(phy);
263262306a36Sopenharmony_ci	int ret;
263362306a36Sopenharmony_ci
263462306a36Sopenharmony_ci	mutex_lock(&qmp->phy_mutex);
263562306a36Sopenharmony_ci	ret = qmp_combo_com_init(qmp, false);
263662306a36Sopenharmony_ci	if (ret)
263762306a36Sopenharmony_ci		goto out_unlock;
263862306a36Sopenharmony_ci
263962306a36Sopenharmony_ci	ret = qmp_combo_usb_power_on(phy);
264062306a36Sopenharmony_ci	if (ret) {
264162306a36Sopenharmony_ci		qmp_combo_com_exit(qmp, false);
264262306a36Sopenharmony_ci		goto out_unlock;
264362306a36Sopenharmony_ci	}
264462306a36Sopenharmony_ci
264562306a36Sopenharmony_ci	qmp->usb_init_count++;
264662306a36Sopenharmony_ci
264762306a36Sopenharmony_ciout_unlock:
264862306a36Sopenharmony_ci	mutex_unlock(&qmp->phy_mutex);
264962306a36Sopenharmony_ci	return ret;
265062306a36Sopenharmony_ci}
265162306a36Sopenharmony_ci
265262306a36Sopenharmony_cistatic int qmp_combo_usb_exit(struct phy *phy)
265362306a36Sopenharmony_ci{
265462306a36Sopenharmony_ci	struct qmp_combo *qmp = phy_get_drvdata(phy);
265562306a36Sopenharmony_ci	int ret;
265662306a36Sopenharmony_ci
265762306a36Sopenharmony_ci	mutex_lock(&qmp->phy_mutex);
265862306a36Sopenharmony_ci	ret = qmp_combo_usb_power_off(phy);
265962306a36Sopenharmony_ci	if (ret)
266062306a36Sopenharmony_ci		goto out_unlock;
266162306a36Sopenharmony_ci
266262306a36Sopenharmony_ci	ret = qmp_combo_com_exit(qmp, false);
266362306a36Sopenharmony_ci	if (ret)
266462306a36Sopenharmony_ci		goto out_unlock;
266562306a36Sopenharmony_ci
266662306a36Sopenharmony_ci	qmp->usb_init_count--;
266762306a36Sopenharmony_ci
266862306a36Sopenharmony_ciout_unlock:
266962306a36Sopenharmony_ci	mutex_unlock(&qmp->phy_mutex);
267062306a36Sopenharmony_ci	return ret;
267162306a36Sopenharmony_ci}
267262306a36Sopenharmony_ci
267362306a36Sopenharmony_cistatic int qmp_combo_usb_set_mode(struct phy *phy, enum phy_mode mode, int submode)
267462306a36Sopenharmony_ci{
267562306a36Sopenharmony_ci	struct qmp_combo *qmp = phy_get_drvdata(phy);
267662306a36Sopenharmony_ci
267762306a36Sopenharmony_ci	qmp->mode = mode;
267862306a36Sopenharmony_ci
267962306a36Sopenharmony_ci	return 0;
268062306a36Sopenharmony_ci}
268162306a36Sopenharmony_ci
268262306a36Sopenharmony_cistatic const struct phy_ops qmp_combo_usb_phy_ops = {
268362306a36Sopenharmony_ci	.init		= qmp_combo_usb_init,
268462306a36Sopenharmony_ci	.exit		= qmp_combo_usb_exit,
268562306a36Sopenharmony_ci	.set_mode	= qmp_combo_usb_set_mode,
268662306a36Sopenharmony_ci	.owner		= THIS_MODULE,
268762306a36Sopenharmony_ci};
268862306a36Sopenharmony_ci
268962306a36Sopenharmony_cistatic const struct phy_ops qmp_combo_dp_phy_ops = {
269062306a36Sopenharmony_ci	.init		= qmp_combo_dp_init,
269162306a36Sopenharmony_ci	.configure	= qmp_combo_dp_configure,
269262306a36Sopenharmony_ci	.power_on	= qmp_combo_dp_power_on,
269362306a36Sopenharmony_ci	.calibrate	= qmp_combo_dp_calibrate,
269462306a36Sopenharmony_ci	.power_off	= qmp_combo_dp_power_off,
269562306a36Sopenharmony_ci	.exit		= qmp_combo_dp_exit,
269662306a36Sopenharmony_ci	.owner		= THIS_MODULE,
269762306a36Sopenharmony_ci};
269862306a36Sopenharmony_ci
269962306a36Sopenharmony_cistatic void qmp_combo_enable_autonomous_mode(struct qmp_combo *qmp)
270062306a36Sopenharmony_ci{
270162306a36Sopenharmony_ci	const struct qmp_phy_cfg *cfg = qmp->cfg;
270262306a36Sopenharmony_ci	void __iomem *pcs_usb = qmp->pcs_usb ?: qmp->pcs;
270362306a36Sopenharmony_ci	void __iomem *pcs_misc = qmp->pcs_misc;
270462306a36Sopenharmony_ci	u32 intr_mask;
270562306a36Sopenharmony_ci
270662306a36Sopenharmony_ci	if (qmp->mode == PHY_MODE_USB_HOST_SS ||
270762306a36Sopenharmony_ci	    qmp->mode == PHY_MODE_USB_DEVICE_SS)
270862306a36Sopenharmony_ci		intr_mask = ARCVR_DTCT_EN | ALFPS_DTCT_EN;
270962306a36Sopenharmony_ci	else
271062306a36Sopenharmony_ci		intr_mask = ARCVR_DTCT_EN | ARCVR_DTCT_EVENT_SEL;
271162306a36Sopenharmony_ci
271262306a36Sopenharmony_ci	/* Clear any pending interrupts status */
271362306a36Sopenharmony_ci	qphy_setbits(pcs_usb, cfg->regs[QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR], IRQ_CLEAR);
271462306a36Sopenharmony_ci	/* Writing 1 followed by 0 clears the interrupt */
271562306a36Sopenharmony_ci	qphy_clrbits(pcs_usb, cfg->regs[QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR], IRQ_CLEAR);
271662306a36Sopenharmony_ci
271762306a36Sopenharmony_ci	qphy_clrbits(pcs_usb, cfg->regs[QPHY_PCS_AUTONOMOUS_MODE_CTRL],
271862306a36Sopenharmony_ci		     ARCVR_DTCT_EN | ALFPS_DTCT_EN | ARCVR_DTCT_EVENT_SEL);
271962306a36Sopenharmony_ci
272062306a36Sopenharmony_ci	/* Enable required PHY autonomous mode interrupts */
272162306a36Sopenharmony_ci	qphy_setbits(pcs_usb, cfg->regs[QPHY_PCS_AUTONOMOUS_MODE_CTRL], intr_mask);
272262306a36Sopenharmony_ci
272362306a36Sopenharmony_ci	/* Enable i/o clamp_n for autonomous mode */
272462306a36Sopenharmony_ci	if (pcs_misc)
272562306a36Sopenharmony_ci		qphy_clrbits(pcs_misc, QPHY_V3_PCS_MISC_CLAMP_ENABLE, CLAMP_EN);
272662306a36Sopenharmony_ci}
272762306a36Sopenharmony_ci
272862306a36Sopenharmony_cistatic void qmp_combo_disable_autonomous_mode(struct qmp_combo *qmp)
272962306a36Sopenharmony_ci{
273062306a36Sopenharmony_ci	const struct qmp_phy_cfg *cfg = qmp->cfg;
273162306a36Sopenharmony_ci	void __iomem *pcs_usb = qmp->pcs_usb ?: qmp->pcs;
273262306a36Sopenharmony_ci	void __iomem *pcs_misc = qmp->pcs_misc;
273362306a36Sopenharmony_ci
273462306a36Sopenharmony_ci	/* Disable i/o clamp_n on resume for normal mode */
273562306a36Sopenharmony_ci	if (pcs_misc)
273662306a36Sopenharmony_ci		qphy_setbits(pcs_misc, QPHY_V3_PCS_MISC_CLAMP_ENABLE, CLAMP_EN);
273762306a36Sopenharmony_ci
273862306a36Sopenharmony_ci	qphy_clrbits(pcs_usb, cfg->regs[QPHY_PCS_AUTONOMOUS_MODE_CTRL],
273962306a36Sopenharmony_ci		     ARCVR_DTCT_EN | ARCVR_DTCT_EVENT_SEL | ALFPS_DTCT_EN);
274062306a36Sopenharmony_ci
274162306a36Sopenharmony_ci	qphy_setbits(pcs_usb, cfg->regs[QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR], IRQ_CLEAR);
274262306a36Sopenharmony_ci	/* Writing 1 followed by 0 clears the interrupt */
274362306a36Sopenharmony_ci	qphy_clrbits(pcs_usb, cfg->regs[QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR], IRQ_CLEAR);
274462306a36Sopenharmony_ci}
274562306a36Sopenharmony_ci
274662306a36Sopenharmony_cistatic int __maybe_unused qmp_combo_runtime_suspend(struct device *dev)
274762306a36Sopenharmony_ci{
274862306a36Sopenharmony_ci	struct qmp_combo *qmp = dev_get_drvdata(dev);
274962306a36Sopenharmony_ci
275062306a36Sopenharmony_ci	dev_vdbg(dev, "Suspending QMP phy, mode:%d\n", qmp->mode);
275162306a36Sopenharmony_ci
275262306a36Sopenharmony_ci	if (!qmp->init_count) {
275362306a36Sopenharmony_ci		dev_vdbg(dev, "PHY not initialized, bailing out\n");
275462306a36Sopenharmony_ci		return 0;
275562306a36Sopenharmony_ci	}
275662306a36Sopenharmony_ci
275762306a36Sopenharmony_ci	qmp_combo_enable_autonomous_mode(qmp);
275862306a36Sopenharmony_ci
275962306a36Sopenharmony_ci	clk_disable_unprepare(qmp->pipe_clk);
276062306a36Sopenharmony_ci	clk_bulk_disable_unprepare(qmp->num_clks, qmp->clks);
276162306a36Sopenharmony_ci
276262306a36Sopenharmony_ci	return 0;
276362306a36Sopenharmony_ci}
276462306a36Sopenharmony_ci
276562306a36Sopenharmony_cistatic int __maybe_unused qmp_combo_runtime_resume(struct device *dev)
276662306a36Sopenharmony_ci{
276762306a36Sopenharmony_ci	struct qmp_combo *qmp = dev_get_drvdata(dev);
276862306a36Sopenharmony_ci	int ret = 0;
276962306a36Sopenharmony_ci
277062306a36Sopenharmony_ci	dev_vdbg(dev, "Resuming QMP phy, mode:%d\n", qmp->mode);
277162306a36Sopenharmony_ci
277262306a36Sopenharmony_ci	if (!qmp->init_count) {
277362306a36Sopenharmony_ci		dev_vdbg(dev, "PHY not initialized, bailing out\n");
277462306a36Sopenharmony_ci		return 0;
277562306a36Sopenharmony_ci	}
277662306a36Sopenharmony_ci
277762306a36Sopenharmony_ci	ret = clk_bulk_prepare_enable(qmp->num_clks, qmp->clks);
277862306a36Sopenharmony_ci	if (ret)
277962306a36Sopenharmony_ci		return ret;
278062306a36Sopenharmony_ci
278162306a36Sopenharmony_ci	ret = clk_prepare_enable(qmp->pipe_clk);
278262306a36Sopenharmony_ci	if (ret) {
278362306a36Sopenharmony_ci		dev_err(dev, "pipe_clk enable failed, err=%d\n", ret);
278462306a36Sopenharmony_ci		clk_bulk_disable_unprepare(qmp->num_clks, qmp->clks);
278562306a36Sopenharmony_ci		return ret;
278662306a36Sopenharmony_ci	}
278762306a36Sopenharmony_ci
278862306a36Sopenharmony_ci	qmp_combo_disable_autonomous_mode(qmp);
278962306a36Sopenharmony_ci
279062306a36Sopenharmony_ci	return 0;
279162306a36Sopenharmony_ci}
279262306a36Sopenharmony_ci
279362306a36Sopenharmony_cistatic const struct dev_pm_ops qmp_combo_pm_ops = {
279462306a36Sopenharmony_ci	SET_RUNTIME_PM_OPS(qmp_combo_runtime_suspend,
279562306a36Sopenharmony_ci			   qmp_combo_runtime_resume, NULL)
279662306a36Sopenharmony_ci};
279762306a36Sopenharmony_ci
279862306a36Sopenharmony_cistatic int qmp_combo_vreg_init(struct qmp_combo *qmp)
279962306a36Sopenharmony_ci{
280062306a36Sopenharmony_ci	const struct qmp_phy_cfg *cfg = qmp->cfg;
280162306a36Sopenharmony_ci	struct device *dev = qmp->dev;
280262306a36Sopenharmony_ci	int num = cfg->num_vregs;
280362306a36Sopenharmony_ci	int ret, i;
280462306a36Sopenharmony_ci
280562306a36Sopenharmony_ci	qmp->vregs = devm_kcalloc(dev, num, sizeof(*qmp->vregs), GFP_KERNEL);
280662306a36Sopenharmony_ci	if (!qmp->vregs)
280762306a36Sopenharmony_ci		return -ENOMEM;
280862306a36Sopenharmony_ci
280962306a36Sopenharmony_ci	for (i = 0; i < num; i++)
281062306a36Sopenharmony_ci		qmp->vregs[i].supply = cfg->vreg_list[i].name;
281162306a36Sopenharmony_ci
281262306a36Sopenharmony_ci	ret = devm_regulator_bulk_get(dev, num, qmp->vregs);
281362306a36Sopenharmony_ci	if (ret) {
281462306a36Sopenharmony_ci		dev_err(dev, "failed at devm_regulator_bulk_get\n");
281562306a36Sopenharmony_ci		return ret;
281662306a36Sopenharmony_ci	}
281762306a36Sopenharmony_ci
281862306a36Sopenharmony_ci	for (i = 0; i < num; i++) {
281962306a36Sopenharmony_ci		ret = regulator_set_load(qmp->vregs[i].consumer,
282062306a36Sopenharmony_ci					cfg->vreg_list[i].enable_load);
282162306a36Sopenharmony_ci		if (ret) {
282262306a36Sopenharmony_ci			dev_err(dev, "failed to set load at %s\n",
282362306a36Sopenharmony_ci				qmp->vregs[i].supply);
282462306a36Sopenharmony_ci			return ret;
282562306a36Sopenharmony_ci		}
282662306a36Sopenharmony_ci	}
282762306a36Sopenharmony_ci
282862306a36Sopenharmony_ci	return 0;
282962306a36Sopenharmony_ci}
283062306a36Sopenharmony_ci
283162306a36Sopenharmony_cistatic int qmp_combo_reset_init(struct qmp_combo *qmp)
283262306a36Sopenharmony_ci{
283362306a36Sopenharmony_ci	const struct qmp_phy_cfg *cfg = qmp->cfg;
283462306a36Sopenharmony_ci	struct device *dev = qmp->dev;
283562306a36Sopenharmony_ci	int i;
283662306a36Sopenharmony_ci	int ret;
283762306a36Sopenharmony_ci
283862306a36Sopenharmony_ci	qmp->resets = devm_kcalloc(dev, cfg->num_resets,
283962306a36Sopenharmony_ci				   sizeof(*qmp->resets), GFP_KERNEL);
284062306a36Sopenharmony_ci	if (!qmp->resets)
284162306a36Sopenharmony_ci		return -ENOMEM;
284262306a36Sopenharmony_ci
284362306a36Sopenharmony_ci	for (i = 0; i < cfg->num_resets; i++)
284462306a36Sopenharmony_ci		qmp->resets[i].id = cfg->reset_list[i];
284562306a36Sopenharmony_ci
284662306a36Sopenharmony_ci	ret = devm_reset_control_bulk_get_exclusive(dev, cfg->num_resets, qmp->resets);
284762306a36Sopenharmony_ci	if (ret)
284862306a36Sopenharmony_ci		return dev_err_probe(dev, ret, "failed to get resets\n");
284962306a36Sopenharmony_ci
285062306a36Sopenharmony_ci	return 0;
285162306a36Sopenharmony_ci}
285262306a36Sopenharmony_ci
285362306a36Sopenharmony_cistatic int qmp_combo_clk_init(struct qmp_combo *qmp)
285462306a36Sopenharmony_ci{
285562306a36Sopenharmony_ci	struct device *dev = qmp->dev;
285662306a36Sopenharmony_ci	int num = ARRAY_SIZE(qmp_combo_phy_clk_l);
285762306a36Sopenharmony_ci	int i;
285862306a36Sopenharmony_ci
285962306a36Sopenharmony_ci	qmp->clks = devm_kcalloc(dev, num, sizeof(*qmp->clks), GFP_KERNEL);
286062306a36Sopenharmony_ci	if (!qmp->clks)
286162306a36Sopenharmony_ci		return -ENOMEM;
286262306a36Sopenharmony_ci
286362306a36Sopenharmony_ci	for (i = 0; i < num; i++)
286462306a36Sopenharmony_ci		qmp->clks[i].id = qmp_combo_phy_clk_l[i];
286562306a36Sopenharmony_ci
286662306a36Sopenharmony_ci	qmp->num_clks = num;
286762306a36Sopenharmony_ci
286862306a36Sopenharmony_ci	return devm_clk_bulk_get_optional(dev, num, qmp->clks);
286962306a36Sopenharmony_ci}
287062306a36Sopenharmony_ci
287162306a36Sopenharmony_cistatic void phy_clk_release_provider(void *res)
287262306a36Sopenharmony_ci{
287362306a36Sopenharmony_ci	of_clk_del_provider(res);
287462306a36Sopenharmony_ci}
287562306a36Sopenharmony_ci
287662306a36Sopenharmony_ci/*
287762306a36Sopenharmony_ci * Register a fixed rate pipe clock.
287862306a36Sopenharmony_ci *
287962306a36Sopenharmony_ci * The <s>_pipe_clksrc generated by PHY goes to the GCC that gate
288062306a36Sopenharmony_ci * controls it. The <s>_pipe_clk coming out of the GCC is requested
288162306a36Sopenharmony_ci * by the PHY driver for its operations.
288262306a36Sopenharmony_ci * We register the <s>_pipe_clksrc here. The gcc driver takes care
288362306a36Sopenharmony_ci * of assigning this <s>_pipe_clksrc as parent to <s>_pipe_clk.
288462306a36Sopenharmony_ci * Below picture shows this relationship.
288562306a36Sopenharmony_ci *
288662306a36Sopenharmony_ci *         +---------------+
288762306a36Sopenharmony_ci *         |   PHY block   |<<---------------------------------------+
288862306a36Sopenharmony_ci *         |               |                                         |
288962306a36Sopenharmony_ci *         |   +-------+   |                   +-----+               |
289062306a36Sopenharmony_ci *   I/P---^-->|  PLL  |---^--->pipe_clksrc--->| GCC |--->pipe_clk---+
289162306a36Sopenharmony_ci *    clk  |   +-------+   |                   +-----+
289262306a36Sopenharmony_ci *         +---------------+
289362306a36Sopenharmony_ci */
289462306a36Sopenharmony_cistatic int phy_pipe_clk_register(struct qmp_combo *qmp, struct device_node *np)
289562306a36Sopenharmony_ci{
289662306a36Sopenharmony_ci	struct clk_fixed_rate *fixed = &qmp->pipe_clk_fixed;
289762306a36Sopenharmony_ci	struct clk_init_data init = { };
289862306a36Sopenharmony_ci	char name[64];
289962306a36Sopenharmony_ci
290062306a36Sopenharmony_ci	snprintf(name, sizeof(name), "%s::pipe_clk", dev_name(qmp->dev));
290162306a36Sopenharmony_ci	init.name = name;
290262306a36Sopenharmony_ci	init.ops = &clk_fixed_rate_ops;
290362306a36Sopenharmony_ci
290462306a36Sopenharmony_ci	/* controllers using QMP phys use 125MHz pipe clock interface */
290562306a36Sopenharmony_ci	fixed->fixed_rate = 125000000;
290662306a36Sopenharmony_ci	fixed->hw.init = &init;
290762306a36Sopenharmony_ci
290862306a36Sopenharmony_ci	return devm_clk_hw_register(qmp->dev, &fixed->hw);
290962306a36Sopenharmony_ci}
291062306a36Sopenharmony_ci
291162306a36Sopenharmony_ci/*
291262306a36Sopenharmony_ci * Display Port PLL driver block diagram for branch clocks
291362306a36Sopenharmony_ci *
291462306a36Sopenharmony_ci *              +------------------------------+
291562306a36Sopenharmony_ci *              |         DP_VCO_CLK           |
291662306a36Sopenharmony_ci *              |                              |
291762306a36Sopenharmony_ci *              |    +-------------------+     |
291862306a36Sopenharmony_ci *              |    |   (DP PLL/VCO)    |     |
291962306a36Sopenharmony_ci *              |    +---------+---------+     |
292062306a36Sopenharmony_ci *              |              v               |
292162306a36Sopenharmony_ci *              |   +----------+-----------+   |
292262306a36Sopenharmony_ci *              |   | hsclk_divsel_clk_src |   |
292362306a36Sopenharmony_ci *              |   +----------+-----------+   |
292462306a36Sopenharmony_ci *              +------------------------------+
292562306a36Sopenharmony_ci *                              |
292662306a36Sopenharmony_ci *          +---------<---------v------------>----------+
292762306a36Sopenharmony_ci *          |                                           |
292862306a36Sopenharmony_ci * +--------v----------------+                          |
292962306a36Sopenharmony_ci * |    dp_phy_pll_link_clk  |                          |
293062306a36Sopenharmony_ci * |     link_clk            |                          |
293162306a36Sopenharmony_ci * +--------+----------------+                          |
293262306a36Sopenharmony_ci *          |                                           |
293362306a36Sopenharmony_ci *          |                                           |
293462306a36Sopenharmony_ci *          v                                           v
293562306a36Sopenharmony_ci * Input to DISPCC block                                |
293662306a36Sopenharmony_ci * for link clk, crypto clk                             |
293762306a36Sopenharmony_ci * and interface clock                                  |
293862306a36Sopenharmony_ci *                                                      |
293962306a36Sopenharmony_ci *                                                      |
294062306a36Sopenharmony_ci *      +--------<------------+-----------------+---<---+
294162306a36Sopenharmony_ci *      |                     |                 |
294262306a36Sopenharmony_ci * +----v---------+  +--------v-----+  +--------v------+
294362306a36Sopenharmony_ci * | vco_divided  |  | vco_divided  |  | vco_divided   |
294462306a36Sopenharmony_ci * |    _clk_src  |  |    _clk_src  |  |    _clk_src   |
294562306a36Sopenharmony_ci * |              |  |              |  |               |
294662306a36Sopenharmony_ci * |divsel_six    |  |  divsel_two  |  |  divsel_four  |
294762306a36Sopenharmony_ci * +-------+------+  +-----+--------+  +--------+------+
294862306a36Sopenharmony_ci *         |                 |                  |
294962306a36Sopenharmony_ci *         v---->----------v-------------<------v
295062306a36Sopenharmony_ci *                         |
295162306a36Sopenharmony_ci *              +----------+-----------------+
295262306a36Sopenharmony_ci *              |   dp_phy_pll_vco_div_clk   |
295362306a36Sopenharmony_ci *              +---------+------------------+
295462306a36Sopenharmony_ci *                        |
295562306a36Sopenharmony_ci *                        v
295662306a36Sopenharmony_ci *              Input to DISPCC block
295762306a36Sopenharmony_ci *              for DP pixel clock
295862306a36Sopenharmony_ci *
295962306a36Sopenharmony_ci */
296062306a36Sopenharmony_cistatic int qmp_dp_pixel_clk_determine_rate(struct clk_hw *hw, struct clk_rate_request *req)
296162306a36Sopenharmony_ci{
296262306a36Sopenharmony_ci	switch (req->rate) {
296362306a36Sopenharmony_ci	case 1620000000UL / 2:
296462306a36Sopenharmony_ci	case 2700000000UL / 2:
296562306a36Sopenharmony_ci	/* 5.4 and 8.1 GHz are same link rate as 2.7GHz, i.e. div 4 and div 6 */
296662306a36Sopenharmony_ci		return 0;
296762306a36Sopenharmony_ci	default:
296862306a36Sopenharmony_ci		return -EINVAL;
296962306a36Sopenharmony_ci	}
297062306a36Sopenharmony_ci}
297162306a36Sopenharmony_ci
297262306a36Sopenharmony_cistatic unsigned long qmp_dp_pixel_clk_recalc_rate(struct clk_hw *hw, unsigned long parent_rate)
297362306a36Sopenharmony_ci{
297462306a36Sopenharmony_ci	const struct qmp_combo *qmp;
297562306a36Sopenharmony_ci	const struct phy_configure_opts_dp *dp_opts;
297662306a36Sopenharmony_ci
297762306a36Sopenharmony_ci	qmp = container_of(hw, struct qmp_combo, dp_pixel_hw);
297862306a36Sopenharmony_ci	dp_opts = &qmp->dp_opts;
297962306a36Sopenharmony_ci
298062306a36Sopenharmony_ci	switch (dp_opts->link_rate) {
298162306a36Sopenharmony_ci	case 1620:
298262306a36Sopenharmony_ci		return 1620000000UL / 2;
298362306a36Sopenharmony_ci	case 2700:
298462306a36Sopenharmony_ci		return 2700000000UL / 2;
298562306a36Sopenharmony_ci	case 5400:
298662306a36Sopenharmony_ci		return 5400000000UL / 4;
298762306a36Sopenharmony_ci	case 8100:
298862306a36Sopenharmony_ci		return 8100000000UL / 6;
298962306a36Sopenharmony_ci	default:
299062306a36Sopenharmony_ci		return 0;
299162306a36Sopenharmony_ci	}
299262306a36Sopenharmony_ci}
299362306a36Sopenharmony_ci
299462306a36Sopenharmony_cistatic const struct clk_ops qmp_dp_pixel_clk_ops = {
299562306a36Sopenharmony_ci	.determine_rate	= qmp_dp_pixel_clk_determine_rate,
299662306a36Sopenharmony_ci	.recalc_rate	= qmp_dp_pixel_clk_recalc_rate,
299762306a36Sopenharmony_ci};
299862306a36Sopenharmony_ci
299962306a36Sopenharmony_cistatic int qmp_dp_link_clk_determine_rate(struct clk_hw *hw, struct clk_rate_request *req)
300062306a36Sopenharmony_ci{
300162306a36Sopenharmony_ci	switch (req->rate) {
300262306a36Sopenharmony_ci	case 162000000:
300362306a36Sopenharmony_ci	case 270000000:
300462306a36Sopenharmony_ci	case 540000000:
300562306a36Sopenharmony_ci	case 810000000:
300662306a36Sopenharmony_ci		return 0;
300762306a36Sopenharmony_ci	default:
300862306a36Sopenharmony_ci		return -EINVAL;
300962306a36Sopenharmony_ci	}
301062306a36Sopenharmony_ci}
301162306a36Sopenharmony_ci
301262306a36Sopenharmony_cistatic unsigned long qmp_dp_link_clk_recalc_rate(struct clk_hw *hw, unsigned long parent_rate)
301362306a36Sopenharmony_ci{
301462306a36Sopenharmony_ci	const struct qmp_combo *qmp;
301562306a36Sopenharmony_ci	const struct phy_configure_opts_dp *dp_opts;
301662306a36Sopenharmony_ci
301762306a36Sopenharmony_ci	qmp = container_of(hw, struct qmp_combo, dp_link_hw);
301862306a36Sopenharmony_ci	dp_opts = &qmp->dp_opts;
301962306a36Sopenharmony_ci
302062306a36Sopenharmony_ci	switch (dp_opts->link_rate) {
302162306a36Sopenharmony_ci	case 1620:
302262306a36Sopenharmony_ci	case 2700:
302362306a36Sopenharmony_ci	case 5400:
302462306a36Sopenharmony_ci	case 8100:
302562306a36Sopenharmony_ci		return dp_opts->link_rate * 100000;
302662306a36Sopenharmony_ci	default:
302762306a36Sopenharmony_ci		return 0;
302862306a36Sopenharmony_ci	}
302962306a36Sopenharmony_ci}
303062306a36Sopenharmony_ci
303162306a36Sopenharmony_cistatic const struct clk_ops qmp_dp_link_clk_ops = {
303262306a36Sopenharmony_ci	.determine_rate	= qmp_dp_link_clk_determine_rate,
303362306a36Sopenharmony_ci	.recalc_rate	= qmp_dp_link_clk_recalc_rate,
303462306a36Sopenharmony_ci};
303562306a36Sopenharmony_ci
303662306a36Sopenharmony_cistatic struct clk_hw *qmp_dp_clks_hw_get(struct of_phandle_args *clkspec, void *data)
303762306a36Sopenharmony_ci{
303862306a36Sopenharmony_ci	struct qmp_combo *qmp = data;
303962306a36Sopenharmony_ci	unsigned int idx = clkspec->args[0];
304062306a36Sopenharmony_ci
304162306a36Sopenharmony_ci	if (idx >= 2) {
304262306a36Sopenharmony_ci		pr_err("%s: invalid index %u\n", __func__, idx);
304362306a36Sopenharmony_ci		return ERR_PTR(-EINVAL);
304462306a36Sopenharmony_ci	}
304562306a36Sopenharmony_ci
304662306a36Sopenharmony_ci	if (idx == 0)
304762306a36Sopenharmony_ci		return &qmp->dp_link_hw;
304862306a36Sopenharmony_ci
304962306a36Sopenharmony_ci	return &qmp->dp_pixel_hw;
305062306a36Sopenharmony_ci}
305162306a36Sopenharmony_ci
305262306a36Sopenharmony_cistatic int phy_dp_clks_register(struct qmp_combo *qmp, struct device_node *np)
305362306a36Sopenharmony_ci{
305462306a36Sopenharmony_ci	struct clk_init_data init = { };
305562306a36Sopenharmony_ci	char name[64];
305662306a36Sopenharmony_ci	int ret;
305762306a36Sopenharmony_ci
305862306a36Sopenharmony_ci	snprintf(name, sizeof(name), "%s::link_clk", dev_name(qmp->dev));
305962306a36Sopenharmony_ci	init.ops = &qmp_dp_link_clk_ops;
306062306a36Sopenharmony_ci	init.name = name;
306162306a36Sopenharmony_ci	qmp->dp_link_hw.init = &init;
306262306a36Sopenharmony_ci	ret = devm_clk_hw_register(qmp->dev, &qmp->dp_link_hw);
306362306a36Sopenharmony_ci	if (ret)
306462306a36Sopenharmony_ci		return ret;
306562306a36Sopenharmony_ci
306662306a36Sopenharmony_ci	snprintf(name, sizeof(name), "%s::vco_div_clk", dev_name(qmp->dev));
306762306a36Sopenharmony_ci	init.ops = &qmp_dp_pixel_clk_ops;
306862306a36Sopenharmony_ci	init.name = name;
306962306a36Sopenharmony_ci	qmp->dp_pixel_hw.init = &init;
307062306a36Sopenharmony_ci	ret = devm_clk_hw_register(qmp->dev, &qmp->dp_pixel_hw);
307162306a36Sopenharmony_ci	if (ret)
307262306a36Sopenharmony_ci		return ret;
307362306a36Sopenharmony_ci
307462306a36Sopenharmony_ci	return 0;
307562306a36Sopenharmony_ci}
307662306a36Sopenharmony_ci
307762306a36Sopenharmony_cistatic struct clk_hw *qmp_combo_clk_hw_get(struct of_phandle_args *clkspec, void *data)
307862306a36Sopenharmony_ci{
307962306a36Sopenharmony_ci	struct qmp_combo *qmp = data;
308062306a36Sopenharmony_ci
308162306a36Sopenharmony_ci	switch (clkspec->args[0]) {
308262306a36Sopenharmony_ci	case QMP_USB43DP_USB3_PIPE_CLK:
308362306a36Sopenharmony_ci		return &qmp->pipe_clk_fixed.hw;
308462306a36Sopenharmony_ci	case QMP_USB43DP_DP_LINK_CLK:
308562306a36Sopenharmony_ci		return &qmp->dp_link_hw;
308662306a36Sopenharmony_ci	case QMP_USB43DP_DP_VCO_DIV_CLK:
308762306a36Sopenharmony_ci		return &qmp->dp_pixel_hw;
308862306a36Sopenharmony_ci	}
308962306a36Sopenharmony_ci
309062306a36Sopenharmony_ci	return ERR_PTR(-EINVAL);
309162306a36Sopenharmony_ci}
309262306a36Sopenharmony_ci
309362306a36Sopenharmony_cistatic int qmp_combo_register_clocks(struct qmp_combo *qmp, struct device_node *usb_np,
309462306a36Sopenharmony_ci					struct device_node *dp_np)
309562306a36Sopenharmony_ci{
309662306a36Sopenharmony_ci	int ret;
309762306a36Sopenharmony_ci
309862306a36Sopenharmony_ci	ret = phy_pipe_clk_register(qmp, usb_np);
309962306a36Sopenharmony_ci	if (ret)
310062306a36Sopenharmony_ci		return ret;
310162306a36Sopenharmony_ci
310262306a36Sopenharmony_ci	ret = phy_dp_clks_register(qmp, dp_np);
310362306a36Sopenharmony_ci	if (ret)
310462306a36Sopenharmony_ci		return ret;
310562306a36Sopenharmony_ci
310662306a36Sopenharmony_ci	/*
310762306a36Sopenharmony_ci	 * Register a single provider for bindings without child nodes.
310862306a36Sopenharmony_ci	 */
310962306a36Sopenharmony_ci	if (usb_np == qmp->dev->of_node)
311062306a36Sopenharmony_ci		return devm_of_clk_add_hw_provider(qmp->dev, qmp_combo_clk_hw_get, qmp);
311162306a36Sopenharmony_ci
311262306a36Sopenharmony_ci	/*
311362306a36Sopenharmony_ci	 * Register multiple providers for legacy bindings with child nodes.
311462306a36Sopenharmony_ci	 */
311562306a36Sopenharmony_ci	ret = of_clk_add_hw_provider(usb_np, of_clk_hw_simple_get,
311662306a36Sopenharmony_ci					&qmp->pipe_clk_fixed.hw);
311762306a36Sopenharmony_ci	if (ret)
311862306a36Sopenharmony_ci		return ret;
311962306a36Sopenharmony_ci
312062306a36Sopenharmony_ci	/*
312162306a36Sopenharmony_ci	 * Roll a devm action because the clock provider is the child node, but
312262306a36Sopenharmony_ci	 * the child node is not actually a device.
312362306a36Sopenharmony_ci	 */
312462306a36Sopenharmony_ci	ret = devm_add_action_or_reset(qmp->dev, phy_clk_release_provider, usb_np);
312562306a36Sopenharmony_ci	if (ret)
312662306a36Sopenharmony_ci		return ret;
312762306a36Sopenharmony_ci
312862306a36Sopenharmony_ci	ret = of_clk_add_hw_provider(dp_np, qmp_dp_clks_hw_get, qmp);
312962306a36Sopenharmony_ci	if (ret)
313062306a36Sopenharmony_ci		return ret;
313162306a36Sopenharmony_ci
313262306a36Sopenharmony_ci	return devm_add_action_or_reset(qmp->dev, phy_clk_release_provider, dp_np);
313362306a36Sopenharmony_ci}
313462306a36Sopenharmony_ci
313562306a36Sopenharmony_ci#if IS_ENABLED(CONFIG_TYPEC)
313662306a36Sopenharmony_cistatic int qmp_combo_typec_switch_set(struct typec_switch_dev *sw,
313762306a36Sopenharmony_ci				      enum typec_orientation orientation)
313862306a36Sopenharmony_ci{
313962306a36Sopenharmony_ci	struct qmp_combo *qmp = typec_switch_get_drvdata(sw);
314062306a36Sopenharmony_ci	const struct qmp_phy_cfg *cfg = qmp->cfg;
314162306a36Sopenharmony_ci
314262306a36Sopenharmony_ci	if (orientation == qmp->orientation || orientation == TYPEC_ORIENTATION_NONE)
314362306a36Sopenharmony_ci		return 0;
314462306a36Sopenharmony_ci
314562306a36Sopenharmony_ci	mutex_lock(&qmp->phy_mutex);
314662306a36Sopenharmony_ci	qmp->orientation = orientation;
314762306a36Sopenharmony_ci
314862306a36Sopenharmony_ci	if (qmp->init_count) {
314962306a36Sopenharmony_ci		if (qmp->usb_init_count)
315062306a36Sopenharmony_ci			qmp_combo_usb_power_off(qmp->usb_phy);
315162306a36Sopenharmony_ci		qmp_combo_com_exit(qmp, true);
315262306a36Sopenharmony_ci
315362306a36Sopenharmony_ci		qmp_combo_com_init(qmp, true);
315462306a36Sopenharmony_ci		if (qmp->usb_init_count)
315562306a36Sopenharmony_ci			qmp_combo_usb_power_on(qmp->usb_phy);
315662306a36Sopenharmony_ci		if (qmp->dp_init_count)
315762306a36Sopenharmony_ci			cfg->dp_aux_init(qmp);
315862306a36Sopenharmony_ci	}
315962306a36Sopenharmony_ci	mutex_unlock(&qmp->phy_mutex);
316062306a36Sopenharmony_ci
316162306a36Sopenharmony_ci	return 0;
316262306a36Sopenharmony_ci}
316362306a36Sopenharmony_ci
316462306a36Sopenharmony_cistatic void qmp_combo_typec_unregister(void *data)
316562306a36Sopenharmony_ci{
316662306a36Sopenharmony_ci	struct qmp_combo *qmp = data;
316762306a36Sopenharmony_ci
316862306a36Sopenharmony_ci	typec_switch_unregister(qmp->sw);
316962306a36Sopenharmony_ci}
317062306a36Sopenharmony_ci
317162306a36Sopenharmony_cistatic int qmp_combo_typec_switch_register(struct qmp_combo *qmp)
317262306a36Sopenharmony_ci{
317362306a36Sopenharmony_ci	struct typec_switch_desc sw_desc = {};
317462306a36Sopenharmony_ci	struct device *dev = qmp->dev;
317562306a36Sopenharmony_ci
317662306a36Sopenharmony_ci	sw_desc.drvdata = qmp;
317762306a36Sopenharmony_ci	sw_desc.fwnode = dev->fwnode;
317862306a36Sopenharmony_ci	sw_desc.set = qmp_combo_typec_switch_set;
317962306a36Sopenharmony_ci	qmp->sw = typec_switch_register(dev, &sw_desc);
318062306a36Sopenharmony_ci	if (IS_ERR(qmp->sw)) {
318162306a36Sopenharmony_ci		dev_err(dev, "Unable to register typec switch: %pe\n", qmp->sw);
318262306a36Sopenharmony_ci		return PTR_ERR(qmp->sw);
318362306a36Sopenharmony_ci	}
318462306a36Sopenharmony_ci
318562306a36Sopenharmony_ci	return devm_add_action_or_reset(dev, qmp_combo_typec_unregister, qmp);
318662306a36Sopenharmony_ci}
318762306a36Sopenharmony_ci#else
318862306a36Sopenharmony_cistatic int qmp_combo_typec_switch_register(struct qmp_combo *qmp)
318962306a36Sopenharmony_ci{
319062306a36Sopenharmony_ci	return 0;
319162306a36Sopenharmony_ci}
319262306a36Sopenharmony_ci#endif
319362306a36Sopenharmony_ci
319462306a36Sopenharmony_ci#if IS_ENABLED(CONFIG_DRM)
319562306a36Sopenharmony_cistatic int qmp_combo_bridge_attach(struct drm_bridge *bridge,
319662306a36Sopenharmony_ci				   enum drm_bridge_attach_flags flags)
319762306a36Sopenharmony_ci{
319862306a36Sopenharmony_ci	struct qmp_combo *qmp = container_of(bridge, struct qmp_combo, bridge);
319962306a36Sopenharmony_ci	struct drm_bridge *next_bridge;
320062306a36Sopenharmony_ci
320162306a36Sopenharmony_ci	if (!(flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR))
320262306a36Sopenharmony_ci		return -EINVAL;
320362306a36Sopenharmony_ci
320462306a36Sopenharmony_ci	next_bridge = devm_drm_of_get_bridge(qmp->dev, qmp->dev->of_node, 0, 0);
320562306a36Sopenharmony_ci	if (IS_ERR(next_bridge)) {
320662306a36Sopenharmony_ci		dev_err(qmp->dev, "failed to acquire drm_bridge: %pe\n", next_bridge);
320762306a36Sopenharmony_ci		return PTR_ERR(next_bridge);
320862306a36Sopenharmony_ci	}
320962306a36Sopenharmony_ci
321062306a36Sopenharmony_ci	return drm_bridge_attach(bridge->encoder, next_bridge, bridge,
321162306a36Sopenharmony_ci				 DRM_BRIDGE_ATTACH_NO_CONNECTOR);
321262306a36Sopenharmony_ci}
321362306a36Sopenharmony_ci
321462306a36Sopenharmony_cistatic const struct drm_bridge_funcs qmp_combo_bridge_funcs = {
321562306a36Sopenharmony_ci	.attach	= qmp_combo_bridge_attach,
321662306a36Sopenharmony_ci};
321762306a36Sopenharmony_ci
321862306a36Sopenharmony_cistatic int qmp_combo_dp_register_bridge(struct qmp_combo *qmp)
321962306a36Sopenharmony_ci{
322062306a36Sopenharmony_ci	qmp->bridge.funcs = &qmp_combo_bridge_funcs;
322162306a36Sopenharmony_ci	qmp->bridge.of_node = qmp->dev->of_node;
322262306a36Sopenharmony_ci
322362306a36Sopenharmony_ci	return devm_drm_bridge_add(qmp->dev, &qmp->bridge);
322462306a36Sopenharmony_ci}
322562306a36Sopenharmony_ci#else
322662306a36Sopenharmony_cistatic int qmp_combo_dp_register_bridge(struct qmp_combo *qmp)
322762306a36Sopenharmony_ci{
322862306a36Sopenharmony_ci	return 0;
322962306a36Sopenharmony_ci}
323062306a36Sopenharmony_ci#endif
323162306a36Sopenharmony_ci
323262306a36Sopenharmony_cistatic int qmp_combo_parse_dt_lecacy_dp(struct qmp_combo *qmp, struct device_node *np)
323362306a36Sopenharmony_ci{
323462306a36Sopenharmony_ci	struct device *dev = qmp->dev;
323562306a36Sopenharmony_ci
323662306a36Sopenharmony_ci	/*
323762306a36Sopenharmony_ci	 * Get memory resources from the DP child node:
323862306a36Sopenharmony_ci	 * Resources are indexed as: tx -> 0; rx -> 1; pcs -> 2;
323962306a36Sopenharmony_ci	 * tx2 -> 3; rx2 -> 4
324062306a36Sopenharmony_ci	 *
324162306a36Sopenharmony_ci	 * Note that only tx/tx2 and pcs (dp_phy) are used by the DP
324262306a36Sopenharmony_ci	 * implementation.
324362306a36Sopenharmony_ci	 */
324462306a36Sopenharmony_ci	qmp->dp_tx = devm_of_iomap(dev, np, 0, NULL);
324562306a36Sopenharmony_ci	if (IS_ERR(qmp->dp_tx))
324662306a36Sopenharmony_ci		return PTR_ERR(qmp->dp_tx);
324762306a36Sopenharmony_ci
324862306a36Sopenharmony_ci	qmp->dp_dp_phy = devm_of_iomap(dev, np, 2, NULL);
324962306a36Sopenharmony_ci	if (IS_ERR(qmp->dp_dp_phy))
325062306a36Sopenharmony_ci		return PTR_ERR(qmp->dp_dp_phy);
325162306a36Sopenharmony_ci
325262306a36Sopenharmony_ci	qmp->dp_tx2 = devm_of_iomap(dev, np, 3, NULL);
325362306a36Sopenharmony_ci	if (IS_ERR(qmp->dp_tx2))
325462306a36Sopenharmony_ci		return PTR_ERR(qmp->dp_tx2);
325562306a36Sopenharmony_ci
325662306a36Sopenharmony_ci	return 0;
325762306a36Sopenharmony_ci}
325862306a36Sopenharmony_ci
325962306a36Sopenharmony_cistatic int qmp_combo_parse_dt_lecacy_usb(struct qmp_combo *qmp, struct device_node *np)
326062306a36Sopenharmony_ci{
326162306a36Sopenharmony_ci	const struct qmp_phy_cfg *cfg = qmp->cfg;
326262306a36Sopenharmony_ci	struct device *dev = qmp->dev;
326362306a36Sopenharmony_ci
326462306a36Sopenharmony_ci	/*
326562306a36Sopenharmony_ci	 * Get memory resources from the USB child node:
326662306a36Sopenharmony_ci	 * Resources are indexed as: tx -> 0; rx -> 1; pcs -> 2;
326762306a36Sopenharmony_ci	 * tx2 -> 3; rx2 -> 4; pcs_misc (optional) -> 5
326862306a36Sopenharmony_ci	 */
326962306a36Sopenharmony_ci	qmp->tx = devm_of_iomap(dev, np, 0, NULL);
327062306a36Sopenharmony_ci	if (IS_ERR(qmp->tx))
327162306a36Sopenharmony_ci		return PTR_ERR(qmp->tx);
327262306a36Sopenharmony_ci
327362306a36Sopenharmony_ci	qmp->rx = devm_of_iomap(dev, np, 1, NULL);
327462306a36Sopenharmony_ci	if (IS_ERR(qmp->rx))
327562306a36Sopenharmony_ci		return PTR_ERR(qmp->rx);
327662306a36Sopenharmony_ci
327762306a36Sopenharmony_ci	qmp->pcs = devm_of_iomap(dev, np, 2, NULL);
327862306a36Sopenharmony_ci	if (IS_ERR(qmp->pcs))
327962306a36Sopenharmony_ci		return PTR_ERR(qmp->pcs);
328062306a36Sopenharmony_ci
328162306a36Sopenharmony_ci	if (cfg->pcs_usb_offset)
328262306a36Sopenharmony_ci		qmp->pcs_usb = qmp->pcs + cfg->pcs_usb_offset;
328362306a36Sopenharmony_ci
328462306a36Sopenharmony_ci	qmp->tx2 = devm_of_iomap(dev, np, 3, NULL);
328562306a36Sopenharmony_ci	if (IS_ERR(qmp->tx2))
328662306a36Sopenharmony_ci		return PTR_ERR(qmp->tx2);
328762306a36Sopenharmony_ci
328862306a36Sopenharmony_ci	qmp->rx2 = devm_of_iomap(dev, np, 4, NULL);
328962306a36Sopenharmony_ci	if (IS_ERR(qmp->rx2))
329062306a36Sopenharmony_ci		return PTR_ERR(qmp->rx2);
329162306a36Sopenharmony_ci
329262306a36Sopenharmony_ci	qmp->pcs_misc = devm_of_iomap(dev, np, 5, NULL);
329362306a36Sopenharmony_ci	if (IS_ERR(qmp->pcs_misc)) {
329462306a36Sopenharmony_ci		dev_vdbg(dev, "PHY pcs_misc-reg not used\n");
329562306a36Sopenharmony_ci		qmp->pcs_misc = NULL;
329662306a36Sopenharmony_ci	}
329762306a36Sopenharmony_ci
329862306a36Sopenharmony_ci	qmp->pipe_clk = devm_get_clk_from_child(dev, np, NULL);
329962306a36Sopenharmony_ci	if (IS_ERR(qmp->pipe_clk)) {
330062306a36Sopenharmony_ci		return dev_err_probe(dev, PTR_ERR(qmp->pipe_clk),
330162306a36Sopenharmony_ci				     "failed to get pipe clock\n");
330262306a36Sopenharmony_ci	}
330362306a36Sopenharmony_ci
330462306a36Sopenharmony_ci	return 0;
330562306a36Sopenharmony_ci}
330662306a36Sopenharmony_ci
330762306a36Sopenharmony_cistatic int qmp_combo_parse_dt_legacy(struct qmp_combo *qmp, struct device_node *usb_np,
330862306a36Sopenharmony_ci					struct device_node *dp_np)
330962306a36Sopenharmony_ci{
331062306a36Sopenharmony_ci	struct platform_device *pdev = to_platform_device(qmp->dev);
331162306a36Sopenharmony_ci	int ret;
331262306a36Sopenharmony_ci
331362306a36Sopenharmony_ci	qmp->serdes = devm_platform_ioremap_resource(pdev, 0);
331462306a36Sopenharmony_ci	if (IS_ERR(qmp->serdes))
331562306a36Sopenharmony_ci		return PTR_ERR(qmp->serdes);
331662306a36Sopenharmony_ci
331762306a36Sopenharmony_ci	qmp->com = devm_platform_ioremap_resource(pdev, 1);
331862306a36Sopenharmony_ci	if (IS_ERR(qmp->com))
331962306a36Sopenharmony_ci		return PTR_ERR(qmp->com);
332062306a36Sopenharmony_ci
332162306a36Sopenharmony_ci	qmp->dp_serdes = devm_platform_ioremap_resource(pdev, 2);
332262306a36Sopenharmony_ci	if (IS_ERR(qmp->dp_serdes))
332362306a36Sopenharmony_ci		return PTR_ERR(qmp->dp_serdes);
332462306a36Sopenharmony_ci
332562306a36Sopenharmony_ci	ret = qmp_combo_parse_dt_lecacy_usb(qmp, usb_np);
332662306a36Sopenharmony_ci	if (ret)
332762306a36Sopenharmony_ci		return ret;
332862306a36Sopenharmony_ci
332962306a36Sopenharmony_ci	ret = qmp_combo_parse_dt_lecacy_dp(qmp, dp_np);
333062306a36Sopenharmony_ci	if (ret)
333162306a36Sopenharmony_ci		return ret;
333262306a36Sopenharmony_ci
333362306a36Sopenharmony_ci	ret = devm_clk_bulk_get_all(qmp->dev, &qmp->clks);
333462306a36Sopenharmony_ci	if (ret < 0)
333562306a36Sopenharmony_ci		return ret;
333662306a36Sopenharmony_ci
333762306a36Sopenharmony_ci	qmp->num_clks = ret;
333862306a36Sopenharmony_ci
333962306a36Sopenharmony_ci	return 0;
334062306a36Sopenharmony_ci}
334162306a36Sopenharmony_ci
334262306a36Sopenharmony_cistatic int qmp_combo_parse_dt(struct qmp_combo *qmp)
334362306a36Sopenharmony_ci{
334462306a36Sopenharmony_ci	struct platform_device *pdev = to_platform_device(qmp->dev);
334562306a36Sopenharmony_ci	const struct qmp_phy_cfg *cfg = qmp->cfg;
334662306a36Sopenharmony_ci	const struct qmp_combo_offsets *offs = cfg->offsets;
334762306a36Sopenharmony_ci	struct device *dev = qmp->dev;
334862306a36Sopenharmony_ci	void __iomem *base;
334962306a36Sopenharmony_ci	int ret;
335062306a36Sopenharmony_ci
335162306a36Sopenharmony_ci	if (!offs)
335262306a36Sopenharmony_ci		return -EINVAL;
335362306a36Sopenharmony_ci
335462306a36Sopenharmony_ci	base = devm_platform_ioremap_resource(pdev, 0);
335562306a36Sopenharmony_ci	if (IS_ERR(base))
335662306a36Sopenharmony_ci		return PTR_ERR(base);
335762306a36Sopenharmony_ci
335862306a36Sopenharmony_ci	qmp->com = base + offs->com;
335962306a36Sopenharmony_ci	qmp->tx = base + offs->txa;
336062306a36Sopenharmony_ci	qmp->rx = base + offs->rxa;
336162306a36Sopenharmony_ci	qmp->tx2 = base + offs->txb;
336262306a36Sopenharmony_ci	qmp->rx2 = base + offs->rxb;
336362306a36Sopenharmony_ci
336462306a36Sopenharmony_ci	qmp->serdes = base + offs->usb3_serdes;
336562306a36Sopenharmony_ci	qmp->pcs_misc = base + offs->usb3_pcs_misc;
336662306a36Sopenharmony_ci	qmp->pcs = base + offs->usb3_pcs;
336762306a36Sopenharmony_ci	qmp->pcs_usb = base + offs->usb3_pcs_usb;
336862306a36Sopenharmony_ci
336962306a36Sopenharmony_ci	qmp->dp_serdes = base + offs->dp_serdes;
337062306a36Sopenharmony_ci	if (offs->dp_txa) {
337162306a36Sopenharmony_ci		qmp->dp_tx = base + offs->dp_txa;
337262306a36Sopenharmony_ci		qmp->dp_tx2 = base + offs->dp_txb;
337362306a36Sopenharmony_ci	} else {
337462306a36Sopenharmony_ci		qmp->dp_tx = base + offs->txa;
337562306a36Sopenharmony_ci		qmp->dp_tx2 = base + offs->txb;
337662306a36Sopenharmony_ci	}
337762306a36Sopenharmony_ci	qmp->dp_dp_phy = base + offs->dp_dp_phy;
337862306a36Sopenharmony_ci
337962306a36Sopenharmony_ci	ret = qmp_combo_clk_init(qmp);
338062306a36Sopenharmony_ci	if (ret)
338162306a36Sopenharmony_ci		return ret;
338262306a36Sopenharmony_ci
338362306a36Sopenharmony_ci	qmp->pipe_clk = devm_clk_get(dev, "usb3_pipe");
338462306a36Sopenharmony_ci	if (IS_ERR(qmp->pipe_clk)) {
338562306a36Sopenharmony_ci		return dev_err_probe(dev, PTR_ERR(qmp->pipe_clk),
338662306a36Sopenharmony_ci				"failed to get usb3_pipe clock\n");
338762306a36Sopenharmony_ci	}
338862306a36Sopenharmony_ci
338962306a36Sopenharmony_ci	return 0;
339062306a36Sopenharmony_ci}
339162306a36Sopenharmony_ci
339262306a36Sopenharmony_cistatic struct phy *qmp_combo_phy_xlate(struct device *dev, struct of_phandle_args *args)
339362306a36Sopenharmony_ci{
339462306a36Sopenharmony_ci	struct qmp_combo *qmp = dev_get_drvdata(dev);
339562306a36Sopenharmony_ci
339662306a36Sopenharmony_ci	if (args->args_count == 0)
339762306a36Sopenharmony_ci		return ERR_PTR(-EINVAL);
339862306a36Sopenharmony_ci
339962306a36Sopenharmony_ci	switch (args->args[0]) {
340062306a36Sopenharmony_ci	case QMP_USB43DP_USB3_PHY:
340162306a36Sopenharmony_ci		return qmp->usb_phy;
340262306a36Sopenharmony_ci	case QMP_USB43DP_DP_PHY:
340362306a36Sopenharmony_ci		return qmp->dp_phy;
340462306a36Sopenharmony_ci	}
340562306a36Sopenharmony_ci
340662306a36Sopenharmony_ci	return ERR_PTR(-EINVAL);
340762306a36Sopenharmony_ci}
340862306a36Sopenharmony_ci
340962306a36Sopenharmony_cistatic int qmp_combo_probe(struct platform_device *pdev)
341062306a36Sopenharmony_ci{
341162306a36Sopenharmony_ci	struct qmp_combo *qmp;
341262306a36Sopenharmony_ci	struct device *dev = &pdev->dev;
341362306a36Sopenharmony_ci	struct device_node *dp_np, *usb_np;
341462306a36Sopenharmony_ci	struct phy_provider *phy_provider;
341562306a36Sopenharmony_ci	int ret;
341662306a36Sopenharmony_ci
341762306a36Sopenharmony_ci	qmp = devm_kzalloc(dev, sizeof(*qmp), GFP_KERNEL);
341862306a36Sopenharmony_ci	if (!qmp)
341962306a36Sopenharmony_ci		return -ENOMEM;
342062306a36Sopenharmony_ci
342162306a36Sopenharmony_ci	qmp->dev = dev;
342262306a36Sopenharmony_ci
342362306a36Sopenharmony_ci	qmp->orientation = TYPEC_ORIENTATION_NORMAL;
342462306a36Sopenharmony_ci
342562306a36Sopenharmony_ci	qmp->cfg = of_device_get_match_data(dev);
342662306a36Sopenharmony_ci	if (!qmp->cfg)
342762306a36Sopenharmony_ci		return -EINVAL;
342862306a36Sopenharmony_ci
342962306a36Sopenharmony_ci	mutex_init(&qmp->phy_mutex);
343062306a36Sopenharmony_ci
343162306a36Sopenharmony_ci	ret = qmp_combo_reset_init(qmp);
343262306a36Sopenharmony_ci	if (ret)
343362306a36Sopenharmony_ci		return ret;
343462306a36Sopenharmony_ci
343562306a36Sopenharmony_ci	ret = qmp_combo_vreg_init(qmp);
343662306a36Sopenharmony_ci	if (ret)
343762306a36Sopenharmony_ci		return ret;
343862306a36Sopenharmony_ci
343962306a36Sopenharmony_ci	ret = qmp_combo_typec_switch_register(qmp);
344062306a36Sopenharmony_ci	if (ret)
344162306a36Sopenharmony_ci		return ret;
344262306a36Sopenharmony_ci
344362306a36Sopenharmony_ci	ret = qmp_combo_dp_register_bridge(qmp);
344462306a36Sopenharmony_ci	if (ret)
344562306a36Sopenharmony_ci		return ret;
344662306a36Sopenharmony_ci
344762306a36Sopenharmony_ci	/* Check for legacy binding with child nodes. */
344862306a36Sopenharmony_ci	usb_np = of_get_child_by_name(dev->of_node, "usb3-phy");
344962306a36Sopenharmony_ci	if (usb_np) {
345062306a36Sopenharmony_ci		dp_np = of_get_child_by_name(dev->of_node, "dp-phy");
345162306a36Sopenharmony_ci		if (!dp_np) {
345262306a36Sopenharmony_ci			of_node_put(usb_np);
345362306a36Sopenharmony_ci			return -EINVAL;
345462306a36Sopenharmony_ci		}
345562306a36Sopenharmony_ci
345662306a36Sopenharmony_ci		ret = qmp_combo_parse_dt_legacy(qmp, usb_np, dp_np);
345762306a36Sopenharmony_ci	} else {
345862306a36Sopenharmony_ci		usb_np = of_node_get(dev->of_node);
345962306a36Sopenharmony_ci		dp_np = of_node_get(dev->of_node);
346062306a36Sopenharmony_ci
346162306a36Sopenharmony_ci		ret = qmp_combo_parse_dt(qmp);
346262306a36Sopenharmony_ci	}
346362306a36Sopenharmony_ci	if (ret)
346462306a36Sopenharmony_ci		goto err_node_put;
346562306a36Sopenharmony_ci
346662306a36Sopenharmony_ci	pm_runtime_set_active(dev);
346762306a36Sopenharmony_ci	ret = devm_pm_runtime_enable(dev);
346862306a36Sopenharmony_ci	if (ret)
346962306a36Sopenharmony_ci		goto err_node_put;
347062306a36Sopenharmony_ci	/*
347162306a36Sopenharmony_ci	 * Prevent runtime pm from being ON by default. Users can enable
347262306a36Sopenharmony_ci	 * it using power/control in sysfs.
347362306a36Sopenharmony_ci	 */
347462306a36Sopenharmony_ci	pm_runtime_forbid(dev);
347562306a36Sopenharmony_ci
347662306a36Sopenharmony_ci	ret = qmp_combo_register_clocks(qmp, usb_np, dp_np);
347762306a36Sopenharmony_ci	if (ret)
347862306a36Sopenharmony_ci		goto err_node_put;
347962306a36Sopenharmony_ci
348062306a36Sopenharmony_ci	qmp->usb_phy = devm_phy_create(dev, usb_np, &qmp_combo_usb_phy_ops);
348162306a36Sopenharmony_ci	if (IS_ERR(qmp->usb_phy)) {
348262306a36Sopenharmony_ci		ret = PTR_ERR(qmp->usb_phy);
348362306a36Sopenharmony_ci		dev_err(dev, "failed to create USB PHY: %d\n", ret);
348462306a36Sopenharmony_ci		goto err_node_put;
348562306a36Sopenharmony_ci	}
348662306a36Sopenharmony_ci
348762306a36Sopenharmony_ci	phy_set_drvdata(qmp->usb_phy, qmp);
348862306a36Sopenharmony_ci
348962306a36Sopenharmony_ci	qmp->dp_phy = devm_phy_create(dev, dp_np, &qmp_combo_dp_phy_ops);
349062306a36Sopenharmony_ci	if (IS_ERR(qmp->dp_phy)) {
349162306a36Sopenharmony_ci		ret = PTR_ERR(qmp->dp_phy);
349262306a36Sopenharmony_ci		dev_err(dev, "failed to create DP PHY: %d\n", ret);
349362306a36Sopenharmony_ci		goto err_node_put;
349462306a36Sopenharmony_ci	}
349562306a36Sopenharmony_ci
349662306a36Sopenharmony_ci	phy_set_drvdata(qmp->dp_phy, qmp);
349762306a36Sopenharmony_ci
349862306a36Sopenharmony_ci	dev_set_drvdata(dev, qmp);
349962306a36Sopenharmony_ci
350062306a36Sopenharmony_ci	if (usb_np == dev->of_node)
350162306a36Sopenharmony_ci		phy_provider = devm_of_phy_provider_register(dev, qmp_combo_phy_xlate);
350262306a36Sopenharmony_ci	else
350362306a36Sopenharmony_ci		phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate);
350462306a36Sopenharmony_ci
350562306a36Sopenharmony_ci	of_node_put(usb_np);
350662306a36Sopenharmony_ci	of_node_put(dp_np);
350762306a36Sopenharmony_ci
350862306a36Sopenharmony_ci	return PTR_ERR_OR_ZERO(phy_provider);
350962306a36Sopenharmony_ci
351062306a36Sopenharmony_cierr_node_put:
351162306a36Sopenharmony_ci	of_node_put(usb_np);
351262306a36Sopenharmony_ci	of_node_put(dp_np);
351362306a36Sopenharmony_ci	return ret;
351462306a36Sopenharmony_ci}
351562306a36Sopenharmony_ci
351662306a36Sopenharmony_cistatic const struct of_device_id qmp_combo_of_match_table[] = {
351762306a36Sopenharmony_ci	{
351862306a36Sopenharmony_ci		.compatible = "qcom,sc7180-qmp-usb3-dp-phy",
351962306a36Sopenharmony_ci		.data = &sc7180_usb3dpphy_cfg,
352062306a36Sopenharmony_ci	},
352162306a36Sopenharmony_ci	{
352262306a36Sopenharmony_ci		.compatible = "qcom,sc7280-qmp-usb3-dp-phy",
352362306a36Sopenharmony_ci		.data = &sm8250_usb3dpphy_cfg,
352462306a36Sopenharmony_ci	},
352562306a36Sopenharmony_ci	{
352662306a36Sopenharmony_ci		.compatible = "qcom,sc8180x-qmp-usb3-dp-phy",
352762306a36Sopenharmony_ci		.data = &sc8180x_usb3dpphy_cfg,
352862306a36Sopenharmony_ci	},
352962306a36Sopenharmony_ci	{
353062306a36Sopenharmony_ci		.compatible = "qcom,sc8280xp-qmp-usb43dp-phy",
353162306a36Sopenharmony_ci		.data = &sc8280xp_usb43dpphy_cfg,
353262306a36Sopenharmony_ci	},
353362306a36Sopenharmony_ci	{
353462306a36Sopenharmony_ci		.compatible = "qcom,sdm845-qmp-usb3-dp-phy",
353562306a36Sopenharmony_ci		.data = &sdm845_usb3dpphy_cfg,
353662306a36Sopenharmony_ci	},
353762306a36Sopenharmony_ci	{
353862306a36Sopenharmony_ci		.compatible = "qcom,sm6350-qmp-usb3-dp-phy",
353962306a36Sopenharmony_ci		.data = &sm6350_usb3dpphy_cfg,
354062306a36Sopenharmony_ci	},
354162306a36Sopenharmony_ci	{
354262306a36Sopenharmony_ci		.compatible = "qcom,sm8150-qmp-usb3-dp-phy",
354362306a36Sopenharmony_ci		.data = &sc8180x_usb3dpphy_cfg,
354462306a36Sopenharmony_ci	},
354562306a36Sopenharmony_ci	{
354662306a36Sopenharmony_ci		.compatible = "qcom,sm8250-qmp-usb3-dp-phy",
354762306a36Sopenharmony_ci		.data = &sm8250_usb3dpphy_cfg,
354862306a36Sopenharmony_ci	},
354962306a36Sopenharmony_ci	{
355062306a36Sopenharmony_ci		.compatible = "qcom,sm8350-qmp-usb3-dp-phy",
355162306a36Sopenharmony_ci		.data = &sm8350_usb3dpphy_cfg,
355262306a36Sopenharmony_ci	},
355362306a36Sopenharmony_ci	{
355462306a36Sopenharmony_ci		.compatible = "qcom,sm8450-qmp-usb3-dp-phy",
355562306a36Sopenharmony_ci		.data = &sm8350_usb3dpphy_cfg,
355662306a36Sopenharmony_ci	},
355762306a36Sopenharmony_ci	{
355862306a36Sopenharmony_ci		.compatible = "qcom,sm8550-qmp-usb3-dp-phy",
355962306a36Sopenharmony_ci		.data = &sm8550_usb3dpphy_cfg,
356062306a36Sopenharmony_ci	},
356162306a36Sopenharmony_ci	{ }
356262306a36Sopenharmony_ci};
356362306a36Sopenharmony_ciMODULE_DEVICE_TABLE(of, qmp_combo_of_match_table);
356462306a36Sopenharmony_ci
356562306a36Sopenharmony_cistatic struct platform_driver qmp_combo_driver = {
356662306a36Sopenharmony_ci	.probe		= qmp_combo_probe,
356762306a36Sopenharmony_ci	.driver = {
356862306a36Sopenharmony_ci		.name	= "qcom-qmp-combo-phy",
356962306a36Sopenharmony_ci		.pm	= &qmp_combo_pm_ops,
357062306a36Sopenharmony_ci		.of_match_table = qmp_combo_of_match_table,
357162306a36Sopenharmony_ci	},
357262306a36Sopenharmony_ci};
357362306a36Sopenharmony_ci
357462306a36Sopenharmony_cimodule_platform_driver(qmp_combo_driver);
357562306a36Sopenharmony_ci
357662306a36Sopenharmony_ciMODULE_AUTHOR("Vivek Gautam <vivek.gautam@codeaurora.org>");
357762306a36Sopenharmony_ciMODULE_DESCRIPTION("Qualcomm QMP USB+DP combo PHY driver");
357862306a36Sopenharmony_ciMODULE_LICENSE("GPL v2");
3579