Merge tag 'v3.19-rc4' into next
[cascardo/linux.git] / drivers / input / input.c
index 04217c2..cc357f1 100644 (file)
@@ -100,23 +100,24 @@ static unsigned int input_to_handler(struct input_handle *handle,
        struct input_value *end = vals;
        struct input_value *v;
 
-       for (v = vals; v != vals + count; v++) {
-               if (handler->filter &&
-                   handler->filter(handle, v->type, v->code, v->value))
-                       continue;
-               if (end != v)
-                       *end = *v;
-               end++;
+       if (handler->filter) {
+               for (v = vals; v != vals + count; v++) {
+                       if (handler->filter(handle, v->type, v->code, v->value))
+                               continue;
+                       if (end != v)
+                               *end = *v;
+                       end++;
+               }
+               count = end - vals;
        }
 
-       count = end - vals;
        if (!count)
                return 0;
 
        if (handler->events)
                handler->events(handle, vals, count);
        else if (handler->event)
-               for (v = vals; v != end; v++)
+               for (v = vals; v != vals + count; v++)
                        handler->event(handle, v->type, v->code, v->value);
 
        return count;
@@ -143,8 +144,11 @@ static void input_pass_values(struct input_dev *dev,
                count = input_to_handler(handle, vals, count);
        } else {
                list_for_each_entry_rcu(handle, &dev->h_list, d_node)
-                       if (handle->open)
+                       if (handle->open) {
                                count = input_to_handler(handle, vals, count);
+                               if (!count)
+                                       break;
+                       }
        }
 
        rcu_read_unlock();
@@ -152,12 +156,14 @@ static void input_pass_values(struct input_dev *dev,
        add_input_randomness(vals->type, vals->code, vals->value);
 
        /* trigger auto repeat for key events */
-       for (v = vals; v != vals + count; v++) {
-               if (v->type == EV_KEY && v->value != 2) {
-                       if (v->value)
-                               input_start_autorepeat(dev, v->code);
-                       else
-                               input_stop_autorepeat(dev);
+       if (test_bit(EV_REP, dev->evbit) && test_bit(EV_KEY, dev->evbit)) {
+               for (v = vals; v != vals + count; v++) {
+                       if (v->type == EV_KEY && v->value != 2) {
+                               if (v->value)
+                                       input_start_autorepeat(dev, v->code);
+                               else
+                                       input_stop_autorepeat(dev);
+                       }
                }
        }
 }
@@ -1974,18 +1980,22 @@ static unsigned int input_estimate_events_per_packet(struct input_dev *dev)
 
        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++;
+       if (test_bit(EV_ABS, dev->evbit)) {
+               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++;
+       if (test_bit(EV_REL, dev->evbit)) {
+               for (i = 0; i < REL_CNT; i++)
+                       if (test_bit(i, dev->relbit))
+                               events++;
+       }
 
        /* Make room for KEY and MSC events */
        events += 7;