X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;ds=sidebyside;f=drivers%2Fvideo%2Fmodedb.c;h=d046edf1ef5879cad6e061edbf1da24a51937635;hb=9bf4aaab3e101692164d49b7ca357651eb691cb6;hp=cd157349c377075e29e6cea7d3168e83e2e72ebd;hpb=db216c3d5e4c040e557a50f8f5d35d5c415e8c1c;p=linux-2.6.git diff --git a/drivers/video/modedb.c b/drivers/video/modedb.c index cd157349c..d046edf1e 100644 --- a/drivers/video/modedb.c +++ b/drivers/video/modedb.c @@ -490,6 +490,7 @@ int fb_find_mode(struct fb_var_screeninfo *var, int res_specified = 0, bpp_specified = 0, refresh_specified = 0; unsigned int xres = 0, yres = 0, bpp = default_bpp, refresh = 0; int yres_specified = 0; + u32 best = -1, diff = -1; for (i = namelen-1; i >= 0; i--) { switch (name[i]) { @@ -529,8 +530,8 @@ int fb_find_mode(struct fb_var_screeninfo *var, } done: for (i = refresh_specified; i >= 0; i--) { - DPRINTK("Trying specified video mode%s\n", - i ? "" : " (ignoring refresh rate)"); + DPRINTK("Trying specified video mode%s %ix%i\n", + i ? "" : " (ignoring refresh rate)", xres, yres); for (j = 0; j < dbsize; j++) if ((name_matches(db[j], name, namelen) || (res_specified && res_matches(db[j], xres, yres))) && @@ -538,6 +539,22 @@ done: !fb_try_mode(var, info, &db[j], bpp)) return 2-i; } + DPRINTK("Trying best-fit modes\n"); + for (i = 0; i < dbsize; i++) { + if (xres <= db[i].xres && yres <= db[i].yres) { + DPRINTK("Trying %ix%i\n", db[i].xres, db[i].yres); + if (!fb_try_mode(var, info, &db[i], bpp)) { + if (diff > (db[i].xres - xres) + (db[i].yres - yres)) { + diff = (db[i].xres - xres) + (db[i].yres - yres); + best = i; + } + } + } + } + if (best != -1) { + fb_try_mode(var, info, &db[best], bpp); + return 5; + } } DPRINTK("Trying default video mode\n");