diff options
Diffstat (limited to 'drivers/video/exynos/exynos_dp_reg.c')
| -rw-r--r-- | drivers/video/exynos/exynos_dp_reg.c | 58 |
1 files changed, 38 insertions, 20 deletions
diff --git a/drivers/video/exynos/exynos_dp_reg.c b/drivers/video/exynos/exynos_dp_reg.c index 2db5b9aa250a..3f5ca8a0d5ea 100644 --- a/drivers/video/exynos/exynos_dp_reg.c +++ b/drivers/video/exynos/exynos_dp_reg.c | |||
| @@ -77,7 +77,7 @@ void exynos_dp_init_analog_param(struct exynos_dp_device *dp) | |||
| 77 | writel(reg, dp->reg_base + EXYNOS_DP_ANALOG_CTL_3); | 77 | writel(reg, dp->reg_base + EXYNOS_DP_ANALOG_CTL_3); |
| 78 | 78 | ||
| 79 | reg = PD_RING_OSC | AUX_TERMINAL_CTRL_50_OHM | | 79 | reg = PD_RING_OSC | AUX_TERMINAL_CTRL_50_OHM | |
| 80 | TX_CUR1_2X | TX_CUR_8_MA; | 80 | TX_CUR1_2X | TX_CUR_16_MA; |
| 81 | writel(reg, dp->reg_base + EXYNOS_DP_PLL_FILTER_CTL_1); | 81 | writel(reg, dp->reg_base + EXYNOS_DP_PLL_FILTER_CTL_1); |
| 82 | 82 | ||
| 83 | reg = CH3_AMP_400_MV | CH2_AMP_400_MV | | 83 | reg = CH3_AMP_400_MV | CH2_AMP_400_MV | |
| @@ -148,9 +148,6 @@ void exynos_dp_reset(struct exynos_dp_device *dp) | |||
| 148 | writel(0x2, dp->reg_base + EXYNOS_DP_M_AUD_GEN_FILTER_TH); | 148 | writel(0x2, dp->reg_base + EXYNOS_DP_M_AUD_GEN_FILTER_TH); |
| 149 | 149 | ||
| 150 | writel(0x00000101, dp->reg_base + EXYNOS_DP_SOC_GENERAL_CTL); | 150 | writel(0x00000101, dp->reg_base + EXYNOS_DP_SOC_GENERAL_CTL); |
| 151 | |||
| 152 | exynos_dp_init_analog_param(dp); | ||
| 153 | exynos_dp_init_interrupt(dp); | ||
| 154 | } | 151 | } |
| 155 | 152 | ||
| 156 | void exynos_dp_swreset(struct exynos_dp_device *dp) | 153 | void exynos_dp_swreset(struct exynos_dp_device *dp) |
| @@ -179,7 +176,7 @@ void exynos_dp_config_interrupt(struct exynos_dp_device *dp) | |||
| 179 | writel(reg, dp->reg_base + EXYNOS_DP_INT_STA_MASK); | 176 | writel(reg, dp->reg_base + EXYNOS_DP_INT_STA_MASK); |
| 180 | } | 177 | } |
| 181 | 178 | ||
| 182 | u32 exynos_dp_get_pll_lock_status(struct exynos_dp_device *dp) | 179 | enum pll_status exynos_dp_get_pll_lock_status(struct exynos_dp_device *dp) |
| 183 | { | 180 | { |
| 184 | u32 reg; | 181 | u32 reg; |
| 185 | 182 | ||
| @@ -401,6 +398,7 @@ int exynos_dp_start_aux_transaction(struct exynos_dp_device *dp) | |||
| 401 | { | 398 | { |
| 402 | int reg; | 399 | int reg; |
| 403 | int retval = 0; | 400 | int retval = 0; |
| 401 | int timeout_loop = 0; | ||
| 404 | 402 | ||
| 405 | /* Enable AUX CH operation */ | 403 | /* Enable AUX CH operation */ |
| 406 | reg = readl(dp->reg_base + EXYNOS_DP_AUX_CH_CTL_2); | 404 | reg = readl(dp->reg_base + EXYNOS_DP_AUX_CH_CTL_2); |
| @@ -409,8 +407,15 @@ int exynos_dp_start_aux_transaction(struct exynos_dp_device *dp) | |||
| 409 | 407 | ||
| 410 | /* Is AUX CH command reply received? */ | 408 | /* Is AUX CH command reply received? */ |
| 411 | reg = readl(dp->reg_base + EXYNOS_DP_INT_STA); | 409 | reg = readl(dp->reg_base + EXYNOS_DP_INT_STA); |
| 412 | while (!(reg & RPLY_RECEIV)) | 410 | while (!(reg & RPLY_RECEIV)) { |
| 411 | timeout_loop++; | ||
| 412 | if (DP_TIMEOUT_LOOP_COUNT < timeout_loop) { | ||
| 413 | dev_err(dp->dev, "AUX CH command reply failed!\n"); | ||
| 414 | return -ETIMEDOUT; | ||
| 415 | } | ||
| 413 | reg = readl(dp->reg_base + EXYNOS_DP_INT_STA); | 416 | reg = readl(dp->reg_base + EXYNOS_DP_INT_STA); |
| 417 | usleep_range(10, 11); | ||
| 418 | } | ||
| 414 | 419 | ||
| 415 | /* Clear interrupt source for AUX CH command reply */ | 420 | /* Clear interrupt source for AUX CH command reply */ |
| 416 | writel(RPLY_RECEIV, dp->reg_base + EXYNOS_DP_INT_STA); | 421 | writel(RPLY_RECEIV, dp->reg_base + EXYNOS_DP_INT_STA); |
| @@ -471,7 +476,8 @@ int exynos_dp_write_byte_to_dpcd(struct exynos_dp_device *dp, | |||
| 471 | if (retval == 0) | 476 | if (retval == 0) |
| 472 | break; | 477 | break; |
| 473 | else | 478 | else |
| 474 | dev_err(dp->dev, "Aux Transaction fail!\n"); | 479 | dev_dbg(dp->dev, "%s: Aux Transaction fail!\n", |
| 480 | __func__); | ||
| 475 | } | 481 | } |
| 476 | 482 | ||
| 477 | return retval; | 483 | return retval; |
| @@ -511,7 +517,8 @@ int exynos_dp_read_byte_from_dpcd(struct exynos_dp_device *dp, | |||
| 511 | if (retval == 0) | 517 | if (retval == 0) |
| 512 | break; | 518 | break; |
| 513 | else | 519 | else |
| 514 | dev_err(dp->dev, "Aux Transaction fail!\n"); | 520 | dev_dbg(dp->dev, "%s: Aux Transaction fail!\n", |
| 521 | __func__); | ||
| 515 | } | 522 | } |
| 516 | 523 | ||
| 517 | /* Read data buffer */ | 524 | /* Read data buffer */ |
| @@ -575,7 +582,8 @@ int exynos_dp_write_bytes_to_dpcd(struct exynos_dp_device *dp, | |||
| 575 | if (retval == 0) | 582 | if (retval == 0) |
| 576 | break; | 583 | break; |
| 577 | else | 584 | else |
| 578 | dev_err(dp->dev, "Aux Transaction fail!\n"); | 585 | dev_dbg(dp->dev, "%s: Aux Transaction fail!\n", |
| 586 | __func__); | ||
| 579 | } | 587 | } |
| 580 | 588 | ||
| 581 | start_offset += cur_data_count; | 589 | start_offset += cur_data_count; |
| @@ -632,7 +640,8 @@ int exynos_dp_read_bytes_from_dpcd(struct exynos_dp_device *dp, | |||
| 632 | if (retval == 0) | 640 | if (retval == 0) |
| 633 | break; | 641 | break; |
| 634 | else | 642 | else |
| 635 | dev_err(dp->dev, "Aux Transaction fail!\n"); | 643 | dev_dbg(dp->dev, "%s: Aux Transaction fail!\n", |
| 644 | __func__); | ||
| 636 | } | 645 | } |
| 637 | 646 | ||
| 638 | for (cur_data_idx = 0; cur_data_idx < cur_data_count; | 647 | for (cur_data_idx = 0; cur_data_idx < cur_data_count; |
| @@ -677,7 +686,7 @@ int exynos_dp_select_i2c_device(struct exynos_dp_device *dp, | |||
| 677 | /* Start AUX transaction */ | 686 | /* Start AUX transaction */ |
| 678 | retval = exynos_dp_start_aux_transaction(dp); | 687 | retval = exynos_dp_start_aux_transaction(dp); |
| 679 | if (retval != 0) | 688 | if (retval != 0) |
| 680 | dev_err(dp->dev, "Aux Transaction fail!\n"); | 689 | dev_dbg(dp->dev, "%s: Aux Transaction fail!\n", __func__); |
| 681 | 690 | ||
| 682 | return retval; | 691 | return retval; |
| 683 | } | 692 | } |
| @@ -717,7 +726,8 @@ int exynos_dp_read_byte_from_i2c(struct exynos_dp_device *dp, | |||
| 717 | if (retval == 0) | 726 | if (retval == 0) |
| 718 | break; | 727 | break; |
| 719 | else | 728 | else |
| 720 | dev_err(dp->dev, "Aux Transaction fail!\n"); | 729 | dev_dbg(dp->dev, "%s: Aux Transaction fail!\n", |
| 730 | __func__); | ||
| 721 | } | 731 | } |
| 722 | 732 | ||
| 723 | /* Read data */ | 733 | /* Read data */ |
| @@ -777,7 +787,9 @@ int exynos_dp_read_bytes_from_i2c(struct exynos_dp_device *dp, | |||
| 777 | if (retval == 0) | 787 | if (retval == 0) |
| 778 | break; | 788 | break; |
| 779 | else | 789 | else |
| 780 | dev_err(dp->dev, "Aux Transaction fail!\n"); | 790 | dev_dbg(dp->dev, |
| 791 | "%s: Aux Transaction fail!\n", | ||
| 792 | __func__); | ||
| 781 | } | 793 | } |
| 782 | /* Check if Rx sends defer */ | 794 | /* Check if Rx sends defer */ |
| 783 | reg = readl(dp->reg_base + EXYNOS_DP_AUX_RX_COMM); | 795 | reg = readl(dp->reg_base + EXYNOS_DP_AUX_RX_COMM); |
| @@ -883,7 +895,9 @@ void exynos_dp_set_lane0_pre_emphasis(struct exynos_dp_device *dp, u32 level) | |||
| 883 | { | 895 | { |
| 884 | u32 reg; | 896 | u32 reg; |
| 885 | 897 | ||
| 886 | reg = level << PRE_EMPHASIS_SET_SHIFT; | 898 | reg = readl(dp->reg_base + EXYNOS_DP_LN0_LINK_TRAINING_CTL); |
| 899 | reg &= ~PRE_EMPHASIS_SET_MASK; | ||
| 900 | reg |= level << PRE_EMPHASIS_SET_SHIFT; | ||
| 887 | writel(reg, dp->reg_base + EXYNOS_DP_LN0_LINK_TRAINING_CTL); | 901 | writel(reg, dp->reg_base + EXYNOS_DP_LN0_LINK_TRAINING_CTL); |
| 888 | } | 902 | } |
| 889 | 903 | ||
| @@ -891,7 +905,9 @@ void exynos_dp_set_lane1_pre_emphasis(struct exynos_dp_device *dp, u32 level) | |||
| 891 | { | 905 | { |
| 892 | u32 reg; | 906 | u32 reg; |
| 893 | 907 | ||
| 894 | reg = level << PRE_EMPHASIS_SET_SHIFT; | 908 | reg = readl(dp->reg_base + EXYNOS_DP_LN1_LINK_TRAINING_CTL); |
| 909 | reg &= ~PRE_EMPHASIS_SET_MASK; | ||
| 910 | reg |= level << PRE_EMPHASIS_SET_SHIFT; | ||
| 895 | writel(reg, dp->reg_base + EXYNOS_DP_LN1_LINK_TRAINING_CTL); | 911 | writel(reg, dp->reg_base + EXYNOS_DP_LN1_LINK_TRAINING_CTL); |
| 896 | } | 912 | } |
| 897 | 913 | ||
| @@ -899,7 +915,9 @@ void exynos_dp_set_lane2_pre_emphasis(struct exynos_dp_device *dp, u32 level) | |||
| 899 | { | 915 | { |
| 900 | u32 reg; | 916 | u32 reg; |
| 901 | 917 | ||
| 902 | reg = level << PRE_EMPHASIS_SET_SHIFT; | 918 | reg = readl(dp->reg_base + EXYNOS_DP_LN2_LINK_TRAINING_CTL); |
| 919 | reg &= ~PRE_EMPHASIS_SET_MASK; | ||
| 920 | reg |= level << PRE_EMPHASIS_SET_SHIFT; | ||
| 903 | writel(reg, dp->reg_base + EXYNOS_DP_LN2_LINK_TRAINING_CTL); | 921 | writel(reg, dp->reg_base + EXYNOS_DP_LN2_LINK_TRAINING_CTL); |
| 904 | } | 922 | } |
| 905 | 923 | ||
| @@ -907,7 +925,9 @@ void exynos_dp_set_lane3_pre_emphasis(struct exynos_dp_device *dp, u32 level) | |||
| 907 | { | 925 | { |
| 908 | u32 reg; | 926 | u32 reg; |
| 909 | 927 | ||
| 910 | reg = level << PRE_EMPHASIS_SET_SHIFT; | 928 | reg = readl(dp->reg_base + EXYNOS_DP_LN3_LINK_TRAINING_CTL); |
| 929 | reg &= ~PRE_EMPHASIS_SET_MASK; | ||
| 930 | reg |= level << PRE_EMPHASIS_SET_SHIFT; | ||
| 911 | writel(reg, dp->reg_base + EXYNOS_DP_LN3_LINK_TRAINING_CTL); | 931 | writel(reg, dp->reg_base + EXYNOS_DP_LN3_LINK_TRAINING_CTL); |
| 912 | } | 932 | } |
| 913 | 933 | ||
| @@ -994,7 +1014,7 @@ void exynos_dp_reset_macro(struct exynos_dp_device *dp) | |||
| 994 | writel(reg, dp->reg_base + EXYNOS_DP_PHY_TEST); | 1014 | writel(reg, dp->reg_base + EXYNOS_DP_PHY_TEST); |
| 995 | } | 1015 | } |
| 996 | 1016 | ||
| 997 | int exynos_dp_init_video(struct exynos_dp_device *dp) | 1017 | void exynos_dp_init_video(struct exynos_dp_device *dp) |
| 998 | { | 1018 | { |
| 999 | u32 reg; | 1019 | u32 reg; |
| 1000 | 1020 | ||
| @@ -1012,8 +1032,6 @@ int exynos_dp_init_video(struct exynos_dp_device *dp) | |||
| 1012 | 1032 | ||
| 1013 | reg = VID_HRES_TH(2) | VID_VRES_TH(0); | 1033 | reg = VID_HRES_TH(2) | VID_VRES_TH(0); |
| 1014 | writel(reg, dp->reg_base + EXYNOS_DP_VIDEO_CTL_8); | 1034 | writel(reg, dp->reg_base + EXYNOS_DP_VIDEO_CTL_8); |
| 1015 | |||
| 1016 | return 0; | ||
| 1017 | } | 1035 | } |
| 1018 | 1036 | ||
| 1019 | void exynos_dp_set_video_color_format(struct exynos_dp_device *dp, | 1037 | void exynos_dp_set_video_color_format(struct exynos_dp_device *dp, |
