Date: Thu, 11 Dec 1997 11:06:49 +0100 (CET)
From: Geert Uytterhoeven <Geert.Uytterhoeven@cs.kuleuven.ac.be>
To: Linux/m68k <linux-m68k@lists.linux-m68k.org>
Subject: L68K: Frame buffer clean up
Sender: owner-linux-m68k@phil.uni-sb.de


Here's a first frame buffer reorganization and clean up patch:

  - Addition of the fbidx argument, needed for frame buffer devices that
    support more than one video board (e.g. clgen)

  - Removal of fb_info.setcmap(). The same can be done with the normal
    fb_set_cmap() operation.

  - Rationalization of the symbolnames (xxxfb_yyy). Initialization and video
    setup functions are now always of the forms

      o xxxfb_init()
      o xxxfb_setup()

  - Rename of dn_fb to dnfb to retain consistency

  - Re-introduction of the mach64 frame buffer device

  - Vgacon fix (cfr. Miquel van Smoorenburg's patch in 2.1.72)

  - tgafb fixes from Peter De Schrijver (he runs Linux on _four_ different
    architectures: ia32, m68k, PPC and AXP, which is one more than I :-)

  - Tested on Linux/m68k 2.1.64 (amifb) and Linux/PPC 2.1.65 (offb). Other m68k
    frame buffer devices should compile.


TO DO:

  - Test it [ Everybody ]

  - Remove the custom video modes, except for choosing the video mode at boot
    time (default video mode) [ Me, myself and I ]

  - More rationalization and removal of duplicated code [ Me, myself and I ]

  - Plug in clgen [ Franky? ]

  - Fix the stipple bugs in XF68_FBDev on PPC [ Me, myself and I ]

  - Write (accelerated) frame buffer devices for SPARC, MIPS, PPC, ...

diff -u --recursive --exclude-from=/home/geert/diff-excludes-linux --new-file m68k-2.1.64/drivers/char/fbmem.c m68k-newfb/drivers/char/fbmem.c
--- m68k-2.1.64/drivers/char/fbmem.c	Sun Nov 23 23:49:10 1997
+++ m68k-newfb/drivers/char/fbmem.c	Wed Dec 10 23:11:52 1997
@@ -41,24 +41,24 @@
      *  Frame buffer device initialization and setup routines
      */
 
-extern unsigned long amiga_fb_init(unsigned long mem_start);
-extern void amiga_video_setup(char *options, int *ints);
-extern unsigned long atari_fb_init(unsigned long mem_start);
-extern void atari_video_setup(char *options, int *ints);
-extern unsigned long Cyber_fb_init(unsigned long mem_start);
-extern void Cyber_video_setup(char *options, int *ints);
-extern unsigned long retz3_fb_init(unsigned long mem_start);
-extern void retz3_video_setup(char *options, int *ints);
-extern unsigned long clgen_fb_init(unsigned long mem_start);
-extern void clgen_video_setup(char *options, int *ints);
-extern unsigned long virtual_fb_init(unsigned long mem_start);
-extern void vfb_video_setup(char *options, int *ints);
+extern unsigned long amifb_init(unsigned long mem_start);
+extern void amifb_setup(char *options, int *ints);
+extern unsigned long atafb_init(unsigned long mem_start);
+extern void atafb_setup(char *options, int *ints);
+extern unsigned long cyberfb_init(unsigned long mem_start);
+extern void cyberfb_setup(char *options, int *ints);
+extern unsigned long retz3fb_init(unsigned long mem_start);
+extern void retz3fb_setup(char *options, int *ints);
+extern unsigned long clgenfb_init(unsigned long mem_start);
+extern void clgenfb_setup(char *options, int *ints);
+extern unsigned long vfb_init(unsigned long mem_start);
+extern void vfb_setup(char *options, int *ints);
 extern unsigned long offb_init(unsigned long mem_start);
-extern unsigned long Mach64_fb_init(unsigned long mem_start);
-extern void Mach64_video_setup(char *options, int *ints);
+extern unsigned long dnfb_init(unsigned long mem_start);
+extern unsigned long mach64fb_init(unsigned long mem_start);
+extern void mach64fb_setup(char *options, int *ints);
+extern unsigned long tgafb_init(unsigned long mem_start);
 extern void resolver_video_setup(char *options, int *ints);
-extern void dn_fb_init(unsigned long mem_start);
-extern void dn_video_setup(char *options, int *ints);
 
 static struct {
 	const char *name;
@@ -66,33 +66,39 @@
 	void (*setup)(char *options, int *ints);
 } fb_drivers[] __initdata = {
 #ifdef CONFIG_FB_RETINAZ3
-	{ "retz3", retz3_fb_init, retz3_video_setup },
+	{ "retz3", retz3fb_init, retz3fb_setup },
 #endif
 #ifdef CONFIG_FB_AMIGA
-	{ "amifb", amiga_fb_init, amiga_video_setup },
+	{ "amifb", amifb_init, amifb_setup },
 #endif
 #ifdef CONFIG_FB_ATARI
-	{ "atafb", atari_fb_init, atari_video_setup },
+	{ "atafb", atafb_init, atafb_setup },
 #endif
 #ifdef CONFIG_FB_CYBER
-	{ "cyber", Cyber_fb_init, Cyber_video_setup },
+	{ "cyber", cyberfb_init, cyberfb_setup },
 #endif
 #ifdef CONFIG_FB_CLGEN
-	{ "clgen", clgen_fb_init, clgen_video_setup },
+	{ "clgen", clgenfb_init, clgenfb_setup },
 #endif
 #ifdef CONFIG_FB_VIRTUAL
-	{ "vfb", virtual_fb_init, vfb_video_setup },
+	{ "vfb", vfb_init, vfb_setup },
 #endif
 #ifdef CONFIG_FB_OPEN_FIRMWARE
 	{ "offb", offb_init, NULL },
 #endif
+#ifdef CONFIG_APOLLO
+	{ "apollo", dnfb_init, NULL },
+#endif
+#ifdef CONFIG_FB_MACH64
+      { "mach64", mach64fb_init, mach64fb_setup },
+#endif
+#ifdef CONFIG_FB_TGA
+      { "tga", tgafb_init, NULL },
+#endif
 #ifdef CONFIG_GSP_RESOLVER
 	/* Not a real frame buffer device... */
 	{ "resolver", NULL, resolver_video_setup },
 #endif
-#ifdef CONFIG_APOLLO
-	{ "apollo", dn_fb_init, dn_video_setup },
-#endif
 };
 
 #define NUM_FB_DRIVERS	(sizeof(fb_drivers)/sizeof(*fb_drivers))
@@ -102,7 +108,6 @@
 
 
 #define GET_INODE(i) MKDEV(FB_MAJOR, (i) << FB_MODES_SHIFT)
-#define GET_FB_IDX(node) (MINOR(node) >> FB_MODES_SHIFT)
 #define GET_FB_VAR_IDX(node) (MINOR(node) & ((1 << FB_MODES_SHIFT)-1)) 
 
 struct fb_info *registered_fb[FB_MAX];
@@ -150,7 +155,8 @@
 {
 	unsigned long p = *ppos;
 	struct inode *inode = file->f_dentry->d_inode;
-	struct fb_ops *fb = registered_fb[GET_FB_IDX(inode->i_rdev)]->fbops;
+	int fbidx = GET_FB_IDX(inode->i_rdev);
+	struct fb_ops *fb = registered_fb[fbidx]->fbops;
 	struct fb_fix_screeninfo fix;
 	char *base_addr;
 	ssize_t copy_size;
@@ -158,7 +164,7 @@
 	if (! fb)
 		return -ENODEV;
 
-	fb->fb_get_fix(&fix,PROC_CONSOLE());
+	fb->fb_get_fix(&fix,PROC_CONSOLE(), fbidx);
 	base_addr=(char *) fix.smem_start;
 	copy_size=(count + p <= fix.smem_len ? count : fix.smem_len - p);
 	copy_to_user(buf, base_addr+p, copy_size);
@@ -171,14 +177,15 @@
 {
 	unsigned long p = *ppos;
 	struct inode *inode = file->f_dentry->d_inode;
-	struct fb_ops *fb = registered_fb[GET_FB_IDX(inode->i_rdev)]->fbops;
+	int fbidx = GET_FB_IDX(inode->i_rdev);
+	struct fb_ops *fb = registered_fb[fbidx]->fbops;
 	struct fb_fix_screeninfo fix;
 	char *base_addr;
 	ssize_t copy_size;
 
 	if (! fb)
 		return -ENODEV;
-	fb->fb_get_fix(&fix, PROC_CONSOLE());
+	fb->fb_get_fix(&fix, PROC_CONSOLE(), fbidx);
 	base_addr=(char *) fix.smem_start;
 	copy_size=(count + p <= fix.smem_len ? count : fix.smem_len - p);
 	copy_from_user(base_addr+p, buf, copy_size); 
@@ -240,46 +247,49 @@
 		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())))
+			if ((i = fb->fb_get_var(&var, PROC_CONSOLE(), fbidx)))
 				return i;
 		} else
 			var=registered_fb[fbidx]->fbvar[vidx-1];
 		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())))
+		if ((i = fb->fb_set_var(&var, PROC_CONSOLE(), fbidx)))
 			return i;
 		if (copy_to_user((void *) arg, &var, sizeof(var)))
 			return -EFAULT;
-		fbidx=GET_FB_IDX(inode->i_rdev);
-		vidx=GET_FB_VAR_IDX(inode->i_rdev);
 		if (vidx)
 			registered_fb[fbidx]->fbvar[vidx-1]=var;
 		return 0;
 	case FBIOGET_FSCREENINFO:
-		if ((i = fb->fb_get_fix(&fix, PROC_CONSOLE())))
+		fbidx=GET_FB_IDX(inode->i_rdev);
+		if ((i = fb->fb_get_fix(&fix, PROC_CONSOLE(), fbidx)))
 			return i;
 		return copy_to_user((void *) arg, &fix, sizeof(fix)) ?
 			-EFAULT : 0;
 	case FBIOPUTCMAP:
+		fbidx=GET_FB_IDX(inode->i_rdev);
 		if (copy_from_user(&cmap, (void *) arg, sizeof(cmap)))
 			return -EFAULT;
-		return (fb->fb_set_cmap(&cmap, 0, PROC_CONSOLE()));
+		return (fb->fb_set_cmap(&cmap, 0, PROC_CONSOLE(), fbidx));
 	case FBIOGETCMAP:
+		fbidx=GET_FB_IDX(inode->i_rdev);
 		if (copy_from_user(&cmap, (void *) arg, sizeof(cmap)))
 			return -EFAULT;
-		return (fb->fb_get_cmap(&cmap, 0, PROC_CONSOLE()));
+		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())))
+		if ((i=fb->fb_pan_display(&var, PROC_CONSOLE(), fbidx)))
 			return i;
 		if (copy_to_user((void *) arg, &var, sizeof(var)))
 			return -EFAULT;
-		fbidx=GET_FB_IDX(inode->i_rdev);
-		vidx=GET_FB_VAR_IDX(inode->i_rdev);
 		if (! i && vidx)
 			registered_fb[fbidx]->fbvar[vidx-1]=var;
 		return i;
@@ -312,21 +322,24 @@
 			set_con2fb_map(i, con2fb.framebuffer);
 		return 0;
 	default:
-		return (fb->fb_ioctl(inode, file, cmd, arg, PROC_CONSOLE()));
+		fbidx=GET_FB_IDX(inode->i_rdev);
+		return (fb->fb_ioctl(inode, file, cmd, arg, PROC_CONSOLE(),
+				     fbidx));
 	}
 }
 
 static int 
 fb_mmap(struct file *file, struct vm_area_struct * vma)
 {
-	struct fb_ops *fb = registered_fb[GET_FB_IDX(file->f_dentry->d_inode->i_rdev)]->fbops;
+	int fbidx = GET_FB_IDX(file->f_dentry->d_inode->i_rdev);
+	struct fb_ops *fb = registered_fb[fbidx]->fbops;
 	struct fb_fix_screeninfo fix;
 	unsigned char *start;
 	unsigned long len;
 
 	if (! fb)
 		return -ENODEV;
-	fb->fb_get_fix(&fix, PROC_CONSOLE());
+	fb->fb_get_fix(&fix, PROC_CONSOLE(), fbidx);
 	if (vma->vm_offset < fix.smem_len) {
 		/* frame buffer memory */
 		start = fix.smem_start;
@@ -391,7 +404,7 @@
 		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()))) {
+					PROC_CONSOLE(), fbidx))) {
 			fb->fb_release(fbidx);
 			return err;
 		}
