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 == RK3288_DP)) {
78 writel(REF_CLK_24M, dp->reg_base + ANALOGIX_DP_PLL_REG_1);
79 writel(0x95, dp->reg_base + ANALOGIX_DP_PLL_REG_2);
80 writel(0x40, dp->reg_base + ANALOGIX_DP_PLL_REG_3);
81 writel(0x58, dp->reg_base + ANALOGIX_DP_PLL_REG_4);
82 writel(0x22, dp->reg_base + ANALOGIX_DP_PLL_REG_5);
85 reg = DRIVE_DVDD_BIT_1_0625V | VCO_BIT_600_MICRO;
86 writel(reg, dp->reg_base + ANALOGIX_DP_ANALOG_CTL_3);
88 reg = PD_RING_OSC | AUX_TERMINAL_CTRL_50_OHM |
89 TX_CUR1_2X | TX_CUR_16_MA;
90 writel(reg, dp->reg_base + ANALOGIX_DP_PLL_FILTER_CTL_1);
92 reg = CH3_AMP_400_MV | CH2_AMP_400_MV |
93 CH1_AMP_400_MV | CH0_AMP_400_MV;
94 writel(reg, dp->reg_base + ANALOGIX_DP_TX_AMP_TUNING_CTL);
97 void analogix_dp_init_interrupt(struct analogix_dp_device *dp)
99 /* Set interrupt pin assertion polarity as high */
100 writel(INT_POL1 | INT_POL0, dp->reg_base + ANALOGIX_DP_INT_CTL);
102 /* Clear pending regisers */
103 writel(0xff, dp->reg_base + ANALOGIX_DP_COMMON_INT_STA_1);
104 writel(0x4f, dp->reg_base + ANALOGIX_DP_COMMON_INT_STA_2);
105 writel(0xe0, dp->reg_base + ANALOGIX_DP_COMMON_INT_STA_3);
106 writel(0xe7, dp->reg_base + ANALOGIX_DP_COMMON_INT_STA_4);
107 writel(0x63, dp->reg_base + ANALOGIX_DP_INT_STA);
109 /* 0:mask,1: unmask */
110 writel(0x00, dp->reg_base + ANALOGIX_DP_COMMON_INT_MASK_1);
111 writel(0x00, dp->reg_base + ANALOGIX_DP_COMMON_INT_MASK_2);
112 writel(0x00, dp->reg_base + ANALOGIX_DP_COMMON_INT_MASK_3);
113 writel(0x00, dp->reg_base + ANALOGIX_DP_COMMON_INT_MASK_4);
114 writel(0x00, dp->reg_base + ANALOGIX_DP_INT_STA_MASK);
117 void analogix_dp_reset(struct analogix_dp_device *dp)
121 analogix_dp_stop_video(dp);
122 analogix_dp_enable_video_mute(dp, 0);
124 reg = MASTER_VID_FUNC_EN_N | SLAVE_VID_FUNC_EN_N |
125 AUD_FIFO_FUNC_EN_N | AUD_FUNC_EN_N |
126 HDCP_FUNC_EN_N | SW_FUNC_EN_N;
127 writel(reg, dp->reg_base + ANALOGIX_DP_FUNC_EN_1);
129 reg = SSC_FUNC_EN_N | AUX_FUNC_EN_N |
130 SERDES_FIFO_FUNC_EN_N |
131 LS_CLK_DOMAIN_FUNC_EN_N;
132 writel(reg, dp->reg_base + ANALOGIX_DP_FUNC_EN_2);
134 usleep_range(20, 30);
136 analogix_dp_lane_swap(dp, 0);
138 writel(0x0, dp->reg_base + ANALOGIX_DP_SYS_CTL_1);
139 writel(0x40, dp->reg_base + ANALOGIX_DP_SYS_CTL_2);
140 writel(0x0, dp->reg_base + ANALOGIX_DP_SYS_CTL_3);
141 writel(0x0, dp->reg_base + ANALOGIX_DP_SYS_CTL_4);
143 writel(0x0, dp->reg_base + ANALOGIX_DP_PKT_SEND_CTL);
144 writel(0x0, dp->reg_base + ANALOGIX_DP_HDCP_CTL);
146 writel(0x5e, dp->reg_base + ANALOGIX_DP_HPD_DEGLITCH_L);
147 writel(0x1a, dp->reg_base + ANALOGIX_DP_HPD_DEGLITCH_H);
149 writel(0x10, dp->reg_base + ANALOGIX_DP_LINK_DEBUG_CTL);
151 writel(0x0, dp->reg_base + ANALOGIX_DP_PHY_TEST);
153 writel(0x0, dp->reg_base + ANALOGIX_DP_VIDEO_FIFO_THRD);
154 writel(0x20, dp->reg_base + ANALOGIX_DP_AUDIO_MARGIN);
156 writel(0x4, dp->reg_base + ANALOGIX_DP_M_VID_GEN_FILTER_TH);
157 writel(0x2, dp->reg_base + ANALOGIX_DP_M_AUD_GEN_FILTER_TH);
159 writel(0x00000101, dp->reg_base + ANALOGIX_DP_SOC_GENERAL_CTL);
162 void analogix_dp_swreset(struct analogix_dp_device *dp)
164 writel(RESET_DP_TX, dp->reg_base + ANALOGIX_DP_TX_SW_RESET);
167 void analogix_dp_config_interrupt(struct analogix_dp_device *dp)
171 /* 0: mask, 1: unmask */
172 reg = COMMON_INT_MASK_1;
173 writel(reg, dp->reg_base + ANALOGIX_DP_COMMON_INT_MASK_1);
175 reg = COMMON_INT_MASK_2;
176 writel(reg, dp->reg_base + ANALOGIX_DP_COMMON_INT_MASK_2);
178 reg = COMMON_INT_MASK_3;
179 writel(reg, dp->reg_base + ANALOGIX_DP_COMMON_INT_MASK_3);
181 reg = COMMON_INT_MASK_4;
182 writel(reg, dp->reg_base + ANALOGIX_DP_COMMON_INT_MASK_4);
185 writel(reg, dp->reg_base + ANALOGIX_DP_INT_STA_MASK);
188 void analogix_dp_mute_hpd_interrupt(struct analogix_dp_device *dp)
192 /* 0: mask, 1: unmask */
193 reg = readl(dp->reg_base + ANALOGIX_DP_COMMON_INT_MASK_4);
194 reg &= ~COMMON_INT_MASK_4;
195 writel(reg, dp->reg_base + ANALOGIX_DP_COMMON_INT_MASK_4);
197 reg = readl(dp->reg_base + ANALOGIX_DP_INT_STA_MASK);
198 reg &= ~INT_STA_MASK;
199 writel(reg, dp->reg_base + ANALOGIX_DP_INT_STA_MASK);
202 void analogix_dp_unmute_hpd_interrupt(struct analogix_dp_device *dp)
206 /* 0: mask, 1: unmask */
207 reg = COMMON_INT_MASK_4;
208 writel(reg, dp->reg_base + ANALOGIX_DP_COMMON_INT_MASK_4);
211 writel(reg, dp->reg_base + ANALOGIX_DP_INT_STA_MASK);
214 enum pll_status analogix_dp_get_pll_lock_status(struct analogix_dp_device *dp)
218 reg = readl(dp->reg_base + ANALOGIX_DP_DEBUG_CTL);
225 void analogix_dp_set_pll_power_down(struct analogix_dp_device *dp, bool enable)
230 reg = readl(dp->reg_base + ANALOGIX_DP_PLL_CTL);
232 writel(reg, dp->reg_base + ANALOGIX_DP_PLL_CTL);
234 reg = readl(dp->reg_base + ANALOGIX_DP_PLL_CTL);
236 writel(reg, dp->reg_base + ANALOGIX_DP_PLL_CTL);
240 void analogix_dp_set_analog_power_down(struct analogix_dp_device *dp,
241 enum analog_power_block block,
245 u32 phy_pd_addr = ANALOGIX_DP_PHY_PD;
247 if (dp->plat_data && (dp->plat_data->dev_type == RK3288_DP))
248 phy_pd_addr = ANALOGIX_DP_PD;
253 reg = readl(dp->reg_base + phy_pd_addr);
255 writel(reg, dp->reg_base + phy_pd_addr);
257 reg = readl(dp->reg_base + phy_pd_addr);
259 writel(reg, dp->reg_base + phy_pd_addr);
264 reg = readl(dp->reg_base + phy_pd_addr);
266 writel(reg, dp->reg_base + phy_pd_addr);
268 reg = readl(dp->reg_base + phy_pd_addr);
270 writel(reg, dp->reg_base + phy_pd_addr);
275 reg = readl(dp->reg_base + phy_pd_addr);
277 writel(reg, dp->reg_base + phy_pd_addr);
279 reg = readl(dp->reg_base + phy_pd_addr);
281 writel(reg, dp->reg_base + phy_pd_addr);
286 reg = readl(dp->reg_base + phy_pd_addr);
288 writel(reg, dp->reg_base + phy_pd_addr);
290 reg = readl(dp->reg_base + phy_pd_addr);
292 writel(reg, dp->reg_base + phy_pd_addr);
297 reg = readl(dp->reg_base + phy_pd_addr);
299 writel(reg, dp->reg_base + phy_pd_addr);
301 reg = readl(dp->reg_base + phy_pd_addr);
303 writel(reg, dp->reg_base + phy_pd_addr);
308 reg = readl(dp->reg_base + phy_pd_addr);
310 writel(reg, dp->reg_base + phy_pd_addr);
312 reg = readl(dp->reg_base + phy_pd_addr);
314 writel(reg, dp->reg_base + phy_pd_addr);
319 reg = DP_PHY_PD | AUX_PD | CH3_PD | CH2_PD |
321 writel(reg, dp->reg_base + phy_pd_addr);
323 writel(0x00, dp->reg_base + phy_pd_addr);
331 void analogix_dp_init_analog_func(struct analogix_dp_device *dp)
334 int timeout_loop = 0;
336 analogix_dp_set_analog_power_down(dp, POWER_ALL, 0);
339 writel(reg, dp->reg_base + ANALOGIX_DP_COMMON_INT_STA_1);
341 reg = readl(dp->reg_base + ANALOGIX_DP_DEBUG_CTL);
342 reg &= ~(F_PLL_LOCK | PLL_LOCK_CTRL);
343 writel(reg, dp->reg_base + ANALOGIX_DP_DEBUG_CTL);
346 if (analogix_dp_get_pll_lock_status(dp) == PLL_UNLOCKED) {
347 analogix_dp_set_pll_power_down(dp, 0);
349 while (analogix_dp_get_pll_lock_status(dp) == PLL_UNLOCKED) {
351 if (DP_TIMEOUT_LOOP_COUNT < timeout_loop) {
352 dev_err(dp->dev, "failed to get pll lock status\n");
355 usleep_range(10, 20);
359 /* Enable Serdes FIFO function and Link symbol clock domain module */
360 reg = readl(dp->reg_base + ANALOGIX_DP_FUNC_EN_2);
361 reg &= ~(SERDES_FIFO_FUNC_EN_N | LS_CLK_DOMAIN_FUNC_EN_N
363 writel(reg, dp->reg_base + ANALOGIX_DP_FUNC_EN_2);
366 void analogix_dp_clear_hotplug_interrupts(struct analogix_dp_device *dp)
370 if (gpio_is_valid(dp->hpd_gpio))
373 reg = HOTPLUG_CHG | HPD_LOST | PLUG;
374 writel(reg, dp->reg_base + ANALOGIX_DP_COMMON_INT_STA_4);
377 writel(reg, dp->reg_base + ANALOGIX_DP_INT_STA);
380 void analogix_dp_init_hpd(struct analogix_dp_device *dp)
384 if (gpio_is_valid(dp->hpd_gpio))
387 analogix_dp_clear_hotplug_interrupts(dp);
389 reg = readl(dp->reg_base + ANALOGIX_DP_SYS_CTL_3);
390 reg &= ~(F_HPD | HPD_CTRL);
391 writel(reg, dp->reg_base + ANALOGIX_DP_SYS_CTL_3);
394 void analogix_dp_force_hpd(struct analogix_dp_device *dp)
398 reg = readl(dp->reg_base + ANALOGIX_DP_SYS_CTL_3);
399 reg = (F_HPD | HPD_CTRL);
400 writel(reg, dp->reg_base + ANALOGIX_DP_SYS_CTL_3);
403 enum dp_irq_type analogix_dp_get_irq_type(struct analogix_dp_device *dp)
407 if (gpio_is_valid(dp->hpd_gpio)) {
408 reg = gpio_get_value(dp->hpd_gpio);
410 return DP_IRQ_TYPE_HP_CABLE_IN;
412 return DP_IRQ_TYPE_HP_CABLE_OUT;
414 /* Parse hotplug interrupt status register */
415 reg = readl(dp->reg_base + ANALOGIX_DP_COMMON_INT_STA_4);
418 return DP_IRQ_TYPE_HP_CABLE_IN;
421 return DP_IRQ_TYPE_HP_CABLE_OUT;
423 if (reg & HOTPLUG_CHG)
424 return DP_IRQ_TYPE_HP_CHANGE;
426 return DP_IRQ_TYPE_UNKNOWN;
430 void analogix_dp_reset_aux(struct analogix_dp_device *dp)
434 /* Disable AUX channel module */
435 reg = readl(dp->reg_base + ANALOGIX_DP_FUNC_EN_2);
436 reg |= AUX_FUNC_EN_N;
437 writel(reg, dp->reg_base + ANALOGIX_DP_FUNC_EN_2);
440 void analogix_dp_init_aux(struct analogix_dp_device *dp)
444 /* Clear inerrupts related to AUX channel */
445 reg = RPLY_RECEIV | AUX_ERR;
446 writel(reg, dp->reg_base + ANALOGIX_DP_INT_STA);
448 analogix_dp_reset_aux(dp);
450 /* Disable AUX transaction H/W retry */
451 if (dp->plat_data && (dp->plat_data->dev_type == RK3288_DP))
452 reg = AUX_BIT_PERIOD_EXPECTED_DELAY(0) |
453 AUX_HW_RETRY_COUNT_SEL(3) |
454 AUX_HW_RETRY_INTERVAL_600_MICROSECONDS;
456 reg = AUX_BIT_PERIOD_EXPECTED_DELAY(3) |
457 AUX_HW_RETRY_COUNT_SEL(0) |
458 AUX_HW_RETRY_INTERVAL_600_MICROSECONDS;
459 writel(reg, dp->reg_base + ANALOGIX_DP_AUX_HW_RETRY_CTL);
461 /* Receive AUX Channel DEFER commands equal to DEFFER_COUNT*64 */
462 reg = DEFER_CTRL_EN | DEFER_COUNT(1);
463 writel(reg, dp->reg_base + ANALOGIX_DP_AUX_CH_DEFER_CTL);
465 /* Enable AUX channel module */
466 reg = readl(dp->reg_base + ANALOGIX_DP_FUNC_EN_2);
467 reg &= ~AUX_FUNC_EN_N;
468 writel(reg, dp->reg_base + ANALOGIX_DP_FUNC_EN_2);
471 int analogix_dp_get_plug_in_status(struct analogix_dp_device *dp)
475 if (gpio_is_valid(dp->hpd_gpio)) {
476 if (gpio_get_value(dp->hpd_gpio))
479 reg = readl(dp->reg_base + ANALOGIX_DP_SYS_CTL_3);
480 if (reg & HPD_STATUS)
487 void analogix_dp_enable_sw_function(struct analogix_dp_device *dp)
491 reg = readl(dp->reg_base + ANALOGIX_DP_FUNC_EN_1);
492 reg &= ~SW_FUNC_EN_N;
493 writel(reg, dp->reg_base + ANALOGIX_DP_FUNC_EN_1);
496 int analogix_dp_start_aux_transaction(struct analogix_dp_device *dp)
500 int timeout_loop = 0;
502 /* Enable AUX CH operation */
503 reg = readl(dp->reg_base + ANALOGIX_DP_AUX_CH_CTL_2);
505 writel(reg, dp->reg_base + ANALOGIX_DP_AUX_CH_CTL_2);
507 /* Is AUX CH command reply received? */
508 reg = readl(dp->reg_base + ANALOGIX_DP_INT_STA);
509 while (!(reg & RPLY_RECEIV)) {
511 if (DP_TIMEOUT_LOOP_COUNT < timeout_loop) {
512 dev_err(dp->dev, "AUX CH command reply failed!\n");
515 reg = readl(dp->reg_base + ANALOGIX_DP_INT_STA);
516 usleep_range(10, 11);
519 /* Clear interrupt source for AUX CH command reply */
520 writel(RPLY_RECEIV, dp->reg_base + ANALOGIX_DP_INT_STA);
522 /* Clear interrupt source for AUX CH access error */
523 reg = readl(dp->reg_base + ANALOGIX_DP_INT_STA);
525 writel(AUX_ERR, dp->reg_base + ANALOGIX_DP_INT_STA);
529 /* Check AUX CH error access status */
530 reg = readl(dp->reg_base + ANALOGIX_DP_AUX_CH_STA);
531 if ((reg & AUX_STATUS_MASK) != 0) {
532 dev_err(dp->dev, "AUX CH error happens: %d\n\n",
533 reg & AUX_STATUS_MASK);
540 int analogix_dp_write_byte_to_dpcd(struct analogix_dp_device *dp,
541 unsigned int reg_addr,
548 for (i = 0; i < 3; i++) {
549 /* Clear AUX CH data buffer */
551 writel(reg, dp->reg_base + ANALOGIX_DP_BUFFER_DATA_CTL);
553 /* Select DPCD device address */
554 reg = AUX_ADDR_7_0(reg_addr);
555 writel(reg, dp->reg_base + ANALOGIX_DP_AUX_ADDR_7_0);
556 reg = AUX_ADDR_15_8(reg_addr);
557 writel(reg, dp->reg_base + ANALOGIX_DP_AUX_ADDR_15_8);
558 reg = AUX_ADDR_19_16(reg_addr);
559 writel(reg, dp->reg_base + ANALOGIX_DP_AUX_ADDR_19_16);
561 /* Write data buffer */
562 reg = (unsigned int)data;
563 writel(reg, dp->reg_base + ANALOGIX_DP_BUF_DATA_0);
566 * Set DisplayPort transaction and write 1 byte
567 * If bit 3 is 1, DisplayPort transaction.
568 * If Bit 3 is 0, I2C transaction.
570 reg = AUX_TX_COMM_DP_TRANSACTION | AUX_TX_COMM_WRITE;
571 writel(reg, dp->reg_base + ANALOGIX_DP_AUX_CH_CTL_1);
573 /* Start AUX transaction */
574 retval = analogix_dp_start_aux_transaction(dp);
578 dev_dbg(dp->dev, "%s: Aux Transaction fail!\n", __func__);
584 int analogix_dp_read_byte_from_dpcd(struct analogix_dp_device *dp,
585 unsigned int reg_addr,
592 for (i = 0; i < 3; i++) {
593 /* Clear AUX CH data buffer */
595 writel(reg, dp->reg_base + ANALOGIX_DP_BUFFER_DATA_CTL);
597 /* Select DPCD device address */
598 reg = AUX_ADDR_7_0(reg_addr);
599 writel(reg, dp->reg_base + ANALOGIX_DP_AUX_ADDR_7_0);
600 reg = AUX_ADDR_15_8(reg_addr);
601 writel(reg, dp->reg_base + ANALOGIX_DP_AUX_ADDR_15_8);
602 reg = AUX_ADDR_19_16(reg_addr);
603 writel(reg, dp->reg_base + ANALOGIX_DP_AUX_ADDR_19_16);
606 * Set DisplayPort transaction and read 1 byte
607 * If bit 3 is 1, DisplayPort transaction.
608 * If Bit 3 is 0, I2C transaction.
610 reg = AUX_TX_COMM_DP_TRANSACTION | AUX_TX_COMM_READ;
611 writel(reg, dp->reg_base + ANALOGIX_DP_AUX_CH_CTL_1);
613 /* Start AUX transaction */
614 retval = analogix_dp_start_aux_transaction(dp);
618 dev_dbg(dp->dev, "%s: Aux Transaction fail!\n", __func__);
621 /* Read data buffer */
622 reg = readl(dp->reg_base + ANALOGIX_DP_BUF_DATA_0);
623 *data = (unsigned char)(reg & 0xff);
628 int analogix_dp_write_bytes_to_dpcd(struct analogix_dp_device *dp,
629 unsigned int reg_addr,
631 unsigned char data[])
634 unsigned int start_offset;
635 unsigned int cur_data_count;
636 unsigned int cur_data_idx;
640 /* Clear AUX CH data buffer */
642 writel(reg, dp->reg_base + ANALOGIX_DP_BUFFER_DATA_CTL);
645 while (start_offset < count) {
646 /* Buffer size of AUX CH is 16 * 4bytes */
647 if ((count - start_offset) > 16)
650 cur_data_count = count - start_offset;
652 for (i = 0; i < 3; i++) {
653 /* Select DPCD device address */
654 reg = AUX_ADDR_7_0(reg_addr + start_offset);
655 writel(reg, dp->reg_base + ANALOGIX_DP_AUX_ADDR_7_0);
656 reg = AUX_ADDR_15_8(reg_addr + start_offset);
657 writel(reg, dp->reg_base + ANALOGIX_DP_AUX_ADDR_15_8);
658 reg = AUX_ADDR_19_16(reg_addr + start_offset);
659 writel(reg, dp->reg_base + ANALOGIX_DP_AUX_ADDR_19_16);
661 for (cur_data_idx = 0; cur_data_idx < cur_data_count;
663 reg = data[start_offset + cur_data_idx];
664 writel(reg, dp->reg_base +
665 ANALOGIX_DP_BUF_DATA_0 +
670 * Set DisplayPort transaction and write
671 * If bit 3 is 1, DisplayPort transaction.
672 * If Bit 3 is 0, I2C transaction.
674 reg = AUX_LENGTH(cur_data_count) |
675 AUX_TX_COMM_DP_TRANSACTION | AUX_TX_COMM_WRITE;
676 writel(reg, dp->reg_base + ANALOGIX_DP_AUX_CH_CTL_1);
678 /* Start AUX transaction */
679 retval = analogix_dp_start_aux_transaction(dp);
683 dev_dbg(dp->dev, "%s: Aux Transaction fail!\n",
687 start_offset += cur_data_count;
693 int analogix_dp_read_bytes_from_dpcd(struct analogix_dp_device *dp,
694 unsigned int reg_addr,
696 unsigned char data[])
699 unsigned int start_offset;
700 unsigned int cur_data_count;
701 unsigned int cur_data_idx;
705 /* Clear AUX CH data buffer */
707 writel(reg, dp->reg_base + ANALOGIX_DP_BUFFER_DATA_CTL);
710 while (start_offset < count) {
711 /* Buffer size of AUX CH is 16 * 4bytes */
712 if ((count - start_offset) > 16)
715 cur_data_count = count - start_offset;
717 /* AUX CH Request Transaction process */
718 for (i = 0; i < 3; i++) {
719 /* Select DPCD device address */
720 reg = AUX_ADDR_7_0(reg_addr + start_offset);
721 writel(reg, dp->reg_base + ANALOGIX_DP_AUX_ADDR_7_0);
722 reg = AUX_ADDR_15_8(reg_addr + start_offset);
723 writel(reg, dp->reg_base + ANALOGIX_DP_AUX_ADDR_15_8);
724 reg = AUX_ADDR_19_16(reg_addr + start_offset);
725 writel(reg, dp->reg_base + ANALOGIX_DP_AUX_ADDR_19_16);
728 * Set DisplayPort transaction and read
729 * If bit 3 is 1, DisplayPort transaction.
730 * If Bit 3 is 0, I2C transaction.
732 reg = AUX_LENGTH(cur_data_count) |
733 AUX_TX_COMM_DP_TRANSACTION | AUX_TX_COMM_READ;
734 writel(reg, dp->reg_base + ANALOGIX_DP_AUX_CH_CTL_1);
736 /* Start AUX transaction */
737 retval = analogix_dp_start_aux_transaction(dp);
741 dev_dbg(dp->dev, "%s: Aux Transaction fail!\n",
745 for (cur_data_idx = 0; cur_data_idx < cur_data_count;
747 reg = readl(dp->reg_base + ANALOGIX_DP_BUF_DATA_0
749 data[start_offset + cur_data_idx] =
753 start_offset += cur_data_count;
759 int analogix_dp_select_i2c_device(struct analogix_dp_device *dp,
760 unsigned int device_addr,
761 unsigned int reg_addr)
766 /* Set EDID device address */
768 writel(reg, dp->reg_base + ANALOGIX_DP_AUX_ADDR_7_0);
769 writel(0x0, dp->reg_base + ANALOGIX_DP_AUX_ADDR_15_8);
770 writel(0x0, dp->reg_base + ANALOGIX_DP_AUX_ADDR_19_16);
772 /* Set offset from base address of EDID device */
773 writel(reg_addr, dp->reg_base + ANALOGIX_DP_BUF_DATA_0);
776 * Set I2C transaction and write address
777 * If bit 3 is 1, DisplayPort transaction.
778 * If Bit 3 is 0, I2C transaction.
780 reg = AUX_TX_COMM_I2C_TRANSACTION | AUX_TX_COMM_MOT |
782 writel(reg, dp->reg_base + ANALOGIX_DP_AUX_CH_CTL_1);
784 /* Start AUX transaction */
785 retval = analogix_dp_start_aux_transaction(dp);
787 dev_dbg(dp->dev, "%s: Aux Transaction fail!\n", __func__);
792 int analogix_dp_read_byte_from_i2c(struct analogix_dp_device *dp,
793 unsigned int device_addr,
794 unsigned int reg_addr,
801 for (i = 0; i < 3; i++) {
802 /* Clear AUX CH data buffer */
804 writel(reg, dp->reg_base + ANALOGIX_DP_BUFFER_DATA_CTL);
806 /* Select EDID device */
807 retval = analogix_dp_select_i2c_device(dp, device_addr,
813 * Set I2C transaction and read data
814 * If bit 3 is 1, DisplayPort transaction.
815 * If Bit 3 is 0, I2C transaction.
817 reg = AUX_TX_COMM_I2C_TRANSACTION |
819 writel(reg, dp->reg_base + ANALOGIX_DP_AUX_CH_CTL_1);
821 /* Start AUX transaction */
822 retval = analogix_dp_start_aux_transaction(dp);
826 dev_dbg(dp->dev, "%s: Aux Transaction fail!\n", __func__);
831 *data = readl(dp->reg_base + ANALOGIX_DP_BUF_DATA_0);
836 int analogix_dp_read_bytes_from_i2c(struct analogix_dp_device *dp,
837 unsigned int device_addr,
838 unsigned int reg_addr,
840 unsigned char edid[])
844 unsigned int cur_data_idx;
845 unsigned int defer = 0;
848 for (i = 0; i < count; i += 16) {
849 for (j = 0; j < 3; j++) {
850 /* Clear AUX CH data buffer */
852 writel(reg, dp->reg_base + ANALOGIX_DP_BUFFER_DATA_CTL);
854 /* Set normal AUX CH command */
855 reg = readl(dp->reg_base + ANALOGIX_DP_AUX_CH_CTL_2);
857 writel(reg, dp->reg_base + ANALOGIX_DP_AUX_CH_CTL_2);
860 * If Rx sends defer, Tx sends only reads
861 * request without sending address
864 retval = analogix_dp_select_i2c_device(dp,
865 device_addr, reg_addr + i);
871 * Set I2C transaction and write data
872 * If bit 3 is 1, DisplayPort transaction.
873 * If Bit 3 is 0, I2C transaction.
875 reg = AUX_LENGTH(16) |
876 AUX_TX_COMM_I2C_TRANSACTION |
878 writel(reg, dp->reg_base +
879 ANALOGIX_DP_AUX_CH_CTL_1);
881 /* Start AUX transaction */
882 retval = analogix_dp_start_aux_transaction(dp);
886 dev_dbg(dp->dev, "%s: Aux Transaction fail!\n",
889 /* Check if Rx sends defer */
890 reg = readl(dp->reg_base + ANALOGIX_DP_AUX_RX_COMM);
891 if (reg == AUX_RX_COMM_AUX_DEFER ||
892 reg == AUX_RX_COMM_I2C_DEFER) {
893 dev_err(dp->dev, "Defer: %d\n\n", reg);
898 for (cur_data_idx = 0; cur_data_idx < 16; cur_data_idx++) {
899 reg = readl(dp->reg_base + ANALOGIX_DP_BUF_DATA_0
901 edid[i + cur_data_idx] = (unsigned char)reg;
908 void analogix_dp_set_link_bandwidth(struct analogix_dp_device *dp, u32 bwtype)
913 if ((bwtype == DP_LINK_BW_2_7) || (bwtype == DP_LINK_BW_1_62))
914 writel(reg, dp->reg_base + ANALOGIX_DP_LINK_BW_SET);
917 void analogix_dp_get_link_bandwidth(struct analogix_dp_device *dp, u32 *bwtype)
921 reg = readl(dp->reg_base + ANALOGIX_DP_LINK_BW_SET);
925 void analogix_dp_set_lane_count(struct analogix_dp_device *dp, u32 count)
930 writel(reg, dp->reg_base + ANALOGIX_DP_LANE_COUNT_SET);
933 void analogix_dp_get_lane_count(struct analogix_dp_device *dp, u32 *count)
937 reg = readl(dp->reg_base + ANALOGIX_DP_LANE_COUNT_SET);
941 void analogix_dp_enable_enhanced_mode(struct analogix_dp_device *dp,
947 reg = readl(dp->reg_base + ANALOGIX_DP_SYS_CTL_4);
949 writel(reg, dp->reg_base + ANALOGIX_DP_SYS_CTL_4);
951 reg = readl(dp->reg_base + ANALOGIX_DP_SYS_CTL_4);
953 writel(reg, dp->reg_base + ANALOGIX_DP_SYS_CTL_4);
957 void analogix_dp_set_training_pattern(struct analogix_dp_device *dp,
958 enum pattern_set pattern)
964 reg = SCRAMBLING_ENABLE | LINK_QUAL_PATTERN_SET_PRBS7;
965 writel(reg, dp->reg_base + ANALOGIX_DP_TRAINING_PTN_SET);
968 reg = SCRAMBLING_ENABLE | LINK_QUAL_PATTERN_SET_D10_2;
969 writel(reg, dp->reg_base + ANALOGIX_DP_TRAINING_PTN_SET);
972 reg = SCRAMBLING_DISABLE | SW_TRAINING_PATTERN_SET_PTN1;
973 writel(reg, dp->reg_base + ANALOGIX_DP_TRAINING_PTN_SET);
976 reg = SCRAMBLING_DISABLE | SW_TRAINING_PATTERN_SET_PTN2;
977 writel(reg, dp->reg_base + ANALOGIX_DP_TRAINING_PTN_SET);
980 reg = SCRAMBLING_ENABLE |
981 LINK_QUAL_PATTERN_SET_DISABLE |
982 SW_TRAINING_PATTERN_SET_NORMAL;
983 writel(reg, dp->reg_base + ANALOGIX_DP_TRAINING_PTN_SET);
990 void analogix_dp_set_lane0_pre_emphasis(struct analogix_dp_device *dp,
995 reg = readl(dp->reg_base + ANALOGIX_DP_LN0_LINK_TRAINING_CTL);
996 reg &= ~PRE_EMPHASIS_SET_MASK;
997 reg |= level << PRE_EMPHASIS_SET_SHIFT;
998 writel(reg, dp->reg_base + ANALOGIX_DP_LN0_LINK_TRAINING_CTL);
1001 void analogix_dp_set_lane1_pre_emphasis(struct analogix_dp_device *dp,
1006 reg = readl(dp->reg_base + ANALOGIX_DP_LN1_LINK_TRAINING_CTL);
1007 reg &= ~PRE_EMPHASIS_SET_MASK;
1008 reg |= level << PRE_EMPHASIS_SET_SHIFT;
1009 writel(reg, dp->reg_base + ANALOGIX_DP_LN1_LINK_TRAINING_CTL);
1012 void analogix_dp_set_lane2_pre_emphasis(struct analogix_dp_device *dp,
1017 reg = readl(dp->reg_base + ANALOGIX_DP_LN2_LINK_TRAINING_CTL);
1018 reg &= ~PRE_EMPHASIS_SET_MASK;
1019 reg |= level << PRE_EMPHASIS_SET_SHIFT;
1020 writel(reg, dp->reg_base + ANALOGIX_DP_LN2_LINK_TRAINING_CTL);
1023 void analogix_dp_set_lane3_pre_emphasis(struct analogix_dp_device *dp,
1028 reg = readl(dp->reg_base + ANALOGIX_DP_LN3_LINK_TRAINING_CTL);
1029 reg &= ~PRE_EMPHASIS_SET_MASK;
1030 reg |= level << PRE_EMPHASIS_SET_SHIFT;
1031 writel(reg, dp->reg_base + ANALOGIX_DP_LN3_LINK_TRAINING_CTL);
1034 void analogix_dp_set_lane0_link_training(struct analogix_dp_device *dp,
1039 reg = training_lane;
1040 writel(reg, dp->reg_base + ANALOGIX_DP_LN0_LINK_TRAINING_CTL);
1043 void analogix_dp_set_lane1_link_training(struct analogix_dp_device *dp,
1048 reg = training_lane;
1049 writel(reg, dp->reg_base + ANALOGIX_DP_LN1_LINK_TRAINING_CTL);
1052 void analogix_dp_set_lane2_link_training(struct analogix_dp_device *dp,
1057 reg = training_lane;
1058 writel(reg, dp->reg_base + ANALOGIX_DP_LN2_LINK_TRAINING_CTL);
1061 void analogix_dp_set_lane3_link_training(struct analogix_dp_device *dp,
1066 reg = training_lane;
1067 writel(reg, dp->reg_base + ANALOGIX_DP_LN3_LINK_TRAINING_CTL);
1070 u32 analogix_dp_get_lane0_link_training(struct analogix_dp_device *dp)
1074 reg = readl(dp->reg_base + ANALOGIX_DP_LN0_LINK_TRAINING_CTL);
1078 u32 analogix_dp_get_lane1_link_training(struct analogix_dp_device *dp)
1082 reg = readl(dp->reg_base + ANALOGIX_DP_LN1_LINK_TRAINING_CTL);
1086 u32 analogix_dp_get_lane2_link_training(struct analogix_dp_device *dp)
1090 reg = readl(dp->reg_base + ANALOGIX_DP_LN2_LINK_TRAINING_CTL);
1094 u32 analogix_dp_get_lane3_link_training(struct analogix_dp_device *dp)
1098 reg = readl(dp->reg_base + ANALOGIX_DP_LN3_LINK_TRAINING_CTL);
1102 void analogix_dp_reset_macro(struct analogix_dp_device *dp)
1106 reg = readl(dp->reg_base + ANALOGIX_DP_PHY_TEST);
1108 writel(reg, dp->reg_base + ANALOGIX_DP_PHY_TEST);
1110 /* 10 us is the minimum reset time. */
1111 usleep_range(10, 20);
1114 writel(reg, dp->reg_base + ANALOGIX_DP_PHY_TEST);
1117 void analogix_dp_init_video(struct analogix_dp_device *dp)
1121 reg = VSYNC_DET | VID_FORMAT_CHG | VID_CLK_CHG;
1122 writel(reg, dp->reg_base + ANALOGIX_DP_COMMON_INT_STA_1);
1125 writel(reg, dp->reg_base + ANALOGIX_DP_SYS_CTL_1);
1127 reg = CHA_CRI(4) | CHA_CTRL;
1128 writel(reg, dp->reg_base + ANALOGIX_DP_SYS_CTL_2);
1131 writel(reg, dp->reg_base + ANALOGIX_DP_SYS_CTL_3);
1133 reg = VID_HRES_TH(2) | VID_VRES_TH(0);
1134 writel(reg, dp->reg_base + ANALOGIX_DP_VIDEO_CTL_8);
1137 void analogix_dp_set_video_color_format(struct analogix_dp_device *dp)
1141 /* Configure the input color depth, color space, dynamic range */
1142 reg = (dp->video_info.dynamic_range << IN_D_RANGE_SHIFT) |
1143 (dp->video_info.color_depth << IN_BPC_SHIFT) |
1144 (dp->video_info.color_space << IN_COLOR_F_SHIFT);
1145 writel(reg, dp->reg_base + ANALOGIX_DP_VIDEO_CTL_2);
1147 /* Set Input Color YCbCr Coefficients to ITU601 or ITU709 */
1148 reg = readl(dp->reg_base + ANALOGIX_DP_VIDEO_CTL_3);
1149 reg &= ~IN_YC_COEFFI_MASK;
1150 if (dp->video_info.ycbcr_coeff)
1151 reg |= IN_YC_COEFFI_ITU709;
1153 reg |= IN_YC_COEFFI_ITU601;
1154 writel(reg, dp->reg_base + ANALOGIX_DP_VIDEO_CTL_3);
1157 int analogix_dp_is_slave_video_stream_clock_on(struct analogix_dp_device *dp)
1161 reg = readl(dp->reg_base + ANALOGIX_DP_SYS_CTL_1);
1162 writel(reg, dp->reg_base + ANALOGIX_DP_SYS_CTL_1);
1164 reg = readl(dp->reg_base + ANALOGIX_DP_SYS_CTL_1);
1166 if (!(reg & DET_STA)) {
1167 dev_dbg(dp->dev, "Input stream clock not detected.\n");
1171 reg = readl(dp->reg_base + ANALOGIX_DP_SYS_CTL_2);
1172 writel(reg, dp->reg_base + ANALOGIX_DP_SYS_CTL_2);
1174 reg = readl(dp->reg_base + ANALOGIX_DP_SYS_CTL_2);
1175 dev_dbg(dp->dev, "wait SYS_CTL_2.\n");
1177 if (reg & CHA_STA) {
1178 dev_dbg(dp->dev, "Input stream clk is changing\n");
1185 void analogix_dp_set_video_cr_mn(struct analogix_dp_device *dp,
1186 enum clock_recovery_m_value_type type,
1187 u32 m_value, u32 n_value)
1191 if (type == REGISTER_M) {
1192 reg = readl(dp->reg_base + ANALOGIX_DP_SYS_CTL_4);
1194 writel(reg, dp->reg_base + ANALOGIX_DP_SYS_CTL_4);
1195 reg = m_value & 0xff;
1196 writel(reg, dp->reg_base + ANALOGIX_DP_M_VID_0);
1197 reg = (m_value >> 8) & 0xff;
1198 writel(reg, dp->reg_base + ANALOGIX_DP_M_VID_1);
1199 reg = (m_value >> 16) & 0xff;
1200 writel(reg, dp->reg_base + ANALOGIX_DP_M_VID_2);
1202 reg = n_value & 0xff;
1203 writel(reg, dp->reg_base + ANALOGIX_DP_N_VID_0);
1204 reg = (n_value >> 8) & 0xff;
1205 writel(reg, dp->reg_base + ANALOGIX_DP_N_VID_1);
1206 reg = (n_value >> 16) & 0xff;
1207 writel(reg, dp->reg_base + ANALOGIX_DP_N_VID_2);
1209 reg = readl(dp->reg_base + ANALOGIX_DP_SYS_CTL_4);
1211 writel(reg, dp->reg_base + ANALOGIX_DP_SYS_CTL_4);
1213 writel(0x00, dp->reg_base + ANALOGIX_DP_N_VID_0);
1214 writel(0x80, dp->reg_base + ANALOGIX_DP_N_VID_1);
1215 writel(0x00, dp->reg_base + ANALOGIX_DP_N_VID_2);
1219 void analogix_dp_set_video_timing_mode(struct analogix_dp_device *dp, u32 type)
1223 if (type == VIDEO_TIMING_FROM_CAPTURE) {
1224 reg = readl(dp->reg_base + ANALOGIX_DP_VIDEO_CTL_10);
1226 writel(reg, dp->reg_base + ANALOGIX_DP_VIDEO_CTL_10);
1228 reg = readl(dp->reg_base + ANALOGIX_DP_VIDEO_CTL_10);
1230 writel(reg, dp->reg_base + ANALOGIX_DP_VIDEO_CTL_10);
1234 void analogix_dp_enable_video_master(struct analogix_dp_device *dp, bool enable)
1239 reg = readl(dp->reg_base + ANALOGIX_DP_SOC_GENERAL_CTL);
1240 reg &= ~VIDEO_MODE_MASK;
1241 reg |= VIDEO_MASTER_MODE_EN | VIDEO_MODE_MASTER_MODE;
1242 writel(reg, dp->reg_base + ANALOGIX_DP_SOC_GENERAL_CTL);
1244 reg = readl(dp->reg_base + ANALOGIX_DP_SOC_GENERAL_CTL);
1245 reg &= ~VIDEO_MODE_MASK;
1246 reg |= VIDEO_MODE_SLAVE_MODE;
1247 writel(reg, dp->reg_base + ANALOGIX_DP_SOC_GENERAL_CTL);
1251 void analogix_dp_start_video(struct analogix_dp_device *dp)
1255 reg = readl(dp->reg_base + ANALOGIX_DP_VIDEO_CTL_1);
1257 writel(reg, dp->reg_base + ANALOGIX_DP_VIDEO_CTL_1);
1260 int analogix_dp_is_video_stream_on(struct analogix_dp_device *dp)
1264 reg = readl(dp->reg_base + ANALOGIX_DP_SYS_CTL_3);
1265 writel(reg, dp->reg_base + ANALOGIX_DP_SYS_CTL_3);
1267 reg = readl(dp->reg_base + ANALOGIX_DP_SYS_CTL_3);
1268 if (!(reg & STRM_VALID)) {
1269 dev_dbg(dp->dev, "Input video stream is not detected.\n");
1276 void analogix_dp_config_video_slave_mode(struct analogix_dp_device *dp)
1280 reg = readl(dp->reg_base + ANALOGIX_DP_FUNC_EN_1);
1281 reg &= ~(MASTER_VID_FUNC_EN_N | SLAVE_VID_FUNC_EN_N);
1282 reg |= MASTER_VID_FUNC_EN_N;
1283 writel(reg, dp->reg_base + ANALOGIX_DP_FUNC_EN_1);
1285 reg = readl(dp->reg_base + ANALOGIX_DP_VIDEO_CTL_10);
1286 reg &= ~INTERACE_SCAN_CFG;
1287 reg |= (dp->video_info.interlaced << 2);
1288 writel(reg, dp->reg_base + ANALOGIX_DP_VIDEO_CTL_10);
1290 reg = readl(dp->reg_base + ANALOGIX_DP_VIDEO_CTL_10);
1291 reg &= ~VSYNC_POLARITY_CFG;
1292 reg |= (dp->video_info.v_sync_polarity << 1);
1293 writel(reg, dp->reg_base + ANALOGIX_DP_VIDEO_CTL_10);
1295 reg = readl(dp->reg_base + ANALOGIX_DP_VIDEO_CTL_10);
1296 reg &= ~HSYNC_POLARITY_CFG;
1297 reg |= (dp->video_info.h_sync_polarity << 0);
1298 writel(reg, dp->reg_base + ANALOGIX_DP_VIDEO_CTL_10);
1300 reg = AUDIO_MODE_SPDIF_MODE | VIDEO_MODE_SLAVE_MODE;
1301 writel(reg, dp->reg_base + ANALOGIX_DP_SOC_GENERAL_CTL);
1304 void analogix_dp_enable_scrambling(struct analogix_dp_device *dp)
1308 reg = readl(dp->reg_base + ANALOGIX_DP_TRAINING_PTN_SET);
1309 reg &= ~SCRAMBLING_DISABLE;
1310 writel(reg, dp->reg_base + ANALOGIX_DP_TRAINING_PTN_SET);
1313 void analogix_dp_disable_scrambling(struct analogix_dp_device *dp)
1317 reg = readl(dp->reg_base + ANALOGIX_DP_TRAINING_PTN_SET);
1318 reg |= SCRAMBLING_DISABLE;
1319 writel(reg, dp->reg_base + ANALOGIX_DP_TRAINING_PTN_SET);