aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/input/tablet/wacom_wac.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/input/tablet/wacom_wac.c')
-rw-r--r--drivers/input/tablet/wacom_wac.c33
1 files changed, 12 insertions, 21 deletions
diff --git a/drivers/input/tablet/wacom_wac.c b/drivers/input/tablet/wacom_wac.c
index b3ba3437a2eb..428144af865f 100644
--- a/drivers/input/tablet/wacom_wac.c
+++ b/drivers/input/tablet/wacom_wac.c
@@ -688,7 +688,6 @@ static int wacom_tpc_irq(struct wacom_wac *wacom, void *wcombo)
688 struct wacom_features *features = &wacom->features; 688 struct wacom_features *features = &wacom->features;
689 char *data = wacom->data; 689 char *data = wacom->data;
690 int prox = 0, pressure, idx = -1; 690 int prox = 0, pressure, idx = -1;
691 static int stylusInProx, touchInProx = 1, touchOut;
692 struct urb *urb = ((struct wacom_combo *)wcombo)->urb; 691 struct urb *urb = ((struct wacom_combo *)wcombo)->urb;
693 692
694 dbg("wacom_tpc_irq: received report #%d", data[0]); 693 dbg("wacom_tpc_irq: received report #%d", data[0]);
@@ -707,16 +706,12 @@ static int wacom_tpc_irq(struct wacom_wac *wacom, void *wcombo)
707 prox = data[1] & 0x03; 706 prox = data[1] & 0x03;
708 } 707 }
709 708
710 if (!stylusInProx) { /* stylus not in prox */ 709 if (!wacom->shared->stylus_in_proximity) {
711 if (prox) { 710 if (prox) {
712 if (touchInProx) { 711 wacom_tpc_touch_in(wacom, wcombo);
713 wacom_tpc_touch_in(wacom, wcombo);
714 touchOut = 1;
715 return 1;
716 }
717 } else { 712 } else {
718 /* 2FGT out-prox */
719 if (data[0] == WACOM_REPORT_TPC2FG) { 713 if (data[0] == WACOM_REPORT_TPC2FG) {
714 /* 2FGT out-prox */
720 idx = (wacom->id[1] & 0x01) - 1; 715 idx = (wacom->id[1] & 0x01) - 1;
721 if (idx == 0) { 716 if (idx == 0) {
722 wacom_tpc_touch_out(wacom, wcombo, idx); 717 wacom_tpc_touch_out(wacom, wcombo, idx);
@@ -727,23 +722,19 @@ static int wacom_tpc_irq(struct wacom_wac *wacom, void *wcombo)
727 idx = (wacom->id[1] & 0x02) - 1; 722 idx = (wacom->id[1] & 0x02) - 1;
728 if (idx == 1) 723 if (idx == 1)
729 wacom_tpc_touch_out(wacom, wcombo, idx); 724 wacom_tpc_touch_out(wacom, wcombo, idx);
730 } else /* one finger touch */ 725 } else {
726 /* one finger touch */
731 wacom_tpc_touch_out(wacom, wcombo, 0); 727 wacom_tpc_touch_out(wacom, wcombo, 0);
732 touchOut = 0; 728 }
733 touchInProx = 1; 729 wacom->id[0] = 0;
734 return 1;
735 } 730 }
736 } else if (touchOut || !prox) { /* force touch out-prox */ 731 } else if (wacom->id[0]) { /* force touch out-prox */
737 wacom_tpc_touch_out(wacom, wcombo, 0); 732 wacom_tpc_touch_out(wacom, wcombo, 0);
738 touchOut = 0;
739 touchInProx = 1;
740 return 1;
741 } 733 }
734 return 1;
742 } else if (data[0] == WACOM_REPORT_PENABLED) { /* Penabled */ 735 } else if (data[0] == WACOM_REPORT_PENABLED) { /* Penabled */
743 prox = data[1] & 0x20; 736 prox = data[1] & 0x20;
744 737
745 touchInProx = 0;
746
747 if (!wacom->id[0]) { /* first in prox */ 738 if (!wacom->id[0]) { /* first in prox */
748 /* Going into proximity select tool */ 739 /* Going into proximity select tool */
749 wacom->tool[0] = (data[1] & 0x0c) ? BTN_TOOL_RUBBER : BTN_TOOL_PEN; 740 wacom->tool[0] = (data[1] & 0x0c) ? BTN_TOOL_RUBBER : BTN_TOOL_PEN;
@@ -751,6 +742,8 @@ static int wacom_tpc_irq(struct wacom_wac *wacom, void *wcombo)
751 wacom->id[0] = STYLUS_DEVICE_ID; 742 wacom->id[0] = STYLUS_DEVICE_ID;
752 else 743 else
753 wacom->id[0] = ERASER_DEVICE_ID; 744 wacom->id[0] = ERASER_DEVICE_ID;
745
746 wacom->shared->stylus_in_proximity = true;
754 } 747 }
755 wacom_report_key(wcombo, BTN_STYLUS, data[1] & 0x02); 748 wacom_report_key(wcombo, BTN_STYLUS, data[1] & 0x02);
756 wacom_report_key(wcombo, BTN_STYLUS2, data[1] & 0x10); 749 wacom_report_key(wcombo, BTN_STYLUS2, data[1] & 0x10);
@@ -763,12 +756,10 @@ static int wacom_tpc_irq(struct wacom_wac *wacom, void *wcombo)
763 wacom_report_key(wcombo, BTN_TOUCH, data[1] & 0x05); 756 wacom_report_key(wcombo, BTN_TOUCH, data[1] & 0x05);
764 if (!prox) { /* out-prox */ 757 if (!prox) { /* out-prox */
765 wacom->id[0] = 0; 758 wacom->id[0] = 0;
766 /* pen is out so touch can be enabled now */ 759 wacom->shared->stylus_in_proximity = false;
767 touchInProx = 1;
768 } 760 }
769 wacom_report_key(wcombo, wacom->tool[0], prox); 761 wacom_report_key(wcombo, wacom->tool[0], prox);
770 wacom_report_abs(wcombo, ABS_MISC, wacom->id[0]); 762 wacom_report_abs(wcombo, ABS_MISC, wacom->id[0]);
771 stylusInProx = prox;
772 return 1; 763 return 1;
773 } 764 }
774 return 0; 765 return 0;