From: Michal Januszewski Currently the fb_find_nearest_mode() function finds a mode with screen resolution closest to that described by the 'var' argument and with some arbitrary refresh rate (eg. in the following sequence of refresh rates: 70 60 53 85 75, 53 is selected). This patch fixes the function so that it looks for the closest mode as far as both resolution and refresh rate are concerned. The function's first argument is changed to fb_videomode so that the refresh rate can be specified by the caller, as fb_var_screeninfo doesn't have any fields that could directly hold this data. Signed-off-by: Michal Januszewski Signed-off-by: Antonino Daplas Signed-off-by: Andrew Morton --- drivers/video/console/fbcon.c | 3 ++- drivers/video/modedb.c | 24 +++++++++++++----------- include/linux/fb.h | 2 +- 3 files changed, 16 insertions(+), 13 deletions(-) diff -puN drivers/video/console/fbcon.c~fbdev-fix-the-fb_find_nearest_mode-function drivers/video/console/fbcon.c --- devel/drivers/video/console/fbcon.c~fbdev-fix-the-fb_find_nearest_mode-function 2005-10-18 19:12:22.000000000 -0700 +++ devel-akpm/drivers/video/console/fbcon.c 2005-10-18 19:12:22.000000000 -0700 @@ -2715,7 +2715,8 @@ static void fbcon_new_modelist(struct fb continue; vc = vc_cons[i].d; display_to_var(&var, &fb_display[i]); - mode = fb_find_nearest_mode(&var, &info->modelist); + mode = fb_find_nearest_mode(fb_display[i].mode, + &info->modelist); fb_videomode_to_var(&var, mode); if (vc) diff -puN drivers/video/modedb.c~fbdev-fix-the-fb_find_nearest_mode-function drivers/video/modedb.c --- devel/drivers/video/modedb.c~fbdev-fix-the-fb_find_nearest_mode-function 2005-10-18 19:12:22.000000000 -0700 +++ devel-akpm/drivers/video/modedb.c 2005-10-18 19:12:22.000000000 -0700 @@ -676,6 +676,8 @@ void fb_var_to_videomode(struct fb_video mode->sync = var->sync; mode->vmode = var->vmode & FB_VMODE_MASK; mode->flag = FB_MODE_IS_FROM_VAR; + mode->refresh = 0; + if (!var->pixclock) return; @@ -785,39 +787,39 @@ struct fb_videomode *fb_find_best_mode(s } /** - * fb_find_nearest_mode - find mode closest video mode + * fb_find_nearest_mode - find closest videomode * - * @var: pointer to struct fb_var_screeninfo + * @mode: pointer to struct fb_videomode * @head: pointer to modelist * * Finds best matching videomode, smaller or greater in dimension. * If more than 1 videomode is found, will return the videomode with - * the closest refresh rate + * the closest refresh rate. */ -struct fb_videomode *fb_find_nearest_mode(struct fb_var_screeninfo *var, +struct fb_videomode *fb_find_nearest_mode(struct fb_videomode *mode, struct list_head *head) { struct list_head *pos; struct fb_modelist *modelist; - struct fb_videomode *mode, *best = NULL; + struct fb_videomode *cmode, *best = NULL; u32 diff = -1, diff_refresh = -1; list_for_each(pos, head) { u32 d; modelist = list_entry(pos, struct fb_modelist, list); - mode = &modelist->mode; + cmode = &modelist->mode; - d = abs(mode->xres - var->xres) + - abs(mode->yres - var->yres); + d = abs(cmode->xres - mode->xres) + + abs(cmode->yres - mode->yres); if (diff > d) { diff = d; - best = mode; + best = cmode; } else if (diff == d) { - d = abs(mode->refresh - best->refresh); + d = abs(cmode->refresh - mode->refresh); if (diff_refresh > d) { diff_refresh = d; - best = mode; + best = cmode; } } } diff -puN include/linux/fb.h~fbdev-fix-the-fb_find_nearest_mode-function include/linux/fb.h --- devel/include/linux/fb.h~fbdev-fix-the-fb_find_nearest_mode-function 2005-10-18 19:12:22.000000000 -0700 +++ devel-akpm/include/linux/fb.h 2005-10-18 19:12:22.000000000 -0700 @@ -897,7 +897,7 @@ extern struct fb_videomode *fb_match_mod struct list_head *head); extern struct fb_videomode *fb_find_best_mode(struct fb_var_screeninfo *var, struct list_head *head); -extern struct fb_videomode *fb_find_nearest_mode(struct fb_var_screeninfo *var, +extern struct fb_videomode *fb_find_nearest_mode(struct fb_videomode *mode, struct list_head *head); extern void fb_destroy_modelist(struct list_head *head); extern void fb_videomode_to_modelist(struct fb_videomode *modedb, int num, _