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