Skip to content

Commit 0ee5a40

Browse files
Mateusz Kwiatkowskimripard
authored andcommitted
drm/vc4: hdmi: Fix timings for interlaced modes
Increase the number of post-sync blanking lines on odd fields instead of decreasing it on even fields. This makes the total number of lines properly match the modelines. Additionally fix the value of PV_VCONTROL_ODD_DELAY, which did not take pixels_per_clock into account, causing some displays to invert the fields when driven by bcm2711. Fixes: 682e62c ("drm/vc4: Fix support for interlaced modes on HDMI.") Signed-off-by: Mateusz Kwiatkowski <kfyatek+publicgit@gmail.com> Link: https://lore.kernel.org/r/20220613144800.326124-31-maxime@cerno.tech Signed-off-by: Maxime Ripard <maxime@cerno.tech>
1 parent 5731f7a commit 0ee5a40

File tree

2 files changed

+10
-9
lines changed

2 files changed

+10
-9
lines changed

drivers/gpu/drm/vc4/vc4_crtc.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -347,7 +347,8 @@ static void vc4_crtc_config_pv(struct drm_crtc *crtc, struct drm_encoder *encode
347347
PV_HORZB_HACTIVE));
348348

349349
CRTC_WRITE(PV_VERTA,
350-
VC4_SET_FIELD(mode->crtc_vtotal - mode->crtc_vsync_end,
350+
VC4_SET_FIELD(mode->crtc_vtotal - mode->crtc_vsync_end +
351+
interlace,
351352
PV_VERTA_VBP) |
352353
VC4_SET_FIELD(mode->crtc_vsync_end - mode->crtc_vsync_start,
353354
PV_VERTA_VSYNC));
@@ -359,7 +360,7 @@ static void vc4_crtc_config_pv(struct drm_crtc *crtc, struct drm_encoder *encode
359360
if (interlace) {
360361
CRTC_WRITE(PV_VERTA_EVEN,
361362
VC4_SET_FIELD(mode->crtc_vtotal -
362-
mode->crtc_vsync_end - 1,
363+
mode->crtc_vsync_end,
363364
PV_VERTA_VBP) |
364365
VC4_SET_FIELD(mode->crtc_vsync_end -
365366
mode->crtc_vsync_start,
@@ -379,7 +380,7 @@ static void vc4_crtc_config_pv(struct drm_crtc *crtc, struct drm_encoder *encode
379380
PV_VCONTROL_CONTINUOUS |
380381
(is_dsi ? PV_VCONTROL_DSI : 0) |
381382
PV_VCONTROL_INTERLACE |
382-
VC4_SET_FIELD(mode->htotal * pixel_rep / 2,
383+
VC4_SET_FIELD(mode->htotal * pixel_rep / (2 * ppc),
383384
PV_VCONTROL_ODD_DELAY));
384385
CRTC_WRITE(PV_VSYNCD_EVEN, 0);
385386
} else {

drivers/gpu/drm/vc4/vc4_hdmi.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -984,12 +984,12 @@ static void vc4_hdmi_set_timings(struct vc4_hdmi *vc4_hdmi,
984984
VC4_HDMI_VERTA_VFP) |
985985
VC4_SET_FIELD(mode->crtc_vdisplay, VC4_HDMI_VERTA_VAL));
986986
u32 vertb = (VC4_SET_FIELD(0, VC4_HDMI_VERTB_VSPO) |
987-
VC4_SET_FIELD(mode->crtc_vtotal - mode->crtc_vsync_end,
987+
VC4_SET_FIELD(mode->crtc_vtotal - mode->crtc_vsync_end +
988+
interlaced,
988989
VC4_HDMI_VERTB_VBP));
989990
u32 vertb_even = (VC4_SET_FIELD(0, VC4_HDMI_VERTB_VSPO) |
990991
VC4_SET_FIELD(mode->crtc_vtotal -
991-
mode->crtc_vsync_end -
992-
interlaced,
992+
mode->crtc_vsync_end,
993993
VC4_HDMI_VERTB_VBP));
994994
unsigned long flags;
995995

@@ -1037,12 +1037,12 @@ static void vc5_hdmi_set_timings(struct vc4_hdmi *vc4_hdmi,
10371037
VC5_HDMI_VERTA_VFP) |
10381038
VC4_SET_FIELD(mode->crtc_vdisplay, VC5_HDMI_VERTA_VAL));
10391039
u32 vertb = (VC4_SET_FIELD(0, VC5_HDMI_VERTB_VSPO) |
1040-
VC4_SET_FIELD(mode->crtc_vtotal - mode->crtc_vsync_end,
1040+
VC4_SET_FIELD(mode->crtc_vtotal - mode->crtc_vsync_end +
1041+
interlaced,
10411042
VC4_HDMI_VERTB_VBP));
10421043
u32 vertb_even = (VC4_SET_FIELD(0, VC5_HDMI_VERTB_VSPO) |
10431044
VC4_SET_FIELD(mode->crtc_vtotal -
1044-
mode->crtc_vsync_end -
1045-
interlaced,
1045+
mode->crtc_vsync_end,
10461046
VC4_HDMI_VERTB_VBP));
10471047
unsigned long flags;
10481048
unsigned char gcp;

0 commit comments

Comments
 (0)