Try to read the first 256 bytes from the SDVO SPD ROM. --- drivers/gpu/drm/i915/intel_sdvo.c | 42 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 40 insertions(+), 2 deletions(-) Index: linux-2.6.32-rc3/drivers/gpu/drm/i915/intel_sdvo.c =================================================================== --- linux-2.6.32-rc3.orig/drivers/gpu/drm/i915/intel_sdvo.c 2009-10-09 17:43:14.000000000 +0800 +++ linux-2.6.32-rc3/drivers/gpu/drm/i915/intel_sdvo.c 2009-10-12 11:51:38.000000000 +0800 @@ -47,7 +47,7 @@ "SECAM_K" , "SECAM_K1", "SECAM_L" , "SECAM_60" }; - +u8 spd_buffer[256]; #define TV_FORMAT_NUM (sizeof(tv_format_names) / sizeof(*tv_format_names)) struct intel_sdvo_priv { @@ -2666,6 +2666,19 @@ return; } +static void sdvo_print_spd() +{ + int i; + printk(KERN_DEBUG "SPD ROM"); + for (i = 0; i < 256; i++) { + if (i % 16 ==0) + printk("\n\t%x, ", spd_buffer[i]); + else + printk("%x ", spd_buffer[i]); + } + printk(KERN_DEBUG "\nEnd SPD ROM\n"); + return; +} bool intel_sdvo_init(struct drm_device *dev, int output_device) { struct drm_connector *connector; @@ -2708,7 +2721,32 @@ goto err_i2c; } } - + if (output_device == SDVOB) + { + u8 out_buf; + struct i2c_msg temp_msgs[] = { + { + .addr = DDC_ADDR, + .flags = 0, + .len = 1, + .buf = &out_buf, + }, + { + .addr = DDC_ADDR, + .flags = I2C_M_RD, + .len = 256, + .buf = spd_buffer, + }, + }; + out_buf = 0; + /* switch to SPD DDC */ + intel_sdvo_set_control_bus_switch(intel_output, 1); + if (i2c_transfer(intel_output->i2c_bus, temp_msgs, 2) == 2) { + sdvo_print_spd(); + } else { + printk(KERN_DEBUG "Can't read the SDVO SPD ROM\n"); + } + } /* setup the DDC bus. */ if (output_device == SDVOB) { intel_output->ddc_bus = intel_i2c_create(dev, GPIOE, "SDVOB DDC BUS");