aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenrik Rydberg <rydberg@euromail.se>2012-09-01 16:15:43 +0200
committerHenrik Rydberg <rydberg@euromail.se>2012-09-19 19:50:17 +0200
commit7c75bf99271139ca7cb2d0cca3be11f1f7c59efd (patch)
treed1a30a1f4211f614d72cab7e1b164bebb45a9292
parentInput: Break out MT data (diff)
downloadlinux-dev-7c75bf99271139ca7cb2d0cca3be11f1f7c59efd.tar.xz
linux-dev-7c75bf99271139ca7cb2d0cca3be11f1f7c59efd.zip
Input: Improve the events-per-packet estimate
The events-per-packet estimate has so far been used by MT devices only. This patch adjusts the packet buffer size to also accomodate the KEY and MSC events. Keyboards normally send one or two keys at a time. MT devices normally send a number of button keys along with the MT information. The buffer size chosen here covers those cases, and matches the default buffer size in evdev. Since the input estimate is now preferred, remove the special input-mt estimate. Reviewed-and-tested-by: Ping Cheng <pingc@wacom.com> Tested-by: Benjamin Tissoires <benjamin.tissoires@enac.fr> Acked-by: Dmitry Torokhov <dmitry.torokhov@gmail.com> Signed-off-by: Henrik Rydberg <rydberg@euromail.se>
-rw-r--r--drivers/input/input-mt.c1
-rw-r--r--drivers/input/input.c10
2 files changed, 7 insertions, 4 deletions
diff --git a/drivers/input/input-mt.c b/drivers/input/input-mt.c
index 37ee1f925d23..6020d06652a8 100644
--- a/drivers/input/input-mt.c
+++ b/drivers/input/input-mt.c
@@ -42,7 +42,6 @@ int input_mt_init_slots(struct input_dev *dev, unsigned int num_slots)
mt->num_slots = num_slots;
input_set_abs_params(dev, ABS_MT_SLOT, 0, num_slots - 1, 0, 0);
input_set_abs_params(dev, ABS_MT_TRACKING_ID, 0, TRKID_MAX, 0, 0);
- input_set_events_per_packet(dev, 6 * num_slots);
/* Mark slots as 'unused' */
for (i = 0; i < num_slots; i++)
diff --git a/drivers/input/input.c b/drivers/input/input.c
index 79a4a2ad74de..fb3a2c112deb 100644
--- a/drivers/input/input.c
+++ b/drivers/input/input.c
@@ -1778,6 +1778,9 @@ static unsigned int input_estimate_events_per_packet(struct input_dev *dev)
if (test_bit(i, dev->relbit))
events++;
+ /* Make room for KEY and MSC events */
+ events += 7;
+
return events;
}
@@ -1816,6 +1819,7 @@ int input_register_device(struct input_dev *dev)
{
static atomic_t input_no = ATOMIC_INIT(0);
struct input_handler *handler;
+ unsigned int packet_size;
const char *path;
int error;
@@ -1828,9 +1832,9 @@ int input_register_device(struct input_dev *dev)
/* Make sure that bitmasks not mentioned in dev->evbit are clean. */
input_cleanse_bitmasks(dev);
- if (!dev->hint_events_per_packet)
- dev->hint_events_per_packet =
- input_estimate_events_per_packet(dev);
+ packet_size = input_estimate_events_per_packet(dev);
+ if (dev->hint_events_per_packet < packet_size)
+ dev->hint_events_per_packet = packet_size;
/*
* If delay and period are pre-set by the driver, then autorepeating