diff options
Diffstat (limited to 'drivers/input')
-rw-r--r-- | drivers/input/evdev.c | 44 |
1 files changed, 24 insertions, 20 deletions
diff --git a/drivers/input/evdev.c b/drivers/input/evdev.c index 2d65411f6763..ef8c2ed792c3 100644 --- a/drivers/input/evdev.c +++ b/drivers/input/evdev.c | |||
@@ -647,6 +647,28 @@ static int str_to_user(const char *str, unsigned int maxlen, void __user *p) | |||
647 | return copy_to_user(p, str, len) ? -EFAULT : len; | 647 | return copy_to_user(p, str, len) ? -EFAULT : len; |
648 | } | 648 | } |
649 | 649 | ||
650 | static int handle_eviocgbit(struct input_dev *dev, unsigned int cmd, void __user *p, int compat_mode) | ||
651 | { | ||
652 | unsigned long *bits; | ||
653 | int len; | ||
654 | |||
655 | switch (_IOC_NR(cmd) & EV_MAX) { | ||
656 | |||
657 | case 0: bits = dev->evbit; len = EV_MAX; break; | ||
658 | case EV_KEY: bits = dev->keybit; len = KEY_MAX; break; | ||
659 | case EV_REL: bits = dev->relbit; len = REL_MAX; break; | ||
660 | case EV_ABS: bits = dev->absbit; len = ABS_MAX; break; | ||
661 | case EV_MSC: bits = dev->mscbit; len = MSC_MAX; break; | ||
662 | case EV_LED: bits = dev->ledbit; len = LED_MAX; break; | ||
663 | case EV_SND: bits = dev->sndbit; len = SND_MAX; break; | ||
664 | case EV_FF: bits = dev->ffbit; len = FF_MAX; break; | ||
665 | case EV_SW: bits = dev->swbit; len = SW_MAX; break; | ||
666 | default: return -EINVAL; | ||
667 | } | ||
668 | return bits_to_user(bits, len, _IOC_SIZE(cmd), p, compat_mode); | ||
669 | } | ||
670 | |||
671 | |||
650 | static long evdev_do_ioctl(struct file *file, unsigned int cmd, | 672 | static long evdev_do_ioctl(struct file *file, unsigned int cmd, |
651 | void __user *p, int compat_mode) | 673 | void __user *p, int compat_mode) |
652 | { | 674 | { |
@@ -733,26 +755,8 @@ static long evdev_do_ioctl(struct file *file, unsigned int cmd, | |||
733 | 755 | ||
734 | if (_IOC_DIR(cmd) == _IOC_READ) { | 756 | if (_IOC_DIR(cmd) == _IOC_READ) { |
735 | 757 | ||
736 | if ((_IOC_NR(cmd) & ~EV_MAX) == _IOC_NR(EVIOCGBIT(0, 0))) { | 758 | if ((_IOC_NR(cmd) & ~EV_MAX) == _IOC_NR(EVIOCGBIT(0, 0))) |
737 | 759 | return handle_eviocgbit(dev, cmd, p, compat_mode); | |
738 | unsigned long *bits; | ||
739 | int len; | ||
740 | |||
741 | switch (_IOC_NR(cmd) & EV_MAX) { | ||
742 | |||
743 | case 0: bits = dev->evbit; len = EV_MAX; break; | ||
744 | case EV_KEY: bits = dev->keybit; len = KEY_MAX; break; | ||
745 | case EV_REL: bits = dev->relbit; len = REL_MAX; break; | ||
746 | case EV_ABS: bits = dev->absbit; len = ABS_MAX; break; | ||
747 | case EV_MSC: bits = dev->mscbit; len = MSC_MAX; break; | ||
748 | case EV_LED: bits = dev->ledbit; len = LED_MAX; break; | ||
749 | case EV_SND: bits = dev->sndbit; len = SND_MAX; break; | ||
750 | case EV_FF: bits = dev->ffbit; len = FF_MAX; break; | ||
751 | case EV_SW: bits = dev->swbit; len = SW_MAX; break; | ||
752 | default: return -EINVAL; | ||
753 | } | ||
754 | return bits_to_user(bits, len, _IOC_SIZE(cmd), p, compat_mode); | ||
755 | } | ||
756 | 760 | ||
757 | if (_IOC_NR(cmd) == _IOC_NR(EVIOCGKEY(0))) | 761 | if (_IOC_NR(cmd) == _IOC_NR(EVIOCGKEY(0))) |
758 | return bits_to_user(dev->key, KEY_MAX, _IOC_SIZE(cmd), | 762 | return bits_to_user(dev->key, KEY_MAX, _IOC_SIZE(cmd), |