Input: wacom - use new input-mt routines
authorPing Cheng <pinglinux@gmail.com>
Sat, 5 Jan 2013 07:56:00 +0000 (23:56 -0800)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Sun, 6 Jan 2013 09:11:02 +0000 (01:11 -0800)
This patch brings wacom driver in-sync with input-mt changes
made in release 3.7.

Signed-off-by: Ping Cheng <pingc@wacom.com>
Reviewed-by: Henrik Rydberg <rydberg@euromail.se>
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
drivers/input/tablet/wacom_wac.c
drivers/input/tablet/wacom_wac.h

index 097b559ea838c4fe52f24b8db16cd7d0e1209377..a318bf4ada0524e569a44422d563271f14126ba2 100644 (file)
@@ -785,25 +785,6 @@ static int wacom_intuos_irq(struct wacom_wac *wacom)
        return 1;
 }
 
-static int find_slot_from_contactid(struct wacom_wac *wacom, int contactid)
-{
-       int touch_max = wacom->features.touch_max;
-       int i;
-
-       if (!wacom->slots)
-               return -1;
-
-       for (i = 0; i < touch_max; ++i) {
-               if (wacom->slots[i] == contactid)
-                       return i;
-       }
-       for (i = 0; i < touch_max; ++i) {
-               if (wacom->slots[i] == -1)
-                       return i;
-       }
-       return -1;
-}
-
 static int int_dist(int x1, int y1, int x2, int y2)
 {
        int x = x2 - x1;
@@ -833,8 +814,7 @@ static int wacom_24hdt_irq(struct wacom_wac *wacom)
        for (i = 0; i < contacts_to_send; i++) {
                int offset = (WACOM_BYTES_PER_24HDT_PACKET * i) + 1;
                bool touch = data[offset] & 0x1 && !wacom->shared->stylus_in_proximity;
-               int id = data[offset + 1];
-               int slot = find_slot_from_contactid(wacom, id);
+               int slot = input_mt_get_slot_by_key(input, data[offset + 1]);
 
                if (slot < 0)
                        continue;
@@ -856,9 +836,7 @@ 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);
                }
-               wacom->slots[slot] = touch ? id : -1;
        }
-
        input_mt_report_pointer_emulation(input, true);
 
        wacom->num_contacts_left -= contacts_to_send;
@@ -895,7 +873,7 @@ static int wacom_mt_touch(struct wacom_wac *wacom)
                int offset = (WACOM_BYTES_PER_MT_PACKET + x_offset) * i + 3;
                bool touch = data[offset] & 0x1;
                int id = le16_to_cpup((__le16 *)&data[offset + 1]);
-               int slot = find_slot_from_contactid(wacom, id);
+               int slot = input_mt_get_slot_by_key(input, id);
 
                if (slot < 0)
                        continue;
@@ -908,9 +886,7 @@ static int wacom_mt_touch(struct wacom_wac *wacom)
                        input_report_abs(input, ABS_MT_POSITION_X, x);
                        input_report_abs(input, ABS_MT_POSITION_Y, y);
                }
-               wacom->slots[slot] = touch ? id : -1;
        }
-
        input_mt_report_pointer_emulation(input, true);
 
        wacom->num_contacts_left -= contacts_to_send;
@@ -942,12 +918,11 @@ static int wacom_tpc_mt_touch(struct wacom_wac *wacom)
                        contact_with_no_pen_down_count++;
                }
        }
+       input_mt_report_pointer_emulation(input, true);
 
        /* keep touch state for pen event */
        wacom->shared->touch_down = (contact_with_no_pen_down_count > 0);
 
-       input_mt_report_pointer_emulation(input, true);
-
        return 1;
 }
 
