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 <linux/bitfield.h>
9*4882a593Smuzhiyun #include <linux/clk.h>
10*4882a593Smuzhiyun #include <linux/kernel.h>
11*4882a593Smuzhiyun #include <linux/mfd/syscon.h>
12*4882a593Smuzhiyun #include <linux/module.h>
13*4882a593Smuzhiyun #include <linux/of_device.h>
14*4882a593Smuzhiyun #include <linux/phy/phy.h>
15*4882a593Smuzhiyun #include <linux/platform_device.h>
16*4882a593Smuzhiyun #include <linux/regmap.h>
17*4882a593Smuzhiyun #include <linux/reset.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 device *dev;
326*4882a593Smuzhiyun struct clk_bulk_data *clks;
327*4882a593Smuzhiyun int nr_clks;
328*4882a593Smuzhiyun struct reset_control *apb_reset;
329*4882a593Smuzhiyun struct reset_control *cmn_reset;
330*4882a593Smuzhiyun struct reset_control *init_reset;
331*4882a593Smuzhiyun struct reset_control *lane_reset;
332*4882a593Smuzhiyun struct regmap *regmap;
333*4882a593Smuzhiyun struct regmap *grf;
334*4882a593Smuzhiyun u32 lane_polarity_invert[4];
335*4882a593Smuzhiyun };
336*4882a593Smuzhiyun
337*4882a593Smuzhiyun enum {
338*4882a593Smuzhiyun DP_BW_RBR,
339*4882a593Smuzhiyun DP_BW_HBR,
340*4882a593Smuzhiyun DP_BW_HBR2,
341*4882a593Smuzhiyun DP_BW_HBR3,
342*4882a593Smuzhiyun };
343*4882a593Smuzhiyun
344*4882a593Smuzhiyun struct tx_drv_ctrl {
345*4882a593Smuzhiyun u8 tx_drv_lvl_ctrl;
346*4882a593Smuzhiyun u8 tx_drv_post_lvl_ctrl;
347*4882a593Smuzhiyun u8 ana_tx_drv_idrv_idn_ctrl;
348*4882a593Smuzhiyun u8 ana_tx_drv_idrv_iup_ctrl;
349*4882a593Smuzhiyun u8 ana_tx_drv_accdrv_en;
350*4882a593Smuzhiyun u8 ana_tx_drv_accdrv_ctrl;
351*4882a593Smuzhiyun } __packed;
352*4882a593Smuzhiyun
353*4882a593Smuzhiyun static struct tx_drv_ctrl tx_drv_ctrl_rbr[4][4] = {
354*4882a593Smuzhiyun /* voltage swing 0, pre-emphasis 0->3 */
355*4882a593Smuzhiyun {
356*4882a593Smuzhiyun { 0x1, 0x0, 0x4, 0x6, 0x0, 0x4 },
357*4882a593Smuzhiyun { 0x4, 0x3, 0x4, 0x6, 0x0, 0x4 },
358*4882a593Smuzhiyun { 0x7, 0x6, 0x4, 0x6, 0x0, 0x4 },
359*4882a593Smuzhiyun { 0xd, 0xb, 0x7, 0x7, 0x1, 0x7 },
360*4882a593Smuzhiyun },
361*4882a593Smuzhiyun
362*4882a593Smuzhiyun /* voltage swing 1, pre-emphasis 0->2 */
363*4882a593Smuzhiyun {
364*4882a593Smuzhiyun { 0x4, 0x0, 0x4, 0x6, 0x0, 0x4 },
365*4882a593Smuzhiyun { 0xa, 0x5, 0x4, 0x6, 0x0, 0x4 },
366*4882a593Smuzhiyun { 0xd, 0x8, 0x7, 0x7, 0x1, 0x7 },
367*4882a593Smuzhiyun },
368*4882a593Smuzhiyun
369*4882a593Smuzhiyun /* voltage swing 2, pre-emphasis 0->1 */
370*4882a593Smuzhiyun {
371*4882a593Smuzhiyun { 0x8, 0x0, 0x4, 0x6, 0x0, 0x4 },
372*4882a593Smuzhiyun { 0xd, 0x5, 0x7, 0x7, 0x1, 0x7 },
373*4882a593Smuzhiyun },
374*4882a593Smuzhiyun
375*4882a593Smuzhiyun /* voltage swing 3, pre-emphasis 0 */
376*4882a593Smuzhiyun {
377*4882a593Smuzhiyun { 0xd, 0x0, 0x7, 0x7, 0x1, 0x4 },
378*4882a593Smuzhiyun }
379*4882a593Smuzhiyun };
380*4882a593Smuzhiyun
381*4882a593Smuzhiyun static struct tx_drv_ctrl tx_drv_ctrl_hbr[4][4] = {
382*4882a593Smuzhiyun /* voltage swing 0, pre-emphasis 0->3 */
383*4882a593Smuzhiyun {
384*4882a593Smuzhiyun { 0x2, 0x1, 0x4, 0x6, 0x0, 0x4 },
385*4882a593Smuzhiyun { 0x5, 0x4, 0x4, 0x6, 0x0, 0x4 },
386*4882a593Smuzhiyun { 0x9, 0x8, 0x4, 0x6, 0x0, 0x4 },
387*4882a593Smuzhiyun { 0xd, 0xb, 0x7, 0x7, 0x1, 0x7 },
388*4882a593Smuzhiyun },
389*4882a593Smuzhiyun
390*4882a593Smuzhiyun /* voltage swing 1, pre-emphasis 0->2 */
391*4882a593Smuzhiyun {
392*4882a593Smuzhiyun { 0x6, 0x1, 0x4, 0x6, 0x0, 0x4 },
393*4882a593Smuzhiyun { 0xb, 0x6, 0x4, 0x6, 0x0, 0x4 },
394*4882a593Smuzhiyun { 0xd, 0x8, 0x7, 0x7, 0x1, 0x7 },
395*4882a593Smuzhiyun },
396*4882a593Smuzhiyun
397*4882a593Smuzhiyun /* voltage swing 2, pre-emphasis 0->1 */
398*4882a593Smuzhiyun {
399*4882a593Smuzhiyun { 0x9, 0x1, 0x4, 0x6, 0x0, 0x4 },
400*4882a593Smuzhiyun { 0xd, 0x6, 0x7, 0x7, 0x1, 0x7 },
401*4882a593Smuzhiyun },
402*4882a593Smuzhiyun
403*4882a593Smuzhiyun /* voltage swing 3, pre-emphasis 0 */
404*4882a593Smuzhiyun {
405*4882a593Smuzhiyun { 0xd, 0x1, 0x7, 0x7, 0x1, 0x4 },
406*4882a593Smuzhiyun }
407*4882a593Smuzhiyun };
408*4882a593Smuzhiyun
409*4882a593Smuzhiyun static struct tx_drv_ctrl tx_drv_ctrl_hbr2[4][4] = {
410*4882a593Smuzhiyun /* voltage swing 0, pre-emphasis 0->3 */
411*4882a593Smuzhiyun {
412*4882a593Smuzhiyun { 0x2, 0x1, 0x4, 0x6, 0x0, 0x4 },
413*4882a593Smuzhiyun { 0x5, 0x4, 0x4, 0x6, 0x0, 0x4 },
414*4882a593Smuzhiyun { 0x9, 0x8, 0x4, 0x6, 0x1, 0x4 },
415*4882a593Smuzhiyun { 0xd, 0xb, 0x7, 0x7, 0x1, 0x7 },
416*4882a593Smuzhiyun },
417*4882a593Smuzhiyun
418*4882a593Smuzhiyun /* voltage swing 1, pre-emphasis 0->2 */
419*4882a593Smuzhiyun {
420*4882a593Smuzhiyun { 0x6, 0x1, 0x4, 0x6, 0x0, 0x4 },
421*4882a593Smuzhiyun { 0xc, 0x7, 0x4, 0x6, 0x0, 0x4 },
422*4882a593Smuzhiyun { 0xd, 0x8, 0x7, 0x7, 0x1, 0x7 },
423*4882a593Smuzhiyun },
424*4882a593Smuzhiyun
425*4882a593Smuzhiyun /* voltage swing 2, pre-emphasis 0->1 */
426*4882a593Smuzhiyun {
427*4882a593Smuzhiyun { 0x9, 0x1, 0x4, 0x6, 0x0, 0x4 },
428*4882a593Smuzhiyun { 0xd, 0x6, 0x7, 0x7, 0x1, 0x7 },
429*4882a593Smuzhiyun },
430*4882a593Smuzhiyun
431*4882a593Smuzhiyun /* voltage swing 3, pre-emphasis 0 */
432*4882a593Smuzhiyun {
433*4882a593Smuzhiyun { 0xd, 0x0, 0x7, 0x7, 0x1, 0x4 },
434*4882a593Smuzhiyun }
435*4882a593Smuzhiyun };
436*4882a593Smuzhiyun
rockchip_hdptx_phy_parse_training_table(struct device * dev)437*4882a593Smuzhiyun static int rockchip_hdptx_phy_parse_training_table(struct device *dev)
438*4882a593Smuzhiyun {
439*4882a593Smuzhiyun size_t size = sizeof(struct tx_drv_ctrl) * 10;
440*4882a593Smuzhiyun u8 *buf, *training_table;
441*4882a593Smuzhiyun int i, j;
442*4882a593Smuzhiyun
443*4882a593Smuzhiyun buf = kzalloc(size, GFP_KERNEL);
444*4882a593Smuzhiyun if (!buf)
445*4882a593Smuzhiyun return -ENOMEM;
446*4882a593Smuzhiyun
447*4882a593Smuzhiyun if (device_property_read_u8_array(dev, "training-table", buf, size)) {
448*4882a593Smuzhiyun kfree(buf);
449*4882a593Smuzhiyun return 0;
450*4882a593Smuzhiyun }
451*4882a593Smuzhiyun
452*4882a593Smuzhiyun training_table = buf;
453*4882a593Smuzhiyun
454*4882a593Smuzhiyun for (i = 0; i < 4; i++) {
455*4882a593Smuzhiyun for (j = 0; j < 4; j++) {
456*4882a593Smuzhiyun struct tx_drv_ctrl *ctrl;
457*4882a593Smuzhiyun
458*4882a593Smuzhiyun if (i + j > 3)
459*4882a593Smuzhiyun continue;
460*4882a593Smuzhiyun
461*4882a593Smuzhiyun ctrl = (struct tx_drv_ctrl *)training_table;
462*4882a593Smuzhiyun tx_drv_ctrl_rbr[i][j] = *ctrl;
463*4882a593Smuzhiyun tx_drv_ctrl_hbr[i][j] = *ctrl;
464*4882a593Smuzhiyun tx_drv_ctrl_hbr2[i][j] = *ctrl;
465*4882a593Smuzhiyun training_table += sizeof(*ctrl);
466*4882a593Smuzhiyun }
467*4882a593Smuzhiyun }
468*4882a593Smuzhiyun
469*4882a593Smuzhiyun kfree(buf);
470*4882a593Smuzhiyun
471*4882a593Smuzhiyun return 0;
472*4882a593Smuzhiyun }
473*4882a593Smuzhiyun
rockchip_grf_write(struct regmap * grf,unsigned int reg,unsigned int mask,unsigned int val)474*4882a593Smuzhiyun static int rockchip_grf_write(struct regmap *grf, unsigned int reg,
475*4882a593Smuzhiyun unsigned int mask, unsigned int val)
476*4882a593Smuzhiyun {
477*4882a593Smuzhiyun return regmap_write(grf, reg, (mask << 16) | (val & mask));
478*4882a593Smuzhiyun }
479*4882a593Smuzhiyun
rockchip_hdptx_phy_set_mode(struct phy * phy,enum phy_mode mode,int submode)480*4882a593Smuzhiyun static int rockchip_hdptx_phy_set_mode(struct phy *phy, enum phy_mode mode,
481*4882a593Smuzhiyun int submode)
482*4882a593Smuzhiyun {
483*4882a593Smuzhiyun return 0;
484*4882a593Smuzhiyun }
485*4882a593Smuzhiyun
rockchip_hdptx_phy_verify_config(struct rockchip_hdptx_phy * hdptx,struct phy_configure_opts_dp * dp)486*4882a593Smuzhiyun static int rockchip_hdptx_phy_verify_config(struct rockchip_hdptx_phy *hdptx,
487*4882a593Smuzhiyun struct phy_configure_opts_dp *dp)
488*4882a593Smuzhiyun {
489*4882a593Smuzhiyun int i;
490*4882a593Smuzhiyun
491*4882a593Smuzhiyun if (dp->set_rate) {
492*4882a593Smuzhiyun switch (dp->link_rate) {
493*4882a593Smuzhiyun case 1620:
494*4882a593Smuzhiyun case 2700:
495*4882a593Smuzhiyun case 5400:
496*4882a593Smuzhiyun break;
497*4882a593Smuzhiyun default:
498*4882a593Smuzhiyun return -EINVAL;
499*4882a593Smuzhiyun }
500*4882a593Smuzhiyun }
501*4882a593Smuzhiyun
502*4882a593Smuzhiyun switch (dp->lanes) {
503*4882a593Smuzhiyun case 0:
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
559*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, LANE_REG(lane, 0x0c10),
560*4882a593Smuzhiyun OVRD_LN_TX_DRV_POST_LVL_CTRL |
561*4882a593Smuzhiyun LN_TX_DRV_POST_LVL_CTRL,
562*4882a593Smuzhiyun FIELD_PREP(OVRD_LN_TX_DRV_POST_LVL_CTRL, 0x1) |
563*4882a593Smuzhiyun FIELD_PREP(LN_TX_DRV_POST_LVL_CTRL,
564*4882a593Smuzhiyun ctrl->tx_drv_post_lvl_ctrl));
565*4882a593Smuzhiyun
566*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, LANE_REG(lane, 0x0c18),
567*4882a593Smuzhiyun LN_ANA_TX_DRV_IDRV_IDN_CTRL |
568*4882a593Smuzhiyun LN_ANA_TX_DRV_IDRV_IUP_CTRL |
569*4882a593Smuzhiyun LN_ANA_TX_DRV_ACCDRV_EN,
570*4882a593Smuzhiyun FIELD_PREP(LN_ANA_TX_DRV_IDRV_IDN_CTRL,
571*4882a593Smuzhiyun ctrl->ana_tx_drv_idrv_idn_ctrl) |
572*4882a593Smuzhiyun FIELD_PREP(LN_ANA_TX_DRV_IDRV_IUP_CTRL,
573*4882a593Smuzhiyun ctrl->ana_tx_drv_idrv_iup_ctrl) |
574*4882a593Smuzhiyun FIELD_PREP(LN_ANA_TX_DRV_ACCDRV_EN,
575*4882a593Smuzhiyun ctrl->ana_tx_drv_accdrv_en));
576*4882a593Smuzhiyun
577*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, LANE_REG(lane, 0x0c1c),
578*4882a593Smuzhiyun LN_ANA_TX_DRV_ACCDRV_POL_SEL |
579*4882a593Smuzhiyun LN_ANA_TX_DRV_ACCDRV_CTRL,
580*4882a593Smuzhiyun FIELD_PREP(LN_ANA_TX_DRV_ACCDRV_POL_SEL, 0x1) |
581*4882a593Smuzhiyun FIELD_PREP(LN_ANA_TX_DRV_ACCDRV_CTRL,
582*4882a593Smuzhiyun ctrl->ana_tx_drv_accdrv_ctrl));
583*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, LANE_REG(lane, 0x0c6c),
584*4882a593Smuzhiyun LN_ANA_TX_RESERVED,
585*4882a593Smuzhiyun FIELD_PREP(LN_ANA_TX_RESERVED, 0x1));
586*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, LANE_REG(lane, 0x0c58),
587*4882a593Smuzhiyun LN_ANA_TX_SER_VREG_GAIN_CTRL,
588*4882a593Smuzhiyun FIELD_PREP(LN_ANA_TX_SER_VREG_GAIN_CTRL, 0x2));
589*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, LANE_REG(lane, 0x0c40),
590*4882a593Smuzhiyun LN_ANA_TX_SYNC_LOSS_DET_MODE,
591*4882a593Smuzhiyun FIELD_PREP(LN_ANA_TX_SYNC_LOSS_DET_MODE, 0x3));
592*4882a593Smuzhiyun }
593*4882a593Smuzhiyun
rockchip_hdptx_phy_set_voltages(struct rockchip_hdptx_phy * hdptx,struct phy_configure_opts_dp * dp)594*4882a593Smuzhiyun static int rockchip_hdptx_phy_set_voltages(struct rockchip_hdptx_phy *hdptx,
595*4882a593Smuzhiyun struct phy_configure_opts_dp *dp)
596*4882a593Smuzhiyun {
597*4882a593Smuzhiyun u8 lane;
598*4882a593Smuzhiyun u32 status;
599*4882a593Smuzhiyun int ret;
600*4882a593Smuzhiyun
601*4882a593Smuzhiyun for (lane = 0; lane < dp->lanes; lane++)
602*4882a593Smuzhiyun rockchip_hdptx_phy_set_voltage(hdptx, dp, lane);
603*4882a593Smuzhiyun
604*4882a593Smuzhiyun reset_control_deassert(hdptx->lane_reset);
605*4882a593Smuzhiyun
606*4882a593Smuzhiyun ret = regmap_read_poll_timeout(hdptx->grf, HDPTXPHY_GRF_STATUS0,
607*4882a593Smuzhiyun status, FIELD_GET(PHY_RDY, status),
608*4882a593Smuzhiyun 50, 5000);
609*4882a593Smuzhiyun if (ret) {
610*4882a593Smuzhiyun dev_err(hdptx->dev, "timeout waiting for phy_rdy\n");
611*4882a593Smuzhiyun return ret;
612*4882a593Smuzhiyun }
613*4882a593Smuzhiyun
614*4882a593Smuzhiyun return 0;
615*4882a593Smuzhiyun }
616*4882a593Smuzhiyun
rockchip_hdptx_phy_lane_disable(struct rockchip_hdptx_phy * hdptx)617*4882a593Smuzhiyun static void rockchip_hdptx_phy_lane_disable(struct rockchip_hdptx_phy *hdptx)
618*4882a593Smuzhiyun {
619*4882a593Smuzhiyun reset_control_assert(hdptx->lane_reset);
620*4882a593Smuzhiyun
621*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x081c, LANE_EN,
622*4882a593Smuzhiyun FIELD_PREP(LANE_EN, 0x0));
623*4882a593Smuzhiyun
624*4882a593Smuzhiyun rockchip_grf_write(hdptx->grf, HDPTXPHY_GRF_CON0, PLL_EN,
625*4882a593Smuzhiyun FIELD_PREP(PLL_EN, 0x0));
626*4882a593Smuzhiyun
627*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x0020, OVRD_LCPLL_EN | LCPLL_EN,
628*4882a593Smuzhiyun FIELD_PREP(OVRD_LCPLL_EN, 0x1) |
629*4882a593Smuzhiyun FIELD_PREP(LCPLL_EN, 0x0));
630*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x00f4, OVRD_ROPLL_EN | ROPLL_EN,
631*4882a593Smuzhiyun FIELD_PREP(OVRD_ROPLL_EN, 0x1) |
632*4882a593Smuzhiyun FIELD_PREP(ROPLL_EN, 0x0));
633*4882a593Smuzhiyun }
634*4882a593Smuzhiyun
rockchip_hdptx_phy_set_lanes(struct rockchip_hdptx_phy * hdptx,struct phy_configure_opts_dp * dp)635*4882a593Smuzhiyun static int rockchip_hdptx_phy_set_lanes(struct rockchip_hdptx_phy *hdptx,
636*4882a593Smuzhiyun struct phy_configure_opts_dp *dp)
637*4882a593Smuzhiyun {
638*4882a593Smuzhiyun if (!dp->lanes) {
639*4882a593Smuzhiyun rockchip_hdptx_phy_lane_disable(hdptx);
640*4882a593Smuzhiyun return 0;
641*4882a593Smuzhiyun }
642*4882a593Smuzhiyun
643*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x081c, LANE_EN,
644*4882a593Smuzhiyun FIELD_PREP(LANE_EN, GENMASK(dp->lanes - 1, 0)));
645*4882a593Smuzhiyun
646*4882a593Smuzhiyun return 0;
647*4882a593Smuzhiyun }
648*4882a593Smuzhiyun
rockchip_hdptx_phy_set_rate(struct rockchip_hdptx_phy * hdptx,struct phy_configure_opts_dp * dp)649*4882a593Smuzhiyun static int rockchip_hdptx_phy_set_rate(struct rockchip_hdptx_phy *hdptx,
650*4882a593Smuzhiyun struct phy_configure_opts_dp *dp)
651*4882a593Smuzhiyun {
652*4882a593Smuzhiyun u32 bw, status;
653*4882a593Smuzhiyun int ret;
654*4882a593Smuzhiyun
655*4882a593Smuzhiyun rockchip_grf_write(hdptx->grf, HDPTXPHY_GRF_CON0, PLL_EN,
656*4882a593Smuzhiyun FIELD_PREP(PLL_EN, 0x0));
657*4882a593Smuzhiyun
658*4882a593Smuzhiyun switch (dp->link_rate) {
659*4882a593Smuzhiyun case 1620:
660*4882a593Smuzhiyun bw = DP_BW_RBR;
661*4882a593Smuzhiyun break;
662*4882a593Smuzhiyun case 2700:
663*4882a593Smuzhiyun bw = DP_BW_HBR;
664*4882a593Smuzhiyun break;
665*4882a593Smuzhiyun case 5400:
666*4882a593Smuzhiyun bw = DP_BW_HBR2;
667*4882a593Smuzhiyun break;
668*4882a593Smuzhiyun default:
669*4882a593Smuzhiyun return -EINVAL;
670*4882a593Smuzhiyun }
671*4882a593Smuzhiyun
672*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x0254, DP_TX_LINK_BW,
673*4882a593Smuzhiyun FIELD_PREP(DP_TX_LINK_BW, bw));
674*4882a593Smuzhiyun
675*4882a593Smuzhiyun if (dp->ssc) {
676*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x01d0,
677*4882a593Smuzhiyun OVRD_ROPLL_SSC_EN | ROPLL_SSC_EN,
678*4882a593Smuzhiyun FIELD_PREP(OVRD_ROPLL_SSC_EN, 0x1) |
679*4882a593Smuzhiyun FIELD_PREP(ROPLL_SSC_EN, 0x1));
680*4882a593Smuzhiyun regmap_write(hdptx->regmap, 0x01d4,
681*4882a593Smuzhiyun FIELD_PREP(ANA_ROPLL_SSC_FM_DEVIATION, 0xc));
682*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x01d8,
683*4882a593Smuzhiyun ANA_ROPLL_SSC_FM_FREQ,
684*4882a593Smuzhiyun FIELD_PREP(ANA_ROPLL_SSC_FM_FREQ, 0x1f));
685*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x0264, SSC_EN,
686*4882a593Smuzhiyun FIELD_PREP(SSC_EN, 0x2));
687*4882a593Smuzhiyun } else {
688*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x01d0,
689*4882a593Smuzhiyun OVRD_ROPLL_SSC_EN | ROPLL_SSC_EN,
690*4882a593Smuzhiyun FIELD_PREP(OVRD_ROPLL_SSC_EN, 0x1) |
691*4882a593Smuzhiyun FIELD_PREP(ROPLL_SSC_EN, 0x0));
692*4882a593Smuzhiyun regmap_write(hdptx->regmap, 0x01d4,
693*4882a593Smuzhiyun FIELD_PREP(ANA_ROPLL_SSC_FM_DEVIATION, 0x20));
694*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x01d8,
695*4882a593Smuzhiyun ANA_ROPLL_SSC_FM_FREQ,
696*4882a593Smuzhiyun FIELD_PREP(ANA_ROPLL_SSC_FM_FREQ, 0xc));
697*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x0264, SSC_EN,
698*4882a593Smuzhiyun FIELD_PREP(SSC_EN, 0x0));
699*4882a593Smuzhiyun }
700*4882a593Smuzhiyun
701*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x0020, OVRD_LCPLL_EN | LCPLL_EN,
702*4882a593Smuzhiyun FIELD_PREP(OVRD_LCPLL_EN, 0x1) |
703*4882a593Smuzhiyun FIELD_PREP(LCPLL_EN, 0x0));
704*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x00f4, OVRD_ROPLL_EN | ROPLL_EN,
705*4882a593Smuzhiyun FIELD_PREP(OVRD_ROPLL_EN, 0x1) |
706*4882a593Smuzhiyun FIELD_PREP(ROPLL_EN, 0x1));
707*4882a593Smuzhiyun
708*4882a593Smuzhiyun rockchip_grf_write(hdptx->grf, HDPTXPHY_GRF_CON0, PLL_EN,
709*4882a593Smuzhiyun FIELD_PREP(PLL_EN, 0x1));
710*4882a593Smuzhiyun
711*4882a593Smuzhiyun ret = regmap_read_poll_timeout(hdptx->grf, HDPTXPHY_GRF_STATUS0,
712*4882a593Smuzhiyun status, FIELD_GET(PLL_LOCK_DONE, status),
713*4882a593Smuzhiyun 50, 1000);
714*4882a593Smuzhiyun if (ret) {
715*4882a593Smuzhiyun dev_err(hdptx->dev, "timeout waiting for pll_lock_done\n");
716*4882a593Smuzhiyun return ret;
717*4882a593Smuzhiyun }
718*4882a593Smuzhiyun
719*4882a593Smuzhiyun return 0;
720*4882a593Smuzhiyun }
721*4882a593Smuzhiyun
rockchip_hdptx_phy_configure(struct phy * phy,union phy_configure_opts * opts)722*4882a593Smuzhiyun static int rockchip_hdptx_phy_configure(struct phy *phy,
723*4882a593Smuzhiyun union phy_configure_opts *opts)
724*4882a593Smuzhiyun {
725*4882a593Smuzhiyun struct rockchip_hdptx_phy *hdptx = phy_get_drvdata(phy);
726*4882a593Smuzhiyun enum phy_mode mode = phy_get_mode(phy);
727*4882a593Smuzhiyun int ret;
728*4882a593Smuzhiyun
729*4882a593Smuzhiyun if (mode != PHY_MODE_DP)
730*4882a593Smuzhiyun return -EINVAL;
731*4882a593Smuzhiyun
732*4882a593Smuzhiyun ret = rockchip_hdptx_phy_verify_config(hdptx, &opts->dp);
733*4882a593Smuzhiyun if (ret) {
734*4882a593Smuzhiyun dev_err(hdptx->dev, "invalid params for phy configure\n");
735*4882a593Smuzhiyun return ret;
736*4882a593Smuzhiyun }
737*4882a593Smuzhiyun
738*4882a593Smuzhiyun if (opts->dp.set_rate) {
739*4882a593Smuzhiyun ret = rockchip_hdptx_phy_set_rate(hdptx, &opts->dp);
740*4882a593Smuzhiyun if (ret) {
741*4882a593Smuzhiyun dev_err(hdptx->dev, "failed to set rate: %d\n", ret);
742*4882a593Smuzhiyun return ret;
743*4882a593Smuzhiyun }
744*4882a593Smuzhiyun }
745*4882a593Smuzhiyun
746*4882a593Smuzhiyun if (opts->dp.set_lanes) {
747*4882a593Smuzhiyun ret = rockchip_hdptx_phy_set_lanes(hdptx, &opts->dp);
748*4882a593Smuzhiyun if (ret) {
749*4882a593Smuzhiyun dev_err(hdptx->dev, "failed to set lanes: %d\n", ret);
750*4882a593Smuzhiyun return ret;
751*4882a593Smuzhiyun }
752*4882a593Smuzhiyun }
753*4882a593Smuzhiyun
754*4882a593Smuzhiyun if (opts->dp.set_voltages) {
755*4882a593Smuzhiyun ret = rockchip_hdptx_phy_set_voltages(hdptx, &opts->dp);
756*4882a593Smuzhiyun if (ret) {
757*4882a593Smuzhiyun dev_err(hdptx->dev, "failed to set voltages: %d\n",
758*4882a593Smuzhiyun ret);
759*4882a593Smuzhiyun return ret;
760*4882a593Smuzhiyun }
761*4882a593Smuzhiyun }
762*4882a593Smuzhiyun
763*4882a593Smuzhiyun return 0;
764*4882a593Smuzhiyun }
765*4882a593Smuzhiyun
rockchip_hdptx_phy_dp_pll_init(struct rockchip_hdptx_phy * hdptx)766*4882a593Smuzhiyun static void rockchip_hdptx_phy_dp_pll_init(struct rockchip_hdptx_phy *hdptx)
767*4882a593Smuzhiyun {
768*4882a593Smuzhiyun regmap_write(hdptx->regmap, 0x0144, FIELD_PREP(ROPLL_PMS_MDIV, 0x87));
769*4882a593Smuzhiyun regmap_write(hdptx->regmap, 0x0148, FIELD_PREP(ROPLL_PMS_MDIV, 0x71));
770*4882a593Smuzhiyun regmap_write(hdptx->regmap, 0x014c, FIELD_PREP(ROPLL_PMS_MDIV, 0x71));
771*4882a593Smuzhiyun
772*4882a593Smuzhiyun regmap_write(hdptx->regmap, 0x0154,
773*4882a593Smuzhiyun FIELD_PREP(ROPLL_PMS_MDIV_AFC, 0x87));
774*4882a593Smuzhiyun regmap_write(hdptx->regmap, 0x0158,
775*4882a593Smuzhiyun FIELD_PREP(ROPLL_PMS_MDIV_AFC, 0x71));
776*4882a593Smuzhiyun regmap_write(hdptx->regmap, 0x015c,
777*4882a593Smuzhiyun FIELD_PREP(ROPLL_PMS_MDIV_AFC, 0x71));
778*4882a593Smuzhiyun
779*4882a593Smuzhiyun regmap_write(hdptx->regmap, 0x0164,
780*4882a593Smuzhiyun FIELD_PREP(ANA_ROPLL_PMS_PDIV, 0x1) |
781*4882a593Smuzhiyun FIELD_PREP(ANA_ROPLL_PMS_REFDIV, 0x1));
782*4882a593Smuzhiyun
783*4882a593Smuzhiyun regmap_write(hdptx->regmap, 0x0168,
784*4882a593Smuzhiyun FIELD_PREP(ROPLL_PMS_SDIV_RBR, 0x3) |
785*4882a593Smuzhiyun FIELD_PREP(ROPLL_PMS_SDIV_HBR, 0x1));
786*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x016c, ROPLL_PMS_SDIV_HBR2,
787*4882a593Smuzhiyun FIELD_PREP(ROPLL_PMS_SDIV_HBR2, 0x0));
788*4882a593Smuzhiyun
789*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x0178, ANA_ROPLL_SDM_EN,
790*4882a593Smuzhiyun FIELD_PREP(ANA_ROPLL_SDM_EN, 0x1));
791*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x0178,
792*4882a593Smuzhiyun OVRD_ROPLL_SDM_RSTN | ROPLL_SDM_RSTN,
793*4882a593Smuzhiyun FIELD_PREP(OVRD_ROPLL_SDM_RSTN, 0x1) |
794*4882a593Smuzhiyun FIELD_PREP(ROPLL_SDM_RSTN, 0x1));
795*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x0178, ROPLL_SDC_FRACTIONAL_EN_RBR,
796*4882a593Smuzhiyun FIELD_PREP(ROPLL_SDC_FRACTIONAL_EN_RBR, 0x1));
797*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x0178, ROPLL_SDC_FRACTIONAL_EN_HBR,
798*4882a593Smuzhiyun FIELD_PREP(ROPLL_SDC_FRACTIONAL_EN_HBR, 0x1));
799*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x0178, ROPLL_SDC_FRACTIONAL_EN_HBR2,
800*4882a593Smuzhiyun FIELD_PREP(ROPLL_SDC_FRACTIONAL_EN_HBR2, 0x1));
801*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x017c,
802*4882a593Smuzhiyun OVRD_ROPLL_SDC_RSTN | ROPLL_SDC_RSTN,
803*4882a593Smuzhiyun FIELD_PREP(OVRD_ROPLL_SDC_RSTN, 0x1) |
804*4882a593Smuzhiyun FIELD_PREP(ROPLL_SDC_RSTN, 0x1));
805*4882a593Smuzhiyun
806*4882a593Smuzhiyun regmap_write(hdptx->regmap, 0x0180,
807*4882a593Smuzhiyun FIELD_PREP(ROPLL_SDM_DENOMINATOR, 0x21));
808*4882a593Smuzhiyun regmap_write(hdptx->regmap, 0x0184,
809*4882a593Smuzhiyun FIELD_PREP(ROPLL_SDM_DENOMINATOR, 0x27));
810*4882a593Smuzhiyun regmap_write(hdptx->regmap, 0x0188,
811*4882a593Smuzhiyun FIELD_PREP(ROPLL_SDM_DENOMINATOR, 0x27));
812*4882a593Smuzhiyun
813*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x0190,
814*4882a593Smuzhiyun ROPLL_SDM_NUMERATOR_SIGN_RBR |
815*4882a593Smuzhiyun ROPLL_SDM_NUMERATOR_SIGN_HBR |
816*4882a593Smuzhiyun ROPLL_SDM_NUMERATOR_SIGN_HBR2,
817*4882a593Smuzhiyun FIELD_PREP(ROPLL_SDM_NUMERATOR_SIGN_RBR, 0x0) |
818*4882a593Smuzhiyun FIELD_PREP(ROPLL_SDM_NUMERATOR_SIGN_HBR, 0x1) |
819*4882a593Smuzhiyun FIELD_PREP(ROPLL_SDM_NUMERATOR_SIGN_HBR2, 0x1));
820*4882a593Smuzhiyun
821*4882a593Smuzhiyun regmap_write(hdptx->regmap, 0x0194,
822*4882a593Smuzhiyun FIELD_PREP(ROPLL_SDM_NUMERATOR, 0x0));
823*4882a593Smuzhiyun regmap_write(hdptx->regmap, 0x0198,
824*4882a593Smuzhiyun FIELD_PREP(ROPLL_SDM_NUMERATOR, 0xd));
825*4882a593Smuzhiyun regmap_write(hdptx->regmap, 0x019c,
826*4882a593Smuzhiyun FIELD_PREP(ROPLL_SDM_NUMERATOR, 0xd));
827*4882a593Smuzhiyun
828*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x01a4, ROPLL_SDC_N_RBR,
829*4882a593Smuzhiyun FIELD_PREP(ROPLL_SDC_N_RBR, 0x2));
830*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x01a8,
831*4882a593Smuzhiyun ROPLL_SDC_N_HBR | ROPLL_SDC_N_HBR2,
832*4882a593Smuzhiyun FIELD_PREP(ROPLL_SDC_N_HBR, 0x2) |
833*4882a593Smuzhiyun FIELD_PREP(ROPLL_SDC_N_HBR2, 0x2));
834*4882a593Smuzhiyun
835*4882a593Smuzhiyun regmap_write(hdptx->regmap, 0x01b0,
836*4882a593Smuzhiyun FIELD_PREP(ROPLL_SDC_NUMERATOR, 0x3));
837*4882a593Smuzhiyun regmap_write(hdptx->regmap, 0x01b4,
838*4882a593Smuzhiyun FIELD_PREP(ROPLL_SDC_NUMERATOR, 0x7));
839*4882a593Smuzhiyun regmap_write(hdptx->regmap, 0x01b8,
840*4882a593Smuzhiyun FIELD_PREP(ROPLL_SDC_NUMERATOR, 0x7));
841*4882a593Smuzhiyun
842*4882a593Smuzhiyun regmap_write(hdptx->regmap, 0x01c0,
843*4882a593Smuzhiyun FIELD_PREP(ROPLL_SDC_DENOMINATOR, 0x8));
844*4882a593Smuzhiyun regmap_write(hdptx->regmap, 0x01c4,
845*4882a593Smuzhiyun FIELD_PREP(ROPLL_SDC_DENOMINATOR, 0x18));
846*4882a593Smuzhiyun regmap_write(hdptx->regmap, 0x01c8,
847*4882a593Smuzhiyun FIELD_PREP(ROPLL_SDC_DENOMINATOR, 0x18));
848*4882a593Smuzhiyun
849*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x01d0,
850*4882a593Smuzhiyun OVRD_ROPLL_SDC_NDIV_RSTN | ROPLL_SDC_NDIV_RSTN,
851*4882a593Smuzhiyun FIELD_PREP(OVRD_ROPLL_SDC_NDIV_RSTN, 0x1) |
852*4882a593Smuzhiyun FIELD_PREP(ROPLL_SDC_NDIV_RSTN, 0x1));
853*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x01dc, ANA_ROPLL_SSC_CLK_DIV_SEL,
854*4882a593Smuzhiyun FIELD_PREP(ANA_ROPLL_SSC_CLK_DIV_SEL, 0x1));
855*4882a593Smuzhiyun
856*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x0118,
857*4882a593Smuzhiyun ROPLL_ANA_CPP_CTRL_COARSE | ROPLL_ANA_CPP_CTRL_FINE,
858*4882a593Smuzhiyun FIELD_PREP(ROPLL_ANA_CPP_CTRL_COARSE, 0xe) |
859*4882a593Smuzhiyun FIELD_PREP(ROPLL_ANA_CPP_CTRL_FINE, 0xe));
860*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x011c,
861*4882a593Smuzhiyun ROPLL_ANA_LPF_C_SEL_COARSE |
862*4882a593Smuzhiyun ROPLL_ANA_LPF_C_SEL_FINE,
863*4882a593Smuzhiyun FIELD_PREP(ROPLL_ANA_LPF_C_SEL_COARSE, 0x4) |
864*4882a593Smuzhiyun FIELD_PREP(ROPLL_ANA_LPF_C_SEL_FINE, 0x4));
865*4882a593Smuzhiyun
866*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x0204, ANA_PLL_CD_TX_SER_RATE_SEL,
867*4882a593Smuzhiyun FIELD_PREP(ANA_PLL_CD_TX_SER_RATE_SEL, 0x0));
868*4882a593Smuzhiyun
869*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x025c, DIG_CLK_SEL,
870*4882a593Smuzhiyun FIELD_PREP(DIG_CLK_SEL, 0x1));
871*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x021c, ANA_PLL_TX_HS_CLK_EN,
872*4882a593Smuzhiyun FIELD_PREP(ANA_PLL_TX_HS_CLK_EN, 0x1));
873*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x0204,
874*4882a593Smuzhiyun ANA_PLL_CD_HSCLK_EAST_EN | ANA_PLL_CD_HSCLK_WEST_EN,
875*4882a593Smuzhiyun FIELD_PREP(ANA_PLL_CD_HSCLK_EAST_EN, 0x1) |
876*4882a593Smuzhiyun FIELD_PREP(ANA_PLL_CD_HSCLK_WEST_EN, 0x0));
877*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x0264, CMN_ROPLL_ALONE_MODE,
878*4882a593Smuzhiyun FIELD_PREP(CMN_ROPLL_ALONE_MODE, 0x1));
879*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x0208, ANA_PLL_CD_VREG_GAIN_CTRL,
880*4882a593Smuzhiyun FIELD_PREP(ANA_PLL_CD_VREG_GAIN_CTRL, 0x4));
881*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x00f0, ANA_LCPLL_RESERVED7,
882*4882a593Smuzhiyun FIELD_PREP(ANA_LCPLL_RESERVED7, 0x1));
883*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x020c, ANA_PLL_CD_VREG_ICTRL,
884*4882a593Smuzhiyun FIELD_PREP(ANA_PLL_CD_VREG_ICTRL, 0x1));
885*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x0214, ANA_PLL_SYNC_LOSS_DET_MODE,
886*4882a593Smuzhiyun FIELD_PREP(ANA_PLL_SYNC_LOSS_DET_MODE, 0x3));
887*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x0210, PLL_LCRO_CLK_SEL,
888*4882a593Smuzhiyun FIELD_PREP(PLL_LCRO_CLK_SEL, 0x1));
889*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x0268, HS_SPEED_SEL,
890*4882a593Smuzhiyun FIELD_PREP(HS_SPEED_SEL, 0x1));
891*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x026c, LS_SPEED_SEL,
892*4882a593Smuzhiyun FIELD_PREP(LS_SPEED_SEL, 0x1));
893*4882a593Smuzhiyun }
894*4882a593Smuzhiyun
rockchip_hdptx_phy_dp_aux_init(struct rockchip_hdptx_phy * hdptx)895*4882a593Smuzhiyun static int rockchip_hdptx_phy_dp_aux_init(struct rockchip_hdptx_phy *hdptx)
896*4882a593Smuzhiyun {
897*4882a593Smuzhiyun u32 status;
898*4882a593Smuzhiyun int ret;
899*4882a593Smuzhiyun
900*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x0414, ANA_SB_TX_HLVL_PROG,
901*4882a593Smuzhiyun FIELD_PREP(ANA_SB_TX_HLVL_PROG, 0x7));
902*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x0418, ANA_SB_TX_LLVL_PROG,
903*4882a593Smuzhiyun FIELD_PREP(ANA_SB_TX_LLVL_PROG, 0x7));
904*4882a593Smuzhiyun
905*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x044c,
906*4882a593Smuzhiyun SB_RX_RCAL_OPT_CODE | SB_RX_RTERM_CTRL,
907*4882a593Smuzhiyun FIELD_PREP(SB_RX_RCAL_OPT_CODE, 0x1) |
908*4882a593Smuzhiyun FIELD_PREP(SB_RX_RTERM_CTRL, 0x3));
909*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x0450,
910*4882a593Smuzhiyun SB_TG_SB_EN_DELAY_TIME | SB_TG_RXTERN_EN_DELAY_TIME,
911*4882a593Smuzhiyun FIELD_PREP(SB_TG_SB_EN_DELAY_TIME, 0x2) |
912*4882a593Smuzhiyun FIELD_PREP(SB_TG_RXTERN_EN_DELAY_TIME, 0x2));
913*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x0454,
914*4882a593Smuzhiyun SB_READY_DELAY_TIME | SB_TG_OSC_EN_DELAY_TIME,
915*4882a593Smuzhiyun FIELD_PREP(SB_READY_DELAY_TIME, 0x2) |
916*4882a593Smuzhiyun FIELD_PREP(SB_TG_OSC_EN_DELAY_TIME, 0x2));
917*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x0458,
918*4882a593Smuzhiyun SB_TG_OSC_EN_TO_AFC_RSTN_DELAT_TIME,
919*4882a593Smuzhiyun FIELD_PREP(SB_TG_OSC_EN_TO_AFC_RSTN_DELAT_TIME, 0x2));
920*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x045c,
921*4882a593Smuzhiyun SB_TG_PLL_CD_VREG_FAST_PULSE_TIME,
922*4882a593Smuzhiyun FIELD_PREP(SB_TG_PLL_CD_VREG_FAST_PULSE_TIME, 0x4));
923*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x0460,
924*4882a593Smuzhiyun SB_TG_EARC_DMRX_RECVRD_CLK_CNT,
925*4882a593Smuzhiyun FIELD_PREP(SB_TG_EARC_DMRX_RECVRD_CLK_CNT, 0xa));
926*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x0468, SB_TG_CNT_RUN_NO_7_0,
927*4882a593Smuzhiyun FIELD_PREP(SB_TG_CNT_RUN_NO_7_0, 0x3));
928*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x046c,
929*4882a593Smuzhiyun SB_EARC_SIG_DET_BYPASS | SB_AFC_TOL,
930*4882a593Smuzhiyun FIELD_PREP(SB_EARC_SIG_DET_BYPASS, 0x1) |
931*4882a593Smuzhiyun FIELD_PREP(SB_AFC_TOL, 0x3));
932*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x0470, SB_AFC_STB_NUM,
933*4882a593Smuzhiyun FIELD_PREP(SB_AFC_STB_NUM, 0x4));
934*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x0474, SB_TG_OSC_CNT_MIN,
935*4882a593Smuzhiyun FIELD_PREP(SB_TG_OSC_CNT_MIN, 0x67));
936*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x0478, SB_TG_OSC_CNT_MAX,
937*4882a593Smuzhiyun FIELD_PREP(SB_TG_OSC_CNT_MAX, 0x6a));
938*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x047c, SB_PWM_AFC_CTRL,
939*4882a593Smuzhiyun FIELD_PREP(SB_PWM_AFC_CTRL, 0x5));
940*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x0434, ANA_SB_DMRX_LPBK_DATA,
941*4882a593Smuzhiyun FIELD_PREP(ANA_SB_DMRX_LPBK_DATA, 0x1));
942*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x0440,
943*4882a593Smuzhiyun ANA_SB_VREG_OUT_SEL | ANA_SB_VREG_REF_SEL,
944*4882a593Smuzhiyun FIELD_PREP(ANA_SB_VREG_OUT_SEL, 0x1) |
945*4882a593Smuzhiyun FIELD_PREP(ANA_SB_VREG_REF_SEL, 0x1));
946*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x043c, ANA_SB_VREG_GAIN_CTRL,
947*4882a593Smuzhiyun FIELD_PREP(ANA_SB_VREG_GAIN_CTRL, 0x0));
948*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x0408, ANA_SB_RXTERM_OFFSP,
949*4882a593Smuzhiyun FIELD_PREP(ANA_SB_RXTERM_OFFSP, 0x3));
950*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x040c, ANA_SB_RXTERM_OFFSN,
951*4882a593Smuzhiyun FIELD_PREP(ANA_SB_RXTERM_OFFSN, 0x3));
952*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x047c, SB_RCAL_RSTN,
953*4882a593Smuzhiyun FIELD_PREP(SB_RCAL_RSTN, 0x1));
954*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x0410, SB_AUX_EN,
955*4882a593Smuzhiyun FIELD_PREP(SB_AUX_EN, 0x1));
956*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x0480, SB_AUX_EN_IN,
957*4882a593Smuzhiyun FIELD_PREP(SB_AUX_EN_IN, 0x1));
958*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x040c, OVRD_SB_RX_RESCAL_DONE,
959*4882a593Smuzhiyun FIELD_PREP(OVRD_SB_RX_RESCAL_DONE, 0x1));
960*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x0410, OVRD_SB_EN,
961*4882a593Smuzhiyun FIELD_PREP(OVRD_SB_EN, 0x1));
962*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x0408, OVRD_SB_RXTERM_EN,
963*4882a593Smuzhiyun FIELD_PREP(OVRD_SB_RXTERM_EN, 0x1));
964*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x043c, OVRD_SB_VREG_EN,
965*4882a593Smuzhiyun FIELD_PREP(OVRD_SB_VREG_EN, 0x1));
966*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x0410, OVRD_SB_AUX_EN,
967*4882a593Smuzhiyun FIELD_PREP(OVRD_SB_AUX_EN, 0x1));
968*4882a593Smuzhiyun
969*4882a593Smuzhiyun rockchip_grf_write(hdptx->grf, HDPTXPHY_GRF_CON0, BGR_EN,
970*4882a593Smuzhiyun FIELD_PREP(BGR_EN, 0x1));
971*4882a593Smuzhiyun rockchip_grf_write(hdptx->grf, HDPTXPHY_GRF_CON0, BIAS_EN,
972*4882a593Smuzhiyun FIELD_PREP(BIAS_EN, 0x1));
973*4882a593Smuzhiyun udelay(20);
974*4882a593Smuzhiyun
975*4882a593Smuzhiyun reset_control_deassert(hdptx->init_reset);
976*4882a593Smuzhiyun udelay(20);
977*4882a593Smuzhiyun reset_control_deassert(hdptx->cmn_reset);
978*4882a593Smuzhiyun udelay(20);
979*4882a593Smuzhiyun
980*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x040c, SB_RX_RESCAL_DONE,
981*4882a593Smuzhiyun FIELD_PREP(SB_RX_RESCAL_DONE, 0x1));
982*4882a593Smuzhiyun udelay(100);
983*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x0410, SB_EN,
984*4882a593Smuzhiyun FIELD_PREP(SB_EN, 0x1));
985*4882a593Smuzhiyun udelay(100);
986*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x0408, SB_RXRERM_EN,
987*4882a593Smuzhiyun FIELD_PREP(SB_RXRERM_EN, 0x1));
988*4882a593Smuzhiyun udelay(20);
989*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x043c, SB_VREG_EN,
990*4882a593Smuzhiyun FIELD_PREP(SB_VREG_EN, 0x1));
991*4882a593Smuzhiyun udelay(20);
992*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x0410, SB_AUX_EN,
993*4882a593Smuzhiyun FIELD_PREP(SB_AUX_EN, 0x1));
994*4882a593Smuzhiyun udelay(100);
995*4882a593Smuzhiyun
996*4882a593Smuzhiyun ret = regmap_read_poll_timeout(hdptx->grf, HDPTXPHY_GRF_STATUS0,
997*4882a593Smuzhiyun status, FIELD_GET(SB_RDY, status),
998*4882a593Smuzhiyun 50, 1000);
999*4882a593Smuzhiyun if (ret) {
1000*4882a593Smuzhiyun dev_err(hdptx->dev, "timeout waiting for sb_rdy\n");
1001*4882a593Smuzhiyun return ret;
1002*4882a593Smuzhiyun }
1003*4882a593Smuzhiyun
1004*4882a593Smuzhiyun return 0;
1005*4882a593Smuzhiyun }
1006*4882a593Smuzhiyun
rockchip_hdptx_phy_reset(struct rockchip_hdptx_phy * hdptx)1007*4882a593Smuzhiyun static void rockchip_hdptx_phy_reset(struct rockchip_hdptx_phy *hdptx)
1008*4882a593Smuzhiyun {
1009*4882a593Smuzhiyun u32 lane;
1010*4882a593Smuzhiyun
1011*4882a593Smuzhiyun reset_control_assert(hdptx->lane_reset);
1012*4882a593Smuzhiyun reset_control_assert(hdptx->cmn_reset);
1013*4882a593Smuzhiyun reset_control_assert(hdptx->init_reset);
1014*4882a593Smuzhiyun
1015*4882a593Smuzhiyun reset_control_assert(hdptx->apb_reset);
1016*4882a593Smuzhiyun udelay(10);
1017*4882a593Smuzhiyun reset_control_deassert(hdptx->apb_reset);
1018*4882a593Smuzhiyun
1019*4882a593Smuzhiyun for (lane = 0; lane < 4; lane++)
1020*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, LANE_REG(lane, 0x0c04),
1021*4882a593Smuzhiyun OVRD_LN_TX_DRV_EI_EN | LN_TX_DRV_EI_EN,
1022*4882a593Smuzhiyun FIELD_PREP(OVRD_LN_TX_DRV_EI_EN, 1) |
1023*4882a593Smuzhiyun FIELD_PREP(LN_TX_DRV_EI_EN, 0));
1024*4882a593Smuzhiyun
1025*4882a593Smuzhiyun rockchip_grf_write(hdptx->grf, HDPTXPHY_GRF_CON0, PLL_EN,
1026*4882a593Smuzhiyun FIELD_PREP(PLL_EN, 0));
1027*4882a593Smuzhiyun rockchip_grf_write(hdptx->grf, HDPTXPHY_GRF_CON0, BIAS_EN,
1028*4882a593Smuzhiyun FIELD_PREP(BIAS_EN, 0));
1029*4882a593Smuzhiyun rockchip_grf_write(hdptx->grf, HDPTXPHY_GRF_CON0, BGR_EN,
1030*4882a593Smuzhiyun FIELD_PREP(BGR_EN, 0));
1031*4882a593Smuzhiyun }
1032*4882a593Smuzhiyun
rockchip_hdptx_phy_enabled(struct rockchip_hdptx_phy * hdptx)1033*4882a593Smuzhiyun static bool rockchip_hdptx_phy_enabled(struct rockchip_hdptx_phy *hdptx)
1034*4882a593Smuzhiyun {
1035*4882a593Smuzhiyun u32 status;
1036*4882a593Smuzhiyun
1037*4882a593Smuzhiyun regmap_read(hdptx->grf, HDPTXPHY_GRF_STATUS0, &status);
1038*4882a593Smuzhiyun
1039*4882a593Smuzhiyun return FIELD_GET(SB_RDY, status);
1040*4882a593Smuzhiyun }
1041*4882a593Smuzhiyun
rockchip_hdptx_phy_power_on(struct phy * phy)1042*4882a593Smuzhiyun static int rockchip_hdptx_phy_power_on(struct phy *phy)
1043*4882a593Smuzhiyun {
1044*4882a593Smuzhiyun struct rockchip_hdptx_phy *hdptx = phy_get_drvdata(phy);
1045*4882a593Smuzhiyun enum phy_mode mode = phy_get_mode(phy);
1046*4882a593Smuzhiyun u32 lane;
1047*4882a593Smuzhiyun int ret;
1048*4882a593Smuzhiyun
1049*4882a593Smuzhiyun ret = clk_bulk_prepare_enable(hdptx->nr_clks, hdptx->clks);
1050*4882a593Smuzhiyun if (ret)
1051*4882a593Smuzhiyun return ret;
1052*4882a593Smuzhiyun
1053*4882a593Smuzhiyun if (rockchip_hdptx_phy_enabled(hdptx))
1054*4882a593Smuzhiyun return 0;
1055*4882a593Smuzhiyun
1056*4882a593Smuzhiyun rockchip_hdptx_phy_reset(hdptx);
1057*4882a593Smuzhiyun
1058*4882a593Smuzhiyun for (lane = 0; lane < 4; lane++) {
1059*4882a593Smuzhiyun u32 invert = hdptx->lane_polarity_invert[lane];
1060*4882a593Smuzhiyun
1061*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, LANE_REG(lane, 0x0c78),
1062*4882a593Smuzhiyun LN_POLARITY_INV,
1063*4882a593Smuzhiyun FIELD_PREP(LN_POLARITY_INV, invert));
1064*4882a593Smuzhiyun }
1065*4882a593Smuzhiyun
1066*4882a593Smuzhiyun if (mode == PHY_MODE_DP) {
1067*4882a593Smuzhiyun rockchip_grf_write(hdptx->grf, HDPTXPHY_GRF_CON0,
1068*4882a593Smuzhiyun HDPTX_MODE_SEL,
1069*4882a593Smuzhiyun FIELD_PREP(HDPTX_MODE_SEL, 0x1));
1070*4882a593Smuzhiyun
1071*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x0800, PROTOCOL_SEL,
1072*4882a593Smuzhiyun FIELD_PREP(PROTOCOL_SEL, 0x0));
1073*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x0818, DATA_BUS_WIDTH,
1074*4882a593Smuzhiyun FIELD_PREP(DATA_BUS_WIDTH, 0x1));
1075*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x0818, BUS_WIDTH_SEL,
1076*4882a593Smuzhiyun FIELD_PREP(BUS_WIDTH_SEL, 0x0));
1077*4882a593Smuzhiyun
1078*4882a593Smuzhiyun rockchip_hdptx_phy_dp_pll_init(hdptx);
1079*4882a593Smuzhiyun rockchip_hdptx_phy_dp_aux_init(hdptx);
1080*4882a593Smuzhiyun } else {
1081*4882a593Smuzhiyun rockchip_grf_write(hdptx->grf, HDPTXPHY_GRF_CON0,
1082*4882a593Smuzhiyun HDPTX_MODE_SEL,
1083*4882a593Smuzhiyun FIELD_PREP(HDPTX_MODE_SEL, 0x0));
1084*4882a593Smuzhiyun
1085*4882a593Smuzhiyun regmap_update_bits(hdptx->regmap, 0x0800, PROTOCOL_SEL,
1086*4882a593Smuzhiyun FIELD_PREP(PROTOCOL_SEL, 0x1));
1087*4882a593Smuzhiyun }
1088*4882a593Smuzhiyun
1089*4882a593Smuzhiyun return 0;
1090*4882a593Smuzhiyun }
1091*4882a593Smuzhiyun
rockchip_hdptx_phy_power_off(struct phy * phy)1092*4882a593Smuzhiyun static int rockchip_hdptx_phy_power_off(struct phy *phy)
1093*4882a593Smuzhiyun {
1094*4882a593Smuzhiyun struct rockchip_hdptx_phy *hdptx = phy_get_drvdata(phy);
1095*4882a593Smuzhiyun
1096*4882a593Smuzhiyun rockchip_hdptx_phy_reset(hdptx);
1097*4882a593Smuzhiyun
1098*4882a593Smuzhiyun clk_bulk_disable_unprepare(hdptx->nr_clks, hdptx->clks);
1099*4882a593Smuzhiyun
1100*4882a593Smuzhiyun return 0;
1101*4882a593Smuzhiyun }
1102*4882a593Smuzhiyun
1103*4882a593Smuzhiyun static const struct phy_ops rockchip_hdptx_phy_ops = {
1104*4882a593Smuzhiyun .set_mode = rockchip_hdptx_phy_set_mode,
1105*4882a593Smuzhiyun .configure = rockchip_hdptx_phy_configure,
1106*4882a593Smuzhiyun .power_on = rockchip_hdptx_phy_power_on,
1107*4882a593Smuzhiyun .power_off = rockchip_hdptx_phy_power_off,
1108*4882a593Smuzhiyun .owner = THIS_MODULE,
1109*4882a593Smuzhiyun };
1110*4882a593Smuzhiyun
rockchip_hdptx_phy_is_accissible_reg(struct device * dev,unsigned int reg)1111*4882a593Smuzhiyun static bool rockchip_hdptx_phy_is_accissible_reg(struct device *dev,
1112*4882a593Smuzhiyun unsigned int reg)
1113*4882a593Smuzhiyun {
1114*4882a593Smuzhiyun switch (reg) {
1115*4882a593Smuzhiyun case 0x0000 ... 0x029c: /* CMN Register */
1116*4882a593Smuzhiyun case 0x0400 ... 0x04a4: /* Sideband Register */
1117*4882a593Smuzhiyun case 0x0800 ... 0x08a4: /* Lane Top Register */
1118*4882a593Smuzhiyun case 0x0c00 ... 0x0cb4: /* Lane 0 Register */
1119*4882a593Smuzhiyun case 0x1000 ... 0x10b4: /* Lane 1 Register */
1120*4882a593Smuzhiyun case 0x1400 ... 0x14b4: /* Lane 2 Register */
1121*4882a593Smuzhiyun case 0x1800 ... 0x18b4: /* Lane 3 Register */
1122*4882a593Smuzhiyun return true;
1123*4882a593Smuzhiyun default:
1124*4882a593Smuzhiyun return false;
1125*4882a593Smuzhiyun }
1126*4882a593Smuzhiyun }
1127*4882a593Smuzhiyun
1128*4882a593Smuzhiyun static const struct regmap_config rockchip_hdptx_phy_regmap_config = {
1129*4882a593Smuzhiyun .reg_bits = 32,
1130*4882a593Smuzhiyun .reg_stride = 4,
1131*4882a593Smuzhiyun .val_bits = 32,
1132*4882a593Smuzhiyun .fast_io = true,
1133*4882a593Smuzhiyun .max_register = 0x18b4,
1134*4882a593Smuzhiyun .readable_reg = rockchip_hdptx_phy_is_accissible_reg,
1135*4882a593Smuzhiyun .writeable_reg = rockchip_hdptx_phy_is_accissible_reg,
1136*4882a593Smuzhiyun };
1137*4882a593Smuzhiyun
rockchip_hdptx_phy_probe(struct platform_device * pdev)1138*4882a593Smuzhiyun static int rockchip_hdptx_phy_probe(struct platform_device *pdev)
1139*4882a593Smuzhiyun {
1140*4882a593Smuzhiyun struct device *dev = &pdev->dev;
1141*4882a593Smuzhiyun struct rockchip_hdptx_phy *hdptx;
1142*4882a593Smuzhiyun struct phy *phy;
1143*4882a593Smuzhiyun struct phy_provider *phy_provider;
1144*4882a593Smuzhiyun void __iomem *regs;
1145*4882a593Smuzhiyun int ret;
1146*4882a593Smuzhiyun
1147*4882a593Smuzhiyun hdptx = devm_kzalloc(dev, sizeof(*hdptx), GFP_KERNEL);
1148*4882a593Smuzhiyun if (!hdptx)
1149*4882a593Smuzhiyun return -ENOMEM;
1150*4882a593Smuzhiyun
1151*4882a593Smuzhiyun hdptx->dev = dev;
1152*4882a593Smuzhiyun platform_set_drvdata(pdev, hdptx);
1153*4882a593Smuzhiyun
1154*4882a593Smuzhiyun regs = devm_platform_ioremap_resource(pdev, 0);
1155*4882a593Smuzhiyun if (IS_ERR(regs))
1156*4882a593Smuzhiyun return PTR_ERR(regs);
1157*4882a593Smuzhiyun
1158*4882a593Smuzhiyun hdptx->regmap = devm_regmap_init_mmio(dev, regs,
1159*4882a593Smuzhiyun &rockchip_hdptx_phy_regmap_config);
1160*4882a593Smuzhiyun if (IS_ERR(hdptx->regmap))
1161*4882a593Smuzhiyun return dev_err_probe(dev, PTR_ERR(hdptx->regmap),
1162*4882a593Smuzhiyun "failed to create regmap\n");
1163*4882a593Smuzhiyun
1164*4882a593Smuzhiyun ret = devm_clk_bulk_get_all(dev, &hdptx->clks);
1165*4882a593Smuzhiyun if (ret < 1)
1166*4882a593Smuzhiyun return dev_err_probe(dev, ret, "failed to get clocks\n");
1167*4882a593Smuzhiyun
1168*4882a593Smuzhiyun hdptx->nr_clks = ret;
1169*4882a593Smuzhiyun
1170*4882a593Smuzhiyun hdptx->apb_reset = devm_reset_control_get(dev, "apb");
1171*4882a593Smuzhiyun if (IS_ERR(hdptx->apb_reset))
1172*4882a593Smuzhiyun return dev_err_probe(dev, PTR_ERR(hdptx->apb_reset),
1173*4882a593Smuzhiyun "failed to get apb reset\n");
1174*4882a593Smuzhiyun
1175*4882a593Smuzhiyun hdptx->init_reset = devm_reset_control_get(dev, "init");
1176*4882a593Smuzhiyun if (IS_ERR(hdptx->init_reset))
1177*4882a593Smuzhiyun return dev_err_probe(dev, PTR_ERR(hdptx->init_reset),
1178*4882a593Smuzhiyun "failed to get init reset\n");
1179*4882a593Smuzhiyun
1180*4882a593Smuzhiyun hdptx->cmn_reset = devm_reset_control_get(dev, "cmn");
1181*4882a593Smuzhiyun if (IS_ERR(hdptx->cmn_reset))
1182*4882a593Smuzhiyun return dev_err_probe(dev, PTR_ERR(hdptx->cmn_reset),
1183*4882a593Smuzhiyun "failed to get cmn reset\n");
1184*4882a593Smuzhiyun
1185*4882a593Smuzhiyun hdptx->lane_reset = devm_reset_control_get(dev, "lane");
1186*4882a593Smuzhiyun if (IS_ERR(hdptx->lane_reset))
1187*4882a593Smuzhiyun return dev_err_probe(dev, PTR_ERR(hdptx->lane_reset),
1188*4882a593Smuzhiyun "failed to get lane reset\n");
1189*4882a593Smuzhiyun
1190*4882a593Smuzhiyun hdptx->grf = syscon_regmap_lookup_by_phandle(dev->of_node,
1191*4882a593Smuzhiyun "rockchip,grf");
1192*4882a593Smuzhiyun if (IS_ERR(hdptx->grf))
1193*4882a593Smuzhiyun return dev_err_probe(dev, PTR_ERR(hdptx->grf),
1194*4882a593Smuzhiyun "failed to get grf regmap\n");
1195*4882a593Smuzhiyun
1196*4882a593Smuzhiyun device_property_read_u32_array(dev, "lane-polarity-invert",
1197*4882a593Smuzhiyun hdptx->lane_polarity_invert, 4);
1198*4882a593Smuzhiyun
1199*4882a593Smuzhiyun ret = rockchip_hdptx_phy_parse_training_table(dev);
1200*4882a593Smuzhiyun if (ret)
1201*4882a593Smuzhiyun return dev_err_probe(dev, ret, "failed to parse training table\n");
1202*4882a593Smuzhiyun
1203*4882a593Smuzhiyun phy = devm_phy_create(dev, NULL, &rockchip_hdptx_phy_ops);
1204*4882a593Smuzhiyun if (IS_ERR(phy))
1205*4882a593Smuzhiyun return dev_err_probe(dev, PTR_ERR(phy), "failed to create PHY\n");
1206*4882a593Smuzhiyun
1207*4882a593Smuzhiyun phy_set_drvdata(phy, hdptx);
1208*4882a593Smuzhiyun
1209*4882a593Smuzhiyun phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate);
1210*4882a593Smuzhiyun
1211*4882a593Smuzhiyun return PTR_ERR_OR_ZERO(phy_provider);
1212*4882a593Smuzhiyun }
1213*4882a593Smuzhiyun
1214*4882a593Smuzhiyun static const struct of_device_id rockchip_hdptx_phy_of_match[] = {
1215*4882a593Smuzhiyun { .compatible = "rockchip,rk3588-hdptx-phy", },
1216*4882a593Smuzhiyun {}
1217*4882a593Smuzhiyun };
1218*4882a593Smuzhiyun MODULE_DEVICE_TABLE(of, rockchip_hdptx_phy_of_match);
1219*4882a593Smuzhiyun
1220*4882a593Smuzhiyun static struct platform_driver rockchip_hdptx_phy_driver = {
1221*4882a593Smuzhiyun .probe = rockchip_hdptx_phy_probe,
1222*4882a593Smuzhiyun .driver = {
1223*4882a593Smuzhiyun .name = "rockchip-hdptx-phy",
1224*4882a593Smuzhiyun .of_match_table = rockchip_hdptx_phy_of_match,
1225*4882a593Smuzhiyun }
1226*4882a593Smuzhiyun };
1227*4882a593Smuzhiyun module_platform_driver(rockchip_hdptx_phy_driver);
1228*4882a593Smuzhiyun
1229*4882a593Smuzhiyun MODULE_AUTHOR("Wyon Bi <bivvy.bi@rock-chips.com>");
1230*4882a593Smuzhiyun MODULE_DESCRIPTION("Rockchip HDMI/DP Combo PHY with Samsung IP block");
1231*4882a593Smuzhiyun MODULE_LICENSE("GPL v2");
1232