1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */
2*4882a593Smuzhiyun #ifndef _I8042_X86IA64IO_H
3*4882a593Smuzhiyun #define _I8042_X86IA64IO_H
4*4882a593Smuzhiyun
5*4882a593Smuzhiyun
6*4882a593Smuzhiyun #ifdef CONFIG_X86
7*4882a593Smuzhiyun #include <asm/x86_init.h>
8*4882a593Smuzhiyun #endif
9*4882a593Smuzhiyun
10*4882a593Smuzhiyun /*
11*4882a593Smuzhiyun * Names.
12*4882a593Smuzhiyun */
13*4882a593Smuzhiyun
14*4882a593Smuzhiyun #define I8042_KBD_PHYS_DESC "isa0060/serio0"
15*4882a593Smuzhiyun #define I8042_AUX_PHYS_DESC "isa0060/serio1"
16*4882a593Smuzhiyun #define I8042_MUX_PHYS_DESC "isa0060/serio%d"
17*4882a593Smuzhiyun
18*4882a593Smuzhiyun /*
19*4882a593Smuzhiyun * IRQs.
20*4882a593Smuzhiyun */
21*4882a593Smuzhiyun
22*4882a593Smuzhiyun #if defined(__ia64__)
23*4882a593Smuzhiyun # define I8042_MAP_IRQ(x) isa_irq_to_vector((x))
24*4882a593Smuzhiyun #else
25*4882a593Smuzhiyun # define I8042_MAP_IRQ(x) (x)
26*4882a593Smuzhiyun #endif
27*4882a593Smuzhiyun
28*4882a593Smuzhiyun #define I8042_KBD_IRQ i8042_kbd_irq
29*4882a593Smuzhiyun #define I8042_AUX_IRQ i8042_aux_irq
30*4882a593Smuzhiyun
31*4882a593Smuzhiyun static int i8042_kbd_irq;
32*4882a593Smuzhiyun static int i8042_aux_irq;
33*4882a593Smuzhiyun
34*4882a593Smuzhiyun /*
35*4882a593Smuzhiyun * Register numbers.
36*4882a593Smuzhiyun */
37*4882a593Smuzhiyun
38*4882a593Smuzhiyun #define I8042_COMMAND_REG i8042_command_reg
39*4882a593Smuzhiyun #define I8042_STATUS_REG i8042_command_reg
40*4882a593Smuzhiyun #define I8042_DATA_REG i8042_data_reg
41*4882a593Smuzhiyun
42*4882a593Smuzhiyun static int i8042_command_reg = 0x64;
43*4882a593Smuzhiyun static int i8042_data_reg = 0x60;
44*4882a593Smuzhiyun
45*4882a593Smuzhiyun
i8042_read_data(void)46*4882a593Smuzhiyun static inline int i8042_read_data(void)
47*4882a593Smuzhiyun {
48*4882a593Smuzhiyun return inb(I8042_DATA_REG);
49*4882a593Smuzhiyun }
50*4882a593Smuzhiyun
i8042_read_status(void)51*4882a593Smuzhiyun static inline int i8042_read_status(void)
52*4882a593Smuzhiyun {
53*4882a593Smuzhiyun return inb(I8042_STATUS_REG);
54*4882a593Smuzhiyun }
55*4882a593Smuzhiyun
i8042_write_data(int val)56*4882a593Smuzhiyun static inline void i8042_write_data(int val)
57*4882a593Smuzhiyun {
58*4882a593Smuzhiyun outb(val, I8042_DATA_REG);
59*4882a593Smuzhiyun }
60*4882a593Smuzhiyun
i8042_write_command(int val)61*4882a593Smuzhiyun static inline void i8042_write_command(int val)
62*4882a593Smuzhiyun {
63*4882a593Smuzhiyun outb(val, I8042_COMMAND_REG);
64*4882a593Smuzhiyun }
65*4882a593Smuzhiyun
66*4882a593Smuzhiyun #ifdef CONFIG_X86
67*4882a593Smuzhiyun
68*4882a593Smuzhiyun #include <linux/dmi.h>
69*4882a593Smuzhiyun
70*4882a593Smuzhiyun static const struct dmi_system_id __initconst i8042_dmi_noloop_table[] = {
71*4882a593Smuzhiyun {
72*4882a593Smuzhiyun /*
73*4882a593Smuzhiyun * Arima-Rioworks HDAMB -
74*4882a593Smuzhiyun * AUX LOOP command does not raise AUX IRQ
75*4882a593Smuzhiyun */
76*4882a593Smuzhiyun .matches = {
77*4882a593Smuzhiyun DMI_MATCH(DMI_BOARD_VENDOR, "RIOWORKS"),
78*4882a593Smuzhiyun DMI_MATCH(DMI_BOARD_NAME, "HDAMB"),
79*4882a593Smuzhiyun DMI_MATCH(DMI_BOARD_VERSION, "Rev E"),
80*4882a593Smuzhiyun },
81*4882a593Smuzhiyun },
82*4882a593Smuzhiyun {
83*4882a593Smuzhiyun /* ASUS G1S */
84*4882a593Smuzhiyun .matches = {
85*4882a593Smuzhiyun DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer Inc."),
86*4882a593Smuzhiyun DMI_MATCH(DMI_BOARD_NAME, "G1S"),
87*4882a593Smuzhiyun DMI_MATCH(DMI_BOARD_VERSION, "1.0"),
88*4882a593Smuzhiyun },
89*4882a593Smuzhiyun },
90*4882a593Smuzhiyun {
91*4882a593Smuzhiyun /* ASUS P65UP5 - AUX LOOP command does not raise AUX IRQ */
92*4882a593Smuzhiyun .matches = {
93*4882a593Smuzhiyun DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
94*4882a593Smuzhiyun DMI_MATCH(DMI_BOARD_NAME, "P/I-P65UP5"),
95*4882a593Smuzhiyun DMI_MATCH(DMI_BOARD_VERSION, "REV 2.X"),
96*4882a593Smuzhiyun },
97*4882a593Smuzhiyun },
98*4882a593Smuzhiyun {
99*4882a593Smuzhiyun .matches = {
100*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
101*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "X750LN"),
102*4882a593Smuzhiyun },
103*4882a593Smuzhiyun },
104*4882a593Smuzhiyun {
105*4882a593Smuzhiyun .matches = {
106*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "Compaq"),
107*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME , "ProLiant"),
108*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_VERSION, "8500"),
109*4882a593Smuzhiyun },
110*4882a593Smuzhiyun },
111*4882a593Smuzhiyun {
112*4882a593Smuzhiyun .matches = {
113*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "Compaq"),
114*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME , "ProLiant"),
115*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_VERSION, "DL760"),
116*4882a593Smuzhiyun },
117*4882a593Smuzhiyun },
118*4882a593Smuzhiyun {
119*4882a593Smuzhiyun /* Dell Embedded Box PC 3000 */
120*4882a593Smuzhiyun .matches = {
121*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
122*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "Embedded Box PC 3000"),
123*4882a593Smuzhiyun },
124*4882a593Smuzhiyun },
125*4882a593Smuzhiyun {
126*4882a593Smuzhiyun /* OQO Model 01 */
127*4882a593Smuzhiyun .matches = {
128*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "OQO"),
129*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "ZEPTO"),
130*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_VERSION, "00"),
131*4882a593Smuzhiyun },
132*4882a593Smuzhiyun },
133*4882a593Smuzhiyun {
134*4882a593Smuzhiyun /* ULI EV4873 - AUX LOOP does not work properly */
135*4882a593Smuzhiyun .matches = {
136*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "ULI"),
137*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "EV4873"),
138*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_VERSION, "5a"),
139*4882a593Smuzhiyun },
140*4882a593Smuzhiyun },
141*4882a593Smuzhiyun {
142*4882a593Smuzhiyun /* Microsoft Virtual Machine */
143*4882a593Smuzhiyun .matches = {
144*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "Microsoft Corporation"),
145*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "Virtual Machine"),
146*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_VERSION, "VS2005R2"),
147*4882a593Smuzhiyun },
148*4882a593Smuzhiyun },
149*4882a593Smuzhiyun {
150*4882a593Smuzhiyun /* Medion MAM 2070 */
151*4882a593Smuzhiyun .matches = {
152*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "Notebook"),
153*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "MAM 2070"),
154*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_VERSION, "5a"),
155*4882a593Smuzhiyun },
156*4882a593Smuzhiyun },
157*4882a593Smuzhiyun {
158*4882a593Smuzhiyun /* Medion Akoya E7225 */
159*4882a593Smuzhiyun .matches = {
160*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "Medion"),
161*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "Akoya E7225"),
162*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_VERSION, "1.0"),
163*4882a593Smuzhiyun },
164*4882a593Smuzhiyun },
165*4882a593Smuzhiyun {
166*4882a593Smuzhiyun /* Blue FB5601 */
167*4882a593Smuzhiyun .matches = {
168*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "blue"),
169*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "FB5601"),
170*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_VERSION, "M606"),
171*4882a593Smuzhiyun },
172*4882a593Smuzhiyun },
173*4882a593Smuzhiyun {
174*4882a593Smuzhiyun /* Gigabyte M912 */
175*4882a593Smuzhiyun .matches = {
176*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"),
177*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "M912"),
178*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_VERSION, "01"),
179*4882a593Smuzhiyun },
180*4882a593Smuzhiyun },
181*4882a593Smuzhiyun {
182*4882a593Smuzhiyun /* Gigabyte M1022M netbook */
183*4882a593Smuzhiyun .matches = {
184*4882a593Smuzhiyun DMI_MATCH(DMI_BOARD_VENDOR, "Gigabyte Technology Co.,Ltd."),
185*4882a593Smuzhiyun DMI_MATCH(DMI_BOARD_NAME, "M1022E"),
186*4882a593Smuzhiyun DMI_MATCH(DMI_BOARD_VERSION, "1.02"),
187*4882a593Smuzhiyun },
188*4882a593Smuzhiyun },
189*4882a593Smuzhiyun {
190*4882a593Smuzhiyun /* Gigabyte Spring Peak - defines wrong chassis type */
191*4882a593Smuzhiyun .matches = {
192*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"),
193*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "Spring Peak"),
194*4882a593Smuzhiyun },
195*4882a593Smuzhiyun },
196*4882a593Smuzhiyun {
197*4882a593Smuzhiyun /* Gigabyte T1005 - defines wrong chassis type ("Other") */
198*4882a593Smuzhiyun .matches = {
199*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"),
200*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "T1005"),
201*4882a593Smuzhiyun },
202*4882a593Smuzhiyun },
203*4882a593Smuzhiyun {
204*4882a593Smuzhiyun /* Gigabyte T1005M/P - defines wrong chassis type ("Other") */
205*4882a593Smuzhiyun .matches = {
206*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"),
207*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "T1005M/P"),
208*4882a593Smuzhiyun },
209*4882a593Smuzhiyun },
210*4882a593Smuzhiyun {
211*4882a593Smuzhiyun .matches = {
212*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
213*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dv9700"),
214*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_VERSION, "Rev 1"),
215*4882a593Smuzhiyun },
216*4882a593Smuzhiyun },
217*4882a593Smuzhiyun {
218*4882a593Smuzhiyun .matches = {
219*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "PEGATRON CORPORATION"),
220*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "C15B"),
221*4882a593Smuzhiyun },
222*4882a593Smuzhiyun },
223*4882a593Smuzhiyun {
224*4882a593Smuzhiyun .matches = {
225*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "ByteSpeed LLC"),
226*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "ByteSpeed Laptop C15B"),
227*4882a593Smuzhiyun },
228*4882a593Smuzhiyun },
229*4882a593Smuzhiyun { }
230*4882a593Smuzhiyun };
231*4882a593Smuzhiyun
232*4882a593Smuzhiyun /*
233*4882a593Smuzhiyun * Some Fujitsu notebooks are having trouble with touchpads if
234*4882a593Smuzhiyun * active multiplexing mode is activated. Luckily they don't have
235*4882a593Smuzhiyun * external PS/2 ports so we can safely disable it.
236*4882a593Smuzhiyun * ... apparently some Toshibas don't like MUX mode either and
237*4882a593Smuzhiyun * die horrible death on reboot.
238*4882a593Smuzhiyun */
239*4882a593Smuzhiyun static const struct dmi_system_id __initconst i8042_dmi_nomux_table[] = {
240*4882a593Smuzhiyun {
241*4882a593Smuzhiyun /* Fujitsu Lifebook P7010/P7010D */
242*4882a593Smuzhiyun .matches = {
243*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
244*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "P7010"),
245*4882a593Smuzhiyun },
246*4882a593Smuzhiyun },
247*4882a593Smuzhiyun {
248*4882a593Smuzhiyun /* Fujitsu Lifebook P7010 */
249*4882a593Smuzhiyun .matches = {
250*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
251*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "0000000000"),
252*4882a593Smuzhiyun },
253*4882a593Smuzhiyun },
254*4882a593Smuzhiyun {
255*4882a593Smuzhiyun /* Fujitsu Lifebook P5020D */
256*4882a593Smuzhiyun .matches = {
257*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
258*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "LifeBook P Series"),
259*4882a593Smuzhiyun },
260*4882a593Smuzhiyun },
261*4882a593Smuzhiyun {
262*4882a593Smuzhiyun /* Fujitsu Lifebook S2000 */
263*4882a593Smuzhiyun .matches = {
264*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
265*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "LifeBook S Series"),
266*4882a593Smuzhiyun },
267*4882a593Smuzhiyun },
268*4882a593Smuzhiyun {
269*4882a593Smuzhiyun /* Fujitsu Lifebook S6230 */
270*4882a593Smuzhiyun .matches = {
271*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
272*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "LifeBook S6230"),
273*4882a593Smuzhiyun },
274*4882a593Smuzhiyun },
275*4882a593Smuzhiyun {
276*4882a593Smuzhiyun /* Fujitsu Lifebook T725 laptop */
277*4882a593Smuzhiyun .matches = {
278*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
279*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK T725"),
280*4882a593Smuzhiyun },
281*4882a593Smuzhiyun },
282*4882a593Smuzhiyun {
283*4882a593Smuzhiyun /* Fujitsu Lifebook U745 */
284*4882a593Smuzhiyun .matches = {
285*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
286*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK U745"),
287*4882a593Smuzhiyun },
288*4882a593Smuzhiyun },
289*4882a593Smuzhiyun {
290*4882a593Smuzhiyun /* Fujitsu T70H */
291*4882a593Smuzhiyun .matches = {
292*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
293*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "FMVLT70H"),
294*4882a593Smuzhiyun },
295*4882a593Smuzhiyun },
296*4882a593Smuzhiyun {
297*4882a593Smuzhiyun /* Fujitsu-Siemens Lifebook T3010 */
298*4882a593Smuzhiyun .matches = {
299*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
300*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK T3010"),
301*4882a593Smuzhiyun },
302*4882a593Smuzhiyun },
303*4882a593Smuzhiyun {
304*4882a593Smuzhiyun /* Fujitsu-Siemens Lifebook E4010 */
305*4882a593Smuzhiyun .matches = {
306*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
307*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK E4010"),
308*4882a593Smuzhiyun },
309*4882a593Smuzhiyun },
310*4882a593Smuzhiyun {
311*4882a593Smuzhiyun /* Fujitsu-Siemens Amilo Pro 2010 */
312*4882a593Smuzhiyun .matches = {
313*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
314*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pro V2010"),
315*4882a593Smuzhiyun },
316*4882a593Smuzhiyun },
317*4882a593Smuzhiyun {
318*4882a593Smuzhiyun /* Fujitsu-Siemens Amilo Pro 2030 */
319*4882a593Smuzhiyun .matches = {
320*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
321*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "AMILO PRO V2030"),
322*4882a593Smuzhiyun },
323*4882a593Smuzhiyun },
324*4882a593Smuzhiyun {
325*4882a593Smuzhiyun /*
326*4882a593Smuzhiyun * No data is coming from the touchscreen unless KBC
327*4882a593Smuzhiyun * is in legacy mode.
328*4882a593Smuzhiyun */
329*4882a593Smuzhiyun /* Panasonic CF-29 */
330*4882a593Smuzhiyun .matches = {
331*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "Matsushita"),
332*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "CF-29"),
333*4882a593Smuzhiyun },
334*4882a593Smuzhiyun },
335*4882a593Smuzhiyun {
336*4882a593Smuzhiyun /*
337*4882a593Smuzhiyun * HP Pavilion DV4017EA -
338*4882a593Smuzhiyun * errors on MUX ports are reported without raising AUXDATA
339*4882a593Smuzhiyun * causing "spurious NAK" messages.
340*4882a593Smuzhiyun */
341*4882a593Smuzhiyun .matches = {
342*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
343*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "Pavilion dv4000 (EA032EA#ABF)"),
344*4882a593Smuzhiyun },
345*4882a593Smuzhiyun },
346*4882a593Smuzhiyun {
347*4882a593Smuzhiyun /*
348*4882a593Smuzhiyun * HP Pavilion ZT1000 -
349*4882a593Smuzhiyun * like DV4017EA does not raise AUXERR for errors on MUX ports.
350*4882a593Smuzhiyun */
351*4882a593Smuzhiyun .matches = {
352*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
353*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion Notebook PC"),
354*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_VERSION, "HP Pavilion Notebook ZT1000"),
355*4882a593Smuzhiyun },
356*4882a593Smuzhiyun },
357*4882a593Smuzhiyun {
358*4882a593Smuzhiyun /*
359*4882a593Smuzhiyun * HP Pavilion DV4270ca -
360*4882a593Smuzhiyun * like DV4017EA does not raise AUXERR for errors on MUX ports.
361*4882a593Smuzhiyun */
362*4882a593Smuzhiyun .matches = {
363*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
364*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "Pavilion dv4000 (EH476UA#ABL)"),
365*4882a593Smuzhiyun },
366*4882a593Smuzhiyun },
367*4882a593Smuzhiyun {
368*4882a593Smuzhiyun .matches = {
369*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
370*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "Satellite P10"),
371*4882a593Smuzhiyun },
372*4882a593Smuzhiyun },
373*4882a593Smuzhiyun {
374*4882a593Smuzhiyun .matches = {
375*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
376*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "EQUIUM A110"),
377*4882a593Smuzhiyun },
378*4882a593Smuzhiyun },
379*4882a593Smuzhiyun {
380*4882a593Smuzhiyun .matches = {
381*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
382*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "SATELLITE C850D"),
383*4882a593Smuzhiyun },
384*4882a593Smuzhiyun },
385*4882a593Smuzhiyun {
386*4882a593Smuzhiyun .matches = {
387*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "ALIENWARE"),
388*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "Sentia"),
389*4882a593Smuzhiyun },
390*4882a593Smuzhiyun },
391*4882a593Smuzhiyun {
392*4882a593Smuzhiyun /* Sharp Actius MM20 */
393*4882a593Smuzhiyun .matches = {
394*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "SHARP"),
395*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "PC-MM20 Series"),
396*4882a593Smuzhiyun },
397*4882a593Smuzhiyun },
398*4882a593Smuzhiyun {
399*4882a593Smuzhiyun /* Sony Vaio FS-115b */
400*4882a593Smuzhiyun .matches = {
401*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"),
402*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "VGN-FS115B"),
403*4882a593Smuzhiyun },
404*4882a593Smuzhiyun },
405*4882a593Smuzhiyun {
406*4882a593Smuzhiyun /*
407*4882a593Smuzhiyun * Sony Vaio FZ-240E -
408*4882a593Smuzhiyun * reset and GET ID commands issued via KBD port are
409*4882a593Smuzhiyun * sometimes being delivered to AUX3.
410*4882a593Smuzhiyun */
411*4882a593Smuzhiyun .matches = {
412*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"),
413*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "VGN-FZ240E"),
414*4882a593Smuzhiyun },
415*4882a593Smuzhiyun },
416*4882a593Smuzhiyun {
417*4882a593Smuzhiyun /*
418*4882a593Smuzhiyun * Most (all?) VAIOs do not have external PS/2 ports nor
419*4882a593Smuzhiyun * they implement active multiplexing properly, and
420*4882a593Smuzhiyun * MUX discovery usually messes up keyboard/touchpad.
421*4882a593Smuzhiyun */
422*4882a593Smuzhiyun .matches = {
423*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"),
424*4882a593Smuzhiyun DMI_MATCH(DMI_BOARD_NAME, "VAIO"),
425*4882a593Smuzhiyun },
426*4882a593Smuzhiyun },
427*4882a593Smuzhiyun {
428*4882a593Smuzhiyun /* Amoi M636/A737 */
429*4882a593Smuzhiyun .matches = {
430*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "Amoi Electronics CO.,LTD."),
431*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "M636/A737 platform"),
432*4882a593Smuzhiyun },
433*4882a593Smuzhiyun },
434*4882a593Smuzhiyun {
435*4882a593Smuzhiyun /* Lenovo 3000 n100 */
436*4882a593Smuzhiyun .matches = {
437*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
438*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "076804U"),
439*4882a593Smuzhiyun },
440*4882a593Smuzhiyun },
441*4882a593Smuzhiyun {
442*4882a593Smuzhiyun /* Lenovo XiaoXin Air 12 */
443*4882a593Smuzhiyun .matches = {
444*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
445*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "80UN"),
446*4882a593Smuzhiyun },
447*4882a593Smuzhiyun },
448*4882a593Smuzhiyun {
449*4882a593Smuzhiyun .matches = {
450*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
451*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 1360"),
452*4882a593Smuzhiyun },
453*4882a593Smuzhiyun },
454*4882a593Smuzhiyun {
455*4882a593Smuzhiyun /* Acer Aspire 5710 */
456*4882a593Smuzhiyun .matches = {
457*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
458*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5710"),
459*4882a593Smuzhiyun },
460*4882a593Smuzhiyun },
461*4882a593Smuzhiyun {
462*4882a593Smuzhiyun /* Acer Aspire 7738 */
463*4882a593Smuzhiyun .matches = {
464*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
465*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 7738"),
466*4882a593Smuzhiyun },
467*4882a593Smuzhiyun },
468*4882a593Smuzhiyun {
469*4882a593Smuzhiyun /* Gericom Bellagio */
470*4882a593Smuzhiyun .matches = {
471*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "Gericom"),
472*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "N34AS6"),
473*4882a593Smuzhiyun },
474*4882a593Smuzhiyun },
475*4882a593Smuzhiyun {
476*4882a593Smuzhiyun /* IBM 2656 */
477*4882a593Smuzhiyun .matches = {
478*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "IBM"),
479*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "2656"),
480*4882a593Smuzhiyun },
481*4882a593Smuzhiyun },
482*4882a593Smuzhiyun {
483*4882a593Smuzhiyun /* Dell XPS M1530 */
484*4882a593Smuzhiyun .matches = {
485*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
486*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "XPS M1530"),
487*4882a593Smuzhiyun },
488*4882a593Smuzhiyun },
489*4882a593Smuzhiyun {
490*4882a593Smuzhiyun /* Compal HEL80I */
491*4882a593Smuzhiyun .matches = {
492*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "COMPAL"),
493*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "HEL80I"),
494*4882a593Smuzhiyun },
495*4882a593Smuzhiyun },
496*4882a593Smuzhiyun {
497*4882a593Smuzhiyun /* Dell Vostro 1510 */
498*4882a593Smuzhiyun .matches = {
499*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
500*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "Vostro1510"),
501*4882a593Smuzhiyun },
502*4882a593Smuzhiyun },
503*4882a593Smuzhiyun {
504*4882a593Smuzhiyun /* Acer Aspire 5536 */
505*4882a593Smuzhiyun .matches = {
506*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
507*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5536"),
508*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_VERSION, "0100"),
509*4882a593Smuzhiyun },
510*4882a593Smuzhiyun },
511*4882a593Smuzhiyun {
512*4882a593Smuzhiyun /* Dell Vostro V13 */
513*4882a593Smuzhiyun .matches = {
514*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
515*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "Vostro V13"),
516*4882a593Smuzhiyun },
517*4882a593Smuzhiyun },
518*4882a593Smuzhiyun {
519*4882a593Smuzhiyun /* Newer HP Pavilion dv4 models */
520*4882a593Smuzhiyun .matches = {
521*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
522*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dv4 Notebook PC"),
523*4882a593Smuzhiyun },
524*4882a593Smuzhiyun },
525*4882a593Smuzhiyun {
526*4882a593Smuzhiyun /* Asus X450LCP */
527*4882a593Smuzhiyun .matches = {
528*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
529*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "X450LCP"),
530*4882a593Smuzhiyun },
531*4882a593Smuzhiyun },
532*4882a593Smuzhiyun {
533*4882a593Smuzhiyun /* Avatar AVIU-145A6 */
534*4882a593Smuzhiyun .matches = {
535*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "Intel"),
536*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "IC4I"),
537*4882a593Smuzhiyun },
538*4882a593Smuzhiyun },
539*4882a593Smuzhiyun {
540*4882a593Smuzhiyun /* TUXEDO BU1406 */
541*4882a593Smuzhiyun .matches = {
542*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "Notebook"),
543*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "N24_25BU"),
544*4882a593Smuzhiyun },
545*4882a593Smuzhiyun },
546*4882a593Smuzhiyun {
547*4882a593Smuzhiyun /* Lenovo LaVie Z */
548*4882a593Smuzhiyun .matches = {
549*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
550*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo LaVie Z"),
551*4882a593Smuzhiyun },
552*4882a593Smuzhiyun },
553*4882a593Smuzhiyun {
554*4882a593Smuzhiyun /*
555*4882a593Smuzhiyun * Acer Aspire 5738z
556*4882a593Smuzhiyun * Touchpad stops working in mux mode when dis- + re-enabled
557*4882a593Smuzhiyun * with the touchpad enable/disable toggle hotkey
558*4882a593Smuzhiyun */
559*4882a593Smuzhiyun .matches = {
560*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
561*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5738"),
562*4882a593Smuzhiyun },
563*4882a593Smuzhiyun },
564*4882a593Smuzhiyun {
565*4882a593Smuzhiyun /* Entroware Proteus */
566*4882a593Smuzhiyun .matches = {
567*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "Entroware"),
568*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "Proteus"),
569*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_VERSION, "EL07R4"),
570*4882a593Smuzhiyun },
571*4882a593Smuzhiyun },
572*4882a593Smuzhiyun { }
573*4882a593Smuzhiyun };
574*4882a593Smuzhiyun
575*4882a593Smuzhiyun static const struct dmi_system_id i8042_dmi_forcemux_table[] __initconst = {
576*4882a593Smuzhiyun {
577*4882a593Smuzhiyun /*
578*4882a593Smuzhiyun * Sony Vaio VGN-CS series require MUX or the touch sensor
579*4882a593Smuzhiyun * buttons will disturb touchpad operation
580*4882a593Smuzhiyun */
581*4882a593Smuzhiyun .matches = {
582*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"),
583*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "VGN-CS"),
584*4882a593Smuzhiyun },
585*4882a593Smuzhiyun },
586*4882a593Smuzhiyun { }
587*4882a593Smuzhiyun };
588*4882a593Smuzhiyun
589*4882a593Smuzhiyun /*
590*4882a593Smuzhiyun * On some Asus laptops, just running self tests cause problems.
591*4882a593Smuzhiyun */
592*4882a593Smuzhiyun static const struct dmi_system_id i8042_dmi_noselftest_table[] = {
593*4882a593Smuzhiyun {
594*4882a593Smuzhiyun .matches = {
595*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
596*4882a593Smuzhiyun DMI_MATCH(DMI_CHASSIS_TYPE, "10"), /* Notebook */
597*4882a593Smuzhiyun },
598*4882a593Smuzhiyun }, {
599*4882a593Smuzhiyun .matches = {
600*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
601*4882a593Smuzhiyun DMI_MATCH(DMI_CHASSIS_TYPE, "31"), /* Convertible Notebook */
602*4882a593Smuzhiyun },
603*4882a593Smuzhiyun },
604*4882a593Smuzhiyun { }
605*4882a593Smuzhiyun };
606*4882a593Smuzhiyun static const struct dmi_system_id __initconst i8042_dmi_reset_table[] = {
607*4882a593Smuzhiyun {
608*4882a593Smuzhiyun /* MSI Wind U-100 */
609*4882a593Smuzhiyun .matches = {
610*4882a593Smuzhiyun DMI_MATCH(DMI_BOARD_NAME, "U-100"),
611*4882a593Smuzhiyun DMI_MATCH(DMI_BOARD_VENDOR, "MICRO-STAR INTERNATIONAL CO., LTD"),
612*4882a593Smuzhiyun },
613*4882a593Smuzhiyun },
614*4882a593Smuzhiyun {
615*4882a593Smuzhiyun /* LG Electronics X110 */
616*4882a593Smuzhiyun .matches = {
617*4882a593Smuzhiyun DMI_MATCH(DMI_BOARD_NAME, "X110"),
618*4882a593Smuzhiyun DMI_MATCH(DMI_BOARD_VENDOR, "LG Electronics Inc."),
619*4882a593Smuzhiyun },
620*4882a593Smuzhiyun },
621*4882a593Smuzhiyun {
622*4882a593Smuzhiyun /* Acer Aspire One 150 */
623*4882a593Smuzhiyun .matches = {
624*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
625*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "AOA150"),
626*4882a593Smuzhiyun },
627*4882a593Smuzhiyun },
628*4882a593Smuzhiyun {
629*4882a593Smuzhiyun .matches = {
630*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
631*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "Aspire A114-31"),
632*4882a593Smuzhiyun },
633*4882a593Smuzhiyun },
634*4882a593Smuzhiyun {
635*4882a593Smuzhiyun .matches = {
636*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
637*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "Aspire A314-31"),
638*4882a593Smuzhiyun },
639*4882a593Smuzhiyun },
640*4882a593Smuzhiyun {
641*4882a593Smuzhiyun .matches = {
642*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
643*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "Aspire A315-31"),
644*4882a593Smuzhiyun },
645*4882a593Smuzhiyun },
646*4882a593Smuzhiyun {
647*4882a593Smuzhiyun .matches = {
648*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
649*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "Aspire ES1-132"),
650*4882a593Smuzhiyun },
651*4882a593Smuzhiyun },
652*4882a593Smuzhiyun {
653*4882a593Smuzhiyun .matches = {
654*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
655*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "Aspire ES1-332"),
656*4882a593Smuzhiyun },
657*4882a593Smuzhiyun },
658*4882a593Smuzhiyun {
659*4882a593Smuzhiyun .matches = {
660*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
661*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "Aspire ES1-432"),
662*4882a593Smuzhiyun },
663*4882a593Smuzhiyun },
664*4882a593Smuzhiyun {
665*4882a593Smuzhiyun .matches = {
666*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
667*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate Spin B118-RN"),
668*4882a593Smuzhiyun },
669*4882a593Smuzhiyun },
670*4882a593Smuzhiyun {
671*4882a593Smuzhiyun /* Advent 4211 */
672*4882a593Smuzhiyun .matches = {
673*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "DIXONSXP"),
674*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "Advent 4211"),
675*4882a593Smuzhiyun },
676*4882a593Smuzhiyun },
677*4882a593Smuzhiyun {
678*4882a593Smuzhiyun /* Medion Akoya Mini E1210 */
679*4882a593Smuzhiyun .matches = {
680*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "MEDION"),
681*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "E1210"),
682*4882a593Smuzhiyun },
683*4882a593Smuzhiyun },
684*4882a593Smuzhiyun {
685*4882a593Smuzhiyun /* Medion Akoya E1222 */
686*4882a593Smuzhiyun .matches = {
687*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "MEDION"),
688*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "E122X"),
689*4882a593Smuzhiyun },
690*4882a593Smuzhiyun },
691*4882a593Smuzhiyun {
692*4882a593Smuzhiyun /* Mivvy M310 */
693*4882a593Smuzhiyun .matches = {
694*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "VIOOO"),
695*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "N10"),
696*4882a593Smuzhiyun },
697*4882a593Smuzhiyun },
698*4882a593Smuzhiyun {
699*4882a593Smuzhiyun /* Dell Vostro 1320 */
700*4882a593Smuzhiyun .matches = {
701*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
702*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "Vostro 1320"),
703*4882a593Smuzhiyun },
704*4882a593Smuzhiyun },
705*4882a593Smuzhiyun {
706*4882a593Smuzhiyun /* Dell Vostro 1520 */
707*4882a593Smuzhiyun .matches = {
708*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
709*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "Vostro 1520"),
710*4882a593Smuzhiyun },
711*4882a593Smuzhiyun },
712*4882a593Smuzhiyun {
713*4882a593Smuzhiyun /* Dell Vostro 1720 */
714*4882a593Smuzhiyun .matches = {
715*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
716*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "Vostro 1720"),
717*4882a593Smuzhiyun },
718*4882a593Smuzhiyun },
719*4882a593Smuzhiyun {
720*4882a593Smuzhiyun /* Lenovo Ideapad U455 */
721*4882a593Smuzhiyun .matches = {
722*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
723*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "20046"),
724*4882a593Smuzhiyun },
725*4882a593Smuzhiyun },
726*4882a593Smuzhiyun {
727*4882a593Smuzhiyun /* Lenovo ThinkPad L460 */
728*4882a593Smuzhiyun .matches = {
729*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
730*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad L460"),
731*4882a593Smuzhiyun },
732*4882a593Smuzhiyun },
733*4882a593Smuzhiyun {
734*4882a593Smuzhiyun /* Clevo P650RS, 650RP6, Sager NP8152-S, and others */
735*4882a593Smuzhiyun .matches = {
736*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "Notebook"),
737*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "P65xRP"),
738*4882a593Smuzhiyun },
739*4882a593Smuzhiyun },
740*4882a593Smuzhiyun {
741*4882a593Smuzhiyun /* Lenovo ThinkPad Twist S230u */
742*4882a593Smuzhiyun .matches = {
743*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
744*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "33474HU"),
745*4882a593Smuzhiyun },
746*4882a593Smuzhiyun },
747*4882a593Smuzhiyun {
748*4882a593Smuzhiyun /* Entroware Proteus */
749*4882a593Smuzhiyun .matches = {
750*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "Entroware"),
751*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "Proteus"),
752*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_VERSION, "EL07R4"),
753*4882a593Smuzhiyun },
754*4882a593Smuzhiyun },
755*4882a593Smuzhiyun { }
756*4882a593Smuzhiyun };
757*4882a593Smuzhiyun
758*4882a593Smuzhiyun #ifdef CONFIG_PNP
759*4882a593Smuzhiyun static const struct dmi_system_id __initconst i8042_dmi_nopnp_table[] = {
760*4882a593Smuzhiyun {
761*4882a593Smuzhiyun /* Intel MBO Desktop D845PESV */
762*4882a593Smuzhiyun .matches = {
763*4882a593Smuzhiyun DMI_MATCH(DMI_BOARD_NAME, "D845PESV"),
764*4882a593Smuzhiyun DMI_MATCH(DMI_BOARD_VENDOR, "Intel Corporation"),
765*4882a593Smuzhiyun },
766*4882a593Smuzhiyun },
767*4882a593Smuzhiyun {
768*4882a593Smuzhiyun /*
769*4882a593Smuzhiyun * Intel NUC D54250WYK - does not have i8042 controller but
770*4882a593Smuzhiyun * declares PS/2 devices in DSDT.
771*4882a593Smuzhiyun */
772*4882a593Smuzhiyun .matches = {
773*4882a593Smuzhiyun DMI_MATCH(DMI_BOARD_NAME, "D54250WYK"),
774*4882a593Smuzhiyun DMI_MATCH(DMI_BOARD_VENDOR, "Intel Corporation"),
775*4882a593Smuzhiyun },
776*4882a593Smuzhiyun },
777*4882a593Smuzhiyun {
778*4882a593Smuzhiyun /* MSI Wind U-100 */
779*4882a593Smuzhiyun .matches = {
780*4882a593Smuzhiyun DMI_MATCH(DMI_BOARD_NAME, "U-100"),
781*4882a593Smuzhiyun DMI_MATCH(DMI_BOARD_VENDOR, "MICRO-STAR INTERNATIONAL CO., LTD"),
782*4882a593Smuzhiyun },
783*4882a593Smuzhiyun },
784*4882a593Smuzhiyun {
785*4882a593Smuzhiyun /* Acer Aspire 5 A515 */
786*4882a593Smuzhiyun .matches = {
787*4882a593Smuzhiyun DMI_MATCH(DMI_BOARD_NAME, "Grumpy_PK"),
788*4882a593Smuzhiyun DMI_MATCH(DMI_BOARD_VENDOR, "PK"),
789*4882a593Smuzhiyun },
790*4882a593Smuzhiyun },
791*4882a593Smuzhiyun { }
792*4882a593Smuzhiyun };
793*4882a593Smuzhiyun
794*4882a593Smuzhiyun static const struct dmi_system_id __initconst i8042_dmi_laptop_table[] = {
795*4882a593Smuzhiyun {
796*4882a593Smuzhiyun .matches = {
797*4882a593Smuzhiyun DMI_MATCH(DMI_CHASSIS_TYPE, "8"), /* Portable */
798*4882a593Smuzhiyun },
799*4882a593Smuzhiyun },
800*4882a593Smuzhiyun {
801*4882a593Smuzhiyun .matches = {
802*4882a593Smuzhiyun DMI_MATCH(DMI_CHASSIS_TYPE, "9"), /* Laptop */
803*4882a593Smuzhiyun },
804*4882a593Smuzhiyun },
805*4882a593Smuzhiyun {
806*4882a593Smuzhiyun .matches = {
807*4882a593Smuzhiyun DMI_MATCH(DMI_CHASSIS_TYPE, "10"), /* Notebook */
808*4882a593Smuzhiyun },
809*4882a593Smuzhiyun },
810*4882a593Smuzhiyun {
811*4882a593Smuzhiyun .matches = {
812*4882a593Smuzhiyun DMI_MATCH(DMI_CHASSIS_TYPE, "14"), /* Sub-Notebook */
813*4882a593Smuzhiyun },
814*4882a593Smuzhiyun },
815*4882a593Smuzhiyun { }
816*4882a593Smuzhiyun };
817*4882a593Smuzhiyun #endif
818*4882a593Smuzhiyun
819*4882a593Smuzhiyun static const struct dmi_system_id __initconst i8042_dmi_notimeout_table[] = {
820*4882a593Smuzhiyun {
821*4882a593Smuzhiyun /* Dell Vostro V13 */
822*4882a593Smuzhiyun .matches = {
823*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
824*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "Vostro V13"),
825*4882a593Smuzhiyun },
826*4882a593Smuzhiyun },
827*4882a593Smuzhiyun {
828*4882a593Smuzhiyun /* Newer HP Pavilion dv4 models */
829*4882a593Smuzhiyun .matches = {
830*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
831*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dv4 Notebook PC"),
832*4882a593Smuzhiyun },
833*4882a593Smuzhiyun },
834*4882a593Smuzhiyun {
835*4882a593Smuzhiyun /* Fujitsu A544 laptop */
836*4882a593Smuzhiyun /* https://bugzilla.redhat.com/show_bug.cgi?id=1111138 */
837*4882a593Smuzhiyun .matches = {
838*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
839*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK A544"),
840*4882a593Smuzhiyun },
841*4882a593Smuzhiyun },
842*4882a593Smuzhiyun {
843*4882a593Smuzhiyun /* Fujitsu AH544 laptop */
844*4882a593Smuzhiyun /* https://bugzilla.kernel.org/show_bug.cgi?id=69731 */
845*4882a593Smuzhiyun .matches = {
846*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
847*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK AH544"),
848*4882a593Smuzhiyun },
849*4882a593Smuzhiyun },
850*4882a593Smuzhiyun {
851*4882a593Smuzhiyun /* Fujitsu Lifebook T725 laptop */
852*4882a593Smuzhiyun .matches = {
853*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
854*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK T725"),
855*4882a593Smuzhiyun },
856*4882a593Smuzhiyun },
857*4882a593Smuzhiyun {
858*4882a593Smuzhiyun /* Fujitsu U574 laptop */
859*4882a593Smuzhiyun /* https://bugzilla.kernel.org/show_bug.cgi?id=69731 */
860*4882a593Smuzhiyun .matches = {
861*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
862*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK U574"),
863*4882a593Smuzhiyun },
864*4882a593Smuzhiyun },
865*4882a593Smuzhiyun {
866*4882a593Smuzhiyun /* Fujitsu UH554 laptop */
867*4882a593Smuzhiyun .matches = {
868*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
869*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK UH544"),
870*4882a593Smuzhiyun },
871*4882a593Smuzhiyun },
872*4882a593Smuzhiyun { }
873*4882a593Smuzhiyun };
874*4882a593Smuzhiyun
875*4882a593Smuzhiyun /*
876*4882a593Smuzhiyun * Some Wistron based laptops need us to explicitly enable the 'Dritek
877*4882a593Smuzhiyun * keyboard extension' to make their extra keys start generating scancodes.
878*4882a593Smuzhiyun * Originally, this was just confined to older laptops, but a few Acer laptops
879*4882a593Smuzhiyun * have turned up in 2007 that also need this again.
880*4882a593Smuzhiyun */
881*4882a593Smuzhiyun static const struct dmi_system_id __initconst i8042_dmi_dritek_table[] = {
882*4882a593Smuzhiyun {
883*4882a593Smuzhiyun /* Acer Aspire 5100 */
884*4882a593Smuzhiyun .matches = {
885*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
886*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5100"),
887*4882a593Smuzhiyun },
888*4882a593Smuzhiyun },
889*4882a593Smuzhiyun {
890*4882a593Smuzhiyun /* Acer Aspire 5610 */
891*4882a593Smuzhiyun .matches = {
892*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
893*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5610"),
894*4882a593Smuzhiyun },
895*4882a593Smuzhiyun },
896*4882a593Smuzhiyun {
897*4882a593Smuzhiyun /* Acer Aspire 5630 */
898*4882a593Smuzhiyun .matches = {
899*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
900*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5630"),
901*4882a593Smuzhiyun },
902*4882a593Smuzhiyun },
903*4882a593Smuzhiyun {
904*4882a593Smuzhiyun /* Acer Aspire 5650 */
905*4882a593Smuzhiyun .matches = {
906*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
907*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5650"),
908*4882a593Smuzhiyun },
909*4882a593Smuzhiyun },
910*4882a593Smuzhiyun {
911*4882a593Smuzhiyun /* Acer Aspire 5680 */
912*4882a593Smuzhiyun .matches = {
913*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
914*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5680"),
915*4882a593Smuzhiyun },
916*4882a593Smuzhiyun },
917*4882a593Smuzhiyun {
918*4882a593Smuzhiyun /* Acer Aspire 5720 */
919*4882a593Smuzhiyun .matches = {
920*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
921*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5720"),
922*4882a593Smuzhiyun },
923*4882a593Smuzhiyun },
924*4882a593Smuzhiyun {
925*4882a593Smuzhiyun /* Acer Aspire 9110 */
926*4882a593Smuzhiyun .matches = {
927*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
928*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 9110"),
929*4882a593Smuzhiyun },
930*4882a593Smuzhiyun },
931*4882a593Smuzhiyun {
932*4882a593Smuzhiyun /* Acer TravelMate 660 */
933*4882a593Smuzhiyun .matches = {
934*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
935*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 660"),
936*4882a593Smuzhiyun },
937*4882a593Smuzhiyun },
938*4882a593Smuzhiyun {
939*4882a593Smuzhiyun /* Acer TravelMate 2490 */
940*4882a593Smuzhiyun .matches = {
941*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
942*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 2490"),
943*4882a593Smuzhiyun },
944*4882a593Smuzhiyun },
945*4882a593Smuzhiyun {
946*4882a593Smuzhiyun /* Acer TravelMate 4280 */
947*4882a593Smuzhiyun .matches = {
948*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
949*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 4280"),
950*4882a593Smuzhiyun },
951*4882a593Smuzhiyun },
952*4882a593Smuzhiyun { }
953*4882a593Smuzhiyun };
954*4882a593Smuzhiyun
955*4882a593Smuzhiyun /*
956*4882a593Smuzhiyun * Some laptops need keyboard reset before probing for the trackpad to get
957*4882a593Smuzhiyun * it detected, initialised & finally work.
958*4882a593Smuzhiyun */
959*4882a593Smuzhiyun static const struct dmi_system_id __initconst i8042_dmi_kbdreset_table[] = {
960*4882a593Smuzhiyun {
961*4882a593Smuzhiyun /* Gigabyte P35 v2 - Elantech touchpad */
962*4882a593Smuzhiyun .matches = {
963*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"),
964*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "P35V2"),
965*4882a593Smuzhiyun },
966*4882a593Smuzhiyun },
967*4882a593Smuzhiyun {
968*4882a593Smuzhiyun /* Aorus branded Gigabyte X3 Plus - Elantech touchpad */
969*4882a593Smuzhiyun .matches = {
970*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"),
971*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "X3"),
972*4882a593Smuzhiyun },
973*4882a593Smuzhiyun },
974*4882a593Smuzhiyun {
975*4882a593Smuzhiyun /* Gigabyte P34 - Elantech touchpad */
976*4882a593Smuzhiyun .matches = {
977*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"),
978*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "P34"),
979*4882a593Smuzhiyun },
980*4882a593Smuzhiyun },
981*4882a593Smuzhiyun {
982*4882a593Smuzhiyun /* Gigabyte P57 - Elantech touchpad */
983*4882a593Smuzhiyun .matches = {
984*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"),
985*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "P57"),
986*4882a593Smuzhiyun },
987*4882a593Smuzhiyun },
988*4882a593Smuzhiyun {
989*4882a593Smuzhiyun /* Schenker XMG C504 - Elantech touchpad */
990*4882a593Smuzhiyun .matches = {
991*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "XMG"),
992*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "C504"),
993*4882a593Smuzhiyun },
994*4882a593Smuzhiyun },
995*4882a593Smuzhiyun { }
996*4882a593Smuzhiyun };
997*4882a593Smuzhiyun
998*4882a593Smuzhiyun static const struct dmi_system_id i8042_dmi_probe_defer_table[] __initconst = {
999*4882a593Smuzhiyun {
1000*4882a593Smuzhiyun /* ASUS ZenBook UX425UA */
1001*4882a593Smuzhiyun .matches = {
1002*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
1003*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "ZenBook UX425UA"),
1004*4882a593Smuzhiyun },
1005*4882a593Smuzhiyun },
1006*4882a593Smuzhiyun {
1007*4882a593Smuzhiyun /* ASUS ZenBook UM325UA */
1008*4882a593Smuzhiyun .matches = {
1009*4882a593Smuzhiyun DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
1010*4882a593Smuzhiyun DMI_MATCH(DMI_PRODUCT_NAME, "ZenBook UX325UA_UM325UA"),
1011*4882a593Smuzhiyun },
1012*4882a593Smuzhiyun },
1013*4882a593Smuzhiyun { }
1014*4882a593Smuzhiyun };
1015*4882a593Smuzhiyun
1016*4882a593Smuzhiyun #endif /* CONFIG_X86 */
1017*4882a593Smuzhiyun
1018*4882a593Smuzhiyun #ifdef CONFIG_PNP
1019*4882a593Smuzhiyun #include <linux/pnp.h>
1020*4882a593Smuzhiyun
1021*4882a593Smuzhiyun static bool i8042_pnp_kbd_registered;
1022*4882a593Smuzhiyun static unsigned int i8042_pnp_kbd_devices;
1023*4882a593Smuzhiyun static bool i8042_pnp_aux_registered;
1024*4882a593Smuzhiyun static unsigned int i8042_pnp_aux_devices;
1025*4882a593Smuzhiyun
1026*4882a593Smuzhiyun static int i8042_pnp_command_reg;
1027*4882a593Smuzhiyun static int i8042_pnp_data_reg;
1028*4882a593Smuzhiyun static int i8042_pnp_kbd_irq;
1029*4882a593Smuzhiyun static int i8042_pnp_aux_irq;
1030*4882a593Smuzhiyun
1031*4882a593Smuzhiyun static char i8042_pnp_kbd_name[32];
1032*4882a593Smuzhiyun static char i8042_pnp_aux_name[32];
1033*4882a593Smuzhiyun
i8042_pnp_id_to_string(struct pnp_id * id,char * dst,int dst_size)1034*4882a593Smuzhiyun static void i8042_pnp_id_to_string(struct pnp_id *id, char *dst, int dst_size)
1035*4882a593Smuzhiyun {
1036*4882a593Smuzhiyun strlcpy(dst, "PNP:", dst_size);
1037*4882a593Smuzhiyun
1038*4882a593Smuzhiyun while (id) {
1039*4882a593Smuzhiyun strlcat(dst, " ", dst_size);
1040*4882a593Smuzhiyun strlcat(dst, id->id, dst_size);
1041*4882a593Smuzhiyun id = id->next;
1042*4882a593Smuzhiyun }
1043*4882a593Smuzhiyun }
1044*4882a593Smuzhiyun
i8042_pnp_kbd_probe(struct pnp_dev * dev,const struct pnp_device_id * did)1045*4882a593Smuzhiyun static int i8042_pnp_kbd_probe(struct pnp_dev *dev, const struct pnp_device_id *did)
1046*4882a593Smuzhiyun {
1047*4882a593Smuzhiyun if (pnp_port_valid(dev, 0) && pnp_port_len(dev, 0) == 1)
1048*4882a593Smuzhiyun i8042_pnp_data_reg = pnp_port_start(dev,0);
1049*4882a593Smuzhiyun
1050*4882a593Smuzhiyun if (pnp_port_valid(dev, 1) && pnp_port_len(dev, 1) == 1)
1051*4882a593Smuzhiyun i8042_pnp_command_reg = pnp_port_start(dev, 1);
1052*4882a593Smuzhiyun
1053*4882a593Smuzhiyun if (pnp_irq_valid(dev,0))
1054*4882a593Smuzhiyun i8042_pnp_kbd_irq = pnp_irq(dev, 0);
1055*4882a593Smuzhiyun
1056*4882a593Smuzhiyun strlcpy(i8042_pnp_kbd_name, did->id, sizeof(i8042_pnp_kbd_name));
1057*4882a593Smuzhiyun if (strlen(pnp_dev_name(dev))) {
1058*4882a593Smuzhiyun strlcat(i8042_pnp_kbd_name, ":", sizeof(i8042_pnp_kbd_name));
1059*4882a593Smuzhiyun strlcat(i8042_pnp_kbd_name, pnp_dev_name(dev), sizeof(i8042_pnp_kbd_name));
1060*4882a593Smuzhiyun }
1061*4882a593Smuzhiyun i8042_pnp_id_to_string(dev->id, i8042_kbd_firmware_id,
1062*4882a593Smuzhiyun sizeof(i8042_kbd_firmware_id));
1063*4882a593Smuzhiyun i8042_kbd_fwnode = dev_fwnode(&dev->dev);
1064*4882a593Smuzhiyun
1065*4882a593Smuzhiyun /* Keyboard ports are always supposed to be wakeup-enabled */
1066*4882a593Smuzhiyun device_set_wakeup_enable(&dev->dev, true);
1067*4882a593Smuzhiyun
1068*4882a593Smuzhiyun i8042_pnp_kbd_devices++;
1069*4882a593Smuzhiyun return 0;
1070*4882a593Smuzhiyun }
1071*4882a593Smuzhiyun
i8042_pnp_aux_probe(struct pnp_dev * dev,const struct pnp_device_id * did)1072*4882a593Smuzhiyun static int i8042_pnp_aux_probe(struct pnp_dev *dev, const struct pnp_device_id *did)
1073*4882a593Smuzhiyun {
1074*4882a593Smuzhiyun if (pnp_port_valid(dev, 0) && pnp_port_len(dev, 0) == 1)
1075*4882a593Smuzhiyun i8042_pnp_data_reg = pnp_port_start(dev,0);
1076*4882a593Smuzhiyun
1077*4882a593Smuzhiyun if (pnp_port_valid(dev, 1) && pnp_port_len(dev, 1) == 1)
1078*4882a593Smuzhiyun i8042_pnp_command_reg = pnp_port_start(dev, 1);
1079*4882a593Smuzhiyun
1080*4882a593Smuzhiyun if (pnp_irq_valid(dev, 0))
1081*4882a593Smuzhiyun i8042_pnp_aux_irq = pnp_irq(dev, 0);
1082*4882a593Smuzhiyun
1083*4882a593Smuzhiyun strlcpy(i8042_pnp_aux_name, did->id, sizeof(i8042_pnp_aux_name));
1084*4882a593Smuzhiyun if (strlen(pnp_dev_name(dev))) {
1085*4882a593Smuzhiyun strlcat(i8042_pnp_aux_name, ":", sizeof(i8042_pnp_aux_name));
1086*4882a593Smuzhiyun strlcat(i8042_pnp_aux_name, pnp_dev_name(dev), sizeof(i8042_pnp_aux_name));
1087*4882a593Smuzhiyun }
1088*4882a593Smuzhiyun i8042_pnp_id_to_string(dev->id, i8042_aux_firmware_id,
1089*4882a593Smuzhiyun sizeof(i8042_aux_firmware_id));
1090*4882a593Smuzhiyun
1091*4882a593Smuzhiyun i8042_pnp_aux_devices++;
1092*4882a593Smuzhiyun return 0;
1093*4882a593Smuzhiyun }
1094*4882a593Smuzhiyun
1095*4882a593Smuzhiyun static const struct pnp_device_id pnp_kbd_devids[] = {
1096*4882a593Smuzhiyun { .id = "PNP0300", .driver_data = 0 },
1097*4882a593Smuzhiyun { .id = "PNP0301", .driver_data = 0 },
1098*4882a593Smuzhiyun { .id = "PNP0302", .driver_data = 0 },
1099*4882a593Smuzhiyun { .id = "PNP0303", .driver_data = 0 },
1100*4882a593Smuzhiyun { .id = "PNP0304", .driver_data = 0 },
1101*4882a593Smuzhiyun { .id = "PNP0305", .driver_data = 0 },
1102*4882a593Smuzhiyun { .id = "PNP0306", .driver_data = 0 },
1103*4882a593Smuzhiyun { .id = "PNP0309", .driver_data = 0 },
1104*4882a593Smuzhiyun { .id = "PNP030a", .driver_data = 0 },
1105*4882a593Smuzhiyun { .id = "PNP030b", .driver_data = 0 },
1106*4882a593Smuzhiyun { .id = "PNP0320", .driver_data = 0 },
1107*4882a593Smuzhiyun { .id = "PNP0343", .driver_data = 0 },
1108*4882a593Smuzhiyun { .id = "PNP0344", .driver_data = 0 },
1109*4882a593Smuzhiyun { .id = "PNP0345", .driver_data = 0 },
1110*4882a593Smuzhiyun { .id = "CPQA0D7", .driver_data = 0 },
1111*4882a593Smuzhiyun { .id = "", },
1112*4882a593Smuzhiyun };
1113*4882a593Smuzhiyun MODULE_DEVICE_TABLE(pnp, pnp_kbd_devids);
1114*4882a593Smuzhiyun
1115*4882a593Smuzhiyun static struct pnp_driver i8042_pnp_kbd_driver = {
1116*4882a593Smuzhiyun .name = "i8042 kbd",
1117*4882a593Smuzhiyun .id_table = pnp_kbd_devids,
1118*4882a593Smuzhiyun .probe = i8042_pnp_kbd_probe,
1119*4882a593Smuzhiyun .driver = {
1120*4882a593Smuzhiyun .probe_type = PROBE_FORCE_SYNCHRONOUS,
1121*4882a593Smuzhiyun .suppress_bind_attrs = true,
1122*4882a593Smuzhiyun },
1123*4882a593Smuzhiyun };
1124*4882a593Smuzhiyun
1125*4882a593Smuzhiyun static const struct pnp_device_id pnp_aux_devids[] = {
1126*4882a593Smuzhiyun { .id = "AUI0200", .driver_data = 0 },
1127*4882a593Smuzhiyun { .id = "FJC6000", .driver_data = 0 },
1128*4882a593Smuzhiyun { .id = "FJC6001", .driver_data = 0 },
1129*4882a593Smuzhiyun { .id = "PNP0f03", .driver_data = 0 },
1130*4882a593Smuzhiyun { .id = "PNP0f0b", .driver_data = 0 },
1131*4882a593Smuzhiyun { .id = "PNP0f0e", .driver_data = 0 },
1132*4882a593Smuzhiyun { .id = "PNP0f12", .driver_data = 0 },
1133*4882a593Smuzhiyun { .id = "PNP0f13", .driver_data = 0 },
1134*4882a593Smuzhiyun { .id = "PNP0f19", .driver_data = 0 },
1135*4882a593Smuzhiyun { .id = "PNP0f1c", .driver_data = 0 },
1136*4882a593Smuzhiyun { .id = "SYN0801", .driver_data = 0 },
1137*4882a593Smuzhiyun { .id = "", },
1138*4882a593Smuzhiyun };
1139*4882a593Smuzhiyun MODULE_DEVICE_TABLE(pnp, pnp_aux_devids);
1140*4882a593Smuzhiyun
1141*4882a593Smuzhiyun static struct pnp_driver i8042_pnp_aux_driver = {
1142*4882a593Smuzhiyun .name = "i8042 aux",
1143*4882a593Smuzhiyun .id_table = pnp_aux_devids,
1144*4882a593Smuzhiyun .probe = i8042_pnp_aux_probe,
1145*4882a593Smuzhiyun .driver = {
1146*4882a593Smuzhiyun .probe_type = PROBE_FORCE_SYNCHRONOUS,
1147*4882a593Smuzhiyun .suppress_bind_attrs = true,
1148*4882a593Smuzhiyun },
1149*4882a593Smuzhiyun };
1150*4882a593Smuzhiyun
i8042_pnp_exit(void)1151*4882a593Smuzhiyun static void i8042_pnp_exit(void)
1152*4882a593Smuzhiyun {
1153*4882a593Smuzhiyun if (i8042_pnp_kbd_registered) {
1154*4882a593Smuzhiyun i8042_pnp_kbd_registered = false;
1155*4882a593Smuzhiyun pnp_unregister_driver(&i8042_pnp_kbd_driver);
1156*4882a593Smuzhiyun }
1157*4882a593Smuzhiyun
1158*4882a593Smuzhiyun if (i8042_pnp_aux_registered) {
1159*4882a593Smuzhiyun i8042_pnp_aux_registered = false;
1160*4882a593Smuzhiyun pnp_unregister_driver(&i8042_pnp_aux_driver);
1161*4882a593Smuzhiyun }
1162*4882a593Smuzhiyun }
1163*4882a593Smuzhiyun
i8042_pnp_init(void)1164*4882a593Smuzhiyun static int __init i8042_pnp_init(void)
1165*4882a593Smuzhiyun {
1166*4882a593Smuzhiyun char kbd_irq_str[4] = { 0 }, aux_irq_str[4] = { 0 };
1167*4882a593Smuzhiyun bool pnp_data_busted = false;
1168*4882a593Smuzhiyun int err;
1169*4882a593Smuzhiyun
1170*4882a593Smuzhiyun #ifdef CONFIG_X86
1171*4882a593Smuzhiyun if (dmi_check_system(i8042_dmi_nopnp_table))
1172*4882a593Smuzhiyun i8042_nopnp = true;
1173*4882a593Smuzhiyun #endif
1174*4882a593Smuzhiyun
1175*4882a593Smuzhiyun if (i8042_nopnp) {
1176*4882a593Smuzhiyun pr_info("PNP detection disabled\n");
1177*4882a593Smuzhiyun return 0;
1178*4882a593Smuzhiyun }
1179*4882a593Smuzhiyun
1180*4882a593Smuzhiyun err = pnp_register_driver(&i8042_pnp_kbd_driver);
1181*4882a593Smuzhiyun if (!err)
1182*4882a593Smuzhiyun i8042_pnp_kbd_registered = true;
1183*4882a593Smuzhiyun
1184*4882a593Smuzhiyun err = pnp_register_driver(&i8042_pnp_aux_driver);
1185*4882a593Smuzhiyun if (!err)
1186*4882a593Smuzhiyun i8042_pnp_aux_registered = true;
1187*4882a593Smuzhiyun
1188*4882a593Smuzhiyun if (!i8042_pnp_kbd_devices && !i8042_pnp_aux_devices) {
1189*4882a593Smuzhiyun i8042_pnp_exit();
1190*4882a593Smuzhiyun #if defined(__ia64__)
1191*4882a593Smuzhiyun return -ENODEV;
1192*4882a593Smuzhiyun #else
1193*4882a593Smuzhiyun pr_info("PNP: No PS/2 controller found.\n");
1194*4882a593Smuzhiyun if (x86_platform.legacy.i8042 !=
1195*4882a593Smuzhiyun X86_LEGACY_I8042_EXPECTED_PRESENT)
1196*4882a593Smuzhiyun return -ENODEV;
1197*4882a593Smuzhiyun pr_info("Probing ports directly.\n");
1198*4882a593Smuzhiyun return 0;
1199*4882a593Smuzhiyun #endif
1200*4882a593Smuzhiyun }
1201*4882a593Smuzhiyun
1202*4882a593Smuzhiyun if (i8042_pnp_kbd_devices)
1203*4882a593Smuzhiyun snprintf(kbd_irq_str, sizeof(kbd_irq_str),
1204*4882a593Smuzhiyun "%d", i8042_pnp_kbd_irq);
1205*4882a593Smuzhiyun if (i8042_pnp_aux_devices)
1206*4882a593Smuzhiyun snprintf(aux_irq_str, sizeof(aux_irq_str),
1207*4882a593Smuzhiyun "%d", i8042_pnp_aux_irq);
1208*4882a593Smuzhiyun
1209*4882a593Smuzhiyun pr_info("PNP: PS/2 Controller [%s%s%s] at %#x,%#x irq %s%s%s\n",
1210*4882a593Smuzhiyun i8042_pnp_kbd_name, (i8042_pnp_kbd_devices && i8042_pnp_aux_devices) ? "," : "",
1211*4882a593Smuzhiyun i8042_pnp_aux_name,
1212*4882a593Smuzhiyun i8042_pnp_data_reg, i8042_pnp_command_reg,
1213*4882a593Smuzhiyun kbd_irq_str, (i8042_pnp_kbd_devices && i8042_pnp_aux_devices) ? "," : "",
1214*4882a593Smuzhiyun aux_irq_str);
1215*4882a593Smuzhiyun
1216*4882a593Smuzhiyun #if defined(__ia64__)
1217*4882a593Smuzhiyun if (!i8042_pnp_kbd_devices)
1218*4882a593Smuzhiyun i8042_nokbd = true;
1219*4882a593Smuzhiyun if (!i8042_pnp_aux_devices)
1220*4882a593Smuzhiyun i8042_noaux = true;
1221*4882a593Smuzhiyun #endif
1222*4882a593Smuzhiyun
1223*4882a593Smuzhiyun if (((i8042_pnp_data_reg & ~0xf) == (i8042_data_reg & ~0xf) &&
1224*4882a593Smuzhiyun i8042_pnp_data_reg != i8042_data_reg) ||
1225*4882a593Smuzhiyun !i8042_pnp_data_reg) {
1226*4882a593Smuzhiyun pr_warn("PNP: PS/2 controller has invalid data port %#x; using default %#x\n",
1227*4882a593Smuzhiyun i8042_pnp_data_reg, i8042_data_reg);
1228*4882a593Smuzhiyun i8042_pnp_data_reg = i8042_data_reg;
1229*4882a593Smuzhiyun pnp_data_busted = true;
1230*4882a593Smuzhiyun }
1231*4882a593Smuzhiyun
1232*4882a593Smuzhiyun if (((i8042_pnp_command_reg & ~0xf) == (i8042_command_reg & ~0xf) &&
1233*4882a593Smuzhiyun i8042_pnp_command_reg != i8042_command_reg) ||
1234*4882a593Smuzhiyun !i8042_pnp_command_reg) {
1235*4882a593Smuzhiyun pr_warn("PNP: PS/2 controller has invalid command port %#x; using default %#x\n",
1236*4882a593Smuzhiyun i8042_pnp_command_reg, i8042_command_reg);
1237*4882a593Smuzhiyun i8042_pnp_command_reg = i8042_command_reg;
1238*4882a593Smuzhiyun pnp_data_busted = true;
1239*4882a593Smuzhiyun }
1240*4882a593Smuzhiyun
1241*4882a593Smuzhiyun if (!i8042_nokbd && !i8042_pnp_kbd_irq) {
1242*4882a593Smuzhiyun pr_warn("PNP: PS/2 controller doesn't have KBD irq; using default %d\n",
1243*4882a593Smuzhiyun i8042_kbd_irq);
1244*4882a593Smuzhiyun i8042_pnp_kbd_irq = i8042_kbd_irq;
1245*4882a593Smuzhiyun pnp_data_busted = true;
1246*4882a593Smuzhiyun }
1247*4882a593Smuzhiyun
1248*4882a593Smuzhiyun if (!i8042_noaux && !i8042_pnp_aux_irq) {
1249*4882a593Smuzhiyun if (!pnp_data_busted && i8042_pnp_kbd_irq) {
1250*4882a593Smuzhiyun pr_warn("PNP: PS/2 appears to have AUX port disabled, "
1251*4882a593Smuzhiyun "if this is incorrect please boot with i8042.nopnp\n");
1252*4882a593Smuzhiyun i8042_noaux = true;
1253*4882a593Smuzhiyun } else {
1254*4882a593Smuzhiyun pr_warn("PNP: PS/2 controller doesn't have AUX irq; using default %d\n",
1255*4882a593Smuzhiyun i8042_aux_irq);
1256*4882a593Smuzhiyun i8042_pnp_aux_irq = i8042_aux_irq;
1257*4882a593Smuzhiyun }
1258*4882a593Smuzhiyun }
1259*4882a593Smuzhiyun
1260*4882a593Smuzhiyun i8042_data_reg = i8042_pnp_data_reg;
1261*4882a593Smuzhiyun i8042_command_reg = i8042_pnp_command_reg;
1262*4882a593Smuzhiyun i8042_kbd_irq = i8042_pnp_kbd_irq;
1263*4882a593Smuzhiyun i8042_aux_irq = i8042_pnp_aux_irq;
1264*4882a593Smuzhiyun
1265*4882a593Smuzhiyun #ifdef CONFIG_X86
1266*4882a593Smuzhiyun i8042_bypass_aux_irq_test = !pnp_data_busted &&
1267*4882a593Smuzhiyun dmi_check_system(i8042_dmi_laptop_table);
1268*4882a593Smuzhiyun #endif
1269*4882a593Smuzhiyun
1270*4882a593Smuzhiyun return 0;
1271*4882a593Smuzhiyun }
1272*4882a593Smuzhiyun
1273*4882a593Smuzhiyun #else /* !CONFIG_PNP */
i8042_pnp_init(void)1274*4882a593Smuzhiyun static inline int i8042_pnp_init(void) { return 0; }
i8042_pnp_exit(void)1275*4882a593Smuzhiyun static inline void i8042_pnp_exit(void) { }
1276*4882a593Smuzhiyun #endif /* CONFIG_PNP */
1277*4882a593Smuzhiyun
i8042_platform_init(void)1278*4882a593Smuzhiyun static int __init i8042_platform_init(void)
1279*4882a593Smuzhiyun {
1280*4882a593Smuzhiyun int retval;
1281*4882a593Smuzhiyun
1282*4882a593Smuzhiyun #ifdef CONFIG_X86
1283*4882a593Smuzhiyun u8 a20_on = 0xdf;
1284*4882a593Smuzhiyun /* Just return if platform does not have i8042 controller */
1285*4882a593Smuzhiyun if (x86_platform.legacy.i8042 == X86_LEGACY_I8042_PLATFORM_ABSENT)
1286*4882a593Smuzhiyun return -ENODEV;
1287*4882a593Smuzhiyun #endif
1288*4882a593Smuzhiyun
1289*4882a593Smuzhiyun /*
1290*4882a593Smuzhiyun * On ix86 platforms touching the i8042 data register region can do really
1291*4882a593Smuzhiyun * bad things. Because of this the region is always reserved on ix86 boxes.
1292*4882a593Smuzhiyun *
1293*4882a593Smuzhiyun * if (!request_region(I8042_DATA_REG, 16, "i8042"))
1294*4882a593Smuzhiyun * return -EBUSY;
1295*4882a593Smuzhiyun */
1296*4882a593Smuzhiyun
1297*4882a593Smuzhiyun i8042_kbd_irq = I8042_MAP_IRQ(1);
1298*4882a593Smuzhiyun i8042_aux_irq = I8042_MAP_IRQ(12);
1299*4882a593Smuzhiyun
1300*4882a593Smuzhiyun retval = i8042_pnp_init();
1301*4882a593Smuzhiyun if (retval)
1302*4882a593Smuzhiyun return retval;
1303*4882a593Smuzhiyun
1304*4882a593Smuzhiyun #if defined(__ia64__)
1305*4882a593Smuzhiyun i8042_reset = I8042_RESET_ALWAYS;
1306*4882a593Smuzhiyun #endif
1307*4882a593Smuzhiyun
1308*4882a593Smuzhiyun #ifdef CONFIG_X86
1309*4882a593Smuzhiyun /* Honor module parameter when value is not default */
1310*4882a593Smuzhiyun if (i8042_reset == I8042_RESET_DEFAULT) {
1311*4882a593Smuzhiyun if (dmi_check_system(i8042_dmi_reset_table))
1312*4882a593Smuzhiyun i8042_reset = I8042_RESET_ALWAYS;
1313*4882a593Smuzhiyun
1314*4882a593Smuzhiyun if (dmi_check_system(i8042_dmi_noselftest_table))
1315*4882a593Smuzhiyun i8042_reset = I8042_RESET_NEVER;
1316*4882a593Smuzhiyun }
1317*4882a593Smuzhiyun
1318*4882a593Smuzhiyun if (dmi_check_system(i8042_dmi_noloop_table))
1319*4882a593Smuzhiyun i8042_noloop = true;
1320*4882a593Smuzhiyun
1321*4882a593Smuzhiyun if (dmi_check_system(i8042_dmi_nomux_table))
1322*4882a593Smuzhiyun i8042_nomux = true;
1323*4882a593Smuzhiyun
1324*4882a593Smuzhiyun if (dmi_check_system(i8042_dmi_forcemux_table))
1325*4882a593Smuzhiyun i8042_nomux = false;
1326*4882a593Smuzhiyun
1327*4882a593Smuzhiyun if (dmi_check_system(i8042_dmi_notimeout_table))
1328*4882a593Smuzhiyun i8042_notimeout = true;
1329*4882a593Smuzhiyun
1330*4882a593Smuzhiyun if (dmi_check_system(i8042_dmi_dritek_table))
1331*4882a593Smuzhiyun i8042_dritek = true;
1332*4882a593Smuzhiyun
1333*4882a593Smuzhiyun if (dmi_check_system(i8042_dmi_kbdreset_table))
1334*4882a593Smuzhiyun i8042_kbdreset = true;
1335*4882a593Smuzhiyun
1336*4882a593Smuzhiyun if (dmi_check_system(i8042_dmi_probe_defer_table))
1337*4882a593Smuzhiyun i8042_probe_defer = true;
1338*4882a593Smuzhiyun
1339*4882a593Smuzhiyun /*
1340*4882a593Smuzhiyun * A20 was already enabled during early kernel init. But some buggy
1341*4882a593Smuzhiyun * BIOSes (in MSI Laptops) require A20 to be enabled using 8042 to
1342*4882a593Smuzhiyun * resume from S3. So we do it here and hope that nothing breaks.
1343*4882a593Smuzhiyun */
1344*4882a593Smuzhiyun i8042_command(&a20_on, 0x10d1);
1345*4882a593Smuzhiyun i8042_command(NULL, 0x00ff); /* Null command for SMM firmware */
1346*4882a593Smuzhiyun #endif /* CONFIG_X86 */
1347*4882a593Smuzhiyun
1348*4882a593Smuzhiyun return retval;
1349*4882a593Smuzhiyun }
1350*4882a593Smuzhiyun
i8042_platform_exit(void)1351*4882a593Smuzhiyun static inline void i8042_platform_exit(void)
1352*4882a593Smuzhiyun {
1353*4882a593Smuzhiyun i8042_pnp_exit();
1354*4882a593Smuzhiyun }
1355*4882a593Smuzhiyun
1356*4882a593Smuzhiyun #endif /* _I8042_X86IA64IO_H */
1357