Date: Tue, 26 Aug 1997 23:28:23 +0200 (MET DST)
From: Geert Uytterhoeven <Geert.Uytterhoeven@thomas.kotnet.org>
To: Linux/m68k <linux-m68k@phil.uni-sb.de>
Subject: L68K: Frame buffer init order
Sender: owner-linux-m68k@phil.uni-sb.de
Reply-To: Geert Uytterhoeven <Geert.Uytterhoeven@cs.kuleuven.ac.be>


This patch makes sure that frame buffer devices are initialized in the order
of the video= kernel options (idea by Bernd Harries).

Even if a particular frame buffer device doesn't support options, you can
specify its initialization order using an empty option, i.e.

    video=name:


--- linux-2.1.47/drivers/char/fbmem.c.orig	Mon Aug 18 21:06:28 1997
+++ linux-2.1.47/drivers/char/fbmem.c	Wed Aug 20 22:34:26 1997
@@ -58,7 +58,7 @@
     const char *name;
     fb_init_func *init;
     video_setup_func *setup;
-} builtin_frame_buffers[] __initdata = {
+} fb_drivers[] __initdata = {
 #ifdef CONFIG_FB_AMIGA
     { "amifb", amiga_fb_init, amiga_video_setup },
 #endif
@@ -86,8 +86,10 @@
 #endif
 };
 
-#define NUM_BUILTIN_FRAME_BUFFERS	\
-	(sizeof(builtin_frame_buffers)/sizeof(*builtin_frame_buffers))
+#define NUM_FB_DRIVERS	(sizeof(fb_drivers)/sizeof(*fb_drivers))
+
+static fb_init_func *pref_init_funcs[FB_MAX];
+static int num_pref_init_funcs __initdata = 0;
 
 
 #define GET_INODE(i) MKDEV(FB_MAJOR, (i) << FB_MODES_SHIFT)
@@ -501,9 +503,13 @@
 {
     int i;
 
-    for (i = 0; i < NUM_BUILTIN_FRAME_BUFFERS; i++)
-	if (builtin_frame_buffers[i].init)
-	    builtin_frame_buffers[i].init(kmem_start);
+    for (i = 0; i < num_pref_init_funcs; i++)
+	pref_init_funcs[i](kmem_start);
+
+    for (i = 0; i < NUM_FB_DRIVERS; i++)
+	if (fb_drivers[i].init)
+	    fb_drivers[i].init(kmem_start);
+
     return(num_registered_fb);
 }
 
@@ -530,15 +536,21 @@
 	return;
     }
 
-    for (i = 0; i < NUM_BUILTIN_FRAME_BUFFERS; i++)
-	if (builtin_frame_buffers[i].setup) {
-	    j = strlen(builtin_frame_buffers[i].name);
-	    if (!strncmp(options, builtin_frame_buffers[i].name, j) &&
-		options[j] == ':') {
-		builtin_frame_buffers[i].setup(options+j+1, ints);
-		return;
+    if (num_pref_init_funcs == FB_MAX)
+	return;
+
+    for (i = 0; i < NUM_FB_DRIVERS; i++) {
+	j = strlen(fb_drivers[i].name);
+	if (!strncmp(options, fb_drivers[i].name, j) && options[j] == ':') {
+	    if (fb_drivers[i].init) {
+		pref_init_funcs[num_pref_init_funcs++] = fb_drivers[i].init;
+		fb_drivers[i].init = NULL;
 	    }
+	    if (fb_drivers[i].setup)
+		fb_drivers[i].setup(options+j+1, ints);
+	    return;
 	}
+    }
 }
 
Greetings,

						Geert

--
Geert Uytterhoeven                   Geert.Uytterhoeven@thomas.kotnet.org
Linux/m68k on Amiga, Wavelets        http://www.cs.kuleuven.ac.be/~geert/
KotNET@Thomas Network Administration -- Make you bed part of Cyberspace!!


