xref: /OK3568_Linux_fs/u-boot/drivers/phy/phy-rockchip-samsung-hdptx.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Rockchip HDMI/DP Combo PHY with Samsung IP block
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright (c) 2021 Rockchip Electronics Co. Ltd.
6*4882a593Smuzhiyun  */
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun #include <common.h>
9*4882a593Smuzhiyun #include <dm.h>
10*4882a593Smuzhiyun #include <generic-phy.h>
11*4882a593Smuzhiyun #include <reset.h>
12*4882a593Smuzhiyun #include <regmap.h>
13*4882a593Smuzhiyun #include <syscon.h>
14*4882a593Smuzhiyun #include <asm/io.h>
15*4882a593Smuzhiyun #include <linux/bitfield.h>
16*4882a593Smuzhiyun #include <linux/iopoll.h>
17*4882a593Smuzhiyun #include <asm/arch/clock.h>
18*4882a593Smuzhiyun 
19*4882a593Smuzhiyun #define HDPTXPHY_GRF_CON0			0x0000
20*4882a593Smuzhiyun #define RO_REF_CLK_SEL				GENMASK(11, 10)
21*4882a593Smuzhiyun #define LC_REF_CLK_SEL				GENMASK(9, 8)
22*4882a593Smuzhiyun #define PLL_EN					BIT(7)
23*4882a593Smuzhiyun #define BIAS_EN					BIT(6)
24*4882a593Smuzhiyun #define BGR_EN					BIT(5)
25*4882a593Smuzhiyun #define HDPTX_MODE_SEL				BIT(0)
26*4882a593Smuzhiyun #define HDPTXPHY_GRF_STATUS0			0x0080
27*4882a593Smuzhiyun #define PLL_LOCK_DONE				BIT(3)
28*4882a593Smuzhiyun #define PHY_CLK_RDY				BIT(2)
29*4882a593Smuzhiyun #define PHY_RDY					BIT(1)
30*4882a593Smuzhiyun #define SB_RDY					BIT(0)
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun /* cmn_reg0008 */
33*4882a593Smuzhiyun #define OVRD_LCPLL_EN				BIT(7)
34*4882a593Smuzhiyun #define LCPLL_EN				BIT(6)
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun /* cmn_reg003C */
37*4882a593Smuzhiyun #define ANA_LCPLL_RESERVED7			BIT(7)
38*4882a593Smuzhiyun 
39*4882a593Smuzhiyun /* cmn_reg003D */
40*4882a593Smuzhiyun #define OVRD_ROPLL_EN				BIT(7)
41*4882a593Smuzhiyun #define ROPLL_EN				BIT(6)
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun /* cmn_reg0046 */
44*4882a593Smuzhiyun #define ROPLL_ANA_CPP_CTRL_COARSE		GENMASK(7, 4)
45*4882a593Smuzhiyun #define ROPLL_ANA_CPP_CTRL_FINE			GENMASK(3, 0)
46*4882a593Smuzhiyun 
47*4882a593Smuzhiyun /* cmn_reg0047 */
48*4882a593Smuzhiyun #define ROPLL_ANA_LPF_C_SEL_COARSE		GENMASK(5, 3)
49*4882a593Smuzhiyun #define ROPLL_ANA_LPF_C_SEL_FINE		GENMASK(2, 0)
50*4882a593Smuzhiyun 
51*4882a593Smuzhiyun /* cmn_reg004E */
52*4882a593Smuzhiyun #define ANA_ROPLL_PI_EN				BIT(5)
53*4882a593Smuzhiyun 
54*4882a593Smuzhiyun /* cmn_reg0051 */
55*4882a593Smuzhiyun #define ROPLL_PMS_MDIV				GENMASK(7, 0)
56*4882a593Smuzhiyun 
57*4882a593Smuzhiyun /* cmn_reg0055 */
58*4882a593Smuzhiyun #define ROPLL_PMS_MDIV_AFC			GENMASK(7, 0)
59*4882a593Smuzhiyun 
60*4882a593Smuzhiyun /* cmn_reg0059 */
61*4882a593Smuzhiyun #define ANA_ROPLL_PMS_PDIV			GENMASK(7, 4)
62*4882a593Smuzhiyun #define ANA_ROPLL_PMS_REFDIV			GENMASK(3, 0)
63*4882a593Smuzhiyun 
64*4882a593Smuzhiyun /* cmn_reg005A */
65*4882a593Smuzhiyun #define ROPLL_PMS_SDIV_RBR			GENMASK(7, 4)
66*4882a593Smuzhiyun #define ROPLL_PMS_SDIV_HBR			GENMASK(3, 0)
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun /* cmn_reg005B */
69*4882a593Smuzhiyun #define ROPLL_PMS_SDIV_HBR2			GENMASK(7, 4)
70*4882a593Smuzhiyun #define ROPLL_PMS_SDIV_HBR3			GENMASK(3, 0)
71*4882a593Smuzhiyun 
72*4882a593Smuzhiyun /* cmn_reg005D */
73*4882a593Smuzhiyun #define OVRD_ROPLL_REF_CLK_SEL			BIT(5)
74*4882a593Smuzhiyun #define ROPLL_REF_CLK_SEL			GENMASK(4, 3)
75*4882a593Smuzhiyun 
76*4882a593Smuzhiyun /* cmn_reg005E */
77*4882a593Smuzhiyun #define ANA_ROPLL_SDM_EN			BIT(6)
78*4882a593Smuzhiyun #define OVRD_ROPLL_SDM_RSTN			BIT(5)
79*4882a593Smuzhiyun #define ROPLL_SDM_RSTN				BIT(4)
80*4882a593Smuzhiyun #define ROPLL_SDC_FRACTIONAL_EN_RBR		BIT(3)
81*4882a593Smuzhiyun #define ROPLL_SDC_FRACTIONAL_EN_HBR		BIT(2)
82*4882a593Smuzhiyun #define ROPLL_SDC_FRACTIONAL_EN_HBR2		BIT(1)
83*4882a593Smuzhiyun #define ROPLL_SDC_FRACTIONAL_EN_HBR3		BIT(0)
84*4882a593Smuzhiyun 
85*4882a593Smuzhiyun /* cmn_reg005F */
86*4882a593Smuzhiyun #define OVRD_ROPLL_SDC_RSTN			BIT(5)
87*4882a593Smuzhiyun #define ROPLL_SDC_RSTN				BIT(4)
88*4882a593Smuzhiyun 
89*4882a593Smuzhiyun /* cmn_reg0060 */
90*4882a593Smuzhiyun #define ROPLL_SDM_DENOMINATOR			GENMASK(7, 0)
91*4882a593Smuzhiyun 
92*4882a593Smuzhiyun /* cmn_reg0064 */
93*4882a593Smuzhiyun #define ROPLL_SDM_NUMERATOR_SIGN_RBR		BIT(3)
94*4882a593Smuzhiyun #define ROPLL_SDM_NUMERATOR_SIGN_HBR		BIT(2)
95*4882a593Smuzhiyun #define ROPLL_SDM_NUMERATOR_SIGN_HBR2		BIT(1)
96*4882a593Smuzhiyun #define ROPLL_SDM_NUMERATOR_SIGN_HBR3		BIT(0)
97*4882a593Smuzhiyun 
98*4882a593Smuzhiyun /* cmn_reg0065 */
99*4882a593Smuzhiyun #define ROPLL_SDM_NUMERATOR			GENMASK(7, 0)
100*4882a593Smuzhiyun 
101*4882a593Smuzhiyun /* cmn_reg0069 */
102*4882a593Smuzhiyun #define ROPLL_SDC_N_RBR				GENMASK(2, 0)
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun /* cmn_reg006A */
105*4882a593Smuzhiyun #define ROPLL_SDC_N_HBR				GENMASK(5, 3)
106*4882a593Smuzhiyun #define ROPLL_SDC_N_HBR2			GENMASK(2, 0)
107*4882a593Smuzhiyun 
108*4882a593Smuzhiyun /* cmn_reg006B */
109*4882a593Smuzhiyun #define ROPLL_SDC_N_HBR3			GENMASK(3, 1)
110*4882a593Smuzhiyun 
111*4882a593Smuzhiyun /* cmn_reg006C */
112*4882a593Smuzhiyun #define ROPLL_SDC_NUMERATOR			GENMASK(5, 0)
113*4882a593Smuzhiyun 
114*4882a593Smuzhiyun /* cmn_reg0070 */
115*4882a593Smuzhiyun #define ROPLL_SDC_DENOMINATOR			GENMASK(5, 0)
116*4882a593Smuzhiyun 
117*4882a593Smuzhiyun /* cmn_reg0074 */
118*4882a593Smuzhiyun #define OVRD_ROPLL_SDC_NDIV_RSTN		BIT(3)
119*4882a593Smuzhiyun #define ROPLL_SDC_NDIV_RSTN			BIT(2)
120*4882a593Smuzhiyun #define OVRD_ROPLL_SSC_EN			BIT(1)
121*4882a593Smuzhiyun #define ROPLL_SSC_EN				BIT(0)
122*4882a593Smuzhiyun 
123*4882a593Smuzhiyun /* cmn_reg0075 */
124*4882a593Smuzhiyun #define ANA_ROPLL_SSC_FM_DEVIATION		GENMASK(5, 0)
125*4882a593Smuzhiyun 
126*4882a593Smuzhiyun /* cmn_reg0076 */
127*4882a593Smuzhiyun #define ANA_ROPLL_SSC_FM_FREQ			GENMASK(6, 2)
128*4882a593Smuzhiyun 
129*4882a593Smuzhiyun /* cmn_reg0077 */
130*4882a593Smuzhiyun #define ANA_ROPLL_SSC_CLK_DIV_SEL		GENMASK(6, 3)
131*4882a593Smuzhiyun 
132*4882a593Smuzhiyun /* cmn_reg0081 */
133*4882a593Smuzhiyun #define ANA_PLL_CD_TX_SER_RATE_SEL		BIT(3)
134*4882a593Smuzhiyun #define ANA_PLL_CD_HSCLK_WEST_EN		BIT(1)
135*4882a593Smuzhiyun #define ANA_PLL_CD_HSCLK_EAST_EN		BIT(0)
136*4882a593Smuzhiyun 
137*4882a593Smuzhiyun /* cmn_reg0082 */
138*4882a593Smuzhiyun #define ANA_PLL_CD_VREG_GAIN_CTRL		GENMASK(3, 0)
139*4882a593Smuzhiyun 
140*4882a593Smuzhiyun /* cmn_reg0083 */
141*4882a593Smuzhiyun #define ANA_PLL_CD_VREG_ICTRL			GENMASK(6, 5)
142*4882a593Smuzhiyun 
143*4882a593Smuzhiyun /* cmn_reg0084 */
144*4882a593Smuzhiyun #define PLL_LCRO_CLK_SEL			BIT(5)
145*4882a593Smuzhiyun 
146*4882a593Smuzhiyun /* cmn_reg0085 */
147*4882a593Smuzhiyun #define ANA_PLL_SYNC_LOSS_DET_MODE		GENMASK(1, 0)
148*4882a593Smuzhiyun 
149*4882a593Smuzhiyun /* cmn_reg0087 */
150*4882a593Smuzhiyun #define ANA_PLL_TX_HS_CLK_EN			BIT(2)
151*4882a593Smuzhiyun 
152*4882a593Smuzhiyun /* cmn_reg0095 */
153*4882a593Smuzhiyun #define DP_TX_LINK_BW				GENMASK(1, 0)
154*4882a593Smuzhiyun 
155*4882a593Smuzhiyun /* cmn_reg0097 */
156*4882a593Smuzhiyun #define DIG_CLK_SEL				BIT(1)
157*4882a593Smuzhiyun 
158*4882a593Smuzhiyun /* cmn_reg0099 */
159*4882a593Smuzhiyun #define SSC_EN					GENMASK(7, 6)
160*4882a593Smuzhiyun #define CMN_ROPLL_ALONE_MODE			BIT(2)
161*4882a593Smuzhiyun 
162*4882a593Smuzhiyun /* cmn_reg009A */
163*4882a593Smuzhiyun #define HS_SPEED_SEL				BIT(0)
164*4882a593Smuzhiyun 
165*4882a593Smuzhiyun /* cmn_reg009B */
166*4882a593Smuzhiyun #define LS_SPEED_SEL				BIT(4)
167*4882a593Smuzhiyun 
168*4882a593Smuzhiyun /* sb_reg0102 */
169*4882a593Smuzhiyun #define OVRD_SB_RXTERM_EN			BIT(5)
170*4882a593Smuzhiyun #define SB_RXRERM_EN				BIT(4)
171*4882a593Smuzhiyun #define ANA_SB_RXTERM_OFFSP			GENMASK(3, 0)
172*4882a593Smuzhiyun 
173*4882a593Smuzhiyun /* sb_reg0103 */
174*4882a593Smuzhiyun #define ANA_SB_RXTERM_OFFSN			GENMASK(6, 3)
175*4882a593Smuzhiyun #define OVRD_SB_RX_RESCAL_DONE			BIT(1)
176*4882a593Smuzhiyun #define SB_RX_RESCAL_DONE			BIT(0)
177*4882a593Smuzhiyun 
178*4882a593Smuzhiyun /* sb_reg0104 */
179*4882a593Smuzhiyun #define OVRD_SB_EN				BIT(5)
180*4882a593Smuzhiyun #define SB_EN					BIT(4)
181*4882a593Smuzhiyun #define OVRD_SB_AUX_EN				BIT(1)
182*4882a593Smuzhiyun #define SB_AUX_EN				BIT(0)
183*4882a593Smuzhiyun 
184*4882a593Smuzhiyun /* sb_reg0105 */
185*4882a593Smuzhiyun #define ANA_SB_TX_HLVL_PROG			GENMASK(2, 0)
186*4882a593Smuzhiyun 
187*4882a593Smuzhiyun /* sb_reg0106 */
188*4882a593Smuzhiyun #define ANA_SB_TX_LLVL_PROG			GENMASK(6, 4)
189*4882a593Smuzhiyun 
190*4882a593Smuzhiyun /* sb_reg010D */
191*4882a593Smuzhiyun #define ANA_SB_DMRX_LPBK_DATA			BIT(4)
192*4882a593Smuzhiyun 
193*4882a593Smuzhiyun /* sb_reg010F */
194*4882a593Smuzhiyun #define OVRD_SB_VREG_EN				BIT(7)
195*4882a593Smuzhiyun #define SB_VREG_EN				BIT(6)
196*4882a593Smuzhiyun #define ANA_SB_VREG_GAIN_CTRL			GENMASK(3, 0)
197*4882a593Smuzhiyun 
198*4882a593Smuzhiyun /* sb_reg0110 */
199*4882a593Smuzhiyun #define ANA_SB_VREG_OUT_SEL			BIT(1)
200*4882a593Smuzhiyun #define ANA_SB_VREG_REF_SEL			BIT(0)
201*4882a593Smuzhiyun 
202*4882a593Smuzhiyun /* sb_reg0113 */
203*4882a593Smuzhiyun #define SB_RX_RCAL_OPT_CODE			GENMASK(5, 4)
204*4882a593Smuzhiyun #define SB_RX_RTERM_CTRL			GENMASK(3, 0)
205*4882a593Smuzhiyun 
206*4882a593Smuzhiyun /* sb_reg0114 */
207*4882a593Smuzhiyun #define SB_TG_SB_EN_DELAY_TIME			GENMASK(5, 3)
208*4882a593Smuzhiyun #define SB_TG_RXTERN_EN_DELAY_TIME		GENMASK(2, 0)
209*4882a593Smuzhiyun 
210*4882a593Smuzhiyun /* sb_reg0115 */
211*4882a593Smuzhiyun #define SB_READY_DELAY_TIME			GENMASK(5, 3)
212*4882a593Smuzhiyun #define SB_TG_OSC_EN_DELAY_TIME			GENMASK(2, 0)
213*4882a593Smuzhiyun 
214*4882a593Smuzhiyun /* sb_reg0116 */
215*4882a593Smuzhiyun #define SB_TG_OSC_EN_TO_AFC_RSTN_DELAT_TIME	GENMASK(6, 4)
216*4882a593Smuzhiyun 
217*4882a593Smuzhiyun /* sb_reg0117 */
218*4882a593Smuzhiyun #define SB_TG_PLL_CD_VREG_FAST_PULSE_TIME	GENMASK(3, 0)
219*4882a593Smuzhiyun 
220*4882a593Smuzhiyun /* sb_reg0118 */
221*4882a593Smuzhiyun #define SB_TG_EARC_DMRX_RECVRD_CLK_CNT		GENMASK(7, 0)
222*4882a593Smuzhiyun 
223*4882a593Smuzhiyun /* sb_reg011A */
224*4882a593Smuzhiyun #define SB_TG_CNT_RUN_NO_7_0			GENMASK(7, 0)
225*4882a593Smuzhiyun 
226*4882a593Smuzhiyun /* sb_reg011B */
227*4882a593Smuzhiyun #define SB_EARC_SIG_DET_BYPASS			BIT(4)
228*4882a593Smuzhiyun #define SB_AFC_TOL				GENMASK(3, 0)
229*4882a593Smuzhiyun 
230*4882a593Smuzhiyun /* sb_reg011C */
231*4882a593Smuzhiyun #define SB_AFC_STB_NUM				GENMASK(3, 0)
232*4882a593Smuzhiyun 
233*4882a593Smuzhiyun /* sb_reg011D */
234*4882a593Smuzhiyun #define SB_TG_OSC_CNT_MIN			GENMASK(7, 0)
235*4882a593Smuzhiyun 
236*4882a593Smuzhiyun /* sb_reg011E */
237*4882a593Smuzhiyun #define SB_TG_OSC_CNT_MAX			GENMASK(7, 0)
238*4882a593Smuzhiyun 
239*4882a593Smuzhiyun /* sb_reg011F */
240*4882a593Smuzhiyun #define SB_PWM_AFC_CTRL				GENMASK(7, 2)
241*4882a593Smuzhiyun #define SB_RCAL_RSTN				BIT(1)
242*4882a593Smuzhiyun 
243*4882a593Smuzhiyun /* sb_reg0120 */
244*4882a593Smuzhiyun #define SB_AUX_EN_IN				BIT(7)
245*4882a593Smuzhiyun 
246*4882a593Smuzhiyun /* sb_reg0123 */
247*4882a593Smuzhiyun #define OVRD_SB_READY				BIT(5)
248*4882a593Smuzhiyun #define SB_READY				BIT(4)
249*4882a593Smuzhiyun 
250*4882a593Smuzhiyun /* lntop_reg0200 */
251*4882a593Smuzhiyun #define PROTOCOL_SEL				BIT(2)
252*4882a593Smuzhiyun 
253*4882a593Smuzhiyun /* lntop_reg0206 */
254*4882a593Smuzhiyun #define DATA_BUS_WIDTH				GENMASK(2, 1)
255*4882a593Smuzhiyun #define BUS_WIDTH_SEL				BIT(0)
256*4882a593Smuzhiyun 
257*4882a593Smuzhiyun /* lntop_reg0207 */
258*4882a593Smuzhiyun #define LANE_EN					GENMASK(3, 0)
259*4882a593Smuzhiyun 
260*4882a593Smuzhiyun /* lane_reg0301 */
261*4882a593Smuzhiyun #define OVRD_LN_TX_DRV_EI_EN			BIT(7)
262*4882a593Smuzhiyun #define LN_TX_DRV_EI_EN				BIT(6)
263*4882a593Smuzhiyun 
264*4882a593Smuzhiyun /* lane_reg0303 */
265*4882a593Smuzhiyun #define OVRD_LN_TX_DRV_LVL_CTRL			BIT(5)
266*4882a593Smuzhiyun #define LN_TX_DRV_LVL_CTRL			GENMASK(4, 0)
267*4882a593Smuzhiyun 
268*4882a593Smuzhiyun /* lane_reg0304 */
269*4882a593Smuzhiyun #define OVRD_LN_TX_DRV_POST_LVL_CTRL		BIT(4)
270*4882a593Smuzhiyun #define LN_TX_DRV_POST_LVL_CTRL			GENMASK(3, 0)
271*4882a593Smuzhiyun 
272*4882a593Smuzhiyun /* lane_reg0305 */
273*4882a593Smuzhiyun #define OVRD_LN_TX_DRV_PRE_LVL_CTRL		BIT(6)
274*4882a593Smuzhiyun #define LN_TX_DRV_PRE_LVL_CTRL			GENMASK(5, 2)
275*4882a593Smuzhiyun 
276*4882a593Smuzhiyun /* lane_reg0306 */
277*4882a593Smuzhiyun #define LN_ANA_TX_DRV_IDRV_IDN_CTRL		GENMASK(7, 5)
278*4882a593Smuzhiyun #define LN_ANA_TX_DRV_IDRV_IUP_CTRL		GENMASK(4, 2)
279*4882a593Smuzhiyun #define LN_ANA_TX_DRV_ACCDRV_EN			BIT(0)
280*4882a593Smuzhiyun 
281*4882a593Smuzhiyun /* lane_reg0307 */
282*4882a593Smuzhiyun #define LN_ANA_TX_DRV_ACCDRV_POL_SEL		BIT(6)
283*4882a593Smuzhiyun #define LN_ANA_TX_DRV_ACCDRV_CTRL		GENMASK(5, 3)
284*4882a593Smuzhiyun 
285*4882a593Smuzhiyun /* lane_reg030A */
286*4882a593Smuzhiyun #define LN_ANA_TX_JEQ_EN			BIT(4)
287*4882a593Smuzhiyun #define LN_TX_JEQ_EVEN_CTRL_RBR			GENMASK(3, 0)
288*4882a593Smuzhiyun 
289*4882a593Smuzhiyun /* lane_reg030B */
290*4882a593Smuzhiyun #define LN_TX_JEQ_EVEN_CTRL_HBR			GENMASK(7, 4)
291*4882a593Smuzhiyun #define LN_TX_JEQ_EVEN_CTRL_HBR2		GENMASK(3, 0)
292*4882a593Smuzhiyun 
293*4882a593Smuzhiyun /* lane_reg030C */
294*4882a593Smuzhiyun #define LN_TX_JEQ_EVEN_CTRL_HBR3		GENMASK(7, 4)
295*4882a593Smuzhiyun #define LN_TX_JEQ_ODD_CTRL_RBR			GENMASK(3, 0)
296*4882a593Smuzhiyun 
297*4882a593Smuzhiyun /* lane_reg030D */
298*4882a593Smuzhiyun #define LN_TX_JEQ_ODD_CTRL_HBR			GENMASK(7, 4)
299*4882a593Smuzhiyun #define LN_TX_JEQ_ODD_CTRL_HBR2			GENMASK(3, 0)
300*4882a593Smuzhiyun 
301*4882a593Smuzhiyun /* lane_reg030E */
302*4882a593Smuzhiyun #define LN_TX_JEQ_ODD_CTRL_HBR3			GENMASK(7, 4)
303*4882a593Smuzhiyun 
304*4882a593Smuzhiyun /* lane_reg0310 */
305*4882a593Smuzhiyun #define LN_ANA_TX_SYNC_LOSS_DET_MODE		GENMASK(1, 0)
306*4882a593Smuzhiyun 
307*4882a593Smuzhiyun /* lane_reg0311 */
308*4882a593Smuzhiyun #define LN_TX_SER_40BIT_EN_RBR			BIT(3)
309*4882a593Smuzhiyun #define LN_TX_SER_40BIT_EN_HBR			BIT(2)
310*4882a593Smuzhiyun #define LN_TX_SER_40BIT_EN_HBR2			BIT(1)
311*4882a593Smuzhiyun #define LN_TX_SER_40BIT_EN_HBR3			BIT(0)
312*4882a593Smuzhiyun 
313*4882a593Smuzhiyun /* lane_reg0316 */
314*4882a593Smuzhiyun #define LN_ANA_TX_SER_VREG_GAIN_CTRL		GENMASK(3, 0)
315*4882a593Smuzhiyun 
316*4882a593Smuzhiyun /* lane_reg031B */
317*4882a593Smuzhiyun #define LN_ANA_TX_RESERVED			GENMASK(7, 0)
318*4882a593Smuzhiyun 
319*4882a593Smuzhiyun /* lane_reg031E */
320*4882a593Smuzhiyun #define LN_POLARITY_INV				BIT(2)
321*4882a593Smuzhiyun 
322*4882a593Smuzhiyun #define LANE_REG(lane, offset)			(0x400 * (lane) + (offset))
323*4882a593Smuzhiyun 
324*4882a593Smuzhiyun struct rockchip_hdptx_phy {
325*4882a593Smuzhiyun 	struct udevice *dev;
326*4882a593Smuzhiyun 	struct regmap *regmap;
327*4882a593Smuzhiyun 	struct regmap *grf;
328*4882a593Smuzhiyun 
329*4882a593Smuzhiyun 	struct reset_ctl apb_reset;
330*4882a593Smuzhiyun 	struct reset_ctl cmn_reset;
331*4882a593Smuzhiyun 	struct reset_ctl init_reset;
332*4882a593Smuzhiyun 	struct reset_ctl lane_reset;
333*4882a593Smuzhiyun 	u32 lane_polarity_invert[4];
334*4882a593Smuzhiyun };
335*4882a593Smuzhiyun 
336*4882a593Smuzhiyun enum {
337*4882a593Smuzhiyun 	DP_BW_RBR,
338*4882a593Smuzhiyun 	DP_BW_HBR,
339*4882a593Smuzhiyun 	DP_BW_HBR2,
340*4882a593Smuzhiyun 	DP_BW_HBR3,
341*4882a593Smuzhiyun };
342*4882a593Smuzhiyun 
343*4882a593Smuzhiyun struct tx_drv_ctrl {
344*4882a593Smuzhiyun 	u8 tx_drv_lvl_ctrl;
345*4882a593Smuzhiyun 	u8 tx_drv_post_lvl_ctrl;
346*4882a593Smuzhiyun 	u8 ana_tx_drv_idrv_idn_ctrl;
347*4882a593Smuzhiyun 	u8 ana_tx_drv_idrv_iup_ctrl;
348*4882a593Smuzhiyun 	u8 ana_tx_drv_accdrv_en;
349*4882a593Smuzhiyun 	u8 ana_tx_drv_accdrv_ctrl;
350*4882a593Smuzhiyun } __packed;
351*4882a593Smuzhiyun 
352*4882a593Smuzhiyun static struct tx_drv_ctrl tx_drv_ctrl_rbr[4][4] = {
353*4882a593Smuzhiyun 	/* voltage swing 0, pre-emphasis 0->3 */
354*4882a593Smuzhiyun 	{
355*4882a593Smuzhiyun 		{ 0x1, 0x0, 0x4, 0x6, 0x0, 0x4 },
356*4882a593Smuzhiyun 		{ 0x4, 0x3, 0x4, 0x6, 0x0, 0x4 },
357*4882a593Smuzhiyun 		{ 0x7, 0x6, 0x4, 0x6, 0x0, 0x4 },
358*4882a593Smuzhiyun 		{ 0xd, 0xb, 0x7, 0x7, 0x1, 0x7 },
359*4882a593Smuzhiyun 	},
360*4882a593Smuzhiyun 
361*4882a593Smuzhiyun 	/* voltage swing 1, pre-emphasis 0->2 */
362*4882a593Smuzhiyun 	{
363*4882a593Smuzhiyun 		{ 0x4, 0x0, 0x4, 0x6, 0x0, 0x4 },
364*4882a593Smuzhiyun 		{ 0xa, 0x5, 0x4, 0x6, 0x0, 0x4 },
365*4882a593Smuzhiyun 		{ 0xd, 0x8, 0x7, 0x7, 0x1, 0x7 },
366*4882a593Smuzhiyun 	},
367*4882a593Smuzhiyun 
368*4882a593Smuzhiyun 	/* voltage swing 2, pre-emphasis 0->1 */
369*4882a593Smuzhiyun 	{
370*4882a593Smuzhiyun 		{ 0x8, 0x0, 0x4, 0x6, 0x0, 0x4 },
371*4882a593Smuzhiyun 		{ 0xd, 0x5, 0x7, 0x7, 0x1, 0x7 },
372*4882a593Smuzhiyun 	},
373*4882a593Smuzhiyun 
374*4882a593Smuzhiyun 	/* voltage swing 3, pre-emphasis 0 */
375*4882a593Smuzhiyun 	{
376*4882a593Smuzhiyun 		{ 0xd, 0x0, 0x7, 0x7, 0x1, 0x4 },
377*4882a593Smuzhiyun 	}
378*4882a593Smuzhiyun };
379*4882a593Smuzhiyun 
380*4882a593Smuzhiyun static struct tx_drv_ctrl tx_drv_ctrl_hbr[4][4] = {
381*4882a593Smuzhiyun 	/* voltage swing 0, pre-emphasis 0->3 */
382*4882a593Smuzhiyun 	{
383*4882a593Smuzhiyun 		{ 0x2, 0x1, 0x4, 0x6, 0x0, 0x4 },
384*4882a593Smuzhiyun 		{ 0x5, 0x4, 0x4, 0x6, 0x0, 0x4 },
385*4882a593Smuzhiyun 		{ 0x9, 0x8, 0x4, 0x6, 0x0, 0x4 },
386*4882a593Smuzhiyun 		{ 0xd, 0xb, 0x7, 0x7, 0x1, 0x7 },
387*4882a593Smuzhiyun 	},
388*4882a593Smuzhiyun 
389*4882a593Smuzhiyun 	/* voltage swing 1, pre-emphasis 0->2 */
390*4882a593Smuzhiyun 	{
391*4882a593Smuzhiyun 		{ 0x6, 0x1, 0x4, 0x6, 0x0, 0x4 },
392*4882a593Smuzhiyun 		{ 0xb, 0x6, 0x4, 0x6, 0x0, 0x4 },
393*4882a593Smuzhiyun 		{ 0xd, 0x8, 0x7, 0x7, 0x1, 0x7 },
394*4882a593Smuzhiyun 	},
395*4882a593Smuzhiyun 
396*4882a593Smuzhiyun 	/* voltage swing 2, pre-emphasis 0->1 */
397*4882a593Smuzhiyun 	{
398*4882a593Smuzhiyun 		{ 0x9, 0x1, 0x4, 0x6, 0x0, 0x4 },
399*4882a593Smuzhiyun 		{ 0xd, 0x6, 0x7, 0x7, 0x1, 0x7 },
400*4882a593Smuzhiyun 	},
401*4882a593Smuzhiyun 
402*4882a593Smuzhiyun 	/* voltage swing 3, pre-emphasis 0 */
403*4882a593Smuzhiyun 	{
404*4882a593Smuzhiyun 		{ 0xd, 0x1, 0x7, 0x7, 0x1, 0x4 },
405*4882a593Smuzhiyun 	}
406*4882a593Smuzhiyun };
407*4882a593Smuzhiyun 
408*4882a593Smuzhiyun static struct tx_drv_ctrl tx_drv_ctrl_hbr2[4][4] = {
409*4882a593Smuzhiyun 	/* voltage swing 0, pre-emphasis 0->3 */
410*4882a593Smuzhiyun 	{
411*4882a593Smuzhiyun 		{ 0x2, 0x1, 0x4, 0x6, 0x0, 0x4 },
412*4882a593Smuzhiyun 		{ 0x5, 0x4, 0x4, 0x6, 0x0, 0x4 },
413*4882a593Smuzhiyun 		{ 0x9, 0x8, 0x4, 0x6, 0x1, 0x4 },
414*4882a593Smuzhiyun 		{ 0xd, 0xb, 0x7, 0x7, 0x1, 0x7 },
415*4882a593Smuzhiyun 	},
416*4882a593Smuzhiyun 
417*4882a593Smuzhiyun 	/* voltage swing 1, pre-emphasis 0->2 */
418*4882a593Smuzhiyun 	{
419*4882a593Smuzhiyun 		{ 0x6, 0x1, 0x4, 0x6, 0x0, 0x4 },
420*4882a593Smuzhiyun 		{ 0xc, 0x7, 0x4, 0x6, 0x0, 0x4 },
421*4882a593Smuzhiyun 		{ 0xd, 0x8, 0x7, 0x7, 0x1, 0x7 },
422*4882a593Smuzhiyun 	},
423*4882a593Smuzhiyun 
424*4882a593Smuzhiyun 	/* voltage swing 2, pre-emphasis 0->1 */
425*4882a593Smuzhiyun 	{
426*4882a593Smuzhiyun 		{ 0x9, 0x1, 0x4, 0x6, 0x0, 0x4 },
427*4882a593Smuzhiyun 		{ 0xd, 0x6, 0x7, 0x7, 0x1, 0x7 },
428*4882a593Smuzhiyun 	},
429*4882a593Smuzhiyun 
430*4882a593Smuzhiyun 	/* voltage swing 3, pre-emphasis 0 */
431*4882a593Smuzhiyun 	{
432*4882a593Smuzhiyun 		{ 0xd, 0x0, 0x7, 0x7, 0x1, 0x4 },
433*4882a593Smuzhiyun 	}
434*4882a593Smuzhiyun };
435*4882a593Smuzhiyun 
rockchip_hdptx_phy_parse_training_table(struct udevice * dev)436*4882a593Smuzhiyun static int rockchip_hdptx_phy_parse_training_table(struct udevice *dev)
437*4882a593Smuzhiyun {
438*4882a593Smuzhiyun 	int size = sizeof(struct tx_drv_ctrl) * 10;
439*4882a593Smuzhiyun 	const uint8_t *prop;
440*4882a593Smuzhiyun 	u8 *buf, *training_table;
441*4882a593Smuzhiyun 	int i, j;
442*4882a593Smuzhiyun 
443*4882a593Smuzhiyun 	prop = dev_read_u8_array_ptr(dev, "training-table", size);
444*4882a593Smuzhiyun 	if (!prop)
445*4882a593Smuzhiyun 		return 0;
446*4882a593Smuzhiyun 
447*4882a593Smuzhiyun 	buf = kzalloc(size, GFP_KERNEL);
448*4882a593Smuzhiyun 	if (!buf)
449*4882a593Smuzhiyun 		return -ENOMEM;
450*4882a593Smuzhiyun 
451*4882a593Smuzhiyun 	memcpy(buf, prop, size);
452*4882a593Smuzhiyun 
453*4882a593Smuzhiyun 	training_table = buf;
454*4882a593Smuzhiyun 
455*4882a593Smuzhiyun 	for (i = 0; i < 4; i++) {
456*4882a593Smuzhiyun 		for (j = 0; j < 4; j++) {
457*4882a593Smuzhiyun 			struct tx_drv_ctrl *ctrl;
458*4882a593Smuzhiyun 
459*4882a593Smuzhiyun 			if (i + j > 3)
460*4882a593Smuzhiyun 				continue;
461*4882a593Smuzhiyun 
462*4882a593Smuzhiyun 			ctrl = (struct tx_drv_ctrl *)training_table;
463*4882a593Smuzhiyun 			tx_drv_ctrl_rbr[i][j] = *ctrl;
464*4882a593Smuzhiyun 			tx_drv_ctrl_hbr[i][j] = *ctrl;
465*4882a593Smuzhiyun 			tx_drv_ctrl_hbr2[i][j] = *ctrl;
466*4882a593Smuzhiyun 			training_table += sizeof(*ctrl);
467*4882a593Smuzhiyun 		}
468*4882a593Smuzhiyun 	}
469*4882a593Smuzhiyun 
470*4882a593Smuzhiyun 	kfree(buf);
471*4882a593Smuzhiyun 
472*4882a593Smuzhiyun 	return 0;
473*4882a593Smuzhiyun }
474*4882a593Smuzhiyun 
rockchip_grf_write(struct regmap * grf,uint reg,uint mask,uint val)475*4882a593Smuzhiyun static inline void rockchip_grf_write(struct regmap *grf, uint reg, uint mask,
476*4882a593Smuzhiyun 				      uint val)
477*4882a593Smuzhiyun {
478*4882a593Smuzhiyun 	regmap_write(grf, reg, (mask << 16) | (val & mask));
479*4882a593Smuzhiyun }
480*4882a593Smuzhiyun 
rockchip_hdptx_phy_set_mode(struct phy * phy,enum phy_mode mode,int submode)481*4882a593Smuzhiyun static int rockchip_hdptx_phy_set_mode(struct phy *phy, enum phy_mode mode,
482*4882a593Smuzhiyun 				       int submode)
483*4882a593Smuzhiyun {
484*4882a593Smuzhiyun 	return 0;
485*4882a593Smuzhiyun }
486*4882a593Smuzhiyun 
rockchip_hdptx_phy_verify_config(struct rockchip_hdptx_phy * hdptx,struct phy_configure_opts_dp * dp)487*4882a593Smuzhiyun static int rockchip_hdptx_phy_verify_config(struct rockchip_hdptx_phy *hdptx,
488*4882a593Smuzhiyun 					    struct phy_configure_opts_dp *dp)
489*4882a593Smuzhiyun {
490*4882a593Smuzhiyun 	int i;
491*4882a593Smuzhiyun 
492*4882a593Smuzhiyun 	if (dp->set_rate) {
493*4882a593Smuzhiyun 		switch (dp->link_rate) {
494*4882a593Smuzhiyun 		case 1620:
495*4882a593Smuzhiyun 		case 2700:
496*4882a593Smuzhiyun 		case 5400:
497*4882a593Smuzhiyun 			break;
498*4882a593Smuzhiyun 		default:
499*4882a593Smuzhiyun 			return -EINVAL;
500*4882a593Smuzhiyun 		}
501*4882a593Smuzhiyun 	}
502*4882a593Smuzhiyun 
503*4882a593Smuzhiyun 	switch (dp->lanes) {
504*4882a593Smuzhiyun 	case 1:
505*4882a593Smuzhiyun 	case 2:
506*4882a593Smuzhiyun 	case 4:
507*4882a593Smuzhiyun 		break;
508*4882a593Smuzhiyun 	default:
509*4882a593Smuzhiyun 		return -EINVAL;
510*4882a593Smuzhiyun 	}
511*4882a593Smuzhiyun 
512*4882a593Smuzhiyun 	if (dp->set_voltages) {
513*4882a593Smuzhiyun 		for (i = 0; i < dp->lanes; i++) {
514*4882a593Smuzhiyun 			if (dp->voltage[i] > 3 || dp->pre[i] > 3)
515*4882a593Smuzhiyun 				return -EINVAL;
516*4882a593Smuzhiyun 
517*4882a593Smuzhiyun 			if (dp->voltage[i] + dp->pre[i] > 3)
518*4882a593Smuzhiyun 				return -EINVAL;
519*4882a593Smuzhiyun 		}
520*4882a593Smuzhiyun 	}
521*4882a593Smuzhiyun 
522*4882a593Smuzhiyun 	return 0;
523*4882a593Smuzhiyun }
524*4882a593Smuzhiyun 
rockchip_hdptx_phy_set_voltage(struct rockchip_hdptx_phy * hdptx,struct phy_configure_opts_dp * dp,u8 lane)525*4882a593Smuzhiyun static void rockchip_hdptx_phy_set_voltage(struct rockchip_hdptx_phy *hdptx,
526*4882a593Smuzhiyun 					   struct phy_configure_opts_dp *dp,
527*4882a593Smuzhiyun 					   u8 lane)
528*4882a593Smuzhiyun {
529*4882a593Smuzhiyun 	const struct tx_drv_ctrl *ctrl;
530*4882a593Smuzhiyun 
531*4882a593Smuzhiyun 	switch (dp->link_rate) {
532*4882a593Smuzhiyun 	case 1620:
533*4882a593Smuzhiyun 		ctrl = &tx_drv_ctrl_rbr[dp->voltage[lane]][dp->pre[lane]];
534*4882a593Smuzhiyun 		regmap_update_bits(hdptx->regmap, LANE_REG(lane, 0x0c44),
535*4882a593Smuzhiyun 				   LN_TX_SER_40BIT_EN_RBR,
536*4882a593Smuzhiyun 				   FIELD_PREP(LN_TX_SER_40BIT_EN_RBR, 0x1));
537*4882a593Smuzhiyun 		break;
538*4882a593Smuzhiyun 	case 2700:
539*4882a593Smuzhiyun 		ctrl = &tx_drv_ctrl_hbr[dp->voltage[lane]][dp->pre[lane]];
540*4882a593Smuzhiyun 		regmap_update_bits(hdptx->regmap, LANE_REG(lane, 0x0c44),
541*4882a593Smuzhiyun 				   LN_TX_SER_40BIT_EN_HBR,
542*4882a593Smuzhiyun 				   FIELD_PREP(LN_TX_SER_40BIT_EN_HBR, 0x1));
543*4882a593Smuzhiyun 		break;
544*4882a593Smuzhiyun 	case 5400:
545*4882a593Smuzhiyun 	default:
546*4882a593Smuzhiyun 		ctrl = &tx_drv_ctrl_hbr2[dp->voltage[lane]][dp->pre[lane]];
547*4882a593Smuzhiyun 		regmap_update_bits(hdptx->regmap, LANE_REG(lane, 0x0c44),
548*4882a593Smuzhiyun 				   LN_TX_SER_40BIT_EN_HBR2,
549*4882a593Smuzhiyun 				   FIELD_PREP(LN_TX_SER_40BIT_EN_HBR2, 0x1));
550*4882a593Smuzhiyun 		break;
551*4882a593Smuzhiyun 	}
552*4882a593Smuzhiyun 
553*4882a593Smuzhiyun 	regmap_update_bits(hdptx->regmap, LANE_REG(lane, 0x0c0c),
554*4882a593Smuzhiyun 			   OVRD_LN_TX_DRV_LVL_CTRL | LN_TX_DRV_LVL_CTRL,
555*4882a593Smuzhiyun 			   FIELD_PREP(OVRD_LN_TX_DRV_LVL_CTRL, 0x1) |
556*4882a593Smuzhiyun 			   FIELD_PREP(LN_TX_DRV_LVL_CTRL,
557*4882a593Smuzhiyun 				      ctrl->tx_drv_lvl_ctrl));
558*4882a593Smuzhiyun 	regmap_update_bits(hdptx->regmap, LANE_REG(lane, 0x0c10),
559*4882a593Smuzhiyun 			   OVRD_LN_TX_DRV_POST_LVL_CTRL |
560*4882a593Smuzhiyun 			   LN_TX_DRV_POST_LVL_CTRL,
561*4882a593Smuzhiyun 			   FIELD_PREP(OVRD_LN_TX_DRV_POST_LVL_CTRL, 0x1) |
562*4882a593Smuzhiyun 			   FIELD_PREP(LN_TX_DRV_POST_LVL_CTRL,
563*4882a593Smuzhiyun 				      ctrl->tx_drv_post_lvl_ctrl));
564*4882a593Smuzhiyun 	regmap_update_bits(hdptx->regmap, LANE_REG(lane, 0x0c18),
565*4882a593Smuzhiyun 			   LN_ANA_TX_DRV_IDRV_IDN_CTRL |
566*4882a593Smuzhiyun 			   LN_ANA_TX_DRV_IDRV_IUP_CTRL |
567*4882a593Smuzhiyun 			   LN_ANA_TX_DRV_ACCDRV_EN,
568*4882a593Smuzhiyun 			   FIELD_PREP(LN_ANA_TX_DRV_IDRV_IDN_CTRL,
569*4882a593Smuzhiyun 				      ctrl->ana_tx_drv_idrv_idn_ctrl) |
570*4882a593Smuzhiyun 			   FIELD_PREP(LN_ANA_TX_DRV_IDRV_IUP_CTRL,
571*4882a593Smuzhiyun 				      ctrl->ana_tx_drv_idrv_iup_ctrl) |
572*4882a593Smuzhiyun 			   FIELD_PREP(LN_ANA_TX_DRV_ACCDRV_EN,
573*4882a593Smuzhiyun 				      ctrl->ana_tx_drv_accdrv_en));
574*4882a593Smuzhiyun 	regmap_update_bits(hdptx->regmap, LANE_REG(lane, 0x0c1c),
575*4882a593Smuzhiyun 			   LN_ANA_TX_DRV_ACCDRV_POL_SEL |
576*4882a593Smuzhiyun 			   LN_ANA_TX_DRV_ACCDRV_CTRL,
577*4882a593Smuzhiyun 			   FIELD_PREP(LN_ANA_TX_DRV_ACCDRV_POL_SEL, 0x1) |
578*4882a593Smuzhiyun 			   FIELD_PREP(LN_ANA_TX_DRV_ACCDRV_CTRL,
579*4882a593Smuzhiyun 				      ctrl->ana_tx_drv_accdrv_ctrl));
580*4882a593Smuzhiyun 	regmap_update_bits(hdptx->regmap, LANE_REG(lane, 0x0c6c),
581*4882a593Smuzhiyun 			   LN_ANA_TX_RESERVED,
582*4882a593Smuzhiyun 			   FIELD_PREP(LN_ANA_TX_RESERVED, 0x1));
583*4882a593Smuzhiyun 	regmap_update_bits(hdptx->regmap, LANE_REG(lane, 0x0c58),
584*4882a593Smuzhiyun 			   LN_ANA_TX_SER_VREG_GAIN_CTRL,
585*4882a593Smuzhiyun 			   FIELD_PREP(LN_ANA_TX_SER_VREG_GAIN_CTRL, 0x2));
586*4882a593Smuzhiyun 	regmap_update_bits(hdptx->regmap, LANE_REG(lane, 0x0c40),
587*4882a593Smuzhiyun 			   LN_ANA_TX_SYNC_LOSS_DET_MODE,
588*4882a593Smuzhiyun 			   FIELD_PREP(LN_ANA_TX_SYNC_LOSS_DET_MODE, 0x3));
589*4882a593Smuzhiyun }
590*4882a593Smuzhiyun 
rockchip_hdptx_phy_set_voltages(struct rockchip_hdptx_phy * hdptx,struct phy_configure_opts_dp * dp)591*4882a593Smuzhiyun static int rockchip_hdptx_phy_set_voltages(struct rockchip_hdptx_phy *hdptx,
592*4882a593Smuzhiyun 					   struct phy_configure_opts_dp *dp)
593*4882a593Smuzhiyun {
594*4882a593Smuzhiyun 	u8 lane;
595*4882a593Smuzhiyun 	u32 status;
596*4882a593Smuzhiyun 	int ret;
597*4882a593Smuzhiyun 
598*4882a593Smuzhiyun 	for (lane = 0; lane < dp->lanes; lane++)
599*4882a593Smuzhiyun 		rockchip_hdptx_phy_set_voltage(hdptx, dp, lane);
600*4882a593Smuzhiyun 
601*4882a593Smuzhiyun 	reset_deassert(&hdptx->lane_reset);
602*4882a593Smuzhiyun 
603*4882a593Smuzhiyun 	ret = regmap_read_poll_timeout(hdptx->grf, HDPTXPHY_GRF_STATUS0,
604*4882a593Smuzhiyun 				       status, FIELD_GET(PHY_RDY, status),
605*4882a593Smuzhiyun 				       50, 5000);
606*4882a593Smuzhiyun 	if (ret) {
607*4882a593Smuzhiyun 		dev_err(hdptx->dev, "timeout waiting for phy_rdy\n");
608*4882a593Smuzhiyun 		return ret;
609*4882a593Smuzhiyun 	}
610*4882a593Smuzhiyun 
611*4882a593Smuzhiyun 	return 0;
612*4882a593Smuzhiyun }
613*4882a593Smuzhiyun 
rockchip_hdptx_phy_set_rate(struct rockchip_hdptx_phy * hdptx,struct phy_configure_opts_dp * dp)614*4882a593Smuzhiyun static int rockchip_hdptx_phy_set_rate(struct rockchip_hdptx_phy *hdptx,
615*4882a593Smuzhiyun 				       struct phy_configure_opts_dp *dp)
616*4882a593Smuzhiyun {
617*4882a593Smuzhiyun 	u32 bw, status;
618*4882a593Smuzhiyun 	int ret;
619*4882a593Smuzhiyun 
620*4882a593Smuzhiyun 	reset_assert(&hdptx->lane_reset);
621*4882a593Smuzhiyun 	udelay(10);
622*4882a593Smuzhiyun 	reset_assert(&hdptx->cmn_reset);
623*4882a593Smuzhiyun 	udelay(10);
624*4882a593Smuzhiyun 	rockchip_grf_write(hdptx->grf, HDPTXPHY_GRF_CON0, PLL_EN,
625*4882a593Smuzhiyun 			   FIELD_PREP(PLL_EN, 0x0));
626*4882a593Smuzhiyun 	udelay(10);
627*4882a593Smuzhiyun 	regmap_update_bits(hdptx->regmap, 0x081c, LANE_EN,
628*4882a593Smuzhiyun 			   FIELD_PREP(LANE_EN, 0x0));
629*4882a593Smuzhiyun 
630*4882a593Smuzhiyun 	switch (dp->link_rate) {
631*4882a593Smuzhiyun 	case 1620:
632*4882a593Smuzhiyun 		bw = DP_BW_RBR;
633*4882a593Smuzhiyun 		break;
634*4882a593Smuzhiyun 	case 2700:
635*4882a593Smuzhiyun 		bw = DP_BW_HBR;
636*4882a593Smuzhiyun 		break;
637*4882a593Smuzhiyun 	case 5400:
638*4882a593Smuzhiyun 		bw = DP_BW_HBR2;
639*4882a593Smuzhiyun 		break;
640*4882a593Smuzhiyun 	default:
641*4882a593Smuzhiyun 		return -EINVAL;
642*4882a593Smuzhiyun 	}
643*4882a593Smuzhiyun 
644*4882a593Smuzhiyun 	regmap_update_bits(hdptx->regmap, 0x0254, DP_TX_LINK_BW,
645*4882a593Smuzhiyun 			   FIELD_PREP(DP_TX_LINK_BW, bw));
646*4882a593Smuzhiyun 
647*4882a593Smuzhiyun 	if (dp->ssc) {
648*4882a593Smuzhiyun 		regmap_update_bits(hdptx->regmap, 0x01d0,
649*4882a593Smuzhiyun 				   OVRD_ROPLL_SSC_EN | ROPLL_SSC_EN,
650*4882a593Smuzhiyun 				   FIELD_PREP(OVRD_ROPLL_SSC_EN, 0x1) |
651*4882a593Smuzhiyun 				   FIELD_PREP(ROPLL_SSC_EN, 0x1));
652*4882a593Smuzhiyun 		regmap_update_bits(hdptx->regmap, 0x01d4,
653*4882a593Smuzhiyun 				   ANA_ROPLL_SSC_FM_DEVIATION,
654*4882a593Smuzhiyun 				   FIELD_PREP(ANA_ROPLL_SSC_FM_DEVIATION, 0xc));
655*4882a593Smuzhiyun 		regmap_update_bits(hdptx->regmap, 0x01d8,
656*4882a593Smuzhiyun 				   ANA_ROPLL_SSC_FM_FREQ,
657*4882a593Smuzhiyun 				   FIELD_PREP(ANA_ROPLL_SSC_FM_FREQ, 0x1f));
658*4882a593Smuzhiyun 		regmap_update_bits(hdptx->regmap, 0x0264, SSC_EN,
659*4882a593Smuzhiyun 				   FIELD_PREP(SSC_EN, 0x2));
660*4882a593Smuzhiyun 	} else {
661*4882a593Smuzhiyun 		regmap_update_bits(hdptx->regmap, 0x01d0,
662*4882a593Smuzhiyun 				   OVRD_ROPLL_SSC_EN | ROPLL_SSC_EN,
663*4882a593Smuzhiyun 				   FIELD_PREP(OVRD_ROPLL_SSC_EN, 0x1) |
664*4882a593Smuzhiyun 				   FIELD_PREP(ROPLL_SSC_EN, 0x0));
665*4882a593Smuzhiyun 		regmap_update_bits(hdptx->regmap, 0x01d4,
666*4882a593Smuzhiyun 				   ANA_ROPLL_SSC_FM_DEVIATION,
667*4882a593Smuzhiyun 				   FIELD_PREP(ANA_ROPLL_SSC_FM_DEVIATION, 0x20));
668*4882a593Smuzhiyun 		regmap_update_bits(hdptx->regmap, 0x01d8,
669*4882a593Smuzhiyun 				   ANA_ROPLL_SSC_FM_FREQ,
670*4882a593Smuzhiyun 				   FIELD_PREP(ANA_ROPLL_SSC_FM_FREQ, 0xc));
671*4882a593Smuzhiyun 		regmap_update_bits(hdptx->regmap, 0x0264, SSC_EN,
672*4882a593Smuzhiyun 				   FIELD_PREP(SSC_EN, 0x0));
673*4882a593Smuzhiyun 	}
674*4882a593Smuzhiyun 
675*4882a593Smuzhiyun 	rockchip_grf_write(hdptx->grf, HDPTXPHY_GRF_CON0, PLL_EN,
676*4882a593Smuzhiyun 			   FIELD_PREP(PLL_EN, 0x1));
677*4882a593Smuzhiyun 	udelay(10);
678*4882a593Smuzhiyun 	reset_deassert(&hdptx->cmn_reset);
679*4882a593Smuzhiyun 	udelay(10);
680*4882a593Smuzhiyun 
681*4882a593Smuzhiyun 	ret = regmap_read_poll_timeout(hdptx->grf, HDPTXPHY_GRF_STATUS0,
682*4882a593Smuzhiyun 				       status, FIELD_GET(PLL_LOCK_DONE, status),
683*4882a593Smuzhiyun 				       50, 1000);
684*4882a593Smuzhiyun 	if (ret) {
685*4882a593Smuzhiyun 		dev_err(hdptx->dev, "timeout waiting for pll_lock_done\n");
686*4882a593Smuzhiyun 		return ret;
687*4882a593Smuzhiyun 	}
688*4882a593Smuzhiyun 
689*4882a593Smuzhiyun 	regmap_update_bits(hdptx->regmap, 0x081c, LANE_EN,
690*4882a593Smuzhiyun 			   FIELD_PREP(LANE_EN, GENMASK(dp->lanes - 1, 0)));
691*4882a593Smuzhiyun 
692*4882a593Smuzhiyun 	return 0;
693*4882a593Smuzhiyun }
694*4882a593Smuzhiyun 
rockchip_hdptx_phy_configure(struct phy * phy,union phy_configure_opts * opts)695*4882a593Smuzhiyun static int rockchip_hdptx_phy_configure(struct phy *phy,
696*4882a593Smuzhiyun 					union phy_configure_opts *opts)
697*4882a593Smuzhiyun {
698*4882a593Smuzhiyun 	struct rockchip_hdptx_phy *hdptx = dev_get_priv(phy->dev);
699*4882a593Smuzhiyun 	enum phy_mode mode = generic_phy_get_mode(phy);
700*4882a593Smuzhiyun 	int ret;
701*4882a593Smuzhiyun 
702*4882a593Smuzhiyun 	if (mode != PHY_MODE_DP)
703*4882a593Smuzhiyun 		return -EINVAL;
704*4882a593Smuzhiyun 
705*4882a593Smuzhiyun 	ret = rockchip_hdptx_phy_verify_config(hdptx, &opts->dp);
706*4882a593Smuzhiyun 	if (ret) {
707*4882a593Smuzhiyun 		dev_err(hdptx->dev, "invalid params for phy configure\n");
708*4882a593Smuzhiyun 		return ret;
709*4882a593Smuzhiyun 	}
710*4882a593Smuzhiyun 
711*4882a593Smuzhiyun 	if (opts->dp.set_rate) {
712*4882a593Smuzhiyun 		ret = rockchip_hdptx_phy_set_rate(hdptx, &opts->dp);
713*4882a593Smuzhiyun 		if (ret) {
714*4882a593Smuzhiyun 			dev_err(hdptx->dev, "failed to set rate: %d\n", ret);
715*4882a593Smuzhiyun 			return ret;
716*4882a593Smuzhiyun 		}
717*4882a593Smuzhiyun 	}
718*4882a593Smuzhiyun 
719*4882a593Smuzhiyun 	if (opts->dp.set_voltages) {
720*4882a593Smuzhiyun 		ret = rockchip_hdptx_phy_set_voltages(hdptx, &opts->dp);
721*4882a593Smuzhiyun 		if (ret) {
722*4882a593Smuzhiyun 			dev_err(hdptx->dev, "failed to set voltages: %d\n",
723*4882a593Smuzhiyun 				ret);
724*4882a593Smuzhiyun 			return ret;
725*4882a593Smuzhiyun 		}
726*4882a593Smuzhiyun 	}
727*4882a593Smuzhiyun 
728*4882a593Smuzhiyun 	return 0;
729*4882a593Smuzhiyun }
730*4882a593Smuzhiyun 
rockchip_hdptx_phy_dp_pll_init(struct rockchip_hdptx_phy * hdptx)731*4882a593Smuzhiyun static void rockchip_hdptx_phy_dp_pll_init(struct rockchip_hdptx_phy *hdptx)
732*4882a593Smuzhiyun {
733*4882a593Smuzhiyun 	regmap_update_bits(hdptx->regmap, 0x0020, OVRD_LCPLL_EN | LCPLL_EN,
734*4882a593Smuzhiyun 			   FIELD_PREP(OVRD_LCPLL_EN, 0x1) |
735*4882a593Smuzhiyun 			   FIELD_PREP(LCPLL_EN, 0x0));
736*4882a593Smuzhiyun 	regmap_update_bits(hdptx->regmap, 0x00f4, OVRD_ROPLL_EN | ROPLL_EN,
737*4882a593Smuzhiyun 			   FIELD_PREP(OVRD_ROPLL_EN, 0x1) |
738*4882a593Smuzhiyun 			   FIELD_PREP(ROPLL_EN, 0x1));
739*4882a593Smuzhiyun 	regmap_update_bits(hdptx->regmap, 0x0138, ANA_ROPLL_PI_EN,
740*4882a593Smuzhiyun 			   FIELD_PREP(ANA_ROPLL_PI_EN, 0x1));
741*4882a593Smuzhiyun 	regmap_write(hdptx->regmap, 0x0144, FIELD_PREP(ROPLL_PMS_MDIV, 0x87));
742*4882a593Smuzhiyun 	regmap_write(hdptx->regmap, 0x0148, FIELD_PREP(ROPLL_PMS_MDIV, 0x71));
743*4882a593Smuzhiyun 	regmap_write(hdptx->regmap, 0x014c, FIELD_PREP(ROPLL_PMS_MDIV, 0x71));
744*4882a593Smuzhiyun 	regmap_write(hdptx->regmap, 0x0154,
745*4882a593Smuzhiyun 		     FIELD_PREP(ROPLL_PMS_MDIV_AFC, 0x87));
746*4882a593Smuzhiyun 	regmap_write(hdptx->regmap, 0x0158,
747*4882a593Smuzhiyun 		     FIELD_PREP(ROPLL_PMS_MDIV_AFC, 0x71));
748*4882a593Smuzhiyun 	regmap_write(hdptx->regmap, 0x015c,
749*4882a593Smuzhiyun 		     FIELD_PREP(ROPLL_PMS_MDIV_AFC, 0x71));
750*4882a593Smuzhiyun 	regmap_write(hdptx->regmap, 0x0164,
751*4882a593Smuzhiyun 		     FIELD_PREP(ANA_ROPLL_PMS_PDIV, 0x1) |
752*4882a593Smuzhiyun 		     FIELD_PREP(ANA_ROPLL_PMS_REFDIV, 0x1));
753*4882a593Smuzhiyun 	regmap_write(hdptx->regmap, 0x0168,
754*4882a593Smuzhiyun 		     FIELD_PREP(ROPLL_PMS_SDIV_RBR, 0x3) |
755*4882a593Smuzhiyun 		     FIELD_PREP(ROPLL_PMS_SDIV_HBR, 0x1));
756*4882a593Smuzhiyun 	regmap_update_bits(hdptx->regmap, 0x016c, ROPLL_PMS_SDIV_HBR2,
757*4882a593Smuzhiyun 			   FIELD_PREP(ROPLL_PMS_SDIV_HBR2, 0x0));
758*4882a593Smuzhiyun 	regmap_update_bits(hdptx->regmap, 0x0178, ANA_ROPLL_SDM_EN,
759*4882a593Smuzhiyun 			   FIELD_PREP(ANA_ROPLL_SDM_EN, 0x1));
760*4882a593Smuzhiyun 	regmap_update_bits(hdptx->regmap, 0x0178,
761*4882a593Smuzhiyun 			   OVRD_ROPLL_SDM_RSTN | ROPLL_SDM_RSTN,
762*4882a593Smuzhiyun 			   FIELD_PREP(OVRD_ROPLL_SDM_RSTN, 0x1) |
763*4882a593Smuzhiyun 			   FIELD_PREP(ROPLL_SDM_RSTN, 0x1));
764*4882a593Smuzhiyun 	regmap_update_bits(hdptx->regmap, 0x0178, ROPLL_SDC_FRACTIONAL_EN_RBR,
765*4882a593Smuzhiyun 			   FIELD_PREP(ROPLL_SDC_FRACTIONAL_EN_RBR, 0x1));
766*4882a593Smuzhiyun 	regmap_update_bits(hdptx->regmap, 0x0178, ROPLL_SDC_FRACTIONAL_EN_HBR,
767*4882a593Smuzhiyun 			   FIELD_PREP(ROPLL_SDC_FRACTIONAL_EN_HBR, 0x1));
768*4882a593Smuzhiyun 	regmap_update_bits(hdptx->regmap, 0x0178, ROPLL_SDC_FRACTIONAL_EN_HBR2,
769*4882a593Smuzhiyun 			   FIELD_PREP(ROPLL_SDC_FRACTIONAL_EN_HBR2, 0x1));
770*4882a593Smuzhiyun 	regmap_update_bits(hdptx->regmap, 0x017c,
771*4882a593Smuzhiyun 			   OVRD_ROPLL_SDC_RSTN | ROPLL_SDC_RSTN,
772*4882a593Smuzhiyun 			   FIELD_PREP(OVRD_ROPLL_SDC_RSTN, 0x1) |
773*4882a593Smuzhiyun 			   FIELD_PREP(ROPLL_SDC_RSTN, 0x1));
774*4882a593Smuzhiyun 	regmap_write(hdptx->regmap, 0x0180,
775*4882a593Smuzhiyun 		     FIELD_PREP(ROPLL_SDM_DENOMINATOR, 0x21));
776*4882a593Smuzhiyun 	regmap_write(hdptx->regmap, 0x0184,
777*4882a593Smuzhiyun 		     FIELD_PREP(ROPLL_SDM_DENOMINATOR, 0x27));
778*4882a593Smuzhiyun 	regmap_write(hdptx->regmap, 0x0188,
779*4882a593Smuzhiyun 		     FIELD_PREP(ROPLL_SDM_DENOMINATOR, 0x27));
780*4882a593Smuzhiyun 	regmap_update_bits(hdptx->regmap, 0x0190,
781*4882a593Smuzhiyun 			   ROPLL_SDM_NUMERATOR_SIGN_RBR |
782*4882a593Smuzhiyun 			   ROPLL_SDM_NUMERATOR_SIGN_HBR |
783*4882a593Smuzhiyun 			   ROPLL_SDM_NUMERATOR_SIGN_HBR2,
784*4882a593Smuzhiyun 			   FIELD_PREP(ROPLL_SDM_NUMERATOR_SIGN_RBR, 0x0) |
785*4882a593Smuzhiyun 			   FIELD_PREP(ROPLL_SDM_NUMERATOR_SIGN_HBR, 0x1) |
786*4882a593Smuzhiyun 			   FIELD_PREP(ROPLL_SDM_NUMERATOR_SIGN_HBR2, 0x1));
787*4882a593Smuzhiyun 	regmap_write(hdptx->regmap, 0x0194,
788*4882a593Smuzhiyun 		     FIELD_PREP(ROPLL_SDM_NUMERATOR, 0x0));
789*4882a593Smuzhiyun 	regmap_write(hdptx->regmap, 0x0198,
790*4882a593Smuzhiyun 		     FIELD_PREP(ROPLL_SDM_NUMERATOR, 0xd));
791*4882a593Smuzhiyun 	regmap_write(hdptx->regmap, 0x019c,
792*4882a593Smuzhiyun 		     FIELD_PREP(ROPLL_SDM_NUMERATOR, 0xd));
793*4882a593Smuzhiyun 	regmap_update_bits(hdptx->regmap, 0x01a4, ROPLL_SDC_N_RBR,
794*4882a593Smuzhiyun 			   FIELD_PREP(ROPLL_SDC_N_RBR, 0x2));
795*4882a593Smuzhiyun 	regmap_update_bits(hdptx->regmap, 0x01a8,
796*4882a593Smuzhiyun 			   ROPLL_SDC_N_HBR | ROPLL_SDC_N_HBR2,
797*4882a593Smuzhiyun 			   FIELD_PREP(ROPLL_SDC_N_HBR, 0x2) |
798*4882a593Smuzhiyun 			   FIELD_PREP(ROPLL_SDC_N_HBR2, 0x2));
799*4882a593Smuzhiyun 	regmap_write(hdptx->regmap, 0x01b0,
800*4882a593Smuzhiyun 		     FIELD_PREP(ROPLL_SDC_NUMERATOR, 0x3));
801*4882a593Smuzhiyun 	regmap_write(hdptx->regmap, 0x01b4,
802*4882a593Smuzhiyun 		     FIELD_PREP(ROPLL_SDC_NUMERATOR, 0x7));
803*4882a593Smuzhiyun 	regmap_write(hdptx->regmap, 0x01b8,
804*4882a593Smuzhiyun 		     FIELD_PREP(ROPLL_SDC_NUMERATOR, 0x7));
805*4882a593Smuzhiyun 	regmap_write(hdptx->regmap, 0x01c0,
806*4882a593Smuzhiyun 		     FIELD_PREP(ROPLL_SDC_DENOMINATOR, 0x8));
807*4882a593Smuzhiyun 	regmap_write(hdptx->regmap, 0x01c4,
808*4882a593Smuzhiyun 		     FIELD_PREP(ROPLL_SDC_DENOMINATOR, 0x18));
809*4882a593Smuzhiyun 	regmap_write(hdptx->regmap, 0x01c8,
810*4882a593Smuzhiyun 		     FIELD_PREP(ROPLL_SDC_DENOMINATOR, 0x18));
811*4882a593Smuzhiyun 	regmap_update_bits(hdptx->regmap, 0x01d0,
812*4882a593Smuzhiyun 			   OVRD_ROPLL_SDC_NDIV_RSTN | ROPLL_SDC_NDIV_RSTN,
813*4882a593Smuzhiyun 			   FIELD_PREP(OVRD_ROPLL_SDC_NDIV_RSTN, 0x1) |
814*4882a593Smuzhiyun 			   FIELD_PREP(ROPLL_SDC_NDIV_RSTN, 0x1));
815*4882a593Smuzhiyun 	regmap_update_bits(hdptx->regmap, 0x01dc, ANA_ROPLL_SSC_CLK_DIV_SEL,
816*4882a593Smuzhiyun 			   FIELD_PREP(ANA_ROPLL_SSC_CLK_DIV_SEL, 0x1));
817*4882a593Smuzhiyun 	regmap_update_bits(hdptx->regmap, 0x0118,
818*4882a593Smuzhiyun 			   ROPLL_ANA_CPP_CTRL_COARSE | ROPLL_ANA_CPP_CTRL_FINE,
819*4882a593Smuzhiyun 			   FIELD_PREP(ROPLL_ANA_CPP_CTRL_COARSE, 0xe) |
820*4882a593Smuzhiyun 			   FIELD_PREP(ROPLL_ANA_CPP_CTRL_FINE, 0xe));
821*4882a593Smuzhiyun 	regmap_update_bits(hdptx->regmap, 0x011c,
822*4882a593Smuzhiyun 			   ROPLL_ANA_LPF_C_SEL_COARSE |
823*4882a593Smuzhiyun 			   ROPLL_ANA_LPF_C_SEL_FINE,
824*4882a593Smuzhiyun 			   FIELD_PREP(ROPLL_ANA_LPF_C_SEL_COARSE, 0x4) |
825*4882a593Smuzhiyun 			   FIELD_PREP(ROPLL_ANA_LPF_C_SEL_FINE, 0x4));
826*4882a593Smuzhiyun 	regmap_update_bits(hdptx->regmap, 0x0204, ANA_PLL_CD_TX_SER_RATE_SEL,
827*4882a593Smuzhiyun 			   FIELD_PREP(ANA_PLL_CD_TX_SER_RATE_SEL, 0x0));
828*4882a593Smuzhiyun 	regmap_update_bits(hdptx->regmap, 0x025c, DIG_CLK_SEL,
829*4882a593Smuzhiyun 			   FIELD_PREP(DIG_CLK_SEL, 0x1));
830*4882a593Smuzhiyun 	regmap_update_bits(hdptx->regmap, 0x021c, ANA_PLL_TX_HS_CLK_EN,
831*4882a593Smuzhiyun 			   FIELD_PREP(ANA_PLL_TX_HS_CLK_EN, 0x1));
832*4882a593Smuzhiyun 	regmap_update_bits(hdptx->regmap, 0x0204,
833*4882a593Smuzhiyun 			   ANA_PLL_CD_HSCLK_EAST_EN | ANA_PLL_CD_HSCLK_WEST_EN,
834*4882a593Smuzhiyun 			   FIELD_PREP(ANA_PLL_CD_HSCLK_EAST_EN, 0x1) |
835*4882a593Smuzhiyun 			   FIELD_PREP(ANA_PLL_CD_HSCLK_WEST_EN, 0x0));
836*4882a593Smuzhiyun 	regmap_update_bits(hdptx->regmap, 0x0264, CMN_ROPLL_ALONE_MODE,
837*4882a593Smuzhiyun 			   FIELD_PREP(CMN_ROPLL_ALONE_MODE, 0x1));
838*4882a593Smuzhiyun 	regmap_update_bits(hdptx->regmap, 0x0208, ANA_PLL_CD_VREG_GAIN_CTRL,
839*4882a593Smuzhiyun 			   FIELD_PREP(ANA_PLL_CD_VREG_GAIN_CTRL, 0x4));
840*4882a593Smuzhiyun 	regmap_update_bits(hdptx->regmap, 0x00f0, ANA_LCPLL_RESERVED7,
841*4882a593Smuzhiyun 			   FIELD_PREP(ANA_LCPLL_RESERVED7, 0x1));
842*4882a593Smuzhiyun 	regmap_update_bits(hdptx->regmap, 0x020c, ANA_PLL_CD_VREG_ICTRL,
843*4882a593Smuzhiyun 			   FIELD_PREP(ANA_PLL_CD_VREG_ICTRL, 0x1));
844*4882a593Smuzhiyun 	regmap_update_bits(hdptx->regmap, 0x0214, ANA_PLL_SYNC_LOSS_DET_MODE,
845*4882a593Smuzhiyun 			   FIELD_PREP(ANA_PLL_SYNC_LOSS_DET_MODE, 0x3));
846*4882a593Smuzhiyun 	regmap_update_bits(hdptx->regmap, 0x0210, PLL_LCRO_CLK_SEL,
847*4882a593Smuzhiyun 			   FIELD_PREP(PLL_LCRO_CLK_SEL, 0x1));
848*4882a593Smuzhiyun 	regmap_update_bits(hdptx->regmap, 0x0268, HS_SPEED_SEL,
849*4882a593Smuzhiyun 			   FIELD_PREP(HS_SPEED_SEL, 0x1));
850*4882a593Smuzhiyun 	regmap_update_bits(hdptx->regmap, 0x026c, LS_SPEED_SEL,
851*4882a593Smuzhiyun 			   FIELD_PREP(LS_SPEED_SEL, 0x1));
852*4882a593Smuzhiyun }
853*4882a593Smuzhiyun 
rockchip_hdptx_phy_dp_aux_init(struct rockchip_hdptx_phy * hdptx)854*4882a593Smuzhiyun static int rockchip_hdptx_phy_dp_aux_init(struct rockchip_hdptx_phy *hdptx)
855*4882a593Smuzhiyun {
856*4882a593Smuzhiyun 	u32 status;
857*4882a593Smuzhiyun 	int ret;
858*4882a593Smuzhiyun 
859*4882a593Smuzhiyun 	regmap_update_bits(hdptx->regmap, 0x0414, ANA_SB_TX_HLVL_PROG,
860*4882a593Smuzhiyun 			   FIELD_PREP(ANA_SB_TX_HLVL_PROG, 0x7));
861*4882a593Smuzhiyun 	regmap_update_bits(hdptx->regmap, 0x0418, ANA_SB_TX_LLVL_PROG,
862*4882a593Smuzhiyun 			   FIELD_PREP(ANA_SB_TX_LLVL_PROG, 0x7));
863*4882a593Smuzhiyun 	regmap_update_bits(hdptx->regmap, 0x044c,
864*4882a593Smuzhiyun 			   SB_RX_RCAL_OPT_CODE | SB_RX_RTERM_CTRL,
865*4882a593Smuzhiyun 			   FIELD_PREP(SB_RX_RCAL_OPT_CODE, 0x1) |
866*4882a593Smuzhiyun 			   FIELD_PREP(SB_RX_RTERM_CTRL, 0x3));
867*4882a593Smuzhiyun 	regmap_update_bits(hdptx->regmap, 0x0450,
868*4882a593Smuzhiyun 			   SB_TG_SB_EN_DELAY_TIME | SB_TG_RXTERN_EN_DELAY_TIME,
869*4882a593Smuzhiyun 			   FIELD_PREP(SB_TG_SB_EN_DELAY_TIME, 0x2) |
870*4882a593Smuzhiyun 			   FIELD_PREP(SB_TG_RXTERN_EN_DELAY_TIME, 0x2));
871*4882a593Smuzhiyun 	regmap_update_bits(hdptx->regmap, 0x0454,
872*4882a593Smuzhiyun 			   SB_READY_DELAY_TIME | SB_TG_OSC_EN_DELAY_TIME,
873*4882a593Smuzhiyun 			   FIELD_PREP(SB_READY_DELAY_TIME, 0x2) |
874*4882a593Smuzhiyun 			   FIELD_PREP(SB_TG_OSC_EN_DELAY_TIME, 0x2));
875*4882a593Smuzhiyun 	regmap_update_bits(hdptx->regmap, 0x0458,
876*4882a593Smuzhiyun 			   SB_TG_OSC_EN_TO_AFC_RSTN_DELAT_TIME,
877*4882a593Smuzhiyun 			   FIELD_PREP(SB_TG_OSC_EN_TO_AFC_RSTN_DELAT_TIME, 0x2));
878*4882a593Smuzhiyun 	regmap_update_bits(hdptx->regmap, 0x045c,
879*4882a593Smuzhiyun 			   SB_TG_PLL_CD_VREG_FAST_PULSE_TIME,
880*4882a593Smuzhiyun 			   FIELD_PREP(SB_TG_PLL_CD_VREG_FAST_PULSE_TIME, 0x4));
881*4882a593Smuzhiyun 	regmap_update_bits(hdptx->regmap, 0x0460,
882*4882a593Smuzhiyun 			   SB_TG_EARC_DMRX_RECVRD_CLK_CNT,
883*4882a593Smuzhiyun 			   FIELD_PREP(SB_TG_EARC_DMRX_RECVRD_CLK_CNT, 0xa));
884*4882a593Smuzhiyun 	regmap_update_bits(hdptx->regmap, 0x0468, SB_TG_CNT_RUN_NO_7_0,
885*4882a593Smuzhiyun 			   FIELD_PREP(SB_TG_CNT_RUN_NO_7_0, 0x3));
886*4882a593Smuzhiyun 	regmap_update_bits(hdptx->regmap, 0x046c,
887*4882a593Smuzhiyun 			   SB_EARC_SIG_DET_BYPASS | SB_AFC_TOL,
888*4882a593Smuzhiyun 			   FIELD_PREP(SB_EARC_SIG_DET_BYPASS, 0x1) |
889*4882a593Smuzhiyun 			   FIELD_PREP(SB_AFC_TOL, 0x3));
890*4882a593Smuzhiyun 	regmap_update_bits(hdptx->regmap, 0x0470, SB_AFC_STB_NUM,
891*4882a593Smuzhiyun 			   FIELD_PREP(SB_AFC_STB_NUM, 0x4));
892*4882a593Smuzhiyun 	regmap_update_bits(hdptx->regmap, 0x0474, SB_TG_OSC_CNT_MIN,
893*4882a593Smuzhiyun 			   FIELD_PREP(SB_TG_OSC_CNT_MIN, 0x67));
894*4882a593Smuzhiyun 	regmap_update_bits(hdptx->regmap, 0x0478, SB_TG_OSC_CNT_MAX,
895*4882a593Smuzhiyun 			   FIELD_PREP(SB_TG_OSC_CNT_MAX, 0x6a));
896*4882a593Smuzhiyun 	regmap_update_bits(hdptx->regmap, 0x047c, SB_PWM_AFC_CTRL,
897*4882a593Smuzhiyun 			   FIELD_PREP(SB_PWM_AFC_CTRL, 0x5));
898*4882a593Smuzhiyun 	regmap_update_bits(hdptx->regmap, 0x0434, ANA_SB_DMRX_LPBK_DATA,
899*4882a593Smuzhiyun 			   FIELD_PREP(ANA_SB_DMRX_LPBK_DATA, 0x1));
900*4882a593Smuzhiyun 	regmap_update_bits(hdptx->regmap, 0x0440,
901*4882a593Smuzhiyun 			   ANA_SB_VREG_OUT_SEL | ANA_SB_VREG_REF_SEL,
902*4882a593Smuzhiyun 			   FIELD_PREP(ANA_SB_VREG_OUT_SEL, 0x1) |
903*4882a593Smuzhiyun 			   FIELD_PREP(ANA_SB_VREG_REF_SEL, 0x1));
904*4882a593Smuzhiyun 	regmap_update_bits(hdptx->regmap, 0x043c, ANA_SB_VREG_GAIN_CTRL,
905*4882a593Smuzhiyun 			   FIELD_PREP(ANA_SB_VREG_GAIN_CTRL, 0x0));
906*4882a593Smuzhiyun 	regmap_update_bits(hdptx->regmap, 0x0408, ANA_SB_RXTERM_OFFSP,
907*4882a593Smuzhiyun 			   FIELD_PREP(ANA_SB_RXTERM_OFFSP, 0x3));
908*4882a593Smuzhiyun 	regmap_update_bits(hdptx->regmap, 0x040c, ANA_SB_RXTERM_OFFSN,
909*4882a593Smuzhiyun 			   FIELD_PREP(ANA_SB_RXTERM_OFFSN, 0x3));
910*4882a593Smuzhiyun 	regmap_update_bits(hdptx->regmap, 0x047c, SB_RCAL_RSTN,
911*4882a593Smuzhiyun 			   FIELD_PREP(SB_RCAL_RSTN, 0x1));
912*4882a593Smuzhiyun 	regmap_update_bits(hdptx->regmap, 0x0410, SB_AUX_EN,
913*4882a593Smuzhiyun 			   FIELD_PREP(SB_AUX_EN, 0x1));
914*4882a593Smuzhiyun 	regmap_update_bits(hdptx->regmap, 0x0480, SB_AUX_EN_IN,
915*4882a593Smuzhiyun 			   FIELD_PREP(SB_AUX_EN_IN, 0x1));
916*4882a593Smuzhiyun 	regmap_update_bits(hdptx->regmap, 0x040c, OVRD_SB_RX_RESCAL_DONE,
917*4882a593Smuzhiyun 			   FIELD_PREP(OVRD_SB_RX_RESCAL_DONE, 0x1));
918*4882a593Smuzhiyun 	regmap_update_bits(hdptx->regmap, 0x0410, OVRD_SB_EN,
919*4882a593Smuzhiyun 			   FIELD_PREP(OVRD_SB_EN, 0x1));
920*4882a593Smuzhiyun 	regmap_update_bits(hdptx->regmap, 0x0408, OVRD_SB_RXTERM_EN,
921*4882a593Smuzhiyun 			   FIELD_PREP(OVRD_SB_RXTERM_EN, 0x1));
922*4882a593Smuzhiyun 	regmap_update_bits(hdptx->regmap, 0x043c, OVRD_SB_VREG_EN,
923*4882a593Smuzhiyun 			   FIELD_PREP(OVRD_SB_VREG_EN, 0x1));
924*4882a593Smuzhiyun 	regmap_update_bits(hdptx->regmap, 0x0410, OVRD_SB_AUX_EN,
925*4882a593Smuzhiyun 			   FIELD_PREP(OVRD_SB_AUX_EN, 0x1));
926*4882a593Smuzhiyun 
927*4882a593Smuzhiyun 	rockchip_grf_write(hdptx->grf, HDPTXPHY_GRF_CON0, BGR_EN,
928*4882a593Smuzhiyun 			   FIELD_PREP(BGR_EN, 0x1));
929*4882a593Smuzhiyun 	rockchip_grf_write(hdptx->grf, HDPTXPHY_GRF_CON0, BIAS_EN,
930*4882a593Smuzhiyun 			   FIELD_PREP(BIAS_EN, 0x1));
931*4882a593Smuzhiyun 	udelay(10);
932*4882a593Smuzhiyun 	reset_deassert(&hdptx->init_reset);
933*4882a593Smuzhiyun 	udelay(1000);
934*4882a593Smuzhiyun 	reset_deassert(&hdptx->cmn_reset);
935*4882a593Smuzhiyun 	udelay(20);
936*4882a593Smuzhiyun 
937*4882a593Smuzhiyun 	regmap_update_bits(hdptx->regmap, 0x040c, SB_RX_RESCAL_DONE,
938*4882a593Smuzhiyun 			   FIELD_PREP(SB_RX_RESCAL_DONE, 0x1));
939*4882a593Smuzhiyun 	udelay(100);
940*4882a593Smuzhiyun 	regmap_update_bits(hdptx->regmap, 0x0410, SB_EN,
941*4882a593Smuzhiyun 			   FIELD_PREP(SB_EN, 0x1));
942*4882a593Smuzhiyun 	udelay(100);
943*4882a593Smuzhiyun 	regmap_update_bits(hdptx->regmap, 0x0408, SB_RXRERM_EN,
944*4882a593Smuzhiyun 			   FIELD_PREP(SB_RXRERM_EN, 0x1));
945*4882a593Smuzhiyun 	udelay(10);
946*4882a593Smuzhiyun 	regmap_update_bits(hdptx->regmap, 0x043c, SB_VREG_EN,
947*4882a593Smuzhiyun 			   FIELD_PREP(SB_VREG_EN, 0x1));
948*4882a593Smuzhiyun 	udelay(10);
949*4882a593Smuzhiyun 	regmap_update_bits(hdptx->regmap, 0x0410, SB_AUX_EN,
950*4882a593Smuzhiyun 			   FIELD_PREP(SB_AUX_EN, 0x1));
951*4882a593Smuzhiyun 	udelay(100);
952*4882a593Smuzhiyun 
953*4882a593Smuzhiyun 	ret = regmap_read_poll_timeout(hdptx->grf, HDPTXPHY_GRF_STATUS0,
954*4882a593Smuzhiyun 				       status, FIELD_GET(SB_RDY, status),
955*4882a593Smuzhiyun 				       50, 1000);
956*4882a593Smuzhiyun 	if (ret) {
957*4882a593Smuzhiyun 		dev_err(hdptx->dev, "timeout waiting for sb_rdy\n");
958*4882a593Smuzhiyun 		return ret;
959*4882a593Smuzhiyun 	}
960*4882a593Smuzhiyun 
961*4882a593Smuzhiyun 	return 0;
962*4882a593Smuzhiyun }
963*4882a593Smuzhiyun 
rockchip_hdptx_phy_reset(struct rockchip_hdptx_phy * hdptx)964*4882a593Smuzhiyun static void rockchip_hdptx_phy_reset(struct rockchip_hdptx_phy *hdptx)
965*4882a593Smuzhiyun {
966*4882a593Smuzhiyun 	u32 lane;
967*4882a593Smuzhiyun 
968*4882a593Smuzhiyun 	reset_assert(&hdptx->lane_reset);
969*4882a593Smuzhiyun 	reset_assert(&hdptx->cmn_reset);
970*4882a593Smuzhiyun 	reset_assert(&hdptx->init_reset);
971*4882a593Smuzhiyun 
972*4882a593Smuzhiyun 	reset_assert(&hdptx->apb_reset);
973*4882a593Smuzhiyun 	udelay(10);
974*4882a593Smuzhiyun 	reset_deassert(&hdptx->apb_reset);
975*4882a593Smuzhiyun 
976*4882a593Smuzhiyun 	for (lane = 0; lane < 4; lane++)
977*4882a593Smuzhiyun 		regmap_update_bits(hdptx->regmap, LANE_REG(lane, 0x0c04),
978*4882a593Smuzhiyun 				   OVRD_LN_TX_DRV_EI_EN | LN_TX_DRV_EI_EN,
979*4882a593Smuzhiyun 				   FIELD_PREP(OVRD_LN_TX_DRV_EI_EN, 1) |
980*4882a593Smuzhiyun 				   FIELD_PREP(LN_TX_DRV_EI_EN, 0));
981*4882a593Smuzhiyun 
982*4882a593Smuzhiyun 	rockchip_grf_write(hdptx->grf, HDPTXPHY_GRF_CON0, PLL_EN,
983*4882a593Smuzhiyun 			   FIELD_PREP(PLL_EN, 0));
984*4882a593Smuzhiyun 	rockchip_grf_write(hdptx->grf, HDPTXPHY_GRF_CON0, BIAS_EN,
985*4882a593Smuzhiyun 			   FIELD_PREP(BIAS_EN, 0));
986*4882a593Smuzhiyun 	rockchip_grf_write(hdptx->grf, HDPTXPHY_GRF_CON0, BGR_EN,
987*4882a593Smuzhiyun 			   FIELD_PREP(BGR_EN, 0));
988*4882a593Smuzhiyun }
989*4882a593Smuzhiyun 
rockchip_hdptx_phy_power_on(struct phy * phy)990*4882a593Smuzhiyun static int rockchip_hdptx_phy_power_on(struct phy *phy)
991*4882a593Smuzhiyun {
992*4882a593Smuzhiyun 	struct rockchip_hdptx_phy *hdptx = dev_get_priv(phy->dev);
993*4882a593Smuzhiyun 	enum phy_mode mode = generic_phy_get_mode(phy);
994*4882a593Smuzhiyun 	u32 lane;
995*4882a593Smuzhiyun 
996*4882a593Smuzhiyun 	rockchip_hdptx_phy_reset(hdptx);
997*4882a593Smuzhiyun 
998*4882a593Smuzhiyun 	for (lane = 0; lane < 4; lane++) {
999*4882a593Smuzhiyun 		u32 invert = hdptx->lane_polarity_invert[lane];
1000*4882a593Smuzhiyun 
1001*4882a593Smuzhiyun 		regmap_update_bits(hdptx->regmap, LANE_REG(lane, 0x0c78),
1002*4882a593Smuzhiyun 				   LN_POLARITY_INV,
1003*4882a593Smuzhiyun 				   FIELD_PREP(LN_POLARITY_INV, invert));
1004*4882a593Smuzhiyun 	}
1005*4882a593Smuzhiyun 
1006*4882a593Smuzhiyun 	if (mode == PHY_MODE_DP) {
1007*4882a593Smuzhiyun 		rockchip_grf_write(hdptx->grf, HDPTXPHY_GRF_CON0,
1008*4882a593Smuzhiyun 				   HDPTX_MODE_SEL,
1009*4882a593Smuzhiyun 				   FIELD_PREP(HDPTX_MODE_SEL, 0x1));
1010*4882a593Smuzhiyun 
1011*4882a593Smuzhiyun 		regmap_update_bits(hdptx->regmap, 0x0800, PROTOCOL_SEL,
1012*4882a593Smuzhiyun 				   FIELD_PREP(PROTOCOL_SEL, 0x0));
1013*4882a593Smuzhiyun 		regmap_update_bits(hdptx->regmap, 0x0818, DATA_BUS_WIDTH,
1014*4882a593Smuzhiyun 				   FIELD_PREP(DATA_BUS_WIDTH, 0x1));
1015*4882a593Smuzhiyun 		regmap_update_bits(hdptx->regmap, 0x0818, BUS_WIDTH_SEL,
1016*4882a593Smuzhiyun 				   FIELD_PREP(BUS_WIDTH_SEL, 0x0));
1017*4882a593Smuzhiyun 
1018*4882a593Smuzhiyun 		rockchip_hdptx_phy_dp_pll_init(hdptx);
1019*4882a593Smuzhiyun 		rockchip_hdptx_phy_dp_aux_init(hdptx);
1020*4882a593Smuzhiyun 	} else {
1021*4882a593Smuzhiyun 		rockchip_grf_write(hdptx->grf, HDPTXPHY_GRF_CON0,
1022*4882a593Smuzhiyun 				   HDPTX_MODE_SEL,
1023*4882a593Smuzhiyun 				   FIELD_PREP(HDPTX_MODE_SEL, 0x0));
1024*4882a593Smuzhiyun 
1025*4882a593Smuzhiyun 		regmap_update_bits(hdptx->regmap, 0x0800, PROTOCOL_SEL,
1026*4882a593Smuzhiyun 				   FIELD_PREP(PROTOCOL_SEL, 0x1));
1027*4882a593Smuzhiyun 	}
1028*4882a593Smuzhiyun 
1029*4882a593Smuzhiyun 	return 0;
1030*4882a593Smuzhiyun }
1031*4882a593Smuzhiyun 
rockchip_hdptx_phy_power_off(struct phy * phy)1032*4882a593Smuzhiyun static int rockchip_hdptx_phy_power_off(struct phy *phy)
1033*4882a593Smuzhiyun {
1034*4882a593Smuzhiyun 	struct rockchip_hdptx_phy *hdptx = dev_get_priv(phy->dev);
1035*4882a593Smuzhiyun 
1036*4882a593Smuzhiyun 	rockchip_hdptx_phy_reset(hdptx);
1037*4882a593Smuzhiyun 
1038*4882a593Smuzhiyun 	return 0;
1039*4882a593Smuzhiyun }
1040*4882a593Smuzhiyun 
1041*4882a593Smuzhiyun static const struct phy_ops rockchip_hdptx_phy_ops = {
1042*4882a593Smuzhiyun 	.set_mode	= rockchip_hdptx_phy_set_mode,
1043*4882a593Smuzhiyun 	.configure	= rockchip_hdptx_phy_configure,
1044*4882a593Smuzhiyun 	.power_on	= rockchip_hdptx_phy_power_on,
1045*4882a593Smuzhiyun 	.power_off	= rockchip_hdptx_phy_power_off,
1046*4882a593Smuzhiyun };
1047*4882a593Smuzhiyun 
rockchip_hdptx_phy_probe(struct udevice * dev)1048*4882a593Smuzhiyun static int rockchip_hdptx_phy_probe(struct udevice *dev)
1049*4882a593Smuzhiyun {
1050*4882a593Smuzhiyun 	struct rockchip_hdptx_phy *hdptx = dev_get_priv(dev);
1051*4882a593Smuzhiyun 	struct udevice *syscon;
1052*4882a593Smuzhiyun 	u32 prop[4];
1053*4882a593Smuzhiyun 	int ret;
1054*4882a593Smuzhiyun 
1055*4882a593Smuzhiyun 	ret = regmap_init_mem(dev, &hdptx->regmap);
1056*4882a593Smuzhiyun 	if (ret)
1057*4882a593Smuzhiyun 		return ret;
1058*4882a593Smuzhiyun 
1059*4882a593Smuzhiyun 	ret = uclass_get_device_by_phandle(UCLASS_SYSCON, dev, "rockchip,grf",
1060*4882a593Smuzhiyun 					   &syscon);
1061*4882a593Smuzhiyun 	if (ret)
1062*4882a593Smuzhiyun 		return ret;
1063*4882a593Smuzhiyun 
1064*4882a593Smuzhiyun 	hdptx->grf = syscon_get_regmap(syscon);
1065*4882a593Smuzhiyun 	if (IS_ERR(hdptx->grf)) {
1066*4882a593Smuzhiyun 		ret = PTR_ERR(hdptx->grf);
1067*4882a593Smuzhiyun 		dev_err(dev, "unable to find regmap: %d\n", ret);
1068*4882a593Smuzhiyun 		return ret;
1069*4882a593Smuzhiyun 	}
1070*4882a593Smuzhiyun 
1071*4882a593Smuzhiyun 	hdptx->dev = dev;
1072*4882a593Smuzhiyun 
1073*4882a593Smuzhiyun 	ret = reset_get_by_name(dev, "apb", &hdptx->apb_reset);
1074*4882a593Smuzhiyun 	if (ret < 0) {
1075*4882a593Smuzhiyun 		dev_err(dev, "failed to get apb reset: %d\n", ret);
1076*4882a593Smuzhiyun 		return ret;
1077*4882a593Smuzhiyun 	}
1078*4882a593Smuzhiyun 
1079*4882a593Smuzhiyun 	ret = reset_get_by_name(dev, "init", &hdptx->init_reset);
1080*4882a593Smuzhiyun 	if (ret < 0) {
1081*4882a593Smuzhiyun 		dev_err(dev, "failed to get init reset: %d\n", ret);
1082*4882a593Smuzhiyun 		return ret;
1083*4882a593Smuzhiyun 	}
1084*4882a593Smuzhiyun 
1085*4882a593Smuzhiyun 	ret = reset_get_by_name(dev, "cmn", &hdptx->cmn_reset);
1086*4882a593Smuzhiyun 	if (ret < 0) {
1087*4882a593Smuzhiyun 		dev_err(dev, "failed to get cmn reset: %d\n", ret);
1088*4882a593Smuzhiyun 		return ret;
1089*4882a593Smuzhiyun 	}
1090*4882a593Smuzhiyun 
1091*4882a593Smuzhiyun 	ret = reset_get_by_name(dev, "lane", &hdptx->lane_reset);
1092*4882a593Smuzhiyun 	if (ret < 0) {
1093*4882a593Smuzhiyun 		dev_err(dev, "failed to get lane reset: %d\n", ret);
1094*4882a593Smuzhiyun 		return ret;
1095*4882a593Smuzhiyun 	}
1096*4882a593Smuzhiyun 
1097*4882a593Smuzhiyun 	ret = rockchip_hdptx_phy_parse_training_table(dev);
1098*4882a593Smuzhiyun 	if (ret) {
1099*4882a593Smuzhiyun 		dev_err(dev, "failed to parse training table: %d\n", ret);
1100*4882a593Smuzhiyun 		return ret;
1101*4882a593Smuzhiyun 	}
1102*4882a593Smuzhiyun 
1103*4882a593Smuzhiyun 	if (!dev_read_u32_array(dev, "lane-polarity-invert", prop, ARRAY_SIZE(prop))) {
1104*4882a593Smuzhiyun 		hdptx->lane_polarity_invert[0] = prop[0];
1105*4882a593Smuzhiyun 		hdptx->lane_polarity_invert[1] = prop[1];
1106*4882a593Smuzhiyun 		hdptx->lane_polarity_invert[2] = prop[2];
1107*4882a593Smuzhiyun 		hdptx->lane_polarity_invert[3] = prop[3];
1108*4882a593Smuzhiyun 	}
1109*4882a593Smuzhiyun 
1110*4882a593Smuzhiyun 	return 0;
1111*4882a593Smuzhiyun }
1112*4882a593Smuzhiyun 
1113*4882a593Smuzhiyun static const struct udevice_id rockchip_hdptx_phy_ids[] = {
1114*4882a593Smuzhiyun 	{ .compatible = "rockchip,rk3588-hdptx-phy", },
1115*4882a593Smuzhiyun 	{}
1116*4882a593Smuzhiyun };
1117*4882a593Smuzhiyun 
1118*4882a593Smuzhiyun U_BOOT_DRIVER(rockchip_hdptx_phy) = {
1119*4882a593Smuzhiyun 	.name		= "rockchip_hdptx_phy",
1120*4882a593Smuzhiyun 	.id		= UCLASS_PHY,
1121*4882a593Smuzhiyun 	.ops		= &rockchip_hdptx_phy_ops,
1122*4882a593Smuzhiyun 	.of_match	= rockchip_hdptx_phy_ids,
1123*4882a593Smuzhiyun 	.probe		= rockchip_hdptx_phy_probe,
1124*4882a593Smuzhiyun 	.priv_auto_alloc_size = sizeof(struct rockchip_hdptx_phy),
1125*4882a593Smuzhiyun };
1126