Skip to content

Commit

Permalink
[PATCH] vesafb: Add blanking support
Browse files Browse the repository at this point in the history
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>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
  • Loading branch information
Antonino A. Daplas authored and Linus Torvalds committed Sep 9, 2005
1 parent 7726e9e commit d2d5838
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 1 deletion.
5 changes: 5 additions & 0 deletions arch/i386/boot/video.S
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
38 changes: 38 additions & 0 deletions drivers/video/vesafb.c
Original file line number Diff line number Diff line change
Expand Up @@ -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>

Expand Down Expand Up @@ -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;

/* --------------------------------------------------------------------- */

Expand Down Expand Up @@ -86,6 +88,37 @@ static int vesafb_pan_display(struct fb_var_screeninfo *var,
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)
{
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -429,6 +463,10 @@ static int __init vesafb_probe(struct device *device)
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;
Expand Down
3 changes: 2 additions & 1 deletion include/linux/tty.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down

0 comments on commit d2d5838

Please sign in to comment.