aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c76
-rw-r--r--drivers/gpu/drm/bridge/analogix/analogix_dp_reg.h12
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)