drm/edid: also call add modes in EDID connector update fallback
[platform/kernel/linux-starfive.git] / drivers / gpu / drm / drm_edid.c
index 4b71040..a491280 100644 (file)
@@ -2308,7 +2308,8 @@ int drm_edid_override_connector_update(struct drm_connector *connector)
 
        override = drm_edid_override_get(connector);
        if (override) {
-               num_modes = drm_edid_connector_update(connector, override);
+               if (drm_edid_connector_update(connector, override) == 0)
+                       num_modes = drm_edid_connector_add_modes(connector);
 
                drm_edid_free(override);
 
@@ -3499,11 +3500,19 @@ static struct drm_display_mode *drm_mode_detailed(struct drm_connector *connecto
        mode->vsync_end = mode->vsync_start + vsync_pulse_width;
        mode->vtotal = mode->vdisplay + vblank;
 
-       /* Some EDIDs have bogus h/vtotal values */
-       if (mode->hsync_end > mode->htotal)
-               mode->htotal = mode->hsync_end + 1;
-       if (mode->vsync_end > mode->vtotal)
-               mode->vtotal = mode->vsync_end + 1;
+       /* Some EDIDs have bogus h/vsync_end values */
+       if (mode->hsync_end > mode->htotal) {
+               drm_dbg_kms(dev, "[CONNECTOR:%d:%s] reducing hsync_end %d->%d\n",
+                           connector->base.id, connector->name,
+                           mode->hsync_end, mode->htotal);
+               mode->hsync_end = mode->htotal;
+       }
+       if (mode->vsync_end > mode->vtotal) {
+               drm_dbg_kms(dev, "[CONNECTOR:%d:%s] reducing vsync_end %d->%d\n",
+                           connector->base.id, connector->name,
+                           mode->vsync_end, mode->vtotal);
+               mode->vsync_end = mode->vtotal;
+       }
 
        drm_mode_do_interlace_quirk(mode, pt);