Input: gtco - fix potential out-of-bound access
[GitHub/LineageOS/android_kernel_motorola_exynos9610.git] / drivers / input / tablet / gtco.c
CommitLineData
a19ceb56
JR
1/* -*- linux-c -*-
2
3GTCO digitizer USB driver
4
a19ceb56
JR
5TO CHECK: Is pressure done right on report 5?
6
7Copyright (C) 2006 GTCO CalComp
8
9This program is free software; you can redistribute it and/or
10modify it under the terms of the GNU General Public License
11as published by the Free Software Foundation; version 2
12of the License.
13
14This program is distributed in the hope that it will be useful,
15but WITHOUT ANY WARRANTY; without even the implied warranty of
16MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17GNU General Public License for more details.
18
19You should have received a copy of the GNU General Public License
20along with this program; if not, write to the Free Software
21Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
22
23Permission to use, copy, modify, distribute, and sell this software and its
24documentation for any purpose is hereby granted without fee, provided that
25the above copyright notice appear in all copies and that both that
26copyright notice and this permission notice appear in supporting
27documentation, and that the name of GTCO-CalComp not be used in advertising
28or publicity pertaining to distribution of the software without specific,
29written prior permission. GTCO-CalComp makes no representations about the
30suitability of this software for any purpose. It is provided "as is"
31without express or implied warranty.
32
33GTCO-CALCOMP DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
34INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
35EVENT SHALL GTCO-CALCOMP BE LIABLE FOR ANY SPECIAL, INDIRECT OR
36CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
37DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
38TORTIOUS ACTIONS, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
39PERFORMANCE OF THIS SOFTWARE.
40
41GTCO CalComp, Inc.
427125 Riverwood Drive
43Columbia, MD 21046
44
45Jeremy Roberson jroberson@gtcocalcomp.com
46Scott Hill shill@gtcocalcomp.com
47*/
48
49
50
51/*#define DEBUG*/
52
53#include <linux/kernel.h>
54#include <linux/module.h>
55#include <linux/errno.h>
a19ceb56
JR
56#include <linux/slab.h>
57#include <linux/input.h>
58#include <linux/usb.h>
7c0f6ba6 59#include <linux/uaccess.h>
a19ceb56
JR
60#include <asm/unaligned.h>
61#include <asm/byteorder.h>
8d212820 62#include <linux/bitops.h>
a19ceb56 63
a19ceb56
JR
64#include <linux/usb/input.h>
65
66/* Version with a Major number of 2 is for kernel inclusion only. */
67#define GTCO_VERSION "2.00.0006"
68
69
70/* MACROS */
71
72#define VENDOR_ID_GTCO 0x078C
73#define PID_400 0x400
74#define PID_401 0x401
75#define PID_1000 0x1000
76#define PID_1001 0x1001
77#define PID_1002 0x1002
78
79/* Max size of a single report */
80#define REPORT_MAX_SIZE 10
81
82
83/* Bitmask whether pen is in range */
84#define MASK_INRANGE 0x20
85#define MASK_BUTTON 0x01F
86
87#define PATHLENGTH 64
88
89/* DATA STRUCTURES */
90
91/* Device table */
9cb3ce52 92static const struct usb_device_id gtco_usbid_table[] = {
a19ceb56
JR
93 { USB_DEVICE(VENDOR_ID_GTCO, PID_400) },
94 { USB_DEVICE(VENDOR_ID_GTCO, PID_401) },
95 { USB_DEVICE(VENDOR_ID_GTCO, PID_1000) },
96 { USB_DEVICE(VENDOR_ID_GTCO, PID_1001) },
97 { USB_DEVICE(VENDOR_ID_GTCO, PID_1002) },
98 { }
99};
100MODULE_DEVICE_TABLE (usb, gtco_usbid_table);
101
102
103/* Structure to hold all of our device specific stuff */
104struct gtco {
105
106 struct input_dev *inputdevice; /* input device struct pointer */
27c2597d 107 struct usb_interface *intf; /* the usb interface for this device */
a19ceb56
JR
108 struct urb *urbinfo; /* urb for incoming reports */
109 dma_addr_t buf_dma; /* dma addr of the data buffer*/
110 unsigned char * buffer; /* databuffer for reports */
111
112 char usbpath[PATHLENGTH];
113 int openCount;
114
115 /* Information pulled from Report Descriptor */
116 u32 usage;
117 u32 min_X;
118 u32 max_X;
119 u32 min_Y;
120 u32 max_Y;
121 s8 mintilt_X;
122 s8 maxtilt_X;
123 s8 mintilt_Y;
124 s8 maxtilt_Y;
125 u32 maxpressure;
126 u32 minpressure;
127};
128
129
130
131/* Code for parsing the HID REPORT DESCRIPTOR */
132
133/* From HID1.11 spec */
134struct hid_descriptor
135{
136 struct usb_descriptor_header header;
137 __le16 bcdHID;
138 u8 bCountryCode;
139 u8 bNumDescriptors;
140 u8 bDescriptorType;
141 __le16 wDescriptorLength;
142} __attribute__ ((packed));
143
144
145#define HID_DESCRIPTOR_SIZE 9
146#define HID_DEVICE_TYPE 33
147#define REPORT_DEVICE_TYPE 34
148
149
150#define PREF_TAG(x) ((x)>>4)
151#define PREF_TYPE(x) ((x>>2)&0x03)
152#define PREF_SIZE(x) ((x)&0x03)
153
154#define TYPE_MAIN 0
155#define TYPE_GLOBAL 1
156#define TYPE_LOCAL 2
157#define TYPE_RESERVED 3
158
159#define TAG_MAIN_INPUT 0x8
160#define TAG_MAIN_OUTPUT 0x9
161#define TAG_MAIN_FEATURE 0xB
162#define TAG_MAIN_COL_START 0xA
163#define TAG_MAIN_COL_END 0xC
164
165#define TAG_GLOB_USAGE 0
166#define TAG_GLOB_LOG_MIN 1
167#define TAG_GLOB_LOG_MAX 2
168#define TAG_GLOB_PHYS_MIN 3
169#define TAG_GLOB_PHYS_MAX 4
170#define TAG_GLOB_UNIT_EXP 5
171#define TAG_GLOB_UNIT 6
172#define TAG_GLOB_REPORT_SZ 7
173#define TAG_GLOB_REPORT_ID 8
174#define TAG_GLOB_REPORT_CNT 9
175#define TAG_GLOB_PUSH 10
176#define TAG_GLOB_POP 11
177
178#define TAG_GLOB_MAX 12
179
180#define DIGITIZER_USAGE_TIP_PRESSURE 0x30
181#define DIGITIZER_USAGE_TILT_X 0x3D
182#define DIGITIZER_USAGE_TILT_Y 0x3E
183
184
185/*
a19ceb56
JR
186 * This is an abbreviated parser for the HID Report Descriptor. We
187 * know what devices we are talking to, so this is by no means meant
188 * to be generic. We can make some safe assumptions:
189 *
190 * - We know there are no LONG tags, all short
191 * - We know that we have no MAIN Feature and MAIN Output items
192 * - We know what the IRQ reports are supposed to look like.
193 *
194 * The main purpose of this is to use the HID report desc to figure
195 * out the mins and maxs of the fields in the IRQ reports. The IRQ
196 * reports for 400/401 change slightly if the max X is bigger than 64K.
197 *
198 */
199static void parse_hid_report_descriptor(struct gtco *device, char * report,
200 int length)
201{
27c2597d 202 struct device *ddev = &device->intf->dev;
1b726a02 203 int x, i = 0;
a19ceb56
JR
204
205 /* Tag primitive vars */
206 __u8 prefix;
207 __u8 size;
208 __u8 tag;
209 __u8 type;
210 __u8 data = 0;
211 __u16 data16 = 0;
212 __u32 data32 = 0;
213
a19ceb56
JR
214 /* For parsing logic */
215 int inputnum = 0;
216 __u32 usage = 0;
217
218 /* Global Values, indexed by TAG */
219 __u32 globalval[TAG_GLOB_MAX];
220 __u32 oldval[TAG_GLOB_MAX];
221
222 /* Debug stuff */
bc95f366 223 char maintype = 'x';
a19ceb56 224 char globtype[12];
1b726a02
DT
225 int indent = 0;
226 char indentstr[10] = "";
a19ceb56
JR
227
228
c6f880a7 229 dev_dbg(ddev, "======>>>>>>PARSE<<<<<<======\n");
a19ceb56
JR
230
231 /* Walk this report and pull out the info we need */
1b726a02 232 while (i < length) {
a5082947 233 prefix = report[i++];
a19ceb56
JR
234
235 /* Determine data size and save the data in the proper variable */
a5082947
DT
236 size = (1U << PREF_SIZE(prefix)) >> 1;
237 if (i + size > length) {
238 dev_err(ddev,
239 "Not enough data (need %d, have %d)\n",
240 i + size, length);
241 break;
242 }
243
1b726a02 244 switch (size) {
a19ceb56
JR
245 case 1:
246 data = report[i];
247 break;
248 case 2:
858ad08c 249 data16 = get_unaligned_le16(&report[i]);
a19ceb56 250 break;
a5082947 251 case 4:
858ad08c 252 data32 = get_unaligned_le32(&report[i]);
1b726a02 253 break;
a19ceb56
JR
254 }
255
256 /* Skip size of data */
1b726a02 257 i += size;
a19ceb56
JR
258
259 /* What we do depends on the tag type */
260 tag = PREF_TAG(prefix);
261 type = PREF_TYPE(prefix);
1b726a02 262 switch (type) {
a19ceb56 263 case TYPE_MAIN:
1b726a02
DT
264 strcpy(globtype, "");
265 switch (tag) {
a19ceb56
JR
266
267 case TAG_MAIN_INPUT:
268 /*
269 * The INPUT MAIN tag signifies this is
270 * information from a report. We need to
271 * figure out what it is and store the
272 * min/max values
273 */
274
1b726a02
DT
275 maintype = 'I';
276 if (data == 2)
277 strcpy(globtype, "Variable");
278 else if (data == 3)
279 strcpy(globtype, "Var|Const");
a19ceb56 280
c6f880a7
GKH
281 dev_dbg(ddev, "::::: Saving Report: %d input #%d Max: 0x%X(%d) Min:0x%X(%d) of %d bits\n",
282 globalval[TAG_GLOB_REPORT_ID], inputnum,
283 globalval[TAG_GLOB_LOG_MAX], globalval[TAG_GLOB_LOG_MAX],
284 globalval[TAG_GLOB_LOG_MIN], globalval[TAG_GLOB_LOG_MIN],
285 globalval[TAG_GLOB_REPORT_SZ] * globalval[TAG_GLOB_REPORT_CNT]);
a19ceb56
JR
286
287
288 /*
289 We can assume that the first two input items
290 are always the X and Y coordinates. After
291 that, we look for everything else by
292 local usage value
293 */
1b726a02 294 switch (inputnum) {
a19ceb56 295 case 0: /* X coord */
c6f880a7 296 dev_dbg(ddev, "GER: X Usage: 0x%x\n", usage);
1b726a02 297 if (device->max_X == 0) {
a19ceb56
JR
298 device->max_X = globalval[TAG_GLOB_LOG_MAX];
299 device->min_X = globalval[TAG_GLOB_LOG_MIN];
300 }
a19ceb56 301 break;
1b726a02 302
a19ceb56 303 case 1: /* Y coord */
c6f880a7 304 dev_dbg(ddev, "GER: Y Usage: 0x%x\n", usage);
1b726a02 305 if (device->max_Y == 0) {
a19ceb56
JR
306 device->max_Y = globalval[TAG_GLOB_LOG_MAX];
307 device->min_Y = globalval[TAG_GLOB_LOG_MIN];
308 }
309 break;
1b726a02 310
a19ceb56
JR
311 default:
312 /* Tilt X */
1b726a02
DT
313 if (usage == DIGITIZER_USAGE_TILT_X) {
314 if (device->maxtilt_X == 0) {
a19ceb56
JR
315 device->maxtilt_X = globalval[TAG_GLOB_LOG_MAX];
316 device->mintilt_X = globalval[TAG_GLOB_LOG_MIN];
317 }
318 }
319
320 /* Tilt Y */
1b726a02
DT
321 if (usage == DIGITIZER_USAGE_TILT_Y) {
322 if (device->maxtilt_Y == 0) {
a19ceb56
JR
323 device->maxtilt_Y = globalval[TAG_GLOB_LOG_MAX];
324 device->mintilt_Y = globalval[TAG_GLOB_LOG_MIN];
325 }
326 }
327
a19ceb56 328 /* Pressure */
1b726a02
DT
329 if (usage == DIGITIZER_USAGE_TIP_PRESSURE) {
330 if (device->maxpressure == 0) {
a19ceb56
JR
331 device->maxpressure = globalval[TAG_GLOB_LOG_MAX];
332 device->minpressure = globalval[TAG_GLOB_LOG_MIN];
333 }
334 }
335
336 break;
337 }
338
339 inputnum++;
a19ceb56 340 break;
1b726a02 341
a19ceb56 342 case TAG_MAIN_OUTPUT:
1b726a02 343 maintype = 'O';
a19ceb56 344 break;
1b726a02 345
a19ceb56 346 case TAG_MAIN_FEATURE:
1b726a02 347 maintype = 'F';
a19ceb56 348 break;
1b726a02 349
a19ceb56 350 case TAG_MAIN_COL_START:
1b726a02 351 maintype = 'S';
a19ceb56 352
1b726a02 353 if (data == 0) {
c6f880a7 354 dev_dbg(ddev, "======>>>>>> Physical\n");
1b726a02
DT
355 strcpy(globtype, "Physical");
356 } else
c6f880a7 357 dev_dbg(ddev, "======>>>>>>\n");
a19ceb56
JR
358
359 /* Indent the debug output */
360 indent++;
1b726a02
DT
361 for (x = 0; x < indent; x++)
362 indentstr[x] = '-';
363 indentstr[x] = 0;
a19ceb56
JR
364
365 /* Save global tags */
1b726a02 366 for (x = 0; x < TAG_GLOB_MAX; x++)
a19ceb56 367 oldval[x] = globalval[x];
a19ceb56
JR
368
369 break;
1b726a02 370
a19ceb56 371 case TAG_MAIN_COL_END:
c6f880a7 372 dev_dbg(ddev, "<<<<<<======\n");
1b726a02 373 maintype = 'E';
a19ceb56 374 indent--;
1b726a02
DT
375 for (x = 0; x < indent; x++)
376 indentstr[x] = '-';
377 indentstr[x] = 0;
a19ceb56
JR
378
379 /* Copy global tags back */
1b726a02 380 for (x = 0; x < TAG_GLOB_MAX; x++)
a19ceb56 381 globalval[x] = oldval[x];
a19ceb56
JR
382
383 break;
384 }
385
1b726a02 386 switch (size) {
a19ceb56 387 case 1:
c6f880a7
GKH
388 dev_dbg(ddev, "%sMAINTAG:(%d) %c SIZE: %d Data: %s 0x%x\n",
389 indentstr, tag, maintype, size, globtype, data);
a19ceb56 390 break;
1b726a02 391
a19ceb56 392 case 2:
c6f880a7
GKH
393 dev_dbg(ddev, "%sMAINTAG:(%d) %c SIZE: %d Data: %s 0x%x\n",
394 indentstr, tag, maintype, size, globtype, data16);
a19ceb56 395 break;
1b726a02 396
a19ceb56 397 case 4:
c6f880a7
GKH
398 dev_dbg(ddev, "%sMAINTAG:(%d) %c SIZE: %d Data: %s 0x%x\n",
399 indentstr, tag, maintype, size, globtype, data32);
a19ceb56
JR
400 break;
401 }
402 break;
1b726a02 403
a19ceb56 404 case TYPE_GLOBAL:
1b726a02 405 switch (tag) {
a19ceb56
JR
406 case TAG_GLOB_USAGE:
407 /*
408 * First time we hit the global usage tag,
409 * it should tell us the type of device
410 */
1b726a02 411 if (device->usage == 0)
a19ceb56 412 device->usage = data;
1b726a02
DT
413
414 strcpy(globtype, "USAGE");
a19ceb56 415 break;
1b726a02
DT
416
417 case TAG_GLOB_LOG_MIN:
418 strcpy(globtype, "LOG_MIN");
a19ceb56 419 break;
1b726a02
DT
420
421 case TAG_GLOB_LOG_MAX:
422 strcpy(globtype, "LOG_MAX");
a19ceb56 423 break;
1b726a02
DT
424
425 case TAG_GLOB_PHYS_MIN:
426 strcpy(globtype, "PHYS_MIN");
a19ceb56 427 break;
1b726a02
DT
428
429 case TAG_GLOB_PHYS_MAX:
430 strcpy(globtype, "PHYS_MAX");
a19ceb56 431 break;
1b726a02
DT
432
433 case TAG_GLOB_UNIT_EXP:
434 strcpy(globtype, "EXP");
a19ceb56 435 break;
1b726a02
DT
436
437 case TAG_GLOB_UNIT:
438 strcpy(globtype, "UNIT");
a19ceb56 439 break;
1b726a02
DT
440
441 case TAG_GLOB_REPORT_SZ:
442 strcpy(globtype, "REPORT_SZ");
a19ceb56 443 break;
1b726a02
DT
444
445 case TAG_GLOB_REPORT_ID:
446 strcpy(globtype, "REPORT_ID");
a19ceb56 447 /* New report, restart numbering */
1b726a02 448 inputnum = 0;
a19ceb56 449 break;
1b726a02 450
a19ceb56 451 case TAG_GLOB_REPORT_CNT:
1b726a02 452 strcpy(globtype, "REPORT_CNT");
a19ceb56 453 break;
1b726a02
DT
454
455 case TAG_GLOB_PUSH:
456 strcpy(globtype, "PUSH");
a19ceb56 457 break;
1b726a02 458
a19ceb56 459 case TAG_GLOB_POP:
1b726a02 460 strcpy(globtype, "POP");
a19ceb56
JR
461 break;
462 }
463
a19ceb56
JR
464 /* Check to make sure we have a good tag number
465 so we don't overflow array */
1b726a02
DT
466 if (tag < TAG_GLOB_MAX) {
467 switch (size) {
a19ceb56 468 case 1:
c6f880a7
GKH
469 dev_dbg(ddev, "%sGLOBALTAG:%s(%d) SIZE: %d Data: 0x%x\n",
470 indentstr, globtype, tag, size, data);
1b726a02 471 globalval[tag] = data;
a19ceb56 472 break;
1b726a02 473
a19ceb56 474 case 2:
c6f880a7
GKH
475 dev_dbg(ddev, "%sGLOBALTAG:%s(%d) SIZE: %d Data: 0x%x\n",
476 indentstr, globtype, tag, size, data16);
1b726a02 477 globalval[tag] = data16;
a19ceb56 478 break;
1b726a02 479
a19ceb56 480 case 4:
c6f880a7
GKH
481 dev_dbg(ddev, "%sGLOBALTAG:%s(%d) SIZE: %d Data: 0x%x\n",
482 indentstr, globtype, tag, size, data32);
1b726a02 483 globalval[tag] = data32;
a19ceb56
JR
484 break;
485 }
1b726a02 486 } else {
c6f880a7
GKH
487 dev_dbg(ddev, "%sGLOBALTAG: ILLEGAL TAG:%d SIZE: %d\n",
488 indentstr, tag, size);
a19ceb56 489 }
a19ceb56
JR
490 break;
491
492 case TYPE_LOCAL:
1b726a02 493 switch (tag) {
a19ceb56 494 case TAG_GLOB_USAGE:
1b726a02 495 strcpy(globtype, "USAGE");
a19ceb56
JR
496 /* Always 1 byte */
497 usage = data;
498 break;
1b726a02
DT
499
500 case TAG_GLOB_LOG_MIN:
501 strcpy(globtype, "MIN");
a19ceb56 502 break;
1b726a02
DT
503
504 case TAG_GLOB_LOG_MAX:
505 strcpy(globtype, "MAX");
a19ceb56 506 break;
1b726a02 507
a19ceb56 508 default:
1b726a02
DT
509 strcpy(globtype, "UNKNOWN");
510 break;
a19ceb56
JR
511 }
512
1b726a02 513 switch (size) {
a19ceb56 514 case 1:
c6f880a7
GKH
515 dev_dbg(ddev, "%sLOCALTAG:(%d) %s SIZE: %d Data: 0x%x\n",
516 indentstr, tag, globtype, size, data);
a19ceb56 517 break;
1b726a02 518
a19ceb56 519 case 2:
c6f880a7
GKH
520 dev_dbg(ddev, "%sLOCALTAG:(%d) %s SIZE: %d Data: 0x%x\n",
521 indentstr, tag, globtype, size, data16);
a19ceb56 522 break;
1b726a02 523
a19ceb56 524 case 4:
c6f880a7
GKH
525 dev_dbg(ddev, "%sLOCALTAG:(%d) %s SIZE: %d Data: 0x%x\n",
526 indentstr, tag, globtype, size, data32);
a19ceb56
JR
527 break;
528 }
529
530 break;
531 }
a19ceb56 532 }
a19ceb56
JR
533}
534
a19ceb56
JR
535/* INPUT DRIVER Routines */
536
a19ceb56 537/*
1b726a02
DT
538 * Called when opening the input device. This will submit the URB to
539 * the usb system so we start getting reports
a19ceb56
JR
540 */
541static int gtco_input_open(struct input_dev *inputdev)
542{
7791bdae 543 struct gtco *device = input_get_drvdata(inputdev);
a19ceb56 544
ed752e5d 545 device->urbinfo->dev = interface_to_usbdev(device->intf);
1b726a02 546 if (usb_submit_urb(device->urbinfo, GFP_KERNEL))
a19ceb56 547 return -EIO;
1b726a02 548
a19ceb56
JR
549 return 0;
550}
551
1b726a02
DT
552/*
553 * Called when closing the input device. This will unlink the URB
554 */
a19ceb56
JR
555static void gtco_input_close(struct input_dev *inputdev)
556{
7791bdae 557 struct gtco *device = input_get_drvdata(inputdev);
a19ceb56
JR
558
559 usb_kill_urb(device->urbinfo);
a19ceb56
JR
560}
561
562
563/*
564 * Setup input device capabilities. Tell the input system what this
565 * device is capable of generating.
566 *
567 * This information is based on what is read from the HID report and
568 * placed in the struct gtco structure
569 *
570 */
7791bdae 571static void gtco_setup_caps(struct input_dev *inputdev)
a19ceb56 572{
7791bdae 573 struct gtco *device = input_get_drvdata(inputdev);
a19ceb56 574
a19ceb56 575 /* Which events */
7b19ada2
JS
576 inputdev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS) |
577 BIT_MASK(EV_MSC);
a19ceb56 578
a19ceb56 579 /* Misc event menu block */
7b19ada2
JS
580 inputdev->mscbit[0] = BIT_MASK(MSC_SCAN) | BIT_MASK(MSC_SERIAL) |
581 BIT_MASK(MSC_RAW);
a19ceb56 582
a19ceb56
JR
583 /* Absolute values based on HID report info */
584 input_set_abs_params(inputdev, ABS_X, device->min_X, device->max_X,
585 0, 0);
586 input_set_abs_params(inputdev, ABS_Y, device->min_Y, device->max_Y,
587 0, 0);
588
589 /* Proximity */
590 input_set_abs_params(inputdev, ABS_DISTANCE, 0, 1, 0, 0);
591
592 /* Tilt & pressure */
593 input_set_abs_params(inputdev, ABS_TILT_X, device->mintilt_X,
594 device->maxtilt_X, 0, 0);
595 input_set_abs_params(inputdev, ABS_TILT_Y, device->mintilt_Y,
596 device->maxtilt_Y, 0, 0);
597 input_set_abs_params(inputdev, ABS_PRESSURE, device->minpressure,
598 device->maxpressure, 0, 0);
599
a19ceb56 600 /* Transducer */
1b726a02 601 input_set_abs_params(inputdev, ABS_MISC, 0, 0xFF, 0, 0);
a19ceb56
JR
602}
603
a19ceb56
JR
604/* USB Routines */
605
a19ceb56
JR
606/*
607 * URB callback routine. Called when we get IRQ reports from the
608 * digitizer.
609 *
610 * This bridges the USB and input device worlds. It generates events
611 * on the input device based on the USB reports.
612 */
613static void gtco_urb_callback(struct urb *urbinfo)
614{
1b726a02 615 struct gtco *device = urbinfo->context;
a19ceb56
JR
616 struct input_dev *inputdev;
617 int rc;
618 u32 val = 0;
a19ceb56
JR
619 char le_buffer[2];
620
621 inputdev = device->inputdevice;
622
a19ceb56 623 /* Was callback OK? */
1b726a02
DT
624 if (urbinfo->status == -ECONNRESET ||
625 urbinfo->status == -ENOENT ||
626 urbinfo->status == -ESHUTDOWN) {
a19ceb56
JR
627
628 /* Shutdown is occurring. Return and don't queue up any more */
629 return;
630 }
631
1b726a02
DT
632 if (urbinfo->status != 0) {
633 /*
634 * Some unknown error. Hopefully temporary. Just go and
635 * requeue an URB
636 */
a19ceb56
JR
637 goto resubmit;
638 }
639
640 /*
641 * Good URB, now process
642 */
643
644 /* PID dependent when we interpret the report */
1b726a02
DT
645 if (inputdev->id.product == PID_1000 ||
646 inputdev->id.product == PID_1001 ||
647 inputdev->id.product == PID_1002) {
a19ceb56
JR
648
649 /*
650 * Switch on the report ID
651 * Conveniently, the reports have more information, the higher
652 * the report number. We can just fall through the case
653 * statements if we start with the highest number report
654 */
1b726a02 655 switch (device->buffer[0]) {
a19ceb56
JR
656 case 5:
657 /* Pressure is 9 bits */
1b726a02 658 val = ((u16)(device->buffer[8]) << 1);
a19ceb56
JR
659 val |= (u16)(device->buffer[7] >> 7);
660 input_report_abs(inputdev, ABS_PRESSURE,
661 device->buffer[8]);
662
663 /* Mask out the Y tilt value used for pressure */
664 device->buffer[7] = (u8)((device->buffer[7]) & 0x7F);
665
a19ceb56
JR
666 /* Fall thru */
667 case 4:
668 /* Tilt */
8d212820
MK
669 input_report_abs(inputdev, ABS_TILT_X,
670 sign_extend32(device->buffer[6], 6));
a19ceb56 671
8d212820
MK
672 input_report_abs(inputdev, ABS_TILT_Y,
673 sign_extend32(device->buffer[7], 6));
a19ceb56
JR
674
675 /* Fall thru */
a19ceb56
JR
676 case 2:
677 case 3:
678 /* Convert buttons, only 5 bits possible */
1b726a02 679 val = (device->buffer[5]) & MASK_BUTTON;
a19ceb56
JR
680
681 /* We don't apply any meaning to the bitmask,
682 just report */
683 input_event(inputdev, EV_MSC, MSC_SERIAL, val);
684
685 /* Fall thru */
686 case 1:
a19ceb56 687 /* All reports have X and Y coords in the same place */
858ad08c 688 val = get_unaligned_le16(&device->buffer[1]);
a19ceb56
JR
689 input_report_abs(inputdev, ABS_X, val);
690
858ad08c 691 val = get_unaligned_le16(&device->buffer[3]);
a19ceb56
JR
692 input_report_abs(inputdev, ABS_Y, val);
693
a19ceb56 694 /* Ditto for proximity bit */
1b726a02 695 val = device->buffer[5] & MASK_INRANGE ? 1 : 0;
a19ceb56
JR
696 input_report_abs(inputdev, ABS_DISTANCE, val);
697
a19ceb56
JR
698 /* Report 1 is an exception to how we handle buttons */
699 /* Buttons are an index, not a bitmask */
1b726a02 700 if (device->buffer[0] == 1) {
a19ceb56 701
1b726a02
DT
702 /*
703 * Convert buttons, 5 bit index
704 * Report value of index set as one,
705 * the rest as 0
706 */
707 val = device->buffer[5] & MASK_BUTTON;
27c2597d 708 dev_dbg(&device->intf->dev,
c6f880a7
GKH
709 "======>>>>>>REPORT 1: val 0x%X(%d)\n",
710 val, val);
a19ceb56
JR
711
712 /*
713 * We don't apply any meaning to the button
714 * index, just report it
715 */
716 input_event(inputdev, EV_MSC, MSC_SERIAL, val);
a19ceb56 717 }
a19ceb56 718 break;
1b726a02 719
a19ceb56
JR
720 case 7:
721 /* Menu blocks */
722 input_event(inputdev, EV_MSC, MSC_SCAN,
723 device->buffer[1]);
a19ceb56 724 break;
a19ceb56 725 }
a19ceb56 726 }
1b726a02 727
a19ceb56 728 /* Other pid class */
1b726a02
DT
729 if (inputdev->id.product == PID_400 ||
730 inputdev->id.product == PID_401) {
a19ceb56
JR
731
732 /* Report 2 */
1b726a02 733 if (device->buffer[0] == 2) {
a19ceb56 734 /* Menu blocks */
1b726a02 735 input_event(inputdev, EV_MSC, MSC_SCAN, device->buffer[1]);
a19ceb56
JR
736 }
737
738 /* Report 1 */
1b726a02 739 if (device->buffer[0] == 1) {
a19ceb56
JR
740 char buttonbyte;
741
a19ceb56 742 /* IF X max > 64K, we still a bit from the y report */
1b726a02 743 if (device->max_X > 0x10000) {
a19ceb56 744
1b726a02
DT
745 val = (u16)(((u16)(device->buffer[2] << 8)) | (u8)device->buffer[1]);
746 val |= (u32)(((u8)device->buffer[3] & 0x1) << 16);
a19ceb56
JR
747
748 input_report_abs(inputdev, ABS_X, val);
749
1b726a02
DT
750 le_buffer[0] = (u8)((u8)(device->buffer[3]) >> 1);
751 le_buffer[0] |= (u8)((device->buffer[3] & 0x1) << 7);
a19ceb56 752
1b726a02
DT
753 le_buffer[1] = (u8)(device->buffer[4] >> 1);
754 le_buffer[1] |= (u8)((device->buffer[5] & 0x1) << 7);
a19ceb56 755
858ad08c 756 val = get_unaligned_le16(le_buffer);
a19ceb56
JR
757 input_report_abs(inputdev, ABS_Y, val);
758
a19ceb56
JR
759 /*
760 * Shift the button byte right by one to
761 * make it look like the standard report
762 */
1b726a02
DT
763 buttonbyte = device->buffer[5] >> 1;
764 } else {
a19ceb56 765
858ad08c 766 val = get_unaligned_le16(&device->buffer[1]);
a19ceb56
JR
767 input_report_abs(inputdev, ABS_X, val);
768
858ad08c 769 val = get_unaligned_le16(&device->buffer[3]);
a19ceb56
JR
770 input_report_abs(inputdev, ABS_Y, val);
771
772 buttonbyte = device->buffer[5];
a19ceb56
JR
773 }
774
a19ceb56 775 /* BUTTONS and PROXIMITY */
1b726a02 776 val = buttonbyte & MASK_INRANGE ? 1 : 0;
a19ceb56
JR
777 input_report_abs(inputdev, ABS_DISTANCE, val);
778
779 /* Convert buttons, only 4 bits possible */
1b726a02 780 val = buttonbyte & 0x0F;
a19ceb56 781#ifdef USE_BUTTONS
1b726a02
DT
782 for (i = 0; i < 5; i++)
783 input_report_key(inputdev, BTN_DIGI + i, val & (1 << i));
a19ceb56
JR
784#else
785 /* We don't apply any meaning to the bitmask, just report */
786 input_event(inputdev, EV_MSC, MSC_SERIAL, val);
787#endif
1b726a02 788
a19ceb56
JR
789 /* TRANSDUCER */
790 input_report_abs(inputdev, ABS_MISC, device->buffer[6]);
a19ceb56
JR
791 }
792 }
793
794 /* Everybody gets report ID's */
795 input_event(inputdev, EV_MSC, MSC_RAW, device->buffer[0]);
796
797 /* Sync it up */
798 input_sync(inputdev);
799
800 resubmit:
801 rc = usb_submit_urb(urbinfo, GFP_ATOMIC);
1b726a02 802 if (rc != 0)
27c2597d 803 dev_err(&device->intf->dev,
3bd9597a 804 "usb_submit_urb failed rc=0x%x\n", rc);
a19ceb56
JR
805}
806
807/*
808 * The probe routine. This is called when the kernel find the matching USB
809 * vendor/product. We do the following:
810 *
811 * - Allocate mem for a local structure to manage the device
812 * - Request a HID Report Descriptor from the device and parse it to
813 * find out the device parameters
814 * - Create an input device and assign it attributes
815 * - Allocate an URB so the device can talk to us when the input
816 * queue is open
817 */
818static int gtco_probe(struct usb_interface *usbinterface,
819 const struct usb_device_id *id)
820{
821
1b726a02
DT
822 struct gtco *gtco;
823 struct input_dev *input_dev;
a19ceb56 824 struct hid_descriptor *hid_desc;
501a5250 825 char *report;
1b726a02
DT
826 int result = 0, retry;
827 int error;
a19ceb56 828 struct usb_endpoint_descriptor *endpoint;
ed752e5d 829 struct usb_device *udev = interface_to_usbdev(usbinterface);
a19ceb56
JR
830
831 /* Allocate memory for device structure */
1b726a02
DT
832 gtco = kzalloc(sizeof(struct gtco), GFP_KERNEL);
833 input_dev = input_allocate_device();
834 if (!gtco || !input_dev) {
3bd9597a 835 dev_err(&usbinterface->dev, "No more memory\n");
1b726a02
DT
836 error = -ENOMEM;
837 goto err_free_devs;
a19ceb56
JR
838 }
839
1b726a02
DT
840 /* Set pointer to the input device */
841 gtco->inputdevice = input_dev;
a19ceb56
JR
842
843 /* Save interface information */
27c2597d 844 gtco->intf = usbinterface;
a19ceb56
JR
845
846 /* Allocate some data for incoming reports */
ed752e5d 847 gtco->buffer = usb_alloc_coherent(udev, REPORT_MAX_SIZE,
997ea58e 848 GFP_KERNEL, &gtco->buf_dma);
1b726a02 849 if (!gtco->buffer) {
3bd9597a 850 dev_err(&usbinterface->dev, "No more memory for us buffers\n");
1b726a02
DT
851 error = -ENOMEM;
852 goto err_free_devs;
a19ceb56
JR
853 }
854
855 /* Allocate URB for reports */
1b726a02
DT
856 gtco->urbinfo = usb_alloc_urb(0, GFP_KERNEL);
857 if (!gtco->urbinfo) {
3bd9597a 858 dev_err(&usbinterface->dev, "Failed to allocate URB\n");
f4bc95d7 859 error = -ENOMEM;
1b726a02 860 goto err_free_buf;
a19ceb56
JR
861 }
862
162f98de
VD
863 /* Sanity check that a device has an endpoint */
864 if (usbinterface->altsetting[0].desc.bNumEndpoints < 1) {
865 dev_err(&usbinterface->dev,
866 "Invalid number of endpoints\n");
867 error = -EINVAL;
868 goto err_free_urb;
869 }
870
a19ceb56
JR
871 /*
872 * The endpoint is always altsetting 0, we know this since we know
873 * this device only has one interrupt endpoint
874 */
875 endpoint = &usbinterface->altsetting[0].endpoint[0].desc;
876
877 /* Some debug */
c6f880a7
GKH
878 dev_dbg(&usbinterface->dev, "gtco # interfaces: %d\n", usbinterface->num_altsetting);
879 dev_dbg(&usbinterface->dev, "num endpoints: %d\n", usbinterface->cur_altsetting->desc.bNumEndpoints);
880 dev_dbg(&usbinterface->dev, "interface class: %d\n", usbinterface->cur_altsetting->desc.bInterfaceClass);
881 dev_dbg(&usbinterface->dev, "endpoint: attribute:0x%x type:0x%x\n", endpoint->bmAttributes, endpoint->bDescriptorType);
e941da31 882 if (usb_endpoint_xfer_int(endpoint))
c6f880a7 883 dev_dbg(&usbinterface->dev, "endpoint: we have interrupt endpoint\n");
a19ceb56 884
c6f880a7 885 dev_dbg(&usbinterface->dev, "endpoint extra len:%d\n", usbinterface->altsetting[0].extralen);
a19ceb56
JR
886
887 /*
888 * Find the HID descriptor so we can find out the size of the
889 * HID report descriptor
890 */
891 if (usb_get_extra_descriptor(usbinterface->cur_altsetting,
162f98de 892 HID_DEVICE_TYPE, &hid_desc) != 0) {
3bd9597a
GKH
893 dev_err(&usbinterface->dev,
894 "Can't retrieve exta USB descriptor to get hid report descriptor length\n");
1b726a02
DT
895 error = -EIO;
896 goto err_free_urb;
a19ceb56
JR
897 }
898
c6f880a7
GKH
899 dev_dbg(&usbinterface->dev,
900 "Extra descriptor success: type:%d len:%d\n",
901 hid_desc->bDescriptorType, hid_desc->wDescriptorLength);
a19ceb56 902
6b8588f7 903 report = kzalloc(le16_to_cpu(hid_desc->wDescriptorLength), GFP_KERNEL);
1b726a02 904 if (!report) {
3bd9597a 905 dev_err(&usbinterface->dev, "No more memory for report\n");
1b726a02
DT
906 error = -ENOMEM;
907 goto err_free_urb;
a19ceb56
JR
908 }
909
910 /* Couple of tries to get reply */
1b726a02 911 for (retry = 0; retry < 3; retry++) {
ed752e5d
ON
912 result = usb_control_msg(udev,
913 usb_rcvctrlpipe(udev, 0),
a19ceb56
JR
914 USB_REQ_GET_DESCRIPTOR,
915 USB_RECIP_INTERFACE | USB_DIR_IN,
1b726a02 916 REPORT_DEVICE_TYPE << 8,
a19ceb56
JR
917 0, /* interface */
918 report,
6b8588f7 919 le16_to_cpu(hid_desc->wDescriptorLength),
a19ceb56
JR
920 5000); /* 5 secs */
921
c6f880a7 922 dev_dbg(&usbinterface->dev, "usb_control_msg result: %d\n", result);
501a5250
DT
923 if (result == le16_to_cpu(hid_desc->wDescriptorLength)) {
924 parse_hid_report_descriptor(gtco, report, result);
a19ceb56 925 break;
501a5250 926 }
a19ceb56
JR
927 }
928
501a5250
DT
929 kfree(report);
930
a19ceb56 931 /* If we didn't get the report, fail */
6b8588f7 932 if (result != le16_to_cpu(hid_desc->wDescriptorLength)) {
3bd9597a
GKH
933 dev_err(&usbinterface->dev,
934 "Failed to get HID Report Descriptor of size: %d\n",
935 hid_desc->wDescriptorLength);
1b726a02
DT
936 error = -EIO;
937 goto err_free_urb;
a19ceb56
JR
938 }
939
a19ceb56 940 /* Create a device file node */
ed752e5d 941 usb_make_path(udev, gtco->usbpath, sizeof(gtco->usbpath));
1b726a02 942 strlcat(gtco->usbpath, "/input0", sizeof(gtco->usbpath));
a19ceb56
JR
943
944 /* Set Input device functions */
1b726a02
DT
945 input_dev->open = gtco_input_open;
946 input_dev->close = gtco_input_close;
a19ceb56
JR
947
948 /* Set input device information */
1b726a02
DT
949 input_dev->name = "GTCO_CalComp";
950 input_dev->phys = gtco->usbpath;
7791bdae
DT
951
952 input_set_drvdata(input_dev, gtco);
a19ceb56
JR
953
954 /* Now set up all the input device capabilities */
1b726a02 955 gtco_setup_caps(input_dev);
a19ceb56
JR
956
957 /* Set input device required ID information */
ed752e5d 958 usb_to_input_id(udev, &input_dev->id);
c0f82d57 959 input_dev->dev.parent = &usbinterface->dev;
a19ceb56
JR
960
961 /* Setup the URB, it will be posted later on open of input device */
962 endpoint = &usbinterface->altsetting[0].endpoint[0].desc;
963
1b726a02 964 usb_fill_int_urb(gtco->urbinfo,
ed752e5d
ON
965 udev,
966 usb_rcvintpipe(udev,
a19ceb56 967 endpoint->bEndpointAddress),
1b726a02 968 gtco->buffer,
a19ceb56
JR
969 REPORT_MAX_SIZE,
970 gtco_urb_callback,
1b726a02 971 gtco,
a19ceb56
JR
972 endpoint->bInterval);
973
1b726a02
DT
974 gtco->urbinfo->transfer_dma = gtco->buf_dma;
975 gtco->urbinfo->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
a19ceb56 976
1b726a02
DT
977 /* Save gtco pointer in USB interface gtco */
978 usb_set_intfdata(usbinterface, gtco);
a19ceb56
JR
979
980 /* All done, now register the input device */
1b726a02
DT
981 error = input_register_device(input_dev);
982 if (error)
983 goto err_free_urb;
a19ceb56 984
a19ceb56
JR
985 return 0;
986
1b726a02
DT
987 err_free_urb:
988 usb_free_urb(gtco->urbinfo);
989 err_free_buf:
ed752e5d 990 usb_free_coherent(udev, REPORT_MAX_SIZE,
997ea58e 991 gtco->buffer, gtco->buf_dma);
1b726a02 992 err_free_devs:
1b726a02
DT
993 input_free_device(input_dev);
994 kfree(gtco);
995 return error;
a19ceb56
JR
996}
997
998/*
999 * This function is a standard USB function called when the USB device
1000 * is disconnected. We will get rid of the URV, de-register the input
1001 * device, and free up allocated memory
1002 */
1003static void gtco_disconnect(struct usb_interface *interface)
1004{
a19ceb56 1005 /* Grab private device ptr */
1b726a02 1006 struct gtco *gtco = usb_get_intfdata(interface);
ed752e5d 1007 struct usb_device *udev = interface_to_usbdev(interface);
a19ceb56
JR
1008
1009 /* Now reverse all the registration stuff */
1b726a02
DT
1010 if (gtco) {
1011 input_unregister_device(gtco->inputdevice);
1012 usb_kill_urb(gtco->urbinfo);
1013 usb_free_urb(gtco->urbinfo);
ed752e5d 1014 usb_free_coherent(udev, REPORT_MAX_SIZE,
997ea58e 1015 gtco->buffer, gtco->buf_dma);
1b726a02 1016 kfree(gtco);
a19ceb56
JR
1017 }
1018
899ef6e7 1019 dev_info(&interface->dev, "gtco driver disconnected\n");
a19ceb56
JR
1020}
1021
a19ceb56
JR
1022/* STANDARD MODULE LOAD ROUTINES */
1023
1024static struct usb_driver gtco_driverinfo_table = {
1b726a02
DT
1025 .name = "gtco",
1026 .id_table = gtco_usbid_table,
1027 .probe = gtco_probe,
1028 .disconnect = gtco_disconnect,
a19ceb56 1029};
1b726a02 1030
08642e7c 1031module_usb_driver(gtco_driverinfo_table);
a19ceb56 1032
32a676fe 1033MODULE_DESCRIPTION("GTCO digitizer USB driver");
a19ceb56 1034MODULE_LICENSE("GPL");