Blame view

drivers/input/serio/i8042-x86ia64io.h 24.9 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
  #ifndef _I8042_X86IA64IO_H
  #define _I8042_X86IA64IO_H
  
  /*
   * This program is free software; you can redistribute it and/or modify it
   * under the terms of the GNU General Public License version 2 as published by
   * the Free Software Foundation.
   */
5cdfa1c3b   Feng Tang   input: i8042 - ad...
9
10
11
  #ifdef CONFIG_X86
  #include <asm/x86_init.h>
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
  /*
   * Names.
   */
  
  #define I8042_KBD_PHYS_DESC "isa0060/serio0"
  #define I8042_AUX_PHYS_DESC "isa0060/serio1"
  #define I8042_MUX_PHYS_DESC "isa0060/serio%d"
  
  /*
   * IRQs.
   */
  
  #if defined(__ia64__)
  # define I8042_MAP_IRQ(x)	isa_irq_to_vector((x))
  #else
  # define I8042_MAP_IRQ(x)	(x)
  #endif
  
  #define I8042_KBD_IRQ	i8042_kbd_irq
  #define I8042_AUX_IRQ	i8042_aux_irq
  
  static int i8042_kbd_irq;
  static int i8042_aux_irq;
  
  /*
   * Register numbers.
   */
  
  #define I8042_COMMAND_REG	i8042_command_reg
  #define I8042_STATUS_REG	i8042_command_reg
  #define I8042_DATA_REG		i8042_data_reg
  
  static int i8042_command_reg = 0x64;
  static int i8042_data_reg = 0x60;
  
  
  static inline int i8042_read_data(void)
  {
  	return inb(I8042_DATA_REG);
  }
  
  static inline int i8042_read_status(void)
  {
  	return inb(I8042_STATUS_REG);
  }
  
  static inline void i8042_write_data(int val)
  {
  	outb(val, I8042_DATA_REG);
  }
  
  static inline void i8042_write_command(int val)
  {
  	outb(val, I8042_COMMAND_REG);
  }
c3a34f439   Jiri Kosina   Input: i8042 - ad...
67
  #ifdef CONFIG_X86
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
68
69
  
  #include <linux/dmi.h>
f909b1df0   Dmitry Torokhov   Input: i8042 - re...
70
  static const struct dmi_system_id __initconst i8042_dmi_noloop_table[] = {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
71
  	{
f909b1df0   Dmitry Torokhov   Input: i8042 - re...
72
73
74
75
  		/*
  		 * Arima-Rioworks HDAMB -
  		 * AUX LOOP command does not raise AUX IRQ
  		 */
87d9173ea   Dmitry Torokhov   Input: i8042 - ad...
76
77
78
79
80
81
82
  		.matches = {
  			DMI_MATCH(DMI_BOARD_VENDOR, "RIOWORKS"),
  			DMI_MATCH(DMI_BOARD_NAME, "HDAMB"),
  			DMI_MATCH(DMI_BOARD_VERSION, "Rev E"),
  		},
  	},
  	{
f909b1df0   Dmitry Torokhov   Input: i8042 - re...
83
  		/* ASUS G1S */
685aaca75   Jory A. Pratt   Input: i8042 - ad...
84
85
86
87
88
89
90
  		.matches = {
  			DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer Inc."),
  			DMI_MATCH(DMI_BOARD_NAME, "G1S"),
  			DMI_MATCH(DMI_BOARD_VERSION, "1.0"),
  		},
  	},
  	{
f909b1df0   Dmitry Torokhov   Input: i8042 - re...
91
  		/* ASUS P65UP5 - AUX LOOP command does not raise AUX IRQ */
90245c17d   Dmitry Torokhov   Input: i8042 - ad...
92
93
94
95
96
97
98
  		.matches = {
  			DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
  			DMI_MATCH(DMI_BOARD_NAME, "P/I-P65UP5"),
  			DMI_MATCH(DMI_BOARD_VERSION, "REV 2.X"),
  		},
  	},
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
99
  		.matches = {
9ff84a173   Hans de Goede   Input: i8042 - ad...
100
101
102
103
104
105
  			DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
  			DMI_MATCH(DMI_PRODUCT_NAME, "X750LN"),
  		},
  	},
  	{
  		.matches = {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
106
107
108
109
110
111
  			DMI_MATCH(DMI_SYS_VENDOR, "Compaq"),
  			DMI_MATCH(DMI_PRODUCT_NAME , "ProLiant"),
  			DMI_MATCH(DMI_PRODUCT_VERSION, "8500"),
  		},
  	},
  	{
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
112
113
114
115
116
117
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "Compaq"),
  			DMI_MATCH(DMI_PRODUCT_NAME , "ProLiant"),
  			DMI_MATCH(DMI_PRODUCT_VERSION, "DL760"),
  		},
  	},
6020bafc9   Ben Collins   Input: i8042 - ad...
118
  	{
f909b1df0   Dmitry Torokhov   Input: i8042 - re...
119
  		/* OQO Model 01 */
6020bafc9   Ben Collins   Input: i8042 - ad...
120
121
122
123
124
125
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "OQO"),
  			DMI_MATCH(DMI_PRODUCT_NAME, "ZEPTO"),
  			DMI_MATCH(DMI_PRODUCT_VERSION, "00"),
  		},
  	},
8c4df74e0   Dmitry Torokhov   Input: i8042 - ad...
126
  	{
f909b1df0   Dmitry Torokhov   Input: i8042 - re...
127
  		/* ULI EV4873 - AUX LOOP does not work properly */
8c4df74e0   Dmitry Torokhov   Input: i8042 - ad...
128
129
130
131
132
133
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "ULI"),
  			DMI_MATCH(DMI_PRODUCT_NAME, "EV4873"),
  			DMI_MATCH(DMI_PRODUCT_VERSION, "5a"),
  		},
  	},
8bf4215e8   Jiri Kosina   Input: i8042 - ad...
134
  	{
f909b1df0   Dmitry Torokhov   Input: i8042 - re...
135
  		/* Microsoft Virtual Machine */
8bf4215e8   Jiri Kosina   Input: i8042 - ad...
136
137
138
139
140
141
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "Microsoft Corporation"),
  			DMI_MATCH(DMI_PRODUCT_NAME, "Virtual Machine"),
  			DMI_MATCH(DMI_PRODUCT_VERSION, "VS2005R2"),
  		},
  	},
