68 lines
2.3 KiB
Diff
68 lines
2.3 KiB
Diff
Subject: [3/3] drm/i915: Ignore LVDS EDID when it is unavailabe or invalid
|
|
Date: Thu, 04 Mar 2010 08:17:31 -0000
|
|
From: Zhenyu Wang <zhenyuw@linux.intel.com>
|
|
Patch-mainline: 2.6.34
|
|
References: https://patchwork.kernel.org/patch/83556/, BMC# 331
|
|
|
|
From: Zhao Yakui <yakui.zhao@intel.com>
|
|
|
|
In course of probing the display mode for LVDS, we will firstly try to
|
|
check the EDID for LVDS panel. But on some laptops the EDID is invalid for
|
|
the LVDS panel. In such case it will complain the invalida EDID warning
|
|
message and print the EDID raw data every time when probing the LVDS mode.
|
|
|
|
https://bugs.freedesktop.org/show_bug.cgi?id=23099
|
|
https://bugs.freedesktop.org/show_bug.cgi?id=26395
|
|
|
|
Signed-off-by: Zhao Yakui <yakui.zhao@intel.com>
|
|
Tested-by: Sitsofe Wheeler <sitsofe@yahoo.com>
|
|
Signed-off-by: Zhenyu Wang <zhenyuw@linux.intel.com>
|
|
Acked-by: Yin Kangkai <kangkai.yin@intel.com>
|
|
|
|
---
|
|
drivers/gpu/drm/i915/i915_drv.h | 2 ++
|
|
drivers/gpu/drm/i915/intel_lvds.c | 13 +++++++++----
|
|
2 files changed, 11 insertions(+), 4 deletions(-)
|
|
|
|
--- a/drivers/gpu/drm/i915/i915_drv.h
|
|
+++ b/drivers/gpu/drm/i915/i915_drv.h
|
|
@@ -581,6 +581,8 @@ typedef struct drm_i915_private {
|
|
/* Reclocking support */
|
|
bool render_reclock_avail;
|
|
bool lvds_downclock_avail;
|
|
+ /* indicate whether the LVDS EDID is OK */
|
|
+ bool lvds_edid_ok;
|
|
/* indicates the reduced downclock for LVDS*/
|
|
int lvds_downclock;
|
|
struct work_struct idle_work;
|
|
--- a/drivers/gpu/drm/i915/intel_lvds.c
|
|
+++ b/drivers/gpu/drm/i915/intel_lvds.c
|
|
@@ -680,10 +680,13 @@ static int intel_lvds_get_modes(struct d
|
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
|
int ret = 0;
|
|
|
|
- ret = intel_ddc_get_modes(intel_output);
|
|
+ if (dev_priv->lvds_edid_ok) {
|
|
+ ret = intel_ddc_get_modes(intel_output);
|
|
+ if (ret)
|
|
+ return ret;
|
|
|
|
- if (ret)
|
|
- return ret;
|
|
+ dev_priv->lvds_edid_ok = false;
|
|
+ }
|
|
|
|
/* Didn't get an EDID, so
|
|
* Set wide sync ranges so we get all modes
|
|
@@ -1097,7 +1100,9 @@ void intel_lvds_init(struct drm_device *
|
|
* Attempt to get the fixed panel mode from DDC. Assume that the
|
|
* preferred mode is the right one.
|
|
*/
|
|
- intel_ddc_get_modes(intel_output);
|
|
+ dev_priv->lvds_edid_ok = true;
|
|
+ if (!intel_ddc_get_modes(intel_output))
|
|
+ dev_priv->lvds_edid_ok = false;
|
|
|
|
list_for_each_entry(scan, &connector->probed_modes, head) {
|
|
mutex_lock(&dev->mode_config.mutex);
|