Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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