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