drm/i915/lvds: Probe DDC on creation
authorChris Wilson <chris@chris-wilson.co.uk>
Thu, 23 Sep 2010 10:16:49 +0000 (11:16 +0100)
committerChris Wilson <chris@chris-wilson.co.uk>
Fri, 24 Sep 2010 13:19:44 +0000 (14:19 +0100)
Try to validate the panel's connection by writing to address 0xA0.

Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=18072
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
drivers/gpu/drm/i915/intel_lvds.c

index 2bcea80008592e9493d56b98ae826ec4f614c35e..e1f6e05169f645e8471885af1d2befbfe7a2b26e 100644 (file)
@@ -810,6 +810,22 @@ static bool lvds_is_present_in_vbt(struct drm_device *dev)
        return false;
 }
 
+static bool intel_lvds_ddc_probe(struct drm_device *dev)
+{
+       struct drm_i915_private *dev_priv = dev->dev_private;
+       u8 buf = 0;
+       struct i2c_msg msgs[] = {
+               {
+                       .addr = 0xA0,
+                       .flags = 0,
+                       .len = 1,
+                       .buf = &buf,
+               },
+       };
+       struct i2c_adapter *i2c = &dev_priv->gmbus[GMBUS_PORT_PANEL].adapter;
+       return i2c_transfer(i2c, msgs, 1) == 1;
+}
+
 /**
  * intel_lvds_init - setup LVDS connectors on this device
  * @dev: drm device
@@ -849,6 +865,11 @@ void intel_lvds_init(struct drm_device *dev)
                gpio = PCH_GPIOC;
        }
 
+       if (!intel_lvds_ddc_probe(dev)) {
+               DRM_DEBUG_KMS("LVDS did not respond to DDC probe\n");
+               return;
+       }
+
        intel_lvds = kzalloc(sizeof(struct intel_lvds), GFP_KERNEL);
        if (!intel_lvds) {
                return;