diff options
Diffstat (limited to 'drivers/video/exynos/exynos_dp_reg.c')
-rw-r--r-- | drivers/video/exynos/exynos_dp_reg.c | 45 |
1 files changed, 40 insertions, 5 deletions
diff --git a/drivers/video/exynos/exynos_dp_reg.c b/drivers/video/exynos/exynos_dp_reg.c index 6548afa0e3d2..6ce76d56c3a1 100644 --- a/drivers/video/exynos/exynos_dp_reg.c +++ b/drivers/video/exynos/exynos_dp_reg.c | |||
@@ -16,8 +16,6 @@ | |||
16 | 16 | ||
17 | #include <video/exynos_dp.h> | 17 | #include <video/exynos_dp.h> |
18 | 18 | ||
19 | #include <plat/cpu.h> | ||
20 | |||
21 | #include "exynos_dp_core.h" | 19 | #include "exynos_dp_core.h" |
22 | #include "exynos_dp_reg.h" | 20 | #include "exynos_dp_reg.h" |
23 | 21 | ||
@@ -65,6 +63,28 @@ void exynos_dp_lane_swap(struct exynos_dp_device *dp, bool enable) | |||
65 | writel(reg, dp->reg_base + EXYNOS_DP_LANE_MAP); | 63 | writel(reg, dp->reg_base + EXYNOS_DP_LANE_MAP); |
66 | } | 64 | } |
67 | 65 | ||
66 | void exynos_dp_init_analog_param(struct exynos_dp_device *dp) | ||
67 | { | ||
68 | u32 reg; | ||
69 | |||
70 | reg = TX_TERMINAL_CTRL_50_OHM; | ||
71 | writel(reg, dp->reg_base + EXYNOS_DP_ANALOG_CTL_1); | ||
72 | |||
73 | reg = SEL_24M | TX_DVDD_BIT_1_0625V; | ||
74 | writel(reg, dp->reg_base + EXYNOS_DP_ANALOG_CTL_2); | ||
75 | |||
76 | reg = DRIVE_DVDD_BIT_1_0625V | VCO_BIT_600_MICRO; | ||
77 | writel(reg, dp->reg_base + EXYNOS_DP_ANALOG_CTL_3); | ||
78 | |||
79 | reg = PD_RING_OSC | AUX_TERMINAL_CTRL_50_OHM | | ||
80 | TX_CUR1_2X | TX_CUR_8_MA; | ||
81 | writel(reg, dp->reg_base + EXYNOS_DP_PLL_FILTER_CTL_1); | ||
82 | |||
83 | reg = CH3_AMP_400_MV | CH2_AMP_400_MV | | ||
84 | CH1_AMP_400_MV | CH0_AMP_400_MV; | ||
85 | writel(reg, dp->reg_base + EXYNOS_DP_TX_AMP_TUNING_CTL); | ||
86 | } | ||
87 | |||
68 | void exynos_dp_init_interrupt(struct exynos_dp_device *dp) | 88 | void exynos_dp_init_interrupt(struct exynos_dp_device *dp) |
69 | { | 89 | { |
70 | /* Set interrupt pin assertion polarity as high */ | 90 | /* Set interrupt pin assertion polarity as high */ |
@@ -89,8 +109,6 @@ void exynos_dp_reset(struct exynos_dp_device *dp) | |||
89 | { | 109 | { |
90 | u32 reg; | 110 | u32 reg; |
91 | 111 | ||
92 | writel(RESET_DP_TX, dp->reg_base + EXYNOS_DP_TX_SW_RESET); | ||
93 | |||
94 | exynos_dp_stop_video(dp); | 112 | exynos_dp_stop_video(dp); |
95 | exynos_dp_enable_video_mute(dp, 0); | 113 | exynos_dp_enable_video_mute(dp, 0); |
96 | 114 | ||
@@ -131,9 +149,15 @@ void exynos_dp_reset(struct exynos_dp_device *dp) | |||
131 | 149 | ||
132 | writel(0x00000101, dp->reg_base + EXYNOS_DP_SOC_GENERAL_CTL); | 150 | writel(0x00000101, dp->reg_base + EXYNOS_DP_SOC_GENERAL_CTL); |
133 | 151 | ||
152 | exynos_dp_init_analog_param(dp); | ||
134 | exynos_dp_init_interrupt(dp); | 153 | exynos_dp_init_interrupt(dp); |
135 | } | 154 | } |
136 | 155 | ||
156 | void exynos_dp_swreset(struct exynos_dp_device *dp) | ||
157 | { | ||
158 | writel(RESET_DP_TX, dp->reg_base + EXYNOS_DP_TX_SW_RESET); | ||
159 | } | ||
160 | |||
137 | void exynos_dp_config_interrupt(struct exynos_dp_device *dp) | 161 | void exynos_dp_config_interrupt(struct exynos_dp_device *dp) |
138 | { | 162 | { |
139 | u32 reg; | 163 | u32 reg; |
@@ -271,6 +295,7 @@ void exynos_dp_set_analog_power_down(struct exynos_dp_device *dp, | |||
271 | void exynos_dp_init_analog_func(struct exynos_dp_device *dp) | 295 | void exynos_dp_init_analog_func(struct exynos_dp_device *dp) |
272 | { | 296 | { |
273 | u32 reg; | 297 | u32 reg; |
298 | int timeout_loop = 0; | ||
274 | 299 | ||
275 | exynos_dp_set_analog_power_down(dp, POWER_ALL, 0); | 300 | exynos_dp_set_analog_power_down(dp, POWER_ALL, 0); |
276 | 301 | ||
@@ -282,9 +307,19 @@ void exynos_dp_init_analog_func(struct exynos_dp_device *dp) | |||
282 | writel(reg, dp->reg_base + EXYNOS_DP_DEBUG_CTL); | 307 | writel(reg, dp->reg_base + EXYNOS_DP_DEBUG_CTL); |
283 | 308 | ||
284 | /* Power up PLL */ | 309 | /* Power up PLL */ |
285 | if (exynos_dp_get_pll_lock_status(dp) == PLL_UNLOCKED) | 310 | if (exynos_dp_get_pll_lock_status(dp) == PLL_UNLOCKED) { |
286 | exynos_dp_set_pll_power_down(dp, 0); | 311 | exynos_dp_set_pll_power_down(dp, 0); |
287 | 312 | ||
313 | while (exynos_dp_get_pll_lock_status(dp) == PLL_UNLOCKED) { | ||
314 | timeout_loop++; | ||
315 | if (DP_TIMEOUT_LOOP_COUNT < timeout_loop) { | ||
316 | dev_err(dp->dev, "failed to get pll lock status\n"); | ||
317 | return; | ||
318 | } | ||
319 | usleep_range(10, 20); | ||
320 | } | ||
321 | } | ||
322 | |||
288 | /* Enable Serdes FIFO function and Link symbol clock domain module */ | 323 | /* Enable Serdes FIFO function and Link symbol clock domain module */ |
289 | reg = readl(dp->reg_base + EXYNOS_DP_FUNC_EN_2); | 324 | reg = readl(dp->reg_base + EXYNOS_DP_FUNC_EN_2); |
290 | reg &= ~(SERDES_FIFO_FUNC_EN_N | LS_CLK_DOMAIN_FUNC_EN_N | 325 | reg &= ~(SERDES_FIFO_FUNC_EN_N | LS_CLK_DOMAIN_FUNC_EN_N |