aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorAntonino Daplas <adaplas@hotpop.com>2004-08-22 22:52:54 -0700
committerLinus Torvalds <torvalds@ppc970.osdl.org>2004-08-22 22:52:54 -0700
commitebf4fd17653bea269594fa54c5aedc18efd3ffa7 (patch)
treef1d32ef493bdf0184b4b4aaf87dec3d2561a97dd /drivers
parent216f473e2f7628a0d458766d9cbfd043fdef2cac (diff)
downloadhistory-ebf4fd17653bea269594fa54c5aedc18efd3ffa7.tar.gz
[PATCH] fbdev: use 8-bit DAC for capable hardware
The patch adds the ability for vesafb to switch the DAC from 6-bit to 8-bit at kernel boot. Besides fixing the failure to draw the 224-color logo, an 8-bit DAC will also provide a wider color range for user applications. Signed-off-by: Antonino Daplas <adaplas@pol.net> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/video/vesafb.c62
1 files changed, 30 insertions, 32 deletions
diff --git a/drivers/video/vesafb.c b/drivers/video/vesafb.c
index 15f7f8e4761416..85553ed9bad736 100644
--- a/drivers/video/vesafb.c
+++ b/drivers/video/vesafb.c
@@ -87,15 +87,17 @@ static int vesafb_pan_display(struct fb_var_screeninfo *var,
return 0;
}
-static void vesa_setpalette(int regno, unsigned red, unsigned green, unsigned blue)
+static void vesa_setpalette(int regno, unsigned red, unsigned green,
+ unsigned blue, struct fb_var_screeninfo *var)
{
#ifdef __i386__
struct { u_char blue, green, red, pad; } entry;
+ int shift = 16 - var->green.length;
if (pmi_setpal) {
- entry.red = red >> 10;
- entry.green = green >> 10;
- entry.blue = blue >> 10;
+ entry.red = red >> shift;
+ entry.green = green >> shift;
+ entry.blue = blue >> shift;
entry.pad = 0;
__asm__ __volatile__(
"call *(%%esi)"
@@ -109,9 +111,9 @@ static void vesa_setpalette(int regno, unsigned red, unsigned green, unsigned bl
} else {
/* without protected mode interface, try VGA registers... */
outb_p(regno, dac_reg);
- outb_p(red >> 10, dac_val);
- outb_p(green >> 10, dac_val);
- outb_p(blue >> 10, dac_val);
+ outb_p(red >> shift, dac_val);
+ outb_p(green >> shift, dac_val);
+ outb_p(blue >> shift, dac_val);
}
#endif
}
@@ -132,7 +134,7 @@ static int vesafb_setcolreg(unsigned regno, unsigned red, unsigned green,
switch (info->var.bits_per_pixel) {
case 8:
- vesa_setpalette(regno,red,green,blue);
+ vesa_setpalette(regno,red,green,blue, &info->var);
break;
case 16:
if (info->var.red.offset == 10) {
@@ -331,30 +333,26 @@ static int __init vesafb_probe(struct device *device)
vesafb_defined.left_margin = (vesafb_defined.xres / 8) & 0xf8;
vesafb_defined.hsync_len = (vesafb_defined.xres / 8) & 0xf8;
- if (vesafb_defined.bits_per_pixel > 8) {
- vesafb_defined.red.offset = screen_info.red_pos;
- vesafb_defined.red.length = screen_info.red_size;
- vesafb_defined.green.offset = screen_info.green_pos;
- vesafb_defined.green.length = screen_info.green_size;
- vesafb_defined.blue.offset = screen_info.blue_pos;
- vesafb_defined.blue.length = screen_info.blue_size;
- vesafb_defined.transp.offset = screen_info.rsvd_pos;
- vesafb_defined.transp.length = screen_info.rsvd_size;
- printk(KERN_INFO "vesafb: directcolor: "
- "size=%d:%d:%d:%d, shift=%d:%d:%d:%d\n",
- screen_info.rsvd_size,
- screen_info.red_size,
- screen_info.green_size,
- screen_info.blue_size,
- screen_info.rsvd_pos,
- screen_info.red_pos,
- screen_info.green_pos,
- screen_info.blue_pos);
- } else {
- vesafb_defined.red.length = 6;
- vesafb_defined.green.length = 6;
- vesafb_defined.blue.length = 6;
- }
+ vesafb_defined.red.offset = screen_info.red_pos;
+ vesafb_defined.red.length = screen_info.red_size;
+ vesafb_defined.green.offset = screen_info.green_pos;
+ vesafb_defined.green.length = screen_info.green_size;
+ vesafb_defined.blue.offset = screen_info.blue_pos;
+ vesafb_defined.blue.length = screen_info.blue_size;
+ vesafb_defined.transp.offset = screen_info.rsvd_pos;
+ vesafb_defined.transp.length = screen_info.rsvd_size;
+ printk(KERN_INFO "vesafb: %s: "
+ "size=%d:%d:%d:%d, shift=%d:%d:%d:%d\n",
+ (vesafb_defined.bits_per_pixel > 8) ?
+ "Truecolor" : "Pseudocolor",
+ screen_info.rsvd_size,
+ screen_info.red_size,
+ screen_info.green_size,
+ screen_info.blue_size,
+ screen_info.rsvd_pos,
+ screen_info.red_pos,
+ screen_info.green_pos,
+ screen_info.blue_pos);
vesafb_fix.ypanstep = ypan ? 1 : 0;
vesafb_fix.ywrapstep = (ypan>1) ? 1 : 0;