drm/i915/lvds: Use the GMBUS pin if specified in VBT
authorChris Wilson <chris@chris-wilson.co.uk>
Fri, 24 Sep 2010 00:15:02 +0000 (01:15 +0100)
committerChris Wilson <chris@chris-wilson.co.uk>
Fri, 24 Sep 2010 13:22:11 +0000 (14:22 +0100)
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
drivers/gpu/drm/i915/intel_lvds.c

index 1317731bc8ed0724b1a776b9daeeb387f38fc6f5..95e035a6009e0d9148ccaf74acdbd036e1dba09a 100644 (file)
@@ -771,7 +771,8 @@ static void intel_find_lvds_downclock(struct drm_device *dev,
  * If it is not present, return false.
  * If no child dev is parsed from VBT, it assumes that the LVDS is present.
  */
-static bool lvds_is_present_in_vbt(struct drm_device *dev)
+static bool lvds_is_present_in_vbt(struct drm_device *dev,
+                                  u8 *i2c_pin)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
        int i;
@@ -790,6 +791,9 @@ static bool lvds_is_present_in_vbt(struct drm_device *dev)
                    child->device_type != DEVICE_TYPE_LFP)
                        continue;
 
+               if (child->i2c_pin)
+                   *i2c_pin = child->i2c_pin;
+
                /* However, we cannot trust the BIOS writers to populate
                 * the VBT correctly.  Since LVDS requires additional
                 * information from AIM blocks, a non-zero addin offset is
@@ -810,7 +814,7 @@ static bool lvds_is_present_in_vbt(struct drm_device *dev)
        return false;
 }
 
-static bool intel_lvds_ddc_probe(struct drm_device *dev)
+static bool intel_lvds_ddc_probe(struct drm_device *dev, u8 pin)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
        u8 buf = 0;
@@ -822,7 +826,7 @@ static bool intel_lvds_ddc_probe(struct drm_device *dev)
                        .buf = &buf,
                },
        };
-       struct i2c_adapter *i2c = &dev_priv->gmbus[GMBUS_PORT_PANEL].adapter;
+       struct i2c_adapter *i2c = &dev_priv->gmbus[pin].adapter;
        return i2c_transfer(i2c, msgs, 1) == 1;
 }
 
@@ -844,13 +848,15 @@ void intel_lvds_init(struct drm_device *dev)
        struct drm_display_mode *scan; /* *modes, *bios_mode; */
        struct drm_crtc *crtc;
        u32 lvds;
-       int pipe, gpio = GPIOC;
+       int pipe;
+       u8 pin;
 
        /* Skip init on machines we know falsely report LVDS */
        if (dmi_check_system(intel_no_lvds))
                return;
 
-       if (!lvds_is_present_in_vbt(dev)) {
+       pin = GMBUS_PORT_PANEL;
+       if (!lvds_is_present_in_vbt(dev, &pin)) {
                DRM_DEBUG_KMS("LVDS is not present in VBT\n");
                return;
        }
@@ -862,10 +868,9 @@ void intel_lvds_init(struct drm_device *dev)
                        DRM_DEBUG_KMS("disable LVDS for eDP support\n");
                        return;
                }
-               gpio = PCH_GPIOC;
        }
 
-       if (!intel_lvds_ddc_probe(dev)) {
+       if (!intel_lvds_ddc_probe(dev, pin)) {
                DRM_DEBUG_KMS("LVDS did not respond to DDC probe\n");
                return;
        }
@@ -930,7 +935,7 @@ void intel_lvds_init(struct drm_device *dev)
         * preferred mode is the right one.
         */
        intel_lvds->edid = drm_get_edid(connector,
-                                       &dev_priv->gmbus[GMBUS_PORT_PANEL].adapter);
+                                       &dev_priv->gmbus[pin].adapter);
 
        if (!intel_lvds->edid) {
                /* Didn't get an EDID, so