HID: wacom: Report battery status for Intuos Pro and Intuos5
[linux-block.git] / drivers / hid / wacom_wac.c
1 /*
2  * drivers/input/tablet/wacom_wac.c
3  *
4  *  USB Wacom tablet support - Wacom specific code
5  *
6  */
7
8 /*
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version.
13  */
14
15 #include "wacom_wac.h"
16 #include "wacom.h"
17 #include <linux/input/mt.h>
18
19 /* resolution for penabled devices */
20 #define WACOM_PL_RES            20
21 #define WACOM_PENPRTN_RES       40
22 #define WACOM_VOLITO_RES        50
23 #define WACOM_GRAPHIRE_RES      80
24 #define WACOM_INTUOS_RES        100
25 #define WACOM_INTUOS3_RES       200
26
27 /* Newer Cintiq and DTU have an offset between tablet and screen areas */
28 #define WACOM_DTU_OFFSET        200
29 #define WACOM_CINTIQ_OFFSET     400
30
31 /*
32  * Scale factor relating reported contact size to logical contact area.
33  * 2^14/pi is a good approximation on Intuos5 and 3rd-gen Bamboo
34  */
35 #define WACOM_CONTACT_AREA_SCALE 2607
36
37 /*
38  * Percent of battery capacity for Graphire.
39  * 8th value means AC online and show 100% capacity.
40  */
41 static unsigned short batcap_gr[8] = { 1, 15, 25, 35, 50, 70, 100, 100 };
42
43 /*
44  * Percent of battery capacity for Intuos4 WL, AC has a separate bit.
45  */
46 static unsigned short batcap_i4[8] = { 1, 15, 30, 45, 60, 70, 85, 100 };
47
48 static void wacom_notify_battery(struct wacom_wac *wacom_wac,
49         int bat_capacity, bool bat_charging, bool ps_connected)
50 {
51         struct wacom *wacom = container_of(wacom_wac, struct wacom, wacom_wac);
52         bool changed = wacom_wac->battery_capacity != bat_capacity  ||
53                        wacom_wac->bat_charging     != bat_charging  ||
54                        wacom_wac->ps_connected     != ps_connected;
55
56         if (changed) {
57                 wacom_wac->battery_capacity = bat_capacity;
58                 wacom_wac->bat_charging = bat_charging;
59                 wacom_wac->ps_connected = ps_connected;
60
61                 if (wacom->battery.dev)
62                         power_supply_changed(&wacom->battery);
63         }
64 }
65
66 static int wacom_penpartner_irq(struct wacom_wac *wacom)
67 {
68         unsigned char *data = wacom->data;
69         struct input_dev *input = wacom->input;
70
71         switch (data[0]) {
72         case 1:
73                 if (data[5] & 0x80) {
74                         wacom->tool[0] = (data[5] & 0x20) ? BTN_TOOL_RUBBER : BTN_TOOL_PEN;
75                         wacom->id[0] = (data[5] & 0x20) ? ERASER_DEVICE_ID : STYLUS_DEVICE_ID;
76                         input_report_key(input, wacom->tool[0], 1);
77                         input_report_abs(input, ABS_MISC, wacom->id[0]); /* report tool id */
78                         input_report_abs(input, ABS_X, get_unaligned_le16(&data[1]));
79                         input_report_abs(input, ABS_Y, get_unaligned_le16(&data[3]));
80                         input_report_abs(input, ABS_PRESSURE, (signed char)data[6] + 127);
81                         input_report_key(input, BTN_TOUCH, ((signed char)data[6] > -127));
82                         input_report_key(input, BTN_STYLUS, (data[5] & 0x40));
83                 } else {
84                         input_report_key(input, wacom->tool[0], 0);
85                         input_report_abs(input, ABS_MISC, 0); /* report tool id */
86                         input_report_abs(input, ABS_PRESSURE, -1);
87                         input_report_key(input, BTN_TOUCH, 0);
88                 }
89                 break;
90
91         case 2:
92                 input_report_key(input, BTN_TOOL_PEN, 1);
93                 input_report_abs(input, ABS_MISC, STYLUS_DEVICE_ID); /* report tool id */
94                 input_report_abs(input, ABS_X, get_unaligned_le16(&data[1]));
95                 input_report_abs(input, ABS_Y, get_unaligned_le16(&data[3]));
96                 input_report_abs(input, ABS_PRESSURE, (signed char)data[6] + 127);
97                 input_report_key(input, BTN_TOUCH, ((signed char)data[6] > -80) && !(data[5] & 0x20));
98                 input_report_key(input, BTN_STYLUS, (data[5] & 0x40));
99                 break;
100
101         default:
102                 dev_dbg(input->dev.parent,
103                         "%s: received unknown report #%d\n", __func__, data[0]);
104                 return 0;
105         }
106
107         return 1;
108 }
109
110 static int wacom_pl_irq(struct wacom_wac *wacom)
111 {
112         struct wacom_features *features = &wacom->features;
113         unsigned char *data = wacom->data;
114         struct input_dev *input = wacom->input;
115         int prox, pressure;
116
117         if (data[0] != WACOM_REPORT_PENABLED) {
118                 dev_dbg(input->dev.parent,
119                         "%s: received unknown report #%d\n", __func__, data[0]);
120                 return 0;
121         }
122
123         prox = data[1] & 0x40;
124
125         if (prox) {
126                 wacom->id[0] = ERASER_DEVICE_ID;
127                 pressure = (signed char)((data[7] << 1) | ((data[4] >> 2) & 1));
128                 if (features->pressure_max > 255)
129                         pressure = (pressure << 1) | ((data[4] >> 6) & 1);
130                 pressure += (features->pressure_max + 1) / 2;
131
132                 /*
133                  * if going from out of proximity into proximity select between the eraser
134                  * and the pen based on the state of the stylus2 button, choose eraser if
135                  * pressed else choose pen. if not a proximity change from out to in, send
136                  * an out of proximity for previous tool then a in for new tool.
137                  */
138                 if (!wacom->tool[0]) {
139                         /* Eraser bit set for DTF */
140                         if (data[1] & 0x10)
141                                 wacom->tool[1] = BTN_TOOL_RUBBER;
142                         else
143                                 /* Going into proximity select tool */
144                                 wacom->tool[1] = (data[4] & 0x20) ? BTN_TOOL_RUBBER : BTN_TOOL_PEN;
145                 } else {
146                         /* was entered with stylus2 pressed */
147                         if (wacom->tool[1] == BTN_TOOL_RUBBER && !(data[4] & 0x20)) {
148                                 /* report out proximity for previous tool */
149                                 input_report_key(input, wacom->tool[1], 0);
150                                 input_sync(input);
151                                 wacom->tool[1] = BTN_TOOL_PEN;
152                                 return 0;
153                         }
154                 }
155                 if (wacom->tool[1] != BTN_TOOL_RUBBER) {
156                         /* Unknown tool selected default to pen tool */
157                         wacom->tool[1] = BTN_TOOL_PEN;
158                         wacom->id[0] = STYLUS_DEVICE_ID;
159                 }
160                 input_report_key(input, wacom->tool[1], prox); /* report in proximity for tool */
161                 input_report_abs(input, ABS_MISC, wacom->id[0]); /* report tool id */
162                 input_report_abs(input, ABS_X, data[3] | (data[2] << 7) | ((data[1] & 0x03) << 14));
163                 input_report_abs(input, ABS_Y, data[6] | (data[5] << 7) | ((data[4] & 0x03) << 14));
164                 input_report_abs(input, ABS_PRESSURE, pressure);
165
166                 input_report_key(input, BTN_TOUCH, data[4] & 0x08);
167                 input_report_key(input, BTN_STYLUS, data[4] & 0x10);
168                 /* Only allow the stylus2 button to be reported for the pen tool. */
169                 input_report_key(input, BTN_STYLUS2, (wacom->tool[1] == BTN_TOOL_PEN) && (data[4] & 0x20));
170         } else {
171                 /* report proximity-out of a (valid) tool */
172                 if (wacom->tool[1] != BTN_TOOL_RUBBER) {
173                         /* Unknown tool selected default to pen tool */
174                         wacom->tool[1] = BTN_TOOL_PEN;
175                 }
176                 input_report_key(input, wacom->tool[1], prox);
177         }
178
179         wacom->tool[0] = prox; /* Save proximity state */
180         return 1;
181 }
182
183 static int wacom_ptu_irq(struct wacom_wac *wacom)
184 {
185         unsigned char *data = wacom->data;
186         struct input_dev *input = wacom->input;
187
188         if (data[0] != WACOM_REPORT_PENABLED) {
189                 dev_dbg(input->dev.parent,
190                         "%s: received unknown report #%d\n", __func__, data[0]);
191                 return 0;
192         }
193
194         if (data[1] & 0x04) {
195                 input_report_key(input, BTN_TOOL_RUBBER, data[1] & 0x20);
196                 input_report_key(input, BTN_TOUCH, data[1] & 0x08);
197                 wacom->id[0] = ERASER_DEVICE_ID;
198         } else {
199                 input_report_key(input, BTN_TOOL_PEN, data[1] & 0x20);
200                 input_report_key(input, BTN_TOUCH, data[1] & 0x01);
201                 wacom->id[0] = STYLUS_DEVICE_ID;
202         }
203         input_report_abs(input, ABS_MISC, wacom->id[0]); /* report tool id */
204         input_report_abs(input, ABS_X, le16_to_cpup((__le16 *)&data[2]));
205         input_report_abs(input, ABS_Y, le16_to_cpup((__le16 *)&data[4]));
206         input_report_abs(input, ABS_PRESSURE, le16_to_cpup((__le16 *)&data[6]));
207         input_report_key(input, BTN_STYLUS, data[1] & 0x02);
208         input_report_key(input, BTN_STYLUS2, data[1] & 0x10);
209         return 1;
210 }
211
212 static int wacom_dtu_irq(struct wacom_wac *wacom)
213 {
214         unsigned char *data = wacom->data;
215         struct input_dev *input = wacom->input;
216         int prox = data[1] & 0x20;
217
218         dev_dbg(input->dev.parent,
219                 "%s: received report #%d", __func__, data[0]);
220
221         if (prox) {
222                 /* Going into proximity select tool */
223                 wacom->tool[0] = (data[1] & 0x0c) ? BTN_TOOL_RUBBER : BTN_TOOL_PEN;
224                 if (wacom->tool[0] == BTN_TOOL_PEN)
225                         wacom->id[0] = STYLUS_DEVICE_ID;
226                 else
227                         wacom->id[0] = ERASER_DEVICE_ID;
228         }
229         input_report_key(input, BTN_STYLUS, data[1] & 0x02);
230         input_report_key(input, BTN_STYLUS2, data[1] & 0x10);
231         input_report_abs(input, ABS_X, le16_to_cpup((__le16 *)&data[2]));
232         input_report_abs(input, ABS_Y, le16_to_cpup((__le16 *)&data[4]));
233         input_report_abs(input, ABS_PRESSURE, ((data[7] & 0x01) << 8) | data[6]);
234         input_report_key(input, BTN_TOUCH, data[1] & 0x05);
235         if (!prox) /* out-prox */
236                 wacom->id[0] = 0;
237         input_report_key(input, wacom->tool[0], prox);
238         input_report_abs(input, ABS_MISC, wacom->id[0]);
239         return 1;
240 }
241
242 static int wacom_dtus_irq(struct wacom_wac *wacom)
243 {
244         char *data = wacom->data;
245         struct input_dev *input = wacom->input;
246         unsigned short prox, pressure = 0;
247
248         if (data[0] != WACOM_REPORT_DTUS && data[0] != WACOM_REPORT_DTUSPAD) {
249                 dev_dbg(input->dev.parent,
250                         "%s: received unknown report #%d", __func__, data[0]);
251                 return 0;
252         } else if (data[0] == WACOM_REPORT_DTUSPAD) {
253                 input = wacom->pad_input;
254                 input_report_key(input, BTN_0, (data[1] & 0x01));
255                 input_report_key(input, BTN_1, (data[1] & 0x02));
256                 input_report_key(input, BTN_2, (data[1] & 0x04));
257                 input_report_key(input, BTN_3, (data[1] & 0x08));
258                 input_report_abs(input, ABS_MISC,
259                                  data[1] & 0x0f ? PAD_DEVICE_ID : 0);
260                 return 1;
261         } else {
262                 prox = data[1] & 0x80;
263                 if (prox) {
264                         switch ((data[1] >> 3) & 3) {
265                         case 1: /* Rubber */
266                                 wacom->tool[0] = BTN_TOOL_RUBBER;
267                                 wacom->id[0] = ERASER_DEVICE_ID;
268                                 break;
269
270                         case 2: /* Pen */
271                                 wacom->tool[0] = BTN_TOOL_PEN;
272                                 wacom->id[0] = STYLUS_DEVICE_ID;
273                                 break;
274                         }
275                 }
276
277                 input_report_key(input, BTN_STYLUS, data[1] & 0x20);
278                 input_report_key(input, BTN_STYLUS2, data[1] & 0x40);
279                 input_report_abs(input, ABS_X, get_unaligned_be16(&data[3]));
280                 input_report_abs(input, ABS_Y, get_unaligned_be16(&data[5]));
281                 pressure = ((data[1] & 0x03) << 8) | (data[2] & 0xff);
282                 input_report_abs(input, ABS_PRESSURE, pressure);
283                 input_report_key(input, BTN_TOUCH, pressure > 10);
284
285                 if (!prox) /* out-prox */
286                         wacom->id[0] = 0;
287                 input_report_key(input, wacom->tool[0], prox);
288                 input_report_abs(input, ABS_MISC, wacom->id[0]);
289                 return 1;
290         }
291 }
292
293 static int wacom_graphire_irq(struct wacom_wac *wacom)
294 {
295         struct wacom_features *features = &wacom->features;
296         unsigned char *data = wacom->data;
297         struct input_dev *input = wacom->input;
298         struct input_dev *pad_input = wacom->pad_input;
299         int battery_capacity, ps_connected;
300         int prox;
301         int rw = 0;
302         int retval = 0;
303
304         if (features->type == GRAPHIRE_BT) {
305                 if (data[0] != WACOM_REPORT_PENABLED_BT) {
306                         dev_dbg(input->dev.parent,
307                                 "%s: received unknown report #%d\n", __func__,
308                                 data[0]);
309                         goto exit;
310                 }
311         } else if (data[0] != WACOM_REPORT_PENABLED) {
312                 dev_dbg(input->dev.parent,
313                         "%s: received unknown report #%d\n", __func__, data[0]);
314                 goto exit;
315         }
316
317         prox = data[1] & 0x80;
318         if (prox || wacom->id[0]) {
319                 if (prox) {
320                         switch ((data[1] >> 5) & 3) {
321
322                         case 0: /* Pen */
323                                 wacom->tool[0] = BTN_TOOL_PEN;
324                                 wacom->id[0] = STYLUS_DEVICE_ID;
325                                 break;
326
327                         case 1: /* Rubber */
328                                 wacom->tool[0] = BTN_TOOL_RUBBER;
329                                 wacom->id[0] = ERASER_DEVICE_ID;
330                                 break;
331
332                         case 2: /* Mouse with wheel */
333                                 input_report_key(input, BTN_MIDDLE, data[1] & 0x04);
334                                 /* fall through */
335
336                         case 3: /* Mouse without wheel */
337                                 wacom->tool[0] = BTN_TOOL_MOUSE;
338                                 wacom->id[0] = CURSOR_DEVICE_ID;
339                                 break;
340                         }
341                 }
342                 input_report_abs(input, ABS_X, le16_to_cpup((__le16 *)&data[2]));
343                 input_report_abs(input, ABS_Y, le16_to_cpup((__le16 *)&data[4]));
344                 if (wacom->tool[0] != BTN_TOOL_MOUSE) {
345                         if (features->type == GRAPHIRE_BT)
346                                 input_report_abs(input, ABS_PRESSURE, data[6] |
347                                         (((__u16) (data[1] & 0x08)) << 5));
348                         else
349                                 input_report_abs(input, ABS_PRESSURE, data[6] |
350                                         ((data[7] & 0x03) << 8));
351                         input_report_key(input, BTN_TOUCH, data[1] & 0x01);
352                         input_report_key(input, BTN_STYLUS, data[1] & 0x02);
353                         input_report_key(input, BTN_STYLUS2, data[1] & 0x04);
354                 } else {
355                         input_report_key(input, BTN_LEFT, data[1] & 0x01);
356                         input_report_key(input, BTN_RIGHT, data[1] & 0x02);
357                         if (features->type == WACOM_G4 ||
358                                         features->type == WACOM_MO) {
359                                 input_report_abs(input, ABS_DISTANCE, data[6] & 0x3f);
360                                 rw = (data[7] & 0x04) - (data[7] & 0x03);
361                         } else if (features->type == GRAPHIRE_BT) {
362                                 /* Compute distance between mouse and tablet */
363                                 rw = 44 - (data[6] >> 2);
364                                 rw = clamp_val(rw, 0, 31);
365                                 input_report_abs(input, ABS_DISTANCE, rw);
366                                 if (((data[1] >> 5) & 3) == 2) {
367                                         /* Mouse with wheel */
368                                         input_report_key(input, BTN_MIDDLE,
369                                                         data[1] & 0x04);
370                                         rw = (data[6] & 0x01) ? -1 :
371                                                 (data[6] & 0x02) ? 1 : 0;
372                                 } else {
373                                         rw = 0;
374                                 }
375                         } else {
376                                 input_report_abs(input, ABS_DISTANCE, data[7] & 0x3f);
377                                 rw = -(signed char)data[6];
378                         }
379                         input_report_rel(input, REL_WHEEL, rw);
380                 }
381
382                 if (!prox)
383                         wacom->id[0] = 0;
384                 input_report_abs(input, ABS_MISC, wacom->id[0]); /* report tool id */
385                 input_report_key(input, wacom->tool[0], prox);
386                 input_sync(input); /* sync last event */
387         }
388
389         /* send pad data */
390         switch (features->type) {
391         case WACOM_G4:
392                 prox = data[7] & 0xf8;
393                 if (prox || wacom->id[1]) {
394                         wacom->id[1] = PAD_DEVICE_ID;
395                         input_report_key(pad_input, BTN_BACK, (data[7] & 0x40));
396                         input_report_key(pad_input, BTN_FORWARD, (data[7] & 0x80));
397                         rw = ((data[7] & 0x18) >> 3) - ((data[7] & 0x20) >> 3);
398                         input_report_rel(pad_input, REL_WHEEL, rw);
399                         if (!prox)
400                                 wacom->id[1] = 0;
401                         input_report_abs(pad_input, ABS_MISC, wacom->id[1]);
402                         retval = 1;
403                 }
404                 break;
405
406         case WACOM_MO:
407                 prox = (data[7] & 0xf8) || data[8];
408                 if (prox || wacom->id[1]) {
409                         wacom->id[1] = PAD_DEVICE_ID;
410                         input_report_key(pad_input, BTN_BACK, (data[7] & 0x08));
411                         input_report_key(pad_input, BTN_LEFT, (data[7] & 0x20));
412                         input_report_key(pad_input, BTN_FORWARD, (data[7] & 0x10));
413                         input_report_key(pad_input, BTN_RIGHT, (data[7] & 0x40));
414                         input_report_abs(pad_input, ABS_WHEEL, (data[8] & 0x7f));
415                         if (!prox)
416                                 wacom->id[1] = 0;
417                         input_report_abs(pad_input, ABS_MISC, wacom->id[1]);
418                         retval = 1;
419                 }
420                 break;
421         case GRAPHIRE_BT:
422                 prox = data[7] & 0x03;
423                 if (prox || wacom->id[1]) {
424                         wacom->id[1] = PAD_DEVICE_ID;
425                         input_report_key(pad_input, BTN_0, (data[7] & 0x02));
426                         input_report_key(pad_input, BTN_1, (data[7] & 0x01));
427                         if (!prox)
428                                 wacom->id[1] = 0;
429                         input_report_abs(pad_input, ABS_MISC, wacom->id[1]);
430                         retval = 1;
431                 }
432                 break;
433         }
434
435         /* Store current battery capacity and power supply state */
436         if (features->type == GRAPHIRE_BT) {
437                 rw = (data[7] >> 2 & 0x07);
438                 battery_capacity = batcap_gr[rw];
439                 ps_connected = rw == 7;
440                 wacom_notify_battery(wacom, battery_capacity, ps_connected,
441                                      ps_connected);
442         }
443 exit:
444         return retval;
445 }
446
447 static int wacom_intuos_inout(struct wacom_wac *wacom)
448 {
449         struct wacom_features *features = &wacom->features;
450         unsigned char *data = wacom->data;
451         struct input_dev *input = wacom->input;
452         int idx = 0;
453
454         /* tool number */
455         if (features->type == INTUOS)
456                 idx = data[1] & 0x01;
457
458         /* Enter report */
459         if ((data[1] & 0xfc) == 0xc0) {
460                 /* serial number of the tool */
461                 wacom->serial[idx] = ((data[3] & 0x0f) << 28) +
462                         (data[4] << 20) + (data[5] << 12) +
463                         (data[6] << 4) + (data[7] >> 4);
464
465                 wacom->id[idx] = (data[2] << 4) | (data[3] >> 4) |
466                         ((data[7] & 0x0f) << 20) | ((data[8] & 0xf0) << 12);
467
468                 switch (wacom->id[idx]) {
469                 case 0x812: /* Inking pen */
470                 case 0x801: /* Intuos3 Inking pen */
471                 case 0x120802: /* Intuos4/5 Inking Pen */
472                 case 0x012:
473                         wacom->tool[idx] = BTN_TOOL_PENCIL;
474                         break;
475
476                 case 0x822: /* Pen */
477                 case 0x842:
478                 case 0x852:
479                 case 0x823: /* Intuos3 Grip Pen */
480                 case 0x813: /* Intuos3 Classic Pen */
481                 case 0x885: /* Intuos3 Marker Pen */
482                 case 0x802: /* Intuos4/5 13HD/24HD General Pen */
483                 case 0x804: /* Intuos4/5 13HD/24HD Marker Pen */
484                 case 0x022:
485                 case 0x100804: /* Intuos4/5 13HD/24HD Art Pen */
486                 case 0x140802: /* Intuos4/5 13HD/24HD Classic Pen */
487                 case 0x160802: /* Cintiq 13HD Pro Pen */
488                 case 0x180802: /* DTH2242 Pen */
489                 case 0x100802: /* Intuos4/5 13HD/24HD General Pen */
490                         wacom->tool[idx] = BTN_TOOL_PEN;
491                         break;
492
493                 case 0x832: /* Stroke pen */
494                 case 0x032:
495                         wacom->tool[idx] = BTN_TOOL_BRUSH;
496                         break;
497
498                 case 0x007: /* Mouse 4D and 2D */
499                 case 0x09c:
500                 case 0x094:
501                 case 0x017: /* Intuos3 2D Mouse */
502                 case 0x806: /* Intuos4 Mouse */
503                         wacom->tool[idx] = BTN_TOOL_MOUSE;
504                         break;
505
506                 case 0x096: /* Lens cursor */
507                 case 0x097: /* Intuos3 Lens cursor */
508                 case 0x006: /* Intuos4 Lens cursor */
509                         wacom->tool[idx] = BTN_TOOL_LENS;
510                         break;
511
512                 case 0x82a: /* Eraser */
513                 case 0x85a:
514                 case 0x91a:
515                 case 0xd1a:
516                 case 0x0fa:
517                 case 0x82b: /* Intuos3 Grip Pen Eraser */
518                 case 0x81b: /* Intuos3 Classic Pen Eraser */
519                 case 0x91b: /* Intuos3 Airbrush Eraser */
520                 case 0x80c: /* Intuos4/5 13HD/24HD Marker Pen Eraser */
521                 case 0x80a: /* Intuos4/5 13HD/24HD General Pen Eraser */
522                 case 0x90a: /* Intuos4/5 13HD/24HD Airbrush Eraser */
523                 case 0x14080a: /* Intuos4/5 13HD/24HD Classic Pen Eraser */
524                 case 0x10090a: /* Intuos4/5 13HD/24HD Airbrush Eraser */
525                 case 0x10080c: /* Intuos4/5 13HD/24HD Art Pen Eraser */
526                 case 0x16080a: /* Cintiq 13HD Pro Pen Eraser */
527                 case 0x18080a: /* DTH2242 Eraser */
528                 case 0x10080a: /* Intuos4/5 13HD/24HD General Pen Eraser */
529                         wacom->tool[idx] = BTN_TOOL_RUBBER;
530                         break;
531
532                 case 0xd12:
533                 case 0x912:
534                 case 0x112:
535                 case 0x913: /* Intuos3 Airbrush */
536                 case 0x902: /* Intuos4/5 13HD/24HD Airbrush */
537                 case 0x100902: /* Intuos4/5 13HD/24HD Airbrush */
538                         wacom->tool[idx] = BTN_TOOL_AIRBRUSH;
539                         break;
540
541                 default: /* Unknown tool */
542                         wacom->tool[idx] = BTN_TOOL_PEN;
543                         break;
544                 }
545                 return 1;
546         }
547
548         /*
549          * don't report events for invalid data
550          */
551         /* older I4 styli don't work with new Cintiqs */
552         if ((!((wacom->id[idx] >> 20) & 0x01) &&
553                         (features->type == WACOM_21UX2)) ||
554             /* Only large Intuos support Lense Cursor */
555             (wacom->tool[idx] == BTN_TOOL_LENS &&
556                 (features->type == INTUOS3 ||
557                  features->type == INTUOS3S ||
558                  features->type == INTUOS4 ||
559                  features->type == INTUOS4S ||
560                  features->type == INTUOS5 ||
561                  features->type == INTUOS5S ||
562                  features->type == INTUOSPM ||
563                  features->type == INTUOSPS)) ||
564            /* Cintiq doesn't send data when RDY bit isn't set */
565            (features->type == CINTIQ && !(data[1] & 0x40)))
566                 return 1;
567
568         if (features->quirks & WACOM_QUIRK_MULTI_INPUT)
569                 wacom->shared->stylus_in_proximity = true;
570
571         /* in Range while exiting */
572         if (((data[1] & 0xfe) == 0x20) && wacom->reporting_data) {
573                 input_report_key(input, BTN_TOUCH, 0);
574                 input_report_abs(input, ABS_PRESSURE, 0);
575                 input_report_abs(input, ABS_DISTANCE, wacom->features.distance_max);
576                 return 2;
577         }
578
579         /* Exit report */
580         if ((data[1] & 0xfe) == 0x80) {
581                 if (features->quirks & WACOM_QUIRK_MULTI_INPUT)
582                         wacom->shared->stylus_in_proximity = false;
583                 wacom->reporting_data = false;
584
585                 /* don't report exit if we don't know the ID */
586                 if (!wacom->id[idx])
587                         return 1;
588
589                 /*
590                  * Reset all states otherwise we lose the initial states
591                  * when in-prox next time
592                  */
593                 input_report_abs(input, ABS_X, 0);
594                 input_report_abs(input, ABS_Y, 0);
595                 input_report_abs(input, ABS_DISTANCE, 0);
596                 input_report_abs(input, ABS_TILT_X, 0);
597                 input_report_abs(input, ABS_TILT_Y, 0);
598                 if (wacom->tool[idx] >= BTN_TOOL_MOUSE) {
599                         input_report_key(input, BTN_LEFT, 0);
600                         input_report_key(input, BTN_MIDDLE, 0);
601                         input_report_key(input, BTN_RIGHT, 0);
602                         input_report_key(input, BTN_SIDE, 0);
603                         input_report_key(input, BTN_EXTRA, 0);
604                         input_report_abs(input, ABS_THROTTLE, 0);
605                         input_report_abs(input, ABS_RZ, 0);
606                 } else {
607                         input_report_abs(input, ABS_PRESSURE, 0);
608                         input_report_key(input, BTN_STYLUS, 0);
609                         input_report_key(input, BTN_STYLUS2, 0);
610                         input_report_key(input, BTN_TOUCH, 0);
611                         input_report_abs(input, ABS_WHEEL, 0);
612                         if (features->type >= INTUOS3S)
613                                 input_report_abs(input, ABS_Z, 0);
614                 }
615                 input_report_key(input, wacom->tool[idx], 0);
616                 input_report_abs(input, ABS_MISC, 0); /* reset tool id */
617                 input_event(input, EV_MSC, MSC_SERIAL, wacom->serial[idx]);
618                 wacom->id[idx] = 0;
619                 return 2;
620         }
621
622         /* don't report other events if we don't know the ID */
623         if (!wacom->id[idx])
624                 return 1;
625
626         return 0;
627 }
628
629 static void wacom_intuos_general(struct wacom_wac *wacom)
630 {
631         struct wacom_features *features = &wacom->features;
632         unsigned char *data = wacom->data;
633         struct input_dev *input = wacom->input;
634         unsigned int t;
635
636         /* general pen packet */
637         if ((data[1] & 0xb8) == 0xa0) {
638                 t = (data[6] << 2) | ((data[7] >> 6) & 3);
639                 if (features->type >= INTUOS4S && features->type <= CINTIQ_HYBRID) {
640                         t = (t << 1) | (data[1] & 1);
641                 }
642                 input_report_abs(input, ABS_PRESSURE, t);
643                 input_report_abs(input, ABS_TILT_X,
644                                  (((data[7] << 1) & 0x7e) | (data[8] >> 7)) - 64);
645                 input_report_abs(input, ABS_TILT_Y, (data[8] & 0x7f) - 64);
646                 input_report_key(input, BTN_STYLUS, data[1] & 2);
647                 input_report_key(input, BTN_STYLUS2, data[1] & 4);
648                 input_report_key(input, BTN_TOUCH, t > 10);
649         }
650
651         /* airbrush second packet */
652         if ((data[1] & 0xbc) == 0xb4) {
653                 input_report_abs(input, ABS_WHEEL,
654                                 (data[6] << 2) | ((data[7] >> 6) & 3));
655                 input_report_abs(input, ABS_TILT_X,
656                                  (((data[7] << 1) & 0x7e) | (data[8] >> 7)) - 64);
657                 input_report_abs(input, ABS_TILT_Y, (data[8] & 0x7f) - 64);
658         }
659 }
660
661 static int wacom_intuos_irq(struct wacom_wac *wacom)
662 {
663         struct wacom_features *features = &wacom->features;
664         unsigned char *data = wacom->data;
665         struct input_dev *input = wacom->input;
666         unsigned int t;
667         int idx = 0, result;
668
669         if (data[0] != WACOM_REPORT_PENABLED &&
670             data[0] != WACOM_REPORT_INTUOSREAD &&
671             data[0] != WACOM_REPORT_INTUOSWRITE &&
672             data[0] != WACOM_REPORT_INTUOSPAD &&
673             data[0] != WACOM_REPORT_CINTIQ &&
674             data[0] != WACOM_REPORT_CINTIQPAD &&
675             data[0] != WACOM_REPORT_INTUOS5PAD) {
676                 dev_dbg(input->dev.parent,
677                         "%s: received unknown report #%d\n", __func__, data[0]);
678                 return 0;
679         }
680
681         /* tool number */
682         if (features->type == INTUOS)
683                 idx = data[1] & 0x01;
684
685         /* pad packets. Works as a second tool and is always in prox */
686         if (data[0] == WACOM_REPORT_INTUOSPAD || data[0] == WACOM_REPORT_INTUOS5PAD ||
687             data[0] == WACOM_REPORT_CINTIQPAD) {
688                 input = wacom->pad_input;
689                 if (features->type >= INTUOS4S && features->type <= INTUOS4L) {
690                         input_report_key(input, BTN_0, (data[2] & 0x01));
691                         input_report_key(input, BTN_1, (data[3] & 0x01));
692                         input_report_key(input, BTN_2, (data[3] & 0x02));
693                         input_report_key(input, BTN_3, (data[3] & 0x04));
694                         input_report_key(input, BTN_4, (data[3] & 0x08));
695                         input_report_key(input, BTN_5, (data[3] & 0x10));
696                         input_report_key(input, BTN_6, (data[3] & 0x20));
697                         if (data[1] & 0x80) {
698                                 input_report_abs(input, ABS_WHEEL, (data[1] & 0x7f));
699                         } else {
700                                 /* Out of proximity, clear wheel value. */
701                                 input_report_abs(input, ABS_WHEEL, 0);
702                         }
703                         if (features->type != INTUOS4S) {
704                                 input_report_key(input, BTN_7, (data[3] & 0x40));
705                                 input_report_key(input, BTN_8, (data[3] & 0x80));
706                         }
707                         if (data[1] | (data[2] & 0x01) | data[3]) {
708                                 input_report_abs(input, ABS_MISC, PAD_DEVICE_ID);
709                         } else {
710                                 input_report_abs(input, ABS_MISC, 0);
711                         }
712                 } else if (features->type == DTK) {
713                         input_report_key(input, BTN_0, (data[6] & 0x01));
714                         input_report_key(input, BTN_1, (data[6] & 0x02));
715                         input_report_key(input, BTN_2, (data[6] & 0x04));
716                         input_report_key(input, BTN_3, (data[6] & 0x08));
717                         input_report_key(input, BTN_4, (data[6] & 0x10));
718                         input_report_key(input, BTN_5, (data[6] & 0x20));
719                         if (data[6] & 0x3f) {
720                                 input_report_abs(input, ABS_MISC, PAD_DEVICE_ID);
721                         } else {
722                                 input_report_abs(input, ABS_MISC, 0);
723                         }
724                 } else if (features->type == WACOM_13HD) {
725                         input_report_key(input, BTN_0, (data[3] & 0x01));
726                         input_report_key(input, BTN_1, (data[4] & 0x01));
727                         input_report_key(input, BTN_2, (data[4] & 0x02));
728                         input_report_key(input, BTN_3, (data[4] & 0x04));
729                         input_report_key(input, BTN_4, (data[4] & 0x08));
730                         input_report_key(input, BTN_5, (data[4] & 0x10));
731                         input_report_key(input, BTN_6, (data[4] & 0x20));
732                         input_report_key(input, BTN_7, (data[4] & 0x40));
733                         input_report_key(input, BTN_8, (data[4] & 0x80));
734                         if ((data[3] & 0x01) | data[4]) {
735                                 input_report_abs(input, ABS_MISC, PAD_DEVICE_ID);
736                         } else {
737                                 input_report_abs(input, ABS_MISC, 0);
738                         }
739                 } else if (features->type == WACOM_24HD) {
740                         input_report_key(input, BTN_0, (data[6] & 0x01));
741                         input_report_key(input, BTN_1, (data[6] & 0x02));
742                         input_report_key(input, BTN_2, (data[6] & 0x04));
743                         input_report_key(input, BTN_3, (data[6] & 0x08));
744                         input_report_key(input, BTN_4, (data[6] & 0x10));
745                         input_report_key(input, BTN_5, (data[6] & 0x20));
746                         input_report_key(input, BTN_6, (data[6] & 0x40));
747                         input_report_key(input, BTN_7, (data[6] & 0x80));
748                         input_report_key(input, BTN_8, (data[8] & 0x01));
749                         input_report_key(input, BTN_9, (data[8] & 0x02));
750                         input_report_key(input, BTN_A, (data[8] & 0x04));
751                         input_report_key(input, BTN_B, (data[8] & 0x08));
752                         input_report_key(input, BTN_C, (data[8] & 0x10));
753                         input_report_key(input, BTN_X, (data[8] & 0x20));
754                         input_report_key(input, BTN_Y, (data[8] & 0x40));
755                         input_report_key(input, BTN_Z, (data[8] & 0x80));
756
757                         /*
758                          * Three "buttons" are available on the 24HD which are
759                          * physically implemented as a touchstrip. Each button
760                          * is approximately 3 bits wide with a 2 bit spacing.
761                          * The raw touchstrip bits are stored at:
762                          *    ((data[3] & 0x1f) << 8) | data[4])
763                          */
764                         input_report_key(input, KEY_PROG1, data[4] & 0x07);
765                         input_report_key(input, KEY_PROG2, data[4] & 0xE0);
766                         input_report_key(input, KEY_PROG3, data[3] & 0x1C);
767
768                         if (data[1] & 0x80) {
769                                 input_report_abs(input, ABS_WHEEL, (data[1] & 0x7f));
770                         } else {
771                                 /* Out of proximity, clear wheel value. */
772                                 input_report_abs(input, ABS_WHEEL, 0);
773                         }
774
775                         if (data[2] & 0x80) {
776                                 input_report_abs(input, ABS_THROTTLE, (data[2] & 0x7f));
777                         } else {
778                                 /* Out of proximity, clear second wheel value. */
779                                 input_report_abs(input, ABS_THROTTLE, 0);
780                         }
781
782                         if (data[1] | data[2] | (data[3] & 0x1f) | data[4] | data[6] | data[8]) {
783                                 input_report_abs(input, ABS_MISC, PAD_DEVICE_ID);
784                         } else {
785                                 input_report_abs(input, ABS_MISC, 0);
786                         }
787                 } else if (features->type == WACOM_27QHD) {
788                         input_report_key(input, KEY_PROG1, data[2] & 0x01);
789                         input_report_key(input, KEY_PROG2, data[2] & 0x02);
790                         input_report_key(input, KEY_PROG3, data[2] & 0x04);
791
792                         input_report_abs(input, ABS_X, be16_to_cpup((__be16 *)&data[4]));
793                         input_report_abs(input, ABS_Y, be16_to_cpup((__be16 *)&data[6]));
794                         input_report_abs(input, ABS_Z, be16_to_cpup((__be16 *)&data[8]));
795                 } else if (features->type == CINTIQ_HYBRID) {
796                         /*
797                          * Do not send hardware buttons under Android. They
798                          * are already sent to the system through GPIO (and
799                          * have different meaning).
800                          */
801                         input_report_key(input, BTN_1, (data[4] & 0x01));
802                         input_report_key(input, BTN_2, (data[4] & 0x02));
803                         input_report_key(input, BTN_3, (data[4] & 0x04));
804                         input_report_key(input, BTN_4, (data[4] & 0x08));
805
806                         input_report_key(input, BTN_5, (data[4] & 0x10));  /* Right  */
807                         input_report_key(input, BTN_6, (data[4] & 0x20));  /* Up     */
808                         input_report_key(input, BTN_7, (data[4] & 0x40));  /* Left   */
809                         input_report_key(input, BTN_8, (data[4] & 0x80));  /* Down   */
810                         input_report_key(input, BTN_0, (data[3] & 0x01));  /* Center */
811
812                         if (data[4] | (data[3] & 0x01)) {
813                                 input_report_abs(input, ABS_MISC, PAD_DEVICE_ID);
814                         } else {
815                                 input_report_abs(input, ABS_MISC, 0);
816                         }
817                 } else if (features->type >= INTUOS5S && features->type <= INTUOSPL) {
818                         int i;
819
820                         /* Touch ring mode switch has no capacitive sensor */
821                         input_report_key(input, BTN_0, (data[3] & 0x01));
822
823                         /*
824                          * ExpressKeys on Intuos5/Intuos Pro have a capacitive sensor in
825                          * addition to the mechanical switch. Switch data is
826                          * stored in data[4], capacitive data in data[5].
827                          */
828                         for (i = 0; i < 8; i++)
829                                 input_report_key(input, BTN_1 + i, data[4] & (1 << i));
830
831                         if (data[2] & 0x80) {
832                                 input_report_abs(input, ABS_WHEEL, (data[2] & 0x7f));
833                         } else {
834                                 /* Out of proximity, clear wheel value. */
835                                 input_report_abs(input, ABS_WHEEL, 0);
836                         }
837
838                         if (data[2] | (data[3] & 0x01) | data[4] | data[5]) {
839                                 input_report_abs(input, ABS_MISC, PAD_DEVICE_ID);
840                         } else {
841                                 input_report_abs(input, ABS_MISC, 0);
842                         }
843                 } else {
844                         if (features->type == WACOM_21UX2 || features->type == WACOM_22HD) {
845                                 input_report_key(input, BTN_0, (data[5] & 0x01));
846                                 input_report_key(input, BTN_1, (data[6] & 0x01));
847                                 input_report_key(input, BTN_2, (data[6] & 0x02));
848                                 input_report_key(input, BTN_3, (data[6] & 0x04));
849                                 input_report_key(input, BTN_4, (data[6] & 0x08));
850                                 input_report_key(input, BTN_5, (data[6] & 0x10));
851                                 input_report_key(input, BTN_6, (data[6] & 0x20));
852                                 input_report_key(input, BTN_7, (data[6] & 0x40));
853                                 input_report_key(input, BTN_8, (data[6] & 0x80));
854                                 input_report_key(input, BTN_9, (data[7] & 0x01));
855                                 input_report_key(input, BTN_A, (data[8] & 0x01));
856                                 input_report_key(input, BTN_B, (data[8] & 0x02));
857                                 input_report_key(input, BTN_C, (data[8] & 0x04));
858                                 input_report_key(input, BTN_X, (data[8] & 0x08));
859                                 input_report_key(input, BTN_Y, (data[8] & 0x10));
860                                 input_report_key(input, BTN_Z, (data[8] & 0x20));
861                                 input_report_key(input, BTN_BASE, (data[8] & 0x40));
862                                 input_report_key(input, BTN_BASE2, (data[8] & 0x80));
863
864                                 if (features->type == WACOM_22HD) {
865                                         input_report_key(input, KEY_PROG1, data[9] & 0x01);
866                                         input_report_key(input, KEY_PROG2, data[9] & 0x02);
867                                         input_report_key(input, KEY_PROG3, data[9] & 0x04);
868                                 }
869                         } else {
870                                 input_report_key(input, BTN_0, (data[5] & 0x01));
871                                 input_report_key(input, BTN_1, (data[5] & 0x02));
872                                 input_report_key(input, BTN_2, (data[5] & 0x04));
873                                 input_report_key(input, BTN_3, (data[5] & 0x08));
874                                 input_report_key(input, BTN_4, (data[6] & 0x01));
875                                 input_report_key(input, BTN_5, (data[6] & 0x02));
876                                 input_report_key(input, BTN_6, (data[6] & 0x04));
877                                 input_report_key(input, BTN_7, (data[6] & 0x08));
878                                 input_report_key(input, BTN_8, (data[5] & 0x10));
879                                 input_report_key(input, BTN_9, (data[6] & 0x10));
880                         }
881                         input_report_abs(input, ABS_RX, ((data[1] & 0x1f) << 8) | data[2]);
882                         input_report_abs(input, ABS_RY, ((data[3] & 0x1f) << 8) | data[4]);
883
884                         if ((data[5] & 0x1f) | data[6] | (data[1] & 0x1f) |
885                                 data[2] | (data[3] & 0x1f) | data[4] | data[8] |
886                                 (data[7] & 0x01)) {
887                                 input_report_abs(input, ABS_MISC, PAD_DEVICE_ID);
888                         } else {
889                                 input_report_abs(input, ABS_MISC, 0);
890                         }
891                 }
892                 return 1;
893         }
894
895         /* process in/out prox events */
896         result = wacom_intuos_inout(wacom);
897         if (result)
898                 return result - 1;
899
900         if (features->type >= INTUOS3S) {
901                 input_report_abs(input, ABS_X, (data[2] << 9) | (data[3] << 1) | ((data[9] >> 1) & 1));
902                 input_report_abs(input, ABS_Y, (data[4] << 9) | (data[5] << 1) | (data[9] & 1));
903                 input_report_abs(input, ABS_DISTANCE, ((data[9] >> 2) & 0x3f));
904         } else {
905                 input_report_abs(input, ABS_X, be16_to_cpup((__be16 *)&data[2]));
906                 input_report_abs(input, ABS_Y, be16_to_cpup((__be16 *)&data[4]));
907                 input_report_abs(input, ABS_DISTANCE, ((data[9] >> 3) & 0x1f));
908         }
909
910         /* process general packets */
911         wacom_intuos_general(wacom);
912
913         /* 4D mouse, 2D mouse, marker pen rotation, tilt mouse, or Lens cursor packets */
914         if ((data[1] & 0xbc) == 0xa8 || (data[1] & 0xbe) == 0xb0 || (data[1] & 0xbc) == 0xac) {
915
916                 if (data[1] & 0x02) {
917                         /* Rotation packet */
918                         if (features->type >= INTUOS3S) {
919                                 /* I3 marker pen rotation */
920                                 t = (data[6] << 3) | ((data[7] >> 5) & 7);
921                                 t = (data[7] & 0x20) ? ((t > 900) ? ((t-1) / 2 - 1350) :
922                                         ((t-1) / 2 + 450)) : (450 - t / 2) ;
923                                 input_report_abs(input, ABS_Z, t);
924                         } else {
925                                 /* 4D mouse rotation packet */
926                                 t = (data[6] << 3) | ((data[7] >> 5) & 7);
927                                 input_report_abs(input, ABS_RZ, (data[7] & 0x20) ?
928                                         ((t - 1) / 2) : -t / 2);
929                         }
930
931                 } else if (!(data[1] & 0x10) && features->type < INTUOS3S) {
932                         /* 4D mouse packet */
933                         input_report_key(input, BTN_LEFT,   data[8] & 0x01);
934                         input_report_key(input, BTN_MIDDLE, data[8] & 0x02);
935                         input_report_key(input, BTN_RIGHT,  data[8] & 0x04);
936
937                         input_report_key(input, BTN_SIDE,   data[8] & 0x20);
938                         input_report_key(input, BTN_EXTRA,  data[8] & 0x10);
939                         t = (data[6] << 2) | ((data[7] >> 6) & 3);
940                         input_report_abs(input, ABS_THROTTLE, (data[8] & 0x08) ? -t : t);
941
942                 } else if (wacom->tool[idx] == BTN_TOOL_MOUSE) {
943                         /* I4 mouse */
944                         if (features->type >= INTUOS4S && features->type <= INTUOSPL) {
945                                 input_report_key(input, BTN_LEFT,   data[6] & 0x01);
946                                 input_report_key(input, BTN_MIDDLE, data[6] & 0x02);
947                                 input_report_key(input, BTN_RIGHT,  data[6] & 0x04);
948                                 input_report_rel(input, REL_WHEEL, ((data[7] & 0x80) >> 7)
949                                                  - ((data[7] & 0x40) >> 6));
950                                 input_report_key(input, BTN_SIDE,   data[6] & 0x08);
951                                 input_report_key(input, BTN_EXTRA,  data[6] & 0x10);
952
953                                 input_report_abs(input, ABS_TILT_X,
954                                         (((data[7] << 1) & 0x7e) | (data[8] >> 7)) - 64);
955                                 input_report_abs(input, ABS_TILT_Y, (data[8] & 0x7f) - 64);
956                         } else {
957                                 /* 2D mouse packet */
958                                 input_report_key(input, BTN_LEFT,   data[8] & 0x04);
959                                 input_report_key(input, BTN_MIDDLE, data[8] & 0x08);
960                                 input_report_key(input, BTN_RIGHT,  data[8] & 0x10);
961                                 input_report_rel(input, REL_WHEEL, (data[8] & 0x01)
962                                                  - ((data[8] & 0x02) >> 1));
963
964                                 /* I3 2D mouse side buttons */
965                                 if (features->type >= INTUOS3S && features->type <= INTUOS3L) {
966                                         input_report_key(input, BTN_SIDE,   data[8] & 0x40);
967                                         input_report_key(input, BTN_EXTRA,  data[8] & 0x20);
968                                 }
969                         }
970                 } else if ((features->type < INTUOS3S || features->type == INTUOS3L ||
971                                 features->type == INTUOS4L || features->type == INTUOS5L ||
972                                 features->type == INTUOSPL) &&
973                            wacom->tool[idx] == BTN_TOOL_LENS) {
974                         /* Lens cursor packets */
975                         input_report_key(input, BTN_LEFT,   data[8] & 0x01);
976                         input_report_key(input, BTN_MIDDLE, data[8] & 0x02);
977                         input_report_key(input, BTN_RIGHT,  data[8] & 0x04);
978                         input_report_key(input, BTN_SIDE,   data[8] & 0x10);
979                         input_report_key(input, BTN_EXTRA,  data[8] & 0x08);
980                 }
981         }
982
983         input_report_abs(input, ABS_MISC, wacom->id[idx]); /* report tool id */
984         input_report_key(input, wacom->tool[idx], 1);
985         input_event(input, EV_MSC, MSC_SERIAL, wacom->serial[idx]);
986         wacom->reporting_data = true;
987         return 1;
988 }
989
990 static int int_dist(int x1, int y1, int x2, int y2)
991 {
992         int x = x2 - x1;
993         int y = y2 - y1;
994
995         return int_sqrt(x*x + y*y);
996 }
997
998 static void wacom_intuos_bt_process_data(struct wacom_wac *wacom,
999                 unsigned char *data)
1000 {
1001         memcpy(wacom->data, data, 10);
1002         wacom_intuos_irq(wacom);
1003
1004         input_sync(wacom->input);
1005         if (wacom->pad_input)
1006                 input_sync(wacom->pad_input);
1007 }
1008
1009 static int wacom_intuos_bt_irq(struct wacom_wac *wacom, size_t len)
1010 {
1011         unsigned char data[WACOM_PKGLEN_MAX];
1012         int i = 1;
1013         unsigned power_raw, battery_capacity, bat_charging, ps_connected;
1014
1015         memcpy(data, wacom->data, len);
1016
1017         switch (data[0]) {
1018         case 0x04:
1019                 wacom_intuos_bt_process_data(wacom, data + i);
1020                 i += 10;
1021                 /* fall through */
1022         case 0x03:
1023                 wacom_intuos_bt_process_data(wacom, data + i);
1024                 i += 10;
1025                 wacom_intuos_bt_process_data(wacom, data + i);
1026                 i += 10;
1027                 power_raw = data[i];
1028                 bat_charging = (power_raw & 0x08) ? 1 : 0;
1029                 ps_connected = (power_raw & 0x10) ? 1 : 0;
1030                 battery_capacity = batcap_i4[power_raw & 0x07];
1031                 wacom_notify_battery(wacom, battery_capacity, bat_charging,
1032                                      ps_connected);
1033                 break;
1034         default:
1035                 dev_dbg(wacom->input->dev.parent,
1036                                 "Unknown report: %d,%d size:%zu\n",
1037                                 data[0], data[1], len);
1038                 return 0;
1039         }
1040         return 0;
1041 }
1042
1043 static int wacom_24hdt_irq(struct wacom_wac *wacom)
1044 {
1045         struct input_dev *input = wacom->input;
1046         unsigned char *data = wacom->data;
1047         int i;
1048         int current_num_contacts = 0;
1049         int contacts_to_send = 0;
1050         int num_contacts_left = 4; /* maximum contacts per packet */
1051         int byte_per_packet = WACOM_BYTES_PER_24HDT_PACKET;
1052         int y_offset = 2;
1053
1054         if (wacom->features.type == WACOM_27QHDT) {
1055                 current_num_contacts = data[63];
1056                 num_contacts_left = 10;
1057                 byte_per_packet = WACOM_BYTES_PER_QHDTHID_PACKET;
1058                 y_offset = 0;
1059         } else {
1060                 current_num_contacts = data[61];
1061         }
1062
1063         /*
1064          * First packet resets the counter since only the first
1065          * packet in series will have non-zero current_num_contacts.
1066          */
1067         if (current_num_contacts)
1068                 wacom->num_contacts_left = current_num_contacts;
1069
1070         contacts_to_send = min(num_contacts_left, wacom->num_contacts_left);
1071
1072         for (i = 0; i < contacts_to_send; i++) {
1073                 int offset = (byte_per_packet * i) + 1;
1074                 bool touch = (data[offset] & 0x1) && !wacom->shared->stylus_in_proximity;
1075                 int slot = input_mt_get_slot_by_key(input, data[offset + 1]);
1076
1077                 if (slot < 0)
1078                         continue;
1079                 input_mt_slot(input, slot);
1080                 input_mt_report_slot_state(input, MT_TOOL_FINGER, touch);
1081
1082                 if (touch) {
1083                         int t_x = get_unaligned_le16(&data[offset + 2]);
1084                         int t_y = get_unaligned_le16(&data[offset + 4 + y_offset]);
1085
1086                         input_report_abs(input, ABS_MT_POSITION_X, t_x);
1087                         input_report_abs(input, ABS_MT_POSITION_Y, t_y);
1088
1089                         if (wacom->features.type != WACOM_27QHDT) {
1090                                 int c_x = get_unaligned_le16(&data[offset + 4]);
1091                                 int c_y = get_unaligned_le16(&data[offset + 8]);
1092                                 int w = get_unaligned_le16(&data[offset + 10]);
1093                                 int h = get_unaligned_le16(&data[offset + 12]);
1094
1095                                 input_report_abs(input, ABS_MT_TOUCH_MAJOR, min(w,h));
1096                                 input_report_abs(input, ABS_MT_WIDTH_MAJOR,
1097                                                  min(w, h) + int_dist(t_x, t_y, c_x, c_y));
1098                                 input_report_abs(input, ABS_MT_WIDTH_MINOR, min(w, h));
1099                                 input_report_abs(input, ABS_MT_ORIENTATION, w > h);
1100                         }
1101                 }
1102         }
1103         input_mt_sync_frame(input);
1104
1105         wacom->num_contacts_left -= contacts_to_send;
1106         if (wacom->num_contacts_left <= 0)
1107                 wacom->num_contacts_left = 0;
1108
1109         wacom->shared->touch_down = (wacom->num_contacts_left > 0);
1110         return 1;
1111 }
1112
1113 static int wacom_mt_touch(struct wacom_wac *wacom)
1114 {
1115         struct input_dev *input = wacom->input;
1116         unsigned char *data = wacom->data;
1117         int i;
1118         int current_num_contacts = data[2];
1119         int contacts_to_send = 0;
1120         int x_offset = 0;
1121
1122         /* MTTPC does not support Height and Width */
1123         if (wacom->features.type == MTTPC || wacom->features.type == MTTPC_B)
1124                 x_offset = -4;
1125
1126         /*
1127          * First packet resets the counter since only the first
1128          * packet in series will have non-zero current_num_contacts.
1129          */
1130         if (current_num_contacts)
1131                 wacom->num_contacts_left = current_num_contacts;
1132
1133         /* There are at most 5 contacts per packet */
1134         contacts_to_send = min(5, wacom->num_contacts_left);
1135
1136         for (i = 0; i < contacts_to_send; i++) {
1137                 int offset = (WACOM_BYTES_PER_MT_PACKET + x_offset) * i + 3;
1138                 bool touch = (data[offset] & 0x1) && !wacom->shared->stylus_in_proximity;
1139                 int id = get_unaligned_le16(&data[offset + 1]);
1140                 int slot = input_mt_get_slot_by_key(input, id);
1141
1142                 if (slot < 0)
1143                         continue;
1144
1145                 input_mt_slot(input, slot);
1146                 input_mt_report_slot_state(input, MT_TOOL_FINGER, touch);
1147                 if (touch) {
1148                         int x = get_unaligned_le16(&data[offset + x_offset + 7]);
1149                         int y = get_unaligned_le16(&data[offset + x_offset + 9]);
1150                         input_report_abs(input, ABS_MT_POSITION_X, x);
1151                         input_report_abs(input, ABS_MT_POSITION_Y, y);
1152                 }
1153         }
1154         input_mt_sync_frame(input);
1155
1156         wacom->num_contacts_left -= contacts_to_send;
1157         if (wacom->num_contacts_left < 0)
1158                 wacom->num_contacts_left = 0;
1159
1160         wacom->shared->touch_down = (wacom->num_contacts_left > 0);
1161         return 1;
1162 }
1163
1164 static int wacom_tpc_mt_touch(struct wacom_wac *wacom)
1165 {
1166         struct input_dev *input = wacom->input;
1167         unsigned char *data = wacom->data;
1168         int contact_with_no_pen_down_count = 0;
1169         int i;
1170
1171         for (i = 0; i < 2; i++) {
1172                 int p = data[1] & (1 << i);
1173                 bool touch = p && !wacom->shared->stylus_in_proximity;
1174
1175                 input_mt_slot(input, i);
1176                 input_mt_report_slot_state(input, MT_TOOL_FINGER, touch);
1177                 if (touch) {
1178                         int x = le16_to_cpup((__le16 *)&data[i * 2 + 2]) & 0x7fff;
1179                         int y = le16_to_cpup((__le16 *)&data[i * 2 + 6]) & 0x7fff;
1180
1181                         input_report_abs(input, ABS_MT_POSITION_X, x);
1182                         input_report_abs(input, ABS_MT_POSITION_Y, y);
1183                         contact_with_no_pen_down_count++;
1184                 }
1185         }
1186         input_mt_sync_frame(input);
1187
1188         /* keep touch state for pen event */
1189         wacom->shared->touch_down = (contact_with_no_pen_down_count > 0);
1190
1191         return 1;
1192 }
1193
1194 static int wacom_tpc_single_touch(struct wacom_wac *wacom, size_t len)
1195 {
1196         unsigned char *data = wacom->data;
1197         struct input_dev *input = wacom->input;
1198         bool prox;
1199         int x = 0, y = 0;
1200
1201         if (wacom->features.touch_max > 1 || len > WACOM_PKGLEN_TPC2FG)
1202                 return 0;
1203
1204         if (!wacom->shared->stylus_in_proximity) {
1205                 if (len == WACOM_PKGLEN_TPC1FG) {
1206                         prox = data[0] & 0x01;
1207                         x = get_unaligned_le16(&data[1]);
1208                         y = get_unaligned_le16(&data[3]);
1209                 } else if (len == WACOM_PKGLEN_TPC1FG_B) {
1210                         prox = data[2] & 0x01;
1211                         x = get_unaligned_le16(&data[3]);
1212                         y = get_unaligned_le16(&data[5]);
1213                 } else {
1214                         prox = data[1] & 0x01;
1215                         x = le16_to_cpup((__le16 *)&data[2]);
1216                         y = le16_to_cpup((__le16 *)&data[4]);
1217                 }
1218         } else
1219                 /* force touch out when pen is in prox */
1220                 prox = 0;
1221
1222         if (prox) {
1223                 input_report_abs(input, ABS_X, x);
1224                 input_report_abs(input, ABS_Y, y);
1225         }
1226         input_report_key(input, BTN_TOUCH, prox);
1227
1228         /* keep touch state for pen events */
1229         wacom->shared->touch_down = prox;
1230
1231         return 1;
1232 }
1233
1234 static int wacom_tpc_pen(struct wacom_wac *wacom)
1235 {
1236         unsigned char *data = wacom->data;
1237         struct input_dev *input = wacom->input;
1238         bool prox = data[1] & 0x20;
1239
1240         if (!wacom->shared->stylus_in_proximity) /* first in prox */
1241                 /* Going into proximity select tool */
1242                 wacom->tool[0] = (data[1] & 0x0c) ? BTN_TOOL_RUBBER : BTN_TOOL_PEN;
1243
1244         /* keep pen state for touch events */
1245         wacom->shared->stylus_in_proximity = prox;
1246
1247         /* send pen events only when touch is up or forced out */
1248         if (!wacom->shared->touch_down) {
1249                 input_report_key(input, BTN_STYLUS, data[1] & 0x02);
1250                 input_report_key(input, BTN_STYLUS2, data[1] & 0x10);
1251                 input_report_abs(input, ABS_X, le16_to_cpup((__le16 *)&data[2]));
1252                 input_report_abs(input, ABS_Y, le16_to_cpup((__le16 *)&data[4]));
1253                 input_report_abs(input, ABS_PRESSURE, ((data[7] & 0x07) << 8) | data[6]);
1254                 input_report_key(input, BTN_TOUCH, data[1] & 0x05);
1255                 input_report_key(input, wacom->tool[0], prox);
1256                 return 1;
1257         }
1258
1259         return 0;
1260 }
1261
1262 static int wacom_tpc_irq(struct wacom_wac *wacom, size_t len)
1263 {
1264         unsigned char *data = wacom->data;
1265
1266         dev_dbg(wacom->input->dev.parent,
1267                 "%s: received report #%d\n", __func__, data[0]);
1268
1269         switch (len) {
1270         case WACOM_PKGLEN_TPC1FG:
1271                 return wacom_tpc_single_touch(wacom, len);
1272
1273         case WACOM_PKGLEN_TPC2FG:
1274                 return wacom_tpc_mt_touch(wacom);
1275
1276         case WACOM_PKGLEN_PENABLED:
1277                 return wacom_tpc_pen(wacom);
1278
1279         default:
1280                 switch (data[0]) {
1281                 case WACOM_REPORT_TPC1FG:
1282                 case WACOM_REPORT_TPCHID:
1283                 case WACOM_REPORT_TPCST:
1284                 case WACOM_REPORT_TPC1FGE:
1285                         return wacom_tpc_single_touch(wacom, len);
1286
1287                 case WACOM_REPORT_TPCMT:
1288                 case WACOM_REPORT_TPCMT2:
1289                         return wacom_mt_touch(wacom);
1290
1291                 case WACOM_REPORT_PENABLED:
1292                         return wacom_tpc_pen(wacom);
1293                 }
1294         }
1295
1296         return 0;
1297 }
1298
1299 static void wacom_map_usage(struct wacom *wacom, struct hid_usage *usage,
1300                 struct hid_field *field, __u8 type, __u16 code, int fuzz)
1301 {
1302         struct wacom_wac *wacom_wac = &wacom->wacom_wac;
1303         struct input_dev *input = wacom_wac->input;
1304         int fmin = field->logical_minimum;
1305         int fmax = field->logical_maximum;
1306
1307         usage->type = type;
1308         usage->code = code;
1309
1310         set_bit(type, input->evbit);
1311
1312         switch (type) {
1313         case EV_ABS:
1314                 input_set_abs_params(input, code, fmin, fmax, fuzz, 0);
1315                 input_abs_set_res(input, code,
1316                                   hidinput_calc_abs_res(field, code));
1317                 break;
1318         case EV_KEY:
1319                 input_set_capability(input, EV_KEY, code);
1320                 break;
1321         case EV_MSC:
1322                 input_set_capability(input, EV_MSC, code);
1323                 break;
1324         }
1325 }
1326
1327 static void wacom_wac_pen_usage_mapping(struct hid_device *hdev,
1328                 struct hid_field *field, struct hid_usage *usage)
1329 {
1330         struct wacom *wacom = hid_get_drvdata(hdev);
1331
1332         switch (usage->hid) {
1333         case HID_GD_X:
1334                 wacom_map_usage(wacom, usage, field, EV_ABS, ABS_X, 4);
1335                 break;
1336         case HID_GD_Y:
1337                 wacom_map_usage(wacom, usage, field, EV_ABS, ABS_Y, 4);
1338                 break;
1339         case HID_DG_TIPPRESSURE:
1340                 wacom_map_usage(wacom, usage, field, EV_ABS, ABS_PRESSURE, 0);
1341                 break;
1342         case HID_DG_INRANGE:
1343                 wacom_map_usage(wacom, usage, field, EV_KEY, BTN_TOOL_PEN, 0);
1344                 break;
1345         case HID_DG_INVERT:
1346                 wacom_map_usage(wacom, usage, field, EV_KEY,
1347                                 BTN_TOOL_RUBBER, 0);
1348                 break;
1349         case HID_DG_ERASER:
1350         case HID_DG_TIPSWITCH:
1351                 wacom_map_usage(wacom, usage, field, EV_KEY, BTN_TOUCH, 0);
1352                 break;
1353         case HID_DG_BARRELSWITCH:
1354                 wacom_map_usage(wacom, usage, field, EV_KEY, BTN_STYLUS, 0);
1355                 break;
1356         case HID_DG_BARRELSWITCH2:
1357                 wacom_map_usage(wacom, usage, field, EV_KEY, BTN_STYLUS2, 0);
1358                 break;
1359         case HID_DG_TOOLSERIALNUMBER:
1360                 wacom_map_usage(wacom, usage, field, EV_MSC, MSC_SERIAL, 0);
1361                 break;
1362         }
1363 }
1364
1365 static int wacom_wac_pen_event(struct hid_device *hdev, struct hid_field *field,
1366                 struct hid_usage *usage, __s32 value)
1367 {
1368         struct wacom *wacom = hid_get_drvdata(hdev);
1369         struct wacom_wac *wacom_wac = &wacom->wacom_wac;
1370         struct input_dev *input = wacom_wac->input;
1371
1372         /* checking which Tool / tip switch to send */
1373         switch (usage->hid) {
1374         case HID_DG_INRANGE:
1375                 wacom_wac->hid_data.inrange_state = value;
1376                 return 0;
1377         case HID_DG_INVERT:
1378                 wacom_wac->hid_data.invert_state = value;
1379                 return 0;
1380         case HID_DG_ERASER:
1381         case HID_DG_TIPSWITCH:
1382                 wacom_wac->hid_data.tipswitch |= value;
1383                 return 0;
1384         }
1385
1386         /* send pen events only when touch is up or forced out */
1387         if (!usage->type || wacom_wac->shared->touch_down)
1388                 return 0;
1389
1390         input_event(input, usage->type, usage->code, value);
1391
1392         return 0;
1393 }
1394
1395 static void wacom_wac_pen_report(struct hid_device *hdev,
1396                 struct hid_report *report)
1397 {
1398         struct wacom *wacom = hid_get_drvdata(hdev);
1399         struct wacom_wac *wacom_wac = &wacom->wacom_wac;
1400         struct input_dev *input = wacom_wac->input;
1401         bool prox = wacom_wac->hid_data.inrange_state;
1402
1403         if (!wacom_wac->shared->stylus_in_proximity) /* first in prox */
1404                 /* Going into proximity select tool */
1405                 wacom_wac->tool[0] = wacom_wac->hid_data.invert_state ?
1406                                                 BTN_TOOL_RUBBER : BTN_TOOL_PEN;
1407
1408         /* keep pen state for touch events */
1409         wacom_wac->shared->stylus_in_proximity = prox;
1410
1411         /* send pen events only when touch is up or forced out */
1412         if (!wacom_wac->shared->touch_down) {
1413                 input_report_key(input, BTN_TOUCH,
1414                                 wacom_wac->hid_data.tipswitch);
1415                 input_report_key(input, wacom_wac->tool[0], prox);
1416
1417                 wacom_wac->hid_data.tipswitch = false;
1418
1419                 input_sync(input);
1420         }
1421 }
1422
1423 static void wacom_wac_finger_usage_mapping(struct hid_device *hdev,
1424                 struct hid_field *field, struct hid_usage *usage)
1425 {
1426         struct wacom *wacom = hid_get_drvdata(hdev);
1427         struct wacom_wac *wacom_wac = &wacom->wacom_wac;
1428         struct wacom_features *features = &wacom_wac->features;
1429         unsigned touch_max = wacom_wac->features.touch_max;
1430
1431         switch (usage->hid) {
1432         case HID_GD_X:
1433                 features->last_slot_field = usage->hid;
1434                 if (touch_max == 1)
1435                         wacom_map_usage(wacom, usage, field, EV_ABS, ABS_X, 4);
1436                 else
1437                         wacom_map_usage(wacom, usage, field, EV_ABS,
1438                                         ABS_MT_POSITION_X, 4);
1439                 break;
1440         case HID_GD_Y:
1441                 features->last_slot_field = usage->hid;
1442                 if (touch_max == 1)
1443                         wacom_map_usage(wacom, usage, field, EV_ABS, ABS_Y, 4);
1444                 else
1445                         wacom_map_usage(wacom, usage, field, EV_ABS,
1446                                         ABS_MT_POSITION_Y, 4);
1447                 break;
1448         case HID_DG_CONTACTID:
1449                 features->last_slot_field = usage->hid;
1450                 break;
1451         case HID_DG_INRANGE:
1452                 features->last_slot_field = usage->hid;
1453                 break;
1454         case HID_DG_INVERT:
1455                 features->last_slot_field = usage->hid;
1456                 break;
1457         case HID_DG_TIPSWITCH:
1458                 features->last_slot_field = usage->hid;
1459                 wacom_map_usage(wacom, usage, field, EV_KEY, BTN_TOUCH, 0);
1460                 break;
1461         }
1462 }
1463
1464 static void wacom_wac_finger_slot(struct wacom_wac *wacom_wac,
1465                 struct input_dev *input)
1466 {
1467         struct hid_data *hid_data = &wacom_wac->hid_data;
1468         bool mt = wacom_wac->features.touch_max > 1;
1469         bool prox = hid_data->tipswitch &&
1470                     !wacom_wac->shared->stylus_in_proximity;
1471
1472         if (mt) {
1473                 int slot;
1474
1475                 slot = input_mt_get_slot_by_key(input, hid_data->id);
1476                 input_mt_slot(input, slot);
1477                 input_mt_report_slot_state(input, MT_TOOL_FINGER, prox);
1478         }
1479         else {
1480                 input_report_key(input, BTN_TOUCH, prox);
1481         }
1482
1483         if (prox) {
1484                 input_report_abs(input, mt ? ABS_MT_POSITION_X : ABS_X,
1485                                  hid_data->x);
1486                 input_report_abs(input, mt ? ABS_MT_POSITION_Y : ABS_Y,
1487                                  hid_data->y);
1488         }
1489 }
1490
1491 static int wacom_wac_finger_event(struct hid_device *hdev,
1492                 struct hid_field *field, struct hid_usage *usage, __s32 value)
1493 {
1494         struct wacom *wacom = hid_get_drvdata(hdev);
1495         struct wacom_wac *wacom_wac = &wacom->wacom_wac;
1496
1497         switch (usage->hid) {
1498         case HID_GD_X:
1499                 wacom_wac->hid_data.x = value;
1500                 break;
1501         case HID_GD_Y:
1502                 wacom_wac->hid_data.y = value;
1503                 break;
1504         case HID_DG_CONTACTID:
1505                 wacom_wac->hid_data.id = value;
1506                 break;
1507         case HID_DG_TIPSWITCH:
1508                 wacom_wac->hid_data.tipswitch = value;
1509                 break;
1510         }
1511
1512
1513         if (usage->usage_index + 1 == field->report_count) {
1514                 if (usage->hid == wacom_wac->features.last_slot_field)
1515                         wacom_wac_finger_slot(wacom_wac, wacom_wac->input);
1516         }
1517
1518         return 0;
1519 }
1520
1521 static int wacom_wac_finger_count_touches(struct hid_device *hdev)
1522 {
1523         struct wacom *wacom = hid_get_drvdata(hdev);
1524         struct wacom_wac *wacom_wac = &wacom->wacom_wac;
1525         struct input_dev *input = wacom_wac->input;
1526         unsigned touch_max = wacom_wac->features.touch_max;
1527         int count = 0;
1528         int i;
1529
1530         if (touch_max == 1)
1531                 return wacom_wac->hid_data.tipswitch &&
1532                        !wacom_wac->shared->stylus_in_proximity;
1533
1534         for (i = 0; i < input->mt->num_slots; i++) {
1535                 struct input_mt_slot *ps = &input->mt->slots[i];
1536                 int id = input_mt_get_value(ps, ABS_MT_TRACKING_ID);
1537                 if (id >= 0)
1538                         count++;
1539         }
1540
1541         return count;
1542 }
1543
1544 static void wacom_wac_finger_report(struct hid_device *hdev,
1545                 struct hid_report *report)
1546 {
1547         struct wacom *wacom = hid_get_drvdata(hdev);
1548         struct wacom_wac *wacom_wac = &wacom->wacom_wac;
1549         struct input_dev *input = wacom_wac->input;
1550         unsigned touch_max = wacom_wac->features.touch_max;
1551
1552         if (touch_max > 1)
1553                 input_mt_sync_frame(input);
1554
1555         input_sync(input);
1556
1557         /* keep touch state for pen event */
1558         wacom_wac->shared->touch_down = wacom_wac_finger_count_touches(hdev);
1559 }
1560
1561 void wacom_wac_usage_mapping(struct hid_device *hdev,
1562                 struct hid_field *field, struct hid_usage *usage)
1563 {
1564         struct wacom *wacom = hid_get_drvdata(hdev);
1565         struct wacom_wac *wacom_wac = &wacom->wacom_wac;
1566         struct input_dev *input = wacom_wac->input;
1567
1568         /* currently, only direct devices have proper hid report descriptors */
1569         __set_bit(INPUT_PROP_DIRECT, input->propbit);
1570
1571         if (WACOM_PEN_FIELD(field))
1572                 return wacom_wac_pen_usage_mapping(hdev, field, usage);
1573
1574         if (WACOM_FINGER_FIELD(field))
1575                 return wacom_wac_finger_usage_mapping(hdev, field, usage);
1576 }
1577
1578 int wacom_wac_event(struct hid_device *hdev, struct hid_field *field,
1579                 struct hid_usage *usage, __s32 value)
1580 {
1581         struct wacom *wacom = hid_get_drvdata(hdev);
1582
1583         if (wacom->wacom_wac.features.type != HID_GENERIC)
1584                 return 0;
1585
1586         if (WACOM_PEN_FIELD(field))
1587                 return wacom_wac_pen_event(hdev, field, usage, value);
1588
1589         if (WACOM_FINGER_FIELD(field))
1590                 return wacom_wac_finger_event(hdev, field, usage, value);
1591
1592         return 0;
1593 }
1594
1595 void wacom_wac_report(struct hid_device *hdev, struct hid_report *report)
1596 {
1597         struct wacom *wacom = hid_get_drvdata(hdev);
1598         struct wacom_wac *wacom_wac = &wacom->wacom_wac;
1599         struct hid_field *field = report->field[0];
1600
1601         if (wacom_wac->features.type != HID_GENERIC)
1602                 return;
1603
1604         if (WACOM_PEN_FIELD(field))
1605                 return wacom_wac_pen_report(hdev, report);
1606
1607         if (WACOM_FINGER_FIELD(field))
1608                 return wacom_wac_finger_report(hdev, report);
1609 }
1610
1611 static int wacom_bpt_touch(struct wacom_wac *wacom)
1612 {
1613         struct wacom_features *features = &wacom->features;
1614         struct input_dev *input = wacom->input;
1615         struct input_dev *pad_input = wacom->pad_input;
1616         unsigned char *data = wacom->data;
1617         int i;
1618
1619         if (data[0] != 0x02)
1620             return 0;
1621
1622         for (i = 0; i < 2; i++) {
1623                 int offset = (data[1] & 0x80) ? (8 * i) : (9 * i);
1624                 bool touch = data[offset + 3] & 0x80;
1625
1626                 /*
1627                  * Touch events need to be disabled while stylus is
1628                  * in proximity because user's hand is resting on touchpad
1629                  * and sending unwanted events.  User expects tablet buttons
1630                  * to continue working though.
1631                  */
1632                 touch = touch && !wacom->shared->stylus_in_proximity;
1633
1634                 input_mt_slot(input, i);
1635                 input_mt_report_slot_state(input, MT_TOOL_FINGER, touch);
1636                 if (touch) {
1637                         int x = get_unaligned_be16(&data[offset + 3]) & 0x7ff;
1638                         int y = get_unaligned_be16(&data[offset + 5]) & 0x7ff;
1639                         if (features->quirks & WACOM_QUIRK_BBTOUCH_LOWRES) {
1640                                 x <<= 5;
1641                                 y <<= 5;
1642                         }
1643                         input_report_abs(input, ABS_MT_POSITION_X, x);
1644                         input_report_abs(input, ABS_MT_POSITION_Y, y);
1645                 }
1646         }
1647
1648         input_mt_sync_frame(input);
1649
1650         input_report_key(pad_input, BTN_LEFT, (data[1] & 0x08) != 0);
1651         input_report_key(pad_input, BTN_FORWARD, (data[1] & 0x04) != 0);
1652         input_report_key(pad_input, BTN_BACK, (data[1] & 0x02) != 0);
1653         input_report_key(pad_input, BTN_RIGHT, (data[1] & 0x01) != 0);
1654
1655         return 1;
1656 }
1657
1658 static void wacom_bpt3_touch_msg(struct wacom_wac *wacom, unsigned char *data)
1659 {
1660         struct wacom_features *features = &wacom->features;
1661         struct input_dev *input = wacom->input;
1662         bool touch = data[1] & 0x80;
1663         int slot = input_mt_get_slot_by_key(input, data[0]);
1664
1665         if (slot < 0)
1666                 return;
1667
1668         touch = touch && !wacom->shared->stylus_in_proximity;
1669
1670         input_mt_slot(input, slot);
1671         input_mt_report_slot_state(input, MT_TOOL_FINGER, touch);
1672
1673         if (touch) {
1674                 int x = (data[2] << 4) | (data[4] >> 4);
1675                 int y = (data[3] << 4) | (data[4] & 0x0f);
1676                 int width, height;
1677
1678                 if (features->type >= INTUOSPS && features->type <= INTUOSPL) {
1679                         width  = data[5] * 100;
1680                         height = data[6] * 100;
1681                 } else {
1682                         /*
1683                          * "a" is a scaled-down area which we assume is
1684                          * roughly circular and which can be described as:
1685                          * a=(pi*r^2)/C.
1686                          */
1687                         int a = data[5];
1688                         int x_res = input_abs_get_res(input, ABS_MT_POSITION_X);
1689                         int y_res = input_abs_get_res(input, ABS_MT_POSITION_Y);
1690                         width = 2 * int_sqrt(a * WACOM_CONTACT_AREA_SCALE);
1691                         height = width * y_res / x_res;
1692                 }
1693
1694                 input_report_abs(input, ABS_MT_POSITION_X, x);
1695                 input_report_abs(input, ABS_MT_POSITION_Y, y);
1696                 input_report_abs(input, ABS_MT_TOUCH_MAJOR, width);
1697                 input_report_abs(input, ABS_MT_TOUCH_MINOR, height);
1698         }
1699 }
1700
1701 static void wacom_bpt3_button_msg(struct wacom_wac *wacom, unsigned char *data)
1702 {
1703         struct input_dev *input = wacom->pad_input;
1704         struct wacom_features *features = &wacom->features;
1705
1706         if (features->type == INTUOSHT) {
1707                 input_report_key(input, BTN_LEFT, (data[1] & 0x02) != 0);
1708                 input_report_key(input, BTN_BACK, (data[1] & 0x08) != 0);
1709         } else {
1710                 input_report_key(input, BTN_BACK, (data[1] & 0x02) != 0);
1711                 input_report_key(input, BTN_LEFT, (data[1] & 0x08) != 0);
1712         }
1713         input_report_key(input, BTN_FORWARD, (data[1] & 0x04) != 0);
1714         input_report_key(input, BTN_RIGHT, (data[1] & 0x01) != 0);
1715 }
1716
1717 static int wacom_bpt3_touch(struct wacom_wac *wacom)
1718 {
1719         struct input_dev *input = wacom->input;
1720         unsigned char *data = wacom->data;
1721         int count = data[1] & 0x07;
1722         int i;
1723
1724         if (data[0] != 0x02)
1725             return 0;
1726
1727         /* data has up to 7 fixed sized 8-byte messages starting at data[2] */
1728         for (i = 0; i < count; i++) {
1729                 int offset = (8 * i) + 2;
1730                 int msg_id = data[offset];
1731
1732                 if (msg_id >= 2 && msg_id <= 17)
1733                         wacom_bpt3_touch_msg(wacom, data + offset);
1734                 else if (msg_id == 128)
1735                         wacom_bpt3_button_msg(wacom, data + offset);
1736
1737         }
1738         input_mt_sync_frame(input);
1739
1740         return 1;
1741 }
1742
1743 static int wacom_bpt_pen(struct wacom_wac *wacom)
1744 {
1745         struct wacom_features *features = &wacom->features;
1746         struct input_dev *input = wacom->input;
1747         unsigned char *data = wacom->data;
1748         int prox = 0, x = 0, y = 0, p = 0, d = 0, pen = 0, btn1 = 0, btn2 = 0;
1749
1750         if (data[0] != WACOM_REPORT_PENABLED)
1751             return 0;
1752
1753         prox = (data[1] & 0x20) == 0x20;
1754
1755         /*
1756          * All reports shared between PEN and RUBBER tool must be
1757          * forced to a known starting value (zero) when transitioning to
1758          * out-of-prox.
1759          *
1760          * If not reset then, to userspace, it will look like lost events
1761          * if new tool comes in-prox with same values as previous tool sent.
1762          *
1763          * Hardware does report zero in most out-of-prox cases but not all.
1764          */
1765         if (prox) {
1766                 if (!wacom->shared->stylus_in_proximity) {
1767                         if (data[1] & 0x08) {
1768                                 wacom->tool[0] = BTN_TOOL_RUBBER;
1769                                 wacom->id[0] = ERASER_DEVICE_ID;
1770                         } else {
1771                                 wacom->tool[0] = BTN_TOOL_PEN;
1772                                 wacom->id[0] = STYLUS_DEVICE_ID;
1773                         }
1774                         wacom->shared->stylus_in_proximity = true;
1775                 }
1776                 x = le16_to_cpup((__le16 *)&data[2]);
1777                 y = le16_to_cpup((__le16 *)&data[4]);
1778                 p = le16_to_cpup((__le16 *)&data[6]);
1779                 /*
1780                  * Convert distance from out prox to distance from tablet.
1781                  * distance will be greater than distance_max once
1782                  * touching and applying pressure; do not report negative
1783                  * distance.
1784                  */
1785                 if (data[8] <= features->distance_max)
1786                         d = features->distance_max - data[8];
1787
1788                 pen = data[1] & 0x01;
1789                 btn1 = data[1] & 0x02;
1790                 btn2 = data[1] & 0x04;
1791         }
1792
1793         input_report_key(input, BTN_TOUCH, pen);
1794         input_report_key(input, BTN_STYLUS, btn1);
1795         input_report_key(input, BTN_STYLUS2, btn2);
1796
1797         input_report_abs(input, ABS_X, x);
1798         input_report_abs(input, ABS_Y, y);
1799         input_report_abs(input, ABS_PRESSURE, p);
1800         input_report_abs(input, ABS_DISTANCE, d);
1801
1802         if (!prox) {
1803                 wacom->id[0] = 0;
1804                 wacom->shared->stylus_in_proximity = false;
1805         }
1806
1807         input_report_key(input, wacom->tool[0], prox); /* PEN or RUBBER */
1808         input_report_abs(input, ABS_MISC, wacom->id[0]); /* TOOL ID */
1809
1810         return 1;
1811 }
1812
1813 static int wacom_bpt_irq(struct wacom_wac *wacom, size_t len)
1814 {
1815         if (len == WACOM_PKGLEN_BBTOUCH)
1816                 return wacom_bpt_touch(wacom);
1817         else if (len == WACOM_PKGLEN_BBTOUCH3)
1818                 return wacom_bpt3_touch(wacom);
1819         else if (len == WACOM_PKGLEN_BBFUN || len == WACOM_PKGLEN_BBPEN)
1820                 return wacom_bpt_pen(wacom);
1821
1822         return 0;
1823 }
1824
1825 static void wacom_bamboo_pad_pen_event(struct wacom_wac *wacom,
1826                 unsigned char *data)
1827 {
1828         unsigned char prefix;
1829
1830         /*
1831          * We need to reroute the event from the debug interface to the
1832          * pen interface.
1833          * We need to add the report ID to the actual pen report, so we
1834          * temporary overwrite the first byte to prevent having to kzalloc/kfree
1835          * and memcpy the report.
1836          */
1837         prefix = data[0];
1838         data[0] = WACOM_REPORT_BPAD_PEN;
1839
1840         /*
1841          * actually reroute the event.
1842          * No need to check if wacom->shared->pen is valid, hid_input_report()
1843          * will check for us.
1844          */
1845         hid_input_report(wacom->shared->pen, HID_INPUT_REPORT, data,
1846                          WACOM_PKGLEN_PENABLED, 1);
1847
1848         data[0] = prefix;
1849 }
1850
1851 static int wacom_bamboo_pad_touch_event(struct wacom_wac *wacom,
1852                 unsigned char *data)
1853 {
1854         struct input_dev *input = wacom->input;
1855         unsigned char *finger_data, prefix;
1856         unsigned id;
1857         int x, y;
1858         bool valid;
1859
1860         prefix = data[0];
1861
1862         for (id = 0; id < wacom->features.touch_max; id++) {
1863                 valid = !!(prefix & BIT(id)) &&
1864                         !wacom->shared->stylus_in_proximity;
1865
1866                 input_mt_slot(input, id);
1867                 input_mt_report_slot_state(input, MT_TOOL_FINGER, valid);
1868
1869                 if (!valid)
1870                         continue;
1871
1872                 finger_data = data + 1 + id * 3;
1873                 x = finger_data[0] | ((finger_data[1] & 0x0f) << 8);
1874                 y = (finger_data[2] << 4) | (finger_data[1] >> 4);
1875
1876                 input_report_abs(input, ABS_MT_POSITION_X, x);
1877                 input_report_abs(input, ABS_MT_POSITION_Y, y);
1878         }
1879
1880         input_mt_sync_frame(input);
1881
1882         input_report_key(input, BTN_LEFT, prefix & 0x40);
1883         input_report_key(input, BTN_RIGHT, prefix & 0x80);
1884
1885         /* keep touch state for pen event */
1886         wacom->shared->touch_down = !!prefix &&
1887                                     !wacom->shared->stylus_in_proximity;
1888
1889         return 1;
1890 }
1891
1892 static int wacom_bamboo_pad_irq(struct wacom_wac *wacom, size_t len)
1893 {
1894         unsigned char *data = wacom->data;
1895
1896         if (!((len == WACOM_PKGLEN_BPAD_TOUCH) ||
1897               (len == WACOM_PKGLEN_BPAD_TOUCH_USB)) ||
1898             (data[0] != WACOM_REPORT_BPAD_TOUCH))
1899                 return 0;
1900
1901         if (data[1] & 0x01)
1902                 wacom_bamboo_pad_pen_event(wacom, &data[1]);
1903
1904         if (data[1] & 0x02)
1905                 return wacom_bamboo_pad_touch_event(wacom, &data[9]);
1906
1907         return 0;
1908 }
1909
1910 static int wacom_wireless_irq(struct wacom_wac *wacom, size_t len)
1911 {
1912         unsigned char *data = wacom->data;
1913         int connected;
1914
1915         if (len != WACOM_PKGLEN_WIRELESS || data[0] != WACOM_REPORT_WL)
1916                 return 0;
1917
1918         connected = data[1] & 0x01;
1919         if (connected) {
1920                 int pid, battery, ps_connected, charging;
1921
1922                 if ((wacom->shared->type == INTUOSHT) &&
1923                     wacom->shared->touch_input &&
1924                     wacom->shared->touch_max) {
1925                         input_report_switch(wacom->shared->touch_input,
1926                                         SW_MUTE_DEVICE, data[5] & 0x40);
1927                         input_sync(wacom->shared->touch_input);
1928                 }
1929
1930                 pid = get_unaligned_be16(&data[6]);
1931                 battery = (data[5] & 0x3f) * 100 / 31;
1932                 ps_connected = !!(data[5] & 0x80);
1933                 charging = ps_connected && wacom->battery_capacity < 100;
1934                 if (wacom->pid != pid) {
1935                         wacom->pid = pid;
1936                         wacom_schedule_work(wacom);
1937                 }
1938
1939                 if (wacom->shared->type)
1940                         wacom_notify_battery(wacom, battery, charging,
1941                                              ps_connected);
1942
1943         } else if (wacom->pid != 0) {
1944                 /* disconnected while previously connected */
1945                 wacom->pid = 0;
1946                 wacom_schedule_work(wacom);
1947                 wacom_notify_battery(wacom, 0, 0, 0);
1948         }
1949
1950         return 0;
1951 }
1952
1953 static int wacom_status_irq(struct wacom_wac *wacom_wac, size_t len)
1954 {
1955         struct wacom *wacom = container_of(wacom_wac, struct wacom, wacom_wac);
1956         struct wacom_features *features = &wacom_wac->features;
1957         unsigned char *data = wacom_wac->data;
1958
1959         if (data[0] != WACOM_REPORT_USB)
1960                 return 0;
1961
1962         if (features->type == INTUOSHT &&
1963             wacom_wac->shared->touch_input &&
1964             features->touch_max) {
1965                 input_report_switch(wacom_wac->shared->touch_input,
1966                                     SW_MUTE_DEVICE, data[8] & 0x40);
1967                 input_sync(wacom_wac->shared->touch_input);
1968         }
1969
1970         if (data[9] & 0x02) { /* wireless module is attached */
1971                 int battery = (data[8] & 0x3f) * 100 / 31;
1972                 bool ps_connected = !!(data[8] & 0x80);
1973                 bool charging = ps_connected &&
1974                                 wacom_wac->battery_capacity < 100;
1975
1976                 wacom_notify_battery(wacom_wac, battery, charging,
1977                                      ps_connected);
1978
1979                 if (!wacom->battery.dev &&
1980                     !(features->quirks & WACOM_QUIRK_BATTERY)) {
1981                         features->quirks |= WACOM_QUIRK_BATTERY;
1982                         INIT_WORK(&wacom->work, wacom_battery_work);
1983                         wacom_schedule_work(wacom_wac);
1984                 }
1985         }
1986         else if ((features->quirks & WACOM_QUIRK_BATTERY) &&
1987                  wacom->battery.dev) {
1988                 features->quirks &= ~WACOM_QUIRK_BATTERY;
1989                 INIT_WORK(&wacom->work, wacom_battery_work);
1990                 wacom_schedule_work(wacom_wac);
1991                 wacom_notify_battery(wacom_wac, 0, 0, 0);
1992         }
1993         return 0;
1994 }
1995
1996 void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len)
1997 {
1998         bool sync;
1999
2000         switch (wacom_wac->features.type) {
2001         case PENPARTNER:
2002                 sync = wacom_penpartner_irq(wacom_wac);
2003                 break;
2004
2005         case PL:
2006                 sync = wacom_pl_irq(wacom_wac);
2007                 break;
2008
2009         case WACOM_G4:
2010         case GRAPHIRE:
2011         case GRAPHIRE_BT:
2012         case WACOM_MO:
2013                 sync = wacom_graphire_irq(wacom_wac);
2014                 break;
2015
2016         case PTU:
2017                 sync = wacom_ptu_irq(wacom_wac);
2018                 break;
2019
2020         case DTU:
2021                 sync = wacom_dtu_irq(wacom_wac);
2022                 break;
2023
2024         case DTUS:
2025         case DTUSX:
2026                 sync = wacom_dtus_irq(wacom_wac);
2027                 break;
2028
2029         case INTUOS:
2030         case INTUOS3S:
2031         case INTUOS3:
2032         case INTUOS3L:
2033         case INTUOS4S:
2034         case INTUOS4:
2035         case INTUOS4L:
2036         case CINTIQ:
2037         case WACOM_BEE:
2038         case WACOM_13HD:
2039         case WACOM_21UX2:
2040         case WACOM_22HD:
2041         case WACOM_24HD:
2042         case WACOM_27QHD:
2043         case DTK:
2044         case CINTIQ_HYBRID:
2045                 sync = wacom_intuos_irq(wacom_wac);
2046                 break;
2047
2048         case INTUOS4WL:
2049                 sync = wacom_intuos_bt_irq(wacom_wac, len);
2050                 break;
2051
2052         case WACOM_24HDT:
2053         case WACOM_27QHDT:
2054                 sync = wacom_24hdt_irq(wacom_wac);
2055                 break;
2056
2057         case INTUOS5S:
2058         case INTUOS5:
2059         case INTUOS5L:
2060         case INTUOSPS:
2061         case INTUOSPM:
2062         case INTUOSPL:
2063                 if (len == WACOM_PKGLEN_BBTOUCH3)
2064                         sync = wacom_bpt3_touch(wacom_wac);
2065                 else if (wacom_wac->data[0] == WACOM_REPORT_USB)
2066                         sync = wacom_status_irq(wacom_wac, len);
2067                 else
2068                         sync = wacom_intuos_irq(wacom_wac);
2069                 break;
2070
2071         case TABLETPC:
2072         case TABLETPCE:
2073         case TABLETPC2FG:
2074         case MTSCREEN:
2075         case MTTPC:
2076         case MTTPC_B:
2077                 sync = wacom_tpc_irq(wacom_wac, len);
2078                 break;
2079
2080         case BAMBOO_PT:
2081         case INTUOSHT:
2082                 if (wacom_wac->data[0] == WACOM_REPORT_USB)
2083                         sync = wacom_status_irq(wacom_wac, len);
2084                 else
2085                         sync = wacom_bpt_irq(wacom_wac, len);
2086                 break;
2087
2088         case BAMBOO_PAD:
2089                 sync = wacom_bamboo_pad_irq(wacom_wac, len);
2090                 break;
2091
2092         case WIRELESS:
2093                 sync = wacom_wireless_irq(wacom_wac, len);
2094                 break;
2095
2096         default:
2097                 sync = false;
2098                 break;
2099         }
2100
2101         if (sync) {
2102                 input_sync(wacom_wac->input);
2103                 if (wacom_wac->pad_input)
2104                         input_sync(wacom_wac->pad_input);
2105         }
2106 }
2107
2108 static void wacom_setup_cintiq(struct wacom_wac *wacom_wac)
2109 {
2110         struct input_dev *input_dev = wacom_wac->input;
2111
2112         input_set_capability(input_dev, EV_MSC, MSC_SERIAL);
2113
2114         __set_bit(BTN_TOOL_RUBBER, input_dev->keybit);
2115         __set_bit(BTN_TOOL_PEN, input_dev->keybit);
2116         __set_bit(BTN_TOOL_BRUSH, input_dev->keybit);
2117         __set_bit(BTN_TOOL_PENCIL, input_dev->keybit);
2118         __set_bit(BTN_TOOL_AIRBRUSH, input_dev->keybit);
2119         __set_bit(BTN_STYLUS, input_dev->keybit);
2120         __set_bit(BTN_STYLUS2, input_dev->keybit);
2121
2122         input_set_abs_params(input_dev, ABS_DISTANCE,
2123                              0, wacom_wac->features.distance_max, 0, 0);
2124         input_set_abs_params(input_dev, ABS_WHEEL, 0, 1023, 0, 0);
2125         input_set_abs_params(input_dev, ABS_TILT_X, -64, 63, 0, 0);
2126         input_abs_set_res(input_dev, ABS_TILT_X, 57);
2127         input_set_abs_params(input_dev, ABS_TILT_Y, -64, 63, 0, 0);
2128         input_abs_set_res(input_dev, ABS_TILT_Y, 57);
2129 }
2130
2131 static void wacom_setup_intuos(struct wacom_wac *wacom_wac)
2132 {
2133         struct input_dev *input_dev = wacom_wac->input;
2134
2135         input_set_capability(input_dev, EV_REL, REL_WHEEL);
2136
2137         wacom_setup_cintiq(wacom_wac);
2138
2139         __set_bit(BTN_LEFT, input_dev->keybit);
2140         __set_bit(BTN_RIGHT, input_dev->keybit);
2141         __set_bit(BTN_MIDDLE, input_dev->keybit);
2142         __set_bit(BTN_SIDE, input_dev->keybit);
2143         __set_bit(BTN_EXTRA, input_dev->keybit);
2144         __set_bit(BTN_TOOL_MOUSE, input_dev->keybit);
2145         __set_bit(BTN_TOOL_LENS, input_dev->keybit);
2146
2147         input_set_abs_params(input_dev, ABS_RZ, -900, 899, 0, 0);
2148         input_abs_set_res(input_dev, ABS_RZ, 287);
2149         input_set_abs_params(input_dev, ABS_THROTTLE, -1023, 1023, 0, 0);
2150 }
2151
2152 void wacom_setup_device_quirks(struct wacom_features *features)
2153 {
2154
2155         /* touch device found but size is not defined. use default */
2156         if (features->device_type == BTN_TOOL_FINGER && !features->x_max) {
2157                 features->x_max = 1023;
2158                 features->y_max = 1023;
2159         }
2160
2161         /* these device have multiple inputs */
2162         if (features->type >= WIRELESS ||
2163             (features->type >= INTUOS5S && features->type <= INTUOSHT) ||
2164             (features->oVid && features->oPid))
2165                 features->quirks |= WACOM_QUIRK_MULTI_INPUT;
2166
2167         /* quirk for bamboo touch with 2 low res touches */
2168         if (features->type == BAMBOO_PT &&
2169             features->pktlen == WACOM_PKGLEN_BBTOUCH) {
2170                 features->x_max <<= 5;
2171                 features->y_max <<= 5;
2172                 features->x_fuzz <<= 5;
2173                 features->y_fuzz <<= 5;
2174                 features->quirks |= WACOM_QUIRK_BBTOUCH_LOWRES;
2175         }
2176
2177         if (features->type == WIRELESS) {
2178
2179                 /* monitor never has input and pen/touch have delayed create */
2180                 features->quirks |= WACOM_QUIRK_NO_INPUT;
2181
2182                 /* must be monitor interface if no device_type set */
2183                 if (!features->device_type) {
2184                         features->quirks |= WACOM_QUIRK_MONITOR;
2185                         features->quirks |= WACOM_QUIRK_BATTERY;
2186                 }
2187         }
2188 }
2189
2190 static void wacom_abs_set_axis(struct input_dev *input_dev,
2191                                struct wacom_wac *wacom_wac)
2192 {
2193         struct wacom_features *features = &wacom_wac->features;
2194
2195         if (features->device_type == BTN_TOOL_PEN) {
2196                 input_set_abs_params(input_dev, ABS_X, features->x_min,
2197                                      features->x_max, features->x_fuzz, 0);
2198                 input_set_abs_params(input_dev, ABS_Y, features->y_min,
2199                                      features->y_max, features->y_fuzz, 0);
2200                 input_set_abs_params(input_dev, ABS_PRESSURE, 0,
2201                         features->pressure_max, features->pressure_fuzz, 0);
2202
2203                 /* penabled devices have fixed resolution for each model */
2204                 input_abs_set_res(input_dev, ABS_X, features->x_resolution);
2205                 input_abs_set_res(input_dev, ABS_Y, features->y_resolution);
2206         } else {
2207                 if (features->touch_max == 1) {
2208                         input_set_abs_params(input_dev, ABS_X, 0,
2209                                 features->x_max, features->x_fuzz, 0);
2210                         input_set_abs_params(input_dev, ABS_Y, 0,
2211                                 features->y_max, features->y_fuzz, 0);
2212                         input_abs_set_res(input_dev, ABS_X,
2213                                           features->x_resolution);
2214                         input_abs_set_res(input_dev, ABS_Y,
2215                                           features->y_resolution);
2216                 }
2217
2218                 if (features->touch_max > 1) {
2219                         input_set_abs_params(input_dev, ABS_MT_POSITION_X, 0,
2220                                 features->x_max, features->x_fuzz, 0);
2221                         input_set_abs_params(input_dev, ABS_MT_POSITION_Y, 0,
2222                                 features->y_max, features->y_fuzz, 0);
2223                         input_abs_set_res(input_dev, ABS_MT_POSITION_X,
2224                                           features->x_resolution);
2225                         input_abs_set_res(input_dev, ABS_MT_POSITION_Y,
2226                                           features->y_resolution);
2227                 }
2228         }
2229 }
2230
2231 int wacom_setup_pentouch_input_capabilities(struct input_dev *input_dev,
2232                                    struct wacom_wac *wacom_wac)
2233 {
2234         struct wacom_features *features = &wacom_wac->features;
2235
2236         input_dev->evbit[0] |= BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);
2237
2238         if (features->type == HID_GENERIC)
2239                 /* setup has already been done */
2240                 return 0;
2241
2242         __set_bit(BTN_TOUCH, input_dev->keybit);
2243         __set_bit(ABS_MISC, input_dev->absbit);
2244
2245         wacom_abs_set_axis(input_dev, wacom_wac);
2246
2247         switch (features->type) {
2248         case GRAPHIRE_BT:
2249                 __clear_bit(ABS_MISC, input_dev->absbit);
2250
2251         case WACOM_MO:
2252         case WACOM_G4:
2253                 input_set_abs_params(input_dev, ABS_DISTANCE, 0,
2254                                               features->distance_max,
2255                                               0, 0);
2256                 /* fall through */
2257
2258         case GRAPHIRE:
2259                 input_set_capability(input_dev, EV_REL, REL_WHEEL);
2260
2261                 __set_bit(BTN_LEFT, input_dev->keybit);
2262                 __set_bit(BTN_RIGHT, input_dev->keybit);
2263                 __set_bit(BTN_MIDDLE, input_dev->keybit);
2264
2265                 __set_bit(BTN_TOOL_RUBBER, input_dev->keybit);
2266                 __set_bit(BTN_TOOL_PEN, input_dev->keybit);
2267                 __set_bit(BTN_TOOL_MOUSE, input_dev->keybit);
2268                 __set_bit(BTN_STYLUS, input_dev->keybit);
2269                 __set_bit(BTN_STYLUS2, input_dev->keybit);
2270
2271                 __set_bit(INPUT_PROP_POINTER, input_dev->propbit);
2272                 break;
2273
2274         case WACOM_27QHD:
2275         case WACOM_24HD:
2276         case DTK:
2277         case WACOM_22HD:
2278         case WACOM_21UX2:
2279         case WACOM_BEE:
2280         case CINTIQ:
2281         case WACOM_13HD:
2282         case CINTIQ_HYBRID:
2283                 input_set_abs_params(input_dev, ABS_Z, -900, 899, 0, 0);
2284                 input_abs_set_res(input_dev, ABS_Z, 287);
2285                 __set_bit(INPUT_PROP_DIRECT, input_dev->propbit);
2286                 wacom_setup_cintiq(wacom_wac);
2287                 break;
2288
2289         case INTUOS3:
2290         case INTUOS3L:
2291         case INTUOS3S:
2292         case INTUOS4:
2293         case INTUOS4WL:
2294         case INTUOS4L:
2295         case INTUOS4S:
2296                 input_set_abs_params(input_dev, ABS_Z, -900, 899, 0, 0);
2297                 input_abs_set_res(input_dev, ABS_Z, 287);
2298                 /* fall through */
2299
2300         case INTUOS:
2301                 __set_bit(INPUT_PROP_POINTER, input_dev->propbit);
2302
2303                 wacom_setup_intuos(wacom_wac);
2304                 break;
2305
2306         case INTUOS5:
2307         case INTUOS5L:
2308         case INTUOSPM:
2309         case INTUOSPL:
2310         case INTUOS5S:
2311         case INTUOSPS:
2312                 __set_bit(INPUT_PROP_POINTER, input_dev->propbit);
2313
2314                 if (features->device_type == BTN_TOOL_PEN) {
2315                         input_set_abs_params(input_dev, ABS_DISTANCE, 0,
2316                                               features->distance_max,
2317                                               0, 0);
2318
2319                         input_set_abs_params(input_dev, ABS_Z, -900, 899, 0, 0);
2320                         input_abs_set_res(input_dev, ABS_Z, 287);
2321
2322                         wacom_setup_intuos(wacom_wac);
2323                 } else if (features->device_type == BTN_TOOL_FINGER) {
2324                         __clear_bit(ABS_MISC, input_dev->absbit);
2325
2326                         input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR,
2327                                              0, features->x_max, 0, 0);
2328                         input_set_abs_params(input_dev, ABS_MT_TOUCH_MINOR,
2329                                              0, features->y_max, 0, 0);
2330                         input_mt_init_slots(input_dev, features->touch_max, INPUT_MT_POINTER);
2331                 }
2332                 break;
2333
2334         case WACOM_24HDT:
2335                 if (features->device_type == BTN_TOOL_FINGER) {
2336                         input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR, 0, features->x_max, 0, 0);
2337                         input_set_abs_params(input_dev, ABS_MT_WIDTH_MAJOR, 0, features->x_max, 0, 0);
2338                         input_set_abs_params(input_dev, ABS_MT_WIDTH_MINOR, 0, features->y_max, 0, 0);
2339                         input_set_abs_params(input_dev, ABS_MT_ORIENTATION, 0, 1, 0, 0);
2340                 }
2341                 /* fall through */
2342
2343         case WACOM_27QHDT:
2344         case MTSCREEN:
2345         case MTTPC:
2346         case MTTPC_B:
2347         case TABLETPC2FG:
2348                 if (features->device_type == BTN_TOOL_FINGER && features->touch_max > 1)
2349                         input_mt_init_slots(input_dev, features->touch_max, INPUT_MT_DIRECT);
2350                 /* fall through */
2351
2352         case TABLETPC:
2353         case TABLETPCE:
2354                 __clear_bit(ABS_MISC, input_dev->absbit);
2355
2356                 __set_bit(INPUT_PROP_DIRECT, input_dev->propbit);
2357
2358                 if (features->device_type != BTN_TOOL_PEN)
2359                         break;  /* no need to process stylus stuff */
2360
2361                 /* fall through */
2362
2363         case DTUS:
2364         case DTUSX:
2365         case PL:
2366         case DTU:
2367                 __set_bit(BTN_TOOL_PEN, input_dev->keybit);
2368                 __set_bit(BTN_TOOL_RUBBER, input_dev->keybit);
2369                 __set_bit(BTN_STYLUS, input_dev->keybit);
2370                 __set_bit(BTN_STYLUS2, input_dev->keybit);
2371
2372                 __set_bit(INPUT_PROP_DIRECT, input_dev->propbit);
2373                 break;
2374
2375         case PTU:
2376                 __set_bit(BTN_STYLUS2, input_dev->keybit);
2377                 /* fall through */
2378
2379         case PENPARTNER:
2380                 __set_bit(BTN_TOOL_PEN, input_dev->keybit);
2381                 __set_bit(BTN_TOOL_RUBBER, input_dev->keybit);
2382                 __set_bit(BTN_STYLUS, input_dev->keybit);
2383
2384                 __set_bit(INPUT_PROP_POINTER, input_dev->propbit);
2385                 break;
2386
2387         case INTUOSHT:
2388                 if (features->touch_max &&
2389                     features->device_type == BTN_TOOL_FINGER) {
2390                         input_dev->evbit[0] |= BIT_MASK(EV_SW);
2391                         __set_bit(SW_MUTE_DEVICE, input_dev->swbit);
2392                 }
2393                 /* fall through */
2394
2395         case BAMBOO_PT:
2396                 __clear_bit(ABS_MISC, input_dev->absbit);
2397
2398                 if (features->device_type == BTN_TOOL_FINGER) {
2399
2400                         if (features->touch_max) {
2401                                 if (features->pktlen == WACOM_PKGLEN_BBTOUCH3) {
2402                                         input_set_abs_params(input_dev,
2403                                                      ABS_MT_TOUCH_MAJOR,
2404                                                      0, features->x_max, 0, 0);
2405                                         input_set_abs_params(input_dev,
2406                                                      ABS_MT_TOUCH_MINOR,
2407                                                      0, features->y_max, 0, 0);
2408                                 }
2409                                 input_mt_init_slots(input_dev, features->touch_max, INPUT_MT_POINTER);
2410                         } else {
2411                                 /* buttons/keys only interface */
2412                                 __clear_bit(ABS_X, input_dev->absbit);
2413                                 __clear_bit(ABS_Y, input_dev->absbit);
2414                                 __clear_bit(BTN_TOUCH, input_dev->keybit);
2415
2416                                 /* PAD is setup by wacom_setup_pad_input_capabilities later */
2417                                 return 1;
2418                         }
2419                 } else if (features->device_type == BTN_TOOL_PEN) {
2420                         __set_bit(INPUT_PROP_POINTER, input_dev->propbit);
2421                         __set_bit(BTN_TOOL_RUBBER, input_dev->keybit);
2422                         __set_bit(BTN_TOOL_PEN, input_dev->keybit);
2423                         __set_bit(BTN_STYLUS, input_dev->keybit);
2424                         __set_bit(BTN_STYLUS2, input_dev->keybit);
2425                         input_set_abs_params(input_dev, ABS_DISTANCE, 0,
2426                                               features->distance_max,
2427                                               0, 0);
2428                 }
2429                 break;
2430         case BAMBOO_PAD:
2431                 __clear_bit(ABS_MISC, input_dev->absbit);
2432                 input_mt_init_slots(input_dev, features->touch_max,
2433                                     INPUT_MT_POINTER);
2434                 __set_bit(BTN_LEFT, input_dev->keybit);
2435                 __set_bit(BTN_RIGHT, input_dev->keybit);
2436                 break;
2437         }
2438         return 0;
2439 }
2440
2441 int wacom_setup_pad_input_capabilities(struct input_dev *input_dev,
2442                                    struct wacom_wac *wacom_wac)
2443 {
2444         struct wacom_features *features = &wacom_wac->features;
2445         int i;
2446
2447         input_dev->evbit[0] |= BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);
2448
2449         /* kept for making legacy xf86-input-wacom working with the wheels */
2450         __set_bit(ABS_MISC, input_dev->absbit);
2451
2452         /* kept for making legacy xf86-input-wacom accepting the pad */
2453         input_set_abs_params(input_dev, ABS_X, 0, 1, 0, 0);
2454         input_set_abs_params(input_dev, ABS_Y, 0, 1, 0, 0);
2455
2456         /* kept for making udev and libwacom accepting the pad */
2457         __set_bit(BTN_STYLUS, input_dev->keybit);
2458
2459         switch (features->type) {
2460         case GRAPHIRE_BT:
2461                 __set_bit(BTN_0, input_dev->keybit);
2462                 __set_bit(BTN_1, input_dev->keybit);
2463                 break;
2464
2465         case WACOM_MO:
2466                 __set_bit(BTN_BACK, input_dev->keybit);
2467                 __set_bit(BTN_LEFT, input_dev->keybit);
2468                 __set_bit(BTN_FORWARD, input_dev->keybit);
2469                 __set_bit(BTN_RIGHT, input_dev->keybit);
2470                 input_set_abs_params(input_dev, ABS_WHEEL, 0, 71, 0, 0);
2471                 break;
2472
2473         case WACOM_G4:
2474                 __set_bit(BTN_BACK, input_dev->keybit);
2475                 __set_bit(BTN_FORWARD, input_dev->keybit);
2476                 input_set_capability(input_dev, EV_REL, REL_WHEEL);
2477                 break;
2478
2479         case WACOM_24HD:
2480                 __set_bit(BTN_A, input_dev->keybit);
2481                 __set_bit(BTN_B, input_dev->keybit);
2482                 __set_bit(BTN_C, input_dev->keybit);
2483                 __set_bit(BTN_X, input_dev->keybit);
2484                 __set_bit(BTN_Y, input_dev->keybit);
2485                 __set_bit(BTN_Z, input_dev->keybit);
2486
2487                 for (i = 0; i < 10; i++)
2488                         __set_bit(BTN_0 + i, input_dev->keybit);
2489
2490                 __set_bit(KEY_PROG1, input_dev->keybit);
2491                 __set_bit(KEY_PROG2, input_dev->keybit);
2492                 __set_bit(KEY_PROG3, input_dev->keybit);
2493
2494                 input_set_abs_params(input_dev, ABS_WHEEL, 0, 71, 0, 0);
2495                 input_set_abs_params(input_dev, ABS_THROTTLE, 0, 71, 0, 0);
2496                 break;
2497
2498         case WACOM_27QHD:
2499                 __set_bit(KEY_PROG1, input_dev->keybit);
2500                 __set_bit(KEY_PROG2, input_dev->keybit);
2501                 __set_bit(KEY_PROG3, input_dev->keybit);
2502                 input_set_abs_params(input_dev, ABS_X, -2048, 2048, 0, 0);
2503                 input_abs_set_res(input_dev, ABS_X, 1024); /* points/g */
2504                 input_set_abs_params(input_dev, ABS_Y, -2048, 2048, 0, 0);
2505                 input_abs_set_res(input_dev, ABS_Y, 1024);
2506                 input_set_abs_params(input_dev, ABS_Z, -2048, 2048, 0, 0);
2507                 input_abs_set_res(input_dev, ABS_Z, 1024);
2508                 __set_bit(INPUT_PROP_ACCELEROMETER, input_dev->propbit);
2509                 break;
2510
2511         case DTK:
2512                 for (i = 0; i < 6; i++)
2513                         __set_bit(BTN_0 + i, input_dev->keybit);
2514
2515                 break;
2516
2517         case WACOM_22HD:
2518                 __set_bit(KEY_PROG1, input_dev->keybit);
2519                 __set_bit(KEY_PROG2, input_dev->keybit);
2520                 __set_bit(KEY_PROG3, input_dev->keybit);
2521                 /* fall through */
2522
2523         case WACOM_21UX2:
2524                 __set_bit(BTN_A, input_dev->keybit);
2525                 __set_bit(BTN_B, input_dev->keybit);
2526                 __set_bit(BTN_C, input_dev->keybit);
2527                 __set_bit(BTN_X, input_dev->keybit);
2528                 __set_bit(BTN_Y, input_dev->keybit);
2529                 __set_bit(BTN_Z, input_dev->keybit);
2530                 __set_bit(BTN_BASE, input_dev->keybit);
2531                 __set_bit(BTN_BASE2, input_dev->keybit);
2532                 /* fall through */
2533
2534         case WACOM_BEE:
2535                 __set_bit(BTN_8, input_dev->keybit);
2536                 __set_bit(BTN_9, input_dev->keybit);
2537                 /* fall through */
2538
2539         case CINTIQ:
2540                 for (i = 0; i < 8; i++)
2541                         __set_bit(BTN_0 + i, input_dev->keybit);
2542
2543                 input_set_abs_params(input_dev, ABS_RX, 0, 4096, 0, 0);
2544                 input_set_abs_params(input_dev, ABS_RY, 0, 4096, 0, 0);
2545                 break;
2546
2547         case WACOM_13HD:
2548                 for (i = 0; i < 9; i++)
2549                         __set_bit(BTN_0 + i, input_dev->keybit);
2550
2551                 input_set_abs_params(input_dev, ABS_WHEEL, 0, 71, 0, 0);
2552                 break;
2553
2554         case INTUOS3:
2555         case INTUOS3L:
2556                 __set_bit(BTN_4, input_dev->keybit);
2557                 __set_bit(BTN_5, input_dev->keybit);
2558                 __set_bit(BTN_6, input_dev->keybit);
2559                 __set_bit(BTN_7, input_dev->keybit);
2560
2561                 input_set_abs_params(input_dev, ABS_RY, 0, 4096, 0, 0);
2562                 /* fall through */
2563
2564         case INTUOS3S:
2565                 __set_bit(BTN_0, input_dev->keybit);
2566                 __set_bit(BTN_1, input_dev->keybit);
2567                 __set_bit(BTN_2, input_dev->keybit);
2568                 __set_bit(BTN_3, input_dev->keybit);
2569
2570                 input_set_abs_params(input_dev, ABS_RX, 0, 4096, 0, 0);
2571                 break;
2572
2573         case INTUOS5:
2574         case INTUOS5L:
2575         case INTUOSPM:
2576         case INTUOSPL:
2577                 __set_bit(BTN_7, input_dev->keybit);
2578                 __set_bit(BTN_8, input_dev->keybit);
2579                 /* fall through */
2580
2581         case INTUOS5S:
2582         case INTUOSPS:
2583                 /* touch interface does not have the pad device */
2584                 if (features->device_type != BTN_TOOL_PEN)
2585                         return -ENODEV;
2586
2587                 for (i = 0; i < 7; i++)
2588                         __set_bit(BTN_0 + i, input_dev->keybit);
2589
2590                 input_set_abs_params(input_dev, ABS_WHEEL, 0, 71, 0, 0);
2591                 break;
2592
2593         case INTUOS4WL:
2594                 /*
2595                  * For Bluetooth devices, the udev rule does not work correctly
2596                  * for pads unless we add a stylus capability, which forces
2597                  * ID_INPUT_TABLET to be set.
2598                  */
2599                 __set_bit(BTN_STYLUS, input_dev->keybit);
2600                 /* fall through */
2601
2602         case INTUOS4:
2603         case INTUOS4L:
2604                 __set_bit(BTN_7, input_dev->keybit);
2605                 __set_bit(BTN_8, input_dev->keybit);
2606                 /* fall through */
2607
2608         case INTUOS4S:
2609                 for (i = 0; i < 7; i++)
2610                         __set_bit(BTN_0 + i, input_dev->keybit);
2611
2612                 input_set_abs_params(input_dev, ABS_WHEEL, 0, 71, 0, 0);
2613                 break;
2614
2615         case CINTIQ_HYBRID:
2616                 for (i = 0; i < 9; i++)
2617                         __set_bit(BTN_0 + i, input_dev->keybit);
2618
2619                 break;
2620
2621         case DTUS:
2622                 for (i = 0; i < 4; i++)
2623                         __set_bit(BTN_0 + i, input_dev->keybit);
2624                 break;
2625
2626         case INTUOSHT:
2627         case BAMBOO_PT:
2628                 /* pad device is on the touch interface */
2629                 if ((features->device_type != BTN_TOOL_FINGER) ||
2630                     /* Bamboo Pen only tablet does not have pad */
2631                     ((features->type == BAMBOO_PT) && !features->touch_max))
2632                         return -ENODEV;
2633
2634                 __clear_bit(ABS_MISC, input_dev->absbit);
2635
2636                 __set_bit(BTN_LEFT, input_dev->keybit);
2637                 __set_bit(BTN_FORWARD, input_dev->keybit);
2638                 __set_bit(BTN_BACK, input_dev->keybit);
2639                 __set_bit(BTN_RIGHT, input_dev->keybit);
2640
2641                 break;
2642
2643         default:
2644                 /* no pad supported */
2645                 return -ENODEV;
2646         }
2647         return 0;
2648 }
2649
2650 static const struct wacom_features wacom_features_0x00 =
2651         { "Wacom Penpartner", 5040, 3780, 255, 0,
2652           PENPARTNER, WACOM_PENPRTN_RES, WACOM_PENPRTN_RES };
2653 static const struct wacom_features wacom_features_0x10 =
2654         { "Wacom Graphire", 10206, 7422, 511, 63,
2655           GRAPHIRE, WACOM_GRAPHIRE_RES, WACOM_GRAPHIRE_RES };
2656 static const struct wacom_features wacom_features_0x81 =
2657         { "Wacom Graphire BT", 16704, 12064, 511, 32,
2658           GRAPHIRE_BT, WACOM_GRAPHIRE_RES, WACOM_GRAPHIRE_RES };
2659 static const struct wacom_features wacom_features_0x11 =
2660         { "Wacom Graphire2 4x5", 10206, 7422, 511, 63,
2661           GRAPHIRE, WACOM_GRAPHIRE_RES, WACOM_GRAPHIRE_RES };
2662 static const struct wacom_features wacom_features_0x12 =
2663         { "Wacom Graphire2 5x7", 13918, 10206, 511, 63,
2664           GRAPHIRE, WACOM_GRAPHIRE_RES, WACOM_GRAPHIRE_RES };
2665 static const struct wacom_features wacom_features_0x13 =
2666         { "Wacom Graphire3", 10208, 7424, 511, 63,
2667           GRAPHIRE, WACOM_GRAPHIRE_RES, WACOM_GRAPHIRE_RES };
2668 static const struct wacom_features wacom_features_0x14 =
2669         { "Wacom Graphire3 6x8", 16704, 12064, 511, 63,
2670           GRAPHIRE, WACOM_GRAPHIRE_RES, WACOM_GRAPHIRE_RES };
2671 static const struct wacom_features wacom_features_0x15 =
2672         { "Wacom Graphire4 4x5", 10208, 7424, 511, 63,
2673           WACOM_G4, WACOM_GRAPHIRE_RES, WACOM_GRAPHIRE_RES };
2674 static const struct wacom_features wacom_features_0x16 =
2675         { "Wacom Graphire4 6x8", 16704, 12064, 511, 63,
2676           WACOM_G4, WACOM_GRAPHIRE_RES, WACOM_GRAPHIRE_RES };
2677 static const struct wacom_features wacom_features_0x17 =
2678         { "Wacom BambooFun 4x5", 14760, 9225, 511, 63,
2679           WACOM_MO, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2680 static const struct wacom_features wacom_features_0x18 =
2681         { "Wacom BambooFun 6x8", 21648, 13530, 511, 63,
2682           WACOM_MO, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2683 static const struct wacom_features wacom_features_0x19 =
2684         { "Wacom Bamboo1 Medium", 16704, 12064, 511, 63,
2685           GRAPHIRE, WACOM_GRAPHIRE_RES, WACOM_GRAPHIRE_RES };
2686 static const struct wacom_features wacom_features_0x60 =
2687         { "Wacom Volito", 5104, 3712, 511, 63,
2688           GRAPHIRE, WACOM_VOLITO_RES, WACOM_VOLITO_RES };
2689 static const struct wacom_features wacom_features_0x61 =
2690         { "Wacom PenStation2", 3250, 2320, 255, 63,
2691           GRAPHIRE, WACOM_VOLITO_RES, WACOM_VOLITO_RES };
2692 static const struct wacom_features wacom_features_0x62 =
2693         { "Wacom Volito2 4x5", 5104, 3712, 511, 63,
2694           GRAPHIRE, WACOM_VOLITO_RES, WACOM_VOLITO_RES };
2695 static const struct wacom_features wacom_features_0x63 =
2696         { "Wacom Volito2 2x3", 3248, 2320, 511, 63,
2697           GRAPHIRE, WACOM_VOLITO_RES, WACOM_VOLITO_RES };
2698 static const struct wacom_features wacom_features_0x64 =
2699         { "Wacom PenPartner2", 3250, 2320, 511, 63,
2700           GRAPHIRE, WACOM_VOLITO_RES, WACOM_VOLITO_RES };
2701 static const struct wacom_features wacom_features_0x65 =
2702         { "Wacom Bamboo", 14760, 9225, 511, 63,
2703           WACOM_MO, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2704 static const struct wacom_features wacom_features_0x69 =
2705         { "Wacom Bamboo1", 5104, 3712, 511, 63,
2706           GRAPHIRE, WACOM_PENPRTN_RES, WACOM_PENPRTN_RES };
2707 static const struct wacom_features wacom_features_0x6A =
2708         { "Wacom Bamboo1 4x6", 14760, 9225, 1023, 63,
2709           GRAPHIRE, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2710 static const struct wacom_features wacom_features_0x6B =
2711         { "Wacom Bamboo1 5x8", 21648, 13530, 1023, 63,
2712           GRAPHIRE, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2713 static const struct wacom_features wacom_features_0x20 =
2714         { "Wacom Intuos 4x5", 12700, 10600, 1023, 31,
2715           INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2716 static const struct wacom_features wacom_features_0x21 =
2717         { "Wacom Intuos 6x8", 20320, 16240, 1023, 31,
2718           INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2719 static const struct wacom_features wacom_features_0x22 =
2720         { "Wacom Intuos 9x12", 30480, 24060, 1023, 31,
2721           INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2722 static const struct wacom_features wacom_features_0x23 =
2723         { "Wacom Intuos 12x12", 30480, 31680, 1023, 31,
2724           INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2725 static const struct wacom_features wacom_features_0x24 =
2726         { "Wacom Intuos 12x18", 45720, 31680, 1023, 31,
2727           INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2728 static const struct wacom_features wacom_features_0x30 =
2729         { "Wacom PL400", 5408, 4056, 255, 0,
2730           PL, WACOM_PL_RES, WACOM_PL_RES };
2731 static const struct wacom_features wacom_features_0x31 =
2732         { "Wacom PL500", 6144, 4608, 255, 0,
2733           PL, WACOM_PL_RES, WACOM_PL_RES };
2734 static const struct wacom_features wacom_features_0x32 =
2735         { "Wacom PL600", 6126, 4604, 255, 0,
2736           PL, WACOM_PL_RES, WACOM_PL_RES };
2737 static const struct wacom_features wacom_features_0x33 =
2738         { "Wacom PL600SX", 6260, 5016, 255, 0,
2739           PL, WACOM_PL_RES, WACOM_PL_RES };
2740 static const struct wacom_features wacom_features_0x34 =
2741         { "Wacom PL550", 6144, 4608, 511, 0,
2742           PL, WACOM_PL_RES, WACOM_PL_RES };
2743 static const struct wacom_features wacom_features_0x35 =
2744         { "Wacom PL800", 7220, 5780, 511, 0,
2745           PL, WACOM_PL_RES, WACOM_PL_RES };
2746 static const struct wacom_features wacom_features_0x37 =
2747         { "Wacom PL700", 6758, 5406, 511, 0,
2748           PL, WACOM_PL_RES, WACOM_PL_RES };
2749 static const struct wacom_features wacom_features_0x38 =
2750         { "Wacom PL510", 6282, 4762, 511, 0,
2751           PL, WACOM_PL_RES, WACOM_PL_RES };
2752 static const struct wacom_features wacom_features_0x39 =
2753         { "Wacom DTU710", 34080, 27660, 511, 0,
2754           PL, WACOM_PL_RES, WACOM_PL_RES };
2755 static const struct wacom_features wacom_features_0xC4 =
2756         { "Wacom DTF521", 6282, 4762, 511, 0,
2757           PL, WACOM_PL_RES, WACOM_PL_RES };
2758 static const struct wacom_features wacom_features_0xC0 =
2759         { "Wacom DTF720", 6858, 5506, 511, 0,
2760           PL, WACOM_PL_RES, WACOM_PL_RES };
2761 static const struct wacom_features wacom_features_0xC2 =
2762         { "Wacom DTF720a", 6858, 5506, 511, 0,
2763           PL, WACOM_PL_RES, WACOM_PL_RES };
2764 static const struct wacom_features wacom_features_0x03 =
2765         { "Wacom Cintiq Partner", 20480, 15360, 511, 0,
2766           PTU, WACOM_PL_RES, WACOM_PL_RES };
2767 static const struct wacom_features wacom_features_0x41 =
2768         { "Wacom Intuos2 4x5", 12700, 10600, 1023, 31,
2769           INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2770 static const struct wacom_features wacom_features_0x42 =
2771         { "Wacom Intuos2 6x8", 20320, 16240, 1023, 31,
2772           INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2773 static const struct wacom_features wacom_features_0x43 =
2774         { "Wacom Intuos2 9x12", 30480, 24060, 1023, 31,
2775           INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2776 static const struct wacom_features wacom_features_0x44 =
2777         { "Wacom Intuos2 12x12", 30480, 31680, 1023, 31,
2778           INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2779 static const struct wacom_features wacom_features_0x45 =
2780         { "Wacom Intuos2 12x18", 45720, 31680, 1023, 31,
2781           INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2782 static const struct wacom_features wacom_features_0xB0 =
2783         { "Wacom Intuos3 4x5", 25400, 20320, 1023, 63,
2784           INTUOS3S, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES };
2785 static const struct wacom_features wacom_features_0xB1 =
2786         { "Wacom Intuos3 6x8", 40640, 30480, 1023, 63,
2787           INTUOS3, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES };
2788 static const struct wacom_features wacom_features_0xB2 =
2789         { "Wacom Intuos3 9x12", 60960, 45720, 1023, 63,
2790           INTUOS3, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES };
2791 static const struct wacom_features wacom_features_0xB3 =
2792         { "Wacom Intuos3 12x12", 60960, 60960, 1023, 63,
2793           INTUOS3L, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES };
2794 static const struct wacom_features wacom_features_0xB4 =
2795         { "Wacom Intuos3 12x19", 97536, 60960, 1023, 63,
2796           INTUOS3L, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES };
2797 static const struct wacom_features wacom_features_0xB5 =
2798         { "Wacom Intuos3 6x11", 54204, 31750, 1023, 63,
2799           INTUOS3, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES };
2800 static const struct wacom_features wacom_features_0xB7 =
2801         { "Wacom Intuos3 4x6", 31496, 19685, 1023, 63,
2802           INTUOS3S, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES };
2803 static const struct wacom_features wacom_features_0xB8 =
2804         { "Wacom Intuos4 4x6", 31496, 19685, 2047, 63,
2805           INTUOS4S, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES };
2806 static const struct wacom_features wacom_features_0xB9 =
2807         { "Wacom Intuos4 6x9", 44704, 27940, 2047, 63,
2808           INTUOS4, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES };
2809 static const struct wacom_features wacom_features_0xBA =
2810         { "Wacom Intuos4 8x13", 65024, 40640, 2047, 63,
2811           INTUOS4L, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES };
2812 static const struct wacom_features wacom_features_0xBB =
2813         { "Wacom Intuos4 12x19", 97536, 60960, 2047, 63,
2814           INTUOS4L, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES };
2815 static const struct wacom_features wacom_features_0xBC =
2816         { "Wacom Intuos4 WL", 40640, 25400, 2047, 63,
2817           INTUOS4, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES };
2818 static const struct wacom_features wacom_features_0xBD =
2819         { "Wacom Intuos4 WL", 40640, 25400, 2047, 63,
2820           INTUOS4WL, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES };
2821 static const struct wacom_features wacom_features_0x26 =
2822         { "Wacom Intuos5 touch S", 31496, 19685, 2047, 63,
2823           INTUOS5S, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, .touch_max = 16 };
2824 static const struct wacom_features wacom_features_0x27 =
2825         { "Wacom Intuos5 touch M", 44704, 27940, 2047, 63,
2826           INTUOS5, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, .touch_max = 16 };
2827 static const struct wacom_features wacom_features_0x28 =
2828         { "Wacom Intuos5 touch L", 65024, 40640, 2047, 63,
2829           INTUOS5L, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, .touch_max = 16 };
2830 static const struct wacom_features wacom_features_0x29 =
2831         { "Wacom Intuos5 S", 31496, 19685, 2047, 63,
2832           INTUOS5S, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES };
2833 static const struct wacom_features wacom_features_0x2A =
2834         { "Wacom Intuos5 M", 44704, 27940, 2047, 63,
2835           INTUOS5, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES };
2836 static const struct wacom_features wacom_features_0x314 =
2837         { "Wacom Intuos Pro S", 31496, 19685, 2047, 63,
2838           INTUOSPS, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, .touch_max = 16,
2839           .check_for_hid_type = true, .hid_type = HID_TYPE_USBNONE };
2840 static const struct wacom_features wacom_features_0x315 =
2841         { "Wacom Intuos Pro M", 44704, 27940, 2047, 63,
2842           INTUOSPM, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, .touch_max = 16,
2843           .check_for_hid_type = true, .hid_type = HID_TYPE_USBNONE };
2844 static const struct wacom_features wacom_features_0x317 =
2845         { "Wacom Intuos Pro L", 65024, 40640, 2047, 63,
2846           INTUOSPL, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, .touch_max = 16,
2847           .check_for_hid_type = true, .hid_type = HID_TYPE_USBNONE };
2848 static const struct wacom_features wacom_features_0xF4 =
2849         { "Wacom Cintiq 24HD", 104080, 65200, 2047, 63,
2850           WACOM_24HD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES,
2851           WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET };
2852 static const struct wacom_features wacom_features_0xF8 =
2853         { "Wacom Cintiq 24HD touch", 104080, 65200, 2047, 63, /* Pen */
2854           WACOM_24HD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES,
2855           WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET,
2856           .oVid = USB_VENDOR_ID_WACOM, .oPid = 0xf6 };
2857 static const struct wacom_features wacom_features_0xF6 =
2858         { "Wacom Cintiq 24HD touch", .type = WACOM_24HDT, /* Touch */
2859           .oVid = USB_VENDOR_ID_WACOM, .oPid = 0xf8, .touch_max = 10,
2860           .check_for_hid_type = true, .hid_type = HID_TYPE_USBNONE };
2861 static const struct wacom_features wacom_features_0x32A =
2862         { "Wacom Cintiq 27QHD", 119740, 67520, 2047,
2863           63, WACOM_27QHD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES,
2864           WACOM_27QHD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES };
2865 static const struct wacom_features wacom_features_0x32B =
2866         { "Wacom Cintiq 27QHD touch", 119740, 67520, 2047, 63,
2867           WACOM_27QHD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES,
2868           WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET,
2869           .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x32C };
2870 static const struct wacom_features wacom_features_0x32C =
2871         { "Wacom Cintiq 27QHD touch", .type = WACOM_27QHDT,
2872           .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x32B, .touch_max = 10 };
2873 static const struct wacom_features wacom_features_0x3F =
2874         { "Wacom Cintiq 21UX", 87200, 65600, 1023, 63,
2875           CINTIQ, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES };
2876 static const struct wacom_features wacom_features_0xC5 =
2877         { "Wacom Cintiq 20WSX", 86680, 54180, 1023, 63,
2878           WACOM_BEE, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES };
2879 static const struct wacom_features wacom_features_0xC6 =
2880         { "Wacom Cintiq 12WX", 53020, 33440, 1023, 63,
2881           WACOM_BEE, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES };
2882 static const struct wacom_features wacom_features_0x304 =
2883         { "Wacom Cintiq 13HD", 59152, 33448, 1023, 63,
2884           WACOM_13HD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES,
2885           WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET };
2886 static const struct wacom_features wacom_features_0xC7 =
2887         { "Wacom DTU1931", 37832, 30305, 511, 0,
2888           PL, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2889 static const struct wacom_features wacom_features_0xCE =
2890         { "Wacom DTU2231", 47864, 27011, 511, 0,
2891           DTU, WACOM_INTUOS_RES, WACOM_INTUOS_RES,
2892           .check_for_hid_type = true, .hid_type = HID_TYPE_USBMOUSE };
2893 static const struct wacom_features wacom_features_0xF0 =
2894         { "Wacom DTU1631", 34623, 19553, 511, 0,
2895           DTU, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2896 static const struct wacom_features wacom_features_0xFB =
2897         { "Wacom DTU1031", 21896, 13760, 511, 0,
2898           DTUS, WACOM_INTUOS_RES, WACOM_INTUOS_RES,
2899           WACOM_DTU_OFFSET, WACOM_DTU_OFFSET };
2900 static const struct wacom_features wacom_features_0x32F =
2901         { "Wacom DTU1031X", 22472, 12728, 511, 0,
2902           DTUSX, WACOM_INTUOS_RES, WACOM_INTUOS_RES,
2903           WACOM_DTU_OFFSET, WACOM_DTU_OFFSET };
2904 static const struct wacom_features wacom_features_0x57 =
2905         { "Wacom DTK2241", 95640, 54060, 2047, 63,
2906           DTK, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES,
2907           WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET };
2908 static const struct wacom_features wacom_features_0x59 = /* Pen */
2909         { "Wacom DTH2242", 95640, 54060, 2047, 63,
2910           DTK, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES,
2911           WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET,
2912           .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x5D };
2913 static const struct wacom_features wacom_features_0x5D = /* Touch */
2914         { "Wacom DTH2242",       .type = WACOM_24HDT,
2915           .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x59, .touch_max = 10,
2916           .check_for_hid_type = true, .hid_type = HID_TYPE_USBNONE };
2917 static const struct wacom_features wacom_features_0xCC =
2918         { "Wacom Cintiq 21UX2", 86800, 65200, 2047, 63,
2919           WACOM_21UX2, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES,
2920           WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET };
2921 static const struct wacom_features wacom_features_0xFA =
2922         { "Wacom Cintiq 22HD", 95440, 53860, 2047, 63,
2923           WACOM_22HD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES,
2924           WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET };
2925 static const struct wacom_features wacom_features_0x5B =
2926         { "Wacom Cintiq 22HDT", 95440, 53860, 2047, 63,
2927           WACOM_22HD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES,
2928           WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET,
2929           .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x5e };
2930 static const struct wacom_features wacom_features_0x5E =
2931         { "Wacom Cintiq 22HDT", .type = WACOM_24HDT,
2932           .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x5b, .touch_max = 10,
2933           .check_for_hid_type = true, .hid_type = HID_TYPE_USBNONE };
2934 static const struct wacom_features wacom_features_0x90 =
2935         { "Wacom ISDv4 90", 26202, 16325, 255, 0,
2936           TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2937 static const struct wacom_features wacom_features_0x93 =
2938         { "Wacom ISDv4 93", 26202, 16325, 255, 0,
2939           TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2940 static const struct wacom_features wacom_features_0x97 =
2941         { "Wacom ISDv4 97", 26202, 16325, 511, 0,
2942           TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2943 static const struct wacom_features wacom_features_0x9A =
2944         { "Wacom ISDv4 9A", 26202, 16325, 255, 0,
2945           TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2946 static const struct wacom_features wacom_features_0x9F =
2947         { "Wacom ISDv4 9F", 26202, 16325, 255, 0,
2948           TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2949 static const struct wacom_features wacom_features_0xE2 =
2950         { "Wacom ISDv4 E2", 26202, 16325, 255, 0,
2951           TABLETPC2FG, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 2 };
2952 static const struct wacom_features wacom_features_0xE3 =
2953         { "Wacom ISDv4 E3", 26202, 16325, 255, 0,
2954           TABLETPC2FG, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 2 };
2955 static const struct wacom_features wacom_features_0xE5 =
2956         { "Wacom ISDv4 E5", 26202, 16325, 255, 0,
2957           MTSCREEN, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2958 static const struct wacom_features wacom_features_0xE6 =
2959         { "Wacom ISDv4 E6", 27760, 15694, 255, 0,
2960           TABLETPC2FG, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 2 };
2961 static const struct wacom_features wacom_features_0xEC =
2962         { "Wacom ISDv4 EC", 25710, 14500, 255, 0,
2963           TABLETPC,    WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2964 static const struct wacom_features wacom_features_0xED =
2965         { "Wacom ISDv4 ED", 26202, 16325, 255, 0,
2966           TABLETPCE, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2967 static const struct wacom_features wacom_features_0xEF =
2968         { "Wacom ISDv4 EF", 26202, 16325, 255, 0,
2969           TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2970 static const struct wacom_features wacom_features_0x100 =
2971         { "Wacom ISDv4 100", 26202, 16325, 255, 0,
2972           MTTPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2973 static const struct wacom_features wacom_features_0x101 =
2974         { "Wacom ISDv4 101", 26202, 16325, 255, 0,
2975           MTTPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2976 static const struct wacom_features wacom_features_0x10D =
2977         { "Wacom ISDv4 10D", 26202, 16325, 255, 0,
2978           MTTPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2979 static const struct wacom_features wacom_features_0x10E =
2980         { "Wacom ISDv4 10E", 27760, 15694, 255, 0,
2981           MTTPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2982 static const struct wacom_features wacom_features_0x10F =
2983         { "Wacom ISDv4 10F", 27760, 15694, 255, 0,
2984           MTTPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2985 static const struct wacom_features wacom_features_0x116 =
2986         { "Wacom ISDv4 116", 26202, 16325, 255, 0,
2987           TABLETPCE, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2988 static const struct wacom_features wacom_features_0x12C =
2989         { "Wacom ISDv4 12C", 27848, 15752, 2047, 0,
2990           TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2991 static const struct wacom_features wacom_features_0x4001 =
2992         { "Wacom ISDv4 4001", 26202, 16325, 255, 0,
2993           MTTPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2994 static const struct wacom_features wacom_features_0x4004 =
2995         { "Wacom ISDv4 4004", 11060, 6220, 255, 0,
2996           MTTPC_B, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
2997 static const struct wacom_features wacom_features_0x5000 =
2998         { "Wacom ISDv4 5000", 27848, 15752, 1023, 0,
2999           MTTPC_B, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
3000 static const struct wacom_features wacom_features_0x5002 =
3001         { "Wacom ISDv4 5002", 29576, 16724, 1023, 0,
3002           MTTPC_B, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
3003 static const struct wacom_features wacom_features_0x47 =
3004         { "Wacom Intuos2 6x8", 20320, 16240, 1023, 31,
3005           INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
3006 static const struct wacom_features wacom_features_0x84 =
3007         { "Wacom Wireless Receiver", 0, 0, 0, 0,
3008           WIRELESS, 0, 0, .touch_max = 16 };
3009 static const struct wacom_features wacom_features_0xD0 =
3010         { "Wacom Bamboo 2FG", 14720, 9200, 1023, 31,
3011           BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 2 };
3012 static const struct wacom_features wacom_features_0xD1 =
3013         { "Wacom Bamboo 2FG 4x5", 14720, 9200, 1023, 31,
3014           BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 2 };
3015 static const struct wacom_features wacom_features_0xD2 =
3016         { "Wacom Bamboo Craft", 14720, 9200, 1023, 31,
3017           BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 2 };
3018 static const struct wacom_features wacom_features_0xD3 =
3019         { "Wacom Bamboo 2FG 6x8", 21648, 13700, 1023, 31,
3020           BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 2 };
3021 static const struct wacom_features wacom_features_0xD4 =
3022         { "Wacom Bamboo Pen", 14720, 9200, 1023, 31,
3023           BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
3024 static const struct wacom_features wacom_features_0xD5 =
3025         { "Wacom Bamboo Pen 6x8", 21648, 13700, 1023, 31,
3026           BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
3027 static const struct wacom_features wacom_features_0xD6 =
3028         { "Wacom BambooPT 2FG 4x5", 14720, 9200, 1023, 31,
3029           BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 2 };
3030 static const struct wacom_features wacom_features_0xD7 =
3031         { "Wacom BambooPT 2FG Small", 14720, 9200, 1023, 31,
3032           BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 2 };
3033 static const struct wacom_features wacom_features_0xD8 =
3034         { "Wacom Bamboo Comic 2FG", 21648, 13700, 1023, 31,
3035           BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 2 };
3036 static const struct wacom_features wacom_features_0xDA =
3037         { "Wacom Bamboo 2FG 4x5 SE", 14720, 9200, 1023, 31,
3038           BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 2 };
3039 static const struct wacom_features wacom_features_0xDB =
3040         { "Wacom Bamboo 2FG 6x8 SE", 21648, 13700, 1023, 31,
3041           BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 2 };
3042 static const struct wacom_features wacom_features_0xDD =
3043         { "Wacom Bamboo Connect", 14720, 9200, 1023, 31,
3044           BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
3045 static const struct wacom_features wacom_features_0xDE =
3046         { "Wacom Bamboo 16FG 4x5", 14720, 9200, 1023, 31,
3047           BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 16 };
3048 static const struct wacom_features wacom_features_0xDF =
3049         { "Wacom Bamboo 16FG 6x8", 21648, 13700, 1023, 31,
3050           BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 16 };
3051 static const struct wacom_features wacom_features_0x300 =
3052         { "Wacom Bamboo One S", 14720, 9225, 1023, 31,
3053           BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
3054 static const struct wacom_features wacom_features_0x301 =
3055         { "Wacom Bamboo One M", 21648, 13530, 1023, 31,
3056           BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
3057 static const struct wacom_features wacom_features_0x302 =
3058         { "Wacom Intuos PT S", 15200, 9500, 1023, 31,
3059           INTUOSHT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 16,
3060           .check_for_hid_type = true, .hid_type = HID_TYPE_USBNONE };
3061 static const struct wacom_features wacom_features_0x303 =
3062         { "Wacom Intuos PT M", 21600, 13500, 1023, 31,
3063           INTUOSHT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 16,
3064           .check_for_hid_type = true, .hid_type = HID_TYPE_USBNONE };
3065 static const struct wacom_features wacom_features_0x30E =
3066         { "Wacom Intuos S", 15200, 9500, 1023, 31,
3067           INTUOSHT, WACOM_INTUOS_RES, WACOM_INTUOS_RES,
3068           .check_for_hid_type = true, .hid_type = HID_TYPE_USBNONE };
3069 static const struct wacom_features wacom_features_0x6004 =
3070         { "ISD-V4", 12800, 8000, 255, 0,
3071           TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
3072 static const struct wacom_features wacom_features_0x307 =
3073         { "Wacom ISDv5 307", 59152, 33448, 2047, 63,
3074           CINTIQ_HYBRID, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES,
3075           WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET,
3076           .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x309 };
3077 static const struct wacom_features wacom_features_0x309 =
3078         { "Wacom ISDv5 309", .type = WACOM_24HDT, /* Touch */
3079           .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x0307, .touch_max = 10,
3080           .check_for_hid_type = true, .hid_type = HID_TYPE_USBNONE };
3081 static const struct wacom_features wacom_features_0x30A =
3082         { "Wacom ISDv5 30A", 59152, 33448, 2047, 63,
3083           CINTIQ_HYBRID, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES,
3084           WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET,
3085           .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x30C };
3086 static const struct wacom_features wacom_features_0x30C =
3087         { "Wacom ISDv5 30C", .type = WACOM_24HDT, /* Touch */
3088           .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x30A, .touch_max = 10,
3089           .check_for_hid_type = true, .hid_type = HID_TYPE_USBNONE };
3090 static const struct wacom_features wacom_features_0x318 =
3091         { "Wacom USB Bamboo PAD", 4095, 4095, /* Touch */
3092           .type = BAMBOO_PAD, 35, 48, .touch_max = 4 };
3093 static const struct wacom_features wacom_features_0x319 =
3094         { "Wacom Wireless Bamboo PAD", 4095, 4095, /* Touch */
3095           .type = BAMBOO_PAD, 35, 48, .touch_max = 4 };
3096 static const struct wacom_features wacom_features_0x323 =
3097         { "Wacom Intuos P M", 21600, 13500, 1023, 31,
3098           INTUOSHT, WACOM_INTUOS_RES, WACOM_INTUOS_RES,
3099           .check_for_hid_type = true, .hid_type = HID_TYPE_USBNONE };
3100
3101 static const struct wacom_features wacom_features_HID_ANY_ID =
3102         { "Wacom HID", .type = HID_GENERIC };
3103
3104 #define USB_DEVICE_WACOM(prod)                                          \
3105         HID_DEVICE(BUS_USB, HID_GROUP_WACOM, USB_VENDOR_ID_WACOM, prod),\
3106         .driver_data = (kernel_ulong_t)&wacom_features_##prod
3107
3108 #define BT_DEVICE_WACOM(prod)                                           \
3109         HID_DEVICE(BUS_BLUETOOTH, HID_GROUP_WACOM, USB_VENDOR_ID_WACOM, prod),\
3110         .driver_data = (kernel_ulong_t)&wacom_features_##prod
3111
3112 #define I2C_DEVICE_WACOM(prod)                                          \
3113         HID_DEVICE(BUS_I2C, HID_GROUP_WACOM, USB_VENDOR_ID_WACOM, prod),\
3114         .driver_data = (kernel_ulong_t)&wacom_features_##prod
3115
3116 #define USB_DEVICE_LENOVO(prod)                                 \
3117         HID_USB_DEVICE(USB_VENDOR_ID_LENOVO, prod),                     \
3118         .driver_data = (kernel_ulong_t)&wacom_features_##prod
3119
3120 const struct hid_device_id wacom_ids[] = {
3121         { USB_DEVICE_WACOM(0x00) },
3122         { USB_DEVICE_WACOM(0x03) },
3123         { USB_DEVICE_WACOM(0x10) },
3124         { USB_DEVICE_WACOM(0x11) },
3125         { USB_DEVICE_WACOM(0x12) },
3126         { USB_DEVICE_WACOM(0x13) },
3127         { USB_DEVICE_WACOM(0x14) },
3128         { USB_DEVICE_WACOM(0x15) },
3129         { USB_DEVICE_WACOM(0x16) },
3130         { USB_DEVICE_WACOM(0x17) },
3131         { USB_DEVICE_WACOM(0x18) },
3132         { USB_DEVICE_WACOM(0x19) },
3133         { USB_DEVICE_WACOM(0x20) },
3134         { USB_DEVICE_WACOM(0x21) },
3135         { USB_DEVICE_WACOM(0x22) },
3136         { USB_DEVICE_WACOM(0x23) },
3137         { USB_DEVICE_WACOM(0x24) },
3138         { USB_DEVICE_WACOM(0x26) },
3139         { USB_DEVICE_WACOM(0x27) },
3140         { USB_DEVICE_WACOM(0x28) },
3141         { USB_DEVICE_WACOM(0x29) },
3142         { USB_DEVICE_WACOM(0x2A) },
3143         { USB_DEVICE_WACOM(0x30) },
3144         { USB_DEVICE_WACOM(0x31) },
3145         { USB_DEVICE_WACOM(0x32) },
3146         { USB_DEVICE_WACOM(0x33) },
3147         { USB_DEVICE_WACOM(0x34) },
3148         { USB_DEVICE_WACOM(0x35) },
3149         { USB_DEVICE_WACOM(0x37) },
3150         { USB_DEVICE_WACOM(0x38) },
3151         { USB_DEVICE_WACOM(0x39) },
3152         { USB_DEVICE_WACOM(0x3F) },
3153         { USB_DEVICE_WACOM(0x41) },
3154         { USB_DEVICE_WACOM(0x42) },
3155         { USB_DEVICE_WACOM(0x43) },
3156         { USB_DEVICE_WACOM(0x44) },
3157         { USB_DEVICE_WACOM(0x45) },
3158         { USB_DEVICE_WACOM(0x47) },
3159         { USB_DEVICE_WACOM(0x57) },
3160         { USB_DEVICE_WACOM(0x59) },
3161         { USB_DEVICE_WACOM(0x5B) },
3162         { USB_DEVICE_WACOM(0x5D) },
3163         { USB_DEVICE_WACOM(0x5E) },
3164         { USB_DEVICE_WACOM(0x60) },
3165         { USB_DEVICE_WACOM(0x61) },
3166         { USB_DEVICE_WACOM(0x62) },
3167         { USB_DEVICE_WACOM(0x63) },
3168         { USB_DEVICE_WACOM(0x64) },
3169         { USB_DEVICE_WACOM(0x65) },
3170         { USB_DEVICE_WACOM(0x69) },
3171         { USB_DEVICE_WACOM(0x6A) },
3172         { USB_DEVICE_WACOM(0x6B) },
3173         { BT_DEVICE_WACOM(0x81) },
3174         { USB_DEVICE_WACOM(0x84) },
3175         { USB_DEVICE_WACOM(0x90) },
3176         { USB_DEVICE_WACOM(0x93) },
3177         { USB_DEVICE_WACOM(0x97) },
3178         { USB_DEVICE_WACOM(0x9A) },
3179         { USB_DEVICE_WACOM(0x9F) },
3180         { USB_DEVICE_WACOM(0xB0) },
3181         { USB_DEVICE_WACOM(0xB1) },
3182         { USB_DEVICE_WACOM(0xB2) },
3183         { USB_DEVICE_WACOM(0xB3) },
3184         { USB_DEVICE_WACOM(0xB4) },
3185         { USB_DEVICE_WACOM(0xB5) },
3186         { USB_DEVICE_WACOM(0xB7) },
3187         { USB_DEVICE_WACOM(0xB8) },
3188         { USB_DEVICE_WACOM(0xB9) },
3189         { USB_DEVICE_WACOM(0xBA) },
3190         { USB_DEVICE_WACOM(0xBB) },
3191         { USB_DEVICE_WACOM(0xBC) },
3192         { BT_DEVICE_WACOM(0xBD) },
3193         { USB_DEVICE_WACOM(0xC0) },
3194         { USB_DEVICE_WACOM(0xC2) },
3195         { USB_DEVICE_WACOM(0xC4) },
3196         { USB_DEVICE_WACOM(0xC5) },
3197         { USB_DEVICE_WACOM(0xC6) },
3198         { USB_DEVICE_WACOM(0xC7) },
3199         { USB_DEVICE_WACOM(0xCC) },
3200         { USB_DEVICE_WACOM(0xCE) },
3201         { USB_DEVICE_WACOM(0xD0) },
3202         { USB_DEVICE_WACOM(0xD1) },
3203         { USB_DEVICE_WACOM(0xD2) },
3204         { USB_DEVICE_WACOM(0xD3) },
3205         { USB_DEVICE_WACOM(0xD4) },
3206         { USB_DEVICE_WACOM(0xD5) },
3207         { USB_DEVICE_WACOM(0xD6) },
3208         { USB_DEVICE_WACOM(0xD7) },
3209         { USB_DEVICE_WACOM(0xD8) },
3210         { USB_DEVICE_WACOM(0xDA) },
3211         { USB_DEVICE_WACOM(0xDB) },
3212         { USB_DEVICE_WACOM(0xDD) },
3213         { USB_DEVICE_WACOM(0xDE) },
3214         { USB_DEVICE_WACOM(0xDF) },
3215         { USB_DEVICE_WACOM(0xE2) },
3216         { USB_DEVICE_WACOM(0xE3) },
3217         { USB_DEVICE_WACOM(0xE5) },
3218         { USB_DEVICE_WACOM(0xE6) },
3219         { USB_DEVICE_WACOM(0xEC) },
3220         { USB_DEVICE_WACOM(0xED) },
3221         { USB_DEVICE_WACOM(0xEF) },
3222         { USB_DEVICE_WACOM(0xF0) },
3223         { USB_DEVICE_WACOM(0xF4) },
3224         { USB_DEVICE_WACOM(0xF6) },
3225         { USB_DEVICE_WACOM(0xF8) },
3226         { USB_DEVICE_WACOM(0xFA) },
3227         { USB_DEVICE_WACOM(0xFB) },
3228         { USB_DEVICE_WACOM(0x100) },
3229         { USB_DEVICE_WACOM(0x101) },
3230         { USB_DEVICE_WACOM(0x10D) },
3231         { USB_DEVICE_WACOM(0x10E) },
3232         { USB_DEVICE_WACOM(0x10F) },
3233         { USB_DEVICE_WACOM(0x116) },
3234         { USB_DEVICE_WACOM(0x12C) },
3235         { USB_DEVICE_WACOM(0x300) },
3236         { USB_DEVICE_WACOM(0x301) },
3237         { USB_DEVICE_WACOM(0x302) },
3238         { USB_DEVICE_WACOM(0x303) },
3239         { USB_DEVICE_WACOM(0x304) },
3240         { USB_DEVICE_WACOM(0x307) },
3241         { USB_DEVICE_WACOM(0x309) },
3242         { USB_DEVICE_WACOM(0x30A) },
3243         { USB_DEVICE_WACOM(0x30C) },
3244         { USB_DEVICE_WACOM(0x30E) },
3245         { USB_DEVICE_WACOM(0x314) },
3246         { USB_DEVICE_WACOM(0x315) },
3247         { USB_DEVICE_WACOM(0x317) },
3248         { USB_DEVICE_WACOM(0x318) },
3249         { USB_DEVICE_WACOM(0x319) },
3250         { USB_DEVICE_WACOM(0x323) },
3251         { USB_DEVICE_WACOM(0x32A) },
3252         { USB_DEVICE_WACOM(0x32B) },
3253         { USB_DEVICE_WACOM(0x32C) },
3254         { USB_DEVICE_WACOM(0x32F) },
3255         { USB_DEVICE_WACOM(0x4001) },
3256         { USB_DEVICE_WACOM(0x4004) },
3257         { USB_DEVICE_WACOM(0x5000) },
3258         { USB_DEVICE_WACOM(0x5002) },
3259         { USB_DEVICE_LENOVO(0x6004) },
3260
3261         { USB_DEVICE_WACOM(HID_ANY_ID) },
3262         { I2C_DEVICE_WACOM(HID_ANY_ID) },
3263         { }
3264 };
3265 MODULE_DEVICE_TABLE(hid, wacom_ids);