HID: add phys and name ioctls to hidraw
authorJiri Kosina <jkosina@suse.cz>
Wed, 12 Nov 2008 15:14:08 +0000 (16:14 +0100)
committerJiri Kosina <jkosina@suse.cz>
Sun, 4 Jan 2009 00:00:51 +0000 (01:00 +0100)
The hiddev interface provides ioctl() calls which can be used
to obtain phys and raw name of the underlying device.

Add the corresponding support also into hidraw.

Signed-off-by: Jiri Kosina <jkosina@suse.cz>
drivers/hid/hidraw.c
include/linux/hidraw.h

index 7685ae6..975edd8 100644 (file)
@@ -265,6 +265,34 @@ static long hidraw_ioctl(struct file *file, unsigned int cmd,
                                break;
                        }
                default:
+                       {
+                               struct hid_device *hid = dev->hid;
+                               if (_IOC_TYPE(cmd) != 'H' || _IOC_DIR(cmd) != _IOC_READ)
+                                       return -EINVAL;
+
+                               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);
+                                       return copy_to_user(user_arg, hid->name, len) ?
+                                               -EFAULT : len;
+                               }
+
+                               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);
+                                       return copy_to_user(user_arg, hid->phys, len) ?
+                                               -EFAULT : len;
+                               }
+                }
+
                        ret = -ENOTTY;
        }
        unlock_kernel();
index dbb5c8c..dd8d692 100644 (file)
@@ -33,6 +33,8 @@ struct hidraw_devinfo {
 #define HIDIOCGRDESCSIZE       _IOR('H', 0x01, int)
 #define HIDIOCGRDESC           _IOR('H', 0x02, struct hidraw_report_descriptor)
 #define HIDIOCGRAWINFO         _IOR('H', 0x03, struct hidraw_devinfo)
+#define HIDIOCGRAWNAME(len)     _IOC(_IOC_READ, 'H', 0x04, len)
+#define HIDIOCGRAWPHYS(len)     _IOC(_IOC_READ, 'H', 0x05, len)
 
 #define HIDRAW_FIRST_MINOR 0
 #define HIDRAW_MAX_DEVICES 64