1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (C) 2015 Broadcom
4 * Copyright (c) 2014 The Linux Foundation. All rights reserved.
5 * Copyright (C) 2013 Red Hat
6 * Author: Rob Clark <robdclark@gmail.com>
11 #include "vc4_hdmi_regs.h"
13 #define VC4_HDMI_TX_PHY_RESET_CTL_PLL_RESETB BIT(5)
14 #define VC4_HDMI_TX_PHY_RESET_CTL_PLLDIV_RESETB BIT(4)
15 #define VC4_HDMI_TX_PHY_RESET_CTL_TX_CK_RESET BIT(3)
16 #define VC4_HDMI_TX_PHY_RESET_CTL_TX_2_RESET BIT(2)
17 #define VC4_HDMI_TX_PHY_RESET_CTL_TX_1_RESET BIT(1)
18 #define VC4_HDMI_TX_PHY_RESET_CTL_TX_0_RESET BIT(0)
20 #define VC4_HDMI_TX_PHY_POWERDOWN_CTL_RNDGEN_PWRDN BIT(4)
22 #define VC4_HDMI_TX_PHY_CTL_0_PREEMP_2_PREEMP_SHIFT 29
23 #define VC4_HDMI_TX_PHY_CTL_0_PREEMP_2_PREEMP_MASK VC4_MASK(31, 29)
24 #define VC4_HDMI_TX_PHY_CTL_0_PREEMP_2_MAINDRV_SHIFT 24
25 #define VC4_HDMI_TX_PHY_CTL_0_PREEMP_2_MAINDRV_MASK VC4_MASK(28, 24)
26 #define VC4_HDMI_TX_PHY_CTL_0_PREEMP_1_PREEMP_SHIFT 21
27 #define VC4_HDMI_TX_PHY_CTL_0_PREEMP_1_PREEMP_MASK VC4_MASK(23, 21)
28 #define VC4_HDMI_TX_PHY_CTL_0_PREEMP_1_MAINDRV_SHIFT 16
29 #define VC4_HDMI_TX_PHY_CTL_0_PREEMP_1_MAINDRV_MASK VC4_MASK(20, 16)
30 #define VC4_HDMI_TX_PHY_CTL_0_PREEMP_0_PREEMP_SHIFT 13
31 #define VC4_HDMI_TX_PHY_CTL_0_PREEMP_0_PREEMP_MASK VC4_MASK(15, 13)
32 #define VC4_HDMI_TX_PHY_CTL_0_PREEMP_0_MAINDRV_SHIFT 8
33 #define VC4_HDMI_TX_PHY_CTL_0_PREEMP_0_MAINDRV_MASK VC4_MASK(12, 8)
34 #define VC4_HDMI_TX_PHY_CTL_0_PREEMP_CK_PREEMP_SHIFT 5
35 #define VC4_HDMI_TX_PHY_CTL_0_PREEMP_CK_PREEMP_MASK VC4_MASK(7, 5)
36 #define VC4_HDMI_TX_PHY_CTL_0_PREEMP_CK_MAINDRV_SHIFT 0
37 #define VC4_HDMI_TX_PHY_CTL_0_PREEMP_CK_MAINDRV_MASK VC4_MASK(4, 0)
39 #define VC4_HDMI_TX_PHY_CTL_1_RES_SEL_DATA2_SHIFT 15
40 #define VC4_HDMI_TX_PHY_CTL_1_RES_SEL_DATA2_MASK VC4_MASK(19, 15)
41 #define VC4_HDMI_TX_PHY_CTL_1_RES_SEL_DATA1_SHIFT 10
42 #define VC4_HDMI_TX_PHY_CTL_1_RES_SEL_DATA1_MASK VC4_MASK(14, 10)
43 #define VC4_HDMI_TX_PHY_CTL_1_RES_SEL_DATA0_SHIFT 5
44 #define VC4_HDMI_TX_PHY_CTL_1_RES_SEL_DATA0_MASK VC4_MASK(9, 5)
45 #define VC4_HDMI_TX_PHY_CTL_1_RES_SEL_CK_SHIFT 0
46 #define VC4_HDMI_TX_PHY_CTL_1_RES_SEL_CK_MASK VC4_MASK(4, 0)
48 #define VC4_HDMI_TX_PHY_CTL_2_VCO_GAIN_SHIFT 16
49 #define VC4_HDMI_TX_PHY_CTL_2_VCO_GAIN_MASK VC4_MASK(19, 16)
50 #define VC4_HDMI_TX_PHY_CTL_2_TERM_RES_SELDATA2_SHIFT 12
51 #define VC4_HDMI_TX_PHY_CTL_2_TERM_RES_SELDATA2_MASK VC4_MASK(15, 12)
52 #define VC4_HDMI_TX_PHY_CTL_2_TERM_RES_SELDATA1_SHIFT 8
53 #define VC4_HDMI_TX_PHY_CTL_2_TERM_RES_SELDATA1_MASK VC4_MASK(11, 8)
54 #define VC4_HDMI_TX_PHY_CTL_2_TERM_RES_SELDATA0_SHIFT 4
55 #define VC4_HDMI_TX_PHY_CTL_2_TERM_RES_SELDATA0_MASK VC4_MASK(7, 4)
56 #define VC4_HDMI_TX_PHY_CTL_2_TERM_RES_SELCK_SHIFT 0
57 #define VC4_HDMI_TX_PHY_CTL_2_TERM_RES_SELCK_MASK VC4_MASK(3, 0)
59 #define VC4_HDMI_TX_PHY_CTL_3_RP_SHIFT 17
60 #define VC4_HDMI_TX_PHY_CTL_3_RP_MASK VC4_MASK(19, 17)
61 #define VC4_HDMI_TX_PHY_CTL_3_RZ_SHIFT 12
62 #define VC4_HDMI_TX_PHY_CTL_3_RZ_MASK VC4_MASK(16, 12)
63 #define VC4_HDMI_TX_PHY_CTL_3_CP1_SHIFT 10
64 #define VC4_HDMI_TX_PHY_CTL_3_CP1_MASK VC4_MASK(11, 10)
65 #define VC4_HDMI_TX_PHY_CTL_3_CP_SHIFT 8
66 #define VC4_HDMI_TX_PHY_CTL_3_CP_MASK VC4_MASK(9, 8)
67 #define VC4_HDMI_TX_PHY_CTL_3_CZ_SHIFT 6
68 #define VC4_HDMI_TX_PHY_CTL_3_CZ_MASK VC4_MASK(7, 6)
69 #define VC4_HDMI_TX_PHY_CTL_3_ICP_SHIFT 0
70 #define VC4_HDMI_TX_PHY_CTL_3_ICP_MASK VC4_MASK(5, 0)
72 #define VC4_HDMI_TX_PHY_PLL_CTL_0_MASH11_MODE BIT(13)
73 #define VC4_HDMI_TX_PHY_PLL_CTL_0_VC_RANGE_EN BIT(12)
74 #define VC4_HDMI_TX_PHY_PLL_CTL_0_EMULATE_VC_LOW BIT(11)
75 #define VC4_HDMI_TX_PHY_PLL_CTL_0_EMULATE_VC_HIGH BIT(10)
76 #define VC4_HDMI_TX_PHY_PLL_CTL_0_VCO_SEL_SHIFT 9
77 #define VC4_HDMI_TX_PHY_PLL_CTL_0_VCO_SEL_MASK VC4_MASK(9, 9)
78 #define VC4_HDMI_TX_PHY_PLL_CTL_0_VCO_FB_DIV2 BIT(8)
79 #define VC4_HDMI_TX_PHY_PLL_CTL_0_VCO_POST_DIV2 BIT(7)
80 #define VC4_HDMI_TX_PHY_PLL_CTL_0_VCO_CONT_EN BIT(6)
81 #define VC4_HDMI_TX_PHY_PLL_CTL_0_ENA_VCO_CLK BIT(5)
83 #define VC4_HDMI_TX_PHY_PLL_CTL_1_CPP_SHIFT 16
84 #define VC4_HDMI_TX_PHY_PLL_CTL_1_CPP_MASK VC4_MASK(27, 16)
85 #define VC4_HDMI_TX_PHY_PLL_CTL_1_FREQ_DOUBLER_DELAY_SHIFT 14
86 #define VC4_HDMI_TX_PHY_PLL_CTL_1_FREQ_DOUBLER_DELAY_MASK VC4_MASK(15, 14)
87 #define VC4_HDMI_TX_PHY_PLL_CTL_1_FREQ_DOUBLER_ENABLE BIT(13)
88 #define VC4_HDMI_TX_PHY_PLL_CTL_1_POST_RST_SEL_SHIFT 11
89 #define VC4_HDMI_TX_PHY_PLL_CTL_1_POST_RST_SEL_MASK VC4_MASK(12, 11)
91 #define VC4_HDMI_TX_PHY_CLK_DIV_VCO_SHIFT 8
92 #define VC4_HDMI_TX_PHY_CLK_DIV_VCO_MASK VC4_MASK(15, 8)
94 #define VC4_HDMI_TX_PHY_PLL_CFG_PDIV_SHIFT 0
95 #define VC4_HDMI_TX_PHY_PLL_CFG_PDIV_MASK VC4_MASK(3, 0)
97 #define VC4_HDMI_TX_PHY_CHANNEL_SWAP_TXCK_OUT_SEL_MASK VC4_MASK(13, 12)
98 #define VC4_HDMI_TX_PHY_CHANNEL_SWAP_TXCK_OUT_SEL_SHIFT 12
99 #define VC4_HDMI_TX_PHY_CHANNEL_SWAP_TX2_OUT_SEL_MASK VC4_MASK(9, 8)
100 #define VC4_HDMI_TX_PHY_CHANNEL_SWAP_TX2_OUT_SEL_SHIFT 8
101 #define VC4_HDMI_TX_PHY_CHANNEL_SWAP_TX1_OUT_SEL_MASK VC4_MASK(5, 4)
102 #define VC4_HDMI_TX_PHY_CHANNEL_SWAP_TX1_OUT_SEL_SHIFT 4
103 #define VC4_HDMI_TX_PHY_CHANNEL_SWAP_TX0_OUT_SEL_MASK VC4_MASK(1, 0)
104 #define VC4_HDMI_TX_PHY_CHANNEL_SWAP_TX0_OUT_SEL_SHIFT 0
106 #define VC4_HDMI_TX_PHY_PLL_CALIBRATION_CONFIG_1_MIN_LIMIT_MASK VC4_MASK(27, 0)
107 #define VC4_HDMI_TX_PHY_PLL_CALIBRATION_CONFIG_1_MIN_LIMIT_SHIFT 0
109 #define VC4_HDMI_TX_PHY_PLL_CALIBRATION_CONFIG_2_MAX_LIMIT_MASK VC4_MASK(27, 0)
110 #define VC4_HDMI_TX_PHY_PLL_CALIBRATION_CONFIG_2_MAX_LIMIT_SHIFT 0
112 #define VC4_HDMI_TX_PHY_PLL_CALIBRATION_CONFIG_4_STABLE_THRESHOLD_MASK VC4_MASK(31, 16)
113 #define VC4_HDMI_TX_PHY_PLL_CALIBRATION_CONFIG_4_STABLE_THRESHOLD_SHIFT 16
114 #define VC4_HDMI_TX_PHY_PLL_CALIBRATION_CONFIG_4_HOLD_THRESHOLD_MASK VC4_MASK(15, 0)
115 #define VC4_HDMI_TX_PHY_PLL_CALIBRATION_CONFIG_4_HOLD_THRESHOLD_SHIFT 0
117 #define VC4_HDMI_RM_CONTROL_EN_FREEZE_COUNTERS BIT(19)
118 #define VC4_HDMI_RM_CONTROL_EN_LOAD_INTEGRATOR BIT(17)
119 #define VC4_HDMI_RM_CONTROL_FREE_RUN BIT(4)
121 #define VC4_HDMI_RM_OFFSET_ONLY BIT(31)
122 #define VC4_HDMI_RM_OFFSET_OFFSET_SHIFT 0
123 #define VC4_HDMI_RM_OFFSET_OFFSET_MASK VC4_MASK(30, 0)
125 #define VC4_HDMI_RM_FORMAT_SHIFT_SHIFT 24
126 #define VC4_HDMI_RM_FORMAT_SHIFT_MASK VC4_MASK(25, 24)
128 #define OSCILLATOR_FREQUENCY 54000000
130 void vc4_hdmi_phy_init(struct vc4_hdmi
*vc4_hdmi
, struct drm_display_mode
*mode
)
132 /* PHY should be in reset, like
133 * vc4_hdmi_encoder_disable() does.
136 HDMI_WRITE(HDMI_TX_PHY_RESET_CTL
, 0xf << 16);
137 HDMI_WRITE(HDMI_TX_PHY_RESET_CTL
, 0);
140 void vc4_hdmi_phy_disable(struct vc4_hdmi
*vc4_hdmi
)
142 HDMI_WRITE(HDMI_TX_PHY_RESET_CTL
, 0xf << 16);
145 void vc4_hdmi_phy_rng_enable(struct vc4_hdmi
*vc4_hdmi
)
147 HDMI_WRITE(HDMI_TX_PHY_CTL_0
,
148 HDMI_READ(HDMI_TX_PHY_CTL_0
) &
149 ~VC4_HDMI_TX_PHY_RNG_PWRDN
);
152 void vc4_hdmi_phy_rng_disable(struct vc4_hdmi
*vc4_hdmi
)
154 HDMI_WRITE(HDMI_TX_PHY_CTL_0
,
155 HDMI_READ(HDMI_TX_PHY_CTL_0
) |
156 VC4_HDMI_TX_PHY_RNG_PWRDN
);
159 static unsigned long long
160 phy_get_vco_freq(unsigned long long clock
, u8
*vco_sel
, u8
*vco_div
)
162 unsigned long long vco_freq
= clock
;
163 unsigned int _vco_div
= 0;
164 unsigned int _vco_sel
= 0;
166 while (vco_freq
< 3000000000ULL) {
168 vco_freq
= clock
* _vco_div
* 10;
171 if (vco_freq
> 4500000000ULL)
180 static u8
phy_get_cp_current(unsigned long vco_freq
)
182 if (vco_freq
< 3700000000ULL)
188 static u32
phy_get_rm_offset(unsigned long long vco_freq
)
190 unsigned long long fref
= OSCILLATOR_FREQUENCY
;
193 /* RM offset is stored as 9.22 format */
194 offset
= vco_freq
* 2;
195 offset
= offset
<< 22;
196 do_div(offset
, fref
);
202 static u8
phy_get_vco_gain(unsigned long long vco_freq
)
204 if (vco_freq
< 3350000000ULL)
207 if (vco_freq
< 3700000000ULL)
210 if (vco_freq
< 4050000000ULL)
213 if (vco_freq
< 4800000000ULL)
216 if (vco_freq
< 5200000000ULL)
222 struct phy_lane_settings
{
229 u8 term_res_sel_data
;
232 struct phy_settings
{
233 unsigned long long min_rate
;
234 unsigned long long max_rate
;
235 struct phy_lane_settings channel
[3];
236 struct phy_lane_settings clock
;
239 static const struct phy_settings vc5_hdmi_phy_settings
[] = {
243 {{0x0, 0x0A}, 0x12, 0x0},
244 {{0x0, 0x0A}, 0x12, 0x0},
245 {{0x0, 0x0A}, 0x12, 0x0}
247 {{0x0, 0x0A}, 0x18, 0x0},
252 {{0x0, 0x09}, 0x12, 0x0},
253 {{0x0, 0x09}, 0x12, 0x0},
254 {{0x0, 0x09}, 0x12, 0x0}
256 {{0x0, 0x0C}, 0x18, 0x3},
261 {{0x0, 0x09}, 0x12, 0x0},
262 {{0x0, 0x09}, 0x12, 0x0},
263 {{0x0, 0x09}, 0x12, 0x0}
265 {{0x0, 0x0C}, 0x18, 0x3},
268 165000001, 250000000,
270 {{0x0, 0x0F}, 0x12, 0x1},
271 {{0x0, 0x0F}, 0x12, 0x1},
272 {{0x0, 0x0F}, 0x12, 0x1}
274 {{0x0, 0x0C}, 0x18, 0x3},
277 250000001, 340000000,
279 {{0x2, 0x0D}, 0x12, 0x1},
280 {{0x2, 0x0D}, 0x12, 0x1},
281 {{0x2, 0x0D}, 0x12, 0x1}
283 {{0x0, 0x0C}, 0x18, 0xF},
286 340000001, 450000000,
288 {{0x0, 0x1B}, 0x12, 0xF},
289 {{0x0, 0x1B}, 0x12, 0xF},
290 {{0x0, 0x1B}, 0x12, 0xF}
292 {{0x0, 0x0A}, 0x12, 0xF},
295 450000001, 600000000,
297 {{0x0, 0x1C}, 0x12, 0xF},
298 {{0x0, 0x1C}, 0x12, 0xF},
299 {{0x0, 0x1C}, 0x12, 0xF}
301 {{0x0, 0x0B}, 0x13, 0xF},
305 static const struct phy_settings
*phy_get_settings(unsigned long long tmds_rate
)
307 unsigned int count
= ARRAY_SIZE(vc5_hdmi_phy_settings
);
310 for (i
= 0; i
< count
; i
++) {
311 const struct phy_settings
*s
= &vc5_hdmi_phy_settings
[i
];
313 if (tmds_rate
>= s
->min_rate
&& tmds_rate
<= s
->max_rate
)
318 * If the pixel clock exceeds our max setting, try the max
321 return &vc5_hdmi_phy_settings
[count
- 1];
324 static const struct phy_lane_settings
*
325 phy_get_channel_settings(enum vc4_hdmi_phy_channel chan
,
326 unsigned long long tmds_rate
)
328 const struct phy_settings
*settings
= phy_get_settings(tmds_rate
);
330 if (chan
== PHY_LANE_CK
)
331 return &settings
->clock
;
333 return &settings
->channel
[chan
];
336 static void vc5_hdmi_reset_phy(struct vc4_hdmi
*vc4_hdmi
)
338 HDMI_WRITE(HDMI_TX_PHY_RESET_CTL
, 0x0f);
339 HDMI_WRITE(HDMI_TX_PHY_POWERDOWN_CTL
, BIT(10));
342 void vc5_hdmi_phy_init(struct vc4_hdmi
*vc4_hdmi
, struct drm_display_mode
*mode
)
344 const struct phy_lane_settings
*chan0_settings
, *chan1_settings
, *chan2_settings
, *clock_settings
;
345 const struct vc4_hdmi_variant
*variant
= vc4_hdmi
->variant
;
346 unsigned long long pixel_freq
= mode
->clock
* 1000;
347 unsigned long long vco_freq
;
348 unsigned char word_sel
;
351 vco_freq
= phy_get_vco_freq(pixel_freq
, &vco_sel
, &vco_div
);
353 vc5_hdmi_reset_phy(vc4_hdmi
);
355 HDMI_WRITE(HDMI_TX_PHY_POWERDOWN_CTL
,
356 VC4_HDMI_TX_PHY_POWERDOWN_CTL_RNDGEN_PWRDN
);
358 HDMI_WRITE(HDMI_TX_PHY_RESET_CTL
,
359 HDMI_READ(HDMI_TX_PHY_RESET_CTL
) &
360 ~VC4_HDMI_TX_PHY_RESET_CTL_TX_0_RESET
&
361 ~VC4_HDMI_TX_PHY_RESET_CTL_TX_1_RESET
&
362 ~VC4_HDMI_TX_PHY_RESET_CTL_TX_2_RESET
&
363 ~VC4_HDMI_TX_PHY_RESET_CTL_TX_CK_RESET
);
365 HDMI_WRITE(HDMI_RM_CONTROL
,
366 HDMI_READ(HDMI_RM_CONTROL
) |
367 VC4_HDMI_RM_CONTROL_EN_FREEZE_COUNTERS
|
368 VC4_HDMI_RM_CONTROL_EN_LOAD_INTEGRATOR
|
369 VC4_HDMI_RM_CONTROL_FREE_RUN
);
371 HDMI_WRITE(HDMI_TX_PHY_PLL_CALIBRATION_CONFIG_1
,
372 (HDMI_READ(HDMI_TX_PHY_PLL_CALIBRATION_CONFIG_1
) &
373 ~VC4_HDMI_TX_PHY_PLL_CALIBRATION_CONFIG_1_MIN_LIMIT_MASK
) |
374 VC4_SET_FIELD(0, VC4_HDMI_TX_PHY_PLL_CALIBRATION_CONFIG_1_MIN_LIMIT
));
376 HDMI_WRITE(HDMI_TX_PHY_PLL_CALIBRATION_CONFIG_2
,
377 (HDMI_READ(HDMI_TX_PHY_PLL_CALIBRATION_CONFIG_2
) &
378 ~VC4_HDMI_TX_PHY_PLL_CALIBRATION_CONFIG_2_MAX_LIMIT_MASK
) |
379 VC4_SET_FIELD(0, VC4_HDMI_TX_PHY_PLL_CALIBRATION_CONFIG_2_MAX_LIMIT
));
381 HDMI_WRITE(HDMI_RM_OFFSET
,
382 VC4_SET_FIELD(phy_get_rm_offset(vco_freq
),
383 VC4_HDMI_RM_OFFSET_OFFSET
) |
384 VC4_HDMI_RM_OFFSET_ONLY
);
386 HDMI_WRITE(HDMI_TX_PHY_CLK_DIV
,
387 VC4_SET_FIELD(vco_div
, VC4_HDMI_TX_PHY_CLK_DIV_VCO
));
389 HDMI_WRITE(HDMI_TX_PHY_PLL_CALIBRATION_CONFIG_4
,
390 VC4_SET_FIELD(0xe147, VC4_HDMI_TX_PHY_PLL_CALIBRATION_CONFIG_4_HOLD_THRESHOLD
) |
391 VC4_SET_FIELD(0xe14, VC4_HDMI_TX_PHY_PLL_CALIBRATION_CONFIG_4_STABLE_THRESHOLD
));
393 HDMI_WRITE(HDMI_TX_PHY_PLL_CTL_0
,
394 VC4_HDMI_TX_PHY_PLL_CTL_0_ENA_VCO_CLK
|
395 VC4_HDMI_TX_PHY_PLL_CTL_0_VCO_CONT_EN
|
396 VC4_HDMI_TX_PHY_PLL_CTL_0_MASH11_MODE
|
397 VC4_SET_FIELD(vco_sel
, VC4_HDMI_TX_PHY_PLL_CTL_0_VCO_SEL
));
399 HDMI_WRITE(HDMI_TX_PHY_PLL_CTL_1
,
400 HDMI_READ(HDMI_TX_PHY_PLL_CTL_1
) |
401 VC4_HDMI_TX_PHY_PLL_CTL_1_FREQ_DOUBLER_ENABLE
|
402 VC4_SET_FIELD(3, VC4_HDMI_TX_PHY_PLL_CTL_1_POST_RST_SEL
) |
403 VC4_SET_FIELD(1, VC4_HDMI_TX_PHY_PLL_CTL_1_FREQ_DOUBLER_DELAY
) |
404 VC4_SET_FIELD(0x8a, VC4_HDMI_TX_PHY_PLL_CTL_1_CPP
));
406 HDMI_WRITE(HDMI_RM_FORMAT
,
407 HDMI_READ(HDMI_RM_FORMAT
) |
408 VC4_SET_FIELD(2, VC4_HDMI_RM_FORMAT_SHIFT
));
410 HDMI_WRITE(HDMI_TX_PHY_PLL_CFG
,
411 HDMI_READ(HDMI_TX_PHY_PLL_CFG
) |
412 VC4_SET_FIELD(1, VC4_HDMI_TX_PHY_PLL_CFG_PDIV
));
414 if (pixel_freq
>= 340000000)
418 HDMI_WRITE(HDMI_TX_PHY_TMDS_CLK_WORD_SEL
, word_sel
);
420 HDMI_WRITE(HDMI_TX_PHY_CTL_3
,
421 VC4_SET_FIELD(phy_get_cp_current(vco_freq
),
422 VC4_HDMI_TX_PHY_CTL_3_ICP
) |
423 VC4_SET_FIELD(1, VC4_HDMI_TX_PHY_CTL_3_CP
) |
424 VC4_SET_FIELD(1, VC4_HDMI_TX_PHY_CTL_3_CP1
) |
425 VC4_SET_FIELD(3, VC4_HDMI_TX_PHY_CTL_3_CZ
) |
426 VC4_SET_FIELD(4, VC4_HDMI_TX_PHY_CTL_3_RP
) |
427 VC4_SET_FIELD(6, VC4_HDMI_TX_PHY_CTL_3_RZ
));
430 phy_get_channel_settings(variant
->phy_lane_mapping
[PHY_LANE_0
],
433 phy_get_channel_settings(variant
->phy_lane_mapping
[PHY_LANE_1
],
436 phy_get_channel_settings(variant
->phy_lane_mapping
[PHY_LANE_2
],
439 phy_get_channel_settings(variant
->phy_lane_mapping
[PHY_LANE_CK
],
442 HDMI_WRITE(HDMI_TX_PHY_CTL_0
,
443 VC4_SET_FIELD(chan0_settings
->amplitude
.preemphasis
,
444 VC4_HDMI_TX_PHY_CTL_0_PREEMP_0_PREEMP
) |
445 VC4_SET_FIELD(chan0_settings
->amplitude
.main_driver
,
446 VC4_HDMI_TX_PHY_CTL_0_PREEMP_0_MAINDRV
) |
447 VC4_SET_FIELD(chan1_settings
->amplitude
.preemphasis
,
448 VC4_HDMI_TX_PHY_CTL_0_PREEMP_1_PREEMP
) |
449 VC4_SET_FIELD(chan1_settings
->amplitude
.main_driver
,
450 VC4_HDMI_TX_PHY_CTL_0_PREEMP_1_MAINDRV
) |
451 VC4_SET_FIELD(chan2_settings
->amplitude
.preemphasis
,
452 VC4_HDMI_TX_PHY_CTL_0_PREEMP_2_PREEMP
) |
453 VC4_SET_FIELD(chan2_settings
->amplitude
.main_driver
,
454 VC4_HDMI_TX_PHY_CTL_0_PREEMP_2_MAINDRV
) |
455 VC4_SET_FIELD(clock_settings
->amplitude
.preemphasis
,
456 VC4_HDMI_TX_PHY_CTL_0_PREEMP_CK_PREEMP
) |
457 VC4_SET_FIELD(clock_settings
->amplitude
.main_driver
,
458 VC4_HDMI_TX_PHY_CTL_0_PREEMP_CK_MAINDRV
));
460 HDMI_WRITE(HDMI_TX_PHY_CTL_1
,
461 HDMI_READ(HDMI_TX_PHY_CTL_1
) |
462 VC4_SET_FIELD(chan0_settings
->res_sel_data
,
463 VC4_HDMI_TX_PHY_CTL_1_RES_SEL_DATA0
) |
464 VC4_SET_FIELD(chan1_settings
->res_sel_data
,
465 VC4_HDMI_TX_PHY_CTL_1_RES_SEL_DATA1
) |
466 VC4_SET_FIELD(chan2_settings
->res_sel_data
,
467 VC4_HDMI_TX_PHY_CTL_1_RES_SEL_DATA2
) |
468 VC4_SET_FIELD(clock_settings
->res_sel_data
,
469 VC4_HDMI_TX_PHY_CTL_1_RES_SEL_CK
));
471 HDMI_WRITE(HDMI_TX_PHY_CTL_2
,
472 VC4_SET_FIELD(chan0_settings
->term_res_sel_data
,
473 VC4_HDMI_TX_PHY_CTL_2_TERM_RES_SELDATA0
) |
474 VC4_SET_FIELD(chan1_settings
->term_res_sel_data
,
475 VC4_HDMI_TX_PHY_CTL_2_TERM_RES_SELDATA1
) |
476 VC4_SET_FIELD(chan2_settings
->term_res_sel_data
,
477 VC4_HDMI_TX_PHY_CTL_2_TERM_RES_SELDATA2
) |
478 VC4_SET_FIELD(clock_settings
->term_res_sel_data
,
479 VC4_HDMI_TX_PHY_CTL_2_TERM_RES_SELCK
) |
480 VC4_SET_FIELD(phy_get_vco_gain(vco_freq
),
481 VC4_HDMI_TX_PHY_CTL_2_VCO_GAIN
));
483 HDMI_WRITE(HDMI_TX_PHY_CHANNEL_SWAP
,
484 VC4_SET_FIELD(variant
->phy_lane_mapping
[PHY_LANE_0
],
485 VC4_HDMI_TX_PHY_CHANNEL_SWAP_TX0_OUT_SEL
) |
486 VC4_SET_FIELD(variant
->phy_lane_mapping
[PHY_LANE_1
],
487 VC4_HDMI_TX_PHY_CHANNEL_SWAP_TX1_OUT_SEL
) |
488 VC4_SET_FIELD(variant
->phy_lane_mapping
[PHY_LANE_2
],
489 VC4_HDMI_TX_PHY_CHANNEL_SWAP_TX2_OUT_SEL
) |
490 VC4_SET_FIELD(variant
->phy_lane_mapping
[PHY_LANE_CK
],
491 VC4_HDMI_TX_PHY_CHANNEL_SWAP_TXCK_OUT_SEL
));
493 HDMI_WRITE(HDMI_TX_PHY_RESET_CTL
,
494 HDMI_READ(HDMI_TX_PHY_RESET_CTL
) &
495 ~(VC4_HDMI_TX_PHY_RESET_CTL_PLL_RESETB
|
496 VC4_HDMI_TX_PHY_RESET_CTL_PLLDIV_RESETB
));
498 HDMI_WRITE(HDMI_TX_PHY_RESET_CTL
,
499 HDMI_READ(HDMI_TX_PHY_RESET_CTL
) |
500 VC4_HDMI_TX_PHY_RESET_CTL_PLL_RESETB
|
501 VC4_HDMI_TX_PHY_RESET_CTL_PLLDIV_RESETB
);
504 void vc5_hdmi_phy_disable(struct vc4_hdmi
*vc4_hdmi
)
506 vc5_hdmi_reset_phy(vc4_hdmi
);
509 void vc5_hdmi_phy_rng_enable(struct vc4_hdmi
*vc4_hdmi
)
511 HDMI_WRITE(HDMI_TX_PHY_POWERDOWN_CTL
,
512 HDMI_READ(HDMI_TX_PHY_POWERDOWN_CTL
) &
513 ~VC4_HDMI_TX_PHY_POWERDOWN_CTL_RNDGEN_PWRDN
);
516 void vc5_hdmi_phy_rng_disable(struct vc4_hdmi
*vc4_hdmi
)
518 HDMI_WRITE(HDMI_TX_PHY_POWERDOWN_CTL
,
519 HDMI_READ(HDMI_TX_PHY_POWERDOWN_CTL
) |
520 VC4_HDMI_TX_PHY_POWERDOWN_CTL_RNDGEN_PWRDN
);