Loading...
Note: File does not exist in v3.1.
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * Copyright (c) 2017, The Linux Foundation. All rights reserved.
4 */
5
6#include <linux/clk.h>
7#include <linux/clk-provider.h>
8#include <linux/delay.h>
9#include <linux/err.h>
10#include <linux/io.h>
11#include <linux/iopoll.h>
12#include <linux/kernel.h>
13#include <linux/module.h>
14#include <linux/of.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>
22
23#include <dt-bindings/phy/phy.h>
24
25#include "phy-qcom-qmp.h"
26
27/* QPHY_SW_RESET bit */
28#define SW_RESET BIT(0)
29/* QPHY_POWER_DOWN_CONTROL */
30#define SW_PWRDN BIT(0)
31#define REFCLK_DRV_DSBL BIT(1)
32/* QPHY_START_CONTROL bits */
33#define SERDES_START BIT(0)
34#define PCS_START BIT(1)
35#define PLL_READY_GATE_EN BIT(3)
36/* QPHY_PCS_STATUS bit */
37#define PHYSTATUS BIT(6)
38#define PHYSTATUS_4_20 BIT(7)
39/* QPHY_PCS_READY_STATUS & QPHY_COM_PCS_READY_STATUS bit */
40#define PCS_READY BIT(0)
41
42/* QPHY_V3_DP_COM_RESET_OVRD_CTRL register bits */
43/* DP PHY soft reset */
44#define SW_DPPHY_RESET BIT(0)
45/* mux to select DP PHY reset control, 0:HW control, 1: software reset */
46#define SW_DPPHY_RESET_MUX BIT(1)
47/* USB3 PHY soft reset */
48#define SW_USB3PHY_RESET BIT(2)
49/* mux to select USB3 PHY reset control, 0:HW control, 1: software reset */
50#define SW_USB3PHY_RESET_MUX BIT(3)
51
52/* QPHY_V3_DP_COM_PHY_MODE_CTRL register bits */
53#define USB3_MODE BIT(0) /* enables USB3 mode */
54#define DP_MODE BIT(1) /* enables DP mode */
55
56/* QPHY_PCS_AUTONOMOUS_MODE_CTRL register bits */
57#define ARCVR_DTCT_EN BIT(0)
58#define ALFPS_DTCT_EN BIT(1)
59#define ARCVR_DTCT_EVENT_SEL BIT(4)
60
61/* QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR register bits */
62#define IRQ_CLEAR BIT(0)
63
64/* QPHY_PCS_LFPS_RXTERM_IRQ_STATUS register bits */
65#define RCVR_DETECT BIT(0)
66
67/* QPHY_V3_PCS_MISC_CLAMP_ENABLE register bits */
68#define CLAMP_EN BIT(0) /* enables i/o clamp_n */
69
70#define PHY_INIT_COMPLETE_TIMEOUT 10000
71#define POWER_DOWN_DELAY_US_MIN 10
72#define POWER_DOWN_DELAY_US_MAX 11
73
74#define MAX_PROP_NAME 32
75
76/* Define the assumed distance between lanes for underspecified device trees. */
77#define QMP_PHY_LEGACY_LANE_STRIDE 0x400
78
79struct qmp_phy_init_tbl {
80 unsigned int offset;
81 unsigned int val;
82 /*
83 * register part of layout ?
84 * if yes, then offset gives index in the reg-layout
85 */
86 bool in_layout;
87 /*
88 * mask of lanes for which this register is written
89 * for cases when second lane needs different values
90 */
91 u8 lane_mask;
92};
93
94#define QMP_PHY_INIT_CFG(o, v) \
95 { \
96 .offset = o, \
97 .val = v, \
98 .lane_mask = 0xff, \
99 }
100
101#define QMP_PHY_INIT_CFG_L(o, v) \
102 { \
103 .offset = o, \
104 .val = v, \
105 .in_layout = true, \
106 .lane_mask = 0xff, \
107 }
108
109#define QMP_PHY_INIT_CFG_LANE(o, v, l) \
110 { \
111 .offset = o, \
112 .val = v, \
113 .lane_mask = l, \
114 }
115
116/* set of registers with offsets different per-PHY */
117enum qphy_reg_layout {
118 /* Common block control registers */
119 QPHY_COM_SW_RESET,
120 QPHY_COM_POWER_DOWN_CONTROL,
121 QPHY_COM_START_CONTROL,
122 QPHY_COM_PCS_READY_STATUS,
123 /* PCS registers */
124 QPHY_PLL_LOCK_CHK_DLY_TIME,
125 QPHY_FLL_CNTRL1,
126 QPHY_FLL_CNTRL2,
127 QPHY_FLL_CNT_VAL_L,
128 QPHY_FLL_CNT_VAL_H_TOL,
129 QPHY_FLL_MAN_CODE,
130 QPHY_SW_RESET,
131 QPHY_START_CTRL,
132 QPHY_PCS_READY_STATUS,
133 QPHY_PCS_STATUS,
134 QPHY_PCS_AUTONOMOUS_MODE_CTRL,
135 QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR,
136 QPHY_PCS_LFPS_RXTERM_IRQ_STATUS,
137 QPHY_PCS_POWER_DOWN_CONTROL,
138 /* Keep last to ensure regs_layout arrays are properly initialized */
139 QPHY_LAYOUT_SIZE
140};
141
142static const unsigned int msm8996_ufsphy_regs_layout[QPHY_LAYOUT_SIZE] = {
143 [QPHY_START_CTRL] = 0x00,
144 [QPHY_PCS_READY_STATUS] = 0x168,
145};
146
147static const unsigned int ipq_pciephy_gen3_regs_layout[QPHY_LAYOUT_SIZE] = {
148 [QPHY_SW_RESET] = 0x00,
149 [QPHY_START_CTRL] = 0x44,
150 [QPHY_PCS_STATUS] = 0x14,
151 [QPHY_PCS_POWER_DOWN_CONTROL] = 0x40,
152};
153
154static const unsigned int pciephy_regs_layout[QPHY_LAYOUT_SIZE] = {
155 [QPHY_COM_SW_RESET] = 0x400,
156 [QPHY_COM_POWER_DOWN_CONTROL] = 0x404,
157 [QPHY_COM_START_CONTROL] = 0x408,
158 [QPHY_COM_PCS_READY_STATUS] = 0x448,
159 [QPHY_PLL_LOCK_CHK_DLY_TIME] = 0xa8,
160 [QPHY_FLL_CNTRL1] = 0xc4,
161 [QPHY_FLL_CNTRL2] = 0xc8,
162 [QPHY_FLL_CNT_VAL_L] = 0xcc,
163 [QPHY_FLL_CNT_VAL_H_TOL] = 0xd0,
164 [QPHY_FLL_MAN_CODE] = 0xd4,
165 [QPHY_SW_RESET] = 0x00,
166 [QPHY_START_CTRL] = 0x08,
167 [QPHY_PCS_STATUS] = 0x174,
168};
169
170static const unsigned int usb3phy_regs_layout[QPHY_LAYOUT_SIZE] = {
171 [QPHY_FLL_CNTRL1] = 0xc0,
172 [QPHY_FLL_CNTRL2] = 0xc4,
173 [QPHY_FLL_CNT_VAL_L] = 0xc8,
174 [QPHY_FLL_CNT_VAL_H_TOL] = 0xcc,
175 [QPHY_FLL_MAN_CODE] = 0xd0,
176 [QPHY_SW_RESET] = 0x00,
177 [QPHY_START_CTRL] = 0x08,
178 [QPHY_PCS_STATUS] = 0x17c,
179 [QPHY_PCS_AUTONOMOUS_MODE_CTRL] = 0x0d4,
180 [QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR] = 0x0d8,
181 [QPHY_PCS_LFPS_RXTERM_IRQ_STATUS] = 0x178,
182};
183
184static const unsigned int qmp_v3_usb3phy_regs_layout[QPHY_LAYOUT_SIZE] = {
185 [QPHY_SW_RESET] = 0x00,
186 [QPHY_START_CTRL] = 0x08,
187 [QPHY_PCS_STATUS] = 0x174,
188 [QPHY_PCS_AUTONOMOUS_MODE_CTRL] = 0x0d8,
189 [QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR] = 0x0dc,
190 [QPHY_PCS_LFPS_RXTERM_IRQ_STATUS] = 0x170,
191};
192
193static const unsigned int sdm845_qmp_pciephy_regs_layout[QPHY_LAYOUT_SIZE] = {
194 [QPHY_SW_RESET] = 0x00,
195 [QPHY_START_CTRL] = 0x08,
196 [QPHY_PCS_STATUS] = 0x174,
197};
198
199static const unsigned int sdm845_qhp_pciephy_regs_layout[QPHY_LAYOUT_SIZE] = {
200 [QPHY_SW_RESET] = 0x00,
201 [QPHY_START_CTRL] = 0x08,
202 [QPHY_PCS_STATUS] = 0x2ac,
203};
204
205static const unsigned int qmp_v4_usb3phy_regs_layout[QPHY_LAYOUT_SIZE] = {
206 [QPHY_SW_RESET] = 0x00,
207 [QPHY_START_CTRL] = 0x44,
208 [QPHY_PCS_STATUS] = 0x14,
209 [QPHY_PCS_POWER_DOWN_CONTROL] = 0x40,
210 [QPHY_PCS_AUTONOMOUS_MODE_CTRL] = 0x308,
211 [QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR] = 0x314,
212};
213
214static const unsigned int qmp_v4_usb3_uniphy_regs_layout[QPHY_LAYOUT_SIZE] = {
215 [QPHY_SW_RESET] = 0x00,
216 [QPHY_START_CTRL] = 0x44,
217 [QPHY_PCS_STATUS] = 0x14,
218 [QPHY_PCS_POWER_DOWN_CONTROL] = 0x40,
219 [QPHY_PCS_AUTONOMOUS_MODE_CTRL] = 0x608,
220 [QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR] = 0x614,
221};
222
223static const unsigned int sm8350_usb3_uniphy_regs_layout[QPHY_LAYOUT_SIZE] = {
224 [QPHY_SW_RESET] = 0x00,
225 [QPHY_START_CTRL] = 0x44,
226 [QPHY_PCS_STATUS] = 0x14,
227 [QPHY_PCS_POWER_DOWN_CONTROL] = 0x40,
228 [QPHY_PCS_AUTONOMOUS_MODE_CTRL] = 0x1008,
229 [QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR] = 0x1014,
230};
231
232static const unsigned int sdm845_ufsphy_regs_layout[QPHY_LAYOUT_SIZE] = {
233 [QPHY_START_CTRL] = 0x00,
234 [QPHY_PCS_READY_STATUS] = 0x160,
235};
236
237static const unsigned int sm8250_pcie_regs_layout[QPHY_LAYOUT_SIZE] = {
238 [QPHY_SW_RESET] = 0x00,
239 [QPHY_START_CTRL] = 0x44,
240 [QPHY_PCS_STATUS] = 0x14,
241 [QPHY_PCS_POWER_DOWN_CONTROL] = 0x40,
242};
243
244static const unsigned int sm8150_ufsphy_regs_layout[QPHY_LAYOUT_SIZE] = {
245 [QPHY_START_CTRL] = QPHY_V4_PCS_UFS_PHY_START,
246 [QPHY_PCS_READY_STATUS] = QPHY_V4_PCS_UFS_READY_STATUS,
247 [QPHY_SW_RESET] = QPHY_V4_PCS_UFS_SW_RESET,
248};
249
250static const struct qmp_phy_init_tbl ipq8074_usb3_serdes_tbl[] = {
251 QMP_PHY_INIT_CFG(QSERDES_COM_SYSCLK_EN_SEL, 0x1a),
252 QMP_PHY_INIT_CFG(QSERDES_COM_BIAS_EN_CLKBUFLR_EN, 0x08),
253 QMP_PHY_INIT_CFG(QSERDES_COM_CLK_SELECT, 0x30),
254 QMP_PHY_INIT_CFG(QSERDES_COM_BG_TRIM, 0x0f),
255 QMP_PHY_INIT_CFG(QSERDES_RX_UCDR_FASTLOCK_FO_GAIN, 0x0b),
256 QMP_PHY_INIT_CFG(QSERDES_COM_SVS_MODE_CLK_SEL, 0x01),
257 QMP_PHY_INIT_CFG(QSERDES_COM_HSCLK_SEL, 0x00),
258 QMP_PHY_INIT_CFG(QSERDES_COM_CMN_CONFIG, 0x06),
259 QMP_PHY_INIT_CFG(QSERDES_COM_PLL_IVCO, 0x0f),
260 QMP_PHY_INIT_CFG(QSERDES_COM_SYS_CLK_CTRL, 0x06),
261 /* PLL and Loop filter settings */
262 QMP_PHY_INIT_CFG(QSERDES_COM_DEC_START_MODE0, 0x82),
263 QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START1_MODE0, 0x55),
264 QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START2_MODE0, 0x55),
265 QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START3_MODE0, 0x03),
266 QMP_PHY_INIT_CFG(QSERDES_COM_CP_CTRL_MODE0, 0x0b),
267 QMP_PHY_INIT_CFG(QSERDES_COM_PLL_RCTRL_MODE0, 0x16),
268 QMP_PHY_INIT_CFG(QSERDES_COM_PLL_CCTRL_MODE0, 0x28),
269 QMP_PHY_INIT_CFG(QSERDES_COM_INTEGLOOP_GAIN0_MODE0, 0x80),
270 QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP1_MODE0, 0x15),
271 QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP2_MODE0, 0x34),
272 QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP3_MODE0, 0x00),
273 QMP_PHY_INIT_CFG(QSERDES_COM_CORE_CLK_EN, 0x00),
274 QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP_CFG, 0x00),
275 QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE_MAP, 0x00),
276 QMP_PHY_INIT_CFG(QSERDES_COM_BG_TIMER, 0x0a),
277 /* SSC settings */
278 QMP_PHY_INIT_CFG(QSERDES_COM_SSC_EN_CENTER, 0x01),
279 QMP_PHY_INIT_CFG(QSERDES_COM_SSC_PER1, 0x31),
280 QMP_PHY_INIT_CFG(QSERDES_COM_SSC_PER2, 0x01),
281 QMP_PHY_INIT_CFG(QSERDES_COM_SSC_ADJ_PER1, 0x00),
282 QMP_PHY_INIT_CFG(QSERDES_COM_SSC_ADJ_PER2, 0x00),
283 QMP_PHY_INIT_CFG(QSERDES_COM_SSC_STEP_SIZE1, 0xde),
284 QMP_PHY_INIT_CFG(QSERDES_COM_SSC_STEP_SIZE2, 0x07),
285};
286
287static const struct qmp_phy_init_tbl ipq8074_usb3_rx_tbl[] = {
288 QMP_PHY_INIT_CFG(QSERDES_RX_UCDR_SO_GAIN, 0x06),
289 QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQU_ADAPTOR_CNTRL2, 0x02),
290 QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQU_ADAPTOR_CNTRL3, 0x4c),
291 QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQU_ADAPTOR_CNTRL4, 0xb8),
292 QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x77),
293 QMP_PHY_INIT_CFG(QSERDES_RX_RX_OFFSET_ADAPTOR_CNTRL2, 0x80),
294 QMP_PHY_INIT_CFG(QSERDES_RX_SIGDET_CNTRL, 0x03),
295 QMP_PHY_INIT_CFG(QSERDES_RX_SIGDET_DEGLITCH_CNTRL, 0x16),
296 QMP_PHY_INIT_CFG(QSERDES_RX_SIGDET_ENABLES, 0x0),
297};
298
299static const struct qmp_phy_init_tbl ipq8074_usb3_pcs_tbl[] = {
300 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V0, 0x15),
301 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V0, 0x0e),
302 QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNTRL2, 0x83),
303 QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNTRL1, 0x02),
304 QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNT_VAL_L, 0x09),
305 QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNT_VAL_H_TOL, 0xa2),
306 QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_MAN_CODE, 0x85),
307 QMP_PHY_INIT_CFG(QPHY_V3_PCS_LOCK_DETECT_CONFIG1, 0xd1),
308 QMP_PHY_INIT_CFG(QPHY_V3_PCS_LOCK_DETECT_CONFIG2, 0x1f),
309 QMP_PHY_INIT_CFG(QPHY_V3_PCS_LOCK_DETECT_CONFIG3, 0x47),
310 QMP_PHY_INIT_CFG(QPHY_V3_PCS_POWER_STATE_CONFIG2, 0x1b),
311 QMP_PHY_INIT_CFG(QPHY_V3_PCS_RXEQTRAINING_WAIT_TIME, 0x75),
312 QMP_PHY_INIT_CFG(QPHY_V3_PCS_RXEQTRAINING_RUN_TIME, 0x13),
313 QMP_PHY_INIT_CFG(QPHY_V3_PCS_LFPS_TX_ECSTART_EQTLOCK, 0x86),
314 QMP_PHY_INIT_CFG(QPHY_V3_PCS_PWRUP_RESET_DLY_TIME_AUXCLK, 0x04),
315 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TSYNC_RSYNC_TIME, 0x44),
316 QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_P1U2_L, 0xe7),
317 QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_P1U2_H, 0x03),
318 QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_U3_L, 0x40),
319 QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_U3_H, 0x00),
320 QMP_PHY_INIT_CFG(QPHY_V3_PCS_RX_SIGDET_LVL, 0x88),
321 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V0, 0x17),
322 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V0, 0x0f),
323};
324
325static const struct qmp_phy_init_tbl msm8996_pcie_serdes_tbl[] = {
326 QMP_PHY_INIT_CFG(QSERDES_COM_BIAS_EN_CLKBUFLR_EN, 0x1c),
327 QMP_PHY_INIT_CFG(QSERDES_COM_CLK_ENABLE1, 0x10),
328 QMP_PHY_INIT_CFG(QSERDES_COM_CLK_SELECT, 0x33),
329 QMP_PHY_INIT_CFG(QSERDES_COM_CMN_CONFIG, 0x06),
330 QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP_EN, 0x42),
331 QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE_MAP, 0x00),
332 QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE_TIMER1, 0xff),
333 QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE_TIMER2, 0x1f),
334 QMP_PHY_INIT_CFG(QSERDES_COM_HSCLK_SEL, 0x01),
335 QMP_PHY_INIT_CFG(QSERDES_COM_SVS_MODE_CLK_SEL, 0x01),
336 QMP_PHY_INIT_CFG(QSERDES_COM_CORE_CLK_EN, 0x00),
337 QMP_PHY_INIT_CFG(QSERDES_COM_CORECLK_DIV, 0x0a),
338 QMP_PHY_INIT_CFG(QSERDES_COM_BG_TIMER, 0x09),
339 QMP_PHY_INIT_CFG(QSERDES_COM_DEC_START_MODE0, 0x82),
340 QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START3_MODE0, 0x03),
341 QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START2_MODE0, 0x55),
342 QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START1_MODE0, 0x55),
343 QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP3_MODE0, 0x00),
344 QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP2_MODE0, 0x1a),
345 QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP1_MODE0, 0x0a),
346 QMP_PHY_INIT_CFG(QSERDES_COM_CLK_SELECT, 0x33),
347 QMP_PHY_INIT_CFG(QSERDES_COM_SYS_CLK_CTRL, 0x02),
348 QMP_PHY_INIT_CFG(QSERDES_COM_SYSCLK_BUF_ENABLE, 0x1f),
349 QMP_PHY_INIT_CFG(QSERDES_COM_SYSCLK_EN_SEL, 0x04),
350 QMP_PHY_INIT_CFG(QSERDES_COM_CP_CTRL_MODE0, 0x0b),
351 QMP_PHY_INIT_CFG(QSERDES_COM_PLL_RCTRL_MODE0, 0x16),
352 QMP_PHY_INIT_CFG(QSERDES_COM_PLL_CCTRL_MODE0, 0x28),
353 QMP_PHY_INIT_CFG(QSERDES_COM_INTEGLOOP_GAIN1_MODE0, 0x00),
354 QMP_PHY_INIT_CFG(QSERDES_COM_INTEGLOOP_GAIN0_MODE0, 0x80),
355 QMP_PHY_INIT_CFG(QSERDES_COM_SSC_EN_CENTER, 0x01),
356 QMP_PHY_INIT_CFG(QSERDES_COM_SSC_PER1, 0x31),
357 QMP_PHY_INIT_CFG(QSERDES_COM_SSC_PER2, 0x01),
358 QMP_PHY_INIT_CFG(QSERDES_COM_SSC_ADJ_PER1, 0x02),
359 QMP_PHY_INIT_CFG(QSERDES_COM_SSC_ADJ_PER2, 0x00),
360 QMP_PHY_INIT_CFG(QSERDES_COM_SSC_STEP_SIZE1, 0x2f),
361 QMP_PHY_INIT_CFG(QSERDES_COM_SSC_STEP_SIZE2, 0x19),
362 QMP_PHY_INIT_CFG(QSERDES_COM_RESCODE_DIV_NUM, 0x15),
363 QMP_PHY_INIT_CFG(QSERDES_COM_BG_TRIM, 0x0f),
364 QMP_PHY_INIT_CFG(QSERDES_COM_PLL_IVCO, 0x0f),
365 QMP_PHY_INIT_CFG(QSERDES_COM_CLK_EP_DIV, 0x19),
366 QMP_PHY_INIT_CFG(QSERDES_COM_CLK_ENABLE1, 0x10),
367 QMP_PHY_INIT_CFG(QSERDES_COM_HSCLK_SEL, 0x00),
368 QMP_PHY_INIT_CFG(QSERDES_COM_RESCODE_DIV_NUM, 0x40),
369};
370
371static const struct qmp_phy_init_tbl msm8996_pcie_tx_tbl[] = {
372 QMP_PHY_INIT_CFG(QSERDES_TX_HIGHZ_TRANSCEIVEREN_BIAS_DRVR_EN, 0x45),
373 QMP_PHY_INIT_CFG(QSERDES_TX_LANE_MODE, 0x06),
374};
375
376static const struct qmp_phy_init_tbl msm8996_pcie_rx_tbl[] = {
377 QMP_PHY_INIT_CFG(QSERDES_RX_SIGDET_ENABLES, 0x1c),
378 QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQU_ADAPTOR_CNTRL2, 0x01),
379 QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQU_ADAPTOR_CNTRL3, 0x00),
380 QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQU_ADAPTOR_CNTRL4, 0xdb),
381 QMP_PHY_INIT_CFG(QSERDES_RX_RX_BAND, 0x18),
382 QMP_PHY_INIT_CFG(QSERDES_RX_UCDR_SO_GAIN, 0x04),
383 QMP_PHY_INIT_CFG(QSERDES_RX_UCDR_SO_GAIN_HALF, 0x04),
384 QMP_PHY_INIT_CFG(QSERDES_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x4b),
385 QMP_PHY_INIT_CFG(QSERDES_RX_SIGDET_DEGLITCH_CNTRL, 0x14),
386 QMP_PHY_INIT_CFG(QSERDES_RX_SIGDET_LVL, 0x19),
387};
388
389static const struct qmp_phy_init_tbl msm8996_pcie_pcs_tbl[] = {
390 QMP_PHY_INIT_CFG(QPHY_RX_IDLE_DTCT_CNTRL, 0x4c),
391 QMP_PHY_INIT_CFG(QPHY_PWRUP_RESET_DLY_TIME_AUXCLK, 0x00),
392 QMP_PHY_INIT_CFG(QPHY_LP_WAKEUP_DLY_TIME_AUXCLK, 0x01),
393
394 QMP_PHY_INIT_CFG_L(QPHY_PLL_LOCK_CHK_DLY_TIME, 0x05),
395
396 QMP_PHY_INIT_CFG(QPHY_ENDPOINT_REFCLK_DRIVE, 0x05),
397 QMP_PHY_INIT_CFG(QPHY_POWER_DOWN_CONTROL, 0x02),
398 QMP_PHY_INIT_CFG(QPHY_POWER_STATE_CONFIG4, 0x00),
399 QMP_PHY_INIT_CFG(QPHY_POWER_STATE_CONFIG1, 0xa3),
400 QMP_PHY_INIT_CFG(QPHY_TXDEEMPH_M3P5DB_V0, 0x0e),
401};
402
403static const struct qmp_phy_init_tbl msm8998_pcie_serdes_tbl[] = {
404 QMP_PHY_INIT_CFG(QSERDES_V3_COM_BIAS_EN_CLKBUFLR_EN, 0x14),
405 QMP_PHY_INIT_CFG(QSERDES_V3_COM_CLK_SELECT, 0x30),
406 QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_IVCO, 0x0f),
407 QMP_PHY_INIT_CFG(QSERDES_V3_COM_CMN_CONFIG, 0x06),
408 QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP_EN, 0x01),
409 QMP_PHY_INIT_CFG(QSERDES_V3_COM_RESETSM_CNTRL, 0x20),
410 QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_MAP, 0x00),
411 QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE2_MODE0, 0x01),
412 QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE1_MODE0, 0xc9),
413 QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_TIMER1, 0xff),
414 QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_TIMER2, 0x3f),
415 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SVS_MODE_CLK_SEL, 0x01),
416 QMP_PHY_INIT_CFG(QSERDES_V3_COM_CORE_CLK_EN, 0x00),
417 QMP_PHY_INIT_CFG(QSERDES_V3_COM_CORECLK_DIV_MODE0, 0x0a),
418 QMP_PHY_INIT_CFG(QSERDES_V3_COM_CLK_EP_DIV, 0x19),
419 QMP_PHY_INIT_CFG(QSERDES_V3_COM_CLK_ENABLE1, 0x90),
420 QMP_PHY_INIT_CFG(QSERDES_V3_COM_DEC_START_MODE0, 0x82),
421 QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START3_MODE0, 0x03),
422 QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START2_MODE0, 0x55),
423 QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START1_MODE0, 0x55),
424 QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP3_MODE0, 0x00),
425 QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP2_MODE0, 0x0d),
426 QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP1_MODE0, 0x04),
427 QMP_PHY_INIT_CFG(QSERDES_V3_COM_HSCLK_SEL, 0x00),
428 QMP_PHY_INIT_CFG(QSERDES_V3_COM_CP_CTRL_MODE0, 0x08),
429 QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_RCTRL_MODE0, 0x16),
430 QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_CCTRL_MODE0, 0x34),
431 QMP_PHY_INIT_CFG(QSERDES_V3_COM_CMN_CONFIG, 0x06),
432 QMP_PHY_INIT_CFG(QSERDES_V3_COM_CLK_SELECT, 0x33),
433 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYS_CLK_CTRL, 0x02),
434 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYSCLK_BUF_ENABLE, 0x07),
435 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYSCLK_EN_SEL, 0x04),
436 QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN1_MODE0, 0x00),
437 QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN0_MODE0, 0x3f),
438 QMP_PHY_INIT_CFG(QSERDES_V3_COM_BG_TIMER, 0x09),
439 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_EN_CENTER, 0x01),
440 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_PER1, 0x40),
441 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_PER2, 0x01),
442 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_ADJ_PER1, 0x02),
443 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_ADJ_PER2, 0x00),
444 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_STEP_SIZE1, 0x7e),
445 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_STEP_SIZE2, 0x15),
446};
447
448static const struct qmp_phy_init_tbl msm8998_pcie_tx_tbl[] = {
449 QMP_PHY_INIT_CFG(QSERDES_V3_TX_RES_CODE_LANE_OFFSET_TX, 0x02),
450 QMP_PHY_INIT_CFG(QSERDES_V3_TX_RCV_DETECT_LVL_2, 0x12),
451 QMP_PHY_INIT_CFG(QSERDES_V3_TX_HIGHZ_DRVR_EN, 0x10),
452 QMP_PHY_INIT_CFG(QSERDES_V3_TX_LANE_MODE_1, 0x06),
453};
454
455static const struct qmp_phy_init_tbl msm8998_pcie_rx_tbl[] = {
456 QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_CNTRL, 0x03),
457 QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_ENABLES, 0x1c),
458 QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_DEGLITCH_CNTRL, 0x14),
459 QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0a),
460 QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL3, 0x04),
461 QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL4, 0x1a),
462 QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x4b),
463 QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_SO_GAIN, 0x04),
464 QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_SO_GAIN_HALF, 0x04),
465 QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x00),
466 QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_OFFSET_ADAPTOR_CNTRL2, 0x80),
467 QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_INTERFACE_MODE, 0x40),
468 QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_PI_CONTROLS, 0x71),
469 QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_FASTLOCK_COUNT_LOW, 0x40),
470};
471
472static const struct qmp_phy_init_tbl msm8998_pcie_pcs_tbl[] = {
473 QMP_PHY_INIT_CFG(QPHY_V3_PCS_ENDPOINT_REFCLK_DRIVE, 0x04),
474 QMP_PHY_INIT_CFG(QPHY_V3_PCS_OSC_DTCT_ACTIONS, 0x00),
475 QMP_PHY_INIT_CFG(QPHY_V3_PCS_PWRUP_RESET_DLY_TIME_AUXCLK, 0x01),
476 QMP_PHY_INIT_CFG(QPHY_V3_PCS_L1SS_WAKEUP_DLY_TIME_AUXCLK_MSB, 0x00),
477 QMP_PHY_INIT_CFG(QPHY_V3_PCS_L1SS_WAKEUP_DLY_TIME_AUXCLK_LSB, 0x20),
478 QMP_PHY_INIT_CFG(QPHY_V3_PCS_LP_WAKEUP_DLY_TIME_AUXCLK_MSB, 0x00),
479 QMP_PHY_INIT_CFG(QPHY_V3_PCS_LP_WAKEUP_DLY_TIME_AUXCLK, 0x01),
480 QMP_PHY_INIT_CFG(QPHY_V3_PCS_PLL_LOCK_CHK_DLY_TIME, 0x73),
481 QMP_PHY_INIT_CFG(QPHY_V3_PCS_RX_SIGDET_LVL, 0x99),
482 QMP_PHY_INIT_CFG(QPHY_V3_PCS_SIGDET_CNTRL, 0x03),
483};
484
485static const struct qmp_phy_init_tbl msm8996_ufs_serdes_tbl[] = {
486 QMP_PHY_INIT_CFG(QPHY_POWER_DOWN_CONTROL, 0x01),
487 QMP_PHY_INIT_CFG(QSERDES_COM_CMN_CONFIG, 0x0e),
488 QMP_PHY_INIT_CFG(QSERDES_COM_SYSCLK_EN_SEL, 0xd7),
489 QMP_PHY_INIT_CFG(QSERDES_COM_CLK_SELECT, 0x30),
490 QMP_PHY_INIT_CFG(QSERDES_COM_SYS_CLK_CTRL, 0x06),
491 QMP_PHY_INIT_CFG(QSERDES_COM_BIAS_EN_CLKBUFLR_EN, 0x08),
492 QMP_PHY_INIT_CFG(QSERDES_COM_BG_TIMER, 0x0a),
493 QMP_PHY_INIT_CFG(QSERDES_COM_HSCLK_SEL, 0x05),
494 QMP_PHY_INIT_CFG(QSERDES_COM_CORECLK_DIV, 0x0a),
495 QMP_PHY_INIT_CFG(QSERDES_COM_CORECLK_DIV_MODE1, 0x0a),
496 QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP_EN, 0x01),
497 QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE_CTRL, 0x10),
498 QMP_PHY_INIT_CFG(QSERDES_COM_RESETSM_CNTRL, 0x20),
499 QMP_PHY_INIT_CFG(QSERDES_COM_CORE_CLK_EN, 0x00),
500 QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP_CFG, 0x00),
501 QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE_TIMER1, 0xff),
502 QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE_TIMER2, 0x3f),
503 QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE_MAP, 0x54),
504 QMP_PHY_INIT_CFG(QSERDES_COM_SVS_MODE_CLK_SEL, 0x05),
505 QMP_PHY_INIT_CFG(QSERDES_COM_DEC_START_MODE0, 0x82),
506 QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START1_MODE0, 0x00),
507 QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START2_MODE0, 0x00),
508 QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START3_MODE0, 0x00),
509 QMP_PHY_INIT_CFG(QSERDES_COM_CP_CTRL_MODE0, 0x0b),
510 QMP_PHY_INIT_CFG(QSERDES_COM_PLL_RCTRL_MODE0, 0x16),
511 QMP_PHY_INIT_CFG(QSERDES_COM_PLL_CCTRL_MODE0, 0x28),
512 QMP_PHY_INIT_CFG(QSERDES_COM_INTEGLOOP_GAIN0_MODE0, 0x80),
513 QMP_PHY_INIT_CFG(QSERDES_COM_INTEGLOOP_GAIN1_MODE0, 0x00),
514 QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE1_MODE0, 0x28),
515 QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE2_MODE0, 0x02),
516 QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP1_MODE0, 0xff),
517 QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP2_MODE0, 0x0c),
518 QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP3_MODE0, 0x00),
519 QMP_PHY_INIT_CFG(QSERDES_COM_DEC_START_MODE1, 0x98),
520 QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START1_MODE1, 0x00),
521 QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START2_MODE1, 0x00),
522 QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START3_MODE1, 0x00),
523 QMP_PHY_INIT_CFG(QSERDES_COM_CP_CTRL_MODE1, 0x0b),
524 QMP_PHY_INIT_CFG(QSERDES_COM_PLL_RCTRL_MODE1, 0x16),
525 QMP_PHY_INIT_CFG(QSERDES_COM_PLL_CCTRL_MODE1, 0x28),
526 QMP_PHY_INIT_CFG(QSERDES_COM_INTEGLOOP_GAIN0_MODE1, 0x80),
527 QMP_PHY_INIT_CFG(QSERDES_COM_INTEGLOOP_GAIN1_MODE1, 0x00),
528 QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE1_MODE1, 0xd6),
529 QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE2_MODE1, 0x00),
530 QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP1_MODE1, 0x32),
531 QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP2_MODE1, 0x0f),
532 QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP3_MODE1, 0x00),
533};
534
535static const struct qmp_phy_init_tbl msm8996_ufs_tx_tbl[] = {
536 QMP_PHY_INIT_CFG(QSERDES_TX_HIGHZ_TRANSCEIVEREN_BIAS_DRVR_EN, 0x45),
537 QMP_PHY_INIT_CFG(QSERDES_TX_LANE_MODE, 0x02),
538};
539
540static const struct qmp_phy_init_tbl msm8996_ufs_rx_tbl[] = {
541 QMP_PHY_INIT_CFG(QSERDES_RX_SIGDET_LVL, 0x24),
542 QMP_PHY_INIT_CFG(QSERDES_RX_SIGDET_CNTRL, 0x02),
543 QMP_PHY_INIT_CFG(QSERDES_RX_RX_INTERFACE_MODE, 0x00),
544 QMP_PHY_INIT_CFG(QSERDES_RX_SIGDET_DEGLITCH_CNTRL, 0x18),
545 QMP_PHY_INIT_CFG(QSERDES_RX_UCDR_FASTLOCK_FO_GAIN, 0x0B),
546 QMP_PHY_INIT_CFG(QSERDES_RX_RX_TERM_BW, 0x5b),
547 QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQ_GAIN1_LSB, 0xff),
548 QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQ_GAIN1_MSB, 0x3f),
549 QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQ_GAIN2_LSB, 0xff),
550 QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQ_GAIN2_MSB, 0x0f),
551 QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0E),
552};
553
554static const struct qmp_phy_init_tbl msm8996_usb3_serdes_tbl[] = {
555 QMP_PHY_INIT_CFG(QSERDES_COM_SYSCLK_EN_SEL, 0x14),
556 QMP_PHY_INIT_CFG(QSERDES_COM_BIAS_EN_CLKBUFLR_EN, 0x08),
557 QMP_PHY_INIT_CFG(QSERDES_COM_CLK_SELECT, 0x30),
558 QMP_PHY_INIT_CFG(QSERDES_COM_CMN_CONFIG, 0x06),
559 QMP_PHY_INIT_CFG(QSERDES_COM_SVS_MODE_CLK_SEL, 0x01),
560 QMP_PHY_INIT_CFG(QSERDES_COM_HSCLK_SEL, 0x00),
561 QMP_PHY_INIT_CFG(QSERDES_COM_BG_TRIM, 0x0f),
562 QMP_PHY_INIT_CFG(QSERDES_COM_PLL_IVCO, 0x0f),
563 QMP_PHY_INIT_CFG(QSERDES_COM_SYS_CLK_CTRL, 0x04),
564 /* PLL and Loop filter settings */
565 QMP_PHY_INIT_CFG(QSERDES_COM_DEC_START_MODE0, 0x82),
566 QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START1_MODE0, 0x55),
567 QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START2_MODE0, 0x55),
568 QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START3_MODE0, 0x03),
569 QMP_PHY_INIT_CFG(QSERDES_COM_CP_CTRL_MODE0, 0x0b),
570 QMP_PHY_INIT_CFG(QSERDES_COM_PLL_RCTRL_MODE0, 0x16),
571 QMP_PHY_INIT_CFG(QSERDES_COM_PLL_CCTRL_MODE0, 0x28),
572 QMP_PHY_INIT_CFG(QSERDES_COM_INTEGLOOP_GAIN0_MODE0, 0x80),
573 QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE_CTRL, 0x00),
574 QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP1_MODE0, 0x15),
575 QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP2_MODE0, 0x34),
576 QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP3_MODE0, 0x00),
577 QMP_PHY_INIT_CFG(QSERDES_COM_CORE_CLK_EN, 0x00),
578 QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP_CFG, 0x00),
579 QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE_MAP, 0x00),
580 QMP_PHY_INIT_CFG(QSERDES_COM_BG_TIMER, 0x0a),
581 /* SSC settings */
582 QMP_PHY_INIT_CFG(QSERDES_COM_SSC_EN_CENTER, 0x01),
583 QMP_PHY_INIT_CFG(QSERDES_COM_SSC_PER1, 0x31),
584 QMP_PHY_INIT_CFG(QSERDES_COM_SSC_PER2, 0x01),
585 QMP_PHY_INIT_CFG(QSERDES_COM_SSC_ADJ_PER1, 0x00),
586 QMP_PHY_INIT_CFG(QSERDES_COM_SSC_ADJ_PER2, 0x00),
587 QMP_PHY_INIT_CFG(QSERDES_COM_SSC_STEP_SIZE1, 0xde),
588 QMP_PHY_INIT_CFG(QSERDES_COM_SSC_STEP_SIZE2, 0x07),
589};
590
591static const struct qmp_phy_init_tbl msm8996_usb3_tx_tbl[] = {
592 QMP_PHY_INIT_CFG(QSERDES_TX_HIGHZ_TRANSCEIVEREN_BIAS_DRVR_EN, 0x45),
593 QMP_PHY_INIT_CFG(QSERDES_TX_RCV_DETECT_LVL_2, 0x12),
594 QMP_PHY_INIT_CFG(QSERDES_TX_LANE_MODE, 0x06),
595};
596
597static const struct qmp_phy_init_tbl msm8996_usb3_rx_tbl[] = {
598 QMP_PHY_INIT_CFG(QSERDES_RX_UCDR_FASTLOCK_FO_GAIN, 0x0b),
599 QMP_PHY_INIT_CFG(QSERDES_RX_UCDR_SO_GAIN, 0x04),
600 QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQU_ADAPTOR_CNTRL2, 0x02),
601 QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQU_ADAPTOR_CNTRL3, 0x4c),
602 QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQU_ADAPTOR_CNTRL4, 0xbb),
603 QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x77),
604 QMP_PHY_INIT_CFG(QSERDES_RX_RX_OFFSET_ADAPTOR_CNTRL2, 0x80),
605 QMP_PHY_INIT_CFG(QSERDES_RX_SIGDET_CNTRL, 0x03),
606 QMP_PHY_INIT_CFG(QSERDES_RX_SIGDET_LVL, 0x18),
607 QMP_PHY_INIT_CFG(QSERDES_RX_SIGDET_DEGLITCH_CNTRL, 0x16),
608};
609
610static const struct qmp_phy_init_tbl msm8996_usb3_pcs_tbl[] = {
611 /* FLL settings */
612 QMP_PHY_INIT_CFG_L(QPHY_FLL_CNTRL2, 0x03),
613 QMP_PHY_INIT_CFG_L(QPHY_FLL_CNTRL1, 0x02),
614 QMP_PHY_INIT_CFG_L(QPHY_FLL_CNT_VAL_L, 0x09),
615 QMP_PHY_INIT_CFG_L(QPHY_FLL_CNT_VAL_H_TOL, 0x42),
616 QMP_PHY_INIT_CFG_L(QPHY_FLL_MAN_CODE, 0x85),
617
618 /* Lock Det settings */
619 QMP_PHY_INIT_CFG(QPHY_LOCK_DETECT_CONFIG1, 0xd1),
620 QMP_PHY_INIT_CFG(QPHY_LOCK_DETECT_CONFIG2, 0x1f),
621 QMP_PHY_INIT_CFG(QPHY_LOCK_DETECT_CONFIG3, 0x47),
622 QMP_PHY_INIT_CFG(QPHY_POWER_STATE_CONFIG2, 0x08),
623};
624
625static const struct qmp_phy_init_tbl ipq6018_pcie_serdes_tbl[] = {
626 QMP_PHY_INIT_CFG(QSERDES_PLL_SSC_PER1, 0x7d),
627 QMP_PHY_INIT_CFG(QSERDES_PLL_SSC_PER2, 0x01),
628 QMP_PHY_INIT_CFG(QSERDES_PLL_SSC_STEP_SIZE1_MODE0, 0x0a),
629 QMP_PHY_INIT_CFG(QSERDES_PLL_SSC_STEP_SIZE2_MODE0, 0x05),
630 QMP_PHY_INIT_CFG(QSERDES_PLL_SSC_STEP_SIZE1_MODE1, 0x08),
631 QMP_PHY_INIT_CFG(QSERDES_PLL_SSC_STEP_SIZE2_MODE1, 0x04),
632 QMP_PHY_INIT_CFG(QSERDES_PLL_BIAS_EN_CLKBUFLR_EN, 0x18),
633 QMP_PHY_INIT_CFG(QSERDES_PLL_CLK_ENABLE1, 0x90),
634 QMP_PHY_INIT_CFG(QSERDES_PLL_SYS_CLK_CTRL, 0x02),
635 QMP_PHY_INIT_CFG(QSERDES_PLL_SYSCLK_BUF_ENABLE, 0x07),
636 QMP_PHY_INIT_CFG(QSERDES_PLL_PLL_IVCO, 0x0f),
637 QMP_PHY_INIT_CFG(QSERDES_PLL_LOCK_CMP1_MODE0, 0xd4),
638 QMP_PHY_INIT_CFG(QSERDES_PLL_LOCK_CMP2_MODE0, 0x14),
639 QMP_PHY_INIT_CFG(QSERDES_PLL_LOCK_CMP1_MODE1, 0xaa),
640 QMP_PHY_INIT_CFG(QSERDES_PLL_LOCK_CMP2_MODE1, 0x29),
641 QMP_PHY_INIT_CFG(QSERDES_PLL_BG_TRIM, 0x0f),
642 QMP_PHY_INIT_CFG(QSERDES_PLL_CP_CTRL_MODE0, 0x09),
643 QMP_PHY_INIT_CFG(QSERDES_PLL_CP_CTRL_MODE1, 0x09),
644 QMP_PHY_INIT_CFG(QSERDES_PLL_PLL_RCTRL_MODE0, 0x16),
645 QMP_PHY_INIT_CFG(QSERDES_PLL_PLL_RCTRL_MODE1, 0x16),
646 QMP_PHY_INIT_CFG(QSERDES_PLL_PLL_CCTRL_MODE0, 0x28),
647 QMP_PHY_INIT_CFG(QSERDES_PLL_PLL_CCTRL_MODE1, 0x28),
648 QMP_PHY_INIT_CFG(QSERDES_PLL_BIAS_EN_CTRL_BY_PSM, 0x01),
649 QMP_PHY_INIT_CFG(QSERDES_PLL_SYSCLK_EN_SEL, 0x08),
650 QMP_PHY_INIT_CFG(QSERDES_PLL_RESETSM_CNTRL, 0x20),
651 QMP_PHY_INIT_CFG(QSERDES_PLL_LOCK_CMP_EN, 0x42),
652 QMP_PHY_INIT_CFG(QSERDES_PLL_DEC_START_MODE0, 0x68),
653 QMP_PHY_INIT_CFG(QSERDES_PLL_DEC_START_MODE1, 0x53),
654 QMP_PHY_INIT_CFG(QSERDES_PLL_DIV_FRAC_START1_MODE0, 0xab),
655 QMP_PHY_INIT_CFG(QSERDES_PLL_DIV_FRAC_START2_MODE0, 0xaa),
656 QMP_PHY_INIT_CFG(QSERDES_PLL_DIV_FRAC_START3_MODE0, 0x02),
657 QMP_PHY_INIT_CFG(QSERDES_PLL_DIV_FRAC_START1_MODE1, 0x55),
658 QMP_PHY_INIT_CFG(QSERDES_PLL_DIV_FRAC_START2_MODE1, 0x55),
659 QMP_PHY_INIT_CFG(QSERDES_PLL_DIV_FRAC_START3_MODE1, 0x05),
660 QMP_PHY_INIT_CFG(QSERDES_PLL_INTEGLOOP_GAIN0_MODE0, 0xa0),
661 QMP_PHY_INIT_CFG(QSERDES_PLL_INTEGLOOP_GAIN0_MODE1, 0xa0),
662 QMP_PHY_INIT_CFG(QSERDES_PLL_VCO_TUNE1_MODE0, 0x24),
663 QMP_PHY_INIT_CFG(QSERDES_PLL_VCO_TUNE2_MODE0, 0x02),
664 QMP_PHY_INIT_CFG(QSERDES_PLL_VCO_TUNE1_MODE1, 0xb4),
665 QMP_PHY_INIT_CFG(QSERDES_PLL_VCO_TUNE2_MODE1, 0x03),
666 QMP_PHY_INIT_CFG(QSERDES_PLL_CLK_SELECT, 0x32),
667 QMP_PHY_INIT_CFG(QSERDES_PLL_HSCLK_SEL, 0x01),
668 QMP_PHY_INIT_CFG(QSERDES_PLL_CORE_CLK_EN, 0x00),
669 QMP_PHY_INIT_CFG(QSERDES_PLL_CMN_CONFIG, 0x06),
670 QMP_PHY_INIT_CFG(QSERDES_PLL_SVS_MODE_CLK_SEL, 0x05),
671 QMP_PHY_INIT_CFG(QSERDES_PLL_CORECLK_DIV_MODE1, 0x08),
672};
673
674static const struct qmp_phy_init_tbl ipq6018_pcie_tx_tbl[] = {
675 QMP_PHY_INIT_CFG(QSERDES_TX0_RES_CODE_LANE_OFFSET_TX, 0x02),
676 QMP_PHY_INIT_CFG(QSERDES_TX0_LANE_MODE_1, 0x06),
677 QMP_PHY_INIT_CFG(QSERDES_TX0_RCV_DETECT_LVL_2, 0x12),
678};
679
680static const struct qmp_phy_init_tbl ipq6018_pcie_rx_tbl[] = {
681 QMP_PHY_INIT_CFG(QSERDES_RX0_UCDR_FO_GAIN, 0x0c),
682 QMP_PHY_INIT_CFG(QSERDES_RX0_UCDR_SO_GAIN, 0x02),
683 QMP_PHY_INIT_CFG(QSERDES_RX0_UCDR_SO_SATURATION_AND_ENABLE, 0x7f),
684 QMP_PHY_INIT_CFG(QSERDES_RX0_UCDR_PI_CONTROLS, 0x70),
685 QMP_PHY_INIT_CFG(QSERDES_RX0_RX_EQU_ADAPTOR_CNTRL2, 0x61),
686 QMP_PHY_INIT_CFG(QSERDES_RX0_RX_EQU_ADAPTOR_CNTRL3, 0x04),
687 QMP_PHY_INIT_CFG(QSERDES_RX0_RX_EQU_ADAPTOR_CNTRL4, 0x1e),
688 QMP_PHY_INIT_CFG(QSERDES_RX0_RX_IDAC_TSETTLE_LOW, 0xc0),
689 QMP_PHY_INIT_CFG(QSERDES_RX0_RX_IDAC_TSETTLE_HIGH, 0x00),
690 QMP_PHY_INIT_CFG(QSERDES_RX0_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x73),
691 QMP_PHY_INIT_CFG(QSERDES_RX0_RX_OFFSET_ADAPTOR_CNTRL2, 0x80),
692 QMP_PHY_INIT_CFG(QSERDES_RX0_SIGDET_ENABLES, 0x1c),
693 QMP_PHY_INIT_CFG(QSERDES_RX0_SIGDET_CNTRL, 0x03),
694 QMP_PHY_INIT_CFG(QSERDES_RX0_SIGDET_DEGLITCH_CNTRL, 0x14),
695 QMP_PHY_INIT_CFG(QSERDES_RX0_RX_MODE_00_LOW, 0xf0),
696 QMP_PHY_INIT_CFG(QSERDES_RX0_RX_MODE_00_HIGH, 0x01),
697 QMP_PHY_INIT_CFG(QSERDES_RX0_RX_MODE_00_HIGH2, 0x2f),
698 QMP_PHY_INIT_CFG(QSERDES_RX0_RX_MODE_00_HIGH3, 0xd3),
699 QMP_PHY_INIT_CFG(QSERDES_RX0_RX_MODE_00_HIGH4, 0x40),
700 QMP_PHY_INIT_CFG(QSERDES_RX0_RX_MODE_01_LOW, 0x01),
701 QMP_PHY_INIT_CFG(QSERDES_RX0_RX_MODE_01_HIGH, 0x02),
702 QMP_PHY_INIT_CFG(QSERDES_RX0_RX_MODE_01_HIGH2, 0xc8),
703 QMP_PHY_INIT_CFG(QSERDES_RX0_RX_MODE_01_HIGH3, 0x09),
704 QMP_PHY_INIT_CFG(QSERDES_RX0_RX_MODE_01_HIGH4, 0xb1),
705 QMP_PHY_INIT_CFG(QSERDES_RX0_RX_MODE_10_LOW, 0x00),
706 QMP_PHY_INIT_CFG(QSERDES_RX0_RX_MODE_10_HIGH, 0x02),
707 QMP_PHY_INIT_CFG(QSERDES_RX0_RX_MODE_10_HIGH2, 0xc8),
708 QMP_PHY_INIT_CFG(QSERDES_RX0_RX_MODE_10_HIGH3, 0x09),
709 QMP_PHY_INIT_CFG(QSERDES_RX0_RX_MODE_10_HIGH4, 0xb1),
710 QMP_PHY_INIT_CFG(QSERDES_RX0_DFE_EN_TIMER, 0x04),
711};
712
713static const struct qmp_phy_init_tbl ipq6018_pcie_pcs_tbl[] = {
714 QMP_PHY_INIT_CFG(PCS_COM_FLL_CNTRL1, 0x01),
715 QMP_PHY_INIT_CFG(PCS_COM_REFGEN_REQ_CONFIG1, 0x0d),
716 QMP_PHY_INIT_CFG(PCS_COM_G12S1_TXDEEMPH_M3P5DB, 0x10),
717 QMP_PHY_INIT_CFG(PCS_COM_RX_SIGDET_LVL, 0xaa),
718 QMP_PHY_INIT_CFG(PCS_COM_P2U3_WAKEUP_DLY_TIME_AUXCLK_L, 0x01),
719 QMP_PHY_INIT_CFG(PCS_COM_RX_DCC_CAL_CONFIG, 0x01),
720 QMP_PHY_INIT_CFG(PCS_COM_EQ_CONFIG5, 0x01),
721 QMP_PHY_INIT_CFG(PCS_PCIE_POWER_STATE_CONFIG2, 0x0d),
722 QMP_PHY_INIT_CFG(PCS_PCIE_POWER_STATE_CONFIG4, 0x07),
723 QMP_PHY_INIT_CFG(PCS_PCIE_ENDPOINT_REFCLK_DRIVE, 0xc1),
724 QMP_PHY_INIT_CFG(PCS_PCIE_L1P1_WAKEUP_DLY_TIME_AUXCLK_L, 0x01),
725 QMP_PHY_INIT_CFG(PCS_PCIE_L1P2_WAKEUP_DLY_TIME_AUXCLK_L, 0x01),
726 QMP_PHY_INIT_CFG(PCS_PCIE_OSC_DTCT_ACTIONS, 0x00),
727 QMP_PHY_INIT_CFG(PCS_PCIE_EQ_CONFIG1, 0x11),
728 QMP_PHY_INIT_CFG(PCS_PCIE_PRESET_P10_PRE, 0x00),
729 QMP_PHY_INIT_CFG(PCS_PCIE_PRESET_P10_POST, 0x58),
730};
731
732static const struct qmp_phy_init_tbl ipq8074_pcie_serdes_tbl[] = {
733 QMP_PHY_INIT_CFG(QSERDES_COM_BIAS_EN_CLKBUFLR_EN, 0x18),
734 QMP_PHY_INIT_CFG(QSERDES_COM_CLK_ENABLE1, 0x10),
735 QMP_PHY_INIT_CFG(QSERDES_COM_BG_TRIM, 0xf),
736 QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP_EN, 0x1),
737 QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE_MAP, 0x0),
738 QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE_TIMER1, 0xff),
739 QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE_TIMER2, 0x1f),
740 QMP_PHY_INIT_CFG(QSERDES_COM_CMN_CONFIG, 0x6),
741 QMP_PHY_INIT_CFG(QSERDES_COM_PLL_IVCO, 0xf),
742 QMP_PHY_INIT_CFG(QSERDES_COM_HSCLK_SEL, 0x0),
743 QMP_PHY_INIT_CFG(QSERDES_COM_SVS_MODE_CLK_SEL, 0x1),
744 QMP_PHY_INIT_CFG(QSERDES_COM_CORE_CLK_EN, 0x20),
745 QMP_PHY_INIT_CFG(QSERDES_COM_CORECLK_DIV, 0xa),
746 QMP_PHY_INIT_CFG(QSERDES_COM_RESETSM_CNTRL, 0x20),
747 QMP_PHY_INIT_CFG(QSERDES_COM_BG_TIMER, 0xa),
748 QMP_PHY_INIT_CFG(QSERDES_COM_SYSCLK_EN_SEL, 0xa),
749 QMP_PHY_INIT_CFG(QSERDES_COM_DEC_START_MODE0, 0x82),
750 QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START3_MODE0, 0x3),
751 QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START2_MODE0, 0x55),
752 QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START1_MODE0, 0x55),
753 QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP3_MODE0, 0x0),
754 QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP2_MODE0, 0xD),
755 QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP1_MODE0, 0xD04),
756 QMP_PHY_INIT_CFG(QSERDES_COM_CLK_SELECT, 0x33),
757 QMP_PHY_INIT_CFG(QSERDES_COM_SYS_CLK_CTRL, 0x2),
758 QMP_PHY_INIT_CFG(QSERDES_COM_SYSCLK_BUF_ENABLE, 0x1f),
759 QMP_PHY_INIT_CFG(QSERDES_COM_CP_CTRL_MODE0, 0xb),
760 QMP_PHY_INIT_CFG(QSERDES_COM_PLL_RCTRL_MODE0, 0x16),
761 QMP_PHY_INIT_CFG(QSERDES_COM_PLL_CCTRL_MODE0, 0x28),
762 QMP_PHY_INIT_CFG(QSERDES_COM_INTEGLOOP_GAIN1_MODE0, 0x0),
763 QMP_PHY_INIT_CFG(QSERDES_COM_INTEGLOOP_GAIN0_MODE0, 0x80),
764 QMP_PHY_INIT_CFG(QSERDES_COM_BIAS_EN_CTRL_BY_PSM, 0x1),
765 QMP_PHY_INIT_CFG(QSERDES_COM_SSC_EN_CENTER, 0x1),
766 QMP_PHY_INIT_CFG(QSERDES_COM_SSC_PER1, 0x31),
767 QMP_PHY_INIT_CFG(QSERDES_COM_SSC_PER2, 0x1),
768 QMP_PHY_INIT_CFG(QSERDES_COM_SSC_ADJ_PER1, 0x2),
769 QMP_PHY_INIT_CFG(QSERDES_COM_SSC_ADJ_PER2, 0x0),
770 QMP_PHY_INIT_CFG(QSERDES_COM_SSC_STEP_SIZE1, 0x2f),
771 QMP_PHY_INIT_CFG(QSERDES_COM_SSC_STEP_SIZE2, 0x19),
772 QMP_PHY_INIT_CFG(QSERDES_COM_CLK_EP_DIV, 0x19),
773};
774
775static const struct qmp_phy_init_tbl ipq8074_pcie_tx_tbl[] = {
776 QMP_PHY_INIT_CFG(QSERDES_TX_HIGHZ_TRANSCEIVEREN_BIAS_DRVR_EN, 0x45),
777 QMP_PHY_INIT_CFG(QSERDES_TX_LANE_MODE, 0x6),
778 QMP_PHY_INIT_CFG(QSERDES_TX_RES_CODE_LANE_OFFSET, 0x2),
779 QMP_PHY_INIT_CFG(QSERDES_TX_RCV_DETECT_LVL_2, 0x12),
780 QMP_PHY_INIT_CFG(QSERDES_TX_EMP_POST1_LVL, 0x36),
781 QMP_PHY_INIT_CFG(QSERDES_TX_SLEW_CNTL, 0x0a),
782};
783
784static const struct qmp_phy_init_tbl ipq8074_pcie_rx_tbl[] = {
785 QMP_PHY_INIT_CFG(QSERDES_RX_SIGDET_ENABLES, 0x1c),
786 QMP_PHY_INIT_CFG(QSERDES_RX_SIGDET_DEGLITCH_CNTRL, 0x14),
787 QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQU_ADAPTOR_CNTRL2, 0x1),
788 QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQU_ADAPTOR_CNTRL3, 0x0),
789 QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQU_ADAPTOR_CNTRL4, 0xdb),
790 QMP_PHY_INIT_CFG(QSERDES_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x4b),
791 QMP_PHY_INIT_CFG(QSERDES_RX_UCDR_SO_GAIN, 0x4),
792};
793
794static const struct qmp_phy_init_tbl ipq8074_pcie_pcs_tbl[] = {
795 QMP_PHY_INIT_CFG(QPHY_ENDPOINT_REFCLK_DRIVE, 0x4),
796 QMP_PHY_INIT_CFG(QPHY_OSC_DTCT_ACTIONS, 0x0),
797 QMP_PHY_INIT_CFG(QPHY_PWRUP_RESET_DLY_TIME_AUXCLK, 0x40),
798 QMP_PHY_INIT_CFG(QPHY_L1SS_WAKEUP_DLY_TIME_AUXCLK_MSB, 0x0),
799 QMP_PHY_INIT_CFG(QPHY_L1SS_WAKEUP_DLY_TIME_AUXCLK_LSB, 0x40),
800 QMP_PHY_INIT_CFG(QPHY_PLL_LOCK_CHK_DLY_TIME_AUXCLK_LSB, 0x0),
801 QMP_PHY_INIT_CFG(QPHY_LP_WAKEUP_DLY_TIME_AUXCLK, 0x40),
802 QMP_PHY_INIT_CFG_L(QPHY_PLL_LOCK_CHK_DLY_TIME, 0x73),
803 QMP_PHY_INIT_CFG(QPHY_RX_SIGDET_LVL, 0x99),
804 QMP_PHY_INIT_CFG(QPHY_TXDEEMPH_M6DB_V0, 0x15),
805 QMP_PHY_INIT_CFG(QPHY_TXDEEMPH_M3P5DB_V0, 0xe),
806 QMP_PHY_INIT_CFG_L(QPHY_SW_RESET, 0x0),
807 QMP_PHY_INIT_CFG_L(QPHY_START_CTRL, 0x3),
808};
809
810static const struct qmp_phy_init_tbl sdm845_qmp_pcie_serdes_tbl[] = {
811 QMP_PHY_INIT_CFG(QSERDES_V3_COM_BIAS_EN_CLKBUFLR_EN, 0x14),
812 QMP_PHY_INIT_CFG(QSERDES_V3_COM_CLK_SELECT, 0x30),
813 QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_IVCO, 0x007),
814 QMP_PHY_INIT_CFG(QSERDES_V3_COM_CMN_CONFIG, 0x06),
815 QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP_EN, 0x01),
816 QMP_PHY_INIT_CFG(QSERDES_V3_COM_RESETSM_CNTRL, 0x20),
817 QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_MAP, 0x00),
818 QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE2_MODE0, 0x01),
819 QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE1_MODE0, 0xc9),
820 QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_TIMER1, 0xff),
821 QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_TIMER2, 0x3f),
822 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SVS_MODE_CLK_SEL, 0x01),
823 QMP_PHY_INIT_CFG(QSERDES_V3_COM_CORE_CLK_EN, 0x00),
824 QMP_PHY_INIT_CFG(QSERDES_V3_COM_CORECLK_DIV_MODE0, 0x0a),
825 QMP_PHY_INIT_CFG(QSERDES_V3_COM_CLK_EP_DIV, 0x19),
826 QMP_PHY_INIT_CFG(QSERDES_V3_COM_CLK_ENABLE1, 0x90),
827 QMP_PHY_INIT_CFG(QSERDES_V3_COM_DEC_START_MODE0, 0x82),
828 QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START3_MODE0, 0x02),
829 QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START2_MODE0, 0xea),
830 QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START1_MODE0, 0xab),
831 QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP3_MODE0, 0x00),
832 QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP2_MODE0, 0x0d),
833 QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP1_MODE0, 0x04),
834 QMP_PHY_INIT_CFG(QSERDES_V3_COM_HSCLK_SEL, 0x00),
835 QMP_PHY_INIT_CFG(QSERDES_V3_COM_CP_CTRL_MODE0, 0x06),
836 QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_RCTRL_MODE0, 0x16),
837 QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_CCTRL_MODE0, 0x36),
838 QMP_PHY_INIT_CFG(QSERDES_V3_COM_CMN_MODE, 0x01),
839 QMP_PHY_INIT_CFG(QSERDES_V3_COM_CLK_SELECT, 0x33),
840 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYS_CLK_CTRL, 0x02),
841 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYSCLK_BUF_ENABLE, 0x06),
842 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYSCLK_EN_SEL, 0x04),
843 QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN1_MODE0, 0x00),
844 QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN0_MODE0, 0x3f),
845 QMP_PHY_INIT_CFG(QSERDES_V3_COM_BG_TIMER, 0x09),
846 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_EN_CENTER, 0x01),
847 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_PER1, 0x40),
848 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_PER2, 0x01),
849 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_ADJ_PER1, 0x02),
850 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_ADJ_PER2, 0x00),
851 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_STEP_SIZE1, 0x7e),
852 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_STEP_SIZE2, 0x15),
853};
854
855static const struct qmp_phy_init_tbl sdm845_qmp_pcie_tx_tbl[] = {
856 QMP_PHY_INIT_CFG(QSERDES_V3_TX_RES_CODE_LANE_OFFSET_TX, 0x02),
857 QMP_PHY_INIT_CFG(QSERDES_V3_TX_RCV_DETECT_LVL_2, 0x12),
858 QMP_PHY_INIT_CFG(QSERDES_V3_TX_HIGHZ_DRVR_EN, 0x10),
859 QMP_PHY_INIT_CFG(QSERDES_V3_TX_LANE_MODE_1, 0x06),
860};
861
862static const struct qmp_phy_init_tbl sdm845_qmp_pcie_rx_tbl[] = {
863 QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_CNTRL, 0x03),
864 QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_ENABLES, 0x10),
865 QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_DEGLITCH_CNTRL, 0x14),
866 QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0e),
867 QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL3, 0x04),
868 QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL4, 0x1a),
869 QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x4b),
870 QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_SO_GAIN, 0x04),
871 QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_SO_GAIN_HALF, 0x04),
872 QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x71),
873 QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_MODE_00, 0x59),
874 QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_MODE_01, 0x59),
875 QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_OFFSET_ADAPTOR_CNTRL2, 0x80),
876 QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_INTERFACE_MODE, 0x40),
877 QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_PI_CONTROLS, 0x71),
878 QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_FASTLOCK_COUNT_LOW, 0x40),
879};
880
881static const struct qmp_phy_init_tbl sdm845_qmp_pcie_pcs_tbl[] = {
882 QMP_PHY_INIT_CFG(QPHY_V3_PCS_ENDPOINT_REFCLK_DRIVE, 0x04),
883
884 QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNTRL2, 0x83),
885 QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNT_VAL_L, 0x09),
886 QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNT_VAL_H_TOL, 0xa2),
887 QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_MAN_CODE, 0x40),
888 QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNTRL1, 0x02),
889
890 QMP_PHY_INIT_CFG(QPHY_V3_PCS_OSC_DTCT_ACTIONS, 0x00),
891 QMP_PHY_INIT_CFG(QPHY_V3_PCS_PWRUP_RESET_DLY_TIME_AUXCLK, 0x01),
892 QMP_PHY_INIT_CFG(QPHY_V3_PCS_L1SS_WAKEUP_DLY_TIME_AUXCLK_MSB, 0x00),
893 QMP_PHY_INIT_CFG(QPHY_V3_PCS_L1SS_WAKEUP_DLY_TIME_AUXCLK_LSB, 0x20),
894 QMP_PHY_INIT_CFG(QPHY_V3_PCS_LP_WAKEUP_DLY_TIME_AUXCLK_MSB, 0x00),
895 QMP_PHY_INIT_CFG(QPHY_V3_PCS_LP_WAKEUP_DLY_TIME_AUXCLK, 0x01),
896 QMP_PHY_INIT_CFG(QPHY_V3_PCS_PLL_LOCK_CHK_DLY_TIME, 0x73),
897
898 QMP_PHY_INIT_CFG(QPHY_V3_PCS_RX_SIGDET_LVL, 0xbb),
899 QMP_PHY_INIT_CFG(QPHY_V3_PCS_SIGDET_CNTRL, 0x03),
900 QMP_PHY_INIT_CFG(QPHY_V3_PCS_REFGEN_REQ_CONFIG1, 0x0d),
901
902 QMP_PHY_INIT_CFG(QPHY_V3_PCS_POWER_STATE_CONFIG4, 0x00),
903};
904
905static const struct qmp_phy_init_tbl sdm845_qmp_pcie_pcs_misc_tbl[] = {
906 QMP_PHY_INIT_CFG(QPHY_V3_PCS_MISC_OSC_DTCT_CONFIG2, 0x52),
907 QMP_PHY_INIT_CFG(QPHY_V3_PCS_MISC_OSC_DTCT_MODE2_CONFIG2, 0x10),
908 QMP_PHY_INIT_CFG(QPHY_V3_PCS_MISC_OSC_DTCT_MODE2_CONFIG4, 0x1a),
909 QMP_PHY_INIT_CFG(QPHY_V3_PCS_MISC_OSC_DTCT_MODE2_CONFIG5, 0x06),
910 QMP_PHY_INIT_CFG(QPHY_V3_PCS_MISC_PCIE_INT_AUX_CLK_CONFIG1, 0x00),
911};
912
913static const struct qmp_phy_init_tbl sdm845_qhp_pcie_serdes_tbl[] = {
914 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_SYSCLK_EN_SEL, 0x27),
915 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_SSC_EN_CENTER, 0x01),
916 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_SSC_PER1, 0x31),
917 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_SSC_PER2, 0x01),
918 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_SSC_STEP_SIZE1, 0xde),
919 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_SSC_STEP_SIZE2, 0x07),
920 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_SSC_STEP_SIZE1_MODE1, 0x4c),
921 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_SSC_STEP_SIZE2_MODE1, 0x06),
922 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_BIAS_EN_CKBUFLR_EN, 0x18),
923 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_CLK_ENABLE1, 0xb0),
924 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_LOCK_CMP1_MODE0, 0x8c),
925 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_LOCK_CMP2_MODE0, 0x20),
926 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_LOCK_CMP1_MODE1, 0x14),
927 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_LOCK_CMP2_MODE1, 0x34),
928 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_CP_CTRL_MODE0, 0x06),
929 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_CP_CTRL_MODE1, 0x06),
930 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_PLL_RCTRL_MODE0, 0x16),
931 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_PLL_RCTRL_MODE1, 0x16),
932 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_PLL_CCTRL_MODE0, 0x36),
933 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_PLL_CCTRL_MODE1, 0x36),
934 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_RESTRIM_CTRL2, 0x05),
935 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_LOCK_CMP_EN, 0x42),
936 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_DEC_START_MODE0, 0x82),
937 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_DEC_START_MODE1, 0x68),
938 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_DIV_FRAC_START1_MODE0, 0x55),
939 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_DIV_FRAC_START2_MODE0, 0x55),
940 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_DIV_FRAC_START3_MODE0, 0x03),
941 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_DIV_FRAC_START1_MODE1, 0xab),
942 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_DIV_FRAC_START2_MODE1, 0xaa),
943 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_DIV_FRAC_START3_MODE1, 0x02),
944 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_INTEGLOOP_GAIN0_MODE0, 0x3f),
945 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_INTEGLOOP_GAIN0_MODE1, 0x3f),
946 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_VCO_TUNE_MAP, 0x10),
947 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_CLK_SELECT, 0x04),
948 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_HSCLK_SEL1, 0x30),
949 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_CORECLK_DIV, 0x04),
950 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_CORE_CLK_EN, 0x73),
951 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_CMN_CONFIG, 0x0c),
952 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_SVS_MODE_CLK_SEL, 0x15),
953 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_CORECLK_DIV_MODE1, 0x04),
954 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_CMN_MODE, 0x01),
955 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_VREGCLK_DIV1, 0x22),
956 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_VREGCLK_DIV2, 0x00),
957 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_BGV_TRIM, 0x20),
958 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_BG_CTRL, 0x07),
959};
960
961static const struct qmp_phy_init_tbl sdm845_qhp_pcie_tx_tbl[] = {
962 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_DRVR_CTRL0, 0x00),
963 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_DRVR_TAP_EN, 0x0d),
964 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_TX_BAND_MODE, 0x01),
965 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_LANE_MODE, 0x1a),
966 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_PARALLEL_RATE, 0x2f),
967 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_CML_CTRL_MODE0, 0x09),
968 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_CML_CTRL_MODE1, 0x09),
969 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_CML_CTRL_MODE2, 0x1b),
970 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_PREAMP_CTRL_MODE1, 0x01),
971 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_PREAMP_CTRL_MODE2, 0x07),
972 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_MIXER_CTRL_MODE0, 0x31),
973 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_MIXER_CTRL_MODE1, 0x31),
974 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_MIXER_CTRL_MODE2, 0x03),
975 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_CTLE_THRESH_DFE, 0x02),
976 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_CGA_THRESH_DFE, 0x00),
977 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_RXENGINE_EN0, 0x12),
978 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_CTLE_TRAIN_TIME, 0x25),
979 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_CTLE_DFE_OVRLP_TIME, 0x00),
980 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_DFE_REFRESH_TIME, 0x05),
981 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_DFE_ENABLE_TIME, 0x01),
982 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_VGA_GAIN, 0x26),
983 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_DFE_GAIN, 0x12),
984 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_EQ_GAIN, 0x04),
985 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_OFFSET_GAIN, 0x04),
986 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_PRE_GAIN, 0x09),
987 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_EQ_INTVAL, 0x15),
988 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_EDAC_INITVAL, 0x28),
989 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_RXEQ_INITB0, 0x7f),
990 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_RXEQ_INITB1, 0x07),
991 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_RCVRDONE_THRESH1, 0x04),
992 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_RXEQ_CTRL, 0x70),
993 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_UCDR_FO_GAIN_MODE0, 0x8b),
994 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_UCDR_FO_GAIN_MODE1, 0x08),
995 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_UCDR_FO_GAIN_MODE2, 0x0a),
996 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_UCDR_SO_GAIN_MODE0, 0x03),
997 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_UCDR_SO_GAIN_MODE1, 0x04),
998 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_UCDR_SO_GAIN_MODE2, 0x04),
999 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_UCDR_SO_CONFIG, 0x0c),
1000 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_RX_BAND, 0x02),
1001 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_RX_RCVR_PATH1_MODE0, 0x5c),
1002 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_RX_RCVR_PATH1_MODE1, 0x3e),
1003 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_RX_RCVR_PATH1_MODE2, 0x3f),
1004 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_SIGDET_ENABLES, 0x01),
1005 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_SIGDET_CNTRL, 0xa0),
1006 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_SIGDET_DEGLITCH_CNTRL, 0x08),
1007 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_DCC_GAIN, 0x01),
1008 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_RX_EN_SIGNAL, 0xc3),
1009 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_PSM_RX_EN_CAL, 0x00),
1010 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_RX_MISC_CNTRL0, 0xbc),
1011 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_TS0_TIMER, 0x7f),
1012 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_DLL_HIGHDATARATE, 0x15),
1013 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_DRVR_CTRL1, 0x0c),
1014 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_DRVR_CTRL2, 0x0f),
1015 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_RX_RESETCODE_OFFSET, 0x04),
1016 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_VGA_INITVAL, 0x20),
1017 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_RSM_START, 0x01),
1018};
1019
1020static const struct qmp_phy_init_tbl sdm845_qhp_pcie_rx_tbl[] = {
1021};
1022
1023static const struct qmp_phy_init_tbl sdm845_qhp_pcie_pcs_tbl[] = {
1024 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_PHY_POWER_STATE_CONFIG, 0x3f),
1025 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_PHY_PCS_TX_RX_CONFIG, 0x50),
1026 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_PHY_TXMGN_MAIN_V0_M3P5DB, 0x19),
1027 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_PHY_TXMGN_POST_V0_M3P5DB, 0x07),
1028 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_PHY_TXMGN_MAIN_V0_M6DB, 0x17),
1029 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_PHY_TXMGN_POST_V0_M6DB, 0x09),
1030 QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_PHY_POWER_STATE_CONFIG5, 0x9f),
1031};
1032
1033static const struct qmp_phy_init_tbl qmp_v3_usb3_serdes_tbl[] = {
1034 QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_IVCO, 0x07),
1035 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYSCLK_EN_SEL, 0x14),
1036 QMP_PHY_INIT_CFG(QSERDES_V3_COM_BIAS_EN_CLKBUFLR_EN, 0x08),
1037 QMP_PHY_INIT_CFG(QSERDES_V3_COM_CLK_SELECT, 0x30),
1038 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYS_CLK_CTRL, 0x02),
1039 QMP_PHY_INIT_CFG(QSERDES_V3_COM_RESETSM_CNTRL2, 0x08),
1040 QMP_PHY_INIT_CFG(QSERDES_V3_COM_CMN_CONFIG, 0x16),
1041 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SVS_MODE_CLK_SEL, 0x01),
1042 QMP_PHY_INIT_CFG(QSERDES_V3_COM_HSCLK_SEL, 0x80),
1043 QMP_PHY_INIT_CFG(QSERDES_V3_COM_DEC_START_MODE0, 0x82),
1044 QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START1_MODE0, 0xab),
1045 QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START2_MODE0, 0xea),
1046 QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START3_MODE0, 0x02),
1047 QMP_PHY_INIT_CFG(QSERDES_V3_COM_CP_CTRL_MODE0, 0x06),
1048 QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_RCTRL_MODE0, 0x16),
1049 QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_CCTRL_MODE0, 0x36),
1050 QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN1_MODE0, 0x00),
1051 QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN0_MODE0, 0x3f),
1052 QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE2_MODE0, 0x01),
1053 QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE1_MODE0, 0xc9),
1054 QMP_PHY_INIT_CFG(QSERDES_V3_COM_CORECLK_DIV_MODE0, 0x0a),
1055 QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP3_MODE0, 0x00),
1056 QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP2_MODE0, 0x34),
1057 QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP1_MODE0, 0x15),
1058 QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP_EN, 0x04),
1059 QMP_PHY_INIT_CFG(QSERDES_V3_COM_CORE_CLK_EN, 0x00),
1060 QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP_CFG, 0x00),
1061 QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_MAP, 0x00),
1062 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYSCLK_BUF_ENABLE, 0x0a),
1063 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_EN_CENTER, 0x01),
1064 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_PER1, 0x31),
1065 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_PER2, 0x01),
1066 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_ADJ_PER1, 0x00),
1067 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_ADJ_PER2, 0x00),
1068 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_STEP_SIZE1, 0x85),
1069 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_STEP_SIZE2, 0x07),
1070};
1071
1072static const struct qmp_phy_init_tbl qmp_v3_usb3_tx_tbl[] = {
1073 QMP_PHY_INIT_CFG(QSERDES_V3_TX_HIGHZ_DRVR_EN, 0x10),
1074 QMP_PHY_INIT_CFG(QSERDES_V3_TX_RCV_DETECT_LVL_2, 0x12),
1075 QMP_PHY_INIT_CFG(QSERDES_V3_TX_LANE_MODE_1, 0x16),
1076 QMP_PHY_INIT_CFG(QSERDES_V3_TX_RES_CODE_LANE_OFFSET_RX, 0x09),
1077 QMP_PHY_INIT_CFG(QSERDES_V3_TX_RES_CODE_LANE_OFFSET_TX, 0x06),
1078};
1079
1080static const struct qmp_phy_init_tbl qmp_v3_dp_serdes_tbl[] = {
1081 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SVS_MODE_CLK_SEL, 0x01),
1082 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYSCLK_EN_SEL, 0x37),
1083 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYS_CLK_CTRL, 0x02),
1084 QMP_PHY_INIT_CFG(QSERDES_V3_COM_CLK_ENABLE1, 0x0e),
1085 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYSCLK_BUF_ENABLE, 0x06),
1086 QMP_PHY_INIT_CFG(QSERDES_V3_COM_CLK_SELECT, 0x30),
1087 QMP_PHY_INIT_CFG(QSERDES_V3_COM_CMN_CONFIG, 0x02),
1088 QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START1_MODE0, 0x00),
1089 QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN0_MODE0, 0x3f),
1090 QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN1_MODE0, 0x00),
1091 QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_MAP, 0x00),
1092 QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP3_MODE0, 0x00),
1093 QMP_PHY_INIT_CFG(QSERDES_V3_COM_BG_TIMER, 0x0a),
1094 QMP_PHY_INIT_CFG(QSERDES_V3_COM_CORECLK_DIV_MODE0, 0x0a),
1095 QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_CTRL, 0x00),
1096 QMP_PHY_INIT_CFG(QSERDES_V3_COM_BIAS_EN_CLKBUFLR_EN, 0x3f),
1097 QMP_PHY_INIT_CFG(QSERDES_V3_COM_CORE_CLK_EN, 0x1f),
1098 QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_IVCO, 0x07),
1099 QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_CCTRL_MODE0, 0x36),
1100 QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_RCTRL_MODE0, 0x16),
1101 QMP_PHY_INIT_CFG(QSERDES_V3_COM_CP_CTRL_MODE0, 0x06),
1102};
1103
1104static const struct qmp_phy_init_tbl qmp_v3_dp_serdes_tbl_rbr[] = {
1105 QMP_PHY_INIT_CFG(QSERDES_V3_COM_HSCLK_SEL, 0x0c),
1106 QMP_PHY_INIT_CFG(QSERDES_V3_COM_DEC_START_MODE0, 0x69),
1107 QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START2_MODE0, 0x80),
1108 QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START3_MODE0, 0x07),
1109 QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP1_MODE0, 0x6f),
1110 QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP2_MODE0, 0x08),
1111 QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP_EN, 0x00),
1112};
1113
1114static const struct qmp_phy_init_tbl qmp_v3_dp_serdes_tbl_hbr[] = {
1115 QMP_PHY_INIT_CFG(QSERDES_V3_COM_HSCLK_SEL, 0x04),
1116 QMP_PHY_INIT_CFG(QSERDES_V3_COM_DEC_START_MODE0, 0x69),
1117 QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START2_MODE0, 0x80),
1118 QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START3_MODE0, 0x07),
1119 QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP1_MODE0, 0x0f),
1120 QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP2_MODE0, 0x0e),
1121 QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP_EN, 0x00),
1122};
1123
1124static const struct qmp_phy_init_tbl qmp_v3_dp_serdes_tbl_hbr2[] = {
1125 QMP_PHY_INIT_CFG(QSERDES_V3_COM_HSCLK_SEL, 0x00),
1126 QMP_PHY_INIT_CFG(QSERDES_V3_COM_DEC_START_MODE0, 0x8c),
1127 QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START2_MODE0, 0x00),
1128 QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START3_MODE0, 0x0a),
1129 QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP1_MODE0, 0x1f),
1130 QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP2_MODE0, 0x1c),
1131 QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP_EN, 0x00),
1132};
1133
1134static const struct qmp_phy_init_tbl qmp_v3_dp_serdes_tbl_hbr3[] = {
1135 QMP_PHY_INIT_CFG(QSERDES_V3_COM_HSCLK_SEL, 0x03),
1136 QMP_PHY_INIT_CFG(QSERDES_V3_COM_DEC_START_MODE0, 0x69),
1137 QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START2_MODE0, 0x80),
1138 QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START3_MODE0, 0x07),
1139 QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP1_MODE0, 0x2f),
1140 QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP2_MODE0, 0x2a),
1141 QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP_EN, 0x08),
1142};
1143
1144static const struct qmp_phy_init_tbl qmp_v3_dp_tx_tbl[] = {
1145 QMP_PHY_INIT_CFG(QSERDES_V3_TX_TRANSCEIVER_BIAS_EN, 0x1a),
1146 QMP_PHY_INIT_CFG(QSERDES_V3_TX_VMODE_CTRL1, 0x40),
1147 QMP_PHY_INIT_CFG(QSERDES_V3_TX_PRE_STALL_LDO_BOOST_EN, 0x30),
1148 QMP_PHY_INIT_CFG(QSERDES_V3_TX_INTERFACE_SELECT, 0x3d),
1149 QMP_PHY_INIT_CFG(QSERDES_V3_TX_CLKBUF_ENABLE, 0x0f),
1150 QMP_PHY_INIT_CFG(QSERDES_V3_TX_RESET_TSYNC_EN, 0x03),
1151 QMP_PHY_INIT_CFG(QSERDES_V3_TX_TRAN_DRVR_EMP_EN, 0x03),
1152 QMP_PHY_INIT_CFG(QSERDES_V3_TX_PARRATE_REC_DETECT_IDLE_EN, 0x00),
1153 QMP_PHY_INIT_CFG(QSERDES_V3_TX_TX_INTERFACE_MODE, 0x00),
1154 QMP_PHY_INIT_CFG(QSERDES_V3_TX_TX_BAND, 0x4),
1155 QMP_PHY_INIT_CFG(QSERDES_V3_TX_TX_POL_INV, 0x0a),
1156 QMP_PHY_INIT_CFG(QSERDES_V3_TX_TX_DRV_LVL, 0x38),
1157 QMP_PHY_INIT_CFG(QSERDES_V3_TX_TX_EMP_POST1_LVL, 0x20),
1158 QMP_PHY_INIT_CFG(QSERDES_V3_TX_RES_CODE_LANE_OFFSET_TX, 0x06),
1159 QMP_PHY_INIT_CFG(QSERDES_V3_TX_RES_CODE_LANE_OFFSET_RX, 0x07),
1160};
1161
1162static const struct qmp_phy_init_tbl qmp_v3_usb3_rx_tbl[] = {
1163 QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_FASTLOCK_FO_GAIN, 0x0b),
1164 QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0f),
1165 QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL3, 0x4e),
1166 QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL4, 0x18),
1167 QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x77),
1168 QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_OFFSET_ADAPTOR_CNTRL2, 0x80),
1169 QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_CNTRL, 0x03),
1170 QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_DEGLITCH_CNTRL, 0x16),
1171 QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x75),
1172};
1173
1174static const struct qmp_phy_init_tbl qmp_v3_usb3_pcs_tbl[] = {
1175 /* FLL settings */
1176 QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNTRL2, 0x83),
1177 QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNT_VAL_L, 0x09),
1178 QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNT_VAL_H_TOL, 0xa2),
1179 QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_MAN_CODE, 0x40),
1180 QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNTRL1, 0x02),
1181
1182 /* Lock Det settings */
1183 QMP_PHY_INIT_CFG(QPHY_V3_PCS_LOCK_DETECT_CONFIG1, 0xd1),
1184 QMP_PHY_INIT_CFG(QPHY_V3_PCS_LOCK_DETECT_CONFIG2, 0x1f),
1185 QMP_PHY_INIT_CFG(QPHY_V3_PCS_LOCK_DETECT_CONFIG3, 0x47),
1186 QMP_PHY_INIT_CFG(QPHY_V3_PCS_POWER_STATE_CONFIG2, 0x1b),
1187
1188 QMP_PHY_INIT_CFG(QPHY_V3_PCS_RX_SIGDET_LVL, 0xba),
1189 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V0, 0x9f),
1190 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V1, 0x9f),
1191 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V2, 0xb7),
1192 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V3, 0x4e),
1193 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V4, 0x65),
1194 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_LS, 0x6b),
1195 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V0, 0x15),
1196 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V0, 0x0d),
1197 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V1, 0x15),
1198 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V1, 0x0d),
1199 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V2, 0x15),
1200 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V2, 0x0d),
1201 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V3, 0x15),
1202 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V3, 0x1d),
1203 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V4, 0x15),
1204 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V4, 0x0d),
1205 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_LS, 0x15),
1206 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_LS, 0x0d),
1207
1208 QMP_PHY_INIT_CFG(QPHY_V3_PCS_RATE_SLEW_CNTRL, 0x02),
1209 QMP_PHY_INIT_CFG(QPHY_V3_PCS_PWRUP_RESET_DLY_TIME_AUXCLK, 0x04),
1210 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TSYNC_RSYNC_TIME, 0x44),
1211 QMP_PHY_INIT_CFG(QPHY_V3_PCS_PWRUP_RESET_DLY_TIME_AUXCLK, 0x04),
1212 QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_P1U2_L, 0xe7),
1213 QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_P1U2_H, 0x03),
1214 QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_U3_L, 0x40),
1215 QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_U3_H, 0x00),
1216 QMP_PHY_INIT_CFG(QPHY_V3_PCS_RXEQTRAINING_WAIT_TIME, 0x75),
1217 QMP_PHY_INIT_CFG(QPHY_V3_PCS_LFPS_TX_ECSTART_EQTLOCK, 0x86),
1218 QMP_PHY_INIT_CFG(QPHY_V3_PCS_RXEQTRAINING_RUN_TIME, 0x13),
1219};
1220
1221static const struct qmp_phy_init_tbl qmp_v3_usb3_uniphy_serdes_tbl[] = {
1222 QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_IVCO, 0x07),
1223 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYSCLK_EN_SEL, 0x14),
1224 QMP_PHY_INIT_CFG(QSERDES_V3_COM_BIAS_EN_CLKBUFLR_EN, 0x04),
1225 QMP_PHY_INIT_CFG(QSERDES_V3_COM_CLK_SELECT, 0x30),
1226 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYS_CLK_CTRL, 0x02),
1227 QMP_PHY_INIT_CFG(QSERDES_V3_COM_RESETSM_CNTRL2, 0x08),
1228 QMP_PHY_INIT_CFG(QSERDES_V3_COM_CMN_CONFIG, 0x06),
1229 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SVS_MODE_CLK_SEL, 0x01),
1230 QMP_PHY_INIT_CFG(QSERDES_V3_COM_HSCLK_SEL, 0x80),
1231 QMP_PHY_INIT_CFG(QSERDES_V3_COM_DEC_START_MODE0, 0x82),
1232 QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START1_MODE0, 0xab),
1233 QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START2_MODE0, 0xea),
1234 QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START3_MODE0, 0x02),
1235 QMP_PHY_INIT_CFG(QSERDES_V3_COM_CP_CTRL_MODE0, 0x06),
1236 QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_RCTRL_MODE0, 0x16),
1237 QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_CCTRL_MODE0, 0x36),
1238 QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN1_MODE0, 0x00),
1239 QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN0_MODE0, 0x3f),
1240 QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE2_MODE0, 0x01),
1241 QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE1_MODE0, 0xc9),
1242 QMP_PHY_INIT_CFG(QSERDES_V3_COM_CORECLK_DIV_MODE0, 0x0a),
1243 QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP3_MODE0, 0x00),
1244 QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP2_MODE0, 0x34),
1245 QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP1_MODE0, 0x15),
1246 QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP_EN, 0x04),
1247 QMP_PHY_INIT_CFG(QSERDES_V3_COM_CORE_CLK_EN, 0x00),
1248 QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP_CFG, 0x00),
1249 QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_MAP, 0x00),
1250 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYSCLK_BUF_ENABLE, 0x0a),
1251 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_EN_CENTER, 0x01),
1252 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_PER1, 0x31),
1253 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_PER2, 0x01),
1254 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_ADJ_PER1, 0x00),
1255 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_ADJ_PER2, 0x00),
1256 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_STEP_SIZE1, 0x85),
1257 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_STEP_SIZE2, 0x07),
1258};
1259
1260static const struct qmp_phy_init_tbl qmp_v3_usb3_uniphy_tx_tbl[] = {
1261 QMP_PHY_INIT_CFG(QSERDES_V3_TX_HIGHZ_DRVR_EN, 0x10),
1262 QMP_PHY_INIT_CFG(QSERDES_V3_TX_RCV_DETECT_LVL_2, 0x12),
1263 QMP_PHY_INIT_CFG(QSERDES_V3_TX_LANE_MODE_1, 0xc6),
1264 QMP_PHY_INIT_CFG(QSERDES_V3_TX_RES_CODE_LANE_OFFSET_RX, 0x06),
1265 QMP_PHY_INIT_CFG(QSERDES_V3_TX_RES_CODE_LANE_OFFSET_TX, 0x06),
1266};
1267
1268static const struct qmp_phy_init_tbl qmp_v3_usb3_uniphy_rx_tbl[] = {
1269 QMP_PHY_INIT_CFG(QSERDES_V3_RX_VGA_CAL_CNTRL2, 0x0c),
1270 QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_MODE_00, 0x50),
1271 QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_FASTLOCK_FO_GAIN, 0x0b),
1272 QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0e),
1273 QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL3, 0x4e),
1274 QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL4, 0x18),
1275 QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x77),
1276 QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_OFFSET_ADAPTOR_CNTRL2, 0x80),
1277 QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_CNTRL, 0x03),
1278 QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_DEGLITCH_CNTRL, 0x1c),
1279 QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x75),
1280};
1281
1282static const struct qmp_phy_init_tbl qmp_v3_usb3_uniphy_pcs_tbl[] = {
1283 /* FLL settings */
1284 QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNTRL2, 0x83),
1285 QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNT_VAL_L, 0x09),
1286 QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNT_VAL_H_TOL, 0xa2),
1287 QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_MAN_CODE, 0x40),
1288 QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNTRL1, 0x02),
1289
1290 /* Lock Det settings */
1291 QMP_PHY_INIT_CFG(QPHY_V3_PCS_LOCK_DETECT_CONFIG1, 0xd1),
1292 QMP_PHY_INIT_CFG(QPHY_V3_PCS_LOCK_DETECT_CONFIG2, 0x1f),
1293 QMP_PHY_INIT_CFG(QPHY_V3_PCS_LOCK_DETECT_CONFIG3, 0x47),
1294 QMP_PHY_INIT_CFG(QPHY_V3_PCS_POWER_STATE_CONFIG2, 0x1b),
1295
1296 QMP_PHY_INIT_CFG(QPHY_V3_PCS_RX_SIGDET_LVL, 0xba),
1297 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V0, 0x9f),
1298 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V1, 0x9f),
1299 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V2, 0xb5),
1300 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V3, 0x4c),
1301 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V4, 0x64),
1302 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_LS, 0x6a),
1303 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V0, 0x15),
1304 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V0, 0x0d),
1305 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V1, 0x15),
1306 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V1, 0x0d),
1307 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V2, 0x15),
1308 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V2, 0x0d),
1309 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V3, 0x15),
1310 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V3, 0x1d),
1311 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V4, 0x15),
1312 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V4, 0x0d),
1313 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_LS, 0x15),
1314 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_LS, 0x0d),
1315
1316 QMP_PHY_INIT_CFG(QPHY_V3_PCS_RATE_SLEW_CNTRL, 0x02),
1317 QMP_PHY_INIT_CFG(QPHY_V3_PCS_PWRUP_RESET_DLY_TIME_AUXCLK, 0x04),
1318 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TSYNC_RSYNC_TIME, 0x44),
1319 QMP_PHY_INIT_CFG(QPHY_V3_PCS_PWRUP_RESET_DLY_TIME_AUXCLK, 0x04),
1320 QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_P1U2_L, 0xe7),
1321 QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_P1U2_H, 0x03),
1322 QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_U3_L, 0x40),
1323 QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_U3_H, 0x00),
1324 QMP_PHY_INIT_CFG(QPHY_V3_PCS_RXEQTRAINING_WAIT_TIME, 0x75),
1325 QMP_PHY_INIT_CFG(QPHY_V3_PCS_LFPS_TX_ECSTART_EQTLOCK, 0x86),
1326 QMP_PHY_INIT_CFG(QPHY_V3_PCS_RXEQTRAINING_RUN_TIME, 0x13),
1327
1328 QMP_PHY_INIT_CFG(QPHY_V3_PCS_REFGEN_REQ_CONFIG1, 0x21),
1329 QMP_PHY_INIT_CFG(QPHY_V3_PCS_REFGEN_REQ_CONFIG2, 0x60),
1330};
1331
1332static const struct qmp_phy_init_tbl sdm845_ufsphy_serdes_tbl[] = {
1333 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYS_CLK_CTRL, 0x02),
1334 QMP_PHY_INIT_CFG(QSERDES_V3_COM_BIAS_EN_CLKBUFLR_EN, 0x04),
1335 QMP_PHY_INIT_CFG(QSERDES_V3_COM_BG_TIMER, 0x0a),
1336 QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_IVCO, 0x07),
1337 QMP_PHY_INIT_CFG(QSERDES_V3_COM_CMN_CONFIG, 0x06),
1338 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYSCLK_EN_SEL, 0xd5),
1339 QMP_PHY_INIT_CFG(QSERDES_V3_COM_RESETSM_CNTRL, 0x20),
1340 QMP_PHY_INIT_CFG(QSERDES_V3_COM_CLK_SELECT, 0x30),
1341 QMP_PHY_INIT_CFG(QSERDES_V3_COM_HSCLK_SEL, 0x00),
1342 QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP_EN, 0x01),
1343 QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_CTRL, 0x00),
1344 QMP_PHY_INIT_CFG(QSERDES_V3_COM_CORE_CLK_EN, 0x00),
1345 QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_MAP, 0x04),
1346 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SVS_MODE_CLK_SEL, 0x05),
1347 QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_INITVAL1, 0xff),
1348 QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_INITVAL2, 0x00),
1349 QMP_PHY_INIT_CFG(QSERDES_V3_COM_DEC_START_MODE0, 0x82),
1350 QMP_PHY_INIT_CFG(QSERDES_V3_COM_CP_CTRL_MODE0, 0x06),
1351 QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_RCTRL_MODE0, 0x16),
1352 QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_CCTRL_MODE0, 0x36),
1353 QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN0_MODE0, 0x3f),
1354 QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN1_MODE0, 0x00),
1355 QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE1_MODE0, 0xda),
1356 QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE2_MODE0, 0x01),
1357 QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP1_MODE0, 0xff),
1358 QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP2_MODE0, 0x0c),
1359 QMP_PHY_INIT_CFG(QSERDES_V3_COM_DEC_START_MODE1, 0x98),
1360 QMP_PHY_INIT_CFG(QSERDES_V3_COM_CP_CTRL_MODE1, 0x06),
1361 QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_RCTRL_MODE1, 0x16),
1362 QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_CCTRL_MODE1, 0x36),
1363 QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN0_MODE1, 0x3f),
1364 QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN1_MODE1, 0x00),
1365 QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE1_MODE1, 0xc1),
1366 QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE2_MODE1, 0x00),
1367 QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP1_MODE1, 0x32),
1368 QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP2_MODE1, 0x0f),
1369
1370 /* Rate B */
1371 QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_MAP, 0x44),
1372};
1373
1374static const struct qmp_phy_init_tbl sdm845_ufsphy_tx_tbl[] = {
1375 QMP_PHY_INIT_CFG(QSERDES_V3_TX_LANE_MODE_1, 0x06),
1376 QMP_PHY_INIT_CFG(QSERDES_V3_TX_RES_CODE_LANE_OFFSET_TX, 0x04),
1377 QMP_PHY_INIT_CFG(QSERDES_V3_TX_RES_CODE_LANE_OFFSET_RX, 0x07),
1378};
1379
1380static const struct qmp_phy_init_tbl sdm845_ufsphy_rx_tbl[] = {
1381 QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_LVL, 0x24),
1382 QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_CNTRL, 0x0f),
1383 QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_DEGLITCH_CNTRL, 0x1e),
1384 QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_INTERFACE_MODE, 0x40),
1385 QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_FASTLOCK_FO_GAIN, 0x0b),
1386 QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_TERM_BW, 0x5b),
1387 QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL2, 0x06),
1388 QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL3, 0x04),
1389 QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL4, 0x1b),
1390 QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_SVS_SO_GAIN_HALF, 0x04),
1391 QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_SVS_SO_GAIN_QUARTER, 0x04),
1392 QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_SVS_SO_GAIN, 0x04),
1393 QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x4b),
1394 QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_PI_CONTROLS, 0x81),
1395 QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_FASTLOCK_COUNT_LOW, 0x80),
1396 QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_MODE_00, 0x59),
1397};
1398
1399static const struct qmp_phy_init_tbl sdm845_ufsphy_pcs_tbl[] = {
1400 QMP_PHY_INIT_CFG(QPHY_V3_PCS_RX_SIGDET_CTRL2, 0x6e),
1401 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TX_LARGE_AMP_DRV_LVL, 0x0a),
1402 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TX_SMALL_AMP_DRV_LVL, 0x02),
1403 QMP_PHY_INIT_CFG(QPHY_V3_PCS_RX_SYM_RESYNC_CTRL, 0x03),
1404 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TX_MID_TERM_CTRL1, 0x43),
1405 QMP_PHY_INIT_CFG(QPHY_V3_PCS_RX_SIGDET_CTRL1, 0x0f),
1406 QMP_PHY_INIT_CFG(QPHY_V3_PCS_RX_MIN_HIBERN8_TIME, 0x9a),
1407 QMP_PHY_INIT_CFG(QPHY_V3_PCS_MULTI_LANE_CTRL1, 0x02),
1408};
1409
1410static const struct qmp_phy_init_tbl msm8998_usb3_serdes_tbl[] = {
1411 QMP_PHY_INIT_CFG(QSERDES_V3_COM_CLK_SELECT, 0x30),
1412 QMP_PHY_INIT_CFG(QSERDES_V3_COM_BIAS_EN_CLKBUFLR_EN, 0x04),
1413 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYSCLK_EN_SEL, 0x14),
1414 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYS_CLK_CTRL, 0x06),
1415 QMP_PHY_INIT_CFG(QSERDES_V3_COM_RESETSM_CNTRL2, 0x08),
1416 QMP_PHY_INIT_CFG(QSERDES_V3_COM_CMN_CONFIG, 0x06),
1417 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SVS_MODE_CLK_SEL, 0x01),
1418 QMP_PHY_INIT_CFG(QSERDES_V3_COM_HSCLK_SEL, 0x80),
1419 QMP_PHY_INIT_CFG(QSERDES_V3_COM_DEC_START_MODE0, 0x82),
1420 QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START1_MODE0, 0xab),
1421 QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START2_MODE0, 0xea),
1422 QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START3_MODE0, 0x02),
1423 QMP_PHY_INIT_CFG(QSERDES_V3_COM_CP_CTRL_MODE0, 0x06),
1424 QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_RCTRL_MODE0, 0x16),
1425 QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_CCTRL_MODE0, 0x36),
1426 QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN1_MODE0, 0x00),
1427 QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN0_MODE0, 0x3f),
1428 QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE2_MODE0, 0x01),
1429 QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE1_MODE0, 0xc9),
1430 QMP_PHY_INIT_CFG(QSERDES_V3_COM_CORECLK_DIV_MODE0, 0x0a),
1431 QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP3_MODE0, 0x00),
1432 QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP2_MODE0, 0x34),
1433 QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP1_MODE0, 0x15),
1434 QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP_EN, 0x04),
1435 QMP_PHY_INIT_CFG(QSERDES_V3_COM_CORE_CLK_EN, 0x00),
1436 QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP_CFG, 0x00),
1437 QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_MAP, 0x00),
1438 QMP_PHY_INIT_CFG(QSERDES_V3_COM_BG_TIMER, 0x0a),
1439 QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_IVCO, 0x07),
1440 QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_INITVAL, 0x80),
1441 QMP_PHY_INIT_CFG(QSERDES_V3_COM_CMN_MODE, 0x01),
1442 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_EN_CENTER, 0x01),
1443 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_PER1, 0x31),
1444 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_PER2, 0x01),
1445 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_ADJ_PER1, 0x00),
1446 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_ADJ_PER2, 0x00),
1447 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_STEP_SIZE1, 0x85),
1448 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_STEP_SIZE2, 0x07),
1449};
1450
1451static const struct qmp_phy_init_tbl msm8998_usb3_tx_tbl[] = {
1452 QMP_PHY_INIT_CFG(QSERDES_V3_TX_HIGHZ_DRVR_EN, 0x10),
1453 QMP_PHY_INIT_CFG(QSERDES_V3_TX_RCV_DETECT_LVL_2, 0x12),
1454 QMP_PHY_INIT_CFG(QSERDES_V3_TX_LANE_MODE_1, 0x16),
1455 QMP_PHY_INIT_CFG(QSERDES_V3_TX_RES_CODE_LANE_OFFSET_TX, 0x00),
1456};
1457
1458static const struct qmp_phy_init_tbl msm8998_usb3_rx_tbl[] = {
1459 QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_FASTLOCK_FO_GAIN, 0x0b),
1460 QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0f),
1461 QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL3, 0x4e),
1462 QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL4, 0x18),
1463 QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x07),
1464 QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_OFFSET_ADAPTOR_CNTRL2, 0x80),
1465 QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_CNTRL, 0x43),
1466 QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_DEGLITCH_CNTRL, 0x1c),
1467 QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x75),
1468 QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_FASTLOCK_COUNT_LOW, 0x00),
1469 QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_FASTLOCK_COUNT_HIGH, 0x00),
1470 QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_PI_CONTROLS, 0x80),
1471 QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_FO_GAIN, 0x0a),
1472 QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_SO_GAIN, 0x06),
1473 QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_ENABLES, 0x00),
1474 QMP_PHY_INIT_CFG(QSERDES_V3_RX_VGA_CAL_CNTRL2, 0x03),
1475 QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_MODE_00, 0x05),
1476};
1477
1478static const struct qmp_phy_init_tbl msm8998_usb3_pcs_tbl[] = {
1479 QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNTRL2, 0x83),
1480 QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNT_VAL_L, 0x09),
1481 QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNT_VAL_H_TOL, 0xa2),
1482 QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_MAN_CODE, 0x40),
1483 QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNTRL1, 0x02),
1484 QMP_PHY_INIT_CFG(QPHY_V3_PCS_LOCK_DETECT_CONFIG1, 0xd1),
1485 QMP_PHY_INIT_CFG(QPHY_V3_PCS_LOCK_DETECT_CONFIG2, 0x1f),
1486 QMP_PHY_INIT_CFG(QPHY_V3_PCS_LOCK_DETECT_CONFIG3, 0x47),
1487 QMP_PHY_INIT_CFG(QPHY_V3_PCS_POWER_STATE_CONFIG2, 0x1b),
1488 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V0, 0x9f),
1489 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V1, 0x9f),
1490 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V2, 0xb7),
1491 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V3, 0x4e),
1492 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V4, 0x65),
1493 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_LS, 0x6b),
1494 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V0, 0x15),
1495 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V0, 0x0d),
1496 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TX_LARGE_AMP_DRV_LVL, 0x15),
1497 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V1, 0x0d),
1498 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V2, 0x15),
1499 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V2, 0x0d),
1500 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V3, 0x15),
1501 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V3, 0x0d),
1502 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V4, 0x15),
1503 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V4, 0x0d),
1504 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_LS, 0x15),
1505 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_LS, 0x0d),
1506 QMP_PHY_INIT_CFG(QPHY_V3_PCS_RATE_SLEW_CNTRL, 0x02),
1507 QMP_PHY_INIT_CFG(QPHY_V3_PCS_PWRUP_RESET_DLY_TIME_AUXCLK, 0x04),
1508 QMP_PHY_INIT_CFG(QPHY_V3_PCS_TSYNC_RSYNC_TIME, 0x44),
1509 QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_P1U2_L, 0xe7),
1510 QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_P1U2_H, 0x03),
1511 QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_U3_L, 0x40),
1512 QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_U3_H, 0x00),
1513 QMP_PHY_INIT_CFG(QPHY_V3_PCS_RX_SIGDET_LVL, 0x8a),
1514 QMP_PHY_INIT_CFG(QPHY_V3_PCS_RXEQTRAINING_WAIT_TIME, 0x75),
1515 QMP_PHY_INIT_CFG(QPHY_V3_PCS_LFPS_TX_ECSTART_EQTLOCK, 0x86),
1516 QMP_PHY_INIT_CFG(QPHY_V3_PCS_RXEQTRAINING_RUN_TIME, 0x13),
1517};
1518
1519static const struct qmp_phy_init_tbl sm8150_ufsphy_serdes_tbl[] = {
1520 QMP_PHY_INIT_CFG(QSERDES_V4_COM_SYSCLK_EN_SEL, 0xd9),
1521 QMP_PHY_INIT_CFG(QSERDES_V4_COM_HSCLK_SEL, 0x11),
1522 QMP_PHY_INIT_CFG(QSERDES_V4_COM_HSCLK_HS_SWITCH_SEL, 0x00),
1523 QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP_EN, 0x01),
1524 QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE_MAP, 0x02),
1525 QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_IVCO, 0x0f),
1526 QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE_INITVAL2, 0x00),
1527 QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_HSCLK_SEL, 0x11),
1528 QMP_PHY_INIT_CFG(QSERDES_V4_COM_DEC_START_MODE0, 0x82),
1529 QMP_PHY_INIT_CFG(QSERDES_V4_COM_CP_CTRL_MODE0, 0x06),
1530 QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_RCTRL_MODE0, 0x16),
1531 QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_CCTRL_MODE0, 0x36),
1532 QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP1_MODE0, 0xff),
1533 QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP2_MODE0, 0x0c),
1534 QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE1_MODE0, 0xac),
1535 QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE2_MODE0, 0x1e),
1536 QMP_PHY_INIT_CFG(QSERDES_V4_COM_DEC_START_MODE1, 0x98),
1537 QMP_PHY_INIT_CFG(QSERDES_V4_COM_CP_CTRL_MODE1, 0x06),
1538 QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_RCTRL_MODE1, 0x16),
1539 QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_CCTRL_MODE1, 0x36),
1540 QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP1_MODE1, 0x32),
1541 QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP2_MODE1, 0x0f),
1542 QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE1_MODE1, 0xdd),
1543 QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE2_MODE1, 0x23),
1544
1545 /* Rate B */
1546 QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE_MAP, 0x06),
1547};
1548
1549static const struct qmp_phy_init_tbl sm8150_ufsphy_tx_tbl[] = {
1550 QMP_PHY_INIT_CFG(QSERDES_V4_TX_PWM_GEAR_1_DIVIDER_BAND0_1, 0x06),
1551 QMP_PHY_INIT_CFG(QSERDES_V4_TX_PWM_GEAR_2_DIVIDER_BAND0_1, 0x03),
1552 QMP_PHY_INIT_CFG(QSERDES_V4_TX_PWM_GEAR_3_DIVIDER_BAND0_1, 0x01),
1553 QMP_PHY_INIT_CFG(QSERDES_V4_TX_PWM_GEAR_4_DIVIDER_BAND0_1, 0x00),
1554 QMP_PHY_INIT_CFG(QSERDES_V4_TX_LANE_MODE_1, 0x05),
1555 QMP_PHY_INIT_CFG(QSERDES_V4_TX_TRAN_DRVR_EMP_EN, 0x0c),
1556};
1557
1558static const struct qmp_phy_init_tbl sm8150_ufsphy_rx_tbl[] = {
1559 QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_LVL, 0x24),
1560 QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_CNTRL, 0x0f),
1561 QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_DEGLITCH_CNTRL, 0x1e),
1562 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_BAND, 0x18),
1563 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_FO_GAIN, 0x0a),
1564 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x4b),
1565 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_PI_CONTROLS, 0xf1),
1566 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_COUNT_LOW, 0x80),
1567 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_PI_CTRL2, 0x80),
1568 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FO_GAIN, 0x0c),
1569 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SO_GAIN, 0x04),
1570 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_TERM_BW, 0x1b),
1571 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL2, 0x06),
1572 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL3, 0x04),
1573 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL4, 0x1d),
1574 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_OFFSET_ADAPTOR_CNTRL2, 0x00),
1575 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_MEASURE_TIME, 0x10),
1576 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_LOW, 0xc0),
1577 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_HIGH, 0x00),
1578 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_LOW, 0x36),
1579 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH, 0x36),
1580 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH2, 0xf6),
1581 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH3, 0x3b),
1582 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH4, 0x3d),
1583 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_LOW, 0xe0),
1584 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH, 0xc8),
1585 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH2, 0xc8),
1586 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH3, 0x3b),
1587 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH4, 0xb1),
1588 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_10_LOW, 0xe0),
1589 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_10_HIGH, 0xc8),
1590 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_10_HIGH2, 0xc8),
1591 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_10_HIGH3, 0x3b),
1592 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_10_HIGH4, 0xb1),
1593
1594};
1595
1596static const struct qmp_phy_init_tbl sm8150_ufsphy_pcs_tbl[] = {
1597 QMP_PHY_INIT_CFG(QPHY_V4_PCS_UFS_RX_SIGDET_CTRL2, 0x6d),
1598 QMP_PHY_INIT_CFG(QPHY_V4_PCS_UFS_TX_LARGE_AMP_DRV_LVL, 0x0a),
1599 QMP_PHY_INIT_CFG(QPHY_V4_PCS_UFS_TX_SMALL_AMP_DRV_LVL, 0x02),
1600 QMP_PHY_INIT_CFG(QPHY_V4_PCS_UFS_TX_MID_TERM_CTRL1, 0x43),
1601 QMP_PHY_INIT_CFG(QPHY_V4_PCS_UFS_DEBUG_BUS_CLKSEL, 0x1f),
1602 QMP_PHY_INIT_CFG(QPHY_V4_PCS_UFS_RX_MIN_HIBERN8_TIME, 0xff),
1603 QMP_PHY_INIT_CFG(QPHY_V4_PCS_UFS_MULTI_LANE_CTRL1, 0x02),
1604};
1605
1606static const struct qmp_phy_init_tbl sm8150_usb3_serdes_tbl[] = {
1607 QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_EN_CENTER, 0x01),
1608 QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_PER1, 0x31),
1609 QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_PER2, 0x01),
1610 QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_STEP_SIZE1_MODE0, 0xde),
1611 QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_STEP_SIZE2_MODE0, 0x07),
1612 QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_STEP_SIZE1_MODE1, 0xde),
1613 QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_STEP_SIZE2_MODE1, 0x07),
1614 QMP_PHY_INIT_CFG(QSERDES_V4_COM_SYSCLK_BUF_ENABLE, 0x0a),
1615 QMP_PHY_INIT_CFG(QSERDES_V4_COM_CMN_IPTRIM, 0x20),
1616 QMP_PHY_INIT_CFG(QSERDES_V4_COM_CP_CTRL_MODE0, 0x06),
1617 QMP_PHY_INIT_CFG(QSERDES_V4_COM_CP_CTRL_MODE1, 0x06),
1618 QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_RCTRL_MODE0, 0x16),
1619 QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_RCTRL_MODE1, 0x16),
1620 QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_CCTRL_MODE0, 0x36),
1621 QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_CCTRL_MODE1, 0x36),
1622 QMP_PHY_INIT_CFG(QSERDES_V4_COM_SYSCLK_EN_SEL, 0x1a),
1623 QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP_EN, 0x04),
1624 QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP1_MODE0, 0x14),
1625 QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP2_MODE0, 0x34),
1626 QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP1_MODE1, 0x34),
1627 QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP2_MODE1, 0x82),
1628 QMP_PHY_INIT_CFG(QSERDES_V4_COM_DEC_START_MODE0, 0x82),
1629 QMP_PHY_INIT_CFG(QSERDES_V4_COM_DEC_START_MODE1, 0x82),
1630 QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START1_MODE0, 0xab),
1631 QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START2_MODE0, 0xea),
1632 QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START3_MODE0, 0x02),
1633 QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE_MAP, 0x02),
1634 QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START1_MODE1, 0xab),
1635 QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START2_MODE1, 0xea),
1636 QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START3_MODE1, 0x02),
1637 QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE1_MODE0, 0x24),
1638 QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE1_MODE1, 0x24),
1639 QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE2_MODE1, 0x02),
1640 QMP_PHY_INIT_CFG(QSERDES_V4_COM_HSCLK_SEL, 0x01),
1641 QMP_PHY_INIT_CFG(QSERDES_V4_COM_CORECLK_DIV_MODE1, 0x08),
1642 QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE1_MODE0, 0xca),
1643 QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE2_MODE0, 0x1e),
1644 QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE1_MODE1, 0xca),
1645 QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE2_MODE1, 0x1e),
1646 QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_HSCLK_SEL, 0x11),
1647};
1648
1649static const struct qmp_phy_init_tbl sm8150_usb3_tx_tbl[] = {
1650 QMP_PHY_INIT_CFG(QSERDES_V4_TX_RES_CODE_LANE_TX, 0x00),
1651 QMP_PHY_INIT_CFG(QSERDES_V4_TX_RES_CODE_LANE_RX, 0x00),
1652 QMP_PHY_INIT_CFG(QSERDES_V4_TX_LANE_MODE_1, 0xd5),
1653 QMP_PHY_INIT_CFG(QSERDES_V4_TX_RCV_DETECT_LVL_2, 0x12),
1654 QMP_PHY_INIT_CFG(QSERDES_V4_TX_PI_QEC_CTRL, 0x20),
1655};
1656
1657static const struct qmp_phy_init_tbl sm8150_usb3_rx_tbl[] = {
1658 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SO_GAIN, 0x05),
1659 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_FO_GAIN, 0x2f),
1660 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x7f),
1661 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_COUNT_LOW, 0xff),
1662 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_COUNT_HIGH, 0x0f),
1663 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_PI_CONTROLS, 0x99),
1664 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_THRESH1, 0x04),
1665 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_THRESH2, 0x08),
1666 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_GAIN1, 0x05),
1667 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_GAIN2, 0x05),
1668 QMP_PHY_INIT_CFG(QSERDES_V4_RX_VGA_CAL_CNTRL1, 0x54),
1669 QMP_PHY_INIT_CFG(QSERDES_V4_RX_VGA_CAL_CNTRL2, 0x0e),
1670 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0f),
1671 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL3, 0x4a),
1672 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL4, 0x0a),
1673 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_LOW, 0xc0),
1674 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_HIGH, 0x00),
1675 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x77),
1676 QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_CNTRL, 0x04),
1677 QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_DEGLITCH_CNTRL, 0x0e),
1678 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_LOW, 0xbf),
1679 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH, 0xbf),
1680 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH2, 0x3f),
1681 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH3, 0x7f),
1682 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH4, 0x94),
1683 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_LOW, 0xdc),
1684 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH, 0xdc),
1685 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH2, 0x5c),
1686 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH3, 0x0b),
1687 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH4, 0xb3),
1688 QMP_PHY_INIT_CFG(QSERDES_V4_RX_DFE_EN_TIMER, 0x04),
1689 QMP_PHY_INIT_CFG(QSERDES_V4_RX_DFE_CTLE_POST_CAL_OFFSET, 0x38),
1690 QMP_PHY_INIT_CFG(QSERDES_V4_RX_AUX_DATA_TCOARSE_TFINE, 0xa0),
1691 QMP_PHY_INIT_CFG(QSERDES_V4_RX_DCC_CTRL1, 0x0c),
1692 QMP_PHY_INIT_CFG(QSERDES_V4_RX_GM_CAL, 0x1f),
1693 QMP_PHY_INIT_CFG(QSERDES_V4_RX_VTH_CODE, 0x10),
1694};
1695
1696static const struct qmp_phy_init_tbl sm8150_usb3_pcs_tbl[] = {
1697 /* Lock Det settings */
1698 QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG1, 0xd0),
1699 QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG2, 0x07),
1700 QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG6, 0x13),
1701
1702 QMP_PHY_INIT_CFG(QPHY_V4_PCS_REFGEN_REQ_CONFIG1, 0x21),
1703 QMP_PHY_INIT_CFG(QPHY_V4_PCS_RX_SIGDET_LVL, 0xaa),
1704 QMP_PHY_INIT_CFG(QPHY_V4_PCS_CDR_RESET_TIME, 0x0a),
1705 QMP_PHY_INIT_CFG(QPHY_V4_PCS_ALIGN_DETECT_CONFIG1, 0x88),
1706 QMP_PHY_INIT_CFG(QPHY_V4_PCS_ALIGN_DETECT_CONFIG2, 0x13),
1707 QMP_PHY_INIT_CFG(QPHY_V4_PCS_PCS_TX_RX_CONFIG, 0x0c),
1708 QMP_PHY_INIT_CFG(QPHY_V4_PCS_EQ_CONFIG1, 0x4b),
1709 QMP_PHY_INIT_CFG(QPHY_V4_PCS_EQ_CONFIG5, 0x10),
1710 QMP_PHY_INIT_CFG(QPHY_V4_PCS_USB3_LFPS_DET_HIGH_COUNT_VAL, 0xf8),
1711 QMP_PHY_INIT_CFG(QPHY_V4_PCS_USB3_RXEQTRAINING_DFE_TIME_S2, 0x07),
1712};
1713
1714static const struct qmp_phy_init_tbl sm8150_usb3_uniphy_serdes_tbl[] = {
1715 QMP_PHY_INIT_CFG(QSERDES_V4_COM_SYSCLK_EN_SEL, 0x1a),
1716 QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_HSCLK_SEL, 0x11),
1717 QMP_PHY_INIT_CFG(QSERDES_V4_COM_HSCLK_SEL, 0x01),
1718 QMP_PHY_INIT_CFG(QSERDES_V4_COM_DEC_START_MODE0, 0x82),
1719 QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START1_MODE0, 0xab),
1720 QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START2_MODE0, 0xea),
1721 QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START3_MODE0, 0x02),
1722 QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE1_MODE0, 0xca),
1723 QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE2_MODE0, 0x1e),
1724 QMP_PHY_INIT_CFG(QSERDES_V4_COM_CP_CTRL_MODE0, 0x06),
1725 QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_RCTRL_MODE0, 0x16),
1726 QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_CCTRL_MODE0, 0x36),
1727 QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE1_MODE0, 0x24),
1728 QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP2_MODE0, 0x34),
1729 QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP1_MODE0, 0x14),
1730 QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP_EN, 0x04),
1731 QMP_PHY_INIT_CFG(QSERDES_V4_COM_SYSCLK_BUF_ENABLE, 0x0a),
1732 QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE2_MODE1, 0x02),
1733 QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE1_MODE1, 0x24),
1734 QMP_PHY_INIT_CFG(QSERDES_V4_COM_CORECLK_DIV_MODE1, 0x08),
1735 QMP_PHY_INIT_CFG(QSERDES_V4_COM_DEC_START_MODE1, 0x82),
1736 QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START1_MODE1, 0xab),
1737 QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START2_MODE1, 0xea),
1738 QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START3_MODE1, 0x02),
1739 QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP2_MODE1, 0x82),
1740 QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP1_MODE1, 0x34),
1741 QMP_PHY_INIT_CFG(QSERDES_V4_COM_CP_CTRL_MODE1, 0x06),
1742 QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_RCTRL_MODE1, 0x16),
1743 QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_CCTRL_MODE1, 0x36),
1744 QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE1_MODE1, 0xca),
1745 QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE2_MODE1, 0x1e),
1746 QMP_PHY_INIT_CFG(QSERDES_V4_COM_CMN_IPTRIM, 0x20),
1747 QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_EN_CENTER, 0x01),
1748 QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_PER1, 0x31),
1749 QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_PER2, 0x01),
1750 QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_STEP_SIZE1_MODE1, 0xde),
1751 QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_STEP_SIZE2_MODE1, 0x07),
1752 QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_STEP_SIZE1_MODE0, 0xde),
1753 QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_STEP_SIZE2_MODE0, 0x07),
1754 QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE_MAP, 0x02),
1755};
1756
1757static const struct qmp_phy_init_tbl sm8150_usb3_uniphy_tx_tbl[] = {
1758 QMP_PHY_INIT_CFG(QSERDES_V4_TX_RCV_DETECT_LVL_2, 0x12),
1759 QMP_PHY_INIT_CFG(QSERDES_V4_TX_LANE_MODE_1, 0x95),
1760 QMP_PHY_INIT_CFG(QSERDES_V4_TX_PI_QEC_CTRL, 0x40),
1761 QMP_PHY_INIT_CFG(QSERDES_V4_TX_RES_CODE_LANE_OFFSET_TX, 0x05),
1762};
1763
1764static const struct qmp_phy_init_tbl sm8150_usb3_uniphy_rx_tbl[] = {
1765 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH4, 0xb8),
1766 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH3, 0x7f),
1767 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH2, 0x37),
1768 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH, 0x2f),
1769 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_LOW, 0xef),
1770 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH4, 0xb3),
1771 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH3, 0x0b),
1772 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH2, 0x5c),
1773 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH, 0xdc),
1774 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_LOW, 0xdc),
1775 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_PI_CONTROLS, 0x99),
1776 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_THRESH1, 0x04),
1777 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_THRESH2, 0x08),
1778 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_GAIN1, 0x05),
1779 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_GAIN2, 0x05),
1780 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_FO_GAIN, 0x2f),
1781 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_COUNT_LOW, 0xff),
1782 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_COUNT_HIGH, 0x0f),
1783 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x7f),
1784 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FO_GAIN, 0x08),
1785 QMP_PHY_INIT_CFG(QSERDES_V4_RX_VGA_CAL_CNTRL1, 0x54),
1786 QMP_PHY_INIT_CFG(QSERDES_V4_RX_VGA_CAL_CNTRL2, 0x0c),
1787 QMP_PHY_INIT_CFG(QSERDES_V4_RX_GM_CAL, 0x1f),
1788 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0f),
1789 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL3, 0x4a),
1790 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL4, 0x0a),
1791 QMP_PHY_INIT_CFG(QSERDES_V4_RX_DFE_EN_TIMER, 0x04),
1792 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x47),
1793 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_OFFSET_ADAPTOR_CNTRL2, 0x80),
1794 QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_CNTRL, 0x04),
1795 QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_DEGLITCH_CNTRL, 0x0e),
1796 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_HIGH, 0x00),
1797 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_LOW, 0xc0),
1798 QMP_PHY_INIT_CFG(QSERDES_V4_RX_DFE_CTLE_POST_CAL_OFFSET, 0x20),
1799 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SO_GAIN, 0x04),
1800 QMP_PHY_INIT_CFG(QSERDES_V4_RX_DCC_CTRL1, 0x0c),
1801};
1802
1803static const struct qmp_phy_init_tbl sm8150_usb3_uniphy_pcs_tbl[] = {
1804 QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG1, 0xd0),
1805 QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG2, 0x07),
1806 QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG3, 0x20),
1807 QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG6, 0x13),
1808 QMP_PHY_INIT_CFG(QPHY_V4_PCS_RCVR_DTCT_DLY_P1U2_L, 0xe7),
1809 QMP_PHY_INIT_CFG(QPHY_V4_PCS_RCVR_DTCT_DLY_P1U2_H, 0x03),
1810 QMP_PHY_INIT_CFG(QPHY_V4_PCS_RX_SIGDET_LVL, 0xaa),
1811 QMP_PHY_INIT_CFG(QPHY_V4_PCS_USB3_UNI_RXEQTRAINING_DFE_TIME_S2, 0x07),
1812 QMP_PHY_INIT_CFG(QPHY_V4_PCS_USB3_UNI_LFPS_DET_HIGH_COUNT_VAL, 0xf8),
1813 QMP_PHY_INIT_CFG(QPHY_V4_PCS_CDR_RESET_TIME, 0x0f),
1814 QMP_PHY_INIT_CFG(QPHY_V4_PCS_ALIGN_DETECT_CONFIG1, 0x88),
1815 QMP_PHY_INIT_CFG(QPHY_V4_PCS_ALIGN_DETECT_CONFIG2, 0x13),
1816 QMP_PHY_INIT_CFG(QPHY_V4_PCS_EQ_CONFIG1, 0x4b),
1817 QMP_PHY_INIT_CFG(QPHY_V4_PCS_EQ_CONFIG5, 0x10),
1818 QMP_PHY_INIT_CFG(QPHY_V4_PCS_REFGEN_REQ_CONFIG1, 0x21),
1819 QMP_PHY_INIT_CFG(QPHY_V4_PCS_PCS_TX_RX_CONFIG, 0x0c),
1820};
1821
1822static const struct qmp_phy_init_tbl sm8250_usb3_tx_tbl[] = {
1823 QMP_PHY_INIT_CFG(QSERDES_V4_TX_RES_CODE_LANE_TX, 0x60),
1824 QMP_PHY_INIT_CFG(QSERDES_V4_TX_RES_CODE_LANE_RX, 0x60),
1825 QMP_PHY_INIT_CFG(QSERDES_V4_TX_RES_CODE_LANE_OFFSET_TX, 0x11),
1826 QMP_PHY_INIT_CFG(QSERDES_V4_TX_RES_CODE_LANE_OFFSET_RX, 0x02),
1827 QMP_PHY_INIT_CFG(QSERDES_V4_TX_LANE_MODE_1, 0xd5),
1828 QMP_PHY_INIT_CFG(QSERDES_V4_TX_RCV_DETECT_LVL_2, 0x12),
1829 QMP_PHY_INIT_CFG_LANE(QSERDES_V4_TX_PI_QEC_CTRL, 0x40, 1),
1830 QMP_PHY_INIT_CFG_LANE(QSERDES_V4_TX_PI_QEC_CTRL, 0x54, 2),
1831};
1832
1833static const struct qmp_phy_init_tbl sm8250_usb3_rx_tbl[] = {
1834 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SO_GAIN, 0x06),
1835 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_FO_GAIN, 0x2f),
1836 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x7f),
1837 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_COUNT_LOW, 0xff),
1838 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_COUNT_HIGH, 0x0f),
1839 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_PI_CONTROLS, 0x99),
1840 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_THRESH1, 0x04),
1841 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_THRESH2, 0x08),
1842 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_GAIN1, 0x05),
1843 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_GAIN2, 0x05),
1844 QMP_PHY_INIT_CFG(QSERDES_V4_RX_VGA_CAL_CNTRL1, 0x54),
1845 QMP_PHY_INIT_CFG(QSERDES_V4_RX_VGA_CAL_CNTRL2, 0x0c),
1846 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0f),
1847 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL3, 0x4a),
1848 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL4, 0x0a),
1849 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_LOW, 0xc0),
1850 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_HIGH, 0x00),
1851 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x77),
1852 QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_CNTRL, 0x04),
1853 QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_DEGLITCH_CNTRL, 0x0e),
1854 QMP_PHY_INIT_CFG_LANE(QSERDES_V4_RX_RX_MODE_00_LOW, 0xff, 1),
1855 QMP_PHY_INIT_CFG_LANE(QSERDES_V4_RX_RX_MODE_00_LOW, 0x7f, 2),
1856 QMP_PHY_INIT_CFG_LANE(QSERDES_V4_RX_RX_MODE_00_HIGH, 0x7f, 1),
1857 QMP_PHY_INIT_CFG_LANE(QSERDES_V4_RX_RX_MODE_00_HIGH, 0xff, 2),
1858 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH2, 0x7f),
1859 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH3, 0x7f),
1860 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH4, 0x97),
1861 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_LOW, 0xdc),
1862 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH, 0xdc),
1863 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH2, 0x5c),
1864 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH3, 0x7b),
1865 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH4, 0xb4),
1866 QMP_PHY_INIT_CFG(QSERDES_V4_RX_DFE_EN_TIMER, 0x04),
1867 QMP_PHY_INIT_CFG(QSERDES_V4_RX_DFE_CTLE_POST_CAL_OFFSET, 0x38),
1868 QMP_PHY_INIT_CFG(QSERDES_V4_RX_AUX_DATA_TCOARSE_TFINE, 0xa0),
1869 QMP_PHY_INIT_CFG(QSERDES_V4_RX_DCC_CTRL1, 0x0c),
1870 QMP_PHY_INIT_CFG(QSERDES_V4_RX_GM_CAL, 0x1f),
1871 QMP_PHY_INIT_CFG(QSERDES_V4_RX_VTH_CODE, 0x10),
1872};
1873
1874static const struct qmp_phy_init_tbl sm8250_usb3_pcs_tbl[] = {
1875 QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG1, 0xd0),
1876 QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG2, 0x07),
1877 QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG3, 0x20),
1878 QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG6, 0x13),
1879 QMP_PHY_INIT_CFG(QPHY_V4_PCS_REFGEN_REQ_CONFIG1, 0x21),
1880 QMP_PHY_INIT_CFG(QPHY_V4_PCS_RX_SIGDET_LVL, 0xa9),
1881 QMP_PHY_INIT_CFG(QPHY_V4_PCS_CDR_RESET_TIME, 0x0a),
1882 QMP_PHY_INIT_CFG(QPHY_V4_PCS_ALIGN_DETECT_CONFIG1, 0x88),
1883 QMP_PHY_INIT_CFG(QPHY_V4_PCS_ALIGN_DETECT_CONFIG2, 0x13),
1884 QMP_PHY_INIT_CFG(QPHY_V4_PCS_PCS_TX_RX_CONFIG, 0x0c),
1885 QMP_PHY_INIT_CFG(QPHY_V4_PCS_EQ_CONFIG1, 0x4b),
1886 QMP_PHY_INIT_CFG(QPHY_V4_PCS_EQ_CONFIG5, 0x10),
1887 QMP_PHY_INIT_CFG(QPHY_V4_PCS_USB3_LFPS_DET_HIGH_COUNT_VAL, 0xf8),
1888 QMP_PHY_INIT_CFG(QPHY_V4_PCS_USB3_RXEQTRAINING_DFE_TIME_S2, 0x07),
1889};
1890
1891static const struct qmp_phy_init_tbl sm8250_usb3_uniphy_tx_tbl[] = {
1892 QMP_PHY_INIT_CFG(QSERDES_V4_TX_RCV_DETECT_LVL_2, 0x12),
1893 QMP_PHY_INIT_CFG(QSERDES_V4_TX_LANE_MODE_1, 0xd5),
1894 QMP_PHY_INIT_CFG(QSERDES_V4_TX_LANE_MODE_2, 0x82),
1895 QMP_PHY_INIT_CFG(QSERDES_V4_TX_PI_QEC_CTRL, 0x40),
1896 QMP_PHY_INIT_CFG(QSERDES_V4_TX_RES_CODE_LANE_OFFSET_TX, 0x11),
1897 QMP_PHY_INIT_CFG(QSERDES_V4_TX_RES_CODE_LANE_OFFSET_RX, 0x02),
1898};
1899
1900static const struct qmp_phy_init_tbl sm8250_usb3_uniphy_rx_tbl[] = {
1901 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH4, 0xb8),
1902 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH3, 0xff),
1903 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH2, 0xbf),
1904 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH, 0x7f),
1905 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_LOW, 0x7f),
1906 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH4, 0xb4),
1907 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH3, 0x7b),
1908 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH2, 0x5c),
1909 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH, 0xdc),
1910 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_LOW, 0xdc),
1911 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_PI_CONTROLS, 0x99),
1912 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_THRESH1, 0x04),
1913 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_THRESH2, 0x08),
1914 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_GAIN1, 0x05),
1915 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_GAIN2, 0x05),
1916 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_FO_GAIN, 0x2f),
1917 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_COUNT_LOW, 0xff),
1918 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_COUNT_HIGH, 0x0f),
1919 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x7f),
1920 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FO_GAIN, 0x0a),
1921 QMP_PHY_INIT_CFG(QSERDES_V4_RX_VGA_CAL_CNTRL1, 0x54),
1922 QMP_PHY_INIT_CFG(QSERDES_V4_RX_VGA_CAL_CNTRL2, 0x0c),
1923 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0f),
1924 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL3, 0x4a),
1925 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL4, 0x0a),
1926 QMP_PHY_INIT_CFG(QSERDES_V4_RX_DFE_EN_TIMER, 0x04),
1927 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x47),
1928 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_OFFSET_ADAPTOR_CNTRL2, 0x80),
1929 QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_CNTRL, 0x04),
1930 QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_DEGLITCH_CNTRL, 0x0e),
1931 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_HIGH, 0x00),
1932 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_LOW, 0xc0),
1933 QMP_PHY_INIT_CFG(QSERDES_V4_RX_DFE_CTLE_POST_CAL_OFFSET, 0x38),
1934 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SO_GAIN, 0x06),
1935 QMP_PHY_INIT_CFG(QSERDES_V4_RX_DCC_CTRL1, 0x0c),
1936 QMP_PHY_INIT_CFG(QSERDES_V4_RX_GM_CAL, 0x1f),
1937};
1938
1939static const struct qmp_phy_init_tbl sm8250_usb3_uniphy_pcs_tbl[] = {
1940 QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG1, 0xd0),
1941 QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG2, 0x07),
1942 QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG3, 0x20),
1943 QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG6, 0x13),
1944 QMP_PHY_INIT_CFG(QPHY_V4_PCS_RCVR_DTCT_DLY_P1U2_L, 0xe7),
1945 QMP_PHY_INIT_CFG(QPHY_V4_PCS_RCVR_DTCT_DLY_P1U2_H, 0x03),
1946 QMP_PHY_INIT_CFG(QPHY_V4_PCS_RX_SIGDET_LVL, 0xa9),
1947 QMP_PHY_INIT_CFG(QPHY_V4_PCS_PCS_TX_RX_CONFIG, 0x0c),
1948 QMP_PHY_INIT_CFG(QPHY_V4_PCS_USB3_UNI_RXEQTRAINING_DFE_TIME_S2, 0x07),
1949 QMP_PHY_INIT_CFG(QPHY_V4_PCS_USB3_UNI_LFPS_DET_HIGH_COUNT_VAL, 0xf8),
1950 QMP_PHY_INIT_CFG(QPHY_V4_PCS_CDR_RESET_TIME, 0x0a),
1951 QMP_PHY_INIT_CFG(QPHY_V4_PCS_ALIGN_DETECT_CONFIG1, 0x88),
1952 QMP_PHY_INIT_CFG(QPHY_V4_PCS_ALIGN_DETECT_CONFIG2, 0x13),
1953 QMP_PHY_INIT_CFG(QPHY_V4_PCS_EQ_CONFIG1, 0x4b),
1954 QMP_PHY_INIT_CFG(QPHY_V4_PCS_EQ_CONFIG5, 0x10),
1955 QMP_PHY_INIT_CFG(QPHY_V4_PCS_REFGEN_REQ_CONFIG1, 0x21),
1956};
1957
1958static const struct qmp_phy_init_tbl qmp_v4_dp_serdes_tbl[] = {
1959 QMP_PHY_INIT_CFG(QSERDES_V4_COM_SVS_MODE_CLK_SEL, 0x05),
1960 QMP_PHY_INIT_CFG(QSERDES_V4_COM_SYSCLK_EN_SEL, 0x3b),
1961 QMP_PHY_INIT_CFG(QSERDES_V4_COM_SYS_CLK_CTRL, 0x02),
1962 QMP_PHY_INIT_CFG(QSERDES_V4_COM_CLK_ENABLE1, 0x0c),
1963 QMP_PHY_INIT_CFG(QSERDES_V4_COM_SYSCLK_BUF_ENABLE, 0x06),
1964 QMP_PHY_INIT_CFG(QSERDES_V4_COM_CLK_SELECT, 0x30),
1965 QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_IVCO, 0x0f),
1966 QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_CCTRL_MODE0, 0x36),
1967 QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_RCTRL_MODE0, 0x16),
1968 QMP_PHY_INIT_CFG(QSERDES_V4_COM_CP_CTRL_MODE0, 0x06),
1969 QMP_PHY_INIT_CFG(QSERDES_V4_COM_CMN_CONFIG, 0x02),
1970 QMP_PHY_INIT_CFG(QSERDES_V4_COM_INTEGLOOP_GAIN0_MODE0, 0x3f),
1971 QMP_PHY_INIT_CFG(QSERDES_V4_COM_INTEGLOOP_GAIN1_MODE0, 0x00),
1972 QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE_MAP, 0x00),
1973 QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START1_MODE0, 0x00),
1974 QMP_PHY_INIT_CFG(QSERDES_V4_COM_BG_TIMER, 0x0a),
1975 QMP_PHY_INIT_CFG(QSERDES_V4_COM_CORECLK_DIV_MODE0, 0x0a),
1976 QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE_CTRL, 0x00),
1977 QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIAS_EN_CLKBUFLR_EN, 0x17),
1978 QMP_PHY_INIT_CFG(QSERDES_V4_COM_CORE_CLK_EN, 0x1f),
1979};
1980
1981static const struct qmp_phy_init_tbl qmp_v4_dp_serdes_tbl_rbr[] = {
1982 QMP_PHY_INIT_CFG(QSERDES_V4_COM_HSCLK_SEL, 0x05),
1983 QMP_PHY_INIT_CFG(QSERDES_V4_COM_DEC_START_MODE0, 0x69),
1984 QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START2_MODE0, 0x80),
1985 QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START3_MODE0, 0x07),
1986 QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP1_MODE0, 0x6f),
1987 QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP2_MODE0, 0x08),
1988 QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP_EN, 0x04),
1989};
1990
1991static const struct qmp_phy_init_tbl qmp_v4_dp_serdes_tbl_hbr[] = {
1992 QMP_PHY_INIT_CFG(QSERDES_V4_COM_HSCLK_SEL, 0x03),
1993 QMP_PHY_INIT_CFG(QSERDES_V4_COM_DEC_START_MODE0, 0x69),
1994 QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START2_MODE0, 0x80),
1995 QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START3_MODE0, 0x07),
1996 QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP1_MODE0, 0x0f),
1997 QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP2_MODE0, 0x0e),
1998 QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP_EN, 0x08),
1999};
2000
2001static const struct qmp_phy_init_tbl qmp_v4_dp_serdes_tbl_hbr2[] = {
2002 QMP_PHY_INIT_CFG(QSERDES_V4_COM_HSCLK_SEL, 0x01),
2003 QMP_PHY_INIT_CFG(QSERDES_V4_COM_DEC_START_MODE0, 0x8c),
2004 QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START2_MODE0, 0x00),
2005 QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START3_MODE0, 0x0a),
2006 QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP1_MODE0, 0x1f),
2007 QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP2_MODE0, 0x1c),
2008 QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP_EN, 0x08),
2009};
2010
2011static const struct qmp_phy_init_tbl qmp_v4_dp_serdes_tbl_hbr3[] = {
2012 QMP_PHY_INIT_CFG(QSERDES_V4_COM_HSCLK_SEL, 0x00),
2013 QMP_PHY_INIT_CFG(QSERDES_V4_COM_DEC_START_MODE0, 0x69),
2014 QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START2_MODE0, 0x80),
2015 QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START3_MODE0, 0x07),
2016 QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP1_MODE0, 0x2f),
2017 QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP2_MODE0, 0x2a),
2018 QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP_EN, 0x08),
2019};
2020
2021static const struct qmp_phy_init_tbl qmp_v4_dp_tx_tbl[] = {
2022 QMP_PHY_INIT_CFG(QSERDES_V4_TX_VMODE_CTRL1, 0x40),
2023 QMP_PHY_INIT_CFG(QSERDES_V4_TX_PRE_STALL_LDO_BOOST_EN, 0x30),
2024 QMP_PHY_INIT_CFG(QSERDES_V4_TX_INTERFACE_SELECT, 0x3b),
2025 QMP_PHY_INIT_CFG(QSERDES_V4_TX_CLKBUF_ENABLE, 0x0f),
2026 QMP_PHY_INIT_CFG(QSERDES_V4_TX_RESET_TSYNC_EN, 0x03),
2027 QMP_PHY_INIT_CFG(QSERDES_V4_TX_TRAN_DRVR_EMP_EN, 0x0f),
2028 QMP_PHY_INIT_CFG(QSERDES_V4_TX_PARRATE_REC_DETECT_IDLE_EN, 0x00),
2029 QMP_PHY_INIT_CFG(QSERDES_V4_TX_TX_INTERFACE_MODE, 0x00),
2030 QMP_PHY_INIT_CFG(QSERDES_V4_TX_RES_CODE_LANE_OFFSET_TX, 0x11),
2031 QMP_PHY_INIT_CFG(QSERDES_V4_TX_RES_CODE_LANE_OFFSET_RX, 0x11),
2032 QMP_PHY_INIT_CFG(QSERDES_V4_TX_TX_BAND, 0x4),
2033 QMP_PHY_INIT_CFG(QSERDES_V4_TX_TX_POL_INV, 0x0a),
2034 QMP_PHY_INIT_CFG(QSERDES_V4_TX_TX_DRV_LVL, 0x2a),
2035 QMP_PHY_INIT_CFG(QSERDES_V4_TX_TX_EMP_POST1_LVL, 0x20),
2036};
2037
2038static const struct qmp_phy_init_tbl sm8250_qmp_pcie_serdes_tbl[] = {
2039 QMP_PHY_INIT_CFG(QSERDES_V4_COM_SYSCLK_EN_SEL, 0x08),
2040 QMP_PHY_INIT_CFG(QSERDES_V4_COM_CLK_SELECT, 0x34),
2041 QMP_PHY_INIT_CFG(QSERDES_V4_COM_CORECLK_DIV_MODE1, 0x08),
2042 QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_IVCO, 0x0f),
2043 QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP_EN, 0x42),
2044 QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE1_MODE0, 0x24),
2045 QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE2_MODE1, 0x03),
2046 QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE1_MODE1, 0xb4),
2047 QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE_MAP, 0x02),
2048 QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_HSCLK_SEL, 0x11),
2049 QMP_PHY_INIT_CFG(QSERDES_V4_COM_DEC_START_MODE0, 0x82),
2050 QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START3_MODE0, 0x03),
2051 QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START2_MODE0, 0x55),
2052 QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START1_MODE0, 0x55),
2053 QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP2_MODE0, 0x1a),
2054 QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP1_MODE0, 0x0a),
2055 QMP_PHY_INIT_CFG(QSERDES_V4_COM_DEC_START_MODE1, 0x68),
2056 QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START3_MODE1, 0x02),
2057 QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START2_MODE1, 0xaa),
2058 QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START1_MODE1, 0xab),
2059 QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP2_MODE1, 0x34),
2060 QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP1_MODE1, 0x14),
2061 QMP_PHY_INIT_CFG(QSERDES_V4_COM_HSCLK_SEL, 0x01),
2062 QMP_PHY_INIT_CFG(QSERDES_V4_COM_CP_CTRL_MODE0, 0x06),
2063 QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_RCTRL_MODE0, 0x16),
2064 QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_CCTRL_MODE0, 0x36),
2065 QMP_PHY_INIT_CFG(QSERDES_V4_COM_CP_CTRL_MODE1, 0x06),
2066 QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_RCTRL_MODE1, 0x16),
2067 QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_CCTRL_MODE1, 0x36),
2068 QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE2_MODE0, 0x1e),
2069 QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE1_MODE0, 0xca),
2070 QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE2_MODE1, 0x18),
2071 QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE1_MODE1, 0xa2),
2072 QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_EN_CENTER, 0x01),
2073 QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_PER1, 0x31),
2074 QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_PER2, 0x01),
2075 QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_STEP_SIZE1_MODE0, 0xde),
2076 QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_STEP_SIZE2_MODE0, 0x07),
2077 QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_STEP_SIZE1_MODE1, 0x4c),
2078 QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_STEP_SIZE2_MODE1, 0x06),
2079 QMP_PHY_INIT_CFG(QSERDES_V4_COM_CLK_ENABLE1, 0x90),
2080};
2081
2082static const struct qmp_phy_init_tbl sm8250_qmp_gen3x1_pcie_serdes_tbl[] = {
2083 QMP_PHY_INIT_CFG(QSERDES_V4_COM_SYSCLK_BUF_ENABLE, 0x07),
2084};
2085
2086static const struct qmp_phy_init_tbl sm8250_qmp_pcie_tx_tbl[] = {
2087 QMP_PHY_INIT_CFG(QSERDES_V4_TX_RCV_DETECT_LVL_2, 0x12),
2088 QMP_PHY_INIT_CFG(QSERDES_V4_TX_LANE_MODE_1, 0x35),
2089 QMP_PHY_INIT_CFG(QSERDES_V4_TX_RES_CODE_LANE_OFFSET_TX, 0x11),
2090};
2091
2092static const struct qmp_phy_init_tbl sm8250_qmp_pcie_rx_tbl[] = {
2093 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FO_GAIN, 0x0c),
2094 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SO_GAIN, 0x03),
2095 QMP_PHY_INIT_CFG(QSERDES_V4_RX_GM_CAL, 0x1b),
2096 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_HIGH, 0x00),
2097 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_LOW, 0xc0),
2098 QMP_PHY_INIT_CFG(QSERDES_V4_RX_AUX_DATA_TCOARSE_TFINE, 0x30),
2099 QMP_PHY_INIT_CFG(QSERDES_V4_RX_VGA_CAL_CNTRL1, 0x04),
2100 QMP_PHY_INIT_CFG(QSERDES_V4_RX_VGA_CAL_CNTRL2, 0x07),
2101 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x7f),
2102 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_PI_CONTROLS, 0x70),
2103 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0e),
2104 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL3, 0x4a),
2105 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL4, 0x0f),
2106 QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_CNTRL, 0x03),
2107 QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_ENABLES, 0x1c),
2108 QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_DEGLITCH_CNTRL, 0x1e),
2109 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x17),
2110 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_10_LOW, 0xd4),
2111 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_10_HIGH, 0x54),
2112 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_10_HIGH2, 0xdb),
2113 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_10_HIGH3, 0x3b),
2114 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_10_HIGH4, 0x31),
2115 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_LOW, 0x24),
2116 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH2, 0xff),
2117 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH3, 0x7f),
2118 QMP_PHY_INIT_CFG(QSERDES_V4_RX_DCC_CTRL1, 0x0c),
2119 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH, 0xe4),
2120 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH2, 0xec),
2121 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH3, 0x3b),
2122 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH4, 0x36),
2123};
2124
2125static const struct qmp_phy_init_tbl sm8250_qmp_gen3x1_pcie_rx_tbl[] = {
2126 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RCLK_AUXDATA_SEL, 0x00),
2127 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL1, 0x00),
2128 QMP_PHY_INIT_CFG(QSERDES_V4_RX_DFE_EN_TIMER, 0x04),
2129 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_LOW, 0x3f),
2130 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH4, 0x14),
2131 QMP_PHY_INIT_CFG(QSERDES_V4_RX_DFE_CTLE_POST_CAL_OFFSET, 0x30),
2132};
2133
2134static const struct qmp_phy_init_tbl sm8250_qmp_pcie_pcs_tbl[] = {
2135 QMP_PHY_INIT_CFG(QPHY_V4_PCS_P2U3_WAKEUP_DLY_TIME_AUXCLK_L, 0x01),
2136 QMP_PHY_INIT_CFG(QPHY_V4_PCS_RX_SIGDET_LVL, 0x77),
2137 QMP_PHY_INIT_CFG(QPHY_V4_PCS_RATE_SLEW_CNTRL1, 0x0b),
2138};
2139
2140static const struct qmp_phy_init_tbl sm8250_qmp_gen3x1_pcie_pcs_tbl[] = {
2141 QMP_PHY_INIT_CFG(QPHY_V4_PCS_REFGEN_REQ_CONFIG1, 0x0d),
2142 QMP_PHY_INIT_CFG(QPHY_V4_PCS_EQ_CONFIG5, 0x12),
2143};
2144
2145static const struct qmp_phy_init_tbl sm8250_qmp_pcie_pcs_misc_tbl[] = {
2146 QMP_PHY_INIT_CFG(QPHY_V4_PCS_PCIE_OSC_DTCT_ACTIONS, 0x00),
2147 QMP_PHY_INIT_CFG(QPHY_V4_PCS_PCIE_L1P1_WAKEUP_DLY_TIME_AUXCLK_L, 0x01),
2148 QMP_PHY_INIT_CFG(QPHY_V4_PCS_PCIE_L1P2_WAKEUP_DLY_TIME_AUXCLK_L, 0x01),
2149 QMP_PHY_INIT_CFG(QPHY_V4_PCS_PCIE_PRESET_P6_P7_PRE, 0x33),
2150 QMP_PHY_INIT_CFG(QPHY_V4_PCS_PCIE_PRESET_P10_PRE, 0x00),
2151 QMP_PHY_INIT_CFG(QPHY_V4_PCS_PCIE_PRESET_P10_POST, 0x58),
2152 QMP_PHY_INIT_CFG(QPHY_V4_PCS_PCIE_ENDPOINT_REFCLK_DRIVE, 0xc1),
2153};
2154
2155static const struct qmp_phy_init_tbl sm8250_qmp_gen3x1_pcie_pcs_misc_tbl[] = {
2156 QMP_PHY_INIT_CFG(QPHY_V4_PCS_PCIE_INT_AUX_CLK_CONFIG1, 0x00),
2157 QMP_PHY_INIT_CFG(QPHY_V4_PCS_PCIE_EQ_CONFIG2, 0x0f),
2158};
2159
2160static const struct qmp_phy_init_tbl sm8250_qmp_gen3x2_pcie_tx_tbl[] = {
2161 QMP_PHY_INIT_CFG(QSERDES_V4_TX_PI_QEC_CTRL, 0x20),
2162};
2163
2164static const struct qmp_phy_init_tbl sm8250_qmp_gen3x2_pcie_rx_tbl[] = {
2165 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL1, 0x04),
2166 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_LOW, 0xbf),
2167 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH4, 0x15),
2168 QMP_PHY_INIT_CFG(QSERDES_V4_RX_DFE_CTLE_POST_CAL_OFFSET, 0x38),
2169};
2170
2171static const struct qmp_phy_init_tbl sm8250_qmp_gen3x2_pcie_pcs_tbl[] = {
2172 QMP_PHY_INIT_CFG(QPHY_V4_PCS_REFGEN_REQ_CONFIG1, 0x05),
2173 QMP_PHY_INIT_CFG(QPHY_V4_PCS_EQ_CONFIG2, 0x0f),
2174};
2175
2176static const struct qmp_phy_init_tbl sm8250_qmp_gen3x2_pcie_pcs_misc_tbl[] = {
2177 QMP_PHY_INIT_CFG(QPHY_V4_PCS_PCIE_POWER_STATE_CONFIG2, 0x0d),
2178 QMP_PHY_INIT_CFG(QPHY_V4_PCS_PCIE_POWER_STATE_CONFIG4, 0x07),
2179};
2180
2181static const struct qmp_phy_init_tbl sdx55_usb3_uniphy_tx_tbl[] = {
2182 QMP_PHY_INIT_CFG(QSERDES_V4_TX_RCV_DETECT_LVL_2, 0x12),
2183 QMP_PHY_INIT_CFG(QSERDES_V4_TX_LANE_MODE_1, 0xd5),
2184 QMP_PHY_INIT_CFG(QSERDES_V4_TX_LANE_MODE_2, 0x80),
2185 QMP_PHY_INIT_CFG(QSERDES_V4_TX_PI_QEC_CTRL, 0x20),
2186 QMP_PHY_INIT_CFG(QSERDES_V4_TX_RES_CODE_LANE_OFFSET_TX, 0x08),
2187};
2188
2189static const struct qmp_phy_init_tbl sdx55_usb3_uniphy_rx_tbl[] = {
2190 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH4, 0x26),
2191 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH3, 0x7f),
2192 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH2, 0xbf),
2193 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH, 0x7f),
2194 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_LOW, 0x7f),
2195 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH4, 0xb4),
2196 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH3, 0x7b),
2197 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH2, 0x5c),
2198 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH, 0xdc),
2199 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_LOW, 0xdc),
2200 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_PI_CONTROLS, 0x99),
2201 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_THRESH1, 0x048),
2202 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_THRESH2, 0x08),
2203 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_GAIN1, 0x00),
2204 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_GAIN2, 0x04),
2205 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_FO_GAIN, 0x2f),
2206 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_COUNT_LOW, 0xff),
2207 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_COUNT_HIGH, 0x0f),
2208 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x7f),
2209 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FO_GAIN, 0x09),
2210 QMP_PHY_INIT_CFG(QSERDES_V4_RX_VGA_CAL_CNTRL1, 0x54),
2211 QMP_PHY_INIT_CFG(QSERDES_V4_RX_VGA_CAL_CNTRL2, 0x0c),
2212 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0f),
2213 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL3, 0x4a),
2214 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL4, 0x0a),
2215 QMP_PHY_INIT_CFG(QSERDES_V4_RX_DFE_EN_TIMER, 0x04),
2216 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x47),
2217 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_OFFSET_ADAPTOR_CNTRL2, 0x80),
2218 QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_CNTRL, 0x04),
2219 QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_DEGLITCH_CNTRL, 0x0e),
2220 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_HIGH, 0x00),
2221 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_LOW, 0xc0),
2222 QMP_PHY_INIT_CFG(QSERDES_V4_RX_DFE_CTLE_POST_CAL_OFFSET, 0x38),
2223 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SO_GAIN, 0x05),
2224 QMP_PHY_INIT_CFG(QSERDES_V4_RX_DCC_CTRL1, 0x0c),
2225 QMP_PHY_INIT_CFG(QSERDES_V4_RX_GM_CAL, 0x1f),
2226};
2227
2228static const struct qmp_phy_init_tbl sdx55_qmp_pcie_serdes_tbl[] = {
2229 QMP_PHY_INIT_CFG(QSERDES_V4_COM_BG_TIMER, 0x02),
2230 QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIAS_EN_CLKBUFLR_EN, 0x18),
2231 QMP_PHY_INIT_CFG(QSERDES_V4_COM_SYS_CLK_CTRL, 0x07),
2232 QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_IVCO, 0x0f),
2233 QMP_PHY_INIT_CFG(QSERDES_V4_COM_CP_CTRL_MODE0, 0x0a),
2234 QMP_PHY_INIT_CFG(QSERDES_V4_COM_CP_CTRL_MODE1, 0x0a),
2235 QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_RCTRL_MODE0, 0x19),
2236 QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_RCTRL_MODE1, 0x19),
2237 QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_CCTRL_MODE0, 0x03),
2238 QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_CCTRL_MODE1, 0x03),
2239 QMP_PHY_INIT_CFG(QSERDES_V4_COM_SYSCLK_EN_SEL, 0x00),
2240 QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP_EN, 0x46),
2241 QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP_CFG, 0x04),
2242 QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP1_MODE0, 0x7f),
2243 QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP2_MODE0, 0x02),
2244 QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP1_MODE1, 0xff),
2245 QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP2_MODE1, 0x04),
2246 QMP_PHY_INIT_CFG(QSERDES_V4_COM_DEC_START_MODE0, 0x4b),
2247 QMP_PHY_INIT_CFG(QSERDES_V4_COM_DEC_START_MODE1, 0x50),
2248 QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START3_MODE0, 0x00),
2249 QMP_PHY_INIT_CFG(QSERDES_V4_COM_INTEGLOOP_GAIN0_MODE0, 0xfb),
2250 QMP_PHY_INIT_CFG(QSERDES_V4_COM_INTEGLOOP_GAIN1_MODE0, 0x01),
2251 QMP_PHY_INIT_CFG(QSERDES_V4_COM_INTEGLOOP_GAIN0_MODE1, 0xfb),
2252 QMP_PHY_INIT_CFG(QSERDES_V4_COM_INTEGLOOP_GAIN1_MODE1, 0x01),
2253 QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE_MAP, 0x02),
2254 QMP_PHY_INIT_CFG(QSERDES_V4_COM_HSCLK_SEL, 0x12),
2255 QMP_PHY_INIT_CFG(QSERDES_V4_COM_HSCLK_HS_SWITCH_SEL, 0x00),
2256 QMP_PHY_INIT_CFG(QSERDES_V4_COM_CORECLK_DIV_MODE0, 0x05),
2257 QMP_PHY_INIT_CFG(QSERDES_V4_COM_CORECLK_DIV_MODE1, 0x04),
2258 QMP_PHY_INIT_CFG(QSERDES_V4_COM_CMN_CONFIG, 0x04),
2259 QMP_PHY_INIT_CFG(QSERDES_V4_COM_CMN_MISC1, 0x88),
2260 QMP_PHY_INIT_CFG(QSERDES_V4_COM_INTERNAL_DIG_CORECLK_DIV, 0x03),
2261 QMP_PHY_INIT_CFG(QSERDES_V4_COM_CMN_MODE, 0x17),
2262 QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_DC_LEVEL_CTRL, 0x0b),
2263 QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE1_MODE0, 0x56),
2264 QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE2_MODE0, 0x1d),
2265 QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE1_MODE1, 0x4b),
2266 QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE2_MODE1, 0x1f),
2267 QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_HSCLK_SEL, 0x22),
2268};
2269
2270static const struct qmp_phy_init_tbl sdx55_qmp_pcie_tx_tbl[] = {
2271 QMP_PHY_INIT_CFG(QSERDES_V4_20_TX_LANE_MODE_1, 0x05),
2272 QMP_PHY_INIT_CFG(QSERDES_V4_20_TX_LANE_MODE_2, 0xf6),
2273 QMP_PHY_INIT_CFG(QSERDES_V4_20_TX_LANE_MODE_3, 0x13),
2274 QMP_PHY_INIT_CFG(QSERDES_V4_20_TX_VMODE_CTRL1, 0x00),
2275 QMP_PHY_INIT_CFG(QSERDES_V4_20_TX_PI_QEC_CTRL, 0x00),
2276};
2277
2278static const struct qmp_phy_init_tbl sdx55_qmp_pcie_rx_tbl[] = {
2279 QMP_PHY_INIT_CFG(QSERDES_V4_20_RX_FO_GAIN_RATE2, 0x0c),
2280 QMP_PHY_INIT_CFG(QSERDES_V4_20_RX_UCDR_PI_CONTROLS, 0x16),
2281 QMP_PHY_INIT_CFG(QSERDES_V4_20_RX_AUX_DATA_TCOARSE_TFINE, 0x7f),
2282 QMP_PHY_INIT_CFG(QSERDES_V4_20_RX_DFE_3, 0x55),
2283 QMP_PHY_INIT_CFG(QSERDES_V4_20_RX_DFE_DAC_ENABLE1, 0x0c),
2284 QMP_PHY_INIT_CFG(QSERDES_V4_20_RX_DFE_DAC_ENABLE2, 0x00),
2285 QMP_PHY_INIT_CFG(QSERDES_V4_20_RX_VGA_CAL_CNTRL2, 0x08),
2286 QMP_PHY_INIT_CFG(QSERDES_V4_20_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x27),
2287 QMP_PHY_INIT_CFG(QSERDES_V4_20_RX_RX_MODE_RATE_0_1_B1, 0x1a),
2288 QMP_PHY_INIT_CFG(QSERDES_V4_20_RX_RX_MODE_RATE_0_1_B2, 0x5a),
2289 QMP_PHY_INIT_CFG(QSERDES_V4_20_RX_RX_MODE_RATE_0_1_B3, 0x09),
2290 QMP_PHY_INIT_CFG(QSERDES_V4_20_RX_RX_MODE_RATE_0_1_B4, 0x37),
2291 QMP_PHY_INIT_CFG(QSERDES_V4_20_RX_RX_MODE_RATE2_B0, 0xbd),
2292 QMP_PHY_INIT_CFG(QSERDES_V4_20_RX_RX_MODE_RATE2_B1, 0xf9),
2293 QMP_PHY_INIT_CFG(QSERDES_V4_20_RX_RX_MODE_RATE2_B2, 0xbf),
2294 QMP_PHY_INIT_CFG(QSERDES_V4_20_RX_RX_MODE_RATE2_B3, 0xce),
2295 QMP_PHY_INIT_CFG(QSERDES_V4_20_RX_RX_MODE_RATE2_B4, 0x62),
2296 QMP_PHY_INIT_CFG(QSERDES_V4_20_RX_RX_MODE_RATE3_B0, 0xbf),
2297 QMP_PHY_INIT_CFG(QSERDES_V4_20_RX_RX_MODE_RATE3_B1, 0x7d),
2298 QMP_PHY_INIT_CFG(QSERDES_V4_20_RX_RX_MODE_RATE3_B2, 0xbf),
2299 QMP_PHY_INIT_CFG(QSERDES_V4_20_RX_RX_MODE_RATE3_B3, 0xcf),
2300 QMP_PHY_INIT_CFG(QSERDES_V4_20_RX_RX_MODE_RATE3_B4, 0xd6),
2301 QMP_PHY_INIT_CFG(QSERDES_V4_20_RX_PHPRE_CTRL, 0xa0),
2302 QMP_PHY_INIT_CFG(QSERDES_V4_20_RX_DFE_CTLE_POST_CAL_OFFSET, 0x38),
2303 QMP_PHY_INIT_CFG(QSERDES_V4_20_RX_MARG_COARSE_CTRL2, 0x12),
2304};
2305
2306static const struct qmp_phy_init_tbl sdx55_qmp_pcie_pcs_tbl[] = {
2307 QMP_PHY_INIT_CFG(QPHY_V4_20_PCS_RX_SIGDET_LVL, 0x77),
2308 QMP_PHY_INIT_CFG(QPHY_V4_20_PCS_EQ_CONFIG2, 0x01),
2309 QMP_PHY_INIT_CFG(QPHY_V4_20_PCS_EQ_CONFIG4, 0x16),
2310 QMP_PHY_INIT_CFG(QPHY_V4_20_PCS_EQ_CONFIG5, 0x02),
2311};
2312
2313static const struct qmp_phy_init_tbl sdx55_qmp_pcie_pcs_misc_tbl[] = {
2314 QMP_PHY_INIT_CFG(QPHY_V4_20_PCS_PCIE_EQ_CONFIG1, 0x17),
2315 QMP_PHY_INIT_CFG(QPHY_V4_20_PCS_PCIE_G3_RXEQEVAL_TIME, 0x13),
2316 QMP_PHY_INIT_CFG(QPHY_V4_20_PCS_PCIE_G4_RXEQEVAL_TIME, 0x13),
2317 QMP_PHY_INIT_CFG(QPHY_V4_20_PCS_PCIE_G4_EQ_CONFIG2, 0x01),
2318 QMP_PHY_INIT_CFG(QPHY_V4_20_PCS_PCIE_G4_EQ_CONFIG5, 0x02),
2319 QMP_PHY_INIT_CFG(QPHY_V4_20_PCS_LANE1_INSIG_SW_CTRL2, 0x00),
2320 QMP_PHY_INIT_CFG(QPHY_V4_20_PCS_LANE1_INSIG_MX_CTRL2, 0x00),
2321};
2322
2323static const struct qmp_phy_init_tbl sm8350_ufsphy_serdes_tbl[] = {
2324 QMP_PHY_INIT_CFG(QSERDES_V5_COM_SYSCLK_EN_SEL, 0xd9),
2325 QMP_PHY_INIT_CFG(QSERDES_V5_COM_HSCLK_SEL, 0x11),
2326 QMP_PHY_INIT_CFG(QSERDES_V5_COM_HSCLK_HS_SWITCH_SEL, 0x00),
2327 QMP_PHY_INIT_CFG(QSERDES_V5_COM_LOCK_CMP_EN, 0x42),
2328 QMP_PHY_INIT_CFG(QSERDES_V5_COM_VCO_TUNE_MAP, 0x02),
2329 QMP_PHY_INIT_CFG(QSERDES_V5_COM_PLL_IVCO, 0x0f),
2330 QMP_PHY_INIT_CFG(QSERDES_V5_COM_VCO_TUNE_INITVAL2, 0x00),
2331 QMP_PHY_INIT_CFG(QSERDES_V5_COM_BIN_VCOCAL_HSCLK_SEL, 0x11),
2332 QMP_PHY_INIT_CFG(QSERDES_V5_COM_DEC_START_MODE0, 0x82),
2333 QMP_PHY_INIT_CFG(QSERDES_V5_COM_CP_CTRL_MODE0, 0x14),
2334 QMP_PHY_INIT_CFG(QSERDES_V5_COM_PLL_RCTRL_MODE0, 0x18),
2335 QMP_PHY_INIT_CFG(QSERDES_V5_COM_PLL_CCTRL_MODE0, 0x18),
2336 QMP_PHY_INIT_CFG(QSERDES_V5_COM_LOCK_CMP1_MODE0, 0xff),
2337 QMP_PHY_INIT_CFG(QSERDES_V5_COM_LOCK_CMP2_MODE0, 0x19),
2338 QMP_PHY_INIT_CFG(QSERDES_V5_COM_BIN_VCOCAL_CMP_CODE1_MODE0, 0xac),
2339 QMP_PHY_INIT_CFG(QSERDES_V5_COM_BIN_VCOCAL_CMP_CODE2_MODE0, 0x1e),
2340 QMP_PHY_INIT_CFG(QSERDES_V5_COM_DEC_START_MODE1, 0x98),
2341 QMP_PHY_INIT_CFG(QSERDES_V5_COM_CP_CTRL_MODE1, 0x14),
2342 QMP_PHY_INIT_CFG(QSERDES_V5_COM_PLL_RCTRL_MODE1, 0x18),
2343 QMP_PHY_INIT_CFG(QSERDES_V5_COM_PLL_CCTRL_MODE1, 0x18),
2344 QMP_PHY_INIT_CFG(QSERDES_V5_COM_LOCK_CMP1_MODE1, 0x65),
2345 QMP_PHY_INIT_CFG(QSERDES_V5_COM_LOCK_CMP2_MODE1, 0x1e),
2346 QMP_PHY_INIT_CFG(QSERDES_V5_COM_BIN_VCOCAL_CMP_CODE1_MODE1, 0xdd),
2347 QMP_PHY_INIT_CFG(QSERDES_V5_COM_BIN_VCOCAL_CMP_CODE2_MODE1, 0x23),
2348
2349 /* Rate B */
2350 QMP_PHY_INIT_CFG(QSERDES_V5_COM_VCO_TUNE_MAP, 0x06),
2351};
2352
2353static const struct qmp_phy_init_tbl sm8350_ufsphy_tx_tbl[] = {
2354 QMP_PHY_INIT_CFG(QSERDES_V5_TX_PWM_GEAR_1_DIVIDER_BAND0_1, 0x06),
2355 QMP_PHY_INIT_CFG(QSERDES_V5_TX_PWM_GEAR_2_DIVIDER_BAND0_1, 0x03),
2356 QMP_PHY_INIT_CFG(QSERDES_V5_TX_PWM_GEAR_3_DIVIDER_BAND0_1, 0x01),
2357 QMP_PHY_INIT_CFG(QSERDES_V5_TX_PWM_GEAR_4_DIVIDER_BAND0_1, 0x00),
2358 QMP_PHY_INIT_CFG(QSERDES_V5_TX_LANE_MODE_1, 0xf5),
2359 QMP_PHY_INIT_CFG(QSERDES_V5_TX_LANE_MODE_3, 0x3f),
2360 QMP_PHY_INIT_CFG(QSERDES_V5_TX_RES_CODE_LANE_OFFSET_TX, 0x09),
2361 QMP_PHY_INIT_CFG(QSERDES_V5_TX_RES_CODE_LANE_OFFSET_RX, 0x09),
2362 QMP_PHY_INIT_CFG(QSERDES_V5_TX_TRAN_DRVR_EMP_EN, 0x0c),
2363};
2364
2365static const struct qmp_phy_init_tbl sm8350_ufsphy_rx_tbl[] = {
2366 QMP_PHY_INIT_CFG(QSERDES_V5_RX_SIGDET_LVL, 0x24),
2367 QMP_PHY_INIT_CFG(QSERDES_V5_RX_SIGDET_CNTRL, 0x0f),
2368 QMP_PHY_INIT_CFG(QSERDES_V5_RX_SIGDET_DEGLITCH_CNTRL, 0x1e),
2369 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_BAND, 0x18),
2370 QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_FASTLOCK_FO_GAIN, 0x0a),
2371 QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x5a),
2372 QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_PI_CONTROLS, 0xf1),
2373 QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_FASTLOCK_COUNT_LOW, 0x80),
2374 QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_PI_CTRL2, 0x80),
2375 QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_FO_GAIN, 0x0e),
2376 QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_SO_GAIN, 0x04),
2377 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_TERM_BW, 0x1b),
2378 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_EQU_ADAPTOR_CNTRL1, 0x04),
2379 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_EQU_ADAPTOR_CNTRL2, 0x06),
2380 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_EQU_ADAPTOR_CNTRL3, 0x04),
2381 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_EQU_ADAPTOR_CNTRL4, 0x1a),
2382 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x17),
2383 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_OFFSET_ADAPTOR_CNTRL2, 0x00),
2384 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_IDAC_MEASURE_TIME, 0x10),
2385 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_IDAC_TSETTLE_LOW, 0xc0),
2386 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_IDAC_TSETTLE_HIGH, 0x00),
2387 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_00_LOW, 0x6d),
2388 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_00_HIGH, 0x6d),
2389 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_00_HIGH2, 0xed),
2390 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_00_HIGH3, 0x3b),
2391 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_00_HIGH4, 0x3c),
2392 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_01_LOW, 0xe0),
2393 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_01_HIGH, 0xc8),
2394 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_01_HIGH2, 0xc8),
2395 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_01_HIGH3, 0x3b),
2396 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_01_HIGH4, 0xb7),
2397 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_10_LOW, 0xe0),
2398 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_10_HIGH, 0xc8),
2399 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_10_HIGH2, 0xc8),
2400 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_10_HIGH3, 0x3b),
2401 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_10_HIGH4, 0xb7),
2402 QMP_PHY_INIT_CFG(QSERDES_V5_RX_DCC_CTRL1, 0x0c),
2403};
2404
2405static const struct qmp_phy_init_tbl sm8350_ufsphy_pcs_tbl[] = {
2406 QMP_PHY_INIT_CFG(QPHY_V5_PCS_UFS_RX_SIGDET_CTRL2, 0x6d),
2407 QMP_PHY_INIT_CFG(QPHY_V5_PCS_UFS_TX_LARGE_AMP_DRV_LVL, 0x0a),
2408 QMP_PHY_INIT_CFG(QPHY_V5_PCS_UFS_TX_SMALL_AMP_DRV_LVL, 0x02),
2409 QMP_PHY_INIT_CFG(QPHY_V5_PCS_UFS_TX_MID_TERM_CTRL1, 0x43),
2410 QMP_PHY_INIT_CFG(QPHY_V5_PCS_UFS_DEBUG_BUS_CLKSEL, 0x1f),
2411 QMP_PHY_INIT_CFG(QPHY_V5_PCS_UFS_RX_MIN_HIBERN8_TIME, 0xff),
2412 QMP_PHY_INIT_CFG(QPHY_V5_PCS_UFS_PLL_CNTL, 0x03),
2413 QMP_PHY_INIT_CFG(QPHY_V5_PCS_UFS_TIMER_20US_CORECLK_STEPS_MSB, 0x16),
2414 QMP_PHY_INIT_CFG(QPHY_V5_PCS_UFS_TIMER_20US_CORECLK_STEPS_LSB, 0xd8),
2415 QMP_PHY_INIT_CFG(QPHY_V5_PCS_UFS_TX_PWM_GEAR_BAND, 0xaa),
2416 QMP_PHY_INIT_CFG(QPHY_V5_PCS_UFS_TX_HS_GEAR_BAND, 0x06),
2417 QMP_PHY_INIT_CFG(QPHY_V5_PCS_UFS_TX_HSGEAR_CAPABILITY, 0x03),
2418 QMP_PHY_INIT_CFG(QPHY_V5_PCS_UFS_RX_HSGEAR_CAPABILITY, 0x03),
2419 QMP_PHY_INIT_CFG(QPHY_V5_PCS_UFS_RX_SIGDET_CTRL1, 0x0e),
2420 QMP_PHY_INIT_CFG(QPHY_V5_PCS_UFS_MULTI_LANE_CTRL1, 0x02),
2421};
2422
2423static const struct qmp_phy_init_tbl sm8350_usb3_tx_tbl[] = {
2424 QMP_PHY_INIT_CFG(QSERDES_V5_TX_RES_CODE_LANE_TX, 0x00),
2425 QMP_PHY_INIT_CFG(QSERDES_V5_TX_RES_CODE_LANE_RX, 0x00),
2426 QMP_PHY_INIT_CFG(QSERDES_V5_TX_RES_CODE_LANE_OFFSET_TX, 0x16),
2427 QMP_PHY_INIT_CFG(QSERDES_V5_TX_RES_CODE_LANE_OFFSET_RX, 0x0e),
2428 QMP_PHY_INIT_CFG(QSERDES_V5_TX_LANE_MODE_1, 0x35),
2429 QMP_PHY_INIT_CFG(QSERDES_V5_TX_LANE_MODE_3, 0x3f),
2430 QMP_PHY_INIT_CFG(QSERDES_V5_TX_LANE_MODE_4, 0x7f),
2431 QMP_PHY_INIT_CFG(QSERDES_V5_TX_LANE_MODE_5, 0x3f),
2432 QMP_PHY_INIT_CFG(QSERDES_V5_TX_RCV_DETECT_LVL_2, 0x12),
2433 QMP_PHY_INIT_CFG(QSERDES_V5_TX_PI_QEC_CTRL, 0x21),
2434};
2435
2436static const struct qmp_phy_init_tbl sm8350_usb3_rx_tbl[] = {
2437 QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_FO_GAIN, 0x0a),
2438 QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_SO_GAIN, 0x05),
2439 QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_FASTLOCK_FO_GAIN, 0x2f),
2440 QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x7f),
2441 QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_FASTLOCK_COUNT_LOW, 0xff),
2442 QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_FASTLOCK_COUNT_HIGH, 0x0f),
2443 QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_PI_CONTROLS, 0x99),
2444 QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_SB2_THRESH1, 0x08),
2445 QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_SB2_THRESH2, 0x08),
2446 QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_SB2_GAIN1, 0x00),
2447 QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_SB2_GAIN2, 0x04),
2448 QMP_PHY_INIT_CFG(QSERDES_V5_RX_VGA_CAL_CNTRL1, 0x54),
2449 QMP_PHY_INIT_CFG(QSERDES_V5_RX_VGA_CAL_CNTRL2, 0x0f),
2450 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0f),
2451 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_EQU_ADAPTOR_CNTRL3, 0x4a),
2452 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_EQU_ADAPTOR_CNTRL4, 0x0a),
2453 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_IDAC_TSETTLE_LOW, 0xc0),
2454 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_IDAC_TSETTLE_HIGH, 0x00),
2455 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x47),
2456 QMP_PHY_INIT_CFG(QSERDES_V5_RX_SIGDET_CNTRL, 0x04),
2457 QMP_PHY_INIT_CFG(QSERDES_V5_RX_SIGDET_DEGLITCH_CNTRL, 0x0e),
2458 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_00_LOW, 0xbb),
2459 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_00_HIGH, 0x7b),
2460 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_00_HIGH2, 0xbb),
2461 QMP_PHY_INIT_CFG_LANE(QSERDES_V5_RX_RX_MODE_00_HIGH3, 0x3d, 1),
2462 QMP_PHY_INIT_CFG_LANE(QSERDES_V5_RX_RX_MODE_00_HIGH3, 0x3c, 2),
2463 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_00_HIGH4, 0xdb),
2464 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_01_LOW, 0x64),
2465 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_01_HIGH, 0x24),
2466 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_01_HIGH2, 0xd2),
2467 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_01_HIGH3, 0x13),
2468 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_01_HIGH4, 0xa9),
2469 QMP_PHY_INIT_CFG(QSERDES_V5_RX_DFE_EN_TIMER, 0x04),
2470 QMP_PHY_INIT_CFG(QSERDES_V5_RX_DFE_CTLE_POST_CAL_OFFSET, 0x38),
2471 QMP_PHY_INIT_CFG(QSERDES_V5_RX_AUX_DATA_TCOARSE_TFINE, 0xa0),
2472 QMP_PHY_INIT_CFG(QSERDES_V5_RX_DCC_CTRL1, 0x0c),
2473 QMP_PHY_INIT_CFG(QSERDES_V5_RX_GM_CAL, 0x00),
2474 QMP_PHY_INIT_CFG(QSERDES_V5_RX_VTH_CODE, 0x10),
2475};
2476
2477static const struct qmp_phy_init_tbl sm8350_usb3_pcs_tbl[] = {
2478 QMP_PHY_INIT_CFG(QPHY_V5_PCS_USB3_RCVR_DTCT_DLY_U3_L, 0x40),
2479 QMP_PHY_INIT_CFG(QPHY_V5_PCS_USB3_RCVR_DTCT_DLY_U3_H, 0x00),
2480 QMP_PHY_INIT_CFG(QPHY_V4_PCS_RCVR_DTCT_DLY_P1U2_L, 0xe7),
2481 QMP_PHY_INIT_CFG(QPHY_V4_PCS_RCVR_DTCT_DLY_P1U2_H, 0x03),
2482 QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG1, 0xd0),
2483 QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG2, 0x07),
2484 QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG3, 0x20),
2485 QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG6, 0x13),
2486 QMP_PHY_INIT_CFG(QPHY_V4_PCS_REFGEN_REQ_CONFIG1, 0x21),
2487 QMP_PHY_INIT_CFG(QPHY_V4_PCS_RX_SIGDET_LVL, 0xaa),
2488 QMP_PHY_INIT_CFG(QPHY_V4_PCS_CDR_RESET_TIME, 0x0a),
2489 QMP_PHY_INIT_CFG(QPHY_V4_PCS_ALIGN_DETECT_CONFIG1, 0x88),
2490 QMP_PHY_INIT_CFG(QPHY_V4_PCS_ALIGN_DETECT_CONFIG2, 0x13),
2491 QMP_PHY_INIT_CFG(QPHY_V4_PCS_PCS_TX_RX_CONFIG, 0x0c),
2492 QMP_PHY_INIT_CFG(QPHY_V4_PCS_EQ_CONFIG1, 0x4b),
2493 QMP_PHY_INIT_CFG(QPHY_V4_PCS_EQ_CONFIG5, 0x10),
2494 QMP_PHY_INIT_CFG(QPHY_V5_PCS_USB3_LFPS_DET_HIGH_COUNT_VAL, 0xf8),
2495 QMP_PHY_INIT_CFG(QPHY_V5_PCS_USB3_RXEQTRAINING_DFE_TIME_S2, 0x07),
2496};
2497
2498static const struct qmp_phy_init_tbl sm8350_usb3_uniphy_tx_tbl[] = {
2499 QMP_PHY_INIT_CFG(QSERDES_V5_TX_LANE_MODE_1, 0xa5),
2500 QMP_PHY_INIT_CFG(QSERDES_V5_TX_LANE_MODE_2, 0x82),
2501 QMP_PHY_INIT_CFG(QSERDES_V5_TX_LANE_MODE_3, 0x3f),
2502 QMP_PHY_INIT_CFG(QSERDES_V5_TX_LANE_MODE_4, 0x3f),
2503 QMP_PHY_INIT_CFG(QSERDES_V5_TX_PI_QEC_CTRL, 0x21),
2504 QMP_PHY_INIT_CFG(QSERDES_V5_TX_RES_CODE_LANE_OFFSET_TX, 0x10),
2505 QMP_PHY_INIT_CFG(QSERDES_V5_TX_RES_CODE_LANE_OFFSET_RX, 0x0e),
2506};
2507
2508static const struct qmp_phy_init_tbl sm8350_usb3_uniphy_rx_tbl[] = {
2509 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_00_HIGH4, 0xdc),
2510 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_00_HIGH3, 0xbd),
2511 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_00_HIGH2, 0xff),
2512 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_00_HIGH, 0x7f),
2513 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_00_LOW, 0xff),
2514 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_01_HIGH4, 0xa9),
2515 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_01_HIGH3, 0x7b),
2516 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_01_HIGH2, 0xe4),
2517 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_01_HIGH, 0x24),
2518 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_01_LOW, 0x64),
2519 QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_PI_CONTROLS, 0x99),
2520 QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_SB2_THRESH1, 0x08),
2521 QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_SB2_THRESH2, 0x08),
2522 QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_SB2_GAIN1, 0x00),
2523 QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_SB2_GAIN2, 0x04),
2524 QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_FASTLOCK_FO_GAIN, 0x2f),
2525 QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_FASTLOCK_COUNT_LOW, 0xff),
2526 QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_FASTLOCK_COUNT_HIGH, 0x0f),
2527 QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_FO_GAIN, 0x0a),
2528 QMP_PHY_INIT_CFG(QSERDES_V5_RX_VGA_CAL_CNTRL1, 0x54),
2529 QMP_PHY_INIT_CFG(QSERDES_V5_RX_VGA_CAL_CNTRL2, 0x0f),
2530 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0f),
2531 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_EQU_ADAPTOR_CNTRL4, 0x0a),
2532 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x47),
2533 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_OFFSET_ADAPTOR_CNTRL2, 0x80),
2534 QMP_PHY_INIT_CFG(QSERDES_V5_RX_SIGDET_CNTRL, 0x04),
2535 QMP_PHY_INIT_CFG(QSERDES_V5_RX_SIGDET_DEGLITCH_CNTRL, 0x0e),
2536 QMP_PHY_INIT_CFG(QSERDES_V5_RX_DFE_CTLE_POST_CAL_OFFSET, 0x38),
2537 QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_SO_GAIN, 0x05),
2538 QMP_PHY_INIT_CFG(QSERDES_V5_RX_GM_CAL, 0x00),
2539 QMP_PHY_INIT_CFG(QSERDES_V5_RX_SIGDET_ENABLES, 0x00),
2540};
2541
2542static const struct qmp_phy_init_tbl sm8350_usb3_uniphy_pcs_tbl[] = {
2543 QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG1, 0xd0),
2544 QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG2, 0x07),
2545 QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG3, 0x20),
2546 QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG6, 0x13),
2547 QMP_PHY_INIT_CFG(QPHY_V4_PCS_RCVR_DTCT_DLY_P1U2_L, 0xe7),
2548 QMP_PHY_INIT_CFG(QPHY_V4_PCS_RCVR_DTCT_DLY_P1U2_H, 0x03),
2549 QMP_PHY_INIT_CFG(QPHY_V4_PCS_RX_SIGDET_LVL, 0xaa),
2550 QMP_PHY_INIT_CFG(QPHY_V4_PCS_PCS_TX_RX_CONFIG, 0x0c),
2551 QMP_PHY_INIT_CFG(QPHY_V5_PCS_USB3_UNI_RXEQTRAINING_DFE_TIME_S2, 0x07),
2552 QMP_PHY_INIT_CFG(QPHY_V5_PCS_USB3_UNI_LFPS_DET_HIGH_COUNT_VAL, 0xf8),
2553 QMP_PHY_INIT_CFG(QPHY_V4_PCS_CDR_RESET_TIME, 0x0a),
2554 QMP_PHY_INIT_CFG(QPHY_V4_PCS_ALIGN_DETECT_CONFIG1, 0x88),
2555 QMP_PHY_INIT_CFG(QPHY_V4_PCS_ALIGN_DETECT_CONFIG2, 0x13),
2556 QMP_PHY_INIT_CFG(QPHY_V4_PCS_EQ_CONFIG1, 0x4b),
2557 QMP_PHY_INIT_CFG(QPHY_V4_PCS_EQ_CONFIG5, 0x10),
2558 QMP_PHY_INIT_CFG(QPHY_V4_PCS_REFGEN_REQ_CONFIG1, 0x21),
2559};
2560
2561struct qmp_phy;
2562
2563/* struct qmp_phy_cfg - per-PHY initialization config */
2564struct qmp_phy_cfg {
2565 /* phy-type - PCIE/UFS/USB */
2566 unsigned int type;
2567 /* number of lanes provided by phy */
2568 int nlanes;
2569
2570 /* Init sequence for PHY blocks - serdes, tx, rx, pcs */
2571 const struct qmp_phy_init_tbl *serdes_tbl;
2572 int serdes_tbl_num;
2573 const struct qmp_phy_init_tbl *serdes_tbl_sec;
2574 int serdes_tbl_num_sec;
2575 const struct qmp_phy_init_tbl *tx_tbl;
2576 int tx_tbl_num;
2577 const struct qmp_phy_init_tbl *tx_tbl_sec;
2578 int tx_tbl_num_sec;
2579 const struct qmp_phy_init_tbl *rx_tbl;
2580 int rx_tbl_num;
2581 const struct qmp_phy_init_tbl *rx_tbl_sec;
2582 int rx_tbl_num_sec;
2583 const struct qmp_phy_init_tbl *pcs_tbl;
2584 int pcs_tbl_num;
2585 const struct qmp_phy_init_tbl *pcs_tbl_sec;
2586 int pcs_tbl_num_sec;
2587 const struct qmp_phy_init_tbl *pcs_misc_tbl;
2588 int pcs_misc_tbl_num;
2589 const struct qmp_phy_init_tbl *pcs_misc_tbl_sec;
2590 int pcs_misc_tbl_num_sec;
2591
2592 /* Init sequence for DP PHY block link rates */
2593 const struct qmp_phy_init_tbl *serdes_tbl_rbr;
2594 int serdes_tbl_rbr_num;
2595 const struct qmp_phy_init_tbl *serdes_tbl_hbr;
2596 int serdes_tbl_hbr_num;
2597 const struct qmp_phy_init_tbl *serdes_tbl_hbr2;
2598 int serdes_tbl_hbr2_num;
2599 const struct qmp_phy_init_tbl *serdes_tbl_hbr3;
2600 int serdes_tbl_hbr3_num;
2601
2602 /* DP PHY callbacks */
2603 int (*configure_dp_phy)(struct qmp_phy *qphy);
2604 void (*configure_dp_tx)(struct qmp_phy *qphy);
2605 int (*calibrate_dp_phy)(struct qmp_phy *qphy);
2606 void (*dp_aux_init)(struct qmp_phy *qphy);
2607
2608 /* clock ids to be requested */
2609 const char * const *clk_list;
2610 int num_clks;
2611 /* resets to be requested */
2612 const char * const *reset_list;
2613 int num_resets;
2614 /* regulators to be requested */
2615 const char * const *vreg_list;
2616 int num_vregs;
2617
2618 /* array of registers with different offsets */
2619 const unsigned int *regs;
2620
2621 unsigned int start_ctrl;
2622 unsigned int pwrdn_ctrl;
2623 unsigned int mask_com_pcs_ready;
2624 /* bit offset of PHYSTATUS in QPHY_PCS_STATUS register */
2625 unsigned int phy_status;
2626
2627 /* true, if PHY has a separate PHY_COM control block */
2628 bool has_phy_com_ctrl;
2629 /* true, if PHY has a reset for individual lanes */
2630 bool has_lane_rst;
2631 /* true, if PHY needs delay after POWER_DOWN */
2632 bool has_pwrdn_delay;
2633 /* power_down delay in usec */
2634 int pwrdn_delay_min;
2635 int pwrdn_delay_max;
2636
2637 /* true, if PHY has a separate DP_COM control block */
2638 bool has_phy_dp_com_ctrl;
2639 /* true, if PHY has secondary tx/rx lanes to be configured */
2640 bool is_dual_lane_phy;
2641
2642 /* true, if PCS block has no separate SW_RESET register */
2643 bool no_pcs_sw_reset;
2644};
2645
2646struct qmp_phy_combo_cfg {
2647 const struct qmp_phy_cfg *usb_cfg;
2648 const struct qmp_phy_cfg *dp_cfg;
2649};
2650
2651/**
2652 * struct qmp_phy - per-lane phy descriptor
2653 *
2654 * @phy: generic phy
2655 * @cfg: phy specific configuration
2656 * @serdes: iomapped memory space for phy's serdes (i.e. PLL)
2657 * @tx: iomapped memory space for lane's tx
2658 * @rx: iomapped memory space for lane's rx
2659 * @pcs: iomapped memory space for lane's pcs
2660 * @tx2: iomapped memory space for second lane's tx (in dual lane PHYs)
2661 * @rx2: iomapped memory space for second lane's rx (in dual lane PHYs)
2662 * @pcs_misc: iomapped memory space for lane's pcs_misc
2663 * @pipe_clk: pipe lock
2664 * @index: lane index
2665 * @qmp: QMP phy to which this lane belongs
2666 * @lane_rst: lane's reset controller
2667 * @mode: current PHY mode
2668 */
2669struct qmp_phy {
2670 struct phy *phy;
2671 const struct qmp_phy_cfg *cfg;
2672 void __iomem *serdes;
2673 void __iomem *tx;
2674 void __iomem *rx;
2675 void __iomem *pcs;
2676 void __iomem *tx2;
2677 void __iomem *rx2;
2678 void __iomem *pcs_misc;
2679 struct clk *pipe_clk;
2680 unsigned int index;
2681 struct qcom_qmp *qmp;
2682 struct reset_control *lane_rst;
2683 enum phy_mode mode;
2684 unsigned int dp_aux_cfg;
2685 struct phy_configure_opts_dp dp_opts;
2686 struct qmp_phy_dp_clks *dp_clks;
2687};
2688
2689struct qmp_phy_dp_clks {
2690 struct qmp_phy *qphy;
2691 struct clk_hw dp_link_hw;
2692 struct clk_hw dp_pixel_hw;
2693};
2694
2695/**
2696 * struct qcom_qmp - structure holding QMP phy block attributes
2697 *
2698 * @dev: device
2699 * @dp_com: iomapped memory space for phy's dp_com control block
2700 *
2701 * @clks: array of clocks required by phy
2702 * @resets: array of resets required by phy
2703 * @vregs: regulator supplies bulk data
2704 *
2705 * @phys: array of per-lane phy descriptors
2706 * @phy_mutex: mutex lock for PHY common block initialization
2707 * @init_count: phy common block initialization count
2708 * @ufs_reset: optional UFS PHY reset handle
2709 */
2710struct qcom_qmp {
2711 struct device *dev;
2712 void __iomem *dp_com;
2713
2714 struct clk_bulk_data *clks;
2715 struct reset_control **resets;
2716 struct regulator_bulk_data *vregs;
2717
2718 struct qmp_phy **phys;
2719
2720 struct mutex phy_mutex;
2721 int init_count;
2722
2723 struct reset_control *ufs_reset;
2724};
2725
2726static void qcom_qmp_v3_phy_dp_aux_init(struct qmp_phy *qphy);
2727static void qcom_qmp_v3_phy_configure_dp_tx(struct qmp_phy *qphy);
2728static int qcom_qmp_v3_phy_configure_dp_phy(struct qmp_phy *qphy);
2729static int qcom_qmp_v3_dp_phy_calibrate(struct qmp_phy *qphy);
2730
2731static void qcom_qmp_v4_phy_dp_aux_init(struct qmp_phy *qphy);
2732static void qcom_qmp_v4_phy_configure_dp_tx(struct qmp_phy *qphy);
2733static int qcom_qmp_v4_phy_configure_dp_phy(struct qmp_phy *qphy);
2734static int qcom_qmp_v4_dp_phy_calibrate(struct qmp_phy *qphy);
2735
2736static inline void qphy_setbits(void __iomem *base, u32 offset, u32 val)
2737{
2738 u32 reg;
2739
2740 reg = readl(base + offset);
2741 reg |= val;
2742 writel(reg, base + offset);
2743
2744 /* ensure that above write is through */
2745 readl(base + offset);
2746}
2747
2748static inline void qphy_clrbits(void __iomem *base, u32 offset, u32 val)
2749{
2750 u32 reg;
2751
2752 reg = readl(base + offset);
2753 reg &= ~val;
2754 writel(reg, base + offset);
2755
2756 /* ensure that above write is through */
2757 readl(base + offset);
2758}
2759
2760/* list of clocks required by phy */
2761static const char * const msm8996_phy_clk_l[] = {
2762 "aux", "cfg_ahb", "ref",
2763};
2764
2765static const char * const msm8996_ufs_phy_clk_l[] = {
2766 "ref",
2767};
2768
2769static const char * const qmp_v3_phy_clk_l[] = {
2770 "aux", "cfg_ahb", "ref", "com_aux",
2771};
2772
2773static const char * const sdm845_pciephy_clk_l[] = {
2774 "aux", "cfg_ahb", "ref", "refgen",
2775};
2776
2777static const char * const qmp_v4_phy_clk_l[] = {
2778 "aux", "ref_clk_src", "ref", "com_aux",
2779};
2780
2781/* the primary usb3 phy on sm8250 doesn't have a ref clock */
2782static const char * const qmp_v4_sm8250_usbphy_clk_l[] = {
2783 "aux", "ref_clk_src", "com_aux"
2784};
2785
2786static const char * const sdm845_ufs_phy_clk_l[] = {
2787 "ref", "ref_aux",
2788};
2789
2790/* usb3 phy on sdx55 doesn't have com_aux clock */
2791static const char * const qmp_v4_sdx55_usbphy_clk_l[] = {
2792 "aux", "cfg_ahb", "ref"
2793};
2794
2795/* list of resets */
2796static const char * const msm8996_pciephy_reset_l[] = {
2797 "phy", "common", "cfg",
2798};
2799
2800static const char * const msm8996_usb3phy_reset_l[] = {
2801 "phy", "common",
2802};
2803
2804static const char * const sc7180_usb3phy_reset_l[] = {
2805 "phy",
2806};
2807
2808static const char * const sdm845_pciephy_reset_l[] = {
2809 "phy",
2810};
2811
2812/* list of regulators */
2813static const char * const qmp_phy_vreg_l[] = {
2814 "vdda-phy", "vdda-pll",
2815};
2816
2817static const struct qmp_phy_cfg ipq8074_usb3phy_cfg = {
2818 .type = PHY_TYPE_USB3,
2819 .nlanes = 1,
2820
2821 .serdes_tbl = ipq8074_usb3_serdes_tbl,
2822 .serdes_tbl_num = ARRAY_SIZE(ipq8074_usb3_serdes_tbl),
2823 .tx_tbl = msm8996_usb3_tx_tbl,
2824 .tx_tbl_num = ARRAY_SIZE(msm8996_usb3_tx_tbl),
2825 .rx_tbl = ipq8074_usb3_rx_tbl,
2826 .rx_tbl_num = ARRAY_SIZE(ipq8074_usb3_rx_tbl),
2827 .pcs_tbl = ipq8074_usb3_pcs_tbl,
2828 .pcs_tbl_num = ARRAY_SIZE(ipq8074_usb3_pcs_tbl),
2829 .clk_list = msm8996_phy_clk_l,
2830 .num_clks = ARRAY_SIZE(msm8996_phy_clk_l),
2831 .reset_list = msm8996_usb3phy_reset_l,
2832 .num_resets = ARRAY_SIZE(msm8996_usb3phy_reset_l),
2833 .vreg_list = qmp_phy_vreg_l,
2834 .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
2835 .regs = usb3phy_regs_layout,
2836
2837 .start_ctrl = SERDES_START | PCS_START,
2838 .pwrdn_ctrl = SW_PWRDN,
2839 .phy_status = PHYSTATUS,
2840};
2841
2842static const struct qmp_phy_cfg msm8996_pciephy_cfg = {
2843 .type = PHY_TYPE_PCIE,
2844 .nlanes = 3,
2845
2846 .serdes_tbl = msm8996_pcie_serdes_tbl,
2847 .serdes_tbl_num = ARRAY_SIZE(msm8996_pcie_serdes_tbl),
2848 .tx_tbl = msm8996_pcie_tx_tbl,
2849 .tx_tbl_num = ARRAY_SIZE(msm8996_pcie_tx_tbl),
2850 .rx_tbl = msm8996_pcie_rx_tbl,
2851 .rx_tbl_num = ARRAY_SIZE(msm8996_pcie_rx_tbl),
2852 .pcs_tbl = msm8996_pcie_pcs_tbl,
2853 .pcs_tbl_num = ARRAY_SIZE(msm8996_pcie_pcs_tbl),
2854 .clk_list = msm8996_phy_clk_l,
2855 .num_clks = ARRAY_SIZE(msm8996_phy_clk_l),
2856 .reset_list = msm8996_pciephy_reset_l,
2857 .num_resets = ARRAY_SIZE(msm8996_pciephy_reset_l),
2858 .vreg_list = qmp_phy_vreg_l,
2859 .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
2860 .regs = pciephy_regs_layout,
2861
2862 .start_ctrl = PCS_START | PLL_READY_GATE_EN,
2863 .pwrdn_ctrl = SW_PWRDN | REFCLK_DRV_DSBL,
2864 .mask_com_pcs_ready = PCS_READY,
2865 .phy_status = PHYSTATUS,
2866
2867 .has_phy_com_ctrl = true,
2868 .has_lane_rst = true,
2869 .has_pwrdn_delay = true,
2870 .pwrdn_delay_min = POWER_DOWN_DELAY_US_MIN,
2871 .pwrdn_delay_max = POWER_DOWN_DELAY_US_MAX,
2872};
2873
2874static const struct qmp_phy_cfg msm8996_ufs_cfg = {
2875 .type = PHY_TYPE_UFS,
2876 .nlanes = 1,
2877
2878 .serdes_tbl = msm8996_ufs_serdes_tbl,
2879 .serdes_tbl_num = ARRAY_SIZE(msm8996_ufs_serdes_tbl),
2880 .tx_tbl = msm8996_ufs_tx_tbl,
2881 .tx_tbl_num = ARRAY_SIZE(msm8996_ufs_tx_tbl),
2882 .rx_tbl = msm8996_ufs_rx_tbl,
2883 .rx_tbl_num = ARRAY_SIZE(msm8996_ufs_rx_tbl),
2884
2885 .clk_list = msm8996_ufs_phy_clk_l,
2886 .num_clks = ARRAY_SIZE(msm8996_ufs_phy_clk_l),
2887
2888 .vreg_list = qmp_phy_vreg_l,
2889 .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
2890
2891 .regs = msm8996_ufsphy_regs_layout,
2892
2893 .start_ctrl = SERDES_START,
2894 .pwrdn_ctrl = SW_PWRDN,
2895 .phy_status = PHYSTATUS,
2896
2897 .no_pcs_sw_reset = true,
2898};
2899
2900static const struct qmp_phy_cfg msm8996_usb3phy_cfg = {
2901 .type = PHY_TYPE_USB3,
2902 .nlanes = 1,
2903
2904 .serdes_tbl = msm8996_usb3_serdes_tbl,
2905 .serdes_tbl_num = ARRAY_SIZE(msm8996_usb3_serdes_tbl),
2906 .tx_tbl = msm8996_usb3_tx_tbl,
2907 .tx_tbl_num = ARRAY_SIZE(msm8996_usb3_tx_tbl),
2908 .rx_tbl = msm8996_usb3_rx_tbl,
2909 .rx_tbl_num = ARRAY_SIZE(msm8996_usb3_rx_tbl),
2910 .pcs_tbl = msm8996_usb3_pcs_tbl,
2911 .pcs_tbl_num = ARRAY_SIZE(msm8996_usb3_pcs_tbl),
2912 .clk_list = msm8996_phy_clk_l,
2913 .num_clks = ARRAY_SIZE(msm8996_phy_clk_l),
2914 .reset_list = msm8996_usb3phy_reset_l,
2915 .num_resets = ARRAY_SIZE(msm8996_usb3phy_reset_l),
2916 .vreg_list = qmp_phy_vreg_l,
2917 .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
2918 .regs = usb3phy_regs_layout,
2919
2920 .start_ctrl = SERDES_START | PCS_START,
2921 .pwrdn_ctrl = SW_PWRDN,
2922 .phy_status = PHYSTATUS,
2923};
2924
2925static const char * const ipq8074_pciephy_clk_l[] = {
2926 "aux", "cfg_ahb",
2927};
2928/* list of resets */
2929static const char * const ipq8074_pciephy_reset_l[] = {
2930 "phy", "common",
2931};
2932
2933static const struct qmp_phy_cfg ipq8074_pciephy_cfg = {
2934 .type = PHY_TYPE_PCIE,
2935 .nlanes = 1,
2936
2937 .serdes_tbl = ipq8074_pcie_serdes_tbl,
2938 .serdes_tbl_num = ARRAY_SIZE(ipq8074_pcie_serdes_tbl),
2939 .tx_tbl = ipq8074_pcie_tx_tbl,
2940 .tx_tbl_num = ARRAY_SIZE(ipq8074_pcie_tx_tbl),
2941 .rx_tbl = ipq8074_pcie_rx_tbl,
2942 .rx_tbl_num = ARRAY_SIZE(ipq8074_pcie_rx_tbl),
2943 .pcs_tbl = ipq8074_pcie_pcs_tbl,
2944 .pcs_tbl_num = ARRAY_SIZE(ipq8074_pcie_pcs_tbl),
2945 .clk_list = ipq8074_pciephy_clk_l,
2946 .num_clks = ARRAY_SIZE(ipq8074_pciephy_clk_l),
2947 .reset_list = ipq8074_pciephy_reset_l,
2948 .num_resets = ARRAY_SIZE(ipq8074_pciephy_reset_l),
2949 .vreg_list = NULL,
2950 .num_vregs = 0,
2951 .regs = pciephy_regs_layout,
2952
2953 .start_ctrl = SERDES_START | PCS_START,
2954 .pwrdn_ctrl = SW_PWRDN | REFCLK_DRV_DSBL,
2955 .phy_status = PHYSTATUS,
2956
2957 .has_phy_com_ctrl = false,
2958 .has_lane_rst = false,
2959 .has_pwrdn_delay = true,
2960 .pwrdn_delay_min = 995, /* us */
2961 .pwrdn_delay_max = 1005, /* us */
2962};
2963
2964static const struct qmp_phy_cfg ipq6018_pciephy_cfg = {
2965 .type = PHY_TYPE_PCIE,
2966 .nlanes = 1,
2967
2968 .serdes_tbl = ipq6018_pcie_serdes_tbl,
2969 .serdes_tbl_num = ARRAY_SIZE(ipq6018_pcie_serdes_tbl),
2970 .tx_tbl = ipq6018_pcie_tx_tbl,
2971 .tx_tbl_num = ARRAY_SIZE(ipq6018_pcie_tx_tbl),
2972 .rx_tbl = ipq6018_pcie_rx_tbl,
2973 .rx_tbl_num = ARRAY_SIZE(ipq6018_pcie_rx_tbl),
2974 .pcs_tbl = ipq6018_pcie_pcs_tbl,
2975 .pcs_tbl_num = ARRAY_SIZE(ipq6018_pcie_pcs_tbl),
2976 .clk_list = ipq8074_pciephy_clk_l,
2977 .num_clks = ARRAY_SIZE(ipq8074_pciephy_clk_l),
2978 .reset_list = ipq8074_pciephy_reset_l,
2979 .num_resets = ARRAY_SIZE(ipq8074_pciephy_reset_l),
2980 .vreg_list = NULL,
2981 .num_vregs = 0,
2982 .regs = ipq_pciephy_gen3_regs_layout,
2983
2984 .start_ctrl = SERDES_START | PCS_START,
2985 .pwrdn_ctrl = SW_PWRDN | REFCLK_DRV_DSBL,
2986
2987 .has_phy_com_ctrl = false,
2988 .has_lane_rst = false,
2989 .has_pwrdn_delay = true,
2990 .pwrdn_delay_min = 995, /* us */
2991 .pwrdn_delay_max = 1005, /* us */
2992};
2993
2994static const struct qmp_phy_cfg sdm845_qmp_pciephy_cfg = {
2995 .type = PHY_TYPE_PCIE,
2996 .nlanes = 1,
2997
2998 .serdes_tbl = sdm845_qmp_pcie_serdes_tbl,
2999 .serdes_tbl_num = ARRAY_SIZE(sdm845_qmp_pcie_serdes_tbl),
3000 .tx_tbl = sdm845_qmp_pcie_tx_tbl,
3001 .tx_tbl_num = ARRAY_SIZE(sdm845_qmp_pcie_tx_tbl),
3002 .rx_tbl = sdm845_qmp_pcie_rx_tbl,
3003 .rx_tbl_num = ARRAY_SIZE(sdm845_qmp_pcie_rx_tbl),
3004 .pcs_tbl = sdm845_qmp_pcie_pcs_tbl,
3005 .pcs_tbl_num = ARRAY_SIZE(sdm845_qmp_pcie_pcs_tbl),
3006 .pcs_misc_tbl = sdm845_qmp_pcie_pcs_misc_tbl,
3007 .pcs_misc_tbl_num = ARRAY_SIZE(sdm845_qmp_pcie_pcs_misc_tbl),
3008 .clk_list = sdm845_pciephy_clk_l,
3009 .num_clks = ARRAY_SIZE(sdm845_pciephy_clk_l),
3010 .reset_list = sdm845_pciephy_reset_l,
3011 .num_resets = ARRAY_SIZE(sdm845_pciephy_reset_l),
3012 .vreg_list = qmp_phy_vreg_l,
3013 .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
3014 .regs = sdm845_qmp_pciephy_regs_layout,
3015
3016 .start_ctrl = PCS_START | SERDES_START,
3017 .pwrdn_ctrl = SW_PWRDN | REFCLK_DRV_DSBL,
3018 .phy_status = PHYSTATUS,
3019
3020 .has_pwrdn_delay = true,
3021 .pwrdn_delay_min = 995, /* us */
3022 .pwrdn_delay_max = 1005, /* us */
3023};
3024
3025static const struct qmp_phy_cfg sdm845_qhp_pciephy_cfg = {
3026 .type = PHY_TYPE_PCIE,
3027 .nlanes = 1,
3028
3029 .serdes_tbl = sdm845_qhp_pcie_serdes_tbl,
3030 .serdes_tbl_num = ARRAY_SIZE(sdm845_qhp_pcie_serdes_tbl),
3031 .tx_tbl = sdm845_qhp_pcie_tx_tbl,
3032 .tx_tbl_num = ARRAY_SIZE(sdm845_qhp_pcie_tx_tbl),
3033 .rx_tbl = sdm845_qhp_pcie_rx_tbl,
3034 .rx_tbl_num = ARRAY_SIZE(sdm845_qhp_pcie_rx_tbl),
3035 .pcs_tbl = sdm845_qhp_pcie_pcs_tbl,
3036 .pcs_tbl_num = ARRAY_SIZE(sdm845_qhp_pcie_pcs_tbl),
3037 .clk_list = sdm845_pciephy_clk_l,
3038 .num_clks = ARRAY_SIZE(sdm845_pciephy_clk_l),
3039 .reset_list = sdm845_pciephy_reset_l,
3040 .num_resets = ARRAY_SIZE(sdm845_pciephy_reset_l),
3041 .vreg_list = qmp_phy_vreg_l,
3042 .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
3043 .regs = sdm845_qhp_pciephy_regs_layout,
3044
3045 .start_ctrl = PCS_START | SERDES_START,
3046 .pwrdn_ctrl = SW_PWRDN | REFCLK_DRV_DSBL,
3047 .phy_status = PHYSTATUS,
3048
3049 .has_pwrdn_delay = true,
3050 .pwrdn_delay_min = 995, /* us */
3051 .pwrdn_delay_max = 1005, /* us */
3052};
3053
3054static const struct qmp_phy_cfg sm8250_qmp_gen3x1_pciephy_cfg = {
3055 .type = PHY_TYPE_PCIE,
3056 .nlanes = 1,
3057
3058 .serdes_tbl = sm8250_qmp_pcie_serdes_tbl,
3059 .serdes_tbl_num = ARRAY_SIZE(sm8250_qmp_pcie_serdes_tbl),
3060 .serdes_tbl_sec = sm8250_qmp_gen3x1_pcie_serdes_tbl,
3061 .serdes_tbl_num_sec = ARRAY_SIZE(sm8250_qmp_gen3x1_pcie_serdes_tbl),
3062 .tx_tbl = sm8250_qmp_pcie_tx_tbl,
3063 .tx_tbl_num = ARRAY_SIZE(sm8250_qmp_pcie_tx_tbl),
3064 .rx_tbl = sm8250_qmp_pcie_rx_tbl,
3065 .rx_tbl_num = ARRAY_SIZE(sm8250_qmp_pcie_rx_tbl),
3066 .rx_tbl_sec = sm8250_qmp_gen3x1_pcie_rx_tbl,
3067 .rx_tbl_num_sec = ARRAY_SIZE(sm8250_qmp_gen3x1_pcie_rx_tbl),
3068 .pcs_tbl = sm8250_qmp_pcie_pcs_tbl,
3069 .pcs_tbl_num = ARRAY_SIZE(sm8250_qmp_pcie_pcs_tbl),
3070 .pcs_tbl_sec = sm8250_qmp_gen3x1_pcie_pcs_tbl,
3071 .pcs_tbl_num_sec = ARRAY_SIZE(sm8250_qmp_gen3x1_pcie_pcs_tbl),
3072 .pcs_misc_tbl = sm8250_qmp_pcie_pcs_misc_tbl,
3073 .pcs_misc_tbl_num = ARRAY_SIZE(sm8250_qmp_pcie_pcs_misc_tbl),
3074 .pcs_misc_tbl_sec = sm8250_qmp_gen3x1_pcie_pcs_misc_tbl,
3075 .pcs_misc_tbl_num_sec = ARRAY_SIZE(sm8250_qmp_gen3x1_pcie_pcs_misc_tbl),
3076 .clk_list = sdm845_pciephy_clk_l,
3077 .num_clks = ARRAY_SIZE(sdm845_pciephy_clk_l),
3078 .reset_list = sdm845_pciephy_reset_l,
3079 .num_resets = ARRAY_SIZE(sdm845_pciephy_reset_l),
3080 .vreg_list = qmp_phy_vreg_l,
3081 .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
3082 .regs = sm8250_pcie_regs_layout,
3083
3084 .start_ctrl = PCS_START | SERDES_START,
3085 .pwrdn_ctrl = SW_PWRDN | REFCLK_DRV_DSBL,
3086 .phy_status = PHYSTATUS,
3087
3088 .has_pwrdn_delay = true,
3089 .pwrdn_delay_min = 995, /* us */
3090 .pwrdn_delay_max = 1005, /* us */
3091};
3092
3093static const struct qmp_phy_cfg sm8250_qmp_gen3x2_pciephy_cfg = {
3094 .type = PHY_TYPE_PCIE,
3095 .nlanes = 2,
3096
3097 .serdes_tbl = sm8250_qmp_pcie_serdes_tbl,
3098 .serdes_tbl_num = ARRAY_SIZE(sm8250_qmp_pcie_serdes_tbl),
3099 .tx_tbl = sm8250_qmp_pcie_tx_tbl,
3100 .tx_tbl_num = ARRAY_SIZE(sm8250_qmp_pcie_tx_tbl),
3101 .tx_tbl_sec = sm8250_qmp_gen3x2_pcie_tx_tbl,
3102 .tx_tbl_num_sec = ARRAY_SIZE(sm8250_qmp_gen3x2_pcie_tx_tbl),
3103 .rx_tbl = sm8250_qmp_pcie_rx_tbl,
3104 .rx_tbl_num = ARRAY_SIZE(sm8250_qmp_pcie_rx_tbl),
3105 .rx_tbl_sec = sm8250_qmp_gen3x2_pcie_rx_tbl,
3106 .rx_tbl_num_sec = ARRAY_SIZE(sm8250_qmp_gen3x2_pcie_rx_tbl),
3107 .pcs_tbl = sm8250_qmp_pcie_pcs_tbl,
3108 .pcs_tbl_num = ARRAY_SIZE(sm8250_qmp_pcie_pcs_tbl),
3109 .pcs_tbl_sec = sm8250_qmp_gen3x2_pcie_pcs_tbl,
3110 .pcs_tbl_num_sec = ARRAY_SIZE(sm8250_qmp_gen3x2_pcie_pcs_tbl),
3111 .pcs_misc_tbl = sm8250_qmp_pcie_pcs_misc_tbl,
3112 .pcs_misc_tbl_num = ARRAY_SIZE(sm8250_qmp_pcie_pcs_misc_tbl),
3113 .pcs_misc_tbl_sec = sm8250_qmp_gen3x2_pcie_pcs_misc_tbl,
3114 .pcs_misc_tbl_num_sec = ARRAY_SIZE(sm8250_qmp_gen3x2_pcie_pcs_misc_tbl),
3115 .clk_list = sdm845_pciephy_clk_l,
3116 .num_clks = ARRAY_SIZE(sdm845_pciephy_clk_l),
3117 .reset_list = sdm845_pciephy_reset_l,
3118 .num_resets = ARRAY_SIZE(sdm845_pciephy_reset_l),
3119 .vreg_list = qmp_phy_vreg_l,
3120 .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
3121 .regs = sm8250_pcie_regs_layout,
3122
3123 .start_ctrl = PCS_START | SERDES_START,
3124 .pwrdn_ctrl = SW_PWRDN | REFCLK_DRV_DSBL,
3125 .phy_status = PHYSTATUS,
3126
3127 .is_dual_lane_phy = true,
3128 .has_pwrdn_delay = true,
3129 .pwrdn_delay_min = 995, /* us */
3130 .pwrdn_delay_max = 1005, /* us */
3131};
3132
3133static const struct qmp_phy_cfg qmp_v3_usb3phy_cfg = {
3134 .type = PHY_TYPE_USB3,
3135 .nlanes = 1,
3136
3137 .serdes_tbl = qmp_v3_usb3_serdes_tbl,
3138 .serdes_tbl_num = ARRAY_SIZE(qmp_v3_usb3_serdes_tbl),
3139 .tx_tbl = qmp_v3_usb3_tx_tbl,
3140 .tx_tbl_num = ARRAY_SIZE(qmp_v3_usb3_tx_tbl),
3141 .rx_tbl = qmp_v3_usb3_rx_tbl,
3142 .rx_tbl_num = ARRAY_SIZE(qmp_v3_usb3_rx_tbl),
3143 .pcs_tbl = qmp_v3_usb3_pcs_tbl,
3144 .pcs_tbl_num = ARRAY_SIZE(qmp_v3_usb3_pcs_tbl),
3145 .clk_list = qmp_v3_phy_clk_l,
3146 .num_clks = ARRAY_SIZE(qmp_v3_phy_clk_l),
3147 .reset_list = msm8996_usb3phy_reset_l,
3148 .num_resets = ARRAY_SIZE(msm8996_usb3phy_reset_l),
3149 .vreg_list = qmp_phy_vreg_l,
3150 .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
3151 .regs = qmp_v3_usb3phy_regs_layout,
3152
3153 .start_ctrl = SERDES_START | PCS_START,
3154 .pwrdn_ctrl = SW_PWRDN,
3155 .phy_status = PHYSTATUS,
3156
3157 .has_pwrdn_delay = true,
3158 .pwrdn_delay_min = POWER_DOWN_DELAY_US_MIN,
3159 .pwrdn_delay_max = POWER_DOWN_DELAY_US_MAX,
3160
3161 .has_phy_dp_com_ctrl = true,
3162 .is_dual_lane_phy = true,
3163};
3164
3165static const struct qmp_phy_cfg sc7180_usb3phy_cfg = {
3166 .type = PHY_TYPE_USB3,
3167 .nlanes = 1,
3168
3169 .serdes_tbl = qmp_v3_usb3_serdes_tbl,
3170 .serdes_tbl_num = ARRAY_SIZE(qmp_v3_usb3_serdes_tbl),
3171 .tx_tbl = qmp_v3_usb3_tx_tbl,
3172 .tx_tbl_num = ARRAY_SIZE(qmp_v3_usb3_tx_tbl),
3173 .rx_tbl = qmp_v3_usb3_rx_tbl,
3174 .rx_tbl_num = ARRAY_SIZE(qmp_v3_usb3_rx_tbl),
3175 .pcs_tbl = qmp_v3_usb3_pcs_tbl,
3176 .pcs_tbl_num = ARRAY_SIZE(qmp_v3_usb3_pcs_tbl),
3177 .clk_list = qmp_v3_phy_clk_l,
3178 .num_clks = ARRAY_SIZE(qmp_v3_phy_clk_l),
3179 .reset_list = sc7180_usb3phy_reset_l,
3180 .num_resets = ARRAY_SIZE(sc7180_usb3phy_reset_l),
3181 .vreg_list = qmp_phy_vreg_l,
3182 .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
3183 .regs = qmp_v3_usb3phy_regs_layout,
3184
3185 .start_ctrl = SERDES_START | PCS_START,
3186 .pwrdn_ctrl = SW_PWRDN,
3187 .phy_status = PHYSTATUS,
3188
3189 .has_pwrdn_delay = true,
3190 .pwrdn_delay_min = POWER_DOWN_DELAY_US_MIN,
3191 .pwrdn_delay_max = POWER_DOWN_DELAY_US_MAX,
3192
3193 .has_phy_dp_com_ctrl = true,
3194 .is_dual_lane_phy = true,
3195};
3196
3197static const struct qmp_phy_cfg sc7180_dpphy_cfg = {
3198 .type = PHY_TYPE_DP,
3199 .nlanes = 1,
3200
3201 .serdes_tbl = qmp_v3_dp_serdes_tbl,
3202 .serdes_tbl_num = ARRAY_SIZE(qmp_v3_dp_serdes_tbl),
3203 .tx_tbl = qmp_v3_dp_tx_tbl,
3204 .tx_tbl_num = ARRAY_SIZE(qmp_v3_dp_tx_tbl),
3205
3206 .serdes_tbl_rbr = qmp_v3_dp_serdes_tbl_rbr,
3207 .serdes_tbl_rbr_num = ARRAY_SIZE(qmp_v3_dp_serdes_tbl_rbr),
3208 .serdes_tbl_hbr = qmp_v3_dp_serdes_tbl_hbr,
3209 .serdes_tbl_hbr_num = ARRAY_SIZE(qmp_v3_dp_serdes_tbl_hbr),
3210 .serdes_tbl_hbr2 = qmp_v3_dp_serdes_tbl_hbr2,
3211 .serdes_tbl_hbr2_num = ARRAY_SIZE(qmp_v3_dp_serdes_tbl_hbr2),
3212 .serdes_tbl_hbr3 = qmp_v3_dp_serdes_tbl_hbr3,
3213 .serdes_tbl_hbr3_num = ARRAY_SIZE(qmp_v3_dp_serdes_tbl_hbr3),
3214
3215 .clk_list = qmp_v3_phy_clk_l,
3216 .num_clks = ARRAY_SIZE(qmp_v3_phy_clk_l),
3217 .reset_list = sc7180_usb3phy_reset_l,
3218 .num_resets = ARRAY_SIZE(sc7180_usb3phy_reset_l),
3219 .vreg_list = qmp_phy_vreg_l,
3220 .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
3221 .regs = qmp_v3_usb3phy_regs_layout,
3222
3223 .has_phy_dp_com_ctrl = true,
3224 .is_dual_lane_phy = true,
3225
3226 .dp_aux_init = qcom_qmp_v3_phy_dp_aux_init,
3227 .configure_dp_tx = qcom_qmp_v3_phy_configure_dp_tx,
3228 .configure_dp_phy = qcom_qmp_v3_phy_configure_dp_phy,
3229 .calibrate_dp_phy = qcom_qmp_v3_dp_phy_calibrate,
3230};
3231
3232static const struct qmp_phy_combo_cfg sc7180_usb3dpphy_cfg = {
3233 .usb_cfg = &sc7180_usb3phy_cfg,
3234 .dp_cfg = &sc7180_dpphy_cfg,
3235};
3236
3237static const struct qmp_phy_cfg qmp_v3_usb3_uniphy_cfg = {
3238 .type = PHY_TYPE_USB3,
3239 .nlanes = 1,
3240
3241 .serdes_tbl = qmp_v3_usb3_uniphy_serdes_tbl,
3242 .serdes_tbl_num = ARRAY_SIZE(qmp_v3_usb3_uniphy_serdes_tbl),
3243 .tx_tbl = qmp_v3_usb3_uniphy_tx_tbl,
3244 .tx_tbl_num = ARRAY_SIZE(qmp_v3_usb3_uniphy_tx_tbl),
3245 .rx_tbl = qmp_v3_usb3_uniphy_rx_tbl,
3246 .rx_tbl_num = ARRAY_SIZE(qmp_v3_usb3_uniphy_rx_tbl),
3247 .pcs_tbl = qmp_v3_usb3_uniphy_pcs_tbl,
3248 .pcs_tbl_num = ARRAY_SIZE(qmp_v3_usb3_uniphy_pcs_tbl),
3249 .clk_list = qmp_v3_phy_clk_l,
3250 .num_clks = ARRAY_SIZE(qmp_v3_phy_clk_l),
3251 .reset_list = msm8996_usb3phy_reset_l,
3252 .num_resets = ARRAY_SIZE(msm8996_usb3phy_reset_l),
3253 .vreg_list = qmp_phy_vreg_l,
3254 .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
3255 .regs = qmp_v3_usb3phy_regs_layout,
3256
3257 .start_ctrl = SERDES_START | PCS_START,
3258 .pwrdn_ctrl = SW_PWRDN,
3259 .phy_status = PHYSTATUS,
3260
3261 .has_pwrdn_delay = true,
3262 .pwrdn_delay_min = POWER_DOWN_DELAY_US_MIN,
3263 .pwrdn_delay_max = POWER_DOWN_DELAY_US_MAX,
3264};
3265
3266static const struct qmp_phy_cfg sdm845_ufsphy_cfg = {
3267 .type = PHY_TYPE_UFS,
3268 .nlanes = 2,
3269
3270 .serdes_tbl = sdm845_ufsphy_serdes_tbl,
3271 .serdes_tbl_num = ARRAY_SIZE(sdm845_ufsphy_serdes_tbl),
3272 .tx_tbl = sdm845_ufsphy_tx_tbl,
3273 .tx_tbl_num = ARRAY_SIZE(sdm845_ufsphy_tx_tbl),
3274 .rx_tbl = sdm845_ufsphy_rx_tbl,
3275 .rx_tbl_num = ARRAY_SIZE(sdm845_ufsphy_rx_tbl),
3276 .pcs_tbl = sdm845_ufsphy_pcs_tbl,
3277 .pcs_tbl_num = ARRAY_SIZE(sdm845_ufsphy_pcs_tbl),
3278 .clk_list = sdm845_ufs_phy_clk_l,
3279 .num_clks = ARRAY_SIZE(sdm845_ufs_phy_clk_l),
3280 .vreg_list = qmp_phy_vreg_l,
3281 .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
3282 .regs = sdm845_ufsphy_regs_layout,
3283
3284 .start_ctrl = SERDES_START,
3285 .pwrdn_ctrl = SW_PWRDN,
3286 .phy_status = PHYSTATUS,
3287
3288 .is_dual_lane_phy = true,
3289 .no_pcs_sw_reset = true,
3290};
3291
3292static const struct qmp_phy_cfg msm8998_pciephy_cfg = {
3293 .type = PHY_TYPE_PCIE,
3294 .nlanes = 1,
3295
3296 .serdes_tbl = msm8998_pcie_serdes_tbl,
3297 .serdes_tbl_num = ARRAY_SIZE(msm8998_pcie_serdes_tbl),
3298 .tx_tbl = msm8998_pcie_tx_tbl,
3299 .tx_tbl_num = ARRAY_SIZE(msm8998_pcie_tx_tbl),
3300 .rx_tbl = msm8998_pcie_rx_tbl,
3301 .rx_tbl_num = ARRAY_SIZE(msm8998_pcie_rx_tbl),
3302 .pcs_tbl = msm8998_pcie_pcs_tbl,
3303 .pcs_tbl_num = ARRAY_SIZE(msm8998_pcie_pcs_tbl),
3304 .clk_list = msm8996_phy_clk_l,
3305 .num_clks = ARRAY_SIZE(msm8996_phy_clk_l),
3306 .reset_list = ipq8074_pciephy_reset_l,
3307 .num_resets = ARRAY_SIZE(ipq8074_pciephy_reset_l),
3308 .vreg_list = qmp_phy_vreg_l,
3309 .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
3310 .regs = pciephy_regs_layout,
3311
3312 .start_ctrl = SERDES_START | PCS_START,
3313 .pwrdn_ctrl = SW_PWRDN | REFCLK_DRV_DSBL,
3314 .phy_status = PHYSTATUS,
3315};
3316
3317static const struct qmp_phy_cfg msm8998_usb3phy_cfg = {
3318 .type = PHY_TYPE_USB3,
3319 .nlanes = 1,
3320
3321 .serdes_tbl = msm8998_usb3_serdes_tbl,
3322 .serdes_tbl_num = ARRAY_SIZE(msm8998_usb3_serdes_tbl),
3323 .tx_tbl = msm8998_usb3_tx_tbl,
3324 .tx_tbl_num = ARRAY_SIZE(msm8998_usb3_tx_tbl),
3325 .rx_tbl = msm8998_usb3_rx_tbl,
3326 .rx_tbl_num = ARRAY_SIZE(msm8998_usb3_rx_tbl),
3327 .pcs_tbl = msm8998_usb3_pcs_tbl,
3328 .pcs_tbl_num = ARRAY_SIZE(msm8998_usb3_pcs_tbl),
3329 .clk_list = msm8996_phy_clk_l,
3330 .num_clks = ARRAY_SIZE(msm8996_phy_clk_l),
3331 .reset_list = msm8996_usb3phy_reset_l,
3332 .num_resets = ARRAY_SIZE(msm8996_usb3phy_reset_l),
3333 .vreg_list = qmp_phy_vreg_l,
3334 .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
3335 .regs = qmp_v3_usb3phy_regs_layout,
3336
3337 .start_ctrl = SERDES_START | PCS_START,
3338 .pwrdn_ctrl = SW_PWRDN,
3339 .phy_status = PHYSTATUS,
3340
3341 .is_dual_lane_phy = true,
3342};
3343
3344static const struct qmp_phy_cfg sm8150_ufsphy_cfg = {
3345 .type = PHY_TYPE_UFS,
3346 .nlanes = 2,
3347
3348 .serdes_tbl = sm8150_ufsphy_serdes_tbl,
3349 .serdes_tbl_num = ARRAY_SIZE(sm8150_ufsphy_serdes_tbl),
3350 .tx_tbl = sm8150_ufsphy_tx_tbl,
3351 .tx_tbl_num = ARRAY_SIZE(sm8150_ufsphy_tx_tbl),
3352 .rx_tbl = sm8150_ufsphy_rx_tbl,
3353 .rx_tbl_num = ARRAY_SIZE(sm8150_ufsphy_rx_tbl),
3354 .pcs_tbl = sm8150_ufsphy_pcs_tbl,
3355 .pcs_tbl_num = ARRAY_SIZE(sm8150_ufsphy_pcs_tbl),
3356 .clk_list = sdm845_ufs_phy_clk_l,
3357 .num_clks = ARRAY_SIZE(sdm845_ufs_phy_clk_l),
3358 .vreg_list = qmp_phy_vreg_l,
3359 .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
3360 .regs = sm8150_ufsphy_regs_layout,
3361
3362 .start_ctrl = SERDES_START,
3363 .pwrdn_ctrl = SW_PWRDN,
3364 .phy_status = PHYSTATUS,
3365
3366 .is_dual_lane_phy = true,
3367};
3368
3369static const struct qmp_phy_cfg sm8150_usb3phy_cfg = {
3370 .type = PHY_TYPE_USB3,
3371 .nlanes = 1,
3372
3373 .serdes_tbl = sm8150_usb3_serdes_tbl,
3374 .serdes_tbl_num = ARRAY_SIZE(sm8150_usb3_serdes_tbl),
3375 .tx_tbl = sm8150_usb3_tx_tbl,
3376 .tx_tbl_num = ARRAY_SIZE(sm8150_usb3_tx_tbl),
3377 .rx_tbl = sm8150_usb3_rx_tbl,
3378 .rx_tbl_num = ARRAY_SIZE(sm8150_usb3_rx_tbl),
3379 .pcs_tbl = sm8150_usb3_pcs_tbl,
3380 .pcs_tbl_num = ARRAY_SIZE(sm8150_usb3_pcs_tbl),
3381 .clk_list = qmp_v4_phy_clk_l,
3382 .num_clks = ARRAY_SIZE(qmp_v4_phy_clk_l),
3383 .reset_list = msm8996_usb3phy_reset_l,
3384 .num_resets = ARRAY_SIZE(msm8996_usb3phy_reset_l),
3385 .vreg_list = qmp_phy_vreg_l,
3386 .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
3387 .regs = qmp_v4_usb3phy_regs_layout,
3388
3389 .start_ctrl = SERDES_START | PCS_START,
3390 .pwrdn_ctrl = SW_PWRDN,
3391 .phy_status = PHYSTATUS,
3392
3393
3394 .has_pwrdn_delay = true,
3395 .pwrdn_delay_min = POWER_DOWN_DELAY_US_MIN,
3396 .pwrdn_delay_max = POWER_DOWN_DELAY_US_MAX,
3397
3398 .has_phy_dp_com_ctrl = true,
3399 .is_dual_lane_phy = true,
3400};
3401
3402static const struct qmp_phy_cfg sm8150_usb3_uniphy_cfg = {
3403 .type = PHY_TYPE_USB3,
3404 .nlanes = 1,
3405
3406 .serdes_tbl = sm8150_usb3_uniphy_serdes_tbl,
3407 .serdes_tbl_num = ARRAY_SIZE(sm8150_usb3_uniphy_serdes_tbl),
3408 .tx_tbl = sm8150_usb3_uniphy_tx_tbl,
3409 .tx_tbl_num = ARRAY_SIZE(sm8150_usb3_uniphy_tx_tbl),
3410 .rx_tbl = sm8150_usb3_uniphy_rx_tbl,
3411 .rx_tbl_num = ARRAY_SIZE(sm8150_usb3_uniphy_rx_tbl),
3412 .pcs_tbl = sm8150_usb3_uniphy_pcs_tbl,
3413 .pcs_tbl_num = ARRAY_SIZE(sm8150_usb3_uniphy_pcs_tbl),
3414 .clk_list = qmp_v4_phy_clk_l,
3415 .num_clks = ARRAY_SIZE(qmp_v4_phy_clk_l),
3416 .reset_list = msm8996_usb3phy_reset_l,
3417 .num_resets = ARRAY_SIZE(msm8996_usb3phy_reset_l),
3418 .vreg_list = qmp_phy_vreg_l,
3419 .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
3420 .regs = qmp_v4_usb3_uniphy_regs_layout,
3421
3422 .start_ctrl = SERDES_START | PCS_START,
3423 .pwrdn_ctrl = SW_PWRDN,
3424 .phy_status = PHYSTATUS,
3425
3426 .has_pwrdn_delay = true,
3427 .pwrdn_delay_min = POWER_DOWN_DELAY_US_MIN,
3428 .pwrdn_delay_max = POWER_DOWN_DELAY_US_MAX,
3429};
3430
3431static const struct qmp_phy_cfg sm8250_usb3phy_cfg = {
3432 .type = PHY_TYPE_USB3,
3433 .nlanes = 1,
3434
3435 .serdes_tbl = sm8150_usb3_serdes_tbl,
3436 .serdes_tbl_num = ARRAY_SIZE(sm8150_usb3_serdes_tbl),
3437 .tx_tbl = sm8250_usb3_tx_tbl,
3438 .tx_tbl_num = ARRAY_SIZE(sm8250_usb3_tx_tbl),
3439 .rx_tbl = sm8250_usb3_rx_tbl,
3440 .rx_tbl_num = ARRAY_SIZE(sm8250_usb3_rx_tbl),
3441 .pcs_tbl = sm8250_usb3_pcs_tbl,
3442 .pcs_tbl_num = ARRAY_SIZE(sm8250_usb3_pcs_tbl),
3443 .clk_list = qmp_v4_sm8250_usbphy_clk_l,
3444 .num_clks = ARRAY_SIZE(qmp_v4_sm8250_usbphy_clk_l),
3445 .reset_list = msm8996_usb3phy_reset_l,
3446 .num_resets = ARRAY_SIZE(msm8996_usb3phy_reset_l),
3447 .vreg_list = qmp_phy_vreg_l,
3448 .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
3449 .regs = qmp_v4_usb3phy_regs_layout,
3450
3451 .start_ctrl = SERDES_START | PCS_START,
3452 .pwrdn_ctrl = SW_PWRDN,
3453 .phy_status = PHYSTATUS,
3454
3455 .has_pwrdn_delay = true,
3456 .pwrdn_delay_min = POWER_DOWN_DELAY_US_MIN,
3457 .pwrdn_delay_max = POWER_DOWN_DELAY_US_MAX,
3458
3459 .has_phy_dp_com_ctrl = true,
3460 .is_dual_lane_phy = true,
3461};
3462
3463static const struct qmp_phy_cfg sm8250_usb3_uniphy_cfg = {
3464 .type = PHY_TYPE_USB3,
3465 .nlanes = 1,
3466
3467 .serdes_tbl = sm8150_usb3_uniphy_serdes_tbl,
3468 .serdes_tbl_num = ARRAY_SIZE(sm8150_usb3_uniphy_serdes_tbl),
3469 .tx_tbl = sm8250_usb3_uniphy_tx_tbl,
3470 .tx_tbl_num = ARRAY_SIZE(sm8250_usb3_uniphy_tx_tbl),
3471 .rx_tbl = sm8250_usb3_uniphy_rx_tbl,
3472 .rx_tbl_num = ARRAY_SIZE(sm8250_usb3_uniphy_rx_tbl),
3473 .pcs_tbl = sm8250_usb3_uniphy_pcs_tbl,
3474 .pcs_tbl_num = ARRAY_SIZE(sm8250_usb3_uniphy_pcs_tbl),
3475 .clk_list = qmp_v4_phy_clk_l,
3476 .num_clks = ARRAY_SIZE(qmp_v4_phy_clk_l),
3477 .reset_list = msm8996_usb3phy_reset_l,
3478 .num_resets = ARRAY_SIZE(msm8996_usb3phy_reset_l),
3479 .vreg_list = qmp_phy_vreg_l,
3480 .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
3481 .regs = qmp_v4_usb3_uniphy_regs_layout,
3482
3483 .start_ctrl = SERDES_START | PCS_START,
3484 .pwrdn_ctrl = SW_PWRDN,
3485 .phy_status = PHYSTATUS,
3486
3487 .has_pwrdn_delay = true,
3488 .pwrdn_delay_min = POWER_DOWN_DELAY_US_MIN,
3489 .pwrdn_delay_max = POWER_DOWN_DELAY_US_MAX,
3490};
3491
3492static const struct qmp_phy_cfg sm8250_dpphy_cfg = {
3493 .type = PHY_TYPE_DP,
3494 .nlanes = 1,
3495
3496 .serdes_tbl = qmp_v4_dp_serdes_tbl,
3497 .serdes_tbl_num = ARRAY_SIZE(qmp_v4_dp_serdes_tbl),
3498 .tx_tbl = qmp_v4_dp_tx_tbl,
3499 .tx_tbl_num = ARRAY_SIZE(qmp_v4_dp_tx_tbl),
3500
3501 .serdes_tbl_rbr = qmp_v4_dp_serdes_tbl_rbr,
3502 .serdes_tbl_rbr_num = ARRAY_SIZE(qmp_v4_dp_serdes_tbl_rbr),
3503 .serdes_tbl_hbr = qmp_v4_dp_serdes_tbl_hbr,
3504 .serdes_tbl_hbr_num = ARRAY_SIZE(qmp_v4_dp_serdes_tbl_hbr),
3505 .serdes_tbl_hbr2 = qmp_v4_dp_serdes_tbl_hbr2,
3506 .serdes_tbl_hbr2_num = ARRAY_SIZE(qmp_v4_dp_serdes_tbl_hbr2),
3507 .serdes_tbl_hbr3 = qmp_v4_dp_serdes_tbl_hbr3,
3508 .serdes_tbl_hbr3_num = ARRAY_SIZE(qmp_v4_dp_serdes_tbl_hbr3),
3509
3510 .clk_list = qmp_v4_phy_clk_l,
3511 .num_clks = ARRAY_SIZE(qmp_v4_phy_clk_l),
3512 .reset_list = msm8996_usb3phy_reset_l,
3513 .num_resets = ARRAY_SIZE(msm8996_usb3phy_reset_l),
3514 .vreg_list = qmp_phy_vreg_l,
3515 .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
3516 .regs = qmp_v4_usb3phy_regs_layout,
3517
3518 .has_phy_dp_com_ctrl = true,
3519 .is_dual_lane_phy = true,
3520
3521 .dp_aux_init = qcom_qmp_v4_phy_dp_aux_init,
3522 .configure_dp_tx = qcom_qmp_v4_phy_configure_dp_tx,
3523 .configure_dp_phy = qcom_qmp_v4_phy_configure_dp_phy,
3524 .calibrate_dp_phy = qcom_qmp_v4_dp_phy_calibrate,
3525};
3526
3527static const struct qmp_phy_combo_cfg sm8250_usb3dpphy_cfg = {
3528 .usb_cfg = &sm8250_usb3phy_cfg,
3529 .dp_cfg = &sm8250_dpphy_cfg,
3530};
3531
3532static const struct qmp_phy_cfg sdx55_usb3_uniphy_cfg = {
3533 .type = PHY_TYPE_USB3,
3534 .nlanes = 1,
3535
3536 .serdes_tbl = sm8150_usb3_uniphy_serdes_tbl,
3537 .serdes_tbl_num = ARRAY_SIZE(sm8150_usb3_uniphy_serdes_tbl),
3538 .tx_tbl = sdx55_usb3_uniphy_tx_tbl,
3539 .tx_tbl_num = ARRAY_SIZE(sdx55_usb3_uniphy_tx_tbl),
3540 .rx_tbl = sdx55_usb3_uniphy_rx_tbl,
3541 .rx_tbl_num = ARRAY_SIZE(sdx55_usb3_uniphy_rx_tbl),
3542 .pcs_tbl = sm8250_usb3_uniphy_pcs_tbl,
3543 .pcs_tbl_num = ARRAY_SIZE(sm8250_usb3_uniphy_pcs_tbl),
3544 .clk_list = qmp_v4_sdx55_usbphy_clk_l,
3545 .num_clks = ARRAY_SIZE(qmp_v4_sdx55_usbphy_clk_l),
3546 .reset_list = msm8996_usb3phy_reset_l,
3547 .num_resets = ARRAY_SIZE(msm8996_usb3phy_reset_l),
3548 .vreg_list = qmp_phy_vreg_l,
3549 .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
3550 .regs = qmp_v4_usb3_uniphy_regs_layout,
3551
3552 .start_ctrl = SERDES_START | PCS_START,
3553 .pwrdn_ctrl = SW_PWRDN,
3554 .phy_status = PHYSTATUS,
3555
3556 .has_pwrdn_delay = true,
3557 .pwrdn_delay_min = POWER_DOWN_DELAY_US_MIN,
3558 .pwrdn_delay_max = POWER_DOWN_DELAY_US_MAX,
3559};
3560
3561static const struct qmp_phy_cfg sdx55_qmp_pciephy_cfg = {
3562 .type = PHY_TYPE_PCIE,
3563 .nlanes = 2,
3564
3565 .serdes_tbl = sdx55_qmp_pcie_serdes_tbl,
3566 .serdes_tbl_num = ARRAY_SIZE(sdx55_qmp_pcie_serdes_tbl),
3567 .tx_tbl = sdx55_qmp_pcie_tx_tbl,
3568 .tx_tbl_num = ARRAY_SIZE(sdx55_qmp_pcie_tx_tbl),
3569 .rx_tbl = sdx55_qmp_pcie_rx_tbl,
3570 .rx_tbl_num = ARRAY_SIZE(sdx55_qmp_pcie_rx_tbl),
3571 .pcs_tbl = sdx55_qmp_pcie_pcs_tbl,
3572 .pcs_tbl_num = ARRAY_SIZE(sdx55_qmp_pcie_pcs_tbl),
3573 .pcs_misc_tbl = sdx55_qmp_pcie_pcs_misc_tbl,
3574 .pcs_misc_tbl_num = ARRAY_SIZE(sdx55_qmp_pcie_pcs_misc_tbl),
3575 .clk_list = sdm845_pciephy_clk_l,
3576 .num_clks = ARRAY_SIZE(sdm845_pciephy_clk_l),
3577 .reset_list = sdm845_pciephy_reset_l,
3578 .num_resets = ARRAY_SIZE(sdm845_pciephy_reset_l),
3579 .vreg_list = qmp_phy_vreg_l,
3580 .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
3581 .regs = sm8250_pcie_regs_layout,
3582
3583 .start_ctrl = PCS_START | SERDES_START,
3584 .pwrdn_ctrl = SW_PWRDN,
3585 .phy_status = PHYSTATUS_4_20,
3586
3587 .is_dual_lane_phy = true,
3588 .has_pwrdn_delay = true,
3589 .pwrdn_delay_min = 995, /* us */
3590 .pwrdn_delay_max = 1005, /* us */
3591};
3592
3593static const struct qmp_phy_cfg sm8350_ufsphy_cfg = {
3594 .type = PHY_TYPE_UFS,
3595 .nlanes = 2,
3596
3597 .serdes_tbl = sm8350_ufsphy_serdes_tbl,
3598 .serdes_tbl_num = ARRAY_SIZE(sm8350_ufsphy_serdes_tbl),
3599 .tx_tbl = sm8350_ufsphy_tx_tbl,
3600 .tx_tbl_num = ARRAY_SIZE(sm8350_ufsphy_tx_tbl),
3601 .rx_tbl = sm8350_ufsphy_rx_tbl,
3602 .rx_tbl_num = ARRAY_SIZE(sm8350_ufsphy_rx_tbl),
3603 .pcs_tbl = sm8350_ufsphy_pcs_tbl,
3604 .pcs_tbl_num = ARRAY_SIZE(sm8350_ufsphy_pcs_tbl),
3605 .clk_list = sdm845_ufs_phy_clk_l,
3606 .num_clks = ARRAY_SIZE(sdm845_ufs_phy_clk_l),
3607 .vreg_list = qmp_phy_vreg_l,
3608 .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
3609 .regs = sm8150_ufsphy_regs_layout,
3610
3611 .start_ctrl = SERDES_START,
3612 .pwrdn_ctrl = SW_PWRDN,
3613 .phy_status = PHYSTATUS,
3614
3615 .is_dual_lane_phy = true,
3616};
3617
3618static const struct qmp_phy_cfg sm8350_usb3phy_cfg = {
3619 .type = PHY_TYPE_USB3,
3620 .nlanes = 1,
3621
3622 .serdes_tbl = sm8150_usb3_serdes_tbl,
3623 .serdes_tbl_num = ARRAY_SIZE(sm8150_usb3_serdes_tbl),
3624 .tx_tbl = sm8350_usb3_tx_tbl,
3625 .tx_tbl_num = ARRAY_SIZE(sm8350_usb3_tx_tbl),
3626 .rx_tbl = sm8350_usb3_rx_tbl,
3627 .rx_tbl_num = ARRAY_SIZE(sm8350_usb3_rx_tbl),
3628 .pcs_tbl = sm8350_usb3_pcs_tbl,
3629 .pcs_tbl_num = ARRAY_SIZE(sm8350_usb3_pcs_tbl),
3630 .clk_list = qmp_v4_sm8250_usbphy_clk_l,
3631 .num_clks = ARRAY_SIZE(qmp_v4_sm8250_usbphy_clk_l),
3632 .reset_list = msm8996_usb3phy_reset_l,
3633 .num_resets = ARRAY_SIZE(msm8996_usb3phy_reset_l),
3634 .vreg_list = qmp_phy_vreg_l,
3635 .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
3636 .regs = qmp_v4_usb3phy_regs_layout,
3637
3638 .start_ctrl = SERDES_START | PCS_START,
3639 .pwrdn_ctrl = SW_PWRDN,
3640 .phy_status = PHYSTATUS,
3641
3642 .has_pwrdn_delay = true,
3643 .pwrdn_delay_min = POWER_DOWN_DELAY_US_MIN,
3644 .pwrdn_delay_max = POWER_DOWN_DELAY_US_MAX,
3645
3646 .has_phy_dp_com_ctrl = true,
3647 .is_dual_lane_phy = true,
3648};
3649
3650static const struct qmp_phy_cfg sm8350_usb3_uniphy_cfg = {
3651 .type = PHY_TYPE_USB3,
3652 .nlanes = 1,
3653
3654 .serdes_tbl = sm8150_usb3_uniphy_serdes_tbl,
3655 .serdes_tbl_num = ARRAY_SIZE(sm8150_usb3_uniphy_serdes_tbl),
3656 .tx_tbl = sm8350_usb3_uniphy_tx_tbl,
3657 .tx_tbl_num = ARRAY_SIZE(sm8350_usb3_uniphy_tx_tbl),
3658 .rx_tbl = sm8350_usb3_uniphy_rx_tbl,
3659 .rx_tbl_num = ARRAY_SIZE(sm8350_usb3_uniphy_rx_tbl),
3660 .pcs_tbl = sm8350_usb3_uniphy_pcs_tbl,
3661 .pcs_tbl_num = ARRAY_SIZE(sm8350_usb3_uniphy_pcs_tbl),
3662 .clk_list = qmp_v4_phy_clk_l,
3663 .num_clks = ARRAY_SIZE(qmp_v4_phy_clk_l),
3664 .reset_list = msm8996_usb3phy_reset_l,
3665 .num_resets = ARRAY_SIZE(msm8996_usb3phy_reset_l),
3666 .vreg_list = qmp_phy_vreg_l,
3667 .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
3668 .regs = sm8350_usb3_uniphy_regs_layout,
3669
3670 .start_ctrl = SERDES_START | PCS_START,
3671 .pwrdn_ctrl = SW_PWRDN,
3672 .phy_status = PHYSTATUS,
3673
3674 .has_pwrdn_delay = true,
3675 .pwrdn_delay_min = POWER_DOWN_DELAY_US_MIN,
3676 .pwrdn_delay_max = POWER_DOWN_DELAY_US_MAX,
3677};
3678
3679static void qcom_qmp_phy_configure_lane(void __iomem *base,
3680 const unsigned int *regs,
3681 const struct qmp_phy_init_tbl tbl[],
3682 int num,
3683 u8 lane_mask)
3684{
3685 int i;
3686 const struct qmp_phy_init_tbl *t = tbl;
3687
3688 if (!t)
3689 return;
3690
3691 for (i = 0; i < num; i++, t++) {
3692 if (!(t->lane_mask & lane_mask))
3693 continue;
3694
3695 if (t->in_layout)
3696 writel(t->val, base + regs[t->offset]);
3697 else
3698 writel(t->val, base + t->offset);
3699 }
3700}
3701
3702static void qcom_qmp_phy_configure(void __iomem *base,
3703 const unsigned int *regs,
3704 const struct qmp_phy_init_tbl tbl[],
3705 int num)
3706{
3707 qcom_qmp_phy_configure_lane(base, regs, tbl, num, 0xff);
3708}
3709
3710static int qcom_qmp_phy_serdes_init(struct qmp_phy *qphy)
3711{
3712 struct qcom_qmp *qmp = qphy->qmp;
3713 const struct qmp_phy_cfg *cfg = qphy->cfg;
3714 void __iomem *serdes = qphy->serdes;
3715 const struct phy_configure_opts_dp *dp_opts = &qphy->dp_opts;
3716 const struct qmp_phy_init_tbl *serdes_tbl = cfg->serdes_tbl;
3717 int serdes_tbl_num = cfg->serdes_tbl_num;
3718 int ret;
3719
3720 qcom_qmp_phy_configure(serdes, cfg->regs, serdes_tbl, serdes_tbl_num);
3721 if (cfg->serdes_tbl_sec)
3722 qcom_qmp_phy_configure(serdes, cfg->regs, cfg->serdes_tbl_sec,
3723 cfg->serdes_tbl_num_sec);
3724
3725 if (cfg->type == PHY_TYPE_DP) {
3726 switch (dp_opts->link_rate) {
3727 case 1620:
3728 qcom_qmp_phy_configure(serdes, cfg->regs,
3729 cfg->serdes_tbl_rbr,
3730 cfg->serdes_tbl_rbr_num);
3731 break;
3732 case 2700:
3733 qcom_qmp_phy_configure(serdes, cfg->regs,
3734 cfg->serdes_tbl_hbr,
3735 cfg->serdes_tbl_hbr_num);
3736 break;
3737 case 5400:
3738 qcom_qmp_phy_configure(serdes, cfg->regs,
3739 cfg->serdes_tbl_hbr2,
3740 cfg->serdes_tbl_hbr2_num);
3741 break;
3742 case 8100:
3743 qcom_qmp_phy_configure(serdes, cfg->regs,
3744 cfg->serdes_tbl_hbr3,
3745 cfg->serdes_tbl_hbr3_num);
3746 break;
3747 default:
3748 /* Other link rates aren't supported */
3749 return -EINVAL;
3750 }
3751 }
3752
3753
3754 if (cfg->has_phy_com_ctrl) {
3755 void __iomem *status;
3756 unsigned int mask, val;
3757
3758 qphy_clrbits(serdes, cfg->regs[QPHY_COM_SW_RESET], SW_RESET);
3759 qphy_setbits(serdes, cfg->regs[QPHY_COM_START_CONTROL],
3760 SERDES_START | PCS_START);
3761
3762 status = serdes + cfg->regs[QPHY_COM_PCS_READY_STATUS];
3763 mask = cfg->mask_com_pcs_ready;
3764
3765 ret = readl_poll_timeout(status, val, (val & mask), 10,
3766 PHY_INIT_COMPLETE_TIMEOUT);
3767 if (ret) {
3768 dev_err(qmp->dev,
3769 "phy common block init timed-out\n");
3770 return ret;
3771 }
3772 }
3773
3774 return 0;
3775}
3776
3777static void qcom_qmp_v3_phy_dp_aux_init(struct qmp_phy *qphy)
3778{
3779 writel(DP_PHY_PD_CTL_PWRDN | DP_PHY_PD_CTL_AUX_PWRDN |
3780 DP_PHY_PD_CTL_PLL_PWRDN | DP_PHY_PD_CTL_DP_CLAMP_EN,
3781 qphy->pcs + QSERDES_DP_PHY_PD_CTL);
3782
3783 /* Turn on BIAS current for PHY/PLL */
3784 writel(QSERDES_V3_COM_BIAS_EN | QSERDES_V3_COM_BIAS_EN_MUX |
3785 QSERDES_V3_COM_CLKBUF_L_EN | QSERDES_V3_COM_EN_SYSCLK_TX_SEL,
3786 qphy->serdes + QSERDES_V3_COM_BIAS_EN_CLKBUFLR_EN);
3787
3788 writel(DP_PHY_PD_CTL_PSR_PWRDN, qphy->pcs + QSERDES_DP_PHY_PD_CTL);
3789
3790 writel(DP_PHY_PD_CTL_PWRDN | DP_PHY_PD_CTL_AUX_PWRDN |
3791 DP_PHY_PD_CTL_LANE_0_1_PWRDN |
3792 DP_PHY_PD_CTL_LANE_2_3_PWRDN | DP_PHY_PD_CTL_PLL_PWRDN |
3793 DP_PHY_PD_CTL_DP_CLAMP_EN,
3794 qphy->pcs + QSERDES_DP_PHY_PD_CTL);
3795
3796 writel(QSERDES_V3_COM_BIAS_EN |
3797 QSERDES_V3_COM_BIAS_EN_MUX | QSERDES_V3_COM_CLKBUF_R_EN |
3798 QSERDES_V3_COM_CLKBUF_L_EN | QSERDES_V3_COM_EN_SYSCLK_TX_SEL |
3799 QSERDES_V3_COM_CLKBUF_RX_DRIVE_L,
3800 qphy->serdes + QSERDES_V3_COM_BIAS_EN_CLKBUFLR_EN);
3801
3802 writel(0x00, qphy->pcs + QSERDES_DP_PHY_AUX_CFG0);
3803 writel(0x13, qphy->pcs + QSERDES_DP_PHY_AUX_CFG1);
3804 writel(0x24, qphy->pcs + QSERDES_DP_PHY_AUX_CFG2);
3805 writel(0x00, qphy->pcs + QSERDES_DP_PHY_AUX_CFG3);
3806 writel(0x0a, qphy->pcs + QSERDES_DP_PHY_AUX_CFG4);
3807 writel(0x26, qphy->pcs + QSERDES_DP_PHY_AUX_CFG5);
3808 writel(0x0a, qphy->pcs + QSERDES_DP_PHY_AUX_CFG6);
3809 writel(0x03, qphy->pcs + QSERDES_DP_PHY_AUX_CFG7);
3810 writel(0xbb, qphy->pcs + QSERDES_DP_PHY_AUX_CFG8);
3811 writel(0x03, qphy->pcs + QSERDES_DP_PHY_AUX_CFG9);
3812 qphy->dp_aux_cfg = 0;
3813
3814 writel(PHY_AUX_STOP_ERR_MASK | PHY_AUX_DEC_ERR_MASK |
3815 PHY_AUX_SYNC_ERR_MASK | PHY_AUX_ALIGN_ERR_MASK |
3816 PHY_AUX_REQ_ERR_MASK,
3817 qphy->pcs + QSERDES_V3_DP_PHY_AUX_INTERRUPT_MASK);
3818}
3819
3820static const u8 qmp_dp_v3_pre_emphasis_hbr3_hbr2[4][4] = {
3821 { 0x00, 0x0c, 0x15, 0x1a },
3822 { 0x02, 0x0e, 0x16, 0xff },
3823 { 0x02, 0x11, 0xff, 0xff },
3824 { 0x04, 0xff, 0xff, 0xff }
3825};
3826
3827static const u8 qmp_dp_v3_voltage_swing_hbr3_hbr2[4][4] = {
3828 { 0x02, 0x12, 0x16, 0x1a },
3829 { 0x09, 0x19, 0x1f, 0xff },
3830 { 0x10, 0x1f, 0xff, 0xff },
3831 { 0x1f, 0xff, 0xff, 0xff }
3832};
3833
3834static const u8 qmp_dp_v3_pre_emphasis_hbr_rbr[4][4] = {
3835 { 0x00, 0x0c, 0x14, 0x19 },
3836 { 0x00, 0x0b, 0x12, 0xff },
3837 { 0x00, 0x0b, 0xff, 0xff },
3838 { 0x04, 0xff, 0xff, 0xff }
3839};
3840
3841static const u8 qmp_dp_v3_voltage_swing_hbr_rbr[4][4] = {
3842 { 0x08, 0x0f, 0x16, 0x1f },
3843 { 0x11, 0x1e, 0x1f, 0xff },
3844 { 0x19, 0x1f, 0xff, 0xff },
3845 { 0x1f, 0xff, 0xff, 0xff }
3846};
3847
3848static int qcom_qmp_phy_configure_dp_swing(struct qmp_phy *qphy,
3849 unsigned int drv_lvl_reg, unsigned int emp_post_reg)
3850{
3851 const struct phy_configure_opts_dp *dp_opts = &qphy->dp_opts;
3852 unsigned int v_level = 0, p_level = 0;
3853 u8 voltage_swing_cfg, pre_emphasis_cfg;
3854 int i;
3855
3856 for (i = 0; i < dp_opts->lanes; i++) {
3857 v_level = max(v_level, dp_opts->voltage[i]);
3858 p_level = max(p_level, dp_opts->pre[i]);
3859 }
3860
3861 if (dp_opts->link_rate <= 2700) {
3862 voltage_swing_cfg = qmp_dp_v3_voltage_swing_hbr_rbr[v_level][p_level];
3863 pre_emphasis_cfg = qmp_dp_v3_pre_emphasis_hbr_rbr[v_level][p_level];
3864 } else {
3865 voltage_swing_cfg = qmp_dp_v3_voltage_swing_hbr3_hbr2[v_level][p_level];
3866 pre_emphasis_cfg = qmp_dp_v3_pre_emphasis_hbr3_hbr2[v_level][p_level];
3867 }
3868
3869 /* TODO: Move check to config check */
3870 if (voltage_swing_cfg == 0xFF && pre_emphasis_cfg == 0xFF)
3871 return -EINVAL;
3872
3873 /* Enable MUX to use Cursor values from these registers */
3874 voltage_swing_cfg |= DP_PHY_TXn_TX_DRV_LVL_MUX_EN;
3875 pre_emphasis_cfg |= DP_PHY_TXn_TX_EMP_POST1_LVL_MUX_EN;
3876
3877 writel(voltage_swing_cfg, qphy->tx + drv_lvl_reg);
3878 writel(pre_emphasis_cfg, qphy->tx + emp_post_reg);
3879 writel(voltage_swing_cfg, qphy->tx2 + drv_lvl_reg);
3880 writel(pre_emphasis_cfg, qphy->tx2 + emp_post_reg);
3881
3882 return 0;
3883}
3884
3885static void qcom_qmp_v3_phy_configure_dp_tx(struct qmp_phy *qphy)
3886{
3887 const struct phy_configure_opts_dp *dp_opts = &qphy->dp_opts;
3888 u32 bias_en, drvr_en;
3889
3890 if (qcom_qmp_phy_configure_dp_swing(qphy,
3891 QSERDES_V3_TX_TX_DRV_LVL,
3892 QSERDES_V3_TX_TX_EMP_POST1_LVL) < 0)
3893 return;
3894
3895 if (dp_opts->lanes == 1) {
3896 bias_en = 0x3e;
3897 drvr_en = 0x13;
3898 } else {
3899 bias_en = 0x3f;
3900 drvr_en = 0x10;
3901 }
3902
3903 writel(drvr_en, qphy->tx + QSERDES_V3_TX_HIGHZ_DRVR_EN);
3904 writel(bias_en, qphy->tx + QSERDES_V3_TX_TRANSCEIVER_BIAS_EN);
3905 writel(drvr_en, qphy->tx2 + QSERDES_V3_TX_HIGHZ_DRVR_EN);
3906 writel(bias_en, qphy->tx2 + QSERDES_V3_TX_TRANSCEIVER_BIAS_EN);
3907}
3908
3909static bool qcom_qmp_phy_configure_dp_mode(struct qmp_phy *qphy)
3910{
3911 u32 val;
3912 bool reverse = false;
3913
3914 val = DP_PHY_PD_CTL_PWRDN | DP_PHY_PD_CTL_AUX_PWRDN |
3915 DP_PHY_PD_CTL_PLL_PWRDN | DP_PHY_PD_CTL_DP_CLAMP_EN;
3916
3917 /*
3918 * TODO: Assume orientation is CC1 for now and two lanes, need to
3919 * use type-c connector to understand orientation and lanes.
3920 *
3921 * Otherwise val changes to be like below if this code understood
3922 * the orientation of the type-c cable.
3923 *
3924 * if (lane_cnt == 4 || orientation == ORIENTATION_CC2)
3925 * val |= DP_PHY_PD_CTL_LANE_0_1_PWRDN;
3926 * if (lane_cnt == 4 || orientation == ORIENTATION_CC1)
3927 * val |= DP_PHY_PD_CTL_LANE_2_3_PWRDN;
3928 * if (orientation == ORIENTATION_CC2)
3929 * writel(0x4c, qphy->pcs + QSERDES_V3_DP_PHY_MODE);
3930 */
3931 val |= DP_PHY_PD_CTL_LANE_2_3_PWRDN;
3932 writel(val, qphy->pcs + QSERDES_DP_PHY_PD_CTL);
3933
3934 writel(0x5c, qphy->pcs + QSERDES_DP_PHY_MODE);
3935
3936 return reverse;
3937}
3938
3939static int qcom_qmp_v3_phy_configure_dp_phy(struct qmp_phy *qphy)
3940{
3941 const struct qmp_phy_dp_clks *dp_clks = qphy->dp_clks;
3942 const struct phy_configure_opts_dp *dp_opts = &qphy->dp_opts;
3943 u32 phy_vco_div, status;
3944 unsigned long pixel_freq;
3945
3946 qcom_qmp_phy_configure_dp_mode(qphy);
3947
3948 writel(0x05, qphy->pcs + QSERDES_V3_DP_PHY_TX0_TX1_LANE_CTL);
3949 writel(0x05, qphy->pcs + QSERDES_V3_DP_PHY_TX2_TX3_LANE_CTL);
3950
3951 switch (dp_opts->link_rate) {
3952 case 1620:
3953 phy_vco_div = 0x1;
3954 pixel_freq = 1620000000UL / 2;
3955 break;
3956 case 2700:
3957 phy_vco_div = 0x1;
3958 pixel_freq = 2700000000UL / 2;
3959 break;
3960 case 5400:
3961 phy_vco_div = 0x2;
3962 pixel_freq = 5400000000UL / 4;
3963 break;
3964 case 8100:
3965 phy_vco_div = 0x0;
3966 pixel_freq = 8100000000UL / 6;
3967 break;
3968 default:
3969 /* Other link rates aren't supported */
3970 return -EINVAL;
3971 }
3972 writel(phy_vco_div, qphy->pcs + QSERDES_V3_DP_PHY_VCO_DIV);
3973
3974 clk_set_rate(dp_clks->dp_link_hw.clk, dp_opts->link_rate * 100000);
3975 clk_set_rate(dp_clks->dp_pixel_hw.clk, pixel_freq);
3976
3977 writel(0x04, qphy->pcs + QSERDES_DP_PHY_AUX_CFG2);
3978 writel(0x01, qphy->pcs + QSERDES_DP_PHY_CFG);
3979 writel(0x05, qphy->pcs + QSERDES_DP_PHY_CFG);
3980 writel(0x01, qphy->pcs + QSERDES_DP_PHY_CFG);
3981 writel(0x09, qphy->pcs + QSERDES_DP_PHY_CFG);
3982
3983 writel(0x20, qphy->serdes + QSERDES_V3_COM_RESETSM_CNTRL);
3984
3985 if (readl_poll_timeout(qphy->serdes + QSERDES_V3_COM_C_READY_STATUS,
3986 status,
3987 ((status & BIT(0)) > 0),
3988 500,
3989 10000))
3990 return -ETIMEDOUT;
3991
3992 writel(0x19, qphy->pcs + QSERDES_DP_PHY_CFG);
3993
3994 if (readl_poll_timeout(qphy->pcs + QSERDES_V3_DP_PHY_STATUS,
3995 status,
3996 ((status & BIT(1)) > 0),
3997 500,
3998 10000))
3999 return -ETIMEDOUT;
4000
4001 writel(0x18, qphy->pcs + QSERDES_DP_PHY_CFG);
4002 udelay(2000);
4003 writel(0x19, qphy->pcs + QSERDES_DP_PHY_CFG);
4004
4005 return readl_poll_timeout(qphy->pcs + QSERDES_V3_DP_PHY_STATUS,
4006 status,
4007 ((status & BIT(1)) > 0),
4008 500,
4009 10000);
4010}
4011
4012/*
4013 * We need to calibrate the aux setting here as many times
4014 * as the caller tries
4015 */
4016static int qcom_qmp_v3_dp_phy_calibrate(struct qmp_phy *qphy)
4017{
4018 static const u8 cfg1_settings[] = { 0x13, 0x23, 0x1d };
4019 u8 val;
4020
4021 qphy->dp_aux_cfg++;
4022 qphy->dp_aux_cfg %= ARRAY_SIZE(cfg1_settings);
4023 val = cfg1_settings[qphy->dp_aux_cfg];
4024
4025 writel(val, qphy->pcs + QSERDES_DP_PHY_AUX_CFG1);
4026
4027 return 0;
4028}
4029
4030static void qcom_qmp_v4_phy_dp_aux_init(struct qmp_phy *qphy)
4031{
4032 writel(DP_PHY_PD_CTL_PWRDN | DP_PHY_PD_CTL_PSR_PWRDN | DP_PHY_PD_CTL_AUX_PWRDN |
4033 DP_PHY_PD_CTL_PLL_PWRDN | DP_PHY_PD_CTL_DP_CLAMP_EN,
4034 qphy->pcs + QSERDES_DP_PHY_PD_CTL);
4035
4036 /* Turn on BIAS current for PHY/PLL */
4037 writel(0x17, qphy->serdes + QSERDES_V4_COM_BIAS_EN_CLKBUFLR_EN);
4038
4039 writel(0x00, qphy->pcs + QSERDES_DP_PHY_AUX_CFG0);
4040 writel(0x13, qphy->pcs + QSERDES_DP_PHY_AUX_CFG1);
4041 writel(0xa4, qphy->pcs + QSERDES_DP_PHY_AUX_CFG2);
4042 writel(0x00, qphy->pcs + QSERDES_DP_PHY_AUX_CFG3);
4043 writel(0x0a, qphy->pcs + QSERDES_DP_PHY_AUX_CFG4);
4044 writel(0x26, qphy->pcs + QSERDES_DP_PHY_AUX_CFG5);
4045 writel(0x0a, qphy->pcs + QSERDES_DP_PHY_AUX_CFG6);
4046 writel(0x03, qphy->pcs + QSERDES_DP_PHY_AUX_CFG7);
4047 writel(0xb7, qphy->pcs + QSERDES_DP_PHY_AUX_CFG8);
4048 writel(0x03, qphy->pcs + QSERDES_DP_PHY_AUX_CFG9);
4049 qphy->dp_aux_cfg = 0;
4050
4051 writel(PHY_AUX_STOP_ERR_MASK | PHY_AUX_DEC_ERR_MASK |
4052 PHY_AUX_SYNC_ERR_MASK | PHY_AUX_ALIGN_ERR_MASK |
4053 PHY_AUX_REQ_ERR_MASK,
4054 qphy->pcs + QSERDES_V4_DP_PHY_AUX_INTERRUPT_MASK);
4055}
4056
4057static void qcom_qmp_v4_phy_configure_dp_tx(struct qmp_phy *qphy)
4058{
4059 /* Program default values before writing proper values */
4060 writel(0x27, qphy->tx + QSERDES_V4_TX_TX_DRV_LVL);
4061 writel(0x27, qphy->tx2 + QSERDES_V4_TX_TX_DRV_LVL);
4062
4063 writel(0x20, qphy->tx + QSERDES_V4_TX_TX_EMP_POST1_LVL);
4064 writel(0x20, qphy->tx2 + QSERDES_V4_TX_TX_EMP_POST1_LVL);
4065
4066 qcom_qmp_phy_configure_dp_swing(qphy,
4067 QSERDES_V4_TX_TX_DRV_LVL,
4068 QSERDES_V4_TX_TX_EMP_POST1_LVL);
4069}
4070
4071static int qcom_qmp_v4_phy_configure_dp_phy(struct qmp_phy *qphy)
4072{
4073 const struct qmp_phy_dp_clks *dp_clks = qphy->dp_clks;
4074 const struct phy_configure_opts_dp *dp_opts = &qphy->dp_opts;
4075 u32 phy_vco_div, status;
4076 unsigned long pixel_freq;
4077 u32 bias0_en, drvr0_en, bias1_en, drvr1_en;
4078 bool reverse;
4079
4080 writel(0x0f, qphy->pcs + QSERDES_V4_DP_PHY_CFG_1);
4081
4082 reverse = qcom_qmp_phy_configure_dp_mode(qphy);
4083
4084 writel(0x13, qphy->pcs + QSERDES_DP_PHY_AUX_CFG1);
4085 writel(0xa4, qphy->pcs + QSERDES_DP_PHY_AUX_CFG2);
4086
4087 writel(0x05, qphy->pcs + QSERDES_V4_DP_PHY_TX0_TX1_LANE_CTL);
4088 writel(0x05, qphy->pcs + QSERDES_V4_DP_PHY_TX2_TX3_LANE_CTL);
4089
4090 switch (dp_opts->link_rate) {
4091 case 1620:
4092 phy_vco_div = 0x1;
4093 pixel_freq = 1620000000UL / 2;
4094 break;
4095 case 2700:
4096 phy_vco_div = 0x1;
4097 pixel_freq = 2700000000UL / 2;
4098 break;
4099 case 5400:
4100 phy_vco_div = 0x2;
4101 pixel_freq = 5400000000UL / 4;
4102 break;
4103 case 8100:
4104 phy_vco_div = 0x0;
4105 pixel_freq = 8100000000UL / 6;
4106 break;
4107 default:
4108 /* Other link rates aren't supported */
4109 return -EINVAL;
4110 }
4111 writel(phy_vco_div, qphy->pcs + QSERDES_V4_DP_PHY_VCO_DIV);
4112
4113 clk_set_rate(dp_clks->dp_link_hw.clk, dp_opts->link_rate * 100000);
4114 clk_set_rate(dp_clks->dp_pixel_hw.clk, pixel_freq);
4115
4116 writel(0x01, qphy->pcs + QSERDES_DP_PHY_CFG);
4117 writel(0x05, qphy->pcs + QSERDES_DP_PHY_CFG);
4118 writel(0x01, qphy->pcs + QSERDES_DP_PHY_CFG);
4119 writel(0x09, qphy->pcs + QSERDES_DP_PHY_CFG);
4120
4121 writel(0x20, qphy->serdes + QSERDES_V4_COM_RESETSM_CNTRL);
4122
4123 if (readl_poll_timeout(qphy->serdes + QSERDES_V4_COM_C_READY_STATUS,
4124 status,
4125 ((status & BIT(0)) > 0),
4126 500,
4127 10000))
4128 return -ETIMEDOUT;
4129
4130 if (readl_poll_timeout(qphy->serdes + QSERDES_V4_COM_CMN_STATUS,
4131 status,
4132 ((status & BIT(0)) > 0),
4133 500,
4134 10000))
4135 return -ETIMEDOUT;
4136
4137 if (readl_poll_timeout(qphy->serdes + QSERDES_V4_COM_CMN_STATUS,
4138 status,
4139 ((status & BIT(1)) > 0),
4140 500,
4141 10000))
4142 return -ETIMEDOUT;
4143
4144 writel(0x19, qphy->pcs + QSERDES_DP_PHY_CFG);
4145
4146 if (readl_poll_timeout(qphy->pcs + QSERDES_V4_DP_PHY_STATUS,
4147 status,
4148 ((status & BIT(0)) > 0),
4149 500,
4150 10000))
4151 return -ETIMEDOUT;
4152
4153 if (readl_poll_timeout(qphy->pcs + QSERDES_V4_DP_PHY_STATUS,
4154 status,
4155 ((status & BIT(1)) > 0),
4156 500,
4157 10000))
4158 return -ETIMEDOUT;
4159
4160 /*
4161 * At least for 7nm DP PHY this has to be done after enabling link
4162 * clock.
4163 */
4164
4165 if (dp_opts->lanes == 1) {
4166 bias0_en = reverse ? 0x3e : 0x15;
4167 bias1_en = reverse ? 0x15 : 0x3e;
4168 drvr0_en = reverse ? 0x13 : 0x10;
4169 drvr1_en = reverse ? 0x10 : 0x13;
4170 } else if (dp_opts->lanes == 2) {
4171 bias0_en = reverse ? 0x3f : 0x15;
4172 bias1_en = reverse ? 0x15 : 0x3f;
4173 drvr0_en = 0x10;
4174 drvr1_en = 0x10;
4175 } else {
4176 bias0_en = 0x3f;
4177 bias1_en = 0x3f;
4178 drvr0_en = 0x10;
4179 drvr1_en = 0x10;
4180 }
4181
4182 writel(drvr0_en, qphy->tx + QSERDES_V4_TX_HIGHZ_DRVR_EN);
4183 writel(bias0_en, qphy->tx + QSERDES_V4_TX_TRANSCEIVER_BIAS_EN);
4184 writel(drvr1_en, qphy->tx2 + QSERDES_V4_TX_HIGHZ_DRVR_EN);
4185 writel(bias1_en, qphy->tx2 + QSERDES_V4_TX_TRANSCEIVER_BIAS_EN);
4186
4187 writel(0x18, qphy->pcs + QSERDES_DP_PHY_CFG);
4188 udelay(2000);
4189 writel(0x19, qphy->pcs + QSERDES_DP_PHY_CFG);
4190
4191 if (readl_poll_timeout(qphy->pcs + QSERDES_V4_DP_PHY_STATUS,
4192 status,
4193 ((status & BIT(1)) > 0),
4194 500,
4195 10000))
4196 return -ETIMEDOUT;
4197
4198 writel(0x0a, qphy->tx + QSERDES_V4_TX_TX_POL_INV);
4199 writel(0x0a, qphy->tx2 + QSERDES_V4_TX_TX_POL_INV);
4200
4201 writel(0x27, qphy->tx + QSERDES_V4_TX_TX_DRV_LVL);
4202 writel(0x27, qphy->tx2 + QSERDES_V4_TX_TX_DRV_LVL);
4203
4204 writel(0x20, qphy->tx + QSERDES_V4_TX_TX_EMP_POST1_LVL);
4205 writel(0x20, qphy->tx2 + QSERDES_V4_TX_TX_EMP_POST1_LVL);
4206
4207 return 0;
4208}
4209
4210/*
4211 * We need to calibrate the aux setting here as many times
4212 * as the caller tries
4213 */
4214static int qcom_qmp_v4_dp_phy_calibrate(struct qmp_phy *qphy)
4215{
4216 static const u8 cfg1_settings[] = { 0x20, 0x13, 0x23, 0x1d };
4217 u8 val;
4218
4219 qphy->dp_aux_cfg++;
4220 qphy->dp_aux_cfg %= ARRAY_SIZE(cfg1_settings);
4221 val = cfg1_settings[qphy->dp_aux_cfg];
4222
4223 writel(val, qphy->pcs + QSERDES_DP_PHY_AUX_CFG1);
4224
4225 return 0;
4226}
4227
4228static int qcom_qmp_dp_phy_configure(struct phy *phy, union phy_configure_opts *opts)
4229{
4230 const struct phy_configure_opts_dp *dp_opts = &opts->dp;
4231 struct qmp_phy *qphy = phy_get_drvdata(phy);
4232 const struct qmp_phy_cfg *cfg = qphy->cfg;
4233
4234 memcpy(&qphy->dp_opts, dp_opts, sizeof(*dp_opts));
4235 if (qphy->dp_opts.set_voltages) {
4236 cfg->configure_dp_tx(qphy);
4237 qphy->dp_opts.set_voltages = 0;
4238 }
4239
4240 return 0;
4241}
4242
4243static int qcom_qmp_dp_phy_calibrate(struct phy *phy)
4244{
4245 struct qmp_phy *qphy = phy_get_drvdata(phy);
4246 const struct qmp_phy_cfg *cfg = qphy->cfg;
4247
4248 if (cfg->calibrate_dp_phy)
4249 return cfg->calibrate_dp_phy(qphy);
4250
4251 return 0;
4252}
4253
4254static int qcom_qmp_phy_com_init(struct qmp_phy *qphy)
4255{
4256 struct qcom_qmp *qmp = qphy->qmp;
4257 const struct qmp_phy_cfg *cfg = qphy->cfg;
4258 void __iomem *serdes = qphy->serdes;
4259 void __iomem *pcs = qphy->pcs;
4260 void __iomem *dp_com = qmp->dp_com;
4261 int ret, i;
4262
4263 mutex_lock(&qmp->phy_mutex);
4264 if (qmp->init_count++) {
4265 mutex_unlock(&qmp->phy_mutex);
4266 return 0;
4267 }
4268
4269 /* turn on regulator supplies */
4270 ret = regulator_bulk_enable(cfg->num_vregs, qmp->vregs);
4271 if (ret) {
4272 dev_err(qmp->dev, "failed to enable regulators, err=%d\n", ret);
4273 goto err_reg_enable;
4274 }
4275
4276 for (i = 0; i < cfg->num_resets; i++) {
4277 ret = reset_control_assert(qmp->resets[i]);
4278 if (ret) {
4279 dev_err(qmp->dev, "%s reset assert failed\n",
4280 cfg->reset_list[i]);
4281 goto err_rst_assert;
4282 }
4283 }
4284
4285 for (i = cfg->num_resets - 1; i >= 0; i--) {
4286 ret = reset_control_deassert(qmp->resets[i]);
4287 if (ret) {
4288 dev_err(qmp->dev, "%s reset deassert failed\n",
4289 qphy->cfg->reset_list[i]);
4290 goto err_rst;
4291 }
4292 }
4293
4294 ret = clk_bulk_prepare_enable(cfg->num_clks, qmp->clks);
4295 if (ret)
4296 goto err_rst;
4297
4298 if (cfg->has_phy_dp_com_ctrl) {
4299 qphy_setbits(dp_com, QPHY_V3_DP_COM_POWER_DOWN_CTRL,
4300 SW_PWRDN);
4301 /* override hardware control for reset of qmp phy */
4302 qphy_setbits(dp_com, QPHY_V3_DP_COM_RESET_OVRD_CTRL,
4303 SW_DPPHY_RESET_MUX | SW_DPPHY_RESET |
4304 SW_USB3PHY_RESET_MUX | SW_USB3PHY_RESET);
4305
4306 /* Default type-c orientation, i.e CC1 */
4307 qphy_setbits(dp_com, QPHY_V3_DP_COM_TYPEC_CTRL, 0x02);
4308
4309 qphy_setbits(dp_com, QPHY_V3_DP_COM_PHY_MODE_CTRL,
4310 USB3_MODE | DP_MODE);
4311
4312 /* bring both QMP USB and QMP DP PHYs PCS block out of reset */
4313 qphy_clrbits(dp_com, QPHY_V3_DP_COM_RESET_OVRD_CTRL,
4314 SW_DPPHY_RESET_MUX | SW_DPPHY_RESET |
4315 SW_USB3PHY_RESET_MUX | SW_USB3PHY_RESET);
4316
4317 qphy_clrbits(dp_com, QPHY_V3_DP_COM_SWI_CTRL, 0x03);
4318 qphy_clrbits(dp_com, QPHY_V3_DP_COM_SW_RESET, SW_RESET);
4319 }
4320
4321 if (cfg->has_phy_com_ctrl) {
4322 qphy_setbits(serdes, cfg->regs[QPHY_COM_POWER_DOWN_CONTROL],
4323 SW_PWRDN);
4324 } else {
4325 if (cfg->regs[QPHY_PCS_POWER_DOWN_CONTROL])
4326 qphy_setbits(pcs,
4327 cfg->regs[QPHY_PCS_POWER_DOWN_CONTROL],
4328 cfg->pwrdn_ctrl);
4329 else
4330 qphy_setbits(pcs, QPHY_POWER_DOWN_CONTROL,
4331 cfg->pwrdn_ctrl);
4332 }
4333
4334 mutex_unlock(&qmp->phy_mutex);
4335
4336 return 0;
4337
4338err_rst:
4339 while (++i < cfg->num_resets)
4340 reset_control_assert(qmp->resets[i]);
4341err_rst_assert:
4342 regulator_bulk_disable(cfg->num_vregs, qmp->vregs);
4343err_reg_enable:
4344 mutex_unlock(&qmp->phy_mutex);
4345
4346 return ret;
4347}
4348
4349static int qcom_qmp_phy_com_exit(struct qmp_phy *qphy)
4350{
4351 struct qcom_qmp *qmp = qphy->qmp;
4352 const struct qmp_phy_cfg *cfg = qphy->cfg;
4353 void __iomem *serdes = qphy->serdes;
4354 int i = cfg->num_resets;
4355
4356 mutex_lock(&qmp->phy_mutex);
4357 if (--qmp->init_count) {
4358 mutex_unlock(&qmp->phy_mutex);
4359 return 0;
4360 }
4361
4362 reset_control_assert(qmp->ufs_reset);
4363 if (cfg->has_phy_com_ctrl) {
4364 qphy_setbits(serdes, cfg->regs[QPHY_COM_START_CONTROL],
4365 SERDES_START | PCS_START);
4366 qphy_clrbits(serdes, cfg->regs[QPHY_COM_SW_RESET],
4367 SW_RESET);
4368 qphy_setbits(serdes, cfg->regs[QPHY_COM_POWER_DOWN_CONTROL],
4369 SW_PWRDN);
4370 }
4371
4372 while (--i >= 0)
4373 reset_control_assert(qmp->resets[i]);
4374
4375 clk_bulk_disable_unprepare(cfg->num_clks, qmp->clks);
4376
4377 regulator_bulk_disable(cfg->num_vregs, qmp->vregs);
4378
4379 mutex_unlock(&qmp->phy_mutex);
4380
4381 return 0;
4382}
4383
4384static int qcom_qmp_phy_init(struct phy *phy)
4385{
4386 struct qmp_phy *qphy = phy_get_drvdata(phy);
4387 struct qcom_qmp *qmp = qphy->qmp;
4388 const struct qmp_phy_cfg *cfg = qphy->cfg;
4389 int ret;
4390 dev_vdbg(qmp->dev, "Initializing QMP phy\n");
4391
4392 if (cfg->no_pcs_sw_reset) {
4393 /*
4394 * Get UFS reset, which is delayed until now to avoid a
4395 * circular dependency where UFS needs its PHY, but the PHY
4396 * needs this UFS reset.
4397 */
4398 if (!qmp->ufs_reset) {
4399 qmp->ufs_reset =
4400 devm_reset_control_get_exclusive(qmp->dev,
4401 "ufsphy");
4402
4403 if (IS_ERR(qmp->ufs_reset)) {
4404 ret = PTR_ERR(qmp->ufs_reset);
4405 dev_err(qmp->dev,
4406 "failed to get UFS reset: %d\n",
4407 ret);
4408
4409 qmp->ufs_reset = NULL;
4410 return ret;
4411 }
4412 }
4413
4414 ret = reset_control_assert(qmp->ufs_reset);
4415 if (ret)
4416 return ret;
4417 }
4418
4419 ret = qcom_qmp_phy_com_init(qphy);
4420 if (ret)
4421 return ret;
4422
4423 if (cfg->type == PHY_TYPE_DP)
4424 cfg->dp_aux_init(qphy);
4425
4426 return 0;
4427}
4428
4429static int qcom_qmp_phy_power_on(struct phy *phy)
4430{
4431 struct qmp_phy *qphy = phy_get_drvdata(phy);
4432 struct qcom_qmp *qmp = qphy->qmp;
4433 const struct qmp_phy_cfg *cfg = qphy->cfg;
4434 void __iomem *tx = qphy->tx;
4435 void __iomem *rx = qphy->rx;
4436 void __iomem *pcs = qphy->pcs;
4437 void __iomem *pcs_misc = qphy->pcs_misc;
4438 void __iomem *status;
4439 unsigned int mask, val, ready;
4440 int ret;
4441
4442 qcom_qmp_phy_serdes_init(qphy);
4443
4444 if (cfg->has_lane_rst) {
4445 ret = reset_control_deassert(qphy->lane_rst);
4446 if (ret) {
4447 dev_err(qmp->dev, "lane%d reset deassert failed\n",
4448 qphy->index);
4449 goto err_lane_rst;
4450 }
4451 }
4452
4453 ret = clk_prepare_enable(qphy->pipe_clk);
4454 if (ret) {
4455 dev_err(qmp->dev, "pipe_clk enable failed err=%d\n", ret);
4456 goto err_clk_enable;
4457 }
4458
4459 /* Tx, Rx, and PCS configurations */
4460 qcom_qmp_phy_configure_lane(tx, cfg->regs,
4461 cfg->tx_tbl, cfg->tx_tbl_num, 1);
4462 if (cfg->tx_tbl_sec)
4463 qcom_qmp_phy_configure_lane(tx, cfg->regs, cfg->tx_tbl_sec,
4464 cfg->tx_tbl_num_sec, 1);
4465
4466 /* Configuration for other LANE for USB-DP combo PHY */
4467 if (cfg->is_dual_lane_phy) {
4468 qcom_qmp_phy_configure_lane(qphy->tx2, cfg->regs,
4469 cfg->tx_tbl, cfg->tx_tbl_num, 2);
4470 if (cfg->tx_tbl_sec)
4471 qcom_qmp_phy_configure_lane(qphy->tx2, cfg->regs,
4472 cfg->tx_tbl_sec,
4473 cfg->tx_tbl_num_sec, 2);
4474 }
4475
4476 /* Configure special DP tx tunings */
4477 if (cfg->type == PHY_TYPE_DP)
4478 cfg->configure_dp_tx(qphy);
4479
4480 qcom_qmp_phy_configure_lane(rx, cfg->regs,
4481 cfg->rx_tbl, cfg->rx_tbl_num, 1);
4482 if (cfg->rx_tbl_sec)
4483 qcom_qmp_phy_configure_lane(rx, cfg->regs,
4484 cfg->rx_tbl_sec, cfg->rx_tbl_num_sec, 1);
4485
4486 if (cfg->is_dual_lane_phy) {
4487 qcom_qmp_phy_configure_lane(qphy->rx2, cfg->regs,
4488 cfg->rx_tbl, cfg->rx_tbl_num, 2);
4489 if (cfg->rx_tbl_sec)
4490 qcom_qmp_phy_configure_lane(qphy->rx2, cfg->regs,
4491 cfg->rx_tbl_sec,
4492 cfg->rx_tbl_num_sec, 2);
4493 }
4494
4495 /* Configure link rate, swing, etc. */
4496 if (cfg->type == PHY_TYPE_DP) {
4497 cfg->configure_dp_phy(qphy);
4498 } else {
4499 qcom_qmp_phy_configure(pcs, cfg->regs, cfg->pcs_tbl, cfg->pcs_tbl_num);
4500 if (cfg->pcs_tbl_sec)
4501 qcom_qmp_phy_configure(pcs, cfg->regs, cfg->pcs_tbl_sec,
4502 cfg->pcs_tbl_num_sec);
4503 }
4504
4505 ret = reset_control_deassert(qmp->ufs_reset);
4506 if (ret)
4507 goto err_lane_rst;
4508
4509 qcom_qmp_phy_configure(pcs_misc, cfg->regs, cfg->pcs_misc_tbl,
4510 cfg->pcs_misc_tbl_num);
4511 if (cfg->pcs_misc_tbl_sec)
4512 qcom_qmp_phy_configure(pcs_misc, cfg->regs, cfg->pcs_misc_tbl_sec,
4513 cfg->pcs_misc_tbl_num_sec);
4514
4515 /*
4516 * Pull out PHY from POWER DOWN state.
4517 * This is active low enable signal to power-down PHY.
4518 */
4519 if(cfg->type == PHY_TYPE_PCIE)
4520 qphy_setbits(pcs, QPHY_POWER_DOWN_CONTROL, cfg->pwrdn_ctrl);
4521
4522 if (cfg->has_pwrdn_delay)
4523 usleep_range(cfg->pwrdn_delay_min, cfg->pwrdn_delay_max);
4524
4525 if (cfg->type != PHY_TYPE_DP) {
4526 /* Pull PHY out of reset state */
4527 if (!cfg->no_pcs_sw_reset)
4528 qphy_clrbits(pcs, cfg->regs[QPHY_SW_RESET], SW_RESET);
4529 /* start SerDes and Phy-Coding-Sublayer */
4530 qphy_setbits(pcs, cfg->regs[QPHY_START_CTRL], cfg->start_ctrl);
4531
4532 if (cfg->type == PHY_TYPE_UFS) {
4533 status = pcs + cfg->regs[QPHY_PCS_READY_STATUS];
4534 mask = PCS_READY;
4535 ready = PCS_READY;
4536 } else {
4537 status = pcs + cfg->regs[QPHY_PCS_STATUS];
4538 mask = cfg->phy_status;
4539 ready = 0;
4540 }
4541
4542 ret = readl_poll_timeout(status, val, (val & mask) == ready, 10,
4543 PHY_INIT_COMPLETE_TIMEOUT);
4544 if (ret) {
4545 dev_err(qmp->dev, "phy initialization timed-out\n");
4546 goto err_pcs_ready;
4547 }
4548 }
4549 return 0;
4550
4551err_pcs_ready:
4552 clk_disable_unprepare(qphy->pipe_clk);
4553err_clk_enable:
4554 if (cfg->has_lane_rst)
4555 reset_control_assert(qphy->lane_rst);
4556err_lane_rst:
4557 return ret;
4558}
4559
4560static int qcom_qmp_phy_power_off(struct phy *phy)
4561{
4562 struct qmp_phy *qphy = phy_get_drvdata(phy);
4563 const struct qmp_phy_cfg *cfg = qphy->cfg;
4564
4565 clk_disable_unprepare(qphy->pipe_clk);
4566
4567 if (cfg->type == PHY_TYPE_DP) {
4568 /* Assert DP PHY power down */
4569 writel(DP_PHY_PD_CTL_PSR_PWRDN, qphy->pcs + QSERDES_DP_PHY_PD_CTL);
4570 } else {
4571 /* PHY reset */
4572 if (!cfg->no_pcs_sw_reset)
4573 qphy_setbits(qphy->pcs, cfg->regs[QPHY_SW_RESET], SW_RESET);
4574
4575 /* stop SerDes and Phy-Coding-Sublayer */
4576 qphy_clrbits(qphy->pcs, cfg->regs[QPHY_START_CTRL], cfg->start_ctrl);
4577
4578 /* Put PHY into POWER DOWN state: active low */
4579 if (cfg->regs[QPHY_PCS_POWER_DOWN_CONTROL]) {
4580 qphy_clrbits(qphy->pcs, cfg->regs[QPHY_PCS_POWER_DOWN_CONTROL],
4581 cfg->pwrdn_ctrl);
4582 } else {
4583 qphy_clrbits(qphy->pcs, QPHY_POWER_DOWN_CONTROL,
4584 cfg->pwrdn_ctrl);
4585 }
4586 }
4587
4588 return 0;
4589}
4590
4591static int qcom_qmp_phy_exit(struct phy *phy)
4592{
4593 struct qmp_phy *qphy = phy_get_drvdata(phy);
4594 const struct qmp_phy_cfg *cfg = qphy->cfg;
4595
4596 if (cfg->has_lane_rst)
4597 reset_control_assert(qphy->lane_rst);
4598
4599 qcom_qmp_phy_com_exit(qphy);
4600
4601 return 0;
4602}
4603
4604static int qcom_qmp_phy_enable(struct phy *phy)
4605{
4606 int ret;
4607
4608 ret = qcom_qmp_phy_init(phy);
4609 if (ret)
4610 return ret;
4611
4612 ret = qcom_qmp_phy_power_on(phy);
4613 if (ret)
4614 qcom_qmp_phy_exit(phy);
4615
4616 return ret;
4617}
4618
4619static int qcom_qmp_phy_disable(struct phy *phy)
4620{
4621 int ret;
4622
4623 ret = qcom_qmp_phy_power_off(phy);
4624 if (ret)
4625 return ret;
4626 return qcom_qmp_phy_exit(phy);
4627}
4628
4629static int qcom_qmp_phy_set_mode(struct phy *phy,
4630 enum phy_mode mode, int submode)
4631{
4632 struct qmp_phy *qphy = phy_get_drvdata(phy);
4633
4634 qphy->mode = mode;
4635
4636 return 0;
4637}
4638
4639static void qcom_qmp_phy_enable_autonomous_mode(struct qmp_phy *qphy)
4640{
4641 const struct qmp_phy_cfg *cfg = qphy->cfg;
4642 void __iomem *pcs = qphy->pcs;
4643 void __iomem *pcs_misc = qphy->pcs_misc;
4644 u32 intr_mask;
4645
4646 if (qphy->mode == PHY_MODE_USB_HOST_SS ||
4647 qphy->mode == PHY_MODE_USB_DEVICE_SS)
4648 intr_mask = ARCVR_DTCT_EN | ALFPS_DTCT_EN;
4649 else
4650 intr_mask = ARCVR_DTCT_EN | ARCVR_DTCT_EVENT_SEL;
4651
4652 /* Clear any pending interrupts status */
4653 qphy_setbits(pcs, cfg->regs[QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR], IRQ_CLEAR);
4654 /* Writing 1 followed by 0 clears the interrupt */
4655 qphy_clrbits(pcs, cfg->regs[QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR], IRQ_CLEAR);
4656
4657 qphy_clrbits(pcs, cfg->regs[QPHY_PCS_AUTONOMOUS_MODE_CTRL],
4658 ARCVR_DTCT_EN | ALFPS_DTCT_EN | ARCVR_DTCT_EVENT_SEL);
4659
4660 /* Enable required PHY autonomous mode interrupts */
4661 qphy_setbits(pcs, cfg->regs[QPHY_PCS_AUTONOMOUS_MODE_CTRL], intr_mask);
4662
4663 /* Enable i/o clamp_n for autonomous mode */
4664 if (pcs_misc)
4665 qphy_clrbits(pcs_misc, QPHY_V3_PCS_MISC_CLAMP_ENABLE, CLAMP_EN);
4666}
4667
4668static void qcom_qmp_phy_disable_autonomous_mode(struct qmp_phy *qphy)
4669{
4670 const struct qmp_phy_cfg *cfg = qphy->cfg;
4671 void __iomem *pcs = qphy->pcs;
4672 void __iomem *pcs_misc = qphy->pcs_misc;
4673
4674 /* Disable i/o clamp_n on resume for normal mode */
4675 if (pcs_misc)
4676 qphy_setbits(pcs_misc, QPHY_V3_PCS_MISC_CLAMP_ENABLE, CLAMP_EN);
4677
4678 qphy_clrbits(pcs, cfg->regs[QPHY_PCS_AUTONOMOUS_MODE_CTRL],
4679 ARCVR_DTCT_EN | ARCVR_DTCT_EVENT_SEL | ALFPS_DTCT_EN);
4680
4681 qphy_setbits(pcs, cfg->regs[QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR], IRQ_CLEAR);
4682 /* Writing 1 followed by 0 clears the interrupt */
4683 qphy_clrbits(pcs, cfg->regs[QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR], IRQ_CLEAR);
4684}
4685
4686static int __maybe_unused qcom_qmp_phy_runtime_suspend(struct device *dev)
4687{
4688 struct qcom_qmp *qmp = dev_get_drvdata(dev);
4689 struct qmp_phy *qphy = qmp->phys[0];
4690 const struct qmp_phy_cfg *cfg = qphy->cfg;
4691
4692 dev_vdbg(dev, "Suspending QMP phy, mode:%d\n", qphy->mode);
4693
4694 /* Supported only for USB3 PHY and luckily USB3 is the first phy */
4695 if (cfg->type != PHY_TYPE_USB3)
4696 return 0;
4697
4698 if (!qmp->init_count) {
4699 dev_vdbg(dev, "PHY not initialized, bailing out\n");
4700 return 0;
4701 }
4702
4703 qcom_qmp_phy_enable_autonomous_mode(qphy);
4704
4705 clk_disable_unprepare(qphy->pipe_clk);
4706 clk_bulk_disable_unprepare(cfg->num_clks, qmp->clks);
4707
4708 return 0;
4709}
4710
4711static int __maybe_unused qcom_qmp_phy_runtime_resume(struct device *dev)
4712{
4713 struct qcom_qmp *qmp = dev_get_drvdata(dev);
4714 struct qmp_phy *qphy = qmp->phys[0];
4715 const struct qmp_phy_cfg *cfg = qphy->cfg;
4716 int ret = 0;
4717
4718 dev_vdbg(dev, "Resuming QMP phy, mode:%d\n", qphy->mode);
4719
4720 /* Supported only for USB3 PHY and luckily USB3 is the first phy */
4721 if (cfg->type != PHY_TYPE_USB3)
4722 return 0;
4723
4724 if (!qmp->init_count) {
4725 dev_vdbg(dev, "PHY not initialized, bailing out\n");
4726 return 0;
4727 }
4728
4729 ret = clk_bulk_prepare_enable(cfg->num_clks, qmp->clks);
4730 if (ret)
4731 return ret;
4732
4733 ret = clk_prepare_enable(qphy->pipe_clk);
4734 if (ret) {
4735 dev_err(dev, "pipe_clk enable failed, err=%d\n", ret);
4736 clk_bulk_disable_unprepare(cfg->num_clks, qmp->clks);
4737 return ret;
4738 }
4739
4740 qcom_qmp_phy_disable_autonomous_mode(qphy);
4741
4742 return 0;
4743}
4744
4745static int qcom_qmp_phy_vreg_init(struct device *dev, const struct qmp_phy_cfg *cfg)
4746{
4747 struct qcom_qmp *qmp = dev_get_drvdata(dev);
4748 int num = cfg->num_vregs;
4749 int i;
4750
4751 qmp->vregs = devm_kcalloc(dev, num, sizeof(*qmp->vregs), GFP_KERNEL);
4752 if (!qmp->vregs)
4753 return -ENOMEM;
4754
4755 for (i = 0; i < num; i++)
4756 qmp->vregs[i].supply = cfg->vreg_list[i];
4757
4758 return devm_regulator_bulk_get(dev, num, qmp->vregs);
4759}
4760
4761static int qcom_qmp_phy_reset_init(struct device *dev, const struct qmp_phy_cfg *cfg)
4762{
4763 struct qcom_qmp *qmp = dev_get_drvdata(dev);
4764 int i;
4765
4766 qmp->resets = devm_kcalloc(dev, cfg->num_resets,
4767 sizeof(*qmp->resets), GFP_KERNEL);
4768 if (!qmp->resets)
4769 return -ENOMEM;
4770
4771 for (i = 0; i < cfg->num_resets; i++) {
4772 struct reset_control *rst;
4773 const char *name = cfg->reset_list[i];
4774
4775 rst = devm_reset_control_get(dev, name);
4776 if (IS_ERR(rst)) {
4777 dev_err(dev, "failed to get %s reset\n", name);
4778 return PTR_ERR(rst);
4779 }
4780 qmp->resets[i] = rst;
4781 }
4782
4783 return 0;
4784}
4785
4786static int qcom_qmp_phy_clk_init(struct device *dev, const struct qmp_phy_cfg *cfg)
4787{
4788 struct qcom_qmp *qmp = dev_get_drvdata(dev);
4789 int num = cfg->num_clks;
4790 int i;
4791
4792 qmp->clks = devm_kcalloc(dev, num, sizeof(*qmp->clks), GFP_KERNEL);
4793 if (!qmp->clks)
4794 return -ENOMEM;
4795
4796 for (i = 0; i < num; i++)
4797 qmp->clks[i].id = cfg->clk_list[i];
4798
4799 return devm_clk_bulk_get(dev, num, qmp->clks);
4800}
4801
4802static void phy_clk_release_provider(void *res)
4803{
4804 of_clk_del_provider(res);
4805}
4806
4807/*
4808 * Register a fixed rate pipe clock.
4809 *
4810 * The <s>_pipe_clksrc generated by PHY goes to the GCC that gate
4811 * controls it. The <s>_pipe_clk coming out of the GCC is requested
4812 * by the PHY driver for its operations.
4813 * We register the <s>_pipe_clksrc here. The gcc driver takes care
4814 * of assigning this <s>_pipe_clksrc as parent to <s>_pipe_clk.
4815 * Below picture shows this relationship.
4816 *
4817 * +---------------+
4818 * | PHY block |<<---------------------------------------+
4819 * | | |
4820 * | +-------+ | +-----+ |
4821 * I/P---^-->| PLL |---^--->pipe_clksrc--->| GCC |--->pipe_clk---+
4822 * clk | +-------+ | +-----+
4823 * +---------------+
4824 */
4825static int phy_pipe_clk_register(struct qcom_qmp *qmp, struct device_node *np)
4826{
4827 struct clk_fixed_rate *fixed;
4828 struct clk_init_data init = { };
4829 int ret;
4830
4831 ret = of_property_read_string(np, "clock-output-names", &init.name);
4832 if (ret) {
4833 dev_err(qmp->dev, "%pOFn: No clock-output-names\n", np);
4834 return ret;
4835 }
4836
4837 fixed = devm_kzalloc(qmp->dev, sizeof(*fixed), GFP_KERNEL);
4838 if (!fixed)
4839 return -ENOMEM;
4840
4841 init.ops = &clk_fixed_rate_ops;
4842
4843 /* controllers using QMP phys use 125MHz pipe clock interface */
4844 fixed->fixed_rate = 125000000;
4845 fixed->hw.init = &init;
4846
4847 ret = devm_clk_hw_register(qmp->dev, &fixed->hw);
4848 if (ret)
4849 return ret;
4850
4851 ret = of_clk_add_hw_provider(np, of_clk_hw_simple_get, &fixed->hw);
4852 if (ret)
4853 return ret;
4854
4855 /*
4856 * Roll a devm action because the clock provider is the child node, but
4857 * the child node is not actually a device.
4858 */
4859 ret = devm_add_action(qmp->dev, phy_clk_release_provider, np);
4860 if (ret)
4861 phy_clk_release_provider(np);
4862
4863 return ret;
4864}
4865
4866/*
4867 * Display Port PLL driver block diagram for branch clocks
4868 *
4869 * +------------------------------+
4870 * | DP_VCO_CLK |
4871 * | |
4872 * | +-------------------+ |
4873 * | | (DP PLL/VCO) | |
4874 * | +---------+---------+ |
4875 * | v |
4876 * | +----------+-----------+ |
4877 * | | hsclk_divsel_clk_src | |
4878 * | +----------+-----------+ |
4879 * +------------------------------+
4880 * |
4881 * +---------<---------v------------>----------+
4882 * | |
4883 * +--------v----------------+ |
4884 * | dp_phy_pll_link_clk | |
4885 * | link_clk | |
4886 * +--------+----------------+ |
4887 * | |
4888 * | |
4889 * v v
4890 * Input to DISPCC block |
4891 * for link clk, crypto clk |
4892 * and interface clock |
4893 * |
4894 * |
4895 * +--------<------------+-----------------+---<---+
4896 * | | |
4897 * +----v---------+ +--------v-----+ +--------v------+
4898 * | vco_divided | | vco_divided | | vco_divided |
4899 * | _clk_src | | _clk_src | | _clk_src |
4900 * | | | | | |
4901 * |divsel_six | | divsel_two | | divsel_four |
4902 * +-------+------+ +-----+--------+ +--------+------+
4903 * | | |
4904 * v---->----------v-------------<------v
4905 * |
4906 * +----------+-----------------+
4907 * | dp_phy_pll_vco_div_clk |
4908 * +---------+------------------+
4909 * |
4910 * v
4911 * Input to DISPCC block
4912 * for DP pixel clock
4913 *
4914 */
4915static int qcom_qmp_dp_pixel_clk_determine_rate(struct clk_hw *hw,
4916 struct clk_rate_request *req)
4917{
4918 switch (req->rate) {
4919 case 1620000000UL / 2:
4920 case 2700000000UL / 2:
4921 /* 5.4 and 8.1 GHz are same link rate as 2.7GHz, i.e. div 4 and div 6 */
4922 return 0;
4923 default:
4924 return -EINVAL;
4925 }
4926}
4927
4928static unsigned long
4929qcom_qmp_dp_pixel_clk_recalc_rate(struct clk_hw *hw, unsigned long parent_rate)
4930{
4931 const struct qmp_phy_dp_clks *dp_clks;
4932 const struct qmp_phy *qphy;
4933 const struct phy_configure_opts_dp *dp_opts;
4934
4935 dp_clks = container_of(hw, struct qmp_phy_dp_clks, dp_pixel_hw);
4936 qphy = dp_clks->qphy;
4937 dp_opts = &qphy->dp_opts;
4938
4939 switch (dp_opts->link_rate) {
4940 case 1620:
4941 return 1620000000UL / 2;
4942 case 2700:
4943 return 2700000000UL / 2;
4944 case 5400:
4945 return 5400000000UL / 4;
4946 case 8100:
4947 return 8100000000UL / 6;
4948 default:
4949 return 0;
4950 }
4951}
4952
4953static const struct clk_ops qcom_qmp_dp_pixel_clk_ops = {
4954 .determine_rate = qcom_qmp_dp_pixel_clk_determine_rate,
4955 .recalc_rate = qcom_qmp_dp_pixel_clk_recalc_rate,
4956};
4957
4958static int qcom_qmp_dp_link_clk_determine_rate(struct clk_hw *hw,
4959 struct clk_rate_request *req)
4960{
4961 switch (req->rate) {
4962 case 162000000:
4963 case 270000000:
4964 case 540000000:
4965 case 810000000:
4966 return 0;
4967 default:
4968 return -EINVAL;
4969 }
4970}
4971
4972static unsigned long
4973qcom_qmp_dp_link_clk_recalc_rate(struct clk_hw *hw, unsigned long parent_rate)
4974{
4975 const struct qmp_phy_dp_clks *dp_clks;
4976 const struct qmp_phy *qphy;
4977 const struct phy_configure_opts_dp *dp_opts;
4978
4979 dp_clks = container_of(hw, struct qmp_phy_dp_clks, dp_link_hw);
4980 qphy = dp_clks->qphy;
4981 dp_opts = &qphy->dp_opts;
4982
4983 switch (dp_opts->link_rate) {
4984 case 1620:
4985 case 2700:
4986 case 5400:
4987 case 8100:
4988 return dp_opts->link_rate * 100000;
4989 default:
4990 return 0;
4991 }
4992}
4993
4994static const struct clk_ops qcom_qmp_dp_link_clk_ops = {
4995 .determine_rate = qcom_qmp_dp_link_clk_determine_rate,
4996 .recalc_rate = qcom_qmp_dp_link_clk_recalc_rate,
4997};
4998
4999static struct clk_hw *
5000qcom_qmp_dp_clks_hw_get(struct of_phandle_args *clkspec, void *data)
5001{
5002 struct qmp_phy_dp_clks *dp_clks = data;
5003 unsigned int idx = clkspec->args[0];
5004
5005 if (idx >= 2) {
5006 pr_err("%s: invalid index %u\n", __func__, idx);
5007 return ERR_PTR(-EINVAL);
5008 }
5009
5010 if (idx == 0)
5011 return &dp_clks->dp_link_hw;
5012
5013 return &dp_clks->dp_pixel_hw;
5014}
5015
5016static int phy_dp_clks_register(struct qcom_qmp *qmp, struct qmp_phy *qphy,
5017 struct device_node *np)
5018{
5019 struct clk_init_data init = { };
5020 struct qmp_phy_dp_clks *dp_clks;
5021 int ret;
5022
5023 dp_clks = devm_kzalloc(qmp->dev, sizeof(*dp_clks), GFP_KERNEL);
5024 if (!dp_clks)
5025 return -ENOMEM;
5026
5027 dp_clks->qphy = qphy;
5028 qphy->dp_clks = dp_clks;
5029
5030 init.ops = &qcom_qmp_dp_link_clk_ops;
5031 init.name = "qmp_dp_phy_pll_link_clk";
5032 dp_clks->dp_link_hw.init = &init;
5033 ret = devm_clk_hw_register(qmp->dev, &dp_clks->dp_link_hw);
5034 if (ret)
5035 return ret;
5036
5037 init.ops = &qcom_qmp_dp_pixel_clk_ops;
5038 init.name = "qmp_dp_phy_pll_vco_div_clk";
5039 dp_clks->dp_pixel_hw.init = &init;
5040 ret = devm_clk_hw_register(qmp->dev, &dp_clks->dp_pixel_hw);
5041 if (ret)
5042 return ret;
5043
5044 ret = of_clk_add_hw_provider(np, qcom_qmp_dp_clks_hw_get, dp_clks);
5045 if (ret)
5046 return ret;
5047
5048 /*
5049 * Roll a devm action because the clock provider is the child node, but
5050 * the child node is not actually a device.
5051 */
5052 ret = devm_add_action(qmp->dev, phy_clk_release_provider, np);
5053 if (ret)
5054 phy_clk_release_provider(np);
5055
5056 return ret;
5057}
5058
5059static const struct phy_ops qcom_qmp_phy_gen_ops = {
5060 .init = qcom_qmp_phy_enable,
5061 .exit = qcom_qmp_phy_disable,
5062 .set_mode = qcom_qmp_phy_set_mode,
5063 .owner = THIS_MODULE,
5064};
5065
5066static const struct phy_ops qcom_qmp_phy_dp_ops = {
5067 .init = qcom_qmp_phy_init,
5068 .configure = qcom_qmp_dp_phy_configure,
5069 .power_on = qcom_qmp_phy_power_on,
5070 .calibrate = qcom_qmp_dp_phy_calibrate,
5071 .power_off = qcom_qmp_phy_power_off,
5072 .exit = qcom_qmp_phy_exit,
5073 .set_mode = qcom_qmp_phy_set_mode,
5074 .owner = THIS_MODULE,
5075};
5076
5077static const struct phy_ops qcom_qmp_pcie_ufs_ops = {
5078 .power_on = qcom_qmp_phy_enable,
5079 .power_off = qcom_qmp_phy_disable,
5080 .set_mode = qcom_qmp_phy_set_mode,
5081 .owner = THIS_MODULE,
5082};
5083
5084static
5085int qcom_qmp_phy_create(struct device *dev, struct device_node *np, int id,
5086 void __iomem *serdes, const struct qmp_phy_cfg *cfg)
5087{
5088 struct qcom_qmp *qmp = dev_get_drvdata(dev);
5089 struct phy *generic_phy;
5090 struct qmp_phy *qphy;
5091 const struct phy_ops *ops;
5092 char prop_name[MAX_PROP_NAME];
5093 int ret;
5094
5095 qphy = devm_kzalloc(dev, sizeof(*qphy), GFP_KERNEL);
5096 if (!qphy)
5097 return -ENOMEM;
5098
5099 qphy->cfg = cfg;
5100 qphy->serdes = serdes;
5101 /*
5102 * Get memory resources for each phy lane:
5103 * Resources are indexed as: tx -> 0; rx -> 1; pcs -> 2.
5104 * For dual lane PHYs: tx2 -> 3, rx2 -> 4, pcs_misc (optional) -> 5
5105 * For single lane PHYs: pcs_misc (optional) -> 3.
5106 */
5107 qphy->tx = of_iomap(np, 0);
5108 if (!qphy->tx)
5109 return -ENOMEM;
5110
5111 qphy->rx = of_iomap(np, 1);
5112 if (!qphy->rx)
5113 return -ENOMEM;
5114
5115 qphy->pcs = of_iomap(np, 2);
5116 if (!qphy->pcs)
5117 return -ENOMEM;
5118
5119 /*
5120 * If this is a dual-lane PHY, then there should be registers for the
5121 * second lane. Some old device trees did not specify this, so fall
5122 * back to old legacy behavior of assuming they can be reached at an
5123 * offset from the first lane.
5124 */
5125 if (cfg->is_dual_lane_phy) {
5126 qphy->tx2 = of_iomap(np, 3);
5127 qphy->rx2 = of_iomap(np, 4);
5128 if (!qphy->tx2 || !qphy->rx2) {
5129 dev_warn(dev,
5130 "Underspecified device tree, falling back to legacy register regions\n");
5131
5132 /* In the old version, pcs_misc is at index 3. */
5133 qphy->pcs_misc = qphy->tx2;
5134 qphy->tx2 = qphy->tx + QMP_PHY_LEGACY_LANE_STRIDE;
5135 qphy->rx2 = qphy->rx + QMP_PHY_LEGACY_LANE_STRIDE;
5136
5137 } else {
5138 qphy->pcs_misc = of_iomap(np, 5);
5139 }
5140
5141 } else {
5142 qphy->pcs_misc = of_iomap(np, 3);
5143 }
5144
5145 if (!qphy->pcs_misc)
5146 dev_vdbg(dev, "PHY pcs_misc-reg not used\n");
5147
5148 /*
5149 * Get PHY's Pipe clock, if any. USB3 and PCIe are PIPE3
5150 * based phys, so they essentially have pipe clock. So,
5151 * we return error in case phy is USB3 or PIPE type.
5152 * Otherwise, we initialize pipe clock to NULL for
5153 * all phys that don't need this.
5154 */
5155 snprintf(prop_name, sizeof(prop_name), "pipe%d", id);
5156 qphy->pipe_clk = of_clk_get_by_name(np, prop_name);
5157 if (IS_ERR(qphy->pipe_clk)) {
5158 if (cfg->type == PHY_TYPE_PCIE ||
5159 cfg->type == PHY_TYPE_USB3) {
5160 ret = PTR_ERR(qphy->pipe_clk);
5161 if (ret != -EPROBE_DEFER)
5162 dev_err(dev,
5163 "failed to get lane%d pipe_clk, %d\n",
5164 id, ret);
5165 return ret;
5166 }
5167 qphy->pipe_clk = NULL;
5168 }
5169
5170 /* Get lane reset, if any */
5171 if (cfg->has_lane_rst) {
5172 snprintf(prop_name, sizeof(prop_name), "lane%d", id);
5173 qphy->lane_rst = of_reset_control_get(np, prop_name);
5174 if (IS_ERR(qphy->lane_rst)) {
5175 dev_err(dev, "failed to get lane%d reset\n", id);
5176 return PTR_ERR(qphy->lane_rst);
5177 }
5178 }
5179
5180 if (cfg->type == PHY_TYPE_UFS || cfg->type == PHY_TYPE_PCIE)
5181 ops = &qcom_qmp_pcie_ufs_ops;
5182 else if (cfg->type == PHY_TYPE_DP)
5183 ops = &qcom_qmp_phy_dp_ops;
5184 else
5185 ops = &qcom_qmp_phy_gen_ops;
5186
5187 generic_phy = devm_phy_create(dev, np, ops);
5188 if (IS_ERR(generic_phy)) {
5189 ret = PTR_ERR(generic_phy);
5190 dev_err(dev, "failed to create qphy %d\n", ret);
5191 return ret;
5192 }
5193
5194 qphy->phy = generic_phy;
5195 qphy->index = id;
5196 qphy->qmp = qmp;
5197 qmp->phys[id] = qphy;
5198 phy_set_drvdata(generic_phy, qphy);
5199
5200 return 0;
5201}
5202
5203static const struct of_device_id qcom_qmp_phy_of_match_table[] = {
5204 {
5205 .compatible = "qcom,ipq8074-qmp-usb3-phy",
5206 .data = &ipq8074_usb3phy_cfg,
5207 }, {
5208 .compatible = "qcom,msm8996-qmp-pcie-phy",
5209 .data = &msm8996_pciephy_cfg,
5210 }, {
5211 .compatible = "qcom,msm8996-qmp-ufs-phy",
5212 .data = &msm8996_ufs_cfg,
5213 }, {
5214 .compatible = "qcom,msm8996-qmp-usb3-phy",
5215 .data = &msm8996_usb3phy_cfg,
5216 }, {
5217 .compatible = "qcom,msm8998-qmp-pcie-phy",
5218 .data = &msm8998_pciephy_cfg,
5219 }, {
5220 .compatible = "qcom,msm8998-qmp-ufs-phy",
5221 .data = &sdm845_ufsphy_cfg,
5222 }, {
5223 .compatible = "qcom,ipq8074-qmp-pcie-phy",
5224 .data = &ipq8074_pciephy_cfg,
5225 }, {
5226 .compatible = "qcom,ipq6018-qmp-pcie-phy",
5227 .data = &ipq6018_pciephy_cfg,
5228 }, {
5229 .compatible = "qcom,sc7180-qmp-usb3-phy",
5230 .data = &sc7180_usb3phy_cfg,
5231 }, {
5232 .compatible = "qcom,sc7180-qmp-usb3-dp-phy",
5233 /* It's a combo phy */
5234 }, {
5235 .compatible = "qcom,sc8180x-qmp-ufs-phy",
5236 .data = &sm8150_ufsphy_cfg,
5237 }, {
5238 .compatible = "qcom,sc8180x-qmp-usb3-phy",
5239 .data = &sm8150_usb3phy_cfg,
5240 }, {
5241 .compatible = "qcom,sdm845-qhp-pcie-phy",
5242 .data = &sdm845_qhp_pciephy_cfg,
5243 }, {
5244 .compatible = "qcom,sdm845-qmp-pcie-phy",
5245 .data = &sdm845_qmp_pciephy_cfg,
5246 }, {
5247 .compatible = "qcom,sdm845-qmp-usb3-phy",
5248 .data = &qmp_v3_usb3phy_cfg,
5249 }, {
5250 .compatible = "qcom,sdm845-qmp-usb3-uni-phy",
5251 .data = &qmp_v3_usb3_uniphy_cfg,
5252 }, {
5253 .compatible = "qcom,sdm845-qmp-ufs-phy",
5254 .data = &sdm845_ufsphy_cfg,
5255 }, {
5256 .compatible = "qcom,msm8998-qmp-usb3-phy",
5257 .data = &msm8998_usb3phy_cfg,
5258 }, {
5259 .compatible = "qcom,sm8150-qmp-ufs-phy",
5260 .data = &sm8150_ufsphy_cfg,
5261 }, {
5262 .compatible = "qcom,sm8250-qmp-ufs-phy",
5263 .data = &sm8150_ufsphy_cfg,
5264 }, {
5265 .compatible = "qcom,sm8150-qmp-usb3-phy",
5266 .data = &sm8150_usb3phy_cfg,
5267 }, {
5268 .compatible = "qcom,sm8150-qmp-usb3-uni-phy",
5269 .data = &sm8150_usb3_uniphy_cfg,
5270 }, {
5271 .compatible = "qcom,sm8250-qmp-usb3-phy",
5272 .data = &sm8250_usb3phy_cfg,
5273 }, {
5274 .compatible = "qcom,sm8250-qmp-usb3-dp-phy",
5275 /* It's a combo phy */
5276 }, {
5277 .compatible = "qcom,sm8250-qmp-usb3-uni-phy",
5278 .data = &sm8250_usb3_uniphy_cfg,
5279 }, {
5280 .compatible = "qcom,sm8250-qmp-gen3x1-pcie-phy",
5281 .data = &sm8250_qmp_gen3x1_pciephy_cfg,
5282 }, {
5283 .compatible = "qcom,sm8250-qmp-gen3x2-pcie-phy",
5284 .data = &sm8250_qmp_gen3x2_pciephy_cfg,
5285 }, {
5286 .compatible = "qcom,sm8350-qmp-ufs-phy",
5287 .data = &sm8350_ufsphy_cfg,
5288 }, {
5289 .compatible = "qcom,sm8250-qmp-modem-pcie-phy",
5290 .data = &sm8250_qmp_gen3x2_pciephy_cfg,
5291 }, {
5292 .compatible = "qcom,sdx55-qmp-pcie-phy",
5293 .data = &sdx55_qmp_pciephy_cfg,
5294 }, {
5295 .compatible = "qcom,sdx55-qmp-usb3-uni-phy",
5296 .data = &sdx55_usb3_uniphy_cfg,
5297 }, {
5298 .compatible = "qcom,sm8350-qmp-usb3-phy",
5299 .data = &sm8350_usb3phy_cfg,
5300 }, {
5301 .compatible = "qcom,sm8350-qmp-usb3-uni-phy",
5302 .data = &sm8350_usb3_uniphy_cfg,
5303 },
5304 { },
5305};
5306MODULE_DEVICE_TABLE(of, qcom_qmp_phy_of_match_table);
5307
5308static const struct of_device_id qcom_qmp_combo_phy_of_match_table[] = {
5309 {
5310 .compatible = "qcom,sc7180-qmp-usb3-dp-phy",
5311 .data = &sc7180_usb3dpphy_cfg,
5312 },
5313 {
5314 .compatible = "qcom,sm8250-qmp-usb3-dp-phy",
5315 .data = &sm8250_usb3dpphy_cfg,
5316 },
5317 { }
5318};
5319
5320static const struct dev_pm_ops qcom_qmp_phy_pm_ops = {
5321 SET_RUNTIME_PM_OPS(qcom_qmp_phy_runtime_suspend,
5322 qcom_qmp_phy_runtime_resume, NULL)
5323};
5324
5325static int qcom_qmp_phy_probe(struct platform_device *pdev)
5326{
5327 struct qcom_qmp *qmp;
5328 struct device *dev = &pdev->dev;
5329 struct device_node *child;
5330 struct phy_provider *phy_provider;
5331 void __iomem *serdes;
5332 void __iomem *usb_serdes;
5333 void __iomem *dp_serdes = NULL;
5334 const struct qmp_phy_combo_cfg *combo_cfg = NULL;
5335 const struct qmp_phy_cfg *cfg = NULL;
5336 const struct qmp_phy_cfg *usb_cfg = NULL;
5337 const struct qmp_phy_cfg *dp_cfg = NULL;
5338 int num, id, expected_phys;
5339 int ret;
5340
5341 qmp = devm_kzalloc(dev, sizeof(*qmp), GFP_KERNEL);
5342 if (!qmp)
5343 return -ENOMEM;
5344
5345 qmp->dev = dev;
5346 dev_set_drvdata(dev, qmp);
5347
5348 /* Get the specific init parameters of QMP phy */
5349 cfg = of_device_get_match_data(dev);
5350 if (!cfg) {
5351 const struct of_device_id *match;
5352
5353 match = of_match_device(qcom_qmp_combo_phy_of_match_table, dev);
5354 if (!match)
5355 return -EINVAL;
5356
5357 combo_cfg = match->data;
5358 if (!combo_cfg)
5359 return -EINVAL;
5360
5361 usb_cfg = combo_cfg->usb_cfg;
5362 cfg = usb_cfg; /* Setup clks and regulators */
5363 }
5364
5365 /* per PHY serdes; usually located at base address */
5366 usb_serdes = serdes = devm_platform_ioremap_resource(pdev, 0);
5367 if (IS_ERR(serdes))
5368 return PTR_ERR(serdes);
5369
5370 /* per PHY dp_com; if PHY has dp_com control block */
5371 if (combo_cfg || cfg->has_phy_dp_com_ctrl) {
5372 qmp->dp_com = devm_platform_ioremap_resource(pdev, 1);
5373 if (IS_ERR(qmp->dp_com))
5374 return PTR_ERR(qmp->dp_com);
5375 }
5376
5377 if (combo_cfg) {
5378 /* Only two serdes for combo PHY */
5379 dp_serdes = devm_platform_ioremap_resource(pdev, 2);
5380 if (IS_ERR(dp_serdes))
5381 return PTR_ERR(dp_serdes);
5382
5383 dp_cfg = combo_cfg->dp_cfg;
5384 expected_phys = 2;
5385 } else {
5386 expected_phys = cfg->nlanes;
5387 }
5388
5389 mutex_init(&qmp->phy_mutex);
5390
5391 ret = qcom_qmp_phy_clk_init(dev, cfg);
5392 if (ret)
5393 return ret;
5394
5395 ret = qcom_qmp_phy_reset_init(dev, cfg);
5396 if (ret)
5397 return ret;
5398
5399 ret = qcom_qmp_phy_vreg_init(dev, cfg);
5400 if (ret) {
5401 if (ret != -EPROBE_DEFER)
5402 dev_err(dev, "failed to get regulator supplies: %d\n",
5403 ret);
5404 return ret;
5405 }
5406
5407 num = of_get_available_child_count(dev->of_node);
5408 /* do we have a rogue child node ? */
5409 if (num > expected_phys)
5410 return -EINVAL;
5411
5412 qmp->phys = devm_kcalloc(dev, num, sizeof(*qmp->phys), GFP_KERNEL);
5413 if (!qmp->phys)
5414 return -ENOMEM;
5415
5416 pm_runtime_set_active(dev);
5417 pm_runtime_enable(dev);
5418 /*
5419 * Prevent runtime pm from being ON by default. Users can enable
5420 * it using power/control in sysfs.
5421 */
5422 pm_runtime_forbid(dev);
5423
5424 id = 0;
5425 for_each_available_child_of_node(dev->of_node, child) {
5426 if (of_node_name_eq(child, "dp-phy")) {
5427 cfg = dp_cfg;
5428 serdes = dp_serdes;
5429 } else if (of_node_name_eq(child, "usb3-phy")) {
5430 cfg = usb_cfg;
5431 serdes = usb_serdes;
5432 }
5433
5434 /* Create per-lane phy */
5435 ret = qcom_qmp_phy_create(dev, child, id, serdes, cfg);
5436 if (ret) {
5437 dev_err(dev, "failed to create lane%d phy, %d\n",
5438 id, ret);
5439 goto err_node_put;
5440 }
5441
5442 /*
5443 * Register the pipe clock provided by phy.
5444 * See function description to see details of this pipe clock.
5445 */
5446 if (cfg->type == PHY_TYPE_USB3 || cfg->type == PHY_TYPE_PCIE) {
5447 ret = phy_pipe_clk_register(qmp, child);
5448 if (ret) {
5449 dev_err(qmp->dev,
5450 "failed to register pipe clock source\n");
5451 goto err_node_put;
5452 }
5453 } else if (cfg->type == PHY_TYPE_DP) {
5454 ret = phy_dp_clks_register(qmp, qmp->phys[id], child);
5455 if (ret) {
5456 dev_err(qmp->dev,
5457 "failed to register DP clock source\n");
5458 goto err_node_put;
5459 }
5460 }
5461 id++;
5462 }
5463
5464 phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate);
5465 if (!IS_ERR(phy_provider))
5466 dev_info(dev, "Registered Qcom-QMP phy\n");
5467 else
5468 pm_runtime_disable(dev);
5469
5470 return PTR_ERR_OR_ZERO(phy_provider);
5471
5472err_node_put:
5473 pm_runtime_disable(dev);
5474 of_node_put(child);
5475 return ret;
5476}
5477
5478static struct platform_driver qcom_qmp_phy_driver = {
5479 .probe = qcom_qmp_phy_probe,
5480 .driver = {
5481 .name = "qcom-qmp-phy",
5482 .pm = &qcom_qmp_phy_pm_ops,
5483 .of_match_table = qcom_qmp_phy_of_match_table,
5484 },
5485};
5486
5487module_platform_driver(qcom_qmp_phy_driver);
5488
5489MODULE_AUTHOR("Vivek Gautam <vivek.gautam@codeaurora.org>");
5490MODULE_DESCRIPTION("Qualcomm QMP PHY driver");
5491MODULE_LICENSE("GPL v2");