vserver 1.9.5.x5
[linux-2.6.git] / drivers / video / imsttfb.c
index 6b1635c..233884c 100644 (file)
@@ -319,7 +319,7 @@ struct imstt_regvals {
 
 struct imstt_par {
        struct imstt_regvals init;
-       __u32 *dc_regs;
+       __u32 __iomem *dc_regs;
        unsigned long cmap_regs_phys;
        __u8 *cmap_regs;
        __u32 ramdac;
@@ -406,19 +406,19 @@ static void imsttfb_remove(struct pci_dev *pdev);
 /*
  * Register access
  */
-static inline u32 read_reg_le32(volatile u32 *base, int regindex)
+static inline u32 read_reg_le32(volatile u32 __iomem *base, int regindex)
 {
 #ifdef __powerpc__
-       return in_le32((volatile u32 *) (base + regindex));
+       return in_le32(base + regindex);
 #else
        return readl(base + regindex);
 #endif
 }
 
-static inline void write_reg_le32(volatile u32 *base, int regindex, u32 val)
+static inline void write_reg_le32(volatile u32 __iomem *base, int regindex, u32 val)
 {
 #ifdef __powerpc__
-       out_le32((volatile u32 *) (base + regindex), val);
+       out_le32(base + regindex, val);
 #else
        writel(val, base + regindex);
 #endif
@@ -500,7 +500,7 @@ compute_imstt_regvals_ibm(struct imstt_par *par, int xres, int yres)
                        MHz = 200;
                        break;
                default:
-                       return 0;
+                       return NULL;
        }
 
        setclkMHz(par, MHz);
@@ -547,7 +547,7 @@ compute_imstt_regvals_tvp(struct imstt_par *par, int xres, int yres)
                        init = yres == 960 ? &tvp_reg_init_19 : &tvp_reg_init_20;
                        break;
                default:
-                       return 0;
+                       return NULL;
        }
        par->init = *init;
        return init;
@@ -940,9 +940,9 @@ imsttfb_blank(int blank, struct fb_info *info)
 
        ctrl = read_reg_le32(par->dc_regs, STGCTL);
        if (blank > 0) {
-               switch (blank - 1) {
-               case VESA_NO_BLANKING:
-               case VESA_POWERDOWN:
+               switch (blank) {
+               case FB_BLANK_NORMAL:
+               case FB_BLANK_POWERDOWN:
                        ctrl &= ~0x00000380;
                        if (par->ramdac == IBM) {
                                par->cmap_regs[PIDXHI] = 0;             eieio();
@@ -958,10 +958,10 @@ imsttfb_blank(int blank, struct fb_info *info)
                                par->cmap_regs[PIDXDATA] = 0xc0;
                        }
                        break;
-               case VESA_VSYNC_SUSPEND:
+               case FB_BLANK_VSYNC_SUSPEND:
                        ctrl &= ~0x00000020;
                        break;
-               case VESA_HSYNC_SUSPEND:
+               case FB_BLANK_HSYNC_SUSPEND:
                        ctrl &= ~0x00000010;
                        break;
                }
@@ -1267,48 +1267,49 @@ imsttfb_ioctl(struct inode *inode, struct file *file, u_int cmd,
              u_long arg, struct fb_info *info)
 {
        struct imstt_par *par = (struct imstt_par *) info->par;
+       void __user *argp = (void __user *)arg;
        __u32 reg[2];
        __u8 idx[2];
 
        switch (cmd) {
                case FBIMSTT_SETREG:
-                       if (copy_from_user(reg, (void *)arg, 8) || reg[0] > (0x1000 - sizeof(reg[0])) / sizeof(reg[0]))
+                       if (copy_from_user(reg, argp, 8) || reg[0] > (0x1000 - sizeof(reg[0])) / sizeof(reg[0]))
                                return -EFAULT;
                        write_reg_le32(par->dc_regs, reg[0], reg[1]);
                        return 0;
                case FBIMSTT_GETREG:
-                       if (copy_from_user(reg, (void *)arg, 4) || reg[0] > (0x1000 - sizeof(reg[0])) / sizeof(reg[0]))
+                       if (copy_from_user(reg, argp, 4) || reg[0] > (0x1000 - sizeof(reg[0])) / sizeof(reg[0]))
                                return -EFAULT;
                        reg[1] = read_reg_le32(par->dc_regs, reg[0]);
-                       if (copy_to_user((void *)(arg + 4), &reg[1], 4))
+                       if (copy_to_user((void __user *)(arg + 4), &reg[1], 4))
                                return -EFAULT;
                        return 0;
                case FBIMSTT_SETCMAPREG:
-                       if (copy_from_user(reg, (void *)arg, 8) || reg[0] > (0x1000 - sizeof(reg[0])) / sizeof(reg[0]))
+                       if (copy_from_user(reg, argp, 8) || reg[0] > (0x1000 - sizeof(reg[0])) / sizeof(reg[0]))
                                return -EFAULT;
                        write_reg_le32(((u_int *)par->cmap_regs), reg[0], reg[1]);
                        return 0;
                case FBIMSTT_GETCMAPREG:
-                       if (copy_from_user(reg, (void *)arg, 4) || reg[0] > (0x1000 - sizeof(reg[0])) / sizeof(reg[0]))
+                       if (copy_from_user(reg, argp, 4) || reg[0] > (0x1000 - sizeof(reg[0])) / sizeof(reg[0]))
                                return -EFAULT;
                        reg[1] = read_reg_le32(((u_int *)par->cmap_regs), reg[0]);
-                       if (copy_to_user((void *)(arg + 4), &reg[1], 4))
+                       if (copy_to_user((void __user *)(arg + 4), &reg[1], 4))
                                return -EFAULT;
                        return 0;
                case FBIMSTT_SETIDXREG:
-                       if (copy_from_user(idx, (void *)arg, 2))
+                       if (copy_from_user(idx, argp, 2))
                                return -EFAULT;
                        par->cmap_regs[PIDXHI] = 0;             eieio();
                        par->cmap_regs[PIDXLO] = idx[0];        eieio();
                        par->cmap_regs[PIDXDATA] = idx[1];      eieio();
                        return 0;
                case FBIMSTT_GETIDXREG:
-                       if (copy_from_user(idx, (void *)arg, 1))
+                       if (copy_from_user(idx, argp, 1))
                                return -EFAULT;
                        par->cmap_regs[PIDXHI] = 0;             eieio();
                        par->cmap_regs[PIDXLO] = idx[0];        eieio();
                        idx[1] = par->cmap_regs[PIDXDATA];
-                       if (copy_to_user((void *)(arg + 1), &idx[1], 1))
+                       if (copy_to_user((void __user *)(arg + 1), &idx[1], 1))
                                return -EFAULT;
                        return 0;
                default:
@@ -1441,7 +1442,10 @@ init_imstt(struct fb_info *info)
        info->var.pixclock = 1000000 / getclkMHz(par);
 
        info->fbops = &imsttfb_ops;
-       info->flags = FBINFO_FLAG_DEFAULT;
+       info->flags = FBINFO_DEFAULT |
+                      FBINFO_HWACCEL_COPYAREA |
+                     FBINFO_HWACCEL_FILLRECT |
+                     FBINFO_HWACCEL_YPAN;
 
        fb_alloc_cmap(&info->cmap, 0, 0);
 
@@ -1515,11 +1519,12 @@ imsttfb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        info->fix.smem_start = addr;
        info->screen_base = (__u8 *)ioremap(addr, par->ramdac == IBM ? 0x400000 : 0x800000);
        info->fix.mmio_start = addr + 0x800000;
-       par->dc_regs = (__u32 *)ioremap(addr + 0x800000, 0x1000);
+       par->dc_regs = ioremap(addr + 0x800000, 0x1000);
        par->cmap_regs_phys = addr + 0x840000;
        par->cmap_regs = (__u8 *)ioremap(addr + 0x840000, 0x1000);
        info->par = par;
        info->pseudo_palette = (void *) (par + 1);
+       info->device = &pdev->dev;
        init_imstt(info);
 
        pci_set_drvdata(pdev, info);
@@ -1598,6 +1603,14 @@ imsttfb_setup(char *options)
 
 int __init imsttfb_init(void)
 {
+#ifndef MODULE
+       char *option = NULL;
+
+       if (fb_get_options("imsttfb", &option))
+               return -ENODEV;
+
+       imsttfb_setup(option);
+#endif
        return pci_module_init(&imsttfb_pci_driver);
 }
  
@@ -1608,7 +1621,7 @@ static void __exit imsttfb_exit(void)
 
 #ifdef MODULE
 MODULE_LICENSE("GPL");
-module_init(imsttfb_init);
 #endif
+module_init(imsttfb_init);
 module_exit(imsttfb_exit);