X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Fsbus%2Fchar%2Fvfc_dev.c;h=86ce54130954979c9eb4abb7632712805e4c13c7;hb=f7f1b0f1e2fbadeab12d24236000e778aa9b1ead;hp=87d992820bc0a625b9652d5ddfed233f0fdae256;hpb=5273a3df6485dc2ad6aa7ddd441b9a21970f003b;p=linux-2.6.git diff --git a/drivers/sbus/char/vfc_dev.c b/drivers/sbus/char/vfc_dev.c index 87d992820..86ce54130 100644 --- a/drivers/sbus/char/vfc_dev.c +++ b/drivers/sbus/char/vfc_dev.c @@ -178,7 +178,7 @@ struct vfc_dev *vfc_get_dev_ptr(int instance) return vfc_dev_lst[instance]; } -static spinlock_t vfc_dev_lock = SPIN_LOCK_UNLOCKED; +static DEFINE_SPINLOCK(vfc_dev_lock); static int vfc_open(struct inode *inode, struct file *file) { @@ -226,7 +226,7 @@ static int vfc_release(struct inode *inode,struct file *file) return 0; } -static int vfc_debug(struct vfc_dev *dev, int cmd, unsigned long arg) +static int vfc_debug(struct vfc_dev *dev, int cmd, void __user *argp) { struct vfc_debug_inout inout; unsigned char *buffer; @@ -236,15 +236,14 @@ static int vfc_debug(struct vfc_dev *dev, int cmd, unsigned long arg) switch(cmd) { case VFC_I2C_SEND: - if(copy_from_user(&inout, (void *)arg, sizeof(inout))) + if(copy_from_user(&inout, argp, sizeof(inout))) return -EFAULT; - buffer = kmalloc(inout.len*sizeof(char), GFP_KERNEL); + buffer = kmalloc(inout.len, GFP_KERNEL); if (buffer == NULL) return -ENOMEM; - if(copy_from_user(buffer, inout.buffer, - inout.len*sizeof(char))) { + if(copy_from_user(buffer, inout.buffer, inout.len)) { kfree(buffer); return -EFAULT; } @@ -253,9 +252,9 @@ static int vfc_debug(struct vfc_dev *dev, int cmd, unsigned long arg) vfc_lock_device(dev); inout.ret= vfc_i2c_sendbuf(dev,inout.addr & 0xff, - inout.buffer,inout.len); + buffer,inout.len); - if (copy_to_user((void *)arg,&inout,sizeof(inout))) { + if (copy_to_user(argp,&inout,sizeof(inout))) { kfree(buffer); return -EFAULT; } @@ -263,14 +262,14 @@ static int vfc_debug(struct vfc_dev *dev, int cmd, unsigned long arg) break; case VFC_I2C_RECV: - if (copy_from_user(&inout, (void *)arg, sizeof(inout))) + if (copy_from_user(&inout, argp, sizeof(inout))) return -EFAULT; buffer = kmalloc(inout.len, GFP_KERNEL); if (buffer == NULL) return -ENOMEM; - memset(buffer,0,inout.len*sizeof(char)); + memset(buffer,0,inout.len); vfc_lock_device(dev); inout.ret= vfc_i2c_recvbuf(dev,inout.addr & 0xff @@ -281,7 +280,7 @@ static int vfc_debug(struct vfc_dev *dev, int cmd, unsigned long arg) kfree(buffer); return -EFAULT; } - if (copy_to_user((void *)arg,&inout,sizeof(inout))) { + if (copy_to_user(argp,&inout,sizeof(inout))) { kfree(buffer); return -EFAULT; } @@ -340,7 +339,7 @@ static int vfc_set_control_ioctl(struct inode *inode, struct file *file, { int setcmd, ret = 0; - if (copy_from_user(&setcmd,(void *)arg,sizeof(unsigned int))) + if (copy_from_user(&setcmd,(void __user *)arg,sizeof(unsigned int))) return -EFAULT; VFC_IOCTL_DEBUG_PRINTK(("vfc%d: IOCTL(VFCSCTRL) arg=0x%x\n", @@ -398,7 +397,7 @@ int vfc_port_change_ioctl(struct inode *inode, struct file *file, int ret = 0; int cmd; - if(copy_from_user(&cmd, (void *)arg, sizeof(unsigned int))) { + if(copy_from_user(&cmd, (void __user *)arg, sizeof(unsigned int))) { VFC_IOCTL_DEBUG_PRINTK(("vfc%d: User passed bogus pointer to " "vfc_port_change_ioctl\n", dev->instance)); @@ -468,7 +467,7 @@ int vfc_set_video_ioctl(struct inode *inode, struct file *file, int ret = 0; int cmd; - if(copy_from_user(&cmd, (void *)arg, sizeof(unsigned int))) { + if(copy_from_user(&cmd, (void __user *)arg, sizeof(unsigned int))) { VFC_IOCTL_DEBUG_PRINTK(("vfc%d: User passed bogus pointer to " "vfc_set_video_ioctl\n", dev->instance)); @@ -542,7 +541,7 @@ int vfc_get_video_ioctl(struct inode *inode, struct file *file, VFC_IOCTL_DEBUG_PRINTK(("vfc%d: IOCTL(VFCGVID) returning status 0x%x; " "buf[0]=%x\n", dev->instance, status, buf[0])); - if (copy_to_user((void *)arg,&status,sizeof(unsigned int))) { + if (copy_to_user((void __user *)arg,&status,sizeof(unsigned int))) { VFC_IOCTL_DEBUG_PRINTK(("vfc%d: User passed bogus pointer to " "vfc_get_video_ioctl\n", dev->instance)); @@ -557,6 +556,7 @@ static int vfc_ioctl(struct inode *inode, struct file *file, unsigned int cmd, int ret = 0; unsigned int tmp; struct vfc_dev *dev; + void __user *argp = (void __user *)arg; dev = vfc_get_dev_ptr(iminor(inode)); if(dev == NULL) @@ -568,7 +568,7 @@ static int vfc_ioctl(struct inode *inode, struct file *file, unsigned int cmd, VFC_IOCTL_DEBUG_PRINTK(("vfc%d: IOCTL(VFCGCTRL)\n", dev->instance)); #endif tmp = sbus_readl(&dev->regs->control); - if(copy_to_user((void *)arg, &tmp, sizeof(unsigned int))) { + if(copy_to_user(argp, &tmp, sizeof(unsigned int))) { ret = -EFAULT; break; } @@ -585,7 +585,7 @@ static int vfc_ioctl(struct inode *inode, struct file *file, unsigned int cmd, break; case VFCHUE: VFC_IOCTL_DEBUG_PRINTK(("vfc%d: IOCTL(VFCHUE)\n", dev->instance)); - if(copy_from_user(&tmp,(void *)arg,sizeof(unsigned int))) { + if(copy_from_user(&tmp,argp,sizeof(unsigned int))) { VFC_IOCTL_DEBUG_PRINTK(("vfc%d: User passed bogus pointer " "to IOCTL(VFCHUE)", dev->instance)); ret = -EFAULT; @@ -603,21 +603,19 @@ static int vfc_ioctl(struct inode *inode, struct file *file, unsigned int cmd, VFC_IOCTL_DEBUG_PRINTK(("vfc%d: IOCTL(VFCRDINFO)\n", dev->instance)); break; default: - ret = vfc_debug(vfc_get_dev_ptr(iminor(inode)), - cmd, arg); + ret = vfc_debug(vfc_get_dev_ptr(iminor(inode)), cmd, argp); break; }; return ret; } -static int vfc_mmap(struct inode *inode, struct file *file, - struct vm_area_struct *vma) +static int vfc_mmap(struct file *file, struct vm_area_struct *vma) { unsigned int map_size, ret, map_offset; struct vfc_dev *dev; - dev = vfc_get_dev_ptr(iminor(inode)); + dev = vfc_get_dev_ptr(iminor(file->f_dentry->d_inode)); if(dev == NULL) return -ENODEV; @@ -628,8 +626,10 @@ static int vfc_mmap(struct inode *inode, struct file *file, vma->vm_flags |= (VM_SHM | VM_LOCKED | VM_IO | VM_MAYREAD | VM_MAYWRITE | VM_MAYSHARE); map_offset = (unsigned int) (long)dev->phys_regs; - ret = io_remap_page_range(vma, vma->vm_start, map_offset, map_size, - vma->vm_page_prot, dev->which_io); + ret = io_remap_pfn_range(vma, vma->vm_start, + MK_IOSPACE_PFN(dev->which_io, + map_offset >> PAGE_SHIFT), + map_size, vma->vm_page_prot); if(ret) return -EAGAIN;