---
 drivers/gpu/drm/drm_crtc.c      |    2 +-
 drivers/gpu/drm/drm_edid.c      |   14 +++++++-------
 drivers/gpu/drm/drm_edid_load.c |    3 ++-
 drivers/gpu/drm/drm_fb_helper.c |    4 +++-
 include/drm/drm_crtc.h          |    2 ++
 5 files changed, 15 insertions(+), 10 deletions(-)

Index: linux-4.4.115-rt130/drivers/gpu/drm/drm_crtc.c
===================================================================
--- linux-4.4.115-rt130.orig/drivers/gpu/drm/drm_crtc.c
+++ linux-4.4.115-rt130/drivers/gpu/drm/drm_crtc.c
@@ -2021,7 +2021,7 @@ int drm_mode_getconnector(struct drm_dev
                if (connector->encoder_ids[i] != 0)
                        encoders_count++;
 
-       if (out_resp->count_modes == 0) {
+       if (out_resp->count_modes == 0 && !connector->edid_firmware_loaded) {
                connector->funcs->fill_modes(connector,
                                             dev->mode_config.max_width,
                                             dev->mode_config.max_height);
Index: linux-4.4.115-rt130/drivers/gpu/drm/drm_edid.c
===================================================================
--- linux-4.4.115-rt130.orig/drivers/gpu/drm/drm_edid.c
+++ linux-4.4.115-rt130/drivers/gpu/drm/drm_edid.c
@@ -1392,14 +1392,14 @@ EXPORT_SYMBOL(drm_probe_ddc);
 struct edid *drm_get_edid(struct drm_connector *connector,
                          struct i2c_adapter *adapter)
 {
-       struct edid *edid;
+       struct edid *edid = NULL;
 
-       if (!drm_probe_ddc(adapter))
-               return NULL;
-
-       edid = drm_do_get_edid(connector, drm_do_probe_ddc_edid, adapter);
-       if (edid)
-               drm_get_displayid(connector, edid);
+       if (!connector->edid_firmware_loaded && drm_probe_ddc(adapter)) {
+               edid = drm_do_get_edid(connector, drm_do_probe_ddc_edid,
+                   adapter);
+               if (edid)
+                       drm_get_displayid(connector, edid);
+       }
        return edid;
 }
 EXPORT_SYMBOL(drm_get_edid);
Index: linux-4.4.115-rt130/drivers/gpu/drm/drm_edid_load.c
===================================================================
--- linux-4.4.115-rt130.orig/drivers/gpu/drm/drm_edid_load.c
+++ linux-4.4.115-rt130/drivers/gpu/drm/drm_edid_load.c
@@ -315,8 +315,9 @@ int drm_load_edid_firmware(struct drm_co
 
        drm_mode_connector_update_edid_property(connector, edid);
        ret = drm_add_edid_modes(connector, edid);
+       if (ret)
+               connector->edid_firmware_loaded = true;
        drm_edid_to_eld(connector, edid);
        kfree(edid);
-
        return ret;
 }
Index: linux-4.4.115-rt130/drivers/gpu/drm/drm_fb_helper.c
===================================================================
--- linux-4.4.115-rt130.orig/drivers/gpu/drm/drm_fb_helper.c
+++ linux-4.4.115-rt130/drivers/gpu/drm/drm_fb_helper.c
@@ -1603,7 +1603,9 @@ static int drm_fb_helper_probe_connector
 
        for (i = 0; i < fb_helper->connector_count; i++) {
                connector = fb_helper->connector_info[i]->connector;
-               count += connector->funcs->fill_modes(connector, maxX, maxY);
+               if (!connector->edid_firmware_loaded)
+                       count += connector->funcs->fill_modes(connector, maxX,
+                           maxY);
        }
 
        return count;
Index: linux-4.4.115-rt130/include/drm/drm_crtc.h
===================================================================
--- linux-4.4.115-rt130.orig/include/drm/drm_crtc.h
+++ linux-4.4.115-rt130/include/drm/drm_crtc.h
@@ -645,6 +645,7 @@ struct drm_encoder {
  * @null_edid_counter: track sinks that give us all zeros for the EDID
  * @bad_edid_counter: track sinks that give us an EDID with invalid checksum
  * @edid_corrupt: indicates whether the last read EDID was corrupt
+ * @edid_firmware_loaded: EDID firmware was loaded successfully, do not probe
  * @debugfs_entry: debugfs directory for this connector
  * @state: current atomic state for this connector
  * @has_tile: is this connector connected to a tiled monitor
@@ -716,6 +717,7 @@ struct drm_connector {
        int audio_latency[2];
        int null_edid_counter; /* needed to workaround some HW bugs where we get all 0s */
        unsigned bad_edid_counter;
+       bool edid_firmware_loaded;
 
        /* Flag for raw EDID header corruption - used in Displayport
         * compliance testing - * Displayport Link CTS Core 1.2 rev1.1 4.2.2.6