diff options
Diffstat (limited to 'drivers/input/input.c')
| -rw-r--r-- | drivers/input/input.c | 37 |
1 files changed, 11 insertions, 26 deletions
diff --git a/drivers/input/input.c b/drivers/input/input.c index 7985114beac..11905b6a302 100644 --- a/drivers/input/input.c +++ b/drivers/input/input.c | |||
| @@ -75,7 +75,6 @@ static int input_defuzz_abs_event(int value, int old_val, int fuzz) | |||
| 75 | * dev->event_lock held and interrupts disabled. | 75 | * dev->event_lock held and interrupts disabled. |
| 76 | */ | 76 | */ |
| 77 | static void input_pass_event(struct input_dev *dev, | 77 | static void input_pass_event(struct input_dev *dev, |
| 78 | struct input_handler *src_handler, | ||
| 79 | unsigned int type, unsigned int code, int value) | 78 | unsigned int type, unsigned int code, int value) |
| 80 | { | 79 | { |
| 81 | struct input_handler *handler; | 80 | struct input_handler *handler; |
| @@ -94,15 +93,6 @@ static void input_pass_event(struct input_dev *dev, | |||
| 94 | continue; | 93 | continue; |
| 95 | 94 | ||
| 96 | handler = handle->handler; | 95 | handler = handle->handler; |
| 97 | |||
| 98 | /* | ||
| 99 | * If this is the handler that injected this | ||
| 100 | * particular event we want to skip it to avoid | ||
| 101 | * filters firing again and again. | ||
| 102 | */ | ||
| 103 | if (handler == src_handler) | ||
| 104 | continue; | ||
| 105 | |||
| 106 | if (!handler->filter) { | 96 | if (!handler->filter) { |
| 107 | if (filtered) | 97 | if (filtered) |
| 108 | break; | 98 | break; |
| @@ -132,7 +122,7 @@ static void input_repeat_key(unsigned long data) | |||
| 132 | if (test_bit(dev->repeat_key, dev->key) && | 122 | if (test_bit(dev->repeat_key, dev->key) && |
| 133 | is_event_supported(dev->repeat_key, dev->keybit, KEY_MAX)) { | 123 | is_event_supported(dev->repeat_key, dev->keybit, KEY_MAX)) { |
| 134 | 124 | ||
| 135 | input_pass_event(dev, NULL, EV_KEY, dev->repeat_key, 2); | 125 | input_pass_event(dev, EV_KEY, dev->repeat_key, 2); |
| 136 | 126 | ||
| 137 | if (dev->sync) { | 127 | if (dev->sync) { |
| 138 | /* | 128 | /* |
| @@ -141,7 +131,7 @@ static void input_repeat_key(unsigned long data) | |||
| 141 | * Otherwise assume that the driver will send | 131 | * Otherwise assume that the driver will send |
| 142 | * SYN_REPORT once it's done. | 132 | * SYN_REPORT once it's done. |
| 143 | */ | 133 | */ |
| 144 | input_pass_event(dev, NULL, EV_SYN, SYN_REPORT, 1); | 134 | input_pass_event(dev, EV_SYN, SYN_REPORT, 1); |
| 145 | } | 135 | } |
| 146 | 136 | ||
| 147 | if (dev->rep[REP_PERIOD]) | 137 | if (dev->rep[REP_PERIOD]) |
| @@ -174,7 +164,6 @@ static void input_stop_autorepeat(struct input_dev *dev) | |||
| 174 | #define INPUT_PASS_TO_ALL (INPUT_PASS_TO_HANDLERS | INPUT_PASS_TO_DEVICE) | 164 | #define INPUT_PASS_TO_ALL (INPUT_PASS_TO_HANDLERS | INPUT_PASS_TO_DEVICE) |
| 175 | 165 | ||
| 176 | static int input_handle_abs_event(struct input_dev *dev, | 166 | static int input_handle_abs_event(struct input_dev *dev, |
| 177 | struct input_handler *src_handler, | ||
| 178 | unsigned int code, int *pval) | 167 | unsigned int code, int *pval) |
| 179 | { | 168 | { |
| 180 | bool is_mt_event; | 169 | bool is_mt_event; |
| @@ -218,15 +207,13 @@ static int input_handle_abs_event(struct input_dev *dev, | |||
| 218 | /* Flush pending "slot" event */ | 207 | /* Flush pending "slot" event */ |
| 219 | if (is_mt_event && dev->slot != input_abs_get_val(dev, ABS_MT_SLOT)) { | 208 | if (is_mt_event && dev->slot != input_abs_get_val(dev, ABS_MT_SLOT)) { |
| 220 | input_abs_set_val(dev, ABS_MT_SLOT, dev->slot); | 209 | input_abs_set_val(dev, ABS_MT_SLOT, dev->slot); |
| 221 | input_pass_event(dev, src_handler, | 210 | input_pass_event(dev, EV_ABS, ABS_MT_SLOT, dev->slot); |
| 222 | EV_ABS, ABS_MT_SLOT, dev->slot); | ||
| 223 | } | 211 | } |
| 224 | 212 | ||
| 225 | return INPUT_PASS_TO_HANDLERS; | 213 | return INPUT_PASS_TO_HANDLERS; |
| 226 | } | 214 | } |
| 227 | 215 | ||
| 228 | static void input_handle_event(struct input_dev *dev, | 216 | static void input_handle_event(struct input_dev *dev, |
| 229 | struct input_handler *src_handler, | ||
| 230 | unsigned int type, unsigned int code, int value) | 217 | unsigned int type, unsigned int code, int value) |
| 231 | { | 218 | { |
| 232 | int disposition = INPUT_IGNORE_EVENT; | 219 | int disposition = INPUT_IGNORE_EVENT; |
| @@ -279,8 +266,7 @@ static void input_handle_event(struct input_dev *dev, | |||
| 279 | 266 | ||
| 280 | case EV_ABS: | 267 | case EV_ABS: |
| 281 | if (is_event_supported(code, dev->absbit, ABS_MAX)) | 268 | if (is_event_supported(code, dev->absbit, ABS_MAX)) |
| 282 | disposition = input_handle_abs_event(dev, src_handler, | 269 | disposition = input_handle_abs_event(dev, code, &value); |
| 283 | code, &value); | ||
| 284 | 270 | ||
| 285 | break; | 271 | break; |
| 286 | 272 | ||
| @@ -338,7 +324,7 @@ static void input_handle_event(struct input_dev *dev, | |||
| 338 | dev->event(dev, type, code, value); | 324 | dev->event(dev, type, code, value); |
| 339 | 325 | ||
| 340 | if (disposition & INPUT_PASS_TO_HANDLERS) | 326 | if (disposition & INPUT_PASS_TO_HANDLERS) |
| 341 | input_pass_event(dev, src_handler, type, code, value); | 327 | input_pass_event(dev, type, code, value); |
| 342 | } | 328 | } |
| 343 | 329 | ||
| 344 | /** | 330 | /** |
| @@ -367,7 +353,7 @@ void input_event(struct input_dev *dev, | |||
| 367 | 353 | ||
| 368 | spin_lock_irqsave(&dev->event_lock, flags); | 354 | spin_lock_irqsave(&dev->event_lock, flags); |
| 369 | add_input_randomness(type, code, value); | 355 | add_input_randomness(type, code, value); |
| 370 | input_handle_event(dev, NULL, type, code, value); | 356 | input_handle_event(dev, type, code, value); |
| 371 | spin_unlock_irqrestore(&dev->event_lock, flags); | 357 | spin_unlock_irqrestore(&dev->event_lock, flags); |
| 372 | } | 358 | } |
| 373 | } | 359 | } |
| @@ -397,8 +383,7 @@ void input_inject_event(struct input_handle *handle, | |||
| 397 | rcu_read_lock(); | 383 | rcu_read_lock(); |
| 398 | grab = rcu_dereference(dev->grab); | 384 | grab = rcu_dereference(dev->grab); |
| 399 | if (!grab || grab == handle) | 385 | if (!grab || grab == handle) |
| 400 | input_handle_event(dev, handle->handler, | 386 | input_handle_event(dev, type, code, value); |
| 401 | type, code, value); | ||
| 402 | rcu_read_unlock(); | 387 | rcu_read_unlock(); |
| 403 | 388 | ||
| 404 | spin_unlock_irqrestore(&dev->event_lock, flags); | 389 | spin_unlock_irqrestore(&dev->event_lock, flags); |
| @@ -611,10 +596,10 @@ static void input_dev_release_keys(struct input_dev *dev) | |||
| 611 | for (code = 0; code <= KEY_MAX; code++) { | 596 | for (code = 0; code <= KEY_MAX; code++) { |
| 612 | if (is_event_supported(code, dev->keybit, KEY_MAX) && | 597 | if (is_event_supported(code, dev->keybit, KEY_MAX) && |
| 613 | __test_and_clear_bit(code, dev->key)) { | 598 | __test_and_clear_bit(code, dev->key)) { |
| 614 | input_pass_event(dev, NULL, EV_KEY, code, 0); | 599 | input_pass_event(dev, EV_KEY, code, 0); |
| 615 | } | 600 | } |
| 616 | } | 601 | } |
| 617 | input_pass_event(dev, NULL, EV_SYN, SYN_REPORT, 1); | 602 | input_pass_event(dev, EV_SYN, SYN_REPORT, 1); |
| 618 | } | 603 | } |
| 619 | } | 604 | } |
| 620 | 605 | ||
| @@ -889,9 +874,9 @@ int input_set_keycode(struct input_dev *dev, | |||
| 889 | !is_event_supported(old_keycode, dev->keybit, KEY_MAX) && | 874 | !is_event_supported(old_keycode, dev->keybit, KEY_MAX) && |
| 890 | __test_and_clear_bit(old_keycode, dev->key)) { | 875 | __test_and_clear_bit(old_keycode, dev->key)) { |
| 891 | 876 | ||
| 892 | input_pass_event(dev, NULL, EV_KEY, old_keycode, 0); | 877 | input_pass_event(dev, EV_KEY, old_keycode, 0); |
| 893 | if (dev->sync) | 878 | if (dev->sync) |
| 894 | input_pass_event(dev, NULL, EV_SYN, SYN_REPORT, 1); | 879 | input_pass_event(dev, EV_SYN, SYN_REPORT, 1); |
| 895 | } | 880 | } |
| 896 | 881 | ||
| 897 | out: | 882 | out: |
