1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3 * Analogix DP (Display Port) core interface driver.
4 *
5 * Copyright (C) 2012 Samsung Electronics Co., Ltd.
6 * Author: Jingoo Han <jg1.han@samsung.com>
7 */
8
9 #include <linux/clk.h>
10 #include <linux/component.h>
11 #include <linux/err.h>
12 #include <linux/export.h>
13 #include <linux/gpio/consumer.h>
14 #include <linux/interrupt.h>
15 #include <linux/io.h>
16 #include <linux/iopoll.h>
17 #include <linux/module.h>
18 #include <linux/of.h>
19 #include <linux/phy/phy.h>
20 #include <linux/platform_device.h>
21
22 #include <drm/bridge/analogix_dp.h>
23 #include <drm/drm_atomic.h>
24 #include <drm/drm_atomic_helper.h>
25 #include <drm/drm_bridge.h>
26 #include <drm/drm_crtc.h>
27 #include <drm/drm_device.h>
28 #include <drm/drm_edid.h>
29 #include <drm/drm_panel.h>
30 #include <drm/drm_print.h>
31 #include <drm/drm_probe_helper.h>
32
33 #include "analogix_dp_core.h"
34 #include "analogix_dp_reg.h"
35
36 #define to_dp(nm) container_of(nm, struct analogix_dp_device, nm)
37
38 static const bool verify_fast_training;
39
analogix_dp_init_dp(struct analogix_dp_device * dp)40 static void analogix_dp_init_dp(struct analogix_dp_device *dp)
41 {
42 analogix_dp_reset(dp);
43
44 analogix_dp_swreset(dp);
45
46 analogix_dp_init_analog_param(dp);
47 analogix_dp_init_interrupt(dp);
48
49 /* SW defined function Normal operation */
50 analogix_dp_enable_sw_function(dp);
51
52 analogix_dp_config_interrupt(dp);
53
54 analogix_dp_init_hpd(dp);
55 analogix_dp_init_aux(dp);
56 }
57
analogix_dp_detect_hpd(struct analogix_dp_device * dp)58 static int analogix_dp_detect_hpd(struct analogix_dp_device *dp)
59 {
60 int timeout_loop = 0;
61
62 while (timeout_loop < DP_TIMEOUT_LOOP_COUNT) {
63 if (analogix_dp_get_plug_in_status(dp) == 0)
64 return 0;
65
66 timeout_loop++;
67 usleep_range(1000, 1100);
68 }
69
70 /*
71 * Some edp screen do not have hpd signal, so we can't just
72 * return failed when hpd plug in detect failed, DT property
73 * "force-hpd" would indicate whether driver need this.
74 */
75 if (!dp->force_hpd)
76 return -ETIMEDOUT;
77
78 /*
79 * The eDP TRM indicate that if HPD_STATUS(RO) is 0, AUX CH
80 * will not work, so we need to give a force hpd action to
81 * set HPD_STATUS manually.
82 */
83 dev_dbg(dp->dev, "failed to get hpd plug status, try to force hpd\n");
84
85 analogix_dp_force_hpd(dp);
86
87 if (analogix_dp_get_plug_in_status(dp) != 0) {
88 dev_err(dp->dev, "failed to get hpd plug in status\n");
89 return -EINVAL;
90 }
91
92 dev_dbg(dp->dev, "success to get plug in status after force hpd\n");
93
94 return 0;
95 }
96
analogix_dp_detect_sink_psr(struct analogix_dp_device * dp)97 static bool analogix_dp_detect_sink_psr(struct analogix_dp_device *dp)
98 {
99 unsigned char psr_version;
100 int ret;
101
102 ret = drm_dp_dpcd_readb(&dp->aux, DP_PSR_SUPPORT, &psr_version);
103 if (ret != 1) {
104 dev_err(dp->dev, "failed to get PSR version, disable it\n");
105 return false;
106 }
107
108 dev_dbg(dp->dev, "Panel PSR version : %x\n", psr_version);
109 return psr_version & DP_PSR_IS_SUPPORTED;
110 }
111
analogix_dp_enable_sink_psr(struct analogix_dp_device * dp)112 static int analogix_dp_enable_sink_psr(struct analogix_dp_device *dp)
113 {
114 unsigned char psr_en;
115 int ret;
116
117 /* Disable psr function */
118 ret = drm_dp_dpcd_readb(&dp->aux, DP_PSR_EN_CFG, &psr_en);
119 if (ret != 1) {
120 dev_err(dp->dev, "failed to get psr config\n");
121 goto end;
122 }
123
124 psr_en &= ~DP_PSR_ENABLE;
125 ret = drm_dp_dpcd_writeb(&dp->aux, DP_PSR_EN_CFG, psr_en);
126 if (ret != 1) {
127 dev_err(dp->dev, "failed to disable panel psr\n");
128 goto end;
129 }
130
131 /* Main-Link transmitter remains active during PSR active states */
132 psr_en = DP_PSR_CRC_VERIFICATION;
133 ret = drm_dp_dpcd_writeb(&dp->aux, DP_PSR_EN_CFG, psr_en);
134 if (ret != 1) {
135 dev_err(dp->dev, "failed to set panel psr\n");
136 goto end;
137 }
138
139 /* Enable psr function */
140 psr_en = DP_PSR_ENABLE | DP_PSR_CRC_VERIFICATION;
141 ret = drm_dp_dpcd_writeb(&dp->aux, DP_PSR_EN_CFG, psr_en);
142 if (ret != 1) {
143 dev_err(dp->dev, "failed to set panel psr\n");
144 goto end;
145 }
146
147 analogix_dp_enable_psr_crc(dp);
148
149 dp->psr_supported = true;
150
151 return 0;
152 end:
153 dev_err(dp->dev, "enable psr fail, force to disable psr\n");
154
155 return ret;
156 }
157
158 static int
analogix_dp_enable_rx_to_enhanced_mode(struct analogix_dp_device * dp,bool enable)159 analogix_dp_enable_rx_to_enhanced_mode(struct analogix_dp_device *dp,
160 bool enable)
161 {
162 u8 data;
163 int ret;
164
165 ret = drm_dp_dpcd_readb(&dp->aux, DP_LANE_COUNT_SET, &data);
166 if (ret != 1)
167 return ret;
168
169 if (enable)
170 ret = drm_dp_dpcd_writeb(&dp->aux, DP_LANE_COUNT_SET,
171 DP_LANE_COUNT_ENHANCED_FRAME_EN |
172 DPCD_LANE_COUNT_SET(data));
173 else
174 ret = drm_dp_dpcd_writeb(&dp->aux, DP_LANE_COUNT_SET,
175 DPCD_LANE_COUNT_SET(data));
176
177 return ret < 0 ? ret : 0;
178 }
179
analogix_dp_is_enhanced_mode_available(struct analogix_dp_device * dp,u8 * enhanced_mode_support)180 static int analogix_dp_is_enhanced_mode_available(struct analogix_dp_device *dp,
181 u8 *enhanced_mode_support)
182 {
183 u8 data;
184 int ret;
185
186 ret = drm_dp_dpcd_readb(&dp->aux, DP_MAX_LANE_COUNT, &data);
187 if (ret != 1) {
188 *enhanced_mode_support = 0;
189 return ret;
190 }
191
192 *enhanced_mode_support = DPCD_ENHANCED_FRAME_CAP(data);
193
194 return 0;
195 }
196
analogix_dp_set_enhanced_mode(struct analogix_dp_device * dp)197 static int analogix_dp_set_enhanced_mode(struct analogix_dp_device *dp)
198 {
199 u8 data;
200 int ret;
201
202 ret = analogix_dp_is_enhanced_mode_available(dp, &data);
203 if (ret < 0)
204 return ret;
205
206 ret = analogix_dp_enable_rx_to_enhanced_mode(dp, data);
207 if (ret < 0)
208 return ret;
209
210 analogix_dp_enable_enhanced_mode(dp, data);
211
212 return 0;
213 }
214
analogix_dp_training_pattern_dis(struct analogix_dp_device * dp)215 static int analogix_dp_training_pattern_dis(struct analogix_dp_device *dp)
216 {
217 int ret;
218
219 analogix_dp_set_training_pattern(dp, DP_NONE);
220
221 ret = drm_dp_dpcd_writeb(&dp->aux, DP_TRAINING_PATTERN_SET,
222 DP_TRAINING_PATTERN_DISABLE);
223
224 return ret < 0 ? ret : 0;
225 }
226
analogix_dp_link_start(struct analogix_dp_device * dp)227 static int analogix_dp_link_start(struct analogix_dp_device *dp)
228 {
229 u8 buf[4];
230 int lane, lane_count, retval;
231
232 lane_count = dp->link_train.lane_count;
233
234 dp->link_train.lt_state = CLOCK_RECOVERY;
235 dp->link_train.eq_loop = 0;
236
237 for (lane = 0; lane < lane_count; lane++)
238 dp->link_train.cr_loop[lane] = 0;
239
240 /* Set link rate and count as you want to establish*/
241 analogix_dp_set_link_bandwidth(dp, dp->link_train.link_rate);
242 retval = analogix_dp_wait_pll_locked(dp);
243 if (retval) {
244 DRM_DEV_ERROR(dp->dev, "Wait for pll lock failed %d\n", retval);
245 return retval;
246 }
247 /*
248 * MACRO_RST must be applied after the PLL_LOCK to avoid
249 * the DP inter pair skew issue for at least 10 us
250 */
251 analogix_dp_reset_macro(dp);
252 analogix_dp_set_lane_count(dp, dp->link_train.lane_count);
253
254 /* Setup RX configuration */
255 buf[0] = dp->link_train.link_rate;
256 buf[1] = dp->link_train.lane_count;
257 retval = drm_dp_dpcd_write(&dp->aux, DP_LINK_BW_SET, buf, 2);
258 if (retval < 0)
259 return retval;
260 /* set enhanced mode if available */
261 retval = analogix_dp_set_enhanced_mode(dp);
262 if (retval < 0) {
263 dev_err(dp->dev, "failed to set enhance mode\n");
264 return retval;
265 }
266
267 /* Set TX voltage-swing and pre-emphasis to minimum */
268 for (lane = 0; lane < lane_count; lane++)
269 dp->link_train.training_lane[lane] =
270 DP_TRAIN_VOLTAGE_SWING_LEVEL_0 |
271 DP_TRAIN_PRE_EMPH_LEVEL_0;
272 analogix_dp_set_lane_link_training(dp);
273
274 /* Set training pattern 1 */
275 analogix_dp_set_training_pattern(dp, TRAINING_PTN1);
276
277 /* Set RX training pattern */
278 retval = drm_dp_dpcd_writeb(&dp->aux, DP_TRAINING_PATTERN_SET,
279 DP_LINK_SCRAMBLING_DISABLE |
280 DP_TRAINING_PATTERN_1);
281 if (retval < 0)
282 return retval;
283
284 for (lane = 0; lane < lane_count; lane++)
285 buf[lane] = DP_TRAIN_PRE_EMPH_LEVEL_0 |
286 DP_TRAIN_VOLTAGE_SWING_LEVEL_0;
287
288 retval = drm_dp_dpcd_write(&dp->aux, DP_TRAINING_LANE0_SET, buf,
289 lane_count);
290 if (retval < 0)
291 return retval;
292
293 return 0;
294 }
295
analogix_dp_get_lane_status(u8 link_status[2],int lane)296 static unsigned char analogix_dp_get_lane_status(u8 link_status[2], int lane)
297 {
298 int shift = (lane & 1) * 4;
299 u8 link_value = link_status[lane >> 1];
300
301 return (link_value >> shift) & 0xf;
302 }
303
analogix_dp_clock_recovery_ok(u8 link_status[2],int lane_count)304 static int analogix_dp_clock_recovery_ok(u8 link_status[2], int lane_count)
305 {
306 int lane;
307 u8 lane_status;
308
309 for (lane = 0; lane < lane_count; lane++) {
310 lane_status = analogix_dp_get_lane_status(link_status, lane);
311 if ((lane_status & DP_LANE_CR_DONE) == 0)
312 return -EINVAL;
313 }
314 return 0;
315 }
316
analogix_dp_channel_eq_ok(u8 link_status[2],u8 link_align,int lane_count)317 static int analogix_dp_channel_eq_ok(u8 link_status[2], u8 link_align,
318 int lane_count)
319 {
320 int lane;
321 u8 lane_status;
322
323 if ((link_align & DP_INTERLANE_ALIGN_DONE) == 0)
324 return -EINVAL;
325
326 for (lane = 0; lane < lane_count; lane++) {
327 lane_status = analogix_dp_get_lane_status(link_status, lane);
328 lane_status &= DP_CHANNEL_EQ_BITS;
329 if (lane_status != DP_CHANNEL_EQ_BITS)
330 return -EINVAL;
331 }
332
333 return 0;
334 }
335
336 static unsigned char
analogix_dp_get_adjust_request_voltage(u8 adjust_request[2],int lane)337 analogix_dp_get_adjust_request_voltage(u8 adjust_request[2], int lane)
338 {
339 int shift = (lane & 1) * 4;
340 u8 link_value = adjust_request[lane >> 1];
341
342 return (link_value >> shift) & 0x3;
343 }
344
analogix_dp_get_adjust_request_pre_emphasis(u8 adjust_request[2],int lane)345 static unsigned char analogix_dp_get_adjust_request_pre_emphasis(
346 u8 adjust_request[2],
347 int lane)
348 {
349 int shift = (lane & 1) * 4;
350 u8 link_value = adjust_request[lane >> 1];
351
352 return ((link_value >> shift) & 0xc) >> 2;
353 }
354
analogix_dp_reduce_link_rate(struct analogix_dp_device * dp)355 static void analogix_dp_reduce_link_rate(struct analogix_dp_device *dp)
356 {
357 analogix_dp_training_pattern_dis(dp);
358 analogix_dp_set_enhanced_mode(dp);
359
360 dp->link_train.lt_state = FAILED;
361 }
362
analogix_dp_get_adjust_training_lane(struct analogix_dp_device * dp,u8 adjust_request[2])363 static void analogix_dp_get_adjust_training_lane(struct analogix_dp_device *dp,
364 u8 adjust_request[2])
365 {
366 int lane, lane_count;
367 u8 voltage_swing, pre_emphasis, training_lane;
368
369 lane_count = dp->link_train.lane_count;
370 for (lane = 0; lane < lane_count; lane++) {
371 voltage_swing = analogix_dp_get_adjust_request_voltage(
372 adjust_request, lane);
373 pre_emphasis = analogix_dp_get_adjust_request_pre_emphasis(
374 adjust_request, lane);
375 training_lane = DPCD_VOLTAGE_SWING_SET(voltage_swing) |
376 DPCD_PRE_EMPHASIS_SET(pre_emphasis);
377
378 if (voltage_swing == VOLTAGE_LEVEL_3)
379 training_lane |= DP_TRAIN_MAX_SWING_REACHED;
380 if (pre_emphasis == PRE_EMPHASIS_LEVEL_3)
381 training_lane |= DP_TRAIN_MAX_PRE_EMPHASIS_REACHED;
382
383 dp->link_train.training_lane[lane] = training_lane;
384 }
385 }
386
analogix_dp_process_clock_recovery(struct analogix_dp_device * dp)387 static int analogix_dp_process_clock_recovery(struct analogix_dp_device *dp)
388 {
389 int lane, lane_count, retval;
390 u8 voltage_swing, pre_emphasis, training_lane;
391 u8 link_status[2], adjust_request[2];
392
393 usleep_range(100, 101);
394
395 lane_count = dp->link_train.lane_count;
396
397 retval = drm_dp_dpcd_read(&dp->aux, DP_LANE0_1_STATUS, link_status, 2);
398 if (retval < 0)
399 return retval;
400
401 if (analogix_dp_clock_recovery_ok(link_status, lane_count) == 0) {
402 /* set training pattern 2 for EQ */
403 analogix_dp_set_training_pattern(dp, TRAINING_PTN2);
404
405 retval = drm_dp_dpcd_writeb(&dp->aux, DP_TRAINING_PATTERN_SET,
406 DP_LINK_SCRAMBLING_DISABLE |
407 DP_TRAINING_PATTERN_2);
408 if (retval < 0)
409 return retval;
410
411 dev_dbg(dp->dev, "Link Training Clock Recovery success\n");
412 dp->link_train.lt_state = EQUALIZER_TRAINING;
413
414 return 0;
415 }
416
417 retval = drm_dp_dpcd_read(&dp->aux, DP_ADJUST_REQUEST_LANE0_1,
418 adjust_request, 2);
419 if (retval < 0)
420 return retval;
421
422 for (lane = 0; lane < lane_count; lane++) {
423 training_lane = analogix_dp_get_lane_link_training(dp, lane);
424 voltage_swing = analogix_dp_get_adjust_request_voltage(adjust_request, lane);
425 pre_emphasis = analogix_dp_get_adjust_request_pre_emphasis(adjust_request, lane);
426
427 if (DPCD_VOLTAGE_SWING_GET(training_lane) == voltage_swing &&
428 DPCD_PRE_EMPHASIS_GET(training_lane) == pre_emphasis)
429 dp->link_train.cr_loop[lane]++;
430
431 if (dp->link_train.cr_loop[lane] == MAX_CR_LOOP ||
432 voltage_swing == VOLTAGE_LEVEL_3 ||
433 pre_emphasis == PRE_EMPHASIS_LEVEL_3) {
434 dev_err(dp->dev, "CR Max reached (%d,%d,%d)\n",
435 dp->link_train.cr_loop[lane],
436 voltage_swing, pre_emphasis);
437 analogix_dp_reduce_link_rate(dp);
438 return -EIO;
439 }
440 }
441
442 analogix_dp_get_adjust_training_lane(dp, adjust_request);
443 analogix_dp_set_lane_link_training(dp);
444
445 retval = drm_dp_dpcd_write(&dp->aux, DP_TRAINING_LANE0_SET,
446 dp->link_train.training_lane, lane_count);
447 if (retval < 0)
448 return retval;
449
450 return 0;
451 }
452
analogix_dp_process_equalizer_training(struct analogix_dp_device * dp)453 static int analogix_dp_process_equalizer_training(struct analogix_dp_device *dp)
454 {
455 int lane_count, retval;
456 u32 reg;
457 u8 link_align, link_status[2], adjust_request[2];
458
459 usleep_range(400, 401);
460
461 lane_count = dp->link_train.lane_count;
462
463 retval = drm_dp_dpcd_read(&dp->aux, DP_LANE0_1_STATUS, link_status, 2);
464 if (retval < 0)
465 return retval;
466
467 if (analogix_dp_clock_recovery_ok(link_status, lane_count)) {
468 analogix_dp_reduce_link_rate(dp);
469 return -EIO;
470 }
471
472 retval = drm_dp_dpcd_read(&dp->aux, DP_ADJUST_REQUEST_LANE0_1,
473 adjust_request, 2);
474 if (retval < 0)
475 return retval;
476
477 retval = drm_dp_dpcd_readb(&dp->aux, DP_LANE_ALIGN_STATUS_UPDATED,
478 &link_align);
479 if (retval < 0)
480 return retval;
481
482 analogix_dp_get_adjust_training_lane(dp, adjust_request);
483
484 if (!analogix_dp_channel_eq_ok(link_status, link_align, lane_count)) {
485 /* traing pattern Set to Normal */
486 retval = analogix_dp_training_pattern_dis(dp);
487 if (retval < 0)
488 return retval;
489
490 dev_dbg(dp->dev, "Link Training success!\n");
491 analogix_dp_get_link_bandwidth(dp, ®);
492 dp->link_train.link_rate = reg;
493 dev_dbg(dp->dev, "final bandwidth = %.2x\n",
494 dp->link_train.link_rate);
495
496 analogix_dp_get_lane_count(dp, ®);
497 dp->link_train.lane_count = reg;
498 dev_dbg(dp->dev, "final lane count = %.2x\n",
499 dp->link_train.lane_count);
500
501 dp->link_train.lt_state = FINISHED;
502
503 return 0;
504 }
505
506 /* not all locked */
507 dp->link_train.eq_loop++;
508
509 if (dp->link_train.eq_loop > MAX_EQ_LOOP) {
510 dev_err(dp->dev, "EQ Max loop\n");
511 analogix_dp_reduce_link_rate(dp);
512 return -EIO;
513 }
514
515 analogix_dp_set_lane_link_training(dp);
516
517 retval = drm_dp_dpcd_write(&dp->aux, DP_TRAINING_LANE0_SET,
518 dp->link_train.training_lane, lane_count);
519 if (retval < 0)
520 return retval;
521
522 return 0;
523 }
524
analogix_dp_get_max_rx_bandwidth(struct analogix_dp_device * dp,u8 * bandwidth)525 static void analogix_dp_get_max_rx_bandwidth(struct analogix_dp_device *dp,
526 u8 *bandwidth)
527 {
528 u8 data;
529
530 /*
531 * For DP rev.1.1, Maximum link rate of Main Link lanes
532 * 0x06 = 1.62 Gbps, 0x0a = 2.7 Gbps
533 * For DP rev.1.2, Maximum link rate of Main Link lanes
534 * 0x06 = 1.62 Gbps, 0x0a = 2.7 Gbps, 0x14 = 5.4Gbps
535 */
536 drm_dp_dpcd_readb(&dp->aux, DP_MAX_LINK_RATE, &data);
537 *bandwidth = data;
538 }
539
analogix_dp_get_max_rx_lane_count(struct analogix_dp_device * dp,u8 * lane_count)540 static void analogix_dp_get_max_rx_lane_count(struct analogix_dp_device *dp,
541 u8 *lane_count)
542 {
543 u8 data;
544
545 /*
546 * For DP rev.1.1, Maximum number of Main Link lanes
547 * 0x01 = 1 lane, 0x02 = 2 lanes, 0x04 = 4 lanes
548 */
549 drm_dp_dpcd_readb(&dp->aux, DP_MAX_LANE_COUNT, &data);
550 *lane_count = DPCD_MAX_LANE_COUNT(data);
551 }
552
analogix_dp_full_link_train(struct analogix_dp_device * dp,u32 max_lanes,u32 max_rate)553 static int analogix_dp_full_link_train(struct analogix_dp_device *dp,
554 u32 max_lanes, u32 max_rate)
555 {
556 int retval = 0;
557 bool training_finished = false;
558
559 /* Initialize by reading RX's DPCD */
560 analogix_dp_get_max_rx_bandwidth(dp, &dp->link_train.link_rate);
561 analogix_dp_get_max_rx_lane_count(dp, &dp->link_train.lane_count);
562
563 if ((dp->link_train.link_rate != DP_LINK_BW_1_62) &&
564 (dp->link_train.link_rate != DP_LINK_BW_2_7) &&
565 (dp->link_train.link_rate != DP_LINK_BW_5_4)) {
566 dev_err(dp->dev, "Rx Max Link Rate is abnormal :%x !\n",
567 dp->link_train.link_rate);
568 dp->link_train.link_rate = DP_LINK_BW_1_62;
569 }
570
571 if (dp->link_train.lane_count == 0) {
572 dev_err(dp->dev, "Rx Max Lane count is abnormal :%x !\n",
573 dp->link_train.lane_count);
574 dp->link_train.lane_count = (u8)LANE_COUNT1;
575 }
576
577 /* Setup TX lane count & rate */
578 if (dp->link_train.lane_count > max_lanes)
579 dp->link_train.lane_count = max_lanes;
580 if (dp->link_train.link_rate > max_rate)
581 dp->link_train.link_rate = max_rate;
582
583 /* All DP analog module power up */
584 analogix_dp_set_analog_power_down(dp, POWER_ALL, 0);
585
586 dp->link_train.lt_state = START;
587
588 /* Process here */
589 while (!retval && !training_finished) {
590 switch (dp->link_train.lt_state) {
591 case START:
592 retval = analogix_dp_link_start(dp);
593 if (retval)
594 dev_err(dp->dev, "LT link start failed!\n");
595 break;
596 case CLOCK_RECOVERY:
597 retval = analogix_dp_process_clock_recovery(dp);
598 if (retval)
599 dev_err(dp->dev, "LT CR failed!\n");
600 break;
601 case EQUALIZER_TRAINING:
602 retval = analogix_dp_process_equalizer_training(dp);
603 if (retval)
604 dev_err(dp->dev, "LT EQ failed!\n");
605 break;
606 case FINISHED:
607 training_finished = 1;
608 break;
609 case FAILED:
610 return -EREMOTEIO;
611 }
612 }
613 if (retval)
614 dev_err(dp->dev, "eDP link training failed (%d)\n", retval);
615
616 return retval;
617 }
618
analogix_dp_fast_link_train(struct analogix_dp_device * dp)619 static int analogix_dp_fast_link_train(struct analogix_dp_device *dp)
620 {
621 int ret;
622 u8 link_align, link_status[2];
623
624 analogix_dp_set_link_bandwidth(dp, dp->link_train.link_rate);
625 ret = analogix_dp_wait_pll_locked(dp);
626 if (ret) {
627 DRM_DEV_ERROR(dp->dev, "Wait for pll lock failed %d\n", ret);
628 return ret;
629 }
630
631 /*
632 * MACRO_RST must be applied after the PLL_LOCK to avoid
633 * the DP inter pair skew issue for at least 10 us
634 */
635 analogix_dp_reset_macro(dp);
636 analogix_dp_set_lane_count(dp, dp->link_train.lane_count);
637 analogix_dp_set_lane_link_training(dp);
638
639 /* source Set training pattern 1 */
640 analogix_dp_set_training_pattern(dp, TRAINING_PTN1);
641 /* From DP spec, pattern must be on-screen for a minimum 500us */
642 usleep_range(500, 600);
643
644 analogix_dp_set_training_pattern(dp, TRAINING_PTN2);
645 /* From DP spec, pattern must be on-screen for a minimum 500us */
646 usleep_range(500, 600);
647
648 /* TODO: enhanced_mode?*/
649 analogix_dp_set_training_pattern(dp, DP_NONE);
650
651 /*
652 * Useful for debugging issues with fast link training, disable for more
653 * speed
654 */
655 if (verify_fast_training) {
656 ret = drm_dp_dpcd_readb(&dp->aux, DP_LANE_ALIGN_STATUS_UPDATED,
657 &link_align);
658 if (ret < 0) {
659 DRM_DEV_ERROR(dp->dev, "Read align status failed %d\n",
660 ret);
661 return ret;
662 }
663
664 ret = drm_dp_dpcd_read(&dp->aux, DP_LANE0_1_STATUS, link_status,
665 2);
666 if (ret < 0) {
667 DRM_DEV_ERROR(dp->dev, "Read link status failed %d\n",
668 ret);
669 return ret;
670 }
671
672 if (analogix_dp_clock_recovery_ok(link_status,
673 dp->link_train.lane_count)) {
674 DRM_DEV_ERROR(dp->dev, "Clock recovery failed\n");
675 analogix_dp_reduce_link_rate(dp);
676 return -EIO;
677 }
678
679 if (analogix_dp_channel_eq_ok(link_status, link_align,
680 dp->link_train.lane_count)) {
681 DRM_DEV_ERROR(dp->dev, "Channel EQ failed\n");
682 analogix_dp_reduce_link_rate(dp);
683 return -EIO;
684 }
685 }
686
687 return 0;
688 }
689
analogix_dp_train_link(struct analogix_dp_device * dp)690 static int analogix_dp_train_link(struct analogix_dp_device *dp)
691 {
692 if (dp->fast_train_enable)
693 return analogix_dp_fast_link_train(dp);
694
695 return analogix_dp_full_link_train(dp, dp->video_info.max_lane_count,
696 dp->video_info.max_link_rate);
697 }
698
analogix_dp_config_video(struct analogix_dp_device * dp)699 static int analogix_dp_config_video(struct analogix_dp_device *dp)
700 {
701 int timeout_loop = 0;
702 int done_count = 0;
703
704 analogix_dp_config_video_slave_mode(dp);
705
706 analogix_dp_set_video_color_format(dp);
707
708 for (;;) {
709 timeout_loop++;
710 if (analogix_dp_is_slave_video_stream_clock_on(dp) == 0)
711 break;
712 if (timeout_loop > DP_TIMEOUT_LOOP_COUNT) {
713 dev_err(dp->dev, "Timeout of slave video streamclk ok\n");
714 return -ETIMEDOUT;
715 }
716 usleep_range(1000, 1001);
717 }
718
719 /* Set to use the register calculated M/N video */
720 analogix_dp_set_video_cr_mn(dp, CALCULATED_M, 0, 0);
721
722 /* For video bist, Video timing must be generated by register */
723 analogix_dp_set_video_timing_mode(dp, VIDEO_TIMING_FROM_CAPTURE);
724
725 /* Disable video mute */
726 analogix_dp_enable_video_mute(dp, 0);
727
728 /* Configure video slave mode */
729 analogix_dp_enable_video_master(dp, 0);
730
731 /* Enable video */
732 analogix_dp_start_video(dp);
733
734 timeout_loop = 0;
735
736 for (;;) {
737 timeout_loop++;
738 if (analogix_dp_is_video_stream_on(dp) == 0) {
739 done_count++;
740 if (done_count > 10)
741 break;
742 } else if (done_count) {
743 done_count = 0;
744 }
745 if (timeout_loop > DP_TIMEOUT_LOOP_COUNT) {
746 dev_warn(dp->dev,
747 "Ignoring timeout of video streamclk ok\n");
748 break;
749 }
750
751 usleep_range(1000, 1001);
752 }
753
754 return 0;
755 }
756
analogix_dp_enable_scramble(struct analogix_dp_device * dp,bool enable)757 static int analogix_dp_enable_scramble(struct analogix_dp_device *dp,
758 bool enable)
759 {
760 u8 data;
761 int ret;
762
763 if (enable) {
764 analogix_dp_enable_scrambling(dp);
765
766 ret = drm_dp_dpcd_readb(&dp->aux, DP_TRAINING_PATTERN_SET,
767 &data);
768 if (ret != 1)
769 return ret;
770 ret = drm_dp_dpcd_writeb(&dp->aux, DP_TRAINING_PATTERN_SET,
771 (u8)(data & ~DP_LINK_SCRAMBLING_DISABLE));
772 } else {
773 analogix_dp_disable_scrambling(dp);
774
775 ret = drm_dp_dpcd_readb(&dp->aux, DP_TRAINING_PATTERN_SET,
776 &data);
777 if (ret != 1)
778 return ret;
779 ret = drm_dp_dpcd_writeb(&dp->aux, DP_TRAINING_PATTERN_SET,
780 (u8)(data | DP_LINK_SCRAMBLING_DISABLE));
781 }
782 return ret < 0 ? ret : 0;
783 }
784
analogix_dp_hardirq(int irq,void * arg)785 static irqreturn_t analogix_dp_hardirq(int irq, void *arg)
786 {
787 struct analogix_dp_device *dp = arg;
788 irqreturn_t ret = IRQ_NONE;
789 enum dp_irq_type irq_type;
790
791 irq_type = analogix_dp_get_irq_type(dp);
792 if (irq_type != DP_IRQ_TYPE_UNKNOWN) {
793 analogix_dp_mute_hpd_interrupt(dp);
794 ret = IRQ_WAKE_THREAD;
795 }
796
797 return ret;
798 }
799
analogix_dp_irq_thread(int irq,void * arg)800 static irqreturn_t analogix_dp_irq_thread(int irq, void *arg)
801 {
802 struct analogix_dp_device *dp = arg;
803 enum dp_irq_type irq_type;
804
805 irq_type = analogix_dp_get_irq_type(dp);
806 if (irq_type & DP_IRQ_TYPE_HP_CABLE_IN ||
807 irq_type & DP_IRQ_TYPE_HP_CABLE_OUT) {
808 dev_dbg(dp->dev, "Detected cable status changed!\n");
809 if (dp->drm_dev)
810 drm_helper_hpd_irq_event(dp->drm_dev);
811 }
812
813 if (irq_type != DP_IRQ_TYPE_UNKNOWN) {
814 analogix_dp_clear_hotplug_interrupts(dp);
815 analogix_dp_unmute_hpd_interrupt(dp);
816 }
817
818 return IRQ_HANDLED;
819 }
820
analogix_dp_fast_link_train_detection(struct analogix_dp_device * dp)821 static int analogix_dp_fast_link_train_detection(struct analogix_dp_device *dp)
822 {
823 int ret;
824 u8 spread;
825
826 ret = drm_dp_dpcd_readb(&dp->aux, DP_MAX_DOWNSPREAD, &spread);
827 if (ret != 1) {
828 dev_err(dp->dev, "failed to read downspread %d\n", ret);
829 return ret;
830 }
831 dp->fast_train_enable = !!(spread & DP_NO_AUX_HANDSHAKE_LINK_TRAINING);
832 dev_dbg(dp->dev, "fast link training %s\n",
833 dp->fast_train_enable ? "supported" : "unsupported");
834 return 0;
835 }
836
analogix_dp_commit(struct analogix_dp_device * dp)837 static int analogix_dp_commit(struct analogix_dp_device *dp)
838 {
839 int ret;
840
841 /* Keep the panel disabled while we configure video */
842 drm_panel_disable(dp->plat_data->panel);
843
844 ret = analogix_dp_train_link(dp);
845 if (ret) {
846 dev_err(dp->dev, "unable to do link train, ret=%d\n", ret);
847 return ret;
848 }
849
850 ret = analogix_dp_enable_scramble(dp, 1);
851 if (ret < 0) {
852 dev_err(dp->dev, "can not enable scramble\n");
853 return ret;
854 }
855
856 analogix_dp_init_video(dp);
857 ret = analogix_dp_config_video(dp);
858 if (ret) {
859 dev_err(dp->dev, "unable to config video\n");
860 return ret;
861 }
862
863 /* Safe to enable the panel now */
864 drm_panel_enable(dp->plat_data->panel);
865
866 /* Check whether panel supports fast training */
867 ret = analogix_dp_fast_link_train_detection(dp);
868 if (ret)
869 return ret;
870
871 if (analogix_dp_detect_sink_psr(dp)) {
872 ret = analogix_dp_enable_sink_psr(dp);
873 if (ret)
874 return ret;
875 }
876
877 return ret;
878 }
879
analogix_dp_enable_psr(struct analogix_dp_device * dp)880 static int analogix_dp_enable_psr(struct analogix_dp_device *dp)
881 {
882 struct dp_sdp psr_vsc;
883 int ret;
884 u8 sink;
885
886 ret = drm_dp_dpcd_readb(&dp->aux, DP_PSR_STATUS, &sink);
887 if (ret != 1)
888 DRM_DEV_ERROR(dp->dev, "Failed to read psr status %d\n", ret);
889 else if (sink == DP_PSR_SINK_ACTIVE_RFB)
890 return 0;
891
892 /* Prepare VSC packet as per EDP 1.4 spec, Table 6.9 */
893 memset(&psr_vsc, 0, sizeof(psr_vsc));
894 psr_vsc.sdp_header.HB0 = 0;
895 psr_vsc.sdp_header.HB1 = 0x7;
896 psr_vsc.sdp_header.HB2 = 0x2;
897 psr_vsc.sdp_header.HB3 = 0x8;
898 psr_vsc.db[0] = 0;
899 psr_vsc.db[1] = EDP_VSC_PSR_STATE_ACTIVE | EDP_VSC_PSR_CRC_VALUES_VALID;
900
901 ret = analogix_dp_send_psr_spd(dp, &psr_vsc, true);
902 if (!ret)
903 analogix_dp_set_analog_power_down(dp, POWER_ALL, true);
904
905 return ret;
906 }
907
analogix_dp_disable_psr(struct analogix_dp_device * dp)908 static int analogix_dp_disable_psr(struct analogix_dp_device *dp)
909 {
910 struct dp_sdp psr_vsc;
911 int ret;
912 u8 sink;
913
914 analogix_dp_set_analog_power_down(dp, POWER_ALL, false);
915
916 ret = drm_dp_dpcd_writeb(&dp->aux, DP_SET_POWER, DP_SET_POWER_D0);
917 if (ret != 1) {
918 DRM_DEV_ERROR(dp->dev, "Failed to set DP Power0 %d\n", ret);
919 return ret;
920 }
921
922 ret = drm_dp_dpcd_readb(&dp->aux, DP_PSR_STATUS, &sink);
923 if (ret != 1) {
924 DRM_DEV_ERROR(dp->dev, "Failed to read psr status %d\n", ret);
925 return ret;
926 } else if (sink == DP_PSR_SINK_INACTIVE) {
927 DRM_DEV_ERROR(dp->dev, "sink inactive, skip disable psr");
928 return 0;
929 }
930
931 ret = analogix_dp_train_link(dp);
932 if (ret) {
933 DRM_DEV_ERROR(dp->dev, "Failed to train the link %d\n", ret);
934 return ret;
935 }
936
937 /* Prepare VSC packet as per EDP 1.4 spec, Table 6.9 */
938 memset(&psr_vsc, 0, sizeof(psr_vsc));
939 psr_vsc.sdp_header.HB0 = 0;
940 psr_vsc.sdp_header.HB1 = 0x7;
941 psr_vsc.sdp_header.HB2 = 0x2;
942 psr_vsc.sdp_header.HB3 = 0x8;
943
944 psr_vsc.db[0] = 0;
945 psr_vsc.db[1] = 0;
946
947 return analogix_dp_send_psr_spd(dp, &psr_vsc, true);
948 }
949
analogix_dp_get_modes(struct drm_connector * connector)950 static int analogix_dp_get_modes(struct drm_connector *connector)
951 {
952 struct analogix_dp_device *dp = to_dp(connector);
953 const struct drm_edid *drm_edid;
954 int num_modes = 0;
955
956 if (dp->plat_data->panel) {
957 num_modes += drm_panel_get_modes(dp->plat_data->panel, connector);
958 } else {
959 drm_edid = drm_edid_read_ddc(connector, &dp->aux.ddc);
960
961 drm_edid_connector_update(&dp->connector, drm_edid);
962
963 if (drm_edid) {
964 num_modes += drm_edid_connector_add_modes(&dp->connector);
965 drm_edid_free(drm_edid);
966 }
967 }
968
969 if (dp->plat_data->get_modes)
970 num_modes += dp->plat_data->get_modes(dp->plat_data, connector);
971
972 return num_modes;
973 }
974
975 static struct drm_encoder *
analogix_dp_best_encoder(struct drm_connector * connector)976 analogix_dp_best_encoder(struct drm_connector *connector)
977 {
978 struct analogix_dp_device *dp = to_dp(connector);
979
980 return dp->encoder;
981 }
982
983
analogix_dp_atomic_check(struct drm_connector * connector,struct drm_atomic_state * state)984 static int analogix_dp_atomic_check(struct drm_connector *connector,
985 struct drm_atomic_state *state)
986 {
987 struct analogix_dp_device *dp = to_dp(connector);
988 struct drm_connector_state *conn_state;
989 struct drm_crtc_state *crtc_state;
990
991 conn_state = drm_atomic_get_new_connector_state(state, connector);
992 if (WARN_ON(!conn_state))
993 return -ENODEV;
994
995 conn_state->self_refresh_aware = true;
996
997 if (!conn_state->crtc)
998 return 0;
999
1000 crtc_state = drm_atomic_get_new_crtc_state(state, conn_state->crtc);
1001 if (!crtc_state)
1002 return 0;
1003
1004 if (crtc_state->self_refresh_active && !dp->psr_supported)
1005 return -EINVAL;
1006
1007 return 0;
1008 }
1009
1010 static const struct drm_connector_helper_funcs analogix_dp_connector_helper_funcs = {
1011 .get_modes = analogix_dp_get_modes,
1012 .best_encoder = analogix_dp_best_encoder,
1013 .atomic_check = analogix_dp_atomic_check,
1014 };
1015
1016 static enum drm_connector_status
analogix_dp_detect(struct drm_connector * connector,bool force)1017 analogix_dp_detect(struct drm_connector *connector, bool force)
1018 {
1019 struct analogix_dp_device *dp = to_dp(connector);
1020 enum drm_connector_status status = connector_status_disconnected;
1021
1022 if (dp->plat_data->panel)
1023 return connector_status_connected;
1024
1025 if (!analogix_dp_detect_hpd(dp))
1026 status = connector_status_connected;
1027
1028 return status;
1029 }
1030
1031 static const struct drm_connector_funcs analogix_dp_connector_funcs = {
1032 .fill_modes = drm_helper_probe_single_connector_modes,
1033 .detect = analogix_dp_detect,
1034 .destroy = drm_connector_cleanup,
1035 .reset = drm_atomic_helper_connector_reset,
1036 .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
1037 .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
1038 };
1039
analogix_dp_bridge_attach(struct drm_bridge * bridge,struct drm_encoder * encoder,enum drm_bridge_attach_flags flags)1040 static int analogix_dp_bridge_attach(struct drm_bridge *bridge,
1041 struct drm_encoder *encoder,
1042 enum drm_bridge_attach_flags flags)
1043 {
1044 struct analogix_dp_device *dp = to_dp(bridge);
1045 struct drm_connector *connector = NULL;
1046 int ret = 0;
1047
1048 if (flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR) {
1049 DRM_ERROR("Fix bridge driver to make connector optional!");
1050 return -EINVAL;
1051 }
1052
1053 if (!dp->plat_data->skip_connector) {
1054 connector = &dp->connector;
1055 connector->polled = DRM_CONNECTOR_POLL_HPD;
1056
1057 ret = drm_connector_init(dp->drm_dev, connector,
1058 &analogix_dp_connector_funcs,
1059 DRM_MODE_CONNECTOR_eDP);
1060 if (ret) {
1061 DRM_ERROR("Failed to initialize connector with drm\n");
1062 return ret;
1063 }
1064
1065 drm_connector_helper_add(connector,
1066 &analogix_dp_connector_helper_funcs);
1067 drm_connector_attach_encoder(connector, encoder);
1068 }
1069
1070 /*
1071 * NOTE: the connector registration is implemented in analogix
1072 * platform driver, that to say connector would be exist after
1073 * plat_data->attch return, that's why we record the connector
1074 * point after plat attached.
1075 */
1076 if (dp->plat_data->attach) {
1077 ret = dp->plat_data->attach(dp->plat_data, bridge, connector);
1078 if (ret) {
1079 DRM_ERROR("Failed at platform attach func\n");
1080 return ret;
1081 }
1082 }
1083
1084 return 0;
1085 }
1086
1087 static
analogix_dp_get_old_crtc(struct analogix_dp_device * dp,struct drm_atomic_state * state)1088 struct drm_crtc *analogix_dp_get_old_crtc(struct analogix_dp_device *dp,
1089 struct drm_atomic_state *state)
1090 {
1091 struct drm_encoder *encoder = dp->encoder;
1092 struct drm_connector *connector;
1093 struct drm_connector_state *conn_state;
1094
1095 connector = drm_atomic_get_old_connector_for_encoder(state, encoder);
1096 if (!connector)
1097 return NULL;
1098
1099 conn_state = drm_atomic_get_old_connector_state(state, connector);
1100 if (!conn_state)
1101 return NULL;
1102
1103 return conn_state->crtc;
1104 }
1105
1106 static
analogix_dp_get_new_crtc(struct analogix_dp_device * dp,struct drm_atomic_state * state)1107 struct drm_crtc *analogix_dp_get_new_crtc(struct analogix_dp_device *dp,
1108 struct drm_atomic_state *state)
1109 {
1110 struct drm_encoder *encoder = dp->encoder;
1111 struct drm_connector *connector;
1112 struct drm_connector_state *conn_state;
1113
1114 connector = drm_atomic_get_new_connector_for_encoder(state, encoder);
1115 if (!connector)
1116 return NULL;
1117
1118 conn_state = drm_atomic_get_new_connector_state(state, connector);
1119 if (!conn_state)
1120 return NULL;
1121
1122 return conn_state->crtc;
1123 }
1124
analogix_dp_bridge_atomic_pre_enable(struct drm_bridge * bridge,struct drm_atomic_state * old_state)1125 static void analogix_dp_bridge_atomic_pre_enable(struct drm_bridge *bridge,
1126 struct drm_atomic_state *old_state)
1127 {
1128 struct analogix_dp_device *dp = to_dp(bridge);
1129 struct drm_crtc *crtc;
1130 struct drm_crtc_state *old_crtc_state;
1131
1132 crtc = analogix_dp_get_new_crtc(dp, old_state);
1133 if (!crtc)
1134 return;
1135
1136 old_crtc_state = drm_atomic_get_old_crtc_state(old_state, crtc);
1137 /* Don't touch the panel if we're coming back from PSR */
1138 if (old_crtc_state && old_crtc_state->self_refresh_active)
1139 return;
1140
1141 drm_panel_prepare(dp->plat_data->panel);
1142 }
1143
analogix_dp_set_bridge(struct analogix_dp_device * dp)1144 static int analogix_dp_set_bridge(struct analogix_dp_device *dp)
1145 {
1146 int ret;
1147
1148 pm_runtime_get_sync(dp->dev);
1149
1150 ret = analogix_dp_init_analog_func(dp);
1151 if (ret)
1152 return ret;
1153
1154 /*
1155 * According to DP spec v1.3 chap 3.5.1.2 Link Training,
1156 * We should first make sure the HPD signal is asserted high by device
1157 * when we want to establish a link with it.
1158 */
1159 ret = analogix_dp_detect_hpd(dp);
1160 if (ret) {
1161 DRM_ERROR("failed to get hpd single ret = %d\n", ret);
1162 goto out_dp_init;
1163 }
1164
1165 ret = analogix_dp_commit(dp);
1166 if (ret) {
1167 DRM_ERROR("dp commit error, ret = %d\n", ret);
1168 goto out_dp_init;
1169 }
1170
1171 enable_irq(dp->irq);
1172 return 0;
1173
1174 out_dp_init:
1175 pm_runtime_put_sync(dp->dev);
1176
1177 return ret;
1178 }
1179
analogix_dp_bridge_atomic_enable(struct drm_bridge * bridge,struct drm_atomic_state * old_state)1180 static void analogix_dp_bridge_atomic_enable(struct drm_bridge *bridge,
1181 struct drm_atomic_state *old_state)
1182 {
1183 struct analogix_dp_device *dp = to_dp(bridge);
1184 struct drm_crtc *crtc;
1185 struct drm_crtc_state *old_crtc_state;
1186 int timeout_loop = 0;
1187 int ret;
1188
1189 crtc = analogix_dp_get_new_crtc(dp, old_state);
1190 if (!crtc)
1191 return;
1192
1193 old_crtc_state = drm_atomic_get_old_crtc_state(old_state, crtc);
1194 /* Not a full enable, just disable PSR and continue */
1195 if (old_crtc_state && old_crtc_state->self_refresh_active) {
1196 ret = analogix_dp_disable_psr(dp);
1197 if (ret)
1198 DRM_ERROR("Failed to disable psr %d\n", ret);
1199 return;
1200 }
1201
1202 if (dp->dpms_mode == DRM_MODE_DPMS_ON)
1203 return;
1204
1205 while (timeout_loop < MAX_PLL_LOCK_LOOP) {
1206 if (analogix_dp_set_bridge(dp) == 0) {
1207 dp->dpms_mode = DRM_MODE_DPMS_ON;
1208 return;
1209 }
1210 dev_err(dp->dev, "failed to set bridge, retry: %d\n",
1211 timeout_loop);
1212 timeout_loop++;
1213 usleep_range(10, 11);
1214 }
1215 dev_err(dp->dev, "too many times retry set bridge, give it up\n");
1216 }
1217
analogix_dp_bridge_disable(struct drm_bridge * bridge)1218 static void analogix_dp_bridge_disable(struct drm_bridge *bridge)
1219 {
1220 struct analogix_dp_device *dp = to_dp(bridge);
1221
1222 if (dp->dpms_mode != DRM_MODE_DPMS_ON)
1223 return;
1224
1225 drm_panel_disable(dp->plat_data->panel);
1226
1227 disable_irq(dp->irq);
1228
1229 analogix_dp_set_analog_power_down(dp, POWER_ALL, 1);
1230
1231 pm_runtime_put_sync(dp->dev);
1232
1233 drm_panel_unprepare(dp->plat_data->panel);
1234
1235 dp->fast_train_enable = false;
1236 dp->psr_supported = false;
1237 dp->dpms_mode = DRM_MODE_DPMS_OFF;
1238 }
1239
analogix_dp_bridge_atomic_disable(struct drm_bridge * bridge,struct drm_atomic_state * old_state)1240 static void analogix_dp_bridge_atomic_disable(struct drm_bridge *bridge,
1241 struct drm_atomic_state *old_state)
1242 {
1243 struct analogix_dp_device *dp = to_dp(bridge);
1244 struct drm_crtc *old_crtc, *new_crtc;
1245 struct drm_crtc_state *old_crtc_state = NULL;
1246 struct drm_crtc_state *new_crtc_state = NULL;
1247 int ret;
1248
1249 new_crtc = analogix_dp_get_new_crtc(dp, old_state);
1250 if (!new_crtc)
1251 goto out;
1252
1253 new_crtc_state = drm_atomic_get_new_crtc_state(old_state, new_crtc);
1254 if (!new_crtc_state)
1255 goto out;
1256
1257 /* Don't do a full disable on PSR transitions */
1258 if (new_crtc_state->self_refresh_active)
1259 return;
1260
1261 out:
1262 old_crtc = analogix_dp_get_old_crtc(dp, old_state);
1263 if (old_crtc) {
1264 old_crtc_state = drm_atomic_get_old_crtc_state(old_state,
1265 old_crtc);
1266
1267 /* When moving from PSR to fully disabled, exit PSR first. */
1268 if (old_crtc_state && old_crtc_state->self_refresh_active) {
1269 ret = analogix_dp_disable_psr(dp);
1270 if (ret)
1271 DRM_ERROR("Failed to disable psr (%d)\n", ret);
1272 }
1273 }
1274
1275 analogix_dp_bridge_disable(bridge);
1276 }
1277
analogix_dp_bridge_atomic_post_disable(struct drm_bridge * bridge,struct drm_atomic_state * old_state)1278 static void analogix_dp_bridge_atomic_post_disable(struct drm_bridge *bridge,
1279 struct drm_atomic_state *old_state)
1280 {
1281 struct analogix_dp_device *dp = to_dp(bridge);
1282 struct drm_crtc *crtc;
1283 struct drm_crtc_state *new_crtc_state;
1284 int ret;
1285
1286 crtc = analogix_dp_get_new_crtc(dp, old_state);
1287 if (!crtc)
1288 return;
1289
1290 new_crtc_state = drm_atomic_get_new_crtc_state(old_state, crtc);
1291 if (!new_crtc_state || !new_crtc_state->self_refresh_active)
1292 return;
1293
1294 ret = analogix_dp_enable_psr(dp);
1295 if (ret)
1296 DRM_ERROR("Failed to enable psr (%d)\n", ret);
1297 }
1298
analogix_dp_bridge_mode_set(struct drm_bridge * bridge,const struct drm_display_mode * orig_mode,const struct drm_display_mode * mode)1299 static void analogix_dp_bridge_mode_set(struct drm_bridge *bridge,
1300 const struct drm_display_mode *orig_mode,
1301 const struct drm_display_mode *mode)
1302 {
1303 struct analogix_dp_device *dp = to_dp(bridge);
1304 struct drm_display_info *display_info = &dp->connector.display_info;
1305 struct video_info *video = &dp->video_info;
1306 struct device_node *dp_node = dp->dev->of_node;
1307 int vic;
1308
1309 /* Input video interlaces & hsync pol & vsync pol */
1310 video->interlaced = !!(mode->flags & DRM_MODE_FLAG_INTERLACE);
1311 video->v_sync_polarity = !!(mode->flags & DRM_MODE_FLAG_NVSYNC);
1312 video->h_sync_polarity = !!(mode->flags & DRM_MODE_FLAG_NHSYNC);
1313
1314 /* Input video dynamic_range & colorimetry */
1315 vic = drm_match_cea_mode(mode);
1316 if ((vic == 6) || (vic == 7) || (vic == 21) || (vic == 22) ||
1317 (vic == 2) || (vic == 3) || (vic == 17) || (vic == 18)) {
1318 video->dynamic_range = CEA;
1319 video->ycbcr_coeff = COLOR_YCBCR601;
1320 } else if (vic) {
1321 video->dynamic_range = CEA;
1322 video->ycbcr_coeff = COLOR_YCBCR709;
1323 } else {
1324 video->dynamic_range = VESA;
1325 video->ycbcr_coeff = COLOR_YCBCR709;
1326 }
1327
1328 /* Input vide bpc and color_formats */
1329 switch (display_info->bpc) {
1330 case 12:
1331 video->color_depth = COLOR_12;
1332 break;
1333 case 10:
1334 video->color_depth = COLOR_10;
1335 break;
1336 case 8:
1337 video->color_depth = COLOR_8;
1338 break;
1339 case 6:
1340 video->color_depth = COLOR_6;
1341 break;
1342 default:
1343 video->color_depth = COLOR_8;
1344 break;
1345 }
1346 if (display_info->color_formats & DRM_COLOR_FORMAT_YCBCR444)
1347 video->color_space = COLOR_YCBCR444;
1348 else if (display_info->color_formats & DRM_COLOR_FORMAT_YCBCR422)
1349 video->color_space = COLOR_YCBCR422;
1350 else
1351 video->color_space = COLOR_RGB;
1352
1353 /*
1354 * NOTE: those property parsing code is used for providing backward
1355 * compatibility for samsung platform.
1356 * Due to we used the "of_property_read_u32" interfaces, when this
1357 * property isn't present, the "video_info" can keep the original
1358 * values and wouldn't be modified.
1359 */
1360 of_property_read_u32(dp_node, "samsung,color-space",
1361 &video->color_space);
1362 of_property_read_u32(dp_node, "samsung,dynamic-range",
1363 &video->dynamic_range);
1364 of_property_read_u32(dp_node, "samsung,ycbcr-coeff",
1365 &video->ycbcr_coeff);
1366 of_property_read_u32(dp_node, "samsung,color-depth",
1367 &video->color_depth);
1368 if (of_property_read_bool(dp_node, "hsync-active-high"))
1369 video->h_sync_polarity = true;
1370 if (of_property_read_bool(dp_node, "vsync-active-high"))
1371 video->v_sync_polarity = true;
1372 if (of_property_read_bool(dp_node, "interlaced"))
1373 video->interlaced = true;
1374 }
1375
1376 static const struct drm_bridge_funcs analogix_dp_bridge_funcs = {
1377 .atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state,
1378 .atomic_destroy_state = drm_atomic_helper_bridge_destroy_state,
1379 .atomic_reset = drm_atomic_helper_bridge_reset,
1380 .atomic_pre_enable = analogix_dp_bridge_atomic_pre_enable,
1381 .atomic_enable = analogix_dp_bridge_atomic_enable,
1382 .atomic_disable = analogix_dp_bridge_atomic_disable,
1383 .atomic_post_disable = analogix_dp_bridge_atomic_post_disable,
1384 .mode_set = analogix_dp_bridge_mode_set,
1385 .attach = analogix_dp_bridge_attach,
1386 };
1387
analogix_dp_dt_parse_pdata(struct analogix_dp_device * dp)1388 static int analogix_dp_dt_parse_pdata(struct analogix_dp_device *dp)
1389 {
1390 struct device_node *dp_node = dp->dev->of_node;
1391 struct video_info *video_info = &dp->video_info;
1392
1393 switch (dp->plat_data->dev_type) {
1394 case RK3288_DP:
1395 case RK3399_EDP:
1396 /*
1397 * Like Rk3288 DisplayPort TRM indicate that "Main link
1398 * containing 4 physical lanes of 2.7/1.62 Gbps/lane".
1399 */
1400 video_info->max_link_rate = 0x0A;
1401 video_info->max_lane_count = 0x04;
1402 break;
1403 case RK3588_EDP:
1404 video_info->max_link_rate = 0x14;
1405 video_info->max_lane_count = 0x04;
1406 break;
1407 case EXYNOS_DP:
1408 /*
1409 * NOTE: those property parseing code is used for
1410 * providing backward compatibility for samsung platform.
1411 */
1412 of_property_read_u32(dp_node, "samsung,link-rate",
1413 &video_info->max_link_rate);
1414 of_property_read_u32(dp_node, "samsung,lane-count",
1415 &video_info->max_lane_count);
1416 break;
1417 }
1418
1419 return 0;
1420 }
1421
analogix_dpaux_transfer(struct drm_dp_aux * aux,struct drm_dp_aux_msg * msg)1422 static ssize_t analogix_dpaux_transfer(struct drm_dp_aux *aux,
1423 struct drm_dp_aux_msg *msg)
1424 {
1425 struct analogix_dp_device *dp = to_dp(aux);
1426 int ret;
1427
1428 pm_runtime_get_sync(dp->dev);
1429
1430 ret = analogix_dp_detect_hpd(dp);
1431 if (ret)
1432 goto out;
1433
1434 ret = analogix_dp_transfer(dp, msg);
1435 out:
1436 pm_runtime_mark_last_busy(dp->dev);
1437 pm_runtime_put_autosuspend(dp->dev);
1438
1439 return ret;
1440 }
1441
analogix_dpaux_wait_hpd_asserted(struct drm_dp_aux * aux,unsigned long wait_us)1442 static int analogix_dpaux_wait_hpd_asserted(struct drm_dp_aux *aux, unsigned long wait_us)
1443 {
1444 struct analogix_dp_device *dp = to_dp(aux);
1445 int val;
1446 int ret;
1447
1448 if (dp->force_hpd)
1449 return 0;
1450
1451 pm_runtime_get_sync(dp->dev);
1452
1453 ret = readx_poll_timeout(analogix_dp_get_plug_in_status, dp, val, !val,
1454 wait_us / 100, wait_us);
1455
1456 pm_runtime_mark_last_busy(dp->dev);
1457 pm_runtime_put_autosuspend(dp->dev);
1458
1459 return ret;
1460 }
1461
1462 struct analogix_dp_device *
analogix_dp_probe(struct device * dev,struct analogix_dp_plat_data * plat_data)1463 analogix_dp_probe(struct device *dev, struct analogix_dp_plat_data *plat_data)
1464 {
1465 struct platform_device *pdev = to_platform_device(dev);
1466 struct analogix_dp_device *dp;
1467 unsigned int irq_flags;
1468 int ret;
1469
1470 if (!plat_data) {
1471 dev_err(dev, "Invalided input plat_data\n");
1472 return ERR_PTR(-EINVAL);
1473 }
1474
1475 dp = devm_drm_bridge_alloc(dev, struct analogix_dp_device, bridge,
1476 &analogix_dp_bridge_funcs);
1477 if (IS_ERR(dp))
1478 return ERR_CAST(dp);
1479
1480 dp->dev = &pdev->dev;
1481 dp->dpms_mode = DRM_MODE_DPMS_OFF;
1482
1483 /*
1484 * platform dp driver need containor_of the plat_data to get
1485 * the driver private data, so we need to store the point of
1486 * plat_data, not the context of plat_data.
1487 */
1488 dp->plat_data = plat_data;
1489
1490 ret = analogix_dp_dt_parse_pdata(dp);
1491 if (ret)
1492 return ERR_PTR(ret);
1493
1494 dp->phy = devm_phy_get(dp->dev, "dp");
1495 if (IS_ERR(dp->phy)) {
1496 dev_err(dp->dev, "no DP phy configured\n");
1497 ret = PTR_ERR(dp->phy);
1498 if (ret) {
1499 /*
1500 * phy itself is not enabled, so we can move forward
1501 * assigning NULL to phy pointer.
1502 */
1503 if (ret == -ENOSYS || ret == -ENODEV)
1504 dp->phy = NULL;
1505 else
1506 return ERR_PTR(ret);
1507 }
1508 }
1509
1510 dp->clock = devm_clk_get(&pdev->dev, "dp");
1511 if (IS_ERR(dp->clock)) {
1512 dev_err(&pdev->dev, "failed to get clock\n");
1513 return ERR_CAST(dp->clock);
1514 }
1515
1516 dp->reg_base = devm_platform_ioremap_resource(pdev, 0);
1517 if (IS_ERR(dp->reg_base))
1518 return ERR_CAST(dp->reg_base);
1519
1520 dp->force_hpd = of_property_read_bool(dev->of_node, "force-hpd");
1521
1522 /* Try two different names */
1523 dp->hpd_gpiod = devm_gpiod_get_optional(dev, "hpd", GPIOD_IN);
1524 if (!dp->hpd_gpiod)
1525 dp->hpd_gpiod = devm_gpiod_get_optional(dev, "samsung,hpd",
1526 GPIOD_IN);
1527 if (IS_ERR(dp->hpd_gpiod)) {
1528 dev_err(dev, "error getting HDP GPIO: %ld\n",
1529 PTR_ERR(dp->hpd_gpiod));
1530 return ERR_CAST(dp->hpd_gpiod);
1531 }
1532
1533 if (dp->hpd_gpiod) {
1534 /*
1535 * Set up the hotplug GPIO from the device tree as an interrupt.
1536 * Simply specifying a different interrupt in the device tree
1537 * doesn't work since we handle hotplug rather differently when
1538 * using a GPIO. We also need the actual GPIO specifier so
1539 * that we can get the current state of the GPIO.
1540 */
1541 dp->irq = gpiod_to_irq(dp->hpd_gpiod);
1542 irq_flags = IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING | IRQF_NO_AUTOEN;
1543 } else {
1544 dp->irq = platform_get_irq(pdev, 0);
1545 irq_flags = IRQF_NO_AUTOEN;
1546 }
1547
1548 if (dp->irq == -ENXIO) {
1549 dev_err(&pdev->dev, "failed to get irq\n");
1550 return ERR_PTR(-ENODEV);
1551 }
1552
1553 ret = devm_request_threaded_irq(&pdev->dev, dp->irq,
1554 analogix_dp_hardirq,
1555 analogix_dp_irq_thread,
1556 irq_flags, "analogix-dp", dp);
1557 if (ret) {
1558 dev_err(&pdev->dev, "failed to request irq\n");
1559 return ERR_PTR(ret);
1560 }
1561
1562 dp->aux.name = "DP-AUX";
1563 dp->aux.transfer = analogix_dpaux_transfer;
1564 dp->aux.wait_hpd_asserted = analogix_dpaux_wait_hpd_asserted;
1565 dp->aux.dev = dp->dev;
1566 drm_dp_aux_init(&dp->aux);
1567
1568 pm_runtime_use_autosuspend(dp->dev);
1569 pm_runtime_set_autosuspend_delay(dp->dev, 100);
1570 ret = devm_pm_runtime_enable(dp->dev);
1571 if (ret)
1572 return ERR_PTR(ret);
1573
1574 return dp;
1575 }
1576 EXPORT_SYMBOL_GPL(analogix_dp_probe);
1577
analogix_dp_suspend(struct analogix_dp_device * dp)1578 int analogix_dp_suspend(struct analogix_dp_device *dp)
1579 {
1580 phy_power_off(dp->phy);
1581
1582 if (dp->plat_data->power_off)
1583 dp->plat_data->power_off(dp->plat_data);
1584
1585 clk_disable_unprepare(dp->clock);
1586
1587 return 0;
1588 }
1589 EXPORT_SYMBOL_GPL(analogix_dp_suspend);
1590
analogix_dp_resume(struct analogix_dp_device * dp)1591 int analogix_dp_resume(struct analogix_dp_device *dp)
1592 {
1593 int ret;
1594
1595 ret = clk_prepare_enable(dp->clock);
1596 if (ret < 0) {
1597 DRM_ERROR("Failed to prepare_enable the clock clk [%d]\n", ret);
1598 return ret;
1599 }
1600
1601 if (dp->plat_data->power_on)
1602 dp->plat_data->power_on(dp->plat_data);
1603
1604 phy_set_mode(dp->phy, PHY_MODE_DP);
1605 phy_power_on(dp->phy);
1606
1607 analogix_dp_init_dp(dp);
1608
1609 return 0;
1610 }
1611 EXPORT_SYMBOL_GPL(analogix_dp_resume);
1612
analogix_dp_bind(struct analogix_dp_device * dp,struct drm_device * drm_dev)1613 int analogix_dp_bind(struct analogix_dp_device *dp, struct drm_device *drm_dev)
1614 {
1615 int ret;
1616
1617 dp->drm_dev = drm_dev;
1618 dp->encoder = dp->plat_data->encoder;
1619
1620 dp->aux.drm_dev = drm_dev;
1621
1622 ret = drm_dp_aux_register(&dp->aux);
1623 if (ret) {
1624 DRM_ERROR("failed to register AUX (%d)\n", ret);
1625 return ret;
1626 }
1627
1628 ret = drm_bridge_attach(dp->encoder, &dp->bridge, NULL, 0);
1629 if (ret) {
1630 DRM_ERROR("failed to create bridge (%d)\n", ret);
1631 goto err_unregister_aux;
1632 }
1633
1634 return 0;
1635
1636 err_unregister_aux:
1637 drm_dp_aux_unregister(&dp->aux);
1638
1639 return ret;
1640 }
1641 EXPORT_SYMBOL_GPL(analogix_dp_bind);
1642
analogix_dp_unbind(struct analogix_dp_device * dp)1643 void analogix_dp_unbind(struct analogix_dp_device *dp)
1644 {
1645 analogix_dp_bridge_disable(&dp->bridge);
1646 dp->connector.funcs->destroy(&dp->connector);
1647
1648 drm_panel_unprepare(dp->plat_data->panel);
1649
1650 drm_dp_aux_unregister(&dp->aux);
1651 }
1652 EXPORT_SYMBOL_GPL(analogix_dp_unbind);
1653
analogix_dp_start_crc(struct drm_connector * connector)1654 int analogix_dp_start_crc(struct drm_connector *connector)
1655 {
1656 struct analogix_dp_device *dp = to_dp(connector);
1657
1658 if (!connector->state->crtc) {
1659 DRM_ERROR("Connector %s doesn't currently have a CRTC.\n",
1660 connector->name);
1661 return -EINVAL;
1662 }
1663
1664 return drm_dp_start_crc(&dp->aux, connector->state->crtc);
1665 }
1666 EXPORT_SYMBOL_GPL(analogix_dp_start_crc);
1667
analogix_dp_stop_crc(struct drm_connector * connector)1668 int analogix_dp_stop_crc(struct drm_connector *connector)
1669 {
1670 struct analogix_dp_device *dp = to_dp(connector);
1671
1672 return drm_dp_stop_crc(&dp->aux);
1673 }
1674 EXPORT_SYMBOL_GPL(analogix_dp_stop_crc);
1675
analogix_dp_aux_to_plat_data(struct drm_dp_aux * aux)1676 struct analogix_dp_plat_data *analogix_dp_aux_to_plat_data(struct drm_dp_aux *aux)
1677 {
1678 struct analogix_dp_device *dp = to_dp(aux);
1679
1680 return dp->plat_data;
1681 }
1682 EXPORT_SYMBOL_GPL(analogix_dp_aux_to_plat_data);
1683
analogix_dp_get_aux(struct analogix_dp_device * dp)1684 struct drm_dp_aux *analogix_dp_get_aux(struct analogix_dp_device *dp)
1685 {
1686 return &dp->aux;
1687 }
1688 EXPORT_SYMBOL_GPL(analogix_dp_get_aux);
1689
1690 MODULE_AUTHOR("Jingoo Han <jg1.han@samsung.com>");
1691 MODULE_DESCRIPTION("Analogix DP Core Driver");
1692 MODULE_LICENSE("GPL v2");
1693