Merge git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb-2.6
[safe/jmp/linux-2.6] / drivers / video / sbuslib.c
index 646c43f..37d764a 100644 (file)
@@ -9,18 +9,20 @@
 #include <linux/string.h>
 #include <linux/fb.h>
 #include <linux/mm.h>
+#include <linux/uaccess.h>
+#include <linux/of_device.h>
 
-#include <asm/oplib.h>
 #include <asm/fbio.h>
 
 #include "sbuslib.h"
 
-void sbusfb_fill_var(struct fb_var_screeninfo *var, int prom_node, int bpp)
+void sbusfb_fill_var(struct fb_var_screeninfo *var, struct device_node *dp,
+                    int bpp)
 {
        memset(var, 0, sizeof(*var));
 
-       var->xres = prom_getintdefault(prom_node, "width", 1152);
-       var->yres = prom_getintdefault(prom_node, "height", 900);
+       var->xres = of_getintprop_default(dp, "width", 1152);
+       var->yres = of_getintprop_default(dp, "height", 900);
        var->xres_virtual = var->xres;
        var->yres_virtual = var->yres;
        var->bits_per_pixel = bpp;
@@ -46,6 +48,9 @@ int sbusfb_mmap_helper(struct sbus_mmap_map *map,
        unsigned long off;
        int i;
                                         
+       if (!(vma->vm_flags & (VM_SHARED | VM_MAYSHARE)))
+               return -EINVAL;
+
        size = vma->vm_end - vma->vm_start;
        if (vma->vm_pgoff > (~0UL >> PAGE_SHIFT))
                return -EINVAL;
@@ -55,6 +60,8 @@ int sbusfb_mmap_helper(struct sbus_mmap_map *map,
        /* To stop the swapper from even considering these pages */
        vma->vm_flags |= (VM_IO | VM_RESERVED);
        
+       vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
+
        /* Each page, see which map applies */
        for (page = 0; page < size; ){
                map_size = 0;
@@ -185,19 +192,7 @@ int sbusfb_ioctl_helper(unsigned long cmd, unsigned long arg,
 EXPORT_SYMBOL(sbusfb_ioctl_helper);
 
 #ifdef CONFIG_COMPAT
-struct  fbcmap32 {
-       int             index;          /* first element (0 origin) */
-       int             count;
-       u32             red;
-       u32             green;
-       u32             blue;
-};
-
-#define FBIOPUTCMAP32  _IOW('F', 3, struct fbcmap32)
-#define FBIOGETCMAP32  _IOW('F', 4, struct fbcmap32)
-
-static int fbiogetputcmap(struct file *file, struct fb_info *info,
-               unsigned int cmd, unsigned long arg)
+static int fbiogetputcmap(struct fb_info *info, unsigned int cmd, unsigned long arg)
 {
        struct fbcmap32 __user *argp = (void __user *)arg;
        struct fbcmap __user *p = compat_alloc_user_space(sizeof(*p));
@@ -213,28 +208,13 @@ static int fbiogetputcmap(struct file *file, struct fb_info *info,
        ret |= put_user(compat_ptr(addr), &p->blue);
        if (ret)
                return -EFAULT;
-       return info->fbops->fb_ioctl(file->f_dentry->d_inode, file,
+       return info->fbops->fb_ioctl(info,
                        (cmd == FBIOPUTCMAP32) ?
                        FBIOPUTCMAP_SPARC : FBIOGETCMAP_SPARC,
-                       (unsigned long)p, info);
+                       (unsigned long)p);
 }
 
-struct fbcursor32 {
-       short set;              /* what to set, choose from the list above */
-       short enable;           /* cursor on/off */
-       struct fbcurpos pos;    /* cursor position */
-       struct fbcurpos hot;    /* cursor hot spot */
-       struct fbcmap32 cmap;   /* color map info */
-       struct fbcurpos size;   /* cursor bit map size */
-       u32     image;          /* cursor image bits */
-       u32     mask;           /* cursor mask bits */
-};
-
-#define FBIOSCURSOR32  _IOW('F', 24, struct fbcursor32)
-#define FBIOGCURSOR32  _IOW('F', 25, struct fbcursor32)
-
-static int fbiogscursor(struct file *file, struct fb_info *info,
-               unsigned long arg)
+static int fbiogscursor(struct fb_info *info, unsigned long arg)
 {
        struct fbcursor __user *p = compat_alloc_user_space(sizeof(*p));
        struct fbcursor32 __user *argp =  (void __user *)arg;
@@ -257,12 +237,10 @@ static int fbiogscursor(struct file *file, struct fb_info *info,
        ret |= put_user(compat_ptr(addr), &p->image);
        if (ret)
                return -EFAULT;
-       return info->fbops->fb_ioctl(file->f_dentry->d_inode, file,
-                       FBIOSCURSOR, (unsigned long)p, info);
+       return info->fbops->fb_ioctl(info, FBIOSCURSOR, (unsigned long)p);
 }
 
-long sbusfb_compat_ioctl(struct file *file, unsigned int cmd,
-               unsigned long arg, struct fb_info *info)
+int sbusfb_compat_ioctl(struct fb_info *info, unsigned int cmd, unsigned long arg)
 {
        switch (cmd) {
        case FBIOGTYPE:
@@ -275,14 +253,13 @@ long sbusfb_compat_ioctl(struct file *file, unsigned int cmd,
        case FBIOSCURPOS:
        case FBIOGCURPOS:
        case FBIOGCURMAX:
-               return info->fbops->fb_ioctl(file->f_dentry->d_inode,
-                               file, cmd, arg, info);
+               return info->fbops->fb_ioctl(info, cmd, arg);
        case FBIOPUTCMAP32:
-               return fbiogetputcmap(file, info, cmd, arg);
+               return fbiogetputcmap(info, cmd, arg);
        case FBIOGETCMAP32:
-               return fbiogetputcmap(file, info, cmd, arg);
+               return fbiogetputcmap(info, cmd, arg);
        case FBIOSCURSOR32:
-               return fbiogscursor(file, info, arg);
+               return fbiogscursor(info, arg);
        default:
                return -ENOIOCTLCMD;
        }