X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Fvideo%2Fvesafb.c;h=c5c649d9b1aebf7fcd0dbbbc84ee2153437a62c8;hb=c7b5ebbddf7bcd3651947760f423e3783bbe6573;hp=b8cb975083f06718fd7330748beff4099f6c3e7c;hpb=9213980e6a70d8473e0ffd4b39ab5b6caaba9ff5;p=linux-2.6.git diff --git a/drivers/video/vesafb.c b/drivers/video/vesafb.c index b8cb97508..c5c649d9b 100644 --- a/drivers/video/vesafb.c +++ b/drivers/video/vesafb.c @@ -52,7 +52,7 @@ static int mtrr = 1; static int vram __initdata = 0; /* Set amount of memory to be used */ static int pmi_setpal = 0; /* pmi for palette changes ??? */ static int ypan = 0; /* 0..nothing, 1..ypan, 2..ywrap */ -static unsigned short *pmi_base = 0; +static unsigned short *pmi_base = NULL; static void (*pmi_start)(void); static void (*pmi_pal)(void); @@ -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; @@ -378,7 +376,8 @@ static int __init vesafb_probe(struct device *device) info->fbops = &vesafb_ops; info->var = vesafb_defined; info->fix = vesafb_fix; - info->flags = FBINFO_FLAG_DEFAULT; + info->flags = FBINFO_FLAG_DEFAULT | + (ypan) ? FBINFO_HWACCEL_YPAN : 0; if (fb_alloc_cmap(&info->cmap, 256, 0) < 0) { err = -ENXIO; @@ -411,7 +410,11 @@ static struct platform_device vesafb_device = { int __init vesafb_init(void) { int ret; + char *option = NULL; + /* ignore error return of fb_get_options */ + fb_get_options("vesafb", &option); + vesafb_setup(option); ret = driver_register(&vesafb_driver); if (!ret) { @@ -421,6 +424,7 @@ int __init vesafb_init(void) } return ret; } +module_init(vesafb_init); /* * Overrides for Emacs so that we follow Linus's tabbing style.