]> git.baikalelectronics.ru Git - kernel.git/commitdiff
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)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 10 Nov 2022 16:57:57 +0000 (17:57 +0100)
commit d2569cf83075542e1a86014130783ba019c6c671 upstream.

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>
(cherry picked from commit e10f71018c1c8cce6cac47994393ce11ecf9f0a4)
Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/gpu/drm/i915/display/intel_sdvo.c

index adeb1c840976845739c259de4789e7c0a5edf9ec..04af2d32efaffd421be1f778b2dbd0b973507160 100644 (file)
@@ -2869,16 +2869,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;
 
@@ -2899,7 +2916,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;
 
@@ -2907,11 +2924,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;