---
 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/drivers/gpu/drm/drm_crtc.c:2024 @ 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
@ linux-4.4.115-rt130/drivers/gpu/drm/drm_crtc.c:1395 @ 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
@ linux-4.4.115-rt130/drivers/gpu/drm/drm_crtc.c:318 @ 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
@ linux-4.4.115-rt130/drivers/gpu/drm/drm_crtc.c:1606 @ 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
@ linux-4.4.115-rt130/drivers/gpu/drm/drm_crtc.c:648 @ 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
@ linux-4.4.115-rt130/drivers/gpu/drm/drm_crtc.c:720 @ 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