blob: 169d1810d30c8f99ba7759bec9ba98b415e3a52f [file] [log] [blame]
Jingoo Hane9474be2012-02-03 18:01:55 +09001/*
2 * Samsung DP (Display port) register interface driver.
3 *
4 * Copyright (C) 2012 Samsung Electronics Co., Ltd.
5 * Author: Jingoo Han <jg1.han@samsung.com>
6 *
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the
9 * Free Software Foundation; either version 2 of the License, or (at your
10 * option) any later version.
11 */
12
13#include <linux/device.h>
14#include <linux/io.h>
15#include <linux/delay.h>
16
17#include <video/exynos_dp.h>
18
19#include <plat/cpu.h>
20
21#include "exynos_dp_core.h"
22#include "exynos_dp_reg.h"
23
24#define COMMON_INT_MASK_1 (0)
25#define COMMON_INT_MASK_2 (0)
26#define COMMON_INT_MASK_3 (0)
27#define COMMON_INT_MASK_4 (0)
28#define INT_STA_MASK (0)
29
30void exynos_dp_enable_video_mute(struct exynos_dp_device *dp, bool enable)
31{
32 u32 reg;
33
34 if (enable) {
35 reg = readl(dp->reg_base + EXYNOS_DP_VIDEO_CTL_1);
36 reg |= HDCP_VIDEO_MUTE;
37 writel(reg, dp->reg_base + EXYNOS_DP_VIDEO_CTL_1);
38 } else {
39 reg = readl(dp->reg_base + EXYNOS_DP_VIDEO_CTL_1);
40 reg &= ~HDCP_VIDEO_MUTE;
41 writel(reg, dp->reg_base + EXYNOS_DP_VIDEO_CTL_1);
42 }
43}
44
45void exynos_dp_stop_video(struct exynos_dp_device *dp)
46{
47 u32 reg;
48
49 reg = readl(dp->reg_base + EXYNOS_DP_VIDEO_CTL_1);
50 reg &= ~VIDEO_EN;
51 writel(reg, dp->reg_base + EXYNOS_DP_VIDEO_CTL_1);
52}
53
54void exynos_dp_lane_swap(struct exynos_dp_device *dp, bool enable)
55{
56 u32 reg;
57
58 if (enable)
59 reg = LANE3_MAP_LOGIC_LANE_0 | LANE2_MAP_LOGIC_LANE_1 |
60 LANE1_MAP_LOGIC_LANE_2 | LANE0_MAP_LOGIC_LANE_3;
61 else
62 reg = LANE3_MAP_LOGIC_LANE_3 | LANE2_MAP_LOGIC_LANE_2 |
63 LANE1_MAP_LOGIC_LANE_1 | LANE0_MAP_LOGIC_LANE_0;
64
65 writel(reg, dp->reg_base + EXYNOS_DP_LANE_MAP);
66}
67
68void exynos_dp_init_interrupt(struct exynos_dp_device *dp)
69{
70 /* Set interrupt pin assertion polarity as high */
71 writel(INT_POL, dp->reg_base + EXYNOS_DP_INT_CTL);
72
73 /* Clear pending regisers */
74 writel(0xff, dp->reg_base + EXYNOS_DP_COMMON_INT_STA_1);
75 writel(0x4f, dp->reg_base + EXYNOS_DP_COMMON_INT_STA_2);
76 writel(0xe0, dp->reg_base + EXYNOS_DP_COMMON_INT_STA_3);
77 writel(0xe7, dp->reg_base + EXYNOS_DP_COMMON_INT_STA_4);
78 writel(0x63, dp->reg_base + EXYNOS_DP_INT_STA);
79
80 /* 0:mask,1: unmask */
81 writel(0x00, dp->reg_base + EXYNOS_DP_COMMON_INT_MASK_1);
82 writel(0x00, dp->reg_base + EXYNOS_DP_COMMON_INT_MASK_2);
83 writel(0x00, dp->reg_base + EXYNOS_DP_COMMON_INT_MASK_3);
84 writel(0x00, dp->reg_base + EXYNOS_DP_COMMON_INT_MASK_4);
85 writel(0x00, dp->reg_base + EXYNOS_DP_INT_STA_MASK);
86}
87
88void exynos_dp_reset(struct exynos_dp_device *dp)
89{
90 u32 reg;
91
92 writel(RESET_DP_TX, dp->reg_base + EXYNOS_DP_TX_SW_RESET);
93
94 exynos_dp_stop_video(dp);
95 exynos_dp_enable_video_mute(dp, 0);
96
97 reg = MASTER_VID_FUNC_EN_N | SLAVE_VID_FUNC_EN_N |
98 AUD_FIFO_FUNC_EN_N | AUD_FUNC_EN_N |
99 HDCP_FUNC_EN_N | SW_FUNC_EN_N;
100 writel(reg, dp->reg_base + EXYNOS_DP_FUNC_EN_1);
101
102 reg = SSC_FUNC_EN_N | AUX_FUNC_EN_N |
103 SERDES_FIFO_FUNC_EN_N |
104 LS_CLK_DOMAIN_FUNC_EN_N;
105 writel(reg, dp->reg_base + EXYNOS_DP_FUNC_EN_2);
106
107 udelay(20);
108
109 exynos_dp_lane_swap(dp, 0);
110
111 writel(0x0, dp->reg_base + EXYNOS_DP_SYS_CTL_1);
112 writel(0x40, dp->reg_base + EXYNOS_DP_SYS_CTL_2);
113 writel(0x0, dp->reg_base + EXYNOS_DP_SYS_CTL_3);
114 writel(0x0, dp->reg_base + EXYNOS_DP_SYS_CTL_4);
115
116 writel(0x0, dp->reg_base + EXYNOS_DP_PKT_SEND_CTL);
117 writel(0x0, dp->reg_base + EXYNOS_DP_HDCP_CTL);
118
119 writel(0x5e, dp->reg_base + EXYNOS_DP_HPD_DEGLITCH_L);
120 writel(0x1a, dp->reg_base + EXYNOS_DP_HPD_DEGLITCH_H);
121
122 writel(0x10, dp->reg_base + EXYNOS_DP_LINK_DEBUG_CTL);
123
124 writel(0x0, dp->reg_base + EXYNOS_DP_PHY_TEST);
125
126 writel(0x0, dp->reg_base + EXYNOS_DP_VIDEO_FIFO_THRD);
127 writel(0x20, dp->reg_base + EXYNOS_DP_AUDIO_MARGIN);
128
129 writel(0x4, dp->reg_base + EXYNOS_DP_M_VID_GEN_FILTER_TH);
130 writel(0x2, dp->reg_base + EXYNOS_DP_M_AUD_GEN_FILTER_TH);
131
132 writel(0x00000101, dp->reg_base + EXYNOS_DP_SOC_GENERAL_CTL);
133
134 exynos_dp_init_interrupt(dp);
135}
136
137void exynos_dp_config_interrupt(struct exynos_dp_device *dp)
138{
139 u32 reg;
140
141 /* 0: mask, 1: unmask */
142 reg = COMMON_INT_MASK_1;
143 writel(reg, dp->reg_base + EXYNOS_DP_COMMON_INT_MASK_1);
144
145 reg = COMMON_INT_MASK_2;
146 writel(reg, dp->reg_base + EXYNOS_DP_COMMON_INT_MASK_2);
147
148 reg = COMMON_INT_MASK_3;
149 writel(reg, dp->reg_base + EXYNOS_DP_COMMON_INT_MASK_3);
150
151 reg = COMMON_INT_MASK_4;
152 writel(reg, dp->reg_base + EXYNOS_DP_COMMON_INT_MASK_4);
153
154 reg = INT_STA_MASK;
155 writel(reg, dp->reg_base + EXYNOS_DP_INT_STA_MASK);
156}
157
158u32 exynos_dp_get_pll_lock_status(struct exynos_dp_device *dp)
159{
160 u32 reg;
161
162 reg = readl(dp->reg_base + EXYNOS_DP_DEBUG_CTL);
163 if (reg & PLL_LOCK)
164 return PLL_LOCKED;
165 else
166 return PLL_UNLOCKED;
167}
168
169void exynos_dp_set_pll_power_down(struct exynos_dp_device *dp, bool enable)
170{
171 u32 reg;
172
173 if (enable) {
174 reg = readl(dp->reg_base + EXYNOS_DP_PLL_CTL);
175 reg |= DP_PLL_PD;
176 writel(reg, dp->reg_base + EXYNOS_DP_PLL_CTL);
177 } else {
178 reg = readl(dp->reg_base + EXYNOS_DP_PLL_CTL);
179 reg &= ~DP_PLL_PD;
180 writel(reg, dp->reg_base + EXYNOS_DP_PLL_CTL);
181 }
182}
183
184void exynos_dp_set_analog_power_down(struct exynos_dp_device *dp,
185 enum analog_power_block block,
186 bool enable)
187{
188 u32 reg;
189
190 switch (block) {
191 case AUX_BLOCK:
192 if (enable) {
193 reg = readl(dp->reg_base + EXYNOS_DP_PHY_PD);
194 reg |= AUX_PD;
195 writel(reg, dp->reg_base + EXYNOS_DP_PHY_PD);
196 } else {
197 reg = readl(dp->reg_base + EXYNOS_DP_PHY_PD);
198 reg &= ~AUX_PD;
199 writel(reg, dp->reg_base + EXYNOS_DP_PHY_PD);
200 }
201 break;
202 case CH0_BLOCK:
203 if (enable) {
204 reg = readl(dp->reg_base + EXYNOS_DP_PHY_PD);
205 reg |= CH0_PD;
206 writel(reg, dp->reg_base + EXYNOS_DP_PHY_PD);
207 } else {
208 reg = readl(dp->reg_base + EXYNOS_DP_PHY_PD);
209 reg &= ~CH0_PD;
210 writel(reg, dp->reg_base + EXYNOS_DP_PHY_PD);
211 }
212 break;
213 case CH1_BLOCK:
214 if (enable) {
215 reg = readl(dp->reg_base + EXYNOS_DP_PHY_PD);
216 reg |= CH1_PD;
217 writel(reg, dp->reg_base + EXYNOS_DP_PHY_PD);
218 } else {
219 reg = readl(dp->reg_base + EXYNOS_DP_PHY_PD);
220 reg &= ~CH1_PD;
221 writel(reg, dp->reg_base + EXYNOS_DP_PHY_PD);
222 }
223 break;
224 case CH2_BLOCK:
225 if (enable) {
226 reg = readl(dp->reg_base + EXYNOS_DP_PHY_PD);
227 reg |= CH2_PD;
228 writel(reg, dp->reg_base + EXYNOS_DP_PHY_PD);
229 } else {
230 reg = readl(dp->reg_base + EXYNOS_DP_PHY_PD);
231 reg &= ~CH2_PD;
232 writel(reg, dp->reg_base + EXYNOS_DP_PHY_PD);
233 }
234 break;
235 case CH3_BLOCK:
236 if (enable) {
237 reg = readl(dp->reg_base + EXYNOS_DP_PHY_PD);
238 reg |= CH3_PD;
239 writel(reg, dp->reg_base + EXYNOS_DP_PHY_PD);
240 } else {
241 reg = readl(dp->reg_base + EXYNOS_DP_PHY_PD);
242 reg &= ~CH3_PD;
243 writel(reg, dp->reg_base + EXYNOS_DP_PHY_PD);
244 }
245 break;
246 case ANALOG_TOTAL:
247 if (enable) {
248 reg = readl(dp->reg_base + EXYNOS_DP_PHY_PD);
249 reg |= DP_PHY_PD;
250 writel(reg, dp->reg_base + EXYNOS_DP_PHY_PD);
251 } else {
252 reg = readl(dp->reg_base + EXYNOS_DP_PHY_PD);
253 reg &= ~DP_PHY_PD;
254 writel(reg, dp->reg_base + EXYNOS_DP_PHY_PD);
255 }
256 break;
257 case POWER_ALL:
258 if (enable) {
259 reg = DP_PHY_PD | AUX_PD | CH3_PD | CH2_PD |
260 CH1_PD | CH0_PD;
261 writel(reg, dp->reg_base + EXYNOS_DP_PHY_PD);
262 } else {
263 writel(0x00, dp->reg_base + EXYNOS_DP_PHY_PD);
264 }
265 break;
266 default:
267 break;
268 }
269}
270
271void exynos_dp_init_analog_func(struct exynos_dp_device *dp)
272{
273 u32 reg;
Jingoo Hanb5cfeed2012-04-04 15:59:24 +0900274 int timeout_loop = 0;
Jingoo Hane9474be2012-02-03 18:01:55 +0900275
276 exynos_dp_set_analog_power_down(dp, POWER_ALL, 0);
277
278 reg = PLL_LOCK_CHG;
279 writel(reg, dp->reg_base + EXYNOS_DP_COMMON_INT_STA_1);
280
281 reg = readl(dp->reg_base + EXYNOS_DP_DEBUG_CTL);
282 reg &= ~(F_PLL_LOCK | PLL_LOCK_CTRL);
283 writel(reg, dp->reg_base + EXYNOS_DP_DEBUG_CTL);
284
285 /* Power up PLL */
Jingoo Hanb5cfeed2012-04-04 15:59:24 +0900286 if (exynos_dp_get_pll_lock_status(dp) == PLL_UNLOCKED) {
Jingoo Hane9474be2012-02-03 18:01:55 +0900287 exynos_dp_set_pll_power_down(dp, 0);
288
Jingoo Hanb5cfeed2012-04-04 15:59:24 +0900289 while (exynos_dp_get_pll_lock_status(dp) == PLL_UNLOCKED) {
290 timeout_loop++;
291 if (DP_TIMEOUT_LOOP_COUNT < timeout_loop) {
292 dev_err(dp->dev, "failed to get pll lock status\n");
293 return;
294 }
295 usleep_range(10, 20);
296 }
297 }
298
Jingoo Hane9474be2012-02-03 18:01:55 +0900299 /* Enable Serdes FIFO function and Link symbol clock domain module */
300 reg = readl(dp->reg_base + EXYNOS_DP_FUNC_EN_2);
301 reg &= ~(SERDES_FIFO_FUNC_EN_N | LS_CLK_DOMAIN_FUNC_EN_N
302 | AUX_FUNC_EN_N);
303 writel(reg, dp->reg_base + EXYNOS_DP_FUNC_EN_2);
304}
305
306void exynos_dp_init_hpd(struct exynos_dp_device *dp)
307{
308 u32 reg;
309
310 reg = HOTPLUG_CHG | HPD_LOST | PLUG;
311 writel(reg, dp->reg_base + EXYNOS_DP_COMMON_INT_STA_4);
312
313 reg = INT_HPD;
314 writel(reg, dp->reg_base + EXYNOS_DP_INT_STA);
315
316 reg = readl(dp->reg_base + EXYNOS_DP_SYS_CTL_3);
317 reg &= ~(F_HPD | HPD_CTRL);
318 writel(reg, dp->reg_base + EXYNOS_DP_SYS_CTL_3);
319}
320
321void exynos_dp_reset_aux(struct exynos_dp_device *dp)
322{
323 u32 reg;
324
325 /* Disable AUX channel module */
326 reg = readl(dp->reg_base + EXYNOS_DP_FUNC_EN_2);
327 reg |= AUX_FUNC_EN_N;
328 writel(reg, dp->reg_base + EXYNOS_DP_FUNC_EN_2);
329}
330
331void exynos_dp_init_aux(struct exynos_dp_device *dp)
332{
333 u32 reg;
334
335 /* Clear inerrupts related to AUX channel */
336 reg = RPLY_RECEIV | AUX_ERR;
337 writel(reg, dp->reg_base + EXYNOS_DP_INT_STA);
338
339 exynos_dp_reset_aux(dp);
340
341 /* Disable AUX transaction H/W retry */
342 reg = AUX_BIT_PERIOD_EXPECTED_DELAY(3) | AUX_HW_RETRY_COUNT_SEL(0)|
343 AUX_HW_RETRY_INTERVAL_600_MICROSECONDS;
344 writel(reg, dp->reg_base + EXYNOS_DP_AUX_HW_RETRY_CTL) ;
345
346 /* Receive AUX Channel DEFER commands equal to DEFFER_COUNT*64 */
347 reg = DEFER_CTRL_EN | DEFER_COUNT(1);
348 writel(reg, dp->reg_base + EXYNOS_DP_AUX_CH_DEFER_CTL);
349
350 /* Enable AUX channel module */
351 reg = readl(dp->reg_base + EXYNOS_DP_FUNC_EN_2);
352 reg &= ~AUX_FUNC_EN_N;
353 writel(reg, dp->reg_base + EXYNOS_DP_FUNC_EN_2);
354}
355
356int exynos_dp_get_plug_in_status(struct exynos_dp_device *dp)
357{
358 u32 reg;
359
360 reg = readl(dp->reg_base + EXYNOS_DP_SYS_CTL_3);
361 if (reg & HPD_STATUS)
362 return 0;
363
364 return -EINVAL;
365}
366
367void exynos_dp_enable_sw_function(struct exynos_dp_device *dp)
368{
369 u32 reg;
370
371 reg = readl(dp->reg_base + EXYNOS_DP_FUNC_EN_1);
372 reg &= ~SW_FUNC_EN_N;
373 writel(reg, dp->reg_base + EXYNOS_DP_FUNC_EN_1);
374}
375
376int exynos_dp_start_aux_transaction(struct exynos_dp_device *dp)
377{
378 int reg;
379 int retval = 0;
380
381 /* Enable AUX CH operation */
382 reg = readl(dp->reg_base + EXYNOS_DP_AUX_CH_CTL_2);
383 reg |= AUX_EN;
384 writel(reg, dp->reg_base + EXYNOS_DP_AUX_CH_CTL_2);
385
386 /* Is AUX CH command reply received? */
387 reg = readl(dp->reg_base + EXYNOS_DP_INT_STA);
388 while (!(reg & RPLY_RECEIV))
389 reg = readl(dp->reg_base + EXYNOS_DP_INT_STA);
390
391 /* Clear interrupt source for AUX CH command reply */
392 writel(RPLY_RECEIV, dp->reg_base + EXYNOS_DP_INT_STA);
393
394 /* Clear interrupt source for AUX CH access error */
395 reg = readl(dp->reg_base + EXYNOS_DP_INT_STA);
396 if (reg & AUX_ERR) {
397 writel(AUX_ERR, dp->reg_base + EXYNOS_DP_INT_STA);
398 return -EREMOTEIO;
399 }
400
401 /* Check AUX CH error access status */
402 reg = readl(dp->reg_base + EXYNOS_DP_AUX_CH_STA);
403 if ((reg & AUX_STATUS_MASK) != 0) {
404 dev_err(dp->dev, "AUX CH error happens: %d\n\n",
405 reg & AUX_STATUS_MASK);
406 return -EREMOTEIO;
407 }
408
409 return retval;
410}
411
412int exynos_dp_write_byte_to_dpcd(struct exynos_dp_device *dp,
413 unsigned int reg_addr,
414 unsigned char data)
415{
416 u32 reg;
417 int i;
418 int retval;
419
420 for (i = 0; i < 3; i++) {
421 /* Clear AUX CH data buffer */
422 reg = BUF_CLR;
423 writel(reg, dp->reg_base + EXYNOS_DP_BUFFER_DATA_CTL);
424
425 /* Select DPCD device address */
426 reg = AUX_ADDR_7_0(reg_addr);
427 writel(reg, dp->reg_base + EXYNOS_DP_AUX_ADDR_7_0);
428 reg = AUX_ADDR_15_8(reg_addr);
429 writel(reg, dp->reg_base + EXYNOS_DP_AUX_ADDR_15_8);
430 reg = AUX_ADDR_19_16(reg_addr);
431 writel(reg, dp->reg_base + EXYNOS_DP_AUX_ADDR_19_16);
432
433 /* Write data buffer */
434 reg = (unsigned int)data;
435 writel(reg, dp->reg_base + EXYNOS_DP_BUF_DATA_0);
436
437 /*
438 * Set DisplayPort transaction and write 1 byte
439 * If bit 3 is 1, DisplayPort transaction.
440 * If Bit 3 is 0, I2C transaction.
441 */
442 reg = AUX_TX_COMM_DP_TRANSACTION | AUX_TX_COMM_WRITE;
443 writel(reg, dp->reg_base + EXYNOS_DP_AUX_CH_CTL_1);
444
445 /* Start AUX transaction */
446 retval = exynos_dp_start_aux_transaction(dp);
447 if (retval == 0)
448 break;
449 else
450 dev_err(dp->dev, "Aux Transaction fail!\n");
451 }
452
453 return retval;
454}
455
456int exynos_dp_read_byte_from_dpcd(struct exynos_dp_device *dp,
457 unsigned int reg_addr,
458 unsigned char *data)
459{
460 u32 reg;
461 int i;
462 int retval;
463
464 for (i = 0; i < 10; i++) {
465 /* Clear AUX CH data buffer */
466 reg = BUF_CLR;
467 writel(reg, dp->reg_base + EXYNOS_DP_BUFFER_DATA_CTL);
468
469 /* Select DPCD device address */
470 reg = AUX_ADDR_7_0(reg_addr);
471 writel(reg, dp->reg_base + EXYNOS_DP_AUX_ADDR_7_0);
472 reg = AUX_ADDR_15_8(reg_addr);
473 writel(reg, dp->reg_base + EXYNOS_DP_AUX_ADDR_15_8);
474 reg = AUX_ADDR_19_16(reg_addr);
475 writel(reg, dp->reg_base + EXYNOS_DP_AUX_ADDR_19_16);
476
477 /*
478 * Set DisplayPort transaction and read 1 byte
479 * If bit 3 is 1, DisplayPort transaction.
480 * If Bit 3 is 0, I2C transaction.
481 */
482 reg = AUX_TX_COMM_DP_TRANSACTION | AUX_TX_COMM_READ;
483 writel(reg, dp->reg_base + EXYNOS_DP_AUX_CH_CTL_1);
484
485 /* Start AUX transaction */
486 retval = exynos_dp_start_aux_transaction(dp);
487 if (retval == 0)
488 break;
489 else
490 dev_err(dp->dev, "Aux Transaction fail!\n");
491 }
492
493 /* Read data buffer */
494 reg = readl(dp->reg_base + EXYNOS_DP_BUF_DATA_0);
495 *data = (unsigned char)(reg & 0xff);
496
497 return retval;
498}
499
500int exynos_dp_write_bytes_to_dpcd(struct exynos_dp_device *dp,
501 unsigned int reg_addr,
502 unsigned int count,
503 unsigned char data[])
504{
505 u32 reg;
506 unsigned int start_offset;
507 unsigned int cur_data_count;
508 unsigned int cur_data_idx;
509 int i;
510 int retval = 0;
511
512 /* Clear AUX CH data buffer */
513 reg = BUF_CLR;
514 writel(reg, dp->reg_base + EXYNOS_DP_BUFFER_DATA_CTL);
515
516 start_offset = 0;
517 while (start_offset < count) {
518 /* Buffer size of AUX CH is 16 * 4bytes */
519 if ((count - start_offset) > 16)
520 cur_data_count = 16;
521 else
522 cur_data_count = count - start_offset;
523
524 for (i = 0; i < 10; i++) {
525 /* Select DPCD device address */
526 reg = AUX_ADDR_7_0(reg_addr + start_offset);
527 writel(reg, dp->reg_base + EXYNOS_DP_AUX_ADDR_7_0);
528 reg = AUX_ADDR_15_8(reg_addr + start_offset);
529 writel(reg, dp->reg_base + EXYNOS_DP_AUX_ADDR_15_8);
530 reg = AUX_ADDR_19_16(reg_addr + start_offset);
531 writel(reg, dp->reg_base + EXYNOS_DP_AUX_ADDR_19_16);
532
533 for (cur_data_idx = 0; cur_data_idx < cur_data_count;
534 cur_data_idx++) {
535 reg = data[start_offset + cur_data_idx];
536 writel(reg, dp->reg_base + EXYNOS_DP_BUF_DATA_0
537 + 4 * cur_data_idx);
538 }
539
540 /*
541 * Set DisplayPort transaction and write
542 * If bit 3 is 1, DisplayPort transaction.
543 * If Bit 3 is 0, I2C transaction.
544 */
545 reg = AUX_LENGTH(cur_data_count) |
546 AUX_TX_COMM_DP_TRANSACTION | AUX_TX_COMM_WRITE;
547 writel(reg, dp->reg_base + EXYNOS_DP_AUX_CH_CTL_1);
548
549 /* Start AUX transaction */
550 retval = exynos_dp_start_aux_transaction(dp);
551 if (retval == 0)
552 break;
553 else
554 dev_err(dp->dev, "Aux Transaction fail!\n");
555 }
556
557 start_offset += cur_data_count;
558 }
559
560 return retval;
561}
562
563int exynos_dp_read_bytes_from_dpcd(struct exynos_dp_device *dp,
564 unsigned int reg_addr,
565 unsigned int count,
566 unsigned char data[])
567{
568 u32 reg;
569 unsigned int start_offset;
570 unsigned int cur_data_count;
571 unsigned int cur_data_idx;
572 int i;
573 int retval = 0;
574
575 /* Clear AUX CH data buffer */
576 reg = BUF_CLR;
577 writel(reg, dp->reg_base + EXYNOS_DP_BUFFER_DATA_CTL);
578
579 start_offset = 0;
580 while (start_offset < count) {
581 /* Buffer size of AUX CH is 16 * 4bytes */
582 if ((count - start_offset) > 16)
583 cur_data_count = 16;
584 else
585 cur_data_count = count - start_offset;
586
587 /* AUX CH Request Transaction process */
588 for (i = 0; i < 10; i++) {
589 /* Select DPCD device address */
590 reg = AUX_ADDR_7_0(reg_addr + start_offset);
591 writel(reg, dp->reg_base + EXYNOS_DP_AUX_ADDR_7_0);
592 reg = AUX_ADDR_15_8(reg_addr + start_offset);
593 writel(reg, dp->reg_base + EXYNOS_DP_AUX_ADDR_15_8);
594 reg = AUX_ADDR_19_16(reg_addr + start_offset);
595 writel(reg, dp->reg_base + EXYNOS_DP_AUX_ADDR_19_16);
596
597 /*
598 * Set DisplayPort transaction and read
599 * If bit 3 is 1, DisplayPort transaction.
600 * If Bit 3 is 0, I2C transaction.
601 */
602 reg = AUX_LENGTH(cur_data_count) |
603 AUX_TX_COMM_DP_TRANSACTION | AUX_TX_COMM_READ;
604 writel(reg, dp->reg_base + EXYNOS_DP_AUX_CH_CTL_1);
605
606 /* Start AUX transaction */
607 retval = exynos_dp_start_aux_transaction(dp);
608 if (retval == 0)
609 break;
610 else
611 dev_err(dp->dev, "Aux Transaction fail!\n");
612 }
613
614 for (cur_data_idx = 0; cur_data_idx < cur_data_count;
615 cur_data_idx++) {
616 reg = readl(dp->reg_base + EXYNOS_DP_BUF_DATA_0
617 + 4 * cur_data_idx);
618 data[start_offset + cur_data_idx] =
619 (unsigned char)reg;
620 }
621
622 start_offset += cur_data_count;
623 }
624
625 return retval;
626}
627
628int exynos_dp_select_i2c_device(struct exynos_dp_device *dp,
629 unsigned int device_addr,
630 unsigned int reg_addr)
631{
632 u32 reg;
633 int retval;
634
635 /* Set EDID device address */
636 reg = device_addr;
637 writel(reg, dp->reg_base + EXYNOS_DP_AUX_ADDR_7_0);
638 writel(0x0, dp->reg_base + EXYNOS_DP_AUX_ADDR_15_8);
639 writel(0x0, dp->reg_base + EXYNOS_DP_AUX_ADDR_19_16);
640
641 /* Set offset from base address of EDID device */
642 writel(reg_addr, dp->reg_base + EXYNOS_DP_BUF_DATA_0);
643
644 /*
645 * Set I2C transaction and write address
646 * If bit 3 is 1, DisplayPort transaction.
647 * If Bit 3 is 0, I2C transaction.
648 */
649 reg = AUX_TX_COMM_I2C_TRANSACTION | AUX_TX_COMM_MOT |
650 AUX_TX_COMM_WRITE;
651 writel(reg, dp->reg_base + EXYNOS_DP_AUX_CH_CTL_1);
652
653 /* Start AUX transaction */
654 retval = exynos_dp_start_aux_transaction(dp);
655 if (retval != 0)
656 dev_err(dp->dev, "Aux Transaction fail!\n");
657
658 return retval;
659}
660
661int exynos_dp_read_byte_from_i2c(struct exynos_dp_device *dp,
662 unsigned int device_addr,
663 unsigned int reg_addr,
664 unsigned int *data)
665{
666 u32 reg;
667 int i;
668 int retval;
669
670 for (i = 0; i < 10; i++) {
671 /* Clear AUX CH data buffer */
672 reg = BUF_CLR;
673 writel(reg, dp->reg_base + EXYNOS_DP_BUFFER_DATA_CTL);
674
675 /* Select EDID device */
676 retval = exynos_dp_select_i2c_device(dp, device_addr, reg_addr);
677 if (retval != 0) {
678 dev_err(dp->dev, "Select EDID device fail!\n");
679 continue;
680 }
681
682 /*
683 * Set I2C transaction and read data
684 * If bit 3 is 1, DisplayPort transaction.
685 * If Bit 3 is 0, I2C transaction.
686 */
687 reg = AUX_TX_COMM_I2C_TRANSACTION |
688 AUX_TX_COMM_READ;
689 writel(reg, dp->reg_base + EXYNOS_DP_AUX_CH_CTL_1);
690
691 /* Start AUX transaction */
692 retval = exynos_dp_start_aux_transaction(dp);
693 if (retval == 0)
694 break;
695 else
696 dev_err(dp->dev, "Aux Transaction fail!\n");
697 }
698
699 /* Read data */
700 if (retval == 0)
701 *data = readl(dp->reg_base + EXYNOS_DP_BUF_DATA_0);
702
703 return retval;
704}
705
706int exynos_dp_read_bytes_from_i2c(struct exynos_dp_device *dp,
707 unsigned int device_addr,
708 unsigned int reg_addr,
709 unsigned int count,
710 unsigned char edid[])
711{
712 u32 reg;
713 unsigned int i, j;
714 unsigned int cur_data_idx;
715 unsigned int defer = 0;
716 int retval = 0;
717
718 for (i = 0; i < count; i += 16) {
719 for (j = 0; j < 100; j++) {
720 /* Clear AUX CH data buffer */
721 reg = BUF_CLR;
722 writel(reg, dp->reg_base + EXYNOS_DP_BUFFER_DATA_CTL);
723
724 /* Set normal AUX CH command */
725 reg = readl(dp->reg_base + EXYNOS_DP_AUX_CH_CTL_2);
726 reg &= ~ADDR_ONLY;
727 writel(reg, dp->reg_base + EXYNOS_DP_AUX_CH_CTL_2);
728
729 /*
730 * If Rx sends defer, Tx sends only reads
731 * request without sending addres
732 */
733 if (!defer)
734 retval = exynos_dp_select_i2c_device(dp,
735 device_addr, reg_addr + i);
736 else
737 defer = 0;
738
739 if (retval == 0) {
740 /*
741 * Set I2C transaction and write data
742 * If bit 3 is 1, DisplayPort transaction.
743 * If Bit 3 is 0, I2C transaction.
744 */
745 reg = AUX_LENGTH(16) |
746 AUX_TX_COMM_I2C_TRANSACTION |
747 AUX_TX_COMM_READ;
748 writel(reg, dp->reg_base +
749 EXYNOS_DP_AUX_CH_CTL_1);
750
751 /* Start AUX transaction */
752 retval = exynos_dp_start_aux_transaction(dp);
753 if (retval == 0)
754 break;
755 else
756 dev_err(dp->dev, "Aux Transaction fail!\n");
757 }
758 /* Check if Rx sends defer */
759 reg = readl(dp->reg_base + EXYNOS_DP_AUX_RX_COMM);
760 if (reg == AUX_RX_COMM_AUX_DEFER ||
761 reg == AUX_RX_COMM_I2C_DEFER) {
762 dev_err(dp->dev, "Defer: %d\n\n", reg);
763 defer = 1;
764 }
765 }
766
767 for (cur_data_idx = 0; cur_data_idx < 16; cur_data_idx++) {
768 reg = readl(dp->reg_base + EXYNOS_DP_BUF_DATA_0
769 + 4 * cur_data_idx);
770 edid[i + cur_data_idx] = (unsigned char)reg;
771 }
772 }
773
774 return retval;
775}
776
777void exynos_dp_set_link_bandwidth(struct exynos_dp_device *dp, u32 bwtype)
778{
779 u32 reg;
780
781 reg = bwtype;
782 if ((bwtype == LINK_RATE_2_70GBPS) || (bwtype == LINK_RATE_1_62GBPS))
783 writel(reg, dp->reg_base + EXYNOS_DP_LINK_BW_SET);
784}
785
786void exynos_dp_get_link_bandwidth(struct exynos_dp_device *dp, u32 *bwtype)
787{
788 u32 reg;
789
790 reg = readl(dp->reg_base + EXYNOS_DP_LINK_BW_SET);
791 *bwtype = reg;
792}
793
794void exynos_dp_set_lane_count(struct exynos_dp_device *dp, u32 count)
795{
796 u32 reg;
797
798 reg = count;
799 writel(reg, dp->reg_base + EXYNOS_DP_LANE_COUNT_SET);
800}
801
802void exynos_dp_get_lane_count(struct exynos_dp_device *dp, u32 *count)
803{
804 u32 reg;
805
806 reg = readl(dp->reg_base + EXYNOS_DP_LANE_COUNT_SET);
807 *count = reg;
808}
809
810void exynos_dp_enable_enhanced_mode(struct exynos_dp_device *dp, bool enable)
811{
812 u32 reg;
813
814 if (enable) {
815 reg = readl(dp->reg_base + EXYNOS_DP_SYS_CTL_4);
816 reg |= ENHANCED;
817 writel(reg, dp->reg_base + EXYNOS_DP_SYS_CTL_4);
818 } else {
819 reg = readl(dp->reg_base + EXYNOS_DP_SYS_CTL_4);
820 reg &= ~ENHANCED;
821 writel(reg, dp->reg_base + EXYNOS_DP_SYS_CTL_4);
822 }
823}
824
825void exynos_dp_set_training_pattern(struct exynos_dp_device *dp,
826 enum pattern_set pattern)
827{
828 u32 reg;
829
830 switch (pattern) {
831 case PRBS7:
832 reg = SCRAMBLING_ENABLE | LINK_QUAL_PATTERN_SET_PRBS7;
833 writel(reg, dp->reg_base + EXYNOS_DP_TRAINING_PTN_SET);
834 break;
835 case D10_2:
836 reg = SCRAMBLING_ENABLE | LINK_QUAL_PATTERN_SET_D10_2;
837 writel(reg, dp->reg_base + EXYNOS_DP_TRAINING_PTN_SET);
838 break;
839 case TRAINING_PTN1:
840 reg = SCRAMBLING_DISABLE | SW_TRAINING_PATTERN_SET_PTN1;
841 writel(reg, dp->reg_base + EXYNOS_DP_TRAINING_PTN_SET);
842 break;
843 case TRAINING_PTN2:
844 reg = SCRAMBLING_DISABLE | SW_TRAINING_PATTERN_SET_PTN2;
845 writel(reg, dp->reg_base + EXYNOS_DP_TRAINING_PTN_SET);
846 break;
847 case DP_NONE:
848 reg = SCRAMBLING_ENABLE |
849 LINK_QUAL_PATTERN_SET_DISABLE |
850 SW_TRAINING_PATTERN_SET_NORMAL;
851 writel(reg, dp->reg_base + EXYNOS_DP_TRAINING_PTN_SET);
852 break;
853 default:
854 break;
855 }
856}
857
858void exynos_dp_set_lane0_pre_emphasis(struct exynos_dp_device *dp, u32 level)
859{
860 u32 reg;
861
862 reg = level << PRE_EMPHASIS_SET_SHIFT;
863 writel(reg, dp->reg_base + EXYNOS_DP_LN0_LINK_TRAINING_CTL);
864}
865
866void exynos_dp_set_lane1_pre_emphasis(struct exynos_dp_device *dp, u32 level)
867{
868 u32 reg;
869
870 reg = level << PRE_EMPHASIS_SET_SHIFT;
871 writel(reg, dp->reg_base + EXYNOS_DP_LN1_LINK_TRAINING_CTL);
872}
873
874void exynos_dp_set_lane2_pre_emphasis(struct exynos_dp_device *dp, u32 level)
875{
876 u32 reg;
877
878 reg = level << PRE_EMPHASIS_SET_SHIFT;
879 writel(reg, dp->reg_base + EXYNOS_DP_LN2_LINK_TRAINING_CTL);
880}
881
882void exynos_dp_set_lane3_pre_emphasis(struct exynos_dp_device *dp, u32 level)
883{
884 u32 reg;
885
886 reg = level << PRE_EMPHASIS_SET_SHIFT;
887 writel(reg, dp->reg_base + EXYNOS_DP_LN3_LINK_TRAINING_CTL);
888}
889
890void exynos_dp_set_lane0_link_training(struct exynos_dp_device *dp,
891 u32 training_lane)
892{
893 u32 reg;
894
895 reg = training_lane;
896 writel(reg, dp->reg_base + EXYNOS_DP_LN0_LINK_TRAINING_CTL);
897}
898
899void exynos_dp_set_lane1_link_training(struct exynos_dp_device *dp,
900 u32 training_lane)
901{
902 u32 reg;
903
904 reg = training_lane;
905 writel(reg, dp->reg_base + EXYNOS_DP_LN1_LINK_TRAINING_CTL);
906}
907
908void exynos_dp_set_lane2_link_training(struct exynos_dp_device *dp,
909 u32 training_lane)
910{
911 u32 reg;
912
913 reg = training_lane;
914 writel(reg, dp->reg_base + EXYNOS_DP_LN2_LINK_TRAINING_CTL);
915}
916
917void exynos_dp_set_lane3_link_training(struct exynos_dp_device *dp,
918 u32 training_lane)
919{
920 u32 reg;
921
922 reg = training_lane;
923 writel(reg, dp->reg_base + EXYNOS_DP_LN3_LINK_TRAINING_CTL);
924}
925
926u32 exynos_dp_get_lane0_link_training(struct exynos_dp_device *dp)
927{
928 u32 reg;
929
930 reg = readl(dp->reg_base + EXYNOS_DP_LN0_LINK_TRAINING_CTL);
931 return reg;
932}
933
934u32 exynos_dp_get_lane1_link_training(struct exynos_dp_device *dp)
935{
936 u32 reg;
937
938 reg = readl(dp->reg_base + EXYNOS_DP_LN1_LINK_TRAINING_CTL);
939 return reg;
940}
941
942u32 exynos_dp_get_lane2_link_training(struct exynos_dp_device *dp)
943{
944 u32 reg;
945
946 reg = readl(dp->reg_base + EXYNOS_DP_LN2_LINK_TRAINING_CTL);
947 return reg;
948}
949
950u32 exynos_dp_get_lane3_link_training(struct exynos_dp_device *dp)
951{
952 u32 reg;
953
954 reg = readl(dp->reg_base + EXYNOS_DP_LN3_LINK_TRAINING_CTL);
955 return reg;
956}
957
958void exynos_dp_reset_macro(struct exynos_dp_device *dp)
959{
960 u32 reg;
961
962 reg = readl(dp->reg_base + EXYNOS_DP_PHY_TEST);
963 reg |= MACRO_RST;
964 writel(reg, dp->reg_base + EXYNOS_DP_PHY_TEST);
965
966 /* 10 us is the minimum reset time. */
967 udelay(10);
968
969 reg &= ~MACRO_RST;
970 writel(reg, dp->reg_base + EXYNOS_DP_PHY_TEST);
971}
972
973int exynos_dp_init_video(struct exynos_dp_device *dp)
974{
975 u32 reg;
976
977 reg = VSYNC_DET | VID_FORMAT_CHG | VID_CLK_CHG;
978 writel(reg, dp->reg_base + EXYNOS_DP_COMMON_INT_STA_1);
979
980 reg = 0x0;
981 writel(reg, dp->reg_base + EXYNOS_DP_SYS_CTL_1);
982
983 reg = CHA_CRI(4) | CHA_CTRL;
984 writel(reg, dp->reg_base + EXYNOS_DP_SYS_CTL_2);
985
986 reg = 0x0;
987 writel(reg, dp->reg_base + EXYNOS_DP_SYS_CTL_3);
988
989 reg = VID_HRES_TH(2) | VID_VRES_TH(0);
990 writel(reg, dp->reg_base + EXYNOS_DP_VIDEO_CTL_8);
991
992 return 0;
993}
994
995void exynos_dp_set_video_color_format(struct exynos_dp_device *dp,
996 u32 color_depth,
997 u32 color_space,
998 u32 dynamic_range,
999 u32 ycbcr_coeff)
1000{
1001 u32 reg;
1002
1003 /* Configure the input color depth, color space, dynamic range */
1004 reg = (dynamic_range << IN_D_RANGE_SHIFT) |
1005 (color_depth << IN_BPC_SHIFT) |
1006 (color_space << IN_COLOR_F_SHIFT);
1007 writel(reg, dp->reg_base + EXYNOS_DP_VIDEO_CTL_2);
1008
1009 /* Set Input Color YCbCr Coefficients to ITU601 or ITU709 */
1010 reg = readl(dp->reg_base + EXYNOS_DP_VIDEO_CTL_3);
1011 reg &= ~IN_YC_COEFFI_MASK;
1012 if (ycbcr_coeff)
1013 reg |= IN_YC_COEFFI_ITU709;
1014 else
1015 reg |= IN_YC_COEFFI_ITU601;
1016 writel(reg, dp->reg_base + EXYNOS_DP_VIDEO_CTL_3);
1017}
1018
1019int exynos_dp_is_slave_video_stream_clock_on(struct exynos_dp_device *dp)
1020{
1021 u32 reg;
1022
1023 reg = readl(dp->reg_base + EXYNOS_DP_SYS_CTL_1);
1024 writel(reg, dp->reg_base + EXYNOS_DP_SYS_CTL_1);
1025
1026 reg = readl(dp->reg_base + EXYNOS_DP_SYS_CTL_1);
1027
1028 if (!(reg & DET_STA)) {
1029 dev_dbg(dp->dev, "Input stream clock not detected.\n");
1030 return -EINVAL;
1031 }
1032
1033 reg = readl(dp->reg_base + EXYNOS_DP_SYS_CTL_2);
1034 writel(reg, dp->reg_base + EXYNOS_DP_SYS_CTL_2);
1035
1036 reg = readl(dp->reg_base + EXYNOS_DP_SYS_CTL_2);
1037 dev_dbg(dp->dev, "wait SYS_CTL_2.\n");
1038
1039 if (reg & CHA_STA) {
1040 dev_dbg(dp->dev, "Input stream clk is changing\n");
1041 return -EINVAL;
1042 }
1043
1044 return 0;
1045}
1046
1047void exynos_dp_set_video_cr_mn(struct exynos_dp_device *dp,
1048 enum clock_recovery_m_value_type type,
1049 u32 m_value,
1050 u32 n_value)
1051{
1052 u32 reg;
1053
1054 if (type == REGISTER_M) {
1055 reg = readl(dp->reg_base + EXYNOS_DP_SYS_CTL_4);
1056 reg |= FIX_M_VID;
1057 writel(reg, dp->reg_base + EXYNOS_DP_SYS_CTL_4);
1058 reg = m_value & 0xff;
1059 writel(reg, dp->reg_base + EXYNOS_DP_M_VID_0);
1060 reg = (m_value >> 8) & 0xff;
1061 writel(reg, dp->reg_base + EXYNOS_DP_M_VID_1);
1062 reg = (m_value >> 16) & 0xff;
1063 writel(reg, dp->reg_base + EXYNOS_DP_M_VID_2);
1064
1065 reg = n_value & 0xff;
1066 writel(reg, dp->reg_base + EXYNOS_DP_N_VID_0);
1067 reg = (n_value >> 8) & 0xff;
1068 writel(reg, dp->reg_base + EXYNOS_DP_N_VID_1);
1069 reg = (n_value >> 16) & 0xff;
1070 writel(reg, dp->reg_base + EXYNOS_DP_N_VID_2);
1071 } else {
1072 reg = readl(dp->reg_base + EXYNOS_DP_SYS_CTL_4);
1073 reg &= ~FIX_M_VID;
1074 writel(reg, dp->reg_base + EXYNOS_DP_SYS_CTL_4);
1075
1076 writel(0x00, dp->reg_base + EXYNOS_DP_N_VID_0);
1077 writel(0x80, dp->reg_base + EXYNOS_DP_N_VID_1);
1078 writel(0x00, dp->reg_base + EXYNOS_DP_N_VID_2);
1079 }
1080}
1081
1082void exynos_dp_set_video_timing_mode(struct exynos_dp_device *dp, u32 type)
1083{
1084 u32 reg;
1085
1086 if (type == VIDEO_TIMING_FROM_CAPTURE) {
1087 reg = readl(dp->reg_base + EXYNOS_DP_VIDEO_CTL_10);
1088 reg &= ~FORMAT_SEL;
1089 writel(reg, dp->reg_base + EXYNOS_DP_VIDEO_CTL_10);
1090 } else {
1091 reg = readl(dp->reg_base + EXYNOS_DP_VIDEO_CTL_10);
1092 reg |= FORMAT_SEL;
1093 writel(reg, dp->reg_base + EXYNOS_DP_VIDEO_CTL_10);
1094 }
1095}
1096
1097void exynos_dp_enable_video_master(struct exynos_dp_device *dp, bool enable)
1098{
1099 u32 reg;
1100
1101 if (enable) {
1102 reg = readl(dp->reg_base + EXYNOS_DP_SOC_GENERAL_CTL);
1103 reg &= ~VIDEO_MODE_MASK;
1104 reg |= VIDEO_MASTER_MODE_EN | VIDEO_MODE_MASTER_MODE;
1105 writel(reg, dp->reg_base + EXYNOS_DP_SOC_GENERAL_CTL);
1106 } else {
1107 reg = readl(dp->reg_base + EXYNOS_DP_SOC_GENERAL_CTL);
1108 reg &= ~VIDEO_MODE_MASK;
1109 reg |= VIDEO_MODE_SLAVE_MODE;
1110 writel(reg, dp->reg_base + EXYNOS_DP_SOC_GENERAL_CTL);
1111 }
1112}
1113
1114void exynos_dp_start_video(struct exynos_dp_device *dp)
1115{
1116 u32 reg;
1117
1118 reg = readl(dp->reg_base + EXYNOS_DP_VIDEO_CTL_1);
1119 reg |= VIDEO_EN;
1120 writel(reg, dp->reg_base + EXYNOS_DP_VIDEO_CTL_1);
1121}
1122
1123int exynos_dp_is_video_stream_on(struct exynos_dp_device *dp)
1124{
1125 u32 reg;
1126
1127 reg = readl(dp->reg_base + EXYNOS_DP_SYS_CTL_3);
1128 writel(reg, dp->reg_base + EXYNOS_DP_SYS_CTL_3);
1129
1130 reg = readl(dp->reg_base + EXYNOS_DP_SYS_CTL_3);
1131 if (!(reg & STRM_VALID)) {
1132 dev_dbg(dp->dev, "Input video stream is not detected.\n");
1133 return -EINVAL;
1134 }
1135
1136 return 0;
1137}
1138
1139void exynos_dp_config_video_slave_mode(struct exynos_dp_device *dp,
1140 struct video_info *video_info)
1141{
1142 u32 reg;
1143
1144 reg = readl(dp->reg_base + EXYNOS_DP_FUNC_EN_1);
1145 reg &= ~(MASTER_VID_FUNC_EN_N|SLAVE_VID_FUNC_EN_N);
1146 reg |= MASTER_VID_FUNC_EN_N;
1147 writel(reg, dp->reg_base + EXYNOS_DP_FUNC_EN_1);
1148
1149 reg = readl(dp->reg_base + EXYNOS_DP_VIDEO_CTL_10);
1150 reg &= ~INTERACE_SCAN_CFG;
1151 reg |= (video_info->interlaced << 2);
1152 writel(reg, dp->reg_base + EXYNOS_DP_VIDEO_CTL_10);
1153
1154 reg = readl(dp->reg_base + EXYNOS_DP_VIDEO_CTL_10);
1155 reg &= ~VSYNC_POLARITY_CFG;
1156 reg |= (video_info->v_sync_polarity << 1);
1157 writel(reg, dp->reg_base + EXYNOS_DP_VIDEO_CTL_10);
1158
1159 reg = readl(dp->reg_base + EXYNOS_DP_VIDEO_CTL_10);
1160 reg &= ~HSYNC_POLARITY_CFG;
1161 reg |= (video_info->h_sync_polarity << 0);
1162 writel(reg, dp->reg_base + EXYNOS_DP_VIDEO_CTL_10);
1163
1164 reg = AUDIO_MODE_SPDIF_MODE | VIDEO_MODE_SLAVE_MODE;
1165 writel(reg, dp->reg_base + EXYNOS_DP_SOC_GENERAL_CTL);
1166}
1167
1168void exynos_dp_enable_scrambling(struct exynos_dp_device *dp)
1169{
1170 u32 reg;
1171
1172 reg = readl(dp->reg_base + EXYNOS_DP_TRAINING_PTN_SET);
1173 reg &= ~SCRAMBLING_DISABLE;
1174 writel(reg, dp->reg_base + EXYNOS_DP_TRAINING_PTN_SET);
1175}
1176
1177void exynos_dp_disable_scrambling(struct exynos_dp_device *dp)
1178{
1179 u32 reg;
1180
1181 reg = readl(dp->reg_base + EXYNOS_DP_TRAINING_PTN_SET);
1182 reg |= SCRAMBLING_DISABLE;
1183 writel(reg, dp->reg_base + EXYNOS_DP_TRAINING_PTN_SET);
1184}