89cdb8ceb   Dmitry Torokhov   Input: i8042 - ad...
142
  	{
f909b1df0   Dmitry Torokhov   Input: i8042 - re...
143
  		/* Medion MAM 2070 */
89cdb8ceb   Dmitry Torokhov   Input: i8042 - ad...
144
145
146
147
148
149
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "Notebook"),
  			DMI_MATCH(DMI_PRODUCT_NAME, "MAM 2070"),
  			DMI_MATCH(DMI_PRODUCT_VERSION, "5a"),
  		},
  	},
2c6f2cb83   Stefan Bader   Input: i8042 - ad...
150
  	{
f909b1df0   Dmitry Torokhov   Input: i8042 - re...
151
  		/* Blue FB5601 */
2c6f2cb83   Stefan Bader   Input: i8042 - ad...
152
153
154
155
156
157
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "blue"),
  			DMI_MATCH(DMI_PRODUCT_NAME, "FB5601"),
  			DMI_MATCH(DMI_PRODUCT_VERSION, "M606"),
  		},
  	},
a6f66ddf7   Ozan Çağlayan   Input: i8042 - ad...
158
  	{
f909b1df0   Dmitry Torokhov   Input: i8042 - re...
159
  		/* Gigabyte M912 */
a6f66ddf7   Ozan Çağlayan   Input: i8042 - ad...
160
161
162
163
164
165
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"),
  			DMI_MATCH(DMI_PRODUCT_NAME, "M912"),
  			DMI_MATCH(DMI_PRODUCT_VERSION, "01"),
  		},
  	},
59cc1dd97   Dmitry Torokhov   Input: i8042 - ad...
166
  	{
a61cd0382   Dmitry Torokhov   Input: i8042 - ad...
167
168
169
170
171
172
173
174
  		/* Gigabyte M1022M netbook */
  		.matches = {
  			DMI_MATCH(DMI_BOARD_VENDOR, "Gigabyte Technology Co.,Ltd."),
  			DMI_MATCH(DMI_BOARD_NAME, "M1022E"),
  			DMI_MATCH(DMI_BOARD_VERSION, "1.02"),
  		},
  	},
  	{
3e1bbc8d5   Kamal Mostafa   Input: i8042 - ad...
175
176
177
178
179
180
181
  		/* Gigabyte Spring Peak - defines wrong chassis type */
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"),
  			DMI_MATCH(DMI_PRODUCT_NAME, "Spring Peak"),
  		},
  	},
  	{
7b125b94c   Dmitry Torokhov   Input: i8042 - ad...
182
183
184
185
186
187
188
189
190
191
192
193
194
195
  		/* Gigabyte T1005 - defines wrong chassis type ("Other") */
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"),
  			DMI_MATCH(DMI_PRODUCT_NAME, "T1005"),
  		},
  	},
  	{
  		/* Gigabyte T1005M/P - defines wrong chassis type ("Other") */
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"),
  			DMI_MATCH(DMI_PRODUCT_NAME, "T1005M/P"),
  		},
  	},
  	{
59cc1dd97   Dmitry Torokhov   Input: i8042 - ad...
196
197
198
199
200
201
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
  			DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dv9700"),
  			DMI_MATCH(DMI_PRODUCT_VERSION, "Rev 1"),
  		},
  	},
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
202
203
204
205
  	{ }
  };
  
  /*
e55a33669   Dmitry Torokhov   Revert "Input: i8...
206
207
208
209
210
   * Some Fujitsu notebooks are having trouble with touchpads if
   * active multiplexing mode is activated. Luckily they don't have
   * external PS/2 ports so we can safely disable it.
   * ... apparently some Toshibas don't like MUX mode either and
   * die horrible death on reboot.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
211
   */
e55a33669   Dmitry Torokhov   Revert "Input: i8...
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
  static const struct dmi_system_id __initconst i8042_dmi_nomux_table[] = {
  	{
  		/* Fujitsu Lifebook P7010/P7010D */
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
  			DMI_MATCH(DMI_PRODUCT_NAME, "P7010"),
  		},
  	},
  	{
  		/* Fujitsu Lifebook P7010 */
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
  			DMI_MATCH(DMI_PRODUCT_NAME, "0000000000"),
  		},
  	},
  	{
  		/* Fujitsu Lifebook P5020D */
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
  			DMI_MATCH(DMI_PRODUCT_NAME, "LifeBook P Series"),
  		},
  	},
  	{
  		/* Fujitsu Lifebook S2000 */
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
  			DMI_MATCH(DMI_PRODUCT_NAME, "LifeBook S Series"),
  		},
  	},
  	{
  		/* Fujitsu Lifebook S6230 */
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
  			DMI_MATCH(DMI_PRODUCT_NAME, "LifeBook S6230"),
  		},
  	},
  	{
  		/* Fujitsu T70H */
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
  			DMI_MATCH(DMI_PRODUCT_NAME, "FMVLT70H"),
  		},
  	},
  	{
  		/* Fujitsu-Siemens Lifebook T3010 */
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
  			DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK T3010"),
  		},
  	},
  	{
  		/* Fujitsu-Siemens Lifebook E4010 */
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
  			DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK E4010"),
  		},
  	},
  	{
  		/* Fujitsu-Siemens Amilo Pro 2010 */
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
  			DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pro V2010"),
  		},
  	},
  	{
  		/* Fujitsu-Siemens Amilo Pro 2030 */
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
  			DMI_MATCH(DMI_PRODUCT_NAME, "AMILO PRO V2030"),
  		},
  	},
  	{
  		/*
  		 * No data is coming from the touchscreen unless KBC
  		 * is in legacy mode.
  		 */
  		/* Panasonic CF-29 */
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "Matsushita"),
  			DMI_MATCH(DMI_PRODUCT_NAME, "CF-29"),
  		},
  	},
  	{
  		/*
  		 * HP Pavilion DV4017EA -
  		 * errors on MUX ports are reported without raising AUXDATA
  		 * causing "spurious NAK" messages.
  		 */
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
  			DMI_MATCH(DMI_PRODUCT_NAME, "Pavilion dv4000 (EA032EA#ABF)"),
  		},
  	},
  	{
  		/*
  		 * HP Pavilion ZT1000 -
  		 * like DV4017EA does not raise AUXERR for errors on MUX ports.
  		 */
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
  			DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion Notebook PC"),
  			DMI_MATCH(DMI_PRODUCT_VERSION, "HP Pavilion Notebook ZT1000"),
  		},
  	},