@@ -1104,12 +1079,15 @@ static int wacom_bpt_touch(struct wacom_wac *wacom)
 static void wacom_bpt3_touch_msg(struct wacom_wac *wacom, unsigned char *data)
 {
        struct input_dev *input = wacom->input;
-       int slot_id = data[0] - 2;  /* data[0] is between 2 and 17 */
        bool touch = data[1] & 0x80;
+       int slot = input_mt_get_slot_by_key(input, data[0]);
+
+       if (slot < 0)
+               return;
 
        touch = touch && !wacom->shared->stylus_in_proximity;
 
-       input_mt_slot(input, slot_id);
+       input_mt_slot(input, slot);
        input_mt_report_slot_state(input, MT_TOOL_FINGER, touch);
 
        if (touch) {
@@ -1162,7 +1140,6 @@ static int wacom_bpt3_touch(struct wacom_wac *wacom)
                        wacom_bpt3_button_msg(wacom, data + offset);
 
        }
-
        input_mt_report_pointer_emulation(input, true);
 
        input_sync(input);
@@ -1639,17 +1616,11 @@ int wacom_setup_input_capabilities(struct input_dev *input_dev,
                } else if (features->device_type == BTN_TOOL_FINGER) {
                        __clear_bit(ABS_MISC, input_dev->absbit);
 
-                       __set_bit(BTN_TOOL_FINGER, input_dev->keybit);
-                       __set_bit(BTN_TOOL_DOUBLETAP, input_dev->keybit);
-                       __set_bit(BTN_TOOL_TRIPLETAP, input_dev->keybit);
-                       __set_bit(BTN_TOOL_QUADTAP, input_dev->keybit);
-
-                       input_mt_init_slots(input_dev, features->touch_max, 0);
-
                        input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR,
                                             0, features->x_max, 0, 0);
                        input_set_abs_params(input_dev, ABS_MT_TOUCH_MINOR,
                                             0, features->y_max, 0, 0);
+                       input_mt_init_slots(input_dev, features->touch_max, INPUT_MT_POINTER);
                }
                break;
 
@@ -1680,21 +1651,14 @@ int wacom_setup_input_capabilities(struct input_dev *input_dev,
 
        case MTSCREEN:
        case MTTPC:
-               if (features->device_type == BTN_TOOL_FINGER) {
-                       wacom_wac->slots = kmalloc(features->touch_max *
-                                                       sizeof(int),
-                                                  GFP_KERNEL);
-                       if (!wacom_wac->slots)
-                               return -ENOMEM;
-
-                       for (i = 0; i < features->touch_max; i++)
-                               wacom_wac->slots[i] = -1;
-               }
-               /* fall through */
-
        case TABLETPC2FG:
                if (features->device_type == BTN_TOOL_FINGER) {
-                       input_mt_init_slots(input_dev, features->touch_max, 0);
+                       unsigned int flags = INPUT_MT_DIRECT;
+
+                       if (wacom_wac->features.type == TABLETPC2FG)
+                               flags = 0;
+
+                       input_mt_init_slots(input_dev, features->touch_max, flags);
                }
                /* fall through */
 
@@ -1737,28 +1701,26 @@ int wacom_setup_input_capabilities(struct input_dev *input_dev,
                __set_bit(INPUT_PROP_POINTER, input_dev->propbit);
 
                if (features->device_type == BTN_TOOL_FINGER) {
+                       unsigned int flags = INPUT_MT_POINTER;
+
                        __set_bit(BTN_LEFT, input_dev->keybit);
                        __set_bit(BTN_FORWARD, input_dev->keybit);
                        __set_bit(BTN_BACK, input_dev->keybit);
                        __set_bit(BTN_RIGHT, input_dev->keybit);
 
-                       __set_bit(BTN_TOOL_FINGER, input_dev->keybit);
-                       __set_bit(BTN_TOOL_DOUBLETAP, input_dev->keybit);
-                       input_mt_init_slots(input_dev, features->touch_max, 0);
-
                        if (features->pktlen == WACOM_PKGLEN_BBTOUCH3) {
-                               __set_bit(BTN_TOOL_TRIPLETAP,
-                                         input_dev->keybit);
-                               __set_bit(BTN_TOOL_QUADTAP,
-                                         input_dev->keybit);
-
                                input_set_abs_params(input_dev,
                                                     ABS_MT_TOUCH_MAJOR,
                                                     0, features->x_max, 0, 0);
                                input_set_abs_params(input_dev,
                                                     ABS_MT_TOUCH_MINOR,
                                                     0, features->y_max, 0, 0);
+                       } else {
+                               __set_bit(BTN_TOOL_FINGER, input_dev->keybit);
+                               __set_bit(BTN_TOOL_DOUBLETAP, input_dev->keybit);
+                               flags = 0;
                        }
+                       input_mt_init_slots(input_dev, features->touch_max, flags);
                } else if (features->device_type == BTN_TOOL_PEN) {
                        __set_bit(BTN_TOOL_RUBBER, input_dev->keybit);
                        __set_bit(BTN_TOOL_PEN, input_dev->keybit);
index 9396d7769f86a86930b56f3f2e1fbbae024b82cf..06410fe6425f79ba7f688dcd0e36c416ec49362c 100644 (file)
@@ -135,7 +135,6 @@ struct wacom_wac {
        int pid;
        int battery_capacity;
        int num_contacts_left;
-       int *slots;
 };
 
 #endif