drm/i915: avoid full modeset when changing the color range properties
authorDaniel Vetter <daniel.vetter@ffwll.ch>
Mon, 22 Apr 2013 15:07:23 +0000 (17:07 +0200)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Tue, 23 Apr 2013 11:52:57 +0000 (13:52 +0200)
Automatic color range selection was added in

commit 55bc60db5988c8366751d3d04dd690698a53412c
Author: Ville Syrjälä <ville.syrjala@linux.intel.com>
Date:   Thu Jan 17 16:31:29 2013 +0200

    drm/i915: Add "Automatic" mode for the "Broadcast RGB" property

but that removed the check to avoid a full modeset if the value is
unchanged. Unfortunately X sets all properties with their current
value at start-up, resulting in some ugly flickering which shouldn't
be there.

v2: Change old_range from bool to uint32_t, spotted by Ville.

v3: Actually git add everything ;-)

Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Cc: Paulo Zanoni <paulo.r.zanoni@intel.com>
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
drivers/gpu/drm/i915/intel_dp.c
drivers/gpu/drm/i915/intel_hdmi.c
drivers/gpu/drm/i915/intel_sdvo.c

index 89f89b7..fc3bd9b 100644 (file)
@@ -2428,6 +2428,9 @@ intel_dp_set_property(struct drm_connector *connector,
        }
 
        if (property == dev_priv->broadcast_rgb_property) {
+               bool old_auto = intel_dp->color_range_auto;
+               uint32_t old_range = intel_dp->color_range;
+
                switch (val) {
                case INTEL_BROADCAST_RGB_AUTO:
                        intel_dp->color_range_auto = true;
@@ -2443,6 +2446,11 @@ intel_dp_set_property(struct drm_connector *connector,
                default:
                        return -EINVAL;
                }
+
+               if (old_auto == intel_dp->color_range_auto &&
+                   old_range == intel_dp->color_range)
+                       return 0;
+
                goto done;
        }
 
index 3e6a3ef..a905793 100644 (file)
@@ -920,6 +920,9 @@ intel_hdmi_set_property(struct drm_connector *connector,
        }
 
        if (property == dev_priv->broadcast_rgb_property) {
+               bool old_auto = intel_hdmi->color_range_auto;
+               uint32_t old_range = intel_hdmi->color_range;
+
                switch (val) {
                case INTEL_BROADCAST_RGB_AUTO:
                        intel_hdmi->color_range_auto = true;
@@ -935,6 +938,11 @@ intel_hdmi_set_property(struct drm_connector *connector,
                default:
                        return -EINVAL;
                }
+
+               if (old_auto == intel_hdmi->color_range_auto &&
+                   old_range == intel_hdmi->color_range)
+                       return 0;
+
                goto done;
        }
 
index a618a6a..d154284 100644 (file)
@@ -1930,6 +1930,9 @@ intel_sdvo_set_property(struct drm_connector *connector,
        }
 
        if (property == dev_priv->broadcast_rgb_property) {
+               bool old_auto = intel_sdvo->color_range_auto;
+               uint32_t old_range = intel_sdvo->color_range;
+
                switch (val) {
                case INTEL_BROADCAST_RGB_AUTO:
                        intel_sdvo->color_range_auto = true;
@@ -1947,6 +1950,11 @@ intel_sdvo_set_property(struct drm_connector *connector,
                default:
                        return -EINVAL;
                }
+
+               if (old_auto == intel_sdvo->color_range_auto &&
+                   old_range == intel_sdvo->color_range)
+                       return 0;
+
                goto done;
        }