9d9d50bb2   Dmitry Torokhov   Input: i8042 - ad...
316
  	{
749aea73a   Elvis Pranskevichus   Input: i8042 - ad...
317
  		/*
e55a33669   Dmitry Torokhov   Revert "Input: i8...
318
319
  		 * HP Pavilion DV4270ca -
  		 * like DV4017EA does not raise AUXERR for errors on MUX ports.
749aea73a   Elvis Pranskevichus   Input: i8042 - ad...
320
  		 */
749aea73a   Elvis Pranskevichus   Input: i8042 - ad...
321
  		.matches = {
e55a33669   Dmitry Torokhov   Revert "Input: i8...
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
  			DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
  			DMI_MATCH(DMI_PRODUCT_NAME, "Pavilion dv4000 (EH476UA#ABL)"),
  		},
  	},
  	{
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
  			DMI_MATCH(DMI_PRODUCT_NAME, "Satellite P10"),
  		},
  	},
  	{
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
  			DMI_MATCH(DMI_PRODUCT_NAME, "EQUIUM A110"),
  		},
  	},
  	{
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
  			DMI_MATCH(DMI_PRODUCT_NAME, "SATELLITE C850D"),
  		},
  	},
  	{
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "ALIENWARE"),
  			DMI_MATCH(DMI_PRODUCT_NAME, "Sentia"),
  		},
  	},
  	{
  		/* Sharp Actius MM20 */
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "SHARP"),
  			DMI_MATCH(DMI_PRODUCT_NAME, "PC-MM20 Series"),
  		},
  	},
  	{
  		/* Sony Vaio FS-115b */
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"),
  			DMI_MATCH(DMI_PRODUCT_NAME, "VGN-FS115B"),
  		},
  	},
  	{
  		/*
  		 * Sony Vaio FZ-240E -
  		 * reset and GET ID commands issued via KBD port are
  		 * sometimes being delivered to AUX3.
  		 */
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"),
  			DMI_MATCH(DMI_PRODUCT_NAME, "VGN-FZ240E"),
  		},
  	},
  	{
  		/*
  		 * Most (all?) VAIOs do not have external PS/2 ports nor
  		 * they implement active multiplexing properly, and
  		 * MUX discovery usually messes up keyboard/touchpad.
  		 */
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"),
  			DMI_MATCH(DMI_BOARD_NAME, "VAIO"),
  		},
  	},
  	{
  		/* Amoi M636/A737 */
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "Amoi Electronics CO.,LTD."),
  			DMI_MATCH(DMI_PRODUCT_NAME, "M636/A737 platform"),
  		},
  	},
  	{
  		/* Lenovo 3000 n100 */
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
  			DMI_MATCH(DMI_PRODUCT_NAME, "076804U"),
  		},
  	},
  	{
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
  			DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 1360"),
  		},
  	},
  	{
  		/* Acer Aspire 5710 */
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
  			DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5710"),
  		},
  	},
  	{
d3c248b63   Dmitry Torokhov   Input: I8042 - ad...
414
415
416
417
418
419
420
  		/* Acer Aspire 7738 */
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
  			DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 7738"),
  		},
  	},
  	{
e55a33669   Dmitry Torokhov   Revert "Input: i8...
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
  		/* Gericom Bellagio */
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "Gericom"),
  			DMI_MATCH(DMI_PRODUCT_NAME, "N34AS6"),
  		},
  	},
  	{
  		/* IBM 2656 */
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "IBM"),
  			DMI_MATCH(DMI_PRODUCT_NAME, "2656"),
  		},
  	},
  	{
  		/* Dell XPS M1530 */
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
  			DMI_MATCH(DMI_PRODUCT_NAME, "XPS M1530"),
  		},
  	},
  	{
  		/* Compal HEL80I */
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "COMPAL"),
  			DMI_MATCH(DMI_PRODUCT_NAME, "HEL80I"),
  		},
  	},
  	{
  		/* Dell Vostro 1510 */
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
  			DMI_MATCH(DMI_PRODUCT_NAME, "Vostro1510"),
  		},
  	},
  	{
  		/* Acer Aspire 5536 */
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
  			DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5536"),
  			DMI_MATCH(DMI_PRODUCT_VERSION, "0100"),
  		},
  	},
  	{
  		/* Dell Vostro V13 */
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
  			DMI_MATCH(DMI_PRODUCT_NAME, "Vostro V13"),
  		},
  	},
  	{
  		/* Newer HP Pavilion dv4 models */
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
  			DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dv4 Notebook PC"),
  		},
  	},
  	{
  		/* Asus X450LCP */
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
  			DMI_MATCH(DMI_PRODUCT_NAME, "X450LCP"),
  		},
  	},
  	{
  		/* Avatar AVIU-145A6 */
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "Intel"),
  			DMI_MATCH(DMI_PRODUCT_NAME, "IC4I"),
d2682118f   Hans de Goede   Input: i8042 - ad...
489
490
  		},
  	},
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
491
492
  	{ }
  };
f909b1df0   Dmitry Torokhov   Input: i8042 - re...
493
  static const struct dmi_system_id __initconst i8042_dmi_reset_table[] = {
7c46e2368   Arjan van de Ven   Input: i8042 - ad...
494
  	{
f909b1df0   Dmitry Torokhov   Input: i8042 - re...
495
  		/* MSI Wind U-100 */
7c46e2368   Arjan van de Ven   Input: i8042 - ad...
496
497
498
499
500
501
  		.matches = {
  			DMI_MATCH(DMI_BOARD_NAME, "U-100"),
  			DMI_MATCH(DMI_BOARD_VENDOR, "MICRO-STAR INTERNATIONAL CO., LTD"),
  		},
  	},
  	{
f909b1df0   Dmitry Torokhov   Input: i8042 - re...
502
  		/* LG Electronics X110 */
7c46e2368   Arjan van de Ven   Input: i8042 - ad...
503
504
505
506
507
  		.matches = {
  			DMI_MATCH(DMI_BOARD_NAME, "X110"),
  			DMI_MATCH(DMI_BOARD_VENDOR, "LG Electronics Inc."),
  		},
  	},
9230ccb10   Yan Li   Input: i8042 - mo...
508
  	{
f909b1df0   Dmitry Torokhov   Input: i8042 - re...
509
  		/* Acer Aspire One 150 */
9230ccb10   Yan Li   Input: i8042 - mo...
510
511
512
513
514
515
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
  			DMI_MATCH(DMI_PRODUCT_NAME, "AOA150"),
  		},
  	},
  	{
f909b1df0   Dmitry Torokhov   Input: i8042 - re...
516
  		/* Advent 4211 */
9230ccb10   Yan Li   Input: i8042 - mo...
517
518
519
520
521
522
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "DIXONSXP"),
  			DMI_MATCH(DMI_PRODUCT_NAME, "Advent 4211"),
  		},
  	},
  	{
f909b1df0   Dmitry Torokhov   Input: i8042 - re...
523
  		/* Medion Akoya Mini E1210 */
9230ccb10   Yan Li   Input: i8042 - mo...
524
525
526
527
528
529
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "MEDION"),
  			DMI_MATCH(DMI_PRODUCT_NAME, "E1210"),
  		},
  	},
  	{
31968ecf5   Christoph Fritz   Input: i8042 - ad...
530
531
532
533
534
535
536
  		/* Medion Akoya E1222 */
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "MEDION"),
  			DMI_MATCH(DMI_PRODUCT_NAME, "E122X"),
  		},
  	},
  	{
f909b1df0   Dmitry Torokhov   Input: i8042 - re...
537
  		/* Mivvy M310 */
9230ccb10   Yan Li   Input: i8042 - mo...
538
539
540
541
542
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "VIOOO"),
  			DMI_MATCH(DMI_PRODUCT_NAME, "N10"),
  		},
  	},
