FROMLIST: drm/bridge: analogix_dp: Don't read EDID if panel present
[firefly-linux-kernel-4.4.55.git] / drivers / gpu / drm / drm_modes.c
index 71a10f08522e4a8f67c914dd3a9307b4435f1c99..bb0733063e631afd4b36b714c6dc4dc5c9656094 100644 (file)
@@ -917,13 +917,34 @@ bool drm_mode_equal(const struct drm_display_mode *mode1, const struct drm_displ
        } else if (mode1->clock != mode2->clock)
                return false;
 
+       return drm_mode_equal_no_clocks(mode1, mode2);
+}
+EXPORT_SYMBOL(drm_mode_equal);
+
+/**
+ * drm_mode_equal_no_clocks - test modes for equality
+ * @mode1: first mode
+ * @mode2: second mode
+ *
+ * Check to see if @mode1 and @mode2 are equivalent, but
+ * don't check the pixel clocks.
+ *
+ * Returns:
+ * True if the modes are equal, false otherwise.
+ */
+bool drm_mode_equal_no_clocks(const struct drm_display_mode *mode1, const struct drm_display_mode *mode2)
+{
        if ((mode1->flags & DRM_MODE_FLAG_3D_MASK) !=
            (mode2->flags & DRM_MODE_FLAG_3D_MASK))
                return false;
 
+       if ((mode1->flags & DRM_MODE_FLAG_420_MASK) !=
+           (mode2->flags & DRM_MODE_FLAG_420_MASK))
+               return false;
+
        return drm_mode_equal_no_clocks_no_stereo(mode1, mode2);
 }
-EXPORT_SYMBOL(drm_mode_equal);
+EXPORT_SYMBOL(drm_mode_equal_no_clocks);
 
 /**
  * drm_mode_equal_no_clocks_no_stereo - test modes for equality
@@ -939,6 +960,9 @@ EXPORT_SYMBOL(drm_mode_equal);
 bool drm_mode_equal_no_clocks_no_stereo(const struct drm_display_mode *mode1,
                                        const struct drm_display_mode *mode2)
 {
+       unsigned int flags_mask =
+               ~(DRM_MODE_FLAG_3D_MASK | DRM_MODE_FLAG_420_MASK);
+
        if (mode1->hdisplay == mode2->hdisplay &&
            mode1->hsync_start == mode2->hsync_start &&
            mode1->hsync_end == mode2->hsync_end &&
@@ -949,8 +973,7 @@ bool drm_mode_equal_no_clocks_no_stereo(const struct drm_display_mode *mode1,
            mode1->vsync_end == mode2->vsync_end &&
            mode1->vtotal == mode2->vtotal &&
            mode1->vscan == mode2->vscan &&
-           (mode1->flags & ~DRM_MODE_FLAG_3D_MASK) ==
-            (mode2->flags & ~DRM_MODE_FLAG_3D_MASK))
+           (mode1->flags & flags_mask) == (mode2->flags & flags_mask))
                return true;
 
        return false;