From: "Antonino A. Daplas" <adaplas@hotpop.com>

This patch is entirely optional.  Its only advantage is reduction of kernel
size by ~5-6K.

a. Mark modedb as __init.

b. Add CONFIG_FB_MODE_HELPERS.  Unselecting this will uninclude the code
   for Generalized Timing Formula and the EDID parser on kernel compilation. 
   These are used only by radeonfb, rivafb and i810fb.

Signed-off-by: Antonino Daplas <adaplas@pol.net>
Signed-off-by: Andrew Morton <akpm@osdl.org>
---

 25-akpm/drivers/video/Kconfig  |   11 +++++++++++
 25-akpm/drivers/video/fbmon.c  |   31 +++++++++++++++++++++++++++++++
 25-akpm/drivers/video/modedb.c |    8 +++++---
 3 files changed, 47 insertions(+), 3 deletions(-)

diff -puN drivers/video/fbmon.c~video-mode-handling-reduce-memory-footprint-of-fbdev drivers/video/fbmon.c
--- 25/drivers/video/fbmon.c~video-mode-handling-reduce-memory-footprint-of-fbdev	2004-08-08 23:31:44.878799528 -0700
+++ 25-akpm/drivers/video/fbmon.c	2004-08-08 23:31:44.885798464 -0700
@@ -51,6 +51,7 @@
 
 #define FBMON_FIX_HEADER 1
 
+#ifdef CONFIG_FB_MODE_HELPERS
 struct broken_edid {
 	u8  manufacturer[4];
 	u32 model;
@@ -1156,6 +1157,36 @@ int fb_get_mode(int flags, u32 val, stru
 	
 	return 0;
 }
+#else
+int fb_parse_edid(unsigned char *edid, struct fb_var_screeninfo *var)
+{
+	return 1;
+}
+void fb_edid_to_monspecs(unsigned char *edid, struct fb_monspecs *specs)
+{
+	specs = NULL;
+}
+char *get_EDID_from_firmware(struct device *dev)
+{
+	return NULL;
+}
+struct fb_videomode *fb_create_modedb(unsigned char *edid, int *dbsize)
+{
+	return NULL;
+}
+void fb_destroy_modedb(struct fb_videomode *modedb)
+{
+}
+int fb_get_monitor_limits(unsigned char *edid, struct fb_monspecs *specs)
+{
+	return 1;
+}
+int fb_get_mode(int flags, u32 val, struct fb_var_screeninfo *var,
+		struct fb_info *info)
+{
+	return -EINVAL;
+}
+#endif /* CONFIG_FB_MODE_HELPERS */
 	
 /*
  * fb_validate_mode - validates var against monitor capabilities
diff -puN drivers/video/Kconfig~video-mode-handling-reduce-memory-footprint-of-fbdev drivers/video/Kconfig
--- 25/drivers/video/Kconfig~video-mode-handling-reduce-memory-footprint-of-fbdev	2004-08-08 23:31:44.880799224 -0700
+++ 25-akpm/drivers/video/Kconfig	2004-08-08 23:31:44.886798312 -0700
@@ -38,6 +38,17 @@ config FB
 	  (e.g. an accelerated X server) and that are not frame buffer
 	  device-aware may cause unexpected results. If unsure, say N.
 
+config FB_MODE_HELPERS
+        bool "Enable Video Mode Handling Helpers"
+        depends on FB
+	default y
+	---help---
+	  This enables functions for handling video modes using the
+	  Generalized Timing Formula and the EDID parser. A few drivers rely
+          on this feature such as the radeonfb, rivafb, and the i810fb. If
+	  your driver does not take advantage of this feature, choosing Y will
+	  just increase the kernel size by about 5K.
+
 config FB_CIRRUS
 	tristate "Cirrus Logic support"
 	depends on FB && (ZORRO || PCI)
diff -puN drivers/video/modedb.c~video-mode-handling-reduce-memory-footprint-of-fbdev drivers/video/modedb.c
--- 25/drivers/video/modedb.c~video-mode-handling-reduce-memory-footprint-of-fbdev	2004-08-08 23:31:44.881799072 -0700
+++ 25-akpm/drivers/video/modedb.c	2004-08-08 23:31:44.888798008 -0700
@@ -39,7 +39,7 @@ const char *global_mode_option = NULL;
 
 #define DEFAULT_MODEDB_INDEX	0
 
-static const struct fb_videomode modedb[] = {
+static const __init struct fb_videomode modedb[] = {
     {
 	/* 640x400 @ 70 Hz, 31.5 kHz hsync */
 	NULL, 70, 640, 400, 39721, 40, 24, 39, 9, 96, 2,
@@ -251,6 +251,7 @@ static const struct fb_videomode modedb[
     },
 };
 
+#ifdef CONFIG_FB_MODE_HELPERS
 const struct fb_videomode vesa_modes[] = {
 	/* 0 640x350-85 VESA */
 	{ NULL, 85, 640, 350, 31746,  96, 32, 60, 32, 64, 3,
@@ -374,6 +375,8 @@ const struct fb_videomode vesa_modes[] =
 	{ NULL, 60, 1920, 1440, 3367, 352, 144, 56, 1, 224, 3,
 	  FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA },
 };
+EXPORT_SYMBOL(vesa_modes);
+#endif /* CONFIG_FB_MODE_HELPERS */
 
 static int my_atoi(const char *name)
 {
@@ -404,7 +407,7 @@ static int my_atoi(const char *name)
  */
 
 int fb_try_mode(struct fb_var_screeninfo *var, struct fb_info *info,
-		  const struct fb_videomode *mode, unsigned int bpp)
+		const struct fb_videomode *mode, unsigned int bpp)
 {
     int err = 0;
 
@@ -827,5 +830,4 @@ EXPORT_SYMBOL(fb_destroy_modelist);
 EXPORT_SYMBOL(fb_match_mode);
 EXPORT_SYMBOL(fb_find_best_mode);
 EXPORT_SYMBOL(fb_videomode_to_modelist);
-EXPORT_SYMBOL(vesa_modes);
 EXPORT_SYMBOL(fb_find_mode);
_