vserver 1.9.5.x5
[linux-2.6.git] / drivers / video / tridentfb.c
index 500e977..42e18fd 100644 (file)
@@ -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 <jani@iv.ro>");