Subject: [Patch] drm/i915: Ignore LVDS EDID when it is unavailabe or invalid From: Zhao Yakui Signed-off-by: Zhao Yakui --- drivers/gpu/drm/i915/i915_drv.h | 1 + drivers/gpu/drm/i915/intel_lvds.c | 18 ++++++++++++++---- 2 files changed, 15 insertions(+), 4 deletions(-) Index: linux-2.6/drivers/gpu/drm/i915/i915_drv.h =================================================================== --- linux-2.6.orig/drivers/gpu/drm/i915/i915_drv.h 2010-02-08 20:18:39.000000000 +0800 +++ linux-2.6/drivers/gpu/drm/i915/i915_drv.h 2010-02-09 14:57:12.000000000 +0800 @@ -563,6 +563,7 @@ struct drm_i915_gem_phys_object *phys_objs[I915_MAX_PHYS_OBJECT]; } mm; struct sdvo_device_mapping sdvo_mappings[2]; + bool lvds_edid_avail; /* indicate whether the LVDS_BORDER should be enabled or not */ unsigned int lvds_border_bits; Index: linux-2.6/drivers/gpu/drm/i915/intel_lvds.c =================================================================== --- linux-2.6.orig/drivers/gpu/drm/i915/intel_lvds.c 2010-02-08 20:18:39.000000000 +0800 +++ linux-2.6/drivers/gpu/drm/i915/intel_lvds.c 2010-02-09 14:58:09.000000000 +0800 @@ -659,10 +659,13 @@ struct drm_i915_private *dev_priv = dev->dev_private; int ret = 0; - ret = intel_ddc_get_modes(intel_output); + if (dev_priv->lvds_edid_avail) { + ret = intel_ddc_get_modes(intel_output); + if (ret) + return ret; - if (ret) - return ret; + dev_priv->lvds_edid_avail = 0; + } /* Didn't get an EDID, so * Set wide sync ranges so we get all modes @@ -1071,11 +1074,18 @@ goto failed; } + dev_priv->lvds_edid_avail = 1; /* * Attempt to get the fixed panel mode from DDC. Assume that the * preferred mode is the right one. */ - intel_ddc_get_modes(intel_output); + if (dev_priv->lvds_edid_avail) { + int ret; + + ret = intel_ddc_get_modes(intel_output); + if (ret == 0) + dev_priv->lvds_edid_avail = 0; + } list_for_each_entry(scan, &connector->probed_modes, head) { mutex_lock(&dev->mode_config.mutex);