049e2d13b   Anisse Astier   Input: i8042 - ad...
543
  	{
f909b1df0   Dmitry Torokhov   Input: i8042 - re...
544
  		/* Dell Vostro 1320 */
049e2d13b   Anisse Astier   Input: i8042 - ad...
545
546
547
548
549
550
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
  			DMI_MATCH(DMI_PRODUCT_NAME, "Vostro 1320"),
  		},
  	},
  	{
f909b1df0   Dmitry Torokhov   Input: i8042 - re...
551
  		/* Dell Vostro 1520 */
049e2d13b   Anisse Astier   Input: i8042 - ad...
552
553
554
555
556
557
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
  			DMI_MATCH(DMI_PRODUCT_NAME, "Vostro 1520"),
  		},
  	},
  	{
f909b1df0   Dmitry Torokhov   Input: i8042 - re...
558
  		/* Dell Vostro 1720 */
049e2d13b   Anisse Astier   Input: i8042 - ad...
559
560
561
562
563
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
  			DMI_MATCH(DMI_PRODUCT_NAME, "Vostro 1720"),
  		},
  	},
82b982c9a   Igor Murzov   Input: i8042 - ad...
564
565
566
567
568
569
570
  	{
  		/* Lenovo Ideapad U455 */
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
  			DMI_MATCH(DMI_PRODUCT_NAME, "20046"),
  		},
  	},
7c46e2368   Arjan van de Ven   Input: i8042 - ad...
571
572
  	{ }
  };
c3a34f439   Jiri Kosina   Input: i8042 - ad...
573
  #ifdef CONFIG_PNP
f909b1df0   Dmitry Torokhov   Input: i8042 - re...
574
  static const struct dmi_system_id __initconst i8042_dmi_nopnp_table[] = {
c3a34f439   Jiri Kosina   Input: i8042 - ad...
575
  	{
f909b1df0   Dmitry Torokhov   Input: i8042 - re...
576
  		/* Intel MBO Desktop D845PESV */
c3a34f439   Jiri Kosina   Input: i8042 - ad...
577
578
579
580
581
  		.matches = {
  			DMI_MATCH(DMI_BOARD_NAME, "D845PESV"),
  			DMI_MATCH(DMI_BOARD_VENDOR, "Intel Corporation"),
  		},
  	},
7c46e2368   Arjan van de Ven   Input: i8042 - ad...
582
  	{
f909b1df0   Dmitry Torokhov   Input: i8042 - re...
583
  		/* MSI Wind U-100 */
7c46e2368   Arjan van de Ven   Input: i8042 - ad...
584
585
586
587
588
  		.matches = {
  			DMI_MATCH(DMI_BOARD_NAME, "U-100"),
  			DMI_MATCH(DMI_BOARD_VENDOR, "MICRO-STAR INTERNATIONAL CO., LTD"),
  		},
  	},
c3a34f439   Jiri Kosina   Input: i8042 - ad...
589
590
  	{ }
  };
1c7827ae7   Dmitry Torokhov   Input: i8042 - by...
591

f909b1df0   Dmitry Torokhov   Input: i8042 - re...
592
  static const struct dmi_system_id __initconst i8042_dmi_laptop_table[] = {
1c7827ae7   Dmitry Torokhov   Input: i8042 - by...
593
  	{
1c7827ae7   Dmitry Torokhov   Input: i8042 - by...
594
595
596
597
598
  		.matches = {
  			DMI_MATCH(DMI_CHASSIS_TYPE, "8"), /* Portable */
  		},
  	},
  	{
1c7827ae7   Dmitry Torokhov   Input: i8042 - by...
599
600
601
602
603
  		.matches = {
  			DMI_MATCH(DMI_CHASSIS_TYPE, "9"), /* Laptop */
  		},
  	},
  	{
1c7827ae7   Dmitry Torokhov   Input: i8042 - by...
604
605
606
607
608
  		.matches = {
  			DMI_MATCH(DMI_CHASSIS_TYPE, "10"), /* Notebook */
  		},
  	},
  	{
1c7827ae7   Dmitry Torokhov   Input: i8042 - by...
609
610
611
612
613
614
  		.matches = {
  			DMI_MATCH(DMI_CHASSIS_TYPE, "14"), /* Sub-Notebook */
  		},
  	},
  	{ }
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
615
  #endif
f8313ef1f   Jiri Kosina   Input: i8042 - in...
616
617
618
619
620
621
622
623
  static const struct dmi_system_id __initconst i8042_dmi_notimeout_table[] = {
  	{
  		/* Dell Vostro V13 */
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
  			DMI_MATCH(DMI_PRODUCT_NAME, "Vostro V13"),
  		},
  	},
b42c90974   Tomas Miljenović   Input: i8042 - ad...
624
625
626
627
628
629
630
  	{
  		/* Newer HP Pavilion dv4 models */
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
  			DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dv4 Notebook PC"),
  		},
  	},
cc18a69c9   Hans de Goede   Input: i8042 - ad...
631
  	{
993b3a3f8   Hans de Goede   Input: i8042 - qu...
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
  		/* Fujitsu A544 laptop */
  		/* https://bugzilla.redhat.com/show_bug.cgi?id=1111138 */
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
  			DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK A544"),
  		},
  	},
  	{
  		/* Fujitsu AH544 laptop */
  		/* https://bugzilla.kernel.org/show_bug.cgi?id=69731 */
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
  			DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK AH544"),
  		},
  	},
  	{
cc18a69c9   Hans de Goede   Input: i8042 - ad...
648
649
650
651
652
653
654
  		/* Fujitsu U574 laptop */
  		/* https://bugzilla.kernel.org/show_bug.cgi?id=69731 */
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
  			DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK U574"),
  		},
  	},
