Date: Mon, 15 Dec 1997 11:56:56 +0100 (CET)
From: Geert Uytterhoeven <Geert.Uytterhoeven@cs.kuleuven.ac.be>
To: Linux/m68k <linux-m68k@lists.linux-m68k.org>
Subject: L68K: Frame buffer cleanup (the sequel)
Sender: owner-linux-m68k@phil.uni-sb.de
Reply-To: Geert Uytterhoeven <Geert.Uytterhoeven@cs.kuleuven.ac.be>


Here is the next part of the great frame buffer clean up operation:

  - Removed support for custom modes and mode switching by opening /dev/fb* for
    writing. From now on, please use fbset, or XF86Config!

  - Video mode databases are used during startup only and became __init. Only
    the default (or selected with video=) mode is retained.  Freed another 4K!
    Note for Atari users: I didn't dare to twiddle too much with the whole
    atafb mode stuff. Can someone please update atafb.c?

  - All old frame buffer minors (x & 31) are obsolete and behave the same as
    the old fb0current. I suggest to retain only

	/dev/fb0 c 29 0
	/dev/fb1 c 29 32
	/dev/fb2 c 29 64

    and so on, and soft links from /dev/fb?current -> /dev/fb?. Comments?

Other good news: XF68_FBDev now works on PPC (CHRP) too!

