Date: Wed, 24 Sep 1997 10:29:18 +0200 (CEST)
From: Geert Uytterhoeven <Geert.Uytterhoeven@cs.kuleuven.ac.be>
To: Linux/m68k <linux-m68k@lists.linux-m68k.org>
Subject: L68K: Fixes for amifb
Sender: owner-linux-m68k@phil.uni-sb.de
Reply-To: linux-m68k@phil.uni-sb.de


The depth, size, timing and sync options of amifb didn't really work because
they were always overridden by the default or selected video mode.
Additionally I gave more functions an __init attribute.

--- snapshot-200997/drivers/video/amifb.c.orig	Tue Sep 23 20:00:53 1997
+++ snapshot-200997/drivers/video/amifb.c	Tue Sep 23 20:33:56 1997
@@ -1265,6 +1265,22 @@
 	amiga_fb_pan_display, amiga_fb_ioctl
 };
 
+struct useropts {
+	long xres;
+	long yres;
+	long xres_virtual;
+	long yres_virtual;
+	long bits_per_pixel;
+	long left_margin;
+	long right_margin;
+	long upper_margin;
+	long lower_margin;
+	long hsync_len;
+	long vsync_len;
+} useropts __initdata = {
+    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+};
+
 __initfunc(void amiga_video_setup(char *options, int *ints))
 {
 	char *this_opt;
@@ -1291,63 +1307,51 @@
 		else if (!strncmp(this_opt, "fstart:", 7))
 			min_fstrt = simple_strtoul(this_opt+7, NULL, 0);
 		else if (!strncmp(this_opt, "depth:", 6))
-			amiga_fb_predefined[0].bits_per_pixel =
-				simple_strtoul(this_opt+6, NULL, 0);
+			useropts.bits_per_pixel = simple_strtoul(this_opt+6, NULL, 0);
 		else if (!strncmp(this_opt, "size:", 5)) {
 			p = this_opt + 5;
 			if (*p != ';')
-				amiga_fb_predefined[0].xres =
-					simple_strtoul(p, NULL, 0);
+				useropts.xres = simple_strtoul(p, NULL, 0);
 			if (!(p = strchr(p, ';')))
 				continue;
 			if (*++p != ';')
-				amiga_fb_predefined[0].yres =
-					simple_strtoul(p, NULL, 0);
+				useropts.yres = simple_strtoul(p, NULL, 0);
 			if (!(p = strchr(p, ';')))
 				continue;
 			if (*++p != ';')
-				amiga_fb_predefined[0].xres_virtual =
-					simple_strtoul(p, NULL, 0);
+				useropts.xres_virtual = simple_strtoul(p, NULL, 0);
 			if (!(p = strchr(p, ';')))
 				continue;
 			if (*++p != ';')
-				amiga_fb_predefined[0].yres_virtual =
-					simple_strtoul(p, NULL, 0);
+				useropts.yres_virtual = simple_strtoul(p, NULL, 0);
 			if (!(p = strchr(p, ';')))
 				continue;
 			if (*++p)
-				amiga_fb_predefined[0].bits_per_pixel =
-					simple_strtoul(p, NULL, 0);
+				useropts.bits_per_pixel = simple_strtoul(p, NULL, 0);
 		} else if (!strncmp(this_opt, "timing:", 7)) {
 			p = this_opt + 7;
 			if (*p != ';')
-				amiga_fb_predefined[0].left_margin =
-					simple_strtoul(p, NULL, 0);
+				useropts.left_margin = simple_strtoul(p, NULL, 0);
 			if (!(p = strchr(p, ';')))
 				continue;
 			if (*++p != ';')
-				amiga_fb_predefined[0].right_margin =
-					simple_strtoul(p, NULL, 0);
+				useropts.right_margin = simple_strtoul(p, NULL, 0);
 			if (!(p = strchr(p, ';')))
 				continue;
 			if (*++p != ';')
-				amiga_fb_predefined[0].upper_margin =
-					simple_strtoul(p, NULL, 0);
+				useropts.upper_margin = simple_strtoul(p, NULL, 0);
 			if (!(p = strchr(p, ';')))
 				continue;
 			if (*++p)
-				amiga_fb_predefined[0].lower_margin =
-					simple_strtoul(p, NULL, 0);
+				useropts.lower_margin = simple_strtoul(p, NULL, 0);
 		} else if (!strncmp(this_opt, "sync:", 5)) {
 			p = this_opt + 5;
 			if (*p != ';')
-				amiga_fb_predefined[0].hsync_len =
-					simple_strtoul(p, NULL, 0);
+				useropts.hsync_len = simple_strtoul(p, NULL, 0);
 			if (!(p = strchr(p, ';')))
 				continue;
 			if (*++p)
-				amiga_fb_predefined[0].vsync_len =
-					simple_strtoul(p, NULL, 0);
+				useropts.vsync_len = simple_strtoul(p, NULL, 0);
 		} else
 			get_video_mode(this_opt);
 	}
@@ -2025,13 +2029,37 @@
 	 * Get a Video Mode
 	 */
 
-static void get_video_mode(const char *name)
+__initfunc(static void get_video_mode(const char *name))
 {
 	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 (useropts.xres != -1)
+				amiga_fb_predefined[0].xres = useropts.xres;
+			if (useropts.yres != -1)
+				amiga_fb_predefined[0].yres = useropts.yres;
+			if (useropts.xres_virtual != -1)
+				amiga_fb_predefined[0].xres_virtual = useropts.xres_virtual;
+			if (useropts.yres_virtual != -1)
+				amiga_fb_predefined[0].yres_virtual = useropts.yres_virtual;
+			if (useropts.bits_per_pixel != -1)
+				amiga_fb_predefined[0].bits_per_pixel = useropts.bits_per_pixel;
+			if (useropts.left_margin != -1)
+				amiga_fb_predefined[0].left_margin = useropts.left_margin;
+			if (useropts.right_margin != -1)
+				amiga_fb_predefined[0].right_margin = useropts.right_margin;
+			if (useropts.upper_margin != -1)
+				amiga_fb_predefined[0].upper_margin = useropts.upper_margin;
+			if (useropts.lower_margin != -1)
+				amiga_fb_predefined[0].lower_margin = useropts.lower_margin;
+			if (useropts.hsync_len != -1)
+				amiga_fb_predefined[0].hsync_len = useropts.hsync_len;
+			if (useropts.vsync_len != -1)
+				amiga_fb_predefined[0].vsync_len = useropts.vsync_len;
+
 			amifb_usermode = i;
 			return;
 		}
@@ -2042,7 +2070,7 @@
 	 * Probe the  Video Modes
 	 */
 
-static void check_default_mode(void)
+__initfunc(static void check_default_mode(void))
 {
 	struct amiga_fb_par par;
 	int mode;
@@ -2063,7 +2091,7 @@
 	 * Allocate, Clear and Align a Block of Chip Memory
 	 */
 
-static u_long chipalloc(u_long size)
+__initfunc(static u_long chipalloc(u_long size))
 {
 	u_long ptr;
 
@@ -2080,7 +2108,7 @@
 	 * A strtok which returns empty strings, too
 	 */
 
-static char *strtoke(char *s,const char *ct)
+__initfunc(static char *strtoke(char *s,const char *ct))
 {
 	char *sbegin, *send;
 	static char *ssave = NULL;
@@ -3150,7 +3178,7 @@
 	 * Initialise the Copper Initialisation List
 	 */
 
-static void ami_init_copper(void)
+__initfunc(static void ami_init_copper(void))
 {
 	copins *cop = copdisplay.init;
 	u_long p;

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

