Fedora kernel-2.6.17-1.2142_FC4 patched with stable patch-2.6.17.4-vs2.0.2-rc26.diff
[linux-2.6.git] / drivers / video / p9100.c
index 67b71d5..0d19575 100644 (file)
@@ -31,9 +31,8 @@ static int p9100_setcolreg(unsigned, unsigned, unsigned, unsigned,
                           unsigned, struct fb_info *);
 static int p9100_blank(int, struct fb_info *);
 
-static int p9100_mmap(struct fb_info *, struct file *, struct vm_area_struct *);
-static int p9100_ioctl(struct inode *, struct file *, unsigned int,
-                      unsigned long, struct fb_info *);
+static int p9100_mmap(struct fb_info *, struct vm_area_struct *);
+static int p9100_ioctl(struct fb_info *, unsigned int, unsigned long);
 
 /*
  *  Frame buffer operations
@@ -48,7 +47,9 @@ static struct fb_ops p9100_ops = {
        .fb_imageblit           = cfb_imageblit,
        .fb_mmap                = p9100_mmap,
        .fb_ioctl               = p9100_ioctl,
-       .fb_cursor              = soft_cursor,
+#ifdef CONFIG_COMPAT
+       .fb_compat_ioctl        = sbusfb_compat_ioctl,
+#endif
 };
 
 /* P9100 control registers */
@@ -129,7 +130,7 @@ struct p9100_cmd_parameng {
 
 struct p9100_par {
        spinlock_t              lock;
-       struct p9100_regs       *regs;
+       struct p9100_regs       __iomem *regs;
 
        u32                     flags;
 #define P9100_FLAG_BLANKED     0x00000001
@@ -138,7 +139,6 @@ struct p9100_par {
        unsigned long           fbsize;
 
        struct sbus_dev         *sdev;
-       struct list_head        list;
 };
 
 /**
@@ -155,7 +155,7 @@ static int p9100_setcolreg(unsigned regno,
                           unsigned transp, struct fb_info *info)
 {
        struct p9100_par *par = (struct p9100_par *) info->par;
-       struct p9100_regs *regs = par->regs;
+       struct p9100_regs __iomem *regs = par->regs;
        unsigned long flags;
 
        if (regno >= 256)
@@ -186,24 +186,24 @@ static int
 p9100_blank(int blank, struct fb_info *info)
 {
        struct p9100_par *par = (struct p9100_par *) info->par;
-       struct p9100_regs *regs = par->regs;
+       struct p9100_regs __iomem *regs = par->regs;
        unsigned long flags;
        u32 val;
 
        spin_lock_irqsave(&par->lock, flags);
 
        switch (blank) {
-       case 0: /* Unblanking */
+       case FB_BLANK_UNBLANK: /* Unblanking */
                val = sbus_readl(&regs->vid_screenpaint_timectl1);
                val |= SCREENPAINT_TIMECTL1_ENABLE_VIDEO;
                sbus_writel(val, &regs->vid_screenpaint_timectl1);
                par->flags &= ~P9100_FLAG_BLANKED;
                break;
 
-       case 1: /* Normal blanking */
-       case 2: /* VESA blank (vsync off) */
-       case 3: /* VESA blank (hsync off) */
-       case 4: /* Poweroff */
+       case FB_BLANK_NORMAL: /* Normal blanking */
+       case FB_BLANK_VSYNC_SUSPEND: /* VESA blank (vsync off) */
+       case FB_BLANK_HSYNC_SUSPEND: /* VESA blank (hsync off) */
+       case FB_BLANK_POWERDOWN: /* Poweroff */
                val = sbus_readl(&regs->vid_screenpaint_timectl1);
                val &= ~SCREENPAINT_TIMECTL1_ENABLE_VIDEO;
                sbus_writel(val, &regs->vid_screenpaint_timectl1);
@@ -221,7 +221,7 @@ static struct sbus_mmap_map p9100_mmap_map[] = {
        { 0,                    0,              0                   }
 };
 
-static int p9100_mmap(struct fb_info *info, struct file *file, struct vm_area_struct *vma)
+static int p9100_mmap(struct fb_info *info, struct vm_area_struct *vma)
 {
        struct p9100_par *par = (struct p9100_par *)info->par;
 
@@ -231,8 +231,8 @@ static int p9100_mmap(struct fb_info *info, struct file *file, struct vm_area_st
                                  vma);
 }
 
-static int p9100_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
-                      unsigned long arg, struct fb_info *info)
+static int p9100_ioctl(struct fb_info *info, unsigned int cmd,
+                      unsigned long arg)
 {
        struct p9100_par *par = (struct p9100_par *) info->par;
 
@@ -288,26 +288,26 @@ static void p9100_init_one(struct sbus_dev *sdev)
        all->par.physbase = sdev->reg_addrs[2].phys_addr;
 
        sbusfb_fill_var(&all->info.var, sdev->prom_node, 8);
+       all->info.var.red.length = 8;
+       all->info.var.green.length = 8;
+       all->info.var.blue.length = 8;
 
        linebytes = prom_getintdefault(sdev->prom_node, "linebytes",
                                       all->info.var.xres);
        all->par.fbsize = PAGE_ALIGN(linebytes * all->info.var.yres);
 
-       all->par.regs = (struct p9100_regs *)
-               sbus_ioremap(&sdev->resource[0], 0,
+       all->par.regs = sbus_ioremap(&sdev->resource[0], 0,
                             sizeof(struct p9100_regs), "p9100 regs");
 
-       all->info.flags = FBINFO_FLAG_DEFAULT;
+       all->info.flags = FBINFO_DEFAULT;
        all->info.fbops = &p9100_ops;
 #ifdef CONFIG_SPARC32
-       all->info.screen_base = (char *)
+       all->info.screen_base = (char __iomem *)
                prom_getintdefault(sdev->prom_node, "address", 0);
 #endif
        if (!all->info.screen_base)
-               all->info.screen_base = (char *)
-                       sbus_ioremap(&sdev->resource[2], 0,
+               all->info.screen_base = sbus_ioremap(&sdev->resource[2], 0,
                                     all->par.fbsize, "p9100 ram");
-       all->info.currcon = -1;
        all->info.par = &all->par;
 
        p9100_blank(0, &all->info);
@@ -326,6 +326,7 @@ static void p9100_init_one(struct sbus_dev *sdev)
                kfree(all);
                return;
        }
+       fb_set_cmap(&all->info.cmap, &all->info);
 
        list_add(&all->list, &p9100_list);
 
@@ -340,6 +341,9 @@ int __init p9100_init(void)
        struct sbus_bus *sbus;
        struct sbus_dev *sdev;
 
+       if (fb_get_options("p9100fb", NULL))
+               return -ENODEV;
+
        for_all_sbusdev(sdev, sbus) {
                if (!strcmp(sdev->prom_name, "p9100"))
                        p9100_init_one(sdev);
@@ -368,8 +372,9 @@ p9100_setup(char *arg)
        return 0;
 }
 
-#ifdef MODULE
 module_init(p9100_init);
+
+#ifdef MODULE
 module_exit(p9100_exit);
 #endif