]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
drm/bridge: dw-hdmi: rework csc related functions
authorJernej Skrabec <jernej.skrabec@siol.net>
Wed, 4 Mar 2020 23:25:12 +0000 (00:25 +0100)
committerJernej Skrabec <jernej.skrabec@siol.net>
Tue, 24 Mar 2020 20:14:38 +0000 (21:14 +0100)
is_color_space_conversion() is a misnomer. It checks not only if color
space conversion is needed, but also if format conversion is needed.
This is actually desired behaviour because result of this function
determines if CSC block should be enabled or not (CSC block can also do
format conversion).

In order to clear misunderstandings, let's rework
is_color_space_conversion() to do exactly what is supposed to do and add
another function which will determine if CSC block must be enabled or
not.

Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
Link: https://patchwork.freedesktop.org/patch/msgid/20200304232512.51616-5-jernej.skrabec@siol.net
drivers/gpu/drm/bridge/synopsys/dw-hdmi.c

index 43c763ee8307cc235fbdec260ac28dcc44ad0a76..ec3b06433d980fb4427705dc85aff5bc50ab82e2 100644 (file)
@@ -963,11 +963,14 @@ static void hdmi_video_sample(struct dw_hdmi *hdmi)
 
 static int is_color_space_conversion(struct dw_hdmi *hdmi)
 {
-       return (hdmi->hdmi_data.enc_in_bus_format !=
-                       hdmi->hdmi_data.enc_out_bus_format) ||
-              (hdmi_bus_fmt_is_rgb(hdmi->hdmi_data.enc_in_bus_format) &&
-               hdmi_bus_fmt_is_rgb(hdmi->hdmi_data.enc_out_bus_format) &&
-               hdmi->hdmi_data.rgb_limited_range);
+       struct hdmi_data_info *hdmi_data = &hdmi->hdmi_data;
+       bool is_input_rgb, is_output_rgb;
+
+       is_input_rgb = hdmi_bus_fmt_is_rgb(hdmi_data->enc_in_bus_format);
+       is_output_rgb = hdmi_bus_fmt_is_rgb(hdmi_data->enc_out_bus_format);
+
+       return (is_input_rgb != is_output_rgb) ||
+              (is_input_rgb && is_output_rgb && hdmi_data->rgb_limited_range);
 }
 
 static int is_color_space_decimation(struct dw_hdmi *hdmi)
@@ -994,6 +997,13 @@ static int is_color_space_interpolation(struct dw_hdmi *hdmi)
        return 0;
 }
 
+static bool is_csc_needed(struct dw_hdmi *hdmi)
+{
+       return is_color_space_conversion(hdmi) ||
+              is_color_space_decimation(hdmi) ||
+              is_color_space_interpolation(hdmi);
+}
+
 static void dw_hdmi_update_csc_coeffs(struct dw_hdmi *hdmi)
 {
        const u16 (*csc_coeff)[3][4] = &csc_coeff_default;
@@ -2027,18 +2037,19 @@ static void dw_hdmi_enable_video_path(struct dw_hdmi *hdmi)
        hdmi_writeb(hdmi, hdmi->mc_clkdis, HDMI_MC_CLKDIS);
 
        /* Enable csc path */
-       if (is_color_space_conversion(hdmi)) {
+       if (is_csc_needed(hdmi)) {
                hdmi->mc_clkdis &= ~HDMI_MC_CLKDIS_CSCCLK_DISABLE;
                hdmi_writeb(hdmi, hdmi->mc_clkdis, HDMI_MC_CLKDIS);
-       }
 
-       /* Enable color space conversion if needed */
-       if (is_color_space_conversion(hdmi))
                hdmi_writeb(hdmi, HDMI_MC_FLOWCTRL_FEED_THROUGH_OFF_CSC_IN_PATH,
                            HDMI_MC_FLOWCTRL);
-       else
+       } else {
+               hdmi->mc_clkdis |= HDMI_MC_CLKDIS_CSCCLK_DISABLE;
+               hdmi_writeb(hdmi, hdmi->mc_clkdis, HDMI_MC_CLKDIS);
+
                hdmi_writeb(hdmi, HDMI_MC_FLOWCTRL_FEED_THROUGH_OFF_CSC_BYPASS,
                            HDMI_MC_FLOWCTRL);
+       }
 }
 
 /* Workaround to clear the overflow condition */