55 lines
1.6 KiB
Diff
55 lines
1.6 KiB
Diff
diff -up linux-2.6.35.x86_64/drivers/gpu/drm/drm_edid.c.da linux-2.6.35.x86_64/drivers/gpu/drm/drm_edid.c
|
|
--- linux-2.6.35.x86_64/drivers/gpu/drm/drm_edid.c.da 2010-08-01 18:11:14.000000000 -0400
|
|
+++ linux-2.6.35.x86_64/drivers/gpu/drm/drm_edid.c 2010-11-11 20:46:10.000000000 -0500
|
|
@@ -229,7 +229,7 @@ drm_do_probe_ddc_edid(struct i2c_adapter
|
|
.addr = DDC_ADDR,
|
|
.flags = I2C_M_RD,
|
|
.len = len,
|
|
- .buf = buf + start,
|
|
+ .buf = buf,
|
|
}
|
|
};
|
|
|
|
@@ -242,7 +242,7 @@ drm_do_probe_ddc_edid(struct i2c_adapter
|
|
static u8 *
|
|
drm_do_get_edid(struct drm_connector *connector, struct i2c_adapter *adapter)
|
|
{
|
|
- int i, j = 0;
|
|
+ int i, j = 0, valid_extensions = 0;
|
|
u8 *block, *new;
|
|
|
|
if ((block = kmalloc(EDID_LENGTH, GFP_KERNEL)) == NULL)
|
|
@@ -269,14 +269,28 @@ drm_do_get_edid(struct drm_connector *co
|
|
|
|
for (j = 1; j <= block[0x7e]; j++) {
|
|
for (i = 0; i < 4; i++) {
|
|
- if (drm_do_probe_ddc_edid(adapter, block, j,
|
|
- EDID_LENGTH))
|
|
+ if (drm_do_probe_ddc_edid(adapter,
|
|
+ block + (valid_extensions + 1) * EDID_LENGTH,
|
|
+ j, EDID_LENGTH))
|
|
goto out;
|
|
- if (drm_edid_block_valid(block + j * EDID_LENGTH))
|
|
+ if (drm_edid_block_valid(block + (valid_extensions + 1) * EDID_LENGTH)) {
|
|
+ valid_extensions++;
|
|
break;
|
|
+ }
|
|
}
|
|
if (i == 4)
|
|
- goto carp;
|
|
+ printk(KERN_WARNING
|
|
+ "%s: Ignoring invalid EDID block %d.\n",
|
|
+ drm_get_connector_name(connector), j);
|
|
+ }
|
|
+
|
|
+ if (valid_extensions != block[0x7e]) {
|
|
+ block[EDID_LENGTH-1] += block[0x7e] - valid_extensions;
|
|
+ block[0x7e] = valid_extensions;
|
|
+ new = krealloc(block, (valid_extensions + 1) * EDID_LENGTH, GFP_KERNEL);
|
|
+ if (!new)
|
|
+ goto out;
|
|
+ block = new;
|
|
}
|
|
|
|
return block;
|