f8313ef1f   Jiri Kosina   Input: i8042 - in...
655
656
  	{ }
  };
8987fec0d   Carlos Corbacho   Input: i8042 - ad...
657
658
659
660
661
662
  /*
   * Some Wistron based laptops need us to explicitly enable the 'Dritek
   * keyboard extension' to make their extra keys start generating scancodes.
   * Originally, this was just confined to older laptops, but a few Acer laptops
   * have turned up in 2007 that also need this again.
   */
f909b1df0   Dmitry Torokhov   Input: i8042 - re...
663
  static const struct dmi_system_id __initconst i8042_dmi_dritek_table[] = {
8987fec0d   Carlos Corbacho   Input: i8042 - ad...
664
  	{
a06a09c80   Pali Rohár   Input: i8042 - ad...
665
666
667
668
669
670
671
  		/* Acer Aspire 5100 */
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
  			DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5100"),
  		},
  	},
  	{
e6edbdc52   Elliott Sales de Andrade   Input: i8042 - ad...
672
673
674
675
676
677
678
  		/* Acer Aspire 5610 */
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
  			DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5610"),
  		},
  	},
  	{
f909b1df0   Dmitry Torokhov   Input: i8042 - re...
679
  		/* Acer Aspire 5630 */
8987fec0d   Carlos Corbacho   Input: i8042 - ad...
680
681
682
683
684
685
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
  			DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5630"),
  		},
  	},
  	{
f909b1df0   Dmitry Torokhov   Input: i8042 - re...
686
  		/* Acer Aspire 5650 */
8987fec0d   Carlos Corbacho   Input: i8042 - ad...
687
688
689
690
691
692
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
  			DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5650"),
  		},
  	},
  	{
f909b1df0   Dmitry Torokhov   Input: i8042 - re...
693
  		/* Acer Aspire 5680 */
8987fec0d   Carlos Corbacho   Input: i8042 - ad...
694
695
696
697
698
699
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
  			DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5680"),
  		},
  	},
  	{
f909b1df0   Dmitry Torokhov   Input: i8042 - re...
700
  		/* Acer Aspire 5720 */
0e7e92fa3   Carlos Corbacho   Input: i8042 - ad...
701
702
703
704
705
706
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
  			DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5720"),
  		},
  	},
  	{
f909b1df0   Dmitry Torokhov   Input: i8042 - re...
707
  		/* Acer Aspire 9110 */
5799ddb54   Carlos Corbacho   Input: i8042 - ad...
708
709
710
711
712
713
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
  			DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 9110"),
  		},
  	},
  	{
f909b1df0   Dmitry Torokhov   Input: i8042 - re...
714
  		/* Acer TravelMate 660 */
65e660aa3   Bruno Prémont   Input: i8042 - ad...
715
716
717
718
719
720
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
  			DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 660"),
  		},
  	},
  	{
f909b1df0   Dmitry Torokhov   Input: i8042 - re...
721
  		/* Acer TravelMate 2490 */
8987fec0d   Carlos Corbacho   Input: i8042 - ad...
722
723
724
725
726
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
  			DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 2490"),
  		},
  	},
8e4ae1017   Carlos Corbacho   Input: i8042 - Ad...
727
  	{
f909b1df0   Dmitry Torokhov   Input: i8042 - re...
728
  		/* Acer TravelMate 4280 */
8e4ae1017   Carlos Corbacho   Input: i8042 - Ad...
729
730
731
732
733
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
  			DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 4280"),
  		},
  	},
8987fec0d   Carlos Corbacho   Input: i8042 - ad...
734
735
  	{ }
  };
aae7cd96b   Srihari Vijayaraghavan   Input: i8042 - re...
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
  /*
   * Some laptops need keyboard reset before probing for the trackpad to get
   * it detected, initialised & finally work.
   */
  static const struct dmi_system_id __initconst i8042_dmi_kbdreset_table[] = {
  	{
  		/* Gigabyte P35 v2 - Elantech touchpad */
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"),
  			DMI_MATCH(DMI_PRODUCT_NAME, "P35V2"),
  		},
  	},
  		{
  		/* Aorus branded Gigabyte X3 Plus - Elantech touchpad */
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"),
  			DMI_MATCH(DMI_PRODUCT_NAME, "X3"),
  		},
  	},
  	{
  		/* Gigabyte P34 - Elantech touchpad */
  		.matches = {
  			DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"),
  			DMI_MATCH(DMI_PRODUCT_NAME, "P34"),
  		},
  	},
  	{ }
  };
8987fec0d   Carlos Corbacho   Input: i8042 - ad...
764
  #endif /* CONFIG_X86 */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
765
766
  #ifdef CONFIG_PNP
  #include <linux/pnp.h>
386b38490   Dmitry Torokhov   Input: i8042 - us...
767
  static bool i8042_pnp_kbd_registered;
2bfc3c6e9   Bjorn Helgaas   Input: i8042 - fi...
768
  static unsigned int i8042_pnp_kbd_devices;
386b38490   Dmitry Torokhov   Input: i8042 - us...
769
  static bool i8042_pnp_aux_registered;
2bfc3c6e9   Bjorn Helgaas   Input: i8042 - fi...
770
  static unsigned int i8042_pnp_aux_devices;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
771
772
773
774
775
776
777
778
  
  static int i8042_pnp_command_reg;
  static int i8042_pnp_data_reg;
  static int i8042_pnp_kbd_irq;
  static int i8042_pnp_aux_irq;
  
  static char i8042_pnp_kbd_name[32];
  static char i8042_pnp_aux_name[32];
