ACPI: Remove R40e c-state blacklist
[safe/jmp/linux-2.6] / drivers / hid / hidraw.c
index 7685ae6..02b19db 100644 (file)
@@ -208,7 +208,7 @@ static int hidraw_release(struct inode * inode, struct file * file)
 
        list_del(&list->node);
        dev = hidraw_table[minor];
-       if (!dev->open--) {
+       if (!--dev->open) {
                if (list->hidraw->exist)
                        dev->hid->ll_driver->close(dev->hid);
                else
@@ -265,7 +265,39 @@ static long hidraw_ioctl(struct file *file, unsigned int cmd,
                                break;
                        }
                default:
-                       ret = -ENOTTY;
+                       {
+                               struct hid_device *hid = dev->hid;
+                               if (_IOC_TYPE(cmd) != 'H' || _IOC_DIR(cmd) != _IOC_READ) {
+                                       ret = -EINVAL;
+                                       break;
+                               }
+
+                               if (_IOC_NR(cmd) == _IOC_NR(HIDIOCGRAWNAME(0))) {
+                                       int len;
+                                       if (!hid->name)
+                                               return 0;
+                                       len = strlen(hid->name) + 1;
+                                       if (len > _IOC_SIZE(cmd))
+                                               len = _IOC_SIZE(cmd);
+                                       ret = copy_to_user(user_arg, hid->name, len) ?
+                                               -EFAULT : len;
+                                       break;
+                               }
+
+                               if (_IOC_NR(cmd) == _IOC_NR(HIDIOCGRAWPHYS(0))) {
+                                       int len;
+                                       if (!hid->phys)
+                                               return 0;
+                                       len = strlen(hid->phys) + 1;
+                                       if (len > _IOC_SIZE(cmd))
+                                               len = _IOC_SIZE(cmd);
+                                       ret = copy_to_user(user_arg, hid->phys, len) ?
+                                               -EFAULT : len;
+                                       break;
+                               }
+                }
+
+               ret = -ENOTTY;
        }
        unlock_kernel();
        return ret;
@@ -329,7 +361,7 @@ int hidraw_connect(struct hid_device *hid)
                goto out;
        }
 
-       dev->dev = device_create(hidraw_class, NULL, MKDEV(hidraw_major, minor),
+       dev->dev = device_create(hidraw_class, &hid->dev, MKDEV(hidraw_major, minor),
                                 NULL, "%s%d", "hidraw", minor);
 
        if (IS_ERR(dev->dev)) {