]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/hid/hidraw.c
device create: misc: convert device_create_drvdata to device_create
[linux-2.6-omap-h63xx.git] / drivers / hid / hidraw.c
index 2fde6c63f47dffa2d89c224cd15c1be215d4d20e..af3edb98df435f2c3fa22fde81350d4f15dcd286 100644 (file)
@@ -105,6 +105,7 @@ out:
 static ssize_t hidraw_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos)
 {
        unsigned int minor = iminor(file->f_path.dentry->d_inode);
+       /* FIXME: What stops hidraw_table going NULL */
        struct hid_device *dev = hidraw_table[minor]->hid;
        __u8 *buf;
        int ret = 0;
@@ -112,7 +113,7 @@ static ssize_t hidraw_write(struct file *file, const char __user *buffer, size_t
        if (!dev->hid_output_raw_report)
                return -ENODEV;
 
-       if (count > HID_MIN_BUFFER_SIZE) {
+       if (count > HID_MAX_BUFFER_SIZE) {
                printk(KERN_WARNING "hidraw: pid %d passed too large report\n",
                                task_pid_nr(current));
                return -EINVAL;
@@ -180,7 +181,7 @@ static int hidraw_open(struct inode *inode, struct file *file)
 
        dev = hidraw_table[minor];
        if (!dev->open++)
-               dev->hid->hid_open(dev->hid);
+               dev->hid->ll_driver->open(dev->hid);
 
 out_unlock:
        spin_unlock(&minors_lock);
@@ -206,43 +207,48 @@ static int hidraw_release(struct inode * inode, struct file * file)
        dev = hidraw_table[minor];
        if (!dev->open--) {
                if (list->hidraw->exist)
-                       dev->hid->hid_close(dev->hid);
+                       dev->hid->ll_driver->close(dev->hid);
                else
                        kfree(list->hidraw);
        }
 
+       kfree(list);
+
        return 0;
 }
 
-static int hidraw_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
+static long hidraw_ioctl(struct file *file, unsigned int cmd,
+                                                       unsigned long arg)
 {
+       struct inode *inode = file->f_path.dentry->d_inode;
        unsigned int minor = iminor(inode);
+       long ret = 0;
+       /* FIXME: What stops hidraw_table going NULL */
        struct hidraw *dev = hidraw_table[minor];
        void __user *user_arg = (void __user*) arg;
 
+       lock_kernel();
        switch (cmd) {
                case HIDIOCGRDESCSIZE:
                        if (put_user(dev->hid->rsize, (int __user *)arg))
-                               return -EFAULT;
-                       return 0;
+                               ret = -EFAULT;
+                       break;
 
                case HIDIOCGRDESC:
                        {
                                __u32 len;
 
                                if (get_user(len, (int __user *)arg))
-                                       return -EFAULT;
-
-                               if (len > HID_MAX_DESCRIPTOR_SIZE - 1)
-                                       return -EINVAL;
-
-                               if (copy_to_user(user_arg + offsetof(
-                                                               struct hidraw_report_descriptor,
-                                                               value[0]),
-                                                       dev->hid->rdesc,
-                                                       min(dev->hid->rsize, len)))
-                                               return -EFAULT;
-                               return 0;
+                                       ret = -EFAULT;
+                               else if (len > HID_MAX_DESCRIPTOR_SIZE - 1)
+                                       ret = -EINVAL;
+                               else if (copy_to_user(user_arg + offsetof(
+                                       struct hidraw_report_descriptor,
+                                       value[0]),
+                                       dev->hid->rdesc,
+                                       min(dev->hid->rsize, len)))
+                                       ret = -EFAULT;
+                               break;
                        }
                case HIDIOCGRAWINFO:
                        {
@@ -252,15 +258,13 @@ static int hidraw_ioctl(struct inode *inode, struct file *file, unsigned int cmd
                                dinfo.vendor = dev->hid->vendor;
                                dinfo.product = dev->hid->product;
                                if (copy_to_user(user_arg, &dinfo, sizeof(dinfo)))
-                                       return -EFAULT;
-
-                               return 0;
+                                       ret = -EFAULT;
+                               break;
                        }
                default:
-                       printk(KERN_EMERG "hidraw: unsupported ioctl() %x\n",
-                                       cmd);
+                       ret = -ENOTTY;
        }
-       return -EINVAL;
+       return ret;
 }
 
 static const struct file_operations hidraw_ops = {
@@ -270,7 +274,7 @@ static const struct file_operations hidraw_ops = {
        .poll =         hidraw_poll,
        .open =         hidraw_open,
        .release =      hidraw_release,
-       .ioctl =        hidraw_ioctl,
+       .unlocked_ioctl = hidraw_ioctl,
 };
 
 void hidraw_report_event(struct hid_device *hid, u8 *data, int len)
@@ -323,7 +327,7 @@ int hidraw_connect(struct hid_device *hid)
        }
 
        dev->dev = device_create(hidraw_class, NULL, MKDEV(hidraw_major, minor),
-                               "%s%d", "hidraw", minor);
+                                NULL, "%s%d", "hidraw", minor);
 
        if (IS_ERR(dev->dev)) {
                spin_lock(&minors_lock);
@@ -362,7 +366,7 @@ void hidraw_disconnect(struct hid_device *hid)
        device_destroy(hidraw_class, MKDEV(hidraw_major, hidraw->minor));
 
        if (hidraw->open) {
-               hid->hid_close(hid);
+               hid->ll_driver->close(hid);
                wake_up_interruptible(&hidraw->wait);
        } else {
                kfree(hidraw);