1cf911009SWyon Bi // SPDX-License-Identifier: GPL-2.0
2cf911009SWyon Bi /*
3cf911009SWyon Bi * Copyright (c) 2020 Rockchip Electronics Co. Ltd.
4cf911009SWyon Bi *
5cf911009SWyon Bi * Author: Wyon Bi <bivvy.bi@rock-chips.com>
6cf911009SWyon Bi */
7cf911009SWyon Bi
8cf911009SWyon Bi #include <common.h>
9cf911009SWyon Bi #include <dm.h>
10cf911009SWyon Bi #include <generic-phy.h>
11*aaa9f179SWyon bi #include <syscon.h>
12*aaa9f179SWyon bi #include <regmap.h>
13cf911009SWyon Bi #include <asm/io.h>
14*aaa9f179SWyon bi #include <linux/bitfield.h>
15cf911009SWyon Bi #include <linux/iopoll.h>
16cf911009SWyon Bi
17cf911009SWyon Bi #define EDP_PHY_GRF_CON0 0x0000
18*aaa9f179SWyon bi #define EDP_PHY_TX_IDLE GENMASK(11, 8)
19*aaa9f179SWyon bi #define EDP_PHY_TX_PD GENMASK(7, 4)
20*aaa9f179SWyon bi #define EDP_PHY_IDDQ_EN BIT(1)
21*aaa9f179SWyon bi #define EDP_PHY_PD_PLL BIT(0)
22cf911009SWyon Bi #define EDP_PHY_GRF_CON1 0x0004
23*aaa9f179SWyon bi #define EDP_PHY_PLL_DIV GENMASK(14, 0)
24cf911009SWyon Bi #define EDP_PHY_GRF_CON2 0x0008
25*aaa9f179SWyon bi #define EDP_PHY_TX_RTERM GENMASK(10, 8)
26*aaa9f179SWyon bi #define EDP_PHY_RATE GENMASK(5, 4)
27*aaa9f179SWyon bi #define EDP_PHY_REF_DIV GENMASK(3, 0)
28cf911009SWyon Bi #define EDP_PHY_GRF_CON3 0x000c
29*aaa9f179SWyon bi #define EDP_PHY_TX3_EMP GENMASK(15, 12)
30*aaa9f179SWyon bi #define EDP_PHY_TX2_EMP GENMASK(11, 8)
31*aaa9f179SWyon bi #define EDP_PHY_TX1_EMP GENMASK(7, 4)
32*aaa9f179SWyon bi #define EDP_PHY_TX0_EMP GENMASK(3, 0)
33cf911009SWyon Bi #define EDP_PHY_GRF_CON4 0x0010
34*aaa9f179SWyon bi #define EDP_PHY_TX3_AMP GENMASK(14, 12)
35*aaa9f179SWyon bi #define EDP_PHY_TX2_AMP GENMASK(10, 8)
36*aaa9f179SWyon bi #define EDP_PHY_TX1_AMP GENMASK(6, 4)
37*aaa9f179SWyon bi #define EDP_PHY_TX0_AMP GENMASK(2, 0)
38cf911009SWyon Bi #define EDP_PHY_GRF_CON5 0x0014
39*aaa9f179SWyon bi #define EDP_PHY_TX_MODE GENMASK(9, 8)
40*aaa9f179SWyon bi #define EDP_PHY_TX3_AMP_SCALE GENMASK(7, 6)
41*aaa9f179SWyon bi #define EDP_PHY_TX2_AMP_SCALE GENMASK(5, 4)
42*aaa9f179SWyon bi #define EDP_PHY_TX1_AMP_SCALE GENMASK(3, 2)
43*aaa9f179SWyon bi #define EDP_PHY_TX0_AMP_SCALE GENMASK(1, 0)
44cf911009SWyon Bi #define EDP_PHY_GRF_CON6 0x0018
45*aaa9f179SWyon bi #define EDP_PHY_SSC_DEPTH GENMASK(15, 12)
46*aaa9f179SWyon bi #define EDP_PHY_SSC_EN BIT(11)
47*aaa9f179SWyon bi #define EDP_PHY_SSC_CNT GENMASK(9, 0)
48cf911009SWyon Bi #define EDP_PHY_GRF_CON7 0x001c
49cf911009SWyon Bi #define EDP_PHY_GRF_CON8 0x0020
50*aaa9f179SWyon bi #define EDP_PHY_PLL_CTL_H GENMASK(15, 0)
51cf911009SWyon Bi #define EDP_PHY_GRF_CON9 0x0024
52*aaa9f179SWyon bi #define EDP_PHY_TX_CTL GENMASK(15, 0)
53cf911009SWyon Bi #define EDP_PHY_GRF_CON10 0x0028
54*aaa9f179SWyon bi #define EDP_PHY_AUX_RCV_PD_SEL BIT(5)
55*aaa9f179SWyon bi #define EDP_PHY_AUX_DRV_PD_SEL BIT(4)
56*aaa9f179SWyon bi #define EDP_PHY_AUX_IDLE BIT(2)
57*aaa9f179SWyon bi #define EDP_PHY_AUX_RCV_PD BIT(1)
58*aaa9f179SWyon bi #define EDP_PHY_AUX_DRV_PD BIT(0)
59cf911009SWyon Bi #define EDP_PHY_GRF_CON11 0x002c
60*aaa9f179SWyon bi #define EDP_PHY_AUX_RCV_VCM GENMASK(14, 12)
61*aaa9f179SWyon bi #define EDP_PHY_AUX_MODE GENMASK(11, 10)
62*aaa9f179SWyon bi #define EDP_PHY_AUX_AMP_SCALE GENMASK(9, 8)
63*aaa9f179SWyon bi #define EDP_PHY_AUX_AMP GENMASK(6, 4)
64*aaa9f179SWyon bi #define EDP_PHY_AUX_RTERM GENMASK(2, 0)
65cf911009SWyon Bi #define EDP_PHY_GRF_STATUS0 0x0030
66cf911009SWyon Bi #define PLL_RDY BIT(0)
67cf911009SWyon Bi #define EDP_PHY_GRF_STATUS1 0x0034
68cf911009SWyon Bi
69cf911009SWyon Bi struct rockchip_edp_phy {
70*aaa9f179SWyon bi struct regmap *grf;
71cf911009SWyon Bi struct udevice *dev;
72cf911009SWyon Bi };
73cf911009SWyon Bi
rockchip_grf_write(struct regmap * grf,uint reg,uint mask,uint val)74*aaa9f179SWyon bi static inline int rockchip_grf_write(struct regmap *grf, uint reg, uint mask,
75*aaa9f179SWyon bi uint val)
76*aaa9f179SWyon bi {
77*aaa9f179SWyon bi return regmap_write(grf, reg, (mask << 16) | (val & mask));
78*aaa9f179SWyon bi }
79*aaa9f179SWyon bi
80cf911009SWyon Bi static struct {
81cf911009SWyon Bi int amp;
82cf911009SWyon Bi int amp_scale;
83cf911009SWyon Bi int emp;
84cf911009SWyon Bi } vp[4][4] = {
85cf911009SWyon Bi { {0x1, 0x1, 0x0}, {0x2, 0x1, 0x4}, {0x3, 0x1, 0x8}, {0x4, 0x1, 0xd} },
86cf911009SWyon Bi { {0x3, 0x1, 0x0}, {0x5, 0x1, 0x7}, {0x6, 0x1, 0x6}, { -1, -1, -1} },
87cf911009SWyon Bi { {0x5, 0x1, 0x0}, {0x7, 0x1, 0x4}, { -1, -1, -1}, { -1, -1, -1} },
88cf911009SWyon Bi { {0x7, 0x1, 0x0}, { -1, -1, -1}, { -1, -1, -1}, { -1, -1, -1} },
89cf911009SWyon Bi };
90cf911009SWyon Bi
rockchip_edp_phy_set_voltage(struct rockchip_edp_phy * edpphy,struct phy_configure_opts_dp * dp,u8 lane)91*aaa9f179SWyon bi static void rockchip_edp_phy_set_voltage(struct rockchip_edp_phy *edpphy,
92*aaa9f179SWyon bi struct phy_configure_opts_dp *dp,
93*aaa9f179SWyon bi u8 lane)
94*aaa9f179SWyon bi {
95*aaa9f179SWyon bi u32 amp, amp_scale, emp;
96*aaa9f179SWyon bi
97*aaa9f179SWyon bi amp = vp[dp->voltage[lane]][dp->pre[lane]].amp;
98*aaa9f179SWyon bi amp_scale = vp[dp->voltage[lane]][dp->pre[lane]].amp_scale;
99*aaa9f179SWyon bi emp = vp[dp->voltage[lane]][dp->pre[lane]].emp;
100*aaa9f179SWyon bi
101*aaa9f179SWyon bi switch (lane) {
102*aaa9f179SWyon bi case 0:
103*aaa9f179SWyon bi rockchip_grf_write(edpphy->grf, EDP_PHY_GRF_CON3,
104*aaa9f179SWyon bi EDP_PHY_TX0_EMP,
105*aaa9f179SWyon bi FIELD_PREP(EDP_PHY_TX0_EMP, emp));
106*aaa9f179SWyon bi rockchip_grf_write(edpphy->grf, EDP_PHY_GRF_CON4,
107*aaa9f179SWyon bi EDP_PHY_TX0_AMP,
108*aaa9f179SWyon bi FIELD_PREP(EDP_PHY_TX0_AMP, amp));
109*aaa9f179SWyon bi rockchip_grf_write(edpphy->grf, EDP_PHY_GRF_CON5,
110*aaa9f179SWyon bi EDP_PHY_TX0_AMP_SCALE,
111*aaa9f179SWyon bi FIELD_PREP(EDP_PHY_TX0_AMP_SCALE, amp_scale));
112*aaa9f179SWyon bi break;
113*aaa9f179SWyon bi case 1:
114*aaa9f179SWyon bi rockchip_grf_write(edpphy->grf, EDP_PHY_GRF_CON3,
115*aaa9f179SWyon bi EDP_PHY_TX1_EMP,
116*aaa9f179SWyon bi FIELD_PREP(EDP_PHY_TX1_EMP, emp));
117*aaa9f179SWyon bi rockchip_grf_write(edpphy->grf, EDP_PHY_GRF_CON4,
118*aaa9f179SWyon bi EDP_PHY_TX1_AMP,
119*aaa9f179SWyon bi FIELD_PREP(EDP_PHY_TX1_AMP, amp));
120*aaa9f179SWyon bi rockchip_grf_write(edpphy->grf, EDP_PHY_GRF_CON5,
121*aaa9f179SWyon bi EDP_PHY_TX1_AMP_SCALE,
122*aaa9f179SWyon bi FIELD_PREP(EDP_PHY_TX1_AMP_SCALE, amp_scale));
123*aaa9f179SWyon bi break;
124*aaa9f179SWyon bi case 2:
125*aaa9f179SWyon bi rockchip_grf_write(edpphy->grf, EDP_PHY_GRF_CON3,
126*aaa9f179SWyon bi EDP_PHY_TX2_EMP,
127*aaa9f179SWyon bi FIELD_PREP(EDP_PHY_TX2_EMP, emp));
128*aaa9f179SWyon bi rockchip_grf_write(edpphy->grf, EDP_PHY_GRF_CON4,
129*aaa9f179SWyon bi EDP_PHY_TX2_AMP,
130*aaa9f179SWyon bi FIELD_PREP(EDP_PHY_TX2_AMP, amp));
131*aaa9f179SWyon bi rockchip_grf_write(edpphy->grf, EDP_PHY_GRF_CON5,
132*aaa9f179SWyon bi EDP_PHY_TX2_AMP_SCALE,
133*aaa9f179SWyon bi FIELD_PREP(EDP_PHY_TX2_AMP_SCALE, amp_scale));
134*aaa9f179SWyon bi break;
135*aaa9f179SWyon bi case 3:
136*aaa9f179SWyon bi rockchip_grf_write(edpphy->grf, EDP_PHY_GRF_CON3,
137*aaa9f179SWyon bi EDP_PHY_TX3_EMP,
138*aaa9f179SWyon bi FIELD_PREP(EDP_PHY_TX3_EMP, emp));
139*aaa9f179SWyon bi rockchip_grf_write(edpphy->grf, EDP_PHY_GRF_CON4,
140*aaa9f179SWyon bi EDP_PHY_TX3_AMP,
141*aaa9f179SWyon bi FIELD_PREP(EDP_PHY_TX3_AMP, amp));
142*aaa9f179SWyon bi rockchip_grf_write(edpphy->grf, EDP_PHY_GRF_CON5,
143*aaa9f179SWyon bi EDP_PHY_TX3_AMP_SCALE,
144*aaa9f179SWyon bi FIELD_PREP(EDP_PHY_TX3_AMP_SCALE, amp_scale));
145*aaa9f179SWyon bi break;
146*aaa9f179SWyon bi }
147*aaa9f179SWyon bi }
148*aaa9f179SWyon bi
rockchip_edp_phy_set_voltages(struct rockchip_edp_phy * edpphy,struct phy_configure_opts_dp * dp)149cf911009SWyon Bi static int rockchip_edp_phy_set_voltages(struct rockchip_edp_phy *edpphy,
150cf911009SWyon Bi struct phy_configure_opts_dp *dp)
151cf911009SWyon Bi {
152*aaa9f179SWyon bi
153cf911009SWyon Bi u8 lane;
154cf911009SWyon Bi
155*aaa9f179SWyon bi for (lane = 0; lane < dp->lanes; lane++)
156*aaa9f179SWyon bi rockchip_edp_phy_set_voltage(edpphy, dp, lane);
157cf911009SWyon Bi
158cf911009SWyon Bi return 0;
159cf911009SWyon Bi }
160cf911009SWyon Bi
rockchip_edp_phy_set_rate(struct rockchip_edp_phy * edpphy,struct phy_configure_opts_dp * dp)161cf911009SWyon Bi static int rockchip_edp_phy_set_rate(struct rockchip_edp_phy *edpphy,
162cf911009SWyon Bi struct phy_configure_opts_dp *dp)
163cf911009SWyon Bi {
164cf911009SWyon Bi u32 value;
165cf911009SWyon Bi int ret;
166cf911009SWyon Bi
167*aaa9f179SWyon bi rockchip_grf_write(edpphy->grf, EDP_PHY_GRF_CON0,
168*aaa9f179SWyon bi EDP_PHY_TX_IDLE | EDP_PHY_TX_PD,
169*aaa9f179SWyon bi FIELD_PREP(EDP_PHY_TX_IDLE, 0xf) |
170*aaa9f179SWyon bi FIELD_PREP(EDP_PHY_TX_PD, 0xf));
171cf911009SWyon Bi udelay(100);
172*aaa9f179SWyon bi rockchip_grf_write(edpphy->grf, EDP_PHY_GRF_CON5, EDP_PHY_TX_MODE,
173*aaa9f179SWyon bi FIELD_PREP(EDP_PHY_TX_MODE, 0x3));
174*aaa9f179SWyon bi rockchip_grf_write(edpphy->grf, EDP_PHY_GRF_CON0, EDP_PHY_PD_PLL,
175*aaa9f179SWyon bi FIELD_PREP(EDP_PHY_PD_PLL, 0x1));
176cf911009SWyon Bi
177cf911009SWyon Bi switch (dp->link_rate) {
178cf911009SWyon Bi case 1620:
179*aaa9f179SWyon bi rockchip_grf_write(edpphy->grf, EDP_PHY_GRF_CON1,
180*aaa9f179SWyon bi EDP_PHY_PLL_DIV,
181*aaa9f179SWyon bi FIELD_PREP(EDP_PHY_PLL_DIV, 0x4380));
182*aaa9f179SWyon bi rockchip_grf_write(edpphy->grf, EDP_PHY_GRF_CON2,
183*aaa9f179SWyon bi EDP_PHY_TX_RTERM | EDP_PHY_RATE | EDP_PHY_REF_DIV,
184*aaa9f179SWyon bi FIELD_PREP(EDP_PHY_TX_RTERM, 0x1) |
185*aaa9f179SWyon bi FIELD_PREP(EDP_PHY_RATE, 0x1) |
186*aaa9f179SWyon bi FIELD_PREP(EDP_PHY_REF_DIV, 0x0));
187*aaa9f179SWyon bi rockchip_grf_write(edpphy->grf, EDP_PHY_GRF_CON8,
188*aaa9f179SWyon bi EDP_PHY_PLL_CTL_H,
189*aaa9f179SWyon bi FIELD_PREP(EDP_PHY_PLL_CTL_H, 0x0800));
190*aaa9f179SWyon bi rockchip_grf_write(edpphy->grf, EDP_PHY_GRF_CON9,
191*aaa9f179SWyon bi EDP_PHY_TX_CTL,
192*aaa9f179SWyon bi FIELD_PREP(EDP_PHY_TX_CTL, 0x0000));
193cf911009SWyon Bi break;
194cf911009SWyon Bi case 2700:
195*aaa9f179SWyon bi rockchip_grf_write(edpphy->grf, EDP_PHY_GRF_CON1,
196*aaa9f179SWyon bi EDP_PHY_PLL_DIV,
197*aaa9f179SWyon bi FIELD_PREP(EDP_PHY_PLL_DIV, 0x3840));
198*aaa9f179SWyon bi rockchip_grf_write(edpphy->grf, EDP_PHY_GRF_CON2,
199*aaa9f179SWyon bi EDP_PHY_TX_RTERM | EDP_PHY_RATE | EDP_PHY_REF_DIV,
200*aaa9f179SWyon bi FIELD_PREP(EDP_PHY_TX_RTERM, 0x1) |
201*aaa9f179SWyon bi FIELD_PREP(EDP_PHY_RATE, 0x0) |
202*aaa9f179SWyon bi FIELD_PREP(EDP_PHY_REF_DIV, 0x0));
203*aaa9f179SWyon bi rockchip_grf_write(edpphy->grf, EDP_PHY_GRF_CON8,
204*aaa9f179SWyon bi EDP_PHY_PLL_CTL_H,
205*aaa9f179SWyon bi FIELD_PREP(EDP_PHY_PLL_CTL_H, 0x0800));
206*aaa9f179SWyon bi rockchip_grf_write(edpphy->grf, EDP_PHY_GRF_CON9,
207*aaa9f179SWyon bi EDP_PHY_TX_CTL,
208*aaa9f179SWyon bi FIELD_PREP(EDP_PHY_TX_CTL, 0x0000));
209cf911009SWyon Bi break;
210cf911009SWyon Bi }
211cf911009SWyon Bi
212cf911009SWyon Bi if (dp->ssc)
213*aaa9f179SWyon bi rockchip_grf_write(edpphy->grf, EDP_PHY_GRF_CON6,
214*aaa9f179SWyon bi EDP_PHY_SSC_DEPTH | EDP_PHY_SSC_EN | EDP_PHY_SSC_CNT,
215*aaa9f179SWyon bi FIELD_PREP(EDP_PHY_SSC_DEPTH, 0x9) |
216*aaa9f179SWyon bi FIELD_PREP(EDP_PHY_SSC_EN, 0x1) |
217*aaa9f179SWyon bi FIELD_PREP(EDP_PHY_SSC_CNT, 0x17d));
218cf911009SWyon Bi else
219*aaa9f179SWyon bi rockchip_grf_write(edpphy->grf, EDP_PHY_GRF_CON6,
220*aaa9f179SWyon bi EDP_PHY_SSC_EN,
221*aaa9f179SWyon bi FIELD_PREP(EDP_PHY_SSC_EN, 0x0));
222cf911009SWyon Bi
223*aaa9f179SWyon bi rockchip_grf_write(edpphy->grf, EDP_PHY_GRF_CON0, EDP_PHY_PD_PLL,
224*aaa9f179SWyon bi FIELD_PREP(EDP_PHY_PD_PLL, 0));
225*aaa9f179SWyon bi rockchip_grf_write(edpphy->grf, EDP_PHY_GRF_CON0, EDP_PHY_TX_PD,
226*aaa9f179SWyon bi FIELD_PREP(EDP_PHY_TX_PD, ~GENMASK(dp->lanes - 1, 0)));
227*aaa9f179SWyon bi ret = regmap_read_poll_timeout(edpphy->grf, EDP_PHY_GRF_STATUS0,
228*aaa9f179SWyon bi value, value & PLL_RDY, 100, 1000);
229cf911009SWyon Bi if (ret) {
230cf911009SWyon Bi dev_err(edpphy->dev, "pll is not ready: %d\n", ret);
231cf911009SWyon Bi return ret;
232cf911009SWyon Bi }
233cf911009SWyon Bi
234*aaa9f179SWyon bi rockchip_grf_write(edpphy->grf, EDP_PHY_GRF_CON5, EDP_PHY_TX_MODE,
235*aaa9f179SWyon bi FIELD_PREP(EDP_PHY_TX_MODE, 0x0));
236*aaa9f179SWyon bi rockchip_grf_write(edpphy->grf, EDP_PHY_GRF_CON0, EDP_PHY_TX_IDLE,
237*aaa9f179SWyon bi FIELD_PREP(EDP_PHY_TX_IDLE, ~GENMASK(dp->lanes - 1, 0)));
238cf911009SWyon Bi
239cf911009SWyon Bi return 0;
240cf911009SWyon Bi }
241cf911009SWyon Bi
rockchip_edp_phy_verify_config(struct rockchip_edp_phy * edpphy,struct phy_configure_opts_dp * dp)242cf911009SWyon Bi static int rockchip_edp_phy_verify_config(struct rockchip_edp_phy *edpphy,
243cf911009SWyon Bi struct phy_configure_opts_dp *dp)
244cf911009SWyon Bi {
245cf911009SWyon Bi int i;
246cf911009SWyon Bi
247cf911009SWyon Bi /* If changing link rate was required, verify it's supported. */
248cf911009SWyon Bi if (dp->set_rate) {
249cf911009SWyon Bi switch (dp->link_rate) {
250cf911009SWyon Bi case 1620:
251cf911009SWyon Bi case 2700:
252cf911009SWyon Bi /* valid bit rate */
253cf911009SWyon Bi break;
254cf911009SWyon Bi default:
255cf911009SWyon Bi return -EINVAL;
256cf911009SWyon Bi }
257cf911009SWyon Bi }
258cf911009SWyon Bi
259cf911009SWyon Bi /* Verify lane count. */
260cf911009SWyon Bi switch (dp->lanes) {
261cf911009SWyon Bi case 1:
262cf911009SWyon Bi case 2:
263cf911009SWyon Bi case 4:
264cf911009SWyon Bi /* valid lane count. */
265cf911009SWyon Bi break;
266cf911009SWyon Bi default:
267cf911009SWyon Bi return -EINVAL;
268cf911009SWyon Bi }
269cf911009SWyon Bi
270cf911009SWyon Bi /*
271cf911009SWyon Bi * If changing voltages is required, check swing and pre-emphasis
272cf911009SWyon Bi * levels, per-lane.
273cf911009SWyon Bi */
274cf911009SWyon Bi if (dp->set_voltages) {
275cf911009SWyon Bi /* Lane count verified previously. */
276cf911009SWyon Bi for (i = 0; i < dp->lanes; i++) {
277cf911009SWyon Bi if (dp->voltage[i] > 3 || dp->pre[i] > 3)
278cf911009SWyon Bi return -EINVAL;
279cf911009SWyon Bi
280cf911009SWyon Bi /*
281cf911009SWyon Bi * Sum of voltage swing and pre-emphasis levels cannot
282cf911009SWyon Bi * exceed 3.
283cf911009SWyon Bi */
284cf911009SWyon Bi if (dp->voltage[i] + dp->pre[i] > 3)
285cf911009SWyon Bi return -EINVAL;
286cf911009SWyon Bi }
287cf911009SWyon Bi }
288cf911009SWyon Bi
289cf911009SWyon Bi return 0;
290cf911009SWyon Bi }
291cf911009SWyon Bi
rockchip_edp_phy_configure(struct phy * phy,union phy_configure_opts * opts)292cf911009SWyon Bi static int rockchip_edp_phy_configure(struct phy *phy,
293cf911009SWyon Bi union phy_configure_opts *opts)
294cf911009SWyon Bi {
295cf911009SWyon Bi struct rockchip_edp_phy *edpphy = dev_get_priv(phy->dev);
296cf911009SWyon Bi int ret;
297cf911009SWyon Bi
298cf911009SWyon Bi ret = rockchip_edp_phy_verify_config(edpphy, &opts->dp);
299cf911009SWyon Bi if (ret) {
300cf911009SWyon Bi dev_err(edpphy->dev, "invalid params for phy configure\n");
301cf911009SWyon Bi return ret;
302cf911009SWyon Bi }
303cf911009SWyon Bi
304cf911009SWyon Bi if (opts->dp.set_rate) {
305cf911009SWyon Bi ret = rockchip_edp_phy_set_rate(edpphy, &opts->dp);
306cf911009SWyon Bi if (ret) {
307cf911009SWyon Bi dev_err(edpphy->dev,
308cf911009SWyon Bi "rockchip_edp_phy_set_rate failed\n");
309cf911009SWyon Bi return ret;
310cf911009SWyon Bi }
311cf911009SWyon Bi }
312cf911009SWyon Bi
313cf911009SWyon Bi if (opts->dp.set_voltages) {
314cf911009SWyon Bi ret = rockchip_edp_phy_set_voltages(edpphy, &opts->dp);
315cf911009SWyon Bi if (ret) {
316cf911009SWyon Bi dev_err(edpphy->dev,
317cf911009SWyon Bi "rockchip_edp_phy_set_voltages failed\n");
318cf911009SWyon Bi return ret;
319cf911009SWyon Bi }
320cf911009SWyon Bi }
321cf911009SWyon Bi
322cf911009SWyon Bi return 0;
323cf911009SWyon Bi }
324cf911009SWyon Bi
rockchip_edp_phy_power_on(struct phy * phy)325cf911009SWyon Bi static int rockchip_edp_phy_power_on(struct phy *phy)
326cf911009SWyon Bi {
327cf911009SWyon Bi struct rockchip_edp_phy *edpphy = dev_get_priv(phy->dev);
328cf911009SWyon Bi
329*aaa9f179SWyon bi rockchip_grf_write(edpphy->grf, EDP_PHY_GRF_CON10,
330*aaa9f179SWyon bi EDP_PHY_AUX_RCV_PD | EDP_PHY_AUX_DRV_PD | EDP_PHY_AUX_IDLE,
331*aaa9f179SWyon bi FIELD_PREP(EDP_PHY_AUX_RCV_PD, 0x1) |
332*aaa9f179SWyon bi FIELD_PREP(EDP_PHY_AUX_DRV_PD, 0x1) |
333*aaa9f179SWyon bi FIELD_PREP(EDP_PHY_AUX_IDLE, 0x1));
334*aaa9f179SWyon bi rockchip_grf_write(edpphy->grf, EDP_PHY_GRF_CON0,
335*aaa9f179SWyon bi EDP_PHY_TX_IDLE | EDP_PHY_TX_PD | EDP_PHY_PD_PLL,
336*aaa9f179SWyon bi FIELD_PREP(EDP_PHY_TX_IDLE, 0xf) |
337*aaa9f179SWyon bi FIELD_PREP(EDP_PHY_TX_PD, 0xf) |
338*aaa9f179SWyon bi FIELD_PREP(EDP_PHY_PD_PLL, 0x1));
339cf911009SWyon Bi udelay(100);
340cf911009SWyon Bi
341*aaa9f179SWyon bi rockchip_grf_write(edpphy->grf, EDP_PHY_GRF_CON11,
342*aaa9f179SWyon bi EDP_PHY_AUX_RCV_VCM | EDP_PHY_AUX_MODE |
343*aaa9f179SWyon bi EDP_PHY_AUX_AMP_SCALE | EDP_PHY_AUX_AMP |
344*aaa9f179SWyon bi EDP_PHY_AUX_RTERM,
345*aaa9f179SWyon bi FIELD_PREP(EDP_PHY_AUX_RCV_VCM, 0x4) |
346*aaa9f179SWyon bi FIELD_PREP(EDP_PHY_AUX_MODE, 0x1) |
347*aaa9f179SWyon bi FIELD_PREP(EDP_PHY_AUX_AMP_SCALE, 0x1) |
348*aaa9f179SWyon bi FIELD_PREP(EDP_PHY_AUX_AMP, 0x3) |
349*aaa9f179SWyon bi FIELD_PREP(EDP_PHY_AUX_RTERM, 0x1));
350cf911009SWyon Bi
351*aaa9f179SWyon bi rockchip_grf_write(edpphy->grf, EDP_PHY_GRF_CON10,
352*aaa9f179SWyon bi EDP_PHY_AUX_RCV_PD | EDP_PHY_AUX_DRV_PD,
353*aaa9f179SWyon bi FIELD_PREP(EDP_PHY_AUX_RCV_PD, 0x0) |
354*aaa9f179SWyon bi FIELD_PREP(EDP_PHY_AUX_DRV_PD, 0x0));
355cf911009SWyon Bi udelay(100);
356cf911009SWyon Bi
357*aaa9f179SWyon bi rockchip_grf_write(edpphy->grf, EDP_PHY_GRF_CON10,
358*aaa9f179SWyon bi EDP_PHY_AUX_IDLE,
359*aaa9f179SWyon bi FIELD_PREP(EDP_PHY_AUX_IDLE, 0x0));
360cf911009SWyon Bi mdelay(20);
361cf911009SWyon Bi
362cf911009SWyon Bi return 0;
363cf911009SWyon Bi }
364cf911009SWyon Bi
rockchip_edp_phy_power_off(struct phy * phy)365cf911009SWyon Bi static int rockchip_edp_phy_power_off(struct phy *phy)
366cf911009SWyon Bi {
367cf911009SWyon Bi struct rockchip_edp_phy *edpphy = dev_get_priv(phy->dev);
368cf911009SWyon Bi
369*aaa9f179SWyon bi rockchip_grf_write(edpphy->grf, EDP_PHY_GRF_CON0,
370*aaa9f179SWyon bi EDP_PHY_TX_IDLE | EDP_PHY_TX_PD,
371*aaa9f179SWyon bi FIELD_PREP(EDP_PHY_TX_IDLE, 0xf) |
372*aaa9f179SWyon bi FIELD_PREP(EDP_PHY_TX_PD, 0xf));
373cf911009SWyon Bi udelay(100);
374*aaa9f179SWyon bi rockchip_grf_write(edpphy->grf, EDP_PHY_GRF_CON5, EDP_PHY_TX_MODE,
375*aaa9f179SWyon bi FIELD_PREP(EDP_PHY_TX_MODE, 0x3));
376*aaa9f179SWyon bi rockchip_grf_write(edpphy->grf, EDP_PHY_GRF_CON0, EDP_PHY_PD_PLL,
377*aaa9f179SWyon bi FIELD_PREP(EDP_PHY_PD_PLL, 0x1));
378*aaa9f179SWyon bi rockchip_grf_write(edpphy->grf, EDP_PHY_GRF_CON10,
379*aaa9f179SWyon bi EDP_PHY_AUX_RCV_PD | EDP_PHY_AUX_DRV_PD | EDP_PHY_AUX_IDLE,
380*aaa9f179SWyon bi FIELD_PREP(EDP_PHY_AUX_RCV_PD, 0x1) |
381*aaa9f179SWyon bi FIELD_PREP(EDP_PHY_AUX_DRV_PD, 0x1) |
382*aaa9f179SWyon bi FIELD_PREP(EDP_PHY_AUX_IDLE, 0x1));
383cf911009SWyon Bi
384cf911009SWyon Bi return 0;
385cf911009SWyon Bi }
386cf911009SWyon Bi
387cf911009SWyon Bi static struct phy_ops rockchip_edp_phy_ops = {
388cf911009SWyon Bi .power_on = rockchip_edp_phy_power_on,
389cf911009SWyon Bi .power_off = rockchip_edp_phy_power_off,
390cf911009SWyon Bi .configure = rockchip_edp_phy_configure,
391cf911009SWyon Bi };
392cf911009SWyon Bi
rockchip_edp_phy_probe(struct udevice * dev)393cf911009SWyon Bi static int rockchip_edp_phy_probe(struct udevice *dev)
394cf911009SWyon Bi {
395cf911009SWyon Bi struct rockchip_edp_phy *edpphy = dev_get_priv(dev);
396cf911009SWyon Bi
397*aaa9f179SWyon bi edpphy->grf = syscon_get_regmap(dev_get_parent(dev));
398*aaa9f179SWyon bi if (!edpphy->grf)
399cf911009SWyon Bi return -ENOENT;
400cf911009SWyon Bi
401cf911009SWyon Bi edpphy->dev = dev;
402cf911009SWyon Bi
403cf911009SWyon Bi return 0;
404cf911009SWyon Bi }
405cf911009SWyon Bi
406cf911009SWyon Bi static const struct udevice_id rockchip_edp_phy_ids[] = {
407cf911009SWyon Bi { .compatible = "rockchip,rk3568-edp-phy", },
408cf911009SWyon Bi {}
409cf911009SWyon Bi };
410cf911009SWyon Bi
411cf911009SWyon Bi U_BOOT_DRIVER(rockchip_edp_phy) = {
412cf911009SWyon Bi .name = "rockchip_edp_phy",
413cf911009SWyon Bi .id = UCLASS_PHY,
414cf911009SWyon Bi .ops = &rockchip_edp_phy_ops,
415cf911009SWyon Bi .of_match = rockchip_edp_phy_ids,
416cf911009SWyon Bi .probe = rockchip_edp_phy_probe,
417cf911009SWyon Bi .priv_auto_alloc_size = sizeof(struct rockchip_edp_phy),
418cf911009SWyon Bi };
419