1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (c) 2017, The Linux Foundation. All rights reserved.
7 #include <linux/clk-provider.h>
8 #include <linux/delay.h>
11 #include <linux/iopoll.h>
12 #include <linux/kernel.h>
13 #include <linux/module.h>
15 #include <linux/of_device.h>
16 #include <linux/of_address.h>
17 #include <linux/phy/phy.h>
18 #include <linux/platform_device.h>
19 #include <linux/regulator/consumer.h>
20 #include <linux/reset.h>
21 #include <linux/slab.h>
23 #include <dt-bindings/phy/phy-qcom-qmp.h>
25 #include "phy-qcom-qmp.h"
26 #include "phy-qcom-qmp-pcs-misc-v3.h"
27 #include "phy-qcom-qmp-pcs-usb-v4.h"
28 #include "phy-qcom-qmp-pcs-usb-v5.h"
29 #include "phy-qcom-qmp-pcs-usb-v6.h"
31 /* QPHY_SW_RESET bit */
32 #define SW_RESET BIT(0)
33 /* QPHY_POWER_DOWN_CONTROL */
34 #define SW_PWRDN BIT(0)
35 /* QPHY_START_CONTROL bits */
36 #define SERDES_START BIT(0)
37 #define PCS_START BIT(1)
38 /* QPHY_PCS_STATUS bit */
39 #define PHYSTATUS BIT(6)
41 /* QPHY_V3_DP_COM_RESET_OVRD_CTRL register bits */
42 /* DP PHY soft reset */
43 #define SW_DPPHY_RESET BIT(0)
44 /* mux to select DP PHY reset control, 0:HW control, 1: software reset */
45 #define SW_DPPHY_RESET_MUX BIT(1)
46 /* USB3 PHY soft reset */
47 #define SW_USB3PHY_RESET BIT(2)
48 /* mux to select USB3 PHY reset control, 0:HW control, 1: software reset */
49 #define SW_USB3PHY_RESET_MUX BIT(3)
51 /* QPHY_V3_DP_COM_PHY_MODE_CTRL register bits */
52 #define USB3_MODE BIT(0) /* enables USB3 mode */
53 #define DP_MODE BIT(1) /* enables DP mode */
55 /* QPHY_PCS_AUTONOMOUS_MODE_CTRL register bits */
56 #define ARCVR_DTCT_EN BIT(0)
57 #define ALFPS_DTCT_EN BIT(1)
58 #define ARCVR_DTCT_EVENT_SEL BIT(4)
60 /* QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR register bits */
61 #define IRQ_CLEAR BIT(0)
63 /* QPHY_V3_PCS_MISC_CLAMP_ENABLE register bits */
64 #define CLAMP_EN BIT(0) /* enables i/o clamp_n */
66 #define PHY_INIT_COMPLETE_TIMEOUT 10000
68 struct qmp_phy_init_tbl {
72 * mask of lanes for which this register is written
73 * for cases when second lane needs different values
78 #define QMP_PHY_INIT_CFG(o, v) \
85 #define QMP_PHY_INIT_CFG_LANE(o, v, l) \
92 /* set of registers with offsets different per-PHY */
93 enum qphy_reg_layout {
98 QPHY_PCS_AUTONOMOUS_MODE_CTRL,
99 QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR,
100 QPHY_PCS_POWER_DOWN_CONTROL,
101 /* Keep last to ensure regs_layout arrays are properly initialized */
105 static const unsigned int qmp_v3_usb3phy_regs_layout[QPHY_LAYOUT_SIZE] = {
106 [QPHY_SW_RESET] = QPHY_V3_PCS_SW_RESET,
107 [QPHY_START_CTRL] = QPHY_V3_PCS_START_CONTROL,
108 [QPHY_PCS_STATUS] = QPHY_V3_PCS_PCS_STATUS,
109 [QPHY_PCS_POWER_DOWN_CONTROL] = QPHY_V3_PCS_POWER_DOWN_CONTROL,
110 [QPHY_PCS_AUTONOMOUS_MODE_CTRL] = QPHY_V3_PCS_AUTONOMOUS_MODE_CTRL,
111 [QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR] = QPHY_V3_PCS_LFPS_RXTERM_IRQ_CLEAR,
114 static const unsigned int qmp_v4_usb3phy_regs_layout[QPHY_LAYOUT_SIZE] = {
115 [QPHY_SW_RESET] = QPHY_V4_PCS_SW_RESET,
116 [QPHY_START_CTRL] = QPHY_V4_PCS_START_CONTROL,
117 [QPHY_PCS_STATUS] = QPHY_V4_PCS_PCS_STATUS1,
118 [QPHY_PCS_POWER_DOWN_CONTROL] = QPHY_V4_PCS_POWER_DOWN_CONTROL,
121 [QPHY_PCS_AUTONOMOUS_MODE_CTRL] = QPHY_V4_PCS_USB3_AUTONOMOUS_MODE_CTRL,
122 [QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR] = QPHY_V4_PCS_USB3_LFPS_RXTERM_IRQ_CLEAR,
125 static const struct qmp_phy_init_tbl qmp_v3_usb3_serdes_tbl[] = {
126 QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_IVCO, 0x07),
127 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYSCLK_EN_SEL, 0x14),
128 QMP_PHY_INIT_CFG(QSERDES_V3_COM_BIAS_EN_CLKBUFLR_EN, 0x08),
129 QMP_PHY_INIT_CFG(QSERDES_V3_COM_CLK_SELECT, 0x30),
130 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYS_CLK_CTRL, 0x02),
131 QMP_PHY_INIT_CFG(QSERDES_V3_COM_RESETSM_CNTRL2, 0x08),
132 QMP_PHY_INIT_CFG(QSERDES_V3_COM_CMN_CONFIG, 0x16),
133 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SVS_MODE_CLK_SEL, 0x01),
134 QMP_PHY_INIT_CFG(QSERDES_V3_COM_HSCLK_SEL, 0x80),
135 QMP_PHY_INIT_CFG(QSERDES_V3_COM_DEC_START_MODE0, 0x82),
136 QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START1_MODE0, 0xab),
137 QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START2_MODE0, 0xea),
138 QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START3_MODE0, 0x02),
139 QMP_PHY_INIT_CFG(QSERDES_V3_COM_CP_CTRL_MODE0, 0x06),
140 QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_RCTRL_MODE0, 0x16),
141 QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_CCTRL_MODE0, 0x36),
142 QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN1_MODE0, 0x00),
143 QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN0_MODE0, 0x3f),
144 QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE2_MODE0, 0x01),
145 QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE1_MODE0, 0xc9),
146 QMP_PHY_INIT_CFG(QSERDES_V3_COM_CORECLK_DIV_MODE0, 0x0a),
147 QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP3_MODE0, 0x00),
148 QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP2_MODE0, 0x34),
149 QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP1_MODE0, 0x15),
150 QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP_EN, 0x04),
151 QMP_PHY_INIT_CFG(QSERDES_V3_COM_CORE_CLK_EN, 0x00),
152 QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP_CFG, 0x00),
153 QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_MAP, 0x00),
154 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYSCLK_BUF_ENABLE, 0x0a),
155 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_EN_CENTER, 0x01),
156 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_PER1, 0x31),
157 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_PER2, 0x01),
158 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_ADJ_PER1, 0x00),
159 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_ADJ_PER2, 0x00),
160 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_STEP_SIZE1, 0x85),
161 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_STEP_SIZE2, 0x07),
164 static const struct qmp_phy_init_tbl qmp_v3_usb3_tx_tbl[] = {
165 QMP_PHY_INIT_CFG(QSERDES_V3_TX_HIGHZ_DRVR_EN, 0x10),
166 QMP_PHY_INIT_CFG(QSERDES_V3_TX_RCV_DETECT_LVL_2, 0x12),
167 QMP_PHY_INIT_CFG(QSERDES_V3_TX_LANE_MODE_1, 0x16),
168 QMP_PHY_INIT_CFG(QSERDES_V3_TX_RES_CODE_LANE_OFFSET_RX, 0x09),
169 QMP_PHY_INIT_CFG(QSERDES_V3_TX_RES_CODE_LANE_OFFSET_TX, 0x06),
172 static const struct qmp_phy_init_tbl qmp_v3_dp_serdes_tbl[] = {
173 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SVS_MODE_CLK_SEL, 0x01),
174 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYSCLK_EN_SEL, 0x37),
175 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYS_CLK_CTRL, 0x02),
176 QMP_PHY_INIT_CFG(QSERDES_V3_COM_CLK_ENABLE1, 0x0e),
177 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYSCLK_BUF_ENABLE, 0x06),
178 QMP_PHY_INIT_CFG(QSERDES_V3_COM_CLK_SELECT, 0x30),
179 QMP_PHY_INIT_CFG(QSERDES_V3_COM_CMN_CONFIG, 0x02),
180 QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START1_MODE0, 0x00),
181 QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN0_MODE0, 0x3f),
182 QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN1_MODE0, 0x00),
183 QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_MAP, 0x00),
184 QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP3_MODE0, 0x00),
185 QMP_PHY_INIT_CFG(QSERDES_V3_COM_BG_TIMER, 0x0a),
186 QMP_PHY_INIT_CFG(QSERDES_V3_COM_CORECLK_DIV_MODE0, 0x0a),
187 QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_CTRL, 0x00),
188 QMP_PHY_INIT_CFG(QSERDES_V3_COM_BIAS_EN_CLKBUFLR_EN, 0x3f),
189 QMP_PHY_INIT_CFG(QSERDES_V3_COM_CORE_CLK_EN, 0x1f),
190 QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_IVCO, 0x07),
191 QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_CCTRL_MODE0, 0x36),
192 QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_RCTRL_MODE0, 0x16),
193 QMP_PHY_INIT_CFG(QSERDES_V3_COM_CP_CTRL_MODE0, 0x06),
196 static const struct qmp_phy_init_tbl qmp_v3_dp_serdes_tbl_rbr[] = {
197 QMP_PHY_INIT_CFG(QSERDES_V3_COM_HSCLK_SEL, 0x0c),
198 QMP_PHY_INIT_CFG(QSERDES_V3_COM_DEC_START_MODE0, 0x69),
199 QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START2_MODE0, 0x80),
200 QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START3_MODE0, 0x07),
201 QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP1_MODE0, 0x6f),
202 QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP2_MODE0, 0x08),
203 QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP_EN, 0x00),
206 static const struct qmp_phy_init_tbl qmp_v3_dp_serdes_tbl_hbr[] = {
207 QMP_PHY_INIT_CFG(QSERDES_V3_COM_HSCLK_SEL, 0x04),
208 QMP_PHY_INIT_CFG(QSERDES_V3_COM_DEC_START_MODE0, 0x69),
209 QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START2_MODE0, 0x80),
210 QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START3_MODE0, 0x07),
211 QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP1_MODE0, 0x0f),
212 QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP2_MODE0, 0x0e),
213 QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP_EN, 0x00),
216 static const struct qmp_phy_init_tbl qmp_v3_dp_serdes_tbl_hbr2[] = {
217 QMP_PHY_INIT_CFG(QSERDES_V3_COM_HSCLK_SEL, 0x00),
218 QMP_PHY_INIT_CFG(QSERDES_V3_COM_DEC_START_MODE0, 0x8c),
219 QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START2_MODE0, 0x00),
220 QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START3_MODE0, 0x0a),
221 QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP1_MODE0, 0x1f),
222 QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP2_MODE0, 0x1c),
223 QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP_EN, 0x00),
226 static const struct qmp_phy_init_tbl qmp_v3_dp_serdes_tbl_hbr3[] = {
227 QMP_PHY_INIT_CFG(QSERDES_V3_COM_HSCLK_SEL, 0x03),
228 QMP_PHY_INIT_CFG(QSERDES_V3_COM_DEC_START_MODE0, 0x69),
229 QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START2_MODE0, 0x80),
230 QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START3_MODE0, 0x07),
231 QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP1_MODE0, 0x2f),
232 QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP2_MODE0, 0x2a),
233 QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP_EN, 0x08),
236 static const struct qmp_phy_init_tbl qmp_v3_dp_tx_tbl[] = {
237 QMP_PHY_INIT_CFG(QSERDES_V3_TX_TRANSCEIVER_BIAS_EN, 0x1a),
238 QMP_PHY_INIT_CFG(QSERDES_V3_TX_VMODE_CTRL1, 0x40),
239 QMP_PHY_INIT_CFG(QSERDES_V3_TX_PRE_STALL_LDO_BOOST_EN, 0x30),
240 QMP_PHY_INIT_CFG(QSERDES_V3_TX_INTERFACE_SELECT, 0x3d),
241 QMP_PHY_INIT_CFG(QSERDES_V3_TX_CLKBUF_ENABLE, 0x0f),
242 QMP_PHY_INIT_CFG(QSERDES_V3_TX_RESET_TSYNC_EN, 0x03),
243 QMP_PHY_INIT_CFG(QSERDES_V3_TX_TRAN_DRVR_EMP_EN, 0x03),
244 QMP_PHY_INIT_CFG(QSERDES_V3_TX_PARRATE_REC_DETECT_IDLE_EN, 0x00),
245 QMP_PHY_INIT_CFG(QSERDES_V3_TX_TX_INTERFACE_MODE, 0x00),
246 QMP_PHY_INIT_CFG(QSERDES_V3_TX_TX_BAND, 0x4),
247 QMP_PHY_INIT_CFG(QSERDES_V3_TX_TX_POL_INV, 0x0a),
248 QMP_PHY_INIT_CFG(QSERDES_V3_TX_TX_DRV_LVL, 0x38),
249 QMP_PHY_INIT_CFG(QSERDES_V3_TX_TX_EMP_POST1_LVL, 0x20),
250 QMP_PHY_INIT_CFG(QSERDES_V3_TX_RES_CODE_LANE_OFFSET_TX, 0x06),
251 QMP_PHY_INIT_CFG(QSERDES_V3_TX_RES_CODE_LANE_OFFSET_RX, 0x07),
254 static const struct qmp_phy_init_tbl qmp_v3_usb3_rx_tbl[] = {
255 QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_FASTLOCK_FO_GAIN, 0x0b),
256 QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0f),
257 QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL3, 0x4e),
258 QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL4, 0x18),
259 QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x77),
260 QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_OFFSET_ADAPTOR_CNTRL2, 0x80),
261 QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_CNTRL, 0x03),
262 QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_DEGLITCH_CNTRL, 0x16),
263 QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x75),
266 static const struct qmp_phy_init_tbl qmp_v3_usb3_pcs_tbl[] = {
268 QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNTRL2, 0x83),
269 QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNT_VAL_L, 0x09),
270 QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNT_VAL_H_TOL, 0xa2),
271 QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_MAN_CODE, 0x40),
272 QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNTRL1, 0x02),
274 /* Lock Det settings */
275 QMP_PHY_INIT_CFG(QPHY_V3_PCS_LOCK_DETECT_CONFIG1, 0xd1),
276 QMP_PHY_INIT_CFG(QPHY_V3_PCS_LOCK_DETECT_CONFIG2, 0x1f),
277 QMP_PHY_INIT_CFG(QPHY_V3_PCS_LOCK_DETECT_CONFIG3, 0x47),
278 QMP_PHY_INIT_CFG(QPHY_V3_PCS_POWER_STATE_CONFIG2, 0x1b),
280 QMP_PHY_INIT_CFG(QPHY_V3_PCS_RX_SIGDET_LVL, 0xba),
281 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V0, 0x9f),
282 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V1, 0x9f),
283 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V2, 0xb7),
284 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V3, 0x4e),
285 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V4, 0x65),
286 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_LS, 0x6b),
287 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V0, 0x15),
288 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V0, 0x0d),
289 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V1, 0x15),
290 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V1, 0x0d),
291 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V2, 0x15),
292 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V2, 0x0d),
293 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V3, 0x15),
294 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V3, 0x1d),
295 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V4, 0x15),
296 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V4, 0x0d),
297 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_LS, 0x15),
298 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_LS, 0x0d),
300 QMP_PHY_INIT_CFG(QPHY_V3_PCS_RATE_SLEW_CNTRL, 0x02),
301 QMP_PHY_INIT_CFG(QPHY_V3_PCS_PWRUP_RESET_DLY_TIME_AUXCLK, 0x04),
302 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TSYNC_RSYNC_TIME, 0x44),
303 QMP_PHY_INIT_CFG(QPHY_V3_PCS_PWRUP_RESET_DLY_TIME_AUXCLK, 0x04),
304 QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_P1U2_L, 0xe7),
305 QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_P1U2_H, 0x03),
306 QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_U3_L, 0x40),
307 QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_U3_H, 0x00),
308 QMP_PHY_INIT_CFG(QPHY_V3_PCS_RXEQTRAINING_WAIT_TIME, 0x75),
309 QMP_PHY_INIT_CFG(QPHY_V3_PCS_LFPS_TX_ECSTART_EQTLOCK, 0x86),
310 QMP_PHY_INIT_CFG(QPHY_V3_PCS_RXEQTRAINING_RUN_TIME, 0x13),
313 static const struct qmp_phy_init_tbl sm6350_usb3_rx_tbl[] = {
314 QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_FASTLOCK_FO_GAIN, 0x0b),
315 QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0f),
316 QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL3, 0x4e),
317 QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL4, 0x18),
318 QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x77),
319 QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_OFFSET_ADAPTOR_CNTRL2, 0x80),
320 QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_CNTRL, 0x03),
321 QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_DEGLITCH_CNTRL, 0x16),
322 QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_MODE_00, 0x05),
323 QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x75),
326 static const struct qmp_phy_init_tbl sm6350_usb3_pcs_tbl[] = {
328 QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNTRL2, 0x83),
329 QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNT_VAL_L, 0x09),
330 QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNT_VAL_H_TOL, 0xa2),
331 QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_MAN_CODE, 0x40),
332 QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNTRL1, 0x02),
334 /* Lock Det settings */
335 QMP_PHY_INIT_CFG(QPHY_V3_PCS_LOCK_DETECT_CONFIG1, 0xd1),
336 QMP_PHY_INIT_CFG(QPHY_V3_PCS_LOCK_DETECT_CONFIG2, 0x1f),
337 QMP_PHY_INIT_CFG(QPHY_V3_PCS_LOCK_DETECT_CONFIG3, 0x47),
338 QMP_PHY_INIT_CFG(QPHY_V3_PCS_POWER_STATE_CONFIG2, 0x1b),
340 QMP_PHY_INIT_CFG(QPHY_V3_PCS_RX_SIGDET_LVL, 0xcc),
341 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V0, 0x9f),
342 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V1, 0x9f),
343 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V2, 0xb7),
344 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V3, 0x4e),
345 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V4, 0x65),
346 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_LS, 0x6b),
347 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V0, 0x15),
348 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V0, 0x0d),
349 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V1, 0x15),
350 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V1, 0x0d),
351 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V2, 0x15),
352 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V2, 0x0d),
353 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V3, 0x15),
354 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V3, 0x1d),
355 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V4, 0x15),
356 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V4, 0x0d),
357 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_LS, 0x15),
358 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_LS, 0x0d),
360 QMP_PHY_INIT_CFG(QPHY_V3_PCS_RATE_SLEW_CNTRL, 0x02),
361 QMP_PHY_INIT_CFG(QPHY_V3_PCS_PWRUP_RESET_DLY_TIME_AUXCLK, 0x04),
362 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TSYNC_RSYNC_TIME, 0x44),
363 QMP_PHY_INIT_CFG(QPHY_V3_PCS_PWRUP_RESET_DLY_TIME_AUXCLK, 0x04),
364 QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_P1U2_L, 0xe7),
365 QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_P1U2_H, 0x03),
366 QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_U3_L, 0x40),
367 QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_U3_H, 0x00),
368 QMP_PHY_INIT_CFG(QPHY_V3_PCS_RXEQTRAINING_WAIT_TIME, 0x75),
369 QMP_PHY_INIT_CFG(QPHY_V3_PCS_LFPS_TX_ECSTART_EQTLOCK, 0x86),
370 QMP_PHY_INIT_CFG(QPHY_V3_PCS_RXEQTRAINING_RUN_TIME, 0x13),
371 QMP_PHY_INIT_CFG(QPHY_V3_PCS_LFPS_DET_HIGH_COUNT_VAL, 0x04),
373 QMP_PHY_INIT_CFG(QPHY_V3_PCS_REFGEN_REQ_CONFIG1, 0x21),
374 QMP_PHY_INIT_CFG(QPHY_V3_PCS_REFGEN_REQ_CONFIG2, 0x60),
377 static const struct qmp_phy_init_tbl sm8150_usb3_serdes_tbl[] = {
378 QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_EN_CENTER, 0x01),
379 QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_PER1, 0x31),
380 QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_PER2, 0x01),
381 QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_STEP_SIZE1_MODE0, 0xde),
382 QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_STEP_SIZE2_MODE0, 0x07),
383 QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_STEP_SIZE1_MODE1, 0xde),
384 QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_STEP_SIZE2_MODE1, 0x07),
385 QMP_PHY_INIT_CFG(QSERDES_V4_COM_SYSCLK_BUF_ENABLE, 0x0a),
386 QMP_PHY_INIT_CFG(QSERDES_V4_COM_CMN_IPTRIM, 0x20),
387 QMP_PHY_INIT_CFG(QSERDES_V4_COM_CP_CTRL_MODE0, 0x06),
388 QMP_PHY_INIT_CFG(QSERDES_V4_COM_CP_CTRL_MODE1, 0x06),
389 QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_RCTRL_MODE0, 0x16),
390 QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_RCTRL_MODE1, 0x16),
391 QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_CCTRL_MODE0, 0x36),
392 QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_CCTRL_MODE1, 0x36),
393 QMP_PHY_INIT_CFG(QSERDES_V4_COM_SYSCLK_EN_SEL, 0x1a),
394 QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP_EN, 0x04),
395 QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP1_MODE0, 0x14),
396 QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP2_MODE0, 0x34),
397 QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP1_MODE1, 0x34),
398 QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP2_MODE1, 0x82),
399 QMP_PHY_INIT_CFG(QSERDES_V4_COM_DEC_START_MODE0, 0x82),
400 QMP_PHY_INIT_CFG(QSERDES_V4_COM_DEC_START_MODE1, 0x82),
401 QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START1_MODE0, 0xab),
402 QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START2_MODE0, 0xea),
403 QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START3_MODE0, 0x02),
404 QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE_MAP, 0x02),
405 QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START1_MODE1, 0xab),
406 QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START2_MODE1, 0xea),
407 QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START3_MODE1, 0x02),
408 QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE1_MODE0, 0x24),
409 QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE1_MODE1, 0x24),
410 QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE2_MODE1, 0x02),
411 QMP_PHY_INIT_CFG(QSERDES_V4_COM_HSCLK_SEL, 0x01),
412 QMP_PHY_INIT_CFG(QSERDES_V4_COM_CORECLK_DIV_MODE1, 0x08),
413 QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE1_MODE0, 0xca),
414 QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE2_MODE0, 0x1e),
415 QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE1_MODE1, 0xca),
416 QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE2_MODE1, 0x1e),
417 QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_HSCLK_SEL, 0x11),
420 static const struct qmp_phy_init_tbl sm8150_usb3_tx_tbl[] = {
421 QMP_PHY_INIT_CFG(QSERDES_V4_TX_RES_CODE_LANE_TX, 0x00),
422 QMP_PHY_INIT_CFG(QSERDES_V4_TX_RES_CODE_LANE_RX, 0x00),
423 QMP_PHY_INIT_CFG(QSERDES_V4_TX_LANE_MODE_1, 0xd5),
424 QMP_PHY_INIT_CFG(QSERDES_V4_TX_RCV_DETECT_LVL_2, 0x12),
425 QMP_PHY_INIT_CFG(QSERDES_V4_TX_PI_QEC_CTRL, 0x20),
428 static const struct qmp_phy_init_tbl sm8150_usb3_rx_tbl[] = {
429 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SO_GAIN, 0x05),
430 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_FO_GAIN, 0x2f),
431 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x7f),
432 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_COUNT_LOW, 0xff),
433 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_COUNT_HIGH, 0x0f),
434 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_PI_CONTROLS, 0x99),
435 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_THRESH1, 0x04),
436 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_THRESH2, 0x08),
437 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_GAIN1, 0x05),
438 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_GAIN2, 0x05),
439 QMP_PHY_INIT_CFG(QSERDES_V4_RX_VGA_CAL_CNTRL1, 0x54),
440 QMP_PHY_INIT_CFG(QSERDES_V4_RX_VGA_CAL_CNTRL2, 0x0e),
441 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0f),
442 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL3, 0x4a),
443 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL4, 0x0a),
444 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_LOW, 0xc0),
445 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_HIGH, 0x00),
446 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x77),
447 QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_CNTRL, 0x04),
448 QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_DEGLITCH_CNTRL, 0x0e),
449 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_LOW, 0xbf),
450 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH, 0xbf),
451 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH2, 0x3f),
452 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH3, 0x7f),
453 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH4, 0x94),
454 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_LOW, 0xdc),
455 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH, 0xdc),
456 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH2, 0x5c),
457 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH3, 0x0b),
458 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH4, 0xb3),
459 QMP_PHY_INIT_CFG(QSERDES_V4_RX_DFE_EN_TIMER, 0x04),
460 QMP_PHY_INIT_CFG(QSERDES_V4_RX_DFE_CTLE_POST_CAL_OFFSET, 0x38),
461 QMP_PHY_INIT_CFG(QSERDES_V4_RX_AUX_DATA_TCOARSE_TFINE, 0xa0),
462 QMP_PHY_INIT_CFG(QSERDES_V4_RX_DCC_CTRL1, 0x0c),
463 QMP_PHY_INIT_CFG(QSERDES_V4_RX_GM_CAL, 0x1f),
464 QMP_PHY_INIT_CFG(QSERDES_V4_RX_VTH_CODE, 0x10),
467 static const struct qmp_phy_init_tbl sm8150_usb3_pcs_tbl[] = {
468 /* Lock Det settings */
469 QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG1, 0xd0),
470 QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG2, 0x07),
471 QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG6, 0x13),
473 QMP_PHY_INIT_CFG(QPHY_V4_PCS_REFGEN_REQ_CONFIG1, 0x21),
474 QMP_PHY_INIT_CFG(QPHY_V4_PCS_RX_SIGDET_LVL, 0xaa),
475 QMP_PHY_INIT_CFG(QPHY_V4_PCS_CDR_RESET_TIME, 0x0a),
476 QMP_PHY_INIT_CFG(QPHY_V4_PCS_ALIGN_DETECT_CONFIG1, 0x88),
477 QMP_PHY_INIT_CFG(QPHY_V4_PCS_ALIGN_DETECT_CONFIG2, 0x13),
478 QMP_PHY_INIT_CFG(QPHY_V4_PCS_PCS_TX_RX_CONFIG, 0x0c),
479 QMP_PHY_INIT_CFG(QPHY_V4_PCS_EQ_CONFIG1, 0x4b),
480 QMP_PHY_INIT_CFG(QPHY_V4_PCS_EQ_CONFIG5, 0x10),
483 static const struct qmp_phy_init_tbl sm8150_usb3_pcs_usb_tbl[] = {
484 QMP_PHY_INIT_CFG(QPHY_V4_PCS_USB3_LFPS_DET_HIGH_COUNT_VAL, 0xf8),
485 QMP_PHY_INIT_CFG(QPHY_V4_PCS_USB3_RXEQTRAINING_DFE_TIME_S2, 0x07),
488 static const struct qmp_phy_init_tbl sm8250_usb3_tx_tbl[] = {
489 QMP_PHY_INIT_CFG(QSERDES_V4_TX_RES_CODE_LANE_TX, 0x60),
490 QMP_PHY_INIT_CFG(QSERDES_V4_TX_RES_CODE_LANE_RX, 0x60),
491 QMP_PHY_INIT_CFG(QSERDES_V4_TX_RES_CODE_LANE_OFFSET_TX, 0x11),
492 QMP_PHY_INIT_CFG(QSERDES_V4_TX_RES_CODE_LANE_OFFSET_RX, 0x02),
493 QMP_PHY_INIT_CFG(QSERDES_V4_TX_LANE_MODE_1, 0xd5),
494 QMP_PHY_INIT_CFG(QSERDES_V4_TX_RCV_DETECT_LVL_2, 0x12),
495 QMP_PHY_INIT_CFG_LANE(QSERDES_V4_TX_PI_QEC_CTRL, 0x40, 1),
496 QMP_PHY_INIT_CFG_LANE(QSERDES_V4_TX_PI_QEC_CTRL, 0x54, 2),
499 static const struct qmp_phy_init_tbl sm8250_usb3_rx_tbl[] = {
500 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SO_GAIN, 0x06),
501 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_FO_GAIN, 0x2f),
502 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x7f),
503 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_COUNT_LOW, 0xff),
504 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_COUNT_HIGH, 0x0f),
505 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_PI_CONTROLS, 0x99),
506 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_THRESH1, 0x04),
507 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_THRESH2, 0x08),
508 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_GAIN1, 0x05),
509 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_GAIN2, 0x05),
510 QMP_PHY_INIT_CFG(QSERDES_V4_RX_VGA_CAL_CNTRL1, 0x54),
511 QMP_PHY_INIT_CFG(QSERDES_V4_RX_VGA_CAL_CNTRL2, 0x0c),
512 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0f),
513 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL3, 0x4a),
514 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL4, 0x0a),
515 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_LOW, 0xc0),
516 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_HIGH, 0x00),
517 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x77),
518 QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_CNTRL, 0x04),
519 QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_DEGLITCH_CNTRL, 0x0e),
520 QMP_PHY_INIT_CFG_LANE(QSERDES_V4_RX_RX_MODE_00_LOW, 0xff, 1),
521 QMP_PHY_INIT_CFG_LANE(QSERDES_V4_RX_RX_MODE_00_LOW, 0x7f, 2),
522 QMP_PHY_INIT_CFG_LANE(QSERDES_V4_RX_RX_MODE_00_HIGH, 0x7f, 1),
523 QMP_PHY_INIT_CFG_LANE(QSERDES_V4_RX_RX_MODE_00_HIGH, 0xff, 2),
524 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH2, 0x7f),
525 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH3, 0x7f),
526 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH4, 0x97),
527 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_LOW, 0xdc),
528 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH, 0xdc),
529 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH2, 0x5c),
530 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH3, 0x7b),
531 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH4, 0xb4),
532 QMP_PHY_INIT_CFG(QSERDES_V4_RX_DFE_EN_TIMER, 0x04),
533 QMP_PHY_INIT_CFG(QSERDES_V4_RX_DFE_CTLE_POST_CAL_OFFSET, 0x38),
534 QMP_PHY_INIT_CFG(QSERDES_V4_RX_AUX_DATA_TCOARSE_TFINE, 0xa0),
535 QMP_PHY_INIT_CFG(QSERDES_V4_RX_DCC_CTRL1, 0x0c),
536 QMP_PHY_INIT_CFG(QSERDES_V4_RX_GM_CAL, 0x1f),
537 QMP_PHY_INIT_CFG(QSERDES_V4_RX_VTH_CODE, 0x10),
540 static const struct qmp_phy_init_tbl sm8250_usb3_pcs_tbl[] = {
541 QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG1, 0xd0),
542 QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG2, 0x07),
543 QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG3, 0x20),
544 QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG6, 0x13),
545 QMP_PHY_INIT_CFG(QPHY_V4_PCS_REFGEN_REQ_CONFIG1, 0x21),
546 QMP_PHY_INIT_CFG(QPHY_V4_PCS_RX_SIGDET_LVL, 0xa9),
547 QMP_PHY_INIT_CFG(QPHY_V4_PCS_CDR_RESET_TIME, 0x0a),
548 QMP_PHY_INIT_CFG(QPHY_V4_PCS_ALIGN_DETECT_CONFIG1, 0x88),
549 QMP_PHY_INIT_CFG(QPHY_V4_PCS_ALIGN_DETECT_CONFIG2, 0x13),
550 QMP_PHY_INIT_CFG(QPHY_V4_PCS_PCS_TX_RX_CONFIG, 0x0c),
551 QMP_PHY_INIT_CFG(QPHY_V4_PCS_EQ_CONFIG1, 0x4b),
552 QMP_PHY_INIT_CFG(QPHY_V4_PCS_EQ_CONFIG5, 0x10),
555 static const struct qmp_phy_init_tbl sm8250_usb3_pcs_usb_tbl[] = {
556 QMP_PHY_INIT_CFG(QPHY_V4_PCS_USB3_LFPS_DET_HIGH_COUNT_VAL, 0xf8),
557 QMP_PHY_INIT_CFG(QPHY_V4_PCS_USB3_RXEQTRAINING_DFE_TIME_S2, 0x07),
560 static const struct qmp_phy_init_tbl sm8350_usb3_tx_tbl[] = {
561 QMP_PHY_INIT_CFG(QSERDES_V5_TX_RES_CODE_LANE_TX, 0x00),
562 QMP_PHY_INIT_CFG(QSERDES_V5_TX_RES_CODE_LANE_RX, 0x00),
563 QMP_PHY_INIT_CFG(QSERDES_V5_TX_RES_CODE_LANE_OFFSET_TX, 0x16),
564 QMP_PHY_INIT_CFG(QSERDES_V5_TX_RES_CODE_LANE_OFFSET_RX, 0x0e),
565 QMP_PHY_INIT_CFG(QSERDES_V5_TX_LANE_MODE_1, 0x35),
566 QMP_PHY_INIT_CFG(QSERDES_V5_TX_LANE_MODE_3, 0x3f),
567 QMP_PHY_INIT_CFG(QSERDES_V5_TX_LANE_MODE_4, 0x7f),
568 QMP_PHY_INIT_CFG(QSERDES_V5_TX_LANE_MODE_5, 0x3f),
569 QMP_PHY_INIT_CFG(QSERDES_V5_TX_RCV_DETECT_LVL_2, 0x12),
570 QMP_PHY_INIT_CFG(QSERDES_V5_TX_PI_QEC_CTRL, 0x21),
573 static const struct qmp_phy_init_tbl sm8350_usb3_rx_tbl[] = {
574 QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_FO_GAIN, 0x0a),
575 QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_SO_GAIN, 0x05),
576 QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_FASTLOCK_FO_GAIN, 0x2f),
577 QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x7f),
578 QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_FASTLOCK_COUNT_LOW, 0xff),
579 QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_FASTLOCK_COUNT_HIGH, 0x0f),
580 QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_PI_CONTROLS, 0x99),
581 QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_SB2_THRESH1, 0x08),
582 QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_SB2_THRESH2, 0x08),
583 QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_SB2_GAIN1, 0x00),
584 QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_SB2_GAIN2, 0x04),
585 QMP_PHY_INIT_CFG(QSERDES_V5_RX_VGA_CAL_CNTRL1, 0x54),
586 QMP_PHY_INIT_CFG(QSERDES_V5_RX_VGA_CAL_CNTRL2, 0x0f),
587 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0f),
588 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_EQU_ADAPTOR_CNTRL3, 0x4a),
589 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_EQU_ADAPTOR_CNTRL4, 0x0a),
590 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_IDAC_TSETTLE_LOW, 0xc0),
591 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_IDAC_TSETTLE_HIGH, 0x00),
592 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x47),
593 QMP_PHY_INIT_CFG(QSERDES_V5_RX_SIGDET_CNTRL, 0x04),
594 QMP_PHY_INIT_CFG(QSERDES_V5_RX_SIGDET_DEGLITCH_CNTRL, 0x0e),
595 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_00_LOW, 0xbb),
596 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_00_HIGH, 0x7b),
597 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_00_HIGH2, 0xbb),
598 QMP_PHY_INIT_CFG_LANE(QSERDES_V5_RX_RX_MODE_00_HIGH3, 0x3d, 1),
599 QMP_PHY_INIT_CFG_LANE(QSERDES_V5_RX_RX_MODE_00_HIGH3, 0x3c, 2),
600 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_00_HIGH4, 0xdb),
601 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_01_LOW, 0x64),
602 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_01_HIGH, 0x24),
603 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_01_HIGH2, 0xd2),
604 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_01_HIGH3, 0x13),
605 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_01_HIGH4, 0xa9),
606 QMP_PHY_INIT_CFG(QSERDES_V5_RX_DFE_EN_TIMER, 0x04),
607 QMP_PHY_INIT_CFG(QSERDES_V5_RX_DFE_CTLE_POST_CAL_OFFSET, 0x38),
608 QMP_PHY_INIT_CFG(QSERDES_V5_RX_AUX_DATA_TCOARSE_TFINE, 0xa0),
609 QMP_PHY_INIT_CFG(QSERDES_V5_RX_DCC_CTRL1, 0x0c),
610 QMP_PHY_INIT_CFG(QSERDES_V5_RX_GM_CAL, 0x00),
611 QMP_PHY_INIT_CFG(QSERDES_V5_RX_VTH_CODE, 0x10),
614 static const struct qmp_phy_init_tbl sm8350_usb3_pcs_tbl[] = {
615 QMP_PHY_INIT_CFG(QPHY_V4_PCS_RCVR_DTCT_DLY_P1U2_L, 0xe7),
616 QMP_PHY_INIT_CFG(QPHY_V4_PCS_RCVR_DTCT_DLY_P1U2_H, 0x03),
617 QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG1, 0xd0),
618 QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG2, 0x07),
619 QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG3, 0x20),
620 QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG6, 0x13),
621 QMP_PHY_INIT_CFG(QPHY_V4_PCS_REFGEN_REQ_CONFIG1, 0x21),
622 QMP_PHY_INIT_CFG(QPHY_V4_PCS_RX_SIGDET_LVL, 0xaa),
623 QMP_PHY_INIT_CFG(QPHY_V4_PCS_CDR_RESET_TIME, 0x0a),
624 QMP_PHY_INIT_CFG(QPHY_V4_PCS_ALIGN_DETECT_CONFIG1, 0x88),
625 QMP_PHY_INIT_CFG(QPHY_V4_PCS_ALIGN_DETECT_CONFIG2, 0x13),
626 QMP_PHY_INIT_CFG(QPHY_V4_PCS_PCS_TX_RX_CONFIG, 0x0c),
627 QMP_PHY_INIT_CFG(QPHY_V4_PCS_EQ_CONFIG1, 0x4b),
628 QMP_PHY_INIT_CFG(QPHY_V4_PCS_EQ_CONFIG5, 0x10),
631 static const struct qmp_phy_init_tbl sm8350_usb3_pcs_usb_tbl[] = {
632 QMP_PHY_INIT_CFG(QPHY_V5_PCS_USB3_RCVR_DTCT_DLY_U3_L, 0x40),
633 QMP_PHY_INIT_CFG(QPHY_V5_PCS_USB3_RCVR_DTCT_DLY_U3_H, 0x00),
634 QMP_PHY_INIT_CFG(QPHY_V5_PCS_USB3_LFPS_DET_HIGH_COUNT_VAL, 0xf8),
635 QMP_PHY_INIT_CFG(QPHY_V5_PCS_USB3_RXEQTRAINING_DFE_TIME_S2, 0x07),
638 static const struct qmp_phy_init_tbl sm8550_usb3_serdes_tbl[] = {
639 QMP_PHY_INIT_CFG(QSERDES_V6_COM_SSC_STEP_SIZE1_MODE1, 0xc0),
640 QMP_PHY_INIT_CFG(QSERDES_V6_COM_SSC_STEP_SIZE2_MODE1, 0x01),
641 QMP_PHY_INIT_CFG(QSERDES_V6_COM_CP_CTRL_MODE1, 0x02),
642 QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_RCTRL_MODE1, 0x16),
643 QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_CCTRL_MODE1, 0x36),
644 QMP_PHY_INIT_CFG(QSERDES_V6_COM_CORECLK_DIV_MODE1, 0x04),
645 QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP1_MODE1, 0x16),
646 QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP2_MODE1, 0x41),
647 QMP_PHY_INIT_CFG(QSERDES_V6_COM_DEC_START_MODE1, 0x41),
648 QMP_PHY_INIT_CFG(QSERDES_V6_COM_DEC_START_MSB_MODE1, 0x00),
649 QMP_PHY_INIT_CFG(QSERDES_V6_COM_DIV_FRAC_START1_MODE1, 0x55),
650 QMP_PHY_INIT_CFG(QSERDES_V6_COM_DIV_FRAC_START2_MODE1, 0x75),
651 QMP_PHY_INIT_CFG(QSERDES_V6_COM_DIV_FRAC_START3_MODE1, 0x01),
652 QMP_PHY_INIT_CFG(QSERDES_V6_COM_HSCLK_SEL_1, 0x01),
653 QMP_PHY_INIT_CFG(QSERDES_V6_COM_VCO_TUNE1_MODE1, 0x25),
654 QMP_PHY_INIT_CFG(QSERDES_V6_COM_VCO_TUNE2_MODE1, 0x02),
655 QMP_PHY_INIT_CFG(QSERDES_V6_COM_BIN_VCOCAL_CMP_CODE1_MODE1, 0x5c),
656 QMP_PHY_INIT_CFG(QSERDES_V6_COM_BIN_VCOCAL_CMP_CODE2_MODE1, 0x0f),
657 QMP_PHY_INIT_CFG(QSERDES_V6_COM_BIN_VCOCAL_CMP_CODE1_MODE0, 0x5c),
658 QMP_PHY_INIT_CFG(QSERDES_V6_COM_BIN_VCOCAL_CMP_CODE2_MODE0, 0x0f),
659 QMP_PHY_INIT_CFG(QSERDES_V6_COM_SSC_STEP_SIZE1_MODE0, 0xc0),
660 QMP_PHY_INIT_CFG(QSERDES_V6_COM_SSC_STEP_SIZE2_MODE0, 0x01),
661 QMP_PHY_INIT_CFG(QSERDES_V6_COM_CP_CTRL_MODE0, 0x02),
662 QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_RCTRL_MODE0, 0x16),
663 QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_CCTRL_MODE0, 0x36),
664 QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP1_MODE0, 0x08),
665 QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP2_MODE0, 0x1a),
666 QMP_PHY_INIT_CFG(QSERDES_V6_COM_DEC_START_MODE0, 0x41),
667 QMP_PHY_INIT_CFG(QSERDES_V6_COM_DEC_START_MSB_MODE0, 0x00),
668 QMP_PHY_INIT_CFG(QSERDES_V6_COM_DIV_FRAC_START1_MODE0, 0x55),
669 QMP_PHY_INIT_CFG(QSERDES_V6_COM_DIV_FRAC_START2_MODE0, 0x75),
670 QMP_PHY_INIT_CFG(QSERDES_V6_COM_DIV_FRAC_START3_MODE0, 0x01),
671 QMP_PHY_INIT_CFG(QSERDES_V6_COM_VCO_TUNE1_MODE0, 0x25),
672 QMP_PHY_INIT_CFG(QSERDES_V6_COM_VCO_TUNE2_MODE0, 0x02),
673 QMP_PHY_INIT_CFG(QSERDES_V6_COM_BG_TIMER, 0x0a),
674 QMP_PHY_INIT_CFG(QSERDES_V6_COM_SSC_EN_CENTER, 0x01),
675 QMP_PHY_INIT_CFG(QSERDES_V6_COM_SSC_PER1, 0x62),
676 QMP_PHY_INIT_CFG(QSERDES_V6_COM_SSC_PER2, 0x02),
677 QMP_PHY_INIT_CFG(QSERDES_V6_COM_SYSCLK_BUF_ENABLE, 0x0c),
678 QMP_PHY_INIT_CFG(QSERDES_V6_COM_SYSCLK_EN_SEL, 0x1a),
679 QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP_CFG, 0x14),
680 QMP_PHY_INIT_CFG(QSERDES_V6_COM_VCO_TUNE_MAP, 0x04),
681 QMP_PHY_INIT_CFG(QSERDES_V6_COM_CORE_CLK_EN, 0x20),
682 QMP_PHY_INIT_CFG(QSERDES_V6_COM_CMN_CONFIG_1, 0x16),
683 QMP_PHY_INIT_CFG(QSERDES_V6_COM_AUTO_GAIN_ADJ_CTRL_1, 0xb6),
684 QMP_PHY_INIT_CFG(QSERDES_V6_COM_AUTO_GAIN_ADJ_CTRL_2, 0x4b),
685 QMP_PHY_INIT_CFG(QSERDES_V6_COM_AUTO_GAIN_ADJ_CTRL_3, 0x37),
686 QMP_PHY_INIT_CFG(QSERDES_V6_COM_ADDITIONAL_MISC, 0x0c),
689 static const struct qmp_phy_init_tbl sm8550_usb3_tx_tbl[] = {
690 QMP_PHY_INIT_CFG(QSERDES_V6_TX_RES_CODE_LANE_TX, 0x00),
691 QMP_PHY_INIT_CFG(QSERDES_V6_TX_RES_CODE_LANE_RX, 0x00),
692 QMP_PHY_INIT_CFG(QSERDES_V6_TX_RES_CODE_LANE_OFFSET_TX, 0x1f),
693 QMP_PHY_INIT_CFG(QSERDES_V6_TX_RES_CODE_LANE_OFFSET_RX, 0x09),
694 QMP_PHY_INIT_CFG(QSERDES_V6_TX_LANE_MODE_1, 0xf5),
695 QMP_PHY_INIT_CFG(QSERDES_V6_TX_LANE_MODE_3, 0x3f),
696 QMP_PHY_INIT_CFG(QSERDES_V6_TX_LANE_MODE_4, 0x3f),
697 QMP_PHY_INIT_CFG(QSERDES_V6_TX_LANE_MODE_5, 0x5f),
698 QMP_PHY_INIT_CFG(QSERDES_V6_TX_RCV_DETECT_LVL_2, 0x12),
699 QMP_PHY_INIT_CFG_LANE(QSERDES_V6_TX_PI_QEC_CTRL, 0x21, 1),
700 QMP_PHY_INIT_CFG_LANE(QSERDES_V6_TX_PI_QEC_CTRL, 0x05, 2),
703 static const struct qmp_phy_init_tbl sm8550_usb3_rx_tbl[] = {
704 QMP_PHY_INIT_CFG(QSERDES_V6_RX_UCDR_FO_GAIN, 0x0a),
705 QMP_PHY_INIT_CFG(QSERDES_V6_RX_UCDR_SO_GAIN, 0x06),
706 QMP_PHY_INIT_CFG(QSERDES_V6_RX_UCDR_FASTLOCK_FO_GAIN, 0x2f),
707 QMP_PHY_INIT_CFG(QSERDES_V6_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x7f),
708 QMP_PHY_INIT_CFG(QSERDES_V6_RX_UCDR_FASTLOCK_COUNT_LOW, 0xff),
709 QMP_PHY_INIT_CFG(QSERDES_V6_RX_UCDR_FASTLOCK_COUNT_HIGH, 0x0f),
710 QMP_PHY_INIT_CFG(QSERDES_V6_RX_UCDR_PI_CONTROLS, 0x99),
711 QMP_PHY_INIT_CFG(QSERDES_V6_RX_UCDR_SB2_THRESH1, 0x08),
712 QMP_PHY_INIT_CFG(QSERDES_V6_RX_UCDR_SB2_THRESH2, 0x08),
713 QMP_PHY_INIT_CFG(QSERDES_V6_RX_UCDR_SB2_GAIN1, 0x00),
714 QMP_PHY_INIT_CFG(QSERDES_V6_RX_UCDR_SB2_GAIN2, 0x0a),
715 QMP_PHY_INIT_CFG(QSERDES_V6_RX_AUX_DATA_TCOARSE_TFINE, 0xa0),
716 QMP_PHY_INIT_CFG(QSERDES_V6_RX_VGA_CAL_CNTRL1, 0x54),
717 QMP_PHY_INIT_CFG(QSERDES_V6_RX_VGA_CAL_CNTRL2, 0x0f),
718 QMP_PHY_INIT_CFG(QSERDES_V6_RX_GM_CAL, 0x13),
719 QMP_PHY_INIT_CFG(QSERDES_V6_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0f),
720 QMP_PHY_INIT_CFG(QSERDES_V6_RX_RX_EQU_ADAPTOR_CNTRL3, 0x4a),
721 QMP_PHY_INIT_CFG(QSERDES_V6_RX_RX_EQU_ADAPTOR_CNTRL4, 0x0a),
722 QMP_PHY_INIT_CFG(QSERDES_V6_RX_RX_IDAC_TSETTLE_LOW, 0x07),
723 QMP_PHY_INIT_CFG(QSERDES_V6_RX_RX_IDAC_TSETTLE_HIGH, 0x00),
724 QMP_PHY_INIT_CFG(QSERDES_V6_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x47),
725 QMP_PHY_INIT_CFG(QSERDES_V6_RX_SIGDET_CNTRL, 0x04),
726 QMP_PHY_INIT_CFG(QSERDES_V6_RX_SIGDET_DEGLITCH_CNTRL, 0x0e),
727 QMP_PHY_INIT_CFG(QSERDES_V6_RX_RX_MODE_01_LOW, 0xdc),
728 QMP_PHY_INIT_CFG(QSERDES_V6_RX_RX_MODE_01_HIGH, 0x5c),
729 QMP_PHY_INIT_CFG(QSERDES_V6_RX_RX_MODE_01_HIGH2, 0x9c),
730 QMP_PHY_INIT_CFG(QSERDES_V6_RX_RX_MODE_01_HIGH3, 0x1d),
731 QMP_PHY_INIT_CFG(QSERDES_V6_RX_RX_MODE_01_HIGH4, 0x09),
732 QMP_PHY_INIT_CFG(QSERDES_V6_RX_DFE_EN_TIMER, 0x04),
733 QMP_PHY_INIT_CFG(QSERDES_V6_RX_DFE_CTLE_POST_CAL_OFFSET, 0x38),
734 QMP_PHY_INIT_CFG(QSERDES_V6_RX_DCC_CTRL1, 0x0c),
735 QMP_PHY_INIT_CFG(QSERDES_V6_RX_VTH_CODE, 0x10),
736 QMP_PHY_INIT_CFG(QSERDES_V6_RX_SIGDET_CAL_CTRL1, 0x14),
737 QMP_PHY_INIT_CFG(QSERDES_V6_RX_SIGDET_CAL_TRIM, 0x08),
739 QMP_PHY_INIT_CFG_LANE(QSERDES_V6_RX_RX_MODE_00_LOW, 0x3f, 1),
740 QMP_PHY_INIT_CFG_LANE(QSERDES_V6_RX_RX_MODE_00_HIGH, 0xbf, 1),
741 QMP_PHY_INIT_CFG_LANE(QSERDES_V6_RX_RX_MODE_00_HIGH2, 0xff, 1),
742 QMP_PHY_INIT_CFG_LANE(QSERDES_V6_RX_RX_MODE_00_HIGH3, 0xdf, 1),
743 QMP_PHY_INIT_CFG_LANE(QSERDES_V6_RX_RX_MODE_00_HIGH4, 0xed, 1),
745 QMP_PHY_INIT_CFG_LANE(QSERDES_V6_RX_RX_MODE_00_LOW, 0xbf, 2),
746 QMP_PHY_INIT_CFG_LANE(QSERDES_V6_RX_RX_MODE_00_HIGH, 0xbf, 2),
747 QMP_PHY_INIT_CFG_LANE(QSERDES_V6_RX_RX_MODE_00_HIGH2, 0xbf, 2),
748 QMP_PHY_INIT_CFG_LANE(QSERDES_V6_RX_RX_MODE_00_HIGH3, 0xdf, 2),
749 QMP_PHY_INIT_CFG_LANE(QSERDES_V6_RX_RX_MODE_00_HIGH4, 0xfd, 2),
752 static const struct qmp_phy_init_tbl sm8550_usb3_pcs_tbl[] = {
753 QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_LOCK_DETECT_CONFIG1, 0xc4),
754 QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_LOCK_DETECT_CONFIG2, 0x89),
755 QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_LOCK_DETECT_CONFIG3, 0x20),
756 QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_LOCK_DETECT_CONFIG6, 0x13),
757 QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_REFGEN_REQ_CONFIG1, 0x21),
758 QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_RX_SIGDET_LVL, 0x99),
759 QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_RCVR_DTCT_DLY_P1U2_L, 0xe7),
760 QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_RCVR_DTCT_DLY_P1U2_H, 0x03),
761 QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_CDR_RESET_TIME, 0x0a),
762 QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_ALIGN_DETECT_CONFIG1, 0x88),
763 QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_ALIGN_DETECT_CONFIG2, 0x13),
764 QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_PCS_TX_RX_CONFIG, 0x0c),
765 QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_EQ_CONFIG1, 0x4b),
766 QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_EQ_CONFIG5, 0x10),
767 QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_USB3_POWER_STATE_CONFIG1, 0x68),
770 static const struct qmp_phy_init_tbl sm8550_usb3_pcs_usb_tbl[] = {
771 QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_USB3_LFPS_DET_HIGH_COUNT_VAL, 0xf8),
772 QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_USB3_RXEQTRAINING_DFE_TIME_S2, 0x07),
773 QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_USB3_RCVR_DTCT_DLY_U3_L, 0x40),
774 QMP_PHY_INIT_CFG(QPHY_USB_V6_PCS_USB3_RCVR_DTCT_DLY_U3_H, 0x00),
777 static const struct qmp_phy_init_tbl qmp_v4_dp_serdes_tbl[] = {
778 QMP_PHY_INIT_CFG(QSERDES_V4_COM_SVS_MODE_CLK_SEL, 0x05),
779 QMP_PHY_INIT_CFG(QSERDES_V4_COM_SYSCLK_EN_SEL, 0x3b),
780 QMP_PHY_INIT_CFG(QSERDES_V4_COM_SYS_CLK_CTRL, 0x02),
781 QMP_PHY_INIT_CFG(QSERDES_V4_COM_CLK_ENABLE1, 0x0c),
782 QMP_PHY_INIT_CFG(QSERDES_V4_COM_SYSCLK_BUF_ENABLE, 0x06),
783 QMP_PHY_INIT_CFG(QSERDES_V4_COM_CLK_SELECT, 0x30),
784 QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_IVCO, 0x0f),
785 QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_CCTRL_MODE0, 0x36),
786 QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_RCTRL_MODE0, 0x16),
787 QMP_PHY_INIT_CFG(QSERDES_V4_COM_CP_CTRL_MODE0, 0x06),
788 QMP_PHY_INIT_CFG(QSERDES_V4_COM_CMN_CONFIG, 0x02),
789 QMP_PHY_INIT_CFG(QSERDES_V4_COM_INTEGLOOP_GAIN0_MODE0, 0x3f),
790 QMP_PHY_INIT_CFG(QSERDES_V4_COM_INTEGLOOP_GAIN1_MODE0, 0x00),
791 QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE_MAP, 0x00),
792 QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START1_MODE0, 0x00),
793 QMP_PHY_INIT_CFG(QSERDES_V4_COM_BG_TIMER, 0x0a),
794 QMP_PHY_INIT_CFG(QSERDES_V4_COM_CORECLK_DIV_MODE0, 0x0a),
795 QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE_CTRL, 0x00),
796 QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIAS_EN_CLKBUFLR_EN, 0x17),
797 QMP_PHY_INIT_CFG(QSERDES_V4_COM_CORE_CLK_EN, 0x1f),
800 static const struct qmp_phy_init_tbl qmp_v4_dp_serdes_tbl_rbr[] = {
801 QMP_PHY_INIT_CFG(QSERDES_V4_COM_HSCLK_SEL, 0x05),
802 QMP_PHY_INIT_CFG(QSERDES_V4_COM_DEC_START_MODE0, 0x69),
803 QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START2_MODE0, 0x80),
804 QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START3_MODE0, 0x07),
805 QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP1_MODE0, 0x6f),
806 QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP2_MODE0, 0x08),
807 QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP_EN, 0x04),
810 static const struct qmp_phy_init_tbl qmp_v4_dp_serdes_tbl_hbr[] = {
811 QMP_PHY_INIT_CFG(QSERDES_V4_COM_HSCLK_SEL, 0x03),
812 QMP_PHY_INIT_CFG(QSERDES_V4_COM_DEC_START_MODE0, 0x69),
813 QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START2_MODE0, 0x80),
814 QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START3_MODE0, 0x07),
815 QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP1_MODE0, 0x0f),
816 QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP2_MODE0, 0x0e),
817 QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP_EN, 0x08),
820 static const struct qmp_phy_init_tbl qmp_v4_dp_serdes_tbl_hbr2[] = {
821 QMP_PHY_INIT_CFG(QSERDES_V4_COM_HSCLK_SEL, 0x01),
822 QMP_PHY_INIT_CFG(QSERDES_V4_COM_DEC_START_MODE0, 0x8c),
823 QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START2_MODE0, 0x00),
824 QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START3_MODE0, 0x0a),
825 QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP1_MODE0, 0x1f),
826 QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP2_MODE0, 0x1c),
827 QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP_EN, 0x08),
830 static const struct qmp_phy_init_tbl qmp_v4_dp_serdes_tbl_hbr3[] = {
831 QMP_PHY_INIT_CFG(QSERDES_V4_COM_HSCLK_SEL, 0x00),
832 QMP_PHY_INIT_CFG(QSERDES_V4_COM_DEC_START_MODE0, 0x69),
833 QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START2_MODE0, 0x80),
834 QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START3_MODE0, 0x07),
835 QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP1_MODE0, 0x2f),
836 QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP2_MODE0, 0x2a),
837 QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP_EN, 0x08),
840 static const struct qmp_phy_init_tbl qmp_v4_dp_tx_tbl[] = {
841 QMP_PHY_INIT_CFG(QSERDES_V4_TX_VMODE_CTRL1, 0x40),
842 QMP_PHY_INIT_CFG(QSERDES_V4_TX_PRE_STALL_LDO_BOOST_EN, 0x30),
843 QMP_PHY_INIT_CFG(QSERDES_V4_TX_INTERFACE_SELECT, 0x3b),
844 QMP_PHY_INIT_CFG(QSERDES_V4_TX_CLKBUF_ENABLE, 0x0f),
845 QMP_PHY_INIT_CFG(QSERDES_V4_TX_RESET_TSYNC_EN, 0x03),
846 QMP_PHY_INIT_CFG(QSERDES_V4_TX_TRAN_DRVR_EMP_EN, 0x0f),
847 QMP_PHY_INIT_CFG(QSERDES_V4_TX_PARRATE_REC_DETECT_IDLE_EN, 0x00),
848 QMP_PHY_INIT_CFG(QSERDES_V4_TX_TX_INTERFACE_MODE, 0x00),
849 QMP_PHY_INIT_CFG(QSERDES_V4_TX_RES_CODE_LANE_OFFSET_TX, 0x11),
850 QMP_PHY_INIT_CFG(QSERDES_V4_TX_RES_CODE_LANE_OFFSET_RX, 0x11),
851 QMP_PHY_INIT_CFG(QSERDES_V4_TX_TX_BAND, 0x4),
852 QMP_PHY_INIT_CFG(QSERDES_V4_TX_TX_POL_INV, 0x0a),
853 QMP_PHY_INIT_CFG(QSERDES_V4_TX_TX_DRV_LVL, 0x2a),
854 QMP_PHY_INIT_CFG(QSERDES_V4_TX_TX_EMP_POST1_LVL, 0x20),
857 static const struct qmp_phy_init_tbl qmp_v5_dp_serdes_tbl[] = {
858 QMP_PHY_INIT_CFG(QSERDES_V4_COM_SVS_MODE_CLK_SEL, 0x05),
859 QMP_PHY_INIT_CFG(QSERDES_V4_COM_SYSCLK_EN_SEL, 0x3b),
860 QMP_PHY_INIT_CFG(QSERDES_V4_COM_SYS_CLK_CTRL, 0x02),
861 QMP_PHY_INIT_CFG(QSERDES_V4_COM_CLK_ENABLE1, 0x0c),
862 QMP_PHY_INIT_CFG(QSERDES_V4_COM_SYSCLK_BUF_ENABLE, 0x06),
863 QMP_PHY_INIT_CFG(QSERDES_V4_COM_CLK_SELECT, 0x30),
864 QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_IVCO, 0x0f),
865 QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_CCTRL_MODE0, 0x36),
866 QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_CCTRL_MODE1, 0x36),
867 QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_RCTRL_MODE0, 0x16),
868 QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_RCTRL_MODE1, 0x16),
869 QMP_PHY_INIT_CFG(QSERDES_V4_COM_CP_CTRL_MODE0, 0x06),
870 QMP_PHY_INIT_CFG(QSERDES_V4_COM_CP_CTRL_MODE1, 0x06),
871 QMP_PHY_INIT_CFG(QSERDES_V4_COM_CMN_CONFIG, 0x02),
872 QMP_PHY_INIT_CFG(QSERDES_V4_COM_INTEGLOOP_GAIN0_MODE0, 0x3f),
873 QMP_PHY_INIT_CFG(QSERDES_V4_COM_INTEGLOOP_GAIN1_MODE0, 0x00),
874 QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE_MAP, 0x02),
875 QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START1_MODE0, 0x00),
876 QMP_PHY_INIT_CFG(QSERDES_V4_COM_BG_TIMER, 0x0a),
877 QMP_PHY_INIT_CFG(QSERDES_V4_COM_CORECLK_DIV_MODE0, 0x0a),
878 QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE_CTRL, 0x00),
879 QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIAS_EN_CLKBUFLR_EN, 0x17),
880 QMP_PHY_INIT_CFG(QSERDES_V4_COM_CORE_CLK_EN, 0x1f),
883 static const struct qmp_phy_init_tbl qmp_v5_dp_tx_tbl[] = {
884 QMP_PHY_INIT_CFG(QSERDES_V5_TX_VMODE_CTRL1, 0x40),
885 QMP_PHY_INIT_CFG(QSERDES_V5_TX_PRE_STALL_LDO_BOOST_EN, 0x30),
886 QMP_PHY_INIT_CFG(QSERDES_V5_TX_INTERFACE_SELECT, 0x3b),
887 QMP_PHY_INIT_CFG(QSERDES_V5_TX_CLKBUF_ENABLE, 0x0f),
888 QMP_PHY_INIT_CFG(QSERDES_V5_TX_RESET_TSYNC_EN, 0x03),
889 QMP_PHY_INIT_CFG(QSERDES_V5_TX_TRAN_DRVR_EMP_EN, 0x0f),
890 QMP_PHY_INIT_CFG(QSERDES_V5_TX_PARRATE_REC_DETECT_IDLE_EN, 0x00),
891 QMP_PHY_INIT_CFG(QSERDES_V5_TX_TX_INTERFACE_MODE, 0x00),
892 QMP_PHY_INIT_CFG(QSERDES_V5_TX_RES_CODE_LANE_OFFSET_TX, 0x11),
893 QMP_PHY_INIT_CFG(QSERDES_V5_TX_RES_CODE_LANE_OFFSET_RX, 0x11),
894 QMP_PHY_INIT_CFG(QSERDES_V5_TX_TX_BAND, 0x04),
897 static const struct qmp_phy_init_tbl qmp_v5_5nm_dp_tx_tbl[] = {
898 QMP_PHY_INIT_CFG(QSERDES_V5_5NM_TX_LANE_MODE_3, 0x51),
899 QMP_PHY_INIT_CFG(QSERDES_V5_5NM_TX_TRANSCEIVER_BIAS_EN, 0x1a),
900 QMP_PHY_INIT_CFG(QSERDES_V5_5NM_TX_VMODE_CTRL1, 0x40),
901 QMP_PHY_INIT_CFG(QSERDES_V5_5NM_TX_PRE_STALL_LDO_BOOST_EN, 0x0),
902 QMP_PHY_INIT_CFG(QSERDES_V5_5NM_TX_INTERFACE_SELECT, 0xff),
903 QMP_PHY_INIT_CFG(QSERDES_V5_5NM_TX_CLKBUF_ENABLE, 0x0f),
904 QMP_PHY_INIT_CFG(QSERDES_V5_5NM_TX_RESET_TSYNC_EN, 0x03),
905 QMP_PHY_INIT_CFG(QSERDES_V5_5NM_TX_TRAN_DRVR_EMP_EN, 0xf),
906 QMP_PHY_INIT_CFG(QSERDES_V5_5NM_TX_PARRATE_REC_DETECT_IDLE_EN, 0x00),
907 QMP_PHY_INIT_CFG(QSERDES_V5_5NM_TX_RES_CODE_LANE_OFFSET_TX, 0x11),
908 QMP_PHY_INIT_CFG(QSERDES_V5_5NM_TX_RES_CODE_LANE_OFFSET_RX, 0x11),
909 QMP_PHY_INIT_CFG(QSERDES_V5_5NM_TX_TX_BAND, 0x01),
912 static const struct qmp_phy_init_tbl qmp_v6_dp_serdes_tbl[] = {
913 QMP_PHY_INIT_CFG(QSERDES_V6_COM_SVS_MODE_CLK_SEL, 0x15),
914 QMP_PHY_INIT_CFG(QSERDES_V6_COM_SYSCLK_EN_SEL, 0x3b),
915 QMP_PHY_INIT_CFG(QSERDES_V6_COM_SYS_CLK_CTRL, 0x02),
916 QMP_PHY_INIT_CFG(QSERDES_V6_COM_CLK_ENABLE1, 0x0c),
917 QMP_PHY_INIT_CFG(QSERDES_V6_COM_SYSCLK_BUF_ENABLE, 0x06),
918 QMP_PHY_INIT_CFG(QSERDES_V6_COM_CLK_SELECT, 0x30),
919 QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_IVCO, 0x0f),
920 QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_CCTRL_MODE0, 0x36),
921 QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_RCTRL_MODE0, 0x16),
922 QMP_PHY_INIT_CFG(QSERDES_V6_COM_CP_CTRL_MODE0, 0x06),
923 QMP_PHY_INIT_CFG(QSERDES_V6_COM_DIV_FRAC_START1_MODE0, 0x00),
924 QMP_PHY_INIT_CFG(QSERDES_V6_COM_CMN_CONFIG_1, 0x12),
925 QMP_PHY_INIT_CFG(QSERDES_V6_COM_INTEGLOOP_GAIN0_MODE0, 0x3f),
926 QMP_PHY_INIT_CFG(QSERDES_V6_COM_INTEGLOOP_GAIN1_MODE0, 0x00),
927 QMP_PHY_INIT_CFG(QSERDES_V6_COM_VCO_TUNE_MAP, 0x00),
928 QMP_PHY_INIT_CFG(QSERDES_V6_COM_BG_TIMER, 0x0a),
929 QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_CORE_CLK_DIV_MODE0, 0x14),
930 QMP_PHY_INIT_CFG(QSERDES_V6_COM_VCO_TUNE_CTRL, 0x00),
931 QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_BIAS_EN_CLK_BUFLR_EN, 0x17),
932 QMP_PHY_INIT_CFG(QSERDES_V6_COM_CORE_CLK_EN, 0x0f),
935 static const struct qmp_phy_init_tbl qmp_v6_dp_tx_tbl[] = {
936 QMP_PHY_INIT_CFG(QSERDES_V6_TX_VMODE_CTRL1, 0x40),
937 QMP_PHY_INIT_CFG(QSERDES_V6_TX_PRE_STALL_LDO_BOOST_EN, 0x30),
938 QMP_PHY_INIT_CFG(QSERDES_V6_TX_INTERFACE_SELECT, 0x3b),
939 QMP_PHY_INIT_CFG(QSERDES_V6_TX_CLKBUF_ENABLE, 0x0f),
940 QMP_PHY_INIT_CFG(QSERDES_V6_TX_RESET_TSYNC_EN, 0x03),
941 QMP_PHY_INIT_CFG(QSERDES_V6_TX_TRAN_DRVR_EMP_EN, 0x0f),
942 QMP_PHY_INIT_CFG(QSERDES_V6_TX_PARRATE_REC_DETECT_IDLE_EN, 0x00),
943 QMP_PHY_INIT_CFG(QSERDES_V6_TX_TX_INTERFACE_MODE, 0x00),
944 QMP_PHY_INIT_CFG(QSERDES_V6_TX_RES_CODE_LANE_OFFSET_TX, 0x0c),
945 QMP_PHY_INIT_CFG(QSERDES_V6_TX_RES_CODE_LANE_OFFSET_RX, 0x0c),
946 QMP_PHY_INIT_CFG(QSERDES_V6_TX_TX_BAND, 0x4),
949 static const struct qmp_phy_init_tbl qmp_v6_dp_serdes_tbl_rbr[] = {
950 QMP_PHY_INIT_CFG(QSERDES_V6_COM_HSCLK_SEL_1, 0x05),
951 QMP_PHY_INIT_CFG(QSERDES_V6_COM_DEC_START_MODE0, 0x34),
952 QMP_PHY_INIT_CFG(QSERDES_V6_COM_DIV_FRAC_START2_MODE0, 0xc0),
953 QMP_PHY_INIT_CFG(QSERDES_V6_COM_DIV_FRAC_START3_MODE0, 0x0b),
954 QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP1_MODE0, 0x37),
955 QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP2_MODE0, 0x04),
956 QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP_EN, 0x04),
957 QMP_PHY_INIT_CFG(QSERDES_V6_COM_BIN_VCOCAL_CMP_CODE1_MODE0, 0x71),
958 QMP_PHY_INIT_CFG(QSERDES_V6_COM_BIN_VCOCAL_CMP_CODE2_MODE0, 0x0c),
961 static const struct qmp_phy_init_tbl qmp_v6_dp_serdes_tbl_hbr[] = {
962 QMP_PHY_INIT_CFG(QSERDES_V6_COM_HSCLK_SEL_1, 0x03),
963 QMP_PHY_INIT_CFG(QSERDES_V6_COM_DEC_START_MODE0, 0x34),
964 QMP_PHY_INIT_CFG(QSERDES_V6_COM_DIV_FRAC_START2_MODE0, 0xc0),
965 QMP_PHY_INIT_CFG(QSERDES_V6_COM_DIV_FRAC_START3_MODE0, 0x0b),
966 QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP1_MODE0, 0x07),
967 QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP2_MODE0, 0x07),
968 QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP_EN, 0x08),
969 QMP_PHY_INIT_CFG(QSERDES_V6_COM_BIN_VCOCAL_CMP_CODE1_MODE0, 0x71),
970 QMP_PHY_INIT_CFG(QSERDES_V6_COM_BIN_VCOCAL_CMP_CODE2_MODE0, 0x0c),
973 static const struct qmp_phy_init_tbl qmp_v6_dp_serdes_tbl_hbr2[] = {
974 QMP_PHY_INIT_CFG(QSERDES_V6_COM_HSCLK_SEL_1, 0x01),
975 QMP_PHY_INIT_CFG(QSERDES_V6_COM_DEC_START_MODE0, 0x46),
976 QMP_PHY_INIT_CFG(QSERDES_V6_COM_DIV_FRAC_START2_MODE0, 0x00),
977 QMP_PHY_INIT_CFG(QSERDES_V6_COM_DIV_FRAC_START3_MODE0, 0x05),
978 QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP1_MODE0, 0x0f),
979 QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP2_MODE0, 0x0e),
980 QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP_EN, 0x08),
981 QMP_PHY_INIT_CFG(QSERDES_V6_COM_BIN_VCOCAL_CMP_CODE1_MODE0, 0x97),
982 QMP_PHY_INIT_CFG(QSERDES_V6_COM_BIN_VCOCAL_CMP_CODE2_MODE0, 0x10),
985 static const struct qmp_phy_init_tbl qmp_v6_dp_serdes_tbl_hbr3[] = {
986 QMP_PHY_INIT_CFG(QSERDES_V6_COM_HSCLK_SEL_1, 0x00),
987 QMP_PHY_INIT_CFG(QSERDES_V6_COM_DEC_START_MODE0, 0x34),
988 QMP_PHY_INIT_CFG(QSERDES_V6_COM_DIV_FRAC_START2_MODE0, 0xc0),
989 QMP_PHY_INIT_CFG(QSERDES_V6_COM_DIV_FRAC_START3_MODE0, 0x0b),
990 QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP1_MODE0, 0x17),
991 QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP2_MODE0, 0x15),
992 QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP_EN, 0x08),
993 QMP_PHY_INIT_CFG(QSERDES_V6_COM_BIN_VCOCAL_CMP_CODE1_MODE0, 0x71),
994 QMP_PHY_INIT_CFG(QSERDES_V6_COM_BIN_VCOCAL_CMP_CODE2_MODE0, 0x0c),
997 static const struct qmp_phy_init_tbl sc8280xp_usb43dp_serdes_tbl[] = {
998 QMP_PHY_INIT_CFG(QSERDES_V5_COM_SSC_EN_CENTER, 0x01),
999 QMP_PHY_INIT_CFG(QSERDES_V5_COM_SSC_PER1, 0x31),
1000 QMP_PHY_INIT_CFG(QSERDES_V5_COM_SSC_PER2, 0x01),
1001 QMP_PHY_INIT_CFG(QSERDES_V5_COM_SSC_STEP_SIZE1_MODE0, 0xfd),
1002 QMP_PHY_INIT_CFG(QSERDES_V5_COM_SSC_STEP_SIZE2_MODE0, 0x0d),
1003 QMP_PHY_INIT_CFG(QSERDES_V5_COM_SSC_STEP_SIZE1_MODE1, 0xfd),
1004 QMP_PHY_INIT_CFG(QSERDES_V5_COM_SSC_STEP_SIZE2_MODE1, 0x0d),
1005 QMP_PHY_INIT_CFG(QSERDES_V5_COM_SYSCLK_BUF_ENABLE, 0x0a),
1006 QMP_PHY_INIT_CFG(QSERDES_V5_COM_CP_CTRL_MODE0, 0x02),
1007 QMP_PHY_INIT_CFG(QSERDES_V5_COM_CP_CTRL_MODE1, 0x02),
1008 QMP_PHY_INIT_CFG(QSERDES_V5_COM_PLL_RCTRL_MODE0, 0x16),
1009 QMP_PHY_INIT_CFG(QSERDES_V5_COM_PLL_RCTRL_MODE1, 0x16),
1010 QMP_PHY_INIT_CFG(QSERDES_V5_COM_PLL_CCTRL_MODE0, 0x36),
1011 QMP_PHY_INIT_CFG(QSERDES_V5_COM_PLL_CCTRL_MODE1, 0x36),
1012 QMP_PHY_INIT_CFG(QSERDES_V5_COM_SYSCLK_EN_SEL, 0x1a),
1013 QMP_PHY_INIT_CFG(QSERDES_V5_COM_LOCK_CMP_EN, 0x04),
1014 QMP_PHY_INIT_CFG(QSERDES_V5_COM_LOCK_CMP1_MODE0, 0x14),
1015 QMP_PHY_INIT_CFG(QSERDES_V5_COM_LOCK_CMP2_MODE0, 0x34),
1016 QMP_PHY_INIT_CFG(QSERDES_V5_COM_LOCK_CMP1_MODE1, 0x34),
1017 QMP_PHY_INIT_CFG(QSERDES_V5_COM_LOCK_CMP2_MODE1, 0x82),
1018 QMP_PHY_INIT_CFG(QSERDES_V5_COM_DEC_START_MODE0, 0x04),
1019 QMP_PHY_INIT_CFG(QSERDES_V5_COM_DEC_START_MSB_MODE0, 0x01),
1020 QMP_PHY_INIT_CFG(QSERDES_V5_COM_DEC_START_MODE1, 0x04),
1021 QMP_PHY_INIT_CFG(QSERDES_V5_COM_DEC_START_MSB_MODE1, 0x01),
1022 QMP_PHY_INIT_CFG(QSERDES_V5_COM_DIV_FRAC_START1_MODE0, 0x55),
1023 QMP_PHY_INIT_CFG(QSERDES_V5_COM_DIV_FRAC_START2_MODE0, 0xd5),
1024 QMP_PHY_INIT_CFG(QSERDES_V5_COM_DIV_FRAC_START3_MODE0, 0x05),
1025 QMP_PHY_INIT_CFG(QSERDES_V5_COM_DIV_FRAC_START1_MODE1, 0x55),
1026 QMP_PHY_INIT_CFG(QSERDES_V5_COM_DIV_FRAC_START2_MODE1, 0xd5),
1027 QMP_PHY_INIT_CFG(QSERDES_V5_COM_DIV_FRAC_START3_MODE1, 0x05),
1028 QMP_PHY_INIT_CFG(QSERDES_V5_COM_VCO_TUNE_MAP, 0x02),
1029 QMP_PHY_INIT_CFG(QSERDES_V5_COM_VCO_TUNE1_MODE0, 0xd4),
1030 QMP_PHY_INIT_CFG(QSERDES_V5_COM_VCO_TUNE2_MODE0, 0x00),
1031 QMP_PHY_INIT_CFG(QSERDES_V5_COM_VCO_TUNE1_MODE1, 0xd4),
1032 QMP_PHY_INIT_CFG(QSERDES_V5_COM_VCO_TUNE2_MODE1, 0x00),
1033 QMP_PHY_INIT_CFG(QSERDES_V5_COM_HSCLK_SEL, 0x13),
1034 QMP_PHY_INIT_CFG(QSERDES_V5_COM_HSCLK_HS_SWITCH_SEL, 0x00),
1035 QMP_PHY_INIT_CFG(QSERDES_V5_COM_CORECLK_DIV_MODE0, 0x0a),
1036 QMP_PHY_INIT_CFG(QSERDES_V5_COM_CORECLK_DIV_MODE1, 0x04),
1037 QMP_PHY_INIT_CFG(QSERDES_V5_COM_CORE_CLK_EN, 0x60),
1038 QMP_PHY_INIT_CFG(QSERDES_V5_COM_CMN_CONFIG, 0x76),
1039 QMP_PHY_INIT_CFG(QSERDES_V5_COM_PLL_IVCO, 0xff),
1040 QMP_PHY_INIT_CFG(QSERDES_V5_COM_INTEGLOOP_GAIN0_MODE0, 0x20),
1041 QMP_PHY_INIT_CFG(QSERDES_V5_COM_INTEGLOOP_GAIN0_MODE1, 0x20),
1042 QMP_PHY_INIT_CFG(QSERDES_V5_COM_VCO_TUNE_INITVAL2, 0x00),
1043 QMP_PHY_INIT_CFG(QSERDES_V5_COM_VCO_TUNE_MAXVAL2, 0x01),
1044 QMP_PHY_INIT_CFG(QSERDES_V5_COM_SVS_MODE_CLK_SEL, 0x0a),
1047 static const struct qmp_phy_init_tbl sc8280xp_usb43dp_tx_tbl[] = {
1048 QMP_PHY_INIT_CFG(QSERDES_V5_5NM_TX_LANE_MODE_1, 0x05),
1049 QMP_PHY_INIT_CFG(QSERDES_V5_5NM_TX_LANE_MODE_2, 0xc2),
1050 QMP_PHY_INIT_CFG(QSERDES_V5_5NM_TX_LANE_MODE_3, 0x10),
1051 QMP_PHY_INIT_CFG(QSERDES_V5_5NM_TX_RES_CODE_LANE_OFFSET_TX, 0x1f),
1052 QMP_PHY_INIT_CFG(QSERDES_V5_5NM_TX_RES_CODE_LANE_OFFSET_RX, 0x0a),
1055 static const struct qmp_phy_init_tbl sc8280xp_usb43dp_rx_tbl[] = {
1056 QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_SIGDET_CNTRL, 0x04),
1057 QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_SIGDET_DEGLITCH_CNTRL, 0x0e),
1058 QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_SIGDET_ENABLES, 0x00),
1059 QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_RX_MODE_RATE_0_1_B0, 0xd2),
1060 QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_RX_MODE_RATE_0_1_B1, 0xd2),
1061 QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_RX_MODE_RATE_0_1_B2, 0xdb),
1062 QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_RX_MODE_RATE_0_1_B3, 0x21),
1063 QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_RX_MODE_RATE_0_1_B4, 0x3f),
1064 QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_RX_MODE_RATE_0_1_B5, 0x80),
1065 QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_RX_MODE_RATE_0_1_B6, 0x45),
1066 QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_RX_MODE_RATE_0_1_B7, 0x00),
1067 QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_RX_MODE_RATE2_B0, 0x6b),
1068 QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_RX_MODE_RATE2_B1, 0x63),
1069 QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_RX_MODE_RATE2_B2, 0xb6),
1070 QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_RX_MODE_RATE2_B3, 0x23),
1071 QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_RX_MODE_RATE2_B4, 0x35),
1072 QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_RX_MODE_RATE2_B5, 0x30),
1073 QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_RX_MODE_RATE2_B6, 0x8e),
1074 QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_RX_MODE_RATE2_B7, 0x00),
1075 QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_RX_IVCM_CAL_CODE_OVERRIDE, 0x00),
1076 QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_RX_IVCM_CAL_CTRL2, 0x80),
1077 QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_RX_SUMMER_CAL_SPD_MODE, 0x1b),
1078 QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_DFE_CTLE_POST_CAL_OFFSET, 0x38),
1079 QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_UCDR_PI_CONTROLS, 0x15),
1080 QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_UCDR_SB2_GAIN2_RATE2, 0x0a),
1081 QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_RX_IVCM_POSTCAL_OFFSET, 0x7c),
1082 QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_VGA_CAL_CNTRL1, 0x00),
1083 QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_VGA_CAL_MAN_VAL, 0x0d),
1084 QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_DFE_DAC_ENABLE1, 0x00),
1085 QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_DFE_3, 0x45),
1086 QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_GM_CAL, 0x09),
1087 QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_UCDR_FO_GAIN_RATE2, 0x09),
1088 QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_UCDR_SO_GAIN_RATE2, 0x05),
1089 QMP_PHY_INIT_CFG(QSERDES_V5_5NM_RX_Q_PI_INTRINSIC_BIAS_RATE32, 0x3f),
1092 static const struct qmp_phy_init_tbl sc8280xp_usb43dp_pcs_tbl[] = {
1093 QMP_PHY_INIT_CFG(QPHY_V5_PCS_RCVR_DTCT_DLY_P1U2_L, 0xe7),
1094 QMP_PHY_INIT_CFG(QPHY_V5_PCS_RCVR_DTCT_DLY_P1U2_H, 0x03),
1095 QMP_PHY_INIT_CFG(QPHY_V5_PCS_LOCK_DETECT_CONFIG1, 0xd0),
1096 QMP_PHY_INIT_CFG(QPHY_V5_PCS_LOCK_DETECT_CONFIG2, 0x07),
1097 QMP_PHY_INIT_CFG(QPHY_V5_PCS_LOCK_DETECT_CONFIG3, 0x20),
1098 QMP_PHY_INIT_CFG(QPHY_V5_PCS_LOCK_DETECT_CONFIG6, 0x13),
1099 QMP_PHY_INIT_CFG(QPHY_V5_PCS_REFGEN_REQ_CONFIG1, 0x21),
1100 QMP_PHY_INIT_CFG(QPHY_V5_PCS_RX_SIGDET_LVL, 0xaa),
1101 QMP_PHY_INIT_CFG(QPHY_V5_PCS_RX_CONFIG, 0x0a),
1102 QMP_PHY_INIT_CFG(QPHY_V5_PCS_ALIGN_DETECT_CONFIG1, 0x88),
1103 QMP_PHY_INIT_CFG(QPHY_V5_PCS_ALIGN_DETECT_CONFIG2, 0x13),
1104 QMP_PHY_INIT_CFG(QPHY_V5_PCS_PCS_TX_RX_CONFIG, 0x0c),
1105 QMP_PHY_INIT_CFG(QPHY_V5_PCS_EQ_CONFIG1, 0x4b),
1106 QMP_PHY_INIT_CFG(QPHY_V5_PCS_EQ_CONFIG5, 0x10),
1107 QMP_PHY_INIT_CFG(QPHY_V5_PCS_USB3_LFPS_DET_HIGH_COUNT_VAL, 0xf8),
1108 QMP_PHY_INIT_CFG(QPHY_V5_PCS_USB3_RXEQTRAINING_DFE_TIME_S2, 0x07),
1111 /* list of regulators */
1112 struct qmp_regulator_data {
1114 unsigned int enable_load;
1117 static struct qmp_regulator_data qmp_phy_vreg_l[] = {
1118 { .name = "vdda-phy", .enable_load = 21800 },
1119 { .name = "vdda-pll", .enable_load = 36000 },
1122 static const u8 qmp_dp_v3_pre_emphasis_hbr3_hbr2[4][4] = {
1123 { 0x00, 0x0c, 0x15, 0x1a },
1124 { 0x02, 0x0e, 0x16, 0xff },
1125 { 0x02, 0x11, 0xff, 0xff },
1126 { 0x04, 0xff, 0xff, 0xff }
1129 static const u8 qmp_dp_v3_voltage_swing_hbr3_hbr2[4][4] = {
1130 { 0x02, 0x12, 0x16, 0x1a },
1131 { 0x09, 0x19, 0x1f, 0xff },
1132 { 0x10, 0x1f, 0xff, 0xff },
1133 { 0x1f, 0xff, 0xff, 0xff }
1136 static const u8 qmp_dp_v3_pre_emphasis_hbr_rbr[4][4] = {
1137 { 0x00, 0x0c, 0x14, 0x19 },
1138 { 0x00, 0x0b, 0x12, 0xff },
1139 { 0x00, 0x0b, 0xff, 0xff },
1140 { 0x04, 0xff, 0xff, 0xff }
1143 static const u8 qmp_dp_v3_voltage_swing_hbr_rbr[4][4] = {
1144 { 0x08, 0x0f, 0x16, 0x1f },
1145 { 0x11, 0x1e, 0x1f, 0xff },
1146 { 0x19, 0x1f, 0xff, 0xff },
1147 { 0x1f, 0xff, 0xff, 0xff }
1150 static const u8 qmp_dp_v4_pre_emphasis_hbr3_hbr2[4][4] = {
1151 { 0x00, 0x0c, 0x15, 0x1b },
1152 { 0x02, 0x0e, 0x16, 0xff },
1153 { 0x02, 0x11, 0xff, 0xff },
1154 { 0x04, 0xff, 0xff, 0xff }
1157 static const u8 qmp_dp_v4_pre_emphasis_hbr_rbr[4][4] = {
1158 { 0x00, 0x0d, 0x14, 0x1a },
1159 { 0x00, 0x0e, 0x15, 0xff },
1160 { 0x00, 0x0d, 0xff, 0xff },
1161 { 0x03, 0xff, 0xff, 0xff }
1164 static const u8 qmp_dp_v4_voltage_swing_hbr_rbr[4][4] = {
1165 { 0x08, 0x0f, 0x16, 0x1f },
1166 { 0x11, 0x1e, 0x1f, 0xff },
1167 { 0x16, 0x1f, 0xff, 0xff },
1168 { 0x1f, 0xff, 0xff, 0xff }
1171 static const u8 qmp_dp_v5_pre_emphasis_hbr3_hbr2[4][4] = {
1172 { 0x20, 0x2c, 0x35, 0x3b },
1173 { 0x22, 0x2e, 0x36, 0xff },
1174 { 0x22, 0x31, 0xff, 0xff },
1175 { 0x24, 0xff, 0xff, 0xff }
1178 static const u8 qmp_dp_v5_voltage_swing_hbr3_hbr2[4][4] = {
1179 { 0x22, 0x32, 0x36, 0x3a },
1180 { 0x29, 0x39, 0x3f, 0xff },
1181 { 0x30, 0x3f, 0xff, 0xff },
1182 { 0x3f, 0xff, 0xff, 0xff }
1185 static const u8 qmp_dp_v5_pre_emphasis_hbr_rbr[4][4] = {
1186 { 0x20, 0x2d, 0x34, 0x3a },
1187 { 0x20, 0x2e, 0x35, 0xff },
1188 { 0x20, 0x2e, 0xff, 0xff },
1189 { 0x24, 0xff, 0xff, 0xff }
1192 static const u8 qmp_dp_v5_voltage_swing_hbr_rbr[4][4] = {
1193 { 0x28, 0x2f, 0x36, 0x3f },
1194 { 0x31, 0x3e, 0x3f, 0xff },
1195 { 0x36, 0x3f, 0xff, 0xff },
1196 { 0x3f, 0xff, 0xff, 0xff }
1199 static const u8 qmp_dp_v6_pre_emphasis_hbr_rbr[4][4] = {
1200 { 0x20, 0x2d, 0x34, 0x3a },
1201 { 0x20, 0x2e, 0x35, 0xff },
1202 { 0x20, 0x2e, 0xff, 0xff },
1203 { 0x22, 0xff, 0xff, 0xff }
1208 struct qmp_combo_offsets {
1224 struct qmp_phy_cfg {
1225 const struct qmp_combo_offsets *offsets;
1227 /* Init sequence for PHY blocks - serdes, tx, rx, pcs */
1228 const struct qmp_phy_init_tbl *serdes_tbl;
1230 const struct qmp_phy_init_tbl *tx_tbl;
1232 const struct qmp_phy_init_tbl *rx_tbl;
1234 const struct qmp_phy_init_tbl *pcs_tbl;
1236 const struct qmp_phy_init_tbl *pcs_usb_tbl;
1237 int pcs_usb_tbl_num;
1239 const struct qmp_phy_init_tbl *dp_serdes_tbl;
1240 int dp_serdes_tbl_num;
1241 const struct qmp_phy_init_tbl *dp_tx_tbl;
1244 /* Init sequence for DP PHY block link rates */
1245 const struct qmp_phy_init_tbl *serdes_tbl_rbr;
1246 int serdes_tbl_rbr_num;
1247 const struct qmp_phy_init_tbl *serdes_tbl_hbr;
1248 int serdes_tbl_hbr_num;
1249 const struct qmp_phy_init_tbl *serdes_tbl_hbr2;
1250 int serdes_tbl_hbr2_num;
1251 const struct qmp_phy_init_tbl *serdes_tbl_hbr3;
1252 int serdes_tbl_hbr3_num;
1254 /* DP PHY swing and pre_emphasis tables */
1255 const u8 (*swing_hbr_rbr)[4][4];
1256 const u8 (*swing_hbr3_hbr2)[4][4];
1257 const u8 (*pre_emphasis_hbr_rbr)[4][4];
1258 const u8 (*pre_emphasis_hbr3_hbr2)[4][4];
1260 /* DP PHY callbacks */
1261 int (*configure_dp_phy)(struct qmp_combo *qmp);
1262 void (*configure_dp_tx)(struct qmp_combo *qmp);
1263 int (*calibrate_dp_phy)(struct qmp_combo *qmp);
1264 void (*dp_aux_init)(struct qmp_combo *qmp);
1266 /* clock ids to be requested */
1267 const char * const *clk_list;
1269 /* resets to be requested */
1270 const char * const *reset_list;
1272 /* regulators to be requested */
1273 const struct qmp_regulator_data *vreg_list;
1276 /* array of registers with different offsets */
1277 const unsigned int *regs;
1279 /* true, if PHY needs delay after POWER_DOWN */
1280 bool has_pwrdn_delay;
1282 /* Offset from PCS to PCS_USB region */
1283 unsigned int pcs_usb_offset;
1290 const struct qmp_phy_cfg *cfg;
1294 void __iomem *serdes;
1300 void __iomem *pcs_misc;
1301 void __iomem *pcs_usb;
1303 void __iomem *dp_serdes;
1304 void __iomem *dp_tx;
1305 void __iomem *dp_tx2;
1306 void __iomem *dp_dp_phy;
1308 struct clk *pipe_clk;
1309 struct clk_bulk_data *clks;
1310 struct reset_control_bulk_data *resets;
1311 struct regulator_bulk_data *vregs;
1313 struct mutex phy_mutex;
1316 struct phy *usb_phy;
1320 unsigned int dp_aux_cfg;
1321 struct phy_configure_opts_dp dp_opts;
1323 struct clk_fixed_rate pipe_clk_fixed;
1324 struct clk_hw dp_link_hw;
1325 struct clk_hw dp_pixel_hw;
1328 static void qmp_v3_dp_aux_init(struct qmp_combo *qmp);
1329 static void qmp_v3_configure_dp_tx(struct qmp_combo *qmp);
1330 static int qmp_v3_configure_dp_phy(struct qmp_combo *qmp);
1331 static int qmp_v3_calibrate_dp_phy(struct qmp_combo *qmp);
1333 static void qmp_v4_dp_aux_init(struct qmp_combo *qmp);
1334 static void qmp_v4_configure_dp_tx(struct qmp_combo *qmp);
1335 static int qmp_v4_configure_dp_phy(struct qmp_combo *qmp);
1336 static int qmp_v4_calibrate_dp_phy(struct qmp_combo *qmp);
1338 static int qmp_v5_configure_dp_phy(struct qmp_combo *qmp);
1340 static void qmp_v6_dp_aux_init(struct qmp_combo *qmp);
1341 static int qmp_v6_configure_dp_phy(struct qmp_combo *qmp);
1343 static inline void qphy_setbits(void __iomem *base, u32 offset, u32 val)
1347 reg = readl(base + offset);
1349 writel(reg, base + offset);
1351 /* ensure that above write is through */
1352 readl(base + offset);
1355 static inline void qphy_clrbits(void __iomem *base, u32 offset, u32 val)
1359 reg = readl(base + offset);
1361 writel(reg, base + offset);
1363 /* ensure that above write is through */
1364 readl(base + offset);
1367 /* list of clocks required by phy */
1368 static const char * const qmp_v3_phy_clk_l[] = {
1369 "aux", "cfg_ahb", "ref", "com_aux",
1372 static const char * const qmp_v4_phy_clk_l[] = {
1373 "aux", "ref", "com_aux",
1376 /* the primary usb3 phy on sm8250 doesn't have a ref clock */
1377 static const char * const qmp_v4_sm8250_usbphy_clk_l[] = {
1378 "aux", "ref_clk_src", "com_aux"
1381 /* list of resets */
1382 static const char * const msm8996_usb3phy_reset_l[] = {
1386 static const char * const sc7180_usb3phy_reset_l[] = {
1390 static const struct qmp_combo_offsets qmp_combo_offsets_v3 = {
1396 .usb3_serdes = 0x1000,
1397 .usb3_pcs_misc = 0x1a00,
1399 .usb3_pcs_usb = 0x1f00,
1400 .dp_serdes = 0x2000,
1403 .dp_dp_phy = 0x2a00,
1406 static const struct qmp_combo_offsets qmp_combo_offsets_v5 = {
1412 .usb3_serdes = 0x1000,
1413 .usb3_pcs_misc = 0x1200,
1415 .usb3_pcs_usb = 0x1700,
1416 .dp_serdes = 0x2000,
1417 .dp_dp_phy = 0x2200,
1420 static const struct qmp_phy_cfg sc7180_usb3dpphy_cfg = {
1421 .serdes_tbl = qmp_v3_usb3_serdes_tbl,
1422 .serdes_tbl_num = ARRAY_SIZE(qmp_v3_usb3_serdes_tbl),
1423 .tx_tbl = qmp_v3_usb3_tx_tbl,
1424 .tx_tbl_num = ARRAY_SIZE(qmp_v3_usb3_tx_tbl),
1425 .rx_tbl = qmp_v3_usb3_rx_tbl,
1426 .rx_tbl_num = ARRAY_SIZE(qmp_v3_usb3_rx_tbl),
1427 .pcs_tbl = qmp_v3_usb3_pcs_tbl,
1428 .pcs_tbl_num = ARRAY_SIZE(qmp_v3_usb3_pcs_tbl),
1430 .dp_serdes_tbl = qmp_v3_dp_serdes_tbl,
1431 .dp_serdes_tbl_num = ARRAY_SIZE(qmp_v3_dp_serdes_tbl),
1432 .dp_tx_tbl = qmp_v3_dp_tx_tbl,
1433 .dp_tx_tbl_num = ARRAY_SIZE(qmp_v3_dp_tx_tbl),
1435 .serdes_tbl_rbr = qmp_v3_dp_serdes_tbl_rbr,
1436 .serdes_tbl_rbr_num = ARRAY_SIZE(qmp_v3_dp_serdes_tbl_rbr),
1437 .serdes_tbl_hbr = qmp_v3_dp_serdes_tbl_hbr,
1438 .serdes_tbl_hbr_num = ARRAY_SIZE(qmp_v3_dp_serdes_tbl_hbr),
1439 .serdes_tbl_hbr2 = qmp_v3_dp_serdes_tbl_hbr2,
1440 .serdes_tbl_hbr2_num = ARRAY_SIZE(qmp_v3_dp_serdes_tbl_hbr2),
1441 .serdes_tbl_hbr3 = qmp_v3_dp_serdes_tbl_hbr3,
1442 .serdes_tbl_hbr3_num = ARRAY_SIZE(qmp_v3_dp_serdes_tbl_hbr3),
1444 .swing_hbr_rbr = &qmp_dp_v3_voltage_swing_hbr_rbr,
1445 .pre_emphasis_hbr_rbr = &qmp_dp_v3_pre_emphasis_hbr_rbr,
1446 .swing_hbr3_hbr2 = &qmp_dp_v3_voltage_swing_hbr3_hbr2,
1447 .pre_emphasis_hbr3_hbr2 = &qmp_dp_v3_pre_emphasis_hbr3_hbr2,
1449 .dp_aux_init = qmp_v3_dp_aux_init,
1450 .configure_dp_tx = qmp_v3_configure_dp_tx,
1451 .configure_dp_phy = qmp_v3_configure_dp_phy,
1452 .calibrate_dp_phy = qmp_v3_calibrate_dp_phy,
1454 .clk_list = qmp_v3_phy_clk_l,
1455 .num_clks = ARRAY_SIZE(qmp_v3_phy_clk_l),
1456 .reset_list = sc7180_usb3phy_reset_l,
1457 .num_resets = ARRAY_SIZE(sc7180_usb3phy_reset_l),
1458 .vreg_list = qmp_phy_vreg_l,
1459 .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
1460 .regs = qmp_v3_usb3phy_regs_layout,
1462 .has_pwrdn_delay = true,
1465 static const struct qmp_phy_cfg sdm845_usb3dpphy_cfg = {
1466 .serdes_tbl = qmp_v3_usb3_serdes_tbl,
1467 .serdes_tbl_num = ARRAY_SIZE(qmp_v3_usb3_serdes_tbl),
1468 .tx_tbl = qmp_v3_usb3_tx_tbl,
1469 .tx_tbl_num = ARRAY_SIZE(qmp_v3_usb3_tx_tbl),
1470 .rx_tbl = qmp_v3_usb3_rx_tbl,
1471 .rx_tbl_num = ARRAY_SIZE(qmp_v3_usb3_rx_tbl),
1472 .pcs_tbl = qmp_v3_usb3_pcs_tbl,
1473 .pcs_tbl_num = ARRAY_SIZE(qmp_v3_usb3_pcs_tbl),
1475 .dp_serdes_tbl = qmp_v3_dp_serdes_tbl,
1476 .dp_serdes_tbl_num = ARRAY_SIZE(qmp_v3_dp_serdes_tbl),
1477 .dp_tx_tbl = qmp_v3_dp_tx_tbl,
1478 .dp_tx_tbl_num = ARRAY_SIZE(qmp_v3_dp_tx_tbl),
1480 .serdes_tbl_rbr = qmp_v3_dp_serdes_tbl_rbr,
1481 .serdes_tbl_rbr_num = ARRAY_SIZE(qmp_v3_dp_serdes_tbl_rbr),
1482 .serdes_tbl_hbr = qmp_v3_dp_serdes_tbl_hbr,
1483 .serdes_tbl_hbr_num = ARRAY_SIZE(qmp_v3_dp_serdes_tbl_hbr),
1484 .serdes_tbl_hbr2 = qmp_v3_dp_serdes_tbl_hbr2,
1485 .serdes_tbl_hbr2_num = ARRAY_SIZE(qmp_v3_dp_serdes_tbl_hbr2),
1486 .serdes_tbl_hbr3 = qmp_v3_dp_serdes_tbl_hbr3,
1487 .serdes_tbl_hbr3_num = ARRAY_SIZE(qmp_v3_dp_serdes_tbl_hbr3),
1489 .swing_hbr_rbr = &qmp_dp_v3_voltage_swing_hbr_rbr,
1490 .pre_emphasis_hbr_rbr = &qmp_dp_v3_pre_emphasis_hbr_rbr,
1491 .swing_hbr3_hbr2 = &qmp_dp_v3_voltage_swing_hbr3_hbr2,
1492 .pre_emphasis_hbr3_hbr2 = &qmp_dp_v3_pre_emphasis_hbr3_hbr2,
1494 .dp_aux_init = qmp_v3_dp_aux_init,
1495 .configure_dp_tx = qmp_v3_configure_dp_tx,
1496 .configure_dp_phy = qmp_v3_configure_dp_phy,
1497 .calibrate_dp_phy = qmp_v3_calibrate_dp_phy,
1499 .clk_list = qmp_v3_phy_clk_l,
1500 .num_clks = ARRAY_SIZE(qmp_v3_phy_clk_l),
1501 .reset_list = msm8996_usb3phy_reset_l,
1502 .num_resets = ARRAY_SIZE(msm8996_usb3phy_reset_l),
1503 .vreg_list = qmp_phy_vreg_l,
1504 .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
1505 .regs = qmp_v3_usb3phy_regs_layout,
1507 .has_pwrdn_delay = true,
1510 static const struct qmp_phy_cfg sc8180x_usb3dpphy_cfg = {
1511 .serdes_tbl = sm8150_usb3_serdes_tbl,
1512 .serdes_tbl_num = ARRAY_SIZE(sm8150_usb3_serdes_tbl),
1513 .tx_tbl = sm8150_usb3_tx_tbl,
1514 .tx_tbl_num = ARRAY_SIZE(sm8150_usb3_tx_tbl),
1515 .rx_tbl = sm8150_usb3_rx_tbl,
1516 .rx_tbl_num = ARRAY_SIZE(sm8150_usb3_rx_tbl),
1517 .pcs_tbl = sm8150_usb3_pcs_tbl,
1518 .pcs_tbl_num = ARRAY_SIZE(sm8150_usb3_pcs_tbl),
1519 .pcs_usb_tbl = sm8150_usb3_pcs_usb_tbl,
1520 .pcs_usb_tbl_num = ARRAY_SIZE(sm8150_usb3_pcs_usb_tbl),
1522 .dp_serdes_tbl = qmp_v4_dp_serdes_tbl,
1523 .dp_serdes_tbl_num = ARRAY_SIZE(qmp_v4_dp_serdes_tbl),
1524 .dp_tx_tbl = qmp_v4_dp_tx_tbl,
1525 .dp_tx_tbl_num = ARRAY_SIZE(qmp_v4_dp_tx_tbl),
1527 .serdes_tbl_rbr = qmp_v4_dp_serdes_tbl_rbr,
1528 .serdes_tbl_rbr_num = ARRAY_SIZE(qmp_v4_dp_serdes_tbl_rbr),
1529 .serdes_tbl_hbr = qmp_v4_dp_serdes_tbl_hbr,
1530 .serdes_tbl_hbr_num = ARRAY_SIZE(qmp_v4_dp_serdes_tbl_hbr),
1531 .serdes_tbl_hbr2 = qmp_v4_dp_serdes_tbl_hbr2,
1532 .serdes_tbl_hbr2_num = ARRAY_SIZE(qmp_v4_dp_serdes_tbl_hbr2),
1533 .serdes_tbl_hbr3 = qmp_v4_dp_serdes_tbl_hbr3,
1534 .serdes_tbl_hbr3_num = ARRAY_SIZE(qmp_v4_dp_serdes_tbl_hbr3),
1536 .swing_hbr_rbr = &qmp_dp_v3_voltage_swing_hbr_rbr,
1537 .pre_emphasis_hbr_rbr = &qmp_dp_v3_pre_emphasis_hbr_rbr,
1538 .swing_hbr3_hbr2 = &qmp_dp_v3_voltage_swing_hbr3_hbr2,
1539 .pre_emphasis_hbr3_hbr2 = &qmp_dp_v3_pre_emphasis_hbr3_hbr2,
1541 .dp_aux_init = qmp_v4_dp_aux_init,
1542 .configure_dp_tx = qmp_v4_configure_dp_tx,
1543 .configure_dp_phy = qmp_v4_configure_dp_phy,
1544 .calibrate_dp_phy = qmp_v4_calibrate_dp_phy,
1546 .clk_list = qmp_v4_phy_clk_l,
1547 .num_clks = ARRAY_SIZE(qmp_v4_phy_clk_l),
1548 .reset_list = msm8996_usb3phy_reset_l,
1549 .num_resets = ARRAY_SIZE(msm8996_usb3phy_reset_l),
1550 .vreg_list = qmp_phy_vreg_l,
1551 .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
1552 .regs = qmp_v4_usb3phy_regs_layout,
1553 .pcs_usb_offset = 0x300,
1555 .has_pwrdn_delay = true,
1558 static const struct qmp_phy_cfg sc8280xp_usb43dpphy_cfg = {
1559 .offsets = &qmp_combo_offsets_v5,
1561 .serdes_tbl = sc8280xp_usb43dp_serdes_tbl,
1562 .serdes_tbl_num = ARRAY_SIZE(sc8280xp_usb43dp_serdes_tbl),
1563 .tx_tbl = sc8280xp_usb43dp_tx_tbl,
1564 .tx_tbl_num = ARRAY_SIZE(sc8280xp_usb43dp_tx_tbl),
1565 .rx_tbl = sc8280xp_usb43dp_rx_tbl,
1566 .rx_tbl_num = ARRAY_SIZE(sc8280xp_usb43dp_rx_tbl),
1567 .pcs_tbl = sc8280xp_usb43dp_pcs_tbl,
1568 .pcs_tbl_num = ARRAY_SIZE(sc8280xp_usb43dp_pcs_tbl),
1570 .dp_serdes_tbl = qmp_v5_dp_serdes_tbl,
1571 .dp_serdes_tbl_num = ARRAY_SIZE(qmp_v5_dp_serdes_tbl),
1572 .dp_tx_tbl = qmp_v5_5nm_dp_tx_tbl,
1573 .dp_tx_tbl_num = ARRAY_SIZE(qmp_v5_5nm_dp_tx_tbl),
1575 .serdes_tbl_rbr = qmp_v4_dp_serdes_tbl_rbr,
1576 .serdes_tbl_rbr_num = ARRAY_SIZE(qmp_v4_dp_serdes_tbl_rbr),
1577 .serdes_tbl_hbr = qmp_v4_dp_serdes_tbl_hbr,
1578 .serdes_tbl_hbr_num = ARRAY_SIZE(qmp_v4_dp_serdes_tbl_hbr),
1579 .serdes_tbl_hbr2 = qmp_v4_dp_serdes_tbl_hbr2,
1580 .serdes_tbl_hbr2_num = ARRAY_SIZE(qmp_v4_dp_serdes_tbl_hbr2),
1581 .serdes_tbl_hbr3 = qmp_v4_dp_serdes_tbl_hbr3,
1582 .serdes_tbl_hbr3_num = ARRAY_SIZE(qmp_v4_dp_serdes_tbl_hbr3),
1584 .swing_hbr_rbr = &qmp_dp_v5_voltage_swing_hbr_rbr,
1585 .pre_emphasis_hbr_rbr = &qmp_dp_v5_pre_emphasis_hbr_rbr,
1586 .swing_hbr3_hbr2 = &qmp_dp_v5_voltage_swing_hbr3_hbr2,
1587 .pre_emphasis_hbr3_hbr2 = &qmp_dp_v5_pre_emphasis_hbr3_hbr2,
1589 .dp_aux_init = qmp_v4_dp_aux_init,
1590 .configure_dp_tx = qmp_v4_configure_dp_tx,
1591 .configure_dp_phy = qmp_v5_configure_dp_phy,
1592 .calibrate_dp_phy = qmp_v4_calibrate_dp_phy,
1594 .clk_list = qmp_v4_phy_clk_l,
1595 .num_clks = ARRAY_SIZE(qmp_v4_phy_clk_l),
1596 .reset_list = msm8996_usb3phy_reset_l,
1597 .num_resets = ARRAY_SIZE(msm8996_usb3phy_reset_l),
1598 .vreg_list = qmp_phy_vreg_l,
1599 .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
1600 .regs = qmp_v4_usb3phy_regs_layout,
1603 static const struct qmp_phy_cfg sm6350_usb3dpphy_cfg = {
1604 .offsets = &qmp_combo_offsets_v3,
1606 .serdes_tbl = qmp_v3_usb3_serdes_tbl,
1607 .serdes_tbl_num = ARRAY_SIZE(qmp_v3_usb3_serdes_tbl),
1608 .tx_tbl = qmp_v3_usb3_tx_tbl,
1609 .tx_tbl_num = ARRAY_SIZE(qmp_v3_usb3_tx_tbl),
1610 .rx_tbl = sm6350_usb3_rx_tbl,
1611 .rx_tbl_num = ARRAY_SIZE(sm6350_usb3_rx_tbl),
1612 .pcs_tbl = sm6350_usb3_pcs_tbl,
1613 .pcs_tbl_num = ARRAY_SIZE(sm6350_usb3_pcs_tbl),
1615 .dp_serdes_tbl = qmp_v3_dp_serdes_tbl,
1616 .dp_serdes_tbl_num = ARRAY_SIZE(qmp_v3_dp_serdes_tbl),
1617 .dp_tx_tbl = qmp_v3_dp_tx_tbl,
1618 .dp_tx_tbl_num = ARRAY_SIZE(qmp_v3_dp_tx_tbl),
1620 .serdes_tbl_rbr = qmp_v3_dp_serdes_tbl_rbr,
1621 .serdes_tbl_rbr_num = ARRAY_SIZE(qmp_v3_dp_serdes_tbl_rbr),
1622 .serdes_tbl_hbr = qmp_v3_dp_serdes_tbl_hbr,
1623 .serdes_tbl_hbr_num = ARRAY_SIZE(qmp_v3_dp_serdes_tbl_hbr),
1624 .serdes_tbl_hbr2 = qmp_v3_dp_serdes_tbl_hbr2,
1625 .serdes_tbl_hbr2_num = ARRAY_SIZE(qmp_v3_dp_serdes_tbl_hbr2),
1626 .serdes_tbl_hbr3 = qmp_v3_dp_serdes_tbl_hbr3,
1627 .serdes_tbl_hbr3_num = ARRAY_SIZE(qmp_v3_dp_serdes_tbl_hbr3),
1629 .swing_hbr_rbr = &qmp_dp_v3_voltage_swing_hbr_rbr,
1630 .pre_emphasis_hbr_rbr = &qmp_dp_v3_pre_emphasis_hbr_rbr,
1631 .swing_hbr3_hbr2 = &qmp_dp_v3_voltage_swing_hbr3_hbr2,
1632 .pre_emphasis_hbr3_hbr2 = &qmp_dp_v3_pre_emphasis_hbr3_hbr2,
1634 .dp_aux_init = qmp_v3_dp_aux_init,
1635 .configure_dp_tx = qmp_v3_configure_dp_tx,
1636 .configure_dp_phy = qmp_v3_configure_dp_phy,
1637 .calibrate_dp_phy = qmp_v3_calibrate_dp_phy,
1639 .clk_list = qmp_v4_phy_clk_l,
1640 .num_clks = ARRAY_SIZE(qmp_v4_phy_clk_l),
1641 .reset_list = msm8996_usb3phy_reset_l,
1642 .num_resets = ARRAY_SIZE(msm8996_usb3phy_reset_l),
1643 .vreg_list = qmp_phy_vreg_l,
1644 .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
1645 .regs = qmp_v3_usb3phy_regs_layout,
1648 static const struct qmp_phy_cfg sm8250_usb3dpphy_cfg = {
1649 .serdes_tbl = sm8150_usb3_serdes_tbl,
1650 .serdes_tbl_num = ARRAY_SIZE(sm8150_usb3_serdes_tbl),
1651 .tx_tbl = sm8250_usb3_tx_tbl,
1652 .tx_tbl_num = ARRAY_SIZE(sm8250_usb3_tx_tbl),
1653 .rx_tbl = sm8250_usb3_rx_tbl,
1654 .rx_tbl_num = ARRAY_SIZE(sm8250_usb3_rx_tbl),
1655 .pcs_tbl = sm8250_usb3_pcs_tbl,
1656 .pcs_tbl_num = ARRAY_SIZE(sm8250_usb3_pcs_tbl),
1657 .pcs_usb_tbl = sm8250_usb3_pcs_usb_tbl,
1658 .pcs_usb_tbl_num = ARRAY_SIZE(sm8250_usb3_pcs_usb_tbl),
1660 .dp_serdes_tbl = qmp_v4_dp_serdes_tbl,
1661 .dp_serdes_tbl_num = ARRAY_SIZE(qmp_v4_dp_serdes_tbl),
1662 .dp_tx_tbl = qmp_v4_dp_tx_tbl,
1663 .dp_tx_tbl_num = ARRAY_SIZE(qmp_v4_dp_tx_tbl),
1665 .serdes_tbl_rbr = qmp_v4_dp_serdes_tbl_rbr,
1666 .serdes_tbl_rbr_num = ARRAY_SIZE(qmp_v4_dp_serdes_tbl_rbr),
1667 .serdes_tbl_hbr = qmp_v4_dp_serdes_tbl_hbr,
1668 .serdes_tbl_hbr_num = ARRAY_SIZE(qmp_v4_dp_serdes_tbl_hbr),
1669 .serdes_tbl_hbr2 = qmp_v4_dp_serdes_tbl_hbr2,
1670 .serdes_tbl_hbr2_num = ARRAY_SIZE(qmp_v4_dp_serdes_tbl_hbr2),
1671 .serdes_tbl_hbr3 = qmp_v4_dp_serdes_tbl_hbr3,
1672 .serdes_tbl_hbr3_num = ARRAY_SIZE(qmp_v4_dp_serdes_tbl_hbr3),
1674 .swing_hbr_rbr = &qmp_dp_v3_voltage_swing_hbr_rbr,
1675 .pre_emphasis_hbr_rbr = &qmp_dp_v3_pre_emphasis_hbr_rbr,
1676 .swing_hbr3_hbr2 = &qmp_dp_v3_voltage_swing_hbr3_hbr2,
1677 .pre_emphasis_hbr3_hbr2 = &qmp_dp_v3_pre_emphasis_hbr3_hbr2,
1679 .dp_aux_init = qmp_v4_dp_aux_init,
1680 .configure_dp_tx = qmp_v4_configure_dp_tx,
1681 .configure_dp_phy = qmp_v4_configure_dp_phy,
1682 .calibrate_dp_phy = qmp_v4_calibrate_dp_phy,
1684 .clk_list = qmp_v4_sm8250_usbphy_clk_l,
1685 .num_clks = ARRAY_SIZE(qmp_v4_sm8250_usbphy_clk_l),
1686 .reset_list = msm8996_usb3phy_reset_l,
1687 .num_resets = ARRAY_SIZE(msm8996_usb3phy_reset_l),
1688 .vreg_list = qmp_phy_vreg_l,
1689 .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
1690 .regs = qmp_v4_usb3phy_regs_layout,
1691 .pcs_usb_offset = 0x300,
1693 .has_pwrdn_delay = true,
1696 static const struct qmp_phy_cfg sm8350_usb3dpphy_cfg = {
1697 .offsets = &qmp_combo_offsets_v3,
1699 .serdes_tbl = sm8150_usb3_serdes_tbl,
1700 .serdes_tbl_num = ARRAY_SIZE(sm8150_usb3_serdes_tbl),
1701 .tx_tbl = sm8350_usb3_tx_tbl,
1702 .tx_tbl_num = ARRAY_SIZE(sm8350_usb3_tx_tbl),
1703 .rx_tbl = sm8350_usb3_rx_tbl,
1704 .rx_tbl_num = ARRAY_SIZE(sm8350_usb3_rx_tbl),
1705 .pcs_tbl = sm8350_usb3_pcs_tbl,
1706 .pcs_tbl_num = ARRAY_SIZE(sm8350_usb3_pcs_tbl),
1707 .pcs_usb_tbl = sm8350_usb3_pcs_usb_tbl,
1708 .pcs_usb_tbl_num = ARRAY_SIZE(sm8350_usb3_pcs_usb_tbl),
1710 .dp_serdes_tbl = qmp_v4_dp_serdes_tbl,
1711 .dp_serdes_tbl_num = ARRAY_SIZE(qmp_v4_dp_serdes_tbl),
1712 .dp_tx_tbl = qmp_v5_dp_tx_tbl,
1713 .dp_tx_tbl_num = ARRAY_SIZE(qmp_v5_dp_tx_tbl),
1715 .serdes_tbl_rbr = qmp_v4_dp_serdes_tbl_rbr,
1716 .serdes_tbl_rbr_num = ARRAY_SIZE(qmp_v4_dp_serdes_tbl_rbr),
1717 .serdes_tbl_hbr = qmp_v4_dp_serdes_tbl_hbr,
1718 .serdes_tbl_hbr_num = ARRAY_SIZE(qmp_v4_dp_serdes_tbl_hbr),
1719 .serdes_tbl_hbr2 = qmp_v4_dp_serdes_tbl_hbr2,
1720 .serdes_tbl_hbr2_num = ARRAY_SIZE(qmp_v4_dp_serdes_tbl_hbr2),
1721 .serdes_tbl_hbr3 = qmp_v4_dp_serdes_tbl_hbr3,
1722 .serdes_tbl_hbr3_num = ARRAY_SIZE(qmp_v4_dp_serdes_tbl_hbr3),
1724 .swing_hbr_rbr = &qmp_dp_v4_voltage_swing_hbr_rbr,
1725 .pre_emphasis_hbr_rbr = &qmp_dp_v4_pre_emphasis_hbr_rbr,
1726 .swing_hbr3_hbr2 = &qmp_dp_v3_voltage_swing_hbr3_hbr2,
1727 .pre_emphasis_hbr3_hbr2 = &qmp_dp_v4_pre_emphasis_hbr3_hbr2,
1729 .dp_aux_init = qmp_v4_dp_aux_init,
1730 .configure_dp_tx = qmp_v4_configure_dp_tx,
1731 .configure_dp_phy = qmp_v4_configure_dp_phy,
1732 .calibrate_dp_phy = qmp_v4_calibrate_dp_phy,
1734 .clk_list = qmp_v4_phy_clk_l,
1735 .num_clks = ARRAY_SIZE(qmp_v4_phy_clk_l),
1736 .reset_list = msm8996_usb3phy_reset_l,
1737 .num_resets = ARRAY_SIZE(msm8996_usb3phy_reset_l),
1738 .vreg_list = qmp_phy_vreg_l,
1739 .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
1740 .regs = qmp_v4_usb3phy_regs_layout,
1742 .has_pwrdn_delay = true,
1745 static const struct qmp_phy_cfg sm8550_usb3dpphy_cfg = {
1746 .offsets = &qmp_combo_offsets_v3,
1748 .serdes_tbl = sm8550_usb3_serdes_tbl,
1749 .serdes_tbl_num = ARRAY_SIZE(sm8550_usb3_serdes_tbl),
1750 .tx_tbl = sm8550_usb3_tx_tbl,
1751 .tx_tbl_num = ARRAY_SIZE(sm8550_usb3_tx_tbl),
1752 .rx_tbl = sm8550_usb3_rx_tbl,
1753 .rx_tbl_num = ARRAY_SIZE(sm8550_usb3_rx_tbl),
1754 .pcs_tbl = sm8550_usb3_pcs_tbl,
1755 .pcs_tbl_num = ARRAY_SIZE(sm8550_usb3_pcs_tbl),
1756 .pcs_usb_tbl = sm8550_usb3_pcs_usb_tbl,
1757 .pcs_usb_tbl_num = ARRAY_SIZE(sm8550_usb3_pcs_usb_tbl),
1759 .dp_serdes_tbl = qmp_v6_dp_serdes_tbl,
1760 .dp_serdes_tbl_num = ARRAY_SIZE(qmp_v6_dp_serdes_tbl),
1761 .dp_tx_tbl = qmp_v6_dp_tx_tbl,
1762 .dp_tx_tbl_num = ARRAY_SIZE(qmp_v6_dp_tx_tbl),
1764 .serdes_tbl_rbr = qmp_v6_dp_serdes_tbl_rbr,
1765 .serdes_tbl_rbr_num = ARRAY_SIZE(qmp_v6_dp_serdes_tbl_rbr),
1766 .serdes_tbl_hbr = qmp_v6_dp_serdes_tbl_hbr,
1767 .serdes_tbl_hbr_num = ARRAY_SIZE(qmp_v6_dp_serdes_tbl_hbr),
1768 .serdes_tbl_hbr2 = qmp_v6_dp_serdes_tbl_hbr2,
1769 .serdes_tbl_hbr2_num = ARRAY_SIZE(qmp_v6_dp_serdes_tbl_hbr2),
1770 .serdes_tbl_hbr3 = qmp_v6_dp_serdes_tbl_hbr3,
1771 .serdes_tbl_hbr3_num = ARRAY_SIZE(qmp_v6_dp_serdes_tbl_hbr3),
1773 .swing_hbr_rbr = &qmp_dp_v5_voltage_swing_hbr_rbr,
1774 .pre_emphasis_hbr_rbr = &qmp_dp_v6_pre_emphasis_hbr_rbr,
1775 .swing_hbr3_hbr2 = &qmp_dp_v5_voltage_swing_hbr3_hbr2,
1776 .pre_emphasis_hbr3_hbr2 = &qmp_dp_v5_pre_emphasis_hbr3_hbr2,
1778 .dp_aux_init = qmp_v6_dp_aux_init,
1779 .configure_dp_tx = qmp_v4_configure_dp_tx,
1780 .configure_dp_phy = qmp_v6_configure_dp_phy,
1781 .calibrate_dp_phy = qmp_v4_calibrate_dp_phy,
1783 .regs = qmp_v4_usb3phy_regs_layout,
1784 .clk_list = qmp_v4_phy_clk_l,
1785 .num_clks = ARRAY_SIZE(qmp_v4_phy_clk_l),
1786 .reset_list = msm8996_usb3phy_reset_l,
1787 .num_resets = ARRAY_SIZE(msm8996_usb3phy_reset_l),
1788 .vreg_list = qmp_phy_vreg_l,
1789 .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
1792 static void qmp_combo_configure_lane(void __iomem *base,
1793 const struct qmp_phy_init_tbl tbl[],
1798 const struct qmp_phy_init_tbl *t = tbl;
1803 for (i = 0; i < num; i++, t++) {
1804 if (!(t->lane_mask & lane_mask))
1807 writel(t->val, base + t->offset);
1811 static void qmp_combo_configure(void __iomem *base,
1812 const struct qmp_phy_init_tbl tbl[],
1815 qmp_combo_configure_lane(base, tbl, num, 0xff);
1818 static int qmp_combo_dp_serdes_init(struct qmp_combo *qmp)
1820 const struct qmp_phy_cfg *cfg = qmp->cfg;
1821 void __iomem *serdes = qmp->dp_serdes;
1822 const struct phy_configure_opts_dp *dp_opts = &qmp->dp_opts;
1824 qmp_combo_configure(serdes, cfg->dp_serdes_tbl, cfg->dp_serdes_tbl_num);
1826 switch (dp_opts->link_rate) {
1828 qmp_combo_configure(serdes, cfg->serdes_tbl_rbr,
1829 cfg->serdes_tbl_rbr_num);
1832 qmp_combo_configure(serdes, cfg->serdes_tbl_hbr,
1833 cfg->serdes_tbl_hbr_num);
1836 qmp_combo_configure(serdes, cfg->serdes_tbl_hbr2,
1837 cfg->serdes_tbl_hbr2_num);
1840 qmp_combo_configure(serdes, cfg->serdes_tbl_hbr3,
1841 cfg->serdes_tbl_hbr3_num);
1844 /* Other link rates aren't supported */
1851 static void qmp_v3_dp_aux_init(struct qmp_combo *qmp)
1853 writel(DP_PHY_PD_CTL_PWRDN | DP_PHY_PD_CTL_AUX_PWRDN |
1854 DP_PHY_PD_CTL_PLL_PWRDN | DP_PHY_PD_CTL_DP_CLAMP_EN,
1855 qmp->dp_dp_phy + QSERDES_DP_PHY_PD_CTL);
1857 /* Turn on BIAS current for PHY/PLL */
1858 writel(QSERDES_V3_COM_BIAS_EN | QSERDES_V3_COM_BIAS_EN_MUX |
1859 QSERDES_V3_COM_CLKBUF_L_EN | QSERDES_V3_COM_EN_SYSCLK_TX_SEL,
1860 qmp->dp_serdes + QSERDES_V3_COM_BIAS_EN_CLKBUFLR_EN);
1862 writel(DP_PHY_PD_CTL_PSR_PWRDN, qmp->dp_dp_phy + QSERDES_DP_PHY_PD_CTL);
1864 writel(DP_PHY_PD_CTL_PWRDN | DP_PHY_PD_CTL_AUX_PWRDN |
1865 DP_PHY_PD_CTL_LANE_0_1_PWRDN |
1866 DP_PHY_PD_CTL_LANE_2_3_PWRDN | DP_PHY_PD_CTL_PLL_PWRDN |
1867 DP_PHY_PD_CTL_DP_CLAMP_EN,
1868 qmp->dp_dp_phy + QSERDES_DP_PHY_PD_CTL);
1870 writel(QSERDES_V3_COM_BIAS_EN |
1871 QSERDES_V3_COM_BIAS_EN_MUX | QSERDES_V3_COM_CLKBUF_R_EN |
1872 QSERDES_V3_COM_CLKBUF_L_EN | QSERDES_V3_COM_EN_SYSCLK_TX_SEL |
1873 QSERDES_V3_COM_CLKBUF_RX_DRIVE_L,
1874 qmp->dp_serdes + QSERDES_V3_COM_BIAS_EN_CLKBUFLR_EN);
1876 writel(0x00, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG0);
1877 writel(0x13, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG1);
1878 writel(0x24, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG2);
1879 writel(0x00, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG3);
1880 writel(0x0a, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG4);
1881 writel(0x26, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG5);
1882 writel(0x0a, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG6);
1883 writel(0x03, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG7);
1884 writel(0xbb, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG8);
1885 writel(0x03, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG9);
1886 qmp->dp_aux_cfg = 0;
1888 writel(PHY_AUX_STOP_ERR_MASK | PHY_AUX_DEC_ERR_MASK |
1889 PHY_AUX_SYNC_ERR_MASK | PHY_AUX_ALIGN_ERR_MASK |
1890 PHY_AUX_REQ_ERR_MASK,
1891 qmp->dp_dp_phy + QSERDES_V3_DP_PHY_AUX_INTERRUPT_MASK);
1894 static int qmp_combo_configure_dp_swing(struct qmp_combo *qmp,
1895 unsigned int drv_lvl_reg, unsigned int emp_post_reg)
1897 const struct phy_configure_opts_dp *dp_opts = &qmp->dp_opts;
1898 const struct qmp_phy_cfg *cfg = qmp->cfg;
1899 unsigned int v_level = 0, p_level = 0;
1900 u8 voltage_swing_cfg, pre_emphasis_cfg;
1903 for (i = 0; i < dp_opts->lanes; i++) {
1904 v_level = max(v_level, dp_opts->voltage[i]);
1905 p_level = max(p_level, dp_opts->pre[i]);
1908 if (dp_opts->link_rate <= 2700) {
1909 voltage_swing_cfg = (*cfg->swing_hbr_rbr)[v_level][p_level];
1910 pre_emphasis_cfg = (*cfg->pre_emphasis_hbr_rbr)[v_level][p_level];
1912 voltage_swing_cfg = (*cfg->swing_hbr3_hbr2)[v_level][p_level];
1913 pre_emphasis_cfg = (*cfg->pre_emphasis_hbr3_hbr2)[v_level][p_level];
1916 /* TODO: Move check to config check */
1917 if (voltage_swing_cfg == 0xFF && pre_emphasis_cfg == 0xFF)
1920 /* Enable MUX to use Cursor values from these registers */
1921 voltage_swing_cfg |= DP_PHY_TXn_TX_DRV_LVL_MUX_EN;
1922 pre_emphasis_cfg |= DP_PHY_TXn_TX_EMP_POST1_LVL_MUX_EN;
1924 writel(voltage_swing_cfg, qmp->dp_tx + drv_lvl_reg);
1925 writel(pre_emphasis_cfg, qmp->dp_tx + emp_post_reg);
1926 writel(voltage_swing_cfg, qmp->dp_tx2 + drv_lvl_reg);
1927 writel(pre_emphasis_cfg, qmp->dp_tx2 + emp_post_reg);
1932 static void qmp_v3_configure_dp_tx(struct qmp_combo *qmp)
1934 const struct phy_configure_opts_dp *dp_opts = &qmp->dp_opts;
1935 u32 bias_en, drvr_en;
1937 if (qmp_combo_configure_dp_swing(qmp, QSERDES_V3_TX_TX_DRV_LVL,
1938 QSERDES_V3_TX_TX_EMP_POST1_LVL) < 0)
1941 if (dp_opts->lanes == 1) {
1949 writel(drvr_en, qmp->dp_tx + QSERDES_V3_TX_HIGHZ_DRVR_EN);
1950 writel(bias_en, qmp->dp_tx + QSERDES_V3_TX_TRANSCEIVER_BIAS_EN);
1951 writel(drvr_en, qmp->dp_tx2 + QSERDES_V3_TX_HIGHZ_DRVR_EN);
1952 writel(bias_en, qmp->dp_tx2 + QSERDES_V3_TX_TRANSCEIVER_BIAS_EN);
1955 static bool qmp_combo_configure_dp_mode(struct qmp_combo *qmp)
1958 bool reverse = false;
1960 val = DP_PHY_PD_CTL_PWRDN | DP_PHY_PD_CTL_AUX_PWRDN |
1961 DP_PHY_PD_CTL_PLL_PWRDN | DP_PHY_PD_CTL_DP_CLAMP_EN;
1964 * TODO: Assume orientation is CC1 for now and two lanes, need to
1965 * use type-c connector to understand orientation and lanes.
1967 * Otherwise val changes to be like below if this code understood
1968 * the orientation of the type-c cable.
1970 * if (lane_cnt == 4 || orientation == ORIENTATION_CC2)
1971 * val |= DP_PHY_PD_CTL_LANE_0_1_PWRDN;
1972 * if (lane_cnt == 4 || orientation == ORIENTATION_CC1)
1973 * val |= DP_PHY_PD_CTL_LANE_2_3_PWRDN;
1974 * if (orientation == ORIENTATION_CC2)
1975 * writel(0x4c, qmp->dp_dp_phy + QSERDES_V3_DP_PHY_MODE);
1977 val |= DP_PHY_PD_CTL_LANE_2_3_PWRDN;
1978 writel(val, qmp->dp_dp_phy + QSERDES_DP_PHY_PD_CTL);
1980 writel(0x5c, qmp->dp_dp_phy + QSERDES_DP_PHY_MODE);
1985 static int qmp_v3_configure_dp_phy(struct qmp_combo *qmp)
1987 const struct phy_configure_opts_dp *dp_opts = &qmp->dp_opts;
1988 u32 phy_vco_div, status;
1989 unsigned long pixel_freq;
1991 qmp_combo_configure_dp_mode(qmp);
1993 writel(0x05, qmp->dp_dp_phy + QSERDES_V3_DP_PHY_TX0_TX1_LANE_CTL);
1994 writel(0x05, qmp->dp_dp_phy + QSERDES_V3_DP_PHY_TX2_TX3_LANE_CTL);
1996 switch (dp_opts->link_rate) {
1999 pixel_freq = 1620000000UL / 2;
2003 pixel_freq = 2700000000UL / 2;
2007 pixel_freq = 5400000000UL / 4;
2011 pixel_freq = 8100000000UL / 6;
2014 /* Other link rates aren't supported */
2017 writel(phy_vco_div, qmp->dp_dp_phy + QSERDES_V3_DP_PHY_VCO_DIV);
2019 clk_set_rate(qmp->dp_link_hw.clk, dp_opts->link_rate * 100000);
2020 clk_set_rate(qmp->dp_pixel_hw.clk, pixel_freq);
2022 writel(0x04, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG2);
2023 writel(0x01, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG);
2024 writel(0x05, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG);
2025 writel(0x01, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG);
2026 writel(0x09, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG);
2028 writel(0x20, qmp->dp_serdes + QSERDES_V3_COM_RESETSM_CNTRL);
2030 if (readl_poll_timeout(qmp->dp_serdes + QSERDES_V3_COM_C_READY_STATUS,
2032 ((status & BIT(0)) > 0),
2037 writel(0x19, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG);
2039 if (readl_poll_timeout(qmp->dp_dp_phy + QSERDES_V3_DP_PHY_STATUS,
2041 ((status & BIT(1)) > 0),
2046 writel(0x18, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG);
2048 writel(0x19, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG);
2050 return readl_poll_timeout(qmp->dp_dp_phy + QSERDES_V3_DP_PHY_STATUS,
2052 ((status & BIT(1)) > 0),
2058 * We need to calibrate the aux setting here as many times
2059 * as the caller tries
2061 static int qmp_v3_calibrate_dp_phy(struct qmp_combo *qmp)
2063 static const u8 cfg1_settings[] = { 0x13, 0x23, 0x1d };
2067 qmp->dp_aux_cfg %= ARRAY_SIZE(cfg1_settings);
2068 val = cfg1_settings[qmp->dp_aux_cfg];
2070 writel(val, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG1);
2075 static void qmp_v4_dp_aux_init(struct qmp_combo *qmp)
2077 writel(DP_PHY_PD_CTL_PWRDN | DP_PHY_PD_CTL_PSR_PWRDN | DP_PHY_PD_CTL_AUX_PWRDN |
2078 DP_PHY_PD_CTL_PLL_PWRDN | DP_PHY_PD_CTL_DP_CLAMP_EN,
2079 qmp->dp_dp_phy + QSERDES_DP_PHY_PD_CTL);
2081 /* Turn on BIAS current for PHY/PLL */
2082 writel(0x17, qmp->dp_serdes + QSERDES_V4_COM_BIAS_EN_CLKBUFLR_EN);
2084 writel(0x00, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG0);
2085 writel(0x13, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG1);
2086 writel(0xa4, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG2);
2087 writel(0x00, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG3);
2088 writel(0x0a, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG4);
2089 writel(0x26, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG5);
2090 writel(0x0a, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG6);
2091 writel(0x03, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG7);
2092 writel(0xb7, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG8);
2093 writel(0x03, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG9);
2094 qmp->dp_aux_cfg = 0;
2096 writel(PHY_AUX_STOP_ERR_MASK | PHY_AUX_DEC_ERR_MASK |
2097 PHY_AUX_SYNC_ERR_MASK | PHY_AUX_ALIGN_ERR_MASK |
2098 PHY_AUX_REQ_ERR_MASK,
2099 qmp->dp_dp_phy + QSERDES_V4_DP_PHY_AUX_INTERRUPT_MASK);
2102 static void qmp_v6_dp_aux_init(struct qmp_combo *qmp)
2104 writel(DP_PHY_PD_CTL_PWRDN | DP_PHY_PD_CTL_PSR_PWRDN | DP_PHY_PD_CTL_AUX_PWRDN |
2105 DP_PHY_PD_CTL_PLL_PWRDN | DP_PHY_PD_CTL_DP_CLAMP_EN,
2106 qmp->dp_dp_phy + QSERDES_DP_PHY_PD_CTL);
2108 /* Turn on BIAS current for PHY/PLL */
2109 writel(0x17, qmp->dp_serdes + QSERDES_V6_COM_PLL_BIAS_EN_CLK_BUFLR_EN);
2111 writel(0x00, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG0);
2112 writel(0x13, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG1);
2113 writel(0xa4, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG2);
2114 writel(0x00, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG3);
2115 writel(0x0a, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG4);
2116 writel(0x26, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG5);
2117 writel(0x0a, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG6);
2118 writel(0x03, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG7);
2119 writel(0xb7, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG8);
2120 writel(0x03, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG9);
2121 qmp->dp_aux_cfg = 0;
2123 writel(PHY_AUX_STOP_ERR_MASK | PHY_AUX_DEC_ERR_MASK |
2124 PHY_AUX_SYNC_ERR_MASK | PHY_AUX_ALIGN_ERR_MASK |
2125 PHY_AUX_REQ_ERR_MASK,
2126 qmp->dp_dp_phy + QSERDES_V4_DP_PHY_AUX_INTERRUPT_MASK);
2129 static void qmp_v4_configure_dp_tx(struct qmp_combo *qmp)
2131 /* Program default values before writing proper values */
2132 writel(0x27, qmp->dp_tx + QSERDES_V4_TX_TX_DRV_LVL);
2133 writel(0x27, qmp->dp_tx2 + QSERDES_V4_TX_TX_DRV_LVL);
2135 writel(0x20, qmp->dp_tx + QSERDES_V4_TX_TX_EMP_POST1_LVL);
2136 writel(0x20, qmp->dp_tx2 + QSERDES_V4_TX_TX_EMP_POST1_LVL);
2138 qmp_combo_configure_dp_swing(qmp, QSERDES_V4_TX_TX_DRV_LVL,
2139 QSERDES_V4_TX_TX_EMP_POST1_LVL);
2142 static int qmp_v456_configure_dp_phy(struct qmp_combo *qmp,
2143 unsigned int com_resetm_ctrl_reg,
2144 unsigned int com_c_ready_status_reg,
2145 unsigned int dp_phy_status_reg)
2147 const struct phy_configure_opts_dp *dp_opts = &qmp->dp_opts;
2148 u32 phy_vco_div, status;
2149 unsigned long pixel_freq;
2151 writel(0x0f, qmp->dp_dp_phy + QSERDES_V4_DP_PHY_CFG_1);
2153 qmp_combo_configure_dp_mode(qmp);
2155 writel(0x13, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG1);
2156 writel(0xa4, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG2);
2158 writel(0x05, qmp->dp_dp_phy + QSERDES_V4_DP_PHY_TX0_TX1_LANE_CTL);
2159 writel(0x05, qmp->dp_dp_phy + QSERDES_V4_DP_PHY_TX2_TX3_LANE_CTL);
2161 switch (dp_opts->link_rate) {
2164 pixel_freq = 1620000000UL / 2;
2168 pixel_freq = 2700000000UL / 2;
2172 pixel_freq = 5400000000UL / 4;
2176 pixel_freq = 8100000000UL / 6;
2179 /* Other link rates aren't supported */
2182 writel(phy_vco_div, qmp->dp_dp_phy + QSERDES_V4_DP_PHY_VCO_DIV);
2184 clk_set_rate(qmp->dp_link_hw.clk, dp_opts->link_rate * 100000);
2185 clk_set_rate(qmp->dp_pixel_hw.clk, pixel_freq);
2187 writel(0x01, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG);
2188 writel(0x05, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG);
2189 writel(0x01, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG);
2190 writel(0x09, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG);
2192 writel(0x20, qmp->dp_serdes + com_resetm_ctrl_reg);
2194 if (readl_poll_timeout(qmp->dp_serdes + com_c_ready_status_reg,
2196 ((status & BIT(0)) > 0),
2201 if (readl_poll_timeout(qmp->dp_serdes + QSERDES_V4_COM_CMN_STATUS,
2203 ((status & BIT(0)) > 0),
2208 if (readl_poll_timeout(qmp->dp_serdes + QSERDES_V4_COM_CMN_STATUS,
2210 ((status & BIT(1)) > 0),
2215 writel(0x19, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG);
2217 if (readl_poll_timeout(qmp->dp_dp_phy + dp_phy_status_reg,
2219 ((status & BIT(0)) > 0),
2224 if (readl_poll_timeout(qmp->dp_dp_phy + dp_phy_status_reg,
2226 ((status & BIT(1)) > 0),
2234 static int qmp_v4_configure_dp_phy(struct qmp_combo *qmp)
2236 const struct phy_configure_opts_dp *dp_opts = &qmp->dp_opts;
2237 u32 bias0_en, drvr0_en, bias1_en, drvr1_en;
2238 bool reverse = false;
2242 ret = qmp_v456_configure_dp_phy(qmp, QSERDES_V4_COM_RESETSM_CNTRL,
2243 QSERDES_V4_COM_C_READY_STATUS,
2244 QSERDES_V4_DP_PHY_STATUS);
2249 * At least for 7nm DP PHY this has to be done after enabling link
2253 if (dp_opts->lanes == 1) {
2254 bias0_en = reverse ? 0x3e : 0x15;
2255 bias1_en = reverse ? 0x15 : 0x3e;
2256 drvr0_en = reverse ? 0x13 : 0x10;
2257 drvr1_en = reverse ? 0x10 : 0x13;
2258 } else if (dp_opts->lanes == 2) {
2259 bias0_en = reverse ? 0x3f : 0x15;
2260 bias1_en = reverse ? 0x15 : 0x3f;
2270 writel(drvr0_en, qmp->dp_tx + QSERDES_V4_TX_HIGHZ_DRVR_EN);
2271 writel(bias0_en, qmp->dp_tx + QSERDES_V4_TX_TRANSCEIVER_BIAS_EN);
2272 writel(drvr1_en, qmp->dp_tx2 + QSERDES_V4_TX_HIGHZ_DRVR_EN);
2273 writel(bias1_en, qmp->dp_tx2 + QSERDES_V4_TX_TRANSCEIVER_BIAS_EN);
2275 writel(0x18, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG);
2277 writel(0x19, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG);
2279 if (readl_poll_timeout(qmp->dp_dp_phy + QSERDES_V4_DP_PHY_STATUS,
2281 ((status & BIT(1)) > 0),
2286 writel(0x0a, qmp->dp_tx + QSERDES_V4_TX_TX_POL_INV);
2287 writel(0x0a, qmp->dp_tx2 + QSERDES_V4_TX_TX_POL_INV);
2289 writel(0x27, qmp->dp_tx + QSERDES_V4_TX_TX_DRV_LVL);
2290 writel(0x27, qmp->dp_tx2 + QSERDES_V4_TX_TX_DRV_LVL);
2292 writel(0x20, qmp->dp_tx + QSERDES_V4_TX_TX_EMP_POST1_LVL);
2293 writel(0x20, qmp->dp_tx2 + QSERDES_V4_TX_TX_EMP_POST1_LVL);
2298 static int qmp_v5_configure_dp_phy(struct qmp_combo *qmp)
2300 const struct phy_configure_opts_dp *dp_opts = &qmp->dp_opts;
2301 u32 bias0_en, drvr0_en, bias1_en, drvr1_en;
2302 bool reverse = false;
2306 ret = qmp_v456_configure_dp_phy(qmp, QSERDES_V4_COM_RESETSM_CNTRL,
2307 QSERDES_V4_COM_C_READY_STATUS,
2308 QSERDES_V4_DP_PHY_STATUS);
2312 if (dp_opts->lanes == 1) {
2313 bias0_en = reverse ? 0x3e : 0x1a;
2314 drvr0_en = reverse ? 0x13 : 0x10;
2315 bias1_en = reverse ? 0x15 : 0x3e;
2316 drvr1_en = reverse ? 0x10 : 0x13;
2317 } else if (dp_opts->lanes == 2) {
2318 bias0_en = reverse ? 0x3f : 0x15;
2320 bias1_en = reverse ? 0x15 : 0x3f;
2329 writel(drvr0_en, qmp->dp_tx + QSERDES_V5_5NM_TX_HIGHZ_DRVR_EN);
2330 writel(bias0_en, qmp->dp_tx + QSERDES_V5_5NM_TX_TRANSCEIVER_BIAS_EN);
2331 writel(drvr1_en, qmp->dp_tx2 + QSERDES_V5_5NM_TX_HIGHZ_DRVR_EN);
2332 writel(bias1_en, qmp->dp_tx2 + QSERDES_V5_5NM_TX_TRANSCEIVER_BIAS_EN);
2334 writel(0x18, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG);
2336 writel(0x19, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG);
2338 if (readl_poll_timeout(qmp->dp_dp_phy + QSERDES_V4_DP_PHY_STATUS,
2340 ((status & BIT(1)) > 0),
2345 writel(0x0a, qmp->dp_tx + QSERDES_V5_5NM_TX_TX_POL_INV);
2346 writel(0x0a, qmp->dp_tx2 + QSERDES_V5_5NM_TX_TX_POL_INV);
2348 writel(0x27, qmp->dp_tx + QSERDES_V5_5NM_TX_TX_DRV_LVL);
2349 writel(0x27, qmp->dp_tx2 + QSERDES_V5_5NM_TX_TX_DRV_LVL);
2351 writel(0x20, qmp->dp_tx + QSERDES_V5_5NM_TX_TX_EMP_POST1_LVL);
2352 writel(0x20, qmp->dp_tx2 + QSERDES_V5_5NM_TX_TX_EMP_POST1_LVL);
2357 static int qmp_v6_configure_dp_phy(struct qmp_combo *qmp)
2359 const struct phy_configure_opts_dp *dp_opts = &qmp->dp_opts;
2360 u32 bias0_en, drvr0_en, bias1_en, drvr1_en;
2361 bool reverse = false;
2365 ret = qmp_v456_configure_dp_phy(qmp, QSERDES_V6_COM_RESETSM_CNTRL,
2366 QSERDES_V6_COM_C_READY_STATUS,
2367 QSERDES_V6_DP_PHY_STATUS);
2371 if (dp_opts->lanes == 1) {
2372 bias0_en = reverse ? 0x3e : 0x1a;
2373 drvr0_en = reverse ? 0x13 : 0x10;
2374 bias1_en = reverse ? 0x15 : 0x3e;
2375 drvr1_en = reverse ? 0x10 : 0x13;
2376 } else if (dp_opts->lanes == 2) {
2377 bias0_en = reverse ? 0x3f : 0x15;
2379 bias1_en = reverse ? 0x15 : 0x3f;
2388 writel(drvr0_en, qmp->dp_tx + QSERDES_V4_TX_HIGHZ_DRVR_EN);
2389 writel(bias0_en, qmp->dp_tx + QSERDES_V4_TX_TRANSCEIVER_BIAS_EN);
2390 writel(drvr1_en, qmp->dp_tx2 + QSERDES_V4_TX_HIGHZ_DRVR_EN);
2391 writel(bias1_en, qmp->dp_tx2 + QSERDES_V4_TX_TRANSCEIVER_BIAS_EN);
2393 writel(0x18, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG);
2395 writel(0x19, qmp->dp_dp_phy + QSERDES_DP_PHY_CFG);
2397 if (readl_poll_timeout(qmp->dp_dp_phy + QSERDES_V6_DP_PHY_STATUS,
2399 ((status & BIT(1)) > 0),
2404 writel(0x0a, qmp->dp_tx + QSERDES_V4_TX_TX_POL_INV);
2405 writel(0x0a, qmp->dp_tx2 + QSERDES_V4_TX_TX_POL_INV);
2407 writel(0x27, qmp->dp_tx + QSERDES_V4_TX_TX_DRV_LVL);
2408 writel(0x27, qmp->dp_tx2 + QSERDES_V4_TX_TX_DRV_LVL);
2410 writel(0x20, qmp->dp_tx + QSERDES_V4_TX_TX_EMP_POST1_LVL);
2411 writel(0x20, qmp->dp_tx2 + QSERDES_V4_TX_TX_EMP_POST1_LVL);
2417 * We need to calibrate the aux setting here as many times
2418 * as the caller tries
2420 static int qmp_v4_calibrate_dp_phy(struct qmp_combo *qmp)
2422 static const u8 cfg1_settings[] = { 0x20, 0x13, 0x23, 0x1d };
2426 qmp->dp_aux_cfg %= ARRAY_SIZE(cfg1_settings);
2427 val = cfg1_settings[qmp->dp_aux_cfg];
2429 writel(val, qmp->dp_dp_phy + QSERDES_DP_PHY_AUX_CFG1);
2434 static int qmp_combo_dp_configure(struct phy *phy, union phy_configure_opts *opts)
2436 const struct phy_configure_opts_dp *dp_opts = &opts->dp;
2437 struct qmp_combo *qmp = phy_get_drvdata(phy);
2438 const struct qmp_phy_cfg *cfg = qmp->cfg;
2440 memcpy(&qmp->dp_opts, dp_opts, sizeof(*dp_opts));
2441 if (qmp->dp_opts.set_voltages) {
2442 cfg->configure_dp_tx(qmp);
2443 qmp->dp_opts.set_voltages = 0;
2449 static int qmp_combo_dp_calibrate(struct phy *phy)
2451 struct qmp_combo *qmp = phy_get_drvdata(phy);
2452 const struct qmp_phy_cfg *cfg = qmp->cfg;
2454 if (cfg->calibrate_dp_phy)
2455 return cfg->calibrate_dp_phy(qmp);
2460 static int qmp_combo_com_init(struct qmp_combo *qmp)
2462 const struct qmp_phy_cfg *cfg = qmp->cfg;
2463 void __iomem *com = qmp->com;
2466 mutex_lock(&qmp->phy_mutex);
2467 if (qmp->init_count++) {
2468 mutex_unlock(&qmp->phy_mutex);
2472 ret = regulator_bulk_enable(cfg->num_vregs, qmp->vregs);
2474 dev_err(qmp->dev, "failed to enable regulators, err=%d\n", ret);
2475 goto err_decrement_count;
2478 ret = reset_control_bulk_assert(cfg->num_resets, qmp->resets);
2480 dev_err(qmp->dev, "reset assert failed\n");
2481 goto err_disable_regulators;
2484 ret = reset_control_bulk_deassert(cfg->num_resets, qmp->resets);
2486 dev_err(qmp->dev, "reset deassert failed\n");
2487 goto err_disable_regulators;
2490 ret = clk_bulk_prepare_enable(cfg->num_clks, qmp->clks);
2492 goto err_assert_reset;
2494 qphy_setbits(com, QPHY_V3_DP_COM_POWER_DOWN_CTRL, SW_PWRDN);
2496 /* override hardware control for reset of qmp phy */
2497 qphy_setbits(com, QPHY_V3_DP_COM_RESET_OVRD_CTRL,
2498 SW_DPPHY_RESET_MUX | SW_DPPHY_RESET |
2499 SW_USB3PHY_RESET_MUX | SW_USB3PHY_RESET);
2501 /* Default type-c orientation, i.e CC1 */
2502 qphy_setbits(com, QPHY_V3_DP_COM_TYPEC_CTRL, 0x02);
2504 qphy_setbits(com, QPHY_V3_DP_COM_PHY_MODE_CTRL, USB3_MODE | DP_MODE);
2506 /* bring both QMP USB and QMP DP PHYs PCS block out of reset */
2507 qphy_clrbits(com, QPHY_V3_DP_COM_RESET_OVRD_CTRL,
2508 SW_DPPHY_RESET_MUX | SW_DPPHY_RESET |
2509 SW_USB3PHY_RESET_MUX | SW_USB3PHY_RESET);
2511 qphy_clrbits(com, QPHY_V3_DP_COM_SWI_CTRL, 0x03);
2512 qphy_clrbits(com, QPHY_V3_DP_COM_SW_RESET, SW_RESET);
2514 qphy_setbits(qmp->pcs, cfg->regs[QPHY_PCS_POWER_DOWN_CONTROL],
2517 mutex_unlock(&qmp->phy_mutex);
2522 reset_control_bulk_assert(cfg->num_resets, qmp->resets);
2523 err_disable_regulators:
2524 regulator_bulk_disable(cfg->num_vregs, qmp->vregs);
2525 err_decrement_count:
2527 mutex_unlock(&qmp->phy_mutex);
2532 static int qmp_combo_com_exit(struct qmp_combo *qmp)
2534 const struct qmp_phy_cfg *cfg = qmp->cfg;
2536 mutex_lock(&qmp->phy_mutex);
2537 if (--qmp->init_count) {
2538 mutex_unlock(&qmp->phy_mutex);
2542 reset_control_bulk_assert(cfg->num_resets, qmp->resets);
2544 clk_bulk_disable_unprepare(cfg->num_clks, qmp->clks);
2546 regulator_bulk_disable(cfg->num_vregs, qmp->vregs);
2548 mutex_unlock(&qmp->phy_mutex);
2553 static int qmp_combo_dp_init(struct phy *phy)
2555 struct qmp_combo *qmp = phy_get_drvdata(phy);
2556 const struct qmp_phy_cfg *cfg = qmp->cfg;
2559 ret = qmp_combo_com_init(qmp);
2563 cfg->dp_aux_init(qmp);
2568 static int qmp_combo_dp_exit(struct phy *phy)
2570 struct qmp_combo *qmp = phy_get_drvdata(phy);
2572 qmp_combo_com_exit(qmp);
2577 static int qmp_combo_dp_power_on(struct phy *phy)
2579 struct qmp_combo *qmp = phy_get_drvdata(phy);
2580 const struct qmp_phy_cfg *cfg = qmp->cfg;
2581 void __iomem *tx = qmp->dp_tx;
2582 void __iomem *tx2 = qmp->dp_tx2;
2584 qmp_combo_dp_serdes_init(qmp);
2586 qmp_combo_configure_lane(tx, cfg->dp_tx_tbl, cfg->dp_tx_tbl_num, 1);
2587 qmp_combo_configure_lane(tx2, cfg->dp_tx_tbl, cfg->dp_tx_tbl_num, 2);
2589 /* Configure special DP tx tunings */
2590 cfg->configure_dp_tx(qmp);
2592 /* Configure link rate, swing, etc. */
2593 cfg->configure_dp_phy(qmp);
2598 static int qmp_combo_dp_power_off(struct phy *phy)
2600 struct qmp_combo *qmp = phy_get_drvdata(phy);
2602 /* Assert DP PHY power down */
2603 writel(DP_PHY_PD_CTL_PSR_PWRDN, qmp->dp_dp_phy + QSERDES_DP_PHY_PD_CTL);
2608 static int qmp_combo_usb_power_on(struct phy *phy)
2610 struct qmp_combo *qmp = phy_get_drvdata(phy);
2611 const struct qmp_phy_cfg *cfg = qmp->cfg;
2612 void __iomem *serdes = qmp->serdes;
2613 void __iomem *tx = qmp->tx;
2614 void __iomem *rx = qmp->rx;
2615 void __iomem *tx2 = qmp->tx2;
2616 void __iomem *rx2 = qmp->rx2;
2617 void __iomem *pcs = qmp->pcs;
2618 void __iomem *status;
2622 qmp_combo_configure(serdes, cfg->serdes_tbl, cfg->serdes_tbl_num);
2624 ret = clk_prepare_enable(qmp->pipe_clk);
2626 dev_err(qmp->dev, "pipe_clk enable failed err=%d\n", ret);
2630 /* Tx, Rx, and PCS configurations */
2631 qmp_combo_configure_lane(tx, cfg->tx_tbl, cfg->tx_tbl_num, 1);
2632 qmp_combo_configure_lane(tx2, cfg->tx_tbl, cfg->tx_tbl_num, 2);
2634 qmp_combo_configure_lane(rx, cfg->rx_tbl, cfg->rx_tbl_num, 1);
2635 qmp_combo_configure_lane(rx2, cfg->rx_tbl, cfg->rx_tbl_num, 2);
2637 qmp_combo_configure(pcs, cfg->pcs_tbl, cfg->pcs_tbl_num);
2639 if (cfg->has_pwrdn_delay)
2640 usleep_range(10, 20);
2642 /* Pull PHY out of reset state */
2643 qphy_clrbits(pcs, cfg->regs[QPHY_SW_RESET], SW_RESET);
2645 /* start SerDes and Phy-Coding-Sublayer */
2646 qphy_setbits(pcs, cfg->regs[QPHY_START_CTRL], SERDES_START | PCS_START);
2648 status = pcs + cfg->regs[QPHY_PCS_STATUS];
2649 ret = readl_poll_timeout(status, val, !(val & PHYSTATUS), 200,
2650 PHY_INIT_COMPLETE_TIMEOUT);
2652 dev_err(qmp->dev, "phy initialization timed-out\n");
2653 goto err_disable_pipe_clk;
2658 err_disable_pipe_clk:
2659 clk_disable_unprepare(qmp->pipe_clk);
2664 static int qmp_combo_usb_power_off(struct phy *phy)
2666 struct qmp_combo *qmp = phy_get_drvdata(phy);
2667 const struct qmp_phy_cfg *cfg = qmp->cfg;
2669 clk_disable_unprepare(qmp->pipe_clk);
2672 qphy_setbits(qmp->pcs, cfg->regs[QPHY_SW_RESET], SW_RESET);
2674 /* stop SerDes and Phy-Coding-Sublayer */
2675 qphy_clrbits(qmp->pcs, cfg->regs[QPHY_START_CTRL],
2676 SERDES_START | PCS_START);
2678 /* Put PHY into POWER DOWN state: active low */
2679 qphy_clrbits(qmp->pcs, cfg->regs[QPHY_PCS_POWER_DOWN_CONTROL],
2685 static int qmp_combo_usb_init(struct phy *phy)
2687 struct qmp_combo *qmp = phy_get_drvdata(phy);
2690 ret = qmp_combo_com_init(qmp);
2694 ret = qmp_combo_usb_power_on(phy);
2696 qmp_combo_com_exit(qmp);
2701 static int qmp_combo_usb_exit(struct phy *phy)
2703 struct qmp_combo *qmp = phy_get_drvdata(phy);
2706 ret = qmp_combo_usb_power_off(phy);
2710 return qmp_combo_com_exit(qmp);
2713 static int qmp_combo_usb_set_mode(struct phy *phy, enum phy_mode mode, int submode)
2715 struct qmp_combo *qmp = phy_get_drvdata(phy);
2722 static const struct phy_ops qmp_combo_usb_phy_ops = {
2723 .init = qmp_combo_usb_init,
2724 .exit = qmp_combo_usb_exit,
2725 .set_mode = qmp_combo_usb_set_mode,
2726 .owner = THIS_MODULE,
2729 static const struct phy_ops qmp_combo_dp_phy_ops = {
2730 .init = qmp_combo_dp_init,
2731 .configure = qmp_combo_dp_configure,
2732 .power_on = qmp_combo_dp_power_on,
2733 .calibrate = qmp_combo_dp_calibrate,
2734 .power_off = qmp_combo_dp_power_off,
2735 .exit = qmp_combo_dp_exit,
2736 .owner = THIS_MODULE,
2739 static void qmp_combo_enable_autonomous_mode(struct qmp_combo *qmp)
2741 const struct qmp_phy_cfg *cfg = qmp->cfg;
2742 void __iomem *pcs_usb = qmp->pcs_usb ?: qmp->pcs;
2743 void __iomem *pcs_misc = qmp->pcs_misc;
2746 if (qmp->mode == PHY_MODE_USB_HOST_SS ||
2747 qmp->mode == PHY_MODE_USB_DEVICE_SS)
2748 intr_mask = ARCVR_DTCT_EN | ALFPS_DTCT_EN;
2750 intr_mask = ARCVR_DTCT_EN | ARCVR_DTCT_EVENT_SEL;
2752 /* Clear any pending interrupts status */
2753 qphy_setbits(pcs_usb, cfg->regs[QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR], IRQ_CLEAR);
2754 /* Writing 1 followed by 0 clears the interrupt */
2755 qphy_clrbits(pcs_usb, cfg->regs[QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR], IRQ_CLEAR);
2757 qphy_clrbits(pcs_usb, cfg->regs[QPHY_PCS_AUTONOMOUS_MODE_CTRL],
2758 ARCVR_DTCT_EN | ALFPS_DTCT_EN | ARCVR_DTCT_EVENT_SEL);
2760 /* Enable required PHY autonomous mode interrupts */
2761 qphy_setbits(pcs_usb, cfg->regs[QPHY_PCS_AUTONOMOUS_MODE_CTRL], intr_mask);
2763 /* Enable i/o clamp_n for autonomous mode */
2765 qphy_clrbits(pcs_misc, QPHY_V3_PCS_MISC_CLAMP_ENABLE, CLAMP_EN);
2768 static void qmp_combo_disable_autonomous_mode(struct qmp_combo *qmp)
2770 const struct qmp_phy_cfg *cfg = qmp->cfg;
2771 void __iomem *pcs_usb = qmp->pcs_usb ?: qmp->pcs;
2772 void __iomem *pcs_misc = qmp->pcs_misc;
2774 /* Disable i/o clamp_n on resume for normal mode */
2776 qphy_setbits(pcs_misc, QPHY_V3_PCS_MISC_CLAMP_ENABLE, CLAMP_EN);
2778 qphy_clrbits(pcs_usb, cfg->regs[QPHY_PCS_AUTONOMOUS_MODE_CTRL],
2779 ARCVR_DTCT_EN | ARCVR_DTCT_EVENT_SEL | ALFPS_DTCT_EN);
2781 qphy_setbits(pcs_usb, cfg->regs[QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR], IRQ_CLEAR);
2782 /* Writing 1 followed by 0 clears the interrupt */
2783 qphy_clrbits(pcs_usb, cfg->regs[QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR], IRQ_CLEAR);
2786 static int __maybe_unused qmp_combo_runtime_suspend(struct device *dev)
2788 struct qmp_combo *qmp = dev_get_drvdata(dev);
2789 const struct qmp_phy_cfg *cfg = qmp->cfg;
2791 dev_vdbg(dev, "Suspending QMP phy, mode:%d\n", qmp->mode);
2793 if (!qmp->init_count) {
2794 dev_vdbg(dev, "PHY not initialized, bailing out\n");
2798 qmp_combo_enable_autonomous_mode(qmp);
2800 clk_disable_unprepare(qmp->pipe_clk);
2801 clk_bulk_disable_unprepare(cfg->num_clks, qmp->clks);
2806 static int __maybe_unused qmp_combo_runtime_resume(struct device *dev)
2808 struct qmp_combo *qmp = dev_get_drvdata(dev);
2809 const struct qmp_phy_cfg *cfg = qmp->cfg;
2812 dev_vdbg(dev, "Resuming QMP phy, mode:%d\n", qmp->mode);
2814 if (!qmp->init_count) {
2815 dev_vdbg(dev, "PHY not initialized, bailing out\n");
2819 ret = clk_bulk_prepare_enable(cfg->num_clks, qmp->clks);
2823 ret = clk_prepare_enable(qmp->pipe_clk);
2825 dev_err(dev, "pipe_clk enable failed, err=%d\n", ret);
2826 clk_bulk_disable_unprepare(cfg->num_clks, qmp->clks);
2830 qmp_combo_disable_autonomous_mode(qmp);
2835 static const struct dev_pm_ops qmp_combo_pm_ops = {
2836 SET_RUNTIME_PM_OPS(qmp_combo_runtime_suspend,
2837 qmp_combo_runtime_resume, NULL)
2840 static int qmp_combo_vreg_init(struct qmp_combo *qmp)
2842 const struct qmp_phy_cfg *cfg = qmp->cfg;
2843 struct device *dev = qmp->dev;
2844 int num = cfg->num_vregs;
2847 qmp->vregs = devm_kcalloc(dev, num, sizeof(*qmp->vregs), GFP_KERNEL);
2851 for (i = 0; i < num; i++)
2852 qmp->vregs[i].supply = cfg->vreg_list[i].name;
2854 ret = devm_regulator_bulk_get(dev, num, qmp->vregs);
2856 dev_err(dev, "failed at devm_regulator_bulk_get\n");
2860 for (i = 0; i < num; i++) {
2861 ret = regulator_set_load(qmp->vregs[i].consumer,
2862 cfg->vreg_list[i].enable_load);
2864 dev_err(dev, "failed to set load at %s\n",
2865 qmp->vregs[i].supply);
2873 static int qmp_combo_reset_init(struct qmp_combo *qmp)
2875 const struct qmp_phy_cfg *cfg = qmp->cfg;
2876 struct device *dev = qmp->dev;
2880 qmp->resets = devm_kcalloc(dev, cfg->num_resets,
2881 sizeof(*qmp->resets), GFP_KERNEL);
2885 for (i = 0; i < cfg->num_resets; i++)
2886 qmp->resets[i].id = cfg->reset_list[i];
2888 ret = devm_reset_control_bulk_get_exclusive(dev, cfg->num_resets, qmp->resets);
2890 return dev_err_probe(dev, ret, "failed to get resets\n");
2895 static int qmp_combo_clk_init(struct qmp_combo *qmp)
2897 const struct qmp_phy_cfg *cfg = qmp->cfg;
2898 struct device *dev = qmp->dev;
2899 int num = cfg->num_clks;
2902 qmp->clks = devm_kcalloc(dev, num, sizeof(*qmp->clks), GFP_KERNEL);
2906 for (i = 0; i < num; i++)
2907 qmp->clks[i].id = cfg->clk_list[i];
2909 return devm_clk_bulk_get(dev, num, qmp->clks);
2912 static void phy_clk_release_provider(void *res)
2914 of_clk_del_provider(res);
2918 * Register a fixed rate pipe clock.
2920 * The <s>_pipe_clksrc generated by PHY goes to the GCC that gate
2921 * controls it. The <s>_pipe_clk coming out of the GCC is requested
2922 * by the PHY driver for its operations.
2923 * We register the <s>_pipe_clksrc here. The gcc driver takes care
2924 * of assigning this <s>_pipe_clksrc as parent to <s>_pipe_clk.
2925 * Below picture shows this relationship.
2928 * | PHY block |<<---------------------------------------+
2930 * | +-------+ | +-----+ |
2931 * I/P---^-->| PLL |---^--->pipe_clksrc--->| GCC |--->pipe_clk---+
2932 * clk | +-------+ | +-----+
2935 static int phy_pipe_clk_register(struct qmp_combo *qmp, struct device_node *np)
2937 struct clk_fixed_rate *fixed = &qmp->pipe_clk_fixed;
2938 struct clk_init_data init = { };
2941 snprintf(name, sizeof(name), "%s::pipe_clk", dev_name(qmp->dev));
2943 init.ops = &clk_fixed_rate_ops;
2945 /* controllers using QMP phys use 125MHz pipe clock interface */
2946 fixed->fixed_rate = 125000000;
2947 fixed->hw.init = &init;
2949 return devm_clk_hw_register(qmp->dev, &fixed->hw);
2953 * Display Port PLL driver block diagram for branch clocks
2955 * +------------------------------+
2958 * | +-------------------+ |
2959 * | | (DP PLL/VCO) | |
2960 * | +---------+---------+ |
2962 * | +----------+-----------+ |
2963 * | | hsclk_divsel_clk_src | |
2964 * | +----------+-----------+ |
2965 * +------------------------------+
2967 * +---------<---------v------------>----------+
2969 * +--------v----------------+ |
2970 * | dp_phy_pll_link_clk | |
2972 * +--------+----------------+ |
2976 * Input to DISPCC block |
2977 * for link clk, crypto clk |
2978 * and interface clock |
2981 * +--------<------------+-----------------+---<---+
2983 * +----v---------+ +--------v-----+ +--------v------+
2984 * | vco_divided | | vco_divided | | vco_divided |
2985 * | _clk_src | | _clk_src | | _clk_src |
2987 * |divsel_six | | divsel_two | | divsel_four |
2988 * +-------+------+ +-----+--------+ +--------+------+
2990 * v---->----------v-------------<------v
2992 * +----------+-----------------+
2993 * | dp_phy_pll_vco_div_clk |
2994 * +---------+------------------+
2997 * Input to DISPCC block
2998 * for DP pixel clock
3001 static int qmp_dp_pixel_clk_determine_rate(struct clk_hw *hw, struct clk_rate_request *req)
3003 switch (req->rate) {
3004 case 1620000000UL / 2:
3005 case 2700000000UL / 2:
3006 /* 5.4 and 8.1 GHz are same link rate as 2.7GHz, i.e. div 4 and div 6 */
3013 static unsigned long qmp_dp_pixel_clk_recalc_rate(struct clk_hw *hw, unsigned long parent_rate)
3015 const struct qmp_combo *qmp;
3016 const struct phy_configure_opts_dp *dp_opts;
3018 qmp = container_of(hw, struct qmp_combo, dp_pixel_hw);
3019 dp_opts = &qmp->dp_opts;
3021 switch (dp_opts->link_rate) {
3023 return 1620000000UL / 2;
3025 return 2700000000UL / 2;
3027 return 5400000000UL / 4;
3029 return 8100000000UL / 6;
3035 static const struct clk_ops qmp_dp_pixel_clk_ops = {
3036 .determine_rate = qmp_dp_pixel_clk_determine_rate,
3037 .recalc_rate = qmp_dp_pixel_clk_recalc_rate,
3040 static int qmp_dp_link_clk_determine_rate(struct clk_hw *hw, struct clk_rate_request *req)
3042 switch (req->rate) {
3053 static unsigned long qmp_dp_link_clk_recalc_rate(struct clk_hw *hw, unsigned long parent_rate)
3055 const struct qmp_combo *qmp;
3056 const struct phy_configure_opts_dp *dp_opts;
3058 qmp = container_of(hw, struct qmp_combo, dp_link_hw);
3059 dp_opts = &qmp->dp_opts;
3061 switch (dp_opts->link_rate) {
3066 return dp_opts->link_rate * 100000;
3072 static const struct clk_ops qmp_dp_link_clk_ops = {
3073 .determine_rate = qmp_dp_link_clk_determine_rate,
3074 .recalc_rate = qmp_dp_link_clk_recalc_rate,
3077 static struct clk_hw *qmp_dp_clks_hw_get(struct of_phandle_args *clkspec, void *data)
3079 struct qmp_combo *qmp = data;
3080 unsigned int idx = clkspec->args[0];
3083 pr_err("%s: invalid index %u\n", __func__, idx);
3084 return ERR_PTR(-EINVAL);
3088 return &qmp->dp_link_hw;
3090 return &qmp->dp_pixel_hw;
3093 static int phy_dp_clks_register(struct qmp_combo *qmp, struct device_node *np)
3095 struct clk_init_data init = { };
3099 snprintf(name, sizeof(name), "%s::link_clk", dev_name(qmp->dev));
3100 init.ops = &qmp_dp_link_clk_ops;
3102 qmp->dp_link_hw.init = &init;
3103 ret = devm_clk_hw_register(qmp->dev, &qmp->dp_link_hw);
3107 snprintf(name, sizeof(name), "%s::vco_div_clk", dev_name(qmp->dev));
3108 init.ops = &qmp_dp_pixel_clk_ops;
3110 qmp->dp_pixel_hw.init = &init;
3111 ret = devm_clk_hw_register(qmp->dev, &qmp->dp_pixel_hw);
3118 static struct clk_hw *qmp_combo_clk_hw_get(struct of_phandle_args *clkspec, void *data)
3120 struct qmp_combo *qmp = data;
3122 switch (clkspec->args[0]) {
3123 case QMP_USB43DP_USB3_PIPE_CLK:
3124 return &qmp->pipe_clk_fixed.hw;
3125 case QMP_USB43DP_DP_LINK_CLK:
3126 return &qmp->dp_link_hw;
3127 case QMP_USB43DP_DP_VCO_DIV_CLK:
3128 return &qmp->dp_pixel_hw;
3131 return ERR_PTR(-EINVAL);
3134 static int qmp_combo_register_clocks(struct qmp_combo *qmp, struct device_node *usb_np,
3135 struct device_node *dp_np)
3139 ret = phy_pipe_clk_register(qmp, usb_np);
3143 ret = phy_dp_clks_register(qmp, dp_np);
3148 * Register a single provider for bindings without child nodes.
3150 if (usb_np == qmp->dev->of_node)
3151 return devm_of_clk_add_hw_provider(qmp->dev, qmp_combo_clk_hw_get, qmp);
3154 * Register multiple providers for legacy bindings with child nodes.
3156 ret = of_clk_add_hw_provider(usb_np, of_clk_hw_simple_get,
3157 &qmp->pipe_clk_fixed.hw);
3162 * Roll a devm action because the clock provider is the child node, but
3163 * the child node is not actually a device.
3165 ret = devm_add_action_or_reset(qmp->dev, phy_clk_release_provider, usb_np);
3169 ret = of_clk_add_hw_provider(dp_np, qmp_dp_clks_hw_get, qmp);
3173 return devm_add_action_or_reset(qmp->dev, phy_clk_release_provider, dp_np);
3176 static int qmp_combo_parse_dt_lecacy_dp(struct qmp_combo *qmp, struct device_node *np)
3178 struct device *dev = qmp->dev;
3181 * Get memory resources from the DP child node:
3182 * Resources are indexed as: tx -> 0; rx -> 1; pcs -> 2;
3183 * tx2 -> 3; rx2 -> 4
3185 * Note that only tx/tx2 and pcs (dp_phy) are used by the DP
3188 qmp->dp_tx = devm_of_iomap(dev, np, 0, NULL);
3189 if (IS_ERR(qmp->dp_tx))
3190 return PTR_ERR(qmp->dp_tx);
3192 qmp->dp_dp_phy = devm_of_iomap(dev, np, 2, NULL);
3193 if (IS_ERR(qmp->dp_dp_phy))
3194 return PTR_ERR(qmp->dp_dp_phy);
3196 qmp->dp_tx2 = devm_of_iomap(dev, np, 3, NULL);
3197 if (IS_ERR(qmp->dp_tx2))
3198 return PTR_ERR(qmp->dp_tx2);
3203 static int qmp_combo_parse_dt_lecacy_usb(struct qmp_combo *qmp, struct device_node *np)
3205 const struct qmp_phy_cfg *cfg = qmp->cfg;
3206 struct device *dev = qmp->dev;
3209 * Get memory resources from the USB child node:
3210 * Resources are indexed as: tx -> 0; rx -> 1; pcs -> 2;
3211 * tx2 -> 3; rx2 -> 4; pcs_misc (optional) -> 5
3213 qmp->tx = devm_of_iomap(dev, np, 0, NULL);
3214 if (IS_ERR(qmp->tx))
3215 return PTR_ERR(qmp->tx);
3217 qmp->rx = devm_of_iomap(dev, np, 1, NULL);
3218 if (IS_ERR(qmp->rx))
3219 return PTR_ERR(qmp->rx);
3221 qmp->pcs = devm_of_iomap(dev, np, 2, NULL);
3222 if (IS_ERR(qmp->pcs))
3223 return PTR_ERR(qmp->pcs);
3225 if (cfg->pcs_usb_offset)
3226 qmp->pcs_usb = qmp->pcs + cfg->pcs_usb_offset;
3228 qmp->tx2 = devm_of_iomap(dev, np, 3, NULL);
3229 if (IS_ERR(qmp->tx2))
3230 return PTR_ERR(qmp->tx2);
3232 qmp->rx2 = devm_of_iomap(dev, np, 4, NULL);
3233 if (IS_ERR(qmp->rx2))
3234 return PTR_ERR(qmp->rx2);
3236 qmp->pcs_misc = devm_of_iomap(dev, np, 5, NULL);
3237 if (IS_ERR(qmp->pcs_misc)) {
3238 dev_vdbg(dev, "PHY pcs_misc-reg not used\n");
3239 qmp->pcs_misc = NULL;
3242 qmp->pipe_clk = devm_get_clk_from_child(dev, np, NULL);
3243 if (IS_ERR(qmp->pipe_clk)) {
3244 return dev_err_probe(dev, PTR_ERR(qmp->pipe_clk),
3245 "failed to get pipe clock\n");
3251 static int qmp_combo_parse_dt_legacy(struct qmp_combo *qmp, struct device_node *usb_np,
3252 struct device_node *dp_np)
3254 struct platform_device *pdev = to_platform_device(qmp->dev);
3257 qmp->serdes = devm_platform_ioremap_resource(pdev, 0);
3258 if (IS_ERR(qmp->serdes))
3259 return PTR_ERR(qmp->serdes);
3261 qmp->com = devm_platform_ioremap_resource(pdev, 1);
3262 if (IS_ERR(qmp->com))
3263 return PTR_ERR(qmp->com);
3265 qmp->dp_serdes = devm_platform_ioremap_resource(pdev, 2);
3266 if (IS_ERR(qmp->dp_serdes))
3267 return PTR_ERR(qmp->dp_serdes);
3269 ret = qmp_combo_parse_dt_lecacy_usb(qmp, usb_np);
3273 ret = qmp_combo_parse_dt_lecacy_dp(qmp, dp_np);
3280 static int qmp_combo_parse_dt(struct qmp_combo *qmp)
3282 struct platform_device *pdev = to_platform_device(qmp->dev);
3283 const struct qmp_phy_cfg *cfg = qmp->cfg;
3284 const struct qmp_combo_offsets *offs = cfg->offsets;
3285 struct device *dev = qmp->dev;
3291 base = devm_platform_ioremap_resource(pdev, 0);
3293 return PTR_ERR(base);
3295 qmp->com = base + offs->com;
3296 qmp->tx = base + offs->txa;
3297 qmp->rx = base + offs->rxa;
3298 qmp->tx2 = base + offs->txb;
3299 qmp->rx2 = base + offs->rxb;
3301 qmp->serdes = base + offs->usb3_serdes;
3302 qmp->pcs_misc = base + offs->usb3_pcs_misc;
3303 qmp->pcs = base + offs->usb3_pcs;
3304 qmp->pcs_usb = base + offs->usb3_pcs_usb;
3306 qmp->dp_serdes = base + offs->dp_serdes;
3308 qmp->dp_tx = base + offs->dp_txa;
3309 qmp->dp_tx2 = base + offs->dp_txb;
3311 qmp->dp_tx = base + offs->txa;
3312 qmp->dp_tx2 = base + offs->txb;
3314 qmp->dp_dp_phy = base + offs->dp_dp_phy;
3316 qmp->pipe_clk = devm_clk_get(dev, "usb3_pipe");
3317 if (IS_ERR(qmp->pipe_clk)) {
3318 return dev_err_probe(dev, PTR_ERR(qmp->pipe_clk),
3319 "failed to get usb3_pipe clock\n");
3325 static struct phy *qmp_combo_phy_xlate(struct device *dev, struct of_phandle_args *args)
3327 struct qmp_combo *qmp = dev_get_drvdata(dev);
3329 if (args->args_count == 0)
3330 return ERR_PTR(-EINVAL);
3332 switch (args->args[0]) {
3333 case QMP_USB43DP_USB3_PHY:
3334 return qmp->usb_phy;
3335 case QMP_USB43DP_DP_PHY:
3339 return ERR_PTR(-EINVAL);
3342 static int qmp_combo_probe(struct platform_device *pdev)
3344 struct qmp_combo *qmp;
3345 struct device *dev = &pdev->dev;
3346 struct device_node *dp_np, *usb_np;
3347 struct phy_provider *phy_provider;
3350 qmp = devm_kzalloc(dev, sizeof(*qmp), GFP_KERNEL);
3356 qmp->cfg = of_device_get_match_data(dev);
3360 mutex_init(&qmp->phy_mutex);
3362 ret = qmp_combo_clk_init(qmp);
3366 ret = qmp_combo_reset_init(qmp);
3370 ret = qmp_combo_vreg_init(qmp);
3374 /* Check for legacy binding with child nodes. */
3375 usb_np = of_get_child_by_name(dev->of_node, "usb3-phy");
3377 dp_np = of_get_child_by_name(dev->of_node, "dp-phy");
3379 of_node_put(usb_np);
3383 ret = qmp_combo_parse_dt_legacy(qmp, usb_np, dp_np);
3385 usb_np = of_node_get(dev->of_node);
3386 dp_np = of_node_get(dev->of_node);
3388 ret = qmp_combo_parse_dt(qmp);
3393 pm_runtime_set_active(dev);
3394 ret = devm_pm_runtime_enable(dev);
3398 * Prevent runtime pm from being ON by default. Users can enable
3399 * it using power/control in sysfs.
3401 pm_runtime_forbid(dev);
3403 ret = qmp_combo_register_clocks(qmp, usb_np, dp_np);
3407 qmp->usb_phy = devm_phy_create(dev, usb_np, &qmp_combo_usb_phy_ops);
3408 if (IS_ERR(qmp->usb_phy)) {
3409 ret = PTR_ERR(qmp->usb_phy);
3410 dev_err(dev, "failed to create USB PHY: %d\n", ret);
3414 phy_set_drvdata(qmp->usb_phy, qmp);
3416 qmp->dp_phy = devm_phy_create(dev, dp_np, &qmp_combo_dp_phy_ops);
3417 if (IS_ERR(qmp->dp_phy)) {
3418 ret = PTR_ERR(qmp->dp_phy);
3419 dev_err(dev, "failed to create DP PHY: %d\n", ret);
3423 phy_set_drvdata(qmp->dp_phy, qmp);
3425 dev_set_drvdata(dev, qmp);
3427 if (usb_np == dev->of_node)
3428 phy_provider = devm_of_phy_provider_register(dev, qmp_combo_phy_xlate);
3430 phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate);
3432 of_node_put(usb_np);
3435 return PTR_ERR_OR_ZERO(phy_provider);
3438 of_node_put(usb_np);
3443 static const struct of_device_id qmp_combo_of_match_table[] = {
3445 .compatible = "qcom,sc7180-qmp-usb3-dp-phy",
3446 .data = &sc7180_usb3dpphy_cfg,
3449 .compatible = "qcom,sc8180x-qmp-usb3-dp-phy",
3450 .data = &sc8180x_usb3dpphy_cfg,
3453 .compatible = "qcom,sc8280xp-qmp-usb43dp-phy",
3454 .data = &sc8280xp_usb43dpphy_cfg,
3457 .compatible = "qcom,sdm845-qmp-usb3-dp-phy",
3458 .data = &sdm845_usb3dpphy_cfg,
3461 .compatible = "qcom,sm6350-qmp-usb3-dp-phy",
3462 .data = &sm6350_usb3dpphy_cfg,
3465 .compatible = "qcom,sm8250-qmp-usb3-dp-phy",
3466 .data = &sm8250_usb3dpphy_cfg,
3469 .compatible = "qcom,sm8350-qmp-usb3-dp-phy",
3470 .data = &sm8350_usb3dpphy_cfg,
3473 .compatible = "qcom,sm8450-qmp-usb3-dp-phy",
3474 .data = &sm8350_usb3dpphy_cfg,
3477 .compatible = "qcom,sm8550-qmp-usb3-dp-phy",
3478 .data = &sm8550_usb3dpphy_cfg,
3482 MODULE_DEVICE_TABLE(of, qmp_combo_of_match_table);
3484 static struct platform_driver qmp_combo_driver = {
3485 .probe = qmp_combo_probe,
3487 .name = "qcom-qmp-combo-phy",
3488 .pm = &qmp_combo_pm_ops,
3489 .of_match_table = qmp_combo_of_match_table,
3493 module_platform_driver(qmp_combo_driver);
3495 MODULE_AUTHOR("Vivek Gautam <vivek.gautam@codeaurora.org>");
3496 MODULE_DESCRIPTION("Qualcomm QMP USB+DP combo PHY driver");
3497 MODULE_LICENSE("GPL v2");