[Intel-gfx] [PATCH] switch control bus to ddc active state only one time during edid transmission

Zhenyu Wang zhenyuw at linux.intel.com
Fri Apr 24 05:04:14 CEST 2009


On 2009.04.16 16:51:01 +0800, Ma Ling wrote:
> 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>
> Signed-off-by: Ma Ling <ling.ma at intel.com>
> ---
>  src/i830_sdvo.c |   12 ++++++++++--
>  1 files changed, 10 insertions(+), 2 deletions(-)
> 
> diff --git a/src/i830_sdvo.c b/src/i830_sdvo.c
> index 29ccd4e..a50feb1 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;
> @@ -1397,7 +1400,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);
>  }
>  
> @@ -1408,11 +1414,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;
>  }
>  
>  /**
> @@ -1715,7 +1723,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);
> @@ -2192,6 +2199,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)) 
>      {
> -- 
> 1.5.4.4
> 

Pushed. I kept the author with me for original patch ;)

Could you test KMS to verify if this issue is also within it or not?

Thanks.

-- 
Open Source Technology Center, Intel ltd.

$gpg --keyserver wwwkeys.pgp.net --recv-keys 4D781827
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 197 bytes
Desc: Digital signature
URL: <http://lists.freedesktop.org/archives/intel-gfx/attachments/20090424/b214389c/attachment.sig>


More information about the Intel-gfx mailing list