OSDN Git Service

drm/i915/sdvo: Filter out invalid outputs more sensibly
authorVille Syrjälä <ville.syrjala@linux.intel.com>
Wed, 26 Oct 2022 10:11:27 +0000 (13:11 +0300)
committerVille Syrjälä <ville.syrjala@linux.intel.com>
Fri, 28 Oct 2022 11:44:48 +0000 (14:44 +0300)
We try to filter out the corresponding xxx1 output
if the xxx0 output is not present. But the way that is
being done is pretty awkward. Make it less so.

Cc: stable@vger.kernel.org
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20221026101134.20865-2-ville.syrjala@linux.intel.com
Reviewed-by: Jani Nikula <jani.nikula@intel.com>
drivers/gpu/drm/i915/display/intel_sdvo.c

index 8852564..c38b75f 100644 (file)
@@ -2934,16 +2934,33 @@ err:
        return false;
 }
 
+static u16 intel_sdvo_filter_output_flags(u16 flags)
+{
+       flags &= SDVO_OUTPUT_MASK;
+
+       /* SDVO requires XXX1 function may not exist unless it has XXX0 function.*/
+       if (!(flags & SDVO_OUTPUT_TMDS0))
+               flags &= ~SDVO_OUTPUT_TMDS1;
+
+       if (!(flags & SDVO_OUTPUT_RGB0))
+               flags &= ~SDVO_OUTPUT_RGB1;
+
+       if (!(flags & SDVO_OUTPUT_LVDS0))
+               flags &= ~SDVO_OUTPUT_LVDS1;
+
+       return flags;
+}
+
 static bool
 intel_sdvo_output_setup(struct intel_sdvo *intel_sdvo, u16 flags)
 {
-       /* SDVO requires XXX1 function may not exist unless it has XXX0 function.*/
+       flags = intel_sdvo_filter_output_flags(flags);
 
        if (flags & SDVO_OUTPUT_TMDS0)
                if (!intel_sdvo_dvi_init(intel_sdvo, 0))
                        return false;
 
-       if ((flags & SDVO_TMDS_MASK) == SDVO_TMDS_MASK)
+       if (flags & SDVO_OUTPUT_TMDS1)
                if (!intel_sdvo_dvi_init(intel_sdvo, 1))
                        return false;
 
@@ -2964,7 +2981,7 @@ intel_sdvo_output_setup(struct intel_sdvo *intel_sdvo, u16 flags)
                if (!intel_sdvo_analog_init(intel_sdvo, 0))
                        return false;
 
-       if ((flags & SDVO_RGB_MASK) == SDVO_RGB_MASK)
+       if (flags & SDVO_OUTPUT_RGB1)
                if (!intel_sdvo_analog_init(intel_sdvo, 1))
                        return false;
 
@@ -2972,11 +2989,11 @@ intel_sdvo_output_setup(struct intel_sdvo *intel_sdvo, u16 flags)
                if (!intel_sdvo_lvds_init(intel_sdvo, 0))
                        return false;
 
-       if ((flags & SDVO_LVDS_MASK) == SDVO_LVDS_MASK)
+       if (flags & SDVO_OUTPUT_LVDS1)
                if (!intel_sdvo_lvds_init(intel_sdvo, 1))
                        return false;
 
-       if ((flags & SDVO_OUTPUT_MASK) == 0) {
+       if (flags == 0) {
                unsigned char bytes[2];
 
                intel_sdvo->controlled_output = 0;