xref: /OK3568_Linux_fs/kernel/drivers/hid/i2c-hid/i2c-hid-dmi-quirks.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0+
2*4882a593Smuzhiyun 
3*4882a593Smuzhiyun /*
4*4882a593Smuzhiyun  * Quirks for I2C-HID devices that do not supply proper descriptors
5*4882a593Smuzhiyun  *
6*4882a593Smuzhiyun  * Copyright (c) 2018 Julian Sax <jsbc@gmx.de>
7*4882a593Smuzhiyun  *
8*4882a593Smuzhiyun  */
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun #include <linux/types.h>
11*4882a593Smuzhiyun #include <linux/dmi.h>
12*4882a593Smuzhiyun #include <linux/mod_devicetable.h>
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun #include "i2c-hid.h"
15*4882a593Smuzhiyun 
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun struct i2c_hid_desc_override {
18*4882a593Smuzhiyun 	union {
19*4882a593Smuzhiyun 		struct i2c_hid_desc *i2c_hid_desc;
20*4882a593Smuzhiyun 		uint8_t             *i2c_hid_desc_buffer;
21*4882a593Smuzhiyun 	};
22*4882a593Smuzhiyun 	uint8_t              *hid_report_desc;
23*4882a593Smuzhiyun 	unsigned int          hid_report_desc_size;
24*4882a593Smuzhiyun 	uint8_t              *i2c_name;
25*4882a593Smuzhiyun };
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun 
28*4882a593Smuzhiyun /*
29*4882a593Smuzhiyun  * descriptors for the SIPODEV SP1064 touchpad
30*4882a593Smuzhiyun  *
31*4882a593Smuzhiyun  * This device does not supply any descriptors and on windows a filter
32*4882a593Smuzhiyun  * driver operates between the i2c-hid layer and the device and injects
33*4882a593Smuzhiyun  * these descriptors when the device is prompted. The descriptors were
34*4882a593Smuzhiyun  * extracted by listening to the i2c-hid traffic that occurs between the
35*4882a593Smuzhiyun  * windows filter driver and the windows i2c-hid driver.
36*4882a593Smuzhiyun  */
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun static const struct i2c_hid_desc_override sipodev_desc = {
39*4882a593Smuzhiyun 	.i2c_hid_desc_buffer = (uint8_t [])
40*4882a593Smuzhiyun 	{0x1e, 0x00,                  /* Length of descriptor                 */
41*4882a593Smuzhiyun 	 0x00, 0x01,                  /* Version of descriptor                */
42*4882a593Smuzhiyun 	 0xdb, 0x01,                  /* Length of report descriptor          */
43*4882a593Smuzhiyun 	 0x21, 0x00,                  /* Location of report descriptor        */
44*4882a593Smuzhiyun 	 0x24, 0x00,                  /* Location of input report             */
45*4882a593Smuzhiyun 	 0x1b, 0x00,                  /* Max input report length              */
46*4882a593Smuzhiyun 	 0x25, 0x00,                  /* Location of output report            */
47*4882a593Smuzhiyun 	 0x11, 0x00,                  /* Max output report length             */
48*4882a593Smuzhiyun 	 0x22, 0x00,                  /* Location of command register         */
49*4882a593Smuzhiyun 	 0x23, 0x00,                  /* Location of data register            */
50*4882a593Smuzhiyun 	 0x11, 0x09,                  /* Vendor ID                            */
51*4882a593Smuzhiyun 	 0x88, 0x52,                  /* Product ID                           */
52*4882a593Smuzhiyun 	 0x06, 0x00,                  /* Version ID                           */
53*4882a593Smuzhiyun 	 0x00, 0x00, 0x00, 0x00       /* Reserved                             */
54*4882a593Smuzhiyun 	},
55*4882a593Smuzhiyun 
56*4882a593Smuzhiyun 	.hid_report_desc = (uint8_t [])
57*4882a593Smuzhiyun 	{0x05, 0x01,                  /* Usage Page (Desktop),                */
58*4882a593Smuzhiyun 	 0x09, 0x02,                  /* Usage (Mouse),                       */
59*4882a593Smuzhiyun 	 0xA1, 0x01,                  /* Collection (Application),            */
60*4882a593Smuzhiyun 	 0x85, 0x01,                  /*     Report ID (1),                   */
61*4882a593Smuzhiyun 	 0x09, 0x01,                  /*     Usage (Pointer),                 */
62*4882a593Smuzhiyun 	 0xA1, 0x00,                  /*     Collection (Physical),           */
63*4882a593Smuzhiyun 	 0x05, 0x09,                  /*         Usage Page (Button),         */
64*4882a593Smuzhiyun 	 0x19, 0x01,                  /*         Usage Minimum (01h),         */
65*4882a593Smuzhiyun 	 0x29, 0x02,                  /*         Usage Maximum (02h),         */
66*4882a593Smuzhiyun 	 0x25, 0x01,                  /*         Logical Maximum (1),         */
67*4882a593Smuzhiyun 	 0x75, 0x01,                  /*         Report Size (1),             */
68*4882a593Smuzhiyun 	 0x95, 0x02,                  /*         Report Count (2),            */
69*4882a593Smuzhiyun 	 0x81, 0x02,                  /*         Input (Variable),            */
70*4882a593Smuzhiyun 	 0x95, 0x06,                  /*         Report Count (6),            */
71*4882a593Smuzhiyun 	 0x81, 0x01,                  /*         Input (Constant),            */
72*4882a593Smuzhiyun 	 0x05, 0x01,                  /*         Usage Page (Desktop),        */
73*4882a593Smuzhiyun 	 0x09, 0x30,                  /*         Usage (X),                   */
74*4882a593Smuzhiyun 	 0x09, 0x31,                  /*         Usage (Y),                   */
75*4882a593Smuzhiyun 	 0x15, 0x81,                  /*         Logical Minimum (-127),      */
76*4882a593Smuzhiyun 	 0x25, 0x7F,                  /*         Logical Maximum (127),       */
77*4882a593Smuzhiyun 	 0x75, 0x08,                  /*         Report Size (8),             */
78*4882a593Smuzhiyun 	 0x95, 0x02,                  /*         Report Count (2),            */
79*4882a593Smuzhiyun 	 0x81, 0x06,                  /*         Input (Variable, Relative),  */
80*4882a593Smuzhiyun 	 0xC0,                        /*     End Collection,                  */
81*4882a593Smuzhiyun 	 0xC0,                        /* End Collection,                      */
82*4882a593Smuzhiyun 	 0x05, 0x0D,                  /* Usage Page (Digitizer),              */
83*4882a593Smuzhiyun 	 0x09, 0x05,                  /* Usage (Touchpad),                    */
84*4882a593Smuzhiyun 	 0xA1, 0x01,                  /* Collection (Application),            */
85*4882a593Smuzhiyun 	 0x85, 0x04,                  /*     Report ID (4),                   */
86*4882a593Smuzhiyun 	 0x05, 0x0D,                  /*     Usage Page (Digitizer),          */
87*4882a593Smuzhiyun 	 0x09, 0x22,                  /*     Usage (Finger),                  */
88*4882a593Smuzhiyun 	 0xA1, 0x02,                  /*     Collection (Logical),            */
89*4882a593Smuzhiyun 	 0x15, 0x00,                  /*         Logical Minimum (0),         */
90*4882a593Smuzhiyun 	 0x25, 0x01,                  /*         Logical Maximum (1),         */
91*4882a593Smuzhiyun 	 0x09, 0x47,                  /*         Usage (Touch Valid),         */
92*4882a593Smuzhiyun 	 0x09, 0x42,                  /*         Usage (Tip Switch),          */
93*4882a593Smuzhiyun 	 0x95, 0x02,                  /*         Report Count (2),            */
94*4882a593Smuzhiyun 	 0x75, 0x01,                  /*         Report Size (1),             */
95*4882a593Smuzhiyun 	 0x81, 0x02,                  /*         Input (Variable),            */
96*4882a593Smuzhiyun 	 0x95, 0x01,                  /*         Report Count (1),            */
97*4882a593Smuzhiyun 	 0x75, 0x03,                  /*         Report Size (3),             */
98*4882a593Smuzhiyun 	 0x25, 0x05,                  /*         Logical Maximum (5),         */
99*4882a593Smuzhiyun 	 0x09, 0x51,                  /*         Usage (Contact Identifier),  */
100*4882a593Smuzhiyun 	 0x81, 0x02,                  /*         Input (Variable),            */
101*4882a593Smuzhiyun 	 0x75, 0x01,                  /*         Report Size (1),             */
102*4882a593Smuzhiyun 	 0x95, 0x03,                  /*         Report Count (3),            */
103*4882a593Smuzhiyun 	 0x81, 0x03,                  /*         Input (Constant, Variable),  */
104*4882a593Smuzhiyun 	 0x05, 0x01,                  /*         Usage Page (Desktop),        */
105*4882a593Smuzhiyun 	 0x26, 0x44, 0x0A,            /*         Logical Maximum (2628),      */
106*4882a593Smuzhiyun 	 0x75, 0x10,                  /*         Report Size (16),            */
107*4882a593Smuzhiyun 	 0x55, 0x0E,                  /*         Unit Exponent (14),          */
108*4882a593Smuzhiyun 	 0x65, 0x11,                  /*         Unit (Centimeter),           */
109*4882a593Smuzhiyun 	 0x09, 0x30,                  /*         Usage (X),                   */
110*4882a593Smuzhiyun 	 0x46, 0x1A, 0x04,            /*         Physical Maximum (1050),     */
111*4882a593Smuzhiyun 	 0x95, 0x01,                  /*         Report Count (1),            */
112*4882a593Smuzhiyun 	 0x81, 0x02,                  /*         Input (Variable),            */
113*4882a593Smuzhiyun 	 0x46, 0xBC, 0x02,            /*         Physical Maximum (700),      */
114*4882a593Smuzhiyun 	 0x26, 0x34, 0x05,            /*         Logical Maximum (1332),      */
115*4882a593Smuzhiyun 	 0x09, 0x31,                  /*         Usage (Y),                   */
116*4882a593Smuzhiyun 	 0x81, 0x02,                  /*         Input (Variable),            */
117*4882a593Smuzhiyun 	 0xC0,                        /*     End Collection,                  */
118*4882a593Smuzhiyun 	 0x05, 0x0D,                  /*     Usage Page (Digitizer),          */
119*4882a593Smuzhiyun 	 0x09, 0x22,                  /*     Usage (Finger),                  */
120*4882a593Smuzhiyun 	 0xA1, 0x02,                  /*     Collection (Logical),            */
121*4882a593Smuzhiyun 	 0x25, 0x01,                  /*         Logical Maximum (1),         */
122*4882a593Smuzhiyun 	 0x09, 0x47,                  /*         Usage (Touch Valid),         */
123*4882a593Smuzhiyun 	 0x09, 0x42,                  /*         Usage (Tip Switch),          */
124*4882a593Smuzhiyun 	 0x95, 0x02,                  /*         Report Count (2),            */
125*4882a593Smuzhiyun 	 0x75, 0x01,                  /*         Report Size (1),             */
126*4882a593Smuzhiyun 	 0x81, 0x02,                  /*         Input (Variable),            */
127*4882a593Smuzhiyun 	 0x95, 0x01,                  /*         Report Count (1),            */
128*4882a593Smuzhiyun 	 0x75, 0x03,                  /*         Report Size (3),             */
129*4882a593Smuzhiyun 	 0x25, 0x05,                  /*         Logical Maximum (5),         */
130*4882a593Smuzhiyun 	 0x09, 0x51,                  /*         Usage (Contact Identifier),  */
131*4882a593Smuzhiyun 	 0x81, 0x02,                  /*         Input (Variable),            */
132*4882a593Smuzhiyun 	 0x75, 0x01,                  /*         Report Size (1),             */
133*4882a593Smuzhiyun 	 0x95, 0x03,                  /*         Report Count (3),            */
134*4882a593Smuzhiyun 	 0x81, 0x03,                  /*         Input (Constant, Variable),  */
135*4882a593Smuzhiyun 	 0x05, 0x01,                  /*         Usage Page (Desktop),        */
136*4882a593Smuzhiyun 	 0x26, 0x44, 0x0A,            /*         Logical Maximum (2628),      */
137*4882a593Smuzhiyun 	 0x75, 0x10,                  /*         Report Size (16),            */
138*4882a593Smuzhiyun 	 0x09, 0x30,                  /*         Usage (X),                   */
139*4882a593Smuzhiyun 	 0x46, 0x1A, 0x04,            /*         Physical Maximum (1050),     */
140*4882a593Smuzhiyun 	 0x95, 0x01,                  /*         Report Count (1),            */
141*4882a593Smuzhiyun 	 0x81, 0x02,                  /*         Input (Variable),            */
142*4882a593Smuzhiyun 	 0x46, 0xBC, 0x02,            /*         Physical Maximum (700),      */
143*4882a593Smuzhiyun 	 0x26, 0x34, 0x05,            /*         Logical Maximum (1332),      */
144*4882a593Smuzhiyun 	 0x09, 0x31,                  /*         Usage (Y),                   */
145*4882a593Smuzhiyun 	 0x81, 0x02,                  /*         Input (Variable),            */
146*4882a593Smuzhiyun 	 0xC0,                        /*     End Collection,                  */
147*4882a593Smuzhiyun 	 0x05, 0x0D,                  /*     Usage Page (Digitizer),          */
148*4882a593Smuzhiyun 	 0x09, 0x22,                  /*     Usage (Finger),                  */
149*4882a593Smuzhiyun 	 0xA1, 0x02,                  /*     Collection (Logical),            */
150*4882a593Smuzhiyun 	 0x25, 0x01,                  /*         Logical Maximum (1),         */
151*4882a593Smuzhiyun 	 0x09, 0x47,                  /*         Usage (Touch Valid),         */
152*4882a593Smuzhiyun 	 0x09, 0x42,                  /*         Usage (Tip Switch),          */
153*4882a593Smuzhiyun 	 0x95, 0x02,                  /*         Report Count (2),            */
154*4882a593Smuzhiyun 	 0x75, 0x01,                  /*         Report Size (1),             */
155*4882a593Smuzhiyun 	 0x81, 0x02,                  /*         Input (Variable),            */
156*4882a593Smuzhiyun 	 0x95, 0x01,                  /*         Report Count (1),            */
157*4882a593Smuzhiyun 	 0x75, 0x03,                  /*         Report Size (3),             */
158*4882a593Smuzhiyun 	 0x25, 0x05,                  /*         Logical Maximum (5),         */
159*4882a593Smuzhiyun 	 0x09, 0x51,                  /*         Usage (Contact Identifier),  */
160*4882a593Smuzhiyun 	 0x81, 0x02,                  /*         Input (Variable),            */
161*4882a593Smuzhiyun 	 0x75, 0x01,                  /*         Report Size (1),             */
162*4882a593Smuzhiyun 	 0x95, 0x03,                  /*         Report Count (3),            */
163*4882a593Smuzhiyun 	 0x81, 0x03,                  /*         Input (Constant, Variable),  */
164*4882a593Smuzhiyun 	 0x05, 0x01,                  /*         Usage Page (Desktop),        */
165*4882a593Smuzhiyun 	 0x26, 0x44, 0x0A,            /*         Logical Maximum (2628),      */
166*4882a593Smuzhiyun 	 0x75, 0x10,                  /*         Report Size (16),            */
167*4882a593Smuzhiyun 	 0x09, 0x30,                  /*         Usage (X),                   */
168*4882a593Smuzhiyun 	 0x46, 0x1A, 0x04,            /*         Physical Maximum (1050),     */
169*4882a593Smuzhiyun 	 0x95, 0x01,                  /*         Report Count (1),            */
170*4882a593Smuzhiyun 	 0x81, 0x02,                  /*         Input (Variable),            */
171*4882a593Smuzhiyun 	 0x46, 0xBC, 0x02,            /*         Physical Maximum (700),      */
172*4882a593Smuzhiyun 	 0x26, 0x34, 0x05,            /*         Logical Maximum (1332),      */
173*4882a593Smuzhiyun 	 0x09, 0x31,                  /*         Usage (Y),                   */
174*4882a593Smuzhiyun 	 0x81, 0x02,                  /*         Input (Variable),            */
175*4882a593Smuzhiyun 	 0xC0,                        /*     End Collection,                  */
176*4882a593Smuzhiyun 	 0x05, 0x0D,                  /*     Usage Page (Digitizer),          */
177*4882a593Smuzhiyun 	 0x09, 0x22,                  /*     Usage (Finger),                  */
178*4882a593Smuzhiyun 	 0xA1, 0x02,                  /*     Collection (Logical),            */
179*4882a593Smuzhiyun 	 0x25, 0x01,                  /*         Logical Maximum (1),         */
180*4882a593Smuzhiyun 	 0x09, 0x47,                  /*         Usage (Touch Valid),         */
181*4882a593Smuzhiyun 	 0x09, 0x42,                  /*         Usage (Tip Switch),          */
182*4882a593Smuzhiyun 	 0x95, 0x02,                  /*         Report Count (2),            */
183*4882a593Smuzhiyun 	 0x75, 0x01,                  /*         Report Size (1),             */
184*4882a593Smuzhiyun 	 0x81, 0x02,                  /*         Input (Variable),            */
185*4882a593Smuzhiyun 	 0x95, 0x01,                  /*         Report Count (1),            */
186*4882a593Smuzhiyun 	 0x75, 0x03,                  /*         Report Size (3),             */
187*4882a593Smuzhiyun 	 0x25, 0x05,                  /*         Logical Maximum (5),         */
188*4882a593Smuzhiyun 	 0x09, 0x51,                  /*         Usage (Contact Identifier),  */
189*4882a593Smuzhiyun 	 0x81, 0x02,                  /*         Input (Variable),            */
190*4882a593Smuzhiyun 	 0x75, 0x01,                  /*         Report Size (1),             */
191*4882a593Smuzhiyun 	 0x95, 0x03,                  /*         Report Count (3),            */
192*4882a593Smuzhiyun 	 0x81, 0x03,                  /*         Input (Constant, Variable),  */
193*4882a593Smuzhiyun 	 0x05, 0x01,                  /*         Usage Page (Desktop),        */
194*4882a593Smuzhiyun 	 0x26, 0x44, 0x0A,            /*         Logical Maximum (2628),      */
195*4882a593Smuzhiyun 	 0x75, 0x10,                  /*         Report Size (16),            */
196*4882a593Smuzhiyun 	 0x09, 0x30,                  /*         Usage (X),                   */
197*4882a593Smuzhiyun 	 0x46, 0x1A, 0x04,            /*         Physical Maximum (1050),     */
198*4882a593Smuzhiyun 	 0x95, 0x01,                  /*         Report Count (1),            */
199*4882a593Smuzhiyun 	 0x81, 0x02,                  /*         Input (Variable),            */
200*4882a593Smuzhiyun 	 0x46, 0xBC, 0x02,            /*         Physical Maximum (700),      */
201*4882a593Smuzhiyun 	 0x26, 0x34, 0x05,            /*         Logical Maximum (1332),      */
202*4882a593Smuzhiyun 	 0x09, 0x31,                  /*         Usage (Y),                   */
203*4882a593Smuzhiyun 	 0x81, 0x02,                  /*         Input (Variable),            */
204*4882a593Smuzhiyun 	 0xC0,                        /*     End Collection,                  */
205*4882a593Smuzhiyun 	 0x05, 0x0D,                  /*     Usage Page (Digitizer),          */
206*4882a593Smuzhiyun 	 0x55, 0x0C,                  /*     Unit Exponent (12),              */
207*4882a593Smuzhiyun 	 0x66, 0x01, 0x10,            /*     Unit (Seconds),                  */
208*4882a593Smuzhiyun 	 0x47, 0xFF, 0xFF, 0x00, 0x00,/*     Physical Maximum (65535),        */
209*4882a593Smuzhiyun 	 0x27, 0xFF, 0xFF, 0x00, 0x00,/*     Logical Maximum (65535),         */
210*4882a593Smuzhiyun 	 0x75, 0x10,                  /*     Report Size (16),                */
211*4882a593Smuzhiyun 	 0x95, 0x01,                  /*     Report Count (1),                */
212*4882a593Smuzhiyun 	 0x09, 0x56,                  /*     Usage (Scan Time),               */
213*4882a593Smuzhiyun 	 0x81, 0x02,                  /*     Input (Variable),                */
214*4882a593Smuzhiyun 	 0x09, 0x54,                  /*     Usage (Contact Count),           */
215*4882a593Smuzhiyun 	 0x25, 0x7F,                  /*     Logical Maximum (127),           */
216*4882a593Smuzhiyun 	 0x75, 0x08,                  /*     Report Size (8),                 */
217*4882a593Smuzhiyun 	 0x81, 0x02,                  /*     Input (Variable),                */
218*4882a593Smuzhiyun 	 0x05, 0x09,                  /*     Usage Page (Button),             */
219*4882a593Smuzhiyun 	 0x09, 0x01,                  /*     Usage (01h),                     */
220*4882a593Smuzhiyun 	 0x25, 0x01,                  /*     Logical Maximum (1),             */
221*4882a593Smuzhiyun 	 0x75, 0x01,                  /*     Report Size (1),                 */
222*4882a593Smuzhiyun 	 0x95, 0x01,                  /*     Report Count (1),                */
223*4882a593Smuzhiyun 	 0x81, 0x02,                  /*     Input (Variable),                */
224*4882a593Smuzhiyun 	 0x95, 0x07,                  /*     Report Count (7),                */
225*4882a593Smuzhiyun 	 0x81, 0x03,                  /*     Input (Constant, Variable),      */
226*4882a593Smuzhiyun 	 0x05, 0x0D,                  /*     Usage Page (Digitizer),          */
227*4882a593Smuzhiyun 	 0x85, 0x02,                  /*     Report ID (2),                   */
228*4882a593Smuzhiyun 	 0x09, 0x55,                  /*     Usage (Contact Count Maximum),   */
229*4882a593Smuzhiyun 	 0x09, 0x59,                  /*     Usage (59h),                     */
230*4882a593Smuzhiyun 	 0x75, 0x04,                  /*     Report Size (4),                 */
231*4882a593Smuzhiyun 	 0x95, 0x02,                  /*     Report Count (2),                */
232*4882a593Smuzhiyun 	 0x25, 0x0F,                  /*     Logical Maximum (15),            */
233*4882a593Smuzhiyun 	 0xB1, 0x02,                  /*     Feature (Variable),              */
234*4882a593Smuzhiyun 	 0x05, 0x0D,                  /*     Usage Page (Digitizer),          */
235*4882a593Smuzhiyun 	 0x85, 0x07,                  /*     Report ID (7),                   */
236*4882a593Smuzhiyun 	 0x09, 0x60,                  /*     Usage (60h),                     */
237*4882a593Smuzhiyun 	 0x75, 0x01,                  /*     Report Size (1),                 */
238*4882a593Smuzhiyun 	 0x95, 0x01,                  /*     Report Count (1),                */
239*4882a593Smuzhiyun 	 0x25, 0x01,                  /*     Logical Maximum (1),             */
240*4882a593Smuzhiyun 	 0xB1, 0x02,                  /*     Feature (Variable),              */
241*4882a593Smuzhiyun 	 0x95, 0x07,                  /*     Report Count (7),                */
242*4882a593Smuzhiyun 	 0xB1, 0x03,                  /*     Feature (Constant, Variable),    */
243*4882a593Smuzhiyun 	 0x85, 0x06,                  /*     Report ID (6),                   */
244*4882a593Smuzhiyun 	 0x06, 0x00, 0xFF,            /*     Usage Page (FF00h),              */
245*4882a593Smuzhiyun 	 0x09, 0xC5,                  /*     Usage (C5h),                     */
246*4882a593Smuzhiyun 	 0x26, 0xFF, 0x00,            /*     Logical Maximum (255),           */
247*4882a593Smuzhiyun 	 0x75, 0x08,                  /*     Report Size (8),                 */
248*4882a593Smuzhiyun 	 0x96, 0x00, 0x01,            /*     Report Count (256),              */
249*4882a593Smuzhiyun 	 0xB1, 0x02,                  /*     Feature (Variable),              */
250*4882a593Smuzhiyun 	 0xC0,                        /* End Collection,                      */
251*4882a593Smuzhiyun 	 0x06, 0x00, 0xFF,            /* Usage Page (FF00h),                  */
252*4882a593Smuzhiyun 	 0x09, 0x01,                  /* Usage (01h),                         */
253*4882a593Smuzhiyun 	 0xA1, 0x01,                  /* Collection (Application),            */
254*4882a593Smuzhiyun 	 0x85, 0x0D,                  /*     Report ID (13),                  */
255*4882a593Smuzhiyun 	 0x26, 0xFF, 0x00,            /*     Logical Maximum (255),           */
256*4882a593Smuzhiyun 	 0x19, 0x01,                  /*     Usage Minimum (01h),             */
257*4882a593Smuzhiyun 	 0x29, 0x02,                  /*     Usage Maximum (02h),             */
258*4882a593Smuzhiyun 	 0x75, 0x08,                  /*     Report Size (8),                 */
259*4882a593Smuzhiyun 	 0x95, 0x02,                  /*     Report Count (2),                */
260*4882a593Smuzhiyun 	 0xB1, 0x02,                  /*     Feature (Variable),              */
261*4882a593Smuzhiyun 	 0xC0,                        /* End Collection,                      */
262*4882a593Smuzhiyun 	 0x05, 0x0D,                  /* Usage Page (Digitizer),              */
263*4882a593Smuzhiyun 	 0x09, 0x0E,                  /* Usage (Configuration),               */
264*4882a593Smuzhiyun 	 0xA1, 0x01,                  /* Collection (Application),            */
265*4882a593Smuzhiyun 	 0x85, 0x03,                  /*     Report ID (3),                   */
266*4882a593Smuzhiyun 	 0x09, 0x22,                  /*     Usage (Finger),                  */
267*4882a593Smuzhiyun 	 0xA1, 0x02,                  /*     Collection (Logical),            */
268*4882a593Smuzhiyun 	 0x09, 0x52,                  /*         Usage (Device Mode),         */
269*4882a593Smuzhiyun 	 0x25, 0x0A,                  /*         Logical Maximum (10),        */
270*4882a593Smuzhiyun 	 0x95, 0x01,                  /*         Report Count (1),            */
271*4882a593Smuzhiyun 	 0xB1, 0x02,                  /*         Feature (Variable),          */
272*4882a593Smuzhiyun 	 0xC0,                        /*     End Collection,                  */
273*4882a593Smuzhiyun 	 0x09, 0x22,                  /*     Usage (Finger),                  */
274*4882a593Smuzhiyun 	 0xA1, 0x00,                  /*     Collection (Physical),           */
275*4882a593Smuzhiyun 	 0x85, 0x05,                  /*         Report ID (5),               */
276*4882a593Smuzhiyun 	 0x09, 0x57,                  /*         Usage (57h),                 */
277*4882a593Smuzhiyun 	 0x09, 0x58,                  /*         Usage (58h),                 */
278*4882a593Smuzhiyun 	 0x75, 0x01,                  /*         Report Size (1),             */
279*4882a593Smuzhiyun 	 0x95, 0x02,                  /*         Report Count (2),            */
280*4882a593Smuzhiyun 	 0x25, 0x01,                  /*         Logical Maximum (1),         */
281*4882a593Smuzhiyun 	 0xB1, 0x02,                  /*         Feature (Variable),          */
282*4882a593Smuzhiyun 	 0x95, 0x06,                  /*         Report Count (6),            */
283*4882a593Smuzhiyun 	 0xB1, 0x03,                  /*         Feature (Constant, Variable),*/
284*4882a593Smuzhiyun 	 0xC0,                        /*     End Collection,                  */
285*4882a593Smuzhiyun 	 0xC0                         /* End Collection                       */
286*4882a593Smuzhiyun 	},
287*4882a593Smuzhiyun 	.hid_report_desc_size = 475,
288*4882a593Smuzhiyun 	.i2c_name = "SYNA3602:00"
289*4882a593Smuzhiyun };
290*4882a593Smuzhiyun 
291*4882a593Smuzhiyun 
292*4882a593Smuzhiyun static const struct dmi_system_id i2c_hid_dmi_desc_override_table[] = {
293*4882a593Smuzhiyun 	{
294*4882a593Smuzhiyun 		.ident = "Teclast F6 Pro",
295*4882a593Smuzhiyun 		.matches = {
296*4882a593Smuzhiyun 			DMI_EXACT_MATCH(DMI_SYS_VENDOR, "TECLAST"),
297*4882a593Smuzhiyun 			DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "F6 Pro"),
298*4882a593Smuzhiyun 		},
299*4882a593Smuzhiyun 		.driver_data = (void *)&sipodev_desc
300*4882a593Smuzhiyun 	},
301*4882a593Smuzhiyun 	{
302*4882a593Smuzhiyun 		.ident = "Teclast F7",
303*4882a593Smuzhiyun 		.matches = {
304*4882a593Smuzhiyun 			DMI_EXACT_MATCH(DMI_SYS_VENDOR, "TECLAST"),
305*4882a593Smuzhiyun 			DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "F7"),
306*4882a593Smuzhiyun 		},
307*4882a593Smuzhiyun 		.driver_data = (void *)&sipodev_desc
308*4882a593Smuzhiyun 	},
309*4882a593Smuzhiyun 	{
310*4882a593Smuzhiyun 		.ident = "Trekstor Primebook C13",
311*4882a593Smuzhiyun 		.matches = {
312*4882a593Smuzhiyun 			DMI_EXACT_MATCH(DMI_SYS_VENDOR, "TREKSTOR"),
313*4882a593Smuzhiyun 			DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Primebook C13"),
314*4882a593Smuzhiyun 		},
315*4882a593Smuzhiyun 		.driver_data = (void *)&sipodev_desc
316*4882a593Smuzhiyun 	},
317*4882a593Smuzhiyun 	{
318*4882a593Smuzhiyun 		.ident = "Trekstor Primebook C11",
319*4882a593Smuzhiyun 		.matches = {
320*4882a593Smuzhiyun 			DMI_EXACT_MATCH(DMI_SYS_VENDOR, "TREKSTOR"),
321*4882a593Smuzhiyun 			DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Primebook C11"),
322*4882a593Smuzhiyun 		},
323*4882a593Smuzhiyun 		.driver_data = (void *)&sipodev_desc
324*4882a593Smuzhiyun 	},
325*4882a593Smuzhiyun 	{
326*4882a593Smuzhiyun 		/*
327*4882a593Smuzhiyun 		 * There are at least 2 Primebook C11B versions, the older
328*4882a593Smuzhiyun 		 * version has a product-name of "Primebook C11B", and a
329*4882a593Smuzhiyun 		 * bios version / release / firmware revision of:
330*4882a593Smuzhiyun 		 * V2.1.2 / 05/03/2018 / 18.2
331*4882a593Smuzhiyun 		 * The new version has "PRIMEBOOK C11B" as product-name and a
332*4882a593Smuzhiyun 		 * bios version / release / firmware revision of:
333*4882a593Smuzhiyun 		 * CFALKSW05_BIOS_V1.1.2 / 11/19/2018 / 19.2
334*4882a593Smuzhiyun 		 * Only the older version needs this quirk, note the newer
335*4882a593Smuzhiyun 		 * version will not match as it has a different product-name.
336*4882a593Smuzhiyun 		 */
337*4882a593Smuzhiyun 		.ident = "Trekstor Primebook C11B",
338*4882a593Smuzhiyun 		.matches = {
339*4882a593Smuzhiyun 			DMI_EXACT_MATCH(DMI_SYS_VENDOR, "TREKSTOR"),
340*4882a593Smuzhiyun 			DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Primebook C11B"),
341*4882a593Smuzhiyun 		},
342*4882a593Smuzhiyun 		.driver_data = (void *)&sipodev_desc
343*4882a593Smuzhiyun 	},
344*4882a593Smuzhiyun 	{
345*4882a593Smuzhiyun 		.ident = "Trekstor SURFBOOK E11B",
346*4882a593Smuzhiyun 		.matches = {
347*4882a593Smuzhiyun 			DMI_EXACT_MATCH(DMI_SYS_VENDOR, "TREKSTOR"),
348*4882a593Smuzhiyun 			DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "SURFBOOK E11B"),
349*4882a593Smuzhiyun 		},
350*4882a593Smuzhiyun 		.driver_data = (void *)&sipodev_desc
351*4882a593Smuzhiyun 	},
352*4882a593Smuzhiyun 	{
353*4882a593Smuzhiyun 		.ident = "Direkt-Tek DTLAPY116-2",
354*4882a593Smuzhiyun 		.matches = {
355*4882a593Smuzhiyun 			DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Direkt-Tek"),
356*4882a593Smuzhiyun 			DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "DTLAPY116-2"),
357*4882a593Smuzhiyun 		},
358*4882a593Smuzhiyun 		.driver_data = (void *)&sipodev_desc
359*4882a593Smuzhiyun 	},
360*4882a593Smuzhiyun 	{
361*4882a593Smuzhiyun 		.ident = "Direkt-Tek DTLAPY133-1",
362*4882a593Smuzhiyun 		.matches = {
363*4882a593Smuzhiyun 			DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Direkt-Tek"),
364*4882a593Smuzhiyun 			DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "DTLAPY133-1"),
365*4882a593Smuzhiyun 		},
366*4882a593Smuzhiyun 		.driver_data = (void *)&sipodev_desc
367*4882a593Smuzhiyun 	},
368*4882a593Smuzhiyun 	{
369*4882a593Smuzhiyun 		.ident = "Mediacom Flexbook Edge 11",
370*4882a593Smuzhiyun 		.matches = {
371*4882a593Smuzhiyun 			DMI_EXACT_MATCH(DMI_SYS_VENDOR, "MEDIACOM"),
372*4882a593Smuzhiyun 			DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "FlexBook edge11 - M-FBE11"),
373*4882a593Smuzhiyun 		},
374*4882a593Smuzhiyun 		.driver_data = (void *)&sipodev_desc
375*4882a593Smuzhiyun 	},
376*4882a593Smuzhiyun 	{
377*4882a593Smuzhiyun 		.ident = "Mediacom FlexBook edge 13",
378*4882a593Smuzhiyun 		.matches = {
379*4882a593Smuzhiyun 			DMI_EXACT_MATCH(DMI_SYS_VENDOR, "MEDIACOM"),
380*4882a593Smuzhiyun 			DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "FlexBook_edge13-M-FBE13"),
381*4882a593Smuzhiyun 		},
382*4882a593Smuzhiyun 		.driver_data = (void *)&sipodev_desc
383*4882a593Smuzhiyun 	},
384*4882a593Smuzhiyun 	{
385*4882a593Smuzhiyun 		.ident = "Odys Winbook 13",
386*4882a593Smuzhiyun 		.matches = {
387*4882a593Smuzhiyun 			DMI_EXACT_MATCH(DMI_SYS_VENDOR, "AXDIA International GmbH"),
388*4882a593Smuzhiyun 			DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "WINBOOK 13"),
389*4882a593Smuzhiyun 		},
390*4882a593Smuzhiyun 		.driver_data = (void *)&sipodev_desc
391*4882a593Smuzhiyun 	},
392*4882a593Smuzhiyun 	{
393*4882a593Smuzhiyun 		.ident = "iBall Aer3",
394*4882a593Smuzhiyun 		.matches = {
395*4882a593Smuzhiyun 			DMI_EXACT_MATCH(DMI_SYS_VENDOR, "iBall"),
396*4882a593Smuzhiyun 			DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Aer3"),
397*4882a593Smuzhiyun 		},
398*4882a593Smuzhiyun 		.driver_data = (void *)&sipodev_desc
399*4882a593Smuzhiyun 	},
400*4882a593Smuzhiyun 	{
401*4882a593Smuzhiyun 		.ident = "Schneider SCL142ALM",
402*4882a593Smuzhiyun 		.matches = {
403*4882a593Smuzhiyun 			DMI_EXACT_MATCH(DMI_SYS_VENDOR, "SCHNEIDER"),
404*4882a593Smuzhiyun 			DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "SCL142ALM"),
405*4882a593Smuzhiyun 		},
406*4882a593Smuzhiyun 		.driver_data = (void *)&sipodev_desc
407*4882a593Smuzhiyun 	},
408*4882a593Smuzhiyun 	{
409*4882a593Smuzhiyun 		.ident = "Vero K147",
410*4882a593Smuzhiyun 		.matches = {
411*4882a593Smuzhiyun 			DMI_EXACT_MATCH(DMI_SYS_VENDOR, "VERO"),
412*4882a593Smuzhiyun 			DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "K147"),
413*4882a593Smuzhiyun 		},
414*4882a593Smuzhiyun 		.driver_data = (void *)&sipodev_desc
415*4882a593Smuzhiyun 	},
416*4882a593Smuzhiyun 	{ }	/* Terminate list */
417*4882a593Smuzhiyun };
418*4882a593Smuzhiyun 
419*4882a593Smuzhiyun 
i2c_hid_get_dmi_i2c_hid_desc_override(uint8_t * i2c_name)420*4882a593Smuzhiyun struct i2c_hid_desc *i2c_hid_get_dmi_i2c_hid_desc_override(uint8_t *i2c_name)
421*4882a593Smuzhiyun {
422*4882a593Smuzhiyun 	struct i2c_hid_desc_override *override;
423*4882a593Smuzhiyun 	const struct dmi_system_id *system_id;
424*4882a593Smuzhiyun 
425*4882a593Smuzhiyun 	system_id = dmi_first_match(i2c_hid_dmi_desc_override_table);
426*4882a593Smuzhiyun 	if (!system_id)
427*4882a593Smuzhiyun 		return NULL;
428*4882a593Smuzhiyun 
429*4882a593Smuzhiyun 	override = system_id->driver_data;
430*4882a593Smuzhiyun 	if (strcmp(override->i2c_name, i2c_name))
431*4882a593Smuzhiyun 		return NULL;
432*4882a593Smuzhiyun 
433*4882a593Smuzhiyun 	return override->i2c_hid_desc;
434*4882a593Smuzhiyun }
435*4882a593Smuzhiyun 
i2c_hid_get_dmi_hid_report_desc_override(uint8_t * i2c_name,unsigned int * size)436*4882a593Smuzhiyun char *i2c_hid_get_dmi_hid_report_desc_override(uint8_t *i2c_name,
437*4882a593Smuzhiyun 					       unsigned int *size)
438*4882a593Smuzhiyun {
439*4882a593Smuzhiyun 	struct i2c_hid_desc_override *override;
440*4882a593Smuzhiyun 	const struct dmi_system_id *system_id;
441*4882a593Smuzhiyun 
442*4882a593Smuzhiyun 	system_id = dmi_first_match(i2c_hid_dmi_desc_override_table);
443*4882a593Smuzhiyun 	if (!system_id)
444*4882a593Smuzhiyun 		return NULL;
445*4882a593Smuzhiyun 
446*4882a593Smuzhiyun 	override = system_id->driver_data;
447*4882a593Smuzhiyun 	if (strcmp(override->i2c_name, i2c_name))
448*4882a593Smuzhiyun 		return NULL;
449*4882a593Smuzhiyun 
450*4882a593Smuzhiyun 	*size = override->hid_report_desc_size;
451*4882a593Smuzhiyun 	return override->hid_report_desc;
452*4882a593Smuzhiyun }
453