aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/hid/hid-wacom.c21
1 files changed, 15 insertions, 6 deletions
diff --git a/drivers/hid/hid-wacom.c b/drivers/hid/hid-wacom.c
index c4a193b6c44..a3476f9a510 100644
--- a/drivers/hid/hid-wacom.c
+++ b/drivers/hid/hid-wacom.c
@@ -35,6 +35,8 @@ struct wacom_data {
35 __u16 tool; 35 __u16 tool;
36 unsigned char butstate; 36 unsigned char butstate;
37 __u8 features; 37 __u8 features;
38 __u32 id;
39 __u32 serial;
38 unsigned char high_speed; 40 unsigned char high_speed;
39#ifdef CONFIG_HID_WACOM_POWER_SUPPLY 41#ifdef CONFIG_HID_WACOM_POWER_SUPPLY
40 int battery_capacity; 42 int battery_capacity;
@@ -318,26 +320,30 @@ static void wacom_i4_parse_pen_report(struct wacom_data *wdata,
318 struct input_dev *input, unsigned char *data) 320 struct input_dev *input, unsigned char *data)
319{ 321{
320 __u16 x, y, pressure; 322 __u16 x, y, pressure;
321 __u32 id;
322 323
323 switch (data[1]) { 324 switch (data[1]) {
324 case 0x80: /* Out of proximity report */ 325 case 0x80: /* Out of proximity report */
325 input_report_key(input, BTN_TOUCH, 0); 326 input_report_key(input, BTN_TOUCH, 0);
326 input_report_abs(input, ABS_PRESSURE, 0); 327 input_report_abs(input, ABS_PRESSURE, 0);
327 input_report_key(input, wdata->tool, 0); 328 input_report_key(input, wdata->tool, 0);
329 input_report_abs(input, ABS_MISC, 0);
330 input_event(input, EV_MSC, MSC_SERIAL, wdata->serial);
328 wdata->tool = 0; 331 wdata->tool = 0;
329 input_sync(input); 332 input_sync(input);
330 break; 333 break;
331 case 0xC2: /* Tool report */ 334 case 0xC2: /* Tool report */
332 id = ((data[2] << 4) | (data[3] >> 4) | 335 wdata->id = ((data[2] << 4) | (data[3] >> 4) |
333 ((data[7] & 0x0f) << 20) | 336 ((data[7] & 0x0f) << 20) |
334 ((data[8] & 0xf0) << 12)) & 0xfffff; 337 ((data[8] & 0xf0) << 12));
338 wdata->serial = ((data[3] & 0x0f) << 28) +
339 (data[4] << 20) + (data[5] << 12) +
340 (data[6] << 4) + (data[7] >> 4);
335 341
336 switch (id) { 342 switch (wdata->id) {
337 case 0x802: 343 case 0x100802:
338 wdata->tool = BTN_TOOL_PEN; 344 wdata->tool = BTN_TOOL_PEN;
339 break; 345 break;
340 case 0x80A: 346 case 0x10080A:
341 wdata->tool = BTN_TOOL_RUBBER; 347 wdata->tool = BTN_TOOL_RUBBER;
342 break; 348 break;
343 } 349 }
@@ -356,6 +362,9 @@ static void wacom_i4_parse_pen_report(struct wacom_data *wdata,
356 input_report_abs(input, ABS_X, x); 362 input_report_abs(input, ABS_X, x);
357 input_report_abs(input, ABS_Y, y); 363 input_report_abs(input, ABS_Y, y);
358 input_report_abs(input, ABS_PRESSURE, pressure); 364 input_report_abs(input, ABS_PRESSURE, pressure);
365 input_report_abs(input, ABS_MISC, wdata->id);
366 input_event(input, EV_MSC, MSC_SERIAL, wdata->serial);
367 input_report_key(input, wdata->tool, 1);
359 input_sync(input); 368 input_sync(input);
360 break; 369 break;
361 } 370 }