diff --git a/src/i830_sdvo.c b/src/i830_sdvo.c index cfba482..ee621d1 100644 --- a/src/i830_sdvo.c +++ b/src/i830_sdvo.c @@ -1721,6 +1721,28 @@ i830_sdvo_multifunc_encoder(xf86OutputPtr output) return (caps > 1); } +static uint16_t i830_sdvo_multiple_detections(xf86OutputPtr output, int times, uint16_t *response) +{ + uint8_t status; + int i; + + for (i = 0; i < times; i = i + 1) { + i830_sdvo_write_cmd(output, SDVO_CMD_GET_ATTACHED_DISPLAYS, NULL, 0); + status = i830_sdvo_read_response(output, response, 2); + + if (status != SDVO_CMD_STATUS_SUCCESS) + return XF86OutputStatusUnknown; + + if (*response != 0) + break; + } + + if (*response != 0) + return XF86OutputStatusConnected; + else + return XF86OutputStatusDisconnected; +} + /** * Asks the SDVO device if any displays are currently connected. * @@ -1730,6 +1752,7 @@ i830_sdvo_multifunc_encoder(xf86OutputPtr output) * * Takes 14ms on average on my i945G. */ +#define MAX_DETECT_ATTEMPT_NUM 5 static xf86OutputStatus i830_sdvo_detect(xf86OutputPtr output) { @@ -1738,14 +1761,10 @@ i830_sdvo_detect(xf86OutputPtr output) uint16_t response; uint8_t status; - i830_sdvo_write_cmd(output, SDVO_CMD_GET_ATTACHED_DISPLAYS, NULL, 0); - status = i830_sdvo_read_response(output, &response, 2); + status = i830_sdvo_multiple_detections(output, MAX_DETECT_ATTEMPT_NUM, &response); - if (status != SDVO_CMD_STATUS_SUCCESS) - return XF86OutputStatusUnknown; - - if (response == 0) - return XF86OutputStatusDisconnected; + if (status != XF86OutputStatusConnected) + return status; if (i830_sdvo_multifunc_encoder(output)) { if (dev_priv->attached_output != response) {