aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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 = &wacom->wacom_wac.features; 2685 struct wacom_features *features = &wacom->wacom_wac.features;
2584 2686
2585 /* The pen and pad share the same interface on most devices */ 2687 /* The pen and pad share the same interface on most devices */
2688 if (features->numbered_buttons > 0)
2689 features->device_type |= WACOM_DEVICETYPE_PAD;
2586 if (features->type == GRAPHIRE_BT || features->type == WACOM_G4 || 2690 if (features->type == GRAPHIRE_BT || features->type == WACOM_G4 ||
2587 features->type == DTUS || 2691 features->type == DTUS ||
2588 (features->type >= INTUOS3S && features->type <= WACOM_MO)) { 2692 (features->type >= INTUOS3S && features->type <= WACOM_MO)) {
@@ -3104,8 +3208,12 @@ int wacom_setup_pad_input_capabilities(struct input_dev *input_dev,
3104 __set_bit(ABS_MISC, input_dev->absbit); 3208 __set_bit(ABS_MISC, input_dev->absbit);
3105 3209
3106 /* kept for making legacy xf86-input-wacom accepting the pad */ 3210 /* kept for making legacy xf86-input-wacom accepting the pad */
3107 input_set_abs_params(input_dev, ABS_X, 0, 1, 0, 0); 3211 if (!(input_dev->absinfo && (input_dev->absinfo[ABS_X].minimum ||
3108 input_set_abs_params(input_dev, ABS_Y, 0, 1, 0, 0); 3212 input_dev->absinfo[ABS_X].maximum)))
3213 input_set_abs_params(input_dev, ABS_X, 0, 1, 0, 0);
3214 if (!(input_dev->absinfo && (input_dev->absinfo[ABS_Y].minimum ||
3215 input_dev->absinfo[ABS_Y].maximum)))
3216 input_set_abs_params(input_dev, ABS_Y, 0, 1, 0, 0);
3109 3217
3110 /* kept for making udev and libwacom accepting the pad */ 3218 /* kept for making udev and libwacom accepting the pad */
3111 __set_bit(BTN_STYLUS, input_dev->keybit); 3219 __set_bit(BTN_STYLUS, input_dev->keybit);
@@ -3225,6 +3333,9 @@ int wacom_setup_pad_input_capabilities(struct input_dev *input_dev,
3225 input_set_abs_params(input_dev, ABS_WHEEL, 0, 71, 0, 0); 3333 input_set_abs_params(input_dev, ABS_WHEEL, 0, 71, 0, 0);
3226 break; 3334 break;
3227 3335
3336 case HID_GENERIC:
3337 break;
3338
3228 default: 3339 default:
3229 /* no pad supported */ 3340 /* no pad supported */
3230 return -ENODEV; 3341 return -ENODEV;
diff --git a/drivers/hid/wacom_wac.h b/drivers/hid/wacom_wac.h
index b4c3c6425b85..1f7c4a86d91b 100644
--- a/drivers/hid/wacom_wac.h
+++ b/drivers/hid/wacom_wac.h
@@ -86,19 +86,34 @@
86#define WACOM_DEVICETYPE_DIRECT 0x0010 86#define WACOM_DEVICETYPE_DIRECT 0x0010
87 87
88#define WACOM_HID_UP_WACOMDIGITIZER 0xff0d0000 88#define WACOM_HID_UP_WACOMDIGITIZER 0xff0d0000
89#define WACOM_HID_SP_PAD 0x00040000
90#define WACOM_HID_SP_BUTTON 0x00090000
89#define WACOM_HID_SP_DIGITIZER 0x000d0000 91#define WACOM_HID_SP_DIGITIZER 0x000d0000
90#define WACOM_HID_SP_DIGITIZERINFO 0x00100000 92#define WACOM_HID_SP_DIGITIZERINFO 0x00100000
91#define WACOM_HID_WD_DIGITIZER (WACOM_HID_UP_WACOMDIGITIZER | 0x01) 93#define WACOM_HID_WD_DIGITIZER (WACOM_HID_UP_WACOMDIGITIZER | 0x01)
92#define WACOM_HID_WD_SENSE (WACOM_HID_UP_WACOMDIGITIZER | 0x36) 94#define WACOM_HID_WD_SENSE (WACOM_HID_UP_WACOMDIGITIZER | 0x36)
95#define WACOM_HID_WD_DIGITIZERFNKEYS (WACOM_HID_UP_WACOMDIGITIZER | 0x39)
93#define WACOM_HID_WD_SERIALHI (WACOM_HID_UP_WACOMDIGITIZER | 0x5c) 96#define WACOM_HID_WD_SERIALHI (WACOM_HID_UP_WACOMDIGITIZER | 0x5c)
94#define WACOM_HID_WD_TOOLTYPE (WACOM_HID_UP_WACOMDIGITIZER | 0x77) 97#define WACOM_HID_WD_TOOLTYPE (WACOM_HID_UP_WACOMDIGITIZER | 0x77)
95#define WACOM_HID_WD_DISTANCE (WACOM_HID_UP_WACOMDIGITIZER | 0x0132) 98#define WACOM_HID_WD_DISTANCE (WACOM_HID_UP_WACOMDIGITIZER | 0x0132)
99#define WACOM_HID_WD_TOUCHRING (WACOM_HID_UP_WACOMDIGITIZER | 0x0138)
100#define WACOM_HID_WD_TOUCHRINGSTATUS (WACOM_HID_UP_WACOMDIGITIZER | 0x0139)
101#define WACOM_HID_WD_ACCELEROMETER_X (WACOM_HID_UP_WACOMDIGITIZER | 0x0401)
102#define WACOM_HID_WD_ACCELEROMETER_Y (WACOM_HID_UP_WACOMDIGITIZER | 0x0402)
103#define WACOM_HID_WD_ACCELEROMETER_Z (WACOM_HID_UP_WACOMDIGITIZER | 0x0403)
104#define WACOM_HID_WD_EXPRESSKEY00 (WACOM_HID_UP_WACOMDIGITIZER | 0x0910)
105#define WACOM_HID_WD_BUTTONHOME (WACOM_HID_UP_WACOMDIGITIZER | 0x0990)
106#define WACOM_HID_WD_BUTTONUP (WACOM_HID_UP_WACOMDIGITIZER | 0x0991)
107#define WACOM_HID_WD_BUTTONDOWN (WACOM_HID_UP_WACOMDIGITIZER | 0x0992)
108#define WACOM_HID_WD_BUTTONLEFT (WACOM_HID_UP_WACOMDIGITIZER | 0x0993)
109#define WACOM_HID_WD_BUTTONRIGHT (WACOM_HID_UP_WACOMDIGITIZER | 0x0994)
96#define WACOM_HID_WD_FINGERWHEEL (WACOM_HID_UP_WACOMDIGITIZER | 0x0d03) 110#define WACOM_HID_WD_FINGERWHEEL (WACOM_HID_UP_WACOMDIGITIZER | 0x0d03)
97#define WACOM_HID_WD_OFFSETLEFT (WACOM_HID_UP_WACOMDIGITIZER | 0x0d30) 111#define WACOM_HID_WD_OFFSETLEFT (WACOM_HID_UP_WACOMDIGITIZER | 0x0d30)
98#define WACOM_HID_WD_OFFSETTOP (WACOM_HID_UP_WACOMDIGITIZER | 0x0d31) 112#define WACOM_HID_WD_OFFSETTOP (WACOM_HID_UP_WACOMDIGITIZER | 0x0d31)
99#define WACOM_HID_WD_OFFSETRIGHT (WACOM_HID_UP_WACOMDIGITIZER | 0x0d32) 113#define WACOM_HID_WD_OFFSETRIGHT (WACOM_HID_UP_WACOMDIGITIZER | 0x0d32)
100#define WACOM_HID_WD_OFFSETBOTTOM (WACOM_HID_UP_WACOMDIGITIZER | 0x0d33) 114#define WACOM_HID_WD_OFFSETBOTTOM (WACOM_HID_UP_WACOMDIGITIZER | 0x0d33)
101#define WACOM_HID_WD_DATAMODE (WACOM_HID_UP_WACOMDIGITIZER | 0x1002) 115#define WACOM_HID_WD_DATAMODE (WACOM_HID_UP_WACOMDIGITIZER | 0x1002)
116#define WACOM_HID_WD_DIGITIZERINFO (WACOM_HID_UP_WACOMDIGITIZER | 0x1013)
102#define WACOM_HID_UP_G9 0xff090000 117#define WACOM_HID_UP_G9 0xff090000
103#define WACOM_HID_G9_PEN (WACOM_HID_UP_G9 | 0x02) 118#define WACOM_HID_G9_PEN (WACOM_HID_UP_G9 | 0x02)
104#define WACOM_HID_G9_TOUCHSCREEN (WACOM_HID_UP_G9 | 0x11) 119#define WACOM_HID_G9_TOUCHSCREEN (WACOM_HID_UP_G9 | 0x11)
@@ -106,6 +121,10 @@
106#define WACOM_HID_G11_PEN (WACOM_HID_UP_G11 | 0x02) 121#define WACOM_HID_G11_PEN (WACOM_HID_UP_G11 | 0x02)
107#define WACOM_HID_G11_TOUCHSCREEN (WACOM_HID_UP_G11 | 0x11) 122#define WACOM_HID_G11_TOUCHSCREEN (WACOM_HID_UP_G11 | 0x11)
108 123
124#define WACOM_PAD_FIELD(f) (((f)->physical == HID_DG_TABLETFUNCTIONKEY) || \
125 ((f)->physical == WACOM_HID_WD_DIGITIZERFNKEYS) || \
126 ((f)->physical == WACOM_HID_WD_DIGITIZERINFO))
127
109#define WACOM_PEN_FIELD(f) (((f)->logical == HID_DG_STYLUS) || \ 128#define WACOM_PEN_FIELD(f) (((f)->logical == HID_DG_STYLUS) || \
110 ((f)->physical == HID_DG_STYLUS) || \ 129 ((f)->physical == HID_DG_STYLUS) || \
111 ((f)->physical == HID_DG_PEN) || \ 130 ((f)->physical == HID_DG_PEN) || \