xref: /linux/drivers/hid/wacom_wac.c (revision 2ba9268dd603d23e17643437b2246acb6844953b)
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);
3142