[Intel-gfx] [PATCH 2/2] drm/i915: try another possible DDC bus for the SDVO device with multiple outputs

yakui.zhao at intel.com yakui.zhao at intel.com
Fri Dec 18 10:33:11 CET 2009


From: Zhao Yakui <yakui.zhao at intel.com>

There exist multiple DDC buses for the SDVO cards with multiple outputs.
Sometimes we can't read the edid correctly when using the selected DDC bus for
such SDVO card. For example: the SDVO card on the box of bug23842, which is
based on conextant.

When we can't get the EDID, we can try the other possible DDC bus to
read the EDID for the SDVO device with multiple outputs.

https://bugs.freedesktop.org/show_bug.cgi?id=23842

Signed-off-by: Zhao Yakui <yakui.zhao at intel.com>
Tested-by: Sebastien Caty <sebastien.caty at mrnf.gouv.qc.ca>
---
 drivers/gpu/drm/i915/intel_sdvo.c |   26 ++++++++++++++++++++++++++
 1 files changed, 26 insertions(+), 0 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c
index f899afd..eaacfd0 100644
--- a/drivers/gpu/drm/i915/intel_sdvo.c
+++ b/drivers/gpu/drm/i915/intel_sdvo.c
@@ -1628,6 +1628,32 @@ intel_sdvo_hdmi_sink_detect(struct drm_connector *connector, u16 response)
 	edid = drm_get_edid(&intel_output->base,
 			    intel_output->ddc_bus);
 
+	/* This is only applied to SDVO cards with multiple outputs */
+	if (edid == NULL && intel_sdvo_multifunc_encoder(intel_output)) {
+		uint8_t saved_ddc, temp_ddc;
+		saved_ddc = sdvo_priv->ddc_bus;
+		temp_ddc = sdvo_priv->ddc_bus >> 1;
+		/*
+		 * Don't use the 1 as the argument of DDC bus switch to get
+		 * the EDID. It is used for SDVO SPD ROM.
+		 */
+		while(temp_ddc > 1) {
+			sdvo_priv->ddc_bus = temp_ddc;
+			edid = drm_get_edid(&intel_output->base,
+				intel_output->ddc_bus);
+			if (edid) {
+				/*
+				 * When we can get the EDID, maybe it is the
+				 * correct DDC bus. Update it.
+				 */
+				sdvo_priv->ddc_bus = temp_ddc;
+				break;
+			}
+			temp_ddc >>= 1;
+		}
+		if (edid == NULL)
+			sdvo_priv->ddc_bus = saved_ddc;
+	}
 	/* when there is no edid and no monitor is connected with VGA
 	 * port, try to use the CRT ddc to read the EDID for DVI-connector
 	 */
-- 
1.5.4.5




More information about the Intel-gfx mailing list