Merge branch 'drm-intel-fixes' of git://people.freedesktop.org/~danvet/drm-intel...
[firefly-linux-kernel-4.4.55.git] / drivers / gpu / drm / drm_edid.c
index fadcd44ff196f4951f3bf2bea9d74cdab06d63f3..5a3770fbd770d63f2338fee03712917f80891146 100644 (file)
@@ -307,12 +307,9 @@ drm_do_probe_ddc_edid(struct i2c_adapter *adapter, unsigned char *buf,
 
 static bool drm_edid_is_zero(u8 *in_edid, int length)
 {
-       int i;
-       u32 *raw_edid = (u32 *)in_edid;
+       if (memchr_inv(in_edid, 0, length))
+               return false;
 
-       for (i = 0; i < length / 4; i++)
-               if (*(raw_edid + i) != 0)
-                       return false;
        return true;
 }
 
@@ -1516,6 +1513,26 @@ u8 *drm_find_cea_extension(struct edid *edid)
 }
 EXPORT_SYMBOL(drm_find_cea_extension);
 
+/*
+ * Looks for a CEA mode matching given drm_display_mode.
+ * Returns its CEA Video ID code, or 0 if not found.
+ */
+u8 drm_match_cea_mode(struct drm_display_mode *to_match)
+{
+       struct drm_display_mode *cea_mode;
+       u8 mode;
+
+       for (mode = 0; mode < drm_num_cea_modes; mode++) {
+               cea_mode = (struct drm_display_mode *)&edid_cea_modes[mode];
+
+               if (drm_mode_equal(to_match, cea_mode))
+                       return mode + 1;
+       }
+       return 0;
+}
+EXPORT_SYMBOL(drm_match_cea_mode);
+
+
 static int
 do_cea_modes (struct drm_connector *connector, u8 *db, u8 len)
 {
@@ -1622,7 +1639,7 @@ parse_hdmi_vsdb(struct drm_connector *connector, const u8 *db)
        if (len >= 12)
                connector->audio_latency[1] = db[12];
 
-       DRM_LOG_KMS("HDMI: DVI dual %d, "
+       DRM_DEBUG_KMS("HDMI: DVI dual %d, "
                    "max TMDS clock %d, "
                    "latency present %d %d, "
                    "video latency %d %d, "
@@ -2062,3 +2079,22 @@ int drm_add_modes_noedid(struct drm_connector *connector,
        return num_modes;
 }
 EXPORT_SYMBOL(drm_add_modes_noedid);
+
+/**
+ * drm_mode_cea_vic - return the CEA-861 VIC of a given mode
+ * @mode: mode
+ *
+ * RETURNS:
+ * The VIC number, 0 in case it's not a CEA-861 mode.
+ */
+uint8_t drm_mode_cea_vic(const struct drm_display_mode *mode)
+{
+       uint8_t i;
+
+       for (i = 0; i < drm_num_cea_modes; i++)
+               if (drm_mode_equal(mode, &edid_cea_modes[i]))
+                       return i + 1;
+
+       return 0;
+}
+EXPORT_SYMBOL(drm_mode_cea_vic);