hwmon: (it87) Add chassis intrusion detection support
[linux-2.6.git] / drivers / hid / hid-waltop.c
1 /*
2  *  HID driver for Waltop devices not fully compliant with HID standard
3  *
4  *  Copyright (c) 2010 Nikolai Kondrashov
5  */
6
7 /*
8  * This program is free software; you can redistribute it and/or modify it
9  * under the terms of the GNU General Public License as published by the Free
10  * Software Foundation; either version 2 of the License, or (at your option)
11  * any later version.
12  */
13
14 #include <linux/device.h>
15 #include <linux/hid.h>
16 #include <linux/module.h>
17
18 #include "hid-ids.h"
19
20 /*
21  * There exists an official driver on the manufacturer's website, which
22  * wasn't submitted to the kernel, for some reason. The official driver
23  * doesn't seem to support extra features of some tablets, like wheels.
24  *
25  * It shows that the feature report ID 2 could be used to control any waltop
26  * tablet input mode, switching it between "default", "tablet" and "ink".
27  *
28  * This driver only uses "default" mode for all the supported tablets. This
29  * mode tries to be HID-compatible (not very successfully), but cripples the
30  * resolution of some tablets.
31  *
32  * The "tablet" mode uses some proprietary, yet decipherable protocol, which
33  * represents the correct resolution, but is possibly HID-incompatible (i.e.
34  * indescribable by a report descriptor).
35  *
36  * The purpose of the "ink" mode is unknown.
37  *
38  * The feature reports needed for switching to each mode are these:
39  *
40  * 02 16 00     default
41  * 02 16 01     tablet
42  * 02 16 02     ink
43  */
44
45 /*
46  * Original Slim Tablet 5.8 inch report descriptor.
47  *
48  * All the reports except the report with ID 16 (the stylus) are unused,
49  * possibly because the tablet is not configured to, or because they were
50  * just copied from a more capable model. The full purpose of features
51  * described for report ID 2 is unknown.
52  *
53  * The stylus buttons are described as three bit fields, whereas actually
54  * it's an "array", i.e. they're reported as button numbers (1, 2 and 3).
55  * The "eraser" field is not used. There is also a "push" without a "pop" in
56  * the stylus description.
57  *
58  *  Usage Page (Desktop),           ; Generic desktop controls (01h)
59  *  Usage (Mouse),                  ; Mouse (02h, application collection)
60  *  Collection (Application),
61  *    Report ID (1),
62  *    Usage (Pointer),              ; Pointer (01h, physical collection)
63  *    Collection (Physical),
64  *      Usage Page (Button),        ; Button (09h)
65  *      Usage Minimum (01h),
66  *      Usage Maximum (05h),
67  *      Logical Minimum (0),
68  *      Logical Maximum (1),
69  *      Report Size (1),
70  *      Report Count (5),
71  *      Input (Variable),
72  *      Report Size (3),
73  *      Report Count (1),
74  *      Input (Constant, Variable),
75  *      Usage Page (Desktop),       ; Generic desktop controls (01h)
76  *      Usage (X),                  ; X (30h, dynamic value)
77  *      Usage (Y),                  ; Y (31h, dynamic value)
78  *      Usage (Wheel),              ; Wheel (38h, dynamic value)
79  *      Logical Minimum (-127),
80  *      Logical Maximum (127),
81  *      Report Size (8),
82  *      Report Count (3),
83  *      Input (Variable, Relative),
84  *    End Collection,
85  *  End Collection,
86  *  Usage Page (Digitizer),         ; Digitizer (0Dh)
87  *  Usage (Pen),                    ; Pen (02h, application collection)
88  *  Collection (Application),
89  *    Report ID (2),
90  *    Usage (Stylus),               ; Stylus (20h, logical collection)
91  *    Collection (Physical),
92  *      Usage (00h),
93  *      Logical Minimum (0),
94  *      Logical Maximum (255),
95  *      Report Size (8),
96  *      Report Count (7),
97  *      Input (Variable),
98  *      Usage (Azimuth),            ; Azimuth (3Fh, dynamic value)
99  *      Usage (Altitude),           ; Altitude (40h, dynamic value)
100  *      Logical Minimum (0),
101  *      Logical Maximum (255),
102  *      Report Size (8),
103  *      Report Count (2),
104  *      Feature (Variable),
105  *    End Collection,
106  *    Report ID (5),
107  *    Usage Page (Digitizer),       ; Digitizer (0Dh)
108  *    Usage (Stylus),               ; Stylus (20h, logical collection)
109  *    Collection (Physical),
110  *      Usage (00h),
111  *      Logical Minimum (0),
112  *      Logical Maximum (255),
113  *      Report Size (8),
114  *      Report Count (7),
115  *      Input (Variable),
116  *    End Collection,
117  *    Report ID (10),
118  *    Usage Page (Digitizer),       ; Digitizer (0Dh)
119  *    Usage (Stylus),               ; Stylus (20h, logical collection)
120  *    Collection (Physical),
121  *      Usage (00h),
122  *      Logical Minimum (0),
123  *      Logical Maximum (255),
124  *      Report Size (8),
125  *      Report Count (3),
126  *      Input (Variable),
127  *    End Collection,
128  *    Report ID (16),
129  *    Usage (Stylus),               ; Stylus (20h, logical collection)
130  *    Collection (Physical),
131  *      Usage (Tip Switch),         ; Tip switch (42h, momentary control)
132  *      Usage (Barrel Switch),      ; Barrel switch (44h, momentary control)
133  *      Usage (Invert),             ; Invert (3Ch, momentary control)
134  *      Usage (Eraser),             ; Eraser (45h, momentary control)
135  *      Usage (In Range),           ; In range (32h, momentary control)
136  *      Logical Minimum (0),
137  *      Logical Maximum (1),
138  *      Report Size (1),
139  *      Report Count (5),
140  *      Input (Variable),
141  *      Report Count (3),
142  *      Input (Constant, Variable),
143  *      Usage Page (Desktop),       ; Generic desktop controls (01h)
144  *      Usage (X),                  ; X (30h, dynamic value)
145  *      Report Size (16),
146  *      Report Count (1),
147  *      Push,
148  *      Unit Exponent (13),
149  *      Unit (Inch^3),
150  *      Logical Minimum (0),
151  *      Logical Maximum (10000),
152  *      Physical Minimum (0),
153  *      Physical Maximum (10000),
154  *      Input (Variable),
155  *      Usage (Y),                  ; Y (31h, dynamic value)
156  *      Logical Maximum (6000),
157  *      Physical Maximum (6000),
158  *      Input (Variable),
159  *      Usage Page (Digitizer),     ; Digitizer (0Dh)
160  *      Usage (Tip Pressure),       ; Tip pressure (30h, dynamic value)
161  *      Logical Minimum (0),
162  *      Logical Maximum (1023),
163  *      Physical Minimum (0),
164  *      Physical Maximum (1023),
165  *      Input (Variable),
166  *    End Collection,
167  *  End Collection
168  */
169
170 /* Size of the original report descriptor of Slim Tablet 5.8 inch */
171 #define SLIM_TABLET_5_8_INCH_RDESC_ORIG_SIZE    222
172
173 /*
174  * Fixed Slim Tablet 5.8 inch descriptor.
175  *
176  * All the reports except the stylus report (ID 16) were removed as unused.
177  * The stylus buttons description was fixed.
178  */
179 static __u8 slim_tablet_5_8_inch_rdesc_fixed[] = {
180         0x05, 0x0D,         /*  Usage Page (Digitizer),             */
181         0x09, 0x02,         /*  Usage (Pen),                        */
182         0xA1, 0x01,         /*  Collection (Application),           */
183         0x85, 0x10,         /*      Report ID (16),                 */
184         0x09, 0x20,         /*      Usage (Stylus),                 */
185         0xA0,               /*      Collection (Physical),          */
186         0x09, 0x42,         /*          Usage (Tip Switch),         */
187         0x09, 0x44,         /*          Usage (Barrel Switch),      */
188         0x09, 0x46,         /*          Usage (Tablet Pick),        */
189         0x15, 0x01,         /*          Logical Minimum (1),        */
190         0x25, 0x03,         /*          Logical Maximum (3),        */
191         0x75, 0x04,         /*          Report Size (4),            */
192         0x95, 0x01,         /*          Report Count (1),           */
193         0x80,               /*          Input,                      */
194         0x09, 0x32,         /*          Usage (In Range),           */
195         0x14,               /*          Logical Minimum (0),        */
196         0x25, 0x01,         /*          Logical Maximum (1),        */
197         0x75, 0x01,         /*          Report Size (1),            */
198         0x95, 0x01,         /*          Report Count (1),           */
199         0x81, 0x02,         /*          Input (Variable),           */
200         0x95, 0x03,         /*          Report Count (3),           */
201         0x81, 0x03,         /*          Input (Constant, Variable), */
202         0x75, 0x10,         /*          Report Size (16),           */
203         0x95, 0x01,         /*          Report Count (1),           */
204         0x14,               /*          Logical Minimum (0),        */
205         0xA4,               /*          Push,                       */
206         0x05, 0x01,         /*          Usage Page (Desktop),       */
207         0x65, 0x13,         /*          Unit (Inch),                */
208         0x55, 0xFD,         /*          Unit Exponent (-3),         */
209         0x34,               /*          Physical Minimum (0),       */
210         0x09, 0x30,         /*          Usage (X),                  */
211         0x46, 0x88, 0x13,   /*          Physical Maximum (5000),    */
212         0x26, 0x10, 0x27,   /*          Logical Maximum (10000),    */
213         0x81, 0x02,         /*          Input (Variable),           */
214         0x09, 0x31,         /*          Usage (Y),                  */
215         0x46, 0xB8, 0x0B,   /*          Physical Maximum (3000),    */
216         0x26, 0x70, 0x17,   /*          Logical Maximum (6000),     */
217         0x81, 0x02,         /*          Input (Variable),           */
218         0xB4,               /*          Pop,                        */
219         0x09, 0x30,         /*          Usage (Tip Pressure),       */
220         0x26, 0xFF, 0x03,   /*          Logical Maximum (1023),     */
221         0x81, 0x02,         /*          Input (Variable),           */
222         0xC0,               /*      End Collection,                 */
223         0xC0                /*  End Collection                      */
224 };
225
226 /*
227  * Original Slim Tablet 12.1 inch report descriptor.
228  *
229  * The descriptor is similar to the Slim Tablet 5.8 inch descriptor with the
230  * addition of a keyboard report, seemingly unused. It may have get here
231  * from a Media Tablet - probably an unimplemented feature.
232  *
233  *  Usage Page (Desktop),             ; Generic desktop controls (01h)
234  *  Usage (Mouse),                    ; Mouse (02h, application collection)
235  *  Collection (Application),
236  *    Report ID (1),
237  *    Usage (Pointer),                ; Pointer (01h, physical collection)
238  *    Collection (Physical),
239  *      Usage Page (Button),          ; Button (09h)
240  *      Usage Minimum (01h),
241  *      Usage Maximum (05h),
242  *      Logical Minimum (0),
243  *      Logical Maximum (1),
244  *      Report Size (1),
245  *      Report Count (5),
246  *      Input (Variable),
247  *      Report Size (3),
248  *      Report Count (1),
249  *      Input (Constant, Variable),
250  *      Usage Page (Desktop),         ; Generic desktop controls (01h)
251  *      Usage (X),                    ; X (30h, dynamic value)
252  *      Usage (Y),                    ; Y (31h, dynamic value)
253  *      Usage (Wheel),                ; Wheel (38h, dynamic value)
254  *      Logical Minimum (-127),
255  *      Logical Maximum (127),
256  *      Report Size (8),
257  *      Report Count (3),
258  *      Input (Variable, Relative),
259  *    End Collection,
260  *  End Collection,
261  *  Usage Page (Digitizer),           ; Digitizer (0Dh)
262  *  Usage (Pen),                      ; Pen (02h, application collection)
263  *  Collection (Application),
264  *    Report ID (2),
265  *    Usage (Stylus),                 ; Stylus (20h, logical collection)
266  *    Collection (Physical),
267  *      Usage (00h),
268  *      Logical Minimum (0),
269  *      Logical Maximum (255),
270  *      Report Size (8),
271  *      Report Count (7),
272  *      Input (Variable),
273  *      Usage (Azimuth),              ; Azimuth (3Fh, dynamic value)
274  *      Usage (Altitude),             ; Altitude (40h, dynamic value)
275  *      Logical Minimum (0),
276  *      Logical Maximum (255),
277  *      Report Size (8),
278  *      Report Count (2),
279  *      Feature (Variable),
280  *    End Collection,
281  *    Report ID (5),
282  *    Usage Page (Digitizer),         ; Digitizer (0Dh)
283  *    Usage (Stylus),                 ; Stylus (20h, logical collection)
284  *    Collection (Physical),
285  *      Usage (00h),
286  *      Logical Minimum (0),
287  *      Logical Maximum (255),
288  *      Report Size (8),
289  *      Report Count (7),
290  *      Input (Variable),
291  *    End Collection,
292  *    Report ID (10),
293  *    Usage Page (Digitizer),         ; Digitizer (0Dh)
294  *    Usage (Stylus),                 ; Stylus (20h, logical collection)
295  *    Collection (Physical),
296  *      Usage (00h),
297  *      Logical Minimum (0),
298  *      Logical Maximum (255),
299  *      Report Size (8),
300  *      Report Count (3),
301  *      Input (Variable),
302  *    End Collection,
303  *    Report ID (16),
304  *    Usage (Stylus),                 ; Stylus (20h, logical collection)
305  *    Collection (Physical),
306  *      Usage (Tip Switch),           ; Tip switch (42h, momentary control)
307  *      Usage (Barrel Switch),        ; Barrel switch (44h, momentary control)
308  *      Usage (Invert),               ; Invert (3Ch, momentary control)
309  *      Usage (Eraser),               ; Eraser (45h, momentary control)
310  *      Usage (In Range),             ; In range (32h, momentary control)
311  *      Logical Minimum (0),
312  *      Logical Maximum (1),
313  *      Report Size (1),
314  *      Report Count (5),
315  *      Input (Variable),
316  *      Report Count (3),
317  *      Input (Constant, Variable),
318  *      Usage Page (Desktop),         ; Generic desktop controls (01h)
319  *      Usage (X),                    ; X (30h, dynamic value)
320  *      Report Size (16),
321  *      Report Count (1),
322  *      Push,
323  *      Unit Exponent (13),
324  *      Unit (Inch^3),
325  *      Logical Minimum (0),
326  *      Logical Maximum (20000),
327  *      Physical Minimum (0),
328  *      Physical Maximum (20000),
329  *      Input (Variable),
330  *      Usage (Y),                    ; Y (31h, dynamic value)
331  *      Logical Maximum (12500),
332  *      Physical Maximum (12500),
333  *      Input (Variable),
334  *      Usage Page (Digitizer),       ; Digitizer (0Dh)
335  *      Usage (Tip Pressure),         ; Tip pressure (30h, dynamic value)
336  *      Logical Minimum (0),
337  *      Logical Maximum (1023),
338  *      Physical Minimum (0),
339  *      Physical Maximum (1023),
340  *      Input (Variable),
341  *    End Collection,
342  *  End Collection,
343  *  Usage Page (Desktop),             ; Generic desktop controls (01h)
344  *  Usage (Keyboard),                 ; Keyboard (06h, application collection)
345  *  Collection (Application),
346  *    Report ID (13),
347  *    Usage Page (Keyboard),          ; Keyboard/keypad (07h)
348  *    Usage Minimum (KB Leftcontrol), ; Keyboard left control
349  *                                    ; (E0h, dynamic value)
350  *    Usage Maximum (KB Right GUI),   ; Keyboard right GUI (E7h, dynamic value)
351  *    Logical Minimum (0),
352  *    Logical Maximum (1),
353  *    Report Size (1),
354  *    Report Count (8),
355  *    Input (Variable),
356  *    Report Size (8),
357  *    Report Count (1),
358  *    Input (Constant),
359  *    Usage Page (Keyboard),          ; Keyboard/keypad (07h)
360  *    Usage Minimum (None),           ; No event (00h, selector)
361  *    Usage Maximum (KB Application), ; Keyboard Application (65h, selector)
362  *    Logical Minimum (0),
363  *    Logical Maximum (101),
364  *    Report Size (8),
365  *    Report Count (5),
366  *    Input,
367  *  End Collection
368  */
369
370 /* Size of the original report descriptor of Slim Tablet 12.1 inch */
371 #define SLIM_TABLET_12_1_INCH_RDESC_ORIG_SIZE   269
372
373 /*
374  * Fixed Slim Tablet 12.1 inch descriptor.
375  *
376  * All the reports except the stylus report (ID 16) were removed as unused.
377  * The stylus buttons description was fixed.
378  */
379 static __u8 slim_tablet_12_1_inch_rdesc_fixed[] = {
380         0x05, 0x0D,         /*  Usage Page (Digitizer),             */
381         0x09, 0x02,         /*  Usage (Pen),                        */
382         0xA1, 0x01,         /*  Collection (Application),           */
383         0x85, 0x10,         /*      Report ID (16),                 */
384         0x09, 0x20,         /*      Usage (Stylus),                 */
385         0xA0,               /*      Collection (Physical),          */
386         0x09, 0x42,         /*          Usage (Tip Switch),         */
387         0x09, 0x44,         /*          Usage (Barrel Switch),      */
388         0x09, 0x46,         /*          Usage (Tablet Pick),        */
389         0x15, 0x01,         /*          Logical Minimum (1),        */
390         0x25, 0x03,         /*          Logical Maximum (3),        */
391         0x75, 0x04,         /*          Report Size (4),            */
392         0x95, 0x01,         /*          Report Count (1),           */
393         0x80,               /*          Input,                      */
394         0x09, 0x32,         /*          Usage (In Range),           */
395         0x14,               /*          Logical Minimum (0),        */
396         0x25, 0x01,         /*          Logical Maximum (1),        */
397         0x75, 0x01,         /*          Report Size (1),            */
398         0x95, 0x01,         /*          Report Count (1),           */
399         0x81, 0x02,         /*          Input (Variable),           */
400         0x95, 0x03,         /*          Report Count (3),           */
401         0x81, 0x03,         /*          Input (Constant, Variable), */
402         0x75, 0x10,         /*          Report Size (16),           */
403         0x95, 0x01,         /*          Report Count (1),           */
404         0x14,               /*          Logical Minimum (0),        */
405         0xA4,               /*          Push,                       */
406         0x05, 0x01,         /*          Usage Page (Desktop),       */
407         0x65, 0x13,         /*          Unit (Inch),                */
408         0x55, 0xFD,         /*          Unit Exponent (-3),         */
409         0x34,               /*          Physical Minimum (0),       */
410         0x09, 0x30,         /*          Usage (X),                  */
411         0x46, 0x10, 0x27,   /*          Physical Maximum (10000),   */
412         0x26, 0x20, 0x4E,   /*          Logical Maximum (20000),    */
413         0x81, 0x02,         /*          Input (Variable),           */
414         0x09, 0x31,         /*          Usage (Y),                  */
415         0x46, 0x6A, 0x18,   /*          Physical Maximum (6250),    */
416         0x26, 0xD4, 0x30,   /*          Logical Maximum (12500),    */
417         0x81, 0x02,         /*          Input (Variable),           */
418         0xB4,               /*          Pop,                        */
419         0x09, 0x30,         /*          Usage (Tip Pressure),       */
420         0x26, 0xFF, 0x03,   /*          Logical Maximum (1023),     */
421         0x81, 0x02,         /*          Input (Variable),           */
422         0xC0,               /*      End Collection,                 */
423         0xC0                /*  End Collection                      */
424 };
425
426 /*
427  * Original Media Tablet 10.6 inch report descriptor.
428  *
429  * There are at least two versions of this model in the wild. They are
430  * represented by Genius G-Pen M609 (older version) and Genius G-Pen M609X
431  * (newer version).
432  *
433  * Both versions have the usual pen with two barrel buttons and two
434  * identical wheels with center buttons in the top corners of the tablet
435  * base. They also have buttons on the top, between the wheels, for
436  * selecting the wheels' functions and wide/standard mode. In the wide mode
437  * the whole working surface is sensed, in the standard mode a narrower area
438  * is sensed, but the logical report extents remain the same. These modes
439  * correspond roughly to 16:9 and 4:3 aspect ratios respectively.
440  *
441  * The older version has three wheel function buttons ("scroll", "zoom" and
442  * "volume") and two separate buttons for wide and standard mode. The newer
443  * version has four wheel function buttons (plus "brush") and only one
444  * button is used for selecting wide/standard mode. So, the total number of
445  * buttons remains the same, but one of the mode buttons is repurposed as a
446  * wheels' function button in the newer version.
447  *
448  * The wheel functions are:
449  * scroll   - the wheels act as scroll wheels, the center buttons switch
450  *            between vertical and horizontal scrolling;
451  * zoom     - the wheels zoom in/out, the buttons supposedly reset to 100%;
452  * volume   - the wheels control the sound volume, the buttons mute;
453  * brush    - the wheels are supposed to control brush width in a graphics
454  *            editor, the buttons do nothing.
455  *
456  * Below is the newer version's report descriptor. It may very well be that
457  * the older version's descriptor is different and thus it won't be
458  * supported.
459  *
460  * The mouse report (ID 1) only uses the wheel field for reporting the tablet
461  * wheels' scroll mode. The keyboard report (ID 13) is used to report the
462  * wheels' zoom and brush control functions as key presses. The report ID 12
463  * is used to report the wheels' volume control functions. The stylus report
464  * (ID 16) has the same problems as the Slim Tablet 5.8 inch report has.
465  *
466  * The rest of the reports are unused, at least in the default configuration.
467  * The purpose of the features is unknown.
468  *
469  *  Usage Page (Desktop),
470  *  Usage (Mouse),
471  *  Collection (Application),
472  *    Report ID (1),
473  *    Usage (Pointer),
474  *    Collection (Physical),
475  *      Usage Page (Button),
476  *      Usage Minimum (01h),
477  *      Usage Maximum (05h),
478  *      Logical Minimum (0),
479  *      Logical Maximum (1),
480  *      Report Size (1),
481  *      Report Count (5),
482  *      Input (Variable),
483  *      Report Size (3),
484  *      Report Count (1),
485  *      Input (Constant, Variable),
486  *      Usage Page (Desktop),
487  *      Usage (X),
488  *      Usage (Y),
489  *      Usage (Wheel),
490  *      Logical Minimum (-127),
491  *      Logical Maximum (127),
492  *      Report Size (8),
493  *      Report Count (3),
494  *      Input (Variable, Relative),
495  *    End Collection,
496  *  End Collection,
497  *  Usage Page (Digitizer),
498  *  Usage (Pen),
499  *  Collection (Application),
500  *    Report ID (2),
501  *    Usage (Stylus),
502  *    Collection (Physical),
503  *      Usage (00h),
504  *      Logical Minimum (0),
505  *      Logical Maximum (255),
506  *      Report Size (8),
507  *      Report Count (7),
508  *      Input (Variable),
509  *      Usage (Azimuth),
510  *      Usage (Altitude),
511  *      Logical Minimum (0),
512  *      Logical Maximum (255),
513  *      Report Size (8),
514  *      Report Count (2),
515  *      Feature (Variable),
516  *    End Collection,
517  *    Report ID (5),
518  *    Usage Page (Digitizer),
519  *    Usage (Stylus),
520  *    Collection (Physical),
521  *      Usage (00h),
522  *      Logical Minimum (0),
523  *      Logical Maximum (255),
524  *      Report Size (8),
525  *      Report Count (7),
526  *      Input (Variable),
527  *    End Collection,
528  *    Report ID (10),
529  *    Usage Page (Digitizer),
530  *    Usage (Stylus),
531  *    Collection (Physical),
532  *      Usage (00h),
533  *      Logical Minimum (0),
534  *      Logical Maximum (255),
535  *      Report Size (8),
536  *      Report Count (7),
537  *      Input (Variable),
538  *    End Collection,
539  *    Report ID (16),
540  *    Usage (Stylus),
541  *    Collection (Physical),
542  *      Usage (Tip Switch),
543  *      Usage (Barrel Switch),
544  *      Usage (Invert),
545  *      Usage (Eraser),
546  *      Usage (In Range),
547  *      Logical Minimum (0),
548  *      Logical Maximum (1),
549  *      Report Size (1),
550  *      Report Count (5),
551  *      Input (Variable),
552  *      Report Count (3),
553  *      Input (Constant, Variable),
554  *      Usage Page (Desktop),
555  *      Usage (X),
556  *      Report Size (16),
557  *      Report Count (1),
558  *      Push,
559  *      Unit Exponent (13),
560  *      Unit (Inch^3),
561  *      Logical Minimum (0),
562  *      Logical Maximum (18000),
563  *      Physical Minimum (0),
564  *      Physical Maximum (18000),
565  *      Input (Variable),
566  *      Usage (Y),
567  *      Logical Maximum (11000),
568  *      Physical Maximum (11000),
569  *      Input (Variable),
570  *      Usage Page (Digitizer),
571  *      Usage (Tip Pressure),
572  *      Logical Minimum (0),
573  *      Logical Maximum (1023),
574  *      Physical Minimum (0),
575  *      Physical Maximum (1023),
576  *      Input (Variable),
577  *    End Collection,
578  *  End Collection,
579  *  Usage Page (Desktop),
580  *  Usage (Keyboard),
581  *  Collection (Application),
582  *    Report ID (13),
583  *    Usage Page (Keyboard),
584  *    Usage Minimum (KB Leftcontrol),
585  *    Usage Maximum (KB Right GUI),
586  *    Logical Minimum (0),
587  *    Logical Maximum (1),
588  *    Report Size (1),
589  *    Report Count (8),
590  *    Input (Variable),
591  *    Report Size (8),
592  *    Report Count (1),
593  *    Input (Constant),
594  *    Usage Page (Keyboard),
595  *    Usage Minimum (None),
596  *    Usage Maximum (KB Application),
597  *    Logical Minimum (0),
598  *    Logical Maximum (101),
599  *    Report Size (8),
600  *    Report Count (5),
601  *    Input,
602  *  End Collection,
603  *  Usage Page (Consumer),
604  *  Usage (Consumer Control),
605  *  Collection (Application),
606  *    Report ID (12),
607  *    Usage (Volume Inc),
608  *    Usage (Volume Dec),
609  *    Usage (Mute),
610  *    Logical Minimum (0),
611  *    Logical Maximum (1),
612  *    Report Size (1),
613  *    Report Count (3),
614  *    Input (Variable, Relative),
615  *    Report Size (5),
616  *    Report Count (1),
617  *    Input (Constant, Variable, Relative),
618  *  End Collection
619  */
620
621 /* Size of the original report descriptor of Media Tablet 10.6 inch */
622 #define MEDIA_TABLET_10_6_INCH_RDESC_ORIG_SIZE  300
623
624 /*
625  * Fixed Media Tablet 10.6 inch descriptor.
626  *
627  * The descriptions of reports unused in the default configuration are
628  * removed. The stylus report (ID 16) is fixed similarly to Slim Tablet 5.8
629  * inch.  The unused mouse report (ID 1) fields are replaced with constant
630  * padding.
631  *
632  * The keyboard report (ID 13) is hacked to instead have an "array" field
633  * reporting consumer page controls, and all the unused bits are masked out
634  * with constant padding. The "brush" wheels' function is represented as "Scan
635  * Previous/Next Track" controls due to the lack of brush controls in the
636  * usage tables specification.
637  */
638 static __u8 media_tablet_10_6_inch_rdesc_fixed[] = {
639         0x05, 0x0D,         /*  Usage Page (Digitizer),             */
640         0x09, 0x02,         /*  Usage (Pen),                        */
641         0xA1, 0x01,         /*  Collection (Application),           */
642         0x85, 0x10,         /*      Report ID (16),                 */
643         0x09, 0x20,         /*      Usage (Stylus),                 */
644         0xA0,               /*      Collection (Physical),          */
645         0x09, 0x42,         /*          Usage (Tip Switch),         */
646         0x09, 0x44,         /*          Usage (Barrel Switch),      */
647         0x09, 0x46,         /*          Usage (Tablet Pick),        */
648         0x15, 0x01,         /*          Logical Minimum (1),        */
649         0x25, 0x03,         /*          Logical Maximum (3),        */
650         0x75, 0x04,         /*          Report Size (4),            */
651         0x95, 0x01,         /*          Report Count (1),           */
652         0x80,               /*          Input,                      */
653         0x75, 0x01,         /*          Report Size (1),            */
654         0x09, 0x32,         /*          Usage (In Range),           */
655         0x14,               /*          Logical Minimum (0),        */
656         0x25, 0x01,         /*          Logical Maximum (1),        */
657         0x95, 0x01,         /*          Report Count (1),           */
658         0x81, 0x02,         /*          Input (Variable),           */
659         0x95, 0x03,         /*          Report Count (3),           */
660         0x81, 0x03,         /*          Input (Constant, Variable), */
661         0x75, 0x10,         /*          Report Size (16),           */
662         0x95, 0x01,         /*          Report Count (1),           */
663         0x14,               /*          Logical Minimum (0),        */
664         0xA4,               /*          Push,                       */
665         0x05, 0x01,         /*          Usage Page (Desktop),       */
666         0x65, 0x13,         /*          Unit (Inch),                */
667         0x55, 0xFD,         /*          Unit Exponent (-3),         */
668         0x34,               /*          Physical Minimum (0),       */
669         0x09, 0x30,         /*          Usage (X),                  */
670         0x46, 0x28, 0x23,   /*          Physical Maximum (9000),    */
671         0x26, 0x50, 0x46,   /*          Logical Maximum (18000),    */
672         0x81, 0x02,         /*          Input (Variable),           */
673         0x09, 0x31,         /*          Usage (Y),                  */
674         0x46, 0x7C, 0x15,   /*          Physical Maximum (5500),    */
675         0x26, 0xF8, 0x2A,   /*          Logical Maximum (11000),    */
676         0x81, 0x02,         /*          Input (Variable),           */
677         0xB4,               /*          Pop,                        */
678         0x09, 0x30,         /*          Usage (Tip Pressure),       */
679         0x26, 0xFF, 0x03,   /*          Logical Maximum (1023),     */
680         0x81, 0x02,         /*          Input (Variable),           */
681         0xC0,               /*      End Collection,                 */
682         0xC0,               /*  End Collection,                     */
683         0x05, 0x01,         /*  Usage Page (Desktop),               */
684         0x09, 0x02,         /*  Usage (Mouse),                      */
685         0xA1, 0x01,         /*  Collection (Application),           */
686         0x85, 0x01,         /*      Report ID (1),                  */
687         0x09, 0x01,         /*      Usage (Pointer),                */
688         0xA0,               /*      Collection (Physical),          */
689         0x75, 0x08,         /*          Report Size (8),            */
690         0x95, 0x03,         /*          Report Count (3),           */
691         0x81, 0x03,         /*          Input (Constant, Variable), */
692         0x95, 0x02,         /*          Report Count (2),           */
693         0x15, 0xFF,         /*          Logical Minimum (-1),       */
694         0x25, 0x01,         /*          Logical Maximum (1),        */
695         0x09, 0x38,         /*          Usage (Wheel),              */
696         0x0B, 0x38, 0x02,   /*          Usage (Consumer AC Pan),    */
697                 0x0C, 0x00,
698         0x81, 0x06,         /*          Input (Variable, Relative), */
699         0x95, 0x02,         /*          Report Count (2),           */
700         0x81, 0x03,         /*          Input (Constant, Variable), */
701         0xC0,               /*      End Collection,                 */
702         0xC0,               /*  End Collection,                     */
703         0x05, 0x0C,         /*  Usage Page (Consumer),              */
704         0x09, 0x01,         /*  Usage (Consumer Control),           */
705         0xA1, 0x01,         /*  Collection (Application),           */
706         0x85, 0x0D,         /*      Report ID (13),                 */
707         0x95, 0x01,         /*      Report Count (1),               */
708         0x75, 0x10,         /*      Report Size (16),               */
709         0x81, 0x03,         /*      Input (Constant, Variable),     */
710         0x0A, 0x2F, 0x02,   /*      Usage (AC Zoom),                */
711         0x0A, 0x2E, 0x02,   /*      Usage (AC Zoom Out),            */
712         0x0A, 0x2D, 0x02,   /*      Usage (AC Zoom In),             */
713         0x09, 0xB6,         /*      Usage (Scan Previous Track),    */
714         0x09, 0xB5,         /*      Usage (Scan Next Track),        */
715         0x08,               /*      Usage (00h),                    */
716         0x08,               /*      Usage (00h),                    */
717         0x08,               /*      Usage (00h),                    */
718         0x08,               /*      Usage (00h),                    */
719         0x08,               /*      Usage (00h),                    */
720         0x0A, 0x2E, 0x02,   /*      Usage (AC Zoom Out),            */
721         0x0A, 0x2D, 0x02,   /*      Usage (AC Zoom In),             */
722         0x15, 0x0C,         /*      Logical Minimum (12),           */
723         0x25, 0x17,         /*      Logical Maximum (23),           */
724         0x75, 0x05,         /*      Report Size (5),                */
725         0x80,               /*      Input,                          */
726         0x75, 0x03,         /*      Report Size (3),                */
727         0x81, 0x03,         /*      Input (Constant, Variable),     */
728         0x75, 0x20,         /*      Report Size (32),               */
729         0x81, 0x03,         /*      Input (Constant, Variable),     */
730         0xC0,               /*  End Collection,                     */
731         0x09, 0x01,         /*  Usage (Consumer Control),           */
732         0xA1, 0x01,         /*  Collection (Application),           */
733         0x85, 0x0C,         /*      Report ID (12),                 */
734         0x75, 0x01,         /*      Report Size (1),                */
735         0x09, 0xE9,         /*      Usage (Volume Inc),             */
736         0x09, 0xEA,         /*      Usage (Volume Dec),             */
737         0x09, 0xE2,         /*      Usage (Mute),                   */
738         0x14,               /*      Logical Minimum (0),            */
739         0x25, 0x01,         /*      Logical Maximum (1),            */
740         0x95, 0x03,         /*      Report Count (3),               */
741         0x81, 0x06,         /*      Input (Variable, Relative),     */
742         0x95, 0x35,         /*      Report Count (53),              */
743         0x81, 0x03,         /*      Input (Constant, Variable),     */
744         0xC0                /*  End Collection                      */
745 };
746
747 /*
748  * Original Media Tablet 14.1 inch report descriptor.
749  *
750  * There are at least two versions of this model in the wild. They are
751  * represented by Genius G-Pen M712 (older version) and Genius G-Pen M712X
752  * (newer version). The hardware difference between these versions is the same
753  * as between older and newer versions of Media Tablet 10.6 inch. The report
754  * descriptors are identical for both versions.
755  *
756  * The function, behavior and report descriptor of this tablet is similar to
757  * that of Media Tablet 10.6 inch. However, there is one more field (with
758  * Consumer AC Pan usage) in the mouse description. Then the tablet X and Y
759  * logical extents both get scaled to 0..16383 range (a hardware limit?),
760  * which kind of defeats the advertised 4000 LPI resolution, considering the
761  * physical extents of 12x7.25 inches. Plus, reports 5, 10 and 255 are used
762  * sometimes (while moving the pen) with unknown purpose. Also, the key codes
763  * generated for zoom in/out are different.
764  *
765  *  Usage Page (Desktop),
766  *  Usage (Mouse),
767  *  Collection (Application),
768  *    Report ID (1),
769  *    Usage (Pointer),
770  *    Collection (Physical),
771  *      Usage Page (Button),
772  *      Usage Minimum (01h),
773  *      Usage Maximum (05h),
774  *      Logical Minimum (0),
775  *      Logical Maximum (1),
776  *      Report Size (1),
777  *      Report Count (5),
778  *      Input (Variable),
779  *      Report Size (3),
780  *      Report Count (1),
781  *      Input (Constant, Variable),
782  *      Usage Page (Desktop),
783  *      Usage (X),
784  *      Usage (Y),
785  *      Usage (Wheel),
786  *      Logical Minimum (-127),
787  *      Logical Maximum (127),
788  *      Report Size (8),
789  *      Report Count (3),
790  *      Input (Variable, Relative),
791  *      Usage Page (Consumer),
792  *      Logical Minimum (-127),
793  *      Logical Maximum (127),
794  *      Report Size (8),
795  *      Report Count (1),
796  *      Usage (AC Pan),
797  *      Input (Variable, Relative),
798  *    End Collection,
799  *  End Collection,
800  *  Usage Page (Digitizer),
801  *  Usage (Pen),
802  *  Collection (Application),
803  *    Report ID (2),
804  *    Usage (Stylus),
805  *    Collection (Physical),
806  *      Usage (00h),
807  *      Logical Minimum (0),
808  *      Logical Maximum (255),
809  *      Report Size (8),
810  *      Report Count (7),
811  *      Input (Variable),
812  *      Usage (Azimuth),
813  *      Usage (Altitude),
814  *      Logical Minimum (0),
815  *      Logical Maximum (255),
816  *      Report Size (8),
817  *      Report Count (2),
818  *      Feature (Variable),
819  *    End Collection,
820  *    Report ID (5),
821  *    Usage Page (Digitizer),
822  *    Usage (Stylus),
823  *    Collection (Physical),
824  *      Usage (00h),
825  *      Logical Minimum (0),
826  *      Logical Maximum (255),
827  *      Report Size (8),
828  *      Report Count (7),
829  *      Input (Variable),
830  *    End Collection,
831  *    Report ID (10),
832  *    Usage Page (Digitizer),
833  *    Usage (Stylus),
834  *    Collection (Physical),
835  *      Usage (00h),
836  *      Logical Minimum (0),
837  *      Logical Maximum (255),
838  *      Report Size (8),
839  *      Report Count (7),
840  *      Input (Variable),
841  *    End Collection,
842  *    Report ID (16),
843  *    Usage (Stylus),
844  *    Collection (Physical),
845  *      Usage (Tip Switch),
846  *      Usage (Barrel Switch),
847  *      Usage (Invert),
848  *      Usage (Eraser),
849  *      Usage (In Range),
850  *      Logical Minimum (0),
851  *      Logical Maximum (1),
852  *      Report Size (1),
853  *      Report Count (5),
854  *      Input (Variable),
855  *      Report Count (3),
856  *      Input (Constant, Variable),
857  *      Usage Page (Desktop),
858  *      Usage (X),
859  *      Report Size (16),
860  *      Report Count (1),
861  *      Push,
862  *      Unit Exponent (13),
863  *      Unit (Inch^3),
864  *      Logical Minimum (0),
865  *      Logical Maximum (16383),
866  *      Physical Minimum (0),
867  *      Physical Maximum (16383),
868  *      Input (Variable),
869  *      Usage (Y),
870  *      Input (Variable),
871  *      Usage Page (Digitizer),
872  *      Usage (Tip Pressure),
873  *      Logical Minimum (0),
874  *      Logical Maximum (1023),
875  *      Physical Minimum (0),
876  *      Physical Maximum (1023),
877  *      Input (Variable),
878  *    End Collection,
879  *  End Collection,
880  *  Usage Page (Desktop),
881  *  Usage (Keyboard),
882  *  Collection (Application),
883  *    Report ID (13),
884  *    Usage Page (Keyboard),
885  *    Usage Minimum (KB Leftcontrol),
886  *    Usage Maximum (KB Right GUI),
887  *    Logical Minimum (0),
888  *    Logical Maximum (1),
889  *    Report Size (1),
890  *    Report Count (8),
891  *    Input (Variable),
892  *    Report Size (8),
893  *    Report Count (1),
894  *    Input (Constant),
895  *    Usage Page (Keyboard),
896  *    Usage Minimum (None),
897  *    Usage Maximum (KB Application),
898  *    Logical Minimum (0),
899  *    Logical Maximum (101),
900  *    Report Size (8),
901  *    Report Count (5),
902  *    Input,
903  *  End Collection,
904  *  Usage Page (Consumer),
905  *  Usage (Consumer Control),
906  *  Collection (Application),
907  *    Report ID (12),
908  *    Usage (Volume Inc),
909  *    Usage (Volume Dec),
910  *    Usage (Mute),
911  *    Logical Minimum (0),
912  *    Logical Maximum (1),
913  *    Report Size (1),
914  *    Report Count (3),
915  *    Input (Variable, Relative),
916  *    Report Size (5),
917  *    Report Count (1),
918  *    Input (Constant, Variable, Relative),
919  *  End Collection
920  */
921
922 /* Size of the original report descriptor of Media Tablet 14.1 inch */
923 #define MEDIA_TABLET_14_1_INCH_RDESC_ORIG_SIZE  309
924
925 /*
926  * Fixed Media Tablet 14.1 inch descriptor.
927  * It is fixed similarly to the Media Tablet 10.6 inch descriptor.
928  */
929 static __u8 media_tablet_14_1_inch_rdesc_fixed[] = {
930         0x05, 0x0D,         /*  Usage Page (Digitizer),             */
931         0x09, 0x02,         /*  Usage (Pen),                        */
932         0xA1, 0x01,         /*  Collection (Application),           */
933         0x85, 0x10,         /*      Report ID (16),                 */
934         0x09, 0x20,         /*      Usage (Stylus),                 */
935         0xA0,               /*      Collection (Physical),          */
936         0x09, 0x42,         /*          Usage (Tip Switch),         */
937         0x09, 0x44,         /*          Usage (Barrel Switch),      */
938         0x09, 0x46,         /*          Usage (Tablet Pick),        */
939         0x15, 0x01,         /*          Logical Minimum (1),        */
940         0x25, 0x03,         /*          Logical Maximum (3),        */
941         0x75, 0x04,         /*          Report Size (4),            */
942         0x95, 0x01,         /*          Report Count (1),           */
943         0x80,               /*          Input,                      */
944         0x75, 0x01,         /*          Report Size (1),            */
945         0x09, 0x32,         /*          Usage (In Range),           */
946         0x14,               /*          Logical Minimum (0),        */
947         0x25, 0x01,         /*          Logical Maximum (1),        */
948         0x95, 0x01,         /*          Report Count (1),           */
949         0x81, 0x02,         /*          Input (Variable),           */
950         0x95, 0x03,         /*          Report Count (3),           */
951         0x81, 0x03,         /*          Input (Constant, Variable), */
952         0x75, 0x10,         /*          Report Size (16),           */
953         0x95, 0x01,         /*          Report Count (1),           */
954         0x14,               /*          Logical Minimum (0),        */
955         0xA4,               /*          Push,                       */
956         0x05, 0x01,         /*          Usage Page (Desktop),       */
957         0x65, 0x13,         /*          Unit (Inch),                */
958         0x55, 0xFD,         /*          Unit Exponent (-3),         */
959         0x34,               /*          Physical Minimum (0),       */
960         0x09, 0x30,         /*          Usage (X),                  */
961         0x46, 0xE0, 0x2E,   /*          Physical Maximum (12000),   */
962         0x26, 0xFF, 0x3F,   /*          Logical Maximum (16383),    */
963         0x81, 0x02,         /*          Input (Variable),           */
964         0x09, 0x31,         /*          Usage (Y),                  */
965         0x46, 0x52, 0x1C,   /*          Physical Maximum (7250),    */
966         0x26, 0xFF, 0x3F,   /*          Logical Maximum (16383),    */
967         0x81, 0x02,         /*          Input (Variable),           */
968         0xB4,               /*          Pop,                        */
969         0x09, 0x30,         /*          Usage (Tip Pressure),       */
970         0x26, 0xFF, 0x03,   /*          Logical Maximum (1023),     */
971         0x81, 0x02,         /*          Input (Variable),           */
972         0xC0,               /*      End Collection,                 */
973         0xC0,               /*  End Collection,                     */
974         0x05, 0x01,         /*  Usage Page (Desktop),               */
975         0x09, 0x02,         /*  Usage (Mouse),                      */
976         0xA1, 0x01,         /*  Collection (Application),           */
977         0x85, 0x01,         /*      Report ID (1),                  */
978         0x09, 0x01,         /*      Usage (Pointer),                */
979         0xA0,               /*      Collection (Physical),          */
980         0x75, 0x08,         /*          Report Size (8),            */
981         0x95, 0x03,         /*          Report Count (3),           */
982         0x81, 0x03,         /*          Input (Constant, Variable), */
983         0x95, 0x02,         /*          Report Count (2),           */
984         0x15, 0xFF,         /*          Logical Minimum (-1),       */
985         0x25, 0x01,         /*          Logical Maximum (1),        */
986         0x09, 0x38,         /*          Usage (Wheel),              */
987         0x0B, 0x38, 0x02,   /*          Usage (Consumer AC Pan),    */
988                 0x0C, 0x00,
989         0x81, 0x06,         /*          Input (Variable, Relative), */
990         0xC0,               /*      End Collection,                 */
991         0xC0,               /*  End Collection,                     */
992         0x05, 0x0C,         /*  Usage Page (Consumer),              */
993         0x09, 0x01,         /*  Usage (Consumer Control),           */
994         0xA1, 0x01,         /*  Collection (Application),           */
995         0x85, 0x0D,         /*      Report ID (13),                 */
996         0x95, 0x01,         /*      Report Count (1),               */
997         0x75, 0x10,         /*      Report Size (16),               */
998         0x81, 0x03,         /*      Input (Constant, Variable),     */
999         0x0A, 0x2F, 0x02,   /*      Usage (AC Zoom),                */
1000         0x0A, 0x2E, 0x02,   /*      Usage (AC Zoom Out),            */
1001         0x0A, 0x2D, 0x02,   /*      Usage (AC Zoom In),             */
1002         0x09, 0xB6,         /*      Usage (Scan Previous Track),    */
1003         0x09, 0xB5,         /*      Usage (Scan Next Track),        */
1004         0x08,               /*      Usage (00h),                    */
1005         0x08,               /*      Usage (00h),                    */
1006         0x08,               /*      Usage (00h),                    */
1007         0x08,               /*      Usage (00h),                    */
1008         0x08,               /*      Usage (00h),                    */
1009         0x0A, 0x2E, 0x02,   /*      Usage (AC Zoom Out),            */
1010         0x0A, 0x2D, 0x02,   /*      Usage (AC Zoom In),             */
1011         0x15, 0x0C,         /*      Logical Minimum (12),           */
1012         0x25, 0x17,         /*      Logical Maximum (23),           */
1013         0x75, 0x05,         /*      Report Size (5),                */
1014         0x80,               /*      Input,                          */
1015         0x75, 0x03,         /*      Report Size (3),                */
1016         0x81, 0x03,         /*      Input (Constant, Variable),     */
1017         0x75, 0x20,         /*      Report Size (32),               */
1018         0x81, 0x03,         /*      Input (Constant, Variable),     */
1019         0xC0,               /*  End Collection,                     */
1020         0x09, 0x01,         /*  Usage (Consumer Control),           */
1021         0xA1, 0x01,         /*  Collection (Application),           */
1022         0x85, 0x0C,         /*      Report ID (12),                 */
1023         0x75, 0x01,         /*      Report Size (1),                */
1024         0x09, 0xE9,         /*      Usage (Volume Inc),             */
1025         0x09, 0xEA,         /*      Usage (Volume Dec),             */
1026         0x09, 0xE2,         /*      Usage (Mute),                   */
1027         0x14,               /*      Logical Minimum (0),            */
1028         0x25, 0x01,         /*      Logical Maximum (1),            */
1029         0x95, 0x03,         /*      Report Count (3),               */
1030         0x81, 0x06,         /*      Input (Variable, Relative),     */
1031         0x75, 0x05,         /*      Report Size (5),                */
1032         0x81, 0x03,         /*      Input (Constant, Variable),     */
1033         0xC0                /*  End Collection                      */
1034 };
1035
1036 static __u8 *waltop_report_fixup(struct hid_device *hdev, __u8 *rdesc,
1037                 unsigned int *rsize)
1038 {
1039         switch (hdev->product) {
1040         case USB_DEVICE_ID_WALTOP_SLIM_TABLET_5_8_INCH:
1041                 if (*rsize == SLIM_TABLET_5_8_INCH_RDESC_ORIG_SIZE) {
1042                         rdesc = slim_tablet_5_8_inch_rdesc_fixed;
1043                         *rsize = sizeof(slim_tablet_5_8_inch_rdesc_fixed);
1044                 }
1045                 break;
1046         case USB_DEVICE_ID_WALTOP_SLIM_TABLET_12_1_INCH:
1047                 if (*rsize == SLIM_TABLET_12_1_INCH_RDESC_ORIG_SIZE) {
1048                         rdesc = slim_tablet_12_1_inch_rdesc_fixed;
1049                         *rsize = sizeof(slim_tablet_12_1_inch_rdesc_fixed);
1050                 }
1051                 break;
1052         case USB_DEVICE_ID_WALTOP_MEDIA_TABLET_10_6_INCH:
1053                 if (*rsize == MEDIA_TABLET_10_6_INCH_RDESC_ORIG_SIZE) {
1054                         rdesc = media_tablet_10_6_inch_rdesc_fixed;
1055                         *rsize = sizeof(media_tablet_10_6_inch_rdesc_fixed);
1056                 }
1057                 break;
1058         case USB_DEVICE_ID_WALTOP_MEDIA_TABLET_14_1_INCH:
1059                 if (*rsize == MEDIA_TABLET_14_1_INCH_RDESC_ORIG_SIZE) {
1060                         rdesc = media_tablet_14_1_inch_rdesc_fixed;
1061                         *rsize = sizeof(media_tablet_14_1_inch_rdesc_fixed);
1062                 }
1063                 break;
1064         }
1065         return rdesc;
1066 }
1067
1068 static const struct hid_device_id waltop_devices[] = {
1069         { HID_USB_DEVICE(USB_VENDOR_ID_WALTOP,
1070                                 USB_DEVICE_ID_WALTOP_SLIM_TABLET_5_8_INCH) },
1071         { HID_USB_DEVICE(USB_VENDOR_ID_WALTOP,
1072                                 USB_DEVICE_ID_WALTOP_SLIM_TABLET_12_1_INCH) },
1073         { HID_USB_DEVICE(USB_VENDOR_ID_WALTOP,
1074                                 USB_DEVICE_ID_WALTOP_MEDIA_TABLET_10_6_INCH) },
1075         { HID_USB_DEVICE(USB_VENDOR_ID_WALTOP,
1076                                 USB_DEVICE_ID_WALTOP_MEDIA_TABLET_14_1_INCH) },
1077         { }
1078 };
1079 MODULE_DEVICE_TABLE(hid, waltop_devices);
1080
1081 static struct hid_driver waltop_driver = {
1082         .name = "waltop",
1083         .id_table = waltop_devices,
1084         .report_fixup = waltop_report_fixup,
1085 };
1086
1087 static int __init waltop_init(void)
1088 {
1089         return hid_register_driver(&waltop_driver);
1090 }
1091
1092 static void __exit waltop_exit(void)
1093 {
1094         hid_unregister_driver(&waltop_driver);
1095 }
1096
1097 module_init(waltop_init);
1098 module_exit(waltop_exit);
1099 MODULE_LICENSE("GPL");