a7c5868c3   Hans de Goede   Input: i8042 - ad...
779
780
781
782
783
784
785
786
787
788
  static void i8042_pnp_id_to_string(struct pnp_id *id, char *dst, int dst_size)
  {
  	strlcpy(dst, "PNP:", dst_size);
  
  	while (id) {
  		strlcat(dst, " ", dst_size);
  		strlcat(dst, id->id, dst_size);
  		id = id->next;
  	}
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
789
790
791
792
793
794
795
796
797
798
  static int i8042_pnp_kbd_probe(struct pnp_dev *dev, const struct pnp_device_id *did)
  {
  	if (pnp_port_valid(dev, 0) && pnp_port_len(dev, 0) == 1)
  		i8042_pnp_data_reg = pnp_port_start(dev,0);
  
  	if (pnp_port_valid(dev, 1) && pnp_port_len(dev, 1) == 1)
  		i8042_pnp_command_reg = pnp_port_start(dev, 1);
  
  	if (pnp_irq_valid(dev,0))
  		i8042_pnp_kbd_irq = pnp_irq(dev, 0);
8c6deb9c8   Roel Kluin   Input: i8042 - fi...
799
  	strlcpy(i8042_pnp_kbd_name, did->id, sizeof(i8042_pnp_kbd_name));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
800
  	if (strlen(pnp_dev_name(dev))) {
8c6deb9c8   Roel Kluin   Input: i8042 - fi...
801
802
  		strlcat(i8042_pnp_kbd_name, ":", sizeof(i8042_pnp_kbd_name));
  		strlcat(i8042_pnp_kbd_name, pnp_dev_name(dev), sizeof(i8042_pnp_kbd_name));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
803
  	}
a7c5868c3   Hans de Goede   Input: i8042 - ad...
804
805
  	i8042_pnp_id_to_string(dev->id, i8042_kbd_firmware_id,
  			       sizeof(i8042_kbd_firmware_id));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
806

3e6e15a86   Alan Stern   Input: enable rem...
807
808
  	/* Keyboard ports are always supposed to be wakeup-enabled */
  	device_set_wakeup_enable(&dev->dev, true);
2bfc3c6e9   Bjorn Helgaas   Input: i8042 - fi...
809
  	i8042_pnp_kbd_devices++;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
810
811
812
813
814
815
816
817
818
819
820
821
822
  	return 0;
  }
  
  static int i8042_pnp_aux_probe(struct pnp_dev *dev, const struct pnp_device_id *did)
  {
  	if (pnp_port_valid(dev, 0) && pnp_port_len(dev, 0) == 1)
  		i8042_pnp_data_reg = pnp_port_start(dev,0);
  
  	if (pnp_port_valid(dev, 1) && pnp_port_len(dev, 1) == 1)
  		i8042_pnp_command_reg = pnp_port_start(dev, 1);
  
  	if (pnp_irq_valid(dev, 0))
  		i8042_pnp_aux_irq = pnp_irq(dev, 0);
8c6deb9c8   Roel Kluin   Input: i8042 - fi...
823
  	strlcpy(i8042_pnp_aux_name, did->id, sizeof(i8042_pnp_aux_name));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
824
  	if (strlen(pnp_dev_name(dev))) {
8c6deb9c8   Roel Kluin   Input: i8042 - fi...
825
826
  		strlcat(i8042_pnp_aux_name, ":", sizeof(i8042_pnp_aux_name));
  		strlcat(i8042_pnp_aux_name, pnp_dev_name(dev), sizeof(i8042_pnp_aux_name));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
827
  	}
a7c5868c3   Hans de Goede   Input: i8042 - ad...
828
829
  	i8042_pnp_id_to_string(dev->id, i8042_aux_firmware_id,
  			       sizeof(i8042_aux_firmware_id));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
830

2bfc3c6e9   Bjorn Helgaas   Input: i8042 - fi...
831
  	i8042_pnp_aux_devices++;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
832
833
834
835
  	return 0;
  }
  
  static struct pnp_device_id pnp_kbd_devids[] = {
09fac079d   Matthew Garrett   Input: i8042 - ad...
836
837
838
  	{ .id = "PNP0300", .driver_data = 0 },
  	{ .id = "PNP0301", .driver_data = 0 },
  	{ .id = "PNP0302", .driver_data = 0 },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
839
  	{ .id = "PNP0303", .driver_data = 0 },
09fac079d   Matthew Garrett   Input: i8042 - ad...
840
841
842
843
844
  	{ .id = "PNP0304", .driver_data = 0 },
  	{ .id = "PNP0305", .driver_data = 0 },
  	{ .id = "PNP0306", .driver_data = 0 },
  	{ .id = "PNP0309", .driver_data = 0 },
  	{ .id = "PNP030a", .driver_data = 0 },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
845
  	{ .id = "PNP030b", .driver_data = 0 },
09fac079d   Matthew Garrett   Input: i8042 - ad...
846
847
848
849
850
  	{ .id = "PNP0320", .driver_data = 0 },
  	{ .id = "PNP0343", .driver_data = 0 },
  	{ .id = "PNP0344", .driver_data = 0 },
  	{ .id = "PNP0345", .driver_data = 0 },
  	{ .id = "CPQA0D7", .driver_data = 0 },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
851
852
  	{ .id = "", },
  };
78551277e   Tom Gundersen   Input: i8042 - ad...
853
  MODULE_DEVICE_TABLE(pnp, pnp_kbd_devids);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
854
855
856
857
858
859
860
861
  
  static struct pnp_driver i8042_pnp_kbd_driver = {
  	.name           = "i8042 kbd",
  	.id_table       = pnp_kbd_devids,
  	.probe          = i8042_pnp_kbd_probe,
  };
  
  static struct pnp_device_id pnp_aux_devids[] = {
dba06b839   Matthew Garrett   Input: i8042 - ad...
862
  	{ .id = "AUI0200", .driver_data = 0 },
b9973954c   Dmitry Torokhov   Input: i8042 - ad...
863
864
  	{ .id = "FJC6000", .driver_data = 0 },
  	{ .id = "FJC6001", .driver_data = 0 },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
865
866
867
868
869
870
871
872
873
874
  	{ .id = "PNP0f03", .driver_data = 0 },
  	{ .id = "PNP0f0b", .driver_data = 0 },
  	{ .id = "PNP0f0e", .driver_data = 0 },
  	{ .id = "PNP0f12", .driver_data = 0 },
  	{ .id = "PNP0f13", .driver_data = 0 },
  	{ .id = "PNP0f19", .driver_data = 0 },
  	{ .id = "PNP0f1c", .driver_data = 0 },
  	{ .id = "SYN0801", .driver_data = 0 },
  	{ .id = "", },
  };
78551277e   Tom Gundersen   Input: i8042 - ad...
875
  MODULE_DEVICE_TABLE(pnp, pnp_aux_devids);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
876
877
878
879
880
881
882
883
884
  
  static struct pnp_driver i8042_pnp_aux_driver = {
  	.name           = "i8042 aux",
  	.id_table       = pnp_aux_devids,
  	.probe          = i8042_pnp_aux_probe,
  };
  
  static void i8042_pnp_exit(void)
  {
74af42bb7   Kurt Garloff   Input: Avoid doub...
885
  	if (i8042_pnp_kbd_registered) {
386b38490   Dmitry Torokhov   Input: i8042 - us...
886
  		i8042_pnp_kbd_registered = false;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
887
  		pnp_unregister_driver(&i8042_pnp_kbd_driver);
74af42bb7   Kurt Garloff   Input: Avoid doub...
888
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
889

74af42bb7   Kurt Garloff   Input: Avoid doub...
890
  	if (i8042_pnp_aux_registered) {
386b38490   Dmitry Torokhov   Input: i8042 - us...
891
  		i8042_pnp_aux_registered = false;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
892
  		pnp_unregister_driver(&i8042_pnp_aux_driver);
74af42bb7   Kurt Garloff   Input: Avoid doub...
893
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
894
  }
8d5987a6e   Dmitry Torokhov   Input: make i8042...
895
  static int __init i8042_pnp_init(void)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
896
  {
c3d31e7f9   Dmitry Torokhov   Input: i8042 - fi...
897
  	char kbd_irq_str[4] = { 0 }, aux_irq_str[4] = { 0 };
7dcc9c230   Dmitry Torokhov   Input: i8042 - ma...
898
  	bool pnp_data_busted = false;
2bfc3c6e9   Bjorn Helgaas   Input: i8042 - fi...
899
  	int err;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
900

c3a34f439   Jiri Kosina   Input: i8042 - ad...
901
902
  #ifdef CONFIG_X86
  	if (dmi_check_system(i8042_dmi_nopnp_table))
386b38490   Dmitry Torokhov   Input: i8042 - us...
903
  		i8042_nopnp = true;
c3a34f439   Jiri Kosina   Input: i8042 - ad...
904
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
905
  	if (i8042_nopnp) {
4eb3c30b2   Joe Perches   Input: i8042 - us...
906
907
  		pr_info("PNP detection disabled
  ");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
908
909
  		return 0;
  	}
2bfc3c6e9   Bjorn Helgaas   Input: i8042 - fi...
910
911
  	err = pnp_register_driver(&i8042_pnp_kbd_driver);
  	if (!err)
386b38490   Dmitry Torokhov   Input: i8042 - us...
912
  		i8042_pnp_kbd_registered = true;
c3d31e7f9   Dmitry Torokhov   Input: i8042 - fi...
913

2bfc3c6e9   Bjorn Helgaas   Input: i8042 - fi...
914
915
  	err = pnp_register_driver(&i8042_pnp_aux_driver);
  	if (!err)
386b38490   Dmitry Torokhov   Input: i8042 - us...
916
  		i8042_pnp_aux_registered = true;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
917

2bfc3c6e9   Bjorn Helgaas   Input: i8042 - fi...
918
  	if (!i8042_pnp_kbd_devices && !i8042_pnp_aux_devices) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
919
920
921
922
  		i8042_pnp_exit();
  #if defined(__ia64__)
  		return -ENODEV;
  #else
4eb3c30b2   Joe Perches   Input: i8042 - us...
923
924
  		pr_info("PNP: No PS/2 controller found. Probing ports directly.
  ");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
925
926
927
  		return 0;
  #endif
  	}
2bfc3c6e9   Bjorn Helgaas   Input: i8042 - fi...
928
  	if (i8042_pnp_kbd_devices)
c3d31e7f9   Dmitry Torokhov   Input: i8042 - fi...
929
930
  		snprintf(kbd_irq_str, sizeof(kbd_irq_str),
  			"%d", i8042_pnp_kbd_irq);
2bfc3c6e9   Bjorn Helgaas   Input: i8042 - fi...
931
  	if (i8042_pnp_aux_devices)
c3d31e7f9   Dmitry Torokhov   Input: i8042 - fi...
932
933
  		snprintf(aux_irq_str, sizeof(aux_irq_str),
  			"%d", i8042_pnp_aux_irq);
4eb3c30b2   Joe Perches   Input: i8042 - us...
934
935
  	pr_info("PNP: PS/2 Controller [%s%s%s] at %#x,%#x irq %s%s%s
  ",
2bfc3c6e9   Bjorn Helgaas   Input: i8042 - fi...
936
  		i8042_pnp_kbd_name, (i8042_pnp_kbd_devices && i8042_pnp_aux_devices) ? "," : "",
c3d31e7f9   Dmitry Torokhov   Input: i8042 - fi...
937
938
  		i8042_pnp_aux_name,
  		i8042_pnp_data_reg, i8042_pnp_command_reg,
2bfc3c6e9   Bjorn Helgaas   Input: i8042 - fi...
939
  		kbd_irq_str, (i8042_pnp_kbd_devices && i8042_pnp_aux_devices) ? "," : "",
c3d31e7f9   Dmitry Torokhov   Input: i8042 - fi...
940
941
942
  		aux_irq_str);
  
  #if defined(__ia64__)
2bfc3c6e9   Bjorn Helgaas   Input: i8042 - fi...
943
  	if (!i8042_pnp_kbd_devices)
386b38490   Dmitry Torokhov   Input: i8042 - us...
944
  		i8042_nokbd = true;
2bfc3c6e9   Bjorn Helgaas   Input: i8042 - fi...
945
  	if (!i8042_pnp_aux_devices)
386b38490   Dmitry Torokhov   Input: i8042 - us...
946
  		i8042_noaux = true;
c3d31e7f9   Dmitry Torokhov   Input: i8042 - fi...
947
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
948
  	if (((i8042_pnp_data_reg & ~0xf) == (i8042_data_reg & ~0xf) &&
080c652d6   Dmitry Torokhov   Input: i8042 - gi...
949
950
  	      i8042_pnp_data_reg != i8042_data_reg) ||
  	    !i8042_pnp_data_reg) {
4eb3c30b2   Joe Perches   Input: i8042 - us...
951
952
  		pr_warn("PNP: PS/2 controller has invalid data port %#x; using default %#x
  ",
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
953
954
  			i8042_pnp_data_reg, i8042_data_reg);
  		i8042_pnp_data_reg = i8042_data_reg;
386b38490   Dmitry Torokhov   Input: i8042 - us...
955
  		pnp_data_busted = true;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
956
957
958
  	}
  
  	if (((i8042_pnp_command_reg & ~0xf) == (i8042_command_reg & ~0xf) &&
080c652d6   Dmitry Torokhov   Input: i8042 - gi...
959
960
  	      i8042_pnp_command_reg != i8042_command_reg) ||
  	    !i8042_pnp_command_reg) {
4eb3c30b2   Joe Perches   Input: i8042 - us...
961
962
  		pr_warn("PNP: PS/2 controller has invalid command port %#x; using default %#x
  ",
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
963
964
  			i8042_pnp_command_reg, i8042_command_reg);
  		i8042_pnp_command_reg = i8042_command_reg;
386b38490   Dmitry Torokhov   Input: i8042 - us...
965
  		pnp_data_busted = true;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
966
  	}
945ef0d42   Dmitry Torokhov   Input: i8042 - ad...
967
  	if (!i8042_nokbd && !i8042_pnp_kbd_irq) {
4eb3c30b2   Joe Perches   Input: i8042 - us...
968
969
970
  		pr_warn("PNP: PS/2 controller doesn't have KBD irq; using default %d
  ",
  			i8042_kbd_irq);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
971
  		i8042_pnp_kbd_irq = i8042_kbd_irq;
386b38490   Dmitry Torokhov   Input: i8042 - us...
972
  		pnp_data_busted = true;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
973
  	}
c3d31e7f9   Dmitry Torokhov   Input: i8042 - fi...
974
  	if (!i8042_noaux && !i8042_pnp_aux_irq) {
080c652d6   Dmitry Torokhov   Input: i8042 - gi...
975
  		if (!pnp_data_busted && i8042_pnp_kbd_irq) {
4eb3c30b2   Joe Perches   Input: i8042 - us...
976
977
978
  			pr_warn("PNP: PS/2 appears to have AUX port disabled, "
  				"if this is incorrect please boot with i8042.nopnp
  ");
386b38490   Dmitry Torokhov   Input: i8042 - us...
979
  			i8042_noaux = true;
080c652d6   Dmitry Torokhov   Input: i8042 - gi...
980
  		} else {
4eb3c30b2   Joe Perches   Input: i8042 - us...
981
982
983
  			pr_warn("PNP: PS/2 controller doesn't have AUX irq; using default %d
  ",
  				i8042_aux_irq);
080c652d6   Dmitry Torokhov   Input: i8042 - gi...
984
985
  			i8042_pnp_aux_irq = i8042_aux_irq;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
986
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
987
988
989
990
  	i8042_data_reg = i8042_pnp_data_reg;
  	i8042_command_reg = i8042_pnp_command_reg;
  	i8042_kbd_irq = i8042_pnp_kbd_irq;
  	i8042_aux_irq = i8042_pnp_aux_irq;
1c7827ae7   Dmitry Torokhov   Input: i8042 - by...
991
992
993
994
  #ifdef CONFIG_X86
  	i8042_bypass_aux_irq_test = !pnp_data_busted &&
  				    dmi_check_system(i8042_dmi_laptop_table);
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
995
996
  	return 0;
  }
8d5987a6e   Dmitry Torokhov   Input: make i8042...
997
998
999
  #else
  static inline int i8042_pnp_init(void) { return 0; }
  static inline void i8042_pnp_exit(void) { }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1000
  #endif
8d5987a6e   Dmitry Torokhov   Input: make i8042...
1001
  static int __init i8042_platform_init(void)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1002
  {
8d5987a6e   Dmitry Torokhov   Input: make i8042...
1003
  	int retval;
5cdfa1c3b   Feng Tang   input: i8042 - ad...
1004
  #ifdef CONFIG_X86
ad6865241   Ondrej Zary   x86, 8042: Enable...
1005
  	u8 a20_on = 0xdf;
5cdfa1c3b   Feng Tang   input: i8042 - ad...
1006
1007
1008
1009
  	/* Just return if pre-detection shows no i8042 controller exist */
  	if (!x86_platform.i8042_detect())
  		return -ENODEV;
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1010
1011
1012
1013
1014
  /*
   * On ix86 platforms touching the i8042 data register region can do really
   * bad things. Because of this the region is always reserved on ix86 boxes.
   *
   *	if (!request_region(I8042_DATA_REG, 16, "i8042"))
8d5987a6e   Dmitry Torokhov   Input: make i8042...
1015
   *		return -EBUSY;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1016
1017
1018
1019
   */
  
  	i8042_kbd_irq = I8042_MAP_IRQ(1);
  	i8042_aux_irq = I8042_MAP_IRQ(12);
8d5987a6e   Dmitry Torokhov   Input: make i8042...
1020
1021
1022
  	retval = i8042_pnp_init();
  	if (retval)
  		return retval;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1023
1024
  
  #if defined(__ia64__)
386b38490   Dmitry Torokhov   Input: i8042 - us...
1025
          i8042_reset = true;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1026
  #endif
c3a34f439   Jiri Kosina   Input: i8042 - ad...
1027
  #ifdef CONFIG_X86
7c46e2368   Arjan van de Ven   Input: i8042 - ad...
1028
  	if (dmi_check_system(i8042_dmi_reset_table))
386b38490   Dmitry Torokhov   Input: i8042 - us...
1029
  		i8042_reset = true;
7c46e2368   Arjan van de Ven   Input: i8042 - ad...
1030

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1031
  	if (dmi_check_system(i8042_dmi_noloop_table))
386b38490   Dmitry Torokhov   Input: i8042 - us...
1032
  		i8042_noloop = true;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1033

e55a33669   Dmitry Torokhov   Revert "Input: i8...
1034
1035
  	if (dmi_check_system(i8042_dmi_nomux_table))
  		i8042_nomux = true;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1036

f8313ef1f   Jiri Kosina   Input: i8042 - in...
1037
1038
  	if (dmi_check_system(i8042_dmi_notimeout_table))
  		i8042_notimeout = true;
8987fec0d   Carlos Corbacho   Input: i8042 - ad...
1039
  	if (dmi_check_system(i8042_dmi_dritek_table))
386b38490   Dmitry Torokhov   Input: i8042 - us...
1040
  		i8042_dritek = true;
ad6865241   Ondrej Zary   x86, 8042: Enable...
1041

aae7cd96b   Srihari Vijayaraghavan   Input: i8042 - re...
1042
1043
  	if (dmi_check_system(i8042_dmi_kbdreset_table))
  		i8042_kbdreset = true;
ad6865241   Ondrej Zary   x86, 8042: Enable...
1044
1045
1046
1047
1048
1049
1050
  	/*
  	 * A20 was already enabled during early kernel init. But some buggy
  	 * BIOSes (in MSI Laptops) require A20 to be enabled using 8042 to
  	 * resume from S3. So we do it here and hope that nothing breaks.
  	 */
  	i8042_command(&a20_on, 0x10d1);
  	i8042_command(NULL, 0x00ff);	/* Null command for SMM firmware */
8987fec0d   Carlos Corbacho   Input: i8042 - ad...
1051
  #endif /* CONFIG_X86 */
8d5987a6e   Dmitry Torokhov   Input: make i8042...
1052
  	return retval;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1053
1054
1055
1056
  }
  
  static inline void i8042_platform_exit(void)
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1057
  	i8042_pnp_exit();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1058
1059
1060
  }
  
  #endif /* _I8042_X86IA64IO_H */