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