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
