On Tue, Dec 4, 2012 at 8:13 AM, Henrik Rydberg <rydberg@xxxxxxxxxxx> wrote: > 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> >> --- >> drivers/input/tablet/wacom_wac.c | 84 ++++++++++---------------------------- >> drivers/input/tablet/wacom_wac.h | 1 - >> 2 files changed, 21 insertions(+), 64 deletions(-) >> >> diff --git a/drivers/input/tablet/wacom_wac.c b/drivers/input/tablet/wacom_wac.c >> index 097b559..a1a08ea 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,11 +836,8 @@ 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); >> - > > What replaces this line? Good question. Somehow I remember if we pass non-zero flags to input_mt_init_slots(), input-mt.c will take care of pointer_emulation based on the flags. I searched the code again. I do not see input_mt_report_pointer_emulation() called in input-mt.c except by input-mt-sync_frame(), which wacom driver does not use. I guess I have to leave them there. However, for this particular one (and maybe 2 below), we do need to remove it. 24hdt is a touchscren device, which should not emulate pointer events. I will make a separate patch for this change. > >> wacom->num_contacts_left -= contacts_to_send; >> if (wacom->num_contacts_left <= 0) >> wacom->num_contacts_left = 0; >> @@ -895,7 +872,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,11 +885,8 @@ 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); >> - > > And this one? > >> wacom->num_contacts_left -= contacts_to_send; >> if (wacom->num_contacts_left < 0) >> wacom->num_contacts_left = 0; >> @@ -946,8 +920,6 @@ static int wacom_tpc_mt_touch(struct wacom_wac *wacom) >> /* 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 +1076,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) { >> @@ -1163,8 +1138,6 @@ static int wacom_bpt3_touch(struct wacom_wac *wacom) >> >> } >> >> - input_mt_report_pointer_emulation(input, true); >> - > > And this one? > >> input_sync(input); >> >> return 0; >> @@ -1639,17 +1612,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); > > Using INPUT_MT_POINTER only works for the non-semi-mt case so far, I > suppose this is the true MT case? Yes, all supported MT devices send true MT events. Thank you for your time. Ping > >> } >> break; >> >> @@ -1680,21 +1647,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 +1697,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 >> > > 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