--- radeon_i2c.c.orig 2007-03-21 22:53:31.000000000 +0100 +++ radeon_i2c.c 2007-03-26 14:20:13.000000000 +0200 @@ -136,35 +136,58 @@ rinfo->i2c[3].rinfo = NULL; } -int radeon_probe_i2c_connector(struct radeonfb_info *rinfo, int conn, - u8 **out_edid) +int radeon_probe_i2c_connector(struct radeonfb_info *rinfo, struct radeon_connector *conn) { - u32 reg = rinfo->i2c[conn-1].ddc_reg; + int mon_type = MT_NONE; u8 *edid; - OUTREG(reg, INREG(reg) & - ~(VGA_DDC_DATA_OUTPUT | VGA_DDC_CLK_OUTPUT)); + if (!conn) + return 1; - edid = fb_ddc_read(&rinfo->i2c[conn-1].adapter); + if (rinfo->is_mobility && (conn->ddc_type == ddc_none) && + (INREG(LVDS_GEN_CNTL) & (LVDS_ON|LVDS_EN))) { + RTRACE("radeonfb: I2C (port %d) ... found LVDS panel\n", conn->ddc_type); + mon_type = MT_LCD; + edid = NULL; + goto done; + } + + if (conn->ddc_type == ddc_none) + return 1; - if (out_edid) - *out_edid = edid; - if (!edid) { - RTRACE("radeonfb: I2C (port %d) ... not found\n", conn); - return MT_NONE; + edid = fb_ddc_read(&rinfo->i2c[conn->ddc_type].adapter); + + if (!edid) { + /* what about the special case where we are a DFP/LVDS, but have a DDC connection + * but no EDID? We should fall back to MT_LCD...? XXXX + */ + RTRACE("radeonfb: I2C (port %d) ... not found\n", conn->ddc_type); + mon_type = MT_NONE; + goto done; + } + if ((edid[EDID_STRUCT_DISPLAY] & 0x80) && (conn->ddc_type == ddc_dvi)) { + RTRACE("radeonfb: I2C (port %d) ... found TMDS panel\n", conn->ddc_type); + mon_type = MT_DFP; + goto done; } - if (edid[0x14] & 0x80) { - /* Fix detection using BIOS tables */ - if (rinfo->is_mobility /*&& conn == ddc_dvi*/ && - (INREG(LVDS_GEN_CNTL) & LVDS_ON)) { - RTRACE("radeonfb: I2C (port %d) ... found LVDS panel\n", conn); - return MT_LCD; - } else { - RTRACE("radeonfb: I2C (port %d) ... found TMDS panel\n", conn); - return MT_DFP; - } + + if (rinfo->is_mobility && + (conn->conn_type == conn_lvds) && + (edid[EDID_STRUCT_DISPLAY] & 0x80) && // ie EDID valid and marks us as a DFP... + (INREG(LVDS_GEN_CNTL) & (LVDS_ON|LVDS_EN))) { + RTRACE("radeonfb: I2C (port %d) ... found LVDS panel\n", conn->ddc_type); + mon_type = MT_LCD; + goto done; } - RTRACE("radeonfb: I2C (port %d) ... found CRT display\n", conn); - return MT_CRT; + + RTRACE("radeonfb: I2C (port %d) ... found CRT display\n", conn->ddc_type); + mon_type = MT_CRT; + + done: + conn->edid = edid; + conn->mon_type = mon_type; + + return (mon_type == MT_NONE); } +