public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH-2.5] neofb 0.4.1
@ 2002-11-01 12:48 Denis Oliver Kropp
  2002-11-01 12:59 ` Denis Oliver Kropp
  0 siblings, 1 reply; 3+ messages in thread
From: Denis Oliver Kropp @ 2002-11-01 12:48 UTC (permalink / raw)
  To: linux-kernel

[-- Attachment #1: Type: text/plain, Size: 396 bytes --]

Hi,

this patch replaces the neofb 0.4 patch and additionally
includes code style changes requested by Arnaldo Carvalho de Melo.

-- 
Best regards,
  Denis Oliver Kropp

.------------------------------------------.
| DirectFB - Hardware accelerated graphics |
| http://www.directfb.org/                 |
"------------------------------------------"

                            Convergence GmbH

[-- Attachment #2: linux-2.5.44-neofb-0.4.1.patch --]
[-- Type: text/plain, Size: 10797 bytes --]

diff -Naur linux-2.5.44/drivers/char/toshiba.c linux-2.5.44-neofb-0.4.1/drivers/char/toshiba.c
--- linux-2.5.44/drivers/char/toshiba.c	2002-10-19 06:02:31.000000000 +0200
+++ linux-2.5.44-neofb-0.4.1/drivers/char/toshiba.c	2002-10-30 17:03:24.000000000 +0100
@@ -210,7 +210,7 @@
 /*
  * Put the laptop into System Management Mode
  */
-static int tosh_smm(SMMRegisters *regs)
+int tosh_smm(SMMRegisters *regs)
 {
 	int eax;
 
diff -Naur linux-2.5.44/drivers/video/neofb.c linux-2.5.44-neofb-0.4.1/drivers/video/neofb.c
--- linux-2.5.44/drivers/video/neofb.c	2002-10-19 06:02:00.000000000 +0200
+++ linux-2.5.44-neofb-0.4.1/drivers/video/neofb.c	2002-11-01 12:57:56.000000000 +0100
@@ -1,7 +1,7 @@
 /*
  * linux/drivers/video/neofb.c -- NeoMagic Framebuffer Driver
  *
- * Copyright (c) 2001  Denis Oliver Kropp <dok@convergence.de>
+ * Copyright (c) 2001-2002  Denis Oliver Kropp <dok@directfb.org>
  *
  *
  * Card specific code is based on XFree86's neomagic driver.
@@ -11,6 +11,16 @@
  * Public License.  See the file COPYING in the main directory of this
  * archive for more details.
  *
+ *
+ * 0.4.1
+ *  - Cosmetic changes (dok)
+ *
+ * 0.4
+ *  - Toshiba Libretto support, allow modes larger than LCD size if
+ *    LCD is disabled, keep BIOS settings if internal/external display
+ *    haven't been enabled explicitly
+ *                          (Thomas J. Moore <dark@mama.indstate.edu>)
+ *
  * 0.3.3
  *  - Porting over to new fbdev api. (jsimmons)
  *  
@@ -56,6 +66,10 @@
 #include <linux/fb.h>
 #include <linux/pci.h>
 #include <linux/init.h>
+#ifdef CONFIG_TOSHIBA
+#include <linux/toshiba.h>
+extern int tosh_smm(SMMRegisters *regs);
+#endif
 
 #include <asm/io.h>
 #include <asm/irq.h>
@@ -70,17 +84,18 @@
 #include <video/fbcon.h>
 #include <video/neomagic.h>
 
-#define NEOFB_VERSION "0.3.3"
+#define NEOFB_VERSION "0.4"
 
 struct neofb_par default_par;
 
 /* --------------------------------------------------------------------- */
 
-static int disabled = 0;
-static int internal = 0;
-static int external = 0;
-static int nostretch = 0;
-static int nopciburst = 0;
+static int disabled;
+static int internal;
+static int external;
+static int libretto;
+static int nostretch;
+static int nopciburst;
 
 
 #ifdef MODULE
@@ -94,6 +109,8 @@
 MODULE_PARM_DESC(internal, "Enable output on internal LCD Display.");
 MODULE_PARM(external, "i");
 MODULE_PARM_DESC(external, "Enable output on external CRT.");
+MODULE_PARM(libretto, "i");
+MODULE_PARM_DESC(libretto, "Force Libretto 100/110 800x480 LCD.");
 MODULE_PARM(nostretch, "i");
 MODULE_PARM_DESC(nostretch,
 		 "Disable stretching of modes smaller than LCD.");
@@ -551,8 +568,9 @@
 	timings.sync = var->sync;
 
 	/* Is the mode larger than the LCD panel? */
-	if ((var->xres > par->NeoPanelWidth) ||
-	    (var->yres > par->NeoPanelHeight)) {
+	if (par->internal_display &&
+            ((var->xres > par->NeoPanelWidth) ||
+	     (var->yres > par->NeoPanelHeight))) {
 		printk(KERN_INFO
 		       "Mode (%dx%d) larger than the LCD panel (%dx%d)\n",
 		       var->xres, var->yres, par->NeoPanelWidth,
@@ -561,23 +579,27 @@
 	}
 
 	/* Is the mode one of the acceptable sizes? */
-	switch (var->xres) {
-	case 1280:
-		if (var->yres == 1024)
-			mode_ok = 1;
-		break;
-	case 1024:
-		if (var->yres == 768)
-			mode_ok = 1;
-		break;
-	case 800:
-		if (var->yres == 600)
-			mode_ok = 1;
-		break;
-	case 640:
-		if (var->yres == 480)
-			mode_ok = 1;
-		break;
+	if (!par->internal_display)
+		mode_ok = 1;
+	else {
+		switch (var->xres) {
+		case 1280:
+			if (var->yres == 1024)
+				mode_ok = 1;
+			break;
+		case 1024:
+			if (var->yres == 768)
+				mode_ok = 1;
+			break;
+		case 800:
+			if (var->yres == (par->libretto ? 480 : 600))
+				mode_ok = 1;
+			break;
+		case 640:
+			if (var->yres == 480)
+				mode_ok = 1;
+			break;
+		}
 	}
 
 	if (!mode_ok) {
@@ -1261,6 +1283,17 @@
 
 	switch (blank) {
 	case 4:		/* powerdown - both sync lines down */
+#ifdef CONFIG_TOSHIBA
+		/* attempt to turn off backlight on toshiba; also turns off external */
+		{
+			SMMRegisters regs;
+
+			regs.eax = 0xff00; /* HCI_SET */
+			regs.ebx = 0x0002; /* HCI_BACKLIGHT */
+			regs.ecx = 0x0000; /* HCI_DISABLE */
+			tosh_smm(&regs);
+		}
+#endif
 		break;
 	case 3:		/* hsync off */
 		break;
@@ -1269,6 +1302,17 @@
 	case 1:		/* just software blanking of screen */
 		break;
 	default:		/* case 0, or anything else: unblank */
+#ifdef CONFIG_TOSHIBA
+		/* attempt to re-enable backlight/external on toshiba */
+		{
+			SMMRegisters regs;
+
+			regs.eax = 0xff00; /* HCI_SET */
+			regs.ebx = 0x0002; /* HCI_BACKLIGHT */
+			regs.ecx = 0x0001; /* HCI_ENABLE */
+			tosh_smm(&regs);
+		}
+#endif
 		break;
 	}
 	return 0;
@@ -1403,75 +1447,93 @@
 /* --------------------------------------------------------------------- */
 
 static struct fb_var_screeninfo __devinitdata neofb_var640x480x8 = {
-	accel_flags:	FB_ACCELF_TEXT,
-	xres:		640,
-	yres:		480,
-	xres_virtual:	640,
-	yres_virtual:	30000,
-	bits_per_pixel:	8,
-	pixclock:	39722,
-	left_margin:	48,
-	right_margin:	16,
-	upper_margin:	33,
-	lower_margin:	10,
-	hsync_len:	96,
-	vsync_len:	2,
-	vmode:		FB_VMODE_NONINTERLACED
+	.accel_flags    = FB_ACCELF_TEXT,
+	.xres           = 640,
+	.yres           = 480,
+	.xres_virtual   = 640,
+	.yres_virtual   = 30000,
+	.bits_per_pixel = 8,
+	.pixclock       = 39722,
+	.left_margin    = 48,
+	.right_margin   = 16,
+	.upper_margin   = 33,
+	.lower_margin   = 10,
+	.hsync_len      = 96,
+	.vsync_len      = 2,
+	.vmode          = FB_VMODE_NONINTERLACED
 };
 
 static struct fb_var_screeninfo __devinitdata neofb_var800x600x8 = {
-	accel_flags:	FB_ACCELF_TEXT,
-	xres:		800,
-	yres:		600,
-	xres_virtual:	800,
-	yres_virtual:	30000,
-	bits_per_pixel:	8,
-	pixclock:	25000,
-	left_margin:	88,
-	right_margin:	40,
-	upper_margin:	23,
-	lower_margin:	1,
-	hsync_len:	128,
-	vsync_len:	4,
-	sync:		FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
-	vmode:		FB_VMODE_NONINTERLACED
+	.accel_flags    = FB_ACCELF_TEXT,
+	.xres           = 800,
+	.yres           = 600,
+	.xres_virtual   = 800,
+	.yres_virtual   = 30000,
+	.bits_per_pixel = 8,
+	.pixclock       = 25000,
+	.left_margin    = 88,
+	.right_margin   = 40,
+	.upper_margin   = 23,
+	.lower_margin   = 1,
+	.hsync_len      = 128,
+	.vsync_len      = 4,
+	.sync           = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
+	.vmode          = FB_VMODE_NONINTERLACED
+};
+
+static struct fb_var_screeninfo __devinitdata neofb_var800x480x8 = {
+	.accel_flags    = FB_ACCELF_TEXT,
+	.xres           = 800,
+	.yres           = 480,
+	.xres_virtual   = 800,
+	.yres_virtual   = 30000,
+	.bits_per_pixel = 8,
+	.pixclock       = 25000,
+	.left_margin    = 88,
+	.right_margin   = 40,
+	.upper_margin   = 23,
+	.lower_margin   = 1,
+	.hsync_len      = 128,
+	.vsync_len      = 4,
+	.sync           = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
+	.vmode          = FB_VMODE_NONINTERLACED
 };
 
 static struct fb_var_screeninfo __devinitdata neofb_var1024x768x8 = {
-	accel_flags:	FB_ACCELF_TEXT,
-	xres:		1024,
-	yres:		768,
-	xres_virtual:	1024,
-	yres_virtual:	30000,
-	bits_per_pixel:	8,
-	pixclock:	15385,
-	left_margin:	160,
-	right_margin:	24,
-	upper_margin:	29,
-	lower_margin:	3,
-	hsync_len:	136,
-	vsync_len:	6,
-	sync:		FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
-	vmode:		FB_VMODE_NONINTERLACED
+	.accel_flags    = FB_ACCELF_TEXT,
+	.xres           = 1024,
+	.yres           = 768,
+	.xres_virtual   = 1024,
+	.yres_virtual   = 30000,
+	.bits_per_pixel = 8,
+	.pixclock       = 15385,
+	.left_margin    = 160,
+	.right_margin   = 24,
+	.upper_margin   = 29,
+	.lower_margin   = 3,
+	.hsync_len      = 136,
+	.vsync_len      = 6,
+	.sync           = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
+	.vmode          = FB_VMODE_NONINTERLACED
 };
 
 #ifdef NOT_DONE
 static struct fb_var_screeninfo __devinitdata neofb_var1280x1024x8 = {
-	accel_flags:	FB_ACCELF_TEXT,
-	xres:		1280,
-	yres:		1024,
-	xres_virtual:	1280,
-	yres_virtual:	30000,
-	bits_per_pixel:	8,
-	pixclock:	9260,
-	left_margin:	248,
-	right_margin:	48,
-	upper_margin:	38,
-	lower_margin:	1,
-	hsync_len:	112,
-	vsync_len:	3,
-	sync:		FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
-	vmode:		FB_VMODE_NONINTERLACED
+	.accel_flags    = FB_ACCELF_TEXT,
+	.xres           = 1280,
+	.yres           = 1024,
+	.xres_virtual   = 1280,
+	.yres_virtual   = 30000,
+	.bits_per_pixel = 8,
+	.pixclock       = 9260,
+	.left_margin    = 248,
+	.right_margin   = 48,
+	.upper_margin   = 38,
+	.lower_margin   = 1,
+	.hsync_len      = 112,
+	.vsync_len      = 3,
+	.sync           = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
+	.vmode          = FB_VMODE_NONINTERLACED
 };
 #endif
 
@@ -1609,6 +1671,13 @@
 	VGAwGR(0x09, 0x26);
 	type = VGArGR(0x21);
 	display = VGArGR(0x20);
+	if (!par->internal_display && !par->external_display) {
+		par->internal_display = display & 2 || !(display & 3) ? 1 : 0;
+		par->external_display = display & 1;
+		printk (KERN_INFO "Autodetected %s display\n",
+			par->internal_display && par->external_display ? "simultaneous" :
+			par->internal_display ? "internal" : "external");
+	}
 
 	/* Determine panel width -- used in NeoValidMode. */
 	w = VGArGR(0x20);
@@ -1621,8 +1690,8 @@
 		break;
 	case 0x01:
 		par->NeoPanelWidth = 800;
-		par->NeoPanelHeight = 600;
-		neofb_var = &neofb_var800x600x8;
+		par->NeoPanelHeight = par->libretto ? 480 : 600;
+		neofb_var = par->libretto ? &neofb_var800x480x8 : &neofb_var800x600x8;
 		break;
 	case 0x02:
 		par->NeoPanelWidth = 1024;
@@ -1638,7 +1707,7 @@
 		break;
 #else
 		printk(KERN_ERR
-		       "neofb: Only 640x480, 800x600 and 1024x768 panels are currently supported\n");
+		       "neofb: Only 640x480, 800x600/480 and 1024x768 panels are currently supported\n");
 		return -1;
 #endif
 	default:
@@ -1766,14 +1835,10 @@
 
 	par->pci_burst = !nopciburst;
 	par->lcd_stretch = !nostretch;
+	par->libretto = libretto;
 
-	if (!internal && !external) {
-		par->internal_display = 1;
-		par->external_display = 0;
-	} else {
-		par->internal_display = internal;
-		par->external_display = external;
-	}
+	par->internal_display = internal;
+	par->external_display = external;
 
 	switch (info->fix.accel) {
 	case FB_ACCEL_NEOMAGIC_NM2070:
@@ -2036,6 +2101,8 @@
 			nostretch = 1;
 		if (!strncmp(this_opt, "nopciburst", 10))
 			nopciburst = 1;
+		if (!strncmp(this_opt, "libretto", 8))
+			libretto = 1;
 	}
 
 	return 0;
diff -Naur linux-2.5.44/include/video/neomagic.h linux-2.5.44-neofb-0.4.1/include/video/neomagic.h
--- linux-2.5.44/include/video/neomagic.h	2002-10-19 06:01:48.000000000 +0200
+++ linux-2.5.44-neofb-0.4.1/include/video/neomagic.h	2002-10-30 17:50:44.000000000 +0100
@@ -176,6 +176,7 @@
   int lcd_stretch;
   int internal_display;
   int external_display;
+  int libretto;
 };
 
 typedef struct {

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2002-11-01 15:45 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2002-11-01 12:48 [PATCH-2.5] neofb 0.4.1 Denis Oliver Kropp
2002-11-01 12:59 ` Denis Oliver Kropp
2002-11-01 16:45   ` James Simmons

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox