X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Fvideo%2Fimsttfb.c;h=233884c84f518e5765eeb03f036bef836779ec89;hb=6a77f38946aaee1cd85eeec6cf4229b204c15071;hp=6b1635c4c6dc634939eeb1f88670cb56080b1539;hpb=9213980e6a70d8473e0ffd4b39ab5b6caaba9ff5;p=linux-2.6.git diff --git a/drivers/video/imsttfb.c b/drivers/video/imsttfb.c index 6b1635c4c..233884c84 100644 --- a/drivers/video/imsttfb.c +++ b/drivers/video/imsttfb.c @@ -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), ®[1], 4)) + if (copy_to_user((void __user *)(arg + 4), ®[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), ®[1], 4)) + if (copy_to_user((void __user *)(arg + 4), ®[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);