@@ -556,7 +569,7 @@
      * fuction.
      */
     for (i = 0; i < NUM_FB_DRIVERS; i++) {
-	    if (fb_drivers[i].init && fb_drivers[i].setup){
+	    if (fb_drivers[i].init && fb_drivers[i].setup) {
 		    pref_init_funcs[num_pref_init_funcs++] =
 			    fb_drivers[i].init;
 		    fb_drivers[i].init = NULL;
diff -u --recursive --exclude-from=/home/geert/diff-excludes-linux --new-file m68k-2.1.64/drivers/video/Config.in m68k-newfb/drivers/video/Config.in
--- m68k-2.1.64/drivers/video/Config.in	Sun Nov 23 23:33:08 1997
+++ m68k-newfb/drivers/video/Config.in	Tue Nov 25 21:00:59 1997
@@ -21,7 +21,7 @@
   fi
   if [ "$CONFIG_ATARI" = "y" ]; then
     bool 'Atari native chipset support' CONFIG_FB_ATARI
-#    tristate 'Mach64 Frame Buffer support' CONFIG_FB_MACH64
+    tristate 'Mach64 Frame Buffer support' CONFIG_FB_MACH64
   fi
   if [ "$CONFIG_CHRP" = "y" -o "$CONFIG_PMAC" = "y" ]; then
     bool 'Open Firmware frame buffer device support' CONFIG_FB_OPEN_FIRMWARE
@@ -40,6 +40,7 @@
     tristate '16 bpp packed pixel support' CONFIG_FBCON_CFB16
     tristate 'Cybervision support (accelerated)' CONFIG_FBCON_CYBER
     tristate 'RetinaZ3 support (accelerated)' CONFIG_FBCON_RETINAZ3
+    tristate 'Mach64 support (accelerated)' CONFIG_FBCON_MACH64
   else
     if [ "$CONFIG_FB_AMIGA" != "n" -o "$CONFIG_FB_ATARI" != "n" -o \
 	 "$CONFIG_FB_CYBER" != "n" -o "$CONFIG_FB_RETINAZ3" != "n" -o \
@@ -69,6 +70,9 @@
     fi
     if [ "$CONFIG_FB_RETINAZ3" = "y" -o "$CONFIG_FB_RETINAZ3" = "m" ]; then
       define_bool CONFIG_FBCON_RETINAZ3 y
+    fi
+    if [ "$CONFIG_FB_MACH64" = "y" -o "$CONFIG_FB_MACH64" = "m" ]; then
+      define_bool CONFIG_FBCON_MACH64 y
     fi
   fi
 
diff -u --recursive --exclude-from=/home/geert/diff-excludes-linux --new-file m68k-2.1.64/drivers/video/Makefile m68k-newfb/drivers/video/Makefile
--- m68k-2.1.64/drivers/video/Makefile	Sun Nov 23 23:33:08 1997
+++ m68k-newfb/drivers/video/Makefile	Wed Dec 10 23:07:50 1997
@@ -29,7 +29,7 @@
 # Frame buffer devices
 
 ifeq ($(CONFIG_APOLLO),y)
-L_OBJS += dn_fb.o
+L_OBJS += dnfb.o
 endif
 
 ifeq ($(CONFIG_FB_AMIGA),y)
@@ -186,8 +186,10 @@
 
 # VGA Console
 
+ifdef CONFIG_ABSTRACT_CONSOLE
 ifdef CONFIG_VGA_CONSOLE
 L_OBJS := $(L_OBJS) vgacon.o
+endif
 endif
 
 include $(TOPDIR)/Rules.make
diff -u --recursive --exclude-from=/home/geert/diff-excludes-linux --new-file m68k-2.1.64/drivers/video/amifb.c m68k-newfb/drivers/video/amifb.c
--- m68k-2.1.64/drivers/video/amifb.c	Thu Nov 20 22:51:21 1997
+++ m68k-newfb/drivers/video/amifb.c	Wed Dec 10 23:09:14 1997
@@ -672,7 +672,7 @@
 	 * Current Video Mode
 	 */
 
-static struct amiga_fb_par {
+static struct amifb_par {
 
 	/* General Values */
 
@@ -789,7 +789,7 @@
 	 * The rest of the name is filled in during initialization
 	 */
 
-static char amiga_fb_name[16] = "Amiga ";
+static char amifb_name[16] = "Amiga ";
 
 	/*
 	 * Predefined Video Mode Names
@@ -797,7 +797,7 @@
 	 * The a2024-?? modes don't work yet because there's no A2024 driver.
 	 */
 
-static char *amiga_fb_modenames[] = {
+static char *amifb_modenames[] = {
 
 	/*
 	 * Autodetect (Default) Video Mode
@@ -844,7 +844,7 @@
 	"user0", "user1", "user2", "user3", "user4", "user5", "user6", "user7"
 };
 
-static struct fb_var_screeninfo amiga_fb_predefined[] = {
+static struct fb_var_screeninfo amifb_predefined[] = {
 
 	/*
 	 * Autodetect (Default) Video Mode
@@ -1005,7 +1005,7 @@
 };
 
 #define NUM_USER_MODES   (8)
-#define NUM_TOTAL_MODES  arraysize(amiga_fb_predefined)
+#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 */
@@ -1181,34 +1181,38 @@
 	 * Interface used by the world
 	 */
 
-void amiga_video_setup(char *options, int *ints);
+void amifb_setup(char *options, int *ints);
 
-static int amiga_fb_open(int fbidx);
-static int amiga_fb_release(int fbidx);
-static int amiga_fb_get_fix(struct fb_fix_screeninfo *fix, int con);
-static int amiga_fb_get_var(struct fb_var_screeninfo *var, int con);
-static int amiga_fb_set_var(struct fb_var_screeninfo *var, int con);
-static int amiga_fb_pan_display(struct fb_var_screeninfo *var, int con);
-static int amiga_fb_get_cmap(struct fb_cmap *cmap, int kspc, int con);
-static int amiga_fb_set_cmap(struct fb_cmap *cmap, int kspc, int con);
-static int amiga_fb_ioctl(struct inode *inode, struct file *file, u_int cmd,
-                          u_long arg, int con);
-
-static int amiga_fb_get_fix_cursorinfo(struct fb_fix_cursorinfo *fix, int con);
-static int amiga_fb_get_var_cursorinfo(struct fb_var_cursorinfo *var, u_char *data, int con);
-static int amiga_fb_set_var_cursorinfo(struct fb_var_cursorinfo *var, u_char *data, int con);
-static int amiga_fb_get_cursorstate(struct fb_cursorstate *state, int con);
-static int amiga_fb_set_cursorstate(struct fb_cursorstate *state, int con);
+static int amifb_open(int fbidx);
+static int amifb_release(int fbidx);
+static int amifb_get_fix(struct fb_fix_screeninfo *fix, int con, int fbidx);
+static int amifb_get_var(struct fb_var_screeninfo *var, int con, int fbidx);
+static int amifb_set_var(struct fb_var_screeninfo *var, int con, int fbidx);
+static int amifb_pan_display(struct fb_var_screeninfo *var, int con,
+				int fbidx);
+static int amifb_get_cmap(struct fb_cmap *cmap, int kspc, int con,
+			     int fbidx);
+static int amifb_set_cmap(struct fb_cmap *cmap, int kspc, int con,
+			     int fbidx);
+static int amifb_ioctl(struct inode *inode, struct file *file, u_int cmd,
+                          u_long arg, int con, int fbidx);
+
+static int amifb_get_fix_cursorinfo(struct fb_fix_cursorinfo *fix, int con);
+static int amifb_get_var_cursorinfo(struct fb_var_cursorinfo *var,
+				       u_char *data, int con);
+static int amifb_set_var_cursorinfo(struct fb_var_cursorinfo *var,
+				       u_char *data, int con);
+static int amifb_get_cursorstate(struct fb_cursorstate *state, int con);
+static int amifb_set_cursorstate(struct fb_cursorstate *state, int con);
 
 	/*
 	 * Interface to the low level console driver
 	 */
 
-unsigned long amiga_fb_init(unsigned long mem_start);
+unsigned long amifb_init(unsigned long mem_start);
 static int amifbcon_switch(int con);
 static int amifbcon_updatevar(int con);
 static void amifbcon_blank(int blank);
-static int amifbcon_setcmap(struct fb_cmap *cmap, int con);
 
 	/*
 	 * Internal routines
@@ -1227,15 +1231,15 @@
 	 */
 
 static int ami_encode_fix(struct fb_fix_screeninfo *fix,
-                          struct amiga_fb_par *par);
+                          struct amifb_par *par);
 static int ami_decode_var(struct fb_var_screeninfo *var,
-                          struct amiga_fb_par *par);
+                          struct amifb_par *par);
 static int ami_encode_var(struct fb_var_screeninfo *var,
-                          struct amiga_fb_par *par);
-static void ami_get_par(struct amiga_fb_par *par);
+                          struct amifb_par *par);
+static void ami_get_par(struct amifb_par *par);
 static void ami_set_var(struct fb_var_screeninfo *var);
 #ifdef DEBUG
-static void ami_set_par(struct amiga_fb_par *par);
+static void ami_set_par(struct amifb_par *par);
 #endif
 static void ami_pan_var(struct fb_var_screeninfo *var);
 static int ami_update_par(void);
@@ -1265,10 +1269,10 @@
 extern unsigned short ami_intena_vals[];
 
 
-static struct fb_ops amiga_fb_ops = {
-	amiga_fb_open, amiga_fb_release, amiga_fb_get_fix, amiga_fb_get_var,
-	amiga_fb_set_var, amiga_fb_get_cmap, amiga_fb_set_cmap,
-	amiga_fb_pan_display, amiga_fb_ioctl
+static struct fb_ops amifb_ops = {
+	amifb_open, amifb_release, amifb_get_fix, amifb_get_var,
+	amifb_set_var, amifb_get_cmap, amifb_set_cmap,
+	amifb_pan_display, amifb_ioctl
 };
 
 struct useropts {
@@ -1287,7 +1291,7 @@
     -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
 };
 
-__initfunc(void amiga_video_setup(char *options, int *ints))
+__initfunc(void amifb_setup(char *options, int *ints))
 {
 	char *this_opt;
 	char mcap_spec[80];
@@ -1408,7 +1412,7 @@
 	 * Open/Release the frame buffer device
 	 */
 
-static int amiga_fb_open(int fbidx)
+static int amifb_open(int fbidx)
 {
 	/*
 	 * Nothing, only a usage count for the moment
@@ -1418,7 +1422,7 @@
 	return(0);
 }
 
-static int amiga_fb_release(int fbidx)
+static int amifb_release(int fbidx)
 {
 	MOD_DEC_USE_COUNT;
 	return(0);
@@ -1429,9 +1433,9 @@
 	 * Get the Fixed Part of the Display
 	 */
 
-static int amiga_fb_get_fix(struct fb_fix_screeninfo *fix, int con)
+static int amifb_get_fix(struct fb_fix_screeninfo *fix, int con, int fbidx)
 {
-	struct amiga_fb_par par;
+	struct amifb_par par;
 
 	if (con == -1)
 		ami_get_par(&par);
@@ -1448,12 +1452,12 @@
 	 * Get the User Defined Part of the Display
 	 */
 
-static int amiga_fb_get_var(struct fb_var_screeninfo *var, int con)
+static int amifb_get_var(struct fb_var_screeninfo *var, int con, int fbidx)
 {
 	int err = 0;
 
 	if (con == -1) {
-		struct amiga_fb_par par;
+		struct amifb_par par;
 
 		ami_get_par(&par);
 		err = ami_encode_var(var, &par);
@@ -1466,11 +1470,11 @@
 	 * Set the User Defined Part of the Display
 	 */
 
-static int amiga_fb_set_var(struct fb_var_screeninfo *var, int con)
+static int amifb_set_var(struct fb_var_screeninfo *var, int con, int fbidx)
 {
 	int err, activate = var->activate;
 	int oldxres, oldyres, oldvxres, oldvyres, oldbpp;
-	struct amiga_fb_par par;
+	struct amifb_par par;
 
 	struct display *display;
 	if (con >= 0)
@@ -1533,7 +1537,8 @@
 	 * This call looks only at xoffset, yoffset and the FB_VMODE_YWRAP flag
 	 */
 
-static int amiga_fb_pan_display(struct fb_var_screeninfo *var, int con)
+static int amifb_pan_display(struct fb_var_screeninfo *var, int con,
+				int fbidx)
 {
 	if (var->vmode & FB_VMODE_YWRAP) {
 		if (var->yoffset<0 || var->yoffset >= fb_display[con].var.yres_virtual || var->xoffset)
@@ -1562,7 +1567,8 @@
 	 * Get the Colormap
 	 */
 
-static int amiga_fb_get_cmap(struct fb_cmap *cmap, int kspc, int con)
+static int amifb_get_cmap(struct fb_cmap *cmap, int kspc, int con,
+			     int fbidx)
 {
 	if (con == currcon) /* current console? */
 		return fb_get_cmap(cmap, &fb_display[con].var, kspc,
@@ -1579,7 +1585,8 @@
 	 * Set the Colormap
 	 */
 
-static int amiga_fb_set_cmap(struct fb_cmap *cmap, int kspc, int con)
+static int amifb_set_cmap(struct fb_cmap *cmap, int kspc, int con,
+			     int fbidx)
 {
 	int err;
 
@@ -1601,8 +1608,8 @@
 	 * Amiga Frame Buffer Specific ioctls
 	 */
 
-static int amiga_fb_ioctl(struct inode *inode, struct file *file,
-                          u_int cmd, u_long arg, int con)
+static int amifb_ioctl(struct inode *inode, struct file *file,
+                          u_int cmd, u_long arg, int con, int fbidx)
 {
 	int i;
 
@@ -1612,7 +1619,7 @@
 			
 			i = verify_area(VERIFY_WRITE, (void *)arg, sizeof(crsrfix));
 			if (!i) {
-				i = amiga_fb_get_fix_cursorinfo(&crsrfix, con);
+				i = amifb_get_fix_cursorinfo(&crsrfix, con);
 				copy_to_user((void *)arg, &crsrfix, sizeof(crsrfix));
 			}
 			return i;
@@ -1622,7 +1629,7 @@
 
 			i = verify_area(VERIFY_WRITE, (void *)arg, sizeof(crsrvar));
 			if (!i) {
-				i = amiga_fb_get_var_cursorinfo(&crsrvar,
+				i = amifb_get_var_cursorinfo(&crsrvar,
 					((struct fb_var_cursorinfo *)arg)->data, con);
 				copy_to_user((void *)arg, &crsrvar, sizeof(crsrvar));
 			}
@@ -1634,7 +1641,7 @@
 			i = verify_area(VERIFY_READ, (void *)arg, sizeof(crsrvar));
 			if (!i) {
 				copy_from_user(&crsrvar, (void *)arg, sizeof(crsrvar));
-				i = amiga_fb_set_var_cursorinfo(&crsrvar,
+				i = amifb_set_var_cursorinfo(&crsrvar,
 					((struct fb_var_cursorinfo *)arg)->data, con);
 			}
 			return i;
@@ -1644,7 +1651,7 @@
 
 			i = verify_area(VERIFY_WRITE, (void *)arg, sizeof(crsrstate));
 			if (!i) {
-				i = amiga_fb_get_cursorstate(&crsrstate, con);
+				i = amifb_get_cursorstate(&crsrstate, con);
 				copy_to_user((void *)arg, &crsrstate, sizeof(crsrstate));
 			}
 			return i;
@@ -1655,27 +1662,27 @@
 			i = verify_area(VERIFY_READ, (void *)arg, sizeof(crsrstate));
 			if (!i) {
 				copy_from_user(&crsrstate, (void *)arg, sizeof(crsrstate));
-				i = amiga_fb_set_cursorstate(&crsrstate, con);
+				i = amifb_set_cursorstate(&crsrstate, con);
 			}
 			return i;
 		}
 #ifdef DEBUG
 		case FBCMD_GET_CURRENTPAR : {
-			struct amiga_fb_par par;
+			struct amifb_par par;
 
-			i = verify_area(VERIFY_WRITE, (void *)arg, sizeof(struct amiga_fb_par));
+			i = verify_area(VERIFY_WRITE, (void *)arg, sizeof(struct amifb_par));
 			if (!i) {
 				ami_get_par(&par);
-				copy_to_user((void *)arg, &par, sizeof(struct amiga_fb_par));
+				copy_to_user((void *)arg, &par, sizeof(struct amifb_par));
 			}
 			return i;
 		}
 		case FBCMD_SET_CURRENTPAR : {
-			struct amiga_fb_par par;
+			struct amifb_par par;
 
-			i = verify_area(VERIFY_READ, (void *)arg, sizeof(struct amiga_fb_par));
+			i = verify_area(VERIFY_READ, (void *)arg, sizeof(struct amifb_par));
 			if (!i) {
-				copy_from_user(&par, (void *)arg, sizeof(struct amiga_fb_par));
+				copy_from_user(&par, (void *)arg, sizeof(struct amifb_par));
 				ami_set_par(&par);
 			}
 			return i;
@@ -1689,27 +1696,27 @@
 	 * Hardware Cursor
 	 */
 
-static int amiga_fb_get_fix_cursorinfo(struct fb_fix_cursorinfo *fix, int con)
+static int amifb_get_fix_cursorinfo(struct fb_fix_cursorinfo *fix, int con)
 {
 	return ami_get_fix_cursorinfo(fix, con);
 }
 
-static int amiga_fb_get_var_cursorinfo(struct fb_var_cursorinfo *var, u_char *data, int con)
+static int amifb_get_var_cursorinfo(struct fb_var_cursorinfo *var, u_char *data, int con)
 {
 	return ami_get_var_cursorinfo(var, data, con);
 }
 
-static int amiga_fb_set_var_cursorinfo(struct fb_var_cursorinfo *var, u_char *data, int con)
+static int amifb_set_var_cursorinfo(struct fb_var_cursorinfo *var, u_char *data, int con)
 {
 	return ami_set_var_cursorinfo(var, data, con);
 }
 
-static int amiga_fb_get_cursorstate(struct fb_cursorstate *state, int con)
+static int amifb_get_cursorstate(struct fb_cursorstate *state, int con)
 {
 	return ami_get_cursorstate(state, con);
 }
 
-static int amiga_fb_set_cursorstate(struct fb_cursorstate *state, int con)
+static int amifb_set_cursorstate(struct fb_cursorstate *state, int con)
 {
 	return ami_set_cursorstate(state, con);
 }
@@ -1719,7 +1726,7 @@
 	 * Initialisation
 	 */
 
-__initfunc(unsigned long amiga_fb_init(unsigned long mem_start))
+__initfunc(unsigned long amifb_init(unsigned long mem_start))
 {
 	int err, tag, i;
 	u_long chipptr;
@@ -1745,7 +1752,7 @@
 	switch (amiga_chipset) {
 #ifdef CONFIG_FB_AMIGA_OCS
 		case CS_OCS:
-			strcat(amiga_fb_name, "OCS");
+			strcat(amifb_name, "OCS");
 default_chipset:
 			chipset = TAG_OCS;
 			maxdepth[TAG_SHRES] = 0;	/* OCS means no SHRES */
@@ -1761,7 +1768,7 @@
 
 #ifdef CONFIG_FB_AMIGA_ECS
 		case CS_ECS:
-			strcat(amiga_fb_name, "ECS");
+			strcat(amifb_name, "ECS");
 			chipset = TAG_ECS;
 			maxdepth[TAG_SHRES] = 2;
 			maxdepth[TAG_HIRES] = 4;
@@ -1785,7 +1792,7 @@
 
 #ifdef CONFIG_FB_AMIGA_AGA
 		case CS_AGA:
-			strcat(amiga_fb_name, "AGA");
+			strcat(amifb_name, "AGA");
 			chipset = TAG_AGA;
 			maxdepth[TAG_SHRES] = 8;
 			maxdepth[TAG_HIRES] = 8;
@@ -1804,7 +1811,7 @@
 		default:
 #ifdef CONFIG_FB_AMIGA_OCS
 			printk("Unknown graphics chipset, defaulting to OCS\n");
-			strcat(amiga_fb_name, "Unknown");
+			strcat(amifb_name, "Unknown");
 			goto default_chipset;
 #else /* CONFIG_FB_AMIGA_OCS */
 			return mem_start;
@@ -1825,25 +1832,24 @@
 	 */
 
 	for (i = 0; i < NUM_PREDEF_MODES; i++) {
-		tag = amiga_fb_predefined[i].pixclock;
+		tag = amifb_predefined[i].pixclock;
 		if (tag == TAG_SHRES || tag == TAG_HIRES || tag == TAG_LORES) {
-			amiga_fb_predefined[i].pixclock = pixclock[tag];
-			if (amiga_fb_predefined[i].bits_per_pixel > maxdepth[tag])
-				amiga_fb_predefined[i].bits_per_pixel = maxdepth[tag];
+			amifb_predefined[i].pixclock = pixclock[tag];
+			if (amifb_predefined[i].bits_per_pixel > maxdepth[tag])
+				amifb_predefined[i].bits_per_pixel = maxdepth[tag];
 		}
 	}
 
-	strcpy(fb_info.modename, amiga_fb_name);
+	strcpy(fb_info.modename, amifb_name);
 	fb_info.changevar = NULL;
 	fb_info.node = -1;
-	fb_info.fbops = &amiga_fb_ops;
+	fb_info.fbops = &amifb_ops;
 	fb_info.fbvar_num = NUM_TOTAL_MODES;
-	fb_info.fbvar = amiga_fb_predefined;
+	fb_info.fbvar = amifb_predefined;
 	fb_info.disp = &disp;
 	fb_info.switch_con = &amifbcon_switch;
 	fb_info.updatevar = &amifbcon_updatevar;
 	fb_info.blank = &amifbcon_blank;
-	fb_info.setcmap = &amifbcon_setcmap;
 
 	err = register_framebuffer(&fb_info);
 	if (err < 0)
@@ -1889,7 +1895,7 @@
 	custom.intena = IF_VERTB;
 	custom.intena = IF_SETCLR | IF_COPER;
 
-	amiga_fb_set_var(&amiga_fb_predefined[0], -1);
+	amifb_set_var(&amifb_predefined[0], -1, GET_FB_IDX(fb_info.node));
 
 	printk("%s frame buffer device, using %ldK of video memory\n",
 	       fb_info.modename, videomemorysize>>10);
@@ -1937,12 +1943,6 @@
 	 * Set the colormap
 	 */
 
-static int amifbcon_setcmap(struct fb_cmap *cmap, int con)
-{
-	return(amiga_fb_set_cmap(cmap, 1, con));
-}
-
-
 static void do_install_cmap(int con)
 {
 	if (con != currcon)
@@ -2040,31 +2040,31 @@
 	int i;
 
 	for (i = 1; i < NUM_PREDEF_MODES; i++) {
-		if (!strcmp(name, amiga_fb_modenames[i])) {
-			amiga_fb_predefined[0] = amiga_fb_predefined[i];
+		if (!strcmp(name, amifb_modenames[i])) {
+			amifb_predefined[0] = amifb_predefined[i];
 
 			if (useropts.xres != -1)
-				amiga_fb_predefined[0].xres = useropts.xres;
+				amifb_predefined[0].xres = useropts.xres;
 			if (useropts.yres != -1)
-				amiga_fb_predefined[0].yres = useropts.yres;
+				amifb_predefined[0].yres = useropts.yres;
 			if (useropts.xres_virtual != -1)
-				amiga_fb_predefined[0].xres_virtual = useropts.xres_virtual;
+				amifb_predefined[0].xres_virtual = useropts.xres_virtual;
 			if (useropts.yres_virtual != -1)
-				amiga_fb_predefined[0].yres_virtual = useropts.yres_virtual;
+				amifb_predefined[0].yres_virtual = useropts.yres_virtual;
 			if (useropts.bits_per_pixel != -1)
-				amiga_fb_predefined[0].bits_per_pixel = useropts.bits_per_pixel;
+				amifb_predefined[0].bits_per_pixel = useropts.bits_per_pixel;
 			if (useropts.left_margin != -1)
-				amiga_fb_predefined[0].left_margin = useropts.left_margin;
+				amifb_predefined[0].left_margin = useropts.left_margin;
 			if (useropts.right_margin != -1)
-				amiga_fb_predefined[0].right_margin = useropts.right_margin;
+				amifb_predefined[0].right_margin = useropts.right_margin;
 			if (useropts.upper_margin != -1)
-				amiga_fb_predefined[0].upper_margin = useropts.upper_margin;
+				amifb_predefined[0].upper_margin = useropts.upper_margin;
 			if (useropts.lower_margin != -1)
-				amiga_fb_predefined[0].lower_margin = useropts.lower_margin;
+				amifb_predefined[0].lower_margin = useropts.lower_margin;
 			if (useropts.hsync_len != -1)
-				amiga_fb_predefined[0].hsync_len = useropts.hsync_len;
+				amifb_predefined[0].hsync_len = useropts.hsync_len;
 			if (useropts.vsync_len != -1)
-				amiga_fb_predefined[0].vsync_len = useropts.vsync_len;
+				amifb_predefined[0].vsync_len = useropts.vsync_len;
 
 			amifb_usermode = i;
 			return;
@@ -2078,13 +2078,13 @@
 
 __initfunc(static void check_default_mode(void))
 {
-	struct amiga_fb_par par;
+	struct amifb_par par;
 	int mode;
 
 	for (mode = 0; mode < NUM_PREDEF_MODES; mode++) {
-		if (!ami_decode_var(&amiga_fb_predefined[mode], &par)) {
+		if (!ami_decode_var(&amifb_predefined[mode], &par)) {
 			if (mode)
-				amiga_fb_predefined[0] = amiga_fb_predefined[mode];
+				amifb_predefined[0] = amifb_predefined[mode];
 			return;
 		}
 		if (!mode)
@@ -2141,10 +2141,10 @@
 	 */
 
 static int ami_encode_fix(struct fb_fix_screeninfo *fix,
-                          struct amiga_fb_par *par)
+                          struct amifb_par *par)
 {
 	memset(fix, 0, sizeof(struct fb_fix_screeninfo));
-	strcpy(fix->id, amiga_fb_name);
+	strcpy(fix->id, amifb_name);
 	fix->smem_start = (char *)videomemory;
 	fix->smem_len = videomemorysize;
 
@@ -2178,7 +2178,7 @@
 	 */
 
 static int ami_decode_var(struct fb_var_screeninfo *var,
-                          struct amiga_fb_par *par)
+                          struct amifb_par *par)
 {
 	u_short clk_shift, line_shift;
 	u_long maxfetchstop, fstrt, fsize, fconst, xres_n, yres_n;
@@ -2560,7 +2560,7 @@
 	 */
 
 static int ami_encode_var(struct fb_var_screeninfo *var,
-                          struct amiga_fb_par *par)
+                          struct amifb_par *par)
 {
 	u_short clk_shift, line_shift;
 	int i;
@@ -2657,7 +2657,7 @@
 	 * Get current hardware setting
 	 */
 
-static void ami_get_par(struct amiga_fb_par *par)
+static void ami_get_par(struct amifb_par *par)
 {
 	*par = currentpar;
 }
@@ -2676,7 +2676,7 @@
 }
 
 #ifdef DEBUG
-static void ami_set_par(struct amiga_fb_par *par)
+static void ami_set_par(struct amifb_par *par)
 {
 	do_vmode_pan = 0;
 	do_vmode_full = 0;
@@ -2695,7 +2695,7 @@
 
 static void ami_pan_var(struct fb_var_screeninfo *var)
 {
-	struct amiga_fb_par *par = &currentpar;
+	struct amifb_par *par = &currentpar;
 
 	par->xoffset = var->xoffset;
 	par->yoffset = var->yoffset;
@@ -2715,7 +2715,7 @@
 
 static int ami_update_par(void)
 {
-	struct amiga_fb_par *par = &currentpar;
+	struct amifb_par *par = &currentpar;
 	short clk_shift, vshift, fstrt, fsize, fstop, fconst,  shift, move, mod;
 
 	clk_shift = par->clk_shift;
@@ -2867,7 +2867,7 @@
 
 static void ami_update_display(void)
 {
-	struct amiga_fb_par *par = &currentpar;
+	struct amifb_par *par = &currentpar;
 
 	custom.bplcon1 = par->bplcon1;
 	custom.bpl1mod = par->bpl1mod;
@@ -2882,7 +2882,7 @@
 
 static void ami_init_display(void)
 {
-	struct amiga_fb_par *par = &currentpar;
+	struct amifb_par *par = &currentpar;
 
 	custom.bplcon0 = par->bplcon0 & ~BPC0_LACE;
 	custom.bplcon2 = (IS_OCS ? 0 : BPC2_KILLEHB) | BPC2_PF2P2 | BPC2_PF1P2;
@@ -2938,7 +2938,7 @@
 
 static void ami_do_blank(void)
 {
-	struct amiga_fb_par *par = &currentpar;
+	struct amifb_par *par = &currentpar;
 #if defined(CONFIG_FB_AMIGA_AGA)
 	u_short bplcon3 = par->bplcon3;
 #endif
@@ -3023,7 +3023,7 @@
 
 static int ami_get_fix_cursorinfo(struct fb_fix_cursorinfo *fix, int con)
 {
-	struct amiga_fb_par *par = &currentpar;
+	struct amifb_par *par = &currentpar;
 
 	fix->crsr_width = fix->crsr_xsize = par->crsr.width;
 	fix->crsr_height = fix->crsr_ysize = par->crsr.height;
@@ -3034,7 +3034,7 @@
 
 static int ami_get_var_cursorinfo(struct fb_var_cursorinfo *var, u_char *data, int con)
 {
-	struct amiga_fb_par *par = &currentpar;
+	struct amifb_par *par = &currentpar;
 	register u_short *lspr, *sspr;
 #ifdef __mc68000__
 	register u_long datawords asm ("d2");
@@ -3109,7 +3109,7 @@
 
 static int ami_set_var_cursorinfo(struct fb_var_cursorinfo *var, u_char *data, int con)
 {
-	struct amiga_fb_par *par = &currentpar;
+	struct amifb_par *par = &currentpar;
 	register u_short *lspr, *sspr;
 #ifdef __mc68000__
 	register u_long datawords asm ("d2");
@@ -3228,7 +3228,7 @@
 
 static int ami_get_cursorstate(struct fb_cursorstate *state, int con)
 {
-	struct amiga_fb_par *par = &currentpar;
+	struct amifb_par *par = &currentpar;
 
 	state->xoffset = par->crsr.crsr_x;
 	state->yoffset = par->crsr.crsr_y;
@@ -3238,7 +3238,7 @@
 
 static int ami_set_cursorstate(struct fb_cursorstate *state, int con)
 {
-	struct amiga_fb_par *par = &currentpar;
+	struct amifb_par *par = &currentpar;
 
 	par->crsr.crsr_x = state->xoffset;
 	par->crsr.crsr_y = state->yoffset;
@@ -3250,7 +3250,7 @@
 
 static void ami_set_sprite(void)
 {
-	struct amiga_fb_par *par = &currentpar;
+	struct amifb_par *par = &currentpar;
 	copins *copl, *cops;
 	u_short hs, vs, ve;
 	u_long pl, ps, pt;
@@ -3333,7 +3333,7 @@
 
 static void ami_reinit_copper(void)
 {
-	struct amiga_fb_par *par = &currentpar;
+	struct amifb_par *par = &currentpar;
 
 	copdisplay.init[cip_bplcon0].w[1] = ~(BPC0_BPU3 | BPC0_BPU2 | BPC0_BPU1 | BPC0_BPU0) & par->bplcon0;
 	copdisplay.wait->l = CWAIT(32, par->diwstrt_v-4);
@@ -3345,7 +3345,7 @@
 
 static void ami_build_copper(void)
 {
-	struct amiga_fb_par *par = &currentpar;
+	struct amifb_par *par = &currentpar;
 	copins *copl, *cops;
 	u_long p;
 
@@ -3422,7 +3422,7 @@
 
 static void ami_rebuild_copper(void)
 {
-	struct amiga_fb_par *par = &currentpar;
+	struct amifb_par *par = &currentpar;
 	copins *copl, *cops;
 	u_short line, h_end1, h_end2;
 	short i;
@@ -3507,7 +3507,7 @@
 #ifdef MODULE
 int init_module(void)
 {
-	return(amiga_fb_init(NULL));
+	return(amifb_init(NULL));
 }
 
 void cleanup_module(void)
diff -u --recursive --exclude-from=/home/geert/diff-excludes-linux --new-file m68k-2.1.64/drivers/video/atafb.c m68k-newfb/drivers/video/atafb.c
--- m68k-2.1.64/drivers/video/atafb.c	Tue Nov 25 20:51:56 1997
+++ m68k-newfb/drivers/video/atafb.c	Wed Dec 10 23:14:32 1997
@@ -95,7 +95,7 @@
 static int ovsc_offset=0, ovsc_addlen=0;
 int        ovsc_switchmode=0;
 
-static struct atari_fb_par {
+static struct atafb_par {
 	unsigned long screen_base;
 	int yres_virtual;
 	union {
@@ -249,17 +249,17 @@
  *
  * int (*detect)( void )
  *   This function should detect the current video mode settings and
- *   store them in atari_fb_predefined[0] for later reference by the
+ *   store them in atafb_predefined[0] for later reference by the
  *   user. Return the index+1 of an equivalent predefined mode or 0
  *   if there is no such.
  * 
  * int (*encode_fix)( struct fb_fix_screeninfo *fix,
- *                    struct atari_fb_par *par )
+ *                    struct atafb_par *par )
  *   This function should fill in the 'fix' structure based on the
  *   values in the 'par' structure.
  *   
  * int (*decode_var)( struct fb_var_screeninfo *var,
- *                    struct atari_fb_par *par )
+ *                    struct atafb_par *par )
  *   Get the video params out of 'var'. If a value doesn't fit, round
  *   it up, if it's too big, return EINVAL.
  *   Round up in the following order: bits_per_pixel, xres, yres, 
@@ -267,14 +267,14 @@
  *   horizontal timing, vertical timing.
  *
  * int (*encode_var)( struct fb_var_screeninfo *var,
- *                    struct atari_fb_par *par );
+ *                    struct atafb_par *par );
  *   Fill the 'var' structure based on the values in 'par' and maybe
  *   other values read out of the hardware.
  *   
- * void (*get_par)( struct atari_fb_par *par )
+ * void (*get_par)( struct atafb_par *par )
  *   Fill the hardware's 'par' structure.
  *   
- * void (*set_par)( struct atari_fb_par *par )
+ * void (*set_par)( struct atafb_par *par )
  *   Set the hardware according to 'par'.
  *   
  * int (*setcolreg)( unsigned regno, unsigned red,
@@ -306,13 +306,13 @@
 static struct fb_hwswitch {
 	int  (*detect)( void );
 	int  (*encode_fix)( struct fb_fix_screeninfo *fix,
-						struct atari_fb_par *par );
+						struct atafb_par *par );
 	int  (*decode_var)( struct fb_var_screeninfo *var,
-						struct atari_fb_par *par );
+						struct atafb_par *par );
 	int  (*encode_var)( struct fb_var_screeninfo *var,
-						struct atari_fb_par *par );
-	void (*get_par)( struct atari_fb_par *par );
-	void (*set_par)( struct atari_fb_par *par );
+						struct atafb_par *par );
+	void (*get_par)( struct atafb_par *par );
+	void (*set_par)( struct atafb_par *par );
 	int  (*getcolreg)( unsigned regno, unsigned *red,
 					   unsigned *green, unsigned *blue,
 					   unsigned *transp );
@@ -322,7 +322,7 @@
 	void (*set_screen_base)( unsigned long s_base );
 	int  (*blank)( int blank_mode );
 	int  (*pan_display)( struct fb_var_screeninfo *var,
-						 struct atari_fb_par *par);
+						 struct atafb_par *par);
 } *fbhw;
 
 static char *autodetect_names[] = {"autodetect", NULL};
@@ -381,7 +381,7 @@
 	/* ,NULL */ /* this causes a sigsegv on my gcc-2.5.8 */
 };
 
-static struct fb_var_screeninfo atari_fb_predefined[] = {
+static struct fb_var_screeninfo atafb_predefined[] = {
  	/*
  	 * yres_virtual==0 means use hw-scrolling if possible, else yres
  	 */
@@ -483,7 +483,7 @@
 	  0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0 }
 };
 
-static int num_atari_fb_predefined=arraysize(atari_fb_predefined);
+static int num_atafb_predefined=arraysize(atafb_predefined);
 
 
 static int
@@ -493,7 +493,7 @@
     char **name;
     int i;
     name_list=fb_var_names;
-    for (i = 0 ; i < num_atari_fb_predefined ; i++) {
+    for (i = 0 ; i < num_atafb_predefined ; i++) {
 	name=*(name_list++);
 	if (! name || ! *name)
 	    break;
@@ -513,7 +513,7 @@
 #ifdef ATAFB_TT
 
 static int tt_encode_fix( struct fb_fix_screeninfo *fix,
-						  struct atari_fb_par *par )
+						  struct atafb_par *par )
 
 {
 	int mode;
@@ -540,7 +540,7 @@
 
 
 static int tt_decode_var( struct fb_var_screeninfo *var,
-						  struct atari_fb_par *par )
+						  struct atafb_par *par )
 {
 	int xres=var->xres;
 	int yres=var->yres;
@@ -621,7 +621,7 @@
 }
 
 static int tt_encode_var( struct fb_var_screeninfo *var,
-						  struct atari_fb_par *par )
+						  struct atafb_par *par )
 {
 	int linelen, i;
 	var->red.offset=0;
@@ -717,7 +717,7 @@
 }
 
 
-static void tt_get_par( struct atari_fb_par *par )
+static void tt_get_par( struct atafb_par *par )
 {
 	unsigned long addr;
 	par->hw.tt.mode=shifter_tt.tt_shiftmode;
@@ -728,7 +728,7 @@
 	par->screen_base = PTOV(addr);
 }
 
-static void tt_set_par( struct atari_fb_par *par )
+static void tt_set_par( struct atafb_par *par )
 {
 	shifter_tt.tt_shiftmode=par->hw.tt.mode;
 	shifter.syncmode=par->hw.tt.sync;
@@ -773,7 +773,7 @@
 						  
 static int tt_detect( void )
 
-{	struct atari_fb_par par;
+{	struct atafb_par par;
 
 	/* Determine the connected monitor: The DMA sound must be
 	 * disabled before reading the MFP GPIP, because the Sound
@@ -790,7 +790,7 @@
 	mono_moni = (mfp.par_dt_reg & 0x80) == 0;
 
 	tt_get_par(&par);
-	tt_encode_var(&atari_fb_predefined[0], &par);
+	tt_encode_var(&atafb_predefined[0], &par);
 
 	return 1;
 }
@@ -838,7 +838,7 @@
 }
 
 static int falcon_encode_fix( struct fb_fix_screeninfo *fix,
-							  struct atari_fb_par *par )
+							  struct atafb_par *par )
 {
 	strcpy(fix->id, "Atari Builtin");
 	fix->smem_start = (char *)real_screen_base;
@@ -868,7 +868,7 @@
 
 
 static int falcon_decode_var( struct fb_var_screeninfo *var,
-							  struct atari_fb_par *par )
+							  struct atafb_par *par )
 {
 	int bpp = var->bits_per_pixel;
 	int xres = var->xres;
@@ -944,7 +944,7 @@
 
 	if (mon_type == F_MON_SM || DontCalcRes) {
 		/* Skip all calculations. VGA/TV/SC1224 only supported. */
-		struct fb_var_screeninfo *myvar = &atari_fb_predefined[0];
+		struct fb_var_screeninfo *myvar = &atafb_predefined[0];
 		
 		if (bpp > myvar->bits_per_pixel ||
 			var->xres > myvar->xres ||
@@ -1340,7 +1340,7 @@
 }
 
 static int falcon_encode_var( struct fb_var_screeninfo *var,
-							  struct atari_fb_par *par )
+							  struct atafb_par *par )
 {
 /* !!! only for VGA !!! */
 	int linelen, i;
@@ -1507,7 +1507,7 @@
 static struct falcon_hw f_new_mode;
 static int f_pan_display = 0;
 
-static void falcon_get_par( struct atari_fb_par *par )
+static void falcon_get_par( struct atafb_par *par )
 {
 	unsigned long addr;
 	struct falcon_hw *hw = &par->hw.falcon;
@@ -1544,7 +1544,7 @@
 	           ((hw->f_shift & 0x510)==0 && hw->st_shift==0x200);
 }
 
-static void falcon_set_par( struct atari_fb_par *par )
+static void falcon_set_par( struct atafb_par *par )
 {
 	f_change_mode = 0;
 
@@ -1628,7 +1628,7 @@
 
 
 static int falcon_pan_display( struct fb_var_screeninfo *var,
-							   struct atari_fb_par *par )
+							   struct atafb_par *par )
 {
 	int xoffset;
 	int bpp = fb_display[currcon].var.bits_per_pixel;
@@ -1739,7 +1739,7 @@
  
 static int falcon_detect( void )
 {
-	struct atari_fb_par par;
+	struct atafb_par par;
 	unsigned char fhw;
 
 	/* Determine connected monitor and set monitor parameters */
@@ -1770,7 +1770,7 @@
 		fext.hsync = h_syncs[mon_type] / fext.t;
 
 	falcon_get_par(&par);
-	falcon_encode_var(&atari_fb_predefined[0], &par);
+	falcon_encode_var(&atafb_predefined[0], &par);
 
 	/* Detected mode is always the "autodetect" slot */
 	return 1;
@@ -1783,7 +1783,7 @@
 #ifdef ATAFB_STE
 
 static int stste_encode_fix( struct fb_fix_screeninfo *fix,
-							 struct atari_fb_par *par )
+							 struct atafb_par *par )
 
 {
 	int mode;
@@ -1814,7 +1814,7 @@
 
 
 static int stste_decode_var( struct fb_var_screeninfo *var,
-						  struct atari_fb_par *par )
+						  struct atafb_par *par )
 {
 	int xres=var->xres;
 	int yres=var->yres;
@@ -1872,7 +1872,7 @@
 }
 
 static int stste_encode_var( struct fb_var_screeninfo *var,
-						  struct atari_fb_par *par )
+						  struct atafb_par *par )
 {
 	int linelen, i;
 	var->red.offset=0;
@@ -1949,7 +1949,7 @@
 }
 
 
-static void stste_get_par( struct atari_fb_par *par )
+static void stste_get_par( struct atafb_par *par )
 {
 	unsigned long addr;
 	par->hw.st.mode=shifter_tt.st_shiftmode;
@@ -1961,7 +1961,7 @@
 	par->screen_base = PTOV(addr);
 }
 
-static void stste_set_par( struct atari_fb_par *par )
+static void stste_set_par( struct atafb_par *par )
 {
 	shifter_tt.st_shiftmode=par->hw.st.mode;
 	shifter.syncmode=par->hw.st.sync;
@@ -2016,7 +2016,7 @@
 						  
 static int stste_detect( void )
 
-{	struct atari_fb_par par;
+{	struct atafb_par par;
 
 	/* Determine the connected monitor: The DMA sound must be
 	 * disabled before reading the MFP GPIP, because the Sound
@@ -2029,7 +2029,7 @@
 	mono_moni = (mfp.par_dt_reg & 0x80) == 0;
 
 	stste_get_par(&par);
-	stste_encode_var(&atari_fb_predefined[0], &par);
+	stste_encode_var(&atafb_predefined[0], &par);
 
 	if (!ATARIHW_PRESENT(EXTD_SHIFTER))
 		use_hwscroll = 0;
@@ -2108,7 +2108,7 @@
 #ifdef ATAFB_EXT
 
 static int ext_encode_fix( struct fb_fix_screeninfo *fix,
-						   struct atari_fb_par *par )
+						   struct atafb_par *par )
 
 {
 	strcpy(fix->id,"Unknown Extern");
@@ -2158,9 +2158,9 @@
 
 
 static int ext_decode_var( struct fb_var_screeninfo *var,
-						   struct atari_fb_par *par )
+						   struct atafb_par *par )
 {
-	struct fb_var_screeninfo *myvar = &atari_fb_predefined[0];
+	struct fb_var_screeninfo *myvar = &atafb_predefined[0];
 	
 	if (var->bits_per_pixel > myvar->bits_per_pixel ||
 		var->xres > myvar->xres ||
@@ -2174,7 +2174,7 @@
 
 
 static int ext_encode_var( struct fb_var_screeninfo *var,
-						   struct atari_fb_par *par )
+						   struct atafb_par *par )
 {
 	int i;
 
@@ -2218,12 +2218,12 @@
 }
 
 
-static void ext_get_par( struct atari_fb_par *par )
+static void ext_get_par( struct atafb_par *par )
 {
 	par->screen_base = external_addr;
 }
 
-static void ext_set_par( struct atari_fb_par *par )
+static void ext_set_par( struct atafb_par *par )
 {
 }
 
@@ -2291,8 +2291,8 @@
 static int ext_detect( void )
 
 {
-	struct fb_var_screeninfo *myvar = &atari_fb_predefined[0];
-	struct atari_fb_par dummy_par;
+	struct fb_var_screeninfo *myvar = &atafb_predefined[0];
+	struct atafb_par dummy_par;
 
 	myvar->xres = external_xres;
 	myvar->xres_virtual = external_xres_virtual;
@@ -2318,7 +2318,7 @@
 
 
 static int pan_display( struct fb_var_screeninfo *var,
-                        struct atari_fb_par *par )
+                        struct atafb_par *par )
 {
 	if (!fbhw->set_screen_base ||
 		(!ATARIHW_PRESENT(EXTD_SHIFTER) && var->xoffset))
@@ -2368,7 +2368,7 @@
 
 
 
-static void atari_fb_get_par( struct atari_fb_par *par )
+static void atafb_get_par( struct atafb_par *par )
 {
 	if (current_par_valid) {
 		*par=current_par;
@@ -2378,7 +2378,7 @@
 }
 
 
-static void atari_fb_set_par( struct atari_fb_par *par )
+static void atafb_set_par( struct atafb_par *par )
 {
 	fbhw->set_par(par);
 	current_par=*par;
@@ -2411,12 +2411,12 @@
 do_fb_set_var(struct fb_var_screeninfo *var, int isactive)
 {
 	int err,activate;
-	struct atari_fb_par par;
+	struct atafb_par par;
 	if ((err=fbhw->decode_var(var, &par)))
 		return err;
 	activate=var->activate;
 	if (((var->activate & FB_ACTIVATE_MASK) == FB_ACTIVATE_NOW) && isactive)
-		atari_fb_set_par(&par);
+		atafb_set_par(&par);
 	fbhw->encode_var(var, &par);
 	var->activate=activate;
 	return 0;
@@ -2443,7 +2443,7 @@
 	 * Open/Release the frame buffer device
 	 */
 
-static int atari_fb_open(int fbidx)
+static int atafb_open(int fbidx)
 {
 	/*
 	 * Nothing, only a usage count for the moment
@@ -2453,7 +2453,7 @@
 	return(0);
 }
 
-static int atari_fb_release(int fbidx)
+static int atafb_release(int fbidx)
 {
 	MOD_DEC_USE_COUNT;
 	return(0);
@@ -2461,11 +2461,11 @@
 
 
 static int
-atari_fb_get_fix(struct fb_fix_screeninfo *fix, int con)
+atafb_get_fix(struct fb_fix_screeninfo *fix, int con, int fbidx)
 {
-	struct atari_fb_par par;
+	struct atafb_par par;
 	if (con == -1)
-		atari_fb_get_par(&par);
+		atafb_get_par(&par);
 	else
 		fbhw->decode_var(&fb_display[con].var,&par);
 	memset(fix, 0, sizeof(struct fb_fix_screeninfo));
@@ -2473,11 +2473,11 @@
 }
 	
 static int
-atari_fb_get_var(struct fb_var_screeninfo *var, int con)
+atafb_get_var(struct fb_var_screeninfo *var, int con, int fbidx)
 {
-	struct atari_fb_par par;
+	struct atafb_par par;
 	if (con == -1) {
-		atari_fb_get_par(&par);
+		atafb_get_par(&par);
 		fbhw->encode_var(var, &par);
 	}
 	else
@@ -2486,7 +2486,7 @@
 }
 
 static void
-atari_fb_set_disp(int con)
+atafb_set_disp(int con)
 {
 	struct fb_fix_screeninfo fix;
 	struct display *display;
@@ -2496,7 +2496,8 @@
 	else
 		display = &disp;	/* used during initialization */
 
-	atari_fb_get_fix(&fix, con);
+	/* ### FN: Needs fixes later */
+	atafb_get_fix(&fix, con, 0);
 	if (con == -1)
 		con=0;
 	display->screen_base = (u_char *)fix.smem_start;
@@ -2516,7 +2517,7 @@
 }
 
 static int
-atari_fb_set_var(struct fb_var_screeninfo *var, int con)
+atafb_set_var(struct fb_var_screeninfo *var, int con, int fbidx)
 {
 	int err,oldxres,oldyres,oldbpp,oldxres_virtual,
 	    oldyres_virtual,oldyoffset;
@@ -2535,7 +2536,7 @@
 		    || oldyres_virtual != var->yres_virtual
 		    || oldbpp != var->bits_per_pixel
 		    || oldyoffset != var->yoffset) {
-			atari_fb_set_disp(con);
+			atafb_set_disp(con);
 			(*fb_info.changevar)(con);
 			fb_alloc_cmap(&fb_display[con].cmap, 0, 0);
 			do_install_cmap(con);
@@ -2548,7 +2549,7 @@
 
 
 static int
-atari_fb_get_cmap(struct fb_cmap *cmap, int kspc, int con)
+atafb_get_cmap(struct fb_cmap *cmap, int kspc, int con, int fbidx)
 {
 	if (con == currcon) /* current console ? */
 		return fb_get_cmap(cmap, &(fb_display[con].var), kspc,
@@ -2563,7 +2564,7 @@
 }
 
 static int
-atari_fb_set_cmap(struct fb_cmap *cmap, int kspc, int con)
+atafb_set_cmap(struct fb_cmap *cmap, int kspc, int con, int fbidx)
 {
 	int err;
 	if (! fb_display[con].cmap.len) { /* no colormap allocated ? */
@@ -2581,7 +2582,7 @@
 }
 
 static int
-atari_fb_pan_display(struct fb_var_screeninfo *var, int con)
+atafb_pan_display(struct fb_var_screeninfo *var, int con, int fbidx)
 {
 	int xoffset = var->xoffset;
 	int yoffset = var->yoffset;
@@ -2605,33 +2606,33 @@
 }
 
 static int
-atari_fb_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
-	       unsigned long arg, int con)
+atafb_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
+	       unsigned long arg, int con, int fbidx)
 {
 	switch (cmd) {
 #ifdef FBCMD_GET_CURRENTPAR
 	case FBCMD_GET_CURRENTPAR:
 		if (copy_to_user((void *)arg, (void *)&current_par,
-				 sizeof(struct atari_fb_par)))
+				 sizeof(struct atafb_par)))
 			return -EFAULT;
 		return 0;
 #endif
 #ifdef FBCMD_SET_CURRENTPAR
 	case FBCMD_SET_CURRENTPAR:
 		if (copy_from_user((void *)&current_par, (void *)arg,
-				   sizeof(struct atari_fb_par)))
+				   sizeof(struct atafb_par)))
 			return -EFAULT;
-		atari_fb_set_par(&current_par);
+		atafb_set_par(&current_par);
 		return 0;
 #endif
 	}
 	return -EINVAL;
 }
 
-static struct fb_ops atari_fb_ops = {
-	atari_fb_open, atari_fb_release, atari_fb_get_fix, atari_fb_get_var,
-	atari_fb_set_var, atari_fb_get_cmap, atari_fb_set_cmap,
-	atari_fb_pan_display, atari_fb_ioctl	
+static struct fb_ops atafb_ops = {
+	atafb_open, atafb_release, atafb_get_fix, atafb_get_var,
+	atafb_set_var, atafb_get_cmap, atafb_set_cmap,
+	atafb_pan_display, atafb_ioctl	
 };
 
 static void
@@ -2644,14 +2645,14 @@
 
 	/* First try the user supplied mode */
 	if (default_par) {
-		var=atari_fb_predefined[default_par-1];
+		var=atafb_predefined[default_par-1];
 		var.activate = FB_ACTIVATE_TEST;
 		if (do_fb_set_var(&var,1))
 			default_par=0;		/* failed */
 	}
 	/* Next is the autodetected one */
 	if (! default_par) {
-		var=atari_fb_predefined[detected_mode-1]; /* autodetect */
+		var=atafb_predefined[detected_mode-1]; /* autodetect */
 		var.activate = FB_ACTIVATE_TEST;
 		if (!do_fb_set_var(&var,1))
 			default_par=detected_mode;
@@ -2664,7 +2665,7 @@
 			default_par=get_video_mode(default_name);
 			if (! default_par)
 				panic("can't set default video mode\n");
-			var=atari_fb_predefined[default_par-1];
+			var=atafb_predefined[default_par-1];
 			var.activate = FB_ACTIVATE_TEST;
 			if (! do_fb_set_var(&var,1))
 				break;	/* ok */
@@ -2718,13 +2719,7 @@
 		do_install_cmap(currcon);
 }
 
-static int
-atafb_setcmap(struct fb_cmap *cmap, int con)
-{
-	return(atari_fb_set_cmap(cmap, 1, con));
-}
-
-__initfunc(unsigned long atari_fb_init(unsigned long mem_start))
+__initfunc(unsigned long atafb_init(unsigned long mem_start))
 {
 	int err;
 	int pad;
@@ -2815,23 +2810,22 @@
 	strcpy(fb_info.modename, "Atari Builtin ");
 	fb_info.changevar = NULL;
 	fb_info.node = -1;
-	fb_info.fbops = &atari_fb_ops;
-	fb_info.fbvar_num = num_atari_fb_predefined;
-	fb_info.fbvar = atari_fb_predefined;
+	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;
 	fb_info.blank = &atafb_blank;
-	fb_info.setcmap = &atafb_setcmap;
-	do_fb_set_var(&atari_fb_predefined[default_par-1], 1);
+	do_fb_set_var(&atafb_predefined[default_par-1], 1);
 	strcat(fb_info.modename, fb_var_names[default_par-1][0]);
 
 	err=register_framebuffer(&fb_info);
 	if (err < 0)
 		return(err);
 
-	atari_fb_get_var(&disp.var, -1);
-	atari_fb_set_disp(-1);
+	atafb_get_var(&disp.var, -1, GET_FB_IDX(fb_info.node));
+	atafb_set_disp(-1);
 	printk("Determined %dx%d, depth %d\n",
 	       disp.var.xres, disp.var.yres, disp.var.bits_per_pixel);
 	if ((disp.var.xres != disp.var.xres_virtual) ||
@@ -2870,7 +2864,7 @@
   return sbegin;
 }
 
-__initfunc(void atari_video_setup( char *options, int *ints ))
+__initfunc(void atafb_setup( char *options, int *ints ))
 {
     char *this_opt;
     int temp;
@@ -3126,9 +3120,9 @@
 		depth = simple_strtoul(p, NULL, 10);
 		if ((temp=get_video_mode("user0"))) {
 			default_par=temp;
-			atari_fb_predefined[default_par-1].xres = xres;
-			atari_fb_predefined[default_par-1].yres = yres;
-			atari_fb_predefined[default_par-1].bits_per_pixel = depth;
+			atafb_predefined[default_par-1].xres = xres;
+			atafb_predefined[default_par-1].yres = yres;
+			atafb_predefined[default_par-1].bits_per_pixel = depth;
 		}
 
 	  user_invalid:
@@ -3139,7 +3133,7 @@
 #ifdef MODULE
 int init_module(void)
 {
-	return(atari_fb_init(NULL));
+	return(atafb_init(NULL));
 }
 
 void cleanup_module(void)
diff -u --recursive --exclude-from=/home/geert/diff-excludes-linux --new-file m68k-2.1.64/drivers/video/cyberfb.c m68k-newfb/drivers/video/cyberfb.c
--- m68k-2.1.64/drivers/video/cyberfb.c	Mon Nov 17 22:00:36 1997
+++ m68k-newfb/drivers/video/cyberfb.c	Wed Dec 10 23:08:55 1997
@@ -41,13 +41,13 @@
 
 #define arraysize(x)    (sizeof(x)/sizeof(*(x)))
 
-struct Cyber_fb_par {
+struct cyberfb_par {
    int xres;
    int yres;
    int bpp;
 };
 
-static struct Cyber_fb_par current_par;
+static struct cyberfb_par current_par;
 
 static int current_par_valid = 0;
 static int currcon = 0;
@@ -68,9 +68,9 @@
 
    /* Display Control */
 
-   int (*encode_fix)(struct fb_fix_screeninfo *fix, struct Cyber_fb_par *par);
-   int (*decode_var)(struct fb_var_screeninfo *var, struct Cyber_fb_par *par);
-   int (*encode_var)(struct fb_var_screeninfo *var, struct Cyber_fb_par *par);
+   int (*encode_fix)(struct fb_fix_screeninfo *fix, struct cyberfb_par *par);
+   int (*decode_var)(struct fb_var_screeninfo *var, struct cyberfb_par *par);
+   int (*encode_var)(struct fb_var_screeninfo *var, struct cyberfb_par *par);
    int (*getcolreg)(u_int regno, u_int *red, u_int *green, u_int *blue,
                     u_int *transp);
    int (*setcolreg)(u_int regno, u_int red, u_int green, u_int blue,
@@ -83,7 +83,7 @@
  *    Frame Buffer Name
  */
 
-static char Cyber_fb_name[16] = "Cybervision";
+static char cyberfb_name[16] = "Cybervision";
 
 
 /*
@@ -112,7 +112,7 @@
  *    Predefined Video Mode Names
  */
 
-static char *Cyber_fb_modenames[] = {
+static char *cyberfb_modenames[] = {
 
    /*
     *    Autodetect (Default) Video Mode
@@ -151,7 +151,7 @@
  *    Predefined Video Mode Definitions
  */
 
-static struct fb_var_screeninfo cyber_fb_predefined[] = {
+static struct fb_var_screeninfo cyberfb_predefined[] = {
 
    /*
     *    Autodetect (Default) Video Mode
@@ -203,7 +203,7 @@
 };
 
 
-#define NUM_TOTAL_MODES    arraysize(cyber_fb_predefined)
+#define NUM_TOTAL_MODES    arraysize(cyberfb_predefined)
 #define NUM_PREDEF_MODES   (5)
 
 
@@ -227,29 +227,31 @@
  *    Interface used by the world
  */
 
-void Cyber_video_setup(char *options, int *ints);
+void cyberfb_setup(char *options, int *ints);
 
-static int Cyber_fb_open(int fbidx);
-static int Cyber_fb_release(int fbidx);
-static int Cyber_fb_get_fix(struct fb_fix_screeninfo *fix, int con);
-static int Cyber_fb_get_var(struct fb_var_screeninfo *var, int con);
-static int Cyber_fb_set_var(struct fb_var_screeninfo *var, int con);
-static int Cyber_fb_get_cmap(struct fb_cmap *cmap, int kspc, int con);
-static int Cyber_fb_set_cmap(struct fb_cmap *cmap, int kspc, int con);
-static int Cyber_fb_pan_display(struct fb_var_screeninfo *var, int con);
-static int Cyber_fb_ioctl(struct inode *inode, struct file *file, u_int cmd,
-                          u_long arg, int con);
+static int cyberfb_open(int fbidx);
+static int cyberfb_release(int fbidx);
+static int cyberfb_get_fix(struct fb_fix_screeninfo *fix, int con, int fbidx);
+static int cyberfb_get_var(struct fb_var_screeninfo *var, int con, int fbidx);
+static int cyberfb_set_var(struct fb_var_screeninfo *var, int con, int fbidx);
+static int cyberfb_get_cmap(struct fb_cmap *cmap, int kspc, int con,
+			     int fbidx);
+static int cyberfb_set_cmap(struct fb_cmap *cmap, int kspc, int con,
+			     int fbidx);
+static int cyberfb_pan_display(struct fb_var_screeninfo *var, int con,
+				int fbidx);
+static int cyberfb_ioctl(struct inode *inode, struct file *file, u_int cmd,
+                          u_long arg, int con, int fbidx);
 
 
 /*
  *    Interface to the low level console driver
  */
 
-unsigned long Cyber_fb_init(unsigned long mem_start);
+unsigned long cyberfb_init(unsigned long mem_start);
 static int Cyberfb_switch(int con);
 static int Cyberfb_updatevar(int con);
 static void Cyberfb_blank(int blank);
-static int Cyberfb_setcmap(struct fb_cmap *cmap, int con);
 
 
 /*
@@ -271,11 +273,11 @@
 
 static int Cyber_init(void);
 static int Cyber_encode_fix(struct fb_fix_screeninfo *fix,
-                          struct Cyber_fb_par *par);
+                          struct cyberfb_par *par);
 static int Cyber_decode_var(struct fb_var_screeninfo *var,
-                          struct Cyber_fb_par *par);
+                          struct cyberfb_par *par);
 static int Cyber_encode_var(struct fb_var_screeninfo *var,
-                          struct Cyber_fb_par *par);
+                          struct cyberfb_par *par);
 static int Cyber_getcolreg(u_int regno, u_int *red, u_int *green, u_int *blue,
                          u_int *transp);
 static int Cyber_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
@@ -287,11 +289,11 @@
  *    Internal routines
  */
 
-static void Cyber_fb_get_par(struct Cyber_fb_par *par);
-static void Cyber_fb_set_par(struct Cyber_fb_par *par);
+static void cyberfb_get_par(struct cyberfb_par *par);
+static void cyberfb_set_par(struct cyberfb_par *par);
 static int do_fb_set_var(struct fb_var_screeninfo *var, int isactive);
 static void do_install_cmap(int con);
-static void Cyber_fb_set_disp(int con);
+static void cyberfb_set_disp(int con);
 static int get_video_mode(const char *name);
 
 
@@ -385,11 +387,11 @@
  */
 
 static int Cyber_encode_fix(struct fb_fix_screeninfo *fix,
-			    struct Cyber_fb_par *par)
+			    struct cyberfb_par *par)
 {
 	int i;
 
-	strcpy(fix->id, Cyber_fb_name);
+	strcpy(fix->id, cyberfb_name);
 	fix->smem_start = (caddr_t)CyberMem;
 	fix->smem_len = CyberSize;
 	fix->mmio_start = (unsigned char *)CyberRegs;
@@ -420,7 +422,7 @@
  */
 
 static int Cyber_decode_var(struct fb_var_screeninfo *var,
-			    struct Cyber_fb_par *par)
+			    struct cyberfb_par *par)
 {
 #if 1
 	par->xres = var->xres;
@@ -447,7 +449,7 @@
  */
 
 static int Cyber_encode_var(struct fb_var_screeninfo *var,
-			    struct Cyber_fb_par *par)
+			    struct cyberfb_par *par)
 {
 	int i;
 
@@ -714,16 +716,16 @@
  *    Fill the hardware's `par' structure.
  */
 
-static void Cyber_fb_get_par(struct Cyber_fb_par *par)
+static void cyberfb_get_par(struct cyberfb_par *par)
 {
 	if (current_par_valid)
 		*par = current_par;
 	else
-		fbhw->decode_var(&cyber_fb_predefined[Cyberfb_mode], par);
+		fbhw->decode_var(&cyberfb_predefined[Cyberfb_mode], par);
 }
 
 
-static void Cyber_fb_set_par(struct Cyber_fb_par *par)
+static void cyberfb_set_par(struct cyberfb_par *par)
 {
 	current_par = *par;
 	current_par_valid = 1;
@@ -744,13 +746,13 @@
 static int do_fb_set_var(struct fb_var_screeninfo *var, int isactive)
 {
 	int err, activate;
-	struct Cyber_fb_par par;
+	struct cyberfb_par par;
 
 	if ((err = fbhw->decode_var(var, &par)))
 		return(err);
 	activate = var->activate;
 	if ((var->activate & FB_ACTIVATE_MASK) == FB_ACTIVATE_NOW && isactive)
-		Cyber_fb_set_par(&par);
+		cyberfb_set_par(&par);
 	fbhw->encode_var(var, &par);
 	var->activate = activate;
 
@@ -776,7 +778,7 @@
  *  Open/Release the frame buffer device
  */
 
-static int Cyber_fb_open(int fbidx)
+static int cyberfb_open(int fbidx)
 {
 	/*
 	 * Nothing, only a usage count for the moment
@@ -786,7 +788,7 @@
 	return(0);
 }
 
-static int Cyber_fb_release(int fbidx)
+static int cyberfb_release(int fbidx)
 {
 	MOD_DEC_USE_COUNT;
 	return(0);
@@ -797,13 +799,13 @@
  *    Get the Fixed Part of the Display
  */
 
-static int Cyber_fb_get_fix(struct fb_fix_screeninfo *fix, int con)
+static int cyberfb_get_fix(struct fb_fix_screeninfo *fix, int con, int fbidx)
 {
-	struct Cyber_fb_par par;
+	struct cyberfb_par par;
 	int error = 0;
 
 	if (con == -1)
-		Cyber_fb_get_par(&par);
+		cyberfb_get_par(&par);
 	else
 		error = fbhw->decode_var(&fb_display[con].var, &par);
 	return(error ? error : fbhw->encode_fix(fix, &par));
@@ -814,13 +816,13 @@
  *    Get the User Defined Part of the Display
  */
 
-static int Cyber_fb_get_var(struct fb_var_screeninfo *var, int con)
+static int cyberfb_get_var(struct fb_var_screeninfo *var, int con, int fbidx)
 {
-	struct Cyber_fb_par par;
+	struct cyberfb_par par;
 	int error = 0;
 
 	if (con == -1) {
-		Cyber_fb_get_par(&par);
+		cyberfb_get_par(&par);
 		error = fbhw->encode_var(var, &par);
 	} else
 		*var = fb_display[con].var;
@@ -828,7 +830,7 @@
 }
 
 
-static void Cyber_fb_set_disp(int con)
+static void cyberfb_set_disp(int con)
 {
 	struct fb_fix_screeninfo fix;
 	struct display *display;
@@ -838,7 +840,8 @@
 	else
 		display = &disp;	/* used during initialization */
 
-	Cyber_fb_get_fix(&fix, con);
+	/* ### FN: Needs fixes later */
+	cyberfb_get_fix(&fix, con, 0);
 	if (con == -1)
 		con = 0;
 	display->screen_base = (u_char *)fix.smem_start;
@@ -856,7 +859,7 @@
  *    Set the User Defined Part of the Display
  */
 
-static int Cyber_fb_set_var(struct fb_var_screeninfo *var, int con)
+static int cyberfb_set_var(struct fb_var_screeninfo *var, int con, int fbidx)
 {
 	int err, oldxres, oldyres, oldvxres, oldvyres, oldbpp;
 
@@ -873,7 +876,7 @@
 		    oldvxres != var->xres_virtual ||
 		    oldvyres != var->yres_virtual ||
 		    oldbpp != var->bits_per_pixel) {
-			Cyber_fb_set_disp(con);
+			cyberfb_set_disp(con);
 			(*fb_info.changevar)(con);
 			fb_alloc_cmap(&fb_display[con].cmap, 0, 0);
 			do_install_cmap(con);
@@ -888,7 +891,8 @@
  *    Get the Colormap
  */
 
-static int Cyber_fb_get_cmap(struct fb_cmap *cmap, int kspc, int con)
+static int cyberfb_get_cmap(struct fb_cmap *cmap, int kspc, int con,
+			     int fbidx)
 {
 	if (con == currcon) /* current console? */
 		return(fb_get_cmap(cmap, &fb_display[con].var,
@@ -906,7 +910,8 @@
  *    Set the Colormap
  */
 
-static int Cyber_fb_set_cmap(struct fb_cmap *cmap, int kspc, int con)
+static int cyberfb_set_cmap(struct fb_cmap *cmap, int kspc, int con,
+			     int fbidx)
 {
 	int err;
 
@@ -930,7 +935,7 @@
  *    This call looks only at xoffset, yoffset and the FB_VMODE_YWRAP flag
  */
 
-static int Cyber_fb_pan_display(struct fb_var_screeninfo *var, int con)
+static int cyberfb_pan_display(struct fb_var_screeninfo *var, int con, int fbidx)
 {
 	return(-EINVAL);
 }
@@ -940,21 +945,21 @@
     *    Cybervision Frame Buffer Specific ioctls
     */
 
-static int Cyber_fb_ioctl(struct inode *inode, struct file *file,
-                          u_int cmd, u_long arg, int con)
+static int cyberfb_ioctl(struct inode *inode, struct file *file,
+                          u_int cmd, u_long arg, int con, int fbidx)
 {
 	return(-EINVAL);
 }
 
 
-static struct fb_ops Cyber_fb_ops = {
-	Cyber_fb_open, Cyber_fb_release, Cyber_fb_get_fix, Cyber_fb_get_var,
-	Cyber_fb_set_var, Cyber_fb_get_cmap, Cyber_fb_set_cmap,
-	Cyber_fb_pan_display, Cyber_fb_ioctl
+static struct fb_ops cyberfb_ops = {
+	cyberfb_open, cyberfb_release, cyberfb_get_fix, cyberfb_get_var,
+	cyberfb_set_var, cyberfb_get_cmap, cyberfb_set_cmap,
+	cyberfb_pan_display, cyberfb_ioctl
 };
 
 
-__initfunc(void Cyber_video_setup(char *options, int *ints))
+__initfunc(void cyberfb_setup(char *options, int *ints))
 {
 	char *this_opt;
 
@@ -984,10 +989,10 @@
  *    Initialization
  */
 
-__initfunc(unsigned long Cyber_fb_init(unsigned long mem_start))
+__initfunc(unsigned long cyberfb_init(unsigned long mem_start))
 {
 	int err;
-	struct Cyber_fb_par par;
+	struct cyberfb_par par;
 	unsigned long board_addr;
 	const struct ConfigDev *cd;
 
@@ -1005,29 +1010,28 @@
 
 	fbhw = &Cyber_switch;
 
-	strcpy(fb_info.modename, Cyber_fb_name);
+	strcpy(fb_info.modename, cyberfb_name);
 	fb_info.changevar = NULL;
 	fb_info.node = -1;
-	fb_info.fbops = &Cyber_fb_ops;
+	fb_info.fbops = &cyberfb_ops;
 	fb_info.fbvar_num = NUM_TOTAL_MODES;
-	fb_info.fbvar = cyber_fb_predefined;
+	fb_info.fbvar = cyberfb_predefined;
 	fb_info.disp = &disp;
 	fb_info.switch_con = &Cyberfb_switch;
 	fb_info.updatevar = &Cyberfb_updatevar;
 	fb_info.blank = &Cyberfb_blank;
-	fb_info.setcmap = &Cyberfb_setcmap;
 
 	err = register_framebuffer(&fb_info);
 	if (err < 0)
 		return mem_start;
 
 	fbhw->init();
-	fbhw->decode_var(&cyber_fb_predefined[Cyberfb_mode], &par);
-	fbhw->encode_var(&cyber_fb_predefined[0], &par);
+	fbhw->decode_var(&cyberfb_predefined[Cyberfb_mode], &par);
+	fbhw->encode_var(&cyberfb_predefined[0], &par);
 
-	do_fb_set_var(&cyber_fb_predefined[0], 1);
-	Cyber_fb_get_var(&fb_display[0].var, -1);
-	Cyber_fb_set_disp(-1);
+	do_fb_set_var(&cyberfb_predefined[0], 1);
+	cyberfb_get_var(&fb_display[0].var, -1, GET_FB_IDX(fb_info.node));
+	cyberfb_set_disp(-1);
 	do_install_cmap(0);
 
 	printk("%s frame buffer device, using %ldK of video memory\n",
@@ -1079,16 +1083,6 @@
 
 
 /*
- *    Set the colormap
- */
-
-static int Cyberfb_setcmap(struct fb_cmap *cmap, int con)
-{
-	return(Cyber_fb_set_cmap(cmap, 1, con));
-}
-
-
-/*
  *    Get a Video Mode
  */
 
@@ -1097,8 +1091,8 @@
 	int i;
 
 	for (i = 1; i < NUM_PREDEF_MODES; i++)
-		if (!strcmp(name, Cyber_fb_modenames[i]))
-			cyber_fb_predefined[0] = cyber_fb_predefined[i];
+		if (!strcmp(name, cyberfb_modenames[i]))
+			cyberfb_predefined[0] = cyberfb_predefined[i];
 			return(i);
 	return(0);
 }
@@ -1107,7 +1101,7 @@
 #ifdef MODULE
 int init_module(void)
 {
-	return(Cyber_fb_init(NULL));
+	return(cyberfb_init(NULL));
 }
 
 void cleanup_module(void)
diff -u --recursive --exclude-from=/home/geert/diff-excludes-linux --new-file m68k-2.1.64/drivers/video/dn_fb.c m68k-newfb/drivers/video/dn_fb.c
--- m68k-2.1.64/drivers/video/dn_fb.c	Sun Nov 23 23:33:09 1997
+++ m68k-newfb/drivers/video/dn_fb.c	Thu Jan  1 01:00:00 1970
@@ -1,389 +0,0 @@
-#include <linux/kernel.h>
-#include <linux/errno.h>
-#include <linux/string.h>
-#include <linux/mm.h>
-#include <linux/tty.h>
-#include <linux/malloc.h>
-#include <linux/delay.h>
-#include <linux/config.h>
-#include <linux/interrupt.h>
-#include <asm/setup.h>
-#include <asm/segment.h>
-#include <asm/system.h>
-#include <asm/irq.h>
-#include <asm/apollohw.h>
-#include <linux/fb.h>
-#include <linux/module.h>
-
-/* apollo video HW definitions */
-
-/*
- * Control Registers.   IOBASE + $x
- *
- * Note: these are the Memory/IO BASE definitions for a mono card set to the
- * alternate address
- *
- * Control 3A and 3B serve identical functions except that 3A
- * deals with control 1 and 3b deals with Color LUT reg.
- */
-
-#define AP_IOBASE       0x5d80          /* Base address of 1 plane board. */
-#define AP_STATUS       0x5d80          /* Status register.  Read */
-#define AP_WRITE_ENABLE 0x5d80          /* Write Enable Register Write */
-#define AP_DEVICE_ID    0x5d81          /* Device ID Register. Read */
-#define AP_ROP_1        0x5d82          /* Raster Operation reg. Write Word */
-#define AP_DIAG_MEM_REQ 0x5d84          /* Diagnostic Memory Request. Write Word */
-#define AP_CONTROL_0    0x5d88          /* Control Register 0.  Read/Write */
-#define AP_CONTROL_1    0x5d8a          /* Control Register 1.  Read/Write */
-#define AP_CONTROL_3A   0x5d8e          /* Control Register 3a. Read/Write */
-#define AP_CONTROL_2    0x5d8c          /* Control Register 2. Read/Write */
-
-
-#define FRAME_BUFFER_START 0x0FA0000
-#define FRAME_BUFFER_LEN 0x40000
-
-/* CREG 0 */
-#define VECTOR_MODE 0x40 /* 010x.xxxx */
-#define DBLT_MODE   0x80 /* 100x.xxxx */
-#define NORMAL_MODE 0xE0 /* 111x.xxxx */
-#define SHIFT_BITS  0x1F /* xxx1.1111 */
-        /* other bits are Shift value */
-
-/* CREG 1 */
-#define AD_BLT      0x80 /* 1xxx.xxxx */
-#define NORMAL      0x80 /* 1xxx.xxxx */   /* What is happening here ?? */
-#define INVERSE     0x00 /* 0xxx.xxxx */   /* Clearing this reverses the screen */
-#define PIX_BLT     0x00 /* 0xxx.xxxx */
-
-#define AD_HIBIT        0x40 /* xIxx.xxxx */
-
-#define ROP_EN          0x10 /* xxx1.xxxx */
-#define DST_EQ_SRC      0x00 /* xxx0.xxxx */
-#define nRESET_SYNC     0x08 /* xxxx.1xxx */
-#define SYNC_ENAB       0x02 /* xxxx.xx1x */
-
-#define BLANK_DISP      0x00 /* xxxx.xxx0 */
-#define ENAB_DISP       0x01 /* xxxx.xxx1 */
-
-#define NORM_CREG1      (nRESET_SYNC | SYNC_ENAB | ENAB_DISP) /* no reset sync */
-
-/* CREG 2 */
-
-/*
- * Following 3 defines are common to 1, 4 and 8 plane.
- */
-
-#define S_DATA_1s   0x00 /* 00xx.xxxx */ /* set source to all 1's -- vector drawing */
-#define S_DATA_PIX  0x40 /* 01xx.xxxx */ /* takes source from ls-bits and replicates over 16 bits */
-#define S_DATA_PLN  0xC0 /* 11xx.xxxx */ /* normal, each data access =16-bits in
- one plane of image mem */
-
-/* CREG 3A/CREG 3B */
-#       define RESET_CREG 0x80 /* 1000.0000 */
-
-/* ROP REG  -  all one nibble */
-/*      ********* NOTE : this is used r0,r1,r2,r3 *********** */
-#define ROP(r2,r3,r0,r1) ( (U_SHORT)((r0)|((r1)<<4)|((r2)<<8)|((r3)<<12)) )
-#define DEST_ZERO               0x0
-#define SRC_AND_DEST    0x1
-#define SRC_AND_nDEST   0x2
-#define SRC                             0x3
-#define nSRC_AND_DEST   0x4
-#define DEST                    0x5
-#define SRC_XOR_DEST    0x6
-#define SRC_OR_DEST             0x7
-#define SRC_NOR_DEST    0x8
-#define SRC_XNOR_DEST   0x9
-#define nDEST                   0xA
-#define SRC_OR_nDEST    0xB
-#define nSRC                    0xC
-#define nSRC_OR_DEST    0xD
-#define SRC_NAND_DEST   0xE
-#define DEST_ONE                0xF
-
-#define SWAP(A) ((A>>8) | ((A&0xff) <<8))
-
-#if 0
-#define outb(a,d) *(char *)(a)=(d)
-#define outw(a,d) *(unsigned short *)a=d
-#endif
-
-
-void dn_video_setup(char *options, int *ints);
-
-/* frame buffer operations */
-
-static int dn_fb_open(int fbidx);
-static int dn_fb_release(int fbidx);
-static int dn_fb_get_fix(struct fb_fix_screeninfo *fix, int con);
-static int dn_fb_get_var(struct fb_var_screeninfo *var, int con);
-static int dn_fb_set_var(struct fb_var_screeninfo *var, int isactive);
-static int dn_fb_get_cmap(struct fb_cmap *cmap,int kspc,int con);
-static int dn_fb_set_cmap(struct fb_cmap *cmap,int kspc,int con);
-static int dn_fb_pan_display(struct fb_var_screeninfo *var, int con);
-static int dn_fb_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
-		       unsigned long arg, int con);
-
-static int dnfbcon_switch(int con);
-static int dnfbcon_updatevar(int con);
-static void dnfbcon_blank(int blank);
-
-static void dn_fb_set_disp(int con);
-
-static struct display disp[MAX_NR_CONSOLES];
-static struct fb_info fb_info;
-static struct fb_ops dn_fb_ops = { 
-	dn_fb_open,dn_fb_release, dn_fb_get_fix, dn_fb_get_var, dn_fb_set_var,
-	dn_fb_get_cmap, dn_fb_set_cmap, dn_fb_pan_display, dn_fb_ioctl
-};
-
-static int currcon=0;
-
-#define NUM_TOTAL_MODES 1
-struct fb_var_screeninfo dn_fb_predefined[] = {
-
-	{ 0, },
-
-};
-
-static char dn_fb_name[]="Apollo ";
-
-static int dn_fb_open(int fbidx)
-{
-        /*
-         * Nothing, only a usage count for the moment
-         */
-
-        MOD_INC_USE_COUNT;
-        return(0);
-}
-
-static int dn_fb_release(int fbidx)
-{
-        MOD_DEC_USE_COUNT;
-        return(0);
-}
-
-static int dn_fb_get_fix(struct fb_fix_screeninfo *fix, int con) {
-
-	memset(fix, 0, sizeof(struct fb_fix_screeninfo));
-	strcpy(fix->id,"Apollo Mono");
-	fix->smem_start=(char*)(FRAME_BUFFER_START+IO_BASE);
-	fix->smem_len=FRAME_BUFFER_LEN;
-	fix->type=FB_TYPE_PACKED_PIXELS;
-	fix->type_aux=0;
-	fix->visual=FB_VISUAL_MONO10;
-	fix->xpanstep=0;
-	fix->ypanstep=0;
-	fix->ywrapstep=0;
-        fix->line_length=256;
-
-	return 0;
-
-}
-        
-static int dn_fb_get_var(struct fb_var_screeninfo *var, int con) {
-		
-	var->xres=1280;
-	var->yres=1024;
-	var->xres_virtual=2048;
-	var->yres_virtual=1024;
-	var->xoffset=0;
-	var->yoffset=0;
-	var->bits_per_pixel=1;
-	var->grayscale=0;
-	var->nonstd=0;
-	var->activate=0;
-	var->height=-1;
-	var->width=-1;
-	var->pixclock=0;
-	var->left_margin=0;
-	var->right_margin=0;
-	var->hsync_len=0;
-	var->vsync_len=0;
-	var->sync=0;
-	var->vmode=FB_VMODE_NONINTERLACED;
-	var->accel=FB_ACCEL_NONE;
-
-	return 0;
-
-}
-
-static int dn_fb_set_var(struct fb_var_screeninfo *var, int isactive) {
-
-        printk("fb_set_var\n");
-	if(var->xres!=1280) 
-		return -EINVAL;
-	if(var->yres!=1024)
-		return -EINVAL;
-	if(var->xres_virtual!=2048)
-		return -EINVAL;
-	if(var->yres_virtual!=1024)
-		return -EINVAL;
-	if(var->xoffset!=0)
-		return -EINVAL;
-	if(var->yoffset!=0)
-		return -EINVAL;
-	if(var->bits_per_pixel!=1)
-		return -EINVAL;
-	if(var->grayscale!=0)
-		return -EINVAL;
-	if(var->nonstd!=0)
-		return -EINVAL;
-	if(var->activate!=0)
-		return -EINVAL;
-	if(var->pixclock!=0)
-		return -EINVAL;
-	if(var->left_margin!=0)
-		return -EINVAL;
-	if(var->right_margin!=0)
-		return -EINVAL;
-	if(var->hsync_len!=0)
-		return -EINVAL;
-	if(var->vsync_len!=0)
-		return -EINVAL;
-	if(var->sync!=0)
-		return -EINVAL;
-	if(var->vmode!=FB_VMODE_NONINTERLACED)
-		return -EINVAL;
-	if(var->accel!=FB_ACCEL_NONE)
-		return -EINVAL;
-
-	return 0;
-
-}
-
-static int dn_fb_get_cmap(struct fb_cmap *cmap,int kspc,int con) {
-
-	printk("get cmap not supported\n");
-
-	return -EINVAL;
-}
-
-static int dn_fb_set_cmap(struct fb_cmap *cmap,int kspc,int con) {
-
-	printk("set cmap not supported\n");
-
-	return -EINVAL;
-
-}
-
-static int dn_fb_pan_display(struct fb_var_screeninfo *var, int con) {
-
-	printk("panning not supported\n");
-
-	return -EINVAL;
-
-}
-
-static int dn_fb_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
-		    unsigned long arg, int con) {
-
-	printk("no IOCTLs as of yet.\n");
-
-	return -EINVAL;
-
-}
-
-static void dn_fb_set_disp(int con) {
-
-  struct fb_fix_screeninfo fix;
-
-  dn_fb_get_fix(&fix,con);
-  if(con==-1) 
-    con=0;
-
-   disp[con].screen_base = (u_char *)fix.smem_start;
-printk("screenbase: %p\n",fix.smem_start);
-   disp[con].visual = fix.visual;
-   disp[con].type = fix.type;
-   disp[con].type_aux = fix.type_aux;
-   disp[con].ypanstep = fix.ypanstep;
-   disp[con].ywrapstep = fix.ywrapstep;
-   disp[con].can_soft_blank = 1;
-   disp[con].inverse = 0;
-   disp[con].line_length = fix.line_length;
-}
-  
-unsigned long dn_fb_init(unsigned long mem_start) {
-
-	int err;
-       
-printk("dn_fb_init\n");
-
-	fb_info.changevar=NULL;
-	strcpy(&fb_info.modename[0],dn_fb_name);
-	fb_info.fontname[0]=0;
-	fb_info.disp=disp;
-	fb_info.switch_con=&dnfbcon_switch;
-	fb_info.updatevar=&dnfbcon_updatevar;
-	fb_info.blank=&dnfbcon_blank;	
-	fb_info.node = -1;
-	fb_info.fbops = &dn_fb_ops;
-	fb_info.fbvar = dn_fb_predefined;
-	fb_info.fbvar_num = NUM_TOTAL_MODES;
-	
-printk("dn_fb_init: register\n");
-	err=register_framebuffer(&fb_info);
-	if(err < 0) {
-		panic("unable to register apollo frame buffer\n");
-	}
- 
-	/* now we have registered we can safely setup the hardware */
-
-        outb(RESET_CREG, AP_CONTROL_3A);
-        outw(0x0, AP_WRITE_ENABLE);
-        outb(NORMAL_MODE,AP_CONTROL_0); 
-        outb((AD_BLT | DST_EQ_SRC | NORM_CREG1), AP_CONTROL_1);
-        outb(S_DATA_PLN, AP_CONTROL_2);
-        outw(SWAP(0x3),AP_ROP_1);
-
-        printk("apollo frame buffer alive and kicking !\n");
-
-	
-        dn_fb_get_var(&disp[0].var,0);
-
-	dn_fb_set_disp(-1);
-
-	return mem_start;
-
-}	
-
-	
-static int dnfbcon_switch(int con) { 
-
-	currcon=con;
-	
-	return 0;
-
-}
-
-static int dnfbcon_updatevar(int con) {
-
-	return 0;
-
-}
-
-static void dnfbcon_blank(int blank) {
-
-	printk("dnfbcon_blank: %d\n",blank);
-	if(blank)  {
-        	outb(0, AP_CONTROL_3A);
-		outb((AD_BLT | DST_EQ_SRC | NORM_CREG1) & ~ENAB_DISP,
-		     AP_CONTROL_1);
-	}
-	else {
-	        outb(1, AP_CONTROL_3A);
-        	outb((AD_BLT | DST_EQ_SRC | NORM_CREG1), AP_CONTROL_1);
-	}
-
-	return ;
-
-}
-
-void dn_video_setup(char *options, int *ints) {
-	
-	return;
-
-}
-
diff -u --recursive --exclude-from=/home/geert/diff-excludes-linux --new-file m68k-2.1.64/drivers/video/dnfb.c m68k-newfb/drivers/video/dnfb.c
--- m68k-2.1.64/drivers/video/dnfb.c	Thu Jan  1 01:00:00 1970
+++ m68k-newfb/drivers/video/dnfb.c	Wed Dec 10 23:15:31 1997
@@ -0,0 +1,370 @@
+#include <linux/kernel.h>
+#include <linux/errno.h>
+#include <linux/string.h>
+#include <linux/mm.h>
+#include <linux/tty.h>
+#include <linux/malloc.h>
+#include <linux/delay.h>
+#include <linux/config.h>
+#include <linux/interrupt.h>
+#include <asm/setup.h>
+#include <asm/segment.h>
+#include <asm/system.h>
+#include <asm/irq.h>
+#include <asm/apollohw.h>
+#include <linux/fb.h>
+#include <linux/module.h>
+
+/* apollo video HW definitions */
+
+/*
+ * Control Registers.   IOBASE + $x
+ *
+ * Note: these are the Memory/IO BASE definitions for a mono card set to the
+ * alternate address
+ *
+ * Control 3A and 3B serve identical functions except that 3A
+ * deals with control 1 and 3b deals with Color LUT reg.
+ */
+
+#define AP_IOBASE       0x5d80          /* Base address of 1 plane board. */
+#define AP_STATUS       0x5d80          /* Status register.  Read */
+#define AP_WRITE_ENABLE 0x5d80          /* Write Enable Register Write */
+#define AP_DEVICE_ID    0x5d81          /* Device ID Register. Read */
+#define AP_ROP_1        0x5d82          /* Raster Operation reg. Write Word */
+#define AP_DIAG_MEM_REQ 0x5d84          /* Diagnostic Memory Request. Write Word */
+#define AP_CONTROL_0    0x5d88          /* Control Register 0.  Read/Write */
+#define AP_CONTROL_1    0x5d8a          /* Control Register 1.  Read/Write */
+#define AP_CONTROL_3A   0x5d8e          /* Control Register 3a. Read/Write */
+#define AP_CONTROL_2    0x5d8c          /* Control Register 2. Read/Write */
+
+
+#define FRAME_BUFFER_START 0x0FA0000
+#define FRAME_BUFFER_LEN 0x40000
+
+/* CREG 0 */
+#define VECTOR_MODE 0x40 /* 010x.xxxx */
+#define DBLT_MODE   0x80 /* 100x.xxxx */
+#define NORMAL_MODE 0xE0 /* 111x.xxxx */
+#define SHIFT_BITS  0x1F /* xxx1.1111 */
+        /* other bits are Shift value */
+
+/* CREG 1 */
+#define AD_BLT      0x80 /* 1xxx.xxxx */
+#define NORMAL      0x80 /* 1xxx.xxxx */   /* What is happening here ?? */
+#define INVERSE     0x00 /* 0xxx.xxxx */   /* Clearing this reverses the screen */
+#define PIX_BLT     0x00 /* 0xxx.xxxx */
+
+#define AD_HIBIT        0x40 /* xIxx.xxxx */
+
+#define ROP_EN          0x10 /* xxx1.xxxx */
+#define DST_EQ_SRC      0x00 /* xxx0.xxxx */
+#define nRESET_SYNC     0x08 /* xxxx.1xxx */
+#define SYNC_ENAB       0x02 /* xxxx.xx1x */
+
+#define BLANK_DISP      0x00 /* xxxx.xxx0 */
+#define ENAB_DISP       0x01 /* xxxx.xxx1 */
+
+#define NORM_CREG1      (nRESET_SYNC | SYNC_ENAB | ENAB_DISP) /* no reset sync */
+
+/* CREG 2 */
+
+/*
+ * Following 3 defines are common to 1, 4 and 8 plane.
+ */
+
+#define S_DATA_1s   0x00 /* 00xx.xxxx */ /* set source to all 1's -- vector drawing */
+#define S_DATA_PIX  0x40 /* 01xx.xxxx */ /* takes source from ls-bits and replicates over 16 bits */
+#define S_DATA_PLN  0xC0 /* 11xx.xxxx */ /* normal, each data access =16-bits in
+ one plane of image mem */
+
+/* CREG 3A/CREG 3B */
+#       define RESET_CREG 0x80 /* 1000.0000 */
+
+/* ROP REG  -  all one nibble */
+/*      ********* NOTE : this is used r0,r1,r2,r3 *********** */
+#define ROP(r2,r3,r0,r1) ( (U_SHORT)((r0)|((r1)<<4)|((r2)<<8)|((r3)<<12)) )
+#define DEST_ZERO               0x0
+#define SRC_AND_DEST    0x1
+#define SRC_AND_nDEST   0x2
+#define SRC                             0x3
+#define nSRC_AND_DEST   0x4
+#define DEST                    0x5
+#define SRC_XOR_DEST    0x6
+#define SRC_OR_DEST             0x7
+#define SRC_NOR_DEST    0x8
+#define SRC_XNOR_DEST   0x9
+#define nDEST                   0xA
+#define SRC_OR_nDEST    0xB
+#define nSRC                    0xC
+#define nSRC_OR_DEST    0xD
+#define SRC_NAND_DEST   0xE
+#define DEST_ONE                0xF
+
+#define SWAP(A) ((A>>8) | ((A&0xff) <<8))
+
+#if 0
+#define outb(a,d) *(char *)(a)=(d)
+#define outw(a,d) *(unsigned short *)a=d
+#endif
+
+
+/* frame buffer operations */
+
+static int dnfb_open(int fbidx);
+static int dnfb_release(int fbidx);
+static int dnfb_get_fix(struct fb_fix_screeninfo *fix, int con, int fbidx);
+static int dnfb_get_var(struct fb_var_screeninfo *var, int con, int fbidx);
+static int dnfb_set_var(struct fb_var_screeninfo *var, int con, int fbidx);
+static int dnfb_get_cmap(struct fb_cmap *cmap,int kspc,int con, int fbidx);
+static int dnfb_set_cmap(struct fb_cmap *cmap,int kspc,int con, int fbidx);
+static int dnfb_pan_display(struct fb_var_screeninfo *var, int con,
+			     int fbidx);
+static int dnfb_ioctl(struct inode *inode, struct file *file,
+		       unsigned int cmd, unsigned long arg, int con,
+		       int fbidx);
+
+static int dnfbcon_switch(int con);
+static int dnfbcon_updatevar(int con);
+static void dnfbcon_blank(int blank);
+
+static void dnfb_set_disp(int con);
+
+static struct display disp[MAX_NR_CONSOLES];
+static struct fb_info fb_info;
+static struct fb_ops dnfb_ops = { 
+	dnfb_open,dnfb_release, dnfb_get_fix, dnfb_get_var, dnfb_set_var,
+	dnfb_get_cmap, dnfb_set_cmap, dnfb_pan_display, dnfb_ioctl
+};
+
+static int currcon=0;
+
+#define NUM_TOTAL_MODES 1
+struct fb_var_screeninfo dnfb_predefined[] = {
+
+	{ 0, },
+
+};
+
+static char dnfb_name[]="Apollo ";
+
+static int dnfb_open(int fbidx)
+{
+        /*
+         * Nothing, only a usage count for the moment
+         */
+
+        MOD_INC_USE_COUNT;
+        return(0);
+}
+
+static int dnfb_release(int fbidx)
+{
+        MOD_DEC_USE_COUNT;
+        return(0);
+}
+
+static int dnfb_get_fix(struct fb_fix_screeninfo *fix, int con, int fbidx)
+{
+	memset(fix, 0, sizeof(struct fb_fix_screeninfo));
+	strcpy(fix->id,"Apollo Mono");
+	fix->smem_start=(char*)(FRAME_BUFFER_START+IO_BASE);
+	fix->smem_len=FRAME_BUFFER_LEN;
+	fix->type=FB_TYPE_PACKED_PIXELS;
+	fix->type_aux=0;
+	fix->visual=FB_VISUAL_MONO10;
+	fix->xpanstep=0;
+	fix->ypanstep=0;
+	fix->ywrapstep=0;
+        fix->line_length=256;
+
+	return 0;
+
+}
+        
+static int dnfb_get_var(struct fb_var_screeninfo *var, int con, int fbidx)
+{
+	var->xres=1280;
+	var->yres=1024;
+	var->xres_virtual=2048;
+	var->yres_virtual=1024;
+	var->xoffset=0;
+	var->yoffset=0;
+	var->bits_per_pixel=1;
+	var->grayscale=0;
+	var->nonstd=0;
+	var->activate=0;
+	var->height=-1;
+	var->width=-1;
+	var->pixclock=0;
+	var->left_margin=0;
+	var->right_margin=0;
+	var->hsync_len=0;
+	var->vsync_len=0;
+	var->sync=0;
+	var->vmode=FB_VMODE_NONINTERLACED;
+	var->accel=FB_ACCEL_NONE;
+
+	return 0;
+
+}
+
+static int dnfb_set_var(struct fb_var_screeninfo *var, int con, int fbidx)
+{
+	if(var->xres!=1280) 
+		return -EINVAL;
+	if(var->yres!=1024)
+		return -EINVAL;
+	if(var->xres_virtual!=2048)
+		return -EINVAL;
+	if(var->yres_virtual!=1024)
+		return -EINVAL;
+	if(var->xoffset!=0)
+		return -EINVAL;
+	if(var->yoffset!=0)
+		return -EINVAL;
+	if(var->bits_per_pixel!=1)
+		return -EINVAL;
+	if(var->grayscale!=0)
+		return -EINVAL;
+	if(var->nonstd!=0)
+		return -EINVAL;
+	if(var->activate!=0)
+		return -EINVAL;
+	if(var->pixclock!=0)
+		return -EINVAL;
+	if(var->left_margin!=0)
+		return -EINVAL;
+	if(var->right_margin!=0)
+		return -EINVAL;
+	if(var->hsync_len!=0)
+		return -EINVAL;
+	if(var->vsync_len!=0)
+		return -EINVAL;
+	if(var->sync!=0)
+		return -EINVAL;
+	if(var->vmode!=FB_VMODE_NONINTERLACED)
+		return -EINVAL;
+	if(var->accel!=FB_ACCEL_NONE)
+		return -EINVAL;
+
+	return 0;
+
+}
+
+static int dnfb_get_cmap(struct fb_cmap *cmap, int kspc, int con, int fbidx)
+{
+	printk("get cmap not supported\n");
+
+	return -EINVAL;
+}
+
+static int dnfb_set_cmap(struct fb_cmap *cmap, int kspc, int con, int fbidx)
+{
+	printk("set cmap not supported\n");
+
+	return -EINVAL;
+
+}
+
+static int dnfb_pan_display(struct fb_var_screeninfo *var, int con, int fbidx)
+{
+	printk("panning not supported\n");
+
+	return -EINVAL;
+
+}
+
+static int dnfb_ioctl(struct inode *inode, struct file *file,
+		       unsigned int cmd, unsigned long arg, int con, int fbidx)
+{
+	return -EINVAL;
+}
+
+static void dnfb_set_disp(int con)
+{
+  struct fb_fix_screeninfo fix;
+
+  /* ### FN: Needs fixes later */
+  dnfb_get_fix(&fix, con, 0);
+  if(con==-1) 
+    con=0;
+
+   disp[con].screen_base = (u_char *)fix.smem_start;
+   disp[con].visual = fix.visual;
+   disp[con].type = fix.type;
+   disp[con].type_aux = fix.type_aux;
+   disp[con].ypanstep = fix.ypanstep;
+   disp[con].ywrapstep = fix.ywrapstep;
+   disp[con].can_soft_blank = 1;
+   disp[con].inverse = 0;
+   disp[con].line_length = fix.line_length;
+}
+  
+unsigned long dnfb_init(unsigned long mem_start)
+{
+	int err;
+       
+	fb_info.changevar=NULL;
+	strcpy(&fb_info.modename[0],dnfb_name);
+	fb_info.fontname[0]=0;
+	fb_info.disp=disp;
+	fb_info.switch_con=&dnfbcon_switch;
+	fb_info.updatevar=&dnfbcon_updatevar;
+	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) {
+		panic("unable to register apollo frame buffer\n");
+	}
+ 
+	/* now we have registered we can safely setup the hardware */
+
+        outb(RESET_CREG, AP_CONTROL_3A);
+        outw(0x0, AP_WRITE_ENABLE);
+        outb(NORMAL_MODE,AP_CONTROL_0); 
+        outb((AD_BLT | DST_EQ_SRC | NORM_CREG1), AP_CONTROL_1);
+        outb(S_DATA_PLN, AP_CONTROL_2);
+        outw(SWAP(0x3),AP_ROP_1);
+
+        printk("apollo frame buffer alive and kicking !\n");
+
+	
+        dnfb_get_var(&disp[0].var, 0, GET_FB_IDX(fb_info.node));
+
+	dnfb_set_disp(-1);
+
+	return mem_start;
+
+}	
+
+	
+static int dnfbcon_switch(int con)
+{ 
+	currcon=con;
+	
+	return 0;
+
+}
+
+static int dnfbcon_updatevar(int con)
+{
+	return 0;
+}
+
+static void dnfbcon_blank(int blank)
+{
+	if(blank)  {
+        	outb(0, AP_CONTROL_3A);
+		outb((AD_BLT | DST_EQ_SRC | NORM_CREG1) & ~ENAB_DISP,
+		     AP_CONTROL_1);
+	}
+	else {
+	        outb(1, AP_CONTROL_3A);
+        	outb((AD_BLT | DST_EQ_SRC | NORM_CREG1), AP_CONTROL_1);
+	}
+}
diff -u --recursive --exclude-from=/home/geert/diff-excludes-linux --new-file m68k-2.1.64/drivers/video/fbcon-mach64.c m68k-newfb/drivers/video/fbcon-mach64.c
--- m68k-2.1.64/drivers/video/fbcon-mach64.c	Thu Jan  1 01:00:00 1970
+++ m68k-newfb/drivers/video/fbcon-mach64.c	Wed Dec 10 23:33:14 1997
@@ -0,0 +1,520 @@
+/*
+ *  linux/drivers/video/fbcon-mach64.c -- Low level frame buffer operations for 
+ *					  Ati Mach64 (accelerated)
+ *
+ *	Created 20 Jun 1997 by Bernd Harries
+ *
+ *  This file is subject to the terms and conditions of the GNU General Public
+ *  License.  See the file COPYING in the main directory of this archive for
+ *  more details.
+ */
+
+#include <linux/module.h>
+#include <linux/tty.h>
+#include <linux/console.h>
+#include <linux/string.h>
+#include <linux/config.h>
+#include <linux/fb.h>
+
+#include "fbcon.h"
+#include "fbcon-mach64.h"
+#include "mach64fb.h"
+
+/*============================================================================*/
+/* Defines */
+
+#define  _USE_HW_ACCEL_BLT_
+#define  _USE_HW_ACCEL_FILL_
+
+
+#ifdef  BHA_DEBUG
+
+#define  FuncId       if(mach64_debug & 0x00000100) printk
+#define  FuncDone     if(mach64_debug & 0x00000200) printk
+#define  CFuncId      if(mach64_debug & 0x00000400) printk
+#define  CFuncDone    if(mach64_debug & 0x00000800) printk
+
+
+/* Busy */
+#define  Bprint       if(mach64_debug & 0x01000000) printk
+/* Debug */
+#define  Dprint       if(mach64_debug & 0x00800000) printk
+
+/* Message */
+#define  Mprint       if(mach64_debug & 0x00004000) printk
+/* Info */
+#define  Iprint       if(mach64_debug & 0x00008000) printk
+/* Warn */
+#define  Wprint       if(mach64_debug & 0x00010000) printk
+/* Error */
+#define  Eprint       if(mach64_debug & 0x00020000) printk
+/* Fatal */
+#define  Fprint       if(mach64_debug & 0x00040000) printk
+/* Panic */
+#define  Pprint       if(mach64_debug & 0x00040000) printk
+
+#else
+
+#define  FuncId
+#define  FuncDone
+#define  CFuncId
+#define  CFuncDone
+
+#endif  /* BHA_DEBUG*/
+
+/*============================================================================*/
+/* Types */
+
+/*============================================================================*/
+/* Extern Functions*/
+
+
+
+/*============================================================================*/
+/* Intern Functions*/
+
+    /*
+     *  Prototypes
+     */
+
+int fbcon_init_mach64(void);
+
+static int open_mach64(struct display *p);
+static void release_mach64(void);
+static void bmove_mach64(struct display *p, int sy, int sx, int dy, int dx,
+		       int height, int width);
+static void clear_mach64(struct vc_data *conp, struct display *p, int sy,
+		       int sx, int height, int width);
+static void putc_mach64(struct vc_data *conp, struct display *p, int c, int yy,
+		      int xx);
+static void putcs_mach64(struct vc_data *conp, struct display *p,
+		       const char *s, int count, int yy, int xx);
+static void rev_char_mach64(struct display *p, int xx, int yy);
+
+
+/*============================================================================*/
+/*============================================================================*/
+/* Intern Variables */
+
+/*--------------------------------------------------------------------------*/
+/* BSS */
+
+/*--------------------------------------------------------------------------*/
+/* Data */
+
+    /*
+     *  `switch' for the low level operations
+     */
+
+static struct display_switch    dispsw_mach64 = 
+{
+  open_mach64,
+  release_mach64,
+  bmove_mach64,
+  clear_mach64,
+  putc_mach64,
+  putcs_mach64,
+  rev_char_mach64
+};
+
+
+    /*
+     *  8 bpp packed pixels => 4 pixel / 32 Bit => 1/2 FontByte 
+     */
+
+static u_int nibbletab_mach64[16] = 
+{
+  0x00000000, 0x000000ff, 0x0000ff00, 0x0000ffff,
+  0x00ff0000, 0x00ff00ff, 0x00ffff00, 0x00ffffff,
+  0xff000000, 0xff0000ff, 0xff00ff00, 0xff00ffff,
+  0xffff0000, 0xffff00ff, 0xffffff00, 0xffffffff
+};
+
+static  unsigned int    mach64_debug = 0x018FCF00;
+
+/*============================================================================*/
+/*============================================================================*/
+/* Functions */
+
+/*============================================================================*/
+/*============================================================================*/
+
+
+/*--------------------------------------------------------------------------*/
+
+static int 
+open_mach64(struct display * p)
+
+/*--------------------------------------------------------------------------*/
+{
+  /*--------------------------------------------------------------------------*/
+  FuncId("open_mach64($%08lX) : ", p);
+  if(p->type != FB_TYPE_PACKED_PIXELS || p->var.accel != FB_ACCEL_MACH64)
+  {
+    FuncDone(" Fail! \n");
+    return -EINVAL;  /* This driver can only do Mach64 boards! */
+  }
+  /*endif*/
+
+  p->next_line = (p->var.xres_virtual * p->var.bits_per_pixel) >> 3;
+  p->next_plane = 0;
+  MOD_INC_USE_COUNT;
+
+  FuncDone(" Match! \n");
+  return 0;
+}
+/*endproc open_mach64() */
+
+/*============================================================================*/
+
+
+/*--------------------------------------------------------------------------*/
+
+static void 
+release_mach64(void)
+{
+  /*--------------------------------------------------------------------------*/
+  FuncId("release_mach64() \n");
+    MOD_DEC_USE_COUNT;
+}
+/*endproc release_mach64() */
+
+/*============================================================================*/
+
+
+/*--------------------------------------------------------------------------*/
+
+static void 
+bmove_mach64(struct display * p,
+  int sy,
+  int sx,
+  int dy,
+  int dx,
+  int height,
+  int width)
+
+/*--------------------------------------------------------------------------*/
+{
+  u_char * src, * dst;
+  int                           bytes = p->next_line,
+                                linesize = bytes * p->fontheight,
+                                rows;
+
+  /*--------------------------------------------------------------------------*/
+  CFuncId("bmove_mach64($%04X, $%04X, $%04X, $%04X) \n",
+    sy, sx, dy, dx, height, width);
+
+#ifdef _USE_HW_ACCEL_BLT_
+
+  Mach64_BitBLT(
+    (sx << 3),
+    (sy * p->fontheight),
+    (dx << 3),
+    (dy * p->fontheight),
+    (width << 3),
+    (height * p->fontheight),
+    3);                 /*  MIX_SRC); see XGCValues GCFunction = GXCopy */
+
+#else
+
+  if(sx == 0 && dx == 0 && width * 8 == bytes)   /* full stride */
+
+    mymemmove(p->screen_base + dy * linesize,
+      p->screen_base + sy * linesize,
+      height * linesize);
+
+  else if (dy < sy || (dy == sy && dx < sx))
+  {
+    src = p->screen_base + sy * linesize + sx * 8;
+    dst = p->screen_base + dy * linesize + dx * 8;
+    for (rows = height * p->fontheight ; rows-- ;)
+    {
+      mymemmove(dst, src, (width << 3));
+      src += bytes;
+      dst += bytes;
+    }
+    /*next rows*/
+  }
+  else
+  {
+    src = p->screen_base + (sy+height) * linesize + sx * 8 - bytes;
+    dst = p->screen_base + (dy+height) * linesize + dx * 8 - bytes;
+    for(rows = height * p->fontheight ; rows-- ;)
+    {
+      mymemmove(dst, src, (width << 3));
+      src -= bytes;
+      dst -= bytes;
+    }
+    /*next rows*/
+  }
+  /*endif*/
+
+#endif  /* _USE_HW_ACCEL_BLT_ */
+
+  return;
+}
+/*endproc bmove_mach64() */
+
+/*============================================================================*/
+
+
+/*--------------------------------------------------------------------------*/
+
+static void 
+clear_mach64(struct vc_data * conp,
+  struct display * p,
+  int sy,                       /* in Characters von oben */
+  int sx,
+  int height,                   /* in Characters */
+  int width)                    /* in Characters */
+
+/*--------------------------------------------------------------------------*/
+{
+  register u_int *              dest;
+  register u_int                bgx;
+  register int                  i;
+
+  u_char *                      dest0;
+
+  int                           bytes_p_line = p->next_line,
+                                lines_w = height * p->fontheight,
+                                rows;
+
+  /*--------------------------------------------------------------------------*/
+  CFuncId("clear_mach64($%04X, $%04X, $%04X, $%04X) \n",
+    sy, sx, height, width);
+
+  bgx = attr_bgcol_ec(p, conp);
+  bgx |= (bgx << 8);
+  bgx |= (bgx << 16);
+
+#ifdef _USE_HW_ACCEL_FILL_
+
+  Mach64_RectFill(
+    (sx << 3),
+    (sy * p->fontheight),
+    (width << 3),
+    (height * p->fontheight),
+    3,                            /* MIX_SRC, see XGCValues GCFunction  */
+    bgx);
+
+#else
+
+  dest0 = p->screen_base + sy * p->fontheight * bytes_p_line + sx * 8;
+  if(sx == 0 && (width << 3) == bytes_p_line)     /* full stride */
+  {
+    lines_w *= width;
+    dest = (u_int*)dest0;
+    for(i = 0 ; i < lines_w ; i++)
+    {
+      *dest++ = bgx;          /* clears 4 pixels == half Char */
+      *dest++ = bgx;
+    }
+  }
+  else                                     /* only part of the width */
+  {
+    for(rows = lines_w; rows-- ; dest0 += bytes_p_line)
+    {
+      dest = (u_int*)dest0;
+      for(i = 0 ; i < width ; i++)
+      {
+        *dest++ = bgx;        /* clears 4 pixels */
+        *dest++ = bgx;
+      }
+      /*next i*/
+    }
+  }
+  /*endif*/
+
+#endif  /* _USE_HW_ACCEL_FILL_ */
+
+  return;
+}
+/*endproc clear_mach64() */
+
+/*============================================================================*/
+
+
+/*--------------------------------------------------------------------------*/
+
+static void 
+putc_mach64(struct vc_data * conp,
+  struct display * p,
+  int c,                   /* ASCII */
+  int yy,                  /* Text column */
+  int xx)                  /* Text row */
+
+/*--------------------------------------------------------------------------*/
+{
+  register u_char *             dest_p;
+  register u_char *             cdat_p;
+  register u_char               cdat;
+  register u_int                eorx, fgx, bgx;
+  int                           bytes = p->next_line; /*must be multiple of 4*/
+  int                           rows;
+
+  /*--------------------------------------------------------------------------*/
+  c &= 0xFF;
+
+  dest_p = p->screen_base + yy * p->fontheight * bytes + (xx << 3);
+  cdat_p = p->fontdata + c * p->fontheight;
+
+  fgx=attr_fgcol(p, conp);
+  bgx=attr_bgcol(p,conp);
+
+  fgx |= (fgx << 8);
+  fgx |= (fgx << 16);
+  bgx |= (bgx << 8);
+  bgx |= (bgx << 16);
+  eorx = fgx ^ bgx;
+
+  /* Mach64_WaitBlit(); */    /* We will have to sync with HW Blit */
+  for(rows = p->fontheight ; rows-- ; dest_p += bytes) /* byte* add = natural */
+  {
+    cdat = *cdat_p++;
+    *((u_int*)dest_p) = (nibbletab_mach64[cdat >> 4] & eorx) ^ bgx;
+    ((u_int *)dest_p)[1] = (nibbletab_mach64[cdat & 0xF] & eorx) ^ bgx;
+  }
+  /*next row*/
+
+  return;
+}
+/*endproc putc_mach64() */
+
+/*============================================================================*/
+
+
+/*--------------------------------------------------------------------------*/
+
+static void 
+putcs_mach64(struct vc_data * conp,
+  struct display * p,
+  const char * s,
+  int count,
+  int yy,
+  int xx)
+
+/*--------------------------------------------------------------------------*/
+{
+  register u_char *             dest_p;
+  register u_char *             cdat_p;
+  register u_char               cdat;
+  register u_int                eorx, fgx, bgx;
+  u_char *                      dest0;
+  int                           bytes = p->next_line; /*must be multiple of 4*/
+  int                           rows;
+  u_char                        c;
+
+  /*--------------------------------------------------------------------------*/
+
+  dest0 = p->screen_base + yy * p->fontheight * bytes + xx * 8;
+  fgx=attr_fgcol(p,conp);
+  bgx=attr_bgcol(p,conp);
+
+  fgx |= (fgx << 8);
+  fgx |= (fgx << 16);
+  bgx |= (bgx << 8);
+  bgx |= (bgx << 16);
+  eorx = fgx ^ bgx;
+
+  /* Mach64_WaitBlit(); */    /* We will have to sync with HW Blit */
+  while(count--)        /* character count 8 x h */
+  {
+    c = *s++;
+    cdat_p = p->fontdata + c * p->fontheight;
+
+    for(rows = p->fontheight, dest_p = dest0; rows-- ; dest_p += bytes)
+    {
+      cdat = *cdat_p++;
+      *((u_int*)dest_p) = (nibbletab_mach64[cdat >> 4] & eorx) ^ bgx;
+      ((u_int *)dest_p)[1] = (nibbletab_mach64[cdat & 0xF] & eorx) ^ bgx;
+    }
+    /*next rows*/
+    dest0 += 8;
+  }
+  /*endwhile*/
+
+  return;
+}
+/*endproc putcs_mach64() */
+
+/*============================================================================*/
+
+
+/*--------------------------------------------------------------------------*/
+
+static void 
+rev_char_mach64(struct display *p, int xx, int yy)
+
+/*--------------------------------------------------------------------------*/
+{
+    u_char *dest;
+    int bytes=p->next_line, rows;
+
+    dest = p->screen_base + yy * p->fontheight * bytes + xx * 8;
+    for (rows = p->fontheight ; rows-- ; dest += bytes) {
+	((u_long *)dest)[0] ^= 0x0f0f0f0f;
+	((u_long *)dest)[1] ^= 0x0f0f0f0f;
+    }
+}
+/*endproc rev_char_mach64() */
+
+/*============================================================================*/
+
+
+/*--------------------------------------------------------------------------*/
+
+#ifdef MODULE
+int 
+init_module(void)
+#else
+int 
+fbcon_init_mach64(void)
+#endif
+
+/*--------------------------------------------------------------------------*/
+{
+
+  /*--------------------------------------------------------------------------*/
+  FuncId("fbcon_init_mach64() \n");
+  /* We want to be added to the list of accelerated drivers */
+  return(fbcon_register_driver(&dispsw_mach64, 1));
+}
+/*endproc fbcon_init_mach64() */
+
+/*============================================================================*/
+
+
+/*--------------------------------------------------------------------------*/
+
+#ifdef MODULE
+void 
+cleanup_module(void)
+
+/*--------------------------------------------------------------------------*/
+{
+  /*--------------------------------------------------------------------------*/
+  FuncId("cleanup_module() \n");
+    fbcon_unregister_driver(&dispsw_mach64);
+}
+/*endproc cleanup_mach64() */
+
+/*============================================================================*/
+
+
+/*--------------------------------------------------------------------------*/
+#endif /* MODULE */
+/*============================================================================*/
+
+
+/*============================================================================*/
+/* RCS-ID */
+
+  static char
+  rcs_id_c[] =
+    "@(#) Linux-m68k: 1997 10 05 14:53:32 BHA: fbcon-mach64.c ";
+
+  static char
+  rcs_id_h[] = FBCON_MACH64_H_ID;
+
+/*============================================================================*/
diff -u --recursive --exclude-from=/home/geert/diff-excludes-linux --new-file m68k-2.1.64/drivers/video/fbcon-mach64.h m68k-newfb/drivers/video/fbcon-mach64.h
--- m68k-2.1.64/drivers/video/fbcon-mach64.h	Thu Jan  1 01:00:00 1970
+++ m68k-newfb/drivers/video/fbcon-mach64.h	Wed Dec 10 23:32:50 1997
@@ -0,0 +1,31 @@
+
+
+#ifndef _FBCON_MACH64_H_LOADED_
+#define _FBCON_MACH64_H_LOADED_
+
+
+
+
+
+
+
+/*============================================================================*/
+	/*
+	 * Support for Graphics Boards
+	 */
+
+#ifdef CONFIG_FBCON_MACH64			/* ATI Mach 64 */
+
+int fbcon_init_mach64(void);
+
+#endif /* CONFIG_FBCON_MACH64 */	
+
+/*============================================================================*/
+/* RCS-ID */
+
+#define FBCON_MACH64_H_ID \
+  "@(#) Linux-m68k: 1997 06 25 17:34:18 BHA: fbcon-mach64.h "
+
+/*============================================================================*/
+
+#endif /* _FBCON_MACH64_H_LOADED_ */
diff -u --recursive --exclude-from=/home/geert/diff-excludes-linux --new-file m68k-2.1.64/drivers/video/fbcon.c m68k-newfb/drivers/video/fbcon.c
--- m68k-2.1.64/drivers/video/fbcon.c	Sun Nov 23 23:33:09 1997
+++ m68k-newfb/drivers/video/fbcon.c	Wed Dec 10 07:37:35 1997
@@ -1078,7 +1078,8 @@
     palette_cmap.len = 1<<p->var.bits_per_pixel;
     if (palette_cmap.len > 16)
 	palette_cmap.len = 16;
-    return(p->fb_info->setcmap(&palette_cmap, unit));
+    return(p->fb_info->fbops->fb_set_cmap(&palette_cmap, 1, unit,
+					  con2fb_map[unit]));
 }
 
 static int fbcon_scrolldelta(int lines)
@@ -1166,7 +1167,8 @@
 		palette_cmap.green[j] = (green[i+j] << 8) | green[i+j];
 		palette_cmap.blue[j]  = (blue[i+j] << 8) | blue[i+j];
 	    }
-	    p->fb_info->setcmap( &palette_cmap, fg_console );
+	    p->fb_info->fbops->fb_set_cmap(&palette_cmap, 1, fg_console,
+					   con2fb_map[fg_console]);
 	}
 	fb_display[fg_console].cmap.len = old_cmap_len;
     }
diff -u --recursive --exclude-from=/home/geert/diff-excludes-linux --new-file m68k-2.1.64/drivers/video/mach64fb.c m68k-newfb/drivers/video/mach64fb.c
--- m68k-2.1.64/drivers/video/mach64fb.c	Thu Jan  1 01:00:00 1970
+++ m68k-newfb/drivers/video/mach64fb.c	Wed Dec 10 23:26:59 1997
@@ -0,0 +1,2539 @@
+/*
+ * linux/drivers/video/mach64fb.c -- Low level implementation of the
+ *                                   ATI Mach64 frame buffer device
+ *
+ *    Copyright (C) 1997 Bernd Harries
+ *
+ *
+ * This file is based on the Atari frame buffer device (atafb.c):
+ *
+ *  Copyright (C) 1994 Martin Schaller & Roman Hodek
+ *  
+ *
+ * and the Amiga frame buffer device (amifb.c):
+ *
+ *    Copyright (C) 1995 Geert Uytterhoeven
+ *
+ *
+ * History:
+ *   - 09 Aug 97: Original version by Bernd Harries
+ *   - 27 Aug 97: Extra Parameter for GUIreg-Base for Panther 64
+ *   - 03 Oct 97: Minor changes by Bernd Harries
+ *
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License.  See the file COPYING in the main directory of this archive
+ * for more details.
+ */
+
+/*============================================================================*/
+/* Includes */
+
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/errno.h>
+#include <linux/string.h>
+#include <linux/mm.h>
+#include <linux/tty.h>
+#include <linux/malloc.h>
+#include <linux/delay.h>
+#include <linux/zorro.h>
+#include <linux/fb.h>
+#include <linux/init.h>
+#include <asm/uaccess.h>
+#include <asm/system.h>
+#include <asm/irq.h>
+#include <asm/pgtable.h>
+
+#include "mach64regs.h"
+
+#include "mach64fb.h"
+
+
+unsigned long mach64fb_init(unsigned long mem_start);
+void mach64fb_setup(char *options, int *ints);
+
+/*============================================================================*/
+/* Defines */
+
+#define _NOT_MAP_768K_IO_
+
+#define _MAP_GUIREGS_0BFC00_
+
+
+#define _NOT_DUMP_IO_REGS_
+
+#define _NOT_DUMP_GUIREGS_0BFC00_
+
+#define _NOT_DUMP_GUIREGS_3FFC00_
+
+#define _NOT_DUMP_KMAP_RANGE_
+
+
+#ifdef MULTI_MACH
+
+#define MACH_MAX 8
+
+#define DECLARE_STATIC_UINT08___MN_  static unsigned char          m64_num;
+#define DECLARE_UINT08___MN_         unsigned char m64_num;
+#define ARG_UINT08___MN_             unsigned char m64_num
+#define ADD_ARG_UINT08___MN_         , unsigned char m64_num
+
+#define _ARRAY_       [MACH_MAX]
+#define __MN__        [m64_num]
+#define _MN_           m64_num
+#define _INC_MN_       m64_num++
+#define _ARG_MN_       m64_num
+#define _ADD_ARG_MN_   , m64_num
+
+#else      /*---------------------*/
+
+#define DECLARE_STATIC_UINT08___MN_
+#define DECLARE_UINT08___MN_
+#define ARG_UINT08___MN_           void
+#define ADD_ARG_UINT08___MN_
+
+#define _ARRAY_    
+#define __MN__         
+#define _MN_           0
+#define _INC_MN_       
+#define _ARG_MN_       
+#define _ADD_ARG_MN_   
+
+#endif     /* MULTI_MACH */
+
+/*--------------------------------------------------------------------------*/
+  
+#define MACH_MAX 8
+#define arraysize(x)    (sizeof(x)/sizeof(*(x)))
+
+#define  FuncId       if(mach64fb_debug & 0x00000100) printk
+#define  FuncDone     if(mach64fb_debug & 0x00000200) printk
+#define  CFuncId      if(mach64fb_debug & 0x00000400) printk
+#define  CFuncDone    if(mach64fb_debug & 0x00000800) printk
+#define  OFuncId      if(mach64fb_debug & 0x00001000) printk
+#define  OFuncDone    if(mach64fb_debug & 0x00002000) printk
+
+
+/* Busy */
+#define  Bprint       if(mach64fb_debug & 0x01000000) printk
+/* Debug */
+#define  Dprint       if(mach64fb_debug & 0x00800000) printk
+
+/* Message */
+#define  Mprint       if(mach64fb_debug & 0x00004000) printk
+/* Info */
+#define  Iprint       if(mach64fb_debug & 0x00008000) printk
+/* Warn */
+#define  Wprint       if(mach64fb_debug & 0x00010000) printk
+/* Error */
+#define  Eprint       if(mach64fb_debug & 0x00020000) printk
+/* Fatal */
+#define  Fprint       if(mach64fb_debug & 0x00040000) printk
+/* Panic */
+#define  Pprint       if(mach64fb_debug & 0x00080000) printk
+
+
+/*--------------------------------------------------------------------------*/
+
+/*
+ * This Fragment is for learning and for future expansion so far:
+ *
+ * Byte swaping is probably not needed on Alpha CPUs but The IO is memory
+ * mapped anyway and writing data < 32 bit is impossible on the actual
+ * CPUs unless the board has a sparse space. 
+ *
+ * The DEC Alpha CPUs have write buffers that hold data to be written
+ * to memory. The data is NOT necessarily written to memory immediately
+ * after the instruction.
+ * Darum: The machine instruction MB (memory barrier, wbflush on Mips CPUs) 
+ * has to be executed to force the flush of these buffers, or a write
+ * instruction at least $1000 bytes apart from the access to be flushed 
+ * (may be more in future CPUs) has to follow. This can be done by using
+ * mirrored registers if available. The Mach64 GUI registers are all within
+ * 1 $1000 byte area and are not always mirrored. => MB instruction. 
+ *
+ */
+
+#ifdef __alpha__
+
+#define barrier() __asm__ __volatile__("mb": : :"memory")
+
+#else /* __alpha__ */
+
+#ifdef __mips
+
+#define barrier() __asm__ __volatile__ ("wbflush": : :"memory")
+
+#else
+/*
+#define barrier()  / * Serialized Nocaching => Not used on 680x0 today  * /
+*/
+#endif /* __mips__ */
+#endif /* __alpha__ */
+
+/*--------------------------------------------------------------------------*/
+
+#ifdef _MAP_768K_IO_
+
+#define OUTB(port,val) \
+  *((unsigned volatile char *) ((port) + 0x00080000 + virt_vgaiobase __MN__  )) = (val)
+
+#define INB(port) \
+  (*((unsigned volatile char *) ((port) + 0x00080000 + virt_vgaiobase __MN__  )))
+
+/*
+#define OUTL(port,val) \
+  *((unsigned volatile int *) ((port) + 0x00080000 + virt_vgaiobase __MN__  )) = (val)
+
+#define INL(port) \
+  (*((unsigned volatile int *) ((port) + 0x00080000 + virt_vgaiobase __MN__  )))
+*/
+
+#else
+
+#define OUTB(port,val) \
+  *((unsigned volatile char *) ((port) + virt_vgaiobase __MN__  )) = (val)
+
+#define INB(port) \
+  (*((unsigned volatile char *) ((port) + virt_vgaiobase __MN__  )))
+
+/*
+#define OUTL(port,val) \
+  *((unsigned volatile int *) ((port) + virt_vgaiobase __MN__  )) = (val)
+
+#define INL(port) \
+  (*((unsigned volatile int *) ((port) + virt_vgaiobase __MN__  )))
+*/
+
+#endif  /* _MAP_768K_IO_ */
+
+#define DACDelay                    \
+  do {                              \
+    unsigned char tmp = INB(0x3da); \
+    tmp = INB(0x3da);               \
+  } while (0)
+
+/*============================================================================*/
+
+/*
+#define regwr(port, val) \
+  *((unsigned volatile int *) ((port) + virt_vgaiobase __MN__  )) = (val)
+
+
+#define regrd(port) \
+  (*((unsigned volatile int *) ((port) + virt_vgaiobase __MN__  )))
+*/
+
+/*============================================================================*/
+/* Types */
+
+struct mach64fb_par
+{
+   int xres;
+   int yres;
+   int bpp;
+};
+
+/*============================================================================*/
+/* Extern Functions*/
+
+
+
+/*============================================================================*/
+/* Intern Functions*/
+
+/*--------------------------------------------------------------------------*/
+   /*
+    *    Interface to the low level console driver exported with fb_info
+    */
+
+static int  Mach64fb_switch(int con);
+static int  Mach64fb_updatevar(int con);
+static void Mach64fb_blank(int blank);
+
+/*--------------------------------------------------------------------------*/
+   /*
+    *    Interface fb_ops used by the world exported with fb_info.fb_ops
+    */
+
+static int M64_op_open(int fbidx);
+static int M64_op_release(int fbidx);
+static int M64_op_get_fix(struct fb_fix_screeninfo * fix, int con, int fbidx);
+static int M64_op_get_var(struct fb_var_screeninfo * var, int con, int fbidx);
+static int M64_op_set_var(struct fb_var_screeninfo * var, int con, int fbidx);
+static int M64_op_get_cmap(struct fb_cmap * cmap, int kspc, int con,
+			   int fbidx);
+static int M64_op_set_cmap(struct fb_cmap * cmap, int kspc, int con,
+			   int fbidx);
+static int M64_op_pan_display(struct fb_var_screeninfo * var, int con,
+			      int fbidx);
+
+static int 
+M64_op_ioctl(
+  struct inode * inode,
+  struct file *file,
+  u_int cmd,
+  u_long arg,
+  int con,
+  int fbidx);
+
+/*--------------------------------------------------------------------------*/
+   /*
+    *   Internal Routines
+    */
+
+static int 
+do_fb_set_var(struct fb_var_screeninfo * var, int isactive);
+
+static void 
+do_install_cmap(int con);
+
+static void 
+mach64fb_set_disp(int con);
+
+static int 
+get_video_mode(const char * name);
+
+static int 
+store_video_par(char* videopar  ADD_ARG_UINT08___MN_ );
+
+static char * 
+strtoke(char * s,const char * ct);
+
+/*--------------------------------------------------------------------------*/
+   /*
+    *   Hardware Specific Routines
+    */
+
+static int 
+M64_hw_init( ARG_UINT08___MN_ );
+
+static int 
+M64_hw_encode_fix(struct fb_fix_screeninfo * fix, struct mach64fb_par * par);
+
+static int 
+M64_hw_decode_var(struct fb_var_screeninfo * var, struct mach64fb_par * par);
+
+static int 
+M64_hw_encode_var(struct fb_var_screeninfo * var, struct mach64fb_par * par);
+
+static void 
+M64_hw_get_par(struct mach64fb_par * par);
+
+static void 
+M64_hw_set_par(struct mach64fb_par * par);
+
+static int 
+M64_hw_getcolreg(
+  u_int regno,
+  u_int * red,
+  u_int * green,
+  u_int * blue,
+  u_int * transp);
+
+static int 
+M64_hw_setcolreg(u_int regno, u_int red, u_int green, u_int blue, u_int transp);
+
+static void 
+M64_hw_blank(int blank);
+
+
+
+/*============================================================================*/
+/*============================================================================*/
+/* Intern Variables */
+
+/*--------------------------------------------------------------------------*/
+/* BSS */
+
+
+static unsigned long            phys_vmembase _ARRAY_ ;
+static unsigned long            phys_size _ARRAY_ ;
+static unsigned long            phys_vgaiobase _ARRAY_ ;
+static unsigned long            phys_guiregbase _ARRAY_ ;
+
+static unsigned long            virt_vmembase _ARRAY_ ;
+static unsigned long            virt_size _ARRAY_ ;
+static unsigned long            virt_vgaiobase _ARRAY_ ;
+static unsigned long            virt_guiregbase _ARRAY_ ;
+
+static unsigned int             mach64_xres _ARRAY_ ;
+static unsigned int             mach64_yres _ARRAY_ ;
+static unsigned int             mach64_depth _ARRAY_ ;
+
+
+static struct mach64fb_par     current_par _ARRAY_ ;
+static struct display           m_disp _ARRAY_ ;
+static struct fb_info           fb_info _ARRAY_ ;
+
+static u_short                  mach64_colormap  _ARRAY_ [256][4];
+
+static u_int                    mach64_key;
+static u_int                    mach64_bitspercol _ARRAY_ ;
+
+static int                      currcon;
+
+
+static u_short                  mach64_inverse _ARRAY_ ;
+static short int                mach64_pmode _ARRAY_ ;
+static short int                mach64_mode _ARRAY_ ;   /* 0..31 */
+static short int                mach64_use_accel _ARRAY_ ;
+static char                     current_par_valid _ARRAY_ ;
+
+static unsigned char            mach64_count;
+
+
+/*--------------------------------------------------------------------------*/
+   /*
+    *    Switch for Chipset Independency
+    */
+
+static struct fb_hwswitch
+{
+
+  /* Initialisation */
+
+  int (*init)( ARG_UINT08___MN_ );
+
+  /* Display Control */
+
+  int (*encode_fix)(struct fb_fix_screeninfo * fix, struct mach64fb_par * par);
+  int (*decode_var)(struct fb_var_screeninfo * var, struct mach64fb_par * par);
+  int (*encode_var)(struct fb_var_screeninfo * var, struct mach64fb_par * par);
+  void (*get_par)(struct mach64fb_par * par );
+  void (*set_par)(struct mach64fb_par * par );
+  int (*getcolreg)(u_int regno, u_int * red, u_int * green, u_int * blue,
+    u_int * transp);
+  int (*setcolreg)(u_int regno, u_int red, u_int green, u_int blue,
+    u_int transp);
+  void (*blank)(int blank);
+  void (*set_screen_base)( unsigned long s_base );
+  int  (*pan_display)( struct fb_var_screeninfo * var);
+} 
+* fbhws_ptr;
+
+
+/*--------------------------------------------------------------------------*/
+/* Data */
+
+
+/* -------------- local Interfaces to hardware functions ---------------- */
+
+/* see XGCValues GCFunction */
+int 
+mach64alu[16] =
+{
+    MIX_0,
+    MIX_AND,
+    MIX_SRC_AND_NOT_DST,
+    MIX_SRC,
+    MIX_NOT_SRC_AND_DST,
+    MIX_DST,
+    MIX_XOR,
+    MIX_OR,
+    MIX_NOR,
+    MIX_XNOR,
+    MIX_NOT_DST,
+    MIX_SRC_OR_NOT_DST,
+    MIX_NOT_SRC,
+    MIX_NOT_SRC_OR_DST,
+    MIX_NAND,
+    MIX_1
+};
+
+static struct fb_hwswitch 
+mach64_switch = 
+{
+  M64_hw_init,
+  M64_hw_encode_fix,
+  M64_hw_decode_var,
+  M64_hw_encode_var,
+  NULL,                    /* M64_hw_get_par, */
+  NULL,                    /* M64_hw_set_par, */
+  M64_hw_getcolreg,
+  M64_hw_setcolreg,
+  M64_hw_blank,
+  NULL,
+  NULL
+};
+
+/* ------ Interfaces to hardware functions to export with fb_info  ------ */
+
+static struct fb_ops 
+mach64fb_ops =
+{
+  M64_op_open,
+  M64_op_release,
+  M64_op_get_fix,
+  M64_op_get_var,
+  M64_op_set_var,
+  M64_op_get_cmap,
+  M64_op_set_cmap,
+  M64_op_pan_display,
+  M64_op_ioctl
+};
+
+static  unsigned int    mach64fb_debug = 0x018FCF00;
+
+   /*
+    *    Frame Buffer Name
+    */
+
+static char     mach64fb_name[16] = "ATI Mach64 ";
+
+
+   /*
+    *    Ati Mach64 Graphics Board
+    */
+
+#define M64_8_WIDTH 1152
+#define M64_8_HEIGHT 912
+#define M64_8_PIXCLOCK 12500    /* ++Geert: Just a guess */
+
+#define M64_16_WIDTH 800
+#define M64_16_HEIGHT 600
+#define M64_16_PIXCLOCK 25000   /* ++Geert: Just a guess */
+
+
+/*--------------------------------------------------------------------------*/
+   /*
+    *    Predefined Video Mode Names
+    */
+/*--------------------------------------------------------------------------*/
+
+static char *                   fb_var_names[] =
+{
+
+   /*
+    *    Autodetect (Default) Video Mode
+    */
+
+   "autodetect",
+
+   /*
+    *    Predefined Video Modes
+    */
+    
+   "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"
+};
+
+
+/*--------------------------------------------------------------------------*/
+   /*
+    *    Predefined Video Mode Definitions
+    */
+/*--------------------------------------------------------------------------*/
+
+static struct fb_var_screeninfo mach64fb_predefined[] = 
+{
+
+   /*
+    *    Autodetect (Default) Video Mode
+    */
+
+   { 0, },
+
+   /*
+    *    Predefined Video Modes
+    */
+    
+   {
+      /* Cybervision 8 bpp */
+      M64_8_WIDTH, M64_8_HEIGHT, M64_8_WIDTH, M64_8_HEIGHT, 0, 0, 8, 0,
+      {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
+      0, 0, -1, -1, FB_ACCEL_NONE, M64_8_PIXCLOCK, 64, 96, 35, 12, 112, 2,
+      FB_SYNC_COMP_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
+   }, {
+      /* Cybervision 16 bpp */
+      M64_16_WIDTH, M64_16_HEIGHT, M64_16_WIDTH, M64_16_HEIGHT, 0, 0, 16, 0,
+      {11, 5, 0}, {5, 6, 0}, {0, 5, 0}, {0, 0, 0},
+      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, }
+};
+
+
+#define NUM_TOTAL_MODES    arraysize(mach64fb_predefined)
+#define NUM_PREDEF_MODES   (3)
+
+
+   /*
+    *    Some default modes
+    */
+
+#define M64_8_DEFMODE     (1)
+#define M64_16_DEFMODE    (2)
+
+
+
+/*============================================================================*/
+/*============================================================================*/
+/* Functions */
+
+/*============================================================================*/
+/*============================================================================*/
+
+
+/*============================================================================*/
+
+__inline__ void 
+regwr(unsigned int regindex, unsigned long regdata)
+{
+  register unsigned long        appaddr;
+  register u_int                lword;
+  /*--------------------------------------------------------------------------*/
+  /* calculate aperture address */
+  appaddr = ((regindex) + 0x003FFC00 + virt_vmembase __MN__  );
+
+  lword = (regdata >> 16) | (regdata << 16);
+  lword = ((lword >> 8) & 0x00FF00FF) | ((lword << 8) & 0xFF00FF00);
+
+  *((unsigned volatile int*)(appaddr)) = lword;
+  barrier();
+}
+/*============================================================================*/
+
+__inline__ unsigned int
+regrd(unsigned int regindex)
+{
+  register unsigned long        appaddr;
+  register u_int                lword;
+  /*--------------------------------------------------------------------------*/
+  /* calculate aperture address */
+  appaddr = ((regindex) + 0x003FFC00 + virt_vmembase __MN__  );
+
+  lword = (*((unsigned volatile int*)(appaddr)));
+
+  lword = (lword >> 16) | (lword << 16);     /* swap words */
+  lword = ((lword >> 8) & 0x00FF00FF) | ((lword << 8) & 0xFF00FF00);
+
+  return(lword);
+}
+/*============================================================================*/
+
+__inline__ void 
+regwrb(unsigned int regindex, unsigned char regdata)
+{
+  register unsigned long        appaddr;
+  /*--------------------------------------------------------------------------*/
+  /* calculate aperture address */
+  appaddr = ((regindex) + 0x003FFC00 + virt_vmembase __MN__  );
+
+  *(char *)appaddr = regdata;
+  barrier();
+}
+/*============================================================================*/
+
+
+#ifdef _MAP_768K_IO_
+
+__inline__ void
+OUTL(unsigned int port, unsigned long regdata)
+{
+  register unsigned long        appaddr;
+  register u_int                lword;
+  /*--------------------------------------------------------------------------*/
+  /* calculate aperture address */
+  appaddr = ((port) + 0x00080000 + virt_vgaiobase __MN__  );
+
+  lword = (regdata >> 16) | (regdata << 16);
+  lword = ((lword >> 8) & 0x00FF00FF) | ((lword << 8) & 0xFF00FF00);
+
+  *((unsigned volatile int*)(appaddr)) = lword;
+  barrier();
+}
+/*============================================================================*/
+
+__inline__ unsigned int
+INL(unsigned int port)
+{
+  register unsigned long        appaddr;
+  register u_int                lword;
+  /*--------------------------------------------------------------------------*/
+  /* calculate aperture address */
+  appaddr = ((port) + 0x00080000 + virt_vgaiobase __MN__  );
+
+  lword = (*((unsigned volatile int*)(appaddr)));
+
+  lword = (lword >> 16) | (lword << 16);     /* swap words */
+  lword = ((lword >> 8) & 0x00FF00FF) | ((lword << 8) & 0xFF00FF00);
+
+  return(lword);
+}
+/*============================================================================*/
+
+__inline__ void 
+regw(unsigned int regindex, unsigned long regdata)
+{
+  register unsigned long        appaddr;
+  register u_int                lword;
+  /*--------------------------------------------------------------------------*/
+  /* calculate aperture address */
+  appaddr = ((regindex) + 0x0003FC00 + virt_vgaiobase __MN__  );
+
+  lword = (regdata >> 16) | (regdata << 16);
+  lword = ((lword >> 8) & 0x00FF00FF) | ((lword << 8) & 0xFF00FF00);
+
+  *((unsigned volatile int*)(appaddr)) = lword;
+  barrier();
+}
+/*============================================================================*/
+
+__inline__ unsigned int
+regr(unsigned int regindex)
+{
+  register unsigned long        appaddr;
+  register u_int                lword;
+  /*--------------------------------------------------------------------------*/
+  /* calculate aperture address */
+  appaddr = ((regindex) + 0x0003FC00 + virt_vgaiobase __MN__  );
+
+  lword = (*((unsigned volatile int*)(appaddr)));
+
+  lword = (lword >> 16) | (lword << 16);     /* swap words */
+  lword = ((lword >> 8) & 0x00FF00FF) | ((lword << 8) & 0xFF00FF00);
+
+  return(lword);
+}
+/*============================================================================*/
+
+__inline__ void 
+regwB(unsigned int regindex, unsigned char regdata)
+{
+  register unsigned long        appaddr;
+  /*--------------------------------------------------------------------------*/
+  /* calculate aperture address */
+  appaddr = ((regindex) + 0x0003FC00 + virt_vgaiobase __MN__  );
+
+  *(char *)appaddr = regdata;
+  barrier();
+}
+/*============================================================================*/
+
+#else
+
+__inline__ void 
+OUTL(unsigned int port, unsigned long regdata)
+{
+  register unsigned long        appaddr;
+  register u_int                lword;
+  /*--------------------------------------------------------------------------*/
+  /* calculate aperture address */
+  appaddr = ((port) + virt_vgaiobase __MN__  );
+
+  lword = (regdata >> 16) | (regdata << 16);
+  lword = ((lword >> 8) & 0x00FF00FF) | ((lword << 8) & 0xFF00FF00);
+
+  *((unsigned volatile int*)(appaddr)) = lword;
+  barrier();
+}
+/*============================================================================*/
+
+__inline__ unsigned int
+INL(unsigned int port)
+{
+  register unsigned long        appaddr;
+  register u_int                lword;
+  /*--------------------------------------------------------------------------*/
+  /* calculate aperture address */
+  appaddr = ((port) + virt_vgaiobase __MN__  );
+
+  lword = (*((unsigned volatile int*)(appaddr)));
+
+  lword = (lword >> 16) | (lword << 16);     /* swap words */
+  lword = ((lword >> 8) & 0x00FF00FF) | ((lword << 8) & 0xFF00FF00);
+
+  return(lword);
+}
+/*============================================================================*/
+
+
+
+__inline__ void 
+regw(unsigned int regindex, unsigned long regdata)
+{
+  register unsigned long        appaddr;
+  register u_int                lword;
+  /*--------------------------------------------------------------------------*/
+  /* calculate aperture address */
+  appaddr = ((regindex) + 0x0000FC00 + virt_guiregbase __MN__  );
+
+  lword = (regdata >> 16) | (regdata << 16);
+  lword = ((lword >> 8) & 0x00FF00FF) | ((lword << 8) & 0xFF00FF00);
+
+  *((unsigned volatile int*)(appaddr)) = lword;
+  barrier();
+}
+/*============================================================================*/
+
+__inline__ unsigned int
+regr(unsigned int regindex)
+{
+  register unsigned long        appaddr;
+  register u_int                lword;
+  /*--------------------------------------------------------------------------*/
+  /* calculate aperture address */
+  appaddr = ((regindex) + 0x0000FC00 + virt_guiregbase __MN__  );
+
+  lword = (*((unsigned volatile int*)(appaddr)));
+
+  lword = (lword >> 16) | (lword << 16);     /* swap words */
+  lword = ((lword >> 8) & 0x00FF00FF) | ((lword << 8) & 0xFF00FF00);
+
+  return(lword);
+}
+/*============================================================================*/
+
+__inline__ void 
+regwB(unsigned int regindex, unsigned char regdata)
+{
+  register unsigned long        appaddr;
+  /*--------------------------------------------------------------------------*/
+  /* calculate aperture address */
+  appaddr = ((regindex) + 0x0000FC00 + virt_guiregbase __MN__  );
+
+  *(char *)appaddr = regdata;
+  barrier();
+}
+/*============================================================================*/
+
+#endif  /* _MAP_768K_IO_ */
+
+
+/*============================================================================*/
+/*============================================================================*/
+
+
+/*--------------------------------------------------------------------------*/
+
+static int 
+M64_op_open(int fbidx)
+
+/*--------------------------------------------------------------------------*/
+{
+
+  /*--------------------------------------------------------------------------*/
+  OFuncId("M64_op_open(%02d) \n", fbidx);
+  /*
+   * Nothing, only a usage count for the moment
+   */
+
+  MOD_INC_USE_COUNT;
+
+  return(0);
+}
+/*endproc M64_op_open() */
+
+/*============================================================================*/
+
+/*--------------------------------------------------------------------------*/
+
+static int 
+M64_op_release(int fbidx)
+
+/*--------------------------------------------------------------------------*/
+{
+
+  /*--------------------------------------------------------------------------*/
+  FuncId("M64_op_release() \n");
+  MOD_DEC_USE_COUNT;
+  return(0);
+}
+/*endproc M64_op_release() */
+
+/*============================================================================*/
+
+
+/* -------------------- Hardware specific routines ------------------------ */
+
+
+/*--------------------------------------------------------------------------*/
+   /*
+    *    Initialization
+    *
+    *    Set the default video mode for this chipset. If a video mode was
+    *    specified on the command line, it will override the default mode.
+    */
+/*--------------------------------------------------------------------------*/
+
+static int 
+M64_hw_init( ARG_UINT08___MN_ )
+
+/*--------------------------------------------------------------------------*/
+{
+  struct fb_var_screeninfo *    var_ptr = &mach64fb_predefined[0];
+  struct mach64fb_par          dummy_par;
+
+  unsigned long                 board_addr;
+  u_int *                       u32_ptr;
+  u_int                         read_val;
+  int                           n;
+  int                           i;
+
+  /*--------------------------------------------------------------------------*/
+  FuncId("M64_hw_init() \n");
+
+  if(mach64_mode __MN__   == -1)
+  {
+    mach64_mode __MN__   = M64_8_DEFMODE;
+  }
+  /*endif*/
+
+  board_addr = virt_vmembase __MN__  ;
+  for (i = 0; i < 256; i++)
+  {
+    mach64_colormap  __MN__  [i][0] = i;
+    mach64_colormap  __MN__  [i][1] = i;
+    mach64_colormap  __MN__  [i][2] = i;
+    mach64_colormap  __MN__  [i][3] = 0;
+  }
+
+#ifdef _DUMP_IO_REGS_
+  u32_ptr = (u_int *)(0x000002EC + virt_vgaiobase __MN__ );
+  n = 0;
+  while(n < 0x20)
+  {
+    Dprint("\n%08X: ", u32_ptr);
+    Dprint("%08X ", INL(0x02EC + (n << 10)) );  n++;
+    Dprint("%08X ", INL(0x02EC + (n << 10)) );  n++;
+    Dprint("%08X ", INL(0x02EC + (n << 10)) );  n++;
+    Dprint("%08X ", INL(0x02EC + (n << 10)) );  n++;
+    u32_ptr += 0x0400;
+  }
+  /*endwhile*/
+  Dprint("\n" );
+#endif
+
+  WaitIdleEmpty(); /* Make sure that all commands have finished */
+  read_val = regr(GEN_TEST_CNTL);
+  if(0)
+  {
+    regw(GEN_TEST_CNTL, read_val | 0x0200);
+  }
+  else
+  {
+    regw(GEN_TEST_CNTL, read_val & ~0x0200);
+  }
+  /*endif*/
+
+  WaitQueue(13);
+  regw(SRC_OFF_PITCH, (mach64_xres __MN__  << 19));
+  regw(DST_OFF_PITCH, (mach64_xres __MN__  << 19));
+  regw(SC_LEFT_RIGHT, (mach64_xres __MN__  -1) << 16);
+  regw(SC_TOP_BOTTOM, (mach64_yres __MN__  -1) << 16);
+
+  regw(DP_BKGD_CLR, 0x00000000);
+  regw(DP_FRGD_CLR, 0x00000001);
+
+  regw(DP_WRITE_MASK, 0x000000FF  /* pGC->planemask */ );
+  regw(DP_PIX_WIDTH, BYTE_ORDER_MSB_TO_LSB | HOST_8BPP | SRC_8BPP | DST_8BPP);
+  regw(DP_MIX, FRGD_MIX_S | BKGD_MIX_D);
+  regw(DP_SRC, FRGD_SRC_BLIT | BKGD_SRC_BKGD_CLR);
+
+  regw(CLR_CMP_CNTL, 0x00000000);
+  regw(CLR_CMP_CLR, 0x00000000);
+
+  regw(GUI_TRAJ_CNTL, DST_X_LEFT_TO_RIGHT | DST_Y_TOP_TO_BOTTOM);
+
+
+
+#ifdef  _DUMP_GUIREGS_0BFC00_
+
+#ifdef _MAP_768K_IO_
+  u32_ptr = (u_int *)(0x0003FC00 + virt_vgaiobase __MN__ );
+#else
+  u32_ptr = (u_int *)(0x0000FC00 + virt_guiregbase __MN__ );
+#endif
+  n = 0;
+  while(n < 0x100)
+  {
+    Dprint("\n%08X: ", u32_ptr);
+    Dprint("%08X ", regr(n << 2) );  n++;
+    Dprint("%08X ", regr(n << 2) );  n++;
+    Dprint("%08X ", regr(n << 2) );  n++;
+    Dprint("%08X ", regr(n << 2) );  n++;
+    u32_ptr += 4;
+  }
+  /*endwhile*/
+  Dprint("\n" );
+#endif
+
+#ifdef  _DUMP_GUIREGS_3FFC00_
+  u32_ptr = (u_int *)(0x003FFC00 + virt_vmembase __MN__ );
+  n = 0;
+  while(n < 0x100)
+  {
+    Dprint("\n%08X: ", u32_ptr);
+    Dprint("%08lX ", regrd(n << 2) );  n++;
+    Dprint("%08lX ", regrd(n << 2) );  n++;
+    Dprint("%08lX ", regrd(n << 2) );  n++;
+    Dprint("%08lX ", regrd(n << 2) );  n++;
+    u32_ptr += 4;
+  }
+  /*endwhile*/
+
+  Dprint("\n" );
+#endif
+
+
+
+  dummy_par.xres = mach64_xres __MN__  ;
+  dummy_par.yres = mach64_yres __MN__  ;
+  dummy_par.bpp = mach64_depth __MN__  ;
+  M64_hw_encode_var(var_ptr, &dummy_par);
+
+  mach64fb_debug = 0x018FC100;
+
+  M64_hw_setcolreg (255, 56, 100, 160, 0);
+  M64_hw_setcolreg (254, 0, 0, 0, 0);
+
+  FuncDone("M64_hw_init() done.\n");
+  return(1);    /* detected_mode */
+}
+/*endproc M64_hw_init() */
+
+/*============================================================================*/
+
+
+/*--------------------------------------------------------------------------*/
+   /*
+    *    This function should fill in the `fix' structure based on the
+    *    values in the `par' structure.
+    */
+/*--------------------------------------------------------------------------*/
+
+static int 
+M64_hw_encode_fix(struct fb_fix_screeninfo * fix, struct mach64fb_par * par)
+
+/*--------------------------------------------------------------------------*/
+{
+  DECLARE_STATIC_UINT08___MN_
+  int                           i;
+
+  /*--------------------------------------------------------------------------*/
+  CFuncId("M64_hw_encode_fix() \n");
+
+  strcpy(fix->id, mach64fb_name);
+  fix->id[15] =  _MN_ ;
+  fix->smem_start = (caddr_t) virt_vmembase __MN__  ;
+
+  /* aufrunden */
+  fix->smem_len = (phys_size __MN__   + PAGE_SIZE - 0x00200001) & PAGE_MASK;
+
+  if(mach64_depth __MN__   == 1)
+  {
+    fix->type = FB_TYPE_PACKED_PIXELS;
+    /* The letters 'n' and 'i' in the "video=Mach64:" stand
+     * for "normal" and "inverted", rsp., in the monochrome case */
+    fix->visual =
+      (mach64_pmode __MN__   == FB_TYPE_INTERLEAVED_PLANES ||
+      mach64_pmode __MN__   == FB_TYPE_PACKED_PIXELS) ?
+      FB_VISUAL_MONO10 : FB_VISUAL_MONO01;
+  }
+  else   /* depth > 1 */
+  {
+    switch(mach64_pmode __MN__  )
+    {
+      /* All visuals are STATIC, because we don't know how to change
+       * colors :-(
+       */
+      case -1:              /* truecolor */
+        fix->type = FB_TYPE_PACKED_PIXELS;
+        fix->visual = FB_VISUAL_TRUECOLOR;
+        break;
+      case FB_TYPE_PACKED_PIXELS:
+        fix->type = FB_TYPE_PACKED_PIXELS;
+        fix->visual = FB_VISUAL_STATIC_PSEUDOCOLOR;
+        break;
+      case FB_TYPE_PLANES:
+        fix->type = FB_TYPE_PLANES;
+        fix->visual = FB_VISUAL_STATIC_PSEUDOCOLOR;
+        break;
+      case FB_TYPE_INTERLEAVED_PLANES:
+        fix->type = FB_TYPE_INTERLEAVED_PLANES;
+        fix->type_aux = 2;
+        fix->visual = FB_VISUAL_STATIC_PSEUDOCOLOR;
+        break;
+    }
+    /*endswitch*/
+  }
+  /*endif*/
+  fix->xpanstep = 0;
+  fix->ypanstep = 0;
+  fix->ywrapstep = 0;
+  fix->line_length = 0;
+
+  for(i = 0; i < arraysize(fix->reserved); i++)
+    fix->reserved[i] = 0;
+
+  CFuncId("M64_hw_encode_fix() done. \n");
+  return(0);
+}
+/*endproc _encode_fix() */
+
+/*============================================================================*/
+
+
+/*--------------------------------------------------------------------------*/
+   /*
+    *    Get the video params out of `var'. If a value doesn't fit, round
+    *    it up, if it's too big, return -EINVAL.
+    */
+/*--------------------------------------------------------------------------*/
+
+static int 
+M64_hw_decode_var(struct fb_var_screeninfo * var, struct mach64fb_par * par)
+
+/*--------------------------------------------------------------------------*/
+{
+
+  /*--------------------------------------------------------------------------*/
+  CFuncId("M64_hw_decode_var() \n");
+
+  par->xres = var->xres;
+  par->yres = var->yres;
+  par->bpp = var->bits_per_pixel;
+
+  return(0);
+}
+/*endproc _decode_var() */
+
+/*============================================================================*/
+
+
+/*--------------------------------------------------------------------------*/
+   /*
+    *    Fill the `var' structure based on the values in `par' and maybe
+    *    other values read out of the hardware.
+    */
+/*--------------------------------------------------------------------------*/
+
+static int 
+M64_hw_encode_var(struct fb_var_screeninfo * var, struct mach64fb_par * par)
+
+/*--------------------------------------------------------------------------*/
+{
+  DECLARE_STATIC_UINT08___MN_ 
+  int                           i;
+
+  /*--------------------------------------------------------------------------*/
+  CFuncId("M64_hw_encode_var() \n");
+
+  var->xres = par->xres;
+  var->yres = par->yres;
+  var->xres_virtual = par->xres;
+  var->yres_virtual = par->yres;
+  var->xoffset = 0;
+  var->yoffset = 0;
+
+  var->bits_per_pixel = par->bpp;
+  var->grayscale = 0;
+
+  if(par->bpp == 8)
+  {
+    var->red.offset = 0;
+    var->red.length =
+      (virt_vgaiobase __MN__   ? mach64_bitspercol __MN__  : 0);
+    var->red.msb_right = 0;
+    var->blue = var->green = var->red;
+  }
+  else
+  {
+    var->red.offset = 11;
+    var->red.length = 5;
+    var->red.msb_right = 0;
+    var->green.offset = 5;
+    var->green.length = 6;
+    var->green.msb_right = 0;
+    var->blue.offset = 0;
+    var->blue.length = 5;
+    var->blue.msb_right = 0;
+  }
+  var->transp.offset = 0;
+  var->transp.length = 0;
+  var->transp.msb_right = 0;
+
+  var->nonstd = 0;
+  var->activate = 0;
+
+  var->height = -1;
+  var->width = -1;
+  var->accel = mach64_use_accel __MN__  ;
+  var->vmode = FB_VMODE_NONINTERLACED;
+
+  /* Dummy values */
+
+  if (par->bpp == 8)
+    var->pixclock = M64_8_PIXCLOCK;
+  else
+    var->pixclock = M64_16_PIXCLOCK;
+  var->sync = 0;
+  var->left_margin = 64;
+  var->right_margin = 96;
+  var->upper_margin = 35;
+  var->lower_margin = 12;
+  var->hsync_len = 112;
+  var->vsync_len = 2;
+
+  for(i = 0; i < arraysize(var->reserved); i++)
+    var->reserved[i] = 0;
+
+  return(0);
+}
+/*endproc _encode_var() */
+
+/*============================================================================*/
+
+
+/*--------------------------------------------------------------------------*/
+   /*
+    *    Set a single color register. The values supplied are already
+    *    rounded down to the hardware's capabilities (according to the
+    *    entries in the var structure). Return != 0 for invalid regno.
+    */
+/*--------------------------------------------------------------------------*/
+
+static int 
+M64_hw_setcolreg(u_int regno,
+  u_int red,
+  u_int green,
+  u_int blue,
+  u_int transp)
+
+/*--------------------------------------------------------------------------*/
+{
+  DECLARE_STATIC_UINT08___MN_ 
+
+  unsigned short                colmask;
+  unsigned short                colshift;
+
+  /*--------------------------------------------------------------------------*/
+  OFuncId("M64_hw_setcolreg(%02X) \n", regno);
+
+  if(regno > 255)  return (1);
+  mach64_colormap  __MN__  [regno][0] = red;
+  mach64_colormap  __MN__  [regno][1] = green;
+  mach64_colormap  __MN__  [regno][2] = blue;
+  mach64_colormap  __MN__  [regno][3] = transp;
+
+  if(! phys_vgaiobase)  return 1;
+
+  colmask = (1 << mach64_bitspercol __MN__  ) - 1;
+  colshift = 8 - mach64_bitspercol __MN__  ;
+
+  OUTB(0x3c8, regno);
+  DACDelay;
+  OUTB(0x3c9, (red >> colshift) & colmask);
+  DACDelay;
+  OUTB(0x3c9, (green >> colshift) & colmask);
+  DACDelay;
+  OUTB(0x3c9, (blue >> colshift) & colmask);
+  DACDelay;
+
+  return (0);
+}
+/*endproc*/
+
+/*============================================================================*/
+
+
+/*--------------------------------------------------------------------------*/
+   /*
+    *    Read a single color register and split it into
+    *    colors/transparent. Return != 0 for invalid regno.
+    */
+/*--------------------------------------------------------------------------*/
+
+static int 
+M64_hw_getcolreg(u_int regno,
+  u_int * red,
+  u_int * green,
+  u_int * blue,
+  u_int * transp)
+
+/*--------------------------------------------------------------------------*/
+{
+  DECLARE_STATIC_UINT08___MN_ 
+
+  /*--------------------------------------------------------------------------*/
+  OFuncId("M64_hw_getcolreg() \n");
+
+  if(regno >= 256)  return (1);
+
+  *red    = mach64_colormap  __MN__  [regno][0];
+  *green  = mach64_colormap  __MN__  [regno][1];
+  *blue   = mach64_colormap  __MN__  [regno][2];
+  *transp = mach64_colormap  __MN__  [regno][3];
+
+  /*
+  OUTB(0x3c7, regno);
+  DACDelay;
+  *red = INB(0x3c9) & colmask;
+  DACDelay;
+  *green = INB(0x3c9) & colmask;
+  DACDelay;
+  *blue = INB(0x3c9) & colmask;
+  DACDelay;
+  */
+	    
+  return (0);
+}
+/*endproc*/
+
+/*============================================================================*/
+
+
+/*--------------------------------------------------------------------------*/
+   /*
+    *    (Un)Blank the screen: Set all colors = RGB 000 or back
+    */
+/*--------------------------------------------------------------------------*/
+
+void 
+M64_hw_blank(int blank)
+
+/*--------------------------------------------------------------------------*/
+{
+  DECLARE_STATIC_UINT08___MN_ 
+  int regno;
+
+  unsigned short                colmask;
+  unsigned short                colshift;
+
+  /*--------------------------------------------------------------------------*/
+  CFuncId("M64_hw_blank() \n");
+
+  if(blank)
+  {
+    for(regno = 0; regno < 256; regno++)
+    {
+      OUTB(0x3c8, regno);
+      DACDelay;
+      OUTB(0x3c9, 0);
+      DACDelay;
+      OUTB(0x3c9, 0);
+      DACDelay;
+      OUTB(0x3c9, 0);
+      DACDelay;
+
+    }
+    /*nexxt regno*/
+  }
+  else
+  {
+    colmask = (1 << mach64_bitspercol __MN__  ) - 1;
+    colshift = 8 - mach64_bitspercol __MN__  ;
+    for (regno = 0; regno < 256; regno++)
+    {
+      OUTB(0x3c8, regno);
+      DACDelay;
+      OUTB(0x3c9, (mach64_colormap  __MN__  [regno][0] >> colshift) & colmask);
+      DACDelay;
+      OUTB(0x3c9, (mach64_colormap  __MN__  [regno][1] >> colshift) & colmask);
+      DACDelay;
+      OUTB(0x3c9, (mach64_colormap  __MN__  [regno][2] >> colshift) & colmask);
+    }
+    /*nexxt regno*/
+  }
+  /*endif*/
+
+  return;
+}
+/*endproc*/
+
+/*============================================================================*/
+
+
+/*--------------------------------------------------------------------------*/
+/*
+ * We are waiting for "fifo" FIFO-slots empty
+ */
+/*--------------------------------------------------------------------------*/
+
+void 
+Mach64_WaitQueue (u_short fifo)
+
+/*--------------------------------------------------------------------------*/
+{
+
+  /*--------------------------------------------------------------------------*/
+  CFuncId("Mach64_WaitQueue() \n");
+
+  WaitQueue(16);
+
+  return;
+}
+/*endproc*/
+
+/*============================================================================*/
+
+
+/*--------------------------------------------------------------------------*/
+/*
+ * We are waiting for Hardware (Graphics Engine) not busy
+ */
+/*--------------------------------------------------------------------------*/
+
+void 
+Mach64_WaitBlit (void)
+
+/*--------------------------------------------------------------------------*/
+{
+
+  /*--------------------------------------------------------------------------*/
+  CFuncId("Mach64_WaitBlit() \n");
+
+  WaitIdleEmpty(); /* Make sure that all commands have finished */
+
+  return;
+}
+/*endproc*/
+
+/*============================================================================*/
+
+
+/*--------------------------------------------------------------------------*/
+/*
+ * BitBLT - Through the Plane
+ */
+/*--------------------------------------------------------------------------*/
+
+void 
+Mach64_BitBLT (
+  int     xSrc,
+  int     ySrc,
+  int     xDst,
+  int     yDst,
+  u_int   wSrc,
+  u_int   hSrc,
+  u_short mode)
+
+/*--------------------------------------------------------------------------*/
+{
+  DECLARE_STATIC_UINT08___MN_ 
+  u_int                         direction;
+
+  /*--------------------------------------------------------------------------*/
+  CFuncId("BB(%03X,%03X,%03X,%03X,%03X,%03X,%X) ",
+    xSrc, ySrc, xDst, yDst, wSrc, hSrc, mode);
+  /* Set drawing direction */
+  /* -Y, X maj, -X (default) */
+
+#if 1
+
+  direction = 0;
+
+  if(ySrc < yDst)
+  {
+    yDst += hSrc - 1;
+    ySrc += hSrc - 1;
+  }
+  else
+  {
+    direction |= DST_Y_TOP_TO_BOTTOM;
+  }
+  /*endif*/
+  if(xSrc < xDst)
+  {
+    xDst += wSrc - 1;
+    xSrc += wSrc - 1;
+  }
+  else
+  {
+    direction |= DST_X_LEFT_TO_RIGHT;
+  }
+  /*endif*/
+
+
+  WaitQueue(4);
+  regw(DP_WRITE_MASK, 0x000000FF          /* pGC->planemask */ );
+  regw(DP_MIX, (mach64alu[mode] << 16) |  MIX_DST);
+  regw(DP_SRC, FRGD_SRC_BLIT);
+
+  regw(GUI_TRAJ_CNTL, direction);
+
+/*
+  MACH64_BIT_BLT(xSrc, ySrc, xDst, yDst, wSrc, hSrc, direction);
+*/
+    WaitQueue(4);
+    regw(SRC_Y_X, (((xSrc) << 16) | (ySrc) ));
+    regw(SRC_WIDTH1, (wSrc));
+    regw(DST_Y_X, (((xDst) << 16) | (yDst) ));
+    regw(DST_HEIGHT_WIDTH, (((wSrc) << 16) | (hSrc) ));
+
+  WaitIdleEmpty(); /* Make sure that all commands have finished */
+
+  /*
+   * Make sure that the destination trajectory is correctly set
+   * for subsequent calls.  MACH64_BIT_BLT is the only function that
+   * currently changes the destination trajectory from L->R and T->B.
+   */
+  regw(DST_CNTL, (DST_X_LEFT_TO_RIGHT | DST_Y_TOP_TO_BOTTOM));
+
+#endif
+
+  return;
+}
+/*endproc*/
+
+/*============================================================================*/
+
+
+/*--------------------------------------------------------------------------*/
+/*
+ * Rectangle Fill Solid
+ */
+/*--------------------------------------------------------------------------*/
+
+void 
+Mach64_RectFill(
+  int     x,
+  int     y,
+  u_int   wSrc,
+  u_int   hSrc,
+  u_int   mode,
+  u_int   color)
+
+/*--------------------------------------------------------------------------*/
+{
+
+#if 1
+
+  /*--------------------------------------------------------------------------*/
+  CFuncId("RF(%03X,%03X,%03X,%03X,%X) ",
+    x, y, wSrc, hSrc, mode);
+
+  WaitQueue(5);
+  regw(DP_FRGD_CLR, color              /* pGC->fgPixel */ );
+  regw(DP_WRITE_MASK, 0x000000FF       /* pGC->planemask */ );
+  regw(DP_MIX, (mach64alu[mode] << 16) | MIX_DST);
+  regw(DP_SRC, FRGD_SRC_FRGD_CLR);
+
+  regw(DST_CNTL, DST_X_LEFT_TO_RIGHT | DST_Y_TOP_TO_BOTTOM);
+
+  if ((wSrc > 0) && (hSrc > 0))
+  {
+    /* Bprint("q\n"); */
+    WaitQueue(2);
+    regw(DST_Y_X, (((u_int)x << 16) | ((u_int)y & 0x0000ffff)));
+    regw(DST_HEIGHT_WIDTH, (((u_int)wSrc << 16) | hSrc));
+  }
+
+  WaitIdleEmpty(); /* Make sure that all commands have finished */
+
+#endif
+
+  return;
+}
+/*endproc*/
+
+/*============================================================================*/
+
+
+/*--------------------------------------------------------------------------*/
+/*
+ * Move cursor to x, y
+ */
+/*--------------------------------------------------------------------------*/
+
+void 
+Mach64_MoveCursor (u_short x, u_short y)
+
+/*--------------------------------------------------------------------------*/
+{
+
+  /*--------------------------------------------------------------------------*/
+  CFuncId("Mach64_MoveCursor() \n");
+
+
+  return;
+}
+/*endproc Mach64_MoveCursor()*/
+
+/*============================================================================*/
+
+
+/* -------------------- Generic routines ------------------------------------ */
+
+
+/*--------------------------------------------------------------------------*/
+   /*
+    *    Fill the hardware's `par' structure.
+    */
+/*--------------------------------------------------------------------------*/
+
+static void 
+M64_hw_get_par(struct mach64fb_par * par)
+
+/*--------------------------------------------------------------------------*/
+{
+  DECLARE_STATIC_UINT08___MN_ 
+
+  /*--------------------------------------------------------------------------*/
+  CFuncId("M64_hw_get_par() \n");
+  if(current_par_valid __MN__  )
+  {
+    *par = current_par __MN__  ;
+  }
+  else    /* use a default, initialize */
+  {
+    fbhws_ptr->decode_var(
+      &mach64fb_predefined[mach64_mode __MN__  ],
+      par);
+  }
+  /*endif*/
+
+  return;
+}
+/*endproc*/
+
+/*============================================================================*/
+
+
+/*--------------------------------------------------------------------------*/
+
+static void 
+M64_hw_set_par(struct mach64fb_par * par)
+
+/*--------------------------------------------------------------------------*/
+{
+  DECLARE_STATIC_UINT08___MN_ 
+
+  /*--------------------------------------------------------------------------*/
+  CFuncId("M64_hw_set_par() \n");
+  current_par __MN__   = *par;
+  current_par_valid __MN__   = 1;
+
+
+  return;
+}
+/*endproc*/
+
+/*============================================================================*/
+
+
+/*--------------------------------------------------------------------------*/
+
+static int 
+do_fb_set_var(struct fb_var_screeninfo * var, int isactive)
+
+/*--------------------------------------------------------------------------*/
+{
+  int                           err, activate;
+  struct mach64fb_par          par;
+
+  /*--------------------------------------------------------------------------*/
+  CFuncId("do_fb_set_var() \n");
+  if((err = fbhws_ptr->decode_var(var, &par)))
+    return(err);
+  activate = var->activate;
+  if((var->activate & FB_ACTIVATE_MASK) == FB_ACTIVATE_NOW && isactive)
+  {
+    M64_hw_set_par(&par);
+  }
+  /*endif*/
+  fbhws_ptr->encode_var(var, &par);
+  var->activate = activate;
+  return(0);
+}
+/*endproc*/
+
+/*============================================================================*/
+
+
+/*--------------------------------------------------------------------------*/
+
+static void 
+do_install_cmap(int con)
+
+/*--------------------------------------------------------------------------*/
+{
+
+  /*--------------------------------------------------------------------------*/
+  CFuncId("do_install_cmap() \n");
+
+  if(con != currcon)  return;
+
+  if(fb_display[con].cmap.len)
+  {
+    fb_set_cmap(&fb_display[con].cmap,
+      &fb_display[con].var,
+      1,
+      fbhws_ptr->setcolreg);
+  }
+  else
+  {
+    fb_set_cmap(fb_default_cmap(fb_display[con].var.bits_per_pixel),
+      &fb_display[con].var,
+      1,
+      fbhws_ptr->setcolreg);
+  }
+  /*endif*/
+
+  return;
+}
+/*endproc*/
+
+/*============================================================================*/
+
+
+/*--------------------------------------------------------------------------*/
+   /*
+    *    Get the Fixed Part of the Display
+    */
+/*--------------------------------------------------------------------------*/
+
+static int 
+M64_op_get_fix(struct fb_fix_screeninfo * fix, int con, int fbidx)
+
+/*--------------------------------------------------------------------------*/
+{
+  struct mach64fb_par          par;
+  int                           status = 0;
+
+  /*--------------------------------------------------------------------------*/
+  CFuncId("M64_op_get_fix() \n");
+  if (con == -1)
+  {
+    M64_hw_get_par(&par);
+  }
+  else
+  {
+    status = fbhws_ptr->decode_var(&fb_display[con].var, &par);
+  }
+  /*endif*/
+  return(status ? status : fbhws_ptr->encode_fix(fix, &par));
+}
+/*endproc*/
+
+/*============================================================================*/
+
+
+/*--------------------------------------------------------------------------*/
+   /*
+    *    Get the User Defined Part of the Display
+    */
+/*--------------------------------------------------------------------------*/
+
+static int 
+M64_op_get_var(struct fb_var_screeninfo *var, int con, int fbidx)
+
+/*--------------------------------------------------------------------------*/
+{
+  struct mach64fb_par          par;
+  int                           status = 0;
+
+  /*--------------------------------------------------------------------------*/
+  CFuncId("M64_op_get_var() \n");
+  if(con == -1)
+  {
+    M64_hw_get_par(&par);
+    status = fbhws_ptr->encode_var(var, &par);
+  }
+  else
+  {
+    *var = fb_display[con].var;
+  }
+  /*endif*/
+  return(status);
+}
+/*endproc*/
+
+/*============================================================================*/
+
+
+/*--------------------------------------------------------------------------*/
+
+static void 
+mach64fb_set_disp(int con)
+
+/*--------------------------------------------------------------------------*/
+{
+  DECLARE_STATIC_UINT08___MN_ 
+
+  struct display *              disp_p;
+  struct fb_fix_screeninfo      fix;
+
+  /*--------------------------------------------------------------------------*/
+  CFuncId("mach64fb_set_disp() \n");
+
+  if(con >= 0)
+    disp_p = &fb_display[con];
+  else
+    disp_p = &m_disp __MN__  ;  	/* used during initialization */
+
+  /* ### FN: Needs fixes later */
+  M64_op_get_fix(&fix, con, 0);
+
+  if(con == -1)  con = 0;
+
+  disp_p->screen_base = (u_char *)fix.smem_start;
+  disp_p->visual = fix.visual;
+  disp_p->type = fix.type;
+  disp_p->type_aux = fix.type_aux;
+  disp_p->ypanstep = fix.ypanstep;
+  disp_p->ywrapstep = fix.ywrapstep;
+  disp_p->line_length = fix.line_length;
+  if(fix.visual != FB_VISUAL_PSEUDOCOLOR && fix.visual != FB_VISUAL_DIRECTCOLOR)
+  {
+    disp_p->can_soft_blank = 0;                   /* aus atari_ */
+  }
+  else
+  {
+    disp_p->can_soft_blank = 1;
+  }
+  /*endif*/
+
+  disp_p->can_soft_blank = 1;                       /* aus Cyber_ */
+  disp_p->inverse = mach64_inverse __MN__  ;
+
+  return;
+}
+/*endproc mach64fb_set_disp() */
+
+/*============================================================================*/
+
+
+/*--------------------------------------------------------------------------*/
+  /*
+   *    Set the User Defined Part of the Display
+   */
+/*--------------------------------------------------------------------------*/
+
+static int 
+M64_op_set_var(struct fb_var_screeninfo * var, int con, int fbidx)
+
+/*--------------------------------------------------------------------------*/
+{
+  DECLARE_STATIC_UINT08___MN_ 
+  int       err, oldxres, oldyres, oldvxres, oldvyres, oldbpp;
+
+  /*--------------------------------------------------------------------------*/
+  CFuncId("M64_op_set_var() \n");
+
+  if((err = do_fb_set_var(var, con == currcon)))
+    return(err);
+  if((var->activate & FB_ACTIVATE_MASK) == FB_ACTIVATE_NOW)
+  {
+    oldxres = fb_display[con].var.xres;
+    oldyres = fb_display[con].var.yres;
+    oldvxres = fb_display[con].var.xres_virtual;
+    oldvyres = fb_display[con].var.yres_virtual;
+    oldbpp = fb_display[con].var.bits_per_pixel;
+    fb_display[con].var = *var;
+    if(oldxres != var->xres || oldyres != var->yres ||
+      oldvxres != var->xres_virtual || oldvyres != var->yres_virtual ||
+      oldbpp != var->bits_per_pixel)
+    {
+      mach64fb_set_disp(con);
+      (*fb_info __MN__  .changevar)(con);
+      fb_alloc_cmap(&fb_display[con].cmap, 0, 0);
+      do_install_cmap(con);
+    }
+  }
+  /*endif*/
+  var->activate = 0;
+
+  return(0);
+}
+/*endproc M64_op_set_var() */
+
+/*============================================================================*/
+
+
+/*--------------------------------------------------------------------------*/
+   /*
+    *    Get the Colormap
+    */
+/*--------------------------------------------------------------------------*/
+
+static int 
+M64_op_get_cmap(struct fb_cmap * cmap, int kspc, int con, int fbidx)
+
+/*--------------------------------------------------------------------------*/
+{
+
+  /*--------------------------------------------------------------------------*/
+  OFuncId("M64_op_get_cmap() \n");
+
+  if(con == currcon) /* current console? */
+  {
+    return(fb_get_cmap(cmap, &fb_display[con].var, kspc, fbhws_ptr->getcolreg));
+  }
+  else if(fb_display[con].cmap.len) /* non default colormap? */
+  {
+    fb_copy_cmap(&fb_display[con].cmap, cmap, kspc ? 0 : 2);
+  }
+  else
+  {
+    fb_copy_cmap(fb_default_cmap(fb_display[con].var.bits_per_pixel),
+      cmap, kspc ? 0 : 2);
+  }
+  /*endif*/
+
+  return(0);
+}
+/*endproc M64_op_get_cmap() */
+
+/*============================================================================*/
+
+
+/*--------------------------------------------------------------------------*/
+   /*
+    *    Set the Colormap
+    */
+/*--------------------------------------------------------------------------*/
+
+static int 
+M64_op_set_cmap(struct fb_cmap * cmap, int kspc, int con, int fbidx)
+
+/*--------------------------------------------------------------------------*/
+{
+  int err;
+
+  /*--------------------------------------------------------------------------*/
+  OFuncId("M64_op_set_cmap() \n");
+
+  if (!fb_display[con].cmap.len)       /* no colormap allocated? */
+  {
+    err = fb_alloc_cmap(&fb_display[con].cmap,
+      1 << fb_display[con].var.bits_per_pixel,
+      0);
+    if(err)
+    {
+      return(err);
+    }
+    /*endif*/
+  }
+  /*endif*/
+  if(con == currcon)              /* current console? */
+  {
+    return(fb_set_cmap(cmap, &fb_display[con].var, kspc, fbhws_ptr->setcolreg));
+  }
+  else
+  {
+    fb_copy_cmap(cmap, &fb_display[con].cmap, kspc ? 0 : 1);
+  }
+  /*endif*/
+
+  return(0);
+}
+/*endproc M64_op_set_cmap() */
+
+/*============================================================================*/
+
+
+/*--------------------------------------------------------------------------*/
+   /*
+    *    Pan or Wrap the Display
+    *
+    *    This call looks only at xoffset, yoffset and the FB_VMODE_YWRAP flag
+    */
+/*--------------------------------------------------------------------------*/
+
+static int 
+M64_op_pan_display(struct fb_var_screeninfo *var, int con, int fbidx)
+
+/*--------------------------------------------------------------------------*/
+{
+
+  /*--------------------------------------------------------------------------*/
+  CFuncId("Mach64_pan_display() \n");
+
+  return(-EINVAL);
+}
+/*endproc M64_op_pan_display() */
+
+/*============================================================================*/
+
+
+/*--------------------------------------------------------------------------*/
+   /*
+    *    Mach 64 Frame Buffer Specific ioctls
+    */
+/*--------------------------------------------------------------------------*/
+
+static int 
+M64_op_ioctl(
+  struct inode * inode,
+  struct file *  file,
+  u_int          cmd,
+  u_long         arg,
+  int            con,
+  int            fbidx)
+
+/*--------------------------------------------------------------------------*/
+{
+  DECLARE_STATIC_UINT08___MN_ 
+
+  /*--------------------------------------------------------------------------*/
+  CFuncId("M64_op_ioctl($%08X %d) \n", cmd, con);
+  switch (cmd)
+  {
+
+#ifdef FBCMD_GET_CURRENTPAR
+    case FBCMD_GET_CURRENTPAR:
+    {
+      if (copy_to_user((void *)arg, (void *)&current_par __MN__  ,
+         sizeof(struct mach64fb_par)))
+        return -EFAULT;
+      return 0;
+    }
+    /*endcase*/
+#endif
+
+#ifdef FBCMD_SET_CURRENTPAR
+    case FBCMD_SET_CURRENTPAR:
+    {
+
+      if (copy_from_user((void *)&current_par __MN__  , (void *)arg,
+        sizeof(struct mach64fb_par)))
+        return -EFAULT;
+      M64_hw_set_par(&current_par __MN__  );
+      return 0;
+    }
+    /*endcase*/
+#endif
+
+  }
+  /*endswitch*/
+  return(-EINVAL);
+}
+/*endproc*/
+
+/*============================================================================*/
+
+
+/*--------------------------------------------------------------------------*/
+
+int 
+Mach64_probe(void)
+
+/*--------------------------------------------------------------------------*/
+{
+
+  /*--------------------------------------------------------------------------*/
+  FuncId("Mach64_probe() \n");
+  mach64_key = 0;
+  return(mach64_key);
+}
+/*endproc*/
+
+/*============================================================================*/
+
+
+/*--------------------------------------------------------------------------*/
+
+__initfunc(
+void 
+mach64fb_setup(char * options, int * ints)
+)
+/*--------------------------------------------------------------------------*/
+{
+  DECLARE_STATIC_UINT08___MN_ 
+
+  char *        this_opt;
+  char          mach64_str[80];
+
+  /*--------------------------------------------------------------------------*/
+  FuncId("mach64fb_setup() '%s'\n", options);
+
+  fb_info __MN__  .fontname[0] = '\0';
+
+  if(!options || !*options)  return;
+
+  for(this_opt = strtok(options, ","); this_opt; this_opt = strtok(NULL, ","))
+  {
+    if (!strcmp(this_opt, "inverse"))
+    {
+      mach64_inverse __MN__   = 1;
+      fb_invert_cmaps();
+    }
+    else if (!strncmp(this_opt, "font:", 5))
+    {
+      strcpy(fb_info __MN__  .fontname, this_opt + 5);
+    }
+    else if (!strncmp(this_opt,"Mach64:", 7))
+    {
+      strncpy(mach64_str, this_opt + 7, 80);
+      store_video_par(mach64_str  _ADD_ARG_MN_ );
+      _INC_MN_ ;
+      mach64_count =  _MN_ ;
+    }
+    else
+    {
+      mach64_mode __MN__   = get_video_mode(this_opt);
+    }
+    /*endif*/
+  }
+  /*next this_opt*/
+
+  return;
+}
+/*endproc*/
+
+/*============================================================================*/
+
+
+/*--------------------------------------------------------------------------*/
+
+static int 
+store_video_par(char* video_str ADD_ARG_UINT08___MN_ )
+
+/*--------------------------------------------------------------------------*/
+{
+  char *                        p;
+  unsigned  long                sm_addr, sm_size;
+
+  int                           xres, yres, depth;
+  short int                     pmode;
+  short int                     use_accel;
+
+  /*--------------------------------------------------------------------------*/
+  CFuncId("store_video_par(%d) \n",  _MN_ );
+  /* Format is: <xres>;<yres>;<depth>;<plane organ.>;
+   *            <screen mem addr>
+   *        [;<screen mem length>[;<vgaiobase>[;<colorreg-type>]]]
+   */
+
+  use_accel = 0;
+  if (!(p = strtoke(video_str, ";")) || !*p)  goto mach64_invalid;
+  xres = simple_strtoul(p, NULL, 10);
+  if (xres <= 0)  goto mach64_invalid;
+
+  if (!(p = strtoke(NULL, ";")) || !*p)  goto mach64_invalid;
+  yres = simple_strtoul(p, NULL, 10);
+  if (yres <= 0) goto mach64_invalid;
+
+  if (!(p = strtoke(NULL, ";")) || !*p)  goto mach64_invalid;
+  depth = simple_strtoul(p, NULL, 10);
+  if (depth != 1 && depth != 2 && depth != 4 && depth != 8 &&
+      depth != 16 && depth != 24)  goto mach64_invalid;
+
+  if (!(p = strtoke(NULL, ";")) || !*p)  goto mach64_invalid;
+  if (*p == 'i')
+    pmode = FB_TYPE_INTERLEAVED_PLANES;
+  else if (*p == 'p')
+    pmode = FB_TYPE_PACKED_PIXELS;
+  else if (*p == 'n')
+    pmode = FB_TYPE_PLANES;
+  else if (*p == 't')
+    pmode = -1; /* true color */
+  else
+    goto mach64_invalid;
+
+
+  if (!(p = strtoke(NULL, ";")) ||!*p)  goto mach64_invalid;
+  sm_addr = simple_strtoul(p, NULL, 0);
+
+  if (!(p = strtoke(NULL, ";")) ||!*p)
+    sm_size = xres * yres * depth / 8;
+  else
+    sm_size = simple_strtoul(p, NULL, 0);
+
+  if ((p = strtoke(NULL, ";")) && *p)
+    phys_vgaiobase __MN__   = simple_strtoul(p, NULL, 0);
+
+  if ((p = strtoke(NULL, ";")) && *p)
+  {
+    mach64_bitspercol __MN__   = simple_strtoul(p, NULL, 0);
+    if (mach64_bitspercol __MN__   > 8)
+      mach64_bitspercol __MN__   = 8;
+    else if (mach64_bitspercol __MN__   < 1)
+      mach64_bitspercol __MN__   = 1;
+  }
+  /*endif*/
+
+  if ((p = strtoke(NULL, ";")) && *p)
+    phys_guiregbase __MN__   = simple_strtoul(p, NULL, 0);
+
+  if ((p = strtoke(NULL, ";")) && *p)
+  {
+    if(*p == 'a')  use_accel = FB_ACCEL_MACH64;
+  
+  }
+  /*endif*/
+
+  mach64_xres __MN__    = xres;
+  mach64_yres __MN__    = yres;
+  mach64_depth __MN__   = depth;
+  mach64_pmode __MN__   = pmode;
+  mach64_use_accel __MN__   = use_accel;
+  phys_vmembase __MN__   = sm_addr;
+  phys_size __MN__    = sm_size;
+
+  return(0);
+
+  /*--------------------------------------------------------------------------*/
+  mach64_invalid:
+
+  phys_vmembase __MN__   = 0;
+
+  return(-1);
+}
+/*endproc*/
+
+/*============================================================================*/
+
+
+/* a strtok which returns empty strings, too */
+
+/*--------------------------------------------------------------------------*/
+
+static char * 
+strtoke(char * s, const char * ct)
+
+/*--------------------------------------------------------------------------*/
+{
+  static char    *ssave = NULL;
+  char          *sbegin, *send;
+  
+  /*--------------------------------------------------------------------------*/
+  sbegin  = s ? s : ssave;
+  if (!sbegin) {
+    return NULL;
+  }
+  if (*sbegin == '\0') {
+    ssave = NULL;
+    return NULL;
+  }
+  send = strpbrk(sbegin, ct);
+  if (send && *send != '\0')
+    *send++ = '\0';
+  ssave = send;
+  return sbegin;
+}
+/*endproc*/
+
+/*============================================================================*/
+
+
+/*--------------------------------------------------------------------------*/
+   /*
+    *    Initialization
+    */
+/*--------------------------------------------------------------------------*/
+
+__initfunc(
+unsigned long
+mach64fb_init(unsigned long mem_start)
+)
+/*--------------------------------------------------------------------------*/
+{
+  static unsigned long          virt_dummy;
+  static u_char                 fb_init_count;
+  DECLARE_STATIC_UINT08___MN_
+
+  struct mach64fb_par          par;
+  int                           err;
+  DECLARE_UINT08___MN_
+
+  /*--------------------------------------------------------------------------*/
+  FuncId("mach64fb_init($%08lX) \n", mem_start);
+
+  /*
+  _MN_ = fb_init_count;
+  */
+  if(phys_vmembase __MN__   == 0)  return mem_start;
+
+  fb_init_count++;
+
+  fbhws_ptr = &mach64_switch;
+
+  /* Map the video memory (physical address given) to somewhere
+   * in the kernel address space.
+   */
+  mem_start = (mem_start + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1);
+  virt_vmembase __MN__   = kernel_map(
+    phys_vmembase __MN__  ,
+    phys_size __MN__  ,
+#ifdef  _OHNE_HW_ACCEL_
+    KERNELMAP_NO_COPYBACK,    /* must be changed if hardware blit */
+#else
+    KERNELMAP_NOCACHE_SER,
+#endif
+    &mem_start);
+
+#ifdef  _MAP_GUIREGS_0BFC00_
+    
+  if(phys_guiregbase __MN__  )
+  {
+    virt_guiregbase __MN__   = kernel_map(
+      phys_guiregbase __MN__  ,
+      0x10000,                           /* 64 K */
+      KERNELMAP_NOCACHE_SER,
+      &mem_start);
+  }
+  /*endif*/
+
+#endif
+
+  if(phys_vgaiobase __MN__  )
+  {
+/*
+    phys_guiregbase __MN__   = phys_vgaiobase __MN__  - 0x00100000 + 0x000B0000;
+*/
+
+#ifdef _MAP_768K_IO_
+
+    virt_vgaiobase __MN__   = kernel_map(
+      phys_vgaiobase __MN__  - 0x00080000,
+      0x0C0000,                          /* 768 K */
+      KERNELMAP_NOCACHE_SER,
+      &mem_start);
+
+#else
+
+    if(phys_guiregbase __MN__  )
+    {
+      virt_vgaiobase __MN__   = kernel_map(
+        phys_vgaiobase __MN__  ,
+        0x10000,                           /* 64 K */
+        KERNELMAP_NOCACHE_SER,
+        &mem_start);
+    }
+    else
+    {
+      virt_vgaiobase __MN__   = 0x00080000 + kernel_map(
+        phys_vgaiobase __MN__  - 0x00080000,
+        0x0C0000,                          /* 768 K */
+        KERNELMAP_NOCACHE_SER,
+        &mem_start);
+
+      Dprint(" faking virt_guiregbase to virt_vgaiobase - 0x00050000 \n");
+      virt_guiregbase __MN__   = virt_vgaiobase __MN__  - 0x00050000;
+    }
+    /*endif*/
+
+#endif  /* _MAP_768K_IO_ */
+  }
+  /*endif*/
+
+  Dprint(" phys_guiregbase=$%08lX virt_dummy=$%08lX\n",
+    phys_guiregbase __MN__  ,
+    virt_dummy);
+
+    
+#ifdef  _DUMP_KMAP_RANGE_
+  dump_kmap_range();
+#endif
+
+
+  virt_size __MN__   = phys_size __MN__   & PAGE_MASK;  /* abrunden */
+  virt_size __MN__   = (phys_size __MN__  - 0x00200000) & PAGE_MASK;  /* abrunden */
+
+  Dprint(" PAGE_MASK=$%08lX phys_size=$%08lX \n", PAGE_MASK, phys_size __MN__ );
+  /*
+  memset((char *) virt_vmembase __MN__  , 0, virt_size __MN__  );
+  */
+
+  strcpy(fb_info __MN__  .modename, mach64fb_name);
+  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;
+  fb_info __MN__  .blank = &Mach64fb_blank;
+  strcat(fb_info __MN__  .modename, fb_var_names[mach64_mode __MN__  ]);
+  fb_info __MN__  .modename[39] =  _MN_ ;
+
+  err = register_framebuffer(&fb_info __MN__  );
+  if(err < 0)
+  {
+    Eprint(" Cannot register frame buffer() \n" );
+    return mem_start;
+  }
+  /*endif*/
+
+  fbhws_ptr->init( _ARG_MN_ );
+  fbhws_ptr->decode_var(&mach64fb_predefined[mach64_mode __MN__  ], &par);
+  fbhws_ptr->encode_var(&mach64fb_predefined[0], &par); /* store resolution */
+
+  do_fb_set_var(&mach64fb_predefined[0], 1);
+
+  M64_op_get_var(&m_disp __MN__  .var, -1, GET_FB_IDX(fb_info.node));
+					    /* fill in m_disp.var */
+  mach64fb_set_disp(-1);                    /* fill in the rest of m_disp  */
+
+  Iprint(" Determined %dx%d, depth %d $%08lX MEM @ $%08lX IO @ $%08lX $%08lX\n",
+    m_disp __MN__  .var.xres,
+    m_disp __MN__  .var.yres,
+    m_disp __MN__  .var.bits_per_pixel,
+    phys_size __MN__  ,
+    phys_vmembase __MN__  ,
+    phys_vgaiobase __MN__  ,
+    phys_guiregbase __MN__  );
+  do_install_cmap(0);
+
+  Iprint(
+    " %s FB device %d, using %ldK of video MEM @ $%08lX IO @ $%08lX $%08lX\n",
+    fb_info __MN__  .modename,
+     _MN_ ,
+    virt_size __MN__   >> 10,
+    virt_vmembase __MN__  ,
+    virt_vgaiobase __MN__  ,
+    virt_guiregbase __MN__  );
+
+  _INC_MN_ ;
+
+  return mem_start;
+}
+/*endproc mach64fb_init() */
+
+/*============================================================================*/
+
+
+/*--------------------------------------------------------------------------*/
+
+static int 
+Mach64fb_switch(int con)
+
+/*--------------------------------------------------------------------------*/
+{
+
+  /*--------------------------------------------------------------------------*/
+  CFuncId("Mach64fb_switch(%d) \n", con);
+  /* Do we have to save the colormap? */
+  if (fb_display[currcon].cmap.len)
+  {
+    fb_get_cmap(&fb_display[currcon].cmap,
+      &fb_display[currcon].var,
+      1,
+      fbhws_ptr->getcolreg);
+  }
+  /*endif*/
+  do_fb_set_var(&fb_display[con].var, 1);
+  currcon = con;
+  /* Install new colormap */
+  do_install_cmap(con);
+  return(0);
+}
+/*endproc*/
+
+/*============================================================================*/
+
+
+/*--------------------------------------------------------------------------*/
+   /*
+    *    Update the `var' structure (called by fbcon.c)
+    *
+    *    This call looks only at yoffset and the FB_VMODE_YWRAP flag in `var'.
+    *    Since it's called by a kernel driver, no range checking is done.
+    */
+/*--------------------------------------------------------------------------*/
+
+static int 
+Mach64fb_updatevar(int con)
+
+/*--------------------------------------------------------------------------*/
+{
+
+  /*--------------------------------------------------------------------------*/
+  CFuncId("Mach64fb_updatevar() \n");
+  return(0);
+}
+/*endproc*/
+
+/*============================================================================*/
+
+
+/*--------------------------------------------------------------------------*/
+   /*
+    *    Blank the display.
+    */
+/*--------------------------------------------------------------------------*/
+
+static void 
+Mach64fb_blank(int blank)
+
+/*--------------------------------------------------------------------------*/
+{
+  /*--------------------------------------------------------------------------*/
+  CFuncId("Mach64fb_blank() \n");
+  fbhws_ptr->blank(blank);
+}
+/*endproc*/
+
+/*============================================================================*/
+
+
+/*--------------------------------------------------------------------------*/
+   /*
+    *    Get a Video Mode
+    */
+/*--------------------------------------------------------------------------*/
+
+static int 
+get_video_mode(const char * name)
+
+/*--------------------------------------------------------------------------*/
+{
+  int i;
+
+  /*--------------------------------------------------------------------------*/
+  CFuncId("get_video_mode(%s) \n", name);
+
+  for (i = 1; i < NUM_PREDEF_MODES; i++)
+  {
+    if (!strcmp(name, fb_var_names[i]))  return(i);
+  }
+  /*next i*/
+  return(0);
+}
+/*endproc*/
+
+/*============================================================================*/
+
+
+/*============================================================================*/
+/* RCS-ID */
+
+  static char
+  rcs_id_h[] = MACH64FB_H_ID;
+
+  static char
+  rcs_id_regs_h[] = MACH64REGS_H_ID;
+
+  static char
+  rcs_id_c[] =
+    "@(#) Linux-m68k: 1997 11 21 17:13:00 BHA: mach64fb.c ";
+
+/*                                        ^^^                         */
+/* Please update this & put your initials here on every modification. */
+/* It can be checked with '  strings vmlinux | grep "@(#) "  '        */
+/*============================================================================*/
diff -u --recursive --exclude-from=/home/geert/diff-excludes-linux --new-file m68k-2.1.64/drivers/video/mach64fb.h m68k-newfb/drivers/video/mach64fb.h
--- m68k-2.1.64/drivers/video/mach64fb.h	Thu Jan  1 01:00:00 1970
+++ m68k-newfb/drivers/video/mach64fb.h	Fri Nov 21 17:11:03 1997
@@ -0,0 +1,49 @@
+
+
+#ifndef _MACH64FB_H_LOADED_
+#define _MACH64FB_H_LOADED_
+
+
+   /*
+    *    Accelerated Functions used by the low level console driver
+    */
+
+void Mach64_WaitQueue(u_short fifo);
+
+void Mach64_WaitBlit(void);
+
+void 
+Mach64_BitBLT(
+  int srcx,
+  int srcy,
+  int destx,
+  int desty,
+  u_int width,
+  u_int height,
+  u_short mode);
+
+
+void 
+Mach64_RectFill(
+  int     xpos,
+  int     ypos,
+  u_int   width,
+  u_int   height,
+  u_int   mode,
+  u_int   fcolor);
+
+void Mach64_MoveCursor(u_short xpos, u_short ypos);
+
+
+/*============================================================================*/
+/* RCS-ID */
+
+#define MACH64FB_H_ID \
+  "@(#) Linux-m68k: 1997 11 21 17:12:18 BHA: mach64fb.h "
+
+/*                                      ^^^                           */
+/* Please update this & put your initials here on every modification. */
+/* It can be checked with '  strings vmlinux | grep "@(#) "  '        */
+/*============================================================================*/
+
+#endif /* _MACH64FB_H_LOADED_ */
diff -u --recursive --exclude-from=/home/geert/diff-excludes-linux --new-file m68k-2.1.64/drivers/video/mach64regs.h m68k-newfb/drivers/video/mach64regs.h
--- m68k-2.1.64/drivers/video/mach64regs.h	Thu Jan  1 01:00:00 1970
+++ m68k-newfb/drivers/video/mach64regs.h	Fri Nov 21 17:10:33 1997
@@ -0,0 +1,703 @@
+/* $Id: mach64regs.h,v 1.3 1997/11/19 18:09:00 ecd Exp $
+ * mach64regs.h: ISA/Ultra/PCI mach64 driver constants etc.
+ *
+ * Copyright 1997 David S. Miller (davem@caip.rutgers.edu)
+ *              & Bernd Harries   (harries@atlas.de)
+ *
+ *  This is the file to be included by mach64 drivers.
+ *  Files using the interfaces of the mach64fb driver 
+ *  (functions & IOCTL options) include mach64fb.h.
+ */
+
+
+#ifndef MACH64REGS_H
+#define MACH64REGS_H
+
+struct mach64_info {
+	unsigned int color_mode;
+	unsigned int flags;
+	unsigned int total_vram;
+};
+
+/* The mach64_info flag bits. */
+#define MACH64_MASK_VT	0x00000001
+
+
+/* NON-GUI IO MAPPED Registers */
+
+extern unsigned ioCONFIG_CHIP_ID;
+extern unsigned ioCONFIG_CNTL;
+extern unsigned ioSCRATCH_REG0;
+extern unsigned ioSCRATCH_REG1;
+extern unsigned ioCONFIG_STAT0;
+extern unsigned ioMEM_CNTL;
+extern unsigned ioDAC_REGS;
+extern unsigned ioDAC_CNTL;
+extern unsigned ioGEN_TEST_CNTL;
+extern unsigned ioCLOCK_CNTL;
+extern unsigned ioCRTC_GEN_CNTL;
+
+/* NON-GUI sparse IO register offsets */
+
+#define sioCONFIG_CHIP_ID       0x1B
+#define sioCONFIG_CNTL          0x1A
+#define sioSCRATCH_REG0         0x10
+#define sioSCRATCH_REG1         0x11
+#define sioCONFIG_STAT0         0x1C
+#define sioMEM_CNTL             0x14
+#define sioDAC_REGS             0x17
+#define sioDAC_CNTL             0x18
+#define sioGEN_TEST_CNTL        0x19
+#define sioCLOCK_CNTL           0x12
+#define sioCRTC_GEN_CNTL        0x07
+
+/* NON-GUI MEMORY MAPPED Registers - expressed in BYTE offsets */
+
+#define CRTC_H_TOTAL_DISP       0x0000  /* Dword offset 00 */
+#define CRTC_H_SYNC_STRT_WID    0x0004  /* Dword offset 01 */
+#define CRTC_H_SYNC_STRT        0x0004
+#define CRTC_H_SYNC_DLY         0x0005
+#define CRTC_H_SYNC_WID         0x0006
+
+#define CRTC_V_TOTAL_DISP       0x0008  /* Dword offset 02 */
+#define CRTC_V_TOTAL            0x0008
+#define CRTC_V_DISP             0x000A
+#define CRTC_V_SYNC_STRT_WID    0x000C  /* Dword offset 03 */
+#define CRTC_V_SYNC_STRT        0x000C
+#define CRTC_V_SYNC_WID         0x000E
+
+#define CRTC_VLINE_CRNT_VLINE   0x0010  /* Dword offset 04 */
+#define CRTC_OFF_PITCH          0x0014  /* Dword offset 05 */
+#define CRTC_INT_CNTL           0x0018  /* Dword offset 06 */
+#define CRTC_GEN_CNTL           0x001C  /* Dword offset 07 */
+
+#define OVR_CLR                 0x0040  /* Dword offset 10 */
+#define OVR_WID_LEFT_RIGHT      0x0044  /* Dword offset 11 */
+#define OVR_WID_TOP_BOTTOM      0x0048  /* Dword offset 12 */
+
+#define CUR_CLR0                0x0060  /* Dword offset 18 */
+#define CUR_CLR1                0x0064  /* Dword offset 19 */
+#define CUR_OFFSET              0x0068  /* Dword offset 1A */
+#define CUR_HORZ_VERT_POSN      0x006C  /* Dword offset 1B */
+#define CRTC_PIX_WIDTH          0x001D
+#define CRTC_FIFO               0x001E
+#define CRTC_EXT_DISP           0x001F
+
+#define CUR_HORZ_VERT_OFF       0x0070  /* Dword offset 1C */
+
+#define SCRATCH_REG0            0x0080  /* Dword offset 20 */
+#define SCRATCH_REG1            0x0084  /* Dword offset 21 */
+
+#define CLOCK_CNTL              0x0090  /* Dword offset 24 */
+
+#define BUS_CNTL                0x00A0  /* Dword offset 28 */
+
+#define MEM_CNTL                0x00B0  /* Dword offset 2C */
+
+#define MEM_VGA_WP_SEL          0x00B4  /* Dword offset 2D */
+#define MEM_VGA_RP_SEL          0x00B8  /* Dword offset 2E */
+
+#define DAC_REGS                0x00C0  /* Dword offset 30 */
+#define DAC_W_INDEX             0x00C0  /* Dword offset 30 */
+#define DAC_DATA                0x00C1  /* Dword offset 30 */
+#define DAC_MASK                0x00C2  /* Dword offset 30 */
+#define DAC_R_INDEX             0x00C3  /* Dword offset 30 */
+#define DAC_CNTL                0x00C4  /* Dword offset 31 */
+
+#define GEN_TEST_CNTL           0x00D0  /* Dword offset 34 */
+
+#define CONFIG_CNTL             0x00DC  /* Dword offset 37 (CT, ET, VT) */
+#define CONFIG_CHIP_ID          0x00E0  /* Dword offset 38 */
+#define CONFIG_STAT0            0x00E4  /* Dword offset 39 */
+#define CONFIG_STAT1            0x00E8  /* Dword offset 3A */
+
+
+/* GUI MEMORY MAPPED Registers */
+
+#define DST_OFF_PITCH           0x0100  /* Dword offset 40 */
+#define DST_X                   0x0104  /* Dword offset 41 */
+#define DST_Y                   0x0108  /* Dword offset 42 */
+#define DST_Y_X                 0x010C  /* Dword offset 43 */
+#define DST_WIDTH               0x0110  /* Dword offset 44 */
+#define DST_HEIGHT              0x0114  /* Dword offset 45 */
+#define DST_HEIGHT_WIDTH        0x0118  /* Dword offset 46 */
+#define DST_X_WIDTH             0x011C  /* Dword offset 47 */
+#define DST_BRES_LNTH           0x0120  /* Dword offset 48 */
+#define DST_BRES_ERR            0x0124  /* Dword offset 49 */
+#define DST_BRES_INC            0x0128  /* Dword offset 4A */
+#define DST_BRES_DEC            0x012C  /* Dword offset 4B */
+#define DST_CNTL                0x0130  /* Dword offset 4C */
+
+#define SRC_OFF_PITCH           0x0180  /* Dword offset 60 */
+#define SRC_X                   0x0184  /* Dword offset 61 */
+#define SRC_Y                   0x0188  /* Dword offset 62 */
+#define SRC_Y_X                 0x018C  /* Dword offset 63 */
+#define SRC_WIDTH1              0x0190  /* Dword offset 64 */
+#define SRC_HEIGHT1             0x0194  /* Dword offset 65 */
+#define SRC_HEIGHT1_WIDTH1      0x0198  /* Dword offset 66 */
+#define SRC_X_START             0x019C  /* Dword offset 67 */
+#define SRC_Y_START             0x01A0  /* Dword offset 68 */
+#define SRC_Y_X_START           0x01A4  /* Dword offset 69 */
+#define SRC_WIDTH2              0x01A8  /* Dword offset 6A */
+#define SRC_HEIGHT2             0x01AC  /* Dword offset 6B */
+#define SRC_HEIGHT2_WIDTH2      0x01B0  /* Dword offset 6C */
+#define SRC_CNTL                0x01B4  /* Dword offset 6D */
+
+#define HOST_DATA0              0x0200  /* Dword offset 80 */
+#define HOST_DATA1              0x0204  /* Dword offset 81 */
+#define HOST_DATA2              0x0208  /* Dword offset 82 */
+#define HOST_DATA3              0x020C  /* Dword offset 83 */
+#define HOST_DATA4              0x0210  /* Dword offset 84 */
+#define HOST_DATA5              0x0214  /* Dword offset 85 */
+#define HOST_DATA6              0x0218  /* Dword offset 86 */
+#define HOST_DATA7              0x021C  /* Dword offset 87 */
+#define HOST_DATA8              0x0220  /* Dword offset 88 */
+#define HOST_DATA9              0x0224  /* Dword offset 89 */
+#define HOST_DATAA              0x0228  /* Dword offset 8A */
+#define HOST_DATAB              0x022C  /* Dword offset 8B */
+#define HOST_DATAC              0x0230  /* Dword offset 8C */
+#define HOST_DATAD              0x0234  /* Dword offset 8D */
+#define HOST_DATAE              0x0238  /* Dword offset 8E */
+#define HOST_DATAF              0x023C  /* Dword offset 8F */
+#define HOST_CNTL               0x0240  /* Dword offset 90 */
+
+#define PAT_REG0                0x0280  /* Dword offset A0 */
+#define PAT_REG1                0x0284  /* Dword offset A1 */
+#define PAT_CNTL                0x0288  /* Dword offset A2 */
+
+#define SC_LEFT                 0x02A0  /* Dword offset A8 */
+#define SC_RIGHT                0x02A4  /* Dword offset A9 */
+#define SC_LEFT_RIGHT           0x02A8  /* Dword offset AA */
+#define SC_TOP                  0x02AC  /* Dword offset AB */
+#define SC_BOTTOM               0x02B0  /* Dword offset AC */
+#define SC_TOP_BOTTOM           0x02B4  /* Dword offset AD */
+
+#define DP_BKGD_CLR             0x02C0  /* Dword offset B0 */
+#define DP_FRGD_CLR             0x02C4  /* Dword offset B1 */
+#define DP_WRITE_MASK           0x02C8  /* Dword offset B2 */
+#define DP_CHAIN_MASK           0x02CC  /* Dword offset B3 */
+#define DP_PIX_WIDTH            0x02D0  /* Dword offset B4 */
+#define DP_MIX                  0x02D4  /* Dword offset B5 */
+#define DP_SRC                  0x02D8  /* Dword offset B6 */
+
+#define CLR_CMP_CLR             0x0300  /* Dword offset C0 */
+#define CLR_CMP_MASK            0x0304  /* Dword offset C1 */
+#define CLR_CMP_CNTL            0x0308  /* Dword offset C2 */
+
+#define FIFO_STAT               0x0310  /* Dword offset C4 */
+
+#define CONTEXT_MASK            0x0320  /* Dword offset C8 */
+#define CONTEXT_LOAD_CNTL       0x032C  /* Dword offset CB */
+
+#define GUI_TRAJ_CNTL           0x0330  /* Dword offset CC */
+#define GUI_STAT                0x0338  /* Dword offset CE */
+
+
+/* CRTC control values */
+
+#define CRTC_H_SYNC_NEG         0x00200000
+#define CRTC_V_SYNC_NEG         0x00200000
+
+#define CRTC_DBL_SCAN_EN        0x00000001
+#define CRTC_INTERLACE_EN       0x00000002
+#define CRTC_HSYNC_DIS          0x00000004
+#define CRTC_VSYNC_DIS          0x00000008
+#define CRTC_CSYNC_EN           0x00000010
+#define CRTC_PIX_BY_2_EN        0x00000020
+
+#define CRTC_PIX_WIDTH          0x00000700
+#define CRTC_PIX_WIDTH_4BPP     0x00000100
+#define CRTC_PIX_WIDTH_8BPP     0x00000200
+#define CRTC_PIX_WIDTH_15BPP    0x00000300
+#define CRTC_PIX_WIDTH_16BPP    0x00000400
+#define CRTC_PIX_WIDTH_24BPP    0x00000500
+#define CRTC_PIX_WIDTH_32BPP    0x00000600
+
+#define CRTC_BYTE_PIX_ORDER     0x00000800
+#define CRTC_PIX_ORDER_MSN_LSN  0x00000000
+#define CRTC_PIX_ORDER_LSN_MSN  0x00000800
+
+#define CRTC_FIFO_LWM           0x000f0000
+#define CRTC_EXT_DISP_EN        0x01000000
+#define CRTC_EXT_EN             0x02000000
+
+#define CRTC_CRNT_VLINE         0x07f00000
+#define CRTC_VBLANK             0x00000001
+
+/* DAC control values */
+
+#define DAC_EXT_SEL_RS2         0x01
+#define DAC_EXT_SEL_RS3         0x02
+#define DAC_8BIT_EN             0x00000100
+#define DAC_PIX_DLY_MASK        0x00000600
+#define DAC_PIX_DLY_0NS         0x00000000
+#define DAC_PIX_DLY_2NS         0x00000200
+#define DAC_PIX_DLY_4NS         0x00000400
+#define DAC_BLANK_ADJ_MASK      0x00001800
+#define DAC_BLANK_ADJ_0         0x00000000
+#define DAC_BLANK_ADJ_1         0x00000800
+#define DAC_BLANK_ADJ_2         0x00001000
+
+
+/* Mix control values */
+
+#define MIX_NOT_DST             0x0000
+#define MIX_0                   0x0001
+#define MIX_1                   0x0002
+#define MIX_DST                 0x0003
+#define MIX_NOT_SRC             0x0004
+#define MIX_XOR                 0x0005
+#define MIX_XNOR                0x0006
+#define MIX_SRC                 0x0007
+#define MIX_NAND                0x0008
+#define MIX_NOT_SRC_OR_DST      0x0009
+#define MIX_SRC_OR_NOT_DST      0x000a
+#define MIX_OR                  0x000b
+#define MIX_AND                 0x000c
+#define MIX_SRC_AND_NOT_DST     0x000d
+#define MIX_NOT_SRC_AND_DST     0x000e
+#define MIX_NOR                 0x000f
+
+/* Maximum engine dimensions */
+#define ENGINE_MIN_X            0
+#define ENGINE_MIN_Y            0
+#define ENGINE_MAX_X            4095
+#define ENGINE_MAX_Y            16383
+
+/* Mach64 engine bit constants - these are typically ORed together */
+
+/* BUS_CNTL register constants */
+#define BUS_FIFO_ERR_ACK        0x00200000
+#define BUS_HOST_ERR_ACK        0x00800000
+
+/* GEN_TEST_CNTL register constants */
+#define GEN_OVR_OUTPUT_EN       0x20
+#define HWCURSOR_ENABLE         0x80
+#define GUI_ENGINE_ENABLE       0x100
+#define BLOCK_WRITE_ENABLE      0x200
+
+/* CLOCK_CNTL register constants */
+#define CLOCK_SEL               0x0f
+#define CLOCK_DIV               0x30
+#define CLOCK_DIV1              0x00
+#define CLOCK_DIV2              0x10
+#define CLOCK_DIV4              0x20
+#define CLOCK_STROBE            0x40
+#define PLL_WR_EN               0x02
+
+/* PLL registers */
+#define PLL_MACRO_CNTL          0x01
+#define PLL_REF_DIV             0x02
+#define PLL_GEN_CNTL            0x03
+#define MCLK_FB_DIV             0x04
+#define PLL_VCLK_CNTL           0x05
+#define VCLK_POST_DIV           0x06
+#define VCLK0_FB_DIV            0x07
+#define VCLK1_FB_DIV            0x08
+#define VCLK2_FB_DIV            0x09
+#define VCLK3_FB_DIV            0x0A
+#define PLL_XCLK_CNTL           0x0B
+#define PLL_TEST_CTRL           0x0E
+#define PLL_TEST_COUNT          0x0F
+
+/* Fields in PLL registers */
+#define PLL_PC_GAIN             0x07
+#define PLL_VC_GAIN             0x18
+#define PLL_DUTY_CYC            0xE0
+#define PLL_OVERRIDE            0x01
+#define PLL_MCLK_RST            0x02
+#define OSC_EN                  0x04
+#define EXT_CLK_EN              0x08
+#define MCLK_SRC_SEL            0x70
+#define EXT_CLK_CNTL            0x80
+#define VCLK_SRC_SEL            0x03
+#define PLL_VCLK_RST            0x04
+#define VCLK_INVERT             0x08
+#define VCLK0_POST              0x03
+#define VCLK1_POST              0x0C
+#define VCLK2_POST              0x30
+#define VCLK3_POST              0xC0
+
+/* CONFIG_CNTL register constants */
+#define APERTURE_4M_ENABLE      1
+#define APERTURE_8M_ENABLE      2
+#define VGA_APERTURE_ENABLE     4
+
+/* CONFIG_STAT0 register constants (GX, CX) */
+#define CFG_BUS_TYPE            0x00000007
+#define CFG_MEM_TYPE            0x00000038
+#define CFG_INIT_DAC_TYPE       0x00000e00
+
+/* CONFIG_STAT0 register constants (CT, ET, VT) */
+#define CFG_MEM_TYPE_xT         0x00000007
+
+#define ISA                     0
+#define EISA                    1
+#define LOCAL_BUS               6
+#define PCI                     7
+
+/* Memory types for GX, CX */
+#define DRAMx4                  0
+#define VRAMx16                 1
+#define VRAMx16ssr              2
+#define DRAMx16                 3
+#define GraphicsDRAMx16         4
+#define EnhancedVRAMx16         5
+#define EnhancedVRAMx16ssr      6
+
+/* Memory types for CT, ET, VT, GT */
+#define DRAM                    0
+#define EDO_DRAM                1
+#define PSEUDO_EDO              2
+#define SDRAM                   3
+
+#define DAC_INTERNAL            0x00
+#define DAC_IBMRGB514           0x01
+#define DAC_ATI68875            0x02
+#define DAC_TVP3026_A           0x72
+#define DAC_BT476               0x03
+#define DAC_BT481               0x04
+#define DAC_ATT20C491           0x14
+#define DAC_SC15026             0x24
+#define DAC_MU9C1880            0x34
+#define DAC_IMSG174             0x44
+#define DAC_ATI68860_B          0x05
+#define DAC_ATI68860_C          0x15
+#define DAC_TVP3026_B           0x75
+#define DAC_STG1700             0x06
+#define DAC_ATT498              0x16
+#define DAC_STG1702             0x07
+#define DAC_SC15021             0x17
+#define DAC_ATT21C498           0x27
+#define DAC_STG1703             0x37
+#define DAC_CH8398              0x47
+#define DAC_ATT20C408           0x57
+
+#define CLK_ATI18818_0          0
+#define CLK_ATI18818_1          1
+#define CLK_STG1703             2
+#define CLK_CH8398              3
+#define CLK_INTERNAL            4
+#define CLK_ATT20C408           5
+#define CLK_IBMRGB514           6
+
+/* MEM_CNTL register constants */
+#define MEM_SIZE_ALIAS          0x00000007
+#define MEM_SIZE_512K           0x00000000
+#define MEM_SIZE_1M             0x00000001
+#define MEM_SIZE_2M             0x00000002
+#define MEM_SIZE_4M             0x00000003
+#define MEM_SIZE_6M             0x00000004
+#define MEM_SIZE_8M             0x00000005
+#define MEM_SIZE_ALIAS_GTB      0x0000000F
+#define MEM_SIZE_2M_GTB         0x00000003
+#define MEM_SIZE_4M_GTB         0x00000007
+#define MEM_SIZE_6M_GTB         0x00000009
+#define MEM_SIZE_8M_GTB         0x0000000B
+#define MEM_BNDRY               0x00030000
+#define MEM_BNDRY_0K            0x00000000
+#define MEM_BNDRY_256K          0x00010000
+#define MEM_BNDRY_512K          0x00020000
+#define MEM_BNDRY_1M            0x00030000
+#define MEM_BNDRY_EN            0x00040000
+
+/* ATI PCI constants */
+#define PCI_ATI_VENDOR_ID       0x1002
+#define PCI_MACH64_GX           0x4758
+#define PCI_MACH64_CX           0x4358
+#define PCI_MACH64_CT           0x4354
+#define PCI_MACH64_ET           0x4554
+#define PCI_MACH64_VT           0x5654
+#define PCI_MACH64_GT           0x4754
+
+/* CONFIG_CHIP_ID register constants */
+#define CFG_CHIP_TYPE           0x0000FFFF
+#define CFG_CHIP_CLASS          0x00FF0000
+#define CFG_CHIP_REV            0xFF000000
+#define CFG_CHIP_VERSION        0x07000000
+#define CFG_CHIP_FOUNDRY        0x38000000
+#define CFG_CHIP_REVISION       0xC0000000
+
+/* Chip IDs read from CONFIG_CHIP_ID */
+#define MACH64_GX_ID            0xD7
+#define MACH64_CX_ID            0x57
+#define MACH64_CT_ID            0x4354
+#define MACH64_ET_ID            0x4554
+#define MACH64_VT_ID            0x5654
+#define MACH64_GT_ID            0x4754
+
+/* Mach64 chip types */
+#define MACH64_UNKNOWN	0
+#define MACH64_GX	1
+#define MACH64_CX	2
+#define MACH64_CT	3
+#define MACH64_ET	4
+#define MACH64_VT	5
+#define MACH64_GT	6
+
+/* DST_CNTL register constants */
+#define DST_X_RIGHT_TO_LEFT     0
+#define DST_X_LEFT_TO_RIGHT     1
+#define DST_Y_BOTTOM_TO_TOP     0
+#define DST_Y_TOP_TO_BOTTOM     2
+#define DST_X_MAJOR             0
+#define DST_Y_MAJOR             4
+#define DST_X_TILE              8
+#define DST_Y_TILE              0x10
+#define DST_LAST_PEL            0x20
+#define DST_POLYGON_ENABLE      0x40
+#define DST_24_ROTATION_ENABLE  0x80
+
+/* SRC_CNTL register constants */
+#define SRC_PATTERN_ENABLE      1
+#define SRC_ROTATION_ENABLE     2
+#define SRC_LINEAR_ENABLE       4
+#define SRC_BYTE_ALIGN          8
+#define SRC_LINE_X_RIGHT_TO_LEFT 0
+#define SRC_LINE_X_LEFT_TO_RIGHT 0x10
+
+/* HOST_CNTL register constants */
+#define HOST_BYTE_ALIGN         1
+
+/* GUI_TRAJ_CNTL register constants */
+#define PAT_MONO_8x8_ENABLE     0x01000000
+#define PAT_CLR_4x2_ENABLE      0x02000000
+#define PAT_CLR_8x1_ENABLE      0x04000000
+
+/* DP_CHAIN_MASK register constants */
+#define DP_CHAIN_4BPP	0x8888
+#define DP_CHAIN_7BPP	0xD2D2
+#define DP_CHAIN_8BPP	0x8080
+#define DP_CHAIN_8BPP_RGB	0x9292
+#define DP_CHAIN_15BPP	0x4210
+#define DP_CHAIN_16BPP	0x8410
+#define DP_CHAIN_24BPP	0x8080
+#define DP_CHAIN_32BPP	0x8080
+
+/* DP_PIX_WIDTH register constants */
+#define DST_1BPP                0
+#define DST_4BPP                1
+#define DST_8BPP                2
+#define DST_15BPP               3
+#define DST_16BPP               4
+#define DST_32BPP               6
+#define SRC_1BPP                0
+#define SRC_4BPP                0x100
+#define SRC_8BPP                0x200
+#define SRC_15BPP               0x300
+#define SRC_16BPP               0x400
+#define SRC_32BPP               0x600
+#define HOST_1BPP               0
+#define HOST_4BPP               0x10000
+#define HOST_8BPP               0x20000
+#define HOST_15BPP              0x30000
+#define HOST_16BPP              0x40000
+#define HOST_32BPP              0x60000
+#define BYTE_ORDER_MSB_TO_LSB   0
+#define BYTE_ORDER_LSB_TO_MSB   0x1000000
+
+/* DP_MIX register constants */
+#define BKGD_MIX_NOT_D              0
+#define BKGD_MIX_ZERO               1
+#define BKGD_MIX_ONE                2
+#define BKGD_MIX_D                  3
+#define BKGD_MIX_NOT_S              4
+#define BKGD_MIX_D_XOR_S            5
+#define BKGD_MIX_NOT_D_XOR_S        6
+#define BKGD_MIX_S                  7
+#define BKGD_MIX_NOT_D_OR_NOT_S     8
+#define BKGD_MIX_D_OR_NOT_S         9
+#define BKGD_MIX_NOT_D_OR_S         10
+#define BKGD_MIX_D_OR_S             11
+#define BKGD_MIX_D_AND_S            12
+#define BKGD_MIX_NOT_D_AND_S        13
+#define BKGD_MIX_D_AND_NOT_S        14
+#define BKGD_MIX_NOT_D_AND_NOT_S    15
+#define BKGD_MIX_D_PLUS_S_DIV2      0x17
+#define FRGD_MIX_NOT_D              0
+#define FRGD_MIX_ZERO               0x10000
+#define FRGD_MIX_ONE                0x20000
+#define FRGD_MIX_D                  0x30000
+#define FRGD_MIX_NOT_S              0x40000
+#define FRGD_MIX_D_XOR_S            0x50000
+#define FRGD_MIX_NOT_D_XOR_S        0x60000
+#define FRGD_MIX_S                  0x70000
+#define FRGD_MIX_NOT_D_OR_NOT_S     0x80000
+#define FRGD_MIX_D_OR_NOT_S         0x90000
+#define FRGD_MIX_NOT_D_OR_S         0xa0000
+#define FRGD_MIX_D_OR_S             0xb0000
+#define FRGD_MIX_D_AND_S            0xc0000
+#define FRGD_MIX_NOT_D_AND_S        0xd0000
+#define FRGD_MIX_D_AND_NOT_S        0xe0000
+#define FRGD_MIX_NOT_D_AND_NOT_S    0xf0000
+#define FRGD_MIX_D_PLUS_S_DIV2      0x170000
+
+/* DP_SRC register constants */
+#define BKGD_SRC_BKGD_CLR           0
+#define BKGD_SRC_FRGD_CLR           1
+#define BKGD_SRC_HOST               2
+#define BKGD_SRC_BLIT               3
+#define BKGD_SRC_PATTERN            4
+#define FRGD_SRC_BKGD_CLR           0
+#define FRGD_SRC_FRGD_CLR           0x100
+#define FRGD_SRC_HOST               0x200
+#define FRGD_SRC_BLIT               0x300
+#define FRGD_SRC_PATTERN            0x400
+#define MONO_SRC_ONE                0
+#define MONO_SRC_PATTERN            0x10000
+#define MONO_SRC_HOST               0x20000
+#define MONO_SRC_BLIT               0x30000
+
+/* CLR_CMP_CNTL register constants */
+#define COMPARE_FALSE               0
+#define COMPARE_TRUE                1
+#define COMPARE_NOT_EQUAL           4
+#define COMPARE_EQUAL               5
+#define COMPARE_DESTINATION         0
+#define COMPARE_SOURCE              0x1000000
+
+/* FIFO_STAT register constants */
+#define FIFO_ERR                    0x80000000
+
+/* CONTEXT_LOAD_CNTL constants */
+#define CONTEXT_NO_LOAD             0
+#define CONTEXT_LOAD                0x10000
+#define CONTEXT_LOAD_AND_DO_FILL    0x20000
+#define CONTEXT_LOAD_AND_DO_LINE    0x30000
+#define CONTEXT_EXECUTE             0
+#define CONTEXT_CMD_DISABLE         0x80000000
+
+/* GUI_STAT register constants */
+#define ENGINE_IDLE                 0
+#define ENGINE_BUSY                 1
+#define SCISSOR_LEFT_FLAG           0x10
+#define SCISSOR_RIGHT_FLAG          0x20
+#define SCISSOR_TOP_FLAG            0x40
+#define SCISSOR_BOTTOM_FLAG         0x80
+
+/* ATI VGA Extended Regsiters */
+#define sioATIEXT	0x1ce
+#define bioATIEXT	0x3ce
+extern unsigned ATIExtReg;
+#define ATI2E		0xae
+#define ATI32		0xb2
+#define ATI36		0xb6
+
+/* VGA Graphics Controller Registers */
+#define VGAGRA		0x3ce
+#define GRA06		0x06
+
+/* VGA Seququencer Registers */
+#define VGASEQ		0x3c4
+#define SEQ02		0x02
+#define SEQ04		0x04
+
+#define MACH64_MAX_X	ENGINE_MAX_X
+#define MACH64_MAX_Y	ENGINE_MAX_Y
+
+#define INC_X                   0x0020
+#define INC_Y                   0x0080
+
+#define RGB16_555               0x0000
+#define RGB16_565               0x0040
+#define RGB16_655               0x0080
+#define RGB16_664               0x00c0
+
+#define POLY_TEXT_TYPE          0x0001
+#define IMAGE_TEXT_TYPE         0x0002
+#define TEXT_TYPE_8_BIT         0x0004
+#define TEXT_TYPE_16_BIT        0x0008
+#define POLY_TEXT_TYPE_8        (POLY_TEXT_TYPE | TEXT_TYPE_8_BIT)
+#define IMAGE_TEXT_TYPE_8       (IMAGE_TEXT_TYPE | TEXT_TYPE_8_BIT)
+#define POLY_TEXT_TYPE_16       (POLY_TEXT_TYPE | TEXT_TYPE_16_BIT)
+#define IMAGE_TEXT_TYPE_16      (IMAGE_TEXT_TYPE | TEXT_TYPE_16_BIT)
+
+#define MACH64_NUM_CLOCKS	16
+#define MACH64_NUM_FREQS	50
+
+/*============================================================================*/
+
+typedef struct
+{
+    unsigned char h_disp;
+    unsigned char dacmask;
+    unsigned char ram_req;
+    unsigned char max_dot_clock;
+    unsigned char color_depth;
+}
+mach64FreqRec;
+
+typedef struct
+{
+    unsigned char r, g, b;
+}
+LUTENTRY;
+
+typedef struct
+{
+    unsigned long h_total_disp, h_sync_strt_wid;
+    unsigned long v_total_disp, v_sync_strt_wid;
+    unsigned long crtc_gen_cntl;
+    unsigned long color_depth;
+    unsigned long clock_cntl;
+    unsigned long dot_clock;
+    unsigned long fifo_v1;
+}
+mach64CRTCRegRec, * mach64CRTCRegPtr;
+
+
+/* Wait until "v" queue entries are free */
+#define WaitQueue(v)  \
+{ \
+  int   __cntr = 0;      \
+  while((regr(FIFO_STAT) & 0xFFFF) > ((unsigned short)(0x8000 >> (v))))  \
+  { \
+    if(__cntr++ > 500000)    \
+    { \
+      Eprint(" Timeout Waiting for FIFO. \n"); \
+    } \
+  } \
+}
+
+/* Wait until GP is idle and queue is empty */
+#define WaitIdleEmpty() \
+{  \
+  int   __cntr = 0;      \
+  WaitQueue(16); \
+  while ((regr(GUI_STAT) & 1) != 0) \
+  { \
+    if(__cntr++ > 500000)    \
+    { \
+      Eprint(" Timeout Waiting for BLT engine. \n"); \
+    } \
+  } \
+}
+
+#define SKIP_2(_v) ((((_v)<<1)&0xFFF8)|((_v)&0x3)|(((_v)&0x80)>>5))
+
+#define MACH64_BIT_BLT(_srcx, _srcy, _dstx, _dsty, _w, _h, _dir) \
+{ \
+  WaitQueue(5); \
+  regw(SRC_Y_X, (((_srcx) << 16) | ((_srcy) & 0x0000FFFF))); \
+  regw(SRC_WIDTH1, (_w)); \
+  regw(DST_CNTL, (_dir)); \
+  regw(DST_Y_X, (((_dstx) << 16) | ((_dsty) & 0x0000FFFF))); \
+  regw(DST_HEIGHT_WIDTH, (((_w) << 16) | ((_h) & 0x0000FFFF))); \
+}
+
+#ifndef NULL
+#define NULL    0
+#endif
+
+/*============================================================================*/
+/* RCS-ID */
+
+#define MACH64REGS_H_ID \
+  "@(#) Linux-m68k: 1997 11 21 17:00:18 BHA: mach64regs.h "
+
+/*                                      ^^^                           */
+/* Please update this & put your initials here on every modification. */
+/* It can be checked with '  strings vmlinux | grep "@(#) "  '        */
+/*============================================================================*/
+
+#endif /* MACH64REGS_H */
diff -u --recursive --exclude-from=/home/geert/diff-excludes-linux --new-file m68k-2.1.64/drivers/video/offb.c m68k-newfb/drivers/video/offb.c
--- m68k-2.1.64/drivers/video/offb.c	Sun Nov 23 23:33:09 1997
+++ m68k-newfb/drivers/video/offb.c	Wed Dec 10 07:29:47 1997
@@ -23,6 +23,7 @@
 #include <linux/delay.h>
 #include <linux/interrupt.h>
 #include <linux/fb.h>
+#include <linux/selection.h>
 #include <linux/init.h>
 #include <asm/io.h>
 #include <asm/prom.h>
@@ -34,12 +35,11 @@
 static struct display disp;
 static struct fb_info fb_info;
 static struct { u_char red, green, blue, pad; } palette[256];
-static char offb_name[16] = "OFfb ";
 
 static volatile unsigned char *unknown_cmap_adr = NULL;
 static volatile unsigned char *unknown_cmap_data = NULL;
 
-static struct fb_fix_screeninfo fb_fix = { 0, };
+static struct fb_fix_screeninfo fb_fix = { { "OFfb ", } };
 static struct fb_var_screeninfo fb_var = { 0, };
 
 
@@ -47,18 +47,16 @@
      *  Interface used by the world
      */
 
-void offb_video_setup(char *options, int *ints);
-
 static int offb_open(int fbidx);
 static int offb_release(int fbidx);
-static int offb_get_fix(struct fb_fix_screeninfo *fix, int con);
-static int offb_get_var(struct fb_var_screeninfo *var, int con);
-static int offb_set_var(struct fb_var_screeninfo *var, int con);
-static int offb_pan_display(struct fb_var_screeninfo *var, int con);
-static int offb_get_cmap(struct fb_cmap *cmap, int kspc, int con);
-static int offb_set_cmap(struct fb_cmap *cmap, int kspc, int con);
+static int offb_get_fix(struct fb_fix_screeninfo *fix, int con, int fbidx);
+static int offb_get_var(struct fb_var_screeninfo *var, int con, int fbidx);
+static int offb_set_var(struct fb_var_screeninfo *var, int con, int fbidx);
+static int offb_pan_display(struct fb_var_screeninfo *var, int con, int fbidx);
+static int offb_get_cmap(struct fb_cmap *cmap, int kspc, int con, int fbidx);
+static int offb_set_cmap(struct fb_cmap *cmap, int kspc, int con, int fbidx);
 static int offb_ioctl(struct inode *inode, struct file *file, u_int cmd,
-			    u_long arg, int con);
+			    u_long arg, int con, int fbidx);
 
 
     /*
@@ -69,7 +67,6 @@
 static int offbcon_switch(int con);
 static int offbcon_updatevar(int con);
 static void offbcon_blank(int blank);
-static int offbcon_setcmap(struct fb_cmap *cmap, int con);
 
 
     /*
@@ -114,7 +111,7 @@
      *  Get the Fixed Part of the Display
      */
 
-static int offb_get_fix(struct fb_fix_screeninfo *fix, int con)
+static int offb_get_fix(struct fb_fix_screeninfo *fix, int con, int fbidx)
 {
     memcpy(fix, &fb_fix, sizeof(fb_fix));
     return 0;
@@ -125,7 +122,7 @@
      *  Get the User Defined Part of the Display
      */
 
-static int offb_get_var(struct fb_var_screeninfo *var, int con)
+static int offb_get_var(struct fb_var_screeninfo *var, int con, int fbidx)
 {
     memcpy(var, &fb_var, sizeof(fb_var));
     return 0;
@@ -136,7 +133,7 @@
      *  Set the User Defined Part of the Display
      */
 
-static int offb_set_var(struct fb_var_screeninfo *var, int con)
+static int offb_set_var(struct fb_var_screeninfo *var, int con, int fbidx)
 {
     struct display *display;
     int oldbpp = -1, err;
@@ -174,7 +171,7 @@
      *  This call looks only at xoffset, yoffset and the FB_VMODE_YWRAP flag
      */
 
-static int offb_pan_display(struct fb_var_screeninfo *var, int con)
+static int offb_pan_display(struct fb_var_screeninfo *var, int con, int fbidx)
 {
     if (var->xoffset || var->yoffset)
 	return -EINVAL;
@@ -186,7 +183,7 @@
      *  Get the Colormap
      */
 
-static int offb_get_cmap(struct fb_cmap *cmap, int kspc, int con)
+static int offb_get_cmap(struct fb_cmap *cmap, int kspc, int con, int fbidx)
 {
     if (con == currcon) /* current console? */
 	return fb_get_cmap(cmap, &fb_display[con].var, kspc, offb_getcolreg);
@@ -202,7 +199,7 @@
      *  Set the Colormap
      */
 
-static int offb_set_cmap(struct fb_cmap *cmap, int kspc, int con)
+static int offb_set_cmap(struct fb_cmap *cmap, int kspc, int con, int fbidx)
 {
     int err;
 
@@ -223,7 +220,7 @@
 
 
 static int offb_ioctl(struct inode *inode, struct file *file, u_int cmd,
-		      u_long arg, int con)
+		      u_long arg, int con, int fbidx)
 {
     return -EINVAL;
 }
@@ -244,9 +241,8 @@
     if (!(dp = find_path_device(prom_display_path)))
 	return mem_start;
 
-    strncat(offb_name, dp->name, sizeof(offb_name));
-    offb_name[sizeof(offb_name)-1] = '\0';
-    strcpy(fb_fix.id, offb_name);
+    strncat(fb_fix.id, dp->name, sizeof(fb_fix.id));
+    fb_fix.id[sizeof(fb_fix.id)-1] = '\0';
 
     if ((pp = (int *)get_property(dp, "depth", &len)) != NULL
 	&& len == sizeof(int) && *pp != 8) {
@@ -335,13 +331,18 @@
     fb_info.switch_con = &offbcon_switch;
     fb_info.updatevar = &offbcon_updatevar;
     fb_info.blank = &offbcon_blank;
-    fb_info.setcmap = &offbcon_setcmap;
 
     err = register_framebuffer(&fb_info);
     if (err < 0)
 	return mem_start;
 
-    offb_set_var(&fb_var, -1);
+    for (i = 0; i < 16; i++) {
+	int j = color_table[i];
+	palette[i].red = default_red[j];
+	palette[i].green = default_grn[j];
+	palette[i].blue = default_blu[j];
+    }
+    offb_set_var(&fb_var, -1, GET_FB_IDX(fb_info.node));
 
     printk("Open Firmware frame buffer device on %s\n", dp->full_name);
     return mem_start;
@@ -379,16 +380,6 @@
 {
     /* Nothing */
 }
-
-    /*
-     *  Set the colormap
-     */
-
-static int offbcon_setcmap(struct fb_cmap *cmap, int con)
-{
-    return(offb_set_cmap(cmap, 1, con));
-}
-
 
     /*
      *  Read a single color register and split it into
diff -u --recursive --exclude-from=/home/geert/diff-excludes-linux --new-file m68k-2.1.64/drivers/video/retz3fb.c m68k-newfb/drivers/video/retz3fb.c
--- m68k-2.1.64/drivers/video/retz3fb.c	Mon Nov 17 22:00:36 1997
+++ m68k-newfb/drivers/video/retz3fb.c	Wed Dec 10 23:17:16 1997
@@ -54,7 +54,7 @@
 
 #define arraysize(x)    (sizeof(x)/sizeof(*(x)))
 
-struct retz3_fb_par {
+struct retz3fb_par {
 	int xres;
 	int yres;
 	int xres_vir;
@@ -93,7 +93,7 @@
 	long v_dispend;		/* Horizontal Display End */
 };
 
-static struct retz3_fb_par current_par;
+static struct retz3fb_par current_par;
 
 static int current_par_valid = 0;
 static int currcon = 0;
@@ -114,9 +114,9 @@
 
    /* Display Control */
 
-   int (*encode_fix)(struct fb_fix_screeninfo *fix, struct retz3_fb_par *par);
-   int (*decode_var)(struct fb_var_screeninfo *var, struct retz3_fb_par *par);
-   int (*encode_var)(struct fb_var_screeninfo *var, struct retz3_fb_par *par);
+   int (*encode_fix)(struct fb_fix_screeninfo *fix, struct retz3fb_par *par);
+   int (*decode_var)(struct fb_var_screeninfo *var, struct retz3fb_par *par);
+   int (*encode_var)(struct fb_var_screeninfo *var, struct retz3fb_par *par);
    int (*getcolreg)(unsigned int regno, unsigned int *red, unsigned
 		    int *green, unsigned int *blue, unsigned int *transp);
    int (*setcolreg)(unsigned int regno, unsigned int red, unsigned int
@@ -129,7 +129,7 @@
  *    Frame Buffer Name
  */
 
-static char retz3_fb_name[16] = "RetinaZ3";
+static char retz3fb_name[16] = "RetinaZ3";
 
 
 static unsigned char retz3_color_table [256][4];
@@ -143,7 +143,7 @@
  *    Predefined Video Mode Names
  */
 
-static char *retz3_fb_modenames[] = {
+static char *retz3fb_modenames[] = {
 
 	/*
 	 *    Autodetect (Default) Video Mode
@@ -220,7 +220,7 @@
  *    Predefined Video Mode Definitions
  */
 
-static struct fb_var_screeninfo retz3_fb_predefined[] = {
+static struct fb_var_screeninfo retz3fb_predefined[] = {
 
    /*
     *    Autodetect (Default) Video Mode
@@ -293,7 +293,7 @@
 };
 
 
-#define NUM_TOTAL_MODES    arraysize(retz3_fb_predefined)
+#define NUM_TOTAL_MODES    arraysize(retz3fb_predefined)
 #define NUM_PREDEF_MODES   5
 
 
@@ -305,29 +305,32 @@
  *    Interface used by the world
  */
 
-void retz3_video_setup(char *options, int *ints);
+void retz3fb_setup(char *options, int *ints);
 
-static int retz3_fb_open(int fbidx);
-static int retz3_fb_release(int fbidx);
-static int retz3_fb_get_fix(struct fb_fix_screeninfo *fix, int con);
-static int retz3_fb_get_var(struct fb_var_screeninfo *var, int con);
-static int retz3_fb_set_var(struct fb_var_screeninfo *var, int con);
-static int retz3_fb_get_cmap(struct fb_cmap *cmap, int kspc, int con);
-static int retz3_fb_set_cmap(struct fb_cmap *cmap, int kspc, int con);
-static int retz3_fb_pan_display(struct fb_var_screeninfo *var, int con);
-static int retz3_fb_ioctl(struct inode *inode, struct file *file,
-			  unsigned int cmd, unsigned long arg, int con);
+static int retz3fb_open(int fbidx);
+static int retz3fb_release(int fbidx);
+static int retz3fb_get_fix(struct fb_fix_screeninfo *fix, int con, int fbidx);
+static int retz3fb_get_var(struct fb_var_screeninfo *var, int con, int fbidx);
+static int retz3fb_set_var(struct fb_var_screeninfo *var, int con, int fbidx);
+static int retz3fb_get_cmap(struct fb_cmap *cmap, int kspc, int con,
+			     int fbidx);
+static int retz3fb_set_cmap(struct fb_cmap *cmap, int kspc, int con,
+			     int fbidx);
+static int retz3fb_pan_display(struct fb_var_screeninfo *var, int con,
+				int fbidx);
+static int retz3fb_ioctl(struct inode *inode, struct file *file,
+			  unsigned int cmd, unsigned long arg, int con,
+			  int fbidx);
 
 
 /*
  *    Interface to the low level console driver
  */
 
-unsigned long retz3_fb_init(unsigned long mem_start);
+unsigned long retz3fb_init(unsigned long mem_start);
 static int z3fb_switch(int con);
 static int z3fb_updatevar(int con);
 static void z3fb_blank(int blank);
-static int z3fb_setcmap(struct fb_cmap *cmap, int con);
 
 
 /*
@@ -349,11 +352,11 @@
 
 static int retz3_init(void);
 static int retz3_encode_fix(struct fb_fix_screeninfo *fix,
-                          struct retz3_fb_par *par);
+                          struct retz3fb_par *par);
 static int retz3_decode_var(struct fb_var_screeninfo *var,
-                          struct retz3_fb_par *par);
+                          struct retz3fb_par *par);
 static int retz3_encode_var(struct fb_var_screeninfo *var,
-                          struct retz3_fb_par *par);
+                          struct retz3fb_par *par);
 static int retz3_getcolreg(unsigned int regno, unsigned int *red,
 			   unsigned int *green, unsigned int *blue,
 			   unsigned int *transp);
@@ -367,12 +370,12 @@
  *    Internal routines
  */
 
-static void retz3_fb_get_par(struct retz3_fb_par *par);
-static void retz3_fb_set_par(struct retz3_fb_par *par);
+static void retz3fb_get_par(struct retz3fb_par *par);
+static void retz3fb_set_par(struct retz3fb_par *par);
 static int do_fb_set_var(struct fb_var_screeninfo *var, int isactive);
 static void do_install_cmap(int con);
 /*
-static void retz3_fb_set_disp(int con);
+static void retz3fb_set_disp(int con);
 */
 static int get_video_mode(const char *name);
 
@@ -424,7 +427,7 @@
 
 
 static int retz3_set_video(struct fb_var_screeninfo *var,
-			   struct retz3_fb_par *par)
+			   struct retz3fb_par *par)
 {
 	float freq_f;
 	long freq;
@@ -867,11 +870,11 @@
  */
 
 static int retz3_encode_fix(struct fb_fix_screeninfo *fix,
-			    struct retz3_fb_par *par)
+			    struct retz3fb_par *par)
 {
 	short i;
 
-	strcpy(fix->id, retz3_fb_name);
+	strcpy(fix->id, retz3fb_name);
 	fix->smem_start = (char *)z3_fbmem;
 	fix->smem_len = z3_size;
 	fix->mmio_start = (unsigned char *)z3_regs;
@@ -902,7 +905,7 @@
  */
 
 static int retz3_decode_var(struct fb_var_screeninfo *var,
-			    struct retz3_fb_par *par)
+			    struct retz3fb_par *par)
 {
 	par->xres = var->xres;
 	par->yres = var->yres;
@@ -934,7 +937,7 @@
  */
 
 static int retz3_encode_var(struct fb_var_screeninfo *var,
-			    struct retz3_fb_par *par)
+			    struct retz3fb_par *par)
 {
 	short i;
 
@@ -1189,16 +1192,16 @@
  *    Fill the hardware's `par' structure.
  */
 
-static void retz3_fb_get_par(struct retz3_fb_par *par)
+static void retz3fb_get_par(struct retz3fb_par *par)
 {
 	if (current_par_valid)
 		*par = current_par;
 	else
-		fbhw->decode_var(&retz3_fb_predefined[z3fb_mode], par);
+		fbhw->decode_var(&retz3fb_predefined[z3fb_mode], par);
 }
 
 
-static void retz3_fb_set_par(struct retz3_fb_par *par)
+static void retz3fb_set_par(struct retz3fb_par *par)
 {
 	current_par = *par;
 	current_par_valid = 1;
@@ -1208,7 +1211,7 @@
 static int do_fb_set_var(struct fb_var_screeninfo *var, int isactive)
 {
 	int err, activate;
-	struct retz3_fb_par par;
+	struct retz3fb_par par;
 
 	if ((err = fbhw->decode_var(var, &par)))
 		return err;
@@ -1217,7 +1220,7 @@
 	/* XXX ... what to do about isactive ? */
 
 	if ((var->activate & FB_ACTIVATE_MASK) == FB_ACTIVATE_NOW && isactive)
-		retz3_fb_set_par(&par);
+		retz3fb_set_par(&par);
 	fbhw->encode_var(var, &par);
 	var->activate = activate;
 
@@ -1245,7 +1248,7 @@
  *    Open/Release the frame buffer device
  */
 
-static int retz3_fb_open(int fbidx)
+static int retz3fb_open(int fbidx)
 {
 	/*
 	 * Nothing, only a usage count for the moment
@@ -1255,7 +1258,7 @@
 	return 0;
 }
 
-static int retz3_fb_release(int fbidx)
+static int retz3fb_release(int fbidx)
 {
 	MOD_DEC_USE_COUNT;
 	return 0;
@@ -1266,13 +1269,13 @@
  *    Get the Fixed Part of the Display
  */
 
-static int retz3_fb_get_fix(struct fb_fix_screeninfo *fix, int con)
+static int retz3fb_get_fix(struct fb_fix_screeninfo *fix, int con, int fbidx)
 {
-	struct retz3_fb_par par;
+	struct retz3fb_par par;
 	int error = 0;
 
 	if (con == -1)
-		retz3_fb_get_par(&par);
+		retz3fb_get_par(&par);
 	else
 		error = fbhw->decode_var(&fb_display[con].var, &par);
 	return(error ? error : fbhw->encode_fix(fix, &par));
@@ -1283,13 +1286,13 @@
  *    Get the User Defined Part of the Display
  */
 
-static int retz3_fb_get_var(struct fb_var_screeninfo *var, int con)
+static int retz3fb_get_var(struct fb_var_screeninfo *var, int con, int fbidx)
 {
-	struct retz3_fb_par par;
+	struct retz3fb_par par;
 	int error = 0;
 
 	if (con == -1) {
-		retz3_fb_get_par(&par);
+		retz3fb_get_par(&par);
 		error = fbhw->encode_var(var, &par);
 	} else
 		*var = fb_display[con].var;
@@ -1298,7 +1301,7 @@
 
 
 #if 1
-static void retz3_fb_set_disp(int con)
+static void retz3fb_set_disp(int con)
 {
 	struct fb_fix_screeninfo fix;
 	struct display *display;
@@ -1308,7 +1311,8 @@
 	else
 		display = &disp;	/* used during initialization */
 
-	retz3_fb_get_fix(&fix, con);
+	/* ### FN: Needs fixes later */
+	retz3fb_get_fix(&fix, con, 0);
 
 	if (con == -1)
 		con = 0;
@@ -1328,7 +1332,7 @@
  *    Set the User Defined Part of the Display
  */
 
-static int retz3_fb_set_var(struct fb_var_screeninfo *var, int con)
+static int retz3fb_set_var(struct fb_var_screeninfo *var, int con, int fbidx)
 {
 	int err, oldxres, oldyres, oldvxres, oldvyres, oldbpp;
 	struct display *display;
@@ -1359,7 +1363,7 @@
 		    oldbpp != var->bits_per_pixel) {
 
 			struct fb_fix_screeninfo fix;
-			retz3_fb_get_fix(&fix, con);
+			retz3fb_get_fix(&fix, con, fbidx);
 
 			display->screen_base = fix.smem_start;
 			display->visual = fix.visual;
@@ -1371,7 +1375,7 @@
 			display->can_soft_blank = 1;
 			display->inverse = z3fb_inverse;
 /*
-	retz3_fb_set_disp(con);
+	retz3fb_set_disp(con);
 */
 			if (fb_info.changevar)
 				(*fb_info.changevar)(con);
@@ -1391,7 +1395,8 @@
  *    Get the Colormap
  */
 
-static int retz3_fb_get_cmap(struct fb_cmap *cmap, int kspc, int con)
+static int retz3fb_get_cmap(struct fb_cmap *cmap, int kspc, int con,
+			     int fbidx)
 {
 	if (con == currcon) /* current console? */
 		return(fb_get_cmap(cmap, &fb_display[con].var, kspc,
@@ -1409,7 +1414,8 @@
  *    Set the Colormap
  */
 
-static int retz3_fb_set_cmap(struct fb_cmap *cmap, int kspc, int con)
+static int retz3fb_set_cmap(struct fb_cmap *cmap, int kspc, int con,
+			     int fbidx)
 {
 	int err;
 
@@ -1434,7 +1440,8 @@
  *    This call looks only at xoffset, yoffset and the FB_VMODE_YWRAP flag
  */
 
-static int retz3_fb_pan_display(struct fb_var_screeninfo *var, int con)
+static int retz3fb_pan_display(struct fb_var_screeninfo *var, int con,
+				int fbidx)
 {
 	return -EINVAL;
 }
@@ -1444,21 +1451,22 @@
  *    RetinaZ3 Frame Buffer Specific ioctls
  */
 
-static int retz3_fb_ioctl(struct inode *inode, struct file *file,
-                          unsigned int cmd, unsigned long arg, int con)
+static int retz3fb_ioctl(struct inode *inode, struct file *file,
+                          unsigned int cmd, unsigned long arg, int con,
+                          int fbidx)
 {
 	return -EINVAL;
 }
 
 
-static struct fb_ops retz3_fb_ops = {
-	retz3_fb_open, retz3_fb_release, retz3_fb_get_fix, retz3_fb_get_var,
-	retz3_fb_set_var, retz3_fb_get_cmap, retz3_fb_set_cmap,
-	retz3_fb_pan_display, retz3_fb_ioctl
+static struct fb_ops retz3fb_ops = {
+	retz3fb_open, retz3fb_release, retz3fb_get_fix, retz3fb_get_var,
+	retz3fb_set_var, retz3fb_get_cmap, retz3fb_set_cmap,
+	retz3fb_pan_display, retz3fb_ioctl
 };
 
 
-__initfunc(void retz3_video_setup(char *options, int *ints))
+__initfunc(void retz3fb_setup(char *options, int *ints))
 {
 	char *this_opt;
 
@@ -1484,14 +1492,14 @@
  *    Initialization
  */
 
-__initfunc(unsigned long retz3_fb_init(unsigned long mem_start))
+__initfunc(unsigned long retz3fb_init(unsigned long mem_start))
 {
 	int err;
 	unsigned long board_addr, board_size;
 	unsigned int key;
 	const struct ConfigDev *cd;
 
-	struct retz3_fb_par par;
+	struct retz3fb_par par;
 
 	if (!(key = zorro_find(ZORRO_PROD_MACROSYSTEMS_RETINA_Z3, 0, 0)))
 		return mem_start;
@@ -1517,17 +1525,16 @@
 
 	fbhw->init();
 
-	strcpy(fb_info.modename, retz3_fb_name);
+	strcpy(fb_info.modename, retz3fb_name);
 	fb_info.changevar = NULL;
 	fb_info.node = -1;
-	fb_info.fbops = &retz3_fb_ops;
+	fb_info.fbops = &retz3fb_ops;
 	fb_info.fbvar_num = NUM_TOTAL_MODES;
-	fb_info.fbvar = retz3_fb_predefined;
+	fb_info.fbvar = retz3fb_predefined;
 	fb_info.disp = &disp;
 	fb_info.switch_con = &z3fb_switch;
 	fb_info.updatevar = &z3fb_updatevar;
 	fb_info.blank = &z3fb_blank;
-	fb_info.setcmap = &z3fb_setcmap;
 
 	err = register_framebuffer(&fb_info);
 	if (err < 0)
@@ -1536,13 +1543,13 @@
 	if (z3fb_mode == -1)
 		z3fb_mode = 1;
 
-	fbhw->decode_var(&retz3_fb_predefined[z3fb_mode], &par);
-	fbhw->encode_var(&retz3_fb_predefined[0], &par);
+	fbhw->decode_var(&retz3fb_predefined[z3fb_mode], &par);
+	fbhw->encode_var(&retz3fb_predefined[0], &par);
 
-	do_fb_set_var(&retz3_fb_predefined[0], 0);
-	retz3_fb_get_var(&disp.var, -1);
+	do_fb_set_var(&retz3fb_predefined[0], 0);
+	retz3fb_get_var(&disp.var, -1, GET_FB_IDX(fb_info.node));
 
-	retz3_fb_set_disp(-1);
+	retz3fb_set_disp(-1);
 
 	do_install_cmap(0);
 
@@ -1595,16 +1602,6 @@
 
 
 /*
- *    Set the colormap
- */
-
-static int z3fb_setcmap(struct fb_cmap *cmap, int con)
-{
-	return(retz3_fb_set_cmap(cmap, 1, con));
-}
-
-
-/*
  *    Get a Video Mode
  */
 
@@ -1613,8 +1610,8 @@
 	short i;
 
 	for (i = 1; i <= NUM_PREDEF_MODES; i++)
-		if (!strcmp(name, retz3_fb_modenames[i])){
-			retz3_fb_predefined[0] = retz3_fb_predefined[i];
+		if (!strcmp(name, retz3fb_modenames[i])){
+			retz3fb_predefined[0] = retz3fb_predefined[i];
 			return i;
 		}
 	return -1;
@@ -1624,7 +1621,7 @@
 #ifdef MODULE
 int init_module(void)
 {
-	return(retz3_fb_init(NULL));
+	return(retz3fb_init(NULL));
 }
 
 void cleanup_module(void)
diff -u --recursive --exclude-from=/home/geert/diff-excludes-linux --new-file m68k-2.1.64/drivers/video/tgafb.c m68k-newfb/drivers/video/tgafb.c
--- m68k-2.1.64/drivers/video/tgafb.c	Mon Nov 24 21:02:36 1997
+++ m68k-newfb/drivers/video/tgafb.c	Wed Dec 10 23:02:38 1997
@@ -188,10 +188,17 @@
 unsigned char PLLbits[7] __initdata = { 0x80, 0x04, 0x00, 0x24, 0x44, 0x80, 0xb8 };
 
 const unsigned long bt485_cursor_source[64] __initdata = {
+#if 1
+  0x0000000000000000,0x0000000000000000,0x0000000000000000,0x0000000000000000,
+  0x0000000000000000,0x0000000000000000,0x0000000000000000,0x0000000000000000,
+  0x0000000000000000,0x0000000000000000,0x0000000000000000,0x0000000000000000,
+  0x0000000000000000,0x0000000000000000,0x0000000000000000,0x0000000000000000,
+#else
   0x00000000000000ff,0x00000000000000ff,0x00000000000000ff,0x00000000000000ff,
   0x00000000000000ff,0x00000000000000ff,0x00000000000000ff,0x00000000000000ff,
   0x00000000000000ff,0x00000000000000ff,0x00000000000000ff,0x00000000000000ff,
   0x00000000000000ff,0x00000000000000ff,0x00000000000000ff,0x00000000000000ff,
+#endif
   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
@@ -235,9 +242,8 @@
 static struct display disp;
 static struct fb_info fb_info;
 static struct { u_char red, green, blue, pad; } palette[256];
-static char tgafb_name[16] = "DEC TGA ";
 
-static struct fb_fix_screeninfo fb_fix;
+static struct fb_fix_screeninfo fb_fix = { { "DEC TGA ", } };
 static struct fb_var_screeninfo fb_var = { 0, };
 
 
@@ -245,18 +251,17 @@
      *  Interface used by the world
      */
 
-void tgafb_video_setup(char *options, int *ints);
-
 static int tgafb_open(int fbidx);
 static int tgafb_release(int fbidx);
-static int tgafb_get_fix(struct fb_fix_screeninfo *fix, int con);
-static int tgafb_get_var(struct fb_var_screeninfo *var, int con);
-static int tgafb_set_var(struct fb_var_screeninfo *var, int con);
-static int tgafb_pan_display(struct fb_var_screeninfo *var, int con);
-static int tgafb_get_cmap(struct fb_cmap *cmap, int kspc, int con);
-static int tgafb_set_cmap(struct fb_cmap *cmap, int kspc, int con);
+static int tgafb_get_fix(struct fb_fix_screeninfo *fix, int con, int fbidx);
+static int tgafb_get_var(struct fb_var_screeninfo *var, int con, int fbidx);
+static int tgafb_set_var(struct fb_var_screeninfo *var, int con, int fbidx);
+static int tgafb_pan_display(struct fb_var_screeninfo *var, int con,
+			     int fbidx);
+static int tgafb_get_cmap(struct fb_cmap *cmap, int kspc, int con, int fbidx);
+static int tgafb_set_cmap(struct fb_cmap *cmap, int kspc, int con, int fbidx);
 static int tgafb_ioctl(struct inode *inode, struct file *file, u_int cmd,
-		       u_long arg, int con);
+		       u_long arg, int con, int fbidx);
 
 
     /*
@@ -267,7 +272,6 @@
 static int tgafbcon_switch(int con);
 static int tgafbcon_updatevar(int con);
 static void tgafbcon_blank(int blank);
-static int tgafbcon_setcmap(struct fb_cmap *cmap, int con);
 
 
     /*
@@ -315,7 +319,7 @@
      *  Get the Fixed Part of the Display
      */
 
-static int tgafb_get_fix(struct fb_fix_screeninfo *fix, int con)
+static int tgafb_get_fix(struct fb_fix_screeninfo *fix, int con, int fbidx)
 {
     memcpy(fix, &fb_fix, sizeof(fb_fix));
     return 0;
@@ -326,7 +330,7 @@
      *  Get the User Defined Part of the Display
      */
 
-static int tgafb_get_var(struct fb_var_screeninfo *var, int con)
+static int tgafb_get_var(struct fb_var_screeninfo *var, int con, int fbidx)
 {
     memcpy(var, &fb_var, sizeof(fb_var));
     return 0;
@@ -337,7 +341,7 @@
      *  Set the User Defined Part of the Display
      */
 
-static int tgafb_set_var(struct fb_var_screeninfo *var, int con)
+static int tgafb_set_var(struct fb_var_screeninfo *var, int con, int fbidx)
 {
     struct display *display;
     int oldbpp = -1, err;
@@ -375,7 +379,7 @@
      *  This call looks only at xoffset, yoffset and the FB_VMODE_YWRAP flag
      */
 
-static int tgafb_pan_display(struct fb_var_screeninfo *var, int con)
+static int tgafb_pan_display(struct fb_var_screeninfo *var, int con, int fbidx)
 {
     if (var->xoffset || var->yoffset)
 	return -EINVAL;
@@ -387,7 +391,7 @@
      *  Get the Colormap
      */
 
-static int tgafb_get_cmap(struct fb_cmap *cmap, int kspc, int con)
+static int tgafb_get_cmap(struct fb_cmap *cmap, int kspc, int con, int fbidx)
 {
     if (con == currcon) /* current console? */
 	return fb_get_cmap(cmap, &fb_display[con].var, kspc, tgafb_getcolreg);
@@ -403,7 +407,7 @@
      *  Set the Colormap
      */
 
-static int tgafb_set_cmap(struct fb_cmap *cmap, int kspc, int con)
+static int tgafb_set_cmap(struct fb_cmap *cmap, int kspc, int con, int fbidx)
 {
     int err;
 
@@ -425,7 +429,7 @@
 
 
 static int tgafb_ioctl(struct inode *inode, struct file *file, u_int cmd,
-		       u_long arg, int con)
+		       u_long arg, int con, int fbidx)
 {
     return -EINVAL;
 }
@@ -460,19 +464,18 @@
     tga_type = (readl((unsigned long)tga_mem_base) >> 12) & 0x0f;
     switch (tga_type) {
 	case 0:
-	    strcat(tgafb_name, "8plane");
+	    strcat(fb_fix.id, "8plane");
 	    break;
 	case 1:
-	    strcat(tgafb_name, "24plane");
+	    strcat(fb_fix.id, "24plane");
 	    break;
 	case 3:
-	    strcat(tgafb_name, "24plusZ");
+	    strcat(fb_fix.id, "24plusZ");
 	    break;
 	default:
 	    printk("TGA type (0x%x) unrecognized!\n", tga_type);
 	    return mem_start;
     }
-    strcpy(fb_fix.id, tgafb_name);
 
     tga_regs_base = ((unsigned long)tga_mem_base + TGA_REGS_OFFSET);
     tga_fb_base = ((unsigned long)tga_mem_base + fb_offset_presets[tga_type]);
@@ -537,6 +540,9 @@
 	    TGA_WRITE_REG(default_red[j]|(BT485_DATA_PAL<<8), TGA_RAMDAC_REG);
 	    TGA_WRITE_REG(default_grn[j]|(BT485_DATA_PAL<<8), TGA_RAMDAC_REG);
 	    TGA_WRITE_REG(default_blu[j]|(BT485_DATA_PAL<<8), TGA_RAMDAC_REG);
+	    palette[i].red=default_red[j];
+	    palette[i].green=default_grn[j];
+	    palette[i].blue=default_blu[j];
 	}
 	for (i = 0; i < 240*3; i += 4) {
 	    TGA_WRITE_REG(0x55|(BT485_DATA_PAL<<8), TGA_RAMDAC_REG);
@@ -548,9 +554,9 @@
 	/* initialize RAMDAC cursor colors */
 	BT485_WRITE(0, BT485_ADDR_CUR_WRITE);
 
-	BT485_WRITE(0xaa, BT485_DATA_CUR); /* overscan WHITE */
-	BT485_WRITE(0xaa, BT485_DATA_CUR); /* overscan WHITE */
-	BT485_WRITE(0xaa, BT485_DATA_CUR); /* overscan WHITE */
+	BT485_WRITE(0x00, BT485_DATA_CUR); /* overscan WHITE */
+	BT485_WRITE(0x00, BT485_DATA_CUR); /* overscan WHITE */
+	BT485_WRITE(0x00, BT485_DATA_CUR); /* overscan WHITE */
 
 	BT485_WRITE(0x00, BT485_DATA_CUR); /* color 1 BLACK */
 	BT485_WRITE(0x00, BT485_DATA_CUR); /* color 1 BLACK */
@@ -677,7 +683,7 @@
     fb_var.xres = fb_var.xres_virtual = 640;
     fb_var.yres = fb_var.yres_virtual = 480;
     fb_fix.line_length = 80*fb_var.bits_per_pixel;
-    fb_fix.smem_start = (char *)tga_fb_base;
+    fb_fix.smem_start = (char *)(tga_fb_base + LCA_DENSE_MEM);
     fb_fix.smem_len = fb_fix.line_length*fb_var.yres;
     fb_fix.type = FB_TYPE_PACKED_PIXELS;
     fb_fix.type_aux = 0;
@@ -718,7 +724,7 @@
     disp.can_soft_blank = 1;
     disp.inverse = 0;
 
-    strcpy(fb_info.modename, tgafb_name);
+    strcpy(fb_info.modename, fb_fix.id);
     fb_info.node = -1;
     fb_info.fbops = &tgafb_ops;
     fb_info.fbvar_num = 1;
@@ -729,15 +735,14 @@
     fb_info.switch_con = &tgafbcon_switch;
     fb_info.updatevar = &tgafbcon_updatevar;
     fb_info.blank = &tgafbcon_blank;
-    fb_info.setcmap = &tgafbcon_setcmap;
 
     err = register_framebuffer(&fb_info);
     if (err < 0)
 	return mem_start;
 
-    tgafb_set_var(&fb_var, -1);
+    tgafb_set_var(&fb_var, -1, GET_FB_IDX(fb_info.node));
 
-    printk("%s frame buffer device\n", tgafb_name);
+    printk("%s frame buffer device\n", fb_fix.id);
     return mem_start;
 }
 
@@ -775,16 +780,6 @@
 }
 
     /*
-     *  Set the colormap
-     */
-
-static int tgafbcon_setcmap(struct fb_cmap *cmap, int con)
-{
-    return(tgafb_set_cmap(cmap, 1, con));
-}
-
-
-    /*
      *  Read a single color register and split it into
      *  colors/transparent. Return != 0 for invalid regno.
      */
@@ -867,7 +862,6 @@
     tga_update_palette();
 #endif
 }
-
 
 #if 0	/* No cursor stuff yet */
 
diff -u --recursive --exclude-from=/home/geert/diff-excludes-linux --new-file m68k-2.1.64/drivers/video/vfb.c m68k-newfb/drivers/video/vfb.c
--- m68k-2.1.64/drivers/video/vfb.c	Sun Nov 23 23:33:09 1997
+++ m68k-newfb/drivers/video/vfb.c	Wed Dec 10 23:10:46 1997
@@ -41,9 +41,9 @@
 static struct display disp;
 static struct fb_info fb_info;
 static struct { u_char red, green, blue, pad; } palette[256];
-static char virtual_fb_name[16] = "Virtual FB";
+static char vfb_name[16] = "Virtual FB";
 
-static struct fb_var_screeninfo virtual_fb_predefined[] = {
+static struct fb_var_screeninfo vfb_predefined[] = {
 
     /*
      *  Autodetect (Default) Video Mode
@@ -65,7 +65,7 @@
 };
 
 #define NUM_USER_MODES		(8)
-#define NUM_TOTAL_MODES		arraysize(virtual_fb_predefined)
+#define NUM_TOTAL_MODES		arraysize(vfb_predefined)
 #define NUM_PREDEF_MODES	(1)
 
 
@@ -73,29 +73,34 @@
      *  Interface used by the world
      */
 
-void vfb_video_setup(char *options, int *ints);
+void vfb_setup(char *options, int *ints);
 
-static int virtual_fb_open(int fbidx);
-static int virtual_fb_release(int fbidx);
-static int virtual_fb_get_fix(struct fb_fix_screeninfo *fix, int con);
-static int virtual_fb_get_var(struct fb_var_screeninfo *var, int con);
-static int virtual_fb_set_var(struct fb_var_screeninfo *var, int con);
-static int virtual_fb_pan_display(struct fb_var_screeninfo *var, int con);
-static int virtual_fb_get_cmap(struct fb_cmap *cmap, int kspc, int con);
-static int virtual_fb_set_cmap(struct fb_cmap *cmap, int kspc, int con);
-static int virtual_fb_ioctl(struct inode *inode, struct file *file, u_int cmd,
-			    u_long arg, int con);
+static int vfb_open(int fbidx);
+static int vfb_release(int fbidx);
+static int vfb_get_fix(struct fb_fix_screeninfo *fix, int con,
+			      int fbidx);
+static int vfb_get_var(struct fb_var_screeninfo *var, int con,
+			      int fbidx);
+static int vfb_set_var(struct fb_var_screeninfo *var, int con,
+			      int fbidx);
+static int vfb_pan_display(struct fb_var_screeninfo *var, int con,
+				  int fbidx);
+static int vfb_get_cmap(struct fb_cmap *cmap, int kspc, int con,
+			       int fbidx);
+static int vfb_set_cmap(struct fb_cmap *cmap, int kspc, int con,
+			       int fbidx);
+static int vfb_ioctl(struct inode *inode, struct file *file, u_int cmd,
+			    u_long arg, int con, int fbidx);
 
 
     /*
      *  Interface to the low level console driver
      */
 
-unsigned long virtual_fb_init(unsigned long mem_start);
+unsigned long vfb_init(unsigned long mem_start);
 static int vfbcon_switch(int con);
 static int vfbcon_updatevar(int con);
 static void vfbcon_blank(int blank);
-static int vfbcon_setcmap(struct fb_cmap *cmap, int con);
 
 
     /*
@@ -113,10 +118,10 @@
 static void do_install_cmap(int con);
 
 
-static struct fb_ops virtual_fb_ops = {
-    virtual_fb_open, virtual_fb_release, virtual_fb_get_fix,
-    virtual_fb_get_var, virtual_fb_set_var, virtual_fb_get_cmap,
-    virtual_fb_set_cmap, virtual_fb_pan_display, virtual_fb_ioctl
+static struct fb_ops vfb_ops = {
+    vfb_open, vfb_release, vfb_get_fix,
+    vfb_get_var, vfb_set_var, vfb_get_cmap,
+    vfb_set_cmap, vfb_pan_display, vfb_ioctl
 };
 
 
@@ -124,7 +129,7 @@
      *  Open/Release the frame buffer device
      */
 
-static int virtual_fb_open(int fbidx)                                       
+static int vfb_open(int fbidx)                                       
 {
     /*                                                                     
      *  Nothing, only a usage count for the moment                          
@@ -134,7 +139,7 @@
     return(0);                              
 }
         
-static int virtual_fb_release(int fbidx)
+static int vfb_release(int fbidx)
 {
     MOD_DEC_USE_COUNT;
     return(0);                                                    
@@ -145,12 +150,13 @@
      *  Get the Fixed Part of the Display
      */
 
-static int virtual_fb_get_fix(struct fb_fix_screeninfo *fix, int con)
+static int vfb_get_fix(struct fb_fix_screeninfo *fix, int con,
+			      int fbidx)
 {
     struct fb_var_screeninfo *var;
 
     if (con == -1)
-	var = &virtual_fb_predefined[0];
+	var = &vfb_predefined[0];
     else
 	var = &fb_display[con].var;
     vfb_encode_fix(fix, var);
@@ -162,10 +168,11 @@
      *  Get the User Defined Part of the Display
      */
 
-static int virtual_fb_get_var(struct fb_var_screeninfo *var, int con)
+static int vfb_get_var(struct fb_var_screeninfo *var, int con,
+			      int fbidx)
 {
     if (con == -1)
-	*var = virtual_fb_predefined[0];
+	*var = vfb_predefined[0];
     else
 	*var = fb_display[con].var;
     set_color_bitfields(var);
@@ -177,7 +184,8 @@
      *  Set the User Defined Part of the Display
      */
 
-static int virtual_fb_set_var(struct fb_var_screeninfo *var, int con)
+static int vfb_set_var(struct fb_var_screeninfo *var, int con,
+			      int fbidx)
 {
     int err, activate = var->activate;
     int oldxres, oldyres, oldvxres, oldvyres, oldbpp;
@@ -277,7 +285,8 @@
      *  This call looks only at xoffset, yoffset and the FB_VMODE_YWRAP flag
      */
 
-static int virtual_fb_pan_display(struct fb_var_screeninfo *var, int con)
+static int vfb_pan_display(struct fb_var_screeninfo *var, int con,
+				  int fbidx)
 {
     if (var->vmode & FB_VMODE_YWRAP) {
 	if (var->yoffset < 0 ||
@@ -304,7 +313,8 @@
      *  Get the Colormap
      */
 
-static int virtual_fb_get_cmap(struct fb_cmap *cmap, int kspc, int con)
+static int vfb_get_cmap(struct fb_cmap *cmap, int kspc, int con,
+			       int fbidx)
 {
     if (con == currcon) /* current console? */
 	return fb_get_cmap(cmap, &fb_display[con].var, kspc, vfb_getcolreg);
@@ -320,7 +330,8 @@
      *  Set the Colormap
      */
 
-static int virtual_fb_set_cmap(struct fb_cmap *cmap, int kspc, int con)
+static int vfb_set_cmap(struct fb_cmap *cmap, int kspc, int con,
+			       int fbidx)
 {
     int err;
 
@@ -341,14 +352,14 @@
      *  Virtual Frame Buffer Specific ioctls
      */
 
-static int virtual_fb_ioctl(struct inode *inode, struct file *file, u_int cmd,
-			    u_long arg, int con)
+static int vfb_ioctl(struct inode *inode, struct file *file, u_int cmd,
+			    u_long arg, int con, int fbidx)
 {
     return -EINVAL;
 }
 
 
-__initfunc(void vfb_video_setup(char *options, int *ints))
+__initfunc(void vfb_setup(char *options, int *ints))
 {
     char *this_opt;
 
@@ -369,7 +380,7 @@
      *  Initialisation
      */
 
-__initfunc(unsigned long virtual_fb_init(unsigned long mem_start))
+__initfunc(unsigned long vfb_init(unsigned long mem_start))
 {
     int err;
 
@@ -382,23 +393,22 @@
     if (!videomemory)
 	return mem_start;
 
-    strcpy(fb_info.modename, virtual_fb_name);
+    strcpy(fb_info.modename, vfb_name);
     fb_info.changevar = NULL;
     fb_info.node = -1;
-    fb_info.fbops = &virtual_fb_ops;
+    fb_info.fbops = &vfb_ops;
     fb_info.fbvar_num = NUM_TOTAL_MODES;
-    fb_info.fbvar = virtual_fb_predefined;
+    fb_info.fbvar = vfb_predefined;
     fb_info.disp = &disp;
     fb_info.switch_con = &vfbcon_switch;
     fb_info.updatevar = &vfbcon_updatevar;
     fb_info.blank = &vfbcon_blank;
-    fb_info.setcmap = &vfbcon_setcmap;
 
     err = register_framebuffer(&fb_info);
     if (err < 0)
 	return mem_start;
 
-    virtual_fb_set_var(&virtual_fb_predefined[0], -1);
+    vfb_set_var(&vfb_predefined[0], -1, GET_FB_IDX(fb_info.node));
 
     printk("Virtual frame buffer device, using %ldK of video memory\n",
 	   videomemorysize>>10);
@@ -438,16 +448,6 @@
     /* Nothing */
 }
 
-    /*
-     *  Set the colormap
-     */
-
-static int vfbcon_setcmap(struct fb_cmap *cmap, int con)
-{
-    return(virtual_fb_set_cmap(cmap, 1, con));
-}
-
-
 static u_long get_line_length(int xres_virtual, int bpp)
 {
     u_long length;
@@ -462,7 +462,7 @@
 			   struct fb_var_screeninfo *var)
 {
     memset(fix, 0, sizeof(struct fb_fix_screeninfo));
-    strcpy(fix->id, virtual_fb_name);
+    strcpy(fix->id, vfb_name);
     fix->smem_start = (caddr_t)videomemory;
     fix->smem_len = videomemorysize;
     fix->type = FB_TYPE_PACKED_PIXELS;
@@ -589,7 +589,7 @@
 #ifdef MODULE
 int init_module(void)
 {
-    return(virtual_fb_init(NULL));
+    return(vfb_init(NULL));
 }
 
 void cleanup_module(void)
diff -u --recursive --exclude-from=/home/geert/diff-excludes-linux --new-file m68k-2.1.64/drivers/video/vgacon.c m68k-newfb/drivers/video/vgacon.c
--- m68k-2.1.64/drivers/video/vgacon.c	Sun Nov 23 23:33:09 1997
+++ m68k-newfb/drivers/video/vgacon.c	Thu Dec 11 20:31:41 1997
@@ -215,25 +215,6 @@
 	unsigned short saved;
 	unsigned short *p;
 
-	/*
-	 *	Find out if there is a graphics card present.
-	 *	Are there smarter methods around?
-	 */
-	p = (unsigned short *)(((ORIG_VIDEO_MODE == 7) ? 0xb0000 : 0xb8000) +
-			       + VGA_OFFSET);
-	saved = vga_readw(p);
-	vga_writew(0xAA55, p);
-	if (vga_readw(p) != 0xAA55) {
-		vga_writew(saved, p);
-		return kmem_start;
-	}
-	vga_writew(0x55AA, p);
-	if (vga_readw(p) != 0x55AA) {
-		vga_writew(saved, p);
-		return kmem_start;
-	}
-	vga_writew(saved, p);
-
 	vga_video_num_lines = ORIG_VIDEO_LINES;
 	vga_video_num_columns = ORIG_VIDEO_COLS;
 	vga_video_size_row = 2 * ORIG_VIDEO_COLS;
@@ -326,6 +307,24 @@
 			request_region(0x3d4,2,"cga");
 		}
 	}
+
+	/*
+	 *	Find out if there is a graphics card present.
+	 *	Are there smarter methods around?
+	 */
+	p = (unsigned short *)video_mem_base;
+	saved = vga_readw(p);
+	vga_writew(0xAA55, p);
+	if (vga_readw(p) != 0xAA55) {
+		vga_writew(saved, p);
+		return kmem_start;
+	}
+	vga_writew(0x55AA, p);
+	if (vga_readw(p) != 0x55AA) {
+		vga_writew(saved, p);
+		return kmem_start;
+	}
+	vga_writew(saved, p);
 
 	vga_hardscroll_enabled = (vga_hardscroll_disabled_by_init ? 0 :
 	  (vga_video_type == VIDEO_TYPE_EGAC
diff -u --recursive --exclude-from=/home/geert/diff-excludes-linux --new-file m68k-2.1.64/include/linux/fb.h m68k-newfb/include/linux/fb.h
--- m68k-2.1.64/include/linux/fb.h	Wed Nov 26 21:04:16 1997
+++ m68k-newfb/include/linux/fb.h	Wed Dec 10 23:03:33 1997
@@ -7,9 +7,10 @@
 
 #define FB_MAJOR	29
 
-#define FB_MODES_SHIFT	5	/* 32 modes per framebuffer */
-#define FB_NUM_MINORS	256	/* 256 Minors               */
-#define FB_MAX		(FB_NUM_MINORS / (1 << FB_MODES_SHIFT))
+#define FB_MODES_SHIFT		5	/* 32 modes per framebuffer */
+#define FB_NUM_MINORS		256	/* 256 Minors               */
+#define FB_MAX			(FB_NUM_MINORS / (1 << FB_MODES_SHIFT))
+#define GET_FB_IDX(node)	(MINOR(node) >> FB_MODES_SHIFT)
 
 /* ioctls
    0x46 is 'F'								*/
@@ -76,7 +77,7 @@
 #define FB_ACCEL_AMIGABLITT	2	/* Amiga Blitter                */
 #define FB_ACCEL_CYBERVISION	3	/* Cybervision64 (S3 Trio64)    */
 #define FB_ACCEL_RETINAZ3	4	/* RetinaZ3 (NCR77C32BLT)       */
-#define FB_ACCEL_CYBERVISION3D  5	/* Cybervision64/3D (S3 ViRGE)  */
+#define FB_ACCEL_CYBERVISION3D	5	/* Cybervision64/3D (S3 ViRGE)	*/
 #define FB_ACCEL_MACH64		6	/* ATI Mach 64			*/
 #define FB_ACCEL_TGA		7	/* DEC 21030 TGA		*/
 
@@ -158,20 +159,20 @@
 	int (*fb_open) (int);
 	int (*fb_release) (int);
 	/* get non settable parameters	*/
-	int (*fb_get_fix) (struct fb_fix_screeninfo *, int); 
+	int (*fb_get_fix) (struct fb_fix_screeninfo *, int, int); 
 	/* get settable parameters	*/
-	int (*fb_get_var) (struct fb_var_screeninfo *, int);		
+	int (*fb_get_var) (struct fb_var_screeninfo *, int, int);		
 	/* set settable parameters	*/
-	int (*fb_set_var) (struct fb_var_screeninfo *, int);		
+	int (*fb_set_var) (struct fb_var_screeninfo *, int, int);		
 	/* get colormap			*/
-	int (*fb_get_cmap) (struct fb_cmap *, int, int);
+	int (*fb_get_cmap) (struct fb_cmap *, int, int, int);
 	/* set colormap			*/
-	int (*fb_set_cmap) (struct fb_cmap *, int, int);
+	int (*fb_set_cmap) (struct fb_cmap *, int, int, int);
 	/* pan display                   */
-	int (*fb_pan_display) (struct fb_var_screeninfo *, int);
+	int (*fb_pan_display) (struct fb_var_screeninfo *, int, int);
 	/* perform fb specific ioctl	*/
 	int (*fb_ioctl)(struct inode *, struct file *, unsigned int,
-			unsigned long, int);
+			unsigned long, int, int);
 };
 
 
@@ -235,7 +236,6 @@
    int (*switch_con)(int);          /* tell fb to switch consoles */
    int (*updatevar)(int);           /* tell fb to update the vars */
    void (*blank)(int);              /* tell fb to (un)blank the screen */
-   int (*setcmap)(struct fb_cmap *, int); /* tell fb to set the colormap */
 };
 
 /* prototypes */

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

