+static void fix_broken_edid(unsigned char *edid)
+{
+ unsigned char *block = edid + ID_MANUFACTURER_NAME, manufacturer[4];
+ u32 model, i;
+
+ manufacturer[0] = ((block[0] & 0x7c) >> 2) + '@';
+ manufacturer[1] = ((block[0] & 0x03) << 3) +
+ ((block[1] & 0xe0) >> 5) + '@';
+ manufacturer[2] = (block[1] & 0x1f) + '@';
+ manufacturer[3] = 0;
+ model = block[2] + (block[3] << 8);
+
+ for (i = 0; i < ARRAY_SIZE(brokendb); i++) {
+ if (!strncmp(manufacturer, brokendb[i].manufacturer, 4) &&
+ brokendb[i].model == model) {
+ switch (brokendb[i].fix) {
+ case FBMON_FIX_HEADER:
+ printk("fbmon: The EDID header of "
+ "Manufacturer: %s Model: 0x%x is "
+ "known to be broken,\n"
+ "fbmon: trying a header "
+ "reconstruct\n", manufacturer, model);
+ memcpy(edid, edid_v1_header, 8);
+ break;
+ }
+ }
+ }
+}
+