From 51f0473d7f2dde680b6f76c8fdd2ac8241b1de1c Mon Sep 17 00:00:00 2001 From: Algea Cao Date: Fri, 26 Mar 2021 09:16:17 +0800 Subject: [PATCH] drm: rockchip: dw-hdmi: Don't clean output_if when mode set If hdmi mode is changed but not plug out, encoder disabled is after encoder atomic check, hdmi output_if won't be set when crtc atomic enable, sync polarity won't be set correctly. Signed-off-by: Algea Cao Change-Id: I2e3244c4f8f9f9fd565170d50f39710749085b98 --- drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c index 6d41da871336..5164cf3fa295 100644 --- a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c +++ b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c @@ -115,6 +115,7 @@ struct rockchip_hdmi { int max_tmdsclk; bool unsupported_yuv_input; bool unsupported_deep_color; + bool mode_changed; unsigned long bus_format; unsigned long output_bus_format; @@ -557,7 +558,8 @@ static void dw_hdmi_rockchip_encoder_disable(struct drm_encoder *encoder) struct drm_crtc *crtc = encoder->crtc; struct rockchip_crtc_state *s = to_rockchip_crtc_state(crtc->state); - s->output_if &= ~VOP_OUTPUT_IF_HDMI0; + if (!hdmi->mode_changed) + s->output_if &= ~VOP_OUTPUT_IF_HDMI0; /* * when plug out hdmi it will be switch cvbs and then phy bus width * must be set as 8 @@ -577,6 +579,8 @@ static void dw_hdmi_rockchip_encoder_enable(struct drm_encoder *encoder) if (WARN_ON(!crtc || !crtc->state)) return; + hdmi->mode_changed = false; + if (hdmi->phy) phy_set_bus_width(hdmi->phy, hdmi->phy_bus_width); @@ -856,6 +860,9 @@ dw_hdmi_rockchip_encoder_atomic_check(struct drm_encoder *encoder, s->bus_format = bus_format; hdmi->bus_format = s->bus_format; + if (crtc_state->mode_changed == true) + hdmi->mode_changed = true; + if (hdmi->enc_out_encoding == V4L2_YCBCR_ENC_BT2020) s->color_space = V4L2_COLORSPACE_BT2020; else if (colorformat == DRM_HDMI_OUTPUT_DEFAULT_RGB)