[PATCH] fbdev: find mode with the highest/safest refresh rate in fb_find_mode()



Currently, if the refresh rate is not specified, fb_find_mode() returns
the first known video mode with the requested resolution, which provides
no guarantees wrt the refresh rate. Change this so that the mode with
the highest refresh rate is returned when the driver provides a custom
video mode database and the monitor limits, and a mode with the safe
60 Hz refresh rate otherwise.

Signed-off-by: Michal Januszewski <spock@xxxxxxxxxx>
---
diff --git a/drivers/video/modedb.c b/drivers/video/modedb.c
index 3741ad7..9598c46 100644
--- a/drivers/video/modedb.c
+++ b/drivers/video/modedb.c
@@ -606,26 +606,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;

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/



Relevant Pages

  • SOLVED : openSUSE 10.3 : Video Mode Not Supported
    ... Linux Kernel loads OK; services, etc, ... At point where "gdm service" starts to load, ... Video mode for existing Win2K and Mandriva2007.0 dual-boot ... am assuming it is the refresh rate that the ...
    (alt.os.linux.suse)
  • Re: openSUSE 10.3 : Video Mode Not Supported
    ... Linux Kernel loads OK; services, etc, ... At point where "gdm service" starts to load, ... Video mode for existing Win2K and Mandriva2007.0 dual-boot ... am assuming it is the refresh rate that the ...
    (alt.os.linux.suse)
  • Re: openSUSE 10.3 : Video Mode Not Supported
    ... Video mode for existing Win2K and Mandriva2007.0 dual-boot ... am assuming it is the refresh rate that the ... the subsent install from that live CD in the same session. ... Perhaps I didn't make myself fully clear in my initial and followup postings, but when the screen blanks after "starting gdm" I can go no further - the screen remains like that. ...
    (alt.os.linux.suse)
  • Re: [PATCH] fbdev: find mode with highest refresh rate in fb_find_mode()
    ... the first known video mode with the requested resoluion, ... no guarantees wrt the refresh rate. ... the highest refresh rate is returned instead. ...
    (Linux-Kernel)
  • [PATCH] fbdev: find mode with highest refresh rate in fb_find_mode()
    ... Currently if the refresh rate is not specified fb_find_modereturns ... the first known video mode with the requested resoluion, ... no guarantees wrt the refresh rate. ...
    (Linux-Kernel)