Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9fe41455 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input:
  Input: define separate EVIOCGKEYCODE_V2/EVIOCSKEYCODE_V2
  Input: wacom - add another Bamboo Pen ID (0xd4)
parents b0c3844d ab4e0192
Loading
Loading
Loading
Loading
+58 −55
Original line number Diff line number Diff line
@@ -534,24 +534,19 @@ static int handle_eviocgbit(struct input_dev *dev,
}
#undef OLD_KEY_MAX

static int evdev_handle_get_keycode(struct input_dev *dev,
				    void __user *p, size_t size)
static int evdev_handle_get_keycode(struct input_dev *dev, void __user *p)
{
	struct input_keymap_entry ke;
	struct input_keymap_entry ke = {
		.len	= sizeof(unsigned int),
		.flags	= 0,
	};
	int __user *ip = (int __user *)p;
	int error;

	memset(&ke, 0, sizeof(ke));

	if (size == sizeof(unsigned int[2])) {
	/* legacy case */
		int __user *ip = (int __user *)p;

	if (copy_from_user(ke.scancode, p, sizeof(unsigned int)))
		return -EFAULT;

		ke.len = sizeof(unsigned int);
		ke.flags = 0;

	error = input_get_keycode(dev, &ke);
	if (error)
		return error;
@@ -559,31 +554,33 @@ static int evdev_handle_get_keycode(struct input_dev *dev,
	if (put_user(ke.keycode, ip + 1))
		return -EFAULT;

	} else {
		size = min(size, sizeof(ke));
	return 0;
}

static int evdev_handle_get_keycode_v2(struct input_dev *dev, void __user *p)
{
	struct input_keymap_entry ke;
	int error;

		if (copy_from_user(&ke, p, size))
	if (copy_from_user(&ke, p, sizeof(ke)))
		return -EFAULT;

	error = input_get_keycode(dev, &ke);
	if (error)
		return error;

		if (copy_to_user(p, &ke, size))
	if (copy_to_user(p, &ke, sizeof(ke)))
		return -EFAULT;
	}

	return 0;
}

static int evdev_handle_set_keycode(struct input_dev *dev,
				    void __user *p, size_t size)
static int evdev_handle_set_keycode(struct input_dev *dev, void __user *p)
{
	struct input_keymap_entry ke;

	memset(&ke, 0, sizeof(ke));

	if (size == sizeof(unsigned int[2])) {
		/* legacy case */
	struct input_keymap_entry ke = {
		.len	= sizeof(unsigned int),
		.flags	= 0,
	};
	int __user *ip = (int __user *)p;

	if (copy_from_user(ke.scancode, p, sizeof(unsigned int)))
@@ -592,18 +589,18 @@ static int evdev_handle_set_keycode(struct input_dev *dev,
	if (get_user(ke.keycode, ip + 1))
		return -EFAULT;

		ke.len = sizeof(unsigned int);
		ke.flags = 0;
	return input_set_keycode(dev, &ke);
}

	} else {
		size = min(size, sizeof(ke));
static int evdev_handle_set_keycode_v2(struct input_dev *dev, void __user *p)
{
	struct input_keymap_entry ke;

		if (copy_from_user(&ke, p, size))
	if (copy_from_user(&ke, p, sizeof(ke)))
		return -EFAULT;

	if (ke.len > sizeof(ke.scancode))
		return -EINVAL;
	}

	return input_set_keycode(dev, &ke);
}
@@ -669,6 +666,18 @@ static long evdev_do_ioctl(struct file *file, unsigned int cmd,
			return evdev_grab(evdev, client);
		else
			return evdev_ungrab(evdev, client);

	case EVIOCGKEYCODE:
		return evdev_handle_get_keycode(dev, p);

	case EVIOCSKEYCODE:
		return evdev_handle_set_keycode(dev, p);

	case EVIOCGKEYCODE_V2:
		return evdev_handle_get_keycode_v2(dev, p);

	case EVIOCSKEYCODE_V2:
		return evdev_handle_set_keycode_v2(dev, p);
	}

	size = _IOC_SIZE(cmd);
@@ -708,12 +717,6 @@ static long evdev_do_ioctl(struct file *file, unsigned int cmd,
			return -EFAULT;

		return error;

	case EVIOC_MASK_SIZE(EVIOCGKEYCODE):
		return evdev_handle_get_keycode(dev, p, size);

	case EVIOC_MASK_SIZE(EVIOCSKEYCODE):
		return evdev_handle_set_keycode(dev, p, size);
	}

	/* Multi-number variable-length handlers */
+3 −0
Original line number Diff line number Diff line
@@ -1436,6 +1436,8 @@ static struct wacom_features wacom_features_0xD2 =
	{ "Wacom Bamboo Craft",   WACOM_PKGLEN_BBFUN,     14720,  9200, 1023, 63, BAMBOO_PT };
static struct wacom_features wacom_features_0xD3 =
	{ "Wacom Bamboo 2FG 6x8", WACOM_PKGLEN_BBFUN,     21648, 13530, 1023, 63, BAMBOO_PT };
static const struct wacom_features wacom_features_0xD4 =
	{ "Wacom Bamboo Pen",     WACOM_PKGLEN_BBFUN,     14720,  9200,  255, 63, BAMBOO_PT };
static struct wacom_features wacom_features_0xD8 =
	{ "Wacom Bamboo Comic 2FG", WACOM_PKGLEN_BBFUN,   21648, 13530, 1023, 63, BAMBOO_PT };
static struct wacom_features wacom_features_0xDA =
@@ -1510,6 +1512,7 @@ const struct usb_device_id wacom_ids[] = {
	{ USB_DEVICE_WACOM(0xD1) },
	{ USB_DEVICE_WACOM(0xD2) },
	{ USB_DEVICE_WACOM(0xD3) },
	{ USB_DEVICE_WACOM(0xD4) },
	{ USB_DEVICE_WACOM(0xD8) },
	{ USB_DEVICE_WACOM(0xDA) },
	{ USB_DEVICE_WACOM(0xDB) },
+4 −2
Original line number Diff line number Diff line
@@ -104,8 +104,10 @@ struct input_keymap_entry {
#define EVIOCGREP		_IOR('E', 0x03, unsigned int[2])	/* get repeat settings */
#define EVIOCSREP		_IOW('E', 0x03, unsigned int[2])	/* set repeat settings */

#define EVIOCGKEYCODE		_IOR('E', 0x04, struct input_keymap_entry)	/* get keycode */
#define EVIOCSKEYCODE		_IOW('E', 0x04, struct input_keymap_entry)	/* set keycode */
#define EVIOCGKEYCODE		_IOR('E', 0x04, unsigned int[2])        /* get keycode */
#define EVIOCGKEYCODE_V2	_IOR('E', 0x04, struct input_keymap_entry)
#define EVIOCSKEYCODE		_IOW('E', 0x04, unsigned int[2])        /* set keycode */
#define EVIOCSKEYCODE_V2	_IOW('E', 0x04, struct input_keymap_entry)

#define EVIOCGNAME(len)		_IOC(_IOC_READ, 'E', 0x06, len)		/* get device name */
#define EVIOCGPHYS(len)		_IOC(_IOC_READ, 'E', 0x07, len)		/* get physical location */