|
@@ -1746,6 +1746,42 @@ void input_set_capability(struct input_dev *dev, unsigned int type, unsigned int
|
|
|
}
|
|
|
EXPORT_SYMBOL(input_set_capability);
|
|
|
|
|
|
+static unsigned int input_estimate_events_per_packet(struct input_dev *dev)
|
|
|
+{
|
|
|
+ int mt_slots;
|
|
|
+ int i;
|
|
|
+ unsigned int events;
|
|
|
+
|
|
|
+ if (dev->mtsize) {
|
|
|
+ mt_slots = dev->mtsize;
|
|
|
+ } else if (test_bit(ABS_MT_TRACKING_ID, dev->absbit)) {
|
|
|
+ mt_slots = dev->absinfo[ABS_MT_TRACKING_ID].maximum -
|
|
|
+ dev->absinfo[ABS_MT_TRACKING_ID].minimum + 1,
|
|
|
+ clamp(mt_slots, 2, 32);
|
|
|
+ } else if (test_bit(ABS_MT_POSITION_X, dev->absbit)) {
|
|
|
+ mt_slots = 2;
|
|
|
+ } else {
|
|
|
+ mt_slots = 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ events = mt_slots + 1; /* count SYN_MT_REPORT and SYN_REPORT */
|
|
|
+
|
|
|
+ for (i = 0; i < ABS_CNT; i++) {
|
|
|
+ if (test_bit(i, dev->absbit)) {
|
|
|
+ if (input_is_mt_axis(i))
|
|
|
+ events += mt_slots;
|
|
|
+ else
|
|
|
+ events++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ for (i = 0; i < REL_CNT; i++)
|
|
|
+ if (test_bit(i, dev->relbit))
|
|
|
+ events++;
|
|
|
+
|
|
|
+ return events;
|
|
|
+}
|
|
|
+
|
|
|
#define INPUT_CLEANSE_BITMASK(dev, type, bits) \
|
|
|
do { \
|
|
|
if (!test_bit(EV_##type, dev->evbit)) \
|
|
@@ -1793,6 +1829,10 @@ 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);
|
|
|
+
|
|
|
/*
|
|
|
* If delay and period are pre-set by the driver, then autorepeating
|
|
|
* is handled by the driver itself and we don't do it in input.c.
|