X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Fvideo%2Ftridentfb.c;h=42e18fda51dcfcb0596459363b49bbf79ad8a814;hb=6a77f38946aaee1cd85eeec6cf4229b204c15071;hp=500e97766989d7bca6184844a0b1c951d9a65373;hpb=5273a3df6485dc2ad6aa7ddd441b9a21970f003b;p=linux-2.6.git diff --git a/drivers/video/tridentfb.c b/drivers/video/tridentfb.c index 500e97766..42e18fda5 100644 --- a/drivers/video/tridentfb.c +++ b/drivers/video/tridentfb.c @@ -28,7 +28,7 @@ struct tridentfb_par { int vclk; //in MHz - unsigned long io_virt; //iospace virtual memory address + void __iomem * io_virt; //iospace virtual memory address }; unsigned char eng_oper; //engine operation... @@ -38,7 +38,7 @@ static struct tridentfb_par default_par; /* FIXME:kmalloc these 3 instead */ static struct fb_info fb_info; -static int pseudo_pal[16]; +static u32 pseudo_pal[16]; static struct fb_var_screeninfo default_var; @@ -76,16 +76,16 @@ static int memdiff; static int nativex; -MODULE_PARM(mode,"s"); -MODULE_PARM(bpp,"i"); -MODULE_PARM(center,"i"); -MODULE_PARM(stretch,"i"); -MODULE_PARM(noaccel,"i"); -MODULE_PARM(memsize,"i"); -MODULE_PARM(memdiff,"i"); -MODULE_PARM(nativex,"i"); -MODULE_PARM(fp,"i"); -MODULE_PARM(crt,"i"); +module_param(mode, charp, 0); +module_param(bpp, int, 0); +module_param(center, int, 0); +module_param(stretch, int, 0); +module_param(noaccel, int, 0); +module_param(memsize, int, 0); +module_param(memdiff, int, 0); +module_param(nativex, int, 0); +module_param(fp, int, 0); +module_param(crt, int, 0); static int chip3D; @@ -450,7 +450,7 @@ static struct accel_switch accel_image = { /* * Accel functions called by the upper layers */ - +#ifdef CONFIG_FB_TRIDENT_ACCEL static void tridentfb_fillrect(struct fb_info * info, const struct fb_fillrect *fr) { int bpp = info->var.bits_per_pixel; @@ -460,7 +460,7 @@ static void tridentfb_fillrect(struct fb_info * info, const struct fb_fillrect * default: case 8: col = fr->color; break; - case 16: col = ((u16 *)(info->pseudo_palette))[fr->color]; + case 16: col = ((u32 *)(info->pseudo_palette))[fr->color]; break; case 32: col = ((u32 *)(info->pseudo_palette))[fr->color]; break; @@ -474,6 +474,11 @@ static void tridentfb_copyarea(struct fb_info *info, const struct fb_copyarea *c acc->copy_rect(ca->sx,ca->sy,ca->dx,ca->dy,ca->width,ca->height); acc->wait_engine(); } +#else /* !CONFIG_FB_TRIDENT_ACCEL */ +#define tridentfb_fillrect cfb_fillrect +#define tridentfb_copyarea cfb_copyarea +#endif /* CONFIG_FB_TRIDENT_ACCEL */ + /* * Hardware access functions @@ -518,13 +523,6 @@ static inline void writeAttr(int reg, unsigned char val) t_outb(val, 0x3C0); } -static inline unsigned char readAttr(int reg) -{ - readb(((struct tridentfb_par *)fb_info.par)->io_virt + CRT + 0x0A); //flip-flop to index - t_outb(reg, 0x3C0); - return t_inb(0x3C1); -} - static inline void write3CE(int reg, unsigned char val) { t_outb(reg, 0x3CE); @@ -985,7 +983,7 @@ static int tridentfb_setcolreg(unsigned regno, unsigned red, unsigned green, } else if (bpp == 16) /* RGB 565 */ - ((u16*)info->pseudo_palette)[regno] = (red & 0xF800) | + ((u32*)info->pseudo_palette)[regno] = (red & 0xF800) | ((green & 0xFC00) >> 5) | ((blue & 0xF800) >> 11); else if (bpp == 32) /* ARGB 8888 */ @@ -1012,22 +1010,24 @@ static int tridentfb_blank(int blank_mode, struct fb_info *info) DPMSCont = read3CE(PowerStatus) & 0xFC; switch (blank_mode) { - case VESA_NO_BLANKING: + case FB_BLANK_UNBLANK: /* Screen: On, HSync: On, VSync: On */ + case FB_BLANK_NORMAL: + /* Screen: Off, HSync: On, VSync: On */ PMCont |= 0x03; DPMSCont |= 0x00; break; - case VESA_HSYNC_SUSPEND: + case FB_BLANK_HSYNC_SUSPEND: /* Screen: Off, HSync: Off, VSync: On */ PMCont |= 0x02; DPMSCont |= 0x01; break; - case VESA_VSYNC_SUSPEND: + case FB_BLANK_VSYNC_SUSPEND: /* Screen: Off, HSync: On, VSync: Off */ PMCont |= 0x02; DPMSCont |= 0x02; break; - case VESA_POWERDOWN: + case FB_BLANK_POWERDOWN: /* Screen: Off, HSync: Off, VSync: Off */ PMCont |= 0x00; DPMSCont |= 0x03; @@ -1039,7 +1039,9 @@ static int tridentfb_blank(int blank_mode, struct fb_info *info) t_outb(PMCont,0x83C6); debug("exit\n"); - return 0; + + /* let fbcon do a softblank for us */ + return (blank_mode == FB_BLANK_NORMAL) ? 1 : 0; } static int __devinit trident_pci_probe(struct pci_dev * dev, const struct pci_device_id * id) @@ -1102,7 +1104,7 @@ static int __devinit trident_pci_probe(struct pci_dev * dev, const struct pci_de return -1; } - default_par.io_virt = (unsigned long)ioremap_nocache(tridentfb_fix.mmio_start, tridentfb_fix.mmio_len); + default_par.io_virt = ioremap_nocache(tridentfb_fix.mmio_start, tridentfb_fix.mmio_len); if (!default_par.io_virt) { release_region(tridentfb_fix.mmio_start, tridentfb_fix.mmio_len); @@ -1144,7 +1146,10 @@ static int __devinit trident_pci_probe(struct pci_dev * dev, const struct pci_de fb_info.fbops = &tridentfb_ops; - fb_info.flags = FBINFO_FLAG_DEFAULT; + fb_info.flags = FBINFO_DEFAULT | FBINFO_HWACCEL_YPAN; +#ifdef CONFIG_FB_TRIDENT_ACCEL + fb_info.flags |= FBINFO_HWACCEL_COPYAREA | FBINFO_HWACCEL_FILLRECT; +#endif fb_info.pseudo_palette = pseudo_pal; if (!fb_find_mode(&default_var,&fb_info,mode,NULL,0,NULL,bpp)) @@ -1156,6 +1161,7 @@ static int __devinit trident_pci_probe(struct pci_dev * dev, const struct pci_de default_var.accel_flags &= ~FB_ACCELF_TEXT; default_var.activate |= FB_ACTIVATE_NOW; fb_info.var = default_var; + fb_info.device = &dev->dev; if (register_framebuffer(&fb_info) < 0) { output("Could not register Trident framebuffer\n"); return -EINVAL; @@ -1170,8 +1176,8 @@ static void __devexit trident_pci_remove(struct pci_dev * dev) { struct tridentfb_par *par = (struct tridentfb_par*)fb_info.par; unregister_framebuffer(&fb_info); - iounmap((void *)par->io_virt); - iounmap((void*)fb_info.screen_base); + iounmap(par->io_virt); + iounmap(fb_info.screen_base); release_mem_region(tridentfb_fix.smem_start, tridentfb_fix.smem_len); release_region(tridentfb_fix.mmio_start, tridentfb_fix.mmio_len); } @@ -1210,8 +1216,17 @@ static struct pci_driver tridentfb_pci_driver = { .remove = __devexit_p(trident_pci_remove) }; +int tridentfb_setup(char *options); + int __init tridentfb_init(void) { +#ifndef MODULE + char *option = NULL; + + if (fb_get_options("tridentfb", &option)) + return -ENODEV; + tridentfb_setup(option); +#endif output("Trident framebuffer %s initializing\n", VERSION); return pci_module_init(&tridentfb_pci_driver); } @@ -1265,17 +1280,13 @@ static struct fb_ops tridentfb_ops = { .fb_blank = tridentfb_blank, .fb_check_var = tridentfb_check_var, .fb_set_par = tridentfb_set_par, -// .fb_fillrect = tridentfb_fillrect, -// .fb_copyarea= tridentfb_copyarea, - .fb_fillrect = cfb_fillrect, - .fb_copyarea= cfb_copyarea, + .fb_fillrect = tridentfb_fillrect, + .fb_copyarea= tridentfb_copyarea, .fb_imageblit = cfb_imageblit, .fb_cursor = soft_cursor, }; -#ifdef MODULE module_init(tridentfb_init); -#endif module_exit(tridentfb_exit); MODULE_AUTHOR("Jani Monoses ");