xf86-video-intel: src/i830_sdvo.c

Zhenyu Wang zhen at kemper.freedesktop.org
Thu Apr 23 20:21:58 PDT 2009


 src/i830_sdvo.c |   12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

New commits:
commit 106e4b44c5af6552cbd079c4ec34def9dcfb168a
Author: Zhenyu Wang <zhenyu.z.wang at intel.com>
Date:   Fri Apr 24 10:55:09 2009 +0800

    SDVO: switch bus once for i2c transfer
    
    Before sdvo try to get edid by i2c bus, it must do switch control bus to ddc active state from sdvo only state.
    However if current state has been ddc active state, redundant switch operation in our driver will cause error-
    "Unable to write to SDVOCTRL_E for SDVOB Slave 0x70". The patch will do switch control bus only one time during
    whole edid transmission.
    
    It has fixed bug #19937
    
    Signed-off-by: Zhenyu Wang <zhenyu.z.wang at intel.com>
    Tested-by: Ma Ling <ling.ma at intel.com>
    Signed-off-by: Ma Ling <ling.ma at intel.com>

diff --git a/src/i830_sdvo.c b/src/i830_sdvo.c
index a291824..a4c9120 100644
--- a/src/i830_sdvo.c
+++ b/src/i830_sdvo.c
@@ -114,6 +114,9 @@ struct i830_sdvo_priv {
     /* Default 0 for full RGB range 0-255, 1 is for RGB range 16-235 */
     uint32_t broadcast_rgb;
 
+    /** This flag means if we should switch ddc bus before next i2c Start */
+    Bool ddc_bus_switch;
+
     /** State for save/restore */
     /** @{ */
     int save_sdvo_mult;
@@ -1403,7 +1406,10 @@ i830_sdvo_ddc_i2c_start(I2CBusPtr b, int timeout)
     I2CBusPtr		    i2cbus = intel_output->pI2CBus;
     struct i830_sdvo_priv   *dev_priv = intel_output->dev_priv;
 
-    i830_sdvo_set_control_bus_switch(output, dev_priv->ddc_bus);
+    if (dev_priv->ddc_bus_switch) {
+        i830_sdvo_set_control_bus_switch(output, dev_priv->ddc_bus);
+        dev_priv->ddc_bus_switch = FALSE;
+    }
     return i2cbus->I2CStart(i2cbus, timeout);
 }
 
@@ -1414,11 +1420,13 @@ i830_sdvo_ddc_i2c_stop(I2CDevPtr d)
     xf86OutputPtr	    output = d->pI2CBus->DriverPrivate.ptr;
     I830OutputPrivatePtr    intel_output = output->driver_private;
     I2CBusPtr		    i2cbus = intel_output->pI2CBus, savebus;
+    struct i830_sdvo_priv   *dev_priv = intel_output->dev_priv;
 
     savebus = d->pI2CBus;
     d->pI2CBus = i2cbus;
     i2cbus->I2CStop(d);
     d->pI2CBus = savebus;
+    dev_priv->ddc_bus_switch = TRUE;
 }
 
 /**
@@ -1721,7 +1729,6 @@ i830_sdvo_detect(xf86OutputPtr output)
     {
 	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);
@@ -2199,6 +2206,7 @@ i830_sdvo_init(ScrnInfoPtr pScrn, int output_device)
     ddcbus->I2CStop = i830_sdvo_ddc_i2c_stop;
     ddcbus->I2CAddress = i830_sdvo_ddc_i2c_address;
     ddcbus->DriverPrivate.ptr = output;
+    dev_priv->ddc_bus_switch = TRUE;
     
     if (!xf86I2CBusInit(ddcbus)) 
     {


More information about the xorg-commit mailing list