intelfb: use firmware EDID for mode database
authorAntonino A. Daplas <adaplas@gmail.com>
Mon, 29 May 2006 08:49:08 +0000 (18:49 +1000)
committerDave Airlie <airlied@linux.ie>
Mon, 29 May 2006 08:49:08 +0000 (18:49 +1000)
Use firmware EDID for the driver's private mode database.

Signed-off-by: Antonino Daplas <adaplas@pol.net>
Cc: Sylvain Meyer <sylvain.meyer@worldonline.fr>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Dave Airlie <airlied@linux.ie>
drivers/video/intelfb/intelfbdrv.c

index 65059ba32044dac9372038c0bca8e791ecabdff0..dfe2abc63aad8b4a4e60d571d18a3a0feb2928f6 100644 (file)
 
 #include "intelfb.h"
 #include "intelfbhw.h"
+#include "../edid.h"
 
 static void __devinit get_initial_mode(struct intelfb_info *dinfo);
 static void update_dinfo(struct intelfb_info *dinfo,
@@ -1031,13 +1032,42 @@ intelfb_init_var(struct intelfb_info *dinfo)
                       sizeof(struct fb_var_screeninfo));
                msrc = 5;
        } else {
+               const u8 *edid_s = fb_firmware_edid(&dinfo->pdev->dev);
+               u8 *edid_d = NULL;
+
+               if (edid_s) {
+                       edid_d = kmalloc(128, GFP_KERNEL);
+
+                       if (edid_d) {
+                               memcpy(edid_d, edid_s, 128);
+                               fb_edid_to_monspecs(edid_d,
+                                                   &dinfo->info->monspecs);
+                               kfree(edid_d);
+                       }
+               }
+
                if (mode) {
+                       printk("intelfb: Looking for mode in private "
+                              "database\n");
                        msrc = fb_find_mode(var, dinfo->info, mode,
-                                           vesa_modes, VESA_MODEDB_SIZE,
+                                           dinfo->info->monspecs.modedb,
+                                           dinfo->info->monspecs.modedb_len,
                                            NULL, 0);
-                       if (msrc)
-                               msrc |= 8;
+
+                       if (msrc && msrc > 1) {
+                               printk("intelfb: No mode in private database, "
+                                      "intelfb: looking for mode in global "
+                                      "database ");
+                               msrc = fb_find_mode(var, dinfo->info, mode,
+                                                   vesa_modes,
+                                                   VESA_MODEDB_SIZE, NULL, 0);
+
+                               if (msrc)
+                                       msrc |= 8;
+                       }
+
                }
+
                if (!msrc) {
                        msrc = fb_find_mode(var, dinfo->info, PREFERRED_MODE,
                                            vesa_modes, VESA_MODEDB_SIZE,