aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/input/input.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/input/input.c')
-rw-r--r--drivers/input/input.c37
1 files changed, 37 insertions, 0 deletions
diff --git a/drivers/input/input.c b/drivers/input/input.c
index 935a1835de2..5d445f48789 100644
--- a/drivers/input/input.c
+++ b/drivers/input/input.c
@@ -29,6 +29,24 @@ MODULE_LICENSE("GPL");
29 29
30#define INPUT_DEVICES 256 30#define INPUT_DEVICES 256
31 31
32/*
33 * EV_ABS events which should not be cached are listed here.
34 */
35static unsigned int input_abs_bypass_init_data[] __initdata = {
36 ABS_MT_TOUCH_MAJOR,
37 ABS_MT_TOUCH_MINOR,
38 ABS_MT_WIDTH_MAJOR,
39 ABS_MT_WIDTH_MINOR,
40 ABS_MT_ORIENTATION,
41 ABS_MT_POSITION_X,
42 ABS_MT_POSITION_Y,
43 ABS_MT_TOOL_TYPE,
44 ABS_MT_BLOB_ID,
45 ABS_MT_TRACKING_ID,
46 0
47};
48static unsigned long input_abs_bypass[BITS_TO_LONGS(ABS_CNT)];
49
32static LIST_HEAD(input_dev_list); 50static LIST_HEAD(input_dev_list);
33static LIST_HEAD(input_handler_list); 51static LIST_HEAD(input_handler_list);
34 52
@@ -161,6 +179,10 @@ static void input_handle_event(struct input_dev *dev,
161 disposition = INPUT_PASS_TO_HANDLERS; 179 disposition = INPUT_PASS_TO_HANDLERS;
162 } 180 }
163 break; 181 break;
182 case SYN_MT_REPORT:
183 dev->sync = 0;
184 disposition = INPUT_PASS_TO_HANDLERS;
185 break;
164 } 186 }
165 break; 187 break;
166 188
@@ -192,6 +214,11 @@ static void input_handle_event(struct input_dev *dev,
192 case EV_ABS: 214 case EV_ABS:
193 if (is_event_supported(code, dev->absbit, ABS_MAX)) { 215 if (is_event_supported(code, dev->absbit, ABS_MAX)) {
194 216
217 if (test_bit(code, input_abs_bypass)) {
218 disposition = INPUT_PASS_TO_HANDLERS;
219 break;
220 }
221
195 value = input_defuzz_abs_event(value, 222 value = input_defuzz_abs_event(value,
196 dev->abs[code], dev->absfuzz[code]); 223 dev->abs[code], dev->absfuzz[code]);
197 224
@@ -1634,10 +1661,20 @@ static const struct file_operations input_fops = {
1634 .open = input_open_file, 1661 .open = input_open_file,
1635}; 1662};
1636 1663
1664static void __init input_init_abs_bypass(void)
1665{
1666 const unsigned int *p;
1667
1668 for (p = input_abs_bypass_init_data; *p; p++)
1669 input_abs_bypass[BIT_WORD(*p)] |= BIT_MASK(*p);
1670}
1671
1637static int __init input_init(void) 1672static int __init input_init(void)
1638{ 1673{
1639 int err; 1674 int err;
1640 1675
1676 input_init_abs_bypass();
1677
1641 err = class_register(&input_class); 1678 err = class_register(&input_class);
1642 if (err) { 1679 if (err) {
1643 printk(KERN_ERR "input: unable to register input_dev class\n"); 1680 printk(KERN_ERR "input: unable to register input_dev class\n");