Re: [PATCH 2/2] input: wacom - use new input-mt routines

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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


[Index of Archives]     [Linux Media Devel]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Linux Wireless Networking]     [Linux Omap]

  Powered by Linux