From: "Antonino A. Daplas" <adaplas@gmail.com>

Add rudimentary support by manipulating the VGA registers.  However, not
all vesa modes are VGA compatible, so VGA compatiblity is checked first. 
Only 2 levels are supported, powerup and powerdown.

Signed-off-by: Antonino Daplas <adaplas@pol.net>
Signed-off-by: Andrew Morton <akpm@osdl.org>
---

 arch/i386/boot/video.S |    5 +++++
 drivers/video/vesafb.c |   38 ++++++++++++++++++++++++++++++++++++++
 include/linux/tty.h    |    3 ++-
 3 files changed, 45 insertions(+), 1 deletion(-)

diff -puN arch/i386/boot/video.S~vesafb-add-blanking-support arch/i386/boot/video.S
--- devel/arch/i386/boot/video.S~vesafb-add-blanking-support	2005-07-30 00:44:45.000000000 -0700
+++ devel-akpm/arch/i386/boot/video.S	2005-07-30 00:44:45.000000000 -0700
@@ -97,6 +97,7 @@
 #define PARAM_VESAPM_OFF	0x30
 #define PARAM_LFB_PAGES		0x32
 #define PARAM_VESA_ATTRIB	0x34
+#define PARAM_CAPABILITIES      0x36
 
 /* Define DO_STORE according to CONFIG_VIDEO_RETAIN */
 #ifdef CONFIG_VIDEO_RETAIN
@@ -233,6 +234,10 @@ mopar_gr:
 	movw	18(%di), %ax
 	movl	%eax, %fs:(PARAM_LFB_SIZE)
 
+# store mode capabilities
+	movl    10(%di), %eax
+	movl    %eax, %fs:(PARAM_CAPABILITIES)
+
 # switching the DAC to 8-bit is for <= 8 bpp only
 	movw	%fs:(PARAM_LFB_DEPTH), %ax
 	cmpw	$8, %ax
diff -puN drivers/video/vesafb.c~vesafb-add-blanking-support drivers/video/vesafb.c
--- devel/drivers/video/vesafb.c~vesafb-add-blanking-support	2005-07-30 00:44:45.000000000 -0700
+++ devel-akpm/drivers/video/vesafb.c	2005-07-30 00:44:45.000000000 -0700
@@ -19,6 +19,7 @@
 #include <linux/fb.h>
 #include <linux/ioport.h>
 #include <linux/init.h>
+#include <video/vga.h>
 #include <asm/io.h>
 #include <asm/mtrr.h>
 
@@ -54,6 +55,7 @@ static unsigned short  *pmi_base  = NULL
 static void            (*pmi_start)(void);
 static void            (*pmi_pal)(void);
 static int             depth;
+static int             vga_compat;
 
 /* --------------------------------------------------------------------- */
 
@@ -86,6 +88,37 @@ static int vesafb_pan_display(struct fb_
 	return 0;
 }
 
+static int vesafb_blank(int blank, struct fb_info *info)
+{
+	int err = 1;
+
+	if (vga_compat) {
+		int loop = 10000;
+		u8 seq = 0, crtc17 = 0;
+
+		err = 0;
+
+		if (blank) {
+			seq = 0x20;
+			crtc17 = 0x00;
+		} else {
+			seq = 0x00;
+			crtc17 = 0x80;
+		}
+
+		vga_wseq(NULL, 0x00, 0x01);
+		seq |= vga_rseq(NULL, 0x01) & ~0x20;
+		vga_wseq(NULL, 0x00, seq);
+
+		crtc17 |= vga_rcrt(NULL, 0x17) & ~0x80;
+		while (loop--);
+		vga_wcrt(NULL, 0x17, crtc17);
+		vga_wseq(NULL, 0x00, 0x03);
+	}
+
+	return err;
+}
+
 static void vesa_setpalette(int regno, unsigned red, unsigned green,
 			    unsigned blue)
 {
@@ -176,6 +209,7 @@ static struct fb_ops vesafb_ops = {
 	.owner		= THIS_MODULE,
 	.fb_setcolreg	= vesafb_setcolreg,
 	.fb_pan_display	= vesafb_pan_display,
+	.fb_blank       = vesafb_blank,
 	.fb_fillrect	= cfb_fillrect,
 	.fb_copyarea	= cfb_copyarea,
 	.fb_imageblit	= cfb_imageblit,
@@ -429,6 +463,10 @@ static int __init vesafb_probe(struct de
 	info->flags = FBINFO_FLAG_DEFAULT |
 		(ypan) ? FBINFO_HWACCEL_YPAN : 0;
 
+	vga_compat = (screen_info.capabilities & 2) ? 0 : 1;
+	printk("vesafb: Mode is %sVGA compatible\n",
+	       (vga_compat) ? "" : "not ");
+
 	if (fb_alloc_cmap(&info->cmap, 256, 0) < 0) {
 		err = -ENOMEM;
 		goto err;
diff -puN include/linux/tty.h~vesafb-add-blanking-support include/linux/tty.h
--- devel/include/linux/tty.h~vesafb-add-blanking-support	2005-07-30 00:44:45.000000000 -0700
+++ devel-akpm/include/linux/tty.h	2005-07-30 00:44:45.000000000 -0700
@@ -74,7 +74,8 @@ struct screen_info {
 	u16 vesapm_off;		/* 0x30 */
 	u16 pages;		/* 0x32 */
 	u16 vesa_attributes;	/* 0x34 */
-				/* 0x36 -- 0x3f reserved for future expansion */
+	u32  capabilities;      /* 0x36 */
+				/* 0x3a -- 0x3f reserved for future expansion */
 };
 
 extern struct screen_info screen_info;
_