diff options
author | Antonino Daplas <adaplas@hotpop.com> | 2004-08-22 22:52:54 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2004-08-22 22:52:54 -0700 |
commit | ebf4fd17653bea269594fa54c5aedc18efd3ffa7 (patch) | |
tree | f1d32ef493bdf0184b4b4aaf87dec3d2561a97dd /drivers | |
parent | 216f473e2f7628a0d458766d9cbfd043fdef2cac (diff) | |
download | history-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.c | 62 |
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; |