[PATCH] uinput: allow events per packet to be specified

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: Alan Cox <alan@xxxxxxxxxxxxxxx>

Implement an events per packet interface configuration. We do this by
adding a new ioctl that must be called before creation and follows the
pattern of the existing API.

The behaviour is:
	Not set:	input default or value computed by the uinput driver
	Set:		value used in preference if larger than computed
			value

Signed-off-by: Alan Cox <alan@xxxxxxxxxxxxxxx>
---

 drivers/input/misc/uinput.c |   25 +++++++++++++++++++++++--
 include/linux/uinput.h      |    3 +++
 2 files changed, 26 insertions(+), 2 deletions(-)


diff --git a/drivers/input/misc/uinput.c b/drivers/input/misc/uinput.c
index b941078..2d36ad8 100644
--- a/drivers/input/misc/uinput.c
+++ b/drivers/input/misc/uinput.c
@@ -349,6 +349,7 @@ static int uinput_setup_device(struct uinput_device *udev, const char __user *bu
 	char			*name;
 	int			i, size;
 	int			retval;
+	int			epp = 0;
 
 	if (count != sizeof(struct uinput_user_dev))
 		return -EINVAL;
@@ -407,11 +408,19 @@ static int uinput_setup_device(struct uinput_device *udev, const char __user *bu
 		if (test_bit(ABS_MT_SLOT, dev->absbit)) {
 			int nslot = input_abs_get_max(dev, ABS_MT_SLOT) + 1;
 			input_mt_create_slots(dev, nslot);
-			input_set_events_per_packet(dev, 6 * nslot);
+			epp = 6 * nslot;
 		} else if (test_bit(ABS_MT_POSITION_X, dev->absbit)) {
-			input_set_events_per_packet(dev, 60);
+			epp =  60;
 		}
 	}
+	/* if the user forced the event information then honour their
+	 * request providing it is bigger than the value we have ascertained
+	 * is required */
+	if (udev->events_per_packet > epp)
+		epp = udev->events_per_packet;
+
+	if (epp)
+		input_set_events_per_packet(dev, epp);
 
 	udev->state = UIST_SETUP_COMPLETE;
 	retval = count;
@@ -705,6 +714,18 @@ static long uinput_ioctl_handler(struct file *file, unsigned int cmd,
 			phys[length - 1] = '\0';
 			break;
 
+		case UI_SET_EPP:
+			if (udev->state == UIST_CREATED) {
+				retval = -EINVAL;
+				goto out;
+			}
+			if (arg < 1) {
+				retval = -EINVAL;
+				goto out;
+			}
+			udev->events_per_packet = arg;
+			break;
+			
 		case UI_BEGIN_FF_UPLOAD:
 			retval = uinput_ff_upload_from_user(p, &ff_up);
 			if (retval)
diff --git a/include/linux/uinput.h b/include/linux/uinput.h
index 05f7fed2..85c8b17 100644
--- a/include/linux/uinput.h
+++ b/include/linux/uinput.h
@@ -73,6 +73,8 @@ struct uinput_device {
 	struct uinput_request	*requests[UINPUT_NUM_REQUESTS];
 	wait_queue_head_t	requests_waitq;
 	spinlock_t		requests_lock;
+
+	int			events_per_packet;
 };
 #endif	/* __KERNEL__ */
 
@@ -104,6 +106,7 @@ struct uinput_ff_erase {
 #define UI_SET_FFBIT		_IOW(UINPUT_IOCTL_BASE, 107, int)
 #define UI_SET_PHYS		_IOW(UINPUT_IOCTL_BASE, 108, char*)
 #define UI_SET_SWBIT		_IOW(UINPUT_IOCTL_BASE, 109, int)
+#define UI_SET_EPP		_IOW(UINPUT_IOCTL_BASE, 110, int)
 
 #define UI_BEGIN_FF_UPLOAD	_IOWR(UINPUT_IOCTL_BASE, 200, struct uinput_ff_upload)
 #define UI_END_FF_UPLOAD	_IOW(UINPUT_IOCTL_BASE, 201, struct uinput_ff_upload)

--
To unsubscribe from this list: send the line "unsubscribe linux-input" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Media Devel]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Linux Wireless Networking]     [Linux Omap]

  Powered by Linux