|
@@ -606,26 +606,43 @@ done:
|
|
DPRINTK("Trying specified video mode%s %ix%i\n",
|
|
DPRINTK("Trying specified video mode%s %ix%i\n",
|
|
refresh_specified ? "" : " (ignoring refresh rate)", xres, yres);
|
|
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;
|
|
best = -1;
|
|
for (i = 0; i < dbsize; i++) {
|
|
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) {
|
|
if (best != -1) {
|
|
fb_try_mode(var, info, &db[best], bpp);
|
|
fb_try_mode(var, info, &db[best], bpp);
|
|
- return 2;
|
|
|
|
|
|
+ return (refresh_specified) ? 2 : 1;
|
|
}
|
|
}
|
|
|
|
|
|
diff = xres + yres;
|
|
diff = xres + yres;
|