aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/input/tablet/wacom_wac.c
diff options
context:
space:
mode:
authorPing Cheng <pinglinux@gmail.com>2013-01-05 02:56:00 -0500
committerDmitry Torokhov <dmitry.torokhov@gmail.com>2013-01-06 04:11:02 -0500
commit02295e68cf6ae81e94fbcfa61afde299ded593b1 (patch)
treea4780191d3694569ae4fae8bea86470f5f093ff9 /drivers/input/tablet/wacom_wac.c
parent8c0e0a4fa88f53d80ae8c410a9e2e364a96941a4 (diff)
Input: wacom - use new input-mt routines
This patch brings wacom driver in-sync with input-mt changes made in release 3.7. Signed-off-by: Ping Cheng <pingc@wacom.com> Reviewed-by: Henrik Rydberg <rydberg@euromail.se> Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Diffstat (limited to 'drivers/input/tablet/wacom_wac.c')
-rw-r--r--drivers/input/tablet/wacom_wac.c82
1 files changed, 22 insertions, 60 deletions
diff --git a/drivers/input/tablet/wacom_wac.c b/drivers/input/tablet/wacom_wac.c
index 097b559ea838..a318bf4ada05 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)
785 return 1; 785 return 1;
786} 786}
787 787
788static int find_slot_from_contactid(struct wacom_wac *wacom, int contactid)
789{
790 int touch_max = wacom->features.touch_max;
791 int i;
792
793 if (!wacom->slots)
794 return -1;
795
796 for (i = 0; i < touch_max; ++i) {
797 if (wacom->slots[i] == contactid)
798 return i;
799 }
800 for (i = 0; i < touch_max; ++i) {
801 if (wacom->slots[i] == -1)
802 return i;
803 }
804 return -1;
805}
806
807static int int_dist(int x1, int y1, int x2, int y2) 788static int int_dist(int x1, int y1, int x2, int y2)
808{ 789{
809 int x = x2 - x1; 790 int x = x2 - x1;
@@ -833,8 +814,7 @@ static int wacom_24hdt_irq(struct wacom_wac *wacom)
833 for (i = 0; i < contacts_to_send; i++) { 814 for (i = 0; i < contacts_to_send; i++) {
834 int offset = (WACOM_BYTES_PER_24HDT_PACKET * i) + 1; 815 int offset = (WACOM_BYTES_PER_24HDT_PACKET * i) + 1;
835 bool touch = data[offset] & 0x1 && !wacom->shared->stylus_in_proximity; 816 bool touch = data[offset] & 0x1 && !wacom->shared->stylus_in_proximity;
836 int id = data[offset + 1]; 817 int slot = input_mt_get_slot_by_key(input, data[offset + 1]);
837 int slot = find_slot_from_contactid(wacom, id);
838 818
839 if (slot < 0) 819 if (slot < 0)
840 continue; 820 continue;
@@ -856,9 +836,7 @@ static int wacom_24hdt_irq(struct wacom_wac *wacom)
856 input_report_abs(input, ABS_MT_WIDTH_MINOR, min(w, h)); 836 input_report_abs(input, ABS_MT_WIDTH_MINOR, min(w, h));
857 input_report_abs(input, ABS_MT_ORIENTATION, w > h); 837 input_report_abs(input, ABS_MT_ORIENTATION, w > h);
858 } 838 }
859 wacom->slots[slot] = touch ? id : -1;
860 } 839 }
861
862 input_mt_report_pointer_emulation(input, true); 840 input_mt_report_pointer_emulation(input, true);
863 841
864 wacom->num_contacts_left -= contacts_to_send; 842 wacom->num_contacts_left -= contacts_to_send;
@@ -895,7 +873,7 @@ static int wacom_mt_touch(struct wacom_wac *wacom)
895 int offset = (WACOM_BYTES_PER_MT_PACKET + x_offset) * i + 3; 873 int offset = (WACOM_BYTES_PER_MT_PACKET + x_offset) * i + 3;
896 bool touch = data[offset] & 0x1; 874 bool touch = data[offset] & 0x1;
897 int id = le16_to_cpup((__le16 *)&data[offset + 1]); 875 int id = le16_to_cpup((__le16 *)&data[offset + 1]);
898 int slot = find_slot_from_contactid(wacom, id); 876 int slot = input_mt_get_slot_by_key(input, id);
899 877
900 if (slot < 0) 878 if (slot < 0)
901 continue; 879 continue;
@@ -908,9 +886,7 @@ static int wacom_mt_touch(struct wacom_wac *wacom)
908 input_report_abs(input, ABS_MT_POSITION_X, x); 886 input_report_abs(input, ABS_MT_POSITION_X, x);
909 input_report_abs(input, ABS_MT_POSITION_Y, y); 887 input_report_abs(input, ABS_MT_POSITION_Y, y);
910 } 888 }
911 wacom->slots[slot] = touch ? id : -1;
912 } 889 }
913
914 input_mt_report_pointer_emulation(input, true); 890 input_mt_report_pointer_emulation(input, true);
915 891
916 wacom->num_contacts_left -= contacts_to_send; 892 wacom->num_contacts_left -= contacts_to_send;
@@ -942,12 +918,11 @@ static int wacom_tpc_mt_touch(struct wacom_wac *wacom)
942 contact_with_no_pen_down_count++; 918 contact_with_no_pen_down_count++;
943 } 919 }
944 } 920 }
921 input_mt_report_pointer_emulation(input, true);
945 922
946 /* keep touch state for pen event */ 923 /* keep touch state for pen event */
947 wacom->shared->touch_down = (contact_with_no_pen_down_count > 0); 924 wacom->shared->touch_down = (contact_with_no_pen_down_count > 0);
948 925
949 input_mt_report_pointer_emulation(input, true);
950
951 return 1; 926 return 1;
952} 927}
953 928
@@ -1104,12 +1079,15 @@ static int wacom_bpt_touch(struct wacom_wac *wacom)
1104static void wacom_bpt3_touch_msg(struct wacom_wac *wacom, unsigned char *data) 1079static void wacom_bpt3_touch_msg(struct wacom_wac *wacom, unsigned char *data)
1105{ 1080{
1106 struct input_dev *input = wacom->input; 1081 struct input_dev *input = wacom->input;
1107 int slot_id = data[0] - 2; /* data[0] is between 2 and 17 */
1108 bool touch = data[1] & 0x80; 1082 bool touch = data[1] & 0x80;
1083 int slot = input_mt_get_slot_by_key(input, data[0]);
1084
1085 if (slot < 0)
1086 return;
1109 1087
1110 touch = touch && !wacom->shared->stylus_in_proximity; 1088 touch = touch && !wacom->shared->stylus_in_proximity;
1111 1089
1112 input_mt_slot(input, slot_id); 1090 input_mt_slot(input, slot);
1113 input_mt_report_slot_state(input, MT_TOOL_FINGER, touch); 1091 input_mt_report_slot_state(input, MT_TOOL_FINGER, touch);
1114 1092
1115 if (touch) { 1093 if (touch) {
@@ -1162,7 +1140,6 @@ static int wacom_bpt3_touch(struct wacom_wac *wacom)
1162 wacom_bpt3_button_msg(wacom, data + offset); 1140 wacom_bpt3_button_msg(wacom, data + offset);
1163 1141
1164 } 1142 }
1165
1166 input_mt_report_pointer_emulation(input, true); 1143 input_mt_report_pointer_emulation(input, true);
1167 1144
1168 input_sync(input); 1145 input_sync(input);
@@ -1639,17 +1616,11 @@ int wacom_setup_input_capabilities(struct input_dev *input_dev,
1639 } else if (features->device_type == BTN_TOOL_FINGER) { 1616 } else if (features->device_type == BTN_TOOL_FINGER) {
1640 __clear_bit(ABS_MISC, input_dev->absbit); 1617 __clear_bit(ABS_MISC, input_dev->absbit);
1641 1618
1642 __set_bit(BTN_TOOL_FINGER, input_dev->keybit);
1643 __set_bit(BTN_TOOL_DOUBLETAP, input_dev->keybit);
1644 __set_bit(BTN_TOOL_TRIPLETAP, input_dev->keybit);
1645 __set_bit(BTN_TOOL_QUADTAP, input_dev->keybit);
1646
1647 input_mt_init_slots(input_dev, features->touch_max, 0);
1648
1649 input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR, 1619 input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR,
1650 0, features->x_max, 0, 0); 1620 0, features->x_max, 0, 0);
1651 input_set_abs_params(input_dev, ABS_MT_TOUCH_MINOR, 1621 input_set_abs_params(input_dev, ABS_MT_TOUCH_MINOR,
1652 0, features->y_max, 0, 0); 1622 0, features->y_max, 0, 0);
1623 input_mt_init_slots(input_dev, features->touch_max, INPUT_MT_POINTER);
1653 } 1624 }
1654 break; 1625 break;
1655 1626
@@ -1680,21 +1651,14 @@ int wacom_setup_input_capabilities(struct input_dev *input_dev,
1680 1651
1681 case MTSCREEN: 1652 case MTSCREEN:
1682 case MTTPC: 1653 case MTTPC:
1683 if (features->device_type == BTN_TOOL_FINGER) {
1684 wacom_wac->slots = kmalloc(features->touch_max *
1685 sizeof(int),
1686 GFP_KERNEL);
1687 if (!wacom_wac->slots)
1688 return -ENOMEM;
1689
1690 for (i = 0; i < features->touch_max; i++)
1691 wacom_wac->slots[i] = -1;
1692 }
1693 /* fall through */
1694
1695 case TABLETPC2FG: 1654 case TABLETPC2FG:
1696 if (features->device_type == BTN_TOOL_FINGER) { 1655 if (features->device_type == BTN_TOOL_FINGER) {
1697 input_mt_init_slots(input_dev, features->touch_max, 0); 1656 unsigned int flags = INPUT_MT_DIRECT;
1657
1658 if (wacom_wac->features.type == TABLETPC2FG)
1659 flags = 0;
1660
1661 input_mt_init_slots(input_dev, features->touch_max, flags);
1698 } 1662 }
1699 /* fall through */ 1663 /* fall through */
1700 1664
@@ -1737,28 +1701,26 @@ int wacom_setup_input_capabilities(struct input_dev *input_dev,
1737 __set_bit(INPUT_PROP_POINTER, input_dev->propbit); 1701 __set_bit(INPUT_PROP_POINTER, input_dev->propbit);
1738 1702
1739 if (features->device_type == BTN_TOOL_FINGER) { 1703 if (features->device_type == BTN_TOOL_FINGER) {
1704 unsigned int flags = INPUT_MT_POINTER;
1705
1740 __set_bit(BTN_LEFT, input_dev->keybit); 1706 __set_bit(BTN_LEFT, input_dev->keybit);
1741 __set_bit(BTN_FORWARD, input_dev->keybit); 1707 __set_bit(BTN_FORWARD, input_dev->keybit);
1742 __set_bit(BTN_BACK, input_dev->keybit); 1708 __set_bit(BTN_BACK, input_dev->keybit);
1743 __set_bit(BTN_RIGHT, input_dev->keybit); 1709 __set_bit(BTN_RIGHT, input_dev->keybit);
1744 1710
1745 __set_bit(BTN_TOOL_FINGER, input_dev->keybit);
1746 __set_bit(BTN_TOOL_DOUBLETAP, input_dev->keybit);
1747 input_mt_init_slots(input_dev, features->touch_max, 0);
1748
1749 if (features->pktlen == WACOM_PKGLEN_BBTOUCH3) { 1711 if (features->pktlen == WACOM_PKGLEN_BBTOUCH3) {
1750 __set_bit(BTN_TOOL_TRIPLETAP,
1751 input_dev->keybit);
1752 __set_bit(BTN_TOOL_QUADTAP,
1753 input_dev->keybit);
1754
1755 input_set_abs_params(input_dev, 1712 input_set_abs_params(input_dev,
1756 ABS_MT_TOUCH_MAJOR, 1713 ABS_MT_TOUCH_MAJOR,
1757 0, features->x_max, 0, 0); 1714 0, features->x_max, 0, 0);
1758 input_set_abs_params(input_dev, 1715 input_set_abs_params(input_dev,
1759 ABS_MT_TOUCH_MINOR, 1716 ABS_MT_TOUCH_MINOR,
1760 0, features->y_max, 0, 0); 1717 0, features->y_max, 0, 0);
1718 } else {
1719 __set_bit(BTN_TOOL_FINGER, input_dev->keybit);
1720 __set_bit(BTN_TOOL_DOUBLETAP, input_dev->keybit);
1721 flags = 0;
1761 } 1722 }
1723 input_mt_init_slots(input_dev, features->touch_max, flags);
1762 } else if (features->device_type == BTN_TOOL_PEN) { 1724 } else if (features->device_type == BTN_TOOL_PEN) {
1763 __set_bit(BTN_TOOL_RUBBER, input_dev->keybit); 1725 __set_bit(BTN_TOOL_RUBBER, input_dev->keybit);
1764 __set_bit(BTN_TOOL_PEN, input_dev->keybit); 1726 __set_bit(BTN_TOOL_PEN, input_dev->keybit);