diff options
| author | Takashi Iwai <tiwai@suse.de> | 2011-08-08 14:30:29 +0200 | 
|---|---|---|
| committer | Takashi Iwai <tiwai@suse.de> | 2011-08-08 14:30:29 +0200 | 
| commit | 0a2d31b62dba9b5b92a38c67c9cc42630513662a (patch) | |
| tree | f755d74ec85248de645e10c45ed1a2ed467530f6 /drivers/gpu/drm/radeon/radeon_i2c.c | |
| parent | 8039290a91c5dc4414093c086987a5d7738fe2fd (diff) | |
| parent | df944f66784e6d4f2f50739263a4947885d8b6ae (diff) | |
Merge branch 'fix/kconfig' into for-linus
Diffstat (limited to 'drivers/gpu/drm/radeon/radeon_i2c.c')
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_i2c.c | 32 | 
1 files changed, 24 insertions, 8 deletions
| diff --git a/drivers/gpu/drm/radeon/radeon_i2c.c b/drivers/gpu/drm/radeon/radeon_i2c.c index 781196db792f..6c111c1fa3f9 100644 --- a/drivers/gpu/drm/radeon/radeon_i2c.c +++ b/drivers/gpu/drm/radeon/radeon_i2c.c @@ -32,17 +32,17 @@   * radeon_ddc_probe   *   */ -bool radeon_ddc_probe(struct radeon_connector *radeon_connector) +bool radeon_ddc_probe(struct radeon_connector *radeon_connector, bool requires_extended_probe)  { -	u8 out_buf[] = { 0x0, 0x0}; -	u8 buf[2]; +	u8 out = 0x0; +	u8 buf[8];  	int ret;  	struct i2c_msg msgs[] = {  		{  			.addr = 0x50,  			.flags = 0,  			.len = 1, -			.buf = out_buf, +			.buf = &out,  		},  		{  			.addr = 0x50, @@ -52,15 +52,31 @@ bool radeon_ddc_probe(struct radeon_connector *radeon_connector)  		}  	}; +	/* Read 8 bytes from i2c for extended probe of EDID header */ +	if (requires_extended_probe) +		msgs[1].len = 8; +  	/* on hw with routers, select right port */  	if (radeon_connector->router.ddc_valid)  		radeon_router_select_ddc_port(radeon_connector);  	ret = i2c_transfer(&radeon_connector->ddc_bus->adapter, msgs, 2); -	if (ret == 2) -		return true; - -	return false; +	if (ret != 2) +		/* Couldn't find an accessible DDC on this connector */ +		return false; +	if (requires_extended_probe) { +		/* Probe also for valid EDID header +		 * EDID header starts with: +		 * 0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00. +		 * Only the first 6 bytes must be valid as +		 * drm_edid_block_valid() can fix the last 2 bytes */ +		if (drm_edid_header_is_valid(buf) < 6) { +			/* Couldn't find an accessible EDID on this +			 * connector */ +			return false; +		} +	} +	return true;  }  /* bit banging i2c */ | 
