1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * Copyright (c) 2017, The Linux Foundation. All rights reserved.
4*4882a593Smuzhiyun */
5*4882a593Smuzhiyun
6*4882a593Smuzhiyun #include <linux/clk.h>
7*4882a593Smuzhiyun #include <linux/clk-provider.h>
8*4882a593Smuzhiyun #include <linux/delay.h>
9*4882a593Smuzhiyun #include <linux/err.h>
10*4882a593Smuzhiyun #include <linux/io.h>
11*4882a593Smuzhiyun #include <linux/iopoll.h>
12*4882a593Smuzhiyun #include <linux/kernel.h>
13*4882a593Smuzhiyun #include <linux/module.h>
14*4882a593Smuzhiyun #include <linux/of.h>
15*4882a593Smuzhiyun #include <linux/of_device.h>
16*4882a593Smuzhiyun #include <linux/of_address.h>
17*4882a593Smuzhiyun #include <linux/phy/phy.h>
18*4882a593Smuzhiyun #include <linux/platform_device.h>
19*4882a593Smuzhiyun #include <linux/regulator/consumer.h>
20*4882a593Smuzhiyun #include <linux/reset.h>
21*4882a593Smuzhiyun #include <linux/slab.h>
22*4882a593Smuzhiyun
23*4882a593Smuzhiyun #include <dt-bindings/phy/phy.h>
24*4882a593Smuzhiyun
25*4882a593Smuzhiyun #include "phy-qcom-qmp.h"
26*4882a593Smuzhiyun
27*4882a593Smuzhiyun /* QPHY_SW_RESET bit */
28*4882a593Smuzhiyun #define SW_RESET BIT(0)
29*4882a593Smuzhiyun /* QPHY_POWER_DOWN_CONTROL */
30*4882a593Smuzhiyun #define SW_PWRDN BIT(0)
31*4882a593Smuzhiyun #define REFCLK_DRV_DSBL BIT(1)
32*4882a593Smuzhiyun /* QPHY_START_CONTROL bits */
33*4882a593Smuzhiyun #define SERDES_START BIT(0)
34*4882a593Smuzhiyun #define PCS_START BIT(1)
35*4882a593Smuzhiyun #define PLL_READY_GATE_EN BIT(3)
36*4882a593Smuzhiyun /* QPHY_PCS_STATUS bit */
37*4882a593Smuzhiyun #define PHYSTATUS BIT(6)
38*4882a593Smuzhiyun /* QPHY_PCS_READY_STATUS & QPHY_COM_PCS_READY_STATUS bit */
39*4882a593Smuzhiyun #define PCS_READY BIT(0)
40*4882a593Smuzhiyun
41*4882a593Smuzhiyun /* QPHY_V3_DP_COM_RESET_OVRD_CTRL register bits */
42*4882a593Smuzhiyun /* DP PHY soft reset */
43*4882a593Smuzhiyun #define SW_DPPHY_RESET BIT(0)
44*4882a593Smuzhiyun /* mux to select DP PHY reset control, 0:HW control, 1: software reset */
45*4882a593Smuzhiyun #define SW_DPPHY_RESET_MUX BIT(1)
46*4882a593Smuzhiyun /* USB3 PHY soft reset */
47*4882a593Smuzhiyun #define SW_USB3PHY_RESET BIT(2)
48*4882a593Smuzhiyun /* mux to select USB3 PHY reset control, 0:HW control, 1: software reset */
49*4882a593Smuzhiyun #define SW_USB3PHY_RESET_MUX BIT(3)
50*4882a593Smuzhiyun
51*4882a593Smuzhiyun /* QPHY_V3_DP_COM_PHY_MODE_CTRL register bits */
52*4882a593Smuzhiyun #define USB3_MODE BIT(0) /* enables USB3 mode */
53*4882a593Smuzhiyun #define DP_MODE BIT(1) /* enables DP mode */
54*4882a593Smuzhiyun
55*4882a593Smuzhiyun /* QPHY_PCS_AUTONOMOUS_MODE_CTRL register bits */
56*4882a593Smuzhiyun #define ARCVR_DTCT_EN BIT(0)
57*4882a593Smuzhiyun #define ALFPS_DTCT_EN BIT(1)
58*4882a593Smuzhiyun #define ARCVR_DTCT_EVENT_SEL BIT(4)
59*4882a593Smuzhiyun
60*4882a593Smuzhiyun /* QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR register bits */
61*4882a593Smuzhiyun #define IRQ_CLEAR BIT(0)
62*4882a593Smuzhiyun
63*4882a593Smuzhiyun /* QPHY_PCS_LFPS_RXTERM_IRQ_STATUS register bits */
64*4882a593Smuzhiyun #define RCVR_DETECT BIT(0)
65*4882a593Smuzhiyun
66*4882a593Smuzhiyun /* QPHY_V3_PCS_MISC_CLAMP_ENABLE register bits */
67*4882a593Smuzhiyun #define CLAMP_EN BIT(0) /* enables i/o clamp_n */
68*4882a593Smuzhiyun
69*4882a593Smuzhiyun #define PHY_INIT_COMPLETE_TIMEOUT 10000
70*4882a593Smuzhiyun #define POWER_DOWN_DELAY_US_MIN 10
71*4882a593Smuzhiyun #define POWER_DOWN_DELAY_US_MAX 11
72*4882a593Smuzhiyun
73*4882a593Smuzhiyun #define MAX_PROP_NAME 32
74*4882a593Smuzhiyun
75*4882a593Smuzhiyun /* Define the assumed distance between lanes for underspecified device trees. */
76*4882a593Smuzhiyun #define QMP_PHY_LEGACY_LANE_STRIDE 0x400
77*4882a593Smuzhiyun
78*4882a593Smuzhiyun struct qmp_phy_init_tbl {
79*4882a593Smuzhiyun unsigned int offset;
80*4882a593Smuzhiyun unsigned int val;
81*4882a593Smuzhiyun /*
82*4882a593Smuzhiyun * register part of layout ?
83*4882a593Smuzhiyun * if yes, then offset gives index in the reg-layout
84*4882a593Smuzhiyun */
85*4882a593Smuzhiyun bool in_layout;
86*4882a593Smuzhiyun /*
87*4882a593Smuzhiyun * mask of lanes for which this register is written
88*4882a593Smuzhiyun * for cases when second lane needs different values
89*4882a593Smuzhiyun */
90*4882a593Smuzhiyun u8 lane_mask;
91*4882a593Smuzhiyun };
92*4882a593Smuzhiyun
93*4882a593Smuzhiyun #define QMP_PHY_INIT_CFG(o, v) \
94*4882a593Smuzhiyun { \
95*4882a593Smuzhiyun .offset = o, \
96*4882a593Smuzhiyun .val = v, \
97*4882a593Smuzhiyun .lane_mask = 0xff, \
98*4882a593Smuzhiyun }
99*4882a593Smuzhiyun
100*4882a593Smuzhiyun #define QMP_PHY_INIT_CFG_L(o, v) \
101*4882a593Smuzhiyun { \
102*4882a593Smuzhiyun .offset = o, \
103*4882a593Smuzhiyun .val = v, \
104*4882a593Smuzhiyun .in_layout = true, \
105*4882a593Smuzhiyun .lane_mask = 0xff, \
106*4882a593Smuzhiyun }
107*4882a593Smuzhiyun
108*4882a593Smuzhiyun #define QMP_PHY_INIT_CFG_LANE(o, v, l) \
109*4882a593Smuzhiyun { \
110*4882a593Smuzhiyun .offset = o, \
111*4882a593Smuzhiyun .val = v, \
112*4882a593Smuzhiyun .lane_mask = l, \
113*4882a593Smuzhiyun }
114*4882a593Smuzhiyun
115*4882a593Smuzhiyun /* set of registers with offsets different per-PHY */
116*4882a593Smuzhiyun enum qphy_reg_layout {
117*4882a593Smuzhiyun /* Common block control registers */
118*4882a593Smuzhiyun QPHY_COM_SW_RESET,
119*4882a593Smuzhiyun QPHY_COM_POWER_DOWN_CONTROL,
120*4882a593Smuzhiyun QPHY_COM_START_CONTROL,
121*4882a593Smuzhiyun QPHY_COM_PCS_READY_STATUS,
122*4882a593Smuzhiyun /* PCS registers */
123*4882a593Smuzhiyun QPHY_PLL_LOCK_CHK_DLY_TIME,
124*4882a593Smuzhiyun QPHY_FLL_CNTRL1,
125*4882a593Smuzhiyun QPHY_FLL_CNTRL2,
126*4882a593Smuzhiyun QPHY_FLL_CNT_VAL_L,
127*4882a593Smuzhiyun QPHY_FLL_CNT_VAL_H_TOL,
128*4882a593Smuzhiyun QPHY_FLL_MAN_CODE,
129*4882a593Smuzhiyun QPHY_SW_RESET,
130*4882a593Smuzhiyun QPHY_START_CTRL,
131*4882a593Smuzhiyun QPHY_PCS_READY_STATUS,
132*4882a593Smuzhiyun QPHY_PCS_STATUS,
133*4882a593Smuzhiyun QPHY_PCS_AUTONOMOUS_MODE_CTRL,
134*4882a593Smuzhiyun QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR,
135*4882a593Smuzhiyun QPHY_PCS_LFPS_RXTERM_IRQ_STATUS,
136*4882a593Smuzhiyun QPHY_PCS_POWER_DOWN_CONTROL,
137*4882a593Smuzhiyun /* Keep last to ensure regs_layout arrays are properly initialized */
138*4882a593Smuzhiyun QPHY_LAYOUT_SIZE
139*4882a593Smuzhiyun };
140*4882a593Smuzhiyun
141*4882a593Smuzhiyun static const unsigned int msm8996_ufsphy_regs_layout[QPHY_LAYOUT_SIZE] = {
142*4882a593Smuzhiyun [QPHY_START_CTRL] = 0x00,
143*4882a593Smuzhiyun [QPHY_PCS_READY_STATUS] = 0x168,
144*4882a593Smuzhiyun };
145*4882a593Smuzhiyun
146*4882a593Smuzhiyun static const unsigned int pciephy_regs_layout[QPHY_LAYOUT_SIZE] = {
147*4882a593Smuzhiyun [QPHY_COM_SW_RESET] = 0x400,
148*4882a593Smuzhiyun [QPHY_COM_POWER_DOWN_CONTROL] = 0x404,
149*4882a593Smuzhiyun [QPHY_COM_START_CONTROL] = 0x408,
150*4882a593Smuzhiyun [QPHY_COM_PCS_READY_STATUS] = 0x448,
151*4882a593Smuzhiyun [QPHY_PLL_LOCK_CHK_DLY_TIME] = 0xa8,
152*4882a593Smuzhiyun [QPHY_FLL_CNTRL1] = 0xc4,
153*4882a593Smuzhiyun [QPHY_FLL_CNTRL2] = 0xc8,
154*4882a593Smuzhiyun [QPHY_FLL_CNT_VAL_L] = 0xcc,
155*4882a593Smuzhiyun [QPHY_FLL_CNT_VAL_H_TOL] = 0xd0,
156*4882a593Smuzhiyun [QPHY_FLL_MAN_CODE] = 0xd4,
157*4882a593Smuzhiyun [QPHY_SW_RESET] = 0x00,
158*4882a593Smuzhiyun [QPHY_START_CTRL] = 0x08,
159*4882a593Smuzhiyun [QPHY_PCS_STATUS] = 0x174,
160*4882a593Smuzhiyun };
161*4882a593Smuzhiyun
162*4882a593Smuzhiyun static const unsigned int usb3phy_regs_layout[QPHY_LAYOUT_SIZE] = {
163*4882a593Smuzhiyun [QPHY_FLL_CNTRL1] = 0xc0,
164*4882a593Smuzhiyun [QPHY_FLL_CNTRL2] = 0xc4,
165*4882a593Smuzhiyun [QPHY_FLL_CNT_VAL_L] = 0xc8,
166*4882a593Smuzhiyun [QPHY_FLL_CNT_VAL_H_TOL] = 0xcc,
167*4882a593Smuzhiyun [QPHY_FLL_MAN_CODE] = 0xd0,
168*4882a593Smuzhiyun [QPHY_SW_RESET] = 0x00,
169*4882a593Smuzhiyun [QPHY_START_CTRL] = 0x08,
170*4882a593Smuzhiyun [QPHY_PCS_STATUS] = 0x17c,
171*4882a593Smuzhiyun [QPHY_PCS_AUTONOMOUS_MODE_CTRL] = 0x0d4,
172*4882a593Smuzhiyun [QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR] = 0x0d8,
173*4882a593Smuzhiyun [QPHY_PCS_LFPS_RXTERM_IRQ_STATUS] = 0x178,
174*4882a593Smuzhiyun };
175*4882a593Smuzhiyun
176*4882a593Smuzhiyun static const unsigned int qmp_v3_usb3phy_regs_layout[QPHY_LAYOUT_SIZE] = {
177*4882a593Smuzhiyun [QPHY_SW_RESET] = 0x00,
178*4882a593Smuzhiyun [QPHY_START_CTRL] = 0x08,
179*4882a593Smuzhiyun [QPHY_PCS_STATUS] = 0x174,
180*4882a593Smuzhiyun [QPHY_PCS_AUTONOMOUS_MODE_CTRL] = 0x0d8,
181*4882a593Smuzhiyun [QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR] = 0x0dc,
182*4882a593Smuzhiyun [QPHY_PCS_LFPS_RXTERM_IRQ_STATUS] = 0x170,
183*4882a593Smuzhiyun };
184*4882a593Smuzhiyun
185*4882a593Smuzhiyun static const unsigned int sdm845_qmp_pciephy_regs_layout[QPHY_LAYOUT_SIZE] = {
186*4882a593Smuzhiyun [QPHY_SW_RESET] = 0x00,
187*4882a593Smuzhiyun [QPHY_START_CTRL] = 0x08,
188*4882a593Smuzhiyun [QPHY_PCS_STATUS] = 0x174,
189*4882a593Smuzhiyun };
190*4882a593Smuzhiyun
191*4882a593Smuzhiyun static const unsigned int sdm845_qhp_pciephy_regs_layout[QPHY_LAYOUT_SIZE] = {
192*4882a593Smuzhiyun [QPHY_SW_RESET] = 0x00,
193*4882a593Smuzhiyun [QPHY_START_CTRL] = 0x08,
194*4882a593Smuzhiyun [QPHY_PCS_STATUS] = 0x2ac,
195*4882a593Smuzhiyun };
196*4882a593Smuzhiyun
197*4882a593Smuzhiyun static const unsigned int qmp_v4_usb3phy_regs_layout[QPHY_LAYOUT_SIZE] = {
198*4882a593Smuzhiyun [QPHY_SW_RESET] = 0x00,
199*4882a593Smuzhiyun [QPHY_START_CTRL] = 0x44,
200*4882a593Smuzhiyun [QPHY_PCS_STATUS] = 0x14,
201*4882a593Smuzhiyun [QPHY_PCS_POWER_DOWN_CONTROL] = 0x40,
202*4882a593Smuzhiyun [QPHY_PCS_AUTONOMOUS_MODE_CTRL] = 0x308,
203*4882a593Smuzhiyun [QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR] = 0x314,
204*4882a593Smuzhiyun };
205*4882a593Smuzhiyun
206*4882a593Smuzhiyun static const unsigned int qmp_v4_usb3_uniphy_regs_layout[QPHY_LAYOUT_SIZE] = {
207*4882a593Smuzhiyun [QPHY_SW_RESET] = 0x00,
208*4882a593Smuzhiyun [QPHY_START_CTRL] = 0x44,
209*4882a593Smuzhiyun [QPHY_PCS_STATUS] = 0x14,
210*4882a593Smuzhiyun [QPHY_PCS_POWER_DOWN_CONTROL] = 0x40,
211*4882a593Smuzhiyun [QPHY_PCS_AUTONOMOUS_MODE_CTRL] = 0x608,
212*4882a593Smuzhiyun [QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR] = 0x614,
213*4882a593Smuzhiyun };
214*4882a593Smuzhiyun
215*4882a593Smuzhiyun static const unsigned int sdm845_ufsphy_regs_layout[QPHY_LAYOUT_SIZE] = {
216*4882a593Smuzhiyun [QPHY_START_CTRL] = 0x00,
217*4882a593Smuzhiyun [QPHY_PCS_READY_STATUS] = 0x160,
218*4882a593Smuzhiyun };
219*4882a593Smuzhiyun
220*4882a593Smuzhiyun static const unsigned int sm8150_ufsphy_regs_layout[QPHY_LAYOUT_SIZE] = {
221*4882a593Smuzhiyun [QPHY_START_CTRL] = QPHY_V4_PCS_UFS_PHY_START,
222*4882a593Smuzhiyun [QPHY_PCS_READY_STATUS] = QPHY_V4_PCS_UFS_READY_STATUS,
223*4882a593Smuzhiyun [QPHY_SW_RESET] = QPHY_V4_PCS_UFS_SW_RESET,
224*4882a593Smuzhiyun };
225*4882a593Smuzhiyun
226*4882a593Smuzhiyun static const struct qmp_phy_init_tbl ipq8074_usb3_serdes_tbl[] = {
227*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_SYSCLK_EN_SEL, 0x1a),
228*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_BIAS_EN_CLKBUFLR_EN, 0x08),
229*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_CLK_SELECT, 0x30),
230*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_BG_TRIM, 0x0f),
231*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_RX_UCDR_FASTLOCK_FO_GAIN, 0x0b),
232*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_SVS_MODE_CLK_SEL, 0x01),
233*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_HSCLK_SEL, 0x00),
234*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_CMN_CONFIG, 0x06),
235*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_PLL_IVCO, 0x0f),
236*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_SYS_CLK_CTRL, 0x06),
237*4882a593Smuzhiyun /* PLL and Loop filter settings */
238*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_DEC_START_MODE0, 0x82),
239*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START1_MODE0, 0x55),
240*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START2_MODE0, 0x55),
241*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START3_MODE0, 0x03),
242*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_CP_CTRL_MODE0, 0x0b),
243*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_PLL_RCTRL_MODE0, 0x16),
244*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_PLL_CCTRL_MODE0, 0x28),
245*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_INTEGLOOP_GAIN0_MODE0, 0x80),
246*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP1_MODE0, 0x15),
247*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP2_MODE0, 0x34),
248*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP3_MODE0, 0x00),
249*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_CORE_CLK_EN, 0x00),
250*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP_CFG, 0x00),
251*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE_MAP, 0x00),
252*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_BG_TIMER, 0x0a),
253*4882a593Smuzhiyun /* SSC settings */
254*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_SSC_EN_CENTER, 0x01),
255*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_SSC_PER1, 0x31),
256*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_SSC_PER2, 0x01),
257*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_SSC_ADJ_PER1, 0x00),
258*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_SSC_ADJ_PER2, 0x00),
259*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_SSC_STEP_SIZE1, 0xde),
260*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_SSC_STEP_SIZE2, 0x07),
261*4882a593Smuzhiyun };
262*4882a593Smuzhiyun
263*4882a593Smuzhiyun static const struct qmp_phy_init_tbl ipq8074_usb3_rx_tbl[] = {
264*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_RX_UCDR_SO_GAIN, 0x06),
265*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQU_ADAPTOR_CNTRL2, 0x02),
266*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQU_ADAPTOR_CNTRL3, 0x4c),
267*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQU_ADAPTOR_CNTRL4, 0xb8),
268*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x77),
269*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_RX_RX_OFFSET_ADAPTOR_CNTRL2, 0x80),
270*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_RX_SIGDET_CNTRL, 0x03),
271*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_RX_SIGDET_DEGLITCH_CNTRL, 0x16),
272*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_RX_SIGDET_ENABLES, 0x0),
273*4882a593Smuzhiyun };
274*4882a593Smuzhiyun
275*4882a593Smuzhiyun static const struct qmp_phy_init_tbl ipq8074_usb3_pcs_tbl[] = {
276*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V0, 0x15),
277*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V0, 0x0e),
278*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNTRL2, 0x83),
279*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNTRL1, 0x02),
280*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNT_VAL_L, 0x09),
281*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNT_VAL_H_TOL, 0xa2),
282*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_MAN_CODE, 0x85),
283*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_LOCK_DETECT_CONFIG1, 0xd1),
284*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_LOCK_DETECT_CONFIG2, 0x1f),
285*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_LOCK_DETECT_CONFIG3, 0x47),
286*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_POWER_STATE_CONFIG2, 0x1b),
287*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_RXEQTRAINING_WAIT_TIME, 0x75),
288*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_RXEQTRAINING_RUN_TIME, 0x13),
289*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_LFPS_TX_ECSTART_EQTLOCK, 0x86),
290*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_PWRUP_RESET_DLY_TIME_AUXCLK, 0x04),
291*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_TSYNC_RSYNC_TIME, 0x44),
292*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_P1U2_L, 0xe7),
293*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_P1U2_H, 0x03),
294*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_U3_L, 0x40),
295*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_U3_H, 0x00),
296*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_RX_SIGDET_LVL, 0x88),
297*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V0, 0x17),
298*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V0, 0x0f),
299*4882a593Smuzhiyun };
300*4882a593Smuzhiyun
301*4882a593Smuzhiyun static const struct qmp_phy_init_tbl msm8996_pcie_serdes_tbl[] = {
302*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_BIAS_EN_CLKBUFLR_EN, 0x1c),
303*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_CLK_ENABLE1, 0x10),
304*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_CLK_SELECT, 0x33),
305*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_CMN_CONFIG, 0x06),
306*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP_EN, 0x42),
307*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE_MAP, 0x00),
308*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE_TIMER1, 0xff),
309*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE_TIMER2, 0x1f),
310*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_HSCLK_SEL, 0x01),
311*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_SVS_MODE_CLK_SEL, 0x01),
312*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_CORE_CLK_EN, 0x00),
313*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_CORECLK_DIV, 0x0a),
314*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_BG_TIMER, 0x09),
315*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_DEC_START_MODE0, 0x82),
316*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START3_MODE0, 0x03),
317*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START2_MODE0, 0x55),
318*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START1_MODE0, 0x55),
319*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP3_MODE0, 0x00),
320*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP2_MODE0, 0x1a),
321*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP1_MODE0, 0x0a),
322*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_CLK_SELECT, 0x33),
323*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_SYS_CLK_CTRL, 0x02),
324*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_SYSCLK_BUF_ENABLE, 0x1f),
325*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_SYSCLK_EN_SEL, 0x04),
326*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_CP_CTRL_MODE0, 0x0b),
327*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_PLL_RCTRL_MODE0, 0x16),
328*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_PLL_CCTRL_MODE0, 0x28),
329*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_INTEGLOOP_GAIN1_MODE0, 0x00),
330*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_INTEGLOOP_GAIN0_MODE0, 0x80),
331*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_SSC_EN_CENTER, 0x01),
332*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_SSC_PER1, 0x31),
333*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_SSC_PER2, 0x01),
334*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_SSC_ADJ_PER1, 0x02),
335*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_SSC_ADJ_PER2, 0x00),
336*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_SSC_STEP_SIZE1, 0x2f),
337*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_SSC_STEP_SIZE2, 0x19),
338*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_RESCODE_DIV_NUM, 0x15),
339*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_BG_TRIM, 0x0f),
340*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_PLL_IVCO, 0x0f),
341*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_CLK_EP_DIV, 0x19),
342*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_CLK_ENABLE1, 0x10),
343*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_HSCLK_SEL, 0x00),
344*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_RESCODE_DIV_NUM, 0x40),
345*4882a593Smuzhiyun };
346*4882a593Smuzhiyun
347*4882a593Smuzhiyun static const struct qmp_phy_init_tbl msm8996_pcie_tx_tbl[] = {
348*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_TX_HIGHZ_TRANSCEIVEREN_BIAS_DRVR_EN, 0x45),
349*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_TX_LANE_MODE, 0x06),
350*4882a593Smuzhiyun };
351*4882a593Smuzhiyun
352*4882a593Smuzhiyun static const struct qmp_phy_init_tbl msm8996_pcie_rx_tbl[] = {
353*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_RX_SIGDET_ENABLES, 0x1c),
354*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQU_ADAPTOR_CNTRL2, 0x01),
355*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQU_ADAPTOR_CNTRL3, 0x00),
356*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQU_ADAPTOR_CNTRL4, 0xdb),
357*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_RX_RX_BAND, 0x18),
358*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_RX_UCDR_SO_GAIN, 0x04),
359*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_RX_UCDR_SO_GAIN_HALF, 0x04),
360*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x4b),
361*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_RX_SIGDET_DEGLITCH_CNTRL, 0x14),
362*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_RX_SIGDET_LVL, 0x19),
363*4882a593Smuzhiyun };
364*4882a593Smuzhiyun
365*4882a593Smuzhiyun static const struct qmp_phy_init_tbl msm8996_pcie_pcs_tbl[] = {
366*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_RX_IDLE_DTCT_CNTRL, 0x4c),
367*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_PWRUP_RESET_DLY_TIME_AUXCLK, 0x00),
368*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_LP_WAKEUP_DLY_TIME_AUXCLK, 0x01),
369*4882a593Smuzhiyun
370*4882a593Smuzhiyun QMP_PHY_INIT_CFG_L(QPHY_PLL_LOCK_CHK_DLY_TIME, 0x05),
371*4882a593Smuzhiyun
372*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_ENDPOINT_REFCLK_DRIVE, 0x05),
373*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_POWER_DOWN_CONTROL, 0x02),
374*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_POWER_STATE_CONFIG4, 0x00),
375*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_POWER_STATE_CONFIG1, 0xa3),
376*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_TXDEEMPH_M3P5DB_V0, 0x0e),
377*4882a593Smuzhiyun };
378*4882a593Smuzhiyun
379*4882a593Smuzhiyun static const struct qmp_phy_init_tbl msm8998_pcie_serdes_tbl[] = {
380*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_BIAS_EN_CLKBUFLR_EN, 0x14),
381*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_CLK_SELECT, 0x30),
382*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_IVCO, 0x0f),
383*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_CMN_CONFIG, 0x06),
384*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP_EN, 0x01),
385*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_RESETSM_CNTRL, 0x20),
386*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_MAP, 0x00),
387*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE2_MODE0, 0x01),
388*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE1_MODE0, 0xc9),
389*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_TIMER1, 0xff),
390*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_TIMER2, 0x3f),
391*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_SVS_MODE_CLK_SEL, 0x01),
392*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_CORE_CLK_EN, 0x00),
393*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_CORECLK_DIV_MODE0, 0x0a),
394*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_CLK_EP_DIV, 0x19),
395*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_CLK_ENABLE1, 0x90),
396*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_DEC_START_MODE0, 0x82),
397*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START3_MODE0, 0x03),
398*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START2_MODE0, 0x55),
399*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START1_MODE0, 0x55),
400*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP3_MODE0, 0x00),
401*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP2_MODE0, 0x0d),
402*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP1_MODE0, 0x04),
403*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_HSCLK_SEL, 0x00),
404*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_CP_CTRL_MODE0, 0x08),
405*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_RCTRL_MODE0, 0x16),
406*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_CCTRL_MODE0, 0x34),
407*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_CMN_CONFIG, 0x06),
408*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_CLK_SELECT, 0x33),
409*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYS_CLK_CTRL, 0x02),
410*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYSCLK_BUF_ENABLE, 0x07),
411*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYSCLK_EN_SEL, 0x04),
412*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN1_MODE0, 0x00),
413*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN0_MODE0, 0x3f),
414*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_BG_TIMER, 0x09),
415*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_EN_CENTER, 0x01),
416*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_PER1, 0x40),
417*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_PER2, 0x01),
418*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_ADJ_PER1, 0x02),
419*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_ADJ_PER2, 0x00),
420*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_STEP_SIZE1, 0x7e),
421*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_STEP_SIZE2, 0x15),
422*4882a593Smuzhiyun };
423*4882a593Smuzhiyun
424*4882a593Smuzhiyun static const struct qmp_phy_init_tbl msm8998_pcie_tx_tbl[] = {
425*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_TX_RES_CODE_LANE_OFFSET_TX, 0x02),
426*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_TX_RCV_DETECT_LVL_2, 0x12),
427*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_TX_HIGHZ_DRVR_EN, 0x10),
428*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_TX_LANE_MODE_1, 0x06),
429*4882a593Smuzhiyun };
430*4882a593Smuzhiyun
431*4882a593Smuzhiyun static const struct qmp_phy_init_tbl msm8998_pcie_rx_tbl[] = {
432*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_CNTRL, 0x03),
433*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_ENABLES, 0x1c),
434*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_DEGLITCH_CNTRL, 0x14),
435*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0a),
436*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL3, 0x04),
437*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL4, 0x1a),
438*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x4b),
439*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_SO_GAIN, 0x04),
440*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_SO_GAIN_HALF, 0x04),
441*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x00),
442*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_OFFSET_ADAPTOR_CNTRL2, 0x80),
443*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_INTERFACE_MODE, 0x40),
444*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_PI_CONTROLS, 0x71),
445*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_FASTLOCK_COUNT_LOW, 0x40),
446*4882a593Smuzhiyun };
447*4882a593Smuzhiyun
448*4882a593Smuzhiyun static const struct qmp_phy_init_tbl msm8998_pcie_pcs_tbl[] = {
449*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_ENDPOINT_REFCLK_DRIVE, 0x04),
450*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_OSC_DTCT_ACTIONS, 0x00),
451*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_PWRUP_RESET_DLY_TIME_AUXCLK, 0x01),
452*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_L1SS_WAKEUP_DLY_TIME_AUXCLK_MSB, 0x00),
453*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_L1SS_WAKEUP_DLY_TIME_AUXCLK_LSB, 0x20),
454*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_LP_WAKEUP_DLY_TIME_AUXCLK_MSB, 0x00),
455*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_LP_WAKEUP_DLY_TIME_AUXCLK, 0x01),
456*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_PLL_LOCK_CHK_DLY_TIME, 0x73),
457*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_RX_SIGDET_LVL, 0x99),
458*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_SIGDET_CNTRL, 0x03),
459*4882a593Smuzhiyun };
460*4882a593Smuzhiyun
461*4882a593Smuzhiyun static const struct qmp_phy_init_tbl msm8996_ufs_serdes_tbl[] = {
462*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_POWER_DOWN_CONTROL, 0x01),
463*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_CMN_CONFIG, 0x0e),
464*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_SYSCLK_EN_SEL, 0xd7),
465*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_CLK_SELECT, 0x30),
466*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_SYS_CLK_CTRL, 0x06),
467*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_BIAS_EN_CLKBUFLR_EN, 0x08),
468*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_BG_TIMER, 0x0a),
469*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_HSCLK_SEL, 0x05),
470*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_CORECLK_DIV, 0x0a),
471*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_CORECLK_DIV_MODE1, 0x0a),
472*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP_EN, 0x01),
473*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE_CTRL, 0x10),
474*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_RESETSM_CNTRL, 0x20),
475*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_CORE_CLK_EN, 0x00),
476*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP_CFG, 0x00),
477*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE_TIMER1, 0xff),
478*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE_TIMER2, 0x3f),
479*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE_MAP, 0x54),
480*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_SVS_MODE_CLK_SEL, 0x05),
481*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_DEC_START_MODE0, 0x82),
482*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START1_MODE0, 0x00),
483*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START2_MODE0, 0x00),
484*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START3_MODE0, 0x00),
485*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_CP_CTRL_MODE0, 0x0b),
486*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_PLL_RCTRL_MODE0, 0x16),
487*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_PLL_CCTRL_MODE0, 0x28),
488*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_INTEGLOOP_GAIN0_MODE0, 0x80),
489*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_INTEGLOOP_GAIN1_MODE0, 0x00),
490*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE1_MODE0, 0x28),
491*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE2_MODE0, 0x02),
492*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP1_MODE0, 0xff),
493*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP2_MODE0, 0x0c),
494*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP3_MODE0, 0x00),
495*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_DEC_START_MODE1, 0x98),
496*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START1_MODE1, 0x00),
497*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START2_MODE1, 0x00),
498*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START3_MODE1, 0x00),
499*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_CP_CTRL_MODE1, 0x0b),
500*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_PLL_RCTRL_MODE1, 0x16),
501*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_PLL_CCTRL_MODE1, 0x28),
502*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_INTEGLOOP_GAIN0_MODE1, 0x80),
503*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_INTEGLOOP_GAIN1_MODE1, 0x00),
504*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE1_MODE1, 0xd6),
505*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE2_MODE1, 0x00),
506*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP1_MODE1, 0x32),
507*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP2_MODE1, 0x0f),
508*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP3_MODE1, 0x00),
509*4882a593Smuzhiyun };
510*4882a593Smuzhiyun
511*4882a593Smuzhiyun static const struct qmp_phy_init_tbl msm8996_ufs_tx_tbl[] = {
512*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_TX_HIGHZ_TRANSCEIVEREN_BIAS_DRVR_EN, 0x45),
513*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_TX_LANE_MODE, 0x02),
514*4882a593Smuzhiyun };
515*4882a593Smuzhiyun
516*4882a593Smuzhiyun static const struct qmp_phy_init_tbl msm8996_ufs_rx_tbl[] = {
517*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_RX_SIGDET_LVL, 0x24),
518*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_RX_SIGDET_CNTRL, 0x02),
519*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_RX_RX_INTERFACE_MODE, 0x00),
520*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_RX_SIGDET_DEGLITCH_CNTRL, 0x18),
521*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_RX_UCDR_FASTLOCK_FO_GAIN, 0x0B),
522*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_RX_RX_TERM_BW, 0x5b),
523*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQ_GAIN1_LSB, 0xff),
524*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQ_GAIN1_MSB, 0x3f),
525*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQ_GAIN2_LSB, 0xff),
526*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQ_GAIN2_MSB, 0x0f),
527*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0E),
528*4882a593Smuzhiyun };
529*4882a593Smuzhiyun
530*4882a593Smuzhiyun static const struct qmp_phy_init_tbl msm8996_usb3_serdes_tbl[] = {
531*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_SYSCLK_EN_SEL, 0x14),
532*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_BIAS_EN_CLKBUFLR_EN, 0x08),
533*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_CLK_SELECT, 0x30),
534*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_CMN_CONFIG, 0x06),
535*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_SVS_MODE_CLK_SEL, 0x01),
536*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_HSCLK_SEL, 0x00),
537*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_BG_TRIM, 0x0f),
538*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_PLL_IVCO, 0x0f),
539*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_SYS_CLK_CTRL, 0x04),
540*4882a593Smuzhiyun /* PLL and Loop filter settings */
541*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_DEC_START_MODE0, 0x82),
542*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START1_MODE0, 0x55),
543*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START2_MODE0, 0x55),
544*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START3_MODE0, 0x03),
545*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_CP_CTRL_MODE0, 0x0b),
546*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_PLL_RCTRL_MODE0, 0x16),
547*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_PLL_CCTRL_MODE0, 0x28),
548*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_INTEGLOOP_GAIN0_MODE0, 0x80),
549*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE_CTRL, 0x00),
550*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP1_MODE0, 0x15),
551*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP2_MODE0, 0x34),
552*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP3_MODE0, 0x00),
553*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_CORE_CLK_EN, 0x00),
554*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP_CFG, 0x00),
555*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE_MAP, 0x00),
556*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_BG_TIMER, 0x0a),
557*4882a593Smuzhiyun /* SSC settings */
558*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_SSC_EN_CENTER, 0x01),
559*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_SSC_PER1, 0x31),
560*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_SSC_PER2, 0x01),
561*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_SSC_ADJ_PER1, 0x00),
562*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_SSC_ADJ_PER2, 0x00),
563*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_SSC_STEP_SIZE1, 0xde),
564*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_SSC_STEP_SIZE2, 0x07),
565*4882a593Smuzhiyun };
566*4882a593Smuzhiyun
567*4882a593Smuzhiyun static const struct qmp_phy_init_tbl msm8996_usb3_tx_tbl[] = {
568*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_TX_HIGHZ_TRANSCEIVEREN_BIAS_DRVR_EN, 0x45),
569*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_TX_RCV_DETECT_LVL_2, 0x12),
570*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_TX_LANE_MODE, 0x06),
571*4882a593Smuzhiyun };
572*4882a593Smuzhiyun
573*4882a593Smuzhiyun static const struct qmp_phy_init_tbl msm8996_usb3_rx_tbl[] = {
574*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_RX_UCDR_FASTLOCK_FO_GAIN, 0x0b),
575*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_RX_UCDR_SO_GAIN, 0x04),
576*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQU_ADAPTOR_CNTRL2, 0x02),
577*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQU_ADAPTOR_CNTRL3, 0x4c),
578*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQU_ADAPTOR_CNTRL4, 0xbb),
579*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x77),
580*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_RX_RX_OFFSET_ADAPTOR_CNTRL2, 0x80),
581*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_RX_SIGDET_CNTRL, 0x03),
582*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_RX_SIGDET_LVL, 0x18),
583*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_RX_SIGDET_DEGLITCH_CNTRL, 0x16),
584*4882a593Smuzhiyun };
585*4882a593Smuzhiyun
586*4882a593Smuzhiyun static const struct qmp_phy_init_tbl msm8996_usb3_pcs_tbl[] = {
587*4882a593Smuzhiyun /* FLL settings */
588*4882a593Smuzhiyun QMP_PHY_INIT_CFG_L(QPHY_FLL_CNTRL2, 0x03),
589*4882a593Smuzhiyun QMP_PHY_INIT_CFG_L(QPHY_FLL_CNTRL1, 0x02),
590*4882a593Smuzhiyun QMP_PHY_INIT_CFG_L(QPHY_FLL_CNT_VAL_L, 0x09),
591*4882a593Smuzhiyun QMP_PHY_INIT_CFG_L(QPHY_FLL_CNT_VAL_H_TOL, 0x42),
592*4882a593Smuzhiyun QMP_PHY_INIT_CFG_L(QPHY_FLL_MAN_CODE, 0x85),
593*4882a593Smuzhiyun
594*4882a593Smuzhiyun /* Lock Det settings */
595*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_LOCK_DETECT_CONFIG1, 0xd1),
596*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_LOCK_DETECT_CONFIG2, 0x1f),
597*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_LOCK_DETECT_CONFIG3, 0x47),
598*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_POWER_STATE_CONFIG2, 0x08),
599*4882a593Smuzhiyun };
600*4882a593Smuzhiyun
601*4882a593Smuzhiyun static const struct qmp_phy_init_tbl ipq8074_pcie_serdes_tbl[] = {
602*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_BIAS_EN_CLKBUFLR_EN, 0x18),
603*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_CLK_ENABLE1, 0x10),
604*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_BG_TRIM, 0xf),
605*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP_EN, 0x1),
606*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE_MAP, 0x0),
607*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE_TIMER1, 0xff),
608*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE_TIMER2, 0x1f),
609*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_CMN_CONFIG, 0x6),
610*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_PLL_IVCO, 0xf),
611*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_HSCLK_SEL, 0x0),
612*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_SVS_MODE_CLK_SEL, 0x1),
613*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_CORE_CLK_EN, 0x20),
614*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_CORECLK_DIV, 0xa),
615*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_RESETSM_CNTRL, 0x20),
616*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_BG_TIMER, 0xa),
617*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_SYSCLK_EN_SEL, 0xa),
618*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_DEC_START_MODE0, 0x82),
619*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START3_MODE0, 0x3),
620*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START2_MODE0, 0x55),
621*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START1_MODE0, 0x55),
622*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP3_MODE0, 0x0),
623*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP2_MODE0, 0xD),
624*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP1_MODE0, 0xD04),
625*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_CLK_SELECT, 0x33),
626*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_SYS_CLK_CTRL, 0x2),
627*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_SYSCLK_BUF_ENABLE, 0x1f),
628*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_CP_CTRL_MODE0, 0xb),
629*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_PLL_RCTRL_MODE0, 0x16),
630*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_PLL_CCTRL_MODE0, 0x28),
631*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_INTEGLOOP_GAIN1_MODE0, 0x0),
632*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_INTEGLOOP_GAIN0_MODE0, 0x80),
633*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_BIAS_EN_CTRL_BY_PSM, 0x1),
634*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_SSC_EN_CENTER, 0x1),
635*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_SSC_PER1, 0x31),
636*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_SSC_PER2, 0x1),
637*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_SSC_ADJ_PER1, 0x2),
638*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_SSC_ADJ_PER2, 0x0),
639*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_SSC_STEP_SIZE1, 0x2f),
640*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_SSC_STEP_SIZE2, 0x19),
641*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_COM_CLK_EP_DIV, 0x19),
642*4882a593Smuzhiyun };
643*4882a593Smuzhiyun
644*4882a593Smuzhiyun static const struct qmp_phy_init_tbl ipq8074_pcie_tx_tbl[] = {
645*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_TX_HIGHZ_TRANSCEIVEREN_BIAS_DRVR_EN, 0x45),
646*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_TX_LANE_MODE, 0x6),
647*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_TX_RES_CODE_LANE_OFFSET, 0x2),
648*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_TX_RCV_DETECT_LVL_2, 0x12),
649*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_TX_EMP_POST1_LVL, 0x36),
650*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_TX_SLEW_CNTL, 0x0a),
651*4882a593Smuzhiyun };
652*4882a593Smuzhiyun
653*4882a593Smuzhiyun static const struct qmp_phy_init_tbl ipq8074_pcie_rx_tbl[] = {
654*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_RX_SIGDET_ENABLES, 0x1c),
655*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_RX_SIGDET_DEGLITCH_CNTRL, 0x14),
656*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQU_ADAPTOR_CNTRL2, 0x1),
657*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQU_ADAPTOR_CNTRL3, 0x0),
658*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQU_ADAPTOR_CNTRL4, 0xdb),
659*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x4b),
660*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_RX_UCDR_SO_GAIN, 0x4),
661*4882a593Smuzhiyun };
662*4882a593Smuzhiyun
663*4882a593Smuzhiyun static const struct qmp_phy_init_tbl ipq8074_pcie_pcs_tbl[] = {
664*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_ENDPOINT_REFCLK_DRIVE, 0x4),
665*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_OSC_DTCT_ACTIONS, 0x0),
666*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_PWRUP_RESET_DLY_TIME_AUXCLK, 0x40),
667*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_L1SS_WAKEUP_DLY_TIME_AUXCLK_MSB, 0x0),
668*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_L1SS_WAKEUP_DLY_TIME_AUXCLK_LSB, 0x40),
669*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_PLL_LOCK_CHK_DLY_TIME_AUXCLK_LSB, 0x0),
670*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_LP_WAKEUP_DLY_TIME_AUXCLK, 0x40),
671*4882a593Smuzhiyun QMP_PHY_INIT_CFG_L(QPHY_PLL_LOCK_CHK_DLY_TIME, 0x73),
672*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_RX_SIGDET_LVL, 0x99),
673*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_TXDEEMPH_M6DB_V0, 0x15),
674*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_TXDEEMPH_M3P5DB_V0, 0xe),
675*4882a593Smuzhiyun QMP_PHY_INIT_CFG_L(QPHY_SW_RESET, 0x0),
676*4882a593Smuzhiyun QMP_PHY_INIT_CFG_L(QPHY_START_CTRL, 0x3),
677*4882a593Smuzhiyun };
678*4882a593Smuzhiyun
679*4882a593Smuzhiyun static const struct qmp_phy_init_tbl sdm845_qmp_pcie_serdes_tbl[] = {
680*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_BIAS_EN_CLKBUFLR_EN, 0x14),
681*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_CLK_SELECT, 0x30),
682*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_IVCO, 0x007),
683*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_CMN_CONFIG, 0x06),
684*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP_EN, 0x01),
685*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_RESETSM_CNTRL, 0x20),
686*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_MAP, 0x00),
687*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE2_MODE0, 0x01),
688*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE1_MODE0, 0xc9),
689*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_TIMER1, 0xff),
690*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_TIMER2, 0x3f),
691*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_SVS_MODE_CLK_SEL, 0x01),
692*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_CORE_CLK_EN, 0x00),
693*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_CORECLK_DIV_MODE0, 0x0a),
694*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_CLK_EP_DIV, 0x19),
695*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_CLK_ENABLE1, 0x90),
696*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_DEC_START_MODE0, 0x82),
697*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START3_MODE0, 0x02),
698*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START2_MODE0, 0xea),
699*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START1_MODE0, 0xab),
700*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP3_MODE0, 0x00),
701*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP2_MODE0, 0x0d),
702*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP1_MODE0, 0x04),
703*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_HSCLK_SEL, 0x00),
704*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_CP_CTRL_MODE0, 0x06),
705*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_RCTRL_MODE0, 0x16),
706*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_CCTRL_MODE0, 0x36),
707*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_CMN_MODE, 0x01),
708*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_CLK_SELECT, 0x33),
709*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYS_CLK_CTRL, 0x02),
710*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYSCLK_BUF_ENABLE, 0x06),
711*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYSCLK_EN_SEL, 0x04),
712*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN1_MODE0, 0x00),
713*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN0_MODE0, 0x3f),
714*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_BG_TIMER, 0x09),
715*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_EN_CENTER, 0x01),
716*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_PER1, 0x40),
717*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_PER2, 0x01),
718*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_ADJ_PER1, 0x02),
719*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_ADJ_PER2, 0x00),
720*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_STEP_SIZE1, 0x7e),
721*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_STEP_SIZE2, 0x15),
722*4882a593Smuzhiyun };
723*4882a593Smuzhiyun
724*4882a593Smuzhiyun static const struct qmp_phy_init_tbl sdm845_qmp_pcie_tx_tbl[] = {
725*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_TX_RES_CODE_LANE_OFFSET_TX, 0x02),
726*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_TX_RCV_DETECT_LVL_2, 0x12),
727*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_TX_HIGHZ_DRVR_EN, 0x10),
728*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_TX_LANE_MODE_1, 0x06),
729*4882a593Smuzhiyun };
730*4882a593Smuzhiyun
731*4882a593Smuzhiyun static const struct qmp_phy_init_tbl sdm845_qmp_pcie_rx_tbl[] = {
732*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_CNTRL, 0x03),
733*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_ENABLES, 0x10),
734*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_DEGLITCH_CNTRL, 0x14),
735*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0e),
736*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL3, 0x04),
737*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL4, 0x1a),
738*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x4b),
739*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_SO_GAIN, 0x04),
740*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_SO_GAIN_HALF, 0x04),
741*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x71),
742*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_MODE_00, 0x59),
743*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_MODE_01, 0x59),
744*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_OFFSET_ADAPTOR_CNTRL2, 0x80),
745*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_INTERFACE_MODE, 0x40),
746*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_PI_CONTROLS, 0x71),
747*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_FASTLOCK_COUNT_LOW, 0x40),
748*4882a593Smuzhiyun };
749*4882a593Smuzhiyun
750*4882a593Smuzhiyun static const struct qmp_phy_init_tbl sdm845_qmp_pcie_pcs_tbl[] = {
751*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_ENDPOINT_REFCLK_DRIVE, 0x04),
752*4882a593Smuzhiyun
753*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNTRL2, 0x83),
754*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNT_VAL_L, 0x09),
755*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNT_VAL_H_TOL, 0xa2),
756*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_MAN_CODE, 0x40),
757*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNTRL1, 0x02),
758*4882a593Smuzhiyun
759*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_OSC_DTCT_ACTIONS, 0x00),
760*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_PWRUP_RESET_DLY_TIME_AUXCLK, 0x01),
761*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_L1SS_WAKEUP_DLY_TIME_AUXCLK_MSB, 0x00),
762*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_L1SS_WAKEUP_DLY_TIME_AUXCLK_LSB, 0x20),
763*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_LP_WAKEUP_DLY_TIME_AUXCLK_MSB, 0x00),
764*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_LP_WAKEUP_DLY_TIME_AUXCLK, 0x01),
765*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_PLL_LOCK_CHK_DLY_TIME, 0x73),
766*4882a593Smuzhiyun
767*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_RX_SIGDET_LVL, 0xbb),
768*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_SIGDET_CNTRL, 0x03),
769*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_REFGEN_REQ_CONFIG1, 0x0d),
770*4882a593Smuzhiyun
771*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_POWER_STATE_CONFIG4, 0x00),
772*4882a593Smuzhiyun };
773*4882a593Smuzhiyun
774*4882a593Smuzhiyun static const struct qmp_phy_init_tbl sdm845_qmp_pcie_pcs_misc_tbl[] = {
775*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_MISC_OSC_DTCT_CONFIG2, 0x52),
776*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_MISC_OSC_DTCT_MODE2_CONFIG2, 0x10),
777*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_MISC_OSC_DTCT_MODE2_CONFIG4, 0x1a),
778*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_MISC_OSC_DTCT_MODE2_CONFIG5, 0x06),
779*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_MISC_PCIE_INT_AUX_CLK_CONFIG1, 0x00),
780*4882a593Smuzhiyun };
781*4882a593Smuzhiyun
782*4882a593Smuzhiyun static const struct qmp_phy_init_tbl sdm845_qhp_pcie_serdes_tbl[] = {
783*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_SYSCLK_EN_SEL, 0x27),
784*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_SSC_EN_CENTER, 0x01),
785*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_SSC_PER1, 0x31),
786*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_SSC_PER2, 0x01),
787*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_SSC_STEP_SIZE1, 0xde),
788*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_SSC_STEP_SIZE2, 0x07),
789*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_SSC_STEP_SIZE1_MODE1, 0x4c),
790*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_SSC_STEP_SIZE2_MODE1, 0x06),
791*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_BIAS_EN_CKBUFLR_EN, 0x18),
792*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_CLK_ENABLE1, 0xb0),
793*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_LOCK_CMP1_MODE0, 0x8c),
794*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_LOCK_CMP2_MODE0, 0x20),
795*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_LOCK_CMP1_MODE1, 0x14),
796*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_LOCK_CMP2_MODE1, 0x34),
797*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_CP_CTRL_MODE0, 0x06),
798*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_CP_CTRL_MODE1, 0x06),
799*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_PLL_RCTRL_MODE0, 0x16),
800*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_PLL_RCTRL_MODE1, 0x16),
801*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_PLL_CCTRL_MODE0, 0x36),
802*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_PLL_CCTRL_MODE1, 0x36),
803*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_RESTRIM_CTRL2, 0x05),
804*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_LOCK_CMP_EN, 0x42),
805*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_DEC_START_MODE0, 0x82),
806*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_DEC_START_MODE1, 0x68),
807*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_DIV_FRAC_START1_MODE0, 0x55),
808*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_DIV_FRAC_START2_MODE0, 0x55),
809*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_DIV_FRAC_START3_MODE0, 0x03),
810*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_DIV_FRAC_START1_MODE1, 0xab),
811*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_DIV_FRAC_START2_MODE1, 0xaa),
812*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_DIV_FRAC_START3_MODE1, 0x02),
813*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_INTEGLOOP_GAIN0_MODE0, 0x3f),
814*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_INTEGLOOP_GAIN0_MODE1, 0x3f),
815*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_VCO_TUNE_MAP, 0x10),
816*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_CLK_SELECT, 0x04),
817*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_HSCLK_SEL1, 0x30),
818*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_CORECLK_DIV, 0x04),
819*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_CORE_CLK_EN, 0x73),
820*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_CMN_CONFIG, 0x0c),
821*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_SVS_MODE_CLK_SEL, 0x15),
822*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_CORECLK_DIV_MODE1, 0x04),
823*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_CMN_MODE, 0x01),
824*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_VREGCLK_DIV1, 0x22),
825*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_VREGCLK_DIV2, 0x00),
826*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_BGV_TRIM, 0x20),
827*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_COM_BG_CTRL, 0x07),
828*4882a593Smuzhiyun };
829*4882a593Smuzhiyun
830*4882a593Smuzhiyun static const struct qmp_phy_init_tbl sdm845_qhp_pcie_tx_tbl[] = {
831*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_DRVR_CTRL0, 0x00),
832*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_DRVR_TAP_EN, 0x0d),
833*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_TX_BAND_MODE, 0x01),
834*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_LANE_MODE, 0x1a),
835*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_PARALLEL_RATE, 0x2f),
836*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_CML_CTRL_MODE0, 0x09),
837*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_CML_CTRL_MODE1, 0x09),
838*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_CML_CTRL_MODE2, 0x1b),
839*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_PREAMP_CTRL_MODE1, 0x01),
840*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_PREAMP_CTRL_MODE2, 0x07),
841*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_MIXER_CTRL_MODE0, 0x31),
842*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_MIXER_CTRL_MODE1, 0x31),
843*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_MIXER_CTRL_MODE2, 0x03),
844*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_CTLE_THRESH_DFE, 0x02),
845*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_CGA_THRESH_DFE, 0x00),
846*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_RXENGINE_EN0, 0x12),
847*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_CTLE_TRAIN_TIME, 0x25),
848*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_CTLE_DFE_OVRLP_TIME, 0x00),
849*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_DFE_REFRESH_TIME, 0x05),
850*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_DFE_ENABLE_TIME, 0x01),
851*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_VGA_GAIN, 0x26),
852*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_DFE_GAIN, 0x12),
853*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_EQ_GAIN, 0x04),
854*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_OFFSET_GAIN, 0x04),
855*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_PRE_GAIN, 0x09),
856*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_EQ_INTVAL, 0x15),
857*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_EDAC_INITVAL, 0x28),
858*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_RXEQ_INITB0, 0x7f),
859*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_RXEQ_INITB1, 0x07),
860*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_RCVRDONE_THRESH1, 0x04),
861*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_RXEQ_CTRL, 0x70),
862*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_UCDR_FO_GAIN_MODE0, 0x8b),
863*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_UCDR_FO_GAIN_MODE1, 0x08),
864*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_UCDR_FO_GAIN_MODE2, 0x0a),
865*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_UCDR_SO_GAIN_MODE0, 0x03),
866*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_UCDR_SO_GAIN_MODE1, 0x04),
867*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_UCDR_SO_GAIN_MODE2, 0x04),
868*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_UCDR_SO_CONFIG, 0x0c),
869*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_RX_BAND, 0x02),
870*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_RX_RCVR_PATH1_MODE0, 0x5c),
871*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_RX_RCVR_PATH1_MODE1, 0x3e),
872*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_RX_RCVR_PATH1_MODE2, 0x3f),
873*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_SIGDET_ENABLES, 0x01),
874*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_SIGDET_CNTRL, 0xa0),
875*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_SIGDET_DEGLITCH_CNTRL, 0x08),
876*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_DCC_GAIN, 0x01),
877*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_RX_EN_SIGNAL, 0xc3),
878*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_PSM_RX_EN_CAL, 0x00),
879*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_RX_MISC_CNTRL0, 0xbc),
880*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_TS0_TIMER, 0x7f),
881*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_DLL_HIGHDATARATE, 0x15),
882*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_DRVR_CTRL1, 0x0c),
883*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_DRVR_CTRL2, 0x0f),
884*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_RX_RESETCODE_OFFSET, 0x04),
885*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_VGA_INITVAL, 0x20),
886*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_L0_RSM_START, 0x01),
887*4882a593Smuzhiyun };
888*4882a593Smuzhiyun
889*4882a593Smuzhiyun static const struct qmp_phy_init_tbl sdm845_qhp_pcie_rx_tbl[] = {
890*4882a593Smuzhiyun };
891*4882a593Smuzhiyun
892*4882a593Smuzhiyun static const struct qmp_phy_init_tbl sdm845_qhp_pcie_pcs_tbl[] = {
893*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_PHY_POWER_STATE_CONFIG, 0x3f),
894*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_PHY_PCS_TX_RX_CONFIG, 0x50),
895*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_PHY_TXMGN_MAIN_V0_M3P5DB, 0x19),
896*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_PHY_TXMGN_POST_V0_M3P5DB, 0x07),
897*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_PHY_TXMGN_MAIN_V0_M6DB, 0x17),
898*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_PHY_TXMGN_POST_V0_M6DB, 0x09),
899*4882a593Smuzhiyun QMP_PHY_INIT_CFG(PCIE_GEN3_QHP_PHY_POWER_STATE_CONFIG5, 0x9f),
900*4882a593Smuzhiyun };
901*4882a593Smuzhiyun
902*4882a593Smuzhiyun static const struct qmp_phy_init_tbl qmp_v3_usb3_serdes_tbl[] = {
903*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_IVCO, 0x07),
904*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYSCLK_EN_SEL, 0x14),
905*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_BIAS_EN_CLKBUFLR_EN, 0x08),
906*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_CLK_SELECT, 0x30),
907*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYS_CLK_CTRL, 0x02),
908*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_RESETSM_CNTRL2, 0x08),
909*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_CMN_CONFIG, 0x16),
910*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_SVS_MODE_CLK_SEL, 0x01),
911*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_HSCLK_SEL, 0x80),
912*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_DEC_START_MODE0, 0x82),
913*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START1_MODE0, 0xab),
914*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START2_MODE0, 0xea),
915*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START3_MODE0, 0x02),
916*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_CP_CTRL_MODE0, 0x06),
917*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_RCTRL_MODE0, 0x16),
918*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_CCTRL_MODE0, 0x36),
919*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN1_MODE0, 0x00),
920*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN0_MODE0, 0x3f),
921*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE2_MODE0, 0x01),
922*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE1_MODE0, 0xc9),
923*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_CORECLK_DIV_MODE0, 0x0a),
924*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP3_MODE0, 0x00),
925*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP2_MODE0, 0x34),
926*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP1_MODE0, 0x15),
927*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP_EN, 0x04),
928*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_CORE_CLK_EN, 0x00),
929*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP_CFG, 0x00),
930*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_MAP, 0x00),
931*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYSCLK_BUF_ENABLE, 0x0a),
932*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_EN_CENTER, 0x01),
933*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_PER1, 0x31),
934*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_PER2, 0x01),
935*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_ADJ_PER1, 0x00),
936*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_ADJ_PER2, 0x00),
937*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_STEP_SIZE1, 0x85),
938*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_STEP_SIZE2, 0x07),
939*4882a593Smuzhiyun };
940*4882a593Smuzhiyun
941*4882a593Smuzhiyun static const struct qmp_phy_init_tbl qmp_v3_usb3_tx_tbl[] = {
942*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_TX_HIGHZ_DRVR_EN, 0x10),
943*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_TX_RCV_DETECT_LVL_2, 0x12),
944*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_TX_LANE_MODE_1, 0x16),
945*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_TX_RES_CODE_LANE_OFFSET_RX, 0x09),
946*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_TX_RES_CODE_LANE_OFFSET_TX, 0x06),
947*4882a593Smuzhiyun };
948*4882a593Smuzhiyun
949*4882a593Smuzhiyun static const struct qmp_phy_init_tbl qmp_v3_dp_serdes_tbl[] = {
950*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_SVS_MODE_CLK_SEL, 0x01),
951*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYSCLK_EN_SEL, 0x37),
952*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYS_CLK_CTRL, 0x02),
953*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_CLK_ENABLE1, 0x0e),
954*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYSCLK_BUF_ENABLE, 0x06),
955*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_CLK_SELECT, 0x30),
956*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_CMN_CONFIG, 0x02),
957*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START1_MODE0, 0x00),
958*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN0_MODE0, 0x3f),
959*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN1_MODE0, 0x00),
960*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_MAP, 0x00),
961*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP3_MODE0, 0x00),
962*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_BG_TIMER, 0x0a),
963*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_CORECLK_DIV_MODE0, 0x0a),
964*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_CTRL, 0x00),
965*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_BIAS_EN_CLKBUFLR_EN, 0x3f),
966*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_CORE_CLK_EN, 0x1f),
967*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_IVCO, 0x07),
968*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_CCTRL_MODE0, 0x36),
969*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_RCTRL_MODE0, 0x16),
970*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_CP_CTRL_MODE0, 0x06),
971*4882a593Smuzhiyun };
972*4882a593Smuzhiyun
973*4882a593Smuzhiyun static const struct qmp_phy_init_tbl qmp_v3_dp_serdes_tbl_rbr[] = {
974*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_HSCLK_SEL, 0x0c),
975*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_DEC_START_MODE0, 0x69),
976*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START2_MODE0, 0x80),
977*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START3_MODE0, 0x07),
978*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP1_MODE0, 0x6f),
979*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP2_MODE0, 0x08),
980*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP_EN, 0x00),
981*4882a593Smuzhiyun };
982*4882a593Smuzhiyun
983*4882a593Smuzhiyun static const struct qmp_phy_init_tbl qmp_v3_dp_serdes_tbl_hbr[] = {
984*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_HSCLK_SEL, 0x04),
985*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_DEC_START_MODE0, 0x69),
986*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START2_MODE0, 0x80),
987*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START3_MODE0, 0x07),
988*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP1_MODE0, 0x0f),
989*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP2_MODE0, 0x0e),
990*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP_EN, 0x00),
991*4882a593Smuzhiyun };
992*4882a593Smuzhiyun
993*4882a593Smuzhiyun static const struct qmp_phy_init_tbl qmp_v3_dp_serdes_tbl_hbr2[] = {
994*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_HSCLK_SEL, 0x00),
995*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_DEC_START_MODE0, 0x8c),
996*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START2_MODE0, 0x00),
997*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START3_MODE0, 0x0a),
998*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP1_MODE0, 0x1f),
999*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP2_MODE0, 0x1c),
1000*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP_EN, 0x00),
1001*4882a593Smuzhiyun };
1002*4882a593Smuzhiyun
1003*4882a593Smuzhiyun static const struct qmp_phy_init_tbl qmp_v3_dp_serdes_tbl_hbr3[] = {
1004*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_HSCLK_SEL, 0x03),
1005*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_DEC_START_MODE0, 0x69),
1006*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START2_MODE0, 0x80),
1007*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START3_MODE0, 0x07),
1008*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP1_MODE0, 0x2f),
1009*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP2_MODE0, 0x2a),
1010*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP_EN, 0x08),
1011*4882a593Smuzhiyun };
1012*4882a593Smuzhiyun
1013*4882a593Smuzhiyun static const struct qmp_phy_init_tbl qmp_v3_dp_tx_tbl[] = {
1014*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_TX_TRANSCEIVER_BIAS_EN, 0x1a),
1015*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_TX_VMODE_CTRL1, 0x40),
1016*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_TX_PRE_STALL_LDO_BOOST_EN, 0x30),
1017*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_TX_INTERFACE_SELECT, 0x3d),
1018*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_TX_CLKBUF_ENABLE, 0x0f),
1019*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_TX_RESET_TSYNC_EN, 0x03),
1020*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_TX_TRAN_DRVR_EMP_EN, 0x03),
1021*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_TX_PARRATE_REC_DETECT_IDLE_EN, 0x00),
1022*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_TX_TX_INTERFACE_MODE, 0x00),
1023*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_TX_TX_BAND, 0x4),
1024*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_TX_TX_POL_INV, 0x0a),
1025*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_TX_TX_DRV_LVL, 0x38),
1026*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_TX_TX_EMP_POST1_LVL, 0x20),
1027*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_TX_RES_CODE_LANE_OFFSET_TX, 0x06),
1028*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_TX_RES_CODE_LANE_OFFSET_RX, 0x07),
1029*4882a593Smuzhiyun };
1030*4882a593Smuzhiyun
1031*4882a593Smuzhiyun static const struct qmp_phy_init_tbl qmp_v3_usb3_rx_tbl[] = {
1032*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_FASTLOCK_FO_GAIN, 0x0b),
1033*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0f),
1034*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL3, 0x4e),
1035*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL4, 0x18),
1036*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x77),
1037*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_OFFSET_ADAPTOR_CNTRL2, 0x80),
1038*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_CNTRL, 0x03),
1039*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_DEGLITCH_CNTRL, 0x16),
1040*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x75),
1041*4882a593Smuzhiyun };
1042*4882a593Smuzhiyun
1043*4882a593Smuzhiyun static const struct qmp_phy_init_tbl qmp_v3_usb3_pcs_tbl[] = {
1044*4882a593Smuzhiyun /* FLL settings */
1045*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNTRL2, 0x83),
1046*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNT_VAL_L, 0x09),
1047*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNT_VAL_H_TOL, 0xa2),
1048*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_MAN_CODE, 0x40),
1049*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNTRL1, 0x02),
1050*4882a593Smuzhiyun
1051*4882a593Smuzhiyun /* Lock Det settings */
1052*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_LOCK_DETECT_CONFIG1, 0xd1),
1053*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_LOCK_DETECT_CONFIG2, 0x1f),
1054*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_LOCK_DETECT_CONFIG3, 0x47),
1055*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_POWER_STATE_CONFIG2, 0x1b),
1056*4882a593Smuzhiyun
1057*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_RX_SIGDET_LVL, 0xba),
1058*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V0, 0x9f),
1059*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V1, 0x9f),
1060*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V2, 0xb7),
1061*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V3, 0x4e),
1062*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V4, 0x65),
1063*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_LS, 0x6b),
1064*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V0, 0x15),
1065*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V0, 0x0d),
1066*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V1, 0x15),
1067*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V1, 0x0d),
1068*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V2, 0x15),
1069*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V2, 0x0d),
1070*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V3, 0x15),
1071*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V3, 0x1d),
1072*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V4, 0x15),
1073*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V4, 0x0d),
1074*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_LS, 0x15),
1075*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_LS, 0x0d),
1076*4882a593Smuzhiyun
1077*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_RATE_SLEW_CNTRL, 0x02),
1078*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_PWRUP_RESET_DLY_TIME_AUXCLK, 0x04),
1079*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_TSYNC_RSYNC_TIME, 0x44),
1080*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_PWRUP_RESET_DLY_TIME_AUXCLK, 0x04),
1081*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_P1U2_L, 0xe7),
1082*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_P1U2_H, 0x03),
1083*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_U3_L, 0x40),
1084*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_U3_H, 0x00),
1085*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_RXEQTRAINING_WAIT_TIME, 0x75),
1086*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_LFPS_TX_ECSTART_EQTLOCK, 0x86),
1087*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_RXEQTRAINING_RUN_TIME, 0x13),
1088*4882a593Smuzhiyun };
1089*4882a593Smuzhiyun
1090*4882a593Smuzhiyun static const struct qmp_phy_init_tbl qmp_v3_usb3_uniphy_serdes_tbl[] = {
1091*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_IVCO, 0x07),
1092*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYSCLK_EN_SEL, 0x14),
1093*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_BIAS_EN_CLKBUFLR_EN, 0x04),
1094*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_CLK_SELECT, 0x30),
1095*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYS_CLK_CTRL, 0x02),
1096*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_RESETSM_CNTRL2, 0x08),
1097*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_CMN_CONFIG, 0x06),
1098*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_SVS_MODE_CLK_SEL, 0x01),
1099*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_HSCLK_SEL, 0x80),
1100*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_DEC_START_MODE0, 0x82),
1101*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START1_MODE0, 0xab),
1102*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START2_MODE0, 0xea),
1103*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START3_MODE0, 0x02),
1104*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_CP_CTRL_MODE0, 0x06),
1105*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_RCTRL_MODE0, 0x16),
1106*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_CCTRL_MODE0, 0x36),
1107*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN1_MODE0, 0x00),
1108*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN0_MODE0, 0x3f),
1109*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE2_MODE0, 0x01),
1110*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE1_MODE0, 0xc9),
1111*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_CORECLK_DIV_MODE0, 0x0a),
1112*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP3_MODE0, 0x00),
1113*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP2_MODE0, 0x34),
1114*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP1_MODE0, 0x15),
1115*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP_EN, 0x04),
1116*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_CORE_CLK_EN, 0x00),
1117*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP_CFG, 0x00),
1118*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_MAP, 0x00),
1119*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYSCLK_BUF_ENABLE, 0x0a),
1120*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_EN_CENTER, 0x01),
1121*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_PER1, 0x31),
1122*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_PER2, 0x01),
1123*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_ADJ_PER1, 0x00),
1124*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_ADJ_PER2, 0x00),
1125*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_STEP_SIZE1, 0x85),
1126*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_STEP_SIZE2, 0x07),
1127*4882a593Smuzhiyun };
1128*4882a593Smuzhiyun
1129*4882a593Smuzhiyun static const struct qmp_phy_init_tbl qmp_v3_usb3_uniphy_tx_tbl[] = {
1130*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_TX_HIGHZ_DRVR_EN, 0x10),
1131*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_TX_RCV_DETECT_LVL_2, 0x12),
1132*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_TX_LANE_MODE_1, 0xc6),
1133*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_TX_RES_CODE_LANE_OFFSET_RX, 0x06),
1134*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_TX_RES_CODE_LANE_OFFSET_TX, 0x06),
1135*4882a593Smuzhiyun };
1136*4882a593Smuzhiyun
1137*4882a593Smuzhiyun static const struct qmp_phy_init_tbl qmp_v3_usb3_uniphy_rx_tbl[] = {
1138*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_VGA_CAL_CNTRL2, 0x0c),
1139*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_MODE_00, 0x50),
1140*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_FASTLOCK_FO_GAIN, 0x0b),
1141*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0e),
1142*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL3, 0x4e),
1143*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL4, 0x18),
1144*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x77),
1145*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_OFFSET_ADAPTOR_CNTRL2, 0x80),
1146*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_CNTRL, 0x03),
1147*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_DEGLITCH_CNTRL, 0x1c),
1148*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x75),
1149*4882a593Smuzhiyun };
1150*4882a593Smuzhiyun
1151*4882a593Smuzhiyun static const struct qmp_phy_init_tbl qmp_v3_usb3_uniphy_pcs_tbl[] = {
1152*4882a593Smuzhiyun /* FLL settings */
1153*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNTRL2, 0x83),
1154*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNT_VAL_L, 0x09),
1155*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNT_VAL_H_TOL, 0xa2),
1156*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_MAN_CODE, 0x40),
1157*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNTRL1, 0x02),
1158*4882a593Smuzhiyun
1159*4882a593Smuzhiyun /* Lock Det settings */
1160*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_LOCK_DETECT_CONFIG1, 0xd1),
1161*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_LOCK_DETECT_CONFIG2, 0x1f),
1162*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_LOCK_DETECT_CONFIG3, 0x47),
1163*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_POWER_STATE_CONFIG2, 0x1b),
1164*4882a593Smuzhiyun
1165*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_RX_SIGDET_LVL, 0xba),
1166*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V0, 0x9f),
1167*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V1, 0x9f),
1168*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V2, 0xb5),
1169*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V3, 0x4c),
1170*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V4, 0x64),
1171*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_LS, 0x6a),
1172*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V0, 0x15),
1173*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V0, 0x0d),
1174*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V1, 0x15),
1175*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V1, 0x0d),
1176*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V2, 0x15),
1177*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V2, 0x0d),
1178*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V3, 0x15),
1179*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V3, 0x1d),
1180*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V4, 0x15),
1181*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V4, 0x0d),
1182*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_LS, 0x15),
1183*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_LS, 0x0d),
1184*4882a593Smuzhiyun
1185*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_RATE_SLEW_CNTRL, 0x02),
1186*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_PWRUP_RESET_DLY_TIME_AUXCLK, 0x04),
1187*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_TSYNC_RSYNC_TIME, 0x44),
1188*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_PWRUP_RESET_DLY_TIME_AUXCLK, 0x04),
1189*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_P1U2_L, 0xe7),
1190*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_P1U2_H, 0x03),
1191*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_U3_L, 0x40),
1192*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_U3_H, 0x00),
1193*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_RXEQTRAINING_WAIT_TIME, 0x75),
1194*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_LFPS_TX_ECSTART_EQTLOCK, 0x86),
1195*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_RXEQTRAINING_RUN_TIME, 0x13),
1196*4882a593Smuzhiyun
1197*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_REFGEN_REQ_CONFIG1, 0x21),
1198*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_REFGEN_REQ_CONFIG2, 0x60),
1199*4882a593Smuzhiyun };
1200*4882a593Smuzhiyun
1201*4882a593Smuzhiyun static const struct qmp_phy_init_tbl sdm845_ufsphy_serdes_tbl[] = {
1202*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYS_CLK_CTRL, 0x02),
1203*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_BIAS_EN_CLKBUFLR_EN, 0x04),
1204*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_BG_TIMER, 0x0a),
1205*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_IVCO, 0x07),
1206*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_CMN_CONFIG, 0x06),
1207*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYSCLK_EN_SEL, 0xd5),
1208*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_RESETSM_CNTRL, 0x20),
1209*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_CLK_SELECT, 0x30),
1210*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_HSCLK_SEL, 0x00),
1211*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP_EN, 0x01),
1212*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_CTRL, 0x00),
1213*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_CORE_CLK_EN, 0x00),
1214*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_MAP, 0x04),
1215*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_SVS_MODE_CLK_SEL, 0x05),
1216*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_INITVAL1, 0xff),
1217*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_INITVAL2, 0x00),
1218*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_DEC_START_MODE0, 0x82),
1219*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_CP_CTRL_MODE0, 0x06),
1220*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_RCTRL_MODE0, 0x16),
1221*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_CCTRL_MODE0, 0x36),
1222*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN0_MODE0, 0x3f),
1223*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN1_MODE0, 0x00),
1224*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE1_MODE0, 0xda),
1225*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE2_MODE0, 0x01),
1226*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP1_MODE0, 0xff),
1227*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP2_MODE0, 0x0c),
1228*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_DEC_START_MODE1, 0x98),
1229*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_CP_CTRL_MODE1, 0x06),
1230*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_RCTRL_MODE1, 0x16),
1231*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_CCTRL_MODE1, 0x36),
1232*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN0_MODE1, 0x3f),
1233*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN1_MODE1, 0x00),
1234*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE1_MODE1, 0xc1),
1235*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE2_MODE1, 0x00),
1236*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP1_MODE1, 0x32),
1237*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP2_MODE1, 0x0f),
1238*4882a593Smuzhiyun
1239*4882a593Smuzhiyun /* Rate B */
1240*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_MAP, 0x44),
1241*4882a593Smuzhiyun };
1242*4882a593Smuzhiyun
1243*4882a593Smuzhiyun static const struct qmp_phy_init_tbl sdm845_ufsphy_tx_tbl[] = {
1244*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_TX_LANE_MODE_1, 0x06),
1245*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_TX_RES_CODE_LANE_OFFSET_TX, 0x04),
1246*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_TX_RES_CODE_LANE_OFFSET_RX, 0x07),
1247*4882a593Smuzhiyun };
1248*4882a593Smuzhiyun
1249*4882a593Smuzhiyun static const struct qmp_phy_init_tbl sdm845_ufsphy_rx_tbl[] = {
1250*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_LVL, 0x24),
1251*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_CNTRL, 0x0f),
1252*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_DEGLITCH_CNTRL, 0x1e),
1253*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_INTERFACE_MODE, 0x40),
1254*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_FASTLOCK_FO_GAIN, 0x0b),
1255*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_TERM_BW, 0x5b),
1256*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL2, 0x06),
1257*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL3, 0x04),
1258*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL4, 0x1b),
1259*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_SVS_SO_GAIN_HALF, 0x04),
1260*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_SVS_SO_GAIN_QUARTER, 0x04),
1261*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_SVS_SO_GAIN, 0x04),
1262*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x4b),
1263*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_PI_CONTROLS, 0x81),
1264*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_FASTLOCK_COUNT_LOW, 0x80),
1265*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_MODE_00, 0x59),
1266*4882a593Smuzhiyun };
1267*4882a593Smuzhiyun
1268*4882a593Smuzhiyun static const struct qmp_phy_init_tbl sdm845_ufsphy_pcs_tbl[] = {
1269*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_RX_SIGDET_CTRL2, 0x6e),
1270*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_TX_LARGE_AMP_DRV_LVL, 0x0a),
1271*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_TX_SMALL_AMP_DRV_LVL, 0x02),
1272*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_RX_SYM_RESYNC_CTRL, 0x03),
1273*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_TX_MID_TERM_CTRL1, 0x43),
1274*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_RX_SIGDET_CTRL1, 0x0f),
1275*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_RX_MIN_HIBERN8_TIME, 0x9a),
1276*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_MULTI_LANE_CTRL1, 0x02),
1277*4882a593Smuzhiyun };
1278*4882a593Smuzhiyun
1279*4882a593Smuzhiyun static const struct qmp_phy_init_tbl msm8998_usb3_serdes_tbl[] = {
1280*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_CLK_SELECT, 0x30),
1281*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_BIAS_EN_CLKBUFLR_EN, 0x04),
1282*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYSCLK_EN_SEL, 0x14),
1283*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYS_CLK_CTRL, 0x06),
1284*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_RESETSM_CNTRL2, 0x08),
1285*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_CMN_CONFIG, 0x06),
1286*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_SVS_MODE_CLK_SEL, 0x01),
1287*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_HSCLK_SEL, 0x80),
1288*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_DEC_START_MODE0, 0x82),
1289*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START1_MODE0, 0xab),
1290*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START2_MODE0, 0xea),
1291*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_DIV_FRAC_START3_MODE0, 0x02),
1292*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_CP_CTRL_MODE0, 0x06),
1293*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_RCTRL_MODE0, 0x16),
1294*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_CCTRL_MODE0, 0x36),
1295*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN1_MODE0, 0x00),
1296*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN0_MODE0, 0x3f),
1297*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE2_MODE0, 0x01),
1298*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE1_MODE0, 0xc9),
1299*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_CORECLK_DIV_MODE0, 0x0a),
1300*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP3_MODE0, 0x00),
1301*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP2_MODE0, 0x34),
1302*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP1_MODE0, 0x15),
1303*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP_EN, 0x04),
1304*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_CORE_CLK_EN, 0x00),
1305*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP_CFG, 0x00),
1306*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_MAP, 0x00),
1307*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_BG_TIMER, 0x0a),
1308*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_IVCO, 0x07),
1309*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_INITVAL, 0x80),
1310*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_CMN_MODE, 0x01),
1311*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_EN_CENTER, 0x01),
1312*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_PER1, 0x31),
1313*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_PER2, 0x01),
1314*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_ADJ_PER1, 0x00),
1315*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_ADJ_PER2, 0x00),
1316*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_STEP_SIZE1, 0x85),
1317*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_COM_SSC_STEP_SIZE2, 0x07),
1318*4882a593Smuzhiyun };
1319*4882a593Smuzhiyun
1320*4882a593Smuzhiyun static const struct qmp_phy_init_tbl msm8998_usb3_tx_tbl[] = {
1321*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_TX_HIGHZ_DRVR_EN, 0x10),
1322*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_TX_RCV_DETECT_LVL_2, 0x12),
1323*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_TX_LANE_MODE_1, 0x16),
1324*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_TX_RES_CODE_LANE_OFFSET_TX, 0x00),
1325*4882a593Smuzhiyun };
1326*4882a593Smuzhiyun
1327*4882a593Smuzhiyun static const struct qmp_phy_init_tbl msm8998_usb3_rx_tbl[] = {
1328*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_FASTLOCK_FO_GAIN, 0x0b),
1329*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0f),
1330*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL3, 0x4e),
1331*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL4, 0x18),
1332*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x07),
1333*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_OFFSET_ADAPTOR_CNTRL2, 0x80),
1334*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_CNTRL, 0x43),
1335*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_DEGLITCH_CNTRL, 0x1c),
1336*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x75),
1337*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_FASTLOCK_COUNT_LOW, 0x00),
1338*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_FASTLOCK_COUNT_HIGH, 0x00),
1339*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_PI_CONTROLS, 0x80),
1340*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_FO_GAIN, 0x0a),
1341*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_SO_GAIN, 0x06),
1342*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_ENABLES, 0x00),
1343*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_VGA_CAL_CNTRL2, 0x03),
1344*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_MODE_00, 0x05),
1345*4882a593Smuzhiyun };
1346*4882a593Smuzhiyun
1347*4882a593Smuzhiyun static const struct qmp_phy_init_tbl msm8998_usb3_pcs_tbl[] = {
1348*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNTRL2, 0x83),
1349*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNT_VAL_L, 0x09),
1350*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNT_VAL_H_TOL, 0xa2),
1351*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_MAN_CODE, 0x40),
1352*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_FLL_CNTRL1, 0x02),
1353*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_LOCK_DETECT_CONFIG1, 0xd1),
1354*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_LOCK_DETECT_CONFIG2, 0x1f),
1355*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_LOCK_DETECT_CONFIG3, 0x47),
1356*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_POWER_STATE_CONFIG2, 0x1b),
1357*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V0, 0x9f),
1358*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V1, 0x9f),
1359*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V2, 0xb7),
1360*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V3, 0x4e),
1361*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_V4, 0x65),
1362*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXMGN_LS, 0x6b),
1363*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V0, 0x15),
1364*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V0, 0x0d),
1365*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_TX_LARGE_AMP_DRV_LVL, 0x15),
1366*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V1, 0x0d),
1367*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V2, 0x15),
1368*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V2, 0x0d),
1369*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V3, 0x15),
1370*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V3, 0x0d),
1371*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_V4, 0x15),
1372*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_V4, 0x0d),
1373*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M6DB_LS, 0x15),
1374*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_TXDEEMPH_M3P5DB_LS, 0x0d),
1375*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_RATE_SLEW_CNTRL, 0x02),
1376*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_PWRUP_RESET_DLY_TIME_AUXCLK, 0x04),
1377*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_TSYNC_RSYNC_TIME, 0x44),
1378*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_P1U2_L, 0xe7),
1379*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_P1U2_H, 0x03),
1380*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_U3_L, 0x40),
1381*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_RCVR_DTCT_DLY_U3_H, 0x00),
1382*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_RX_SIGDET_LVL, 0x8a),
1383*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_RXEQTRAINING_WAIT_TIME, 0x75),
1384*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_LFPS_TX_ECSTART_EQTLOCK, 0x86),
1385*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V3_PCS_RXEQTRAINING_RUN_TIME, 0x13),
1386*4882a593Smuzhiyun };
1387*4882a593Smuzhiyun
1388*4882a593Smuzhiyun static const struct qmp_phy_init_tbl sm8150_ufsphy_serdes_tbl[] = {
1389*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_SYSCLK_EN_SEL, 0xd9),
1390*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_HSCLK_SEL, 0x11),
1391*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_HSCLK_HS_SWITCH_SEL, 0x00),
1392*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP_EN, 0x01),
1393*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE_MAP, 0x02),
1394*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_IVCO, 0x0f),
1395*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE_INITVAL2, 0x00),
1396*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_HSCLK_SEL, 0x11),
1397*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_DEC_START_MODE0, 0x82),
1398*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_CP_CTRL_MODE0, 0x06),
1399*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_RCTRL_MODE0, 0x16),
1400*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_CCTRL_MODE0, 0x36),
1401*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP1_MODE0, 0xff),
1402*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP2_MODE0, 0x0c),
1403*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE1_MODE0, 0xac),
1404*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE2_MODE0, 0x1e),
1405*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_DEC_START_MODE1, 0x98),
1406*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_CP_CTRL_MODE1, 0x06),
1407*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_RCTRL_MODE1, 0x16),
1408*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_CCTRL_MODE1, 0x36),
1409*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP1_MODE1, 0x32),
1410*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP2_MODE1, 0x0f),
1411*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE1_MODE1, 0xdd),
1412*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE2_MODE1, 0x23),
1413*4882a593Smuzhiyun
1414*4882a593Smuzhiyun /* Rate B */
1415*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE_MAP, 0x06),
1416*4882a593Smuzhiyun };
1417*4882a593Smuzhiyun
1418*4882a593Smuzhiyun static const struct qmp_phy_init_tbl sm8150_ufsphy_tx_tbl[] = {
1419*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_TX_PWM_GEAR_1_DIVIDER_BAND0_1, 0x06),
1420*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_TX_PWM_GEAR_2_DIVIDER_BAND0_1, 0x03),
1421*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_TX_PWM_GEAR_3_DIVIDER_BAND0_1, 0x01),
1422*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_TX_PWM_GEAR_4_DIVIDER_BAND0_1, 0x00),
1423*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_TX_LANE_MODE_1, 0x05),
1424*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_TX_TRAN_DRVR_EMP_EN, 0x0c),
1425*4882a593Smuzhiyun };
1426*4882a593Smuzhiyun
1427*4882a593Smuzhiyun static const struct qmp_phy_init_tbl sm8150_ufsphy_rx_tbl[] = {
1428*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_LVL, 0x24),
1429*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_CNTRL, 0x0f),
1430*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_DEGLITCH_CNTRL, 0x1e),
1431*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_BAND, 0x18),
1432*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_FO_GAIN, 0x0a),
1433*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x4b),
1434*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_PI_CONTROLS, 0xf1),
1435*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_COUNT_LOW, 0x80),
1436*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_PI_CTRL2, 0x80),
1437*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FO_GAIN, 0x0c),
1438*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SO_GAIN, 0x04),
1439*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_TERM_BW, 0x1b),
1440*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL2, 0x06),
1441*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL3, 0x04),
1442*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL4, 0x1d),
1443*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_OFFSET_ADAPTOR_CNTRL2, 0x00),
1444*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_MEASURE_TIME, 0x10),
1445*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_LOW, 0xc0),
1446*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_HIGH, 0x00),
1447*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_LOW, 0x36),
1448*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH, 0x36),
1449*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH2, 0xf6),
1450*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH3, 0x3b),
1451*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH4, 0x3d),
1452*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_LOW, 0xe0),
1453*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH, 0xc8),
1454*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH2, 0xc8),
1455*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH3, 0x3b),
1456*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH4, 0xb1),
1457*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_10_LOW, 0xe0),
1458*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_10_HIGH, 0xc8),
1459*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_10_HIGH2, 0xc8),
1460*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_10_HIGH3, 0x3b),
1461*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_10_HIGH4, 0xb1),
1462*4882a593Smuzhiyun
1463*4882a593Smuzhiyun };
1464*4882a593Smuzhiyun
1465*4882a593Smuzhiyun static const struct qmp_phy_init_tbl sm8150_ufsphy_pcs_tbl[] = {
1466*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V4_PCS_UFS_RX_SIGDET_CTRL2, 0x6d),
1467*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V4_PCS_UFS_TX_LARGE_AMP_DRV_LVL, 0x0a),
1468*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V4_PCS_UFS_TX_SMALL_AMP_DRV_LVL, 0x02),
1469*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V4_PCS_UFS_TX_MID_TERM_CTRL1, 0x43),
1470*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V4_PCS_UFS_DEBUG_BUS_CLKSEL, 0x1f),
1471*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V4_PCS_UFS_RX_MIN_HIBERN8_TIME, 0xff),
1472*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V4_PCS_UFS_MULTI_LANE_CTRL1, 0x02),
1473*4882a593Smuzhiyun };
1474*4882a593Smuzhiyun
1475*4882a593Smuzhiyun static const struct qmp_phy_init_tbl sm8150_usb3_serdes_tbl[] = {
1476*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_EN_CENTER, 0x01),
1477*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_PER1, 0x31),
1478*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_PER2, 0x01),
1479*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_STEP_SIZE1_MODE0, 0xde),
1480*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_STEP_SIZE2_MODE0, 0x07),
1481*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_STEP_SIZE1_MODE1, 0xde),
1482*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_STEP_SIZE2_MODE1, 0x07),
1483*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_SYSCLK_BUF_ENABLE, 0x0a),
1484*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_CMN_IPTRIM, 0x20),
1485*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_CP_CTRL_MODE0, 0x06),
1486*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_CP_CTRL_MODE1, 0x06),
1487*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_RCTRL_MODE0, 0x16),
1488*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_RCTRL_MODE1, 0x16),
1489*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_CCTRL_MODE0, 0x36),
1490*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_CCTRL_MODE1, 0x36),
1491*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_SYSCLK_EN_SEL, 0x1a),
1492*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP_EN, 0x04),
1493*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP1_MODE0, 0x14),
1494*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP2_MODE0, 0x34),
1495*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP1_MODE1, 0x34),
1496*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP2_MODE1, 0x82),
1497*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_DEC_START_MODE0, 0x82),
1498*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_DEC_START_MODE1, 0x82),
1499*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START1_MODE0, 0xab),
1500*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START2_MODE0, 0xea),
1501*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START3_MODE0, 0x02),
1502*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE_MAP, 0x02),
1503*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START1_MODE1, 0xab),
1504*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START2_MODE1, 0xea),
1505*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START3_MODE1, 0x02),
1506*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE1_MODE0, 0x24),
1507*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE1_MODE1, 0x24),
1508*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE2_MODE1, 0x02),
1509*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_HSCLK_SEL, 0x01),
1510*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_CORECLK_DIV_MODE1, 0x08),
1511*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE1_MODE0, 0xca),
1512*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE2_MODE0, 0x1e),
1513*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE1_MODE1, 0xca),
1514*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE2_MODE1, 0x1e),
1515*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_HSCLK_SEL, 0x11),
1516*4882a593Smuzhiyun };
1517*4882a593Smuzhiyun
1518*4882a593Smuzhiyun static const struct qmp_phy_init_tbl sm8150_usb3_tx_tbl[] = {
1519*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_TX_RES_CODE_LANE_TX, 0x00),
1520*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_TX_RES_CODE_LANE_RX, 0x00),
1521*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_TX_LANE_MODE_1, 0xd5),
1522*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_TX_RCV_DETECT_LVL_2, 0x12),
1523*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_TX_PI_QEC_CTRL, 0x20),
1524*4882a593Smuzhiyun };
1525*4882a593Smuzhiyun
1526*4882a593Smuzhiyun static const struct qmp_phy_init_tbl sm8150_usb3_rx_tbl[] = {
1527*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SO_GAIN, 0x05),
1528*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_FO_GAIN, 0x2f),
1529*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x7f),
1530*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_COUNT_LOW, 0xff),
1531*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_COUNT_HIGH, 0x0f),
1532*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_PI_CONTROLS, 0x99),
1533*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_THRESH1, 0x04),
1534*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_THRESH2, 0x08),
1535*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_GAIN1, 0x05),
1536*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_GAIN2, 0x05),
1537*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_VGA_CAL_CNTRL1, 0x54),
1538*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_VGA_CAL_CNTRL2, 0x0e),
1539*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0f),
1540*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL3, 0x4a),
1541*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL4, 0x0a),
1542*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_LOW, 0xc0),
1543*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_HIGH, 0x00),
1544*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x77),
1545*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_CNTRL, 0x04),
1546*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_DEGLITCH_CNTRL, 0x0e),
1547*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_LOW, 0xbf),
1548*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH, 0xbf),
1549*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH2, 0x3f),
1550*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH3, 0x7f),
1551*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH4, 0x94),
1552*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_LOW, 0xdc),
1553*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH, 0xdc),
1554*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH2, 0x5c),
1555*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH3, 0x0b),
1556*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH4, 0xb3),
1557*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_DFE_EN_TIMER, 0x04),
1558*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_DFE_CTLE_POST_CAL_OFFSET, 0x38),
1559*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_AUX_DATA_TCOARSE_TFINE, 0xa0),
1560*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_DCC_CTRL1, 0x0c),
1561*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_GM_CAL, 0x1f),
1562*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_VTH_CODE, 0x10),
1563*4882a593Smuzhiyun };
1564*4882a593Smuzhiyun
1565*4882a593Smuzhiyun static const struct qmp_phy_init_tbl sm8150_usb3_pcs_tbl[] = {
1566*4882a593Smuzhiyun /* Lock Det settings */
1567*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG1, 0xd0),
1568*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG2, 0x07),
1569*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG6, 0x13),
1570*4882a593Smuzhiyun
1571*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V4_PCS_REFGEN_REQ_CONFIG1, 0x21),
1572*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V4_PCS_RX_SIGDET_LVL, 0xaa),
1573*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V4_PCS_CDR_RESET_TIME, 0x0a),
1574*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V4_PCS_ALIGN_DETECT_CONFIG1, 0x88),
1575*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V4_PCS_ALIGN_DETECT_CONFIG2, 0x13),
1576*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V4_PCS_PCS_TX_RX_CONFIG, 0x0c),
1577*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V4_PCS_EQ_CONFIG1, 0x4b),
1578*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V4_PCS_EQ_CONFIG5, 0x10),
1579*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V4_PCS_USB3_LFPS_DET_HIGH_COUNT_VAL, 0xf8),
1580*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V4_PCS_USB3_RXEQTRAINING_DFE_TIME_S2, 0x07),
1581*4882a593Smuzhiyun };
1582*4882a593Smuzhiyun
1583*4882a593Smuzhiyun static const struct qmp_phy_init_tbl sm8150_usb3_uniphy_serdes_tbl[] = {
1584*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_SYSCLK_EN_SEL, 0x1a),
1585*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_HSCLK_SEL, 0x11),
1586*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_HSCLK_SEL, 0x01),
1587*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_DEC_START_MODE0, 0x82),
1588*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START1_MODE0, 0xab),
1589*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START2_MODE0, 0xea),
1590*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START3_MODE0, 0x02),
1591*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE1_MODE0, 0xca),
1592*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE2_MODE0, 0x1e),
1593*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_CP_CTRL_MODE0, 0x06),
1594*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_RCTRL_MODE0, 0x16),
1595*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_CCTRL_MODE0, 0x36),
1596*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE1_MODE0, 0x24),
1597*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP2_MODE0, 0x34),
1598*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP1_MODE0, 0x14),
1599*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP_EN, 0x04),
1600*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_SYSCLK_BUF_ENABLE, 0x0a),
1601*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE2_MODE1, 0x02),
1602*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE1_MODE1, 0x24),
1603*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_CORECLK_DIV_MODE1, 0x08),
1604*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_DEC_START_MODE1, 0x82),
1605*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START1_MODE1, 0xab),
1606*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START2_MODE1, 0xea),
1607*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_DIV_FRAC_START3_MODE1, 0x02),
1608*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP2_MODE1, 0x82),
1609*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP1_MODE1, 0x34),
1610*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_CP_CTRL_MODE1, 0x06),
1611*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_RCTRL_MODE1, 0x16),
1612*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_CCTRL_MODE1, 0x36),
1613*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE1_MODE1, 0xca),
1614*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE2_MODE1, 0x1e),
1615*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_CMN_IPTRIM, 0x20),
1616*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_EN_CENTER, 0x01),
1617*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_PER1, 0x31),
1618*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_PER2, 0x01),
1619*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_STEP_SIZE1_MODE1, 0xde),
1620*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_STEP_SIZE2_MODE1, 0x07),
1621*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_STEP_SIZE1_MODE0, 0xde),
1622*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_SSC_STEP_SIZE2_MODE0, 0x07),
1623*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE_MAP, 0x02),
1624*4882a593Smuzhiyun };
1625*4882a593Smuzhiyun
1626*4882a593Smuzhiyun static const struct qmp_phy_init_tbl sm8150_usb3_uniphy_tx_tbl[] = {
1627*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_TX_RCV_DETECT_LVL_2, 0x12),
1628*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_TX_LANE_MODE_1, 0x95),
1629*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_TX_PI_QEC_CTRL, 0x40),
1630*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_TX_RES_CODE_LANE_OFFSET_TX, 0x05),
1631*4882a593Smuzhiyun };
1632*4882a593Smuzhiyun
1633*4882a593Smuzhiyun static const struct qmp_phy_init_tbl sm8150_usb3_uniphy_rx_tbl[] = {
1634*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH4, 0xb8),
1635*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH3, 0x7f),
1636*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH2, 0x37),
1637*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH, 0x2f),
1638*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_LOW, 0xef),
1639*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH4, 0xb3),
1640*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH3, 0x0b),
1641*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH2, 0x5c),
1642*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH, 0xdc),
1643*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_LOW, 0xdc),
1644*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_PI_CONTROLS, 0x99),
1645*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_THRESH1, 0x04),
1646*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_THRESH2, 0x08),
1647*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_GAIN1, 0x05),
1648*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_GAIN2, 0x05),
1649*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_FO_GAIN, 0x2f),
1650*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_COUNT_LOW, 0xff),
1651*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_COUNT_HIGH, 0x0f),
1652*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x7f),
1653*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FO_GAIN, 0x08),
1654*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_VGA_CAL_CNTRL1, 0x54),
1655*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_VGA_CAL_CNTRL2, 0x0c),
1656*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_GM_CAL, 0x1f),
1657*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0f),
1658*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL3, 0x4a),
1659*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL4, 0x0a),
1660*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_DFE_EN_TIMER, 0x04),
1661*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x47),
1662*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_OFFSET_ADAPTOR_CNTRL2, 0x80),
1663*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_CNTRL, 0x04),
1664*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_DEGLITCH_CNTRL, 0x0e),
1665*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_HIGH, 0x00),
1666*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_LOW, 0xc0),
1667*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_DFE_CTLE_POST_CAL_OFFSET, 0x20),
1668*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SO_GAIN, 0x04),
1669*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_DCC_CTRL1, 0x0c),
1670*4882a593Smuzhiyun };
1671*4882a593Smuzhiyun
1672*4882a593Smuzhiyun static const struct qmp_phy_init_tbl sm8150_usb3_uniphy_pcs_tbl[] = {
1673*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG1, 0xd0),
1674*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG2, 0x07),
1675*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG3, 0x20),
1676*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG6, 0x13),
1677*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V4_PCS_RCVR_DTCT_DLY_P1U2_L, 0xe7),
1678*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V4_PCS_RCVR_DTCT_DLY_P1U2_H, 0x03),
1679*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V4_PCS_RX_SIGDET_LVL, 0xaa),
1680*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V4_PCS_USB3_UNI_RXEQTRAINING_DFE_TIME_S2, 0x07),
1681*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V4_PCS_USB3_UNI_LFPS_DET_HIGH_COUNT_VAL, 0xf8),
1682*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V4_PCS_CDR_RESET_TIME, 0x0f),
1683*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V4_PCS_ALIGN_DETECT_CONFIG1, 0x88),
1684*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V4_PCS_ALIGN_DETECT_CONFIG2, 0x13),
1685*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V4_PCS_EQ_CONFIG1, 0x4b),
1686*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V4_PCS_EQ_CONFIG5, 0x10),
1687*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V4_PCS_REFGEN_REQ_CONFIG1, 0x21),
1688*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V4_PCS_PCS_TX_RX_CONFIG, 0x0c),
1689*4882a593Smuzhiyun };
1690*4882a593Smuzhiyun
1691*4882a593Smuzhiyun static const struct qmp_phy_init_tbl sm8250_usb3_tx_tbl[] = {
1692*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_TX_RES_CODE_LANE_TX, 0x60),
1693*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_TX_RES_CODE_LANE_RX, 0x60),
1694*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_TX_RES_CODE_LANE_OFFSET_TX, 0x11),
1695*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_TX_RES_CODE_LANE_OFFSET_RX, 0x02),
1696*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_TX_LANE_MODE_1, 0xd5),
1697*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_TX_RCV_DETECT_LVL_2, 0x12),
1698*4882a593Smuzhiyun QMP_PHY_INIT_CFG_LANE(QSERDES_V4_TX_PI_QEC_CTRL, 0x40, 1),
1699*4882a593Smuzhiyun QMP_PHY_INIT_CFG_LANE(QSERDES_V4_TX_PI_QEC_CTRL, 0x54, 2),
1700*4882a593Smuzhiyun };
1701*4882a593Smuzhiyun
1702*4882a593Smuzhiyun static const struct qmp_phy_init_tbl sm8250_usb3_rx_tbl[] = {
1703*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SO_GAIN, 0x06),
1704*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_FO_GAIN, 0x2f),
1705*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x7f),
1706*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_COUNT_LOW, 0xff),
1707*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_COUNT_HIGH, 0x0f),
1708*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_PI_CONTROLS, 0x99),
1709*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_THRESH1, 0x04),
1710*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_THRESH2, 0x08),
1711*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_GAIN1, 0x05),
1712*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_GAIN2, 0x05),
1713*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_VGA_CAL_CNTRL1, 0x54),
1714*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_VGA_CAL_CNTRL2, 0x0c),
1715*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0f),
1716*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL3, 0x4a),
1717*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL4, 0x0a),
1718*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_LOW, 0xc0),
1719*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_HIGH, 0x00),
1720*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x77),
1721*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_CNTRL, 0x04),
1722*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_DEGLITCH_CNTRL, 0x0e),
1723*4882a593Smuzhiyun QMP_PHY_INIT_CFG_LANE(QSERDES_V4_RX_RX_MODE_00_LOW, 0xff, 1),
1724*4882a593Smuzhiyun QMP_PHY_INIT_CFG_LANE(QSERDES_V4_RX_RX_MODE_00_LOW, 0x7f, 2),
1725*4882a593Smuzhiyun QMP_PHY_INIT_CFG_LANE(QSERDES_V4_RX_RX_MODE_00_HIGH, 0x7f, 1),
1726*4882a593Smuzhiyun QMP_PHY_INIT_CFG_LANE(QSERDES_V4_RX_RX_MODE_00_HIGH, 0xff, 2),
1727*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH2, 0x7f),
1728*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH3, 0x7f),
1729*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH4, 0x97),
1730*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_LOW, 0xdc),
1731*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH, 0xdc),
1732*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH2, 0x5c),
1733*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH3, 0x7b),
1734*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH4, 0xb4),
1735*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_DFE_EN_TIMER, 0x04),
1736*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_DFE_CTLE_POST_CAL_OFFSET, 0x38),
1737*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_AUX_DATA_TCOARSE_TFINE, 0xa0),
1738*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_DCC_CTRL1, 0x0c),
1739*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_GM_CAL, 0x1f),
1740*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_VTH_CODE, 0x10),
1741*4882a593Smuzhiyun };
1742*4882a593Smuzhiyun
1743*4882a593Smuzhiyun static const struct qmp_phy_init_tbl sm8250_usb3_pcs_tbl[] = {
1744*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG1, 0xd0),
1745*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG2, 0x07),
1746*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG3, 0x20),
1747*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG6, 0x13),
1748*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V4_PCS_REFGEN_REQ_CONFIG1, 0x21),
1749*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V4_PCS_RX_SIGDET_LVL, 0xa9),
1750*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V4_PCS_CDR_RESET_TIME, 0x0a),
1751*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V4_PCS_ALIGN_DETECT_CONFIG1, 0x88),
1752*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V4_PCS_ALIGN_DETECT_CONFIG2, 0x13),
1753*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V4_PCS_PCS_TX_RX_CONFIG, 0x0c),
1754*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V4_PCS_EQ_CONFIG1, 0x4b),
1755*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V4_PCS_EQ_CONFIG5, 0x10),
1756*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V4_PCS_USB3_LFPS_DET_HIGH_COUNT_VAL, 0xf8),
1757*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V4_PCS_USB3_RXEQTRAINING_DFE_TIME_S2, 0x07),
1758*4882a593Smuzhiyun };
1759*4882a593Smuzhiyun
1760*4882a593Smuzhiyun static const struct qmp_phy_init_tbl sm8250_usb3_uniphy_tx_tbl[] = {
1761*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_TX_RCV_DETECT_LVL_2, 0x12),
1762*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_TX_LANE_MODE_1, 0xd5),
1763*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_TX_LANE_MODE_2, 0x82),
1764*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_TX_PI_QEC_CTRL, 0x40),
1765*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_TX_RES_CODE_LANE_OFFSET_TX, 0x11),
1766*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_TX_RES_CODE_LANE_OFFSET_RX, 0x02),
1767*4882a593Smuzhiyun };
1768*4882a593Smuzhiyun
1769*4882a593Smuzhiyun static const struct qmp_phy_init_tbl sm8250_usb3_uniphy_rx_tbl[] = {
1770*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH4, 0xb8),
1771*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH3, 0xff),
1772*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH2, 0xbf),
1773*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH, 0x7f),
1774*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_LOW, 0x7f),
1775*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH4, 0xb4),
1776*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH3, 0x7b),
1777*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH2, 0x5c),
1778*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH, 0xdc),
1779*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_LOW, 0xdc),
1780*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_PI_CONTROLS, 0x99),
1781*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_THRESH1, 0x04),
1782*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_THRESH2, 0x08),
1783*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_GAIN1, 0x05),
1784*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SB2_GAIN2, 0x05),
1785*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_FO_GAIN, 0x2f),
1786*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_COUNT_LOW, 0xff),
1787*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_COUNT_HIGH, 0x0f),
1788*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x7f),
1789*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FO_GAIN, 0x0a),
1790*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_VGA_CAL_CNTRL1, 0x54),
1791*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_VGA_CAL_CNTRL2, 0x0c),
1792*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0f),
1793*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL3, 0x4a),
1794*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL4, 0x0a),
1795*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_DFE_EN_TIMER, 0x04),
1796*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x47),
1797*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_OFFSET_ADAPTOR_CNTRL2, 0x80),
1798*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_CNTRL, 0x04),
1799*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_DEGLITCH_CNTRL, 0x0e),
1800*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_HIGH, 0x00),
1801*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_LOW, 0xc0),
1802*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_DFE_CTLE_POST_CAL_OFFSET, 0x38),
1803*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SO_GAIN, 0x06),
1804*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_DCC_CTRL1, 0x0c),
1805*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QSERDES_V4_RX_GM_CAL, 0x1f),
1806*4882a593Smuzhiyun };
1807*4882a593Smuzhiyun
1808*4882a593Smuzhiyun static const struct qmp_phy_init_tbl sm8250_usb3_uniphy_pcs_tbl[] = {
1809*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG1, 0xd0),
1810*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG2, 0x07),
1811*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG3, 0x20),
1812*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V4_PCS_LOCK_DETECT_CONFIG6, 0x13),
1813*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V4_PCS_RCVR_DTCT_DLY_P1U2_L, 0xe7),
1814*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V4_PCS_RCVR_DTCT_DLY_P1U2_H, 0x03),
1815*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V4_PCS_RX_SIGDET_LVL, 0xa9),
1816*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V4_PCS_PCS_TX_RX_CONFIG, 0x0c),
1817*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V4_PCS_USB3_UNI_RXEQTRAINING_DFE_TIME_S2, 0x07),
1818*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V4_PCS_USB3_UNI_LFPS_DET_HIGH_COUNT_VAL, 0xf8),
1819*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V4_PCS_CDR_RESET_TIME, 0x0a),
1820*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V4_PCS_ALIGN_DETECT_CONFIG1, 0x88),
1821*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V4_PCS_ALIGN_DETECT_CONFIG2, 0x13),
1822*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V4_PCS_EQ_CONFIG1, 0x4b),
1823*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V4_PCS_EQ_CONFIG5, 0x10),
1824*4882a593Smuzhiyun QMP_PHY_INIT_CFG(QPHY_V4_PCS_REFGEN_REQ_CONFIG1, 0x21),
1825*4882a593Smuzhiyun };
1826*4882a593Smuzhiyun
1827*4882a593Smuzhiyun /* struct qmp_phy_cfg - per-PHY initialization config */
1828*4882a593Smuzhiyun struct qmp_phy_cfg {
1829*4882a593Smuzhiyun /* phy-type - PCIE/UFS/USB */
1830*4882a593Smuzhiyun unsigned int type;
1831*4882a593Smuzhiyun /* number of lanes provided by phy */
1832*4882a593Smuzhiyun int nlanes;
1833*4882a593Smuzhiyun
1834*4882a593Smuzhiyun /* Init sequence for PHY blocks - serdes, tx, rx, pcs */
1835*4882a593Smuzhiyun const struct qmp_phy_init_tbl *serdes_tbl;
1836*4882a593Smuzhiyun int serdes_tbl_num;
1837*4882a593Smuzhiyun const struct qmp_phy_init_tbl *tx_tbl;
1838*4882a593Smuzhiyun int tx_tbl_num;
1839*4882a593Smuzhiyun const struct qmp_phy_init_tbl *rx_tbl;
1840*4882a593Smuzhiyun int rx_tbl_num;
1841*4882a593Smuzhiyun const struct qmp_phy_init_tbl *pcs_tbl;
1842*4882a593Smuzhiyun int pcs_tbl_num;
1843*4882a593Smuzhiyun const struct qmp_phy_init_tbl *pcs_misc_tbl;
1844*4882a593Smuzhiyun int pcs_misc_tbl_num;
1845*4882a593Smuzhiyun
1846*4882a593Smuzhiyun /* Init sequence for DP PHY block link rates */
1847*4882a593Smuzhiyun const struct qmp_phy_init_tbl *serdes_tbl_rbr;
1848*4882a593Smuzhiyun int serdes_tbl_rbr_num;
1849*4882a593Smuzhiyun const struct qmp_phy_init_tbl *serdes_tbl_hbr;
1850*4882a593Smuzhiyun int serdes_tbl_hbr_num;
1851*4882a593Smuzhiyun const struct qmp_phy_init_tbl *serdes_tbl_hbr2;
1852*4882a593Smuzhiyun int serdes_tbl_hbr2_num;
1853*4882a593Smuzhiyun const struct qmp_phy_init_tbl *serdes_tbl_hbr3;
1854*4882a593Smuzhiyun int serdes_tbl_hbr3_num;
1855*4882a593Smuzhiyun
1856*4882a593Smuzhiyun /* clock ids to be requested */
1857*4882a593Smuzhiyun const char * const *clk_list;
1858*4882a593Smuzhiyun int num_clks;
1859*4882a593Smuzhiyun /* resets to be requested */
1860*4882a593Smuzhiyun const char * const *reset_list;
1861*4882a593Smuzhiyun int num_resets;
1862*4882a593Smuzhiyun /* regulators to be requested */
1863*4882a593Smuzhiyun const char * const *vreg_list;
1864*4882a593Smuzhiyun int num_vregs;
1865*4882a593Smuzhiyun
1866*4882a593Smuzhiyun /* array of registers with different offsets */
1867*4882a593Smuzhiyun const unsigned int *regs;
1868*4882a593Smuzhiyun
1869*4882a593Smuzhiyun unsigned int start_ctrl;
1870*4882a593Smuzhiyun unsigned int pwrdn_ctrl;
1871*4882a593Smuzhiyun unsigned int mask_com_pcs_ready;
1872*4882a593Smuzhiyun
1873*4882a593Smuzhiyun /* true, if PHY has a separate PHY_COM control block */
1874*4882a593Smuzhiyun bool has_phy_com_ctrl;
1875*4882a593Smuzhiyun /* true, if PHY has a reset for individual lanes */
1876*4882a593Smuzhiyun bool has_lane_rst;
1877*4882a593Smuzhiyun /* true, if PHY needs delay after POWER_DOWN */
1878*4882a593Smuzhiyun bool has_pwrdn_delay;
1879*4882a593Smuzhiyun /* power_down delay in usec */
1880*4882a593Smuzhiyun int pwrdn_delay_min;
1881*4882a593Smuzhiyun int pwrdn_delay_max;
1882*4882a593Smuzhiyun
1883*4882a593Smuzhiyun /* true, if PHY has a separate DP_COM control block */
1884*4882a593Smuzhiyun bool has_phy_dp_com_ctrl;
1885*4882a593Smuzhiyun /* true, if PHY has secondary tx/rx lanes to be configured */
1886*4882a593Smuzhiyun bool is_dual_lane_phy;
1887*4882a593Smuzhiyun
1888*4882a593Smuzhiyun /* true, if PCS block has no separate SW_RESET register */
1889*4882a593Smuzhiyun bool no_pcs_sw_reset;
1890*4882a593Smuzhiyun };
1891*4882a593Smuzhiyun
1892*4882a593Smuzhiyun struct qmp_phy_combo_cfg {
1893*4882a593Smuzhiyun const struct qmp_phy_cfg *usb_cfg;
1894*4882a593Smuzhiyun const struct qmp_phy_cfg *dp_cfg;
1895*4882a593Smuzhiyun };
1896*4882a593Smuzhiyun
1897*4882a593Smuzhiyun /**
1898*4882a593Smuzhiyun * struct qmp_phy - per-lane phy descriptor
1899*4882a593Smuzhiyun *
1900*4882a593Smuzhiyun * @phy: generic phy
1901*4882a593Smuzhiyun * @cfg: phy specific configuration
1902*4882a593Smuzhiyun * @serdes: iomapped memory space for phy's serdes (i.e. PLL)
1903*4882a593Smuzhiyun * @tx: iomapped memory space for lane's tx
1904*4882a593Smuzhiyun * @rx: iomapped memory space for lane's rx
1905*4882a593Smuzhiyun * @pcs: iomapped memory space for lane's pcs
1906*4882a593Smuzhiyun * @tx2: iomapped memory space for second lane's tx (in dual lane PHYs)
1907*4882a593Smuzhiyun * @rx2: iomapped memory space for second lane's rx (in dual lane PHYs)
1908*4882a593Smuzhiyun * @pcs_misc: iomapped memory space for lane's pcs_misc
1909*4882a593Smuzhiyun * @pipe_clk: pipe lock
1910*4882a593Smuzhiyun * @index: lane index
1911*4882a593Smuzhiyun * @qmp: QMP phy to which this lane belongs
1912*4882a593Smuzhiyun * @lane_rst: lane's reset controller
1913*4882a593Smuzhiyun * @mode: current PHY mode
1914*4882a593Smuzhiyun */
1915*4882a593Smuzhiyun struct qmp_phy {
1916*4882a593Smuzhiyun struct phy *phy;
1917*4882a593Smuzhiyun const struct qmp_phy_cfg *cfg;
1918*4882a593Smuzhiyun void __iomem *serdes;
1919*4882a593Smuzhiyun void __iomem *tx;
1920*4882a593Smuzhiyun void __iomem *rx;
1921*4882a593Smuzhiyun void __iomem *pcs;
1922*4882a593Smuzhiyun void __iomem *tx2;
1923*4882a593Smuzhiyun void __iomem *rx2;
1924*4882a593Smuzhiyun void __iomem *pcs_misc;
1925*4882a593Smuzhiyun struct clk *pipe_clk;
1926*4882a593Smuzhiyun unsigned int index;
1927*4882a593Smuzhiyun struct qcom_qmp *qmp;
1928*4882a593Smuzhiyun struct reset_control *lane_rst;
1929*4882a593Smuzhiyun enum phy_mode mode;
1930*4882a593Smuzhiyun unsigned int dp_aux_cfg;
1931*4882a593Smuzhiyun struct phy_configure_opts_dp dp_opts;
1932*4882a593Smuzhiyun struct qmp_phy_dp_clks *dp_clks;
1933*4882a593Smuzhiyun };
1934*4882a593Smuzhiyun
1935*4882a593Smuzhiyun struct qmp_phy_dp_clks {
1936*4882a593Smuzhiyun struct qmp_phy *qphy;
1937*4882a593Smuzhiyun struct clk_hw dp_link_hw;
1938*4882a593Smuzhiyun struct clk_hw dp_pixel_hw;
1939*4882a593Smuzhiyun };
1940*4882a593Smuzhiyun
1941*4882a593Smuzhiyun /**
1942*4882a593Smuzhiyun * struct qcom_qmp - structure holding QMP phy block attributes
1943*4882a593Smuzhiyun *
1944*4882a593Smuzhiyun * @dev: device
1945*4882a593Smuzhiyun * @dp_com: iomapped memory space for phy's dp_com control block
1946*4882a593Smuzhiyun *
1947*4882a593Smuzhiyun * @clks: array of clocks required by phy
1948*4882a593Smuzhiyun * @resets: array of resets required by phy
1949*4882a593Smuzhiyun * @vregs: regulator supplies bulk data
1950*4882a593Smuzhiyun *
1951*4882a593Smuzhiyun * @phys: array of per-lane phy descriptors
1952*4882a593Smuzhiyun * @phy_mutex: mutex lock for PHY common block initialization
1953*4882a593Smuzhiyun * @init_count: phy common block initialization count
1954*4882a593Smuzhiyun * @ufs_reset: optional UFS PHY reset handle
1955*4882a593Smuzhiyun */
1956*4882a593Smuzhiyun struct qcom_qmp {
1957*4882a593Smuzhiyun struct device *dev;
1958*4882a593Smuzhiyun void __iomem *dp_com;
1959*4882a593Smuzhiyun
1960*4882a593Smuzhiyun struct clk_bulk_data *clks;
1961*4882a593Smuzhiyun struct reset_control **resets;
1962*4882a593Smuzhiyun struct regulator_bulk_data *vregs;
1963*4882a593Smuzhiyun
1964*4882a593Smuzhiyun struct qmp_phy **phys;
1965*4882a593Smuzhiyun
1966*4882a593Smuzhiyun struct mutex phy_mutex;
1967*4882a593Smuzhiyun int init_count;
1968*4882a593Smuzhiyun
1969*4882a593Smuzhiyun struct reset_control *ufs_reset;
1970*4882a593Smuzhiyun };
1971*4882a593Smuzhiyun
qphy_setbits(void __iomem * base,u32 offset,u32 val)1972*4882a593Smuzhiyun static inline void qphy_setbits(void __iomem *base, u32 offset, u32 val)
1973*4882a593Smuzhiyun {
1974*4882a593Smuzhiyun u32 reg;
1975*4882a593Smuzhiyun
1976*4882a593Smuzhiyun reg = readl(base + offset);
1977*4882a593Smuzhiyun reg |= val;
1978*4882a593Smuzhiyun writel(reg, base + offset);
1979*4882a593Smuzhiyun
1980*4882a593Smuzhiyun /* ensure that above write is through */
1981*4882a593Smuzhiyun readl(base + offset);
1982*4882a593Smuzhiyun }
1983*4882a593Smuzhiyun
qphy_clrbits(void __iomem * base,u32 offset,u32 val)1984*4882a593Smuzhiyun static inline void qphy_clrbits(void __iomem *base, u32 offset, u32 val)
1985*4882a593Smuzhiyun {
1986*4882a593Smuzhiyun u32 reg;
1987*4882a593Smuzhiyun
1988*4882a593Smuzhiyun reg = readl(base + offset);
1989*4882a593Smuzhiyun reg &= ~val;
1990*4882a593Smuzhiyun writel(reg, base + offset);
1991*4882a593Smuzhiyun
1992*4882a593Smuzhiyun /* ensure that above write is through */
1993*4882a593Smuzhiyun readl(base + offset);
1994*4882a593Smuzhiyun }
1995*4882a593Smuzhiyun
1996*4882a593Smuzhiyun /* list of clocks required by phy */
1997*4882a593Smuzhiyun static const char * const msm8996_phy_clk_l[] = {
1998*4882a593Smuzhiyun "aux", "cfg_ahb", "ref",
1999*4882a593Smuzhiyun };
2000*4882a593Smuzhiyun
2001*4882a593Smuzhiyun static const char * const msm8996_ufs_phy_clk_l[] = {
2002*4882a593Smuzhiyun "ref",
2003*4882a593Smuzhiyun };
2004*4882a593Smuzhiyun
2005*4882a593Smuzhiyun static const char * const qmp_v3_phy_clk_l[] = {
2006*4882a593Smuzhiyun "aux", "cfg_ahb", "ref", "com_aux",
2007*4882a593Smuzhiyun };
2008*4882a593Smuzhiyun
2009*4882a593Smuzhiyun static const char * const sdm845_pciephy_clk_l[] = {
2010*4882a593Smuzhiyun "aux", "cfg_ahb", "ref", "refgen",
2011*4882a593Smuzhiyun };
2012*4882a593Smuzhiyun
2013*4882a593Smuzhiyun static const char * const qmp_v4_phy_clk_l[] = {
2014*4882a593Smuzhiyun "aux", "ref_clk_src", "ref", "com_aux",
2015*4882a593Smuzhiyun };
2016*4882a593Smuzhiyun
2017*4882a593Smuzhiyun /* the primary usb3 phy on sm8250 doesn't have a ref clock */
2018*4882a593Smuzhiyun static const char * const qmp_v4_sm8250_usbphy_clk_l[] = {
2019*4882a593Smuzhiyun "aux", "ref_clk_src", "com_aux"
2020*4882a593Smuzhiyun };
2021*4882a593Smuzhiyun
2022*4882a593Smuzhiyun static const char * const sdm845_ufs_phy_clk_l[] = {
2023*4882a593Smuzhiyun "ref", "ref_aux",
2024*4882a593Smuzhiyun };
2025*4882a593Smuzhiyun
2026*4882a593Smuzhiyun /* list of resets */
2027*4882a593Smuzhiyun static const char * const msm8996_pciephy_reset_l[] = {
2028*4882a593Smuzhiyun "phy", "common", "cfg",
2029*4882a593Smuzhiyun };
2030*4882a593Smuzhiyun
2031*4882a593Smuzhiyun static const char * const msm8996_usb3phy_reset_l[] = {
2032*4882a593Smuzhiyun "phy", "common",
2033*4882a593Smuzhiyun };
2034*4882a593Smuzhiyun
2035*4882a593Smuzhiyun static const char * const sc7180_usb3phy_reset_l[] = {
2036*4882a593Smuzhiyun "phy",
2037*4882a593Smuzhiyun };
2038*4882a593Smuzhiyun
2039*4882a593Smuzhiyun static const char * const sdm845_pciephy_reset_l[] = {
2040*4882a593Smuzhiyun "phy",
2041*4882a593Smuzhiyun };
2042*4882a593Smuzhiyun
2043*4882a593Smuzhiyun /* list of regulators */
2044*4882a593Smuzhiyun static const char * const qmp_phy_vreg_l[] = {
2045*4882a593Smuzhiyun "vdda-phy", "vdda-pll",
2046*4882a593Smuzhiyun };
2047*4882a593Smuzhiyun
2048*4882a593Smuzhiyun static const struct qmp_phy_cfg ipq8074_usb3phy_cfg = {
2049*4882a593Smuzhiyun .type = PHY_TYPE_USB3,
2050*4882a593Smuzhiyun .nlanes = 1,
2051*4882a593Smuzhiyun
2052*4882a593Smuzhiyun .serdes_tbl = ipq8074_usb3_serdes_tbl,
2053*4882a593Smuzhiyun .serdes_tbl_num = ARRAY_SIZE(ipq8074_usb3_serdes_tbl),
2054*4882a593Smuzhiyun .tx_tbl = msm8996_usb3_tx_tbl,
2055*4882a593Smuzhiyun .tx_tbl_num = ARRAY_SIZE(msm8996_usb3_tx_tbl),
2056*4882a593Smuzhiyun .rx_tbl = ipq8074_usb3_rx_tbl,
2057*4882a593Smuzhiyun .rx_tbl_num = ARRAY_SIZE(ipq8074_usb3_rx_tbl),
2058*4882a593Smuzhiyun .pcs_tbl = ipq8074_usb3_pcs_tbl,
2059*4882a593Smuzhiyun .pcs_tbl_num = ARRAY_SIZE(ipq8074_usb3_pcs_tbl),
2060*4882a593Smuzhiyun .clk_list = msm8996_phy_clk_l,
2061*4882a593Smuzhiyun .num_clks = ARRAY_SIZE(msm8996_phy_clk_l),
2062*4882a593Smuzhiyun .reset_list = msm8996_usb3phy_reset_l,
2063*4882a593Smuzhiyun .num_resets = ARRAY_SIZE(msm8996_usb3phy_reset_l),
2064*4882a593Smuzhiyun .vreg_list = qmp_phy_vreg_l,
2065*4882a593Smuzhiyun .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
2066*4882a593Smuzhiyun .regs = usb3phy_regs_layout,
2067*4882a593Smuzhiyun
2068*4882a593Smuzhiyun .start_ctrl = SERDES_START | PCS_START,
2069*4882a593Smuzhiyun .pwrdn_ctrl = SW_PWRDN,
2070*4882a593Smuzhiyun };
2071*4882a593Smuzhiyun
2072*4882a593Smuzhiyun static const struct qmp_phy_cfg msm8996_pciephy_cfg = {
2073*4882a593Smuzhiyun .type = PHY_TYPE_PCIE,
2074*4882a593Smuzhiyun .nlanes = 3,
2075*4882a593Smuzhiyun
2076*4882a593Smuzhiyun .serdes_tbl = msm8996_pcie_serdes_tbl,
2077*4882a593Smuzhiyun .serdes_tbl_num = ARRAY_SIZE(msm8996_pcie_serdes_tbl),
2078*4882a593Smuzhiyun .tx_tbl = msm8996_pcie_tx_tbl,
2079*4882a593Smuzhiyun .tx_tbl_num = ARRAY_SIZE(msm8996_pcie_tx_tbl),
2080*4882a593Smuzhiyun .rx_tbl = msm8996_pcie_rx_tbl,
2081*4882a593Smuzhiyun .rx_tbl_num = ARRAY_SIZE(msm8996_pcie_rx_tbl),
2082*4882a593Smuzhiyun .pcs_tbl = msm8996_pcie_pcs_tbl,
2083*4882a593Smuzhiyun .pcs_tbl_num = ARRAY_SIZE(msm8996_pcie_pcs_tbl),
2084*4882a593Smuzhiyun .clk_list = msm8996_phy_clk_l,
2085*4882a593Smuzhiyun .num_clks = ARRAY_SIZE(msm8996_phy_clk_l),
2086*4882a593Smuzhiyun .reset_list = msm8996_pciephy_reset_l,
2087*4882a593Smuzhiyun .num_resets = ARRAY_SIZE(msm8996_pciephy_reset_l),
2088*4882a593Smuzhiyun .vreg_list = qmp_phy_vreg_l,
2089*4882a593Smuzhiyun .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
2090*4882a593Smuzhiyun .regs = pciephy_regs_layout,
2091*4882a593Smuzhiyun
2092*4882a593Smuzhiyun .start_ctrl = PCS_START | PLL_READY_GATE_EN,
2093*4882a593Smuzhiyun .pwrdn_ctrl = SW_PWRDN | REFCLK_DRV_DSBL,
2094*4882a593Smuzhiyun .mask_com_pcs_ready = PCS_READY,
2095*4882a593Smuzhiyun
2096*4882a593Smuzhiyun .has_phy_com_ctrl = true,
2097*4882a593Smuzhiyun .has_lane_rst = true,
2098*4882a593Smuzhiyun .has_pwrdn_delay = true,
2099*4882a593Smuzhiyun .pwrdn_delay_min = POWER_DOWN_DELAY_US_MIN,
2100*4882a593Smuzhiyun .pwrdn_delay_max = POWER_DOWN_DELAY_US_MAX,
2101*4882a593Smuzhiyun };
2102*4882a593Smuzhiyun
2103*4882a593Smuzhiyun static const struct qmp_phy_cfg msm8996_ufs_cfg = {
2104*4882a593Smuzhiyun .type = PHY_TYPE_UFS,
2105*4882a593Smuzhiyun .nlanes = 1,
2106*4882a593Smuzhiyun
2107*4882a593Smuzhiyun .serdes_tbl = msm8996_ufs_serdes_tbl,
2108*4882a593Smuzhiyun .serdes_tbl_num = ARRAY_SIZE(msm8996_ufs_serdes_tbl),
2109*4882a593Smuzhiyun .tx_tbl = msm8996_ufs_tx_tbl,
2110*4882a593Smuzhiyun .tx_tbl_num = ARRAY_SIZE(msm8996_ufs_tx_tbl),
2111*4882a593Smuzhiyun .rx_tbl = msm8996_ufs_rx_tbl,
2112*4882a593Smuzhiyun .rx_tbl_num = ARRAY_SIZE(msm8996_ufs_rx_tbl),
2113*4882a593Smuzhiyun
2114*4882a593Smuzhiyun .clk_list = msm8996_ufs_phy_clk_l,
2115*4882a593Smuzhiyun .num_clks = ARRAY_SIZE(msm8996_ufs_phy_clk_l),
2116*4882a593Smuzhiyun
2117*4882a593Smuzhiyun .vreg_list = qmp_phy_vreg_l,
2118*4882a593Smuzhiyun .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
2119*4882a593Smuzhiyun
2120*4882a593Smuzhiyun .regs = msm8996_ufsphy_regs_layout,
2121*4882a593Smuzhiyun
2122*4882a593Smuzhiyun .start_ctrl = SERDES_START,
2123*4882a593Smuzhiyun .pwrdn_ctrl = SW_PWRDN,
2124*4882a593Smuzhiyun
2125*4882a593Smuzhiyun .no_pcs_sw_reset = true,
2126*4882a593Smuzhiyun };
2127*4882a593Smuzhiyun
2128*4882a593Smuzhiyun static const struct qmp_phy_cfg msm8996_usb3phy_cfg = {
2129*4882a593Smuzhiyun .type = PHY_TYPE_USB3,
2130*4882a593Smuzhiyun .nlanes = 1,
2131*4882a593Smuzhiyun
2132*4882a593Smuzhiyun .serdes_tbl = msm8996_usb3_serdes_tbl,
2133*4882a593Smuzhiyun .serdes_tbl_num = ARRAY_SIZE(msm8996_usb3_serdes_tbl),
2134*4882a593Smuzhiyun .tx_tbl = msm8996_usb3_tx_tbl,
2135*4882a593Smuzhiyun .tx_tbl_num = ARRAY_SIZE(msm8996_usb3_tx_tbl),
2136*4882a593Smuzhiyun .rx_tbl = msm8996_usb3_rx_tbl,
2137*4882a593Smuzhiyun .rx_tbl_num = ARRAY_SIZE(msm8996_usb3_rx_tbl),
2138*4882a593Smuzhiyun .pcs_tbl = msm8996_usb3_pcs_tbl,
2139*4882a593Smuzhiyun .pcs_tbl_num = ARRAY_SIZE(msm8996_usb3_pcs_tbl),
2140*4882a593Smuzhiyun .clk_list = msm8996_phy_clk_l,
2141*4882a593Smuzhiyun .num_clks = ARRAY_SIZE(msm8996_phy_clk_l),
2142*4882a593Smuzhiyun .reset_list = msm8996_usb3phy_reset_l,
2143*4882a593Smuzhiyun .num_resets = ARRAY_SIZE(msm8996_usb3phy_reset_l),
2144*4882a593Smuzhiyun .vreg_list = qmp_phy_vreg_l,
2145*4882a593Smuzhiyun .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
2146*4882a593Smuzhiyun .regs = usb3phy_regs_layout,
2147*4882a593Smuzhiyun
2148*4882a593Smuzhiyun .start_ctrl = SERDES_START | PCS_START,
2149*4882a593Smuzhiyun .pwrdn_ctrl = SW_PWRDN,
2150*4882a593Smuzhiyun };
2151*4882a593Smuzhiyun
2152*4882a593Smuzhiyun static const char * const ipq8074_pciephy_clk_l[] = {
2153*4882a593Smuzhiyun "aux", "cfg_ahb",
2154*4882a593Smuzhiyun };
2155*4882a593Smuzhiyun /* list of resets */
2156*4882a593Smuzhiyun static const char * const ipq8074_pciephy_reset_l[] = {
2157*4882a593Smuzhiyun "phy", "common",
2158*4882a593Smuzhiyun };
2159*4882a593Smuzhiyun
2160*4882a593Smuzhiyun static const struct qmp_phy_cfg ipq8074_pciephy_cfg = {
2161*4882a593Smuzhiyun .type = PHY_TYPE_PCIE,
2162*4882a593Smuzhiyun .nlanes = 1,
2163*4882a593Smuzhiyun
2164*4882a593Smuzhiyun .serdes_tbl = ipq8074_pcie_serdes_tbl,
2165*4882a593Smuzhiyun .serdes_tbl_num = ARRAY_SIZE(ipq8074_pcie_serdes_tbl),
2166*4882a593Smuzhiyun .tx_tbl = ipq8074_pcie_tx_tbl,
2167*4882a593Smuzhiyun .tx_tbl_num = ARRAY_SIZE(ipq8074_pcie_tx_tbl),
2168*4882a593Smuzhiyun .rx_tbl = ipq8074_pcie_rx_tbl,
2169*4882a593Smuzhiyun .rx_tbl_num = ARRAY_SIZE(ipq8074_pcie_rx_tbl),
2170*4882a593Smuzhiyun .pcs_tbl = ipq8074_pcie_pcs_tbl,
2171*4882a593Smuzhiyun .pcs_tbl_num = ARRAY_SIZE(ipq8074_pcie_pcs_tbl),
2172*4882a593Smuzhiyun .clk_list = ipq8074_pciephy_clk_l,
2173*4882a593Smuzhiyun .num_clks = ARRAY_SIZE(ipq8074_pciephy_clk_l),
2174*4882a593Smuzhiyun .reset_list = ipq8074_pciephy_reset_l,
2175*4882a593Smuzhiyun .num_resets = ARRAY_SIZE(ipq8074_pciephy_reset_l),
2176*4882a593Smuzhiyun .vreg_list = NULL,
2177*4882a593Smuzhiyun .num_vregs = 0,
2178*4882a593Smuzhiyun .regs = pciephy_regs_layout,
2179*4882a593Smuzhiyun
2180*4882a593Smuzhiyun .start_ctrl = SERDES_START | PCS_START,
2181*4882a593Smuzhiyun .pwrdn_ctrl = SW_PWRDN | REFCLK_DRV_DSBL,
2182*4882a593Smuzhiyun
2183*4882a593Smuzhiyun .has_phy_com_ctrl = false,
2184*4882a593Smuzhiyun .has_lane_rst = false,
2185*4882a593Smuzhiyun .has_pwrdn_delay = true,
2186*4882a593Smuzhiyun .pwrdn_delay_min = 995, /* us */
2187*4882a593Smuzhiyun .pwrdn_delay_max = 1005, /* us */
2188*4882a593Smuzhiyun };
2189*4882a593Smuzhiyun
2190*4882a593Smuzhiyun static const struct qmp_phy_cfg sdm845_qmp_pciephy_cfg = {
2191*4882a593Smuzhiyun .type = PHY_TYPE_PCIE,
2192*4882a593Smuzhiyun .nlanes = 1,
2193*4882a593Smuzhiyun
2194*4882a593Smuzhiyun .serdes_tbl = sdm845_qmp_pcie_serdes_tbl,
2195*4882a593Smuzhiyun .serdes_tbl_num = ARRAY_SIZE(sdm845_qmp_pcie_serdes_tbl),
2196*4882a593Smuzhiyun .tx_tbl = sdm845_qmp_pcie_tx_tbl,
2197*4882a593Smuzhiyun .tx_tbl_num = ARRAY_SIZE(sdm845_qmp_pcie_tx_tbl),
2198*4882a593Smuzhiyun .rx_tbl = sdm845_qmp_pcie_rx_tbl,
2199*4882a593Smuzhiyun .rx_tbl_num = ARRAY_SIZE(sdm845_qmp_pcie_rx_tbl),
2200*4882a593Smuzhiyun .pcs_tbl = sdm845_qmp_pcie_pcs_tbl,
2201*4882a593Smuzhiyun .pcs_tbl_num = ARRAY_SIZE(sdm845_qmp_pcie_pcs_tbl),
2202*4882a593Smuzhiyun .pcs_misc_tbl = sdm845_qmp_pcie_pcs_misc_tbl,
2203*4882a593Smuzhiyun .pcs_misc_tbl_num = ARRAY_SIZE(sdm845_qmp_pcie_pcs_misc_tbl),
2204*4882a593Smuzhiyun .clk_list = sdm845_pciephy_clk_l,
2205*4882a593Smuzhiyun .num_clks = ARRAY_SIZE(sdm845_pciephy_clk_l),
2206*4882a593Smuzhiyun .reset_list = sdm845_pciephy_reset_l,
2207*4882a593Smuzhiyun .num_resets = ARRAY_SIZE(sdm845_pciephy_reset_l),
2208*4882a593Smuzhiyun .vreg_list = qmp_phy_vreg_l,
2209*4882a593Smuzhiyun .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
2210*4882a593Smuzhiyun .regs = sdm845_qmp_pciephy_regs_layout,
2211*4882a593Smuzhiyun
2212*4882a593Smuzhiyun .start_ctrl = PCS_START | SERDES_START,
2213*4882a593Smuzhiyun .pwrdn_ctrl = SW_PWRDN | REFCLK_DRV_DSBL,
2214*4882a593Smuzhiyun
2215*4882a593Smuzhiyun .has_pwrdn_delay = true,
2216*4882a593Smuzhiyun .pwrdn_delay_min = 995, /* us */
2217*4882a593Smuzhiyun .pwrdn_delay_max = 1005, /* us */
2218*4882a593Smuzhiyun };
2219*4882a593Smuzhiyun
2220*4882a593Smuzhiyun static const struct qmp_phy_cfg sdm845_qhp_pciephy_cfg = {
2221*4882a593Smuzhiyun .type = PHY_TYPE_PCIE,
2222*4882a593Smuzhiyun .nlanes = 1,
2223*4882a593Smuzhiyun
2224*4882a593Smuzhiyun .serdes_tbl = sdm845_qhp_pcie_serdes_tbl,
2225*4882a593Smuzhiyun .serdes_tbl_num = ARRAY_SIZE(sdm845_qhp_pcie_serdes_tbl),
2226*4882a593Smuzhiyun .tx_tbl = sdm845_qhp_pcie_tx_tbl,
2227*4882a593Smuzhiyun .tx_tbl_num = ARRAY_SIZE(sdm845_qhp_pcie_tx_tbl),
2228*4882a593Smuzhiyun .rx_tbl = sdm845_qhp_pcie_rx_tbl,
2229*4882a593Smuzhiyun .rx_tbl_num = ARRAY_SIZE(sdm845_qhp_pcie_rx_tbl),
2230*4882a593Smuzhiyun .pcs_tbl = sdm845_qhp_pcie_pcs_tbl,
2231*4882a593Smuzhiyun .pcs_tbl_num = ARRAY_SIZE(sdm845_qhp_pcie_pcs_tbl),
2232*4882a593Smuzhiyun .clk_list = sdm845_pciephy_clk_l,
2233*4882a593Smuzhiyun .num_clks = ARRAY_SIZE(sdm845_pciephy_clk_l),
2234*4882a593Smuzhiyun .reset_list = sdm845_pciephy_reset_l,
2235*4882a593Smuzhiyun .num_resets = ARRAY_SIZE(sdm845_pciephy_reset_l),
2236*4882a593Smuzhiyun .vreg_list = qmp_phy_vreg_l,
2237*4882a593Smuzhiyun .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
2238*4882a593Smuzhiyun .regs = sdm845_qhp_pciephy_regs_layout,
2239*4882a593Smuzhiyun
2240*4882a593Smuzhiyun .start_ctrl = PCS_START | SERDES_START,
2241*4882a593Smuzhiyun .pwrdn_ctrl = SW_PWRDN | REFCLK_DRV_DSBL,
2242*4882a593Smuzhiyun
2243*4882a593Smuzhiyun .has_pwrdn_delay = true,
2244*4882a593Smuzhiyun .pwrdn_delay_min = 995, /* us */
2245*4882a593Smuzhiyun .pwrdn_delay_max = 1005, /* us */
2246*4882a593Smuzhiyun };
2247*4882a593Smuzhiyun
2248*4882a593Smuzhiyun static const struct qmp_phy_cfg qmp_v3_usb3phy_cfg = {
2249*4882a593Smuzhiyun .type = PHY_TYPE_USB3,
2250*4882a593Smuzhiyun .nlanes = 1,
2251*4882a593Smuzhiyun
2252*4882a593Smuzhiyun .serdes_tbl = qmp_v3_usb3_serdes_tbl,
2253*4882a593Smuzhiyun .serdes_tbl_num = ARRAY_SIZE(qmp_v3_usb3_serdes_tbl),
2254*4882a593Smuzhiyun .tx_tbl = qmp_v3_usb3_tx_tbl,
2255*4882a593Smuzhiyun .tx_tbl_num = ARRAY_SIZE(qmp_v3_usb3_tx_tbl),
2256*4882a593Smuzhiyun .rx_tbl = qmp_v3_usb3_rx_tbl,
2257*4882a593Smuzhiyun .rx_tbl_num = ARRAY_SIZE(qmp_v3_usb3_rx_tbl),
2258*4882a593Smuzhiyun .pcs_tbl = qmp_v3_usb3_pcs_tbl,
2259*4882a593Smuzhiyun .pcs_tbl_num = ARRAY_SIZE(qmp_v3_usb3_pcs_tbl),
2260*4882a593Smuzhiyun .clk_list = qmp_v3_phy_clk_l,
2261*4882a593Smuzhiyun .num_clks = ARRAY_SIZE(qmp_v3_phy_clk_l),
2262*4882a593Smuzhiyun .reset_list = msm8996_usb3phy_reset_l,
2263*4882a593Smuzhiyun .num_resets = ARRAY_SIZE(msm8996_usb3phy_reset_l),
2264*4882a593Smuzhiyun .vreg_list = qmp_phy_vreg_l,
2265*4882a593Smuzhiyun .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
2266*4882a593Smuzhiyun .regs = qmp_v3_usb3phy_regs_layout,
2267*4882a593Smuzhiyun
2268*4882a593Smuzhiyun .start_ctrl = SERDES_START | PCS_START,
2269*4882a593Smuzhiyun .pwrdn_ctrl = SW_PWRDN,
2270*4882a593Smuzhiyun
2271*4882a593Smuzhiyun .has_pwrdn_delay = true,
2272*4882a593Smuzhiyun .pwrdn_delay_min = POWER_DOWN_DELAY_US_MIN,
2273*4882a593Smuzhiyun .pwrdn_delay_max = POWER_DOWN_DELAY_US_MAX,
2274*4882a593Smuzhiyun
2275*4882a593Smuzhiyun .has_phy_dp_com_ctrl = true,
2276*4882a593Smuzhiyun .is_dual_lane_phy = true,
2277*4882a593Smuzhiyun };
2278*4882a593Smuzhiyun
2279*4882a593Smuzhiyun static const struct qmp_phy_cfg sc7180_usb3phy_cfg = {
2280*4882a593Smuzhiyun .type = PHY_TYPE_USB3,
2281*4882a593Smuzhiyun .nlanes = 1,
2282*4882a593Smuzhiyun
2283*4882a593Smuzhiyun .serdes_tbl = qmp_v3_usb3_serdes_tbl,
2284*4882a593Smuzhiyun .serdes_tbl_num = ARRAY_SIZE(qmp_v3_usb3_serdes_tbl),
2285*4882a593Smuzhiyun .tx_tbl = qmp_v3_usb3_tx_tbl,
2286*4882a593Smuzhiyun .tx_tbl_num = ARRAY_SIZE(qmp_v3_usb3_tx_tbl),
2287*4882a593Smuzhiyun .rx_tbl = qmp_v3_usb3_rx_tbl,
2288*4882a593Smuzhiyun .rx_tbl_num = ARRAY_SIZE(qmp_v3_usb3_rx_tbl),
2289*4882a593Smuzhiyun .pcs_tbl = qmp_v3_usb3_pcs_tbl,
2290*4882a593Smuzhiyun .pcs_tbl_num = ARRAY_SIZE(qmp_v3_usb3_pcs_tbl),
2291*4882a593Smuzhiyun .clk_list = qmp_v3_phy_clk_l,
2292*4882a593Smuzhiyun .num_clks = ARRAY_SIZE(qmp_v3_phy_clk_l),
2293*4882a593Smuzhiyun .reset_list = sc7180_usb3phy_reset_l,
2294*4882a593Smuzhiyun .num_resets = ARRAY_SIZE(sc7180_usb3phy_reset_l),
2295*4882a593Smuzhiyun .vreg_list = qmp_phy_vreg_l,
2296*4882a593Smuzhiyun .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
2297*4882a593Smuzhiyun .regs = qmp_v3_usb3phy_regs_layout,
2298*4882a593Smuzhiyun
2299*4882a593Smuzhiyun .start_ctrl = SERDES_START | PCS_START,
2300*4882a593Smuzhiyun .pwrdn_ctrl = SW_PWRDN,
2301*4882a593Smuzhiyun
2302*4882a593Smuzhiyun .has_pwrdn_delay = true,
2303*4882a593Smuzhiyun .pwrdn_delay_min = POWER_DOWN_DELAY_US_MIN,
2304*4882a593Smuzhiyun .pwrdn_delay_max = POWER_DOWN_DELAY_US_MAX,
2305*4882a593Smuzhiyun
2306*4882a593Smuzhiyun .has_phy_dp_com_ctrl = true,
2307*4882a593Smuzhiyun .is_dual_lane_phy = true,
2308*4882a593Smuzhiyun };
2309*4882a593Smuzhiyun
2310*4882a593Smuzhiyun static const struct qmp_phy_cfg sc7180_dpphy_cfg = {
2311*4882a593Smuzhiyun .type = PHY_TYPE_DP,
2312*4882a593Smuzhiyun .nlanes = 1,
2313*4882a593Smuzhiyun
2314*4882a593Smuzhiyun .serdes_tbl = qmp_v3_dp_serdes_tbl,
2315*4882a593Smuzhiyun .serdes_tbl_num = ARRAY_SIZE(qmp_v3_dp_serdes_tbl),
2316*4882a593Smuzhiyun .tx_tbl = qmp_v3_dp_tx_tbl,
2317*4882a593Smuzhiyun .tx_tbl_num = ARRAY_SIZE(qmp_v3_dp_tx_tbl),
2318*4882a593Smuzhiyun
2319*4882a593Smuzhiyun .serdes_tbl_rbr = qmp_v3_dp_serdes_tbl_rbr,
2320*4882a593Smuzhiyun .serdes_tbl_rbr_num = ARRAY_SIZE(qmp_v3_dp_serdes_tbl_rbr),
2321*4882a593Smuzhiyun .serdes_tbl_hbr = qmp_v3_dp_serdes_tbl_hbr,
2322*4882a593Smuzhiyun .serdes_tbl_hbr_num = ARRAY_SIZE(qmp_v3_dp_serdes_tbl_hbr),
2323*4882a593Smuzhiyun .serdes_tbl_hbr2 = qmp_v3_dp_serdes_tbl_hbr2,
2324*4882a593Smuzhiyun .serdes_tbl_hbr2_num = ARRAY_SIZE(qmp_v3_dp_serdes_tbl_hbr2),
2325*4882a593Smuzhiyun .serdes_tbl_hbr3 = qmp_v3_dp_serdes_tbl_hbr3,
2326*4882a593Smuzhiyun .serdes_tbl_hbr3_num = ARRAY_SIZE(qmp_v3_dp_serdes_tbl_hbr3),
2327*4882a593Smuzhiyun
2328*4882a593Smuzhiyun .clk_list = qmp_v3_phy_clk_l,
2329*4882a593Smuzhiyun .num_clks = ARRAY_SIZE(qmp_v3_phy_clk_l),
2330*4882a593Smuzhiyun .reset_list = sc7180_usb3phy_reset_l,
2331*4882a593Smuzhiyun .num_resets = ARRAY_SIZE(sc7180_usb3phy_reset_l),
2332*4882a593Smuzhiyun .vreg_list = qmp_phy_vreg_l,
2333*4882a593Smuzhiyun .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
2334*4882a593Smuzhiyun .regs = qmp_v3_usb3phy_regs_layout,
2335*4882a593Smuzhiyun
2336*4882a593Smuzhiyun .has_phy_dp_com_ctrl = true,
2337*4882a593Smuzhiyun .is_dual_lane_phy = true,
2338*4882a593Smuzhiyun };
2339*4882a593Smuzhiyun
2340*4882a593Smuzhiyun static const struct qmp_phy_combo_cfg sc7180_usb3dpphy_cfg = {
2341*4882a593Smuzhiyun .usb_cfg = &sc7180_usb3phy_cfg,
2342*4882a593Smuzhiyun .dp_cfg = &sc7180_dpphy_cfg,
2343*4882a593Smuzhiyun };
2344*4882a593Smuzhiyun
2345*4882a593Smuzhiyun static const struct qmp_phy_cfg qmp_v3_usb3_uniphy_cfg = {
2346*4882a593Smuzhiyun .type = PHY_TYPE_USB3,
2347*4882a593Smuzhiyun .nlanes = 1,
2348*4882a593Smuzhiyun
2349*4882a593Smuzhiyun .serdes_tbl = qmp_v3_usb3_uniphy_serdes_tbl,
2350*4882a593Smuzhiyun .serdes_tbl_num = ARRAY_SIZE(qmp_v3_usb3_uniphy_serdes_tbl),
2351*4882a593Smuzhiyun .tx_tbl = qmp_v3_usb3_uniphy_tx_tbl,
2352*4882a593Smuzhiyun .tx_tbl_num = ARRAY_SIZE(qmp_v3_usb3_uniphy_tx_tbl),
2353*4882a593Smuzhiyun .rx_tbl = qmp_v3_usb3_uniphy_rx_tbl,
2354*4882a593Smuzhiyun .rx_tbl_num = ARRAY_SIZE(qmp_v3_usb3_uniphy_rx_tbl),
2355*4882a593Smuzhiyun .pcs_tbl = qmp_v3_usb3_uniphy_pcs_tbl,
2356*4882a593Smuzhiyun .pcs_tbl_num = ARRAY_SIZE(qmp_v3_usb3_uniphy_pcs_tbl),
2357*4882a593Smuzhiyun .clk_list = qmp_v3_phy_clk_l,
2358*4882a593Smuzhiyun .num_clks = ARRAY_SIZE(qmp_v3_phy_clk_l),
2359*4882a593Smuzhiyun .reset_list = msm8996_usb3phy_reset_l,
2360*4882a593Smuzhiyun .num_resets = ARRAY_SIZE(msm8996_usb3phy_reset_l),
2361*4882a593Smuzhiyun .vreg_list = qmp_phy_vreg_l,
2362*4882a593Smuzhiyun .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
2363*4882a593Smuzhiyun .regs = qmp_v3_usb3phy_regs_layout,
2364*4882a593Smuzhiyun
2365*4882a593Smuzhiyun .start_ctrl = SERDES_START | PCS_START,
2366*4882a593Smuzhiyun .pwrdn_ctrl = SW_PWRDN,
2367*4882a593Smuzhiyun
2368*4882a593Smuzhiyun .has_pwrdn_delay = true,
2369*4882a593Smuzhiyun .pwrdn_delay_min = POWER_DOWN_DELAY_US_MIN,
2370*4882a593Smuzhiyun .pwrdn_delay_max = POWER_DOWN_DELAY_US_MAX,
2371*4882a593Smuzhiyun };
2372*4882a593Smuzhiyun
2373*4882a593Smuzhiyun static const struct qmp_phy_cfg sdm845_ufsphy_cfg = {
2374*4882a593Smuzhiyun .type = PHY_TYPE_UFS,
2375*4882a593Smuzhiyun .nlanes = 2,
2376*4882a593Smuzhiyun
2377*4882a593Smuzhiyun .serdes_tbl = sdm845_ufsphy_serdes_tbl,
2378*4882a593Smuzhiyun .serdes_tbl_num = ARRAY_SIZE(sdm845_ufsphy_serdes_tbl),
2379*4882a593Smuzhiyun .tx_tbl = sdm845_ufsphy_tx_tbl,
2380*4882a593Smuzhiyun .tx_tbl_num = ARRAY_SIZE(sdm845_ufsphy_tx_tbl),
2381*4882a593Smuzhiyun .rx_tbl = sdm845_ufsphy_rx_tbl,
2382*4882a593Smuzhiyun .rx_tbl_num = ARRAY_SIZE(sdm845_ufsphy_rx_tbl),
2383*4882a593Smuzhiyun .pcs_tbl = sdm845_ufsphy_pcs_tbl,
2384*4882a593Smuzhiyun .pcs_tbl_num = ARRAY_SIZE(sdm845_ufsphy_pcs_tbl),
2385*4882a593Smuzhiyun .clk_list = sdm845_ufs_phy_clk_l,
2386*4882a593Smuzhiyun .num_clks = ARRAY_SIZE(sdm845_ufs_phy_clk_l),
2387*4882a593Smuzhiyun .vreg_list = qmp_phy_vreg_l,
2388*4882a593Smuzhiyun .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
2389*4882a593Smuzhiyun .regs = sdm845_ufsphy_regs_layout,
2390*4882a593Smuzhiyun
2391*4882a593Smuzhiyun .start_ctrl = SERDES_START,
2392*4882a593Smuzhiyun .pwrdn_ctrl = SW_PWRDN,
2393*4882a593Smuzhiyun
2394*4882a593Smuzhiyun .is_dual_lane_phy = true,
2395*4882a593Smuzhiyun .no_pcs_sw_reset = true,
2396*4882a593Smuzhiyun };
2397*4882a593Smuzhiyun
2398*4882a593Smuzhiyun static const struct qmp_phy_cfg msm8998_pciephy_cfg = {
2399*4882a593Smuzhiyun .type = PHY_TYPE_PCIE,
2400*4882a593Smuzhiyun .nlanes = 1,
2401*4882a593Smuzhiyun
2402*4882a593Smuzhiyun .serdes_tbl = msm8998_pcie_serdes_tbl,
2403*4882a593Smuzhiyun .serdes_tbl_num = ARRAY_SIZE(msm8998_pcie_serdes_tbl),
2404*4882a593Smuzhiyun .tx_tbl = msm8998_pcie_tx_tbl,
2405*4882a593Smuzhiyun .tx_tbl_num = ARRAY_SIZE(msm8998_pcie_tx_tbl),
2406*4882a593Smuzhiyun .rx_tbl = msm8998_pcie_rx_tbl,
2407*4882a593Smuzhiyun .rx_tbl_num = ARRAY_SIZE(msm8998_pcie_rx_tbl),
2408*4882a593Smuzhiyun .pcs_tbl = msm8998_pcie_pcs_tbl,
2409*4882a593Smuzhiyun .pcs_tbl_num = ARRAY_SIZE(msm8998_pcie_pcs_tbl),
2410*4882a593Smuzhiyun .clk_list = msm8996_phy_clk_l,
2411*4882a593Smuzhiyun .num_clks = ARRAY_SIZE(msm8996_phy_clk_l),
2412*4882a593Smuzhiyun .reset_list = ipq8074_pciephy_reset_l,
2413*4882a593Smuzhiyun .num_resets = ARRAY_SIZE(ipq8074_pciephy_reset_l),
2414*4882a593Smuzhiyun .vreg_list = qmp_phy_vreg_l,
2415*4882a593Smuzhiyun .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
2416*4882a593Smuzhiyun .regs = pciephy_regs_layout,
2417*4882a593Smuzhiyun
2418*4882a593Smuzhiyun .start_ctrl = SERDES_START | PCS_START,
2419*4882a593Smuzhiyun .pwrdn_ctrl = SW_PWRDN | REFCLK_DRV_DSBL,
2420*4882a593Smuzhiyun };
2421*4882a593Smuzhiyun
2422*4882a593Smuzhiyun static const struct qmp_phy_cfg msm8998_usb3phy_cfg = {
2423*4882a593Smuzhiyun .type = PHY_TYPE_USB3,
2424*4882a593Smuzhiyun .nlanes = 1,
2425*4882a593Smuzhiyun
2426*4882a593Smuzhiyun .serdes_tbl = msm8998_usb3_serdes_tbl,
2427*4882a593Smuzhiyun .serdes_tbl_num = ARRAY_SIZE(msm8998_usb3_serdes_tbl),
2428*4882a593Smuzhiyun .tx_tbl = msm8998_usb3_tx_tbl,
2429*4882a593Smuzhiyun .tx_tbl_num = ARRAY_SIZE(msm8998_usb3_tx_tbl),
2430*4882a593Smuzhiyun .rx_tbl = msm8998_usb3_rx_tbl,
2431*4882a593Smuzhiyun .rx_tbl_num = ARRAY_SIZE(msm8998_usb3_rx_tbl),
2432*4882a593Smuzhiyun .pcs_tbl = msm8998_usb3_pcs_tbl,
2433*4882a593Smuzhiyun .pcs_tbl_num = ARRAY_SIZE(msm8998_usb3_pcs_tbl),
2434*4882a593Smuzhiyun .clk_list = msm8996_phy_clk_l,
2435*4882a593Smuzhiyun .num_clks = ARRAY_SIZE(msm8996_phy_clk_l),
2436*4882a593Smuzhiyun .reset_list = msm8996_usb3phy_reset_l,
2437*4882a593Smuzhiyun .num_resets = ARRAY_SIZE(msm8996_usb3phy_reset_l),
2438*4882a593Smuzhiyun .vreg_list = qmp_phy_vreg_l,
2439*4882a593Smuzhiyun .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
2440*4882a593Smuzhiyun .regs = qmp_v3_usb3phy_regs_layout,
2441*4882a593Smuzhiyun
2442*4882a593Smuzhiyun .start_ctrl = SERDES_START | PCS_START,
2443*4882a593Smuzhiyun .pwrdn_ctrl = SW_PWRDN,
2444*4882a593Smuzhiyun
2445*4882a593Smuzhiyun .is_dual_lane_phy = true,
2446*4882a593Smuzhiyun };
2447*4882a593Smuzhiyun
2448*4882a593Smuzhiyun static const struct qmp_phy_cfg sm8150_ufsphy_cfg = {
2449*4882a593Smuzhiyun .type = PHY_TYPE_UFS,
2450*4882a593Smuzhiyun .nlanes = 2,
2451*4882a593Smuzhiyun
2452*4882a593Smuzhiyun .serdes_tbl = sm8150_ufsphy_serdes_tbl,
2453*4882a593Smuzhiyun .serdes_tbl_num = ARRAY_SIZE(sm8150_ufsphy_serdes_tbl),
2454*4882a593Smuzhiyun .tx_tbl = sm8150_ufsphy_tx_tbl,
2455*4882a593Smuzhiyun .tx_tbl_num = ARRAY_SIZE(sm8150_ufsphy_tx_tbl),
2456*4882a593Smuzhiyun .rx_tbl = sm8150_ufsphy_rx_tbl,
2457*4882a593Smuzhiyun .rx_tbl_num = ARRAY_SIZE(sm8150_ufsphy_rx_tbl),
2458*4882a593Smuzhiyun .pcs_tbl = sm8150_ufsphy_pcs_tbl,
2459*4882a593Smuzhiyun .pcs_tbl_num = ARRAY_SIZE(sm8150_ufsphy_pcs_tbl),
2460*4882a593Smuzhiyun .clk_list = sdm845_ufs_phy_clk_l,
2461*4882a593Smuzhiyun .num_clks = ARRAY_SIZE(sdm845_ufs_phy_clk_l),
2462*4882a593Smuzhiyun .vreg_list = qmp_phy_vreg_l,
2463*4882a593Smuzhiyun .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
2464*4882a593Smuzhiyun .regs = sm8150_ufsphy_regs_layout,
2465*4882a593Smuzhiyun
2466*4882a593Smuzhiyun .start_ctrl = SERDES_START,
2467*4882a593Smuzhiyun .pwrdn_ctrl = SW_PWRDN,
2468*4882a593Smuzhiyun
2469*4882a593Smuzhiyun .is_dual_lane_phy = true,
2470*4882a593Smuzhiyun };
2471*4882a593Smuzhiyun
2472*4882a593Smuzhiyun static const struct qmp_phy_cfg sm8150_usb3phy_cfg = {
2473*4882a593Smuzhiyun .type = PHY_TYPE_USB3,
2474*4882a593Smuzhiyun .nlanes = 1,
2475*4882a593Smuzhiyun
2476*4882a593Smuzhiyun .serdes_tbl = sm8150_usb3_serdes_tbl,
2477*4882a593Smuzhiyun .serdes_tbl_num = ARRAY_SIZE(sm8150_usb3_serdes_tbl),
2478*4882a593Smuzhiyun .tx_tbl = sm8150_usb3_tx_tbl,
2479*4882a593Smuzhiyun .tx_tbl_num = ARRAY_SIZE(sm8150_usb3_tx_tbl),
2480*4882a593Smuzhiyun .rx_tbl = sm8150_usb3_rx_tbl,
2481*4882a593Smuzhiyun .rx_tbl_num = ARRAY_SIZE(sm8150_usb3_rx_tbl),
2482*4882a593Smuzhiyun .pcs_tbl = sm8150_usb3_pcs_tbl,
2483*4882a593Smuzhiyun .pcs_tbl_num = ARRAY_SIZE(sm8150_usb3_pcs_tbl),
2484*4882a593Smuzhiyun .clk_list = qmp_v4_phy_clk_l,
2485*4882a593Smuzhiyun .num_clks = ARRAY_SIZE(qmp_v4_phy_clk_l),
2486*4882a593Smuzhiyun .reset_list = msm8996_usb3phy_reset_l,
2487*4882a593Smuzhiyun .num_resets = ARRAY_SIZE(msm8996_usb3phy_reset_l),
2488*4882a593Smuzhiyun .vreg_list = qmp_phy_vreg_l,
2489*4882a593Smuzhiyun .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
2490*4882a593Smuzhiyun .regs = qmp_v4_usb3phy_regs_layout,
2491*4882a593Smuzhiyun
2492*4882a593Smuzhiyun .start_ctrl = SERDES_START | PCS_START,
2493*4882a593Smuzhiyun .pwrdn_ctrl = SW_PWRDN,
2494*4882a593Smuzhiyun
2495*4882a593Smuzhiyun .has_pwrdn_delay = true,
2496*4882a593Smuzhiyun .pwrdn_delay_min = POWER_DOWN_DELAY_US_MIN,
2497*4882a593Smuzhiyun .pwrdn_delay_max = POWER_DOWN_DELAY_US_MAX,
2498*4882a593Smuzhiyun
2499*4882a593Smuzhiyun .has_phy_dp_com_ctrl = true,
2500*4882a593Smuzhiyun .is_dual_lane_phy = true,
2501*4882a593Smuzhiyun };
2502*4882a593Smuzhiyun
2503*4882a593Smuzhiyun static const struct qmp_phy_cfg sm8150_usb3_uniphy_cfg = {
2504*4882a593Smuzhiyun .type = PHY_TYPE_USB3,
2505*4882a593Smuzhiyun .nlanes = 1,
2506*4882a593Smuzhiyun
2507*4882a593Smuzhiyun .serdes_tbl = sm8150_usb3_uniphy_serdes_tbl,
2508*4882a593Smuzhiyun .serdes_tbl_num = ARRAY_SIZE(sm8150_usb3_uniphy_serdes_tbl),
2509*4882a593Smuzhiyun .tx_tbl = sm8150_usb3_uniphy_tx_tbl,
2510*4882a593Smuzhiyun .tx_tbl_num = ARRAY_SIZE(sm8150_usb3_uniphy_tx_tbl),
2511*4882a593Smuzhiyun .rx_tbl = sm8150_usb3_uniphy_rx_tbl,
2512*4882a593Smuzhiyun .rx_tbl_num = ARRAY_SIZE(sm8150_usb3_uniphy_rx_tbl),
2513*4882a593Smuzhiyun .pcs_tbl = sm8150_usb3_uniphy_pcs_tbl,
2514*4882a593Smuzhiyun .pcs_tbl_num = ARRAY_SIZE(sm8150_usb3_uniphy_pcs_tbl),
2515*4882a593Smuzhiyun .clk_list = qmp_v4_phy_clk_l,
2516*4882a593Smuzhiyun .num_clks = ARRAY_SIZE(qmp_v4_phy_clk_l),
2517*4882a593Smuzhiyun .reset_list = msm8996_usb3phy_reset_l,
2518*4882a593Smuzhiyun .num_resets = ARRAY_SIZE(msm8996_usb3phy_reset_l),
2519*4882a593Smuzhiyun .vreg_list = qmp_phy_vreg_l,
2520*4882a593Smuzhiyun .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
2521*4882a593Smuzhiyun .regs = qmp_v4_usb3_uniphy_regs_layout,
2522*4882a593Smuzhiyun
2523*4882a593Smuzhiyun .start_ctrl = SERDES_START | PCS_START,
2524*4882a593Smuzhiyun .pwrdn_ctrl = SW_PWRDN,
2525*4882a593Smuzhiyun
2526*4882a593Smuzhiyun .has_pwrdn_delay = true,
2527*4882a593Smuzhiyun .pwrdn_delay_min = POWER_DOWN_DELAY_US_MIN,
2528*4882a593Smuzhiyun .pwrdn_delay_max = POWER_DOWN_DELAY_US_MAX,
2529*4882a593Smuzhiyun };
2530*4882a593Smuzhiyun
2531*4882a593Smuzhiyun static const struct qmp_phy_cfg sm8250_usb3phy_cfg = {
2532*4882a593Smuzhiyun .type = PHY_TYPE_USB3,
2533*4882a593Smuzhiyun .nlanes = 1,
2534*4882a593Smuzhiyun
2535*4882a593Smuzhiyun .serdes_tbl = sm8150_usb3_serdes_tbl,
2536*4882a593Smuzhiyun .serdes_tbl_num = ARRAY_SIZE(sm8150_usb3_serdes_tbl),
2537*4882a593Smuzhiyun .tx_tbl = sm8250_usb3_tx_tbl,
2538*4882a593Smuzhiyun .tx_tbl_num = ARRAY_SIZE(sm8250_usb3_tx_tbl),
2539*4882a593Smuzhiyun .rx_tbl = sm8250_usb3_rx_tbl,
2540*4882a593Smuzhiyun .rx_tbl_num = ARRAY_SIZE(sm8250_usb3_rx_tbl),
2541*4882a593Smuzhiyun .pcs_tbl = sm8250_usb3_pcs_tbl,
2542*4882a593Smuzhiyun .pcs_tbl_num = ARRAY_SIZE(sm8250_usb3_pcs_tbl),
2543*4882a593Smuzhiyun .clk_list = qmp_v4_sm8250_usbphy_clk_l,
2544*4882a593Smuzhiyun .num_clks = ARRAY_SIZE(qmp_v4_sm8250_usbphy_clk_l),
2545*4882a593Smuzhiyun .reset_list = msm8996_usb3phy_reset_l,
2546*4882a593Smuzhiyun .num_resets = ARRAY_SIZE(msm8996_usb3phy_reset_l),
2547*4882a593Smuzhiyun .vreg_list = qmp_phy_vreg_l,
2548*4882a593Smuzhiyun .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
2549*4882a593Smuzhiyun .regs = qmp_v4_usb3phy_regs_layout,
2550*4882a593Smuzhiyun
2551*4882a593Smuzhiyun .start_ctrl = SERDES_START | PCS_START,
2552*4882a593Smuzhiyun .pwrdn_ctrl = SW_PWRDN,
2553*4882a593Smuzhiyun
2554*4882a593Smuzhiyun .has_pwrdn_delay = true,
2555*4882a593Smuzhiyun .pwrdn_delay_min = POWER_DOWN_DELAY_US_MIN,
2556*4882a593Smuzhiyun .pwrdn_delay_max = POWER_DOWN_DELAY_US_MAX,
2557*4882a593Smuzhiyun
2558*4882a593Smuzhiyun .has_phy_dp_com_ctrl = true,
2559*4882a593Smuzhiyun .is_dual_lane_phy = true,
2560*4882a593Smuzhiyun };
2561*4882a593Smuzhiyun
2562*4882a593Smuzhiyun static const struct qmp_phy_cfg sm8250_usb3_uniphy_cfg = {
2563*4882a593Smuzhiyun .type = PHY_TYPE_USB3,
2564*4882a593Smuzhiyun .nlanes = 1,
2565*4882a593Smuzhiyun
2566*4882a593Smuzhiyun .serdes_tbl = sm8150_usb3_uniphy_serdes_tbl,
2567*4882a593Smuzhiyun .serdes_tbl_num = ARRAY_SIZE(sm8150_usb3_uniphy_serdes_tbl),
2568*4882a593Smuzhiyun .tx_tbl = sm8250_usb3_uniphy_tx_tbl,
2569*4882a593Smuzhiyun .tx_tbl_num = ARRAY_SIZE(sm8250_usb3_uniphy_tx_tbl),
2570*4882a593Smuzhiyun .rx_tbl = sm8250_usb3_uniphy_rx_tbl,
2571*4882a593Smuzhiyun .rx_tbl_num = ARRAY_SIZE(sm8250_usb3_uniphy_rx_tbl),
2572*4882a593Smuzhiyun .pcs_tbl = sm8250_usb3_uniphy_pcs_tbl,
2573*4882a593Smuzhiyun .pcs_tbl_num = ARRAY_SIZE(sm8250_usb3_uniphy_pcs_tbl),
2574*4882a593Smuzhiyun .clk_list = qmp_v4_phy_clk_l,
2575*4882a593Smuzhiyun .num_clks = ARRAY_SIZE(qmp_v4_phy_clk_l),
2576*4882a593Smuzhiyun .reset_list = msm8996_usb3phy_reset_l,
2577*4882a593Smuzhiyun .num_resets = ARRAY_SIZE(msm8996_usb3phy_reset_l),
2578*4882a593Smuzhiyun .vreg_list = qmp_phy_vreg_l,
2579*4882a593Smuzhiyun .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l),
2580*4882a593Smuzhiyun .regs = qmp_v4_usb3_uniphy_regs_layout,
2581*4882a593Smuzhiyun
2582*4882a593Smuzhiyun .start_ctrl = SERDES_START | PCS_START,
2583*4882a593Smuzhiyun .pwrdn_ctrl = SW_PWRDN,
2584*4882a593Smuzhiyun
2585*4882a593Smuzhiyun .has_pwrdn_delay = true,
2586*4882a593Smuzhiyun .pwrdn_delay_min = POWER_DOWN_DELAY_US_MIN,
2587*4882a593Smuzhiyun .pwrdn_delay_max = POWER_DOWN_DELAY_US_MAX,
2588*4882a593Smuzhiyun };
2589*4882a593Smuzhiyun
qcom_qmp_phy_configure_lane(void __iomem * base,const unsigned int * regs,const struct qmp_phy_init_tbl tbl[],int num,u8 lane_mask)2590*4882a593Smuzhiyun static void qcom_qmp_phy_configure_lane(void __iomem *base,
2591*4882a593Smuzhiyun const unsigned int *regs,
2592*4882a593Smuzhiyun const struct qmp_phy_init_tbl tbl[],
2593*4882a593Smuzhiyun int num,
2594*4882a593Smuzhiyun u8 lane_mask)
2595*4882a593Smuzhiyun {
2596*4882a593Smuzhiyun int i;
2597*4882a593Smuzhiyun const struct qmp_phy_init_tbl *t = tbl;
2598*4882a593Smuzhiyun
2599*4882a593Smuzhiyun if (!t)
2600*4882a593Smuzhiyun return;
2601*4882a593Smuzhiyun
2602*4882a593Smuzhiyun for (i = 0; i < num; i++, t++) {
2603*4882a593Smuzhiyun if (!(t->lane_mask & lane_mask))
2604*4882a593Smuzhiyun continue;
2605*4882a593Smuzhiyun
2606*4882a593Smuzhiyun if (t->in_layout)
2607*4882a593Smuzhiyun writel(t->val, base + regs[t->offset]);
2608*4882a593Smuzhiyun else
2609*4882a593Smuzhiyun writel(t->val, base + t->offset);
2610*4882a593Smuzhiyun }
2611*4882a593Smuzhiyun }
2612*4882a593Smuzhiyun
qcom_qmp_phy_configure(void __iomem * base,const unsigned int * regs,const struct qmp_phy_init_tbl tbl[],int num)2613*4882a593Smuzhiyun static void qcom_qmp_phy_configure(void __iomem *base,
2614*4882a593Smuzhiyun const unsigned int *regs,
2615*4882a593Smuzhiyun const struct qmp_phy_init_tbl tbl[],
2616*4882a593Smuzhiyun int num)
2617*4882a593Smuzhiyun {
2618*4882a593Smuzhiyun qcom_qmp_phy_configure_lane(base, regs, tbl, num, 0xff);
2619*4882a593Smuzhiyun }
2620*4882a593Smuzhiyun
qcom_qmp_phy_serdes_init(struct qmp_phy * qphy)2621*4882a593Smuzhiyun static int qcom_qmp_phy_serdes_init(struct qmp_phy *qphy)
2622*4882a593Smuzhiyun {
2623*4882a593Smuzhiyun struct qcom_qmp *qmp = qphy->qmp;
2624*4882a593Smuzhiyun const struct qmp_phy_cfg *cfg = qphy->cfg;
2625*4882a593Smuzhiyun void __iomem *serdes = qphy->serdes;
2626*4882a593Smuzhiyun const struct phy_configure_opts_dp *dp_opts = &qphy->dp_opts;
2627*4882a593Smuzhiyun const struct qmp_phy_init_tbl *serdes_tbl = cfg->serdes_tbl;
2628*4882a593Smuzhiyun int serdes_tbl_num = cfg->serdes_tbl_num;
2629*4882a593Smuzhiyun int ret;
2630*4882a593Smuzhiyun
2631*4882a593Smuzhiyun qcom_qmp_phy_configure(serdes, cfg->regs, serdes_tbl, serdes_tbl_num);
2632*4882a593Smuzhiyun
2633*4882a593Smuzhiyun if (cfg->type == PHY_TYPE_DP) {
2634*4882a593Smuzhiyun switch (dp_opts->link_rate) {
2635*4882a593Smuzhiyun case 1620:
2636*4882a593Smuzhiyun qcom_qmp_phy_configure(serdes, cfg->regs,
2637*4882a593Smuzhiyun cfg->serdes_tbl_rbr,
2638*4882a593Smuzhiyun cfg->serdes_tbl_rbr_num);
2639*4882a593Smuzhiyun break;
2640*4882a593Smuzhiyun case 2700:
2641*4882a593Smuzhiyun qcom_qmp_phy_configure(serdes, cfg->regs,
2642*4882a593Smuzhiyun cfg->serdes_tbl_hbr,
2643*4882a593Smuzhiyun cfg->serdes_tbl_hbr_num);
2644*4882a593Smuzhiyun break;
2645*4882a593Smuzhiyun case 5400:
2646*4882a593Smuzhiyun qcom_qmp_phy_configure(serdes, cfg->regs,
2647*4882a593Smuzhiyun cfg->serdes_tbl_hbr2,
2648*4882a593Smuzhiyun cfg->serdes_tbl_hbr2_num);
2649*4882a593Smuzhiyun break;
2650*4882a593Smuzhiyun case 8100:
2651*4882a593Smuzhiyun qcom_qmp_phy_configure(serdes, cfg->regs,
2652*4882a593Smuzhiyun cfg->serdes_tbl_hbr3,
2653*4882a593Smuzhiyun cfg->serdes_tbl_hbr3_num);
2654*4882a593Smuzhiyun break;
2655*4882a593Smuzhiyun default:
2656*4882a593Smuzhiyun /* Other link rates aren't supported */
2657*4882a593Smuzhiyun return -EINVAL;
2658*4882a593Smuzhiyun }
2659*4882a593Smuzhiyun }
2660*4882a593Smuzhiyun
2661*4882a593Smuzhiyun
2662*4882a593Smuzhiyun if (cfg->has_phy_com_ctrl) {
2663*4882a593Smuzhiyun void __iomem *status;
2664*4882a593Smuzhiyun unsigned int mask, val;
2665*4882a593Smuzhiyun
2666*4882a593Smuzhiyun qphy_clrbits(serdes, cfg->regs[QPHY_COM_SW_RESET], SW_RESET);
2667*4882a593Smuzhiyun qphy_setbits(serdes, cfg->regs[QPHY_COM_START_CONTROL],
2668*4882a593Smuzhiyun SERDES_START | PCS_START);
2669*4882a593Smuzhiyun
2670*4882a593Smuzhiyun status = serdes + cfg->regs[QPHY_COM_PCS_READY_STATUS];
2671*4882a593Smuzhiyun mask = cfg->mask_com_pcs_ready;
2672*4882a593Smuzhiyun
2673*4882a593Smuzhiyun ret = readl_poll_timeout(status, val, (val & mask), 10,
2674*4882a593Smuzhiyun PHY_INIT_COMPLETE_TIMEOUT);
2675*4882a593Smuzhiyun if (ret) {
2676*4882a593Smuzhiyun dev_err(qmp->dev,
2677*4882a593Smuzhiyun "phy common block init timed-out\n");
2678*4882a593Smuzhiyun return ret;
2679*4882a593Smuzhiyun }
2680*4882a593Smuzhiyun }
2681*4882a593Smuzhiyun
2682*4882a593Smuzhiyun return 0;
2683*4882a593Smuzhiyun }
2684*4882a593Smuzhiyun
qcom_qmp_phy_dp_aux_init(struct qmp_phy * qphy)2685*4882a593Smuzhiyun static void qcom_qmp_phy_dp_aux_init(struct qmp_phy *qphy)
2686*4882a593Smuzhiyun {
2687*4882a593Smuzhiyun writel(DP_PHY_PD_CTL_PWRDN | DP_PHY_PD_CTL_AUX_PWRDN |
2688*4882a593Smuzhiyun DP_PHY_PD_CTL_PLL_PWRDN | DP_PHY_PD_CTL_DP_CLAMP_EN,
2689*4882a593Smuzhiyun qphy->pcs + QSERDES_V3_DP_PHY_PD_CTL);
2690*4882a593Smuzhiyun
2691*4882a593Smuzhiyun /* Turn on BIAS current for PHY/PLL */
2692*4882a593Smuzhiyun writel(QSERDES_V3_COM_BIAS_EN | QSERDES_V3_COM_BIAS_EN_MUX |
2693*4882a593Smuzhiyun QSERDES_V3_COM_CLKBUF_L_EN | QSERDES_V3_COM_EN_SYSCLK_TX_SEL,
2694*4882a593Smuzhiyun qphy->serdes + QSERDES_V3_COM_BIAS_EN_CLKBUFLR_EN);
2695*4882a593Smuzhiyun
2696*4882a593Smuzhiyun writel(DP_PHY_PD_CTL_PSR_PWRDN, qphy->pcs + QSERDES_V3_DP_PHY_PD_CTL);
2697*4882a593Smuzhiyun
2698*4882a593Smuzhiyun writel(DP_PHY_PD_CTL_PWRDN | DP_PHY_PD_CTL_AUX_PWRDN |
2699*4882a593Smuzhiyun DP_PHY_PD_CTL_LANE_0_1_PWRDN |
2700*4882a593Smuzhiyun DP_PHY_PD_CTL_LANE_2_3_PWRDN | DP_PHY_PD_CTL_PLL_PWRDN |
2701*4882a593Smuzhiyun DP_PHY_PD_CTL_DP_CLAMP_EN,
2702*4882a593Smuzhiyun qphy->pcs + QSERDES_V3_DP_PHY_PD_CTL);
2703*4882a593Smuzhiyun
2704*4882a593Smuzhiyun writel(QSERDES_V3_COM_BIAS_EN |
2705*4882a593Smuzhiyun QSERDES_V3_COM_BIAS_EN_MUX | QSERDES_V3_COM_CLKBUF_R_EN |
2706*4882a593Smuzhiyun QSERDES_V3_COM_CLKBUF_L_EN | QSERDES_V3_COM_EN_SYSCLK_TX_SEL |
2707*4882a593Smuzhiyun QSERDES_V3_COM_CLKBUF_RX_DRIVE_L,
2708*4882a593Smuzhiyun qphy->serdes + QSERDES_V3_COM_BIAS_EN_CLKBUFLR_EN);
2709*4882a593Smuzhiyun
2710*4882a593Smuzhiyun writel(0x00, qphy->pcs + QSERDES_V3_DP_PHY_AUX_CFG0);
2711*4882a593Smuzhiyun writel(0x13, qphy->pcs + QSERDES_V3_DP_PHY_AUX_CFG1);
2712*4882a593Smuzhiyun writel(0x24, qphy->pcs + QSERDES_V3_DP_PHY_AUX_CFG2);
2713*4882a593Smuzhiyun writel(0x00, qphy->pcs + QSERDES_V3_DP_PHY_AUX_CFG3);
2714*4882a593Smuzhiyun writel(0x0a, qphy->pcs + QSERDES_V3_DP_PHY_AUX_CFG4);
2715*4882a593Smuzhiyun writel(0x26, qphy->pcs + QSERDES_V3_DP_PHY_AUX_CFG5);
2716*4882a593Smuzhiyun writel(0x0a, qphy->pcs + QSERDES_V3_DP_PHY_AUX_CFG6);
2717*4882a593Smuzhiyun writel(0x03, qphy->pcs + QSERDES_V3_DP_PHY_AUX_CFG7);
2718*4882a593Smuzhiyun writel(0xbb, qphy->pcs + QSERDES_V3_DP_PHY_AUX_CFG8);
2719*4882a593Smuzhiyun writel(0x03, qphy->pcs + QSERDES_V3_DP_PHY_AUX_CFG9);
2720*4882a593Smuzhiyun qphy->dp_aux_cfg = 0;
2721*4882a593Smuzhiyun
2722*4882a593Smuzhiyun writel(PHY_AUX_STOP_ERR_MASK | PHY_AUX_DEC_ERR_MASK |
2723*4882a593Smuzhiyun PHY_AUX_SYNC_ERR_MASK | PHY_AUX_ALIGN_ERR_MASK |
2724*4882a593Smuzhiyun PHY_AUX_REQ_ERR_MASK,
2725*4882a593Smuzhiyun qphy->pcs + QSERDES_V3_DP_PHY_AUX_INTERRUPT_MASK);
2726*4882a593Smuzhiyun }
2727*4882a593Smuzhiyun
2728*4882a593Smuzhiyun static const u8 qmp_dp_v3_pre_emphasis_hbr_rbr[4][4] = {
2729*4882a593Smuzhiyun { 0x00, 0x0c, 0x14, 0x19 },
2730*4882a593Smuzhiyun { 0x00, 0x0b, 0x12, 0xff },
2731*4882a593Smuzhiyun { 0x00, 0x0b, 0xff, 0xff },
2732*4882a593Smuzhiyun { 0x04, 0xff, 0xff, 0xff }
2733*4882a593Smuzhiyun };
2734*4882a593Smuzhiyun
2735*4882a593Smuzhiyun static const u8 qmp_dp_v3_voltage_swing_hbr_rbr[4][4] = {
2736*4882a593Smuzhiyun { 0x08, 0x0f, 0x16, 0x1f },
2737*4882a593Smuzhiyun { 0x11, 0x1e, 0x1f, 0xff },
2738*4882a593Smuzhiyun { 0x19, 0x1f, 0xff, 0xff },
2739*4882a593Smuzhiyun { 0x1f, 0xff, 0xff, 0xff }
2740*4882a593Smuzhiyun };
2741*4882a593Smuzhiyun
qcom_qmp_phy_configure_dp_tx(struct qmp_phy * qphy)2742*4882a593Smuzhiyun static void qcom_qmp_phy_configure_dp_tx(struct qmp_phy *qphy)
2743*4882a593Smuzhiyun {
2744*4882a593Smuzhiyun const struct phy_configure_opts_dp *dp_opts = &qphy->dp_opts;
2745*4882a593Smuzhiyun unsigned int v_level = 0, p_level = 0;
2746*4882a593Smuzhiyun u32 bias_en, drvr_en;
2747*4882a593Smuzhiyun u8 voltage_swing_cfg, pre_emphasis_cfg;
2748*4882a593Smuzhiyun int i;
2749*4882a593Smuzhiyun
2750*4882a593Smuzhiyun for (i = 0; i < dp_opts->lanes; i++) {
2751*4882a593Smuzhiyun v_level = max(v_level, dp_opts->voltage[i]);
2752*4882a593Smuzhiyun p_level = max(p_level, dp_opts->pre[i]);
2753*4882a593Smuzhiyun }
2754*4882a593Smuzhiyun
2755*4882a593Smuzhiyun if (dp_opts->lanes == 1) {
2756*4882a593Smuzhiyun bias_en = 0x3e;
2757*4882a593Smuzhiyun drvr_en = 0x13;
2758*4882a593Smuzhiyun } else {
2759*4882a593Smuzhiyun bias_en = 0x3f;
2760*4882a593Smuzhiyun drvr_en = 0x10;
2761*4882a593Smuzhiyun }
2762*4882a593Smuzhiyun
2763*4882a593Smuzhiyun voltage_swing_cfg = qmp_dp_v3_voltage_swing_hbr_rbr[v_level][p_level];
2764*4882a593Smuzhiyun pre_emphasis_cfg = qmp_dp_v3_pre_emphasis_hbr_rbr[v_level][p_level];
2765*4882a593Smuzhiyun
2766*4882a593Smuzhiyun /* TODO: Move check to config check */
2767*4882a593Smuzhiyun if (voltage_swing_cfg == 0xFF && pre_emphasis_cfg == 0xFF)
2768*4882a593Smuzhiyun return;
2769*4882a593Smuzhiyun
2770*4882a593Smuzhiyun /* Enable MUX to use Cursor values from these registers */
2771*4882a593Smuzhiyun voltage_swing_cfg |= DP_PHY_TXn_TX_DRV_LVL_MUX_EN;
2772*4882a593Smuzhiyun pre_emphasis_cfg |= DP_PHY_TXn_TX_EMP_POST1_LVL_MUX_EN;
2773*4882a593Smuzhiyun
2774*4882a593Smuzhiyun writel(voltage_swing_cfg, qphy->tx + QSERDES_V3_TX_TX_DRV_LVL);
2775*4882a593Smuzhiyun writel(pre_emphasis_cfg, qphy->tx + QSERDES_V3_TX_TX_EMP_POST1_LVL);
2776*4882a593Smuzhiyun writel(voltage_swing_cfg, qphy->tx2 + QSERDES_V3_TX_TX_DRV_LVL);
2777*4882a593Smuzhiyun writel(pre_emphasis_cfg, qphy->tx2 + QSERDES_V3_TX_TX_EMP_POST1_LVL);
2778*4882a593Smuzhiyun
2779*4882a593Smuzhiyun writel(drvr_en, qphy->tx + QSERDES_V3_TX_HIGHZ_DRVR_EN);
2780*4882a593Smuzhiyun writel(bias_en, qphy->tx + QSERDES_V3_TX_TRANSCEIVER_BIAS_EN);
2781*4882a593Smuzhiyun writel(drvr_en, qphy->tx2 + QSERDES_V3_TX_HIGHZ_DRVR_EN);
2782*4882a593Smuzhiyun writel(bias_en, qphy->tx2 + QSERDES_V3_TX_TRANSCEIVER_BIAS_EN);
2783*4882a593Smuzhiyun }
2784*4882a593Smuzhiyun
qcom_qmp_dp_phy_configure(struct phy * phy,union phy_configure_opts * opts)2785*4882a593Smuzhiyun static int qcom_qmp_dp_phy_configure(struct phy *phy, union phy_configure_opts *opts)
2786*4882a593Smuzhiyun {
2787*4882a593Smuzhiyun const struct phy_configure_opts_dp *dp_opts = &opts->dp;
2788*4882a593Smuzhiyun struct qmp_phy *qphy = phy_get_drvdata(phy);
2789*4882a593Smuzhiyun
2790*4882a593Smuzhiyun memcpy(&qphy->dp_opts, dp_opts, sizeof(*dp_opts));
2791*4882a593Smuzhiyun if (qphy->dp_opts.set_voltages) {
2792*4882a593Smuzhiyun qcom_qmp_phy_configure_dp_tx(qphy);
2793*4882a593Smuzhiyun qphy->dp_opts.set_voltages = 0;
2794*4882a593Smuzhiyun }
2795*4882a593Smuzhiyun
2796*4882a593Smuzhiyun return 0;
2797*4882a593Smuzhiyun }
2798*4882a593Smuzhiyun
qcom_qmp_phy_configure_dp_phy(struct qmp_phy * qphy)2799*4882a593Smuzhiyun static int qcom_qmp_phy_configure_dp_phy(struct qmp_phy *qphy)
2800*4882a593Smuzhiyun {
2801*4882a593Smuzhiyun const struct qmp_phy_dp_clks *dp_clks = qphy->dp_clks;
2802*4882a593Smuzhiyun const struct phy_configure_opts_dp *dp_opts = &qphy->dp_opts;
2803*4882a593Smuzhiyun u32 val, phy_vco_div, status;
2804*4882a593Smuzhiyun unsigned long pixel_freq;
2805*4882a593Smuzhiyun
2806*4882a593Smuzhiyun val = DP_PHY_PD_CTL_PWRDN | DP_PHY_PD_CTL_AUX_PWRDN |
2807*4882a593Smuzhiyun DP_PHY_PD_CTL_PLL_PWRDN | DP_PHY_PD_CTL_DP_CLAMP_EN;
2808*4882a593Smuzhiyun
2809*4882a593Smuzhiyun /*
2810*4882a593Smuzhiyun * TODO: Assume orientation is CC1 for now and two lanes, need to
2811*4882a593Smuzhiyun * use type-c connector to understand orientation and lanes.
2812*4882a593Smuzhiyun *
2813*4882a593Smuzhiyun * Otherwise val changes to be like below if this code understood
2814*4882a593Smuzhiyun * the orientation of the type-c cable.
2815*4882a593Smuzhiyun *
2816*4882a593Smuzhiyun * if (lane_cnt == 4 || orientation == ORIENTATION_CC2)
2817*4882a593Smuzhiyun * val |= DP_PHY_PD_CTL_LANE_0_1_PWRDN;
2818*4882a593Smuzhiyun * if (lane_cnt == 4 || orientation == ORIENTATION_CC1)
2819*4882a593Smuzhiyun * val |= DP_PHY_PD_CTL_LANE_2_3_PWRDN;
2820*4882a593Smuzhiyun * if (orientation == ORIENTATION_CC2)
2821*4882a593Smuzhiyun * writel(0x4c, qphy->pcs + QSERDES_V3_DP_PHY_MODE);
2822*4882a593Smuzhiyun */
2823*4882a593Smuzhiyun val |= DP_PHY_PD_CTL_LANE_2_3_PWRDN;
2824*4882a593Smuzhiyun writel(val, qphy->pcs + QSERDES_V3_DP_PHY_PD_CTL);
2825*4882a593Smuzhiyun
2826*4882a593Smuzhiyun writel(0x5c, qphy->pcs + QSERDES_V3_DP_PHY_MODE);
2827*4882a593Smuzhiyun writel(0x05, qphy->pcs + QSERDES_V3_DP_PHY_TX0_TX1_LANE_CTL);
2828*4882a593Smuzhiyun writel(0x05, qphy->pcs + QSERDES_V3_DP_PHY_TX2_TX3_LANE_CTL);
2829*4882a593Smuzhiyun
2830*4882a593Smuzhiyun switch (dp_opts->link_rate) {
2831*4882a593Smuzhiyun case 1620:
2832*4882a593Smuzhiyun phy_vco_div = 0x1;
2833*4882a593Smuzhiyun pixel_freq = 1620000000UL / 2;
2834*4882a593Smuzhiyun break;
2835*4882a593Smuzhiyun case 2700:
2836*4882a593Smuzhiyun phy_vco_div = 0x1;
2837*4882a593Smuzhiyun pixel_freq = 2700000000UL / 2;
2838*4882a593Smuzhiyun break;
2839*4882a593Smuzhiyun case 5400:
2840*4882a593Smuzhiyun phy_vco_div = 0x2;
2841*4882a593Smuzhiyun pixel_freq = 5400000000UL / 4;
2842*4882a593Smuzhiyun break;
2843*4882a593Smuzhiyun case 8100:
2844*4882a593Smuzhiyun phy_vco_div = 0x0;
2845*4882a593Smuzhiyun pixel_freq = 8100000000UL / 6;
2846*4882a593Smuzhiyun break;
2847*4882a593Smuzhiyun default:
2848*4882a593Smuzhiyun /* Other link rates aren't supported */
2849*4882a593Smuzhiyun return -EINVAL;
2850*4882a593Smuzhiyun }
2851*4882a593Smuzhiyun writel(phy_vco_div, qphy->pcs + QSERDES_V3_DP_PHY_VCO_DIV);
2852*4882a593Smuzhiyun
2853*4882a593Smuzhiyun clk_set_rate(dp_clks->dp_link_hw.clk, dp_opts->link_rate * 100000);
2854*4882a593Smuzhiyun clk_set_rate(dp_clks->dp_pixel_hw.clk, pixel_freq);
2855*4882a593Smuzhiyun
2856*4882a593Smuzhiyun writel(0x04, qphy->pcs + QSERDES_V3_DP_PHY_AUX_CFG2);
2857*4882a593Smuzhiyun writel(0x01, qphy->pcs + QSERDES_V3_DP_PHY_CFG);
2858*4882a593Smuzhiyun writel(0x05, qphy->pcs + QSERDES_V3_DP_PHY_CFG);
2859*4882a593Smuzhiyun writel(0x01, qphy->pcs + QSERDES_V3_DP_PHY_CFG);
2860*4882a593Smuzhiyun writel(0x09, qphy->pcs + QSERDES_V3_DP_PHY_CFG);
2861*4882a593Smuzhiyun
2862*4882a593Smuzhiyun writel(0x20, qphy->serdes + QSERDES_V3_COM_RESETSM_CNTRL);
2863*4882a593Smuzhiyun
2864*4882a593Smuzhiyun if (readl_poll_timeout(qphy->serdes + QSERDES_V3_COM_C_READY_STATUS,
2865*4882a593Smuzhiyun status,
2866*4882a593Smuzhiyun ((status & BIT(0)) > 0),
2867*4882a593Smuzhiyun 500,
2868*4882a593Smuzhiyun 10000))
2869*4882a593Smuzhiyun return -ETIMEDOUT;
2870*4882a593Smuzhiyun
2871*4882a593Smuzhiyun writel(0x19, qphy->pcs + QSERDES_V3_DP_PHY_CFG);
2872*4882a593Smuzhiyun
2873*4882a593Smuzhiyun if (readl_poll_timeout(qphy->pcs + QSERDES_V3_DP_PHY_STATUS,
2874*4882a593Smuzhiyun status,
2875*4882a593Smuzhiyun ((status & BIT(1)) > 0),
2876*4882a593Smuzhiyun 500,
2877*4882a593Smuzhiyun 10000))
2878*4882a593Smuzhiyun return -ETIMEDOUT;
2879*4882a593Smuzhiyun
2880*4882a593Smuzhiyun writel(0x18, qphy->pcs + QSERDES_V3_DP_PHY_CFG);
2881*4882a593Smuzhiyun udelay(2000);
2882*4882a593Smuzhiyun writel(0x19, qphy->pcs + QSERDES_V3_DP_PHY_CFG);
2883*4882a593Smuzhiyun
2884*4882a593Smuzhiyun return readl_poll_timeout(qphy->pcs + QSERDES_V3_DP_PHY_STATUS,
2885*4882a593Smuzhiyun status,
2886*4882a593Smuzhiyun ((status & BIT(1)) > 0),
2887*4882a593Smuzhiyun 500,
2888*4882a593Smuzhiyun 10000);
2889*4882a593Smuzhiyun }
2890*4882a593Smuzhiyun
2891*4882a593Smuzhiyun /*
2892*4882a593Smuzhiyun * We need to calibrate the aux setting here as many times
2893*4882a593Smuzhiyun * as the caller tries
2894*4882a593Smuzhiyun */
qcom_qmp_dp_phy_calibrate(struct phy * phy)2895*4882a593Smuzhiyun static int qcom_qmp_dp_phy_calibrate(struct phy *phy)
2896*4882a593Smuzhiyun {
2897*4882a593Smuzhiyun struct qmp_phy *qphy = phy_get_drvdata(phy);
2898*4882a593Smuzhiyun const u8 cfg1_settings[] = { 0x13, 0x23, 0x1d };
2899*4882a593Smuzhiyun u8 val;
2900*4882a593Smuzhiyun
2901*4882a593Smuzhiyun qphy->dp_aux_cfg++;
2902*4882a593Smuzhiyun qphy->dp_aux_cfg %= ARRAY_SIZE(cfg1_settings);
2903*4882a593Smuzhiyun val = cfg1_settings[qphy->dp_aux_cfg];
2904*4882a593Smuzhiyun
2905*4882a593Smuzhiyun writel(val, qphy->pcs + QSERDES_V3_DP_PHY_AUX_CFG1);
2906*4882a593Smuzhiyun
2907*4882a593Smuzhiyun return 0;
2908*4882a593Smuzhiyun }
2909*4882a593Smuzhiyun
qcom_qmp_phy_com_init(struct qmp_phy * qphy)2910*4882a593Smuzhiyun static int qcom_qmp_phy_com_init(struct qmp_phy *qphy)
2911*4882a593Smuzhiyun {
2912*4882a593Smuzhiyun struct qcom_qmp *qmp = qphy->qmp;
2913*4882a593Smuzhiyun const struct qmp_phy_cfg *cfg = qphy->cfg;
2914*4882a593Smuzhiyun void __iomem *serdes = qphy->serdes;
2915*4882a593Smuzhiyun void __iomem *pcs = qphy->pcs;
2916*4882a593Smuzhiyun void __iomem *dp_com = qmp->dp_com;
2917*4882a593Smuzhiyun int ret, i;
2918*4882a593Smuzhiyun
2919*4882a593Smuzhiyun mutex_lock(&qmp->phy_mutex);
2920*4882a593Smuzhiyun if (qmp->init_count++) {
2921*4882a593Smuzhiyun mutex_unlock(&qmp->phy_mutex);
2922*4882a593Smuzhiyun return 0;
2923*4882a593Smuzhiyun }
2924*4882a593Smuzhiyun
2925*4882a593Smuzhiyun /* turn on regulator supplies */
2926*4882a593Smuzhiyun ret = regulator_bulk_enable(cfg->num_vregs, qmp->vregs);
2927*4882a593Smuzhiyun if (ret) {
2928*4882a593Smuzhiyun dev_err(qmp->dev, "failed to enable regulators, err=%d\n", ret);
2929*4882a593Smuzhiyun goto err_reg_enable;
2930*4882a593Smuzhiyun }
2931*4882a593Smuzhiyun
2932*4882a593Smuzhiyun for (i = 0; i < cfg->num_resets; i++) {
2933*4882a593Smuzhiyun ret = reset_control_assert(qmp->resets[i]);
2934*4882a593Smuzhiyun if (ret) {
2935*4882a593Smuzhiyun dev_err(qmp->dev, "%s reset assert failed\n",
2936*4882a593Smuzhiyun cfg->reset_list[i]);
2937*4882a593Smuzhiyun goto err_rst_assert;
2938*4882a593Smuzhiyun }
2939*4882a593Smuzhiyun }
2940*4882a593Smuzhiyun
2941*4882a593Smuzhiyun for (i = cfg->num_resets - 1; i >= 0; i--) {
2942*4882a593Smuzhiyun ret = reset_control_deassert(qmp->resets[i]);
2943*4882a593Smuzhiyun if (ret) {
2944*4882a593Smuzhiyun dev_err(qmp->dev, "%s reset deassert failed\n",
2945*4882a593Smuzhiyun qphy->cfg->reset_list[i]);
2946*4882a593Smuzhiyun goto err_rst;
2947*4882a593Smuzhiyun }
2948*4882a593Smuzhiyun }
2949*4882a593Smuzhiyun
2950*4882a593Smuzhiyun ret = clk_bulk_prepare_enable(cfg->num_clks, qmp->clks);
2951*4882a593Smuzhiyun if (ret) {
2952*4882a593Smuzhiyun dev_err(qmp->dev, "failed to enable clks, err=%d\n", ret);
2953*4882a593Smuzhiyun goto err_rst;
2954*4882a593Smuzhiyun }
2955*4882a593Smuzhiyun
2956*4882a593Smuzhiyun if (cfg->has_phy_dp_com_ctrl) {
2957*4882a593Smuzhiyun qphy_setbits(dp_com, QPHY_V3_DP_COM_POWER_DOWN_CTRL,
2958*4882a593Smuzhiyun SW_PWRDN);
2959*4882a593Smuzhiyun /* override hardware control for reset of qmp phy */
2960*4882a593Smuzhiyun qphy_setbits(dp_com, QPHY_V3_DP_COM_RESET_OVRD_CTRL,
2961*4882a593Smuzhiyun SW_DPPHY_RESET_MUX | SW_DPPHY_RESET |
2962*4882a593Smuzhiyun SW_USB3PHY_RESET_MUX | SW_USB3PHY_RESET);
2963*4882a593Smuzhiyun
2964*4882a593Smuzhiyun /* Default type-c orientation, i.e CC1 */
2965*4882a593Smuzhiyun qphy_setbits(dp_com, QPHY_V3_DP_COM_TYPEC_CTRL, 0x02);
2966*4882a593Smuzhiyun
2967*4882a593Smuzhiyun qphy_setbits(dp_com, QPHY_V3_DP_COM_PHY_MODE_CTRL,
2968*4882a593Smuzhiyun USB3_MODE | DP_MODE);
2969*4882a593Smuzhiyun
2970*4882a593Smuzhiyun /* bring both QMP USB and QMP DP PHYs PCS block out of reset */
2971*4882a593Smuzhiyun qphy_clrbits(dp_com, QPHY_V3_DP_COM_RESET_OVRD_CTRL,
2972*4882a593Smuzhiyun SW_DPPHY_RESET_MUX | SW_DPPHY_RESET |
2973*4882a593Smuzhiyun SW_USB3PHY_RESET_MUX | SW_USB3PHY_RESET);
2974*4882a593Smuzhiyun
2975*4882a593Smuzhiyun qphy_clrbits(dp_com, QPHY_V3_DP_COM_SWI_CTRL, 0x03);
2976*4882a593Smuzhiyun qphy_clrbits(dp_com, QPHY_V3_DP_COM_SW_RESET, SW_RESET);
2977*4882a593Smuzhiyun }
2978*4882a593Smuzhiyun
2979*4882a593Smuzhiyun if (cfg->has_phy_com_ctrl) {
2980*4882a593Smuzhiyun qphy_setbits(serdes, cfg->regs[QPHY_COM_POWER_DOWN_CONTROL],
2981*4882a593Smuzhiyun SW_PWRDN);
2982*4882a593Smuzhiyun } else {
2983*4882a593Smuzhiyun if (cfg->regs[QPHY_PCS_POWER_DOWN_CONTROL])
2984*4882a593Smuzhiyun qphy_setbits(pcs,
2985*4882a593Smuzhiyun cfg->regs[QPHY_PCS_POWER_DOWN_CONTROL],
2986*4882a593Smuzhiyun cfg->pwrdn_ctrl);
2987*4882a593Smuzhiyun else
2988*4882a593Smuzhiyun qphy_setbits(pcs, QPHY_POWER_DOWN_CONTROL,
2989*4882a593Smuzhiyun cfg->pwrdn_ctrl);
2990*4882a593Smuzhiyun }
2991*4882a593Smuzhiyun
2992*4882a593Smuzhiyun mutex_unlock(&qmp->phy_mutex);
2993*4882a593Smuzhiyun
2994*4882a593Smuzhiyun return 0;
2995*4882a593Smuzhiyun
2996*4882a593Smuzhiyun err_rst:
2997*4882a593Smuzhiyun while (++i < cfg->num_resets)
2998*4882a593Smuzhiyun reset_control_assert(qmp->resets[i]);
2999*4882a593Smuzhiyun err_rst_assert:
3000*4882a593Smuzhiyun regulator_bulk_disable(cfg->num_vregs, qmp->vregs);
3001*4882a593Smuzhiyun err_reg_enable:
3002*4882a593Smuzhiyun mutex_unlock(&qmp->phy_mutex);
3003*4882a593Smuzhiyun
3004*4882a593Smuzhiyun return ret;
3005*4882a593Smuzhiyun }
3006*4882a593Smuzhiyun
qcom_qmp_phy_com_exit(struct qmp_phy * qphy)3007*4882a593Smuzhiyun static int qcom_qmp_phy_com_exit(struct qmp_phy *qphy)
3008*4882a593Smuzhiyun {
3009*4882a593Smuzhiyun struct qcom_qmp *qmp = qphy->qmp;
3010*4882a593Smuzhiyun const struct qmp_phy_cfg *cfg = qphy->cfg;
3011*4882a593Smuzhiyun void __iomem *serdes = qphy->serdes;
3012*4882a593Smuzhiyun int i = cfg->num_resets;
3013*4882a593Smuzhiyun
3014*4882a593Smuzhiyun mutex_lock(&qmp->phy_mutex);
3015*4882a593Smuzhiyun if (--qmp->init_count) {
3016*4882a593Smuzhiyun mutex_unlock(&qmp->phy_mutex);
3017*4882a593Smuzhiyun return 0;
3018*4882a593Smuzhiyun }
3019*4882a593Smuzhiyun
3020*4882a593Smuzhiyun reset_control_assert(qmp->ufs_reset);
3021*4882a593Smuzhiyun if (cfg->has_phy_com_ctrl) {
3022*4882a593Smuzhiyun qphy_setbits(serdes, cfg->regs[QPHY_COM_START_CONTROL],
3023*4882a593Smuzhiyun SERDES_START | PCS_START);
3024*4882a593Smuzhiyun qphy_clrbits(serdes, cfg->regs[QPHY_COM_SW_RESET],
3025*4882a593Smuzhiyun SW_RESET);
3026*4882a593Smuzhiyun qphy_setbits(serdes, cfg->regs[QPHY_COM_POWER_DOWN_CONTROL],
3027*4882a593Smuzhiyun SW_PWRDN);
3028*4882a593Smuzhiyun }
3029*4882a593Smuzhiyun
3030*4882a593Smuzhiyun while (--i >= 0)
3031*4882a593Smuzhiyun reset_control_assert(qmp->resets[i]);
3032*4882a593Smuzhiyun
3033*4882a593Smuzhiyun clk_bulk_disable_unprepare(cfg->num_clks, qmp->clks);
3034*4882a593Smuzhiyun
3035*4882a593Smuzhiyun regulator_bulk_disable(cfg->num_vregs, qmp->vregs);
3036*4882a593Smuzhiyun
3037*4882a593Smuzhiyun mutex_unlock(&qmp->phy_mutex);
3038*4882a593Smuzhiyun
3039*4882a593Smuzhiyun return 0;
3040*4882a593Smuzhiyun }
3041*4882a593Smuzhiyun
qcom_qmp_phy_init(struct phy * phy)3042*4882a593Smuzhiyun static int qcom_qmp_phy_init(struct phy *phy)
3043*4882a593Smuzhiyun {
3044*4882a593Smuzhiyun struct qmp_phy *qphy = phy_get_drvdata(phy);
3045*4882a593Smuzhiyun struct qcom_qmp *qmp = qphy->qmp;
3046*4882a593Smuzhiyun const struct qmp_phy_cfg *cfg = qphy->cfg;
3047*4882a593Smuzhiyun int ret;
3048*4882a593Smuzhiyun dev_vdbg(qmp->dev, "Initializing QMP phy\n");
3049*4882a593Smuzhiyun
3050*4882a593Smuzhiyun if (cfg->no_pcs_sw_reset) {
3051*4882a593Smuzhiyun /*
3052*4882a593Smuzhiyun * Get UFS reset, which is delayed until now to avoid a
3053*4882a593Smuzhiyun * circular dependency where UFS needs its PHY, but the PHY
3054*4882a593Smuzhiyun * needs this UFS reset.
3055*4882a593Smuzhiyun */
3056*4882a593Smuzhiyun if (!qmp->ufs_reset) {
3057*4882a593Smuzhiyun qmp->ufs_reset =
3058*4882a593Smuzhiyun devm_reset_control_get_exclusive(qmp->dev,
3059*4882a593Smuzhiyun "ufsphy");
3060*4882a593Smuzhiyun
3061*4882a593Smuzhiyun if (IS_ERR(qmp->ufs_reset)) {
3062*4882a593Smuzhiyun ret = PTR_ERR(qmp->ufs_reset);
3063*4882a593Smuzhiyun dev_err(qmp->dev,
3064*4882a593Smuzhiyun "failed to get UFS reset: %d\n",
3065*4882a593Smuzhiyun ret);
3066*4882a593Smuzhiyun
3067*4882a593Smuzhiyun qmp->ufs_reset = NULL;
3068*4882a593Smuzhiyun return ret;
3069*4882a593Smuzhiyun }
3070*4882a593Smuzhiyun }
3071*4882a593Smuzhiyun
3072*4882a593Smuzhiyun ret = reset_control_assert(qmp->ufs_reset);
3073*4882a593Smuzhiyun if (ret)
3074*4882a593Smuzhiyun return ret;
3075*4882a593Smuzhiyun }
3076*4882a593Smuzhiyun
3077*4882a593Smuzhiyun ret = qcom_qmp_phy_com_init(qphy);
3078*4882a593Smuzhiyun if (ret)
3079*4882a593Smuzhiyun return ret;
3080*4882a593Smuzhiyun
3081*4882a593Smuzhiyun if (cfg->type == PHY_TYPE_DP)
3082*4882a593Smuzhiyun qcom_qmp_phy_dp_aux_init(qphy);
3083*4882a593Smuzhiyun
3084*4882a593Smuzhiyun return 0;
3085*4882a593Smuzhiyun }
3086*4882a593Smuzhiyun
qcom_qmp_phy_power_on(struct phy * phy)3087*4882a593Smuzhiyun static int qcom_qmp_phy_power_on(struct phy *phy)
3088*4882a593Smuzhiyun {
3089*4882a593Smuzhiyun struct qmp_phy *qphy = phy_get_drvdata(phy);
3090*4882a593Smuzhiyun struct qcom_qmp *qmp = qphy->qmp;
3091*4882a593Smuzhiyun const struct qmp_phy_cfg *cfg = qphy->cfg;
3092*4882a593Smuzhiyun void __iomem *tx = qphy->tx;
3093*4882a593Smuzhiyun void __iomem *rx = qphy->rx;
3094*4882a593Smuzhiyun void __iomem *pcs = qphy->pcs;
3095*4882a593Smuzhiyun void __iomem *pcs_misc = qphy->pcs_misc;
3096*4882a593Smuzhiyun void __iomem *status;
3097*4882a593Smuzhiyun unsigned int mask, val, ready;
3098*4882a593Smuzhiyun int ret;
3099*4882a593Smuzhiyun
3100*4882a593Smuzhiyun qcom_qmp_phy_serdes_init(qphy);
3101*4882a593Smuzhiyun
3102*4882a593Smuzhiyun if (cfg->has_lane_rst) {
3103*4882a593Smuzhiyun ret = reset_control_deassert(qphy->lane_rst);
3104*4882a593Smuzhiyun if (ret) {
3105*4882a593Smuzhiyun dev_err(qmp->dev, "lane%d reset deassert failed\n",
3106*4882a593Smuzhiyun qphy->index);
3107*4882a593Smuzhiyun goto err_lane_rst;
3108*4882a593Smuzhiyun }
3109*4882a593Smuzhiyun }
3110*4882a593Smuzhiyun
3111*4882a593Smuzhiyun ret = clk_prepare_enable(qphy->pipe_clk);
3112*4882a593Smuzhiyun if (ret) {
3113*4882a593Smuzhiyun dev_err(qmp->dev, "pipe_clk enable failed err=%d\n", ret);
3114*4882a593Smuzhiyun goto err_clk_enable;
3115*4882a593Smuzhiyun }
3116*4882a593Smuzhiyun
3117*4882a593Smuzhiyun /* Tx, Rx, and PCS configurations */
3118*4882a593Smuzhiyun qcom_qmp_phy_configure_lane(tx, cfg->regs,
3119*4882a593Smuzhiyun cfg->tx_tbl, cfg->tx_tbl_num, 1);
3120*4882a593Smuzhiyun /* Configuration for other LANE for USB-DP combo PHY */
3121*4882a593Smuzhiyun if (cfg->is_dual_lane_phy)
3122*4882a593Smuzhiyun qcom_qmp_phy_configure_lane(qphy->tx2, cfg->regs,
3123*4882a593Smuzhiyun cfg->tx_tbl, cfg->tx_tbl_num, 2);
3124*4882a593Smuzhiyun
3125*4882a593Smuzhiyun /* Configure special DP tx tunings */
3126*4882a593Smuzhiyun if (cfg->type == PHY_TYPE_DP)
3127*4882a593Smuzhiyun qcom_qmp_phy_configure_dp_tx(qphy);
3128*4882a593Smuzhiyun
3129*4882a593Smuzhiyun qcom_qmp_phy_configure_lane(rx, cfg->regs,
3130*4882a593Smuzhiyun cfg->rx_tbl, cfg->rx_tbl_num, 1);
3131*4882a593Smuzhiyun
3132*4882a593Smuzhiyun if (cfg->is_dual_lane_phy)
3133*4882a593Smuzhiyun qcom_qmp_phy_configure_lane(qphy->rx2, cfg->regs,
3134*4882a593Smuzhiyun cfg->rx_tbl, cfg->rx_tbl_num, 2);
3135*4882a593Smuzhiyun
3136*4882a593Smuzhiyun /* Configure link rate, swing, etc. */
3137*4882a593Smuzhiyun if (cfg->type == PHY_TYPE_DP)
3138*4882a593Smuzhiyun qcom_qmp_phy_configure_dp_phy(qphy);
3139*4882a593Smuzhiyun else
3140*4882a593Smuzhiyun qcom_qmp_phy_configure(pcs, cfg->regs, cfg->pcs_tbl, cfg->pcs_tbl_num);
3141*4882a593Smuzhiyun
3142*4882a593Smuzhiyun ret = reset_control_deassert(qmp->ufs_reset);
3143*4882a593Smuzhiyun if (ret)
3144*4882a593Smuzhiyun goto err_pcs_ready;
3145*4882a593Smuzhiyun
3146*4882a593Smuzhiyun qcom_qmp_phy_configure(pcs_misc, cfg->regs, cfg->pcs_misc_tbl,
3147*4882a593Smuzhiyun cfg->pcs_misc_tbl_num);
3148*4882a593Smuzhiyun
3149*4882a593Smuzhiyun /*
3150*4882a593Smuzhiyun * Pull out PHY from POWER DOWN state.
3151*4882a593Smuzhiyun * This is active low enable signal to power-down PHY.
3152*4882a593Smuzhiyun */
3153*4882a593Smuzhiyun if(cfg->type == PHY_TYPE_PCIE)
3154*4882a593Smuzhiyun qphy_setbits(pcs, QPHY_POWER_DOWN_CONTROL, cfg->pwrdn_ctrl);
3155*4882a593Smuzhiyun
3156*4882a593Smuzhiyun if (cfg->has_pwrdn_delay)
3157*4882a593Smuzhiyun usleep_range(cfg->pwrdn_delay_min, cfg->pwrdn_delay_max);
3158*4882a593Smuzhiyun
3159*4882a593Smuzhiyun if (cfg->type != PHY_TYPE_DP) {
3160*4882a593Smuzhiyun /* Pull PHY out of reset state */
3161*4882a593Smuzhiyun if (!cfg->no_pcs_sw_reset)
3162*4882a593Smuzhiyun qphy_clrbits(pcs, cfg->regs[QPHY_SW_RESET], SW_RESET);
3163*4882a593Smuzhiyun /* start SerDes and Phy-Coding-Sublayer */
3164*4882a593Smuzhiyun qphy_setbits(pcs, cfg->regs[QPHY_START_CTRL], cfg->start_ctrl);
3165*4882a593Smuzhiyun
3166*4882a593Smuzhiyun if (cfg->type == PHY_TYPE_UFS) {
3167*4882a593Smuzhiyun status = pcs + cfg->regs[QPHY_PCS_READY_STATUS];
3168*4882a593Smuzhiyun mask = PCS_READY;
3169*4882a593Smuzhiyun ready = PCS_READY;
3170*4882a593Smuzhiyun } else {
3171*4882a593Smuzhiyun status = pcs + cfg->regs[QPHY_PCS_STATUS];
3172*4882a593Smuzhiyun mask = PHYSTATUS;
3173*4882a593Smuzhiyun ready = 0;
3174*4882a593Smuzhiyun }
3175*4882a593Smuzhiyun
3176*4882a593Smuzhiyun ret = readl_poll_timeout(status, val, (val & mask) == ready, 10,
3177*4882a593Smuzhiyun PHY_INIT_COMPLETE_TIMEOUT);
3178*4882a593Smuzhiyun if (ret) {
3179*4882a593Smuzhiyun dev_err(qmp->dev, "phy initialization timed-out\n");
3180*4882a593Smuzhiyun goto err_pcs_ready;
3181*4882a593Smuzhiyun }
3182*4882a593Smuzhiyun }
3183*4882a593Smuzhiyun return 0;
3184*4882a593Smuzhiyun
3185*4882a593Smuzhiyun err_pcs_ready:
3186*4882a593Smuzhiyun clk_disable_unprepare(qphy->pipe_clk);
3187*4882a593Smuzhiyun err_clk_enable:
3188*4882a593Smuzhiyun if (cfg->has_lane_rst)
3189*4882a593Smuzhiyun reset_control_assert(qphy->lane_rst);
3190*4882a593Smuzhiyun err_lane_rst:
3191*4882a593Smuzhiyun return ret;
3192*4882a593Smuzhiyun }
3193*4882a593Smuzhiyun
qcom_qmp_phy_power_off(struct phy * phy)3194*4882a593Smuzhiyun static int qcom_qmp_phy_power_off(struct phy *phy)
3195*4882a593Smuzhiyun {
3196*4882a593Smuzhiyun struct qmp_phy *qphy = phy_get_drvdata(phy);
3197*4882a593Smuzhiyun const struct qmp_phy_cfg *cfg = qphy->cfg;
3198*4882a593Smuzhiyun
3199*4882a593Smuzhiyun clk_disable_unprepare(qphy->pipe_clk);
3200*4882a593Smuzhiyun
3201*4882a593Smuzhiyun if (cfg->type == PHY_TYPE_DP) {
3202*4882a593Smuzhiyun /* Assert DP PHY power down */
3203*4882a593Smuzhiyun writel(DP_PHY_PD_CTL_PSR_PWRDN, qphy->pcs + QSERDES_V3_DP_PHY_PD_CTL);
3204*4882a593Smuzhiyun } else {
3205*4882a593Smuzhiyun /* PHY reset */
3206*4882a593Smuzhiyun if (!cfg->no_pcs_sw_reset)
3207*4882a593Smuzhiyun qphy_setbits(qphy->pcs, cfg->regs[QPHY_SW_RESET], SW_RESET);
3208*4882a593Smuzhiyun
3209*4882a593Smuzhiyun /* stop SerDes and Phy-Coding-Sublayer */
3210*4882a593Smuzhiyun qphy_clrbits(qphy->pcs, cfg->regs[QPHY_START_CTRL], cfg->start_ctrl);
3211*4882a593Smuzhiyun
3212*4882a593Smuzhiyun /* Put PHY into POWER DOWN state: active low */
3213*4882a593Smuzhiyun if (cfg->regs[QPHY_PCS_POWER_DOWN_CONTROL]) {
3214*4882a593Smuzhiyun qphy_clrbits(qphy->pcs, cfg->regs[QPHY_PCS_POWER_DOWN_CONTROL],
3215*4882a593Smuzhiyun cfg->pwrdn_ctrl);
3216*4882a593Smuzhiyun } else {
3217*4882a593Smuzhiyun qphy_clrbits(qphy->pcs, QPHY_POWER_DOWN_CONTROL,
3218*4882a593Smuzhiyun cfg->pwrdn_ctrl);
3219*4882a593Smuzhiyun }
3220*4882a593Smuzhiyun }
3221*4882a593Smuzhiyun
3222*4882a593Smuzhiyun return 0;
3223*4882a593Smuzhiyun }
3224*4882a593Smuzhiyun
qcom_qmp_phy_exit(struct phy * phy)3225*4882a593Smuzhiyun static int qcom_qmp_phy_exit(struct phy *phy)
3226*4882a593Smuzhiyun {
3227*4882a593Smuzhiyun struct qmp_phy *qphy = phy_get_drvdata(phy);
3228*4882a593Smuzhiyun const struct qmp_phy_cfg *cfg = qphy->cfg;
3229*4882a593Smuzhiyun
3230*4882a593Smuzhiyun if (cfg->has_lane_rst)
3231*4882a593Smuzhiyun reset_control_assert(qphy->lane_rst);
3232*4882a593Smuzhiyun
3233*4882a593Smuzhiyun qcom_qmp_phy_com_exit(qphy);
3234*4882a593Smuzhiyun
3235*4882a593Smuzhiyun return 0;
3236*4882a593Smuzhiyun }
3237*4882a593Smuzhiyun
qcom_qmp_phy_enable(struct phy * phy)3238*4882a593Smuzhiyun static int qcom_qmp_phy_enable(struct phy *phy)
3239*4882a593Smuzhiyun {
3240*4882a593Smuzhiyun int ret;
3241*4882a593Smuzhiyun
3242*4882a593Smuzhiyun ret = qcom_qmp_phy_init(phy);
3243*4882a593Smuzhiyun if (ret)
3244*4882a593Smuzhiyun return ret;
3245*4882a593Smuzhiyun
3246*4882a593Smuzhiyun ret = qcom_qmp_phy_power_on(phy);
3247*4882a593Smuzhiyun if (ret)
3248*4882a593Smuzhiyun qcom_qmp_phy_exit(phy);
3249*4882a593Smuzhiyun
3250*4882a593Smuzhiyun return ret;
3251*4882a593Smuzhiyun }
3252*4882a593Smuzhiyun
qcom_qmp_phy_disable(struct phy * phy)3253*4882a593Smuzhiyun static int qcom_qmp_phy_disable(struct phy *phy)
3254*4882a593Smuzhiyun {
3255*4882a593Smuzhiyun int ret;
3256*4882a593Smuzhiyun
3257*4882a593Smuzhiyun ret = qcom_qmp_phy_power_off(phy);
3258*4882a593Smuzhiyun if (ret)
3259*4882a593Smuzhiyun return ret;
3260*4882a593Smuzhiyun return qcom_qmp_phy_exit(phy);
3261*4882a593Smuzhiyun }
3262*4882a593Smuzhiyun
qcom_qmp_phy_set_mode(struct phy * phy,enum phy_mode mode,int submode)3263*4882a593Smuzhiyun static int qcom_qmp_phy_set_mode(struct phy *phy,
3264*4882a593Smuzhiyun enum phy_mode mode, int submode)
3265*4882a593Smuzhiyun {
3266*4882a593Smuzhiyun struct qmp_phy *qphy = phy_get_drvdata(phy);
3267*4882a593Smuzhiyun
3268*4882a593Smuzhiyun qphy->mode = mode;
3269*4882a593Smuzhiyun
3270*4882a593Smuzhiyun return 0;
3271*4882a593Smuzhiyun }
3272*4882a593Smuzhiyun
qcom_qmp_phy_enable_autonomous_mode(struct qmp_phy * qphy)3273*4882a593Smuzhiyun static void qcom_qmp_phy_enable_autonomous_mode(struct qmp_phy *qphy)
3274*4882a593Smuzhiyun {
3275*4882a593Smuzhiyun const struct qmp_phy_cfg *cfg = qphy->cfg;
3276*4882a593Smuzhiyun void __iomem *pcs = qphy->pcs;
3277*4882a593Smuzhiyun void __iomem *pcs_misc = qphy->pcs_misc;
3278*4882a593Smuzhiyun u32 intr_mask;
3279*4882a593Smuzhiyun
3280*4882a593Smuzhiyun if (qphy->mode == PHY_MODE_USB_HOST_SS ||
3281*4882a593Smuzhiyun qphy->mode == PHY_MODE_USB_DEVICE_SS)
3282*4882a593Smuzhiyun intr_mask = ARCVR_DTCT_EN | ALFPS_DTCT_EN;
3283*4882a593Smuzhiyun else
3284*4882a593Smuzhiyun intr_mask = ARCVR_DTCT_EN | ARCVR_DTCT_EVENT_SEL;
3285*4882a593Smuzhiyun
3286*4882a593Smuzhiyun /* Clear any pending interrupts status */
3287*4882a593Smuzhiyun qphy_setbits(pcs, cfg->regs[QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR], IRQ_CLEAR);
3288*4882a593Smuzhiyun /* Writing 1 followed by 0 clears the interrupt */
3289*4882a593Smuzhiyun qphy_clrbits(pcs, cfg->regs[QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR], IRQ_CLEAR);
3290*4882a593Smuzhiyun
3291*4882a593Smuzhiyun qphy_clrbits(pcs, cfg->regs[QPHY_PCS_AUTONOMOUS_MODE_CTRL],
3292*4882a593Smuzhiyun ARCVR_DTCT_EN | ALFPS_DTCT_EN | ARCVR_DTCT_EVENT_SEL);
3293*4882a593Smuzhiyun
3294*4882a593Smuzhiyun /* Enable required PHY autonomous mode interrupts */
3295*4882a593Smuzhiyun qphy_setbits(pcs, cfg->regs[QPHY_PCS_AUTONOMOUS_MODE_CTRL], intr_mask);
3296*4882a593Smuzhiyun
3297*4882a593Smuzhiyun /* Enable i/o clamp_n for autonomous mode */
3298*4882a593Smuzhiyun if (pcs_misc)
3299*4882a593Smuzhiyun qphy_clrbits(pcs_misc, QPHY_V3_PCS_MISC_CLAMP_ENABLE, CLAMP_EN);
3300*4882a593Smuzhiyun }
3301*4882a593Smuzhiyun
qcom_qmp_phy_disable_autonomous_mode(struct qmp_phy * qphy)3302*4882a593Smuzhiyun static void qcom_qmp_phy_disable_autonomous_mode(struct qmp_phy *qphy)
3303*4882a593Smuzhiyun {
3304*4882a593Smuzhiyun const struct qmp_phy_cfg *cfg = qphy->cfg;
3305*4882a593Smuzhiyun void __iomem *pcs = qphy->pcs;
3306*4882a593Smuzhiyun void __iomem *pcs_misc = qphy->pcs_misc;
3307*4882a593Smuzhiyun
3308*4882a593Smuzhiyun /* Disable i/o clamp_n on resume for normal mode */
3309*4882a593Smuzhiyun if (pcs_misc)
3310*4882a593Smuzhiyun qphy_setbits(pcs_misc, QPHY_V3_PCS_MISC_CLAMP_ENABLE, CLAMP_EN);
3311*4882a593Smuzhiyun
3312*4882a593Smuzhiyun qphy_clrbits(pcs, cfg->regs[QPHY_PCS_AUTONOMOUS_MODE_CTRL],
3313*4882a593Smuzhiyun ARCVR_DTCT_EN | ARCVR_DTCT_EVENT_SEL | ALFPS_DTCT_EN);
3314*4882a593Smuzhiyun
3315*4882a593Smuzhiyun qphy_setbits(pcs, cfg->regs[QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR], IRQ_CLEAR);
3316*4882a593Smuzhiyun /* Writing 1 followed by 0 clears the interrupt */
3317*4882a593Smuzhiyun qphy_clrbits(pcs, cfg->regs[QPHY_PCS_LFPS_RXTERM_IRQ_CLEAR], IRQ_CLEAR);
3318*4882a593Smuzhiyun }
3319*4882a593Smuzhiyun
qcom_qmp_phy_runtime_suspend(struct device * dev)3320*4882a593Smuzhiyun static int __maybe_unused qcom_qmp_phy_runtime_suspend(struct device *dev)
3321*4882a593Smuzhiyun {
3322*4882a593Smuzhiyun struct qcom_qmp *qmp = dev_get_drvdata(dev);
3323*4882a593Smuzhiyun struct qmp_phy *qphy = qmp->phys[0];
3324*4882a593Smuzhiyun const struct qmp_phy_cfg *cfg = qphy->cfg;
3325*4882a593Smuzhiyun
3326*4882a593Smuzhiyun dev_vdbg(dev, "Suspending QMP phy, mode:%d\n", qphy->mode);
3327*4882a593Smuzhiyun
3328*4882a593Smuzhiyun /* Supported only for USB3 PHY and luckily USB3 is the first phy */
3329*4882a593Smuzhiyun if (cfg->type != PHY_TYPE_USB3)
3330*4882a593Smuzhiyun return 0;
3331*4882a593Smuzhiyun
3332*4882a593Smuzhiyun if (!qmp->init_count) {
3333*4882a593Smuzhiyun dev_vdbg(dev, "PHY not initialized, bailing out\n");
3334*4882a593Smuzhiyun return 0;
3335*4882a593Smuzhiyun }
3336*4882a593Smuzhiyun
3337*4882a593Smuzhiyun qcom_qmp_phy_enable_autonomous_mode(qphy);
3338*4882a593Smuzhiyun
3339*4882a593Smuzhiyun clk_disable_unprepare(qphy->pipe_clk);
3340*4882a593Smuzhiyun clk_bulk_disable_unprepare(cfg->num_clks, qmp->clks);
3341*4882a593Smuzhiyun
3342*4882a593Smuzhiyun return 0;
3343*4882a593Smuzhiyun }
3344*4882a593Smuzhiyun
qcom_qmp_phy_runtime_resume(struct device * dev)3345*4882a593Smuzhiyun static int __maybe_unused qcom_qmp_phy_runtime_resume(struct device *dev)
3346*4882a593Smuzhiyun {
3347*4882a593Smuzhiyun struct qcom_qmp *qmp = dev_get_drvdata(dev);
3348*4882a593Smuzhiyun struct qmp_phy *qphy = qmp->phys[0];
3349*4882a593Smuzhiyun const struct qmp_phy_cfg *cfg = qphy->cfg;
3350*4882a593Smuzhiyun int ret = 0;
3351*4882a593Smuzhiyun
3352*4882a593Smuzhiyun dev_vdbg(dev, "Resuming QMP phy, mode:%d\n", qphy->mode);
3353*4882a593Smuzhiyun
3354*4882a593Smuzhiyun /* Supported only for USB3 PHY and luckily USB3 is the first phy */
3355*4882a593Smuzhiyun if (cfg->type != PHY_TYPE_USB3)
3356*4882a593Smuzhiyun return 0;
3357*4882a593Smuzhiyun
3358*4882a593Smuzhiyun if (!qmp->init_count) {
3359*4882a593Smuzhiyun dev_vdbg(dev, "PHY not initialized, bailing out\n");
3360*4882a593Smuzhiyun return 0;
3361*4882a593Smuzhiyun }
3362*4882a593Smuzhiyun
3363*4882a593Smuzhiyun ret = clk_bulk_prepare_enable(cfg->num_clks, qmp->clks);
3364*4882a593Smuzhiyun if (ret) {
3365*4882a593Smuzhiyun dev_err(qmp->dev, "failed to enable clks, err=%d\n", ret);
3366*4882a593Smuzhiyun return ret;
3367*4882a593Smuzhiyun }
3368*4882a593Smuzhiyun
3369*4882a593Smuzhiyun ret = clk_prepare_enable(qphy->pipe_clk);
3370*4882a593Smuzhiyun if (ret) {
3371*4882a593Smuzhiyun dev_err(dev, "pipe_clk enable failed, err=%d\n", ret);
3372*4882a593Smuzhiyun clk_bulk_disable_unprepare(cfg->num_clks, qmp->clks);
3373*4882a593Smuzhiyun return ret;
3374*4882a593Smuzhiyun }
3375*4882a593Smuzhiyun
3376*4882a593Smuzhiyun qcom_qmp_phy_disable_autonomous_mode(qphy);
3377*4882a593Smuzhiyun
3378*4882a593Smuzhiyun return 0;
3379*4882a593Smuzhiyun }
3380*4882a593Smuzhiyun
qcom_qmp_phy_vreg_init(struct device * dev,const struct qmp_phy_cfg * cfg)3381*4882a593Smuzhiyun static int qcom_qmp_phy_vreg_init(struct device *dev, const struct qmp_phy_cfg *cfg)
3382*4882a593Smuzhiyun {
3383*4882a593Smuzhiyun struct qcom_qmp *qmp = dev_get_drvdata(dev);
3384*4882a593Smuzhiyun int num = cfg->num_vregs;
3385*4882a593Smuzhiyun int i;
3386*4882a593Smuzhiyun
3387*4882a593Smuzhiyun qmp->vregs = devm_kcalloc(dev, num, sizeof(*qmp->vregs), GFP_KERNEL);
3388*4882a593Smuzhiyun if (!qmp->vregs)
3389*4882a593Smuzhiyun return -ENOMEM;
3390*4882a593Smuzhiyun
3391*4882a593Smuzhiyun for (i = 0; i < num; i++)
3392*4882a593Smuzhiyun qmp->vregs[i].supply = cfg->vreg_list[i];
3393*4882a593Smuzhiyun
3394*4882a593Smuzhiyun return devm_regulator_bulk_get(dev, num, qmp->vregs);
3395*4882a593Smuzhiyun }
3396*4882a593Smuzhiyun
qcom_qmp_phy_reset_init(struct device * dev,const struct qmp_phy_cfg * cfg)3397*4882a593Smuzhiyun static int qcom_qmp_phy_reset_init(struct device *dev, const struct qmp_phy_cfg *cfg)
3398*4882a593Smuzhiyun {
3399*4882a593Smuzhiyun struct qcom_qmp *qmp = dev_get_drvdata(dev);
3400*4882a593Smuzhiyun int i;
3401*4882a593Smuzhiyun
3402*4882a593Smuzhiyun qmp->resets = devm_kcalloc(dev, cfg->num_resets,
3403*4882a593Smuzhiyun sizeof(*qmp->resets), GFP_KERNEL);
3404*4882a593Smuzhiyun if (!qmp->resets)
3405*4882a593Smuzhiyun return -ENOMEM;
3406*4882a593Smuzhiyun
3407*4882a593Smuzhiyun for (i = 0; i < cfg->num_resets; i++) {
3408*4882a593Smuzhiyun struct reset_control *rst;
3409*4882a593Smuzhiyun const char *name = cfg->reset_list[i];
3410*4882a593Smuzhiyun
3411*4882a593Smuzhiyun rst = devm_reset_control_get(dev, name);
3412*4882a593Smuzhiyun if (IS_ERR(rst)) {
3413*4882a593Smuzhiyun dev_err(dev, "failed to get %s reset\n", name);
3414*4882a593Smuzhiyun return PTR_ERR(rst);
3415*4882a593Smuzhiyun }
3416*4882a593Smuzhiyun qmp->resets[i] = rst;
3417*4882a593Smuzhiyun }
3418*4882a593Smuzhiyun
3419*4882a593Smuzhiyun return 0;
3420*4882a593Smuzhiyun }
3421*4882a593Smuzhiyun
qcom_qmp_phy_clk_init(struct device * dev,const struct qmp_phy_cfg * cfg)3422*4882a593Smuzhiyun static int qcom_qmp_phy_clk_init(struct device *dev, const struct qmp_phy_cfg *cfg)
3423*4882a593Smuzhiyun {
3424*4882a593Smuzhiyun struct qcom_qmp *qmp = dev_get_drvdata(dev);
3425*4882a593Smuzhiyun int num = cfg->num_clks;
3426*4882a593Smuzhiyun int i;
3427*4882a593Smuzhiyun
3428*4882a593Smuzhiyun qmp->clks = devm_kcalloc(dev, num, sizeof(*qmp->clks), GFP_KERNEL);
3429*4882a593Smuzhiyun if (!qmp->clks)
3430*4882a593Smuzhiyun return -ENOMEM;
3431*4882a593Smuzhiyun
3432*4882a593Smuzhiyun for (i = 0; i < num; i++)
3433*4882a593Smuzhiyun qmp->clks[i].id = cfg->clk_list[i];
3434*4882a593Smuzhiyun
3435*4882a593Smuzhiyun return devm_clk_bulk_get(dev, num, qmp->clks);
3436*4882a593Smuzhiyun }
3437*4882a593Smuzhiyun
phy_clk_release_provider(void * res)3438*4882a593Smuzhiyun static void phy_clk_release_provider(void *res)
3439*4882a593Smuzhiyun {
3440*4882a593Smuzhiyun of_clk_del_provider(res);
3441*4882a593Smuzhiyun }
3442*4882a593Smuzhiyun
3443*4882a593Smuzhiyun /*
3444*4882a593Smuzhiyun * Register a fixed rate pipe clock.
3445*4882a593Smuzhiyun *
3446*4882a593Smuzhiyun * The <s>_pipe_clksrc generated by PHY goes to the GCC that gate
3447*4882a593Smuzhiyun * controls it. The <s>_pipe_clk coming out of the GCC is requested
3448*4882a593Smuzhiyun * by the PHY driver for its operations.
3449*4882a593Smuzhiyun * We register the <s>_pipe_clksrc here. The gcc driver takes care
3450*4882a593Smuzhiyun * of assigning this <s>_pipe_clksrc as parent to <s>_pipe_clk.
3451*4882a593Smuzhiyun * Below picture shows this relationship.
3452*4882a593Smuzhiyun *
3453*4882a593Smuzhiyun * +---------------+
3454*4882a593Smuzhiyun * | PHY block |<<---------------------------------------+
3455*4882a593Smuzhiyun * | | |
3456*4882a593Smuzhiyun * | +-------+ | +-----+ |
3457*4882a593Smuzhiyun * I/P---^-->| PLL |---^--->pipe_clksrc--->| GCC |--->pipe_clk---+
3458*4882a593Smuzhiyun * clk | +-------+ | +-----+
3459*4882a593Smuzhiyun * +---------------+
3460*4882a593Smuzhiyun */
phy_pipe_clk_register(struct qcom_qmp * qmp,struct device_node * np)3461*4882a593Smuzhiyun static int phy_pipe_clk_register(struct qcom_qmp *qmp, struct device_node *np)
3462*4882a593Smuzhiyun {
3463*4882a593Smuzhiyun struct clk_fixed_rate *fixed;
3464*4882a593Smuzhiyun struct clk_init_data init = { };
3465*4882a593Smuzhiyun int ret;
3466*4882a593Smuzhiyun
3467*4882a593Smuzhiyun ret = of_property_read_string(np, "clock-output-names", &init.name);
3468*4882a593Smuzhiyun if (ret) {
3469*4882a593Smuzhiyun dev_err(qmp->dev, "%pOFn: No clock-output-names\n", np);
3470*4882a593Smuzhiyun return ret;
3471*4882a593Smuzhiyun }
3472*4882a593Smuzhiyun
3473*4882a593Smuzhiyun fixed = devm_kzalloc(qmp->dev, sizeof(*fixed), GFP_KERNEL);
3474*4882a593Smuzhiyun if (!fixed)
3475*4882a593Smuzhiyun return -ENOMEM;
3476*4882a593Smuzhiyun
3477*4882a593Smuzhiyun init.ops = &clk_fixed_rate_ops;
3478*4882a593Smuzhiyun
3479*4882a593Smuzhiyun /* controllers using QMP phys use 125MHz pipe clock interface */
3480*4882a593Smuzhiyun fixed->fixed_rate = 125000000;
3481*4882a593Smuzhiyun fixed->hw.init = &init;
3482*4882a593Smuzhiyun
3483*4882a593Smuzhiyun ret = devm_clk_hw_register(qmp->dev, &fixed->hw);
3484*4882a593Smuzhiyun if (ret)
3485*4882a593Smuzhiyun return ret;
3486*4882a593Smuzhiyun
3487*4882a593Smuzhiyun ret = of_clk_add_hw_provider(np, of_clk_hw_simple_get, &fixed->hw);
3488*4882a593Smuzhiyun if (ret)
3489*4882a593Smuzhiyun return ret;
3490*4882a593Smuzhiyun
3491*4882a593Smuzhiyun /*
3492*4882a593Smuzhiyun * Roll a devm action because the clock provider is the child node, but
3493*4882a593Smuzhiyun * the child node is not actually a device.
3494*4882a593Smuzhiyun */
3495*4882a593Smuzhiyun ret = devm_add_action(qmp->dev, phy_clk_release_provider, np);
3496*4882a593Smuzhiyun if (ret)
3497*4882a593Smuzhiyun phy_clk_release_provider(np);
3498*4882a593Smuzhiyun
3499*4882a593Smuzhiyun return ret;
3500*4882a593Smuzhiyun }
3501*4882a593Smuzhiyun
3502*4882a593Smuzhiyun /*
3503*4882a593Smuzhiyun * Display Port PLL driver block diagram for branch clocks
3504*4882a593Smuzhiyun *
3505*4882a593Smuzhiyun * +------------------------------+
3506*4882a593Smuzhiyun * | DP_VCO_CLK |
3507*4882a593Smuzhiyun * | |
3508*4882a593Smuzhiyun * | +-------------------+ |
3509*4882a593Smuzhiyun * | | (DP PLL/VCO) | |
3510*4882a593Smuzhiyun * | +---------+---------+ |
3511*4882a593Smuzhiyun * | v |
3512*4882a593Smuzhiyun * | +----------+-----------+ |
3513*4882a593Smuzhiyun * | | hsclk_divsel_clk_src | |
3514*4882a593Smuzhiyun * | +----------+-----------+ |
3515*4882a593Smuzhiyun * +------------------------------+
3516*4882a593Smuzhiyun * |
3517*4882a593Smuzhiyun * +---------<---------v------------>----------+
3518*4882a593Smuzhiyun * | |
3519*4882a593Smuzhiyun * +--------v----------------+ |
3520*4882a593Smuzhiyun * | dp_phy_pll_link_clk | |
3521*4882a593Smuzhiyun * | link_clk | |
3522*4882a593Smuzhiyun * +--------+----------------+ |
3523*4882a593Smuzhiyun * | |
3524*4882a593Smuzhiyun * | |
3525*4882a593Smuzhiyun * v v
3526*4882a593Smuzhiyun * Input to DISPCC block |
3527*4882a593Smuzhiyun * for link clk, crypto clk |
3528*4882a593Smuzhiyun * and interface clock |
3529*4882a593Smuzhiyun * |
3530*4882a593Smuzhiyun * |
3531*4882a593Smuzhiyun * +--------<------------+-----------------+---<---+
3532*4882a593Smuzhiyun * | | |
3533*4882a593Smuzhiyun * +----v---------+ +--------v-----+ +--------v------+
3534*4882a593Smuzhiyun * | vco_divided | | vco_divided | | vco_divided |
3535*4882a593Smuzhiyun * | _clk_src | | _clk_src | | _clk_src |
3536*4882a593Smuzhiyun * | | | | | |
3537*4882a593Smuzhiyun * |divsel_six | | divsel_two | | divsel_four |
3538*4882a593Smuzhiyun * +-------+------+ +-----+--------+ +--------+------+
3539*4882a593Smuzhiyun * | | |
3540*4882a593Smuzhiyun * v---->----------v-------------<------v
3541*4882a593Smuzhiyun * |
3542*4882a593Smuzhiyun * +----------+-----------------+
3543*4882a593Smuzhiyun * | dp_phy_pll_vco_div_clk |
3544*4882a593Smuzhiyun * +---------+------------------+
3545*4882a593Smuzhiyun * |
3546*4882a593Smuzhiyun * v
3547*4882a593Smuzhiyun * Input to DISPCC block
3548*4882a593Smuzhiyun * for DP pixel clock
3549*4882a593Smuzhiyun *
3550*4882a593Smuzhiyun */
qcom_qmp_dp_pixel_clk_determine_rate(struct clk_hw * hw,struct clk_rate_request * req)3551*4882a593Smuzhiyun static int qcom_qmp_dp_pixel_clk_determine_rate(struct clk_hw *hw,
3552*4882a593Smuzhiyun struct clk_rate_request *req)
3553*4882a593Smuzhiyun {
3554*4882a593Smuzhiyun switch (req->rate) {
3555*4882a593Smuzhiyun case 1620000000UL / 2:
3556*4882a593Smuzhiyun case 2700000000UL / 2:
3557*4882a593Smuzhiyun /* 5.4 and 8.1 GHz are same link rate as 2.7GHz, i.e. div 4 and div 6 */
3558*4882a593Smuzhiyun return 0;
3559*4882a593Smuzhiyun default:
3560*4882a593Smuzhiyun return -EINVAL;
3561*4882a593Smuzhiyun }
3562*4882a593Smuzhiyun }
3563*4882a593Smuzhiyun
3564*4882a593Smuzhiyun static unsigned long
qcom_qmp_dp_pixel_clk_recalc_rate(struct clk_hw * hw,unsigned long parent_rate)3565*4882a593Smuzhiyun qcom_qmp_dp_pixel_clk_recalc_rate(struct clk_hw *hw, unsigned long parent_rate)
3566*4882a593Smuzhiyun {
3567*4882a593Smuzhiyun const struct qmp_phy_dp_clks *dp_clks;
3568*4882a593Smuzhiyun const struct qmp_phy *qphy;
3569*4882a593Smuzhiyun const struct phy_configure_opts_dp *dp_opts;
3570*4882a593Smuzhiyun
3571*4882a593Smuzhiyun dp_clks = container_of(hw, struct qmp_phy_dp_clks, dp_pixel_hw);
3572*4882a593Smuzhiyun qphy = dp_clks->qphy;
3573*4882a593Smuzhiyun dp_opts = &qphy->dp_opts;
3574*4882a593Smuzhiyun
3575*4882a593Smuzhiyun switch (dp_opts->link_rate) {
3576*4882a593Smuzhiyun case 1620:
3577*4882a593Smuzhiyun return 1620000000UL / 2;
3578*4882a593Smuzhiyun case 2700:
3579*4882a593Smuzhiyun return 2700000000UL / 2;
3580*4882a593Smuzhiyun case 5400:
3581*4882a593Smuzhiyun return 5400000000UL / 4;
3582*4882a593Smuzhiyun case 8100:
3583*4882a593Smuzhiyun return 8100000000UL / 6;
3584*4882a593Smuzhiyun default:
3585*4882a593Smuzhiyun return 0;
3586*4882a593Smuzhiyun }
3587*4882a593Smuzhiyun }
3588*4882a593Smuzhiyun
3589*4882a593Smuzhiyun static const struct clk_ops qcom_qmp_dp_pixel_clk_ops = {
3590*4882a593Smuzhiyun .determine_rate = qcom_qmp_dp_pixel_clk_determine_rate,
3591*4882a593Smuzhiyun .recalc_rate = qcom_qmp_dp_pixel_clk_recalc_rate,
3592*4882a593Smuzhiyun };
3593*4882a593Smuzhiyun
qcom_qmp_dp_link_clk_determine_rate(struct clk_hw * hw,struct clk_rate_request * req)3594*4882a593Smuzhiyun static int qcom_qmp_dp_link_clk_determine_rate(struct clk_hw *hw,
3595*4882a593Smuzhiyun struct clk_rate_request *req)
3596*4882a593Smuzhiyun {
3597*4882a593Smuzhiyun switch (req->rate) {
3598*4882a593Smuzhiyun case 162000000:
3599*4882a593Smuzhiyun case 270000000:
3600*4882a593Smuzhiyun case 540000000:
3601*4882a593Smuzhiyun case 810000000:
3602*4882a593Smuzhiyun return 0;
3603*4882a593Smuzhiyun default:
3604*4882a593Smuzhiyun return -EINVAL;
3605*4882a593Smuzhiyun }
3606*4882a593Smuzhiyun }
3607*4882a593Smuzhiyun
3608*4882a593Smuzhiyun static unsigned long
qcom_qmp_dp_link_clk_recalc_rate(struct clk_hw * hw,unsigned long parent_rate)3609*4882a593Smuzhiyun qcom_qmp_dp_link_clk_recalc_rate(struct clk_hw *hw, unsigned long parent_rate)
3610*4882a593Smuzhiyun {
3611*4882a593Smuzhiyun const struct qmp_phy_dp_clks *dp_clks;
3612*4882a593Smuzhiyun const struct qmp_phy *qphy;
3613*4882a593Smuzhiyun const struct phy_configure_opts_dp *dp_opts;
3614*4882a593Smuzhiyun
3615*4882a593Smuzhiyun dp_clks = container_of(hw, struct qmp_phy_dp_clks, dp_link_hw);
3616*4882a593Smuzhiyun qphy = dp_clks->qphy;
3617*4882a593Smuzhiyun dp_opts = &qphy->dp_opts;
3618*4882a593Smuzhiyun
3619*4882a593Smuzhiyun switch (dp_opts->link_rate) {
3620*4882a593Smuzhiyun case 1620:
3621*4882a593Smuzhiyun case 2700:
3622*4882a593Smuzhiyun case 5400:
3623*4882a593Smuzhiyun case 8100:
3624*4882a593Smuzhiyun return dp_opts->link_rate * 100000;
3625*4882a593Smuzhiyun default:
3626*4882a593Smuzhiyun return 0;
3627*4882a593Smuzhiyun }
3628*4882a593Smuzhiyun }
3629*4882a593Smuzhiyun
3630*4882a593Smuzhiyun static const struct clk_ops qcom_qmp_dp_link_clk_ops = {
3631*4882a593Smuzhiyun .determine_rate = qcom_qmp_dp_link_clk_determine_rate,
3632*4882a593Smuzhiyun .recalc_rate = qcom_qmp_dp_link_clk_recalc_rate,
3633*4882a593Smuzhiyun };
3634*4882a593Smuzhiyun
3635*4882a593Smuzhiyun static struct clk_hw *
qcom_qmp_dp_clks_hw_get(struct of_phandle_args * clkspec,void * data)3636*4882a593Smuzhiyun qcom_qmp_dp_clks_hw_get(struct of_phandle_args *clkspec, void *data)
3637*4882a593Smuzhiyun {
3638*4882a593Smuzhiyun struct qmp_phy_dp_clks *dp_clks = data;
3639*4882a593Smuzhiyun unsigned int idx = clkspec->args[0];
3640*4882a593Smuzhiyun
3641*4882a593Smuzhiyun if (idx >= 2) {
3642*4882a593Smuzhiyun pr_err("%s: invalid index %u\n", __func__, idx);
3643*4882a593Smuzhiyun return ERR_PTR(-EINVAL);
3644*4882a593Smuzhiyun }
3645*4882a593Smuzhiyun
3646*4882a593Smuzhiyun if (idx == 0)
3647*4882a593Smuzhiyun return &dp_clks->dp_link_hw;
3648*4882a593Smuzhiyun
3649*4882a593Smuzhiyun return &dp_clks->dp_pixel_hw;
3650*4882a593Smuzhiyun }
3651*4882a593Smuzhiyun
phy_dp_clks_register(struct qcom_qmp * qmp,struct qmp_phy * qphy,struct device_node * np)3652*4882a593Smuzhiyun static int phy_dp_clks_register(struct qcom_qmp *qmp, struct qmp_phy *qphy,
3653*4882a593Smuzhiyun struct device_node *np)
3654*4882a593Smuzhiyun {
3655*4882a593Smuzhiyun struct clk_init_data init = { };
3656*4882a593Smuzhiyun struct qmp_phy_dp_clks *dp_clks;
3657*4882a593Smuzhiyun int ret;
3658*4882a593Smuzhiyun
3659*4882a593Smuzhiyun dp_clks = devm_kzalloc(qmp->dev, sizeof(*dp_clks), GFP_KERNEL);
3660*4882a593Smuzhiyun if (!dp_clks)
3661*4882a593Smuzhiyun return -ENOMEM;
3662*4882a593Smuzhiyun
3663*4882a593Smuzhiyun dp_clks->qphy = qphy;
3664*4882a593Smuzhiyun qphy->dp_clks = dp_clks;
3665*4882a593Smuzhiyun
3666*4882a593Smuzhiyun init.ops = &qcom_qmp_dp_link_clk_ops;
3667*4882a593Smuzhiyun init.name = "qmp_dp_phy_pll_link_clk";
3668*4882a593Smuzhiyun dp_clks->dp_link_hw.init = &init;
3669*4882a593Smuzhiyun ret = devm_clk_hw_register(qmp->dev, &dp_clks->dp_link_hw);
3670*4882a593Smuzhiyun if (ret)
3671*4882a593Smuzhiyun return ret;
3672*4882a593Smuzhiyun
3673*4882a593Smuzhiyun init.ops = &qcom_qmp_dp_pixel_clk_ops;
3674*4882a593Smuzhiyun init.name = "qmp_dp_phy_pll_vco_div_clk";
3675*4882a593Smuzhiyun dp_clks->dp_pixel_hw.init = &init;
3676*4882a593Smuzhiyun ret = devm_clk_hw_register(qmp->dev, &dp_clks->dp_pixel_hw);
3677*4882a593Smuzhiyun if (ret)
3678*4882a593Smuzhiyun return ret;
3679*4882a593Smuzhiyun
3680*4882a593Smuzhiyun ret = of_clk_add_hw_provider(np, qcom_qmp_dp_clks_hw_get, dp_clks);
3681*4882a593Smuzhiyun if (ret)
3682*4882a593Smuzhiyun return ret;
3683*4882a593Smuzhiyun
3684*4882a593Smuzhiyun /*
3685*4882a593Smuzhiyun * Roll a devm action because the clock provider is the child node, but
3686*4882a593Smuzhiyun * the child node is not actually a device.
3687*4882a593Smuzhiyun */
3688*4882a593Smuzhiyun ret = devm_add_action(qmp->dev, phy_clk_release_provider, np);
3689*4882a593Smuzhiyun if (ret)
3690*4882a593Smuzhiyun phy_clk_release_provider(np);
3691*4882a593Smuzhiyun
3692*4882a593Smuzhiyun return ret;
3693*4882a593Smuzhiyun }
3694*4882a593Smuzhiyun
3695*4882a593Smuzhiyun static const struct phy_ops qcom_qmp_phy_gen_ops = {
3696*4882a593Smuzhiyun .init = qcom_qmp_phy_enable,
3697*4882a593Smuzhiyun .exit = qcom_qmp_phy_disable,
3698*4882a593Smuzhiyun .set_mode = qcom_qmp_phy_set_mode,
3699*4882a593Smuzhiyun .owner = THIS_MODULE,
3700*4882a593Smuzhiyun };
3701*4882a593Smuzhiyun
3702*4882a593Smuzhiyun static const struct phy_ops qcom_qmp_phy_dp_ops = {
3703*4882a593Smuzhiyun .init = qcom_qmp_phy_init,
3704*4882a593Smuzhiyun .configure = qcom_qmp_dp_phy_configure,
3705*4882a593Smuzhiyun .power_on = qcom_qmp_phy_power_on,
3706*4882a593Smuzhiyun .calibrate = qcom_qmp_dp_phy_calibrate,
3707*4882a593Smuzhiyun .power_off = qcom_qmp_phy_power_off,
3708*4882a593Smuzhiyun .exit = qcom_qmp_phy_exit,
3709*4882a593Smuzhiyun .set_mode = qcom_qmp_phy_set_mode,
3710*4882a593Smuzhiyun .owner = THIS_MODULE,
3711*4882a593Smuzhiyun };
3712*4882a593Smuzhiyun
3713*4882a593Smuzhiyun static const struct phy_ops qcom_qmp_pcie_ufs_ops = {
3714*4882a593Smuzhiyun .power_on = qcom_qmp_phy_enable,
3715*4882a593Smuzhiyun .power_off = qcom_qmp_phy_disable,
3716*4882a593Smuzhiyun .set_mode = qcom_qmp_phy_set_mode,
3717*4882a593Smuzhiyun .owner = THIS_MODULE,
3718*4882a593Smuzhiyun };
3719*4882a593Smuzhiyun
qcom_qmp_reset_control_put(void * data)3720*4882a593Smuzhiyun static void qcom_qmp_reset_control_put(void *data)
3721*4882a593Smuzhiyun {
3722*4882a593Smuzhiyun reset_control_put(data);
3723*4882a593Smuzhiyun }
3724*4882a593Smuzhiyun
3725*4882a593Smuzhiyun static
qcom_qmp_phy_create(struct device * dev,struct device_node * np,int id,void __iomem * serdes,const struct qmp_phy_cfg * cfg)3726*4882a593Smuzhiyun int qcom_qmp_phy_create(struct device *dev, struct device_node *np, int id,
3727*4882a593Smuzhiyun void __iomem *serdes, const struct qmp_phy_cfg *cfg)
3728*4882a593Smuzhiyun {
3729*4882a593Smuzhiyun struct qcom_qmp *qmp = dev_get_drvdata(dev);
3730*4882a593Smuzhiyun struct phy *generic_phy;
3731*4882a593Smuzhiyun struct qmp_phy *qphy;
3732*4882a593Smuzhiyun const struct phy_ops *ops;
3733*4882a593Smuzhiyun char prop_name[MAX_PROP_NAME];
3734*4882a593Smuzhiyun int ret;
3735*4882a593Smuzhiyun
3736*4882a593Smuzhiyun qphy = devm_kzalloc(dev, sizeof(*qphy), GFP_KERNEL);
3737*4882a593Smuzhiyun if (!qphy)
3738*4882a593Smuzhiyun return -ENOMEM;
3739*4882a593Smuzhiyun
3740*4882a593Smuzhiyun qphy->cfg = cfg;
3741*4882a593Smuzhiyun qphy->serdes = serdes;
3742*4882a593Smuzhiyun /*
3743*4882a593Smuzhiyun * Get memory resources for each phy lane:
3744*4882a593Smuzhiyun * Resources are indexed as: tx -> 0; rx -> 1; pcs -> 2.
3745*4882a593Smuzhiyun * For dual lane PHYs: tx2 -> 3, rx2 -> 4, pcs_misc (optional) -> 5
3746*4882a593Smuzhiyun * For single lane PHYs: pcs_misc (optional) -> 3.
3747*4882a593Smuzhiyun */
3748*4882a593Smuzhiyun qphy->tx = of_iomap(np, 0);
3749*4882a593Smuzhiyun if (!qphy->tx)
3750*4882a593Smuzhiyun return -ENOMEM;
3751*4882a593Smuzhiyun
3752*4882a593Smuzhiyun qphy->rx = of_iomap(np, 1);
3753*4882a593Smuzhiyun if (!qphy->rx)
3754*4882a593Smuzhiyun return -ENOMEM;
3755*4882a593Smuzhiyun
3756*4882a593Smuzhiyun qphy->pcs = of_iomap(np, 2);
3757*4882a593Smuzhiyun if (!qphy->pcs)
3758*4882a593Smuzhiyun return -ENOMEM;
3759*4882a593Smuzhiyun
3760*4882a593Smuzhiyun /*
3761*4882a593Smuzhiyun * If this is a dual-lane PHY, then there should be registers for the
3762*4882a593Smuzhiyun * second lane. Some old device trees did not specify this, so fall
3763*4882a593Smuzhiyun * back to old legacy behavior of assuming they can be reached at an
3764*4882a593Smuzhiyun * offset from the first lane.
3765*4882a593Smuzhiyun */
3766*4882a593Smuzhiyun if (cfg->is_dual_lane_phy) {
3767*4882a593Smuzhiyun qphy->tx2 = of_iomap(np, 3);
3768*4882a593Smuzhiyun qphy->rx2 = of_iomap(np, 4);
3769*4882a593Smuzhiyun if (!qphy->tx2 || !qphy->rx2) {
3770*4882a593Smuzhiyun dev_warn(dev,
3771*4882a593Smuzhiyun "Underspecified device tree, falling back to legacy register regions\n");
3772*4882a593Smuzhiyun
3773*4882a593Smuzhiyun /* In the old version, pcs_misc is at index 3. */
3774*4882a593Smuzhiyun qphy->pcs_misc = qphy->tx2;
3775*4882a593Smuzhiyun qphy->tx2 = qphy->tx + QMP_PHY_LEGACY_LANE_STRIDE;
3776*4882a593Smuzhiyun qphy->rx2 = qphy->rx + QMP_PHY_LEGACY_LANE_STRIDE;
3777*4882a593Smuzhiyun
3778*4882a593Smuzhiyun } else {
3779*4882a593Smuzhiyun qphy->pcs_misc = of_iomap(np, 5);
3780*4882a593Smuzhiyun }
3781*4882a593Smuzhiyun
3782*4882a593Smuzhiyun } else {
3783*4882a593Smuzhiyun qphy->pcs_misc = of_iomap(np, 3);
3784*4882a593Smuzhiyun }
3785*4882a593Smuzhiyun
3786*4882a593Smuzhiyun if (!qphy->pcs_misc)
3787*4882a593Smuzhiyun dev_vdbg(dev, "PHY pcs_misc-reg not used\n");
3788*4882a593Smuzhiyun
3789*4882a593Smuzhiyun /*
3790*4882a593Smuzhiyun * Get PHY's Pipe clock, if any. USB3 and PCIe are PIPE3
3791*4882a593Smuzhiyun * based phys, so they essentially have pipe clock. So,
3792*4882a593Smuzhiyun * we return error in case phy is USB3 or PIPE type.
3793*4882a593Smuzhiyun * Otherwise, we initialize pipe clock to NULL for
3794*4882a593Smuzhiyun * all phys that don't need this.
3795*4882a593Smuzhiyun */
3796*4882a593Smuzhiyun snprintf(prop_name, sizeof(prop_name), "pipe%d", id);
3797*4882a593Smuzhiyun qphy->pipe_clk = devm_get_clk_from_child(dev, np, prop_name);
3798*4882a593Smuzhiyun if (IS_ERR(qphy->pipe_clk)) {
3799*4882a593Smuzhiyun if (cfg->type == PHY_TYPE_PCIE ||
3800*4882a593Smuzhiyun cfg->type == PHY_TYPE_USB3) {
3801*4882a593Smuzhiyun ret = PTR_ERR(qphy->pipe_clk);
3802*4882a593Smuzhiyun if (ret != -EPROBE_DEFER)
3803*4882a593Smuzhiyun dev_err(dev,
3804*4882a593Smuzhiyun "failed to get lane%d pipe_clk, %d\n",
3805*4882a593Smuzhiyun id, ret);
3806*4882a593Smuzhiyun return ret;
3807*4882a593Smuzhiyun }
3808*4882a593Smuzhiyun qphy->pipe_clk = NULL;
3809*4882a593Smuzhiyun }
3810*4882a593Smuzhiyun
3811*4882a593Smuzhiyun /* Get lane reset, if any */
3812*4882a593Smuzhiyun if (cfg->has_lane_rst) {
3813*4882a593Smuzhiyun snprintf(prop_name, sizeof(prop_name), "lane%d", id);
3814*4882a593Smuzhiyun qphy->lane_rst = of_reset_control_get(np, prop_name);
3815*4882a593Smuzhiyun if (IS_ERR(qphy->lane_rst)) {
3816*4882a593Smuzhiyun dev_err(dev, "failed to get lane%d reset\n", id);
3817*4882a593Smuzhiyun return PTR_ERR(qphy->lane_rst);
3818*4882a593Smuzhiyun }
3819*4882a593Smuzhiyun ret = devm_add_action_or_reset(dev, qcom_qmp_reset_control_put,
3820*4882a593Smuzhiyun qphy->lane_rst);
3821*4882a593Smuzhiyun if (ret)
3822*4882a593Smuzhiyun return ret;
3823*4882a593Smuzhiyun }
3824*4882a593Smuzhiyun
3825*4882a593Smuzhiyun if (cfg->type == PHY_TYPE_UFS || cfg->type == PHY_TYPE_PCIE)
3826*4882a593Smuzhiyun ops = &qcom_qmp_pcie_ufs_ops;
3827*4882a593Smuzhiyun else if (cfg->type == PHY_TYPE_DP)
3828*4882a593Smuzhiyun ops = &qcom_qmp_phy_dp_ops;
3829*4882a593Smuzhiyun else
3830*4882a593Smuzhiyun ops = &qcom_qmp_phy_gen_ops;
3831*4882a593Smuzhiyun
3832*4882a593Smuzhiyun generic_phy = devm_phy_create(dev, np, ops);
3833*4882a593Smuzhiyun if (IS_ERR(generic_phy)) {
3834*4882a593Smuzhiyun ret = PTR_ERR(generic_phy);
3835*4882a593Smuzhiyun dev_err(dev, "failed to create qphy %d\n", ret);
3836*4882a593Smuzhiyun return ret;
3837*4882a593Smuzhiyun }
3838*4882a593Smuzhiyun
3839*4882a593Smuzhiyun qphy->phy = generic_phy;
3840*4882a593Smuzhiyun qphy->index = id;
3841*4882a593Smuzhiyun qphy->qmp = qmp;
3842*4882a593Smuzhiyun qmp->phys[id] = qphy;
3843*4882a593Smuzhiyun phy_set_drvdata(generic_phy, qphy);
3844*4882a593Smuzhiyun
3845*4882a593Smuzhiyun return 0;
3846*4882a593Smuzhiyun }
3847*4882a593Smuzhiyun
3848*4882a593Smuzhiyun static const struct of_device_id qcom_qmp_phy_of_match_table[] = {
3849*4882a593Smuzhiyun {
3850*4882a593Smuzhiyun .compatible = "qcom,ipq8074-qmp-usb3-phy",
3851*4882a593Smuzhiyun .data = &ipq8074_usb3phy_cfg,
3852*4882a593Smuzhiyun }, {
3853*4882a593Smuzhiyun .compatible = "qcom,msm8996-qmp-pcie-phy",
3854*4882a593Smuzhiyun .data = &msm8996_pciephy_cfg,
3855*4882a593Smuzhiyun }, {
3856*4882a593Smuzhiyun .compatible = "qcom,msm8996-qmp-ufs-phy",
3857*4882a593Smuzhiyun .data = &msm8996_ufs_cfg,
3858*4882a593Smuzhiyun }, {
3859*4882a593Smuzhiyun .compatible = "qcom,msm8996-qmp-usb3-phy",
3860*4882a593Smuzhiyun .data = &msm8996_usb3phy_cfg,
3861*4882a593Smuzhiyun }, {
3862*4882a593Smuzhiyun .compatible = "qcom,msm8998-qmp-pcie-phy",
3863*4882a593Smuzhiyun .data = &msm8998_pciephy_cfg,
3864*4882a593Smuzhiyun }, {
3865*4882a593Smuzhiyun .compatible = "qcom,msm8998-qmp-ufs-phy",
3866*4882a593Smuzhiyun .data = &sdm845_ufsphy_cfg,
3867*4882a593Smuzhiyun }, {
3868*4882a593Smuzhiyun .compatible = "qcom,ipq8074-qmp-pcie-phy",
3869*4882a593Smuzhiyun .data = &ipq8074_pciephy_cfg,
3870*4882a593Smuzhiyun }, {
3871*4882a593Smuzhiyun .compatible = "qcom,sc7180-qmp-usb3-phy",
3872*4882a593Smuzhiyun .data = &sc7180_usb3phy_cfg,
3873*4882a593Smuzhiyun }, {
3874*4882a593Smuzhiyun .compatible = "qcom,sc7180-qmp-usb3-dp-phy",
3875*4882a593Smuzhiyun /* It's a combo phy */
3876*4882a593Smuzhiyun }, {
3877*4882a593Smuzhiyun .compatible = "qcom,sdm845-qhp-pcie-phy",
3878*4882a593Smuzhiyun .data = &sdm845_qhp_pciephy_cfg,
3879*4882a593Smuzhiyun }, {
3880*4882a593Smuzhiyun .compatible = "qcom,sdm845-qmp-pcie-phy",
3881*4882a593Smuzhiyun .data = &sdm845_qmp_pciephy_cfg,
3882*4882a593Smuzhiyun }, {
3883*4882a593Smuzhiyun .compatible = "qcom,sdm845-qmp-usb3-phy",
3884*4882a593Smuzhiyun .data = &qmp_v3_usb3phy_cfg,
3885*4882a593Smuzhiyun }, {
3886*4882a593Smuzhiyun .compatible = "qcom,sdm845-qmp-usb3-uni-phy",
3887*4882a593Smuzhiyun .data = &qmp_v3_usb3_uniphy_cfg,
3888*4882a593Smuzhiyun }, {
3889*4882a593Smuzhiyun .compatible = "qcom,sdm845-qmp-ufs-phy",
3890*4882a593Smuzhiyun .data = &sdm845_ufsphy_cfg,
3891*4882a593Smuzhiyun }, {
3892*4882a593Smuzhiyun .compatible = "qcom,msm8998-qmp-usb3-phy",
3893*4882a593Smuzhiyun .data = &msm8998_usb3phy_cfg,
3894*4882a593Smuzhiyun }, {
3895*4882a593Smuzhiyun .compatible = "qcom,sm8150-qmp-ufs-phy",
3896*4882a593Smuzhiyun .data = &sm8150_ufsphy_cfg,
3897*4882a593Smuzhiyun }, {
3898*4882a593Smuzhiyun .compatible = "qcom,sm8250-qmp-ufs-phy",
3899*4882a593Smuzhiyun .data = &sm8150_ufsphy_cfg,
3900*4882a593Smuzhiyun }, {
3901*4882a593Smuzhiyun .compatible = "qcom,sm8150-qmp-usb3-phy",
3902*4882a593Smuzhiyun .data = &sm8150_usb3phy_cfg,
3903*4882a593Smuzhiyun }, {
3904*4882a593Smuzhiyun .compatible = "qcom,sm8150-qmp-usb3-uni-phy",
3905*4882a593Smuzhiyun .data = &sm8150_usb3_uniphy_cfg,
3906*4882a593Smuzhiyun }, {
3907*4882a593Smuzhiyun .compatible = "qcom,sm8250-qmp-usb3-phy",
3908*4882a593Smuzhiyun .data = &sm8250_usb3phy_cfg,
3909*4882a593Smuzhiyun }, {
3910*4882a593Smuzhiyun .compatible = "qcom,sm8250-qmp-usb3-uni-phy",
3911*4882a593Smuzhiyun .data = &sm8250_usb3_uniphy_cfg,
3912*4882a593Smuzhiyun },
3913*4882a593Smuzhiyun { },
3914*4882a593Smuzhiyun };
3915*4882a593Smuzhiyun MODULE_DEVICE_TABLE(of, qcom_qmp_phy_of_match_table);
3916*4882a593Smuzhiyun
3917*4882a593Smuzhiyun static const struct of_device_id qcom_qmp_combo_phy_of_match_table[] = {
3918*4882a593Smuzhiyun {
3919*4882a593Smuzhiyun .compatible = "qcom,sc7180-qmp-usb3-dp-phy",
3920*4882a593Smuzhiyun .data = &sc7180_usb3dpphy_cfg,
3921*4882a593Smuzhiyun },
3922*4882a593Smuzhiyun { }
3923*4882a593Smuzhiyun };
3924*4882a593Smuzhiyun
3925*4882a593Smuzhiyun static const struct dev_pm_ops qcom_qmp_phy_pm_ops = {
3926*4882a593Smuzhiyun SET_RUNTIME_PM_OPS(qcom_qmp_phy_runtime_suspend,
3927*4882a593Smuzhiyun qcom_qmp_phy_runtime_resume, NULL)
3928*4882a593Smuzhiyun };
3929*4882a593Smuzhiyun
qcom_qmp_phy_probe(struct platform_device * pdev)3930*4882a593Smuzhiyun static int qcom_qmp_phy_probe(struct platform_device *pdev)
3931*4882a593Smuzhiyun {
3932*4882a593Smuzhiyun struct qcom_qmp *qmp;
3933*4882a593Smuzhiyun struct device *dev = &pdev->dev;
3934*4882a593Smuzhiyun struct device_node *child;
3935*4882a593Smuzhiyun struct phy_provider *phy_provider;
3936*4882a593Smuzhiyun void __iomem *serdes;
3937*4882a593Smuzhiyun void __iomem *usb_serdes;
3938*4882a593Smuzhiyun void __iomem *dp_serdes = NULL;
3939*4882a593Smuzhiyun const struct qmp_phy_combo_cfg *combo_cfg = NULL;
3940*4882a593Smuzhiyun const struct qmp_phy_cfg *cfg = NULL;
3941*4882a593Smuzhiyun const struct qmp_phy_cfg *usb_cfg = NULL;
3942*4882a593Smuzhiyun const struct qmp_phy_cfg *dp_cfg = NULL;
3943*4882a593Smuzhiyun int num, id, expected_phys;
3944*4882a593Smuzhiyun int ret;
3945*4882a593Smuzhiyun
3946*4882a593Smuzhiyun qmp = devm_kzalloc(dev, sizeof(*qmp), GFP_KERNEL);
3947*4882a593Smuzhiyun if (!qmp)
3948*4882a593Smuzhiyun return -ENOMEM;
3949*4882a593Smuzhiyun
3950*4882a593Smuzhiyun qmp->dev = dev;
3951*4882a593Smuzhiyun dev_set_drvdata(dev, qmp);
3952*4882a593Smuzhiyun
3953*4882a593Smuzhiyun /* Get the specific init parameters of QMP phy */
3954*4882a593Smuzhiyun cfg = of_device_get_match_data(dev);
3955*4882a593Smuzhiyun if (!cfg) {
3956*4882a593Smuzhiyun const struct of_device_id *match;
3957*4882a593Smuzhiyun
3958*4882a593Smuzhiyun match = of_match_device(qcom_qmp_combo_phy_of_match_table, dev);
3959*4882a593Smuzhiyun if (!match)
3960*4882a593Smuzhiyun return -EINVAL;
3961*4882a593Smuzhiyun
3962*4882a593Smuzhiyun combo_cfg = match->data;
3963*4882a593Smuzhiyun if (!combo_cfg)
3964*4882a593Smuzhiyun return -EINVAL;
3965*4882a593Smuzhiyun
3966*4882a593Smuzhiyun usb_cfg = combo_cfg->usb_cfg;
3967*4882a593Smuzhiyun cfg = usb_cfg; /* Setup clks and regulators */
3968*4882a593Smuzhiyun }
3969*4882a593Smuzhiyun
3970*4882a593Smuzhiyun /* per PHY serdes; usually located at base address */
3971*4882a593Smuzhiyun usb_serdes = serdes = devm_platform_ioremap_resource(pdev, 0);
3972*4882a593Smuzhiyun if (IS_ERR(serdes))
3973*4882a593Smuzhiyun return PTR_ERR(serdes);
3974*4882a593Smuzhiyun
3975*4882a593Smuzhiyun /* per PHY dp_com; if PHY has dp_com control block */
3976*4882a593Smuzhiyun if (combo_cfg || cfg->has_phy_dp_com_ctrl) {
3977*4882a593Smuzhiyun qmp->dp_com = devm_platform_ioremap_resource(pdev, 1);
3978*4882a593Smuzhiyun if (IS_ERR(qmp->dp_com))
3979*4882a593Smuzhiyun return PTR_ERR(qmp->dp_com);
3980*4882a593Smuzhiyun }
3981*4882a593Smuzhiyun
3982*4882a593Smuzhiyun if (combo_cfg) {
3983*4882a593Smuzhiyun /* Only two serdes for combo PHY */
3984*4882a593Smuzhiyun dp_serdes = devm_platform_ioremap_resource(pdev, 2);
3985*4882a593Smuzhiyun if (IS_ERR(dp_serdes))
3986*4882a593Smuzhiyun return PTR_ERR(dp_serdes);
3987*4882a593Smuzhiyun
3988*4882a593Smuzhiyun dp_cfg = combo_cfg->dp_cfg;
3989*4882a593Smuzhiyun expected_phys = 2;
3990*4882a593Smuzhiyun } else {
3991*4882a593Smuzhiyun expected_phys = cfg->nlanes;
3992*4882a593Smuzhiyun }
3993*4882a593Smuzhiyun
3994*4882a593Smuzhiyun mutex_init(&qmp->phy_mutex);
3995*4882a593Smuzhiyun
3996*4882a593Smuzhiyun ret = qcom_qmp_phy_clk_init(dev, cfg);
3997*4882a593Smuzhiyun if (ret)
3998*4882a593Smuzhiyun return ret;
3999*4882a593Smuzhiyun
4000*4882a593Smuzhiyun ret = qcom_qmp_phy_reset_init(dev, cfg);
4001*4882a593Smuzhiyun if (ret)
4002*4882a593Smuzhiyun return ret;
4003*4882a593Smuzhiyun
4004*4882a593Smuzhiyun ret = qcom_qmp_phy_vreg_init(dev, cfg);
4005*4882a593Smuzhiyun if (ret) {
4006*4882a593Smuzhiyun if (ret != -EPROBE_DEFER)
4007*4882a593Smuzhiyun dev_err(dev, "failed to get regulator supplies: %d\n",
4008*4882a593Smuzhiyun ret);
4009*4882a593Smuzhiyun return ret;
4010*4882a593Smuzhiyun }
4011*4882a593Smuzhiyun
4012*4882a593Smuzhiyun num = of_get_available_child_count(dev->of_node);
4013*4882a593Smuzhiyun /* do we have a rogue child node ? */
4014*4882a593Smuzhiyun if (num > expected_phys)
4015*4882a593Smuzhiyun return -EINVAL;
4016*4882a593Smuzhiyun
4017*4882a593Smuzhiyun qmp->phys = devm_kcalloc(dev, num, sizeof(*qmp->phys), GFP_KERNEL);
4018*4882a593Smuzhiyun if (!qmp->phys)
4019*4882a593Smuzhiyun return -ENOMEM;
4020*4882a593Smuzhiyun
4021*4882a593Smuzhiyun pm_runtime_set_active(dev);
4022*4882a593Smuzhiyun pm_runtime_enable(dev);
4023*4882a593Smuzhiyun /*
4024*4882a593Smuzhiyun * Prevent runtime pm from being ON by default. Users can enable
4025*4882a593Smuzhiyun * it using power/control in sysfs.
4026*4882a593Smuzhiyun */
4027*4882a593Smuzhiyun pm_runtime_forbid(dev);
4028*4882a593Smuzhiyun
4029*4882a593Smuzhiyun id = 0;
4030*4882a593Smuzhiyun for_each_available_child_of_node(dev->of_node, child) {
4031*4882a593Smuzhiyun if (of_node_name_eq(child, "dp-phy")) {
4032*4882a593Smuzhiyun cfg = dp_cfg;
4033*4882a593Smuzhiyun serdes = dp_serdes;
4034*4882a593Smuzhiyun } else if (of_node_name_eq(child, "usb3-phy")) {
4035*4882a593Smuzhiyun cfg = usb_cfg;
4036*4882a593Smuzhiyun serdes = usb_serdes;
4037*4882a593Smuzhiyun }
4038*4882a593Smuzhiyun
4039*4882a593Smuzhiyun /* Create per-lane phy */
4040*4882a593Smuzhiyun ret = qcom_qmp_phy_create(dev, child, id, serdes, cfg);
4041*4882a593Smuzhiyun if (ret) {
4042*4882a593Smuzhiyun dev_err(dev, "failed to create lane%d phy, %d\n",
4043*4882a593Smuzhiyun id, ret);
4044*4882a593Smuzhiyun goto err_node_put;
4045*4882a593Smuzhiyun }
4046*4882a593Smuzhiyun
4047*4882a593Smuzhiyun /*
4048*4882a593Smuzhiyun * Register the pipe clock provided by phy.
4049*4882a593Smuzhiyun * See function description to see details of this pipe clock.
4050*4882a593Smuzhiyun */
4051*4882a593Smuzhiyun if (cfg->type == PHY_TYPE_USB3 || cfg->type == PHY_TYPE_PCIE) {
4052*4882a593Smuzhiyun ret = phy_pipe_clk_register(qmp, child);
4053*4882a593Smuzhiyun if (ret) {
4054*4882a593Smuzhiyun dev_err(qmp->dev,
4055*4882a593Smuzhiyun "failed to register pipe clock source\n");
4056*4882a593Smuzhiyun goto err_node_put;
4057*4882a593Smuzhiyun }
4058*4882a593Smuzhiyun } else if (cfg->type == PHY_TYPE_DP) {
4059*4882a593Smuzhiyun ret = phy_dp_clks_register(qmp, qmp->phys[id], child);
4060*4882a593Smuzhiyun if (ret) {
4061*4882a593Smuzhiyun dev_err(qmp->dev,
4062*4882a593Smuzhiyun "failed to register DP clock source\n");
4063*4882a593Smuzhiyun goto err_node_put;
4064*4882a593Smuzhiyun }
4065*4882a593Smuzhiyun }
4066*4882a593Smuzhiyun id++;
4067*4882a593Smuzhiyun }
4068*4882a593Smuzhiyun
4069*4882a593Smuzhiyun phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate);
4070*4882a593Smuzhiyun if (!IS_ERR(phy_provider))
4071*4882a593Smuzhiyun dev_info(dev, "Registered Qcom-QMP phy\n");
4072*4882a593Smuzhiyun else
4073*4882a593Smuzhiyun pm_runtime_disable(dev);
4074*4882a593Smuzhiyun
4075*4882a593Smuzhiyun return PTR_ERR_OR_ZERO(phy_provider);
4076*4882a593Smuzhiyun
4077*4882a593Smuzhiyun err_node_put:
4078*4882a593Smuzhiyun pm_runtime_disable(dev);
4079*4882a593Smuzhiyun of_node_put(child);
4080*4882a593Smuzhiyun return ret;
4081*4882a593Smuzhiyun }
4082*4882a593Smuzhiyun
4083*4882a593Smuzhiyun static struct platform_driver qcom_qmp_phy_driver = {
4084*4882a593Smuzhiyun .probe = qcom_qmp_phy_probe,
4085*4882a593Smuzhiyun .driver = {
4086*4882a593Smuzhiyun .name = "qcom-qmp-phy",
4087*4882a593Smuzhiyun .pm = &qcom_qmp_phy_pm_ops,
4088*4882a593Smuzhiyun .of_match_table = qcom_qmp_phy_of_match_table,
4089*4882a593Smuzhiyun },
4090*4882a593Smuzhiyun };
4091*4882a593Smuzhiyun
4092*4882a593Smuzhiyun module_platform_driver(qcom_qmp_phy_driver);
4093*4882a593Smuzhiyun
4094*4882a593Smuzhiyun MODULE_AUTHOR("Vivek Gautam <vivek.gautam@codeaurora.org>");
4095*4882a593Smuzhiyun MODULE_DESCRIPTION("Qualcomm QMP PHY driver");
4096*4882a593Smuzhiyun MODULE_LICENSE("GPL v2");
4097