2 *RockChip DP (Display port) register interface driver.
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
10 #include <linux/device.h>
11 #include <linux/delay.h>
13 #include <linux/rockchip/cpu.h>
14 #include <linux/rockchip/iomap.h>
15 #include <linux/rockchip/grf.h>
19 void rk32_edp_enable_video_mute(struct rk32_edp *edp, bool enable)
24 val = readl(edp->regs + VIDEO_CTL_1);
26 writel(val, edp->regs + VIDEO_CTL_1);
28 val = readl(edp->regs + VIDEO_CTL_1);
30 writel(val, edp->regs + VIDEO_CTL_1);
34 void rk32_edp_stop_video(struct rk32_edp *edp)
38 val = readl(edp->regs + VIDEO_CTL_1);
40 writel(val, edp->regs + VIDEO_CTL_1);
43 void rk32_edp_lane_swap(struct rk32_edp *edp, bool enable)
49 val = LANE3_MAP_LOGIC_LANE_0 | LANE2_MAP_LOGIC_LANE_1 |
50 LANE1_MAP_LOGIC_LANE_2 | LANE0_MAP_LOGIC_LANE_3;
52 val = LANE3_MAP_LOGIC_LANE_3 | LANE2_MAP_LOGIC_LANE_2 |
53 LANE1_MAP_LOGIC_LANE_1 | LANE0_MAP_LOGIC_LANE_0;
55 writel(val, edp->regs + LANE_MAP);
58 void rk32_edp_init_refclk(struct rk32_edp *edp)
61 /*struct rk32_edp_platdata *pdata = edp->dev->platform_data;
62 struct analog_param *analog_param = pdata->analog_param;
64 val = TX_TERMINAL_CTRL_50_OHM;
65 writel(val, edp->regs + ANALOG_CTL_1);*/
68 writel(val, edp->regs + ANALOG_CTL_2);
70 if (edp->soctype == SOC_RK3399)
74 writel(val, edp->regs + PLL_REG_1);
77 writel(val, edp->regs + PLL_REG_2);
80 writel(val, edp->regs + PLL_REG_3);
83 writel(val, edp->regs + PLL_REG_4);
86 writel(val, edp->regs + PLL_REG_5);
89 writel(val, edp->regs + SSC_REG);
91 writel(val, edp->regs + TX_REG_COMMON);
93 writel(val, edp->regs + DP_AUX);
95 writel(val, edp->regs + DP_BIAS);
97 writel(val, edp->regs + DP_RESERVE2);
100 /*val = DRIVE_DVDD_BIT_1_0625V | VCO_BIT_600_MICRO;
101 writel(val, edp->regs + ANALOG_CTL_3);
104 val = PD_RING_OSC | AUX_TERMINAL_CTRL_50_OHM |
105 TX_CUR1_2X | TX_CUR_16_MA;
106 writel(val, edp->regs + PLL_FILTER_CTL_1);
108 val = CH3_AMP_400_MV | CH2_AMP_400_MV |
109 CH1_AMP_400_MV | CH0_AMP_400_MV;
110 writel(val, edp->regs + TX_AMP_TUNING_CTL);
114 val = PD_RING_OSC | TX_CUR1_2X | TX_CUR_16_MA;
115 switch (analog_param->aux_tx_terminal_resistor) {
116 case AUX_TX_37_5_OHM:
117 val |= AUX_TERMINAL_CTRL_37_5_OHM;
120 val |= AUX_TERMINAL_CTRL_45_OHM;
123 val |= AUX_TERMINAL_CTRL_50_OHM;
126 val |= AUX_TERMINAL_CTRL_65_OHM;
129 writel(val, edp->regs + PLL_FILTER_CTL_1);
131 tx_amp = analog_param->tx_amplitude;
132 if (tx_amp < 200000 || tx_amp > 500000) {
134 "TX amp out of range, defaulting to 400mV\n");
138 tx_amp = ((tx_amp - 400000) / 12500) & 0x1f;
140 val = (tx_amp << CH3_AMP_SHIFT) | (tx_amp << CH2_AMP_SHIFT) |
141 (tx_amp << CH1_AMP_SHIFT) | (tx_amp << CH0_AMP_SHIFT);
142 writel(val, edp->regs + TX_AMP_TUNING_CTL);
146 void rk32_edp_init_interrupt(struct rk32_edp *edp)
148 /* Set interrupt pin assertion polarity as high */
149 writel(INT_POL, edp->regs + INT_CTL);
151 /* Clear pending valisers */
152 writel(0xff, edp->regs + COMMON_INT_STA_1);
153 writel(0x4f, edp->regs + COMMON_INT_STA_2);
154 writel(0xff, edp->regs + COMMON_INT_STA_3);
155 writel(0x27, edp->regs + COMMON_INT_STA_4);
157 writel(0x7f, edp->regs + DP_INT_STA);
159 /* 0:mask,1: unmask */
160 writel(0x00, edp->regs + COMMON_INT_MASK_1);
161 writel(0x00, edp->regs + COMMON_INT_MASK_2);
162 writel(0x00, edp->regs + COMMON_INT_MASK_3);
163 writel(0x00, edp->regs + COMMON_INT_MASK_4);
164 writel(0x00, edp->regs + DP_INT_STA_MASK);
167 void rk32_edp_reset(struct rk32_edp *edp)
171 rk32_edp_stop_video(edp);
172 rk32_edp_enable_video_mute(edp, 0);
174 val = VID_CAP_FUNC_EN_N | AUD_FIFO_FUNC_EN_N |
175 AUD_FUNC_EN_N | HDCP_FUNC_EN_N | SW_FUNC_EN_N;
176 writel(val, edp->regs + FUNC_EN_1);
178 val = SSC_FUNC_EN_N | AUX_FUNC_EN_N |
179 SERDES_FIFO_FUNC_EN_N |
180 LS_CLK_DOMAIN_FUNC_EN_N;
181 writel(val, edp->regs + FUNC_EN_2);
185 rk32_edp_lane_swap(edp, 0);
187 writel(0x0, edp->regs + SYS_CTL_1);
188 writel(0x40, edp->regs + SYS_CTL_2);
189 writel(0x0, edp->regs + SYS_CTL_3);
190 writel(0x0, edp->regs + SYS_CTL_4);
192 writel(0x0, edp->regs + PKT_SEND_CTL);
193 writel(0x0, edp->regs + HDCP_CTL);
195 writel(0x5e, edp->regs + HPD_DEGLITCH_L);
196 writel(0x1a, edp->regs + HPD_DEGLITCH_H);
198 writel(0x10, edp->regs + LINK_DEBUG_CTL);
200 writel(0x0, edp->regs + VIDEO_FIFO_THRD);
201 writel(0x20, edp->regs + AUDIO_MARGIN);
203 writel(0x4, edp->regs + M_VID_GEN_FILTER_TH);
204 writel(0x2, edp->regs + M_AUD_GEN_FILTER_TH);
206 writel(0x0, edp->regs + SOC_GENERAL_CTL);
210 void rk32_edp_config_interrupt(struct rk32_edp *edp)
214 /* 0: mask, 1: unmask */
216 writel(val, edp->regs + COMMON_INT_MASK_1);
218 writel(val, edp->regs + COMMON_INT_MASK_2);
220 writel(val, edp->regs + COMMON_INT_MASK_3);
222 writel(val, edp->regs + COMMON_INT_MASK_4);
224 writel(val, edp->regs + DP_INT_STA_MASK);
227 u32 rk32_edp_get_pll_lock_status(struct rk32_edp *edp)
231 val = readl(edp->regs + DEBUG_CTL);
233 return DP_PLL_LOCKED;
235 return DP_PLL_UNLOCKED;
239 void rk32_edp_analog_power_ctr(struct rk32_edp *edp, bool enable)
244 val = PD_EXP_BG | PD_AUX | PD_PLL |
245 PD_CH3 | PD_CH2 | PD_CH1 | PD_CH0;
246 writel(val, edp->regs + DP_PWRDN);
248 writel(0x0, edp->regs + DP_PWRDN);
250 val = PD_EXP_BG | PD_AUX | PD_PLL |
251 PD_CH3 | PD_CH2 | PD_CH1 | PD_CH0;
252 writel(val, edp->regs + DP_PWRDN);
257 void rk32_edp_init_analog_func(struct rk32_edp *edp)
261 rk32_edp_analog_power_ctr(edp, 1);
264 writel(val, edp->regs + COMMON_INT_STA_1);
266 val = readl(edp->regs + DEBUG_CTL);
267 val &= ~(F_PLL_LOCK | PLL_LOCK_CTRL);
268 writel(val, edp->regs + DEBUG_CTL);
272 if (rk32_edp_get_pll_lock_status(edp) == DP_PLL_LOCKED) {
273 dev_info(edp->dev, "edp pll locked\n");
281 /* Enable Serdes FIFO function and Link symbol clock domain module */
282 val = readl(edp->regs + FUNC_EN_2);
283 val &= ~(SERDES_FIFO_FUNC_EN_N | LS_CLK_DOMAIN_FUNC_EN_N
284 | AUX_FUNC_EN_N | SSC_FUNC_EN_N);
285 writel(val, edp->regs + FUNC_EN_2);
288 void rk32_edp_init_hpd(struct rk32_edp *edp)
292 val = HOTPLUG_CHG | HPD_LOST | PLUG;
293 writel(val, edp->regs + COMMON_INT_STA_4);
296 writel(val, edp->regs + DP_INT_STA);
298 val = readl(edp->regs + SYS_CTL_3);
299 val |= (F_HPD | HPD_CTRL);
300 writel(val, edp->regs + SYS_CTL_3);
303 void rk32_edp_reset_aux(struct rk32_edp *edp)
307 /* Disable AUX channel module */
308 val = readl(edp->regs + FUNC_EN_2);
309 val |= AUX_FUNC_EN_N;
310 writel(val, edp->regs + FUNC_EN_2);
313 void rk32_edp_init_aux(struct rk32_edp *edp)
317 /* Clear inerrupts related to AUX channel */
318 val = RPLY_RECEIV | AUX_ERR;
319 writel(val, edp->regs + DP_INT_STA);
321 rk32_edp_reset_aux(edp);
323 /* Disable AUX transaction H/W retry */
324 /*val = AUX_BIT_PERIOD_EXPECTED_DELAY(3) | AUX_HW_RETRY_COUNT_SEL(0)|
325 AUX_HW_RETRY_INTERVAL_600_MICROSECONDS;
326 writel(val, edp->regs + AUX_HW_RETRY_CTL) ;*/
328 /* Receive AUX Channel DEFER commands equal to DEFFER_COUNT*64 */
329 val = DEFER_CTRL_EN | DEFER_COUNT(1);
330 writel(val, edp->regs + AUX_CH_DEFER_CTL);
332 /* Enable AUX channel module */
333 val = readl(edp->regs + FUNC_EN_2);
334 val &= ~AUX_FUNC_EN_N;
335 writel(val, edp->regs + FUNC_EN_2);
338 int rk32_edp_get_plug_in_status(struct rk32_edp *edp)
342 val = readl(edp->regs + SYS_CTL_3);
343 if (val & HPD_STATUS)
349 void rk32_edp_enable_sw_function(struct rk32_edp *edp)
352 val = readl(edp->regs + FUNC_EN_1);
353 val &= ~SW_FUNC_EN_N;
354 writel(val, edp->regs + FUNC_EN_1);
357 int rk32_edp_start_aux_transaction(struct rk32_edp *edp)
361 int timeout_loop = 0;
364 /* Enable AUX CH operation */
365 val = readl(edp->regs + AUX_CH_CTL_2);
367 writel(val, edp->regs + AUX_CH_CTL_2);
369 /* Is AUX CH operation enabled? */
370 val = readl(edp->regs + AUX_CH_CTL_2);
371 while (val & AUX_EN) {
373 if ((DP_TIMEOUT_LOOP_CNT * 10) < aux_timeout) {
374 dev_err(edp->dev, "AUX CH enable timeout!\n");
377 val = readl(edp->regs + AUX_CH_CTL_2);
381 /* Is AUX CH command redply received? */
382 val = readl(edp->regs + DP_INT_STA);
383 while (!(val & RPLY_RECEIV)) {
385 if (DP_TIMEOUT_LOOP_CNT < timeout_loop) {
386 dev_err(edp->dev, "AUX CH command redply failed!\n");
389 val = readl(edp->regs + DP_INT_STA);
393 /* Clear interrupt source for AUX CH command redply */
394 writel(RPLY_RECEIV, edp->regs + DP_INT_STA);
396 /* Clear interrupt source for AUX CH access error */
397 val = readl(edp->regs + DP_INT_STA);
399 writel(AUX_ERR, edp->regs + DP_INT_STA);
403 /* Check AUX CH error access status */
404 val = readl(edp->regs + AUX_CH_STA);
405 if ((val & AUX_STATUS_MASK) != 0) {
406 dev_err(edp->dev, "AUX CH error happens: %d\n\n",
407 val & AUX_STATUS_MASK);
414 int rk32_edp_write_byte_to_dpcd(struct rk32_edp *edp,
415 unsigned int val_addr,
422 for (i = 0; i < 3; i++) {
423 /* Clear AUX CH data buffer */
425 writel(val, edp->regs + BUFFER_DATA_CTL);
427 /* Select DPCD device address */
428 val = AUX_ADDR_7_0(val_addr);
429 writel(val, edp->regs + DP_AUX_ADDR_7_0);
430 val = AUX_ADDR_15_8(val_addr);
431 writel(val, edp->regs + DP_AUX_ADDR_15_8);
432 val = AUX_ADDR_19_16(val_addr);
433 writel(val, edp->regs + DP_AUX_ADDR_19_16);
435 /* Write data buffer */
436 val = (unsigned int)data;
437 writel(val, edp->regs + BUF_DATA_0);
440 * Set DisplayPort transaction and write 1 byte
441 * If bit 3 is 1, DisplayPort transaction.
442 * If Bit 3 is 0, I2C transaction.
444 val = AUX_TX_COMM_DP_TRANSACTION | AUX_TX_COMM_WRITE;
445 writel(val, edp->regs + AUX_CH_CTL_1);
447 /* Start AUX transaction */
448 retval = rk32_edp_start_aux_transaction(edp);
452 dev_dbg(edp->dev, "Aux Transaction fail!\n");
458 int rk32_edp_read_byte_from_dpcd(struct rk32_edp *edp,
459 unsigned int val_addr,
466 for (i = 0; i < 10; i++) {
467 /* Clear AUX CH data buffer */
469 writel(val, edp->regs + BUFFER_DATA_CTL);
471 /* Select DPCD device address */
472 val = AUX_ADDR_7_0(val_addr);
473 writel(val, edp->regs + DP_AUX_ADDR_7_0);
474 val = AUX_ADDR_15_8(val_addr);
475 writel(val, edp->regs + DP_AUX_ADDR_15_8);
476 val = AUX_ADDR_19_16(val_addr);
477 writel(val, edp->regs + DP_AUX_ADDR_19_16);
480 * Set DisplayPort transaction and read 1 byte
481 * If bit 3 is 1, DisplayPort transaction.
482 * If Bit 3 is 0, I2C transaction.
484 val = AUX_TX_COMM_DP_TRANSACTION | AUX_TX_COMM_READ;
485 writel(val, edp->regs + AUX_CH_CTL_1);
487 /* Start AUX transaction */
488 retval = rk32_edp_start_aux_transaction(edp);
492 dev_dbg(edp->dev, "Aux Transaction fail!\n");
495 /* Read data buffer */
496 val = readl(edp->regs + BUF_DATA_0);
497 *data = (unsigned char)(val & 0xff);
502 int rk32_edp_write_bytes_to_dpcd(struct rk32_edp *edp,
503 unsigned int val_addr,
505 unsigned char data[])
508 unsigned int start_offset;
509 unsigned int cur_data_count;
510 unsigned int cur_data_idx;
514 /* Clear AUX CH data buffer */
516 writel(val, edp->regs + BUFFER_DATA_CTL);
519 while (start_offset < count) {
520 /* Buffer size of AUX CH is 16 * 4bytes */
521 if ((count - start_offset) > 16)
524 cur_data_count = count - start_offset;
526 for (i = 0; i < 10; i++) {
527 /* Select DPCD device address */
528 val = AUX_ADDR_7_0(val_addr + start_offset);
529 writel(val, edp->regs + DP_AUX_ADDR_7_0);
530 val = AUX_ADDR_15_8(val_addr + start_offset);
531 writel(val, edp->regs + DP_AUX_ADDR_15_8);
532 val = AUX_ADDR_19_16(val_addr + start_offset);
533 writel(val, edp->regs + DP_AUX_ADDR_19_16);
535 for (cur_data_idx = 0; cur_data_idx < cur_data_count;
537 val = data[start_offset + cur_data_idx];
538 writel(val, edp->regs + BUF_DATA_0
543 * Set DisplayPort transaction and write
544 * If bit 3 is 1, DisplayPort transaction.
545 * If Bit 3 is 0, I2C transaction.
547 val = AUX_LENGTH(cur_data_count) |
548 AUX_TX_COMM_DP_TRANSACTION | AUX_TX_COMM_WRITE;
549 writel(val, edp->regs + AUX_CH_CTL_1);
551 /* Start AUX transaction */
552 retval = rk32_edp_start_aux_transaction(edp);
556 dev_dbg(edp->dev, "Aux Transaction fail!\n");
559 start_offset += cur_data_count;
565 int rk32_edp_read_bytes_from_dpcd(struct rk32_edp *edp,
566 unsigned int val_addr,
568 unsigned char data[])
571 unsigned int start_offset;
572 unsigned int cur_data_count;
573 unsigned int cur_data_idx;
577 /* Clear AUX CH data buffer */
579 writel(val, edp->regs + BUFFER_DATA_CTL);
582 while (start_offset < count) {
583 /* Buffer size of AUX CH is 16 * 4bytes */
584 if ((count - start_offset) > 16)
587 cur_data_count = count - start_offset;
589 /* AUX CH Request Transaction process */
590 for (i = 0; i < 10; i++) {
591 /* Select DPCD device address */
592 val = AUX_ADDR_7_0(val_addr + start_offset);
593 writel(val, edp->regs + DP_AUX_ADDR_7_0);
594 val = AUX_ADDR_15_8(val_addr + start_offset);
595 writel(val, edp->regs + DP_AUX_ADDR_15_8);
596 val = AUX_ADDR_19_16(val_addr + start_offset);
597 writel(val, edp->regs + DP_AUX_ADDR_19_16);
600 * Set DisplayPort transaction and read
601 * If bit 3 is 1, DisplayPort transaction.
602 * If Bit 3 is 0, I2C transaction.
604 val = AUX_LENGTH(cur_data_count) |
605 AUX_TX_COMM_DP_TRANSACTION | AUX_TX_COMM_READ;
606 writel(val, edp->regs + AUX_CH_CTL_1);
608 /* Start AUX transaction */
609 retval = rk32_edp_start_aux_transaction(edp);
613 dev_dbg(edp->dev, "Aux Transaction fail!\n");
616 for (cur_data_idx = 0; cur_data_idx < cur_data_count;
618 val = readl(edp->regs + BUF_DATA_0
620 data[start_offset + cur_data_idx] =
624 start_offset += cur_data_count;
630 int rk32_edp_select_i2c_device(struct rk32_edp *edp,
631 unsigned int device_addr,
632 unsigned int val_addr)
637 /* Set EDID device address */
639 writel(val, edp->regs + DP_AUX_ADDR_7_0);
640 writel(0x0, edp->regs + DP_AUX_ADDR_15_8);
641 writel(0x0, edp->regs + DP_AUX_ADDR_19_16);
643 /* Set offset from base address of EDID device */
644 writel(val_addr, edp->regs + BUF_DATA_0);
647 * Set I2C transaction and write address
648 * If bit 3 is 1, DisplayPort transaction.
649 * If Bit 3 is 0, I2C transaction.
651 val = AUX_TX_COMM_I2C_TRANSACTION | AUX_TX_COMM_MOT |
653 writel(val, edp->regs + AUX_CH_CTL_1);
655 /* Start AUX transaction */
656 retval = rk32_edp_start_aux_transaction(edp);
658 dev_dbg(edp->dev, "Aux Transaction fail!\n");
663 int rk32_edp_read_byte_from_i2c(struct rk32_edp *edp,
664 unsigned int device_addr,
665 unsigned int val_addr,
672 for (i = 0; i < 10; i++) {
673 /* Clear AUX CH data buffer */
675 writel(val, edp->regs + BUFFER_DATA_CTL);
677 /* Select EDID device */
678 retval = rk32_edp_select_i2c_device(edp, device_addr, val_addr);
680 dev_err(edp->dev, "Select EDID device fail!\n");
685 * Set I2C transaction and read data
686 * If bit 3 is 1, DisplayPort transaction.
687 * If Bit 3 is 0, I2C transaction.
689 val = AUX_TX_COMM_I2C_TRANSACTION | AUX_TX_COMM_READ;
690 writel(val, edp->regs + AUX_CH_CTL_1);
692 /* Start AUX transaction */
693 retval = rk32_edp_start_aux_transaction(edp);
697 dev_dbg(edp->dev, "Aux Transaction fail!\n");
702 *data = readl(edp->regs + BUF_DATA_0);
707 int rk32_edp_read_bytes_from_i2c(struct rk32_edp *edp,
708 unsigned int device_addr,
709 unsigned int val_addr,
711 unsigned char edid[])
715 unsigned int cur_data_idx;
716 unsigned int defer = 0;
719 for (i = 0; i < count; i += 16) {
720 for (j = 0; j < 100; j++) {
721 /* Clear AUX CH data buffer */
723 writel(val, edp->regs + BUFFER_DATA_CTL);
725 /* Set normal AUX CH command */
726 val = readl(edp->regs + AUX_CH_CTL_2);
728 writel(val, edp->regs + AUX_CH_CTL_2);
731 * If Rx sends defer, Tx sends only reads
732 * request without sending addres
735 retval = rk32_edp_select_i2c_device(edp,
736 device_addr, val_addr + i);
741 * Set I2C transaction and write data
742 * If bit 3 is 1, DisplayPort transaction.
743 * If Bit 3 is 0, I2C transaction.
745 val = AUX_LENGTH(16) | AUX_TX_COMM_I2C_TRANSACTION |
747 writel(val, edp->regs + AUX_CH_CTL_1);
749 /* Start AUX transaction */
750 retval = rk32_edp_start_aux_transaction(edp);
754 dev_dbg(edp->dev, "Aux Transaction fail!\n");
756 /* Check if Rx sends defer */
757 val = readl(edp->regs + AUX_RX_COMM);
758 if (val == AUX_RX_COMM_AUX_DEFER ||
759 val == AUX_RX_COMM_I2C_DEFER) {
760 dev_err(edp->dev, "Defer: %d\n\n", val);
765 for (cur_data_idx = 0; cur_data_idx < 16; cur_data_idx++) {
766 val = readl(edp->regs + BUF_DATA_0 + 4 * cur_data_idx);
767 edid[i + cur_data_idx] = (unsigned char)val;
774 void rk32_edp_set_link_bandwidth(struct rk32_edp *edp, u32 bwtype)
779 if ((bwtype == LINK_RATE_2_70GBPS) || (bwtype == LINK_RATE_1_62GBPS))
780 writel(val, edp->regs + LINK_BW_SET);
783 void rk32_edp_get_link_bandwidth(struct rk32_edp *edp, u32 *bwtype)
787 val = readl(edp->regs + LINK_BW_SET);
791 void rk32_edp_hw_link_training_en(struct rk32_edp *edp)
795 writel(val, edp->regs + HW_LT_CTL);
798 int rk32_edp_wait_hw_lt_done(struct rk32_edp *edp)
802 val = readl(edp->regs + HW_LT_CTL);
805 val = readl(edp->regs + DP_INT_STA);
806 if (val&HW_LT_DONE) {
807 writel(val, edp->regs + DP_INT_STA);
815 int rk32_edp_get_hw_lt_status(struct rk32_edp *edp)
818 val = readl(edp->regs + HW_LT_CTL);
819 return (val & HW_LT_ERR_CODE_MASK) >> 4;
821 void rk32_edp_set_lane_count(struct rk32_edp *edp, u32 count)
826 writel(val, edp->regs + LANE_CNT_SET);
829 void rk32_edp_get_lane_count(struct rk32_edp *edp, u32 *count)
833 val = readl(edp->regs + LANE_CNT_SET);
837 void rk32_edp_enable_enhanced_mode(struct rk32_edp *edp, bool enable)
842 val = readl(edp->regs + SYS_CTL_4);
844 writel(val, edp->regs + SYS_CTL_4);
846 val = readl(edp->regs + SYS_CTL_4);
848 writel(val, edp->regs + SYS_CTL_4);
852 void rk32_edp_set_training_pattern(struct rk32_edp *edp,
853 enum pattern_set pattern)
859 val = SCRAMBLING_ENABLE | LINK_QUAL_PATTERN_SET_PRBS7;
860 writel(val, edp->regs + TRAINING_PTN_SET);
863 val = SCRAMBLING_ENABLE | LINK_QUAL_PATTERN_SET_D10_2;
864 writel(val, edp->regs + TRAINING_PTN_SET);
867 val = SCRAMBLING_DISABLE | SW_TRAINING_PATTERN_SET_PTN1;
868 writel(val, edp->regs + TRAINING_PTN_SET);
871 val = SCRAMBLING_DISABLE | SW_TRAINING_PATTERN_SET_PTN2;
872 writel(val, edp->regs + TRAINING_PTN_SET);
875 val = SCRAMBLING_ENABLE |
876 LINK_QUAL_PATTERN_SET_DISABLE |
877 SW_TRAINING_PATTERN_SET_DISABLE;
878 writel(val, edp->regs + TRAINING_PTN_SET);
885 void rk32_edp_set_lane0_pre_emphasis(struct rk32_edp *edp, u32 level)
889 val = level << PRE_EMPHASIS_SET_SHIFT;
890 writel(val, edp->regs + LN0_LINK_TRAINING_CTL);
893 void rk32_edp_set_lane1_pre_emphasis(struct rk32_edp *edp, u32 level)
897 val = level << PRE_EMPHASIS_SET_SHIFT;
898 writel(val, edp->regs + LN1_LINK_TRAINING_CTL);
901 void rk32_edp_set_lane2_pre_emphasis(struct rk32_edp *edp, u32 level)
905 val = level << PRE_EMPHASIS_SET_SHIFT;
906 writel(val, edp->regs + LN2_LINK_TRAINING_CTL);
909 void rk32_edp_set_lane3_pre_emphasis(struct rk32_edp *edp, u32 level)
913 val = level << PRE_EMPHASIS_SET_SHIFT;
914 writel(val, edp->regs + LN3_LINK_TRAINING_CTL);
917 void rk32_edp_set_lane0_link_training(struct rk32_edp *edp,
923 writel(val, edp->regs + LN0_LINK_TRAINING_CTL);
926 void rk32_edp_set_lane1_link_training(struct rk32_edp *edp,
932 writel(val, edp->regs + LN1_LINK_TRAINING_CTL);
935 void rk32_edp_set_lane2_link_training(struct rk32_edp *edp,
941 writel(val, edp->regs + LN2_LINK_TRAINING_CTL);
944 void rk32_edp_set_lane3_link_training(struct rk32_edp *edp,
950 writel(val, edp->regs + LN3_LINK_TRAINING_CTL);
953 u32 rk32_edp_get_lane0_link_training(struct rk32_edp *edp)
957 val = readl(edp->regs + LN0_LINK_TRAINING_CTL);
961 u32 rk32_edp_get_lane1_link_training(struct rk32_edp *edp)
965 val = readl(edp->regs + LN1_LINK_TRAINING_CTL);
969 u32 rk32_edp_get_lane2_link_training(struct rk32_edp *edp)
973 val = readl(edp->regs + LN2_LINK_TRAINING_CTL);
977 u32 rk32_edp_get_lane3_link_training(struct rk32_edp *edp)
981 val = readl(edp->regs + LN3_LINK_TRAINING_CTL);
985 void rk32_edp_reset_macro(struct rk32_edp *edp)
989 val = readl(edp->regs + PHY_TEST);
991 writel(val, edp->regs + PHY_TEST);
997 writel(val, edp->regs + PHY_TEST);*/
1000 int rk32_edp_init_video(struct rk32_edp *edp)
1004 val = VSYNC_DET | VID_FORMAT_CHG | VID_CLK_CHG;
1005 writel(val, edp->regs + COMMON_INT_STA_1);
1008 writel(val, edp->regs + SYS_CTL_1);
1010 val = CHA_CRI(4) | CHA_CTRL;
1011 writel(val, edp->regs + SYS_CTL_2);
1014 writel(val, edp->regs + SYS_CTL_3);*/
1016 val = VID_HRES_TH(2) | VID_VRES_TH(0);
1017 writel(val, edp->regs + VIDEO_CTL_8);
1022 void rk32_edp_set_video_color_format(struct rk32_edp *edp,
1030 /* Configure the input color dedpth, color space, dynamic range */
1031 val = (dynamic_range << IN_D_RANGE_SHIFT) |
1032 (color_dedpth << IN_BPC_SHIFT) |
1033 (color_space << IN_COLOR_F_SHIFT);
1034 writel(val, edp->regs + VIDEO_CTL_2);
1036 /* Set Input Color YCbCr Coefficients to ITU601 or ITU709 */
1037 val = readl(edp->regs + VIDEO_CTL_3);
1038 val &= ~IN_YC_COEFFI_MASK;
1040 val |= IN_YC_COEFFI_ITU709;
1042 val |= IN_YC_COEFFI_ITU601;
1043 writel(val, edp->regs + VIDEO_CTL_3);
1046 int rk32_edp_is_slave_video_stream_clock_on(struct rk32_edp *edp)
1050 val = readl(edp->regs + SYS_CTL_1);
1051 writel(val, edp->regs + SYS_CTL_1);
1053 val = readl(edp->regs + SYS_CTL_1);
1055 if (!(val & DET_STA)) {
1056 dev_dbg(edp->dev, "Input stream clock not detected.\n");
1060 val = readl(edp->regs + SYS_CTL_2);
1061 writel(val, edp->regs + SYS_CTL_2);
1063 val = readl(edp->regs + SYS_CTL_2);
1064 if (val & CHA_STA) {
1065 dev_dbg(edp->dev, "Input stream clk is changing\n");
1073 void rk32_edp_set_video_cr_mn(struct rk32_edp *edp,
1074 enum clock_recovery_m_value_type type,
1080 if (type == REGISTER_M) {
1081 val = readl(edp->regs + SYS_CTL_4);
1083 writel(val, edp->regs + SYS_CTL_4);
1084 val = m_value & 0xff;
1085 writel(val, edp->regs + M_VID_0);
1086 val = (m_value >> 8) & 0xff;
1087 writel(val, edp->regs + M_VID_1);
1088 val = (m_value >> 16) & 0xff;
1089 writel(val, edp->regs + M_VID_2);
1091 val = n_value & 0xff;
1092 writel(val, edp->regs + N_VID_0);
1093 val = (n_value >> 8) & 0xff;
1094 writel(val, edp->regs + N_VID_1);
1095 val = (n_value >> 16) & 0xff;
1096 writel(val, edp->regs + N_VID_2);
1098 val = readl(edp->regs + SYS_CTL_4);
1100 writel(val, edp->regs + SYS_CTL_4);
1102 writel(0x00, edp->regs + N_VID_0);
1103 writel(0x80, edp->regs + N_VID_1);
1104 writel(0x00, edp->regs + N_VID_2);
1108 void rk32_edp_set_video_timing_mode(struct rk32_edp *edp, u32 type)
1112 if (type == VIDEO_TIMING_FROM_CAPTURE) {
1113 val = readl(edp->regs + VIDEO_CTL_10);
1115 writel(val, edp->regs + VIDEO_CTL_10);
1117 val = readl(edp->regs + VIDEO_CTL_10);
1119 writel(val, edp->regs + VIDEO_CTL_10);
1123 int rk32_edp_bist_cfg(struct rk32_edp *edp)
1125 struct video_info *video_info = &edp->video_info;
1126 struct rk_screen *screen = &edp->screen;
1127 u16 x_total, y_total, x_act;
1129 x_total = screen->mode.left_margin + screen->mode.right_margin +
1130 screen->mode.xres + screen->mode.hsync_len;
1131 y_total = screen->mode.upper_margin + screen->mode.lower_margin +
1132 screen->mode.yres + screen->mode.vsync_len;
1133 x_act = screen->mode.xres;
1135 rk32_edp_set_video_cr_mn(edp, CALCULATED_M, 0, 0);
1136 rk32_edp_set_video_color_format(edp, video_info->color_depth,
1137 video_info->color_space,
1138 video_info->dynamic_range,
1139 video_info->ycbcr_coeff);
1141 val = y_total & 0xff;
1142 writel(val, edp->regs + TOTAL_LINE_CFG_L);
1143 val = (y_total >> 8);
1144 writel(val, edp->regs + TOTAL_LINE_CFG_H);
1145 val = (screen->mode.yres & 0xff);
1146 writel(val, edp->regs + ATV_LINE_CFG_L);
1147 val = (screen->mode.yres >> 8);
1148 writel(val, edp->regs + ATV_LINE_CFG_H);
1149 val = screen->mode.lower_margin;
1150 writel(val, edp->regs + VF_PORCH_REG);
1151 val = screen->mode.vsync_len;
1152 writel(val, edp->regs + VSYNC_CFG_REG);
1153 val = screen->mode.upper_margin;
1154 writel(val, edp->regs + VB_PORCH_REG);
1155 val = x_total & 0xff;
1156 writel(val, edp->regs + TOTAL_PIXELL_REG);
1158 writel(val, edp->regs + TOTAL_PIXELH_REG);
1159 val = (x_act & 0xff);
1160 writel(val, edp->regs + ATV_PIXELL_REG);
1162 writel(val, edp->regs + ATV_PIXELH_REG);
1163 val = screen->mode.right_margin & 0xff;
1164 writel(val, edp->regs + HF_PORCHL_REG);
1165 val = screen->mode.right_margin >> 8;
1166 writel(val, edp->regs + HF_PORCHH_REG);
1167 val = screen->mode.hsync_len & 0xff;
1168 writel(val, edp->regs + HSYNC_CFGL_REG);
1169 val = screen->mode.hsync_len >> 8;
1170 writel(val, edp->regs + HSYNC_CFGH_REG);
1171 val = screen->mode.left_margin & 0xff;
1172 writel(val, edp->regs + HB_PORCHL_REG);
1173 val = screen->mode.left_margin >> 8;
1174 writel(val, edp->regs + HB_PORCHH_REG);
1176 val = BIST_EN | BIST_WH_64 | BIST_TYPE_COLR_BAR;
1177 writel(val, edp->regs + VIDEO_CTL_4);
1179 val = readl(edp->regs + VIDEO_CTL_10);
1181 writel(val, edp->regs + VIDEO_CTL_10);
1186 void rk32_edp_enable_video_master(struct rk32_edp *edp, bool enable)
1191 val = readl(edp->regs + SOC_GENERAL_CTL);
1192 val &= ~VIDEO_MODE_MASK;
1193 val |= VIDEO_MASTER_MODE_EN | VIDEO_MODE_MASTER_MODE;
1194 writel(val, edp->regs + SOC_GENERAL_CTL);
1196 val = readl(edp->regs + SOC_GENERAL_CTL);
1197 val &= ~VIDEO_MODE_MASK;
1198 val |= VIDEO_MODE_SLAVE_MODE;
1199 writel(val, edp->regs + SOC_GENERAL_CTL);
1203 void rk32_edp_start_video(struct rk32_edp *edp)
1207 val = readl(edp->regs + VIDEO_CTL_1);
1209 writel(val, edp->regs + VIDEO_CTL_1);
1212 int rk32_edp_is_video_stream_on(struct rk32_edp *edp)
1216 val = readl(edp->regs + SYS_CTL_3);
1217 writel(val, edp->regs + SYS_CTL_3);
1219 val = readl(edp->regs + SYS_CTL_3);
1220 if (!(val & STRM_VALID)) {
1221 dev_dbg(edp->dev, "Input video stream is not detected.\n");
1228 void rk32_edp_config_video_slave_mode(struct rk32_edp *edp,
1229 struct video_info *video_info)
1233 val = readl(edp->regs + FUNC_EN_1);
1234 val &= ~(VID_FIFO_FUNC_EN_N | VID_CAP_FUNC_EN_N);
1235 writel(val, edp->regs + FUNC_EN_1);
1237 val = readl(edp->regs + VIDEO_CTL_10);
1238 val &= ~INTERACE_SCAN_CFG;
1239 val |= (video_info->interlaced << 2);
1240 writel(val, edp->regs + VIDEO_CTL_10);
1242 val = readl(edp->regs + VIDEO_CTL_10);
1243 val &= ~VSYNC_POLARITY_CFG;
1244 val |= (video_info->v_sync_polarity << 1);
1245 writel(val, edp->regs + VIDEO_CTL_10);
1247 val = readl(edp->regs + VIDEO_CTL_10);
1248 val &= ~HSYNC_POLARITY_CFG;
1249 val |= (video_info->h_sync_polarity << 0);
1250 writel(val, edp->regs + VIDEO_CTL_10);
1252 /*val = AUDIO_MODE_SPDIF_MODE | VIDEO_MODE_SLAVE_MODE;
1253 writel(val, edp->regs + SOC_GENERAL_CTL);*/
1256 void rk32_edp_enable_scrambling(struct rk32_edp *edp)
1260 val = readl(edp->regs + TRAINING_PTN_SET);
1261 val &= ~SCRAMBLING_DISABLE;
1262 writel(val, edp->regs + TRAINING_PTN_SET);
1265 void rk32_edp_disable_scrambling(struct rk32_edp *edp)
1269 val = readl(edp->regs + TRAINING_PTN_SET);
1270 val |= SCRAMBLING_DISABLE;
1271 writel(val, edp->regs + TRAINING_PTN_SET);
1274 enum dp_irq_type rk32_edp_get_irq_type(struct rk32_edp *edp)
1278 /* Parse hotplug interrupt status register */
1279 val = readl(edp->regs + COMMON_INT_STA_4);
1281 return DP_IRQ_TYPE_HP_CABLE_IN;
1284 return DP_IRQ_TYPE_HP_CABLE_OUT;
1286 if (val & HOTPLUG_CHG)
1287 return DP_IRQ_TYPE_HP_CHANGE;
1289 return DP_IRQ_TYPE_UNKNOWN;
1292 void rk32_edp_clear_hotplug_interrupts(struct rk32_edp *edp)
1296 val = HOTPLUG_CHG | HPD_LOST | PLUG;
1297 writel(val, edp->regs + COMMON_INT_STA_4);
1300 writel(val, edp->regs + DP_INT_STA);