Hi Ping, > This patch brings wacom driver in-sync with input-mt changes > made in release 3.7. > > Signed-off-by: Ping Cheng <pingc@xxxxxxxxx> > Reviewed-by: Henrik Rydberg <rydberg@xxxxxxxxxxx> > --- > drivers/input/tablet/wacom_wac.c | 82 ++++++++++---------------------------- > drivers/input/tablet/wacom_wac.h | 1 - > 2 files changed, 22 insertions(+), 61 deletions(-) > > diff --git a/drivers/input/tablet/wacom_wac.c b/drivers/input/tablet/wacom_wac.c > index 097b559..a318bf4 100644 > --- a/drivers/input/tablet/wacom_wac.c > +++ b/drivers/input/tablet/wacom_wac.c > @@ -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; > } > - Looks like a stray line removal here. > 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; > } > - And here. Intentionally? > 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); > > } > - Ditto. > 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); > diff --git a/drivers/input/tablet/wacom_wac.h b/drivers/input/tablet/wacom_wac.h > index 9396d77..06410fe 100644 > --- a/drivers/input/tablet/wacom_wac.h > +++ b/drivers/input/tablet/wacom_wac.h > @@ -135,7 +135,6 @@ struct wacom_wac { > int pid; > int battery_capacity; > int num_contacts_left; > - int *slots; > }; > > #endif > -- > 1.7.10.4 > Reviewed-by: Henrik Rydberg <rydberg@xxxxxxxxxxx> Thanks, Henrik -- To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html