From 0bc3de352d2ed4356a51ca712e279d0058374b45 Mon Sep 17 00:00:00 2001
From: Alberto Milone <alberto.milone@canonical.com>
Date: Mon, 31 May 2010 14:20:06 +0200
Subject: [PATCH]     drm/edid: Update LVDS connector edid_property only once.

    drm_mode_connector_update_edid_property is called every time
    radeon_ddc_get_modes is called. Due to the nature of LVDS, it
    should be sufficient to update edid_property only once.

Signed-off-by: Alberto Milone <alberto.milone@canonical.com>
---
 drivers/gpu/drm/radeon/radeon_connectors.c |    1 +
 drivers/gpu/drm/radeon/radeon_display.c    |    8 ++++++++
 drivers/gpu/drm/radeon/radeon_mode.h       |    1 +
 3 files changed, 10 insertions(+), 0 deletions(-)

diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c
index 0c7ccc6..389a9dd 100644
--- a/drivers/gpu/drm/radeon/radeon_connectors.c
+++ b/drivers/gpu/drm/radeon/radeon_connectors.c
@@ -1068,6 +1068,7 @@ radeon_add_atom_connector(struct drm_device *dev,
 	connector = &radeon_connector->base;
 
 	radeon_connector->connector_id = connector_id;
+	radeon_connector->edid_property_updated = 0;
 	radeon_connector->devices = supported_device;
 	radeon_connector->shared_ddc = shared_ddc;
 	radeon_connector->connector_object_id = connector_object_id;
diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c
index 1006549..058602b 100644
--- a/drivers/gpu/drm/radeon/radeon_display.c
+++ b/drivers/gpu/drm/radeon/radeon_display.c
@@ -403,6 +403,12 @@ int radeon_ddc_get_modes(struct radeon_connector *radeon_connector)
 		     dig->dp_sink_type == CONNECTOR_OBJECT_ID_eDP) && dig->dp_i2c_bus)
 			radeon_connector->edid = drm_get_edid(&radeon_connector->base, &dig->dp_i2c_bus->adapter);
 	}
+	if (radeon_connector->edid_property_updated &&
+	    radeon_connector->base.connector_type == DRM_MODE_CONNECTOR_LVDS) {
+		DRM_INFO("Skipping update of EDID property due to cached property\n");
+		return ret;
+	}
+
 	if (!radeon_connector->ddc_bus)
 		return -1;
 	if (!radeon_connector->edid) {
@@ -411,6 +417,8 @@ int radeon_ddc_get_modes(struct radeon_connector *radeon_connector)
 	/* some servers provide a hardcoded edid in rom for KVMs */
 	if (!radeon_connector->edid)
 		radeon_connector->edid = radeon_combios_get_hardcoded_edid(rdev);
+
+	radeon_connector->edid_property_updated = 1;
 	if (radeon_connector->edid) {
 		drm_mode_connector_update_edid_property(&radeon_connector->base, radeon_connector->edid);
 		ret = drm_add_edid_modes(&radeon_connector->base, radeon_connector->edid);
diff --git a/drivers/gpu/drm/radeon/radeon_mode.h b/drivers/gpu/drm/radeon/radeon_mode.h
index 67358ba..e5f00e8 100644
--- a/drivers/gpu/drm/radeon/radeon_mode.h
+++ b/drivers/gpu/drm/radeon/radeon_mode.h
@@ -397,6 +397,7 @@ struct radeon_connector {
 	/* we need to mind the EDID between detect
 	   and get modes due to analog/digital/tvencoder */
 	struct edid *edid;
+	unsigned int edid_property_updated;
 	void *con_priv;
 	bool dac_load_detect;
 	uint16_t connector_object_id;
-- 
1.7.0.4
