diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-01-05 21:53:34 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-01-05 21:53:34 -0500 |
commit | 8606ab6d30dbaaafff985bd462bf33c36997eae9 (patch) | |
tree | 4a31a004438370e5e51f5f042badfac850ec9ac8 /drivers/hid/hidraw.c | |
parent | c54febae996d36c630f09209cd9983ecfda3fcad (diff) | |
parent | ed42350e02bfcb333024949e9653d06916135cc5 (diff) |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid: (22 commits)
HID: fix error condition propagation in hid-sony driver
HID: fix reference count leak hidraw
HID: add proper support for pensketch 12x9 tablet
HID: don't allow DealExtreme usb-radio be handled by usb hid driver
HID: fix default Kconfig setting for TopSpeed driver
HID: driver for TopSeed Cyberlink quirky remote
HID: make boot protocol drivers depend on EMBEDDED
HID: avoid sparse warning in HID_COMPAT_LOAD_DRIVER
HID: hiddev cleanup -- handle all error conditions properly
HID: force feedback driver for GreenAsia 0x12 PID
HID: switch specialized drivers from "default y" to !EMBEDDED
HID: set proper dev.parent in hidraw
HID: add dynids facility
HID: use GFP_KERNEL in hid_alloc_buffers
HID: usbhid, use usb_endpoint_xfer_int
HID: move usbhid flags to usbhid.h
HID: add n-trig digitizer support
HID: add phys and name ioctls to hidraw
HID: struct device - replace bus_id with dev_name(), dev_set_name()
HID: automatically call usbhid_set_leds in usbhid driver
...
Diffstat (limited to 'drivers/hid/hidraw.c')
-rw-r--r-- | drivers/hid/hidraw.c | 32 |
1 files changed, 30 insertions, 2 deletions
diff --git a/drivers/hid/hidraw.c b/drivers/hid/hidraw.c index 7685ae6808c4..732449628971 100644 --- a/drivers/hid/hidraw.c +++ b/drivers/hid/hidraw.c | |||
@@ -208,7 +208,7 @@ static int hidraw_release(struct inode * inode, struct file * file) | |||
208 | 208 | ||
209 | list_del(&list->node); | 209 | list_del(&list->node); |
210 | dev = hidraw_table[minor]; | 210 | dev = hidraw_table[minor]; |
211 | if (!dev->open--) { | 211 | if (!--dev->open) { |
212 | if (list->hidraw->exist) | 212 | if (list->hidraw->exist) |
213 | dev->hid->ll_driver->close(dev->hid); | 213 | dev->hid->ll_driver->close(dev->hid); |
214 | else | 214 | else |
@@ -265,6 +265,34 @@ static long hidraw_ioctl(struct file *file, unsigned int cmd, | |||
265 | break; | 265 | break; |
266 | } | 266 | } |
267 | default: | 267 | default: |
268 | { | ||
269 | struct hid_device *hid = dev->hid; | ||
270 | if (_IOC_TYPE(cmd) != 'H' || _IOC_DIR(cmd) != _IOC_READ) | ||
271 | return -EINVAL; | ||
272 | |||
273 | if (_IOC_NR(cmd) == _IOC_NR(HIDIOCGRAWNAME(0))) { | ||
274 | int len; | ||
275 | if (!hid->name) | ||
276 | return 0; | ||
277 | len = strlen(hid->name) + 1; | ||
278 | if (len > _IOC_SIZE(cmd)) | ||
279 | len = _IOC_SIZE(cmd); | ||
280 | return copy_to_user(user_arg, hid->name, len) ? | ||
281 | -EFAULT : len; | ||
282 | } | ||
283 | |||
284 | if (_IOC_NR(cmd) == _IOC_NR(HIDIOCGRAWPHYS(0))) { | ||
285 | int len; | ||
286 | if (!hid->phys) | ||
287 | return 0; | ||
288 | len = strlen(hid->phys) + 1; | ||
289 | if (len > _IOC_SIZE(cmd)) | ||
290 | len = _IOC_SIZE(cmd); | ||
291 | return copy_to_user(user_arg, hid->phys, len) ? | ||
292 | -EFAULT : len; | ||
293 | } | ||
294 | } | ||
295 | |||
268 | ret = -ENOTTY; | 296 | ret = -ENOTTY; |
269 | } | 297 | } |
270 | unlock_kernel(); | 298 | unlock_kernel(); |
@@ -329,7 +357,7 @@ int hidraw_connect(struct hid_device *hid) | |||
329 | goto out; | 357 | goto out; |
330 | } | 358 | } |
331 | 359 | ||
332 | dev->dev = device_create(hidraw_class, NULL, MKDEV(hidraw_major, minor), | 360 | dev->dev = device_create(hidraw_class, &hid->dev, MKDEV(hidraw_major, minor), |
333 | NULL, "%s%d", "hidraw", minor); | 361 | NULL, "%s%d", "hidraw", minor); |
334 | 362 | ||
335 | if (IS_ERR(dev->dev)) { | 363 | if (IS_ERR(dev->dev)) { |