summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZhenyu Wang <zhenyu.z.wang@intel.com>2009-02-11 15:15:27 +0800
committerZhenyu Wang <zhenyu.z.wang@intel.com>2009-02-13 09:21:45 +0800
commit37c67088a887e6380571e6eec8a8f058e3e24717 (patch)
tree37f3b96faf139f24462751baef969f6e9b44c3a4
parent38079bc0f1038da77048bbf6e5c10758f9fb8a55 (diff)
SDVO: check EDID info for DVI-I
For SDVO DVI-I, check EDID info for digital output, otherwise mark it to be disconnected as analog output is driven by VGA then.
-rw-r--r--src/i830_sdvo.c22
1 files changed, 18 insertions, 4 deletions
diff --git a/src/i830_sdvo.c b/src/i830_sdvo.c
index 1fbf8dce..508a4675 100644
--- a/src/i830_sdvo.c
+++ b/src/i830_sdvo.c
@@ -1507,7 +1507,9 @@ i830_sdvo_check_hdmi_encode (xf86OutputPtr output)
static xf86OutputStatus
i830_sdvo_detect(xf86OutputPtr output)
{
- uint8_t response[2];
+ I830OutputPrivatePtr intel_output = output->driver_private;
+ struct i830_sdvo_priv *dev_priv = intel_output->dev_priv;
+ uint16_t response;
uint8_t status;
i830_sdvo_write_cmd(output, SDVO_CMD_GET_ATTACHED_DISPLAYS, NULL, 0);
@@ -1516,10 +1518,22 @@ i830_sdvo_detect(xf86OutputPtr output)
if (status != SDVO_CMD_STATUS_SUCCESS)
return XF86OutputStatusUnknown;
- if (response[0] != 0 || response[1] != 0)
- return XF86OutputStatusConnected;
- else
+ if (response == 0)
return XF86OutputStatusDisconnected;
+
+ if (response & (SDVO_OUTPUT_TMDS0 | SDVO_OUTPUT_TMDS1))
+ {
+ xf86MonPtr edid_mon;
+ /* Check EDID in DVI-I case */
+ i830_sdvo_set_control_bus_switch(output, dev_priv->ddc_bus);
+ edid_mon = xf86OutputGetEDID (output, intel_output->pDDCBus);
+ if (!edid_mon || !DIGITAL(edid_mon->features.input_type)) {
+ xfree(edid_mon);
+ return XF86OutputStatusDisconnected;
+ }
+ xfree(edid_mon);
+ }
+ return XF86OutputStatusConnected;
}
static DisplayModePtr