On Fri, Feb 11, 2011 at 12:20 PM, Henrik Rydberg <rydberg@xxxxxxxxxxx> wrote: > Hi Ping, > > On Thu, Feb 10, 2011 at 05:33:03PM -0800, Ping Cheng wrote: > > Given the nice patch below, there has to be _something_ to say about it here, hmm? > >> Reviewed-by: Chris Bagwell <chris@xxxxxxxxxxxxxx> >> Signed-off-by: Ping Cheng <pingc@xxxxxxxxx> >> --- >> drivers/input/tablet/wacom_sys.c | 12 ++++---- >> drivers/input/tablet/wacom_wac.c | 61 ++++++++++++++++++++++++++++++------- >> 2 files changed, 55 insertions(+), 18 deletions(-) >> >> diff --git a/drivers/input/tablet/wacom_sys.c b/drivers/input/tablet/wacom_sys.c >> index fc38149..b97665f 100644 >> --- a/drivers/input/tablet/wacom_sys.c >> +++ b/drivers/input/tablet/wacom_sys.c >> @@ -193,16 +193,16 @@ static int wacom_parse_hid(struct usb_interface *intf, struct hid_descriptor *hi >> case HID_USAGE_X: >> if (usage == WCM_DESKTOP) { >> if (finger) { >> - features->device_type = BTN_TOOL_DOUBLETAP; >> + features->device_type = BTN_TOOL_FINGER; >> if (features->type == TABLETPC2FG) { >> /* need to reset back */ >> features->pktlen = WACOM_PKGLEN_TPC2FG; >> - features->device_type = BTN_TOOL_TRIPLETAP; >> + features->device_type = BTN_TOOL_DOUBLETAP; >> } >> if (features->type == BAMBOO_PT) { >> /* need to reset back */ >> features->pktlen = WACOM_PKGLEN_BBTOUCH; >> - features->device_type = BTN_TOOL_TRIPLETAP; >> + features->device_type = BTN_TOOL_DOUBLETAP; >> features->x_phy = >> get_unaligned_le16(&report[i + 5]); >> features->x_max = >> @@ -241,11 +241,11 @@ static int wacom_parse_hid(struct usb_interface *intf, struct hid_descriptor *hi >> case HID_USAGE_Y: >> if (usage == WCM_DESKTOP) { >> if (finger) { >> - features->device_type = BTN_TOOL_DOUBLETAP; >> + features->device_type = BTN_TOOL_FINGER; >> if (features->type == TABLETPC2FG) { >> /* need to reset back */ >> features->pktlen = WACOM_PKGLEN_TPC2FG; >> - features->device_type = BTN_TOOL_TRIPLETAP; >> + features->device_type = BTN_TOOL_DOUBLETAP; >> features->y_max = >> get_unaligned_le16(&report[i + 3]); >> features->y_phy = >> @@ -254,7 +254,7 @@ static int wacom_parse_hid(struct usb_interface *intf, struct hid_descriptor *hi >> } else if (features->type == BAMBOO_PT) { >> /* need to reset back */ >> features->pktlen = WACOM_PKGLEN_BBTOUCH; >> - features->device_type = BTN_TOOL_TRIPLETAP; >> + features->device_type = BTN_TOOL_DOUBLETAP; >> features->y_phy = >> get_unaligned_le16(&report[i + 3]); >> features->y_max = >> diff --git a/drivers/input/tablet/wacom_wac.c b/drivers/input/tablet/wacom_wac.c >> index fc0669d..39c289d 100644 >> --- a/drivers/input/tablet/wacom_wac.c >> +++ b/drivers/input/tablet/wacom_wac.c >> @@ -675,6 +675,38 @@ static int wacom_intuos_irq(struct wacom_wac *wacom) >> return 1; >> } >> >> +static int wacom_tpc_mt_touch(struct wacom_wac *wacom) >> +{ >> + struct input_dev *input = wacom->input; >> + unsigned char *data = wacom->data; >> + int i; >> + >> + if (wacom->shared->stylus_in_proximity && !wacom->shared->touch_down) >> + return 0; > > Seeing one case handled out of four possible always makes me nervous. The above statement is to avoid going through the input_mt_slot and input_mt_report_slot_state routines without posting any meaningful events. I guess it could be considered as a performance enhancement? Which case makes you nervous? I'll take care of it ;). >> + >> + for (i = 0; i < 2; i++) { >> + int p = data[1] & (1 << i); >> + bool touch = p && !wacom->shared->stylus_in_proximity; >> + >> + input_mt_slot(input, i); >> + input_mt_report_slot_state(input, MT_TOOL_FINGER, touch); >> + if (touch) { >> + int x = le16_to_cpup((__le16 *)&data[i * 2 + 2]) & 0x7fff; >> + int y = le16_to_cpup((__le16 *)&data[i * 2 + 6]) & 0x7fff; >> + >> + input_report_abs(input, ABS_MT_POSITION_X, x); >> + input_report_abs(input, ABS_MT_POSITION_Y, y); >> + } >> + >> + /* keep touch bit to send proper touch up event */ >> + wacom->shared->touch_down = max(touch, wacom->shared->touch_down); > > So only false->true is possible here. Yeah, both are bools. What else can they take? > What I can see from the patchset, only wacom_tpc_single_touch() will ever set touch_down to > false. Is that sufficient? No, wacom_tpc_mt_touch can set touch_down to false too. When touch is false, touch_down will be false. This happens when pen in prox or when both fingers are up. Where else do you see it can be changed? tpc_pen() can not do that since it is on a different port, that's the reason of touch_down. Ping >> + } >> + >> + input_mt_report_pointer_emulation(input, true); >> + >> + return 1; >> +} >> + >> static int wacom_tpc_single_touch(struct wacom_wac *wacom, size_t len) >> { >> char *data = wacom->data; >> @@ -753,6 +785,8 @@ static int wacom_tpc_irq(struct wacom_wac *wacom, size_t len) >> >> if (len == WACOM_PKGLEN_TPC1FG || data[0] == WACOM_REPORT_TPC1FG) >> return wacom_tpc_single_touch(wacom, len); >> + else if (data[0] == WACOM_REPORT_TPC2FG) >> + return wacom_tpc_mt_touch(wacom); >> else if (data[0] == WACOM_REPORT_PENABLED) >> return wacom_tpc_pen(wacom); >> >> @@ -979,7 +1013,7 @@ void wacom_setup_device_quirks(struct wacom_features *features) >> { >> >> /* touch device found but size is not defined. use default */ >> - if (features->device_type == BTN_TOOL_DOUBLETAP && !features->x_max) { >> + if (features->device_type == BTN_TOOL_FINGER && !features->x_max) { >> features->x_max = 1023; >> features->y_max = 1023; >> } >> @@ -991,7 +1025,7 @@ void wacom_setup_device_quirks(struct wacom_features *features) >> >> /* quirks for bamboo touch */ >> if (features->type == BAMBOO_PT && >> - features->device_type == BTN_TOOL_TRIPLETAP) { >> + features->device_type == BTN_TOOL_DOUBLETAP) { >> features->x_max <<= 5; >> features->y_max <<= 5; >> features->x_fuzz <<= 5; >> @@ -1127,28 +1161,31 @@ void wacom_setup_input_capabilities(struct input_dev *input_dev, >> break; >> >> case TABLETPC2FG: >> - if (features->device_type == BTN_TOOL_TRIPLETAP) { >> - __set_bit(BTN_TOOL_TRIPLETAP, input_dev->keybit); >> - input_set_capability(input_dev, EV_MSC, MSC_SERIAL); >> + if (features->device_type == BTN_TOOL_DOUBLETAP) { >> + __set_bit(BTN_TOOL_DOUBLETAP, input_dev->keybit); >> + >> + input_mt_init_slots(input_dev, 2); >> + input_set_abs_params(input_dev, ABS_MT_TOOL_TYPE, >> + 0, MT_TOOL_MAX, 0, 0); >> + input_set_abs_params(input_dev, ABS_MT_POSITION_X, >> + 0, features->x_max, 0, 0); >> + input_set_abs_params(input_dev, ABS_MT_POSITION_Y, >> + 0, features->y_max, 0, 0); >> } >> /* fall through */ >> >> case TABLETPC: >> __clear_bit(ABS_MISC, input_dev->absbit); >> >> - if (features->device_type == BTN_TOOL_DOUBLETAP || >> - features->device_type == BTN_TOOL_TRIPLETAP) { >> + if (features->device_type != BTN_TOOL_PEN) { >> input_abs_set_res(input_dev, ABS_X, >> wacom_calculate_touch_res(features->x_max, >> features->x_phy)); >> input_abs_set_res(input_dev, ABS_Y, >> wacom_calculate_touch_res(features->y_max, >> features->y_phy)); >> - } >> - >> - if (features->device_type != BTN_TOOL_PEN) >> break; /* no need to process stylus stuff */ >> - >> + } >> /* fall through */ >> >> case PL: >> @@ -1166,7 +1203,7 @@ void wacom_setup_input_capabilities(struct input_dev *input_dev, >> case BAMBOO_PT: >> __clear_bit(ABS_MISC, input_dev->absbit); >> >> - if (features->device_type == BTN_TOOL_TRIPLETAP) { >> + if (features->device_type == BTN_TOOL_DOUBLETAP) { >> __set_bit(BTN_LEFT, input_dev->keybit); >> __set_bit(BTN_FORWARD, input_dev->keybit); >> __set_bit(BTN_BACK, input_dev->keybit); >> -- > > 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