BTW: once the tree at vger.rutgers.edu is brought in sync with 2.1.72, I'll
announce a big patch to convert to the new `abstract' console scheme.

If you lost track of all patches, the whole frame buffer and video stuff is
available at

    http://www.cs.kuleuven.ac.be/~geert/bin/fb+video-19971214.tar.gz

--- linux/include/linux/fb.h.orig	Mon Dec 15 06:59:15 1997
+++ linux/include/linux/fb.h	Mon Dec 15 06:59:42 1997
@@ -225,11 +225,9 @@
 
 
 struct fb_info {
-   char modename[40];               /* at boottime detected video mode */
+   char modename[40];               /* default video mode */
    int node;
    struct fb_ops *fbops;
-   int fbvar_num;
-   struct fb_var_screeninfo *fbvar;
    struct display *disp;            /* initial display variable */
    char fontname[40];               /* default font name */
    int (*changevar)(int);           /* tell console var has changed */
@@ -238,6 +236,13 @@
    void (*blank)(int);              /* tell fb to (un)blank the screen */
 };
 
+
+struct fb_videomode {
+    const char *name;
+    struct fb_var_screeninfo var;
+};
+
+
 /* prototypes */
 typedef unsigned long fb_init_func(unsigned long);
 
@@ -246,6 +251,7 @@
 extern int unregister_framebuffer(const struct fb_info *fb_info);
 extern unsigned long probe_framebuffers(unsigned long kmem_start);
 
+extern int num_registered_fb;
 extern struct fb_info *registered_fb[FB_MAX];
 extern char con2fb_map[MAX_NR_CONSOLES];
 
--- linux/drivers/char/fbmem.c.orig	Mon Dec 15 06:59:14 1997
+++ linux/drivers/char/fbmem.c	Mon Dec 15 06:59:42 1997
@@ -112,8 +112,6 @@
 
 struct fb_info *registered_fb[FB_MAX];
 int num_registered_fb = 0;
-int fb_curr_open[FB_MAX];
-int fb_open_count[FB_MAX];
 
 char con2fb_map[MAX_NR_CONSOLES];
 
@@ -141,9 +139,8 @@
 	len = 0;
 	for (fi = registered_fb; fi < &registered_fb[FB_MAX] && len < 4000; fi++)
 		if (*fi)
-			len += sprintf(buf + len, "%d %d %s\n",
+			len += sprintf(buf + len, "%d %s\n",
 				       GET_FB_IDX((*fi)->node),
-				       GET_FB_VAR_IDX((*fi)->node),
 				       (*fi)->modename);
 	*start = buf + offset;
 	return len > offset ? len - offset : 0;
@@ -238,32 +235,25 @@
 	struct fb_var_screeninfo var;
 	struct fb_fix_screeninfo fix;
 	struct fb_con2fbmap con2fb;
-	int i, fbidx, vidx;
+	int i, fbidx;
 	
 	if (! fb)
 		return -ENODEV;
 	switch (cmd) {
 	case FBIOGET_VSCREENINFO:
 		fbidx=GET_FB_IDX(inode->i_rdev);
-		vidx=GET_FB_VAR_IDX(inode->i_rdev);
-		if (! vidx) {	/* ask device driver for current */
-			if ((i = fb->fb_get_var(&var, PROC_CONSOLE(), fbidx)))
-				return i;
-		} else
-			var=registered_fb[fbidx]->fbvar[vidx-1];
+		if ((i = fb->fb_get_var(&var, PROC_CONSOLE(), fbidx)))
+			return i;
 		return copy_to_user((void *) arg, &var,
 				    sizeof(var)) ? -EFAULT : 0;
 	case FBIOPUT_VSCREENINFO:
 		fbidx=GET_FB_IDX(inode->i_rdev);
-		vidx=GET_FB_VAR_IDX(inode->i_rdev);
 		if (copy_from_user(&var, (void *) arg, sizeof(var)))
 			return -EFAULT;
 		if ((i = fb->fb_set_var(&var, PROC_CONSOLE(), fbidx)))
 			return i;
 		if (copy_to_user((void *) arg, &var, sizeof(var)))
 			return -EFAULT;
-		if (vidx)
-			registered_fb[fbidx]->fbvar[vidx-1]=var;
 		return 0;
 	case FBIOGET_FSCREENINFO:
 		fbidx=GET_FB_IDX(inode->i_rdev);
@@ -283,15 +273,12 @@
 		return (fb->fb_get_cmap(&cmap, 0, PROC_CONSOLE(), fbidx));
 	case FBIOPAN_DISPLAY:
 		fbidx=GET_FB_IDX(inode->i_rdev);
-		vidx=GET_FB_VAR_IDX(inode->i_rdev);
 		if (copy_from_user(&var, (void *) arg, sizeof(var)))
 			return -EFAULT;
 		if ((i=fb->fb_pan_display(&var, PROC_CONSOLE(), fbidx)))
 			return i;
 		if (copy_to_user((void *) arg, &var, sizeof(var)))
 			return -EFAULT;
-		if (! i && vidx)
-			registered_fb[fbidx]->fbvar[vidx-1]=var;
 		return i;
 	case FBIOGET_CON2FBMAP:
 		if (copy_from_user(&con2fb, (void *)arg, sizeof(con2fb)))
@@ -382,9 +369,6 @@
 fb_open(struct inode *inode, struct file *file)
 {
 	int fbidx=GET_FB_IDX(inode->i_rdev);
-	int vidx=GET_FB_VAR_IDX(inode->i_rdev);
-	struct fb_ops *fb;
-	int err;
 
 #ifdef CONFIG_KERNELD
 	if (!registered_fb[fbidx])
@@ -392,38 +376,15 @@
 #endif
 	if (!registered_fb[fbidx])
 		return -ENODEV;
-	fb = registered_fb[fbidx]->fbops;
-
-	if (! vidx)		/* fb?current always succeeds */ 
-		return fb->fb_open(fbidx);
-	if (vidx > registered_fb[fbidx]->fbvar_num)
-		return -EINVAL;
-	if (fb_curr_open[fbidx] && fb_curr_open[fbidx] != vidx)
-		return -EBUSY;
-	if ((err = fb->fb_open(fbidx)))
-		return(err);
- 	if (file->f_mode & 2) /* only set parameters if opened writeable */
-		if ((err=fb->fb_set_var(&registered_fb[fbidx]->fbvar[vidx-1],
-					PROC_CONSOLE(), fbidx))) {
-			fb->fb_release(fbidx);
-			return err;
-		}
-	fb_curr_open[fbidx] = vidx;
-	fb_open_count[fbidx]++;
-	return 0;
+	return registered_fb[fbidx]->fbops->fb_open(fbidx);
 }
 
 static int 
 fb_release(struct inode *inode, struct file *file)
 {
 	int fbidx=GET_FB_IDX(inode->i_rdev);
-	int vidx=GET_FB_VAR_IDX(inode->i_rdev);
 
 	registered_fb[fbidx]->fbops->fb_release(fbidx);
-	if (! vidx)
-		return 0;
-	if (! (--fb_open_count[fbidx]))
-		fb_curr_open[fbidx]=0;
 	return 0;
 }
 
--- linux/drivers/video/fbcon.c.orig	Mon Dec 15 06:59:14 1997
+++ linux/drivers/video/fbcon.c	Mon Dec 15 06:59:42 1997
@@ -265,8 +265,6 @@
 extern int fbcon_init_mach64(void);
 #endif
 
-extern int num_registered_fb;
-
 __initfunc(static unsigned long fbcon_startup(unsigned long kmem_start,
 					      const char **display_desc))
 {
--- linux/drivers/video/amifb.c.orig	Mon Dec 15 06:59:14 1997
+++ linux/drivers/video/amifb.c	Mon Dec 15 07:00:04 1997
@@ -791,227 +791,196 @@
 
 static char amifb_name[16] = "Amiga ";
 
-	/*
-	 * Predefined Video Mode Names
-	 *
-	 * The a2024-?? modes don't work yet because there's no A2024 driver.
-	 */
-
-static char *amifb_modenames[] = {
-
-	/*
-	 * Autodetect (Default) Video Mode
-	 */
-
-	"default",
 
 	/*
-	 * AmigaOS Video Modes
-	 */
-
-	"ntsc",			/* 640x200, 15 kHz, 60 Hz (NTSC) */
-	"ntsc-lace",		/* 640x400, 15 kHz, 60 Hz interlaced (NTSC) */
-	"pal",			/* 640x256, 15 kHz, 50 Hz (PAL) */
-	"pal-lace",		/* 640x512, 15 kHz, 50 Hz interlaced (PAL) */
-	"multiscan",		/* 640x480, 29 kHz, 57 Hz */
-	"multiscan-lace",	/* 640x960, 29 kHz, 57 Hz interlaced */
-	"a2024-10",		/* 1024x800, 10 Hz (Not yet supported) */
-	"a2024-15",		/* 1024x800, 15 Hz (Not yet supported) */
-	"euro36",		/* 640x200, 15 kHz, 72 Hz */
-	"euro36-lace",		/* 640x400, 15 kHz, 72 Hz interlaced */
-	"euro72",		/* 640x400, 29 kHz, 68 Hz */
-	"euro72-lace",		/* 640x800, 29 kHz, 68 Hz interlaced */
-	"super72",		/* 800x300, 23 kHz, 70 Hz */
-	"super72-lace",		/* 800x600, 23 kHz, 70 Hz interlaced */
-	"dblntsc",		/* 640x200, 27 kHz, 57 Hz doublescan */
-	"dblntsc-ff",		/* 640x400, 27 kHz, 57 Hz */
-	"dblntsc-lace",		/* 640x800, 27 kHz, 57 Hz interlaced */
-	"dblpal",		/* 640x256, 27 kHz, 47 Hz doublescan */
-	"dblpal-ff",		/* 640x512, 27 kHz, 47 Hz */
-	"dblpal-lace",		/* 640x1024, 27 kHz, 47 Hz interlaced */
-
-	/*
-	 * VGA Video Modes
-	 */
-
-	"vga",			/* 640x480, 31 kHz, 60 Hz (VGA) */
-	"vga70",		/* 640x400, 31 kHz, 70 Hz (VGA) */
-
-	/*
-	 * User Defined Video Modes: to be set after boot up using e.g. fbset
+	 * Predefined Video Modes
+	 *
 	 */
 
-	"user0", "user1", "user2", "user3", "user4", "user5", "user6", "user7"
-};
+static struct fb_videomode amifb_predefined[] __initdata = {
 
-static struct fb_var_screeninfo amifb_predefined[] = {
-
-	/*
-	 * Autodetect (Default) Video Mode
-	 */
-
-	{ 0, },
+    /*
+     *  AmigaOS Video Modes
+     */
+
+    {
+	"ntsc", {		/* 640x200, 15 kHz, 60 Hz (NTSC) */
+	    640, 200, 640, 200, 0, 0, 4, 0,
+	    {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
+	    0, 0, -1, -1, FB_ACCEL_NONE, TAG_HIRES, 106, 86, 44, 16, 76, 2,
+	    FB_SYNC_BROADCAST, FB_VMODE_NONINTERLACED | FB_VMODE_YWRAP
+	}
+    }, {
+	"ntsc-lace", {		/* 640x400, 15 kHz, 60 Hz interlaced (NTSC) */
+	    640, 400, 640, 400, 0, 0, 4, 0,
+	    {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
+	    0, 0, -1, -1, FB_ACCEL_NONE, TAG_HIRES, 106, 86, 88, 33, 76, 4,
+	    FB_SYNC_BROADCAST, FB_VMODE_INTERLACED | FB_VMODE_YWRAP
+	}
+    }, {
+	"pal", {		/* 640x256, 15 kHz, 50 Hz (PAL) */
+	    640, 256, 640, 256, 0, 0, 4, 0,
+	    {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
+	    0, 0, -1, -1, FB_ACCEL_NONE, TAG_HIRES, 106, 86, 40, 14, 76, 2,
+	    FB_SYNC_BROADCAST, FB_VMODE_NONINTERLACED | FB_VMODE_YWRAP
+	}
+    }, {
+	"pal-lace", {		/* 640x512, 15 kHz, 50 Hz interlaced (PAL) */
+	    640, 512, 640, 512, 0, 0, 4, 0,
+	    {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
+	    0, 0, -1, -1, FB_ACCEL_NONE, TAG_HIRES, 106, 86, 80, 29, 76, 4,
+	    FB_SYNC_BROADCAST, FB_VMODE_INTERLACED | FB_VMODE_YWRAP
+	}
+    }, {
+	"multiscan", {		/* 640x480, 29 kHz, 57 Hz */
+	    640, 480, 640, 480, 0, 0, 4, 0,
+	    {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
+	    0, 0, -1, -1, FB_ACCEL_NONE, TAG_SHRES, 96, 112, 29, 8, 72, 8,
+	    0, FB_VMODE_NONINTERLACED | FB_VMODE_YWRAP
+	}
+    }, {
+	"multiscan-lace", {	/* 640x960, 29 kHz, 57 Hz interlaced */
+	    640, 960, 640, 960, 0, 0, 4, 0,
+	    {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
+	    0, 0, -1, -1, FB_ACCEL_NONE, TAG_SHRES, 96, 112, 58, 16, 72, 16,
+	    0, FB_VMODE_INTERLACED | FB_VMODE_YWRAP
+	}
+    }, {
+	"euro36", {		/* 640x200, 15 kHz, 72 Hz */
+	    640, 200, 640, 200, 0, 0, 4, 0,
+	    {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
+	    0, 0, -1, -1, FB_ACCEL_NONE, TAG_HIRES, 92, 124, 6, 6, 52, 5,
+	    0, FB_VMODE_NONINTERLACED | FB_VMODE_YWRAP
+	}
+    }, {
+	"euro36-lace", {	/* 640x400, 15 kHz, 72 Hz interlaced */
+	    640, 400, 640, 400, 0, 0, 4, 0,
+	    {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
+	    0, 0, -1, -1, FB_ACCEL_NONE, TAG_HIRES, 92, 124, 12, 12, 52, 10,
+	    0, FB_VMODE_INTERLACED | FB_VMODE_YWRAP
+	}
+    }, {
+	"euro72", {		/* 640x400, 29 kHz, 68 Hz */
+	    640, 400, 640, 400, 0, 0, 4, 0,
+	    {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
+	    0, 0, -1, -1, FB_ACCEL_NONE, TAG_SHRES, 164, 92, 9, 9, 80, 8,
+	    0, FB_VMODE_NONINTERLACED | FB_VMODE_YWRAP
+	}
+    }, {
+	"euro72-lace", {	/* 640x800, 29 kHz, 68 Hz interlaced */
+	    640, 800, 640, 800, 0, 0, 4, 0,
+	    {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
+	    0, 0, -1, -1, FB_ACCEL_NONE, TAG_SHRES, 164, 92, 18, 18, 80, 16,
+	    0, FB_VMODE_INTERLACED | FB_VMODE_YWRAP
+	}
+    }, {
+	"super72", {		/* 800x300, 23 kHz, 70 Hz */
+	    800, 300, 800, 300, 0, 0, 4, 0,
+	    {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
+	    0, 0, -1, -1, FB_ACCEL_NONE, TAG_SHRES, 212, 140, 10, 11, 80, 7,
+	    0, FB_VMODE_NONINTERLACED | FB_VMODE_YWRAP
+	}
+    }, {
+	"super72-lace", {	/* 800x600, 23 kHz, 70 Hz interlaced */
+	    800, 600, 800, 600, 0, 0, 4, 0,
+	    {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
+	    0, 0, -1, -1, FB_ACCEL_NONE, TAG_SHRES, 212, 140, 20, 22, 80, 14,
+	    0, FB_VMODE_INTERLACED | FB_VMODE_YWRAP
+	}
+    }, {
+	"dblntsc", {		/* 640x200, 27 kHz, 57 Hz doublescan */
+	    640, 200, 640, 200, 0, 0, 4, 0,
+	    {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
+	    0, 0, -1, -1, FB_ACCEL_NONE, TAG_SHRES, 196, 124, 18, 17, 80, 4,
+	    0, FB_VMODE_DOUBLE | FB_VMODE_YWRAP
+	}
+    }, {
+	"dblntsc-ff", {		/* 640x400, 27 kHz, 57 Hz */
+	    640, 400, 640, 400, 0, 0, 4, 0,
+	    {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
+	    0, 0, -1, -1, FB_ACCEL_NONE, TAG_SHRES, 196, 124, 36, 35, 80, 7,
+	    0, FB_VMODE_NONINTERLACED | FB_VMODE_YWRAP
+	}
+    }, {
+	"dblntsc-lace", {	/* 640x800, 27 kHz, 57 Hz interlaced */
+	    640, 800, 640, 800, 0, 0, 4, 0,
+	    {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
+	    0, 0, -1, -1, FB_ACCEL_NONE, TAG_SHRES, 196, 124, 72, 70, 80, 14,
+	    0, FB_VMODE_INTERLACED | FB_VMODE_YWRAP
+	}
+    }, {
+	"dblpal", {		/* 640x256, 27 kHz, 47 Hz doublescan */
+	    640, 256, 640, 256, 0, 0, 4, 0,
+	    {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
+	    0, 0, -1, -1, FB_ACCEL_NONE, TAG_SHRES, 196, 124, 14, 13, 80, 4,
+	    0, FB_VMODE_DOUBLE | FB_VMODE_YWRAP
+	}
+    }, {
+	"dblpal-ff", {		/* 640x512, 27 kHz, 47 Hz */
+	    640, 512, 640, 512, 0, 0, 4, 0,
+	    {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
+	    0, 0, -1, -1, FB_ACCEL_NONE, TAG_SHRES, 196, 124, 28, 27, 80, 7,
+	    0, FB_VMODE_NONINTERLACED | FB_VMODE_YWRAP
+	}
+    }, {
+	"dblpal-lace", {	/* 640x1024, 27 kHz, 47 Hz interlaced */
+	    640, 1024, 640, 1024, 0, 0, 4, 0,
+	    {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
+	    0, 0, -1, -1, FB_ACCEL_NONE, TAG_SHRES, 196, 124, 56, 54, 80, 14,
+	    0, FB_VMODE_INTERLACED | FB_VMODE_YWRAP
+	}
+    },
 
-	/*
-	 * AmigaOS Video Modes
-	 */
-
-	{
-		/* ntsc */
-		640, 200, 640, 200, 0, 0, 4, 0,
-		{0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
-		0, 0, -1, -1, FB_ACCEL_NONE, TAG_HIRES, 106, 86, 44, 16, 76, 2,
-		FB_SYNC_BROADCAST, FB_VMODE_NONINTERLACED | FB_VMODE_YWRAP
-	}, {
-		/* ntsc-lace */
-		640, 400, 640, 400, 0, 0, 4, 0,
-		{0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
-		0, 0, -1, -1, FB_ACCEL_NONE, TAG_HIRES, 106, 86, 88, 33, 76, 4,
-		FB_SYNC_BROADCAST, FB_VMODE_INTERLACED | FB_VMODE_YWRAP
-	}, {
-		/* pal */
-		640, 256, 640, 256, 0, 0, 4, 0,
-		{0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
-		0, 0, -1, -1, FB_ACCEL_NONE, TAG_HIRES, 106, 86, 40, 14, 76, 2,
-		FB_SYNC_BROADCAST, FB_VMODE_NONINTERLACED | FB_VMODE_YWRAP
-	}, {
-		/* pal-lace */
-		640, 512, 640, 512, 0, 0, 4, 0,
-		{0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
-		0, 0, -1, -1, FB_ACCEL_NONE, TAG_HIRES, 106, 86, 80, 29, 76, 4,
-		FB_SYNC_BROADCAST, FB_VMODE_INTERLACED | FB_VMODE_YWRAP
-	}, {
-		/* multiscan */
-		640, 480, 640, 480, 0, 0, 4, 0,
-		{0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
-		0, 0, -1, -1, FB_ACCEL_NONE, TAG_SHRES, 96, 112, 29, 8, 72, 8,
-		0, FB_VMODE_NONINTERLACED | FB_VMODE_YWRAP
-
-	}, {
-		/* multiscan-lace */
-		640, 960, 640, 960, 0, 0, 4, 0,
-		{0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
-		0, 0, -1, -1, FB_ACCEL_NONE, TAG_SHRES, 96, 112, 58, 16, 72, 16,
-		0, FB_VMODE_INTERLACED | FB_VMODE_YWRAP
-	}, {
-		/* a2024-10 (Not yet supported) */
-		1024, 800, 1024, 800, 0, 0, 2, 0,
-		{0, 2, 0}, {0, 2, 0}, {0, 2, 0}, {0, 0, 0},
-		0, 0, -1, -1, FB_ACCEL_NONE, TAG_HIRES, 0, 0, 0, 0, 0, 0,
-		0, FB_VMODE_NONINTERLACED | FB_VMODE_YWRAP
-	}, {
-		/* a2024-15 (Not yet supported) */
-		1024, 800, 1024, 800, 0, 0, 2, 0,
-		{0, 2, 0}, {0, 2, 0}, {0, 2, 0}, {0, 0, 0},
-		0, 0, -1, -1, FB_ACCEL_NONE, TAG_HIRES, 0, 0, 0, 0, 0, 0,
-		0, FB_VMODE_NONINTERLACED | FB_VMODE_YWRAP
-	}, {
-		/* euro36 */
-		640, 200, 640, 200, 0, 0, 4, 0,
-		{0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
-		0, 0, -1, -1, FB_ACCEL_NONE, TAG_HIRES, 92, 124, 6, 6, 52, 5,
-		0, FB_VMODE_NONINTERLACED | FB_VMODE_YWRAP
-	}, {
-		/* euro36-lace */
-		640, 400, 640, 400, 0, 0, 4, 0,
-		{0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
-		0, 0, -1, -1, FB_ACCEL_NONE, TAG_HIRES, 92, 124, 12, 12, 52, 10,
-		0, FB_VMODE_INTERLACED | FB_VMODE_YWRAP
-	}, {
-		/* euro72 */
-		640, 400, 640, 400, 0, 0, 4, 0,
-		{0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
-		0, 0, -1, -1, FB_ACCEL_NONE, TAG_SHRES, 164, 92, 9, 9, 80, 8,
-		0, FB_VMODE_NONINTERLACED | FB_VMODE_YWRAP
-	}, {
-		/* euro72-lace */
-		640, 800, 640, 800, 0, 0, 4, 0,
-		{0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
-		0, 0, -1, -1, FB_ACCEL_NONE, TAG_SHRES, 164, 92, 18, 18, 80, 16,
-		0, FB_VMODE_INTERLACED | FB_VMODE_YWRAP
-	}, {
-		/* super72 */
-		800, 300, 800, 300, 0, 0, 4, 0,
-		{0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
-		0, 0, -1, -1, FB_ACCEL_NONE, TAG_SHRES, 212, 140, 10, 11, 80, 7,
-		0, FB_VMODE_NONINTERLACED | FB_VMODE_YWRAP
-	}, {
-		/* super72-lace */
-		800, 600, 800, 600, 0, 0, 4, 0,
-		{0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
-		0, 0, -1, -1, FB_ACCEL_NONE, TAG_SHRES, 212, 140, 20, 22, 80, 14,
-		0, FB_VMODE_INTERLACED | FB_VMODE_YWRAP
-	}, {
-		/* dblntsc */
-		640, 200, 640, 200, 0, 0, 4, 0,
-		{0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
-		0, 0, -1, -1, FB_ACCEL_NONE, TAG_SHRES, 196, 124, 18, 17, 80, 4,
-		0, FB_VMODE_DOUBLE | FB_VMODE_YWRAP
-	}, {
-		/* dblntsc-ff */
-		640, 400, 640, 400, 0, 0, 4, 0,
-		{0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
-		0, 0, -1, -1, FB_ACCEL_NONE, TAG_SHRES, 196, 124, 36, 35, 80, 7,
-		0, FB_VMODE_NONINTERLACED | FB_VMODE_YWRAP
-	}, {
-		/* dblntsc-lace */
-		640, 800, 640, 800, 0, 0, 4, 0,
-		{0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
-		0, 0, -1, -1, FB_ACCEL_NONE, TAG_SHRES, 196, 124, 72, 70, 80, 14,
-		0, FB_VMODE_INTERLACED | FB_VMODE_YWRAP
-	}, {
-		/* dblpal */
-		640, 256, 640, 256, 0, 0, 4, 0,
-		{0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
-		0, 0, -1, -1, FB_ACCEL_NONE, TAG_SHRES, 196, 124, 14, 13, 80, 4,
-		0, FB_VMODE_DOUBLE | FB_VMODE_YWRAP
-	}, {
-		/* dblpal-ff */
-		640, 512, 640, 512, 0, 0, 4, 0,
-		{0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
-		0, 0, -1, -1, FB_ACCEL_NONE, TAG_SHRES, 196, 124, 28, 27, 80, 7,
-		0, FB_VMODE_NONINTERLACED | FB_VMODE_YWRAP
-	}, {
-		/* dblpal-lace */
-		640, 1024, 640, 1024, 0, 0, 4, 0,
-		{0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
-		0, 0, -1, -1, FB_ACCEL_NONE, TAG_SHRES, 196, 124, 56, 54, 80, 14,
-		0, FB_VMODE_INTERLACED | FB_VMODE_YWRAP
-	},
-
-	/*
-	 * VGA Video Modes
-	 */
-
-	{
-		/* vga */
-		640, 480, 640, 480, 0, 0, 4, 0,
-		{0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
-		0, 0, -1, -1, FB_ACCEL_NONE, TAG_SHRES, 64, 96, 30, 9, 112, 2,
-		0, FB_VMODE_NONINTERLACED | FB_VMODE_YWRAP
-	}, {
-		/* vga70 */
-		640, 400, 640, 400, 0, 0, 4, 0,
-		{0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
-		0, 0, -1, -1, FB_ACCEL_NONE, TAG_SHRES, 64, 96, 35, 12, 112, 2,
-		FB_SYNC_VERT_HIGH_ACT | FB_SYNC_COMP_HIGH_ACT, FB_VMODE_NONINTERLACED | FB_VMODE_YWRAP
-	},
+    /*
+     *  VGA Video Modes
+     */
+
+    {
+	"vga", {		/* 640x480, 31 kHz, 60 Hz (VGA) */
+	    640, 480, 640, 480, 0, 0, 4, 0,
+	    {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
+	    0, 0, -1, -1, FB_ACCEL_NONE, TAG_SHRES, 64, 96, 30, 9, 112, 2,
+	    0, FB_VMODE_NONINTERLACED | FB_VMODE_YWRAP
+	}
+    }, {
+	"vga70", {		/* 640x400, 31 kHz, 70 Hz (VGA) */
+	    640, 400, 640, 400, 0, 0, 4, 0,
+	    {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
+	    0, 0, -1, -1, FB_ACCEL_NONE, TAG_SHRES, 64, 96, 35, 12, 112, 2,
+	    FB_SYNC_VERT_HIGH_ACT | FB_SYNC_COMP_HIGH_ACT, FB_VMODE_NONINTERLACED | FB_VMODE_YWRAP
+	}
+    },
 
-	/*
-	 * User Defined Video Modes
-	 */
+#if 0
 
-	{ 0, }, { 0, }, { 0, }, { 0, }, { 0, }, { 0, }, { 0, }, { 0, }
+    /*
+     *  A2024 video modes
+     *  These modes don't work yet because there's no A2024 driver.
+     */
+
+    {
+	"a2024-10", {		/* 1024x800, 10 Hz */
+	    1024, 800, 1024, 800, 0, 0, 2, 0,
+	    {0, 2, 0}, {0, 2, 0}, {0, 2, 0}, {0, 0, 0},
+	    0, 0, -1, -1, FB_ACCEL_NONE, TAG_HIRES, 0, 0, 0, 0, 0, 0,
+	    0, FB_VMODE_NONINTERLACED | FB_VMODE_YWRAP
+	}
+    }, {
+	"a2024-15", {		/* 1024x800, 15 Hz */
+	    1024, 800, 1024, 800, 0, 0, 2, 0,
+	    {0, 2, 0}, {0, 2, 0}, {0, 2, 0}, {0, 0, 0},
+	    0, 0, -1, -1, FB_ACCEL_NONE, TAG_HIRES, 0, 0, 0, 0, 0, 0,
+	    0, FB_VMODE_NONINTERLACED | FB_VMODE_YWRAP
+	}
+    }
+#endif
 };
 
-#define NUM_USER_MODES   (8)
 #define NUM_TOTAL_MODES  arraysize(amifb_predefined)
-#define NUM_PREDEF_MODES (NUM_TOTAL_MODES-NUM_USER_MODES)
 
 static int amifb_ilbm = 0;	/* interleaved or normal bitplanes */
-
 static int amifb_inverse = 0;
-static int amifb_usermode = 0;
+static int amifb_usermode __initdata = 0;
 
 	/*
 	 * Some default modes
@@ -1023,6 +992,9 @@
 #define DEFMODE_AMBER_NTSC "ntsc-lace"	/* for flicker fixed NTSC (A3000) */
 #define DEFMODE_AGA        "vga70"	/* for AGA */
 
+static struct fb_var_screeninfo amifb_default;
+
+
 	/*
 	 * Macros for the conversion from real world values to hardware register
 	 * values
@@ -1275,7 +1247,7 @@
 	amifb_pan_display, amifb_ioctl
 };
 
-struct useropts {
+static struct useropts {
 	long xres;
 	long yres;
 	long xres_virtual;
@@ -1831,12 +1803,13 @@
 	 * Replace the Tag Values with the Real Pixel Clock Values
 	 */
 
-	for (i = 0; i < NUM_PREDEF_MODES; i++) {
-		tag = amifb_predefined[i].pixclock;
+	for (i = 0; i < NUM_TOTAL_MODES; i++) {
+		struct fb_var_screeninfo *var = &amifb_predefined[i].var;
+		tag = var->pixclock;
 		if (tag == TAG_SHRES || tag == TAG_HIRES || tag == TAG_LORES) {
-			amifb_predefined[i].pixclock = pixclock[tag];
-			if (amifb_predefined[i].bits_per_pixel > maxdepth[tag])
-				amifb_predefined[i].bits_per_pixel = maxdepth[tag];
+			var->pixclock = pixclock[tag];
+			if (var->bits_per_pixel > maxdepth[tag])
+				var->bits_per_pixel = maxdepth[tag];
 		}
 	}
 
@@ -1844,8 +1817,6 @@
 	fb_info.changevar = NULL;
 	fb_info.node = -1;
 	fb_info.fbops = &amifb_ops;
-	fb_info.fbvar_num = NUM_TOTAL_MODES;
-	fb_info.fbvar = amifb_predefined;
 	fb_info.disp = &disp;
 	fb_info.switch_con = &amifbcon_switch;
 	fb_info.updatevar = &amifbcon_updatevar;
@@ -1895,7 +1866,7 @@
 	custom.intena = IF_VERTB;
 	custom.intena = IF_SETCLR | IF_COPER;
 
-	amifb_set_var(&amifb_predefined[0], -1, GET_FB_IDX(fb_info.node));
+	amifb_set_var(&amifb_default, -1, GET_FB_IDX(fb_info.node));
 
 	printk("%s frame buffer device, using %ldK of video memory\n",
 	       fb_info.modename, videomemorysize>>10);
@@ -2039,32 +2010,32 @@
 {
 	int i;
 
-	for (i = 1; i < NUM_PREDEF_MODES; i++) {
-		if (!strcmp(name, amifb_modenames[i])) {
-			amifb_predefined[0] = amifb_predefined[i];
+	for (i = 0; i < NUM_TOTAL_MODES; i++) {
+		if (!strcmp(name, amifb_predefined[i].name)) {
+			amifb_default = amifb_predefined[i].var;
 
 			if (useropts.xres != -1)
-				amifb_predefined[0].xres = useropts.xres;
+				amifb_default.xres = useropts.xres;
 			if (useropts.yres != -1)
-				amifb_predefined[0].yres = useropts.yres;
+				amifb_default.yres = useropts.yres;
 			if (useropts.xres_virtual != -1)
-				amifb_predefined[0].xres_virtual = useropts.xres_virtual;
+				amifb_default.xres_virtual = useropts.xres_virtual;
 			if (useropts.yres_virtual != -1)
-				amifb_predefined[0].yres_virtual = useropts.yres_virtual;
+				amifb_default.yres_virtual = useropts.yres_virtual;
 			if (useropts.bits_per_pixel != -1)
-				amifb_predefined[0].bits_per_pixel = useropts.bits_per_pixel;
+				amifb_default.bits_per_pixel = useropts.bits_per_pixel;
 			if (useropts.left_margin != -1)
-				amifb_predefined[0].left_margin = useropts.left_margin;
+				amifb_default.left_margin = useropts.left_margin;
 			if (useropts.right_margin != -1)
-				amifb_predefined[0].right_margin = useropts.right_margin;
+				amifb_default.right_margin = useropts.right_margin;
 			if (useropts.upper_margin != -1)
-				amifb_predefined[0].upper_margin = useropts.upper_margin;
+				amifb_default.upper_margin = useropts.upper_margin;
 			if (useropts.lower_margin != -1)
-				amifb_predefined[0].lower_margin = useropts.lower_margin;
+				amifb_default.lower_margin = useropts.lower_margin;
 			if (useropts.hsync_len != -1)
-				amifb_predefined[0].hsync_len = useropts.hsync_len;
+				amifb_default.hsync_len = useropts.hsync_len;
 			if (useropts.vsync_len != -1)
-				amifb_predefined[0].vsync_len = useropts.vsync_len;
+				amifb_default.vsync_len = useropts.vsync_len;
 
 			amifb_usermode = i;
 			return;
@@ -2073,7 +2044,7 @@
 }
 
 	/*
-	 * Probe the  Video Modes
+	 *  Probe the Video Modes
 	 */
 
 __initfunc(static void check_default_mode(void))
@@ -2081,15 +2052,14 @@
 	struct amifb_par par;
 	int mode;
 
-	for (mode = 0; mode < NUM_PREDEF_MODES; mode++) {
-		if (!ami_decode_var(&amifb_predefined[mode], &par)) {
-			if (mode)
-				amifb_predefined[0] = amifb_predefined[mode];
+	if (!ami_decode_var(&amifb_default, &par))
+		return;
+	printk("Can't use default video mode. Probing video modes...\n");
+	for (mode = 0; mode < NUM_TOTAL_MODES; mode++)
+		if (!ami_decode_var(&amifb_predefined[mode].var, &par)) {
+			amifb_default = amifb_predefined[mode].var;
 			return;
 		}
-		if (!mode)
-			printk("Can't use default video mode. Probing video modes...\n");
-	}
 	panic("Can't find any usable video mode");
 }
 
--- linux/drivers/video/atafb.c.orig	Mon Dec 15 06:59:14 1997
+++ linux/drivers/video/atafb.c	Mon Dec 15 06:59:42 1997
@@ -338,15 +338,6 @@
 static char *vga256_names[] = {"vga256", NULL};
 static char *falh2_names[] = {"falh2", NULL};
 static char *falh16_names[] = {"falh16", NULL};
-static char *user0_names[] = {"user0", NULL};
-static char *user1_names[] = {"user1", NULL};
-static char *user2_names[] = {"user2", NULL};
-static char *user3_names[] = {"user3", NULL};
-static char *user4_names[] = {"user4", NULL};
-static char *user5_names[] = {"user5", NULL};
-static char *user6_names[] = {"user6", NULL};
-static char *user7_names[] = {"user7", NULL};
-static char *dummy_names[] = {"dummy", NULL};
 
 static char **fb_var_names[] = {
 	/* Writing the name arrays directly in this array (via "(char *[]){...}")
@@ -366,17 +357,6 @@
 	vga256_names,
 	falh2_names,
 	falh16_names,
-	dummy_names, dummy_names, dummy_names, dummy_names,
-	dummy_names, dummy_names, dummy_names, dummy_names,
-	dummy_names, dummy_names,
-	user0_names,
-	user1_names,
-	user2_names,
-	user3_names,
-	user4_names,
-	user5_names,
-	user6_names,
-	user7_names,
 	NULL
 	/* ,NULL */ /* this causes a sigsegv on my gcc-2.5.8 */
 };
@@ -437,50 +417,6 @@
 	  896, 608, 896, 0, 0, 0, 4, 0,
 	  {0, 6, 0}, {0, 6, 0}, {0, 6, 0}, {0, 0, 0},
 	  0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0 },
-	/* Minor 14..23 free for more standard video modes */
-	{ 0, },
-	{ 0, },
-	{ 0, },
-	{ 0, },
-	{ 0, },
-	{ 0, },
-	{ 0, },
-	{ 0, },
-	{ 0, },
-	{ 0, },
-	/* Minor 24..31 reserved for user defined video modes */
-	{ /* user0, initialized to Rx;y;d from commandline, if supplied */
-	  0, 0, 0, 0, 0, 0, 0, 0,
-	  {0, 6, 0}, {0, 6, 0}, {0, 6, 0}, {0, 0, 0},
-	  0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0 },
-	{ /* user1 */
-	  0, 0, 0, 0, 0, 0, 0, 0,
-	  {0, 6, 0}, {0, 6, 0}, {0, 6, 0}, {0, 0, 0},
-	  0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0 },
-	{ /* user2 */
-	  0, 0, 0, 0, 0, 0, 0, 0,
-	  {0, 6, 0}, {0, 6, 0}, {0, 6, 0}, {0, 0, 0},
-	  0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0 },
-	{ /* user3 */
-	  0, 0, 0, 0, 0, 0, 0, 0,
-	  {0, 6, 0}, {0, 6, 0}, {0, 6, 0}, {0, 0, 0},
-	  0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0 },
-	{ /* user4 */
-	  0, 0, 0, 0, 0, 0, 0, 0,
-	  {0, 6, 0}, {0, 6, 0}, {0, 6, 0}, {0, 0, 0},
-	  0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0 },
-	{ /* user5 */
-	  0, 0, 0, 0, 0, 0, 0, 0,
-	  {0, 6, 0}, {0, 6, 0}, {0, 6, 0}, {0, 0, 0},
-	  0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0 },
-	{ /* user6 */
-	  0, 0, 0, 0, 0, 0, 0, 0,
-	  {0, 6, 0}, {0, 6, 0}, {0, 6, 0}, {0, 0, 0},
-	  0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0 },
-	{ /* user7 */
-	  0, 0, 0, 0, 0, 0, 0, 0,
-	  {0, 6, 0}, {0, 6, 0}, {0, 6, 0}, {0, 0, 0},
-	  0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0 }
 };
 
 static int num_atafb_predefined=arraysize(atafb_predefined);
@@ -2811,8 +2747,6 @@
 	fb_info.changevar = NULL;
 	fb_info.node = -1;
 	fb_info.fbops = &atafb_ops;
-	fb_info.fbvar_num = num_atafb_predefined;
-	fb_info.fbvar = atafb_predefined;
 	fb_info.disp = &disp;
 	fb_info.switch_con = &atafb_switch;
 	fb_info.updatevar = &fb_update_var;
--- linux/drivers/video/cyberfb.c.orig	Mon Dec 15 06:59:14 1997
+++ linux/drivers/video/cyberfb.c	Mon Dec 15 06:59:43 1997
@@ -109,102 +109,43 @@
 
 
 /*
- *    Predefined Video Mode Names
+ *    Predefined Video Modes
  */
 
-static char *cyberfb_modenames[] = {
-
-   /*
-    *    Autodetect (Default) Video Mode
-    */
-
-   "default",
-
-   /*
-    *    Predefined Video Modes
-    */
-    
-   "cyber8",            /* Cybervision 8 bpp */
-   "cyber16",           /* Cybervision 16 bpp */
-   "800x600x8",
-   "640x480x8",
-
-   /*
-    *    Dummy Video Modes
-    */
-
-   "dummy", "dummy", "dummy", "dummy", "dummy", "dummy", "dummy", "dummy",
-   "dummy", "dummy", "dummy", "dummy", "dummy", "dummy", "dummy", "dummy",
-   "dummy", "dummy",
-
-   /*
-    *    User Defined Video Modes
-    *
-    *    This doesn't work yet!!
-    */
-
-   "user0", "user1", "user2", "user3", "user4", "user5", "user6", "user7"
-};
-
-
-/*
- *    Predefined Video Mode Definitions
- */
-
-static struct fb_var_screeninfo cyberfb_predefined[] = {
-
-   /*
-    *    Autodetect (Default) Video Mode
-    */
-
-   { 0, },
-
-   /*
-    *    Predefined Video Modes
-    */
-    
-   {
-      /* Cybervision 8 bpp */
-      CYBER8_WIDTH, CYBER8_HEIGHT, CYBER8_WIDTH, CYBER8_HEIGHT, 0, 0, 8, 0,
-      {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
-      0, 0, -1, -1, FB_ACCEL_NONE, CYBER8_PIXCLOCK, 64, 96, 35, 12, 112, 2,
-      FB_SYNC_COMP_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
-   }, {
-      /* Cybervision 16 bpp */
-      800, 600, 800, 600, 0, 0, 16, 0,
-      {11, 5, 0}, {5, 6, 0}, {0, 5, 0}, {0, 0, 0},
-      0, 0, -1, -1, FB_ACCEL_NONE, CYBER16_PIXCLOCK, 64, 96, 35, 12, 112, 2,
-      FB_SYNC_COMP_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
-   }, {
-      /* Cybervision 8 bpp */
-      800, 600, 800, 600, 0, 0, 8, 0,
-      {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
-      0, 0, -1, -1, FB_ACCEL_NONE, CYBER8_PIXCLOCK, 64, 96, 35, 12, 112, 2,
-      FB_SYNC_COMP_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
-   }, {
-      /* Cybervision 8 bpp */
-      640, 480, 640, 480, 0, 0, 8, 0,
-      {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
-      0, 0, -1, -1, FB_ACCEL_NONE, CYBER8_PIXCLOCK, 64, 96, 35, 12, 112, 2,
-      FB_SYNC_COMP_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
-   },
-   /*
-    *    Dummy Video Modes
-    */
-
-   { 0, }, { 0, }, { 0, }, { 0, }, { 0, }, { 0, }, { 0, }, { 0, }, { 0, }, 
-   { 0, }, { 0, }, { 0, }, { 0, }, { 0, }, { 0, }, { 0, }, { 0, }, { 0, },
-
-   /*
-    *    User Defined Video Modes
-    */
-
-   { 0, }, { 0, }, { 0, }, { 0, }, { 0, }, { 0, }, { 0, }, { 0, }
+static struct fb_videomode cyberfb_predefined[] __initdata = {
+    {
+	"cyber8", {		/* Cybervision 8 bpp */
+	    CYBER8_WIDTH, CYBER8_HEIGHT, CYBER8_WIDTH, CYBER8_HEIGHT, 0, 0, 8, 0,
+	    {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
+	    0, 0, -1, -1, FB_ACCEL_NONE, CYBER8_PIXCLOCK, 64, 96, 35, 12, 112, 2,
+	    FB_SYNC_COMP_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
+	}
+    }, {
+	"cyber16", {		/* Cybervision 16 bpp */
+	    800, 600, 800, 600, 0, 0, 16, 0,
+	    {11, 5, 0}, {5, 6, 0}, {0, 5, 0}, {0, 0, 0},
+	    0, 0, -1, -1, FB_ACCEL_NONE, CYBER16_PIXCLOCK, 64, 96, 35, 12, 112, 2,
+	    FB_SYNC_COMP_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
+	}
+    }, {
+	"800x600x8", {		/* Cybervision 8 bpp */
+	    800, 600, 800, 600, 0, 0, 8, 0,
+	    {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
+	    0, 0, -1, -1, FB_ACCEL_NONE, CYBER8_PIXCLOCK, 64, 96, 35, 12, 112, 2,
+	    FB_SYNC_COMP_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
+	}
+    }, {
+	"640x480x8", {		/* Cybervision 8 bpp */
+	    640, 480, 640, 480, 0, 0, 8, 0,
+	    {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
+	    0, 0, -1, -1, FB_ACCEL_NONE, CYBER8_PIXCLOCK, 64, 96, 35, 12, 112, 2,
+	    FB_SYNC_COMP_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
+	}
+    },
 };
 
 
 #define NUM_TOTAL_MODES    arraysize(cyberfb_predefined)
-#define NUM_PREDEF_MODES   (5)
 
 
 static int Cyberfb_inverse = 0;
@@ -212,7 +153,6 @@
 static int Cyberfb_Cyber8 = 0;        /* Use Cybervision board */
 static int Cyberfb_Cyber16 = 0;       /* Use Cybervision board */
 #endif
-static int Cyberfb_mode = 0;
 
 
 /*
@@ -222,6 +162,8 @@
 #define CYBER8_DEFMODE     (1)
 #define CYBER16_DEFMODE    (2)
 
+static struct fb_var_screeninfo cyberfb_default;
+
 
 /*
  *    Interface used by the world
@@ -313,16 +255,6 @@
 	char size;
 	volatile u_long *CursorBase;
 
-#if 0
-	if (Cyberfb_mode == -1)
-	{
-		if (Cyberfb_Cyber8)
-			Cyberfb_mode = CYBER8_DEFMODE;
-		else
-			Cyberfb_mode = CYBER16_DEFMODE;
-	}
-#endif
-
 	for (i = 0; i < 256; i++)
 
 		for (i = 0; i < 256; i++)
@@ -721,7 +653,7 @@
 	if (current_par_valid)
 		*par = current_par;
 	else
-		fbhw->decode_var(&cyberfb_predefined[Cyberfb_mode], par);
+		fbhw->decode_var(&cyberfb_default, par);
 }
 
 
@@ -974,14 +906,8 @@
 			fb_invert_cmaps();
 		} else if (!strncmp(this_opt, "font:", 5))
 			strcpy(fb_info.fontname, this_opt+5);
-#if 0
-		else if (!strcmp (this_opt, "cyber8"))
-			Cyberfb_Cyber8 = 1;
-		else if (!strcmp (this_opt, "cyber16"))
-			Cyberfb_Cyber16 = 1;
-#endif
 		else
-			Cyberfb_mode = get_video_mode(this_opt);
+			get_video_mode(this_opt);
 }
 
 
@@ -1014,8 +940,6 @@
 	fb_info.changevar = NULL;
 	fb_info.node = -1;
 	fb_info.fbops = &cyberfb_ops;
-	fb_info.fbvar_num = NUM_TOTAL_MODES;
-	fb_info.fbvar = cyberfb_predefined;
 	fb_info.disp = &disp;
 	fb_info.switch_con = &Cyberfb_switch;
 	fb_info.updatevar = &Cyberfb_updatevar;
@@ -1026,10 +950,10 @@
 		return mem_start;
 
 	fbhw->init();
-	fbhw->decode_var(&cyberfb_predefined[Cyberfb_mode], &par);
-	fbhw->encode_var(&cyberfb_predefined[0], &par);
+	fbhw->decode_var(&cyberfb_default, &par);
+	fbhw->encode_var(&cyberfb_default, &par);
 
-	do_fb_set_var(&cyberfb_predefined[0], 1);
+	do_fb_set_var(&cyberfb_default, 1);
 	cyberfb_get_var(&fb_display[0].var, -1, GET_FB_IDX(fb_info.node));
 	cyberfb_set_disp(-1);
 	do_install_cmap(0);
@@ -1086,13 +1010,13 @@
  *    Get a Video Mode
  */
 
-static int get_video_mode(const char *name)
+__initfunc(static int get_video_mode(const char *name))
 {
 	int i;
 
-	for (i = 1; i < NUM_PREDEF_MODES; i++)
-		if (!strcmp(name, cyberfb_modenames[i]))
-			cyberfb_predefined[0] = cyberfb_predefined[i];
+	for (i = 0; i < NUM_TOTAL_MODES; i++)
+		if (!strcmp(name, cyberfb_predefined[i].name))
+			cyberfb_default = cyberfb_predefined[i].var;
 			return(i);
 	return(0);
 }
--- linux/drivers/video/dnfb.c.orig	Mon Dec 15 06:59:14 1997
+++ linux/drivers/video/dnfb.c	Mon Dec 15 06:59:43 1997
@@ -139,14 +139,7 @@
 
 static int currcon=0;
 
-#define NUM_TOTAL_MODES 1
-struct fb_var_screeninfo dnfb_predefined[] = {
-
-	{ 0, },
-
-};
-
-static char dnfb_name[]="Apollo ";
+static char dnfb_name[]="Apollo";
 
 static int dnfb_open(int fbidx)
 {
@@ -314,8 +307,6 @@
 	fb_info.blank=&dnfbcon_blank;	
 	fb_info.node = -1;
 	fb_info.fbops = &dnfb_ops;
-	fb_info.fbvar = dnfb_predefined;
-	fb_info.fbvar_num = NUM_TOTAL_MODES;
 	
 	err=register_framebuffer(&fb_info);
 	if(err < 0) {
--- linux/drivers/video/mach64fb.c.orig	Mon Dec 15 06:59:15 1997
+++ linux/drivers/video/mach64fb.c	Mon Dec 15 06:59:43 1997
@@ -517,22 +517,6 @@
     
    "Mach64_8",            /* Mach64 8 bpp */
    "Mach64_16",           /* Mach64 16 bpp */
-
-   /*
-    *    Dummy Video Modes
-    */
-
-   "dummy", "dummy", "dummy", "dummy", "dummy", "dummy", "dummy", "dummy",
-   "dummy", "dummy", "dummy", "dummy", "dummy", "dummy", "dummy", "dummy",
-   "dummy", "dummy", "dummy", "dummy",
-
-   /*
-    *    User Defined Video Modes
-    *
-    *    This doesn't work yet!!
-    */
-
-   "user0", "user1", "user2", "user3", "user4", "user5", "user6", "user7"
 };
 
 
@@ -568,20 +552,6 @@
       0, 0, -1, -1, FB_ACCEL_NONE, M64_16_PIXCLOCK, 64, 96, 35, 12, 112, 2,
       FB_SYNC_COMP_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
    },
-
-   /*
-    *    Dummy Video Modes
-    */
-
-   { 0, }, { 0, }, { 0, }, { 0, }, { 0, }, { 0, }, { 0, }, { 0, }, { 0, },
-   { 0, }, { 0, }, { 0, }, { 0, }, { 0, }, { 0, }, { 0, }, { 0, }, { 0, },
-   { 0, }, { 0, },
-
-   /*
-    *    User Defined Video Modes
-    */
-
-   { 0, }, { 0, }, { 0, }, { 0, }, { 0, }, { 0, }, { 0, }, { 0, }
 };
 
 
@@ -2363,8 +2333,6 @@
   fb_info __MN__  .changevar = NULL;
   fb_info __MN__  .node = -1;
   fb_info __MN__  .fbops = &mach64fb_ops;
-  fb_info __MN__  .fbvar_num = NUM_TOTAL_MODES;
-  fb_info __MN__  .fbvar = mach64fb_predefined;
   fb_info __MN__  .disp = &m_disp __MN__  ;
   fb_info __MN__  .switch_con = &Mach64fb_switch;
   fb_info __MN__  .updatevar = &Mach64fb_updatevar;
--- linux/drivers/video/offb.c.orig	Mon Dec 15 06:59:15 1997
+++ linux/drivers/video/offb.c	Mon Dec 15 06:59:43 1997
@@ -323,8 +323,6 @@
     strncat(fb_info.modename, dp->full_name, sizeof(fb_info.modename));
     fb_info.node = -1;
     fb_info.fbops = &offb_ops;
-    fb_info.fbvar_num = 1;
-    fb_info.fbvar = &fb_var;
     fb_info.disp = &disp;
     fb_info.fontname[0] = '\0';
     fb_info.changevar = NULL;
--- linux/drivers/video/retz3fb.c.orig	Mon Dec 15 06:59:15 1997
+++ linux/drivers/video/retz3fb.c	Mon Dec 15 06:59:43 1997
@@ -140,46 +140,6 @@
 
 
 /*
- *    Predefined Video Mode Names
- */
-
-static char *retz3fb_modenames[] = {
-
-	/*
-	 *    Autodetect (Default) Video Mode
-	 */
-
-	"default",
-
-	/*
-	 *    Predefined Video Modes
-	 */
-
-	"640x480",		/* RetinaZ3 8 bpp */
-	"800x600",		/* RetinaZ3 8 bpp */
-	"1024x768i",
-	"640x480-16",		/* RetinaZ3 16 bpp */
-	"640x480-24",		/* RetinaZ3 24 bpp */
-	
-	/*
-	 *    Dummy Video Modes
-	 */
-
-	"dummy", "dummy", "dummy", "dummy", "dummy", "dummy", "dummy",
-	"dummy", "dummy", "dummy", "dummy", "dummy", "dummy", "dummy",
-	"dummy", "dummy", "dummy", "dummy", "dummy", "dummy",
-
-	/*
-	 *    User Defined Video Modes
-	 *
-	 *    This doesn't work yet!!
-	 */
-
-	"user0", "user1", "user2", "user3",
-	"user4", "user5", "user6", "user7"
-};
-
-/*
  * A small info on how to convert XFree86 timing values into fb
  * timings - by Frank Neumann:
  *
@@ -217,88 +177,69 @@
 */
 
 /*
- *    Predefined Video Mode Definitions
+ *    Predefined Video Modes
  */
 
-static struct fb_var_screeninfo retz3fb_predefined[] = {
-
-   /*
-    *    Autodetect (Default) Video Mode
-    */
-
-   { 0, },
-
-   /*
-    *    Predefined Video Modes
-    */
-
-   /*
-    * NB: it is very important to adjust the pixel-clock to the color-depth.
-    */
-
-   {
-	   640, 480, 640, 480, 0, 0, 8, 0,
-	   {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
-	   0, 0, -1, -1, FB_ACCEL_RETINAZ3, 38461, 28, 32, 12, 10, 96, 2,
-	   FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
-   },
-   /*
-    ModeLine "800x600" 36 800 824 896 1024 600 601 603 625
-             < name > DCF HR  SH1 SH2  HFL VR  SV1 SV2 VFL
-    */
-   {
-	   /* 800 x 600, 8 bpp */
-	   800, 600, 800, 600, 0, 0, 8, 0,
-	   {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
-	   0, 0, -1, -1, FB_ACCEL_RETINAZ3, 27778, 64, 24, 22, 1, 120, 2,
-	   FB_SYNC_COMP_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
-   },
-   /*
-    ModeLine "1024x768i" 45 1024 1064 1224 1264 768 777 785 817 interlace
-              < name >   DCF HR  SH1  SH2  HFL  VR  SV1 SV2 VFL
-    */
-   {
-	   /* 1024 x 768, 8 bpp, interlaced */
-	   1024, 768, 1024, 768, 0, 0, 8, 0,
-	   {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
-	   0, 0, -1, -1, FB_ACCEL_RETINAZ3, 22222, 40, 40, 32, 9, 160, 8,
-	   FB_SYNC_COMP_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_INTERLACED
-   },
-   {
-	   640, 480, 640, 480, 0, 0, 16, 0,
-	   {11, 5, 0}, {5, 6, 0}, {0, 5, 0}, {0, 0, 0},
-	   0, 0, -1, -1, FB_ACCEL_RETINAZ3, 38461/2, 28, 32, 12, 10, 96, 2,
-	   FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
-   },
-   {
-	   640, 480, 640, 480, 0, 0, 24, 0,
-	   {8, 8, 8}, {8, 8, 8}, {8, 8, 8}, {0, 0, 0}, 
-	   0, 0, -1, -1, FB_ACCEL_RETINAZ3, 38461/3, 28, 32, 12, 10, 96, 2,
-	   FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
-   },
-
-   /*
-    *    Dummy Video Modes
-    */
-
-   { 0, }, { 0, }, { 0, }, { 0, }, { 0, }, { 0, }, { 0, }, { 0, }, { 0, },
-   { 0, }, { 0, }, { 0, }, { 0, }, { 0, }, { 0, }, { 0, }, { 0, }, { 0, },
-   { 0, }, { 0, },
-
-   /*
-    *    User Defined Video Modes
-    */
-
-   { 0, }, { 0, }, { 0, }, { 0, }, { 0, }, { 0, }, { 0, }, { 0, }
+static struct fb_videomode retz3fb_predefined[] __initdata = {
+    /*
+     * NB: it is very important to adjust the pixel-clock to the color-depth.
+     */
+
+    {
+	"640x480", {		/* 640x480, 8 bpp */
+	    640, 480, 640, 480, 0, 0, 8, 0,
+	    {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
+	    0, 0, -1, -1, FB_ACCEL_RETINAZ3, 38461, 28, 32, 12, 10, 96, 2,
+	    FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
+	}
+    },
+    /*
+     ModeLine "800x600" 36 800 824 896 1024 600 601 603 625
+	      < name > DCF HR  SH1 SH2  HFL VR  SV1 SV2 VFL
+     */
+    {
+	"800x600", {		/* 800x600, 8 bpp */
+	    800, 600, 800, 600, 0, 0, 8, 0,
+	    {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
+	    0, 0, -1, -1, FB_ACCEL_RETINAZ3, 27778, 64, 24, 22, 1, 120, 2,
+	    FB_SYNC_COMP_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
+	}
+    },
+    /*
+     ModeLine "1024x768i" 45 1024 1064 1224 1264 768 777 785 817 interlace
+	       < name >   DCF HR  SH1  SH2  HFL  VR  SV1 SV2 VFL
+     */
+    {
+	"1024x768i", {		/* 1024x768, 8 bpp, interlaced */
+	    1024, 768, 1024, 768, 0, 0, 8, 0,
+	    {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
+	    0, 0, -1, -1, FB_ACCEL_RETINAZ3, 22222, 40, 40, 32, 9, 160, 8,
+	    FB_SYNC_COMP_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_INTERLACED
+	}
+    }, {
+	"640x480-16", {		/* 640x480, 16 bpp */
+	    640, 480, 640, 480, 0, 0, 16, 0,
+	    {11, 5, 0}, {5, 6, 0}, {0, 5, 0}, {0, 0, 0},
+	    0, 0, -1, -1, FB_ACCEL_RETINAZ3, 38461/2, 28, 32, 12, 10, 96, 2,
+	    FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
+	}
+    }, {
+	"640x480-24", {		/* 640x480, 24 bpp */
+	    640, 480, 640, 480, 0, 0, 24, 0,
+	    {8, 8, 8}, {8, 8, 8}, {8, 8, 8}, {0, 0, 0}, 
+	    0, 0, -1, -1, FB_ACCEL_RETINAZ3, 38461/3, 28, 32, 12, 10, 96, 2,
+	    FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
+	}
+    },
 };
 
 
 #define NUM_TOTAL_MODES    arraysize(retz3fb_predefined)
-#define NUM_PREDEF_MODES   5
 
+static struct fb_var_screeninfo retz3fb_default;
 
 static int z3fb_inverse = 0;
-static int z3fb_mode = 0;
+static int z3fb_mode __initdata = 0;
 
 
 /*
@@ -1197,7 +1138,7 @@
 	if (current_par_valid)
 		*par = current_par;
 	else
-		fbhw->decode_var(&retz3fb_predefined[z3fb_mode], par);
+		fbhw->decode_var(&retz3fb_default, par);
 }
 
 
@@ -1529,8 +1470,6 @@
 	fb_info.changevar = NULL;
 	fb_info.node = -1;
 	fb_info.fbops = &retz3fb_ops;
-	fb_info.fbvar_num = NUM_TOTAL_MODES;
-	fb_info.fbvar = retz3fb_predefined;
 	fb_info.disp = &disp;
 	fb_info.switch_con = &z3fb_switch;
 	fb_info.updatevar = &z3fb_updatevar;
@@ -1541,12 +1480,12 @@
 		return mem_start;
 
 	if (z3fb_mode == -1)
-		z3fb_mode = 1;
+		retz3fb_default = retz3fb_predefined[0].var;
 
-	fbhw->decode_var(&retz3fb_predefined[z3fb_mode], &par);
-	fbhw->encode_var(&retz3fb_predefined[0], &par);
+	fbhw->decode_var(&retz3fb_default, &par);
+	fbhw->encode_var(&retz3fb_default, &par);
 
-	do_fb_set_var(&retz3fb_predefined[0], 0);
+	do_fb_set_var(&retz3fb_default, 0);
 	retz3fb_get_var(&disp.var, -1, GET_FB_IDX(fb_info.node));
 
 	retz3fb_set_disp(-1);
@@ -1605,13 +1544,13 @@
  *    Get a Video Mode
  */
 
-static int get_video_mode(const char *name)
+__initfunc(static int get_video_mode(const char *name))
 {
 	short i;
 
-	for (i = 1; i <= NUM_PREDEF_MODES; i++)
-		if (!strcmp(name, retz3fb_modenames[i])){
-			retz3fb_predefined[0] = retz3fb_predefined[i];
+	for (i = 0; i <= NUM_TOTAL_MODES; i++)
+		if (!strcmp(name, retz3fb_predefined[i].name)){
+			retz3fb_default = retz3fb_predefined[i].var;
 			return i;
 		}
 	return -1;
--- linux/drivers/video/tgafb.c.orig	Mon Dec 15 06:59:15 1997
+++ linux/drivers/video/tgafb.c	Mon Dec 15 06:59:43 1997
@@ -727,8 +727,6 @@
     strcpy(fb_info.modename, fb_fix.id);
     fb_info.node = -1;
     fb_info.fbops = &tgafb_ops;
-    fb_info.fbvar_num = 1;
-    fb_info.fbvar = &fb_var;
     fb_info.disp = &disp;
     fb_info.fontname[0] = '\0';
     fb_info.changevar = NULL;
--- linux/drivers/video/vfb.c.orig	Mon Dec 15 06:59:15 1997
+++ linux/drivers/video/vfb.c	Mon Dec 15 06:59:43 1997
@@ -43,31 +43,14 @@
 static struct { u_char red, green, blue, pad; } palette[256];
 static char vfb_name[16] = "Virtual FB";
 
-static struct fb_var_screeninfo vfb_predefined[] = {
-
-    /*
-     *  Autodetect (Default) Video Mode
-     */
-
-    {
-	/* 640x480, 8 bpp */
-	640, 480, 640, 480, 0, 0, 8, 0,
-	{0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
-	0, 0, -1, -1, FB_ACCEL_NONE, 20000, 64, 64, 32, 32, 64, 2,
-	0, FB_VMODE_NONINTERLACED
-    },
-
-    /*
-     *  User Defined Video Modes (8)
-     */
-
-    { 0, }, { 0, }, { 0, }, { 0, }, { 0, }, { 0, }, { 0, }, { 0, }
+static struct fb_var_screeninfo vfb_default = {
+    /* 640x480, 8 bpp */
+    640, 480, 640, 480, 0, 0, 8, 0,
+    {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
+    0, 0, -1, -1, FB_ACCEL_NONE, 20000, 64, 64, 32, 32, 64, 2,
+    0, FB_VMODE_NONINTERLACED
 };
 
-#define NUM_USER_MODES		(8)
-#define NUM_TOTAL_MODES		arraysize(vfb_predefined)
-#define NUM_PREDEF_MODES	(1)
-
 
     /*
      *  Interface used by the world
@@ -156,7 +139,7 @@
     struct fb_var_screeninfo *var;
 
     if (con == -1)
-	var = &vfb_predefined[0];
+	var = &vfb_default;
     else
 	var = &fb_display[con].var;
     vfb_encode_fix(fix, var);
@@ -172,7 +155,7 @@
 			      int fbidx)
 {
     if (con == -1)
-	*var = vfb_predefined[0];
+	*var = vfb_default;
     else
 	*var = fb_display[con].var;
     set_color_bitfields(var);
@@ -397,8 +380,6 @@
     fb_info.changevar = NULL;
     fb_info.node = -1;
     fb_info.fbops = &vfb_ops;
-    fb_info.fbvar_num = NUM_TOTAL_MODES;
-    fb_info.fbvar = vfb_predefined;
     fb_info.disp = &disp;
     fb_info.switch_con = &vfbcon_switch;
     fb_info.updatevar = &vfbcon_updatevar;
@@ -408,7 +389,7 @@
     if (err < 0)
 	return mem_start;
 
-    vfb_set_var(&vfb_predefined[0], -1, GET_FB_IDX(fb_info.node));
+    vfb_set_var(&vfb_default, -1, GET_FB_IDX(fb_info.node));
 
     printk("Virtual frame buffer device, using %ldK of video memory\n",
 	   videomemorysize>>10);

Greetings,

						Geert

--
Geert Uytterhoeven                     Geert.Uytterhoeven@cs.kuleuven.ac.be
Wavelets, Linux/{m68k~Amiga,PPC~CHRP}  http://www.cs.kuleuven.ac.be/~geert/
Department of Computer Science -- Katholieke Universiteit Leuven -- Belgium

