From: Benjamin Herrenschmidt <benh@kernel.crashing.org>

Current radeonfb is a bit "anal" about accepting CRT modes, it basically
only accepts modes that have the exact resolution, which tends to break
with fbcon on console switches as it provides "approximate" modes.  This
patch fixes it by having the driver chose the closest possible mode instead
of looking for an exact match.

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
---

 25-akpm/drivers/video/aty/radeon_monitor.c |   22 ++++++++++------------
 1 files changed, 10 insertions(+), 12 deletions(-)

diff -puN drivers/video/aty/radeon_monitor.c~radeonfb-fix-mode-setting-on-crt-monitors drivers/video/aty/radeon_monitor.c
--- 25/drivers/video/aty/radeon_monitor.c~radeonfb-fix-mode-setting-on-crt-monitors	2005-03-30 18:03:11.000000000 -0800
+++ 25-akpm/drivers/video/aty/radeon_monitor.c	2005-03-30 18:03:11.000000000 -0800
@@ -901,7 +901,7 @@ void __devinit radeon_check_modes(struct
  */
 
 /*
- * This is used when looking for modes. We assign a "goodness" value
+ * This is used when looking for modes. We assign a "distance" value
  * to a mode in the modedb depending how "close" it is from what we
  * are looking for.
  * Currently, we don't compare that much, we could do better but
@@ -910,13 +910,11 @@ void __devinit radeon_check_modes(struct
 static int radeon_compare_modes(const struct fb_var_screeninfo *var,
 				const struct fb_videomode *mode)
 {
-	int goodness = 0;
+	int distance = 0;
 
-	if (var->yres == mode->yres)
-		goodness += 10;
-	if (var->xres == mode->xres)
-		goodness += 9;
-	return goodness;
+	distance = mode->yres - var->yres;
+	distance += (mode->xres - var->xres)/2;
+	return distance;
 }
 
 /*
@@ -938,7 +936,7 @@ int  radeon_match_mode(struct radeonfb_i
 	const struct fb_videomode	*db = vesa_modes;
 	int				i, dbsize = 34;
 	int				has_rmx, native_db = 0;
-	int				goodness = 0;
+	int				distance = INT_MAX;
 	const struct fb_videomode	*candidate = NULL;
 
 	/* Start with a copy of the requested mode */
@@ -974,19 +972,19 @@ int  radeon_match_mode(struct radeonfb_i
 	/* Now look for a mode in the database */
 	while (db) {
 		for (i = 0; i < dbsize; i++) {
-			int g;
+			int d;
 
 			if (db[i].yres < src->yres)
 				continue;	
 			if (db[i].xres < src->xres)
 				continue;
-			g = radeon_compare_modes(src, &db[i]);
+			d = radeon_compare_modes(src, &db[i]);
 			/* If the new mode is at least as good as the previous one,
 			 * then it's our new candidate
 			 */
-			if (g >= goodness) {
+			if (d < distance) {
 				candidate = &db[i];
-				goodness = g;
+				distance = d;
 			}
 		}
 		db = NULL;
_