2 * Analogix DP (Display port) core register interface driver.
4 * Copyright (C) 2012 Samsung Electronics Co., Ltd.
5 * Author: Jingoo Han <jg1.han@samsung.com>
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.
13 #include <linux/device.h>
15 #include <linux/delay.h>
16 #include <linux/gpio.h>
18 #include <drm/bridge/analogix_dp.h>
20 #include "analogix_dp_core.h"
21 #include "analogix_dp_reg.h"
23 #define COMMON_INT_MASK_1 0
24 #define COMMON_INT_MASK_2 0
25 #define COMMON_INT_MASK_3 0
26 #define COMMON_INT_MASK_4 (HOTPLUG_CHG | HPD_LOST | PLUG)
27 #define INT_STA_MASK INT_HPD
29 void analogix_dp_enable_video_mute(struct analogix_dp_device *dp, bool enable)
34 reg = readl(dp->reg_base + ANALOGIX_DP_VIDEO_CTL_1);
35 reg |= HDCP_VIDEO_MUTE;
36 writel(reg, dp->reg_base + ANALOGIX_DP_VIDEO_CTL_1);
38 reg = readl(dp->reg_base + ANALOGIX_DP_VIDEO_CTL_1);
39 reg &= ~HDCP_VIDEO_MUTE;
40 writel(reg, dp->reg_base + ANALOGIX_DP_VIDEO_CTL_1);
44 void analogix_dp_stop_video(struct analogix_dp_device *dp)
48 reg = readl(dp->reg_base + ANALOGIX_DP_VIDEO_CTL_1);
50 writel(reg, dp->reg_base + ANALOGIX_DP_VIDEO_CTL_1);
53 void analogix_dp_lane_swap(struct analogix_dp_device *dp, bool enable)
58 reg = LANE3_MAP_LOGIC_LANE_0 | LANE2_MAP_LOGIC_LANE_1 |
59 LANE1_MAP_LOGIC_LANE_2 | LANE0_MAP_LOGIC_LANE_3;
61 reg = LANE3_MAP_LOGIC_LANE_3 | LANE2_MAP_LOGIC_LANE_2 |
62 LANE1_MAP_LOGIC_LANE_1 | LANE0_MAP_LOGIC_LANE_0;
64 writel(reg, dp->reg_base + ANALOGIX_DP_LANE_MAP);
67 void analogix_dp_init_analog_param(struct analogix_dp_device *dp)
71 reg = TX_TERMINAL_CTRL_50_OHM;
72 writel(reg, dp->reg_base + ANALOGIX_DP_ANALOG_CTL_1);
74 reg = SEL_24M | TX_DVDD_BIT_1_0625V;
75 writel(reg, dp->reg_base + ANALOGIX_DP_ANALOG_CTL_2);
77 if (dp->plat_data && (dp->plat_data->dev_type == ROCKCHIP_DP)) {
79 if (dp->plat_data->subdev_type == RK3288_DP ||
80 dp->plat_data->subdev_type == RK3368_EDP)
83 writel(reg, dp->reg_base + ANALOGIX_DP_PLL_REG_1);
84 writel(0x95, dp->reg_base + ANALOGIX_DP_PLL_REG_2);
85 writel(0x40, dp->reg_base + ANALOGIX_DP_PLL_REG_3);
86 writel(0x58, dp->reg_base + ANALOGIX_DP_PLL_REG_4);
87 writel(0x22, dp->reg_base + ANALOGIX_DP_PLL_REG_5);
90 reg = DRIVE_DVDD_BIT_1_0625V | VCO_BIT_600_MICRO;
91 writel(reg, dp->reg_base + ANALOGIX_DP_ANALOG_CTL_3);
93 reg = PD_RING_OSC | AUX_TERMINAL_CTRL_50_OHM |
94 TX_CUR1_2X | TX_CUR_16_MA;
95 writel(reg, dp->reg_base + ANALOGIX_DP_PLL_FILTER_CTL_1);
97 reg = CH3_AMP_400_MV | CH2_AMP_400_MV |
98 CH1_AMP_400_MV | CH0_AMP_400_MV;
99 writel(reg, dp->reg_base + ANALOGIX_DP_TX_AMP_TUNING_CTL);
102 void analogix_dp_init_interrupt(struct analogix_dp_device *dp)
104 /* Set interrupt pin assertion polarity as high */
105 writel(INT_POL1 | INT_POL0, dp->reg_base + ANALOGIX_DP_INT_CTL);
107 /* Clear pending regisers */
108 writel(0xff, dp->reg_base + ANALOGIX_DP_COMMON_INT_STA_1);
109 writel(0x4f, dp->reg_base + ANALOGIX_DP_COMMON_INT_STA_2);
110 writel(0xe0, dp->reg_base + ANALOGIX_DP_COMMON_INT_STA_3);
111 writel(0xe7, dp->reg_base + ANALOGIX_DP_COMMON_INT_STA_4);
112 writel(0x63, dp->reg_base + ANALOGIX_DP_INT_STA);
114 /* 0:mask,1: unmask */
115 writel(0x00, dp->reg_base + ANALOGIX_DP_COMMON_INT_MASK_1);
116 writel(0x00, dp->reg_base + ANALOGIX_DP_COMMON_INT_MASK_2);
117 writel(0x00, dp->reg_base + ANALOGIX_DP_COMMON_INT_MASK_3);
118 writel(0x00, dp->reg_base + ANALOGIX_DP_COMMON_INT_MASK_4);
119 writel(0x00, dp->reg_base + ANALOGIX_DP_INT_STA_MASK);
122 void analogix_dp_reset(struct analogix_dp_device *dp)
126 analogix_dp_stop_video(dp);
127 analogix_dp_enable_video_mute(dp, 0);
129 reg = MASTER_VID_FUNC_EN_N | SLAVE_VID_FUNC_EN_N |
130 AUD_FIFO_FUNC_EN_N | AUD_FUNC_EN_N |
131 HDCP_FUNC_EN_N | SW_FUNC_EN_N;
132 writel(reg, dp->reg_base + ANALOGIX_DP_FUNC_EN_1);
134 reg = SSC_FUNC_EN_N | AUX_FUNC_EN_N |
135 SERDES_FIFO_FUNC_EN_N |
136 LS_CLK_DOMAIN_FUNC_EN_N;
137 writel(reg, dp->reg_base + ANALOGIX_DP_FUNC_EN_2);
139 usleep_range(20, 30);
141 analogix_dp_lane_swap(dp, 0);
143 writel(0x0, dp->reg_base + ANALOGIX_DP_SYS_CTL_1);
144 writel(0x40, dp->reg_base + ANALOGIX_DP_SYS_CTL_2);
145 writel(0x0, dp->reg_base + ANALOGIX_DP_SYS_CTL_3);
146 writel(0x0, dp->reg_base + ANALOGIX_DP_SYS_CTL_4);
148 writel(0x0, dp->reg_base + ANALOGIX_DP_PKT_SEND_CTL);
149 writel(0x0, dp->reg_base + ANALOGIX_DP_HDCP_CTL);
151 writel(0x5e, dp->reg_base + ANALOGIX_DP_HPD_DEGLITCH_L);
152 writel(0x1a, dp->reg_base + ANALOGIX_DP_HPD_DEGLITCH_H);
154 writel(0x10, dp->reg_base + ANALOGIX_DP_LINK_DEBUG_CTL);
156 writel(0x0, dp->reg_base + ANALOGIX_DP_PHY_TEST);
158 writel(0x0, dp->reg_base + ANALOGIX_DP_VIDEO_FIFO_THRD);
159 writel(0x20, dp->reg_base + ANALOGIX_DP_AUDIO_MARGIN);
161 writel(0x4, dp->reg_base + ANALOGIX_DP_M_VID_GEN_FILTER_TH);
162 writel(0x2, dp->reg_base + ANALOGIX_DP_M_AUD_GEN_FILTER_TH);
164 writel(0x00000101, dp->reg_base + ANALOGIX_DP_SOC_GENERAL_CTL);
167 void analogix_dp_swreset(struct analogix_dp_device *dp)
169 writel(RESET_DP_TX, dp->reg_base + ANALOGIX_DP_TX_SW_RESET);
172 void analogix_dp_config_interrupt(struct analogix_dp_device *dp)
176 /* 0: mask, 1: unmask */
177 reg = COMMON_INT_MASK_1;
178 writel(reg, dp->reg_base + ANALOGIX_DP_COMMON_INT_MASK_1);
180 reg = COMMON_INT_MASK_2;
181 writel(reg, dp->reg_base + ANALOGIX_DP_COMMON_INT_MASK_2);
183 reg = COMMON_INT_MASK_3;
184 writel(reg, dp->reg_base + ANALOGIX_DP_COMMON_INT_MASK_3);
186 reg = COMMON_INT_MASK_4;
187 writel(reg, dp->reg_base + ANALOGIX_DP_COMMON_INT_MASK_4);
190 writel(reg, dp->reg_base + ANALOGIX_DP_INT_STA_MASK);
193 void analogix_dp_mute_hpd_interrupt(struct analogix_dp_device *dp)
197 /* 0: mask, 1: unmask */
198 reg = readl(dp->reg_base + ANALOGIX_DP_COMMON_INT_MASK_4);
199 reg &= ~COMMON_INT_MASK_4;
200 writel(reg, dp->reg_base + ANALOGIX_DP_COMMON_INT_MASK_4);
202 reg = readl(dp->reg_base + ANALOGIX_DP_INT_STA_MASK);
203 reg &= ~INT_STA_MASK;
204 writel(reg, dp->reg_base + ANALOGIX_DP_INT_STA_MASK);
207 void analogix_dp_unmute_hpd_interrupt(struct analogix_dp_device *dp)
211 /* 0: mask, 1: unmask */
212 reg = COMMON_INT_MASK_4;
213 writel(reg, dp->reg_base + ANALOGIX_DP_COMMON_INT_MASK_4);
216 writel(reg, dp->reg_base + ANALOGIX_DP_INT_STA_MASK);
219 enum pll_status analogix_dp_get_pll_lock_status(struct analogix_dp_device *dp)
223 reg = readl(dp->reg_base + ANALOGIX_DP_DEBUG_CTL);
230 void analogix_dp_set_pll_power_down(struct analogix_dp_device *dp, bool enable)
235 reg = readl(dp->reg_base + ANALOGIX_DP_PLL_CTL);
237 writel(reg, dp->reg_base + ANALOGIX_DP_PLL_CTL);
239 reg = readl(dp->reg_base + ANALOGIX_DP_PLL_CTL);
241 writel(reg, dp->reg_base + ANALOGIX_DP_PLL_CTL);
245 void analogix_dp_set_analog_power_down(struct analogix_dp_device *dp,
246 enum analog_power_block block,
250 u32 phy_pd_addr = ANALOGIX_DP_PHY_PD;
252 if (dp->plat_data && (dp->plat_data->dev_type == ROCKCHIP_DP))
253 phy_pd_addr = ANALOGIX_DP_PD;
258 reg = readl(dp->reg_base + phy_pd_addr);
260 writel(reg, dp->reg_base + phy_pd_addr);
262 reg = readl(dp->reg_base + phy_pd_addr);
264 writel(reg, dp->reg_base + phy_pd_addr);
269 reg = readl(dp->reg_base + phy_pd_addr);
271 writel(reg, dp->reg_base + phy_pd_addr);
273 reg = readl(dp->reg_base + phy_pd_addr);
275 writel(reg, dp->reg_base + phy_pd_addr);
280 reg = readl(dp->reg_base + phy_pd_addr);
282 writel(reg, dp->reg_base + phy_pd_addr);
284 reg = readl(dp->reg_base + phy_pd_addr);
286 writel(reg, dp->reg_base + phy_pd_addr);
291 reg = readl(dp->reg_base + phy_pd_addr);
293 writel(reg, dp->reg_base + phy_pd_addr);
295 reg = readl(dp->reg_base + phy_pd_addr);
297 writel(reg, dp->reg_base + phy_pd_addr);
302 reg = readl(dp->reg_base + phy_pd_addr);
304 writel(reg, dp->reg_base + phy_pd_addr);
306 reg = readl(dp->reg_base + phy_pd_addr);
308 writel(reg, dp->reg_base + phy_pd_addr);
313 reg = readl(dp->reg_base + phy_pd_addr);
315 writel(reg, dp->reg_base + phy_pd_addr);
317 reg = readl(dp->reg_base + phy_pd_addr);
319 writel(reg, dp->reg_base + phy_pd_addr);
324 reg = DP_PHY_PD | AUX_PD | CH3_PD | CH2_PD |
326 writel(reg, dp->reg_base + phy_pd_addr);
328 writel(0x00, dp->reg_base + phy_pd_addr);
336 void analogix_dp_init_analog_func(struct analogix_dp_device *dp)
339 int timeout_loop = 0;
341 analogix_dp_set_analog_power_down(dp, POWER_ALL, 0);
344 writel(reg, dp->reg_base + ANALOGIX_DP_COMMON_INT_STA_1);
346 reg = readl(dp->reg_base + ANALOGIX_DP_DEBUG_CTL);
347 reg &= ~(F_PLL_LOCK | PLL_LOCK_CTRL);
348 writel(reg, dp->reg_base + ANALOGIX_DP_DEBUG_CTL);
351 if (analogix_dp_get_pll_lock_status(dp) == PLL_UNLOCKED) {
352 analogix_dp_set_pll_power_down(dp, 0);
354 while (analogix_dp_get_pll_lock_status(dp) == PLL_UNLOCKED) {
356 if (DP_TIMEOUT_LOOP_COUNT < timeout_loop) {
357 dev_err(dp->dev, "failed to get pll lock status\n");
360 usleep_range(10, 20);
364 /* Enable Serdes FIFO function and Link symbol clock domain module */
365 reg = readl(dp->reg_base + ANALOGIX_DP_FUNC_EN_2);
366 reg &= ~(SERDES_FIFO_FUNC_EN_N | LS_CLK_DOMAIN_FUNC_EN_N
368 writel(reg, dp->reg_base + ANALOGIX_DP_FUNC_EN_2);
371 void analogix_dp_clear_hotplug_interrupts(struct analogix_dp_device *dp)
375 if (gpio_is_valid(dp->hpd_gpio))
378 reg = HOTPLUG_CHG | HPD_LOST | PLUG;
379 writel(reg, dp->reg_base + ANALOGIX_DP_COMMON_INT_STA_4);
382 writel(reg, dp->reg_base + ANALOGIX_DP_INT_STA);
385 void analogix_dp_init_hpd(struct analogix_dp_device *dp)
389 if (gpio_is_valid(dp->hpd_gpio))
392 analogix_dp_clear_hotplug_interrupts(dp);
394 reg = readl(dp->reg_base + ANALOGIX_DP_SYS_CTL_3);
395 reg &= ~(F_HPD | HPD_CTRL);
396 writel(reg, dp->reg_base + ANALOGIX_DP_SYS_CTL_3);
399 void analogix_dp_force_hpd(struct analogix_dp_device *dp)
403 reg = readl(dp->reg_base + ANALOGIX_DP_SYS_CTL_3);
404 reg = (F_HPD | HPD_CTRL);
405 writel(reg, dp->reg_base + ANALOGIX_DP_SYS_CTL_3);
408 enum dp_irq_type analogix_dp_get_irq_type(struct analogix_dp_device *dp)
412 if (gpio_is_valid(dp->hpd_gpio)) {
413 reg = gpio_get_value(dp->hpd_gpio);
415 return DP_IRQ_TYPE_HP_CABLE_IN;
417 return DP_IRQ_TYPE_HP_CABLE_OUT;
419 /* Parse hotplug interrupt status register */
420 reg = readl(dp->reg_base + ANALOGIX_DP_COMMON_INT_STA_4);
423 return DP_IRQ_TYPE_HP_CABLE_IN;
426 return DP_IRQ_TYPE_HP_CABLE_OUT;
428 if (reg & HOTPLUG_CHG)
429 return DP_IRQ_TYPE_HP_CHANGE;
431 return DP_IRQ_TYPE_UNKNOWN;
435 void analogix_dp_reset_aux(struct analogix_dp_device *dp)
439 /* Disable AUX channel module */
440 reg = readl(dp->reg_base + ANALOGIX_DP_FUNC_EN_2);
441 reg |= AUX_FUNC_EN_N;
442 writel(reg, dp->reg_base + ANALOGIX_DP_FUNC_EN_2);
445 void analogix_dp_init_aux(struct analogix_dp_device *dp)
449 /* Clear inerrupts related to AUX channel */
450 reg = RPLY_RECEIV | AUX_ERR;
451 writel(reg, dp->reg_base + ANALOGIX_DP_INT_STA);
453 analogix_dp_reset_aux(dp);
455 /* Disable AUX transaction H/W retry */
456 if (dp->plat_data && (dp->plat_data->dev_type == ROCKCHIP_DP))
457 reg = AUX_BIT_PERIOD_EXPECTED_DELAY(0) |
458 AUX_HW_RETRY_COUNT_SEL(3) |
459 AUX_HW_RETRY_INTERVAL_600_MICROSECONDS;
461 reg = AUX_BIT_PERIOD_EXPECTED_DELAY(3) |
462 AUX_HW_RETRY_COUNT_SEL(0) |
463 AUX_HW_RETRY_INTERVAL_600_MICROSECONDS;
464 writel(reg, dp->reg_base + ANALOGIX_DP_AUX_HW_RETRY_CTL);
466 /* Receive AUX Channel DEFER commands equal to DEFFER_COUNT*64 */
467 reg = DEFER_CTRL_EN | DEFER_COUNT(1);
468 writel(reg, dp->reg_base + ANALOGIX_DP_AUX_CH_DEFER_CTL);
470 /* Enable AUX channel module */
471 reg = readl(dp->reg_base + ANALOGIX_DP_FUNC_EN_2);
472 reg &= ~AUX_FUNC_EN_N;
473 writel(reg, dp->reg_base + ANALOGIX_DP_FUNC_EN_2);
476 int analogix_dp_get_plug_in_status(struct analogix_dp_device *dp)
480 if (gpio_is_valid(dp->hpd_gpio)) {
481 if (gpio_get_value(dp->hpd_gpio))
484 reg = readl(dp->reg_base + ANALOGIX_DP_SYS_CTL_3);
485 if (reg & HPD_STATUS)
492 void analogix_dp_enable_sw_function(struct analogix_dp_device *dp)
496 reg = readl(dp->reg_base + ANALOGIX_DP_FUNC_EN_1);
497 reg &= ~SW_FUNC_EN_N;
498 writel(reg, dp->reg_base + ANALOGIX_DP_FUNC_EN_1);
501 int analogix_dp_start_aux_transaction(struct analogix_dp_device *dp)
505 int timeout_loop = 0;
507 /* Enable AUX CH operation */
508 reg = readl(dp->reg_base + ANALOGIX_DP_AUX_CH_CTL_2);
510 writel(reg, dp->reg_base + ANALOGIX_DP_AUX_CH_CTL_2);
512 /* Is AUX CH command reply received? */
513 reg = readl(dp->reg_base + ANALOGIX_DP_INT_STA);
514 while (!(reg & RPLY_RECEIV)) {
516 if (DP_TIMEOUT_LOOP_COUNT < timeout_loop) {
517 dev_err(dp->dev, "AUX CH command reply failed!\n");
520 reg = readl(dp->reg_base + ANALOGIX_DP_INT_STA);
521 usleep_range(10, 11);
524 /* Clear interrupt source for AUX CH command reply */
525 writel(RPLY_RECEIV, dp->reg_base + ANALOGIX_DP_INT_STA);
527 /* Clear interrupt source for AUX CH access error */
528 reg = readl(dp->reg_base + ANALOGIX_DP_INT_STA);
530 writel(AUX_ERR, dp->reg_base + ANALOGIX_DP_INT_STA);
534 /* Check AUX CH error access status */
535 reg = readl(dp->reg_base + ANALOGIX_DP_AUX_CH_STA);
536 if ((reg & AUX_STATUS_MASK) != 0) {
537 dev_err(dp->dev, "AUX CH error happens: %d\n\n",
538 reg & AUX_STATUS_MASK);
545 int analogix_dp_write_byte_to_dpcd(struct analogix_dp_device *dp,
546 unsigned int reg_addr,
553 for (i = 0; i < 3; i++) {
554 /* Clear AUX CH data buffer */
556 writel(reg, dp->reg_base + ANALOGIX_DP_BUFFER_DATA_CTL);
558 /* Select DPCD device address */
559 reg = AUX_ADDR_7_0(reg_addr);
560 writel(reg, dp->reg_base + ANALOGIX_DP_AUX_ADDR_7_0);
561 reg = AUX_ADDR_15_8(reg_addr);
562 writel(reg, dp->reg_base + ANALOGIX_DP_AUX_ADDR_15_8);
563 reg = AUX_ADDR_19_16(reg_addr);
564 writel(reg, dp->reg_base + ANALOGIX_DP_AUX_ADDR_19_16);
566 /* Write data buffer */
567 reg = (unsigned int)data;
568 writel(reg, dp->reg_base + ANALOGIX_DP_BUF_DATA_0);
571 * Set DisplayPort transaction and write 1 byte
572 * If bit 3 is 1, DisplayPort transaction.
573 * If Bit 3 is 0, I2C transaction.
575 reg = AUX_TX_COMM_DP_TRANSACTION | AUX_TX_COMM_WRITE;
576 writel(reg, dp->reg_base + ANALOGIX_DP_AUX_CH_CTL_1);
578 /* Start AUX transaction */
579 retval = analogix_dp_start_aux_transaction(dp);
583 dev_dbg(dp->dev, "%s: Aux Transaction fail!\n", __func__);
589 int analogix_dp_read_byte_from_dpcd(struct analogix_dp_device *dp,
590 unsigned int reg_addr,
597 for (i = 0; i < 3; i++) {
598 /* Clear AUX CH data buffer */
600 writel(reg, dp->reg_base + ANALOGIX_DP_BUFFER_DATA_CTL);
602 /* Select DPCD device address */
603 reg = AUX_ADDR_7_0(reg_addr);
604 writel(reg, dp->reg_base + ANALOGIX_DP_AUX_ADDR_7_0);
605 reg = AUX_ADDR_15_8(reg_addr);
606 writel(reg, dp->reg_base + ANALOGIX_DP_AUX_ADDR_15_8);
607 reg = AUX_ADDR_19_16(reg_addr);
608 writel(reg, dp->reg_base + ANALOGIX_DP_AUX_ADDR_19_16);
611 * Set DisplayPort transaction and read 1 byte
612 * If bit 3 is 1, DisplayPort transaction.
613 * If Bit 3 is 0, I2C transaction.
615 reg = AUX_TX_COMM_DP_TRANSACTION | AUX_TX_COMM_READ;
616 writel(reg, dp->reg_base + ANALOGIX_DP_AUX_CH_CTL_1);
618 /* Start AUX transaction */
619 retval = analogix_dp_start_aux_transaction(dp);
623 dev_dbg(dp->dev, "%s: Aux Transaction fail!\n", __func__);
626 /* Read data buffer */
627 reg = readl(dp->reg_base + ANALOGIX_DP_BUF_DATA_0);
628 *data = (unsigned char)(reg & 0xff);
633 int analogix_dp_write_bytes_to_dpcd(struct analogix_dp_device *dp,
634 unsigned int reg_addr,
636 unsigned char data[])
639 unsigned int start_offset;
640 unsigned int cur_data_count;
641 unsigned int cur_data_idx;
645 /* Clear AUX CH data buffer */
647 writel(reg, dp->reg_base + ANALOGIX_DP_BUFFER_DATA_CTL);
650 while (start_offset < count) {
651 /* Buffer size of AUX CH is 16 * 4bytes */
652 if ((count - start_offset) > 16)
655 cur_data_count = count - start_offset;
657 for (i = 0; i < 3; i++) {
658 /* Select DPCD device address */
659 reg = AUX_ADDR_7_0(reg_addr + start_offset);
660 writel(reg, dp->reg_base + ANALOGIX_DP_AUX_ADDR_7_0);
661 reg = AUX_ADDR_15_8(reg_addr + start_offset);
662 writel(reg, dp->reg_base + ANALOGIX_DP_AUX_ADDR_15_8);
663 reg = AUX_ADDR_19_16(reg_addr + start_offset);
664 writel(reg, dp->reg_base + ANALOGIX_DP_AUX_ADDR_19_16);
666 for (cur_data_idx = 0; cur_data_idx < cur_data_count;
668 reg = data[start_offset + cur_data_idx];
669 writel(reg, dp->reg_base +
670 ANALOGIX_DP_BUF_DATA_0 +
675 * Set DisplayPort transaction and write
676 * If bit 3 is 1, DisplayPort transaction.
677 * If Bit 3 is 0, I2C transaction.
679 reg = AUX_LENGTH(cur_data_count) |
680 AUX_TX_COMM_DP_TRANSACTION | AUX_TX_COMM_WRITE;
681 writel(reg, dp->reg_base + ANALOGIX_DP_AUX_CH_CTL_1);
683 /* Start AUX transaction */
684 retval = analogix_dp_start_aux_transaction(dp);
688 dev_dbg(dp->dev, "%s: Aux Transaction fail!\n",
692 start_offset += cur_data_count;
698 int analogix_dp_read_bytes_from_dpcd(struct analogix_dp_device *dp,
699 unsigned int reg_addr,
701 unsigned char data[])
704 unsigned int start_offset;
705 unsigned int cur_data_count;
706 unsigned int cur_data_idx;
710 /* Clear AUX CH data buffer */
712 writel(reg, dp->reg_base + ANALOGIX_DP_BUFFER_DATA_CTL);
715 while (start_offset < count) {
716 /* Buffer size of AUX CH is 16 * 4bytes */
717 if ((count - start_offset) > 16)
720 cur_data_count = count - start_offset;
722 /* AUX CH Request Transaction process */
723 for (i = 0; i < 3; i++) {
724 /* Select DPCD device address */
725 reg = AUX_ADDR_7_0(reg_addr + start_offset);
726 writel(reg, dp->reg_base + ANALOGIX_DP_AUX_ADDR_7_0);
727 reg = AUX_ADDR_15_8(reg_addr + start_offset);
728 writel(reg, dp->reg_base + ANALOGIX_DP_AUX_ADDR_15_8);
729 reg = AUX_ADDR_19_16(reg_addr + start_offset);
730 writel(reg, dp->reg_base + ANALOGIX_DP_AUX_ADDR_19_16);
733 * Set DisplayPort transaction and read
734 * If bit 3 is 1, DisplayPort transaction.
735 * If Bit 3 is 0, I2C transaction.
737 reg = AUX_LENGTH(cur_data_count) |
738 AUX_TX_COMM_DP_TRANSACTION | AUX_TX_COMM_READ;
739 writel(reg, dp->reg_base + ANALOGIX_DP_AUX_CH_CTL_1);
741 /* Start AUX transaction */
742 retval = analogix_dp_start_aux_transaction(dp);
746 dev_dbg(dp->dev, "%s: Aux Transaction fail!\n",
750 for (cur_data_idx = 0; cur_data_idx < cur_data_count;
752 reg = readl(dp->reg_base + ANALOGIX_DP_BUF_DATA_0
754 data[start_offset + cur_data_idx] =
758 start_offset += cur_data_count;
764 int analogix_dp_select_i2c_device(struct analogix_dp_device *dp,
765 unsigned int device_addr,
766 unsigned int reg_addr)
771 /* Set EDID device address */
773 writel(reg, dp->reg_base + ANALOGIX_DP_AUX_ADDR_7_0);
774 writel(0x0, dp->reg_base + ANALOGIX_DP_AUX_ADDR_15_8);
775 writel(0x0, dp->reg_base + ANALOGIX_DP_AUX_ADDR_19_16);
777 /* Set offset from base address of EDID device */
778 writel(reg_addr, dp->reg_base + ANALOGIX_DP_BUF_DATA_0);
781 * Set I2C transaction and write address
782 * If bit 3 is 1, DisplayPort transaction.
783 * If Bit 3 is 0, I2C transaction.
785 reg = AUX_TX_COMM_I2C_TRANSACTION | AUX_TX_COMM_MOT |
787 writel(reg, dp->reg_base + ANALOGIX_DP_AUX_CH_CTL_1);
789 /* Start AUX transaction */
790 retval = analogix_dp_start_aux_transaction(dp);
792 dev_dbg(dp->dev, "%s: Aux Transaction fail!\n", __func__);
797 int analogix_dp_read_byte_from_i2c(struct analogix_dp_device *dp,
798 unsigned int device_addr,
799 unsigned int reg_addr,
806 for (i = 0; i < 3; i++) {
807 /* Clear AUX CH data buffer */
809 writel(reg, dp->reg_base + ANALOGIX_DP_BUFFER_DATA_CTL);
811 /* Select EDID device */
812 retval = analogix_dp_select_i2c_device(dp, device_addr,
818 * Set I2C transaction and read data
819 * If bit 3 is 1, DisplayPort transaction.
820 * If Bit 3 is 0, I2C transaction.
822 reg = AUX_TX_COMM_I2C_TRANSACTION |
824 writel(reg, dp->reg_base + ANALOGIX_DP_AUX_CH_CTL_1);
826 /* Start AUX transaction */
827 retval = analogix_dp_start_aux_transaction(dp);
831 dev_dbg(dp->dev, "%s: Aux Transaction fail!\n", __func__);
836 *data = readl(dp->reg_base + ANALOGIX_DP_BUF_DATA_0);
841 int analogix_dp_read_bytes_from_i2c(struct analogix_dp_device *dp,
842 unsigned int device_addr,
843 unsigned int reg_addr,
845 unsigned char edid[])
849 unsigned int cur_data_idx;
850 unsigned int defer = 0;
853 for (i = 0; i < count; i += 16) {
854 for (j = 0; j < 3; j++) {
855 /* Clear AUX CH data buffer */
857 writel(reg, dp->reg_base + ANALOGIX_DP_BUFFER_DATA_CTL);
859 /* Set normal AUX CH command */
860 reg = readl(dp->reg_base + ANALOGIX_DP_AUX_CH_CTL_2);
862 writel(reg, dp->reg_base + ANALOGIX_DP_AUX_CH_CTL_2);
865 * If Rx sends defer, Tx sends only reads
866 * request without sending address
869 retval = analogix_dp_select_i2c_device(dp,
870 device_addr, reg_addr + i);
876 * Set I2C transaction and write data
877 * If bit 3 is 1, DisplayPort transaction.
878 * If Bit 3 is 0, I2C transaction.
880 reg = AUX_LENGTH(16) |
881 AUX_TX_COMM_I2C_TRANSACTION |
883 writel(reg, dp->reg_base +
884 ANALOGIX_DP_AUX_CH_CTL_1);
886 /* Start AUX transaction */
887 retval = analogix_dp_start_aux_transaction(dp);
891 dev_dbg(dp->dev, "%s: Aux Transaction fail!\n",
894 /* Check if Rx sends defer */
895 reg = readl(dp->reg_base + ANALOGIX_DP_AUX_RX_COMM);
896 if (reg == AUX_RX_COMM_AUX_DEFER ||
897 reg == AUX_RX_COMM_I2C_DEFER) {
898 dev_err(dp->dev, "Defer: %d\n\n", reg);
903 for (cur_data_idx = 0; cur_data_idx < 16; cur_data_idx++) {
904 reg = readl(dp->reg_base + ANALOGIX_DP_BUF_DATA_0
906 edid[i + cur_data_idx] = (unsigned char)reg;
913 void analogix_dp_set_link_bandwidth(struct analogix_dp_device *dp, u32 bwtype)
918 if ((bwtype == DP_LINK_BW_2_7) || (bwtype == DP_LINK_BW_1_62))
919 writel(reg, dp->reg_base + ANALOGIX_DP_LINK_BW_SET);
922 void analogix_dp_get_link_bandwidth(struct analogix_dp_device *dp, u32 *bwtype)
926 reg = readl(dp->reg_base + ANALOGIX_DP_LINK_BW_SET);
930 void analogix_dp_set_lane_count(struct analogix_dp_device *dp, u32 count)
935 writel(reg, dp->reg_base + ANALOGIX_DP_LANE_COUNT_SET);
938 void analogix_dp_get_lane_count(struct analogix_dp_device *dp, u32 *count)
942 reg = readl(dp->reg_base + ANALOGIX_DP_LANE_COUNT_SET);
946 void analogix_dp_enable_enhanced_mode(struct analogix_dp_device *dp,
952 reg = readl(dp->reg_base + ANALOGIX_DP_SYS_CTL_4);
954 writel(reg, dp->reg_base + ANALOGIX_DP_SYS_CTL_4);
956 reg = readl(dp->reg_base + ANALOGIX_DP_SYS_CTL_4);
958 writel(reg, dp->reg_base + ANALOGIX_DP_SYS_CTL_4);
962 void analogix_dp_set_training_pattern(struct analogix_dp_device *dp,
963 enum pattern_set pattern)
969 reg = SCRAMBLING_ENABLE | LINK_QUAL_PATTERN_SET_PRBS7;
970 writel(reg, dp->reg_base + ANALOGIX_DP_TRAINING_PTN_SET);
973 reg = SCRAMBLING_ENABLE | LINK_QUAL_PATTERN_SET_D10_2;
974 writel(reg, dp->reg_base + ANALOGIX_DP_TRAINING_PTN_SET);
977 reg = SCRAMBLING_DISABLE | SW_TRAINING_PATTERN_SET_PTN1;
978 writel(reg, dp->reg_base + ANALOGIX_DP_TRAINING_PTN_SET);
981 reg = SCRAMBLING_DISABLE | SW_TRAINING_PATTERN_SET_PTN2;
982 writel(reg, dp->reg_base + ANALOGIX_DP_TRAINING_PTN_SET);
985 reg = SCRAMBLING_ENABLE |
986 LINK_QUAL_PATTERN_SET_DISABLE |
987 SW_TRAINING_PATTERN_SET_NORMAL;
988 writel(reg, dp->reg_base + ANALOGIX_DP_TRAINING_PTN_SET);
995 void analogix_dp_set_lane0_pre_emphasis(struct analogix_dp_device *dp,
1000 reg = readl(dp->reg_base + ANALOGIX_DP_LN0_LINK_TRAINING_CTL);
1001 reg &= ~PRE_EMPHASIS_SET_MASK;
1002 reg |= level << PRE_EMPHASIS_SET_SHIFT;
1003 writel(reg, dp->reg_base + ANALOGIX_DP_LN0_LINK_TRAINING_CTL);
1006 void analogix_dp_set_lane1_pre_emphasis(struct analogix_dp_device *dp,
1011 reg = readl(dp->reg_base + ANALOGIX_DP_LN1_LINK_TRAINING_CTL);
1012 reg &= ~PRE_EMPHASIS_SET_MASK;
1013 reg |= level << PRE_EMPHASIS_SET_SHIFT;
1014 writel(reg, dp->reg_base + ANALOGIX_DP_LN1_LINK_TRAINING_CTL);
1017 void analogix_dp_set_lane2_pre_emphasis(struct analogix_dp_device *dp,
1022 reg = readl(dp->reg_base + ANALOGIX_DP_LN2_LINK_TRAINING_CTL);
1023 reg &= ~PRE_EMPHASIS_SET_MASK;
1024 reg |= level << PRE_EMPHASIS_SET_SHIFT;
1025 writel(reg, dp->reg_base + ANALOGIX_DP_LN2_LINK_TRAINING_CTL);
1028 void analogix_dp_set_lane3_pre_emphasis(struct analogix_dp_device *dp,
1033 reg = readl(dp->reg_base + ANALOGIX_DP_LN3_LINK_TRAINING_CTL);
1034 reg &= ~PRE_EMPHASIS_SET_MASK;
1035 reg |= level << PRE_EMPHASIS_SET_SHIFT;
1036 writel(reg, dp->reg_base + ANALOGIX_DP_LN3_LINK_TRAINING_CTL);
1039 void analogix_dp_set_lane0_link_training(struct analogix_dp_device *dp,
1044 reg = training_lane;
1045 writel(reg, dp->reg_base + ANALOGIX_DP_LN0_LINK_TRAINING_CTL);
1048 void analogix_dp_set_lane1_link_training(struct analogix_dp_device *dp,
1053 reg = training_lane;
1054 writel(reg, dp->reg_base + ANALOGIX_DP_LN1_LINK_TRAINING_CTL);
1057 void analogix_dp_set_lane2_link_training(struct analogix_dp_device *dp,
1062 reg = training_lane;
1063 writel(reg, dp->reg_base + ANALOGIX_DP_LN2_LINK_TRAINING_CTL);
1066 void analogix_dp_set_lane3_link_training(struct analogix_dp_device *dp,
1071 reg = training_lane;
1072 writel(reg, dp->reg_base + ANALOGIX_DP_LN3_LINK_TRAINING_CTL);
1075 u32 analogix_dp_get_lane0_link_training(struct analogix_dp_device *dp)
1079 reg = readl(dp->reg_base + ANALOGIX_DP_LN0_LINK_TRAINING_CTL);
1083 u32 analogix_dp_get_lane1_link_training(struct analogix_dp_device *dp)
1087 reg = readl(dp->reg_base + ANALOGIX_DP_LN1_LINK_TRAINING_CTL);
1091 u32 analogix_dp_get_lane2_link_training(struct analogix_dp_device *dp)
1095 reg = readl(dp->reg_base + ANALOGIX_DP_LN2_LINK_TRAINING_CTL);
1099 u32 analogix_dp_get_lane3_link_training(struct analogix_dp_device *dp)
1103 reg = readl(dp->reg_base + ANALOGIX_DP_LN3_LINK_TRAINING_CTL);
1107 void analogix_dp_reset_macro(struct analogix_dp_device *dp)
1111 reg = readl(dp->reg_base + ANALOGIX_DP_PHY_TEST);
1113 writel(reg, dp->reg_base + ANALOGIX_DP_PHY_TEST);
1115 /* 10 us is the minimum reset time. */
1116 usleep_range(10, 20);
1119 writel(reg, dp->reg_base + ANALOGIX_DP_PHY_TEST);
1122 void analogix_dp_init_video(struct analogix_dp_device *dp)
1126 reg = VSYNC_DET | VID_FORMAT_CHG | VID_CLK_CHG;
1127 writel(reg, dp->reg_base + ANALOGIX_DP_COMMON_INT_STA_1);
1130 writel(reg, dp->reg_base + ANALOGIX_DP_SYS_CTL_1);
1132 reg = CHA_CRI(4) | CHA_CTRL;
1133 writel(reg, dp->reg_base + ANALOGIX_DP_SYS_CTL_2);
1136 writel(reg, dp->reg_base + ANALOGIX_DP_SYS_CTL_3);
1138 reg = VID_HRES_TH(2) | VID_VRES_TH(0);
1139 writel(reg, dp->reg_base + ANALOGIX_DP_VIDEO_CTL_8);
1142 void analogix_dp_set_video_color_format(struct analogix_dp_device *dp)
1146 /* Configure the input color depth, color space, dynamic range */
1147 reg = (dp->video_info.dynamic_range << IN_D_RANGE_SHIFT) |
1148 (dp->video_info.color_depth << IN_BPC_SHIFT) |
1149 (dp->video_info.color_space << IN_COLOR_F_SHIFT);
1150 writel(reg, dp->reg_base + ANALOGIX_DP_VIDEO_CTL_2);
1152 /* Set Input Color YCbCr Coefficients to ITU601 or ITU709 */
1153 reg = readl(dp->reg_base + ANALOGIX_DP_VIDEO_CTL_3);
1154 reg &= ~IN_YC_COEFFI_MASK;
1155 if (dp->video_info.ycbcr_coeff)
1156 reg |= IN_YC_COEFFI_ITU709;
1158 reg |= IN_YC_COEFFI_ITU601;
1159 writel(reg, dp->reg_base + ANALOGIX_DP_VIDEO_CTL_3);
1162 int analogix_dp_is_slave_video_stream_clock_on(struct analogix_dp_device *dp)
1166 reg = readl(dp->reg_base + ANALOGIX_DP_SYS_CTL_1);
1167 writel(reg, dp->reg_base + ANALOGIX_DP_SYS_CTL_1);
1169 reg = readl(dp->reg_base + ANALOGIX_DP_SYS_CTL_1);
1171 if (!(reg & DET_STA)) {
1172 dev_dbg(dp->dev, "Input stream clock not detected.\n");
1176 reg = readl(dp->reg_base + ANALOGIX_DP_SYS_CTL_2);
1177 writel(reg, dp->reg_base + ANALOGIX_DP_SYS_CTL_2);
1179 reg = readl(dp->reg_base + ANALOGIX_DP_SYS_CTL_2);
1180 dev_dbg(dp->dev, "wait SYS_CTL_2.\n");
1182 if (reg & CHA_STA) {
1183 dev_dbg(dp->dev, "Input stream clk is changing\n");
1190 void analogix_dp_set_video_cr_mn(struct analogix_dp_device *dp,
1191 enum clock_recovery_m_value_type type,
1192 u32 m_value, u32 n_value)
1196 if (type == REGISTER_M) {
1197 reg = readl(dp->reg_base + ANALOGIX_DP_SYS_CTL_4);
1199 writel(reg, dp->reg_base + ANALOGIX_DP_SYS_CTL_4);
1200 reg = m_value & 0xff;
1201 writel(reg, dp->reg_base + ANALOGIX_DP_M_VID_0);
1202 reg = (m_value >> 8) & 0xff;
1203 writel(reg, dp->reg_base + ANALOGIX_DP_M_VID_1);
1204 reg = (m_value >> 16) & 0xff;
1205 writel(reg, dp->reg_base + ANALOGIX_DP_M_VID_2);
1207 reg = n_value & 0xff;
1208 writel(reg, dp->reg_base + ANALOGIX_DP_N_VID_0);
1209 reg = (n_value >> 8) & 0xff;
1210 writel(reg, dp->reg_base + ANALOGIX_DP_N_VID_1);
1211 reg = (n_value >> 16) & 0xff;
1212 writel(reg, dp->reg_base + ANALOGIX_DP_N_VID_2);
1214 reg = readl(dp->reg_base + ANALOGIX_DP_SYS_CTL_4);
1216 writel(reg, dp->reg_base + ANALOGIX_DP_SYS_CTL_4);
1218 writel(0x00, dp->reg_base + ANALOGIX_DP_N_VID_0);
1219 writel(0x80, dp->reg_base + ANALOGIX_DP_N_VID_1);
1220 writel(0x00, dp->reg_base + ANALOGIX_DP_N_VID_2);
1224 void analogix_dp_set_video_timing_mode(struct analogix_dp_device *dp, u32 type)
1228 if (type == VIDEO_TIMING_FROM_CAPTURE) {
1229 reg = readl(dp->reg_base + ANALOGIX_DP_VIDEO_CTL_10);
1231 writel(reg, dp->reg_base + ANALOGIX_DP_VIDEO_CTL_10);
1233 reg = readl(dp->reg_base + ANALOGIX_DP_VIDEO_CTL_10);
1235 writel(reg, dp->reg_base + ANALOGIX_DP_VIDEO_CTL_10);
1239 void analogix_dp_enable_video_master(struct analogix_dp_device *dp, bool enable)
1244 reg = readl(dp->reg_base + ANALOGIX_DP_SOC_GENERAL_CTL);
1245 reg &= ~VIDEO_MODE_MASK;
1246 reg |= VIDEO_MASTER_MODE_EN | VIDEO_MODE_MASTER_MODE;
1247 writel(reg, dp->reg_base + ANALOGIX_DP_SOC_GENERAL_CTL);
1249 reg = readl(dp->reg_base + ANALOGIX_DP_SOC_GENERAL_CTL);
1250 reg &= ~VIDEO_MODE_MASK;
1251 reg |= VIDEO_MODE_SLAVE_MODE;
1252 writel(reg, dp->reg_base + ANALOGIX_DP_SOC_GENERAL_CTL);
1256 void analogix_dp_start_video(struct analogix_dp_device *dp)
1260 reg = readl(dp->reg_base + ANALOGIX_DP_VIDEO_CTL_1);
1262 writel(reg, dp->reg_base + ANALOGIX_DP_VIDEO_CTL_1);
1265 int analogix_dp_is_video_stream_on(struct analogix_dp_device *dp)
1269 reg = readl(dp->reg_base + ANALOGIX_DP_SYS_CTL_3);
1270 writel(reg, dp->reg_base + ANALOGIX_DP_SYS_CTL_3);
1272 reg = readl(dp->reg_base + ANALOGIX_DP_SYS_CTL_3);
1273 if (!(reg & STRM_VALID)) {
1274 dev_dbg(dp->dev, "Input video stream is not detected.\n");
1281 void analogix_dp_config_video_slave_mode(struct analogix_dp_device *dp)
1285 reg = readl(dp->reg_base + ANALOGIX_DP_FUNC_EN_1);
1286 reg &= ~(MASTER_VID_FUNC_EN_N | SLAVE_VID_FUNC_EN_N);
1287 reg |= MASTER_VID_FUNC_EN_N;
1288 writel(reg, dp->reg_base + ANALOGIX_DP_FUNC_EN_1);
1290 reg = readl(dp->reg_base + ANALOGIX_DP_VIDEO_CTL_10);
1291 reg &= ~INTERACE_SCAN_CFG;
1292 reg |= (dp->video_info.interlaced << 2);
1293 writel(reg, dp->reg_base + ANALOGIX_DP_VIDEO_CTL_10);
1295 reg = readl(dp->reg_base + ANALOGIX_DP_VIDEO_CTL_10);
1296 reg &= ~VSYNC_POLARITY_CFG;
1297 reg |= (dp->video_info.v_sync_polarity << 1);
1298 writel(reg, dp->reg_base + ANALOGIX_DP_VIDEO_CTL_10);
1300 reg = readl(dp->reg_base + ANALOGIX_DP_VIDEO_CTL_10);
1301 reg &= ~HSYNC_POLARITY_CFG;
1302 reg |= (dp->video_info.h_sync_polarity << 0);
1303 writel(reg, dp->reg_base + ANALOGIX_DP_VIDEO_CTL_10);
1305 reg = AUDIO_MODE_SPDIF_MODE | VIDEO_MODE_SLAVE_MODE;
1306 writel(reg, dp->reg_base + ANALOGIX_DP_SOC_GENERAL_CTL);
1309 void analogix_dp_enable_scrambling(struct analogix_dp_device *dp)
1313 reg = readl(dp->reg_base + ANALOGIX_DP_TRAINING_PTN_SET);
1314 reg &= ~SCRAMBLING_DISABLE;
1315 writel(reg, dp->reg_base + ANALOGIX_DP_TRAINING_PTN_SET);
1318 void analogix_dp_disable_scrambling(struct analogix_dp_device *dp)
1322 reg = readl(dp->reg_base + ANALOGIX_DP_TRAINING_PTN_SET);
1323 reg |= SCRAMBLING_DISABLE;
1324 writel(reg, dp->reg_base + ANALOGIX_DP_TRAINING_PTN_SET);