diff options
-rw-r--r-- | drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c | 76 | ||||
-rw-r--r-- | drivers/gpu/drm/bridge/analogix/analogix_dp_reg.h | 12 |
2 files changed, 60 insertions, 28 deletions
diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c index 3858df5c687c..1e24b3722ff1 100644 --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c | |||
@@ -15,6 +15,8 @@ | |||
15 | #include <linux/delay.h> | 15 | #include <linux/delay.h> |
16 | #include <linux/gpio.h> | 16 | #include <linux/gpio.h> |
17 | 17 | ||
18 | #include <drm/bridge/analogix_dp.h> | ||
19 | |||
18 | #include "analogix_dp_core.h" | 20 | #include "analogix_dp_core.h" |
19 | #include "analogix_dp_reg.h" | 21 | #include "analogix_dp_reg.h" |
20 | 22 | ||
@@ -72,6 +74,14 @@ void analogix_dp_init_analog_param(struct analogix_dp_device *dp) | |||
72 | reg = SEL_24M | TX_DVDD_BIT_1_0625V; | 74 | reg = SEL_24M | TX_DVDD_BIT_1_0625V; |
73 | writel(reg, dp->reg_base + ANALOGIX_DP_ANALOG_CTL_2); | 75 | writel(reg, dp->reg_base + ANALOGIX_DP_ANALOG_CTL_2); |
74 | 76 | ||
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); | ||
83 | } | ||
84 | |||
75 | reg = DRIVE_DVDD_BIT_1_0625V | VCO_BIT_600_MICRO; | 85 | reg = DRIVE_DVDD_BIT_1_0625V | VCO_BIT_600_MICRO; |
76 | writel(reg, dp->reg_base + ANALOGIX_DP_ANALOG_CTL_3); | 86 | writel(reg, dp->reg_base + ANALOGIX_DP_ANALOG_CTL_3); |
77 | 87 | ||
@@ -206,81 +216,85 @@ void analogix_dp_set_analog_power_down(struct analogix_dp_device *dp, | |||
206 | bool enable) | 216 | bool enable) |
207 | { | 217 | { |
208 | u32 reg; | 218 | u32 reg; |
219 | u32 phy_pd_addr = ANALOGIX_DP_PHY_PD; | ||
220 | |||
221 | if (dp->plat_data && (dp->plat_data->dev_type == RK3288_DP)) | ||
222 | phy_pd_addr = ANALOGIX_DP_PD; | ||
209 | 223 | ||
210 | switch (block) { | 224 | switch (block) { |
211 | case AUX_BLOCK: | 225 | case AUX_BLOCK: |
212 | if (enable) { | 226 | if (enable) { |
213 | reg = readl(dp->reg_base + ANALOGIX_DP_PHY_PD); | 227 | reg = readl(dp->reg_base + phy_pd_addr); |
214 | reg |= AUX_PD; | 228 | reg |= AUX_PD; |
215 | writel(reg, dp->reg_base + ANALOGIX_DP_PHY_PD); | 229 | writel(reg, dp->reg_base + phy_pd_addr); |
216 | } else { | 230 | } else { |
217 | reg = readl(dp->reg_base + ANALOGIX_DP_PHY_PD); | 231 | reg = readl(dp->reg_base + phy_pd_addr); |
218 | reg &= ~AUX_PD; | 232 | reg &= ~AUX_PD; |
219 | writel(reg, dp->reg_base + ANALOGIX_DP_PHY_PD); | 233 | writel(reg, dp->reg_base + phy_pd_addr); |
220 | } | 234 | } |
221 | break; | 235 | break; |
222 | case CH0_BLOCK: | 236 | case CH0_BLOCK: |
223 | if (enable) { | 237 | if (enable) { |
224 | reg = readl(dp->reg_base + ANALOGIX_DP_PHY_PD); | 238 | reg = readl(dp->reg_base + phy_pd_addr); |
225 | reg |= CH0_PD; | 239 | reg |= CH0_PD; |
226 | writel(reg, dp->reg_base + ANALOGIX_DP_PHY_PD); | 240 | writel(reg, dp->reg_base + phy_pd_addr); |
227 | } else { | 241 | } else { |
228 | reg = readl(dp->reg_base + ANALOGIX_DP_PHY_PD); | 242 | reg = readl(dp->reg_base + phy_pd_addr); |
229 | reg &= ~CH0_PD; | 243 | reg &= ~CH0_PD; |
230 | writel(reg, dp->reg_base + ANALOGIX_DP_PHY_PD); | 244 | writel(reg, dp->reg_base + phy_pd_addr); |
231 | } | 245 | } |
232 | break; | 246 | break; |
233 | case CH1_BLOCK: | 247 | case CH1_BLOCK: |
234 | if (enable) { | 248 | if (enable) { |
235 | reg = readl(dp->reg_base + ANALOGIX_DP_PHY_PD); | 249 | reg = readl(dp->reg_base + phy_pd_addr); |
236 | reg |= CH1_PD; | 250 | reg |= CH1_PD; |
237 | writel(reg, dp->reg_base + ANALOGIX_DP_PHY_PD); | 251 | writel(reg, dp->reg_base + phy_pd_addr); |
238 | } else { | 252 | } else { |
239 | reg = readl(dp->reg_base + ANALOGIX_DP_PHY_PD); | 253 | reg = readl(dp->reg_base + phy_pd_addr); |
240 | reg &= ~CH1_PD; | 254 | reg &= ~CH1_PD; |
241 | writel(reg, dp->reg_base + ANALOGIX_DP_PHY_PD); | 255 | writel(reg, dp->reg_base + phy_pd_addr); |
242 | } | 256 | } |
243 | break; | 257 | break; |
244 | case CH2_BLOCK: | 258 | case CH2_BLOCK: |
245 | if (enable) { | 259 | if (enable) { |
246 | reg = readl(dp->reg_base + ANALOGIX_DP_PHY_PD); | 260 | reg = readl(dp->reg_base + phy_pd_addr); |
247 | reg |= CH2_PD; | 261 | reg |= CH2_PD; |
248 | writel(reg, dp->reg_base + ANALOGIX_DP_PHY_PD); | 262 | writel(reg, dp->reg_base + phy_pd_addr); |
249 | } else { | 263 | } else { |
250 | reg = readl(dp->reg_base + ANALOGIX_DP_PHY_PD); | 264 | reg = readl(dp->reg_base + phy_pd_addr); |
251 | reg &= ~CH2_PD; | 265 | reg &= ~CH2_PD; |
252 | writel(reg, dp->reg_base + ANALOGIX_DP_PHY_PD); | 266 | writel(reg, dp->reg_base + phy_pd_addr); |
253 | } | 267 | } |
254 | break; | 268 | break; |
255 | case CH3_BLOCK: | 269 | case CH3_BLOCK: |
256 | if (enable) { | 270 | if (enable) { |
257 | reg = readl(dp->reg_base + ANALOGIX_DP_PHY_PD); | 271 | reg = readl(dp->reg_base + phy_pd_addr); |
258 | reg |= CH3_PD; | 272 | reg |= CH3_PD; |
259 | writel(reg, dp->reg_base + ANALOGIX_DP_PHY_PD); | 273 | writel(reg, dp->reg_base + phy_pd_addr); |
260 | } else { | 274 | } else { |
261 | reg = readl(dp->reg_base + ANALOGIX_DP_PHY_PD); | 275 | reg = readl(dp->reg_base + phy_pd_addr); |
262 | reg &= ~CH3_PD; | 276 | reg &= ~CH3_PD; |
263 | writel(reg, dp->reg_base + ANALOGIX_DP_PHY_PD); | 277 | writel(reg, dp->reg_base + phy_pd_addr); |
264 | } | 278 | } |
265 | break; | 279 | break; |
266 | case ANALOG_TOTAL: | 280 | case ANALOG_TOTAL: |
267 | if (enable) { | 281 | if (enable) { |
268 | reg = readl(dp->reg_base + ANALOGIX_DP_PHY_PD); | 282 | reg = readl(dp->reg_base + phy_pd_addr); |
269 | reg |= DP_PHY_PD; | 283 | reg |= DP_PHY_PD; |
270 | writel(reg, dp->reg_base + ANALOGIX_DP_PHY_PD); | 284 | writel(reg, dp->reg_base + phy_pd_addr); |
271 | } else { | 285 | } else { |
272 | reg = readl(dp->reg_base + ANALOGIX_DP_PHY_PD); | 286 | reg = readl(dp->reg_base + phy_pd_addr); |
273 | reg &= ~DP_PHY_PD; | 287 | reg &= ~DP_PHY_PD; |
274 | writel(reg, dp->reg_base + ANALOGIX_DP_PHY_PD); | 288 | writel(reg, dp->reg_base + phy_pd_addr); |
275 | } | 289 | } |
276 | break; | 290 | break; |
277 | case POWER_ALL: | 291 | case POWER_ALL: |
278 | if (enable) { | 292 | if (enable) { |
279 | reg = DP_PHY_PD | AUX_PD | CH3_PD | CH2_PD | | 293 | reg = DP_PHY_PD | AUX_PD | CH3_PD | CH2_PD | |
280 | CH1_PD | CH0_PD; | 294 | CH1_PD | CH0_PD; |
281 | writel(reg, dp->reg_base + ANALOGIX_DP_PHY_PD); | 295 | writel(reg, dp->reg_base + phy_pd_addr); |
282 | } else { | 296 | } else { |
283 | writel(0x00, dp->reg_base + ANALOGIX_DP_PHY_PD); | 297 | writel(0x00, dp->reg_base + phy_pd_addr); |
284 | } | 298 | } |
285 | break; | 299 | break; |
286 | default: | 300 | default: |
@@ -399,8 +413,14 @@ void analogix_dp_init_aux(struct analogix_dp_device *dp) | |||
399 | analogix_dp_reset_aux(dp); | 413 | analogix_dp_reset_aux(dp); |
400 | 414 | ||
401 | /* Disable AUX transaction H/W retry */ | 415 | /* Disable AUX transaction H/W retry */ |
402 | reg = AUX_BIT_PERIOD_EXPECTED_DELAY(3) | AUX_HW_RETRY_COUNT_SEL(0) | | 416 | if (dp->plat_data && (dp->plat_data->dev_type == RK3288_DP)) |
403 | AUX_HW_RETRY_INTERVAL_600_MICROSECONDS; | 417 | reg = AUX_BIT_PERIOD_EXPECTED_DELAY(0) | |
418 | AUX_HW_RETRY_COUNT_SEL(3) | | ||
419 | AUX_HW_RETRY_INTERVAL_600_MICROSECONDS; | ||
420 | else | ||
421 | reg = AUX_BIT_PERIOD_EXPECTED_DELAY(3) | | ||
422 | AUX_HW_RETRY_COUNT_SEL(0) | | ||
423 | AUX_HW_RETRY_INTERVAL_600_MICROSECONDS; | ||
404 | writel(reg, dp->reg_base + ANALOGIX_DP_AUX_HW_RETRY_CTL); | 424 | writel(reg, dp->reg_base + ANALOGIX_DP_AUX_HW_RETRY_CTL); |
405 | 425 | ||
406 | /* Receive AUX Channel DEFER commands equal to DEFFER_COUNT*64 */ | 426 | /* Receive AUX Channel DEFER commands equal to DEFFER_COUNT*64 */ |
diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.h b/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.h index 738db4c474a0..337912b0aeab 100644 --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.h +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.h | |||
@@ -22,6 +22,14 @@ | |||
22 | #define ANALOGIX_DP_VIDEO_CTL_8 0x3C | 22 | #define ANALOGIX_DP_VIDEO_CTL_8 0x3C |
23 | #define ANALOGIX_DP_VIDEO_CTL_10 0x44 | 23 | #define ANALOGIX_DP_VIDEO_CTL_10 0x44 |
24 | 24 | ||
25 | #define ANALOGIX_DP_PLL_REG_1 0xfc | ||
26 | #define ANALOGIX_DP_PLL_REG_2 0x9e4 | ||
27 | #define ANALOGIX_DP_PLL_REG_3 0x9e8 | ||
28 | #define ANALOGIX_DP_PLL_REG_4 0x9ec | ||
29 | #define ANALOGIX_DP_PLL_REG_5 0xa00 | ||
30 | |||
31 | #define ANALOGIX_DP_PD 0x12c | ||
32 | |||
25 | #define ANALOGIX_DP_LANE_MAP 0x35C | 33 | #define ANALOGIX_DP_LANE_MAP 0x35C |
26 | 34 | ||
27 | #define ANALOGIX_DP_ANALOG_CTL_1 0x370 | 35 | #define ANALOGIX_DP_ANALOG_CTL_1 0x370 |
@@ -154,6 +162,10 @@ | |||
154 | #define VSYNC_POLARITY_CFG (0x1 << 1) | 162 | #define VSYNC_POLARITY_CFG (0x1 << 1) |
155 | #define HSYNC_POLARITY_CFG (0x1 << 0) | 163 | #define HSYNC_POLARITY_CFG (0x1 << 0) |
156 | 164 | ||
165 | /* ANALOGIX_DP_PLL_REG_1 */ | ||
166 | #define REF_CLK_24M (0x1 << 1) | ||
167 | #define REF_CLK_27M (0x0 << 1) | ||
168 | |||
157 | /* ANALOGIX_DP_LANE_MAP */ | 169 | /* ANALOGIX_DP_LANE_MAP */ |
158 | #define LANE3_MAP_LOGIC_LANE_0 (0x0 << 6) | 170 | #define LANE3_MAP_LOGIC_LANE_0 (0x0 << 6) |
159 | #define LANE3_MAP_LOGIC_LANE_1 (0x1 << 6) | 171 | #define LANE3_MAP_LOGIC_LANE_1 (0x1 << 6) |