]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/video/modedb.c
[SCSI] sym2: fix section mismatch warning
[linux-2.6-omap-h63xx.git] / drivers / video / modedb.c
index 3741ad729401c02226a60b8d7a0a20e9e3638579..8d81ef019c6c6f8de6a5eeb6013b061de650a649 100644 (file)
@@ -27,7 +27,7 @@
 #define DPRINTK(fmt, args...)
 #endif
 
-const char *global_mode_option;
+const char *fb_mode_option;
 
     /*
      *  Standard video mode definitions (taken from XFree86)
@@ -72,7 +72,7 @@ static const struct fb_videomode modedb[] = {
        0, FB_VMODE_NONINTERLACED
     }, {
        /* 1152x864 @ 89 Hz interlaced, 44 kHz hsync */
-       NULL, 69, 1152, 864, 15384, 96, 16, 110, 1, 216, 10,
+       NULL, 89, 1152, 864, 15384, 96, 16, 110, 1, 216, 10,
        0, FB_VMODE_INTERLACED
     }, {
        /* 800x600 @ 72 Hz, 48.0 kHz hsync */
@@ -120,11 +120,11 @@ static const struct fb_videomode modedb[] = {
        0, FB_VMODE_NONINTERLACED
     }, {
        /* 1400x1050 @ 60Hz, 63.9 kHz hsync */
-       NULL, 68, 1400, 1050, 9259, 136, 40, 13, 1, 112, 3,
+       NULL, 60, 1400, 1050, 9259, 136, 40, 13, 1, 112, 3,
        0, FB_VMODE_NONINTERLACED       
     }, {
        /* 1400x1050 @ 75,107 Hz, 82,392 kHz +hsync +vsync*/
-       NULL, 75, 1400, 1050, 9271, 120, 56, 13, 0, 112, 3,
+       NULL, 75, 1400, 1050, 7190, 120, 56, 23, 10, 112, 13,
        FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
     }, {
        /* 1400x1050 @ 60 Hz, ? kHz +hsync +vsync*/
@@ -253,7 +253,7 @@ static const struct fb_videomode modedb[] = {
        FB_VMODE_NONINTERLACED
     }, {
        /* 1152x768, 60 Hz, PowerBook G4 Titanium I and II */
-       NULL, 60, 1152, 768, 15386, 158, 26, 29, 3, 136, 6,
+       NULL, 60, 1152, 768, 14047, 158, 26, 29, 3, 136, 6,
        FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
     }, {
        /* 1366x768, 60 Hz, 47.403 kHz hsync, WXGA 16:9 aspect ratio */
@@ -306,7 +306,7 @@ const struct fb_videomode vesa_modes[] = {
          FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
          FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
         /* 12 1024x768i-43 VESA */
-       { NULL, 53, 1024, 768, 22271, 56, 8, 41, 0, 176, 8,
+       { NULL, 43, 1024, 768, 22271, 56, 8, 41, 0, 176, 8,
          FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
          FB_VMODE_INTERLACED, FB_MODE_IS_VESA },
        /* 13 1024x768-60 VESA */
@@ -383,7 +383,7 @@ const struct fb_videomode vesa_modes[] = {
        { NULL, 60, 1920, 1440, 4273, 344, 128, 56, 1, 200, 3,
          FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
        /* 33 1920x1440-75 VESA */
-       { NULL, 60, 1920, 1440, 3367, 352, 144, 56, 1, 224, 3,
+       { NULL, 75, 1920, 1440, 3367, 352, 144, 56, 1, 224, 3,
          FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
 };
 EXPORT_SYMBOL(vesa_modes);
@@ -510,7 +510,9 @@ int fb_find_mode(struct fb_var_screeninfo *var,
        default_bpp = 8;
 
     /* Did the user specify a video mode? */
-    if (mode_option || (mode_option = global_mode_option)) {
+    if (!mode_option)
+       mode_option = fb_mode_option;
+    if (mode_option) {
        const char *name = mode_option;
        unsigned int namelen = strlen(name);
        int res_specified = 0, bpp_specified = 0, refresh_specified = 0;
@@ -606,26 +608,43 @@ done:
        DPRINTK("Trying specified video mode%s %ix%i\n",
            refresh_specified ? "" : " (ignoring refresh rate)", xres, yres);
 
-       diff = refresh;
+       if (!refresh_specified) {
+               /*
+                * If the caller has provided a custom mode database and a
+                * valid monspecs structure, we look for the mode with the
+                * highest refresh rate.  Otherwise we play it safe it and
+                * try to find a mode with a refresh rate closest to the
+                * standard 60 Hz.
+                */
+               if (db != modedb &&
+                   info->monspecs.vfmin && info->monspecs.vfmax &&
+                   info->monspecs.hfmin && info->monspecs.hfmax &&
+                   info->monspecs.dclkmax) {
+                       refresh = 1000;
+               } else {
+                       refresh = 60;
+               }
+       }
+
+       diff = -1;
        best = -1;
        for (i = 0; i < dbsize; i++) {
-               if (name_matches(db[i], name, namelen) ||
-                   (res_specified && res_matches(db[i], xres, yres))) {
-                       if(!fb_try_mode(var, info, &db[i], bpp)) {
-                               if(!refresh_specified || db[i].refresh == refresh)
-                                       return 1;
-                               else {
-                                       if(diff > abs(db[i].refresh - refresh)) {
-                                               diff = abs(db[i].refresh - refresh);
-                                               best = i;
-                                       }
+               if ((name_matches(db[i], name, namelen) ||
+                   (res_specified && res_matches(db[i], xres, yres))) &&
+                   !fb_try_mode(var, info, &db[i], bpp)) {
+                       if (refresh_specified && db[i].refresh == refresh) {
+                               return 1;
+                       } else {
+                               if (abs(db[i].refresh - refresh) < diff) {
+                                       diff = abs(db[i].refresh - refresh);
+                                       best = i;
                                }
                        }
                }
        }
        if (best != -1) {
                fb_try_mode(var, info, &db[best], bpp);
-               return 2;
+               return (refresh_specified) ? 2 : 1;
        }
 
        diff = xres + yres;
@@ -938,6 +957,7 @@ void fb_destroy_modelist(struct list_head *head)
                kfree(pos);
        }
 }
+EXPORT_SYMBOL_GPL(fb_destroy_modelist);
 
 /**
  * fb_videomode_to_modelist: convert mode array to mode list