When the slave address is found for the SDVO port, the SDVO device will
be initialzied. Otherwise it will be skipped.

http://bugs.freedesktop.org/show_bug.cgi?id=20429

Signed-off-by: Zhao Yakui <[email protected]>
---
 src/i830_sdvo.c |   49 ++++++++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 46 insertions(+), 3 deletions(-)

Index: xf86-video-intel/src/i830_sdvo.c
===================================================================
--- xf86-video-intel.orig/src/i830_sdvo.c       2009-05-27 14:34:41.000000000 
+0800
+++ xf86-video-intel/src/i830_sdvo.c    2009-05-27 14:37:22.000000000 +0800
@@ -2105,6 +2105,38 @@
     dev_priv->ddc_bus = 1 << num_bits;
 }
 
+/**
+ * find the slave address for the given SDVO port based on the info
+ * parsed in general definition blocks
+ * return zero if success and the slave address is returned.
+ * Otherwise it will return non-zero.
+ */
+static
+int i830_find_sdvo_slave(ScrnInfoPtr pScrn, int output_device,
+                         uint8_t *slave_addr)
+{
+    uint8_t temp_slave_addr;
+    I830Ptr pI830 = I830PTR(pScrn);
+    uint8_t dvo_port;
+    struct sdvo_device_mapping *p_mapping;
+
+    if (output_device == SDVOB)
+       /* DEVICE_PORT_DVOB */
+       dvo_port = 0;
+    else
+       /* DEVICE_POTR_DVOC */
+       dvo_port = 1;
+
+    p_mapping = &(pI830->sdvo_mappings[dvo_port]);
+    temp_slave_addr = p_mapping->slave_addr;
+    if (!temp_slave_addr) {
+       /* no slave address. return failure */
+       return 1;
+    }
+
+    *slave_addr = temp_slave_addr;
+    return 0;
+}
 
 Bool
 i830_sdvo_init(ScrnInfoPtr pScrn, int output_device)
@@ -2115,7 +2147,20 @@
     int                            i;
     unsigned char          ch[0x40];
     I2CBusPtr              i2cbus = NULL, ddcbus;
+    uint8_t slave_addr;
+    int ret_value;
 
+    slave_addr = 0;
+    ret_value = i830_find_sdvo_slave(pScrn, output_device, &slave_addr);
+    if (ret_value) {
+       /* No slave address can be found for the SDVO port, return false.
+        * If it is incorrect, please fix me
+        */
+        xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+                    "Skip the detecion of SDVO%s\n",
+                    (output_device == SDVOB)?"B":"C");
+       return FALSE;
+    }
     output = xf86OutputCreate (pScrn, &i830_sdvo_output_funcs,NULL);
     if (!output)
        return FALSE;
@@ -2150,14 +2195,12 @@
        xf86OutputDestroy (output);
        return FALSE;
     }
-
     if (output_device == SDVOB) {
        dev_priv->d.DevName = "SDVO Controller B";
-       dev_priv->d.SlaveAddr = 0x70;
     } else {
        dev_priv->d.DevName = "SDVO Controller C";
-       dev_priv->d.SlaveAddr = 0x72;
     }
+    dev_priv->d.SlaveAddr = slave_addr;
     dev_priv->d.pI2CBus = i2cbus;
     dev_priv->d.DriverPrivate.ptr = output;
     dev_priv->output_device = output_device;



------------------------------------------------------------------------------
Register Now for Creativity and Technology (CaT), June 3rd, NYC. CaT 
is a gathering of tech-side developers & brand creativity professionals. Meet
the minds behind Google Creative Lab, Visual Complexity, Processing, & 
iPhoneDevCamp as they present alongside digital heavyweights like Barbarian 
Group, R/GA, & Big Spaceship. http://p.sf.net/sfu/creativitycat-com 
--
_______________________________________________
Dri-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/dri-devel

Reply via email to