drm/vc4: hdmi: Fix timings for interlaced modes
[ Upstream commit 0ee5a40152b15f200ed3a0d51e8aa782ea979c6a ]
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: 682e62c454
("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>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:

committed by
Greg Kroah-Hartman

parent
717325e814
commit
36f797a10f
@@ -346,7 +346,8 @@ static void vc4_crtc_config_pv(struct drm_crtc *crtc)
|
|||||||
PV_HORZB_HACTIVE));
|
PV_HORZB_HACTIVE));
|
||||||
|
|
||||||
CRTC_WRITE(PV_VERTA,
|
CRTC_WRITE(PV_VERTA,
|
||||||
VC4_SET_FIELD(mode->crtc_vtotal - mode->crtc_vsync_end,
|
VC4_SET_FIELD(mode->crtc_vtotal - mode->crtc_vsync_end +
|
||||||
|
interlace,
|
||||||
PV_VERTA_VBP) |
|
PV_VERTA_VBP) |
|
||||||
VC4_SET_FIELD(mode->crtc_vsync_end - mode->crtc_vsync_start,
|
VC4_SET_FIELD(mode->crtc_vsync_end - mode->crtc_vsync_start,
|
||||||
PV_VERTA_VSYNC));
|
PV_VERTA_VSYNC));
|
||||||
@@ -358,7 +359,7 @@ static void vc4_crtc_config_pv(struct drm_crtc *crtc)
|
|||||||
if (interlace) {
|
if (interlace) {
|
||||||
CRTC_WRITE(PV_VERTA_EVEN,
|
CRTC_WRITE(PV_VERTA_EVEN,
|
||||||
VC4_SET_FIELD(mode->crtc_vtotal -
|
VC4_SET_FIELD(mode->crtc_vtotal -
|
||||||
mode->crtc_vsync_end - 1,
|
mode->crtc_vsync_end,
|
||||||
PV_VERTA_VBP) |
|
PV_VERTA_VBP) |
|
||||||
VC4_SET_FIELD(mode->crtc_vsync_end -
|
VC4_SET_FIELD(mode->crtc_vsync_end -
|
||||||
mode->crtc_vsync_start,
|
mode->crtc_vsync_start,
|
||||||
@@ -378,7 +379,7 @@ static void vc4_crtc_config_pv(struct drm_crtc *crtc)
|
|||||||
PV_VCONTROL_CONTINUOUS |
|
PV_VCONTROL_CONTINUOUS |
|
||||||
(is_dsi ? PV_VCONTROL_DSI : 0) |
|
(is_dsi ? PV_VCONTROL_DSI : 0) |
|
||||||
PV_VCONTROL_INTERLACE |
|
PV_VCONTROL_INTERLACE |
|
||||||
VC4_SET_FIELD(mode->htotal * pixel_rep / 2,
|
VC4_SET_FIELD(mode->htotal * pixel_rep / (2 * ppc),
|
||||||
PV_VCONTROL_ODD_DELAY));
|
PV_VCONTROL_ODD_DELAY));
|
||||||
CRTC_WRITE(PV_VSYNCD_EVEN, 0);
|
CRTC_WRITE(PV_VSYNCD_EVEN, 0);
|
||||||
} else {
|
} else {
|
||||||
|
@@ -522,12 +522,12 @@ static void vc4_hdmi_set_timings(struct vc4_hdmi *vc4_hdmi,
|
|||||||
VC4_HDMI_VERTA_VFP) |
|
VC4_HDMI_VERTA_VFP) |
|
||||||
VC4_SET_FIELD(mode->crtc_vdisplay, VC4_HDMI_VERTA_VAL));
|
VC4_SET_FIELD(mode->crtc_vdisplay, VC4_HDMI_VERTA_VAL));
|
||||||
u32 vertb = (VC4_SET_FIELD(0, VC4_HDMI_VERTB_VSPO) |
|
u32 vertb = (VC4_SET_FIELD(0, VC4_HDMI_VERTB_VSPO) |
|
||||||
VC4_SET_FIELD(mode->crtc_vtotal - mode->crtc_vsync_end,
|
VC4_SET_FIELD(mode->crtc_vtotal - mode->crtc_vsync_end +
|
||||||
|
interlaced,
|
||||||
VC4_HDMI_VERTB_VBP));
|
VC4_HDMI_VERTB_VBP));
|
||||||
u32 vertb_even = (VC4_SET_FIELD(0, VC4_HDMI_VERTB_VSPO) |
|
u32 vertb_even = (VC4_SET_FIELD(0, VC4_HDMI_VERTB_VSPO) |
|
||||||
VC4_SET_FIELD(mode->crtc_vtotal -
|
VC4_SET_FIELD(mode->crtc_vtotal -
|
||||||
mode->crtc_vsync_end -
|
mode->crtc_vsync_end,
|
||||||
interlaced,
|
|
||||||
VC4_HDMI_VERTB_VBP));
|
VC4_HDMI_VERTB_VBP));
|
||||||
|
|
||||||
HDMI_WRITE(HDMI_HORZA,
|
HDMI_WRITE(HDMI_HORZA,
|
||||||
@@ -566,12 +566,12 @@ static void vc5_hdmi_set_timings(struct vc4_hdmi *vc4_hdmi,
|
|||||||
VC5_HDMI_VERTA_VFP) |
|
VC5_HDMI_VERTA_VFP) |
|
||||||
VC4_SET_FIELD(mode->crtc_vdisplay, VC5_HDMI_VERTA_VAL));
|
VC4_SET_FIELD(mode->crtc_vdisplay, VC5_HDMI_VERTA_VAL));
|
||||||
u32 vertb = (VC4_SET_FIELD(0, VC5_HDMI_VERTB_VSPO) |
|
u32 vertb = (VC4_SET_FIELD(0, VC5_HDMI_VERTB_VSPO) |
|
||||||
VC4_SET_FIELD(mode->crtc_vtotal - mode->crtc_vsync_end,
|
VC4_SET_FIELD(mode->crtc_vtotal - mode->crtc_vsync_end +
|
||||||
|
interlaced,
|
||||||
VC4_HDMI_VERTB_VBP));
|
VC4_HDMI_VERTB_VBP));
|
||||||
u32 vertb_even = (VC4_SET_FIELD(0, VC5_HDMI_VERTB_VSPO) |
|
u32 vertb_even = (VC4_SET_FIELD(0, VC5_HDMI_VERTB_VSPO) |
|
||||||
VC4_SET_FIELD(mode->crtc_vtotal -
|
VC4_SET_FIELD(mode->crtc_vtotal -
|
||||||
mode->crtc_vsync_end -
|
mode->crtc_vsync_end,
|
||||||
interlaced,
|
|
||||||
VC4_HDMI_VERTB_VBP));
|
VC4_HDMI_VERTB_VBP));
|
||||||
|
|
||||||
HDMI_WRITE(HDMI_VEC_INTERFACE_XBAR, 0x354021);
|
HDMI_WRITE(HDMI_VEC_INTERFACE_XBAR, 0x354021);
|
||||||
|
Reference in New Issue
Block a user