diff options
Diffstat (limited to 'drivers/input/input.c')
-rw-r--r-- | drivers/input/input.c | 37 |
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 | */ | ||
35 | static 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 | }; | ||
48 | static unsigned long input_abs_bypass[BITS_TO_LONGS(ABS_CNT)]; | ||
49 | |||
32 | static LIST_HEAD(input_dev_list); | 50 | static LIST_HEAD(input_dev_list); |
33 | static LIST_HEAD(input_handler_list); | 51 | static 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 | ||
1664 | static 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 | |||
1637 | static int __init input_init(void) | 1672 | static 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"); |