HID: wacom: use wacom_wac_finger_count_touches to set touch_down
authorPing Cheng <pinglinux@gmail.com>
Fri, 20 Mar 2015 21:57:21 +0000 (14:57 -0700)
committerJiri Kosina <jkosina@suse.cz>
Thu, 2 Apr 2015 12:13:42 +0000 (14:13 +0200)
Counting number of touching fingers by wacom_wac_finger_count_touches so we
don't have to count them inside individual routines.

Signed-off-by: Ping Cheng <pingc@wacom.com>
Reviewed-by: Jason Gerecke <jason.gerecke@wacom.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
drivers/hid/wacom_wac.c

index 221443710aed60266956b20f2be5d1597ebe9f08..59b8e27909d4ec3896ad07aeedeff7edc5505ae9 100644 (file)
@@ -1065,6 +1065,28 @@ static int wacom_intuos_bt_irq(struct wacom_wac *wacom, size_t len)
        return 0;
 }
 
+static int wacom_wac_finger_count_touches(struct wacom_wac *wacom)
+{
+       struct input_dev *input = wacom->input;
+       unsigned touch_max = wacom->features.touch_max;
+       int count = 0;
+       int i;
+
+       /* non-HID_GENERIC single touch input doesn't call this routine */
+       if ((touch_max == 1) && (wacom->features.type == HID_GENERIC))
+               return wacom->hid_data.tipswitch &&
+                      !wacom->shared->stylus_in_proximity;
+
+       for (i = 0; i < input->mt->num_slots; i++) {
+               struct input_mt_slot *ps = &input->mt->slots[i];
+               int id = input_mt_get_value(ps, ABS_MT_TRACKING_ID);
+               if (id >= 0)
+                       count++;
+       }
+
+       return count;
+}
+
 static int wacom_24hdt_irq(struct wacom_wac *wacom)
 {
        struct input_dev *input = wacom->input;
@@ -1075,7 +1097,6 @@ static int wacom_24hdt_irq(struct wacom_wac *wacom)
        int num_contacts_left = 4; /* maximum contacts per packet */
        int byte_per_packet = WACOM_BYTES_PER_24HDT_PACKET;
        int y_offset = 2;
-       static int contact_with_no_pen_down_count = 0;
 
        if (wacom->features.type == WACOM_27QHDT) {
                current_num_contacts = data[63];
@@ -1088,10 +1109,8 @@ static int wacom_24hdt_irq(struct wacom_wac *wacom)
         * First packet resets the counter since only the first
         * packet in series will have non-zero current_num_contacts.
         */
-       if (current_num_contacts) {
+       if (current_num_contacts)
                wacom->num_contacts_left = current_num_contacts;
-               contact_with_no_pen_down_count = 0;
-       }
 
        contacts_to_send = min(num_contacts_left, wacom->num_contacts_left);
 
@@ -1124,7 +1143,6 @@ static int wacom_24hdt_irq(struct wacom_wac *wacom)
                                input_report_abs(input, ABS_MT_WIDTH_MINOR, min(w, h));
                                input_report_abs(input, ABS_MT_ORIENTATION, w > h);
                        }
-                       contact_with_no_pen_down_count++;
                }
        }
        input_mt_sync_frame(input);
@@ -1132,7 +1150,7 @@ static int wacom_24hdt_irq(struct wacom_wac *wacom)
        wacom->num_contacts_left -= contacts_to_send;
        if (wacom->num_contacts_left <= 0) {
                wacom->num_contacts_left = 0;
-               wacom->shared->touch_down = (contact_with_no_pen_down_count > 0);
+               wacom->shared->touch_down = wacom_wac_finger_count_touches(wacom);
        }
        return 1;
 }
@@ -1145,7 +1163,6 @@ static int wacom_mt_touch(struct wacom_wac *wacom)
        int current_num_contacts = data[2];
        int contacts_to_send = 0;
        int x_offset = 0;
-       static int contact_with_no_pen_down_count = 0;
 
        /* MTTPC does not support Height and Width */
        if (wacom->features.type == MTTPC || wacom->features.type == MTTPC_B)
@@ -1155,10 +1172,8 @@ static int wacom_mt_touch(struct wacom_wac *wacom)
         * First packet resets the counter since only the first
         * packet in series will have non-zero current_num_contacts.
         */
-       if (current_num_contacts) {
+       if (current_num_contacts)
                wacom->num_contacts_left = current_num_contacts;
-               contact_with_no_pen_down_count = 0;
-       }
 
        /* There are at most 5 contacts per packet */
        contacts_to_send = min(5, wacom->num_contacts_left);
@@ -1179,7 +1194,6 @@ static int wacom_mt_touch(struct wacom_wac *wacom)
                        int y = get_unaligned_le16(&data[offset + x_offset + 9]);
                        input_report_abs(input, ABS_MT_POSITION_X, x);
                        input_report_abs(input, ABS_MT_POSITION_Y, y);
-                       contact_with_no_pen_down_count++;
                }
        }
        input_mt_sync_frame(input);
@@ -1187,7 +1201,7 @@ static int wacom_mt_touch(struct wacom_wac *wacom)
        wacom->num_contacts_left -= contacts_to_send;
        if (wacom->num_contacts_left <= 0) {
                wacom->num_contacts_left = 0;
-               wacom->shared->touch_down = (contact_with_no_pen_down_count > 0);
+               wacom->shared->touch_down = wacom_wac_finger_count_touches(wacom);
        }
        return 1;
 }
@@ -1196,7 +1210,6 @@ static int wacom_tpc_mt_touch(struct wacom_wac *wacom)
 {
        struct input_dev *input = wacom->input;
        unsigned char *data = wacom->data;
-       int contact_with_no_pen_down_count = 0;
        int i;
 
        for (i = 0; i < 2; i++) {
@@ -1211,13 +1224,12 @@ static int wacom_tpc_mt_touch(struct wacom_wac *wacom)
 
                        input_report_abs(input, ABS_MT_POSITION_X, x);
                        input_report_abs(input, ABS_MT_POSITION_Y, y);
-                       contact_with_no_pen_down_count++;
                }
        }
        input_mt_sync_frame(input);
 
        /* keep touch state for pen event */
-       wacom->shared->touch_down = (contact_with_no_pen_down_count > 0);
+       wacom->shared->touch_down = wacom_wac_finger_count_touches(wacom);
 
        return 1;
 }
@@ -1545,29 +1557,6 @@ static int wacom_wac_finger_event(struct hid_device *hdev,
        return 0;
 }
 
-static int wacom_wac_finger_count_touches(struct hid_device *hdev)
-{
-       struct wacom *wacom = hid_get_drvdata(hdev);
-       struct wacom_wac *wacom_wac = &wacom->wacom_wac;
-       struct input_dev *input = wacom_wac->input;
-       unsigned touch_max = wacom_wac->features.touch_max;
-       int count = 0;
-       int i;
-
-       if (touch_max == 1)
-               return wacom_wac->hid_data.tipswitch &&
-                      !wacom_wac->shared->stylus_in_proximity;
-
-       for (i = 0; i < input->mt->num_slots; i++) {
-               struct input_mt_slot *ps = &input->mt->slots[i];
-               int id = input_mt_get_value(ps, ABS_MT_TRACKING_ID);
-               if (id >= 0)
-                       count++;
-       }
-
-       return count;
-}
-
 static void wacom_wac_finger_report(struct hid_device *hdev,
                struct hid_report *report)
 {
@@ -1582,7 +1571,7 @@ static void wacom_wac_finger_report(struct hid_device *hdev,
        input_sync(input);
 
        /* keep touch state for pen event */
-       wacom_wac->shared->touch_down = wacom_wac_finger_count_touches(hdev);
+       wacom_wac->shared->touch_down = wacom_wac_finger_count_touches(wacom_wac);
 }
 
 void wacom_wac_usage_mapping(struct hid_device *hdev,
@@ -1642,7 +1631,6 @@ static int wacom_bpt_touch(struct wacom_wac *wacom)
        struct input_dev *pad_input = wacom->pad_input;
        unsigned char *data = wacom->data;
        int i;
-       int contact_with_no_pen_down_count = 0;
 
        if (data[0] != 0x02)
            return 0;
@@ -1670,7 +1658,6 @@ static int wacom_bpt_touch(struct wacom_wac *wacom)
                        }
                        input_report_abs(input, ABS_MT_POSITION_X, x);
                        input_report_abs(input, ABS_MT_POSITION_Y, y);
-                       contact_with_no_pen_down_count++;
                }
        }
 
@@ -1680,12 +1667,12 @@ static int wacom_bpt_touch(struct wacom_wac *wacom)
        input_report_key(pad_input, BTN_FORWARD, (data[1] & 0x04) != 0);
        input_report_key(pad_input, BTN_BACK, (data[1] & 0x02) != 0);
        input_report_key(pad_input, BTN_RIGHT, (data[1] & 0x01) != 0);
-       wacom->shared->touch_down = (contact_with_no_pen_down_count > 0);
+       wacom->shared->touch_down = wacom_wac_finger_count_touches(wacom);
 
        return 1;
 }
 
-static int wacom_bpt3_touch_msg(struct wacom_wac *wacom, unsigned char *data, int last_touch_count)
+static void wacom_bpt3_touch_msg(struct wacom_wac *wacom, unsigned char *data)
 {
        struct wacom_features *features = &wacom->features;
        struct input_dev *input = wacom->input;
@@ -1693,7 +1680,7 @@ static int wacom_bpt3_touch_msg(struct wacom_wac *wacom, unsigned char *data, in
        int slot = input_mt_get_slot_by_key(input, data[0]);
 
        if (slot < 0)
-               return 0;
+               return;
 
        touch = touch && !wacom->shared->stylus_in_proximity;
 
@@ -1725,9 +1712,7 @@ static int wacom_bpt3_touch_msg(struct wacom_wac *wacom, unsigned char *data, in
                input_report_abs(input, ABS_MT_POSITION_Y, y);
                input_report_abs(input, ABS_MT_TOUCH_MAJOR, width);
                input_report_abs(input, ABS_MT_TOUCH_MINOR, height);
-               last_touch_count++;
        }
-       return last_touch_count;
 }
 
 static void wacom_bpt3_button_msg(struct wacom_wac *wacom, unsigned char *data)
@@ -1752,7 +1737,6 @@ static int wacom_bpt3_touch(struct wacom_wac *wacom)
        unsigned char *data = wacom->data;
        int count = data[1] & 0x07;
        int i;
-       int contact_with_no_pen_down_count = 0;
 
        if (data[0] != 0x02)
            return 0;
@@ -1763,15 +1747,13 @@ static int wacom_bpt3_touch(struct wacom_wac *wacom)
                int msg_id = data[offset];
 
                if (msg_id >= 2 && msg_id <= 17)
-                       contact_with_no_pen_down_count = 
-                           wacom_bpt3_touch_msg(wacom, data + offset,
-                                                contact_with_no_pen_down_count);
+                       wacom_bpt3_touch_msg(wacom, data + offset);
                else if (msg_id == 128)
                        wacom_bpt3_button_msg(wacom, data + offset);
 
        }
        input_mt_sync_frame(input);
-       wacom->shared->touch_down = (contact_with_no_pen_down_count > 0);
+       wacom->shared->touch_down = wacom_wac_finger_count_touches(wacom);
 
        return 1;
 }