drm/i915/lvds: Use the GMBUS pin if specified in VBT
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
This commit is contained in:
parent
e6c3a2a6d3
commit
270eea0fd7
1 changed files with 13 additions and 8 deletions
|
@ -771,7 +771,8 @@ static void intel_find_lvds_downclock(struct drm_device *dev,
|
||||||
* If it is not present, return false.
|
* If it is not present, return false.
|
||||||
* If no child dev is parsed from VBT, it assumes that the LVDS is present.
|
* 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;
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||||
int i;
|
int i;
|
||||||
|
@ -790,6 +791,9 @@ static bool lvds_is_present_in_vbt(struct drm_device *dev)
|
||||||
child->device_type != DEVICE_TYPE_LFP)
|
child->device_type != DEVICE_TYPE_LFP)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
if (child->i2c_pin)
|
||||||
|
*i2c_pin = child->i2c_pin;
|
||||||
|
|
||||||
/* However, we cannot trust the BIOS writers to populate
|
/* However, we cannot trust the BIOS writers to populate
|
||||||
* the VBT correctly. Since LVDS requires additional
|
* the VBT correctly. Since LVDS requires additional
|
||||||
* information from AIM blocks, a non-zero addin offset is
|
* 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;
|
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;
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||||
u8 buf = 0;
|
u8 buf = 0;
|
||||||
|
@ -822,7 +826,7 @@ static bool intel_lvds_ddc_probe(struct drm_device *dev)
|
||||||
.buf = &buf,
|
.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;
|
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_display_mode *scan; /* *modes, *bios_mode; */
|
||||||
struct drm_crtc *crtc;
|
struct drm_crtc *crtc;
|
||||||
u32 lvds;
|
u32 lvds;
|
||||||
int pipe, gpio = GPIOC;
|
int pipe;
|
||||||
|
u8 pin;
|
||||||
|
|
||||||
/* Skip init on machines we know falsely report LVDS */
|
/* Skip init on machines we know falsely report LVDS */
|
||||||
if (dmi_check_system(intel_no_lvds))
|
if (dmi_check_system(intel_no_lvds))
|
||||||
return;
|
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");
|
DRM_DEBUG_KMS("LVDS is not present in VBT\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -862,10 +868,9 @@ void intel_lvds_init(struct drm_device *dev)
|
||||||
DRM_DEBUG_KMS("disable LVDS for eDP support\n");
|
DRM_DEBUG_KMS("disable LVDS for eDP support\n");
|
||||||
return;
|
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");
|
DRM_DEBUG_KMS("LVDS did not respond to DDC probe\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -930,7 +935,7 @@ void intel_lvds_init(struct drm_device *dev)
|
||||||
* preferred mode is the right one.
|
* preferred mode is the right one.
|
||||||
*/
|
*/
|
||||||
intel_lvds->edid = drm_get_edid(connector,
|
intel_lvds->edid = drm_get_edid(connector,
|
||||||
&dev_priv->gmbus[GMBUS_PORT_PANEL].adapter);
|
&dev_priv->gmbus[pin].adapter);
|
||||||
|
|
||||||
if (!intel_lvds->edid) {
|
if (!intel_lvds->edid) {
|
||||||
/* Didn't get an EDID, so
|
/* Didn't get an EDID, so
|
||||||
|
|
Loading…
Add table
Reference in a new issue