aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJason Gerecke <killertofu@gmail.com>2016-10-19 21:03:51 -0400
committerJiri Kosina <jkosina@suse.cz>2016-10-20 03:54:00 -0400
commit5922e613256f159f8d53d99b17379f362e544541 (patch)
treea5e853184a9574dcd6e95478423b8d36f66d6ffa
parent345857bb493fbff15632a6bdf04713163ccd6fe6 (diff)
HID: wacom: generic: Introduce pad support
As with usages for the pen, the Custom HID specificiation includes usages for the pad. Here we add functions to map and handle most of the pad usages present on the MobileStudio Pro. Signed-off-by: Jason Gerecke <jason.gerecke@wacom.com> Reviewed-by: Benjamin Tissoires <benjamin.tissoires@redhat.com> Signed-off-by: Jiri Kosina <jkosina@suse.cz>
-rw-r--r--drivers/hid/wacom_wac.c143
-rw-r--r--drivers/hid/wacom_wac.h19
2 files changed, 146 insertions, 16 deletions
diff --git a/drivers/hid/wacom_wac.c b/drivers/hid/wacom_wac.c
index 3bb6dd6e4eea..70de1fa930cc 100644
--- a/drivers/hid/wacom_wac.c
+++ b/drivers/hid/wacom_wac.c
@@ -41,6 +41,8 @@ MODULE_PARM_DESC(touch_arbitration, " on (Y) off (N)");
41static void wacom_report_numbered_buttons(struct input_dev *input_dev, 41static void wacom_report_numbered_buttons(struct input_dev *input_dev,
42 int button_count, int mask); 42 int button_count, int mask);
43 43
44static int wacom_numbered_button_to_key(int n);
45
44/* 46/*
45 * Percent of battery capacity for Graphire. 47 * Percent of battery capacity for Graphire.
46 * 8th value means AC online and show 100% capacity. 48 * 8th value means AC online and show 100% capacity.
@@ -1447,12 +1449,16 @@ static int wacom_equivalent_usage(int usage)
1447 int subpage = (usage & 0xFF00) << 8; 1449 int subpage = (usage & 0xFF00) << 8;
1448 int subusage = (usage & 0xFF); 1450 int subusage = (usage & 0xFF);
1449 1451
1450 if (subpage == WACOM_HID_SP_DIGITIZER || 1452 if (subpage == WACOM_HID_SP_PAD ||
1453 subpage == WACOM_HID_SP_BUTTON ||
1454 subpage == WACOM_HID_SP_DIGITIZER ||
1451 subpage == WACOM_HID_SP_DIGITIZERINFO || 1455 subpage == WACOM_HID_SP_DIGITIZERINFO ||
1452 usage == WACOM_HID_WD_SENSE || 1456 usage == WACOM_HID_WD_SENSE ||
1453 usage == WACOM_HID_WD_SERIALHI || 1457 usage == WACOM_HID_WD_SERIALHI ||
1454 usage == WACOM_HID_WD_TOOLTYPE || 1458 usage == WACOM_HID_WD_TOOLTYPE ||
1455 usage == WACOM_HID_WD_DISTANCE) { 1459 usage == WACOM_HID_WD_DISTANCE ||
1460 usage == WACOM_HID_WD_TOUCHRING ||
1461 usage == WACOM_HID_WD_TOUCHRINGSTATUS) {
1456 return usage; 1462 return usage;
1457 } 1463 }
1458 1464
@@ -1509,6 +1515,98 @@ static void wacom_map_usage(struct input_dev *input, struct hid_usage *usage,
1509 } 1515 }
1510} 1516}
1511 1517
1518static void wacom_wac_pad_usage_mapping(struct hid_device *hdev,
1519 struct hid_field *field, struct hid_usage *usage)
1520{
1521 struct wacom *wacom = hid_get_drvdata(hdev);
1522 struct wacom_wac *wacom_wac = &wacom->wacom_wac;
1523 struct wacom_features *features = &wacom_wac->features;
1524 struct input_dev *input = wacom_wac->pad_input;
1525 unsigned equivalent_usage = wacom_equivalent_usage(usage->hid);
1526
1527 switch (equivalent_usage) {
1528 case WACOM_HID_WD_ACCELEROMETER_X:
1529 __set_bit(INPUT_PROP_ACCELEROMETER, input->propbit);
1530 wacom_map_usage(input, usage, field, EV_ABS, ABS_X, 0);
1531 break;
1532 case WACOM_HID_WD_ACCELEROMETER_Y:
1533 __set_bit(INPUT_PROP_ACCELEROMETER, input->propbit);
1534 wacom_map_usage(input, usage, field, EV_ABS, ABS_Y, 0);
1535 break;
1536 case WACOM_HID_WD_ACCELEROMETER_Z:
1537 __set_bit(INPUT_PROP_ACCELEROMETER, input->propbit);
1538 wacom_map_usage(input, usage, field, EV_ABS, ABS_Z, 0);
1539 break;
1540 case WACOM_HID_WD_BUTTONHOME:
1541 case WACOM_HID_WD_BUTTONUP:
1542 case WACOM_HID_WD_BUTTONDOWN:
1543 case WACOM_HID_WD_BUTTONLEFT:
1544 case WACOM_HID_WD_BUTTONRIGHT:
1545 wacom_map_usage(input, usage, field, EV_KEY,
1546 wacom_numbered_button_to_key(features->numbered_buttons),
1547 0);
1548 features->numbered_buttons++;
1549 break;
1550 case WACOM_HID_WD_TOUCHRING:
1551 wacom_map_usage(input, usage, field, EV_ABS, ABS_WHEEL, 0);
1552 break;
1553 }
1554
1555 switch (equivalent_usage & 0xfffffff0) {
1556 case WACOM_HID_WD_EXPRESSKEY00:
1557 wacom_map_usage(input, usage, field, EV_KEY,
1558 wacom_numbered_button_to_key(features->numbered_buttons),
1559 0);
1560 features->numbered_buttons++;
1561 break;
1562 }
1563}
1564
1565static int wacom_wac_pad_event(struct hid_device *hdev, struct hid_field *field,
1566 struct hid_usage *usage, __s32 value)
1567{
1568 struct wacom *wacom = hid_get_drvdata(hdev);
1569 struct wacom_wac *wacom_wac = &wacom->wacom_wac;
1570 struct input_dev *input = wacom_wac->pad_input;
1571 unsigned equivalent_usage = wacom_equivalent_usage(usage->hid);
1572
1573 if (wacom_equivalent_usage(field->physical) == HID_DG_TABLETFUNCTIONKEY) {
1574 wacom_wac->hid_data.inrange_state |= value;
1575 }
1576
1577 if (equivalent_usage != WACOM_HID_WD_TOUCHRINGSTATUS)
1578 input_event(input, usage->type, usage->code, value);
1579
1580 return 0;
1581}
1582
1583static void wacom_wac_pad_pre_report(struct hid_device *hdev,
1584 struct hid_report *report)
1585{
1586 struct wacom *wacom = hid_get_drvdata(hdev);
1587 struct wacom_wac *wacom_wac = &wacom->wacom_wac;
1588
1589 wacom_wac->hid_data.inrange_state = 0;
1590}
1591
1592static void wacom_wac_pad_report(struct hid_device *hdev,
1593 struct hid_report *report)
1594{
1595 struct wacom *wacom = hid_get_drvdata(hdev);
1596 struct wacom_wac *wacom_wac = &wacom->wacom_wac;
1597 struct input_dev *input = wacom_wac->pad_input;
1598 bool active = wacom_wac->hid_data.inrange_state != 0;
1599
1600 /*
1601 * don't report prox for events like accelerometer
1602 * or battery status
1603 */
1604 if (wacom_equivalent_usage(report->field[0]->physical) == HID_DG_TABLETFUNCTIONKEY)
1605 input_event(input, EV_ABS, ABS_MISC, active ? PAD_DEVICE_ID : 0);
1606
1607 input_sync(input);
1608}
1609
1512static void wacom_wac_pen_usage_mapping(struct hid_device *hdev, 1610static void wacom_wac_pen_usage_mapping(struct hid_device *hdev,
1513 struct hid_field *field, struct hid_usage *usage) 1611 struct hid_field *field, struct hid_usage *usage)
1514{ 1612{
@@ -1946,10 +2044,11 @@ void wacom_wac_usage_mapping(struct hid_device *hdev,
1946 /* currently, only direct devices have proper hid report descriptors */ 2044 /* currently, only direct devices have proper hid report descriptors */
1947 features->device_type |= WACOM_DEVICETYPE_DIRECT; 2045 features->device_type |= WACOM_DEVICETYPE_DIRECT;
1948 2046
1949 if (WACOM_PEN_FIELD(field)) 2047 if (WACOM_PAD_FIELD(field))
2048 return wacom_wac_pad_usage_mapping(hdev, field, usage);
2049 else if (WACOM_PEN_FIELD(field))
1950 return wacom_wac_pen_usage_mapping(hdev, field, usage); 2050 return wacom_wac_pen_usage_mapping(hdev, field, usage);
1951 2051 else if (WACOM_FINGER_FIELD(field))
1952 if (WACOM_FINGER_FIELD(field))
1953 return wacom_wac_finger_usage_mapping(hdev, field, usage); 2052 return wacom_wac_finger_usage_mapping(hdev, field, usage);
1954} 2053}
1955 2054
@@ -1961,10 +2060,11 @@ int wacom_wac_event(struct hid_device *hdev, struct hid_field *field,
1961 if (wacom->wacom_wac.features.type != HID_GENERIC) 2060 if (wacom->wacom_wac.features.type != HID_GENERIC)
1962 return 0; 2061 return 0;
1963 2062
1964 if (WACOM_PEN_FIELD(field)) 2063 if (WACOM_PAD_FIELD(field))
2064 return wacom_wac_pad_event(hdev, field, usage, value);
2065 else if (WACOM_PEN_FIELD(field))
1965 return wacom_wac_pen_event(hdev, field, usage, value); 2066 return wacom_wac_pen_event(hdev, field, usage, value);
1966 2067 else if (WACOM_FINGER_FIELD(field))
1967 if (WACOM_FINGER_FIELD(field))
1968 return wacom_wac_finger_event(hdev, field, usage, value); 2068 return wacom_wac_finger_event(hdev, field, usage, value);
1969 2069
1970 return 0; 2070 return 0;
@@ -1998,18 +2098,20 @@ void wacom_wac_report(struct hid_device *hdev, struct hid_report *report)
1998 if (wacom_wac->features.type != HID_GENERIC) 2098 if (wacom_wac->features.type != HID_GENERIC)
1999 return; 2099 return;
2000 2100
2001 if (WACOM_PEN_FIELD(field)) 2101 if (WACOM_PAD_FIELD(field))
2102 wacom_wac_pad_pre_report(hdev, report);
2103 else if (WACOM_PEN_FIELD(field))
2002 wacom_wac_pen_pre_report(hdev, report); 2104 wacom_wac_pen_pre_report(hdev, report);
2003 2105 else if (WACOM_FINGER_FIELD(field))
2004 if (WACOM_FINGER_FIELD(field))
2005 wacom_wac_finger_pre_report(hdev, report); 2106 wacom_wac_finger_pre_report(hdev, report);
2006 2107
2007 wacom_report_events(hdev, report); 2108 wacom_report_events(hdev, report);
2008 2109
2009 if (WACOM_PEN_FIELD(field)) 2110 if (WACOM_PAD_FIELD(field))
2111 return wacom_wac_pad_report(hdev, report);
2112 else if (WACOM_PEN_FIELD(field))
2010 return wacom_wac_pen_report(hdev, report); 2113 return wacom_wac_pen_report(hdev, report);
2011 2114 else if (WACOM_FINGER_FIELD(field))
2012 if (WACOM_FINGER_FIELD(field))
2013 return wacom_wac_finger_report(hdev, report); 2115 return wacom_wac_finger_report(hdev, report);
2014} 2116}
2015 2117
@@ -2583,6 +2685,8 @@ void wacom_setup_device_quirks(struct wacom *wacom)
2583 struct wacom_features *features = &w