1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3 * Analogix DP (Display port) core register interface driver.
4 *
5 * Copyright (C) 2012 Samsung Electronics Co., Ltd.
6 * Author: Jingoo Han <jg1.han@samsung.com>
7 */
8
9 #include <linux/delay.h>
10 #include <linux/device.h>
11 #include <linux/gpio/consumer.h>
12 #include <linux/io.h>
13 #include <linux/iopoll.h>
14 #include <linux/phy/phy.h>
15
16 #include <drm/bridge/analogix_dp.h>
17
18 #include "analogix_dp_core.h"
19 #include "analogix_dp_reg.h"
20
21 #define COMMON_INT_MASK_1 0
22 #define COMMON_INT_MASK_2 0
23 #define COMMON_INT_MASK_3 0
24 #define COMMON_INT_MASK_4 (HOTPLUG_CHG | HPD_LOST | PLUG)
25
analogix_dp_write(struct analogix_dp_device * dp,u32 reg,u32 val)26 static void analogix_dp_write(struct analogix_dp_device *dp, u32 reg, u32 val)
27 {
28 if (dp->plat_data && is_rockchip(dp->plat_data->dev_type)) {
29 readl(dp->reg_base);
30 writel(val, dp->reg_base + reg);
31 }
32
33 writel(val, dp->reg_base + reg);
34 }
35
analogix_dp_read(struct analogix_dp_device * dp,u32 reg)36 static u32 analogix_dp_read(struct analogix_dp_device *dp, u32 reg)
37 {
38 if (dp->plat_data && is_rockchip(dp->plat_data->dev_type)) {
39 readl(dp->reg_base + reg);
40 }
41
42 return readl(dp->reg_base + reg);
43 }
44
analogix_dp_enable_video_mute(struct analogix_dp_device * dp,bool enable)45 void analogix_dp_enable_video_mute(struct analogix_dp_device *dp, bool enable)
46 {
47 u32 reg;
48
49 if (enable) {
50 reg = analogix_dp_read(dp, ANALOGIX_DP_VIDEO_CTL_1);
51 reg |= HDCP_VIDEO_MUTE;
52 analogix_dp_write(dp, ANALOGIX_DP_VIDEO_CTL_1, reg);
53 } else {
54 reg = analogix_dp_read(dp, ANALOGIX_DP_VIDEO_CTL_1);
55 reg &= ~HDCP_VIDEO_MUTE;
56 analogix_dp_write(dp, ANALOGIX_DP_VIDEO_CTL_1, reg);
57 }
58 }
59
analogix_dp_stop_video(struct analogix_dp_device * dp)60 void analogix_dp_stop_video(struct analogix_dp_device *dp)
61 {
62 u32 reg;
63
64 reg = analogix_dp_read(dp, ANALOGIX_DP_VIDEO_CTL_1);
65 reg &= ~VIDEO_EN;
66 analogix_dp_write(dp, ANALOGIX_DP_VIDEO_CTL_1, reg);
67 }
68
analogix_dp_lane_swap(struct analogix_dp_device * dp,bool enable)69 void analogix_dp_lane_swap(struct analogix_dp_device *dp, bool enable)
70 {
71 u32 reg;
72
73 if (enable) {
74 reg = LANE3_MAP_LOGIC_LANE_0 | LANE2_MAP_LOGIC_LANE_1 | LANE1_MAP_LOGIC_LANE_2 | LANE0_MAP_LOGIC_LANE_3;
75 } else {
76 reg = LANE3_MAP_LOGIC_LANE_3 | LANE2_MAP_LOGIC_LANE_2 | LANE1_MAP_LOGIC_LANE_1 | LANE0_MAP_LOGIC_LANE_0;
77 }
78
79 analogix_dp_write(dp, ANALOGIX_DP_LANE_MAP, reg);
80 }
81
analogix_dp_init_analog_param(struct analogix_dp_device * dp)82 void analogix_dp_init_analog_param(struct analogix_dp_device *dp)
83 {
84 u32 reg;
85
86 reg = TX_TERMINAL_CTRL_50_OHM;
87 analogix_dp_write(dp, ANALOGIX_DP_ANALOG_CTL_1, reg);
88
89 reg = SEL_24M | TX_DVDD_BIT_1_0625V;
90 analogix_dp_write(dp, ANALOGIX_DP_ANALOG_CTL_2, reg);
91
92 if (dp->plat_data && is_rockchip(dp->plat_data->dev_type)) {
93 reg = REF_CLK_24M;
94 if (dp->plat_data->dev_type == RK3288_DP) {
95 reg ^= REF_CLK_MASK;
96 }
97
98 analogix_dp_write(dp, ANALOGIX_DP_PLL_REG_1, reg);
99 analogix_dp_write(dp, ANALOGIX_DP_PLL_REG_2, 0x99);
100 analogix_dp_write(dp, ANALOGIX_DP_PLL_REG_3, 0x40);
101 analogix_dp_write(dp, ANALOGIX_DP_PLL_REG_4, 0x58);
102 analogix_dp_write(dp, ANALOGIX_DP_PLL_REG_5, 0x22);
103 analogix_dp_write(dp, ANALOGIX_DP_BIAS, 0x44);
104 }
105
106 reg = DRIVE_DVDD_BIT_1_0625V | VCO_BIT_600_MICRO;
107 analogix_dp_write(dp, ANALOGIX_DP_ANALOG_CTL_3, reg);
108
109 reg = PD_RING_OSC | AUX_TERMINAL_CTRL_50_OHM | TX_CUR1_2X | TX_CUR_16_MA;
110 analogix_dp_write(dp, ANALOGIX_DP_PLL_FILTER_CTL_1, reg);
111
112 reg = CH3_AMP_400_MV | CH2_AMP_400_MV | CH1_AMP_400_MV | CH0_AMP_400_MV;
113 analogix_dp_write(dp, ANALOGIX_DP_TX_AMP_TUNING_CTL, reg);
114 }
115
analogix_dp_init_interrupt(struct analogix_dp_device * dp)116 void analogix_dp_init_interrupt(struct analogix_dp_device *dp)
117 {
118 /* Set interrupt pin assertion polarity as high */
119 analogix_dp_write(dp, ANALOGIX_DP_INT_CTL, INT_POL1 | INT_POL0);
120
121 /* Clear pending regisers */
122 analogix_dp_write(dp, ANALOGIX_DP_COMMON_INT_STA_1, 0xff);
123 analogix_dp_write(dp, ANALOGIX_DP_COMMON_INT_STA_2, 0x4f);
124 analogix_dp_write(dp, ANALOGIX_DP_COMMON_INT_STA_3, 0xe0);
125 analogix_dp_write(dp, ANALOGIX_DP_COMMON_INT_STA_4, 0xe7);
126 analogix_dp_write(dp, ANALOGIX_DP_INT_STA, 0x63);
127
128 /* 0:mask,1: unmask */
129 analogix_dp_write(dp, ANALOGIX_DP_COMMON_INT_MASK_1, 0x00);
130 analogix_dp_write(dp, ANALOGIX_DP_COMMON_INT_MASK_2, 0x00);
131 analogix_dp_write(dp, ANALOGIX_DP_COMMON_INT_MASK_3, 0x00);
132 analogix_dp_write(dp, ANALOGIX_DP_COMMON_INT_MASK_4, 0x00);
133 analogix_dp_write(dp, ANALOGIX_DP_INT_STA_MASK, 0x00);
134 }
135
analogix_dp_reset(struct analogix_dp_device * dp)136 void analogix_dp_reset(struct analogix_dp_device *dp)
137 {
138 u32 reg;
139
140 analogix_dp_stop_video(dp);
141 analogix_dp_enable_video_mute(dp, 0);
142
143 if (dp->plat_data && is_rockchip(dp->plat_data->dev_type)) {
144 reg = RK_VID_CAP_FUNC_EN_N | RK_VID_FIFO_FUNC_EN_N | SW_FUNC_EN_N;
145 } else {
146 reg = MASTER_VID_FUNC_EN_N | SLAVE_VID_FUNC_EN_N | AUD_FIFO_FUNC_EN_N | AUD_FUNC_EN_N | HDCP_FUNC_EN_N |
147 SW_FUNC_EN_N;
148 }
149
150 analogix_dp_write(dp, ANALOGIX_DP_FUNC_EN_1, reg);
151
152 reg = SSC_FUNC_EN_N | AUX_FUNC_EN_N | SERDES_FIFO_FUNC_EN_N | LS_CLK_DOMAIN_FUNC_EN_N;
153 analogix_dp_write(dp, ANALOGIX_DP_FUNC_EN_2, reg);
154
155 usleep_range(0x14, 0x1e);
156
157 analogix_dp_lane_swap(dp, 0);
158
159 analogix_dp_write(dp, ANALOGIX_DP_SYS_CTL_1, 0x0);
160 analogix_dp_write(dp, ANALOGIX_DP_SYS_CTL_2, 0x40);
161 analogix_dp_write(dp, ANALOGIX_DP_SYS_CTL_3, 0x0);
162 analogix_dp_write(dp, ANALOGIX_DP_SYS_CTL_4, 0x0);
163
164 analogix_dp_write(dp, ANALOGIX_DP_PKT_SEND_CTL, 0x0);
165 analogix_dp_write(dp, ANALOGIX_DP_HDCP_CTL, 0x0);
166
167 analogix_dp_write(dp, ANALOGIX_DP_HPD_DEGLITCH_L, 0x5e);
168 analogix_dp_write(dp, ANALOGIX_DP_HPD_DEGLITCH_H, 0x1a);
169
170 analogix_dp_write(dp, ANALOGIX_DP_LINK_DEBUG_CTL, 0x10);
171
172 analogix_dp_write(dp, ANALOGIX_DP_PHY_TEST, 0x0);
173
174 analogix_dp_write(dp, ANALOGIX_DP_VIDEO_FIFO_THRD, 0x0);
175 analogix_dp_write(dp, ANALOGIX_DP_AUDIO_MARGIN, 0x20);
176
177 analogix_dp_write(dp, ANALOGIX_DP_M_VID_GEN_FILTER_TH, 0x4);
178 analogix_dp_write(dp, ANALOGIX_DP_M_AUD_GEN_FILTER_TH, 0x2);
179
180 analogix_dp_write(dp, ANALOGIX_DP_SOC_GENERAL_CTL, 0x00000101);
181 }
182
analogix_dp_swreset(struct analogix_dp_device * dp)183 void analogix_dp_swreset(struct analogix_dp_device *dp)
184 {
185 analogix_dp_write(dp, ANALOGIX_DP_TX_SW_RESET, RESET_DP_TX);
186 }
187
analogix_dp_config_interrupt(struct analogix_dp_device * dp)188 void analogix_dp_config_interrupt(struct analogix_dp_device *dp)
189 {
190 u32 reg;
191
192 /* 0: mask, 1: unmask */
193 reg = COMMON_INT_MASK_1;
194 analogix_dp_write(dp, ANALOGIX_DP_COMMON_INT_MASK_1, reg);
195
196 reg = COMMON_INT_MASK_2;
197 analogix_dp_write(dp, ANALOGIX_DP_COMMON_INT_MASK_2, reg);
198
199 reg = COMMON_INT_MASK_3;
200 analogix_dp_write(dp, ANALOGIX_DP_COMMON_INT_MASK_3, reg);
201
202 if (dp->force_hpd || dp->hpd_gpiod) {
203 analogix_dp_mute_hpd_interrupt(dp);
204 } else {
205 analogix_dp_unmute_hpd_interrupt(dp);
206 }
207 }
208
analogix_dp_mute_hpd_interrupt(struct analogix_dp_device * dp)209 void analogix_dp_mute_hpd_interrupt(struct analogix_dp_device *dp)
210 {
211 u32 reg;
212
213 /* 0: mask, 1: unmask */
214 reg = analogix_dp_read(dp, ANALOGIX_DP_COMMON_INT_MASK_4);
215 reg &= ~COMMON_INT_MASK_4;
216 analogix_dp_write(dp, ANALOGIX_DP_COMMON_INT_MASK_4, reg);
217
218 reg = analogix_dp_read(dp, ANALOGIX_DP_INT_STA_MASK);
219 reg &= ~INT_HPD;
220 analogix_dp_write(dp, ANALOGIX_DP_INT_STA_MASK, reg);
221 }
222
analogix_dp_unmute_hpd_interrupt(struct analogix_dp_device * dp)223 void analogix_dp_unmute_hpd_interrupt(struct analogix_dp_device *dp)
224 {
225 u32 reg;
226
227 /* 0: mask, 1: unmask */
228 reg = COMMON_INT_MASK_4;
229 analogix_dp_write(dp, ANALOGIX_DP_COMMON_INT_MASK_4, reg);
230
231 reg = analogix_dp_read(dp, ANALOGIX_DP_INT_STA_MASK);
232 reg |= INT_HPD;
233 analogix_dp_write(dp, ANALOGIX_DP_INT_STA_MASK, reg);
234 }
235
analogix_dp_get_pll_lock_status(struct analogix_dp_device * dp)236 enum pll_status analogix_dp_get_pll_lock_status(struct analogix_dp_device *dp)
237 {
238 u32 reg;
239
240 reg = analogix_dp_read(dp, ANALOGIX_DP_DEBUG_CTL);
241 if (reg & PLL_LOCK) {
242 return PLL_LOCKED;
243 } else {
244 return PLL_UNLOCKED;
245 }
246 }
247
analogix_dp_set_pll_power_down(struct analogix_dp_device * dp,bool enable)248 void analogix_dp_set_pll_power_down(struct analogix_dp_device *dp, bool enable)
249 {
250 u32 reg;
251 u32 mask = DP_PLL_PD;
252 u32 pd_addr = ANALOGIX_DP_PLL_CTL;
253
254 if (dp->plat_data && is_rockchip(dp->plat_data->dev_type)) {
255 pd_addr = ANALOGIX_DP_PD;
256 mask = RK_PLL_PD;
257 }
258
259 reg = analogix_dp_read(dp, pd_addr);
260 if (enable) {
261 reg |= mask;
262 } else {
263 reg &= ~mask;
264 }
265 analogix_dp_write(dp, pd_addr, reg);
266 }
267
analogix_dp_set_analog_power_down(struct analogix_dp_device * dp,enum analog_power_block block,bool enable)268 void analogix_dp_set_analog_power_down(struct analogix_dp_device *dp, enum analog_power_block block, bool enable)
269 {
270 u32 reg;
271 u32 phy_pd_addr = ANALOGIX_DP_PHY_PD;
272 u32 mask;
273
274 if (dp->plat_data && is_rockchip(dp->plat_data->dev_type)) {
275 phy_pd_addr = ANALOGIX_DP_PD;
276 }
277
278 switch (block) {
279 case AUX_BLOCK:
280 if (dp->plat_data && is_rockchip(dp->plat_data->dev_type)) {
281 mask = RK_AUX_PD;
282 } else {
283 mask = AUX_PD;
284 }
285
286 reg = analogix_dp_read(dp, phy_pd_addr);
287 if (enable) {
288 reg &= ~(DP_INC_BG | DP_EXP_BG);
289 reg |= mask;
290 } else {
291 reg &= ~mask;
292 }
293 analogix_dp_write(dp, phy_pd_addr, reg);
294 break;
295 case CH0_BLOCK:
296 mask = CH0_PD;
297 reg = analogix_dp_read(dp, phy_pd_addr);
298
299 if (enable) {
300 reg |= mask;
301 } else {
302 reg &= ~mask;
303 }
304 analogix_dp_write(dp, phy_pd_addr, reg);
305 break;
306 case CH1_BLOCK:
307 mask = CH1_PD;
308 reg = analogix_dp_read(dp, phy_pd_addr);
309
310 if (enable) {
311 reg |= mask;
312 } else {
313 reg &= ~mask;
314 }
315 analogix_dp_write(dp, phy_pd_addr, reg);
316 break;
317 case CH2_BLOCK:
318 mask = CH2_PD;
319 reg = analogix_dp_read(dp, phy_pd_addr);
320
321 if (enable) {
322 reg |= mask;
323 } else {
324 reg &= ~mask;
325 }
326 analogix_dp_write(dp, phy_pd_addr, reg);
327 break;
328 case CH3_BLOCK:
329 mask = CH3_PD;
330 reg = analogix_dp_read(dp, phy_pd_addr);
331
332 if (enable) {
333 reg |= mask;
334 } else {
335 reg &= ~mask;
336 }
337 analogix_dp_write(dp, phy_pd_addr, reg);
338 break;
339 case ANALOG_TOTAL:
340 /*
341 * There is no bit named DP_PHY_PD, so We used DP_INC_BG
342 * to power off everything instead of DP_PHY_PD in
343 * Rockchip
344 */
345 if (dp->plat_data && is_rockchip(dp->plat_data->dev_type)) {
346 mask = DP_INC_BG;
347 } else {
348 mask = DP_PHY_PD;
349 }
350
351 reg = analogix_dp_read(dp, phy_pd_addr);
352 if (enable) {
353 reg |= mask;
354 } else {
355 reg &= ~mask;
356 }
357
358 analogix_dp_write(dp, phy_pd_addr, reg);
359 if (dp->plat_data && is_rockchip(dp->plat_data->dev_type)) {
360 usleep_range(10, 15);
361 }
362 break;
363 case POWER_ALL:
364 if (enable) {
365 reg = DP_ALL_PD;
366 analogix_dp_write(dp, phy_pd_addr, reg);
367 } else {
368 reg = DP_ALL_PD;
369 analogix_dp_write(dp, phy_pd_addr, reg);
370 usleep_range(10, 15);
371 reg &= ~DP_INC_BG;
372 analogix_dp_write(dp, phy_pd_addr, reg);
373 usleep_range(10, 15);
374
375 analogix_dp_write(dp, phy_pd_addr, 0x00);
376 }
377 break;
378 default:
379 break;
380 }
381 }
382
analogix_dp_init_analog_func(struct analogix_dp_device * dp)383 int analogix_dp_init_analog_func(struct analogix_dp_device *dp)
384 {
385 u32 reg;
386
387 analogix_dp_set_analog_power_down(dp, POWER_ALL, 0);
388
389 reg = PLL_LOCK_CHG;
390 analogix_dp_write(dp, ANALOGIX_DP_COMMON_INT_STA_1, reg);
391
392 reg = analogix_dp_read(dp, ANALOGIX_DP_DEBUG_CTL);
393 reg &= ~(F_PLL_LOCK | PLL_LOCK_CTRL);
394 analogix_dp_write(dp, ANALOGIX_DP_DEBUG_CTL, reg);
395
396 /* Power up PLL */
397 analogix_dp_set_pll_power_down(dp, 0);
398
399 /* Enable Serdes FIFO function and Link symbol clock domain module */
400 reg = analogix_dp_read(dp, ANALOGIX_DP_FUNC_EN_2);
401 reg &= ~(SERDES_FIFO_FUNC_EN_N | LS_CLK_DOMAIN_FUNC_EN_N | AUX_FUNC_EN_N);
402 analogix_dp_write(dp, ANALOGIX_DP_FUNC_EN_2, reg);
403 return 0;
404 }
405
analogix_dp_clear_hotplug_interrupts(struct analogix_dp_device * dp)406 void analogix_dp_clear_hotplug_interrupts(struct analogix_dp_device *dp)
407 {
408 u32 reg;
409
410 if (dp->hpd_gpiod) {
411 return;
412 }
413
414 reg = HOTPLUG_CHG | HPD_LOST | PLUG;
415 analogix_dp_write(dp, ANALOGIX_DP_COMMON_INT_STA_4, reg);
416
417 reg = INT_HPD;
418 analogix_dp_write(dp, ANALOGIX_DP_INT_STA, reg);
419 }
420
analogix_dp_init_hpd(struct analogix_dp_device * dp)421 void analogix_dp_init_hpd(struct analogix_dp_device *dp)
422 {
423 u32 reg;
424
425 if (dp->hpd_gpiod) {
426 return;
427 }
428
429 analogix_dp_clear_hotplug_interrupts(dp);
430
431 reg = analogix_dp_read(dp, ANALOGIX_DP_SYS_CTL_3);
432 reg &= ~(F_HPD | HPD_CTRL);
433 analogix_dp_write(dp, ANALOGIX_DP_SYS_CTL_3, reg);
434 }
435
analogix_dp_force_hpd(struct analogix_dp_device * dp)436 void analogix_dp_force_hpd(struct analogix_dp_device *dp)
437 {
438 u32 reg;
439
440 reg = analogix_dp_read(dp, ANALOGIX_DP_SYS_CTL_3);
441 reg |= (F_HPD | HPD_CTRL);
442 analogix_dp_write(dp, ANALOGIX_DP_SYS_CTL_3, reg);
443 }
444
analogix_dp_get_irq_type(struct analogix_dp_device * dp)445 enum dp_irq_type analogix_dp_get_irq_type(struct analogix_dp_device *dp)
446 {
447 u32 reg;
448
449 /* Parse hotplug interrupt status register */
450 reg = analogix_dp_read(dp, ANALOGIX_DP_COMMON_INT_STA_4);
451 if (reg & PLUG) {
452 return DP_IRQ_TYPE_HP_CABLE_IN;
453 }
454
455 if (reg & HPD_LOST) {
456 return DP_IRQ_TYPE_HP_CABLE_OUT;
457 }
458
459 if (reg & HOTPLUG_CHG) {
460 return DP_IRQ_TYPE_HP_CHANGE;
461 }
462
463 return DP_IRQ_TYPE_UNKNOWN;
464 }
465
analogix_dp_reset_aux(struct analogix_dp_device * dp)466 void analogix_dp_reset_aux(struct analogix_dp_device *dp)
467 {
468 u32 reg;
469
470 /* Disable AUX channel module */
471 reg = analogix_dp_read(dp, ANALOGIX_DP_FUNC_EN_2);
472 reg |= AUX_FUNC_EN_N;
473 analogix_dp_write(dp, ANALOGIX_DP_FUNC_EN_2, reg);
474 }
475
analogix_dp_init_aux(struct analogix_dp_device * dp)476 void analogix_dp_init_aux(struct analogix_dp_device *dp)
477 {
478 u32 reg;
479
480 /* Clear inerrupts related to AUX channel */
481 reg = RPLY_RECEIV | AUX_ERR;
482 analogix_dp_write(dp, ANALOGIX_DP_INT_STA, reg);
483
484 analogix_dp_set_analog_power_down(dp, AUX_BLOCK, true);
485 usleep_range(10, 11);
486 analogix_dp_set_analog_power_down(dp, AUX_BLOCK, false);
487
488 analogix_dp_reset_aux(dp);
489
490 /* AUX_BIT_PERIOD_EXPECTED_DELAY doesn't apply to Rockchip IP */
491 if (dp->plat_data && is_rockchip(dp->plat_data->dev_type)) {
492 reg = 0;
493 } else {
494 reg = AUX_BIT_PERIOD_EXPECTED_DELAY(3);
495 }
496
497 /* Disable AUX transaction H/W retry */
498 reg |= AUX_HW_RETRY_COUNT_SEL(0) | AUX_HW_RETRY_INTERVAL_600_MICROSECONDS;
499
500 analogix_dp_write(dp, ANALOGIX_DP_AUX_HW_RETRY_CTL, reg);
501
502 /* Receive AUX Channel DEFER commands equal to DEFFER_COUNT*64 */
503 reg = DEFER_CTRL_EN | DEFER_COUNT(1);
504 analogix_dp_write(dp, ANALOGIX_DP_AUX_CH_DEFER_CTL, reg);
505
506 /* Enable AUX channel module */
507 analogix_dp_enable_sw_function(dp);
508 reg = analogix_dp_read(dp, ANALOGIX_DP_FUNC_EN_2);
509 reg &= ~AUX_FUNC_EN_N;
510 analogix_dp_write(dp, ANALOGIX_DP_FUNC_EN_2, reg);
511 }
512
analogix_dp_get_plug_in_status(struct analogix_dp_device * dp)513 int analogix_dp_get_plug_in_status(struct analogix_dp_device *dp)
514 {
515 u32 reg;
516
517 if (dp->hpd_gpiod) {
518 if (gpiod_get_value(dp->hpd_gpiod)) {
519 return 0;
520 }
521 } else {
522 reg = analogix_dp_read(dp, ANALOGIX_DP_SYS_CTL_3);
523 if (reg & HPD_STATUS) {
524 return 0;
525 }
526 }
527
528 return -EINVAL;
529 }
530
analogix_dp_enable_sw_function(struct analogix_dp_device * dp)531 void analogix_dp_enable_sw_function(struct analogix_dp_device *dp)
532 {
533 u32 reg;
534
535 reg = analogix_dp_read(dp, ANALOGIX_DP_FUNC_EN_1);
536 reg &= ~SW_FUNC_EN_N;
537 analogix_dp_write(dp, ANALOGIX_DP_FUNC_EN_1, reg);
538 }
539
analogix_dp_ssc_enable(struct analogix_dp_device * dp)540 static void analogix_dp_ssc_enable(struct analogix_dp_device *dp)
541 {
542 u32 reg;
543
544 /* 4500ppm */
545 writel(0x19, dp->reg_base + ANALOIGX_DP_SSC_REG);
546 /*
547 * To apply updated SSC parameters into SSC operation,
548 * firmware must disable and enable this bit.
549 */
550 reg = readl(dp->reg_base + ANALOGIX_DP_FUNC_EN_2);
551 reg |= SSC_FUNC_EN_N;
552 writel(reg, dp->reg_base + ANALOGIX_DP_FUNC_EN_2);
553 reg &= ~SSC_FUNC_EN_N;
554 writel(reg, dp->reg_base + ANALOGIX_DP_FUNC_EN_2);
555 }
556
analogix_dp_ssc_disable(struct analogix_dp_device * dp)557 static void analogix_dp_ssc_disable(struct analogix_dp_device *dp)
558 {
559 u32 reg;
560
561 reg = readl(dp->reg_base + ANALOGIX_DP_FUNC_EN_2);
562 reg |= SSC_FUNC_EN_N;
563 writel(reg, dp->reg_base + ANALOGIX_DP_FUNC_EN_2);
564 }
565
analogix_dp_ssc_supported(struct analogix_dp_device * dp)566 bool analogix_dp_ssc_supported(struct analogix_dp_device *dp)
567 {
568 /* Check if SSC is supported by both sides */
569 return dp->plat_data->ssc && dp->link_train.ssc;
570 }
571
analogix_dp_set_link_bandwidth(struct analogix_dp_device * dp,u32 bwtype)572 void analogix_dp_set_link_bandwidth(struct analogix_dp_device *dp, u32 bwtype)
573 {
574 u32 status;
575 int ret;
576
577 analogix_dp_write(dp, ANALOGIX_DP_LINK_BW_SET, bwtype);
578
579 if (dp->phy) {
580 union phy_configure_opts phy_cfg = {0};
581
582 phy_cfg.dp.lanes = dp->link_train.lane_count;
583 phy_cfg.dp.link_rate = drm_dp_bw_code_to_link_rate(dp->link_train.link_rate) / 100;
584 phy_cfg.dp.ssc = analogix_dp_ssc_supported(dp);
585 phy_cfg.dp.set_lanes = false;
586 phy_cfg.dp.set_rate = true;
587 phy_cfg.dp.set_voltages = false;
588 ret = phy_configure(dp->phy, &phy_cfg);
589 if (ret && ret != -EOPNOTSUPP) {
590 dev_err(dp->dev, "%s: phy_configure failed: %d\n", __func__, ret);
591 return;
592 }
593 } else {
594 if (analogix_dp_ssc_supported(dp)) {
595 analogix_dp_ssc_enable(dp);
596 } else {
597 analogix_dp_ssc_disable(dp);
598 }
599 }
600
601 ret = readx_poll_timeout(analogix_dp_get_pll_lock_status, dp, status, status != PLL_UNLOCKED, 120,
602 120 * DP_TIMEOUT_LOOP_COUNT);
603 if (ret) {
604 dev_err(dp->dev, "Wait for pll lock failed %d\n", ret);
605 return;
606 }
607 }
608
analogix_dp_get_link_bandwidth(struct analogix_dp_device * dp,u32 * bwtype)609 void analogix_dp_get_link_bandwidth(struct analogix_dp_device *dp, u32 *bwtype)
610 {
611 u32 reg;
612
613 reg = analogix_dp_read(dp, ANALOGIX_DP_LINK_BW_SET);
614 *bwtype = reg;
615 }
616
analogix_dp_set_lane_count(struct analogix_dp_device * dp,u32 count)617 void analogix_dp_set_lane_count(struct analogix_dp_device *dp, u32 count)
618 {
619 u32 reg;
620 int ret;
621
622 reg = count;
623 analogix_dp_write(dp, ANALOGIX_DP_LANE_COUNT_SET, reg);
624
625 if (dp->phy) {
626 union phy_configure_opts phy_cfg = {0};
627
628 phy_cfg.dp.lanes = dp->link_train.lane_count;
629 phy_cfg.dp.set_lanes = true;
630 phy_cfg.dp.set_rate = false;
631 phy_cfg.dp.set_voltages = false;
632 ret = phy_configure(dp->phy, &phy_cfg);
633 if (ret && ret != -EOPNOTSUPP) {
634 dev_err(dp->dev, "%s: phy_configure() failed: %d\n", __func__, ret);
635 return;
636 }
637 }
638 }
639
analogix_dp_get_lane_count(struct analogix_dp_device * dp,u32 * count)640 void analogix_dp_get_lane_count(struct analogix_dp_device *dp, u32 *count)
641 {
642 u32 reg;
643
644 reg = analogix_dp_read(dp, ANALOGIX_DP_LANE_COUNT_SET);
645 *count = reg;
646 }
647
analogix_dp_set_lane_link_training(struct analogix_dp_device * dp)648 void analogix_dp_set_lane_link_training(struct analogix_dp_device *dp)
649 {
650 u8 lane;
651 int ret;
652
653 for (lane = 0; lane < dp->link_train.lane_count; lane++) {
654 analogix_dp_write(dp, ANALOGIX_DP_LN0_LINK_TRAINING_CTL + 4 * lane, dp->link_train.training_lane[lane]);
655 }
656
657 if (dp->phy) {
658 union phy_configure_opts phy_cfg = {0};
659
660 for (lane = 0; lane < dp->link_train.lane_count; lane++) {
661 u8 training_lane = dp->link_train.training_lane[lane];
662 u8 vs, pe;
663
664 vs = (training_lane & DP_TRAIN_VOLTAGE_SWING_MASK) >> DP_TRAIN_VOLTAGE_SWING_SHIFT;
665 pe = (training_lane & DP_TRAIN_PRE_EMPHASIS_MASK) >> DP_TRAIN_PRE_EMPHASIS_SHIFT;
666 phy_cfg.dp.voltage[lane] = vs;
667 phy_cfg.dp.pre[lane] = pe;
668 }
669
670 phy_cfg.dp.lanes = dp->link_train.lane_count;
671 phy_cfg.dp.link_rate = drm_dp_bw_code_to_link_rate(dp->link_train.link_rate) / 100;
672 phy_cfg.dp.set_lanes = false;
673 phy_cfg.dp.set_rate = false;
674 phy_cfg.dp.set_voltages = true;
675 ret = phy_configure(dp->phy, &phy_cfg);
676 if (ret && ret != -EOPNOTSUPP) {
677 dev_err(dp->dev, "%s: phy_configure() failed: %d\n", __func__, ret);
678 return;
679 }
680 }
681 }
682
analogix_dp_get_lane_link_training(struct analogix_dp_device * dp,u8 lane)683 u32 analogix_dp_get_lane_link_training(struct analogix_dp_device *dp, u8 lane)
684 {
685 return analogix_dp_read(dp, ANALOGIX_DP_LN0_LINK_TRAINING_CTL + 4 * lane);
686 }
687
analogix_dp_enable_enhanced_mode(struct analogix_dp_device * dp,bool enable)688 void analogix_dp_enable_enhanced_mode(struct analogix_dp_device *dp, bool enable)
689 {
690 u32 reg;
691
692 if (enable) {
693 reg = analogix_dp_read(dp, ANALOGIX_DP_SYS_CTL_4);
694 reg |= ENHANCED;
695 analogix_dp_write(dp, ANALOGIX_DP_SYS_CTL_4, reg);
696 } else {
697 reg = analogix_dp_read(dp, ANALOGIX_DP_SYS_CTL_4);
698 reg &= ~ENHANCED;
699 analogix_dp_write(dp, ANALOGIX_DP_SYS_CTL_4, reg);
700 }
701 }
702
analogix_dp_set_training_pattern(struct analogix_dp_device * dp,enum pattern_set pattern)703 void analogix_dp_set_training_pattern(struct analogix_dp_device *dp, enum pattern_set pattern)
704 {
705 u32 reg;
706
707 switch (pattern) {
708 case PRBS7:
709 reg = SCRAMBLING_ENABLE | LINK_QUAL_PATTERN_SET_PRBS7;
710 analogix_dp_write(dp, ANALOGIX_DP_TRAINING_PTN_SET, reg);
711 break;
712 case D10_2:
713 reg = SCRAMBLING_ENABLE | LINK_QUAL_PATTERN_SET_D10_2;
714 analogix_dp_write(dp, ANALOGIX_DP_TRAINING_PTN_SET, reg);
715 break;
716 case TRAINING_PTN1:
717 reg = SCRAMBLING_DISABLE | SW_TRAINING_PATTERN_SET_PTN1;
718 analogix_dp_write(dp, ANALOGIX_DP_TRAINING_PTN_SET, reg);
719 break;
720 case TRAINING_PTN2:
721 reg = SCRAMBLING_DISABLE | SW_TRAINING_PATTERN_SET_PTN2;
722 analogix_dp_write(dp, ANALOGIX_DP_TRAINING_PTN_SET, reg);
723 break;
724 case TRAINING_PTN3:
725 reg = SCRAMBLING_DISABLE | SW_TRAINING_PATTERN_SET_PTN3;
726 analogix_dp_write(dp, ANALOGIX_DP_TRAINING_PTN_SET, reg);
727 break;
728 case DP_NONE:
729 reg = SCRAMBLING_ENABLE | LINK_QUAL_PATTERN_SET_DISABLE | SW_TRAINING_PATTERN_SET_NORMAL;
730 analogix_dp_write(dp, ANALOGIX_DP_TRAINING_PTN_SET, reg);
731 break;
732 default:
733 break;
734 }
735 }
736
analogix_dp_reset_macro(struct analogix_dp_device * dp)737 void analogix_dp_reset_macro(struct analogix_dp_device *dp)
738 {
739 u32 reg;
740
741 reg = analogix_dp_read(dp, ANALOGIX_DP_PHY_TEST);
742 reg |= MACRO_RST;
743 analogix_dp_write(dp, ANALOGIX_DP_PHY_TEST, reg);
744
745 /* 10 us is the minimum reset time. */
746 usleep_range(10, 20);
747
748 reg &= ~MACRO_RST;
749 analogix_dp_write(dp, ANALOGIX_DP_PHY_TEST, reg);
750 }
751
analogix_dp_init_video(struct analogix_dp_device * dp)752 void analogix_dp_init_video(struct analogix_dp_device *dp)
753 {
754 u32 reg;
755
756 reg = VSYNC_DET | VID_FORMAT_CHG | VID_CLK_CHG;
757 analogix_dp_write(dp, ANALOGIX_DP_COMMON_INT_STA_1, reg);
758
759 reg = 0x0;
760 analogix_dp_write(dp, ANALOGIX_DP_SYS_CTL_1, reg);
761
762 reg = CHA_CRI(4) | CHA_CTRL;
763 analogix_dp_write(dp, ANALOGIX_DP_SYS_CTL_2, reg);
764
765 reg = 0x0;
766 analogix_dp_write(dp, ANALOGIX_DP_SYS_CTL_3, reg);
767
768 reg = VID_HRES_TH(2) | VID_VRES_TH(0);
769 analogix_dp_write(dp, ANALOGIX_DP_VIDEO_CTL_8, reg);
770 }
771
analogix_dp_set_video_color_format(struct analogix_dp_device * dp)772 void analogix_dp_set_video_color_format(struct analogix_dp_device *dp)
773 {
774 u32 reg;
775
776 /* Configure the input color depth, color space, dynamic range */
777 reg = (dp->video_info.dynamic_range << IN_D_RANGE_SHIFT) | (dp->video_info.color_depth << IN_BPC_SHIFT) |
778 (dp->video_info.color_space << IN_COLOR_F_SHIFT);
779 analogix_dp_write(dp, ANALOGIX_DP_VIDEO_CTL_2, reg);
780
781 /* Set Input Color YCbCr Coefficients to ITU601 or ITU709 */
782 reg = analogix_dp_read(dp, ANALOGIX_DP_VIDEO_CTL_3);
783 reg &= ~IN_YC_COEFFI_MASK;
784 if (dp->video_info.ycbcr_coeff) {
785 reg |= IN_YC_COEFFI_ITU709;
786 } else {
787 reg |= IN_YC_COEFFI_ITU601;
788 }
789 analogix_dp_write(dp, ANALOGIX_DP_VIDEO_CTL_3, reg);
790 }
791
analogix_dp_is_slave_video_stream_clock_on(struct analogix_dp_device * dp)792 int analogix_dp_is_slave_video_stream_clock_on(struct analogix_dp_device *dp)
793 {
794 u32 reg;
795
796 reg = analogix_dp_read(dp, ANALOGIX_DP_SYS_CTL_1);
797 analogix_dp_write(dp, ANALOGIX_DP_SYS_CTL_1, reg);
798
799 reg = analogix_dp_read(dp, ANALOGIX_DP_SYS_CTL_1);
800 if (!(reg & DET_STA)) {
801 dev_dbg(dp->dev, "Input stream clock not detected.\n");
802 return -EINVAL;
803 }
804
805 reg = analogix_dp_read(dp, ANALOGIX_DP_SYS_CTL_2);
806 analogix_dp_write(dp, ANALOGIX_DP_SYS_CTL_2, reg);
807
808 reg = analogix_dp_read(dp, ANALOGIX_DP_SYS_CTL_2);
809 dev_dbg(dp->dev, "wait SYS_CTL_2.\n");
810
811 if (reg & CHA_STA) {
812 dev_dbg(dp->dev, "Input stream clk is changing\n");
813 return -EINVAL;
814 }
815
816 return 0;
817 }
818
analogix_dp_set_video_cr_mn(struct analogix_dp_device * dp,enum clock_recovery_m_value_type type,u32 m_value,u32 n_value)819 void analogix_dp_set_video_cr_mn(struct analogix_dp_device *dp, enum clock_recovery_m_value_type type, u32 m_value,
820 u32 n_value)
821 {
822 u32 reg;
823
824 if (type == REGISTER_M) {
825 reg = analogix_dp_read(dp, ANALOGIX_DP_SYS_CTL_4);
826 reg |= FIX_M_VID;
827 analogix_dp_write(dp, ANALOGIX_DP_SYS_CTL_4, reg);
828 reg = m_value & 0xff;
829 analogix_dp_write(dp, ANALOGIX_DP_M_VID_0, reg);
830 reg = (m_value >> 8) & 0xff;
831 analogix_dp_write(dp, ANALOGIX_DP_M_VID_1, reg);
832 reg = (m_value >> 16) & 0xff;
833 analogix_dp_write(dp, ANALOGIX_DP_M_VID_2, reg);
834
835 reg = n_value & 0xff;
836 analogix_dp_write(dp, ANALOGIX_DP_N_VID_0, reg);
837 reg = (n_value >> 8) & 0xff;
838 analogix_dp_write(dp, ANALOGIX_DP_N_VID_1, reg);
839 reg = (n_value >> 16) & 0xff;
840 analogix_dp_write(dp, ANALOGIX_DP_N_VID_2, reg);
841 } else {
842 reg = analogix_dp_read(dp, ANALOGIX_DP_SYS_CTL_4);
843 reg &= ~FIX_M_VID;
844 analogix_dp_write(dp, ANALOGIX_DP_SYS_CTL_4, reg);
845
846 analogix_dp_write(dp, ANALOGIX_DP_N_VID_0, 0x00);
847 analogix_dp_write(dp, ANALOGIX_DP_N_VID_1, 0x80);
848 analogix_dp_write(dp, ANALOGIX_DP_N_VID_2, 0x00);
849 }
850 }
851
analogix_dp_set_video_timing_mode(struct analogix_dp_device * dp,u32 type)852 void analogix_dp_set_video_timing_mode(struct analogix_dp_device *dp, u32 type)
853 {
854 u32 reg;
855
856 if (type == VIDEO_TIMING_FROM_CAPTURE) {
857 reg = analogix_dp_read(dp, ANALOGIX_DP_VIDEO_CTL_10);
858 reg &= ~FORMAT_SEL;
859 analogix_dp_write(dp, ANALOGIX_DP_VIDEO_CTL_10, reg);
860 } else {
861 reg = analogix_dp_read(dp, ANALOGIX_DP_VIDEO_CTL_10);
862 reg |= FORMAT_SEL;
863 analogix_dp_write(dp, ANALOGIX_DP_VIDEO_CTL_10, reg);
864 }
865 }
866
analogix_dp_enable_video_master(struct analogix_dp_device * dp,bool enable)867 void analogix_dp_enable_video_master(struct analogix_dp_device *dp, bool enable)
868 {
869 u32 reg;
870
871 if (enable) {
872 reg = analogix_dp_read(dp, ANALOGIX_DP_SOC_GENERAL_CTL);
873 reg &= ~VIDEO_MODE_MASK;
874 reg |= VIDEO_MASTER_MODE_EN | VIDEO_MODE_MASTER_MODE;
875 analogix_dp_write(dp, ANALOGIX_DP_SOC_GENERAL_CTL, reg);
876 } else {
877 reg = analogix_dp_read(dp, ANALOGIX_DP_SOC_GENERAL_CTL);
878 reg &= ~VIDEO_MODE_MASK;
879 reg |= VIDEO_MODE_SLAVE_MODE;
880 analogix_dp_write(dp, ANALOGIX_DP_SOC_GENERAL_CTL, reg);
881 }
882 }
883
analogix_dp_start_video(struct analogix_dp_device * dp)884 void analogix_dp_start_video(struct analogix_dp_device *dp)
885 {
886 u32 reg;
887
888 reg = analogix_dp_read(dp, ANALOGIX_DP_VIDEO_CTL_1);
889 reg |= VIDEO_EN;
890 analogix_dp_write(dp, ANALOGIX_DP_VIDEO_CTL_1, reg);
891 }
892
analogix_dp_is_video_stream_on(struct analogix_dp_device * dp)893 int analogix_dp_is_video_stream_on(struct analogix_dp_device *dp)
894 {
895 u32 reg;
896
897 reg = analogix_dp_read(dp, ANALOGIX_DP_SYS_CTL_3);
898 analogix_dp_write(dp, ANALOGIX_DP_SYS_CTL_3, reg);
899
900 reg = analogix_dp_read(dp, ANALOGIX_DP_SYS_CTL_3);
901 if (!(reg & STRM_VALID)) {
902 dev_dbg(dp->dev, "Input video stream is not detected.\n");
903 return -EINVAL;
904 }
905
906 return 0;
907 }
908
analogix_dp_config_video_slave_mode(struct analogix_dp_device * dp)909 void analogix_dp_config_video_slave_mode(struct analogix_dp_device *dp)
910 {
911 u32 reg;
912
913 reg = analogix_dp_read(dp, ANALOGIX_DP_FUNC_EN_1);
914 if (dp->plat_data && is_rockchip(dp->plat_data->dev_type)) {
915 reg &= ~(RK_VID_CAP_FUNC_EN_N | RK_VID_FIFO_FUNC_EN_N);
916 } else {
917 reg &= ~(MASTER_VID_FUNC_EN_N | SLAVE_VID_FUNC_EN_N);
918 reg |= MASTER_VID_FUNC_EN_N;
919 }
920 analogix_dp_write(dp, ANALOGIX_DP_FUNC_EN_1, reg);
921
922 reg = analogix_dp_read(dp, ANALOGIX_DP_VIDEO_CTL_10);
923 reg &= ~INTERACE_SCAN_CFG;
924 reg |= (dp->video_info.interlaced << 2);
925 analogix_dp_write(dp, ANALOGIX_DP_VIDEO_CTL_10, reg);
926
927 reg = analogix_dp_read(dp, ANALOGIX_DP_VIDEO_CTL_10);
928 reg &= ~VSYNC_POLARITY_CFG;
929 reg |= (dp->video_info.v_sync_polarity << 1);
930 analogix_dp_write(dp, ANALOGIX_DP_VIDEO_CTL_10, reg);
931
932 reg = analogix_dp_read(dp, ANALOGIX_DP_VIDEO_CTL_10);
933 reg &= ~HSYNC_POLARITY_CFG;
934 reg |= (dp->video_info.h_sync_polarity << 0);
935 analogix_dp_write(dp, ANALOGIX_DP_VIDEO_CTL_10, reg);
936
937 reg = AUDIO_MODE_SPDIF_MODE | VIDEO_MODE_SLAVE_MODE;
938 analogix_dp_write(dp, ANALOGIX_DP_SOC_GENERAL_CTL, reg);
939 }
940
analogix_dp_enable_scrambling(struct analogix_dp_device * dp)941 void analogix_dp_enable_scrambling(struct analogix_dp_device *dp)
942 {
943 u32 reg;
944
945 reg = analogix_dp_read(dp, ANALOGIX_DP_TRAINING_PTN_SET);
946 reg &= ~SCRAMBLING_DISABLE;
947 analogix_dp_write(dp, ANALOGIX_DP_TRAINING_PTN_SET, reg);
948 }
949
analogix_dp_disable_scrambling(struct analogix_dp_device * dp)950 void analogix_dp_disable_scrambling(struct analogix_dp_device *dp)
951 {
952 u32 reg;
953
954 reg = analogix_dp_read(dp, ANALOGIX_DP_TRAINING_PTN_SET);
955 reg |= SCRAMBLING_DISABLE;
956 analogix_dp_write(dp, ANALOGIX_DP_TRAINING_PTN_SET, reg);
957 }
958
analogix_dp_enable_psr_crc(struct analogix_dp_device * dp)959 void analogix_dp_enable_psr_crc(struct analogix_dp_device *dp)
960 {
961 analogix_dp_write(dp, ANALOGIX_DP_CRC_CON, PSR_VID_CRC_ENABLE);
962 }
963
analogix_dp_get_psr_status(struct analogix_dp_device * dp)964 static ssize_t analogix_dp_get_psr_status(struct analogix_dp_device *dp)
965 {
966 ssize_t val;
967 u8 status;
968
969 val = drm_dp_dpcd_readb(&dp->aux, DP_PSR_STATUS, &status);
970 if (val < 0) {
971 dev_err(dp->dev, "PSR_STATUS read failed ret=%zd", val);
972 return val;
973 }
974 return status;
975 }
976
analogix_dp_send_psr_spd(struct analogix_dp_device * dp,struct dp_sdp * vsc,bool blocking)977 int analogix_dp_send_psr_spd(struct analogix_dp_device *dp, struct dp_sdp *vsc, bool blocking)
978 {
979 unsigned int val;
980 int ret;
981 ssize_t psr_status;
982
983 /* don't send info frame */
984 val = analogix_dp_read(dp, ANALOGIX_DP_PKT_SEND_CTL);
985 val &= ~IF_EN;
986 analogix_dp_write(dp, ANALOGIX_DP_PKT_SEND_CTL, val);
987
988 /* configure single frame update mode */
989 analogix_dp_write(dp, ANALOGIX_DP_PSR_FRAME_UPDATE_CTRL, PSR_FRAME_UP_TYPE_BURST | PSR_CRC_SEL_HARDWARE);
990
991 /* configure VSC HB0~HB3 */
992 analogix_dp_write(dp, ANALOGIX_DP_SPD_HB0, vsc->sdp_header.HB0);
993 analogix_dp_write(dp, ANALOGIX_DP_SPD_HB1, vsc->sdp_header.HB1);
994 analogix_dp_write(dp, ANALOGIX_DP_SPD_HB2, vsc->sdp_header.HB2);
995 analogix_dp_write(dp, ANALOGIX_DP_SPD_HB3, vsc->sdp_header.HB3);
996
997 /* configure reused VSC PB0~PB3, magic number from vendor */
998 analogix_dp_write(dp, ANALOGIX_DP_SPD_PB0, 0x00);
999 analogix_dp_write(dp, ANALOGIX_DP_SPD_PB1, 0x16);
1000 analogix_dp_write(dp, ANALOGIX_DP_SPD_PB2, 0xCE);
1001 analogix_dp_write(dp, ANALOGIX_DP_SPD_PB3, 0x5D);
1002
1003 /* configure DB0 / DB1 values */
1004 analogix_dp_write(dp, ANALOGIX_DP_VSC_SHADOW_DB0, vsc->db[0]);
1005 analogix_dp_write(dp, ANALOGIX_DP_VSC_SHADOW_DB1, vsc->db[1]);
1006
1007 /* set reuse spd inforframe */
1008 val = analogix_dp_read(dp, ANALOGIX_DP_VIDEO_CTL_3);
1009 val |= REUSE_SPD_EN;
1010 analogix_dp_write(dp, ANALOGIX_DP_VIDEO_CTL_3, val);
1011
1012 /* mark info frame update */
1013 val = analogix_dp_read(dp, ANALOGIX_DP_PKT_SEND_CTL);
1014 val = (val | IF_UP) & ~IF_EN;
1015 analogix_dp_write(dp, ANALOGIX_DP_PKT_SEND_CTL, val);
1016
1017 /* send info frame */
1018 val = analogix_dp_read(dp, ANALOGIX_DP_PKT_SEND_CTL);
1019 val |= IF_EN;
1020 analogix_dp_write(dp, ANALOGIX_DP_PKT_SEND_CTL, val);
1021
1022 if (!blocking) {
1023 return 0;
1024 }
1025
1026 ret = readx_poll_timeout(analogix_dp_get_psr_status, dp, psr_status,
1027 psr_status >= 0 && ((vsc->db[1] && psr_status == DP_PSR_SINK_ACTIVE_RFB) ||
1028 (!vsc->db[1] && psr_status == DP_PSR_SINK_INACTIVE)),
1029 1500, DP_TIMEOUT_PSR_LOOP_MS * 1000);
1030 if (ret) {
1031 dev_warn(dp->dev, "Failed to apply PSR %d\n", ret);
1032 return ret;
1033 }
1034 return 0;
1035 }
1036
analogix_dp_phy_power_on(struct analogix_dp_device * dp)1037 void analogix_dp_phy_power_on(struct analogix_dp_device *dp)
1038 {
1039 if (dp->phy_enabled) {
1040 return;
1041 }
1042
1043 phy_set_mode(dp->phy, PHY_MODE_DP);
1044 phy_power_on(dp->phy);
1045
1046 dp->phy_enabled = true;
1047 }
1048
analogix_dp_phy_power_off(struct analogix_dp_device * dp)1049 void analogix_dp_phy_power_off(struct analogix_dp_device *dp)
1050 {
1051 if (!dp->phy_enabled) {
1052 return;
1053 }
1054
1055 phy_power_off(dp->phy);
1056
1057 dp->phy_enabled = false;
1058 }
1059
1060 enum {
1061 AUX_STATUS_OK,
1062 AUX_STATUS_NACK_ERROR,
1063 AUX_STATUS_TIMEOUT_ERROR,
1064 AUX_STATUS_UNKNOWN_ERROR,
1065 AUX_STATUS_MUCH_DEFER_ERROR,
1066 AUX_STATUS_TX_SHORT_ERROR,
1067 AUX_STATUS_RX_SHORT_ERROR,
1068 AUX_STATUS_NACK_WITHOUT_M_ERROR,
1069 AUX_STATUS_I2C_NACK_ERROR
1070 };
1071
analogix_dp_transfer(struct analogix_dp_device * dp,struct drm_dp_aux_msg * msg)1072 ssize_t analogix_dp_transfer(struct analogix_dp_device *dp, struct drm_dp_aux_msg *msg)
1073 {
1074 u32 reg;
1075 u8 *buffer = msg->buffer;
1076 unsigned int i;
1077 int num_transferred = 0;
1078 int ret;
1079
1080 /* Buffer size of AUX CH is 16 bytes */
1081 if (WARN_ON(msg->size > 16)) {
1082 return -E2BIG;
1083 }
1084
1085 reg = analogix_dp_read(dp, ANALOGIX_DP_FUNC_EN_2);
1086 if (reg & AUX_FUNC_EN_N) {
1087 analogix_dp_phy_power_on(dp);
1088 analogix_dp_init_aux(dp);
1089 }
1090
1091 /* Clear AUX CH data buffer */
1092 reg = BUF_CLR;
1093 analogix_dp_write(dp, ANALOGIX_DP_BUFFER_DATA_CTL, reg);
1094
1095 switch (msg->request & ~DP_AUX_I2C_MOT) {
1096 case DP_AUX_I2C_WRITE:
1097 reg = AUX_TX_COMM_WRITE | AUX_TX_COMM_I2C_TRANSACTION;
1098 if (msg->request & DP_AUX_I2C_MOT) {
1099 reg |= AUX_TX_COMM_MOT;
1100 }
1101 break;
1102
1103 case DP_AUX_I2C_READ:
1104 reg = AUX_TX_COMM_READ | AUX_TX_COMM_I2C_TRANSACTION;
1105 if (msg->request & DP_AUX_I2C_MOT) {
1106 reg |= AUX_TX_COMM_MOT;
1107 }
1108 break;
1109
1110 case DP_AUX_NATIVE_WRITE:
1111 reg = AUX_TX_COMM_WRITE | AUX_TX_COMM_DP_TRANSACTION;
1112 break;
1113
1114 case DP_AUX_NATIVE_READ:
1115 reg = AUX_TX_COMM_READ | AUX_TX_COMM_DP_TRANSACTION;
1116 break;
1117
1118 default:
1119 return -EINVAL;
1120 }
1121
1122 reg |= AUX_LENGTH(msg->size);
1123 analogix_dp_write(dp, ANALOGIX_DP_AUX_CH_CTL_1, reg);
1124
1125 /* Select DPCD device address */
1126 reg = AUX_ADDR_7_0(msg->address);
1127 analogix_dp_write(dp, ANALOGIX_DP_AUX_ADDR_7_0, reg);
1128 reg = AUX_ADDR_15_8(msg->address);
1129 analogix_dp_write(dp, ANALOGIX_DP_AUX_ADDR_15_8, reg);
1130 reg = AUX_ADDR_19_16(msg->address);
1131 analogix_dp_write(dp, ANALOGIX_DP_AUX_ADDR_19_16, reg);
1132
1133 if (!(msg->request & DP_AUX_I2C_READ)) {
1134 for (i = 0; i < msg->size; i++) {
1135 reg = buffer[i];
1136 analogix_dp_write(dp, ANALOGIX_DP_BUF_DATA_0 + 0x4 * i, reg);
1137 num_transferred++;
1138 }
1139 }
1140
1141 /* Enable AUX CH operation */
1142 reg = AUX_EN;
1143
1144 /* Zero-sized messages specify address-only transactions. */
1145 if (msg->size < 1) {
1146 reg |= ADDR_ONLY;
1147 }
1148
1149 analogix_dp_write(dp, ANALOGIX_DP_AUX_CH_CTL_2, reg);
1150
1151 ret = readx_poll_timeout(readl, dp->reg_base + ANALOGIX_DP_AUX_CH_CTL_2, reg, !(reg & AUX_EN), 0x19, 0x7a120);
1152 if (ret) {
1153 dev_err(dp->dev, "AUX CH enable timeout!\n");
1154 goto aux_error;
1155 }
1156
1157 /* Wait for an interrupt instead of looping? */
1158 /* Is AUX CH command reply received? */
1159 ret = readx_poll_timeout(readl, dp->reg_base + ANALOGIX_DP_INT_STA, reg, reg & RPLY_RECEIV, 0xa, 0x4e20);
1160 if (ret) {
1161 dev_err(dp->dev, "AUX CH cmd reply timeout!\n");
1162 goto aux_error;
1163 }
1164
1165 /* Clear interrupt source for AUX CH command reply */
1166 analogix_dp_write(dp, ANALOGIX_DP_INT_STA, RPLY_RECEIV);
1167
1168 reg = analogix_dp_read(dp, ANALOGIX_DP_AUX_CH_STA);
1169 if ((reg & AUX_STATUS_MASK) == AUX_STATUS_TIMEOUT_ERROR) {
1170 return -ETIMEDOUT;
1171 }
1172
1173 if (msg->request & DP_AUX_I2C_READ) {
1174 size_t buf_data_count;
1175
1176 reg = analogix_dp_read(dp, ANALOGIX_DP_BUFFER_DATA_CTL);
1177 buf_data_count = BUF_DATA_COUNT(reg);
1178 if (buf_data_count != msg->size) {
1179 return -EBUSY;
1180 }
1181
1182 for (i = 0; i < msg->size; i++) {
1183 reg = analogix_dp_read(dp, ANALOGIX_DP_BUF_DATA_0 + 0x4 * i);
1184 buffer[i] = (unsigned char)reg;
1185 num_transferred++;
1186 }
1187 }
1188
1189 /* Check if Rx sends defer */
1190 reg = analogix_dp_read(dp, ANALOGIX_DP_AUX_RX_COMM);
1191 if (reg == AUX_RX_COMM_AUX_DEFER) {
1192 msg->reply = DP_AUX_NATIVE_REPLY_DEFER;
1193 } else if (reg == AUX_RX_COMM_I2C_DEFER) {
1194 msg->reply = DP_AUX_I2C_REPLY_DEFER;
1195 } else if ((msg->request & ~DP_AUX_I2C_MOT) == DP_AUX_I2C_WRITE ||
1196 (msg->request & ~DP_AUX_I2C_MOT) == DP_AUX_I2C_READ) {
1197 msg->reply = DP_AUX_I2C_REPLY_ACK;
1198 } else if ((msg->request & ~DP_AUX_I2C_MOT) == DP_AUX_NATIVE_WRITE ||
1199 (msg->request & ~DP_AUX_I2C_MOT) == DP_AUX_NATIVE_READ) {
1200 msg->reply = DP_AUX_NATIVE_REPLY_ACK;
1201 }
1202
1203 return (num_transferred == msg->size) ? num_transferred : -EBUSY;
1204
1205 aux_error:
1206 /* if aux err happen, reset aux */
1207 analogix_dp_init_aux(dp);
1208
1209 return -EREMOTEIO;
1210 }
1211
analogix_dp_set_video_format(struct analogix_dp_device * dp)1212 void analogix_dp_set_video_format(struct analogix_dp_device *dp)
1213 {
1214 struct video_info *video = &dp->video_info;
1215 const struct drm_display_mode *mode = &video->mode;
1216 unsigned int hsw, hfp, hbp, vsw, vfp, vbp;
1217
1218 hsw = mode->hsync_end - mode->hsync_start;
1219 hfp = mode->hsync_start - mode->hdisplay;
1220 hbp = mode->htotal - mode->hsync_end;
1221 vsw = mode->vsync_end - mode->vsync_start;
1222 vfp = mode->vsync_start - mode->vdisplay;
1223 vbp = mode->vtotal - mode->vsync_end;
1224
1225 /* Set Video Format Parameters */
1226 analogix_dp_write(dp, ANALOGIX_DP_TOTAL_LINE_CFG_L, TOTAL_LINE_CFG_L(mode->vtotal));
1227 analogix_dp_write(dp, ANALOGIX_DP_TOTAL_LINE_CFG_H, TOTAL_LINE_CFG_H(mode->vtotal >> 0x8));
1228 analogix_dp_write(dp, ANALOGIX_DP_ACTIVE_LINE_CFG_L, ACTIVE_LINE_CFG_L(mode->vdisplay));
1229 analogix_dp_write(dp, ANALOGIX_DP_ACTIVE_LINE_CFG_H, ACTIVE_LINE_CFG_H(mode->vdisplay >> 0x8));
1230 analogix_dp_write(dp, ANALOGIX_DP_V_F_PORCH_CFG, V_F_PORCH_CFG(vfp));
1231 analogix_dp_write(dp, ANALOGIX_DP_V_SYNC_WIDTH_CFG, V_SYNC_WIDTH_CFG(vsw));
1232 analogix_dp_write(dp, ANALOGIX_DP_V_B_PORCH_CFG, V_B_PORCH_CFG(vbp));
1233 analogix_dp_write(dp, ANALOGIX_DP_TOTAL_PIXEL_CFG_L, TOTAL_PIXEL_CFG_L(mode->htotal));
1234 analogix_dp_write(dp, ANALOGIX_DP_TOTAL_PIXEL_CFG_H, TOTAL_PIXEL_CFG_H(mode->htotal >> 0x8));
1235 analogix_dp_write(dp, ANALOGIX_DP_ACTIVE_PIXEL_CFG_L, ACTIVE_PIXEL_CFG_L(mode->hdisplay));
1236 analogix_dp_write(dp, ANALOGIX_DP_ACTIVE_PIXEL_CFG_H, ACTIVE_PIXEL_CFG_H(mode->hdisplay >> 0x8));
1237 analogix_dp_write(dp, ANALOGIX_DP_H_F_PORCH_CFG_L, H_F_PORCH_CFG_L(hfp));
1238 analogix_dp_write(dp, ANALOGIX_DP_H_F_PORCH_CFG_H, H_F_PORCH_CFG_H(hfp >> 0x8));
1239 analogix_dp_write(dp, ANALOGIX_DP_H_SYNC_CFG_L, H_SYNC_CFG_L(hsw));
1240 analogix_dp_write(dp, ANALOGIX_DP_H_SYNC_CFG_H, H_SYNC_CFG_H(hsw >> 0x8));
1241 analogix_dp_write(dp, ANALOGIX_DP_H_B_PORCH_CFG_L, H_B_PORCH_CFG_L(hbp));
1242 analogix_dp_write(dp, ANALOGIX_DP_H_B_PORCH_CFG_H, H_B_PORCH_CFG_H(hbp >> 0x8));
1243 }
1244
analogix_dp_video_bist_enable(struct analogix_dp_device * dp)1245 void analogix_dp_video_bist_enable(struct analogix_dp_device *dp)
1246 {
1247 u32 reg;
1248
1249 /* Enable Video BIST */
1250 analogix_dp_write(dp, ANALOGIX_DP_VIDEO_CTL_4, BIST_EN);
1251
1252 /*
1253 * Note that if BIST_EN is set to 1, F_SEL must be cleared to 0
1254 * although video format information comes from registers set by user.
1255 */
1256 reg = analogix_dp_read(dp, ANALOGIX_DP_VIDEO_CTL_10);
1257 reg &= ~FORMAT_SEL;
1258 analogix_dp_write(dp, ANALOGIX_DP_VIDEO_CTL_10, reg);
1259 }
1260
analogix_dp_audio_config_i2s(struct analogix_dp_device * dp)1261 void analogix_dp_audio_config_i2s(struct analogix_dp_device *dp)
1262 {
1263 u32 reg;
1264
1265 reg = analogix_dp_read(dp, ANALOGIX_DP_SYS_CTL_4);
1266 reg &= ~FIX_M_AUD;
1267 analogix_dp_write(dp, ANALOGIX_DP_SYS_CTL_4, reg);
1268
1269 reg = analogix_dp_read(dp, ANALOGIX_DP_I2S_CTRL);
1270 reg |= I2S_EN;
1271 analogix_dp_write(dp, ANALOGIX_DP_I2S_CTRL, reg);
1272 }
1273
analogix_dp_audio_config_spdif(struct analogix_dp_device * dp)1274 void analogix_dp_audio_config_spdif(struct analogix_dp_device *dp)
1275 {
1276 u32 reg;
1277
1278 reg = analogix_dp_read(dp, ANALOGIX_DP_SYS_CTL_4);
1279 reg &= ~FIX_M_AUD;
1280 analogix_dp_write(dp, ANALOGIX_DP_SYS_CTL_4, reg);
1281
1282 reg = analogix_dp_read(dp, ANALOGIX_DP_SPDIF_AUDIO_CTL_0);
1283 reg |= AUD_SPDIF_EN;
1284 analogix_dp_write(dp, ANALOGIX_DP_SPDIF_AUDIO_CTL_0, reg);
1285 }
1286
analogix_dp_audio_enable(struct analogix_dp_device * dp)1287 void analogix_dp_audio_enable(struct analogix_dp_device *dp)
1288 {
1289 u32 reg;
1290
1291 reg = analogix_dp_read(dp, ANALOGIX_DP_FUNC_EN_1);
1292 reg &= ~(AUD_FIFO_FUNC_EN_N | AUD_FUNC_EN_N);
1293 analogix_dp_write(dp, ANALOGIX_DP_FUNC_EN_1, reg);
1294
1295 reg = analogix_dp_read(dp, ANALOGIX_DP_AUD_CTL);
1296 reg |= MISC_CTRL_RESET | DP_AUDIO_EN;
1297 analogix_dp_write(dp, ANALOGIX_DP_AUD_CTL, reg);
1298 }
1299
analogix_dp_audio_disable(struct analogix_dp_device * dp)1300 void analogix_dp_audio_disable(struct analogix_dp_device *dp)
1301 {
1302 u32 reg;
1303
1304 analogix_dp_write(dp, ANALOGIX_DP_AUD_CTL, 0);
1305
1306 reg = analogix_dp_read(dp, ANALOGIX_DP_FUNC_EN_1);
1307 reg |= AUD_FIFO_FUNC_EN_N | AUD_FUNC_EN_N;
1308 analogix_dp_write(dp, ANALOGIX_DP_FUNC_EN_1, reg);
1309 }
1310