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, "Compaq"), 105 DMI_MATCH(DMI_PRODUCT_NAME , "ProLiant"), 106 DMI_MATCH(DMI_PRODUCT_VERSION, "8500"), 107 }, 108 }, 109 { 110 .matches = { 111 DMI_MATCH(DMI_SYS_VENDOR, "Compaq"), 112 DMI_MATCH(DMI_PRODUCT_NAME , "ProLiant"), 113 DMI_MATCH(DMI_PRODUCT_VERSION, "DL760"), 114 }, 115 }, 116 { 117 /* OQO Model 01 */ 118 .matches = { 119 DMI_MATCH(DMI_SYS_VENDOR, "OQO"), 120 DMI_MATCH(DMI_PRODUCT_NAME, "ZEPTO"), 121 DMI_MATCH(DMI_PRODUCT_VERSION, "00"), 122 }, 123 }, 124 { 125 /* ULI EV4873 - AUX LOOP does not work properly */ 126 .matches = { 127 DMI_MATCH(DMI_SYS_VENDOR, "ULI"), 128 DMI_MATCH(DMI_PRODUCT_NAME, "EV4873"), 129 DMI_MATCH(DMI_PRODUCT_VERSION, "5a"), 130 }, 131 }, 132 { 133 /* Microsoft Virtual Machine */ 134 .matches = { 135 DMI_MATCH(DMI_SYS_VENDOR, "Microsoft Corporation"), 136 DMI_MATCH(DMI_PRODUCT_NAME, "Virtual Machine"), 137 DMI_MATCH(DMI_PRODUCT_VERSION, "VS2005R2"), 138 }, 139 }, 140 { 141 /* Medion MAM 2070 */ 142 .matches = { 143 DMI_MATCH(DMI_SYS_VENDOR, "Notebook"), 144 DMI_MATCH(DMI_PRODUCT_NAME, "MAM 2070"), 145 DMI_MATCH(DMI_PRODUCT_VERSION, "5a"), 146 }, 147 }, 148 { 149 /* Blue FB5601 */ 150 .matches = { 151 DMI_MATCH(DMI_SYS_VENDOR, "blue"), 152 DMI_MATCH(DMI_PRODUCT_NAME, "FB5601"), 153 DMI_MATCH(DMI_PRODUCT_VERSION, "M606"), 154 }, 155 }, 156 { 157 /* Gigabyte M912 */ 158 .matches = { 159 DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"), 160 DMI_MATCH(DMI_PRODUCT_NAME, "M912"), 161 DMI_MATCH(DMI_PRODUCT_VERSION, "01"), 162 }, 163 }, 164 { 165 /* Gigabyte M1022M netbook */ 166 .matches = { 167 DMI_MATCH(DMI_BOARD_VENDOR, "Gigabyte Technology Co.,Ltd."), 168 DMI_MATCH(DMI_BOARD_NAME, "M1022E"), 169 DMI_MATCH(DMI_BOARD_VERSION, "1.02"), 170 }, 171 }, 172 { 173 /* Gigabyte Spring Peak - defines wrong chassis type */ 174 .matches = { 175 DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"), 176 DMI_MATCH(DMI_PRODUCT_NAME, "Spring Peak"), 177 }, 178 }, 179 { 180 .matches = { 181 DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), 182 DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dv9700"), 183 DMI_MATCH(DMI_PRODUCT_VERSION, "Rev 1"), 184 }, 185 }, 186 { } 187}; 188 189/* 190 * Some Fujitsu notebooks are having trouble with touchpads if 191 * active multiplexing mode is activated. Luckily they don't have 192 * external PS/2 ports so we can safely disable it. 193 * ... apparently some Toshibas don't like MUX mode either and 194 * die horrible death on reboot. 195 */ 196static const struct dmi_system_id __initconst i8042_dmi_nomux_table[] = { 197 { 198 /* Fujitsu Lifebook P7010/P7010D */ 199 .matches = { 200 DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), 201 DMI_MATCH(DMI_PRODUCT_NAME, "P7010"), 202 }, 203 }, 204 { 205 /* Fujitsu Lifebook P7010 */ 206 .matches = { 207 DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), 208 DMI_MATCH(DMI_PRODUCT_NAME, "0000000000"), 209 }, 210 }, 211 { 212 /* Fujitsu Lifebook P5020D */ 213 .matches = { 214 DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), 215 DMI_MATCH(DMI_PRODUCT_NAME, "LifeBook P Series"), 216 }, 217 }, 218 { 219 /* Fujitsu Lifebook S2000 */ 220 .matches = { 221 DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), 222 DMI_MATCH(DMI_PRODUCT_NAME, "LifeBook S Series"), 223 }, 224 }, 225 { 226 /* Fujitsu Lifebook S6230 */ 227 .matches = { 228 DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), 229 DMI_MATCH(DMI_PRODUCT_NAME, "LifeBook S6230"), 230 }, 231 }, 232 { 233 /* Fujitsu T70H */ 234 .matches = { 235 DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), 236 DMI_MATCH(DMI_PRODUCT_NAME, "FMVLT70H"), 237 }, 238 }, 239 { 240 /* Fujitsu-Siemens Lifebook T3010 */ 241 .matches = { 242 DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), 243 DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK T3010"), 244 }, 245 }, 246 { 247 /* Fujitsu-Siemens Lifebook E4010 */ 248 .matches = { 249 DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), 250 DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK E4010"), 251 }, 252 }, 253 { 254 /* Fujitsu-Siemens Amilo Pro 2010 */ 255 .matches = { 256 DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), 257 DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pro V2010"), 258 }, 259 }, 260 { 261 /* Fujitsu-Siemens Amilo Pro 2030 */ 262 .matches = { 263 DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), 264 DMI_MATCH(DMI_PRODUCT_NAME, "AMILO PRO V2030"), 265 }, 266 }, 267 { 268 /* 269 * No data is coming from the touchscreen unless KBC 270 * is in legacy mode. 271 */ 272 /* Panasonic CF-29 */ 273 .matches = { 274 DMI_MATCH(DMI_SYS_VENDOR, "Matsushita"), 275 DMI_MATCH(DMI_PRODUCT_NAME, "CF-29"), 276 }, 277 }, 278 { 279 /* 280 * HP Pavilion DV4017EA - 281 * errors on MUX ports are reported without raising AUXDATA 282 * causing "spurious NAK" messages. 283 */ 284 .matches = { 285 DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), 286 DMI_MATCH(DMI_PRODUCT_NAME, "Pavilion dv4000 (EA032EA#ABF)"), 287 }, 288 }, 289 { 290 /* 291 * HP Pavilion ZT1000 - 292 * like DV4017EA does not raise AUXERR for errors on MUX ports. 293 */ 294 .matches = { 295 DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), 296 DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion Notebook PC"), 297 DMI_MATCH(DMI_PRODUCT_VERSION, "HP Pavilion Notebook ZT1000"), 298 }, 299 }, 300 { 301 /* 302 * HP Pavilion DV4270ca - 303 * like DV4017EA does not raise AUXERR for errors on MUX ports. 304 */ 305 .matches = { 306 DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), 307 DMI_MATCH(DMI_PRODUCT_NAME, "Pavilion dv4000 (EH476UA#ABL)"), 308 }, 309 }, 310 { 311 .matches = { 312 DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), 313 DMI_MATCH(DMI_PRODUCT_NAME, "Satellite P10"), 314 }, 315 }, 316 { 317 .matches = { 318 DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), 319 DMI_MATCH(DMI_PRODUCT_NAME, "EQUIUM A110"), 320 }, 321 }, 322 { 323 .matches = { 324 DMI_MATCH(DMI_SYS_VENDOR, "ALIENWARE"), 325 DMI_MATCH(DMI_PRODUCT_NAME, "Sentia"), 326 }, 327 }, 328 { 329 /* Sharp Actius MM20 */ 330 .matches = { 331 DMI_MATCH(DMI_SYS_VENDOR, "SHARP"), 332 DMI_MATCH(DMI_PRODUCT_NAME, "PC-MM20 Series"), 333 }, 334 }, 335 { 336 /* Sony Vaio FS-115b */ 337 .matches = { 338 DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"), 339 DMI_MATCH(DMI_PRODUCT_NAME, "VGN-FS115B"), 340 }, 341 }, 342 { 343 /* 344 * Sony Vaio FZ-240E - 345 * reset and GET ID commands issued via KBD port are 346 * sometimes being delivered to AUX3. 347 */ 348 .matches = { 349 DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"), 350 DMI_MATCH(DMI_PRODUCT_NAME, "VGN-FZ240E"), 351 }, 352 }, 353 { 354 /* 355 * Most (all?) VAIOs do not have external PS/2 ports nor 356 * they implement active multiplexing properly, and 357 * MUX discovery usually messes up keyboard/touchpad. 358 */ 359 .matches = { 360 DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"), 361 DMI_MATCH(DMI_BOARD_NAME, "VAIO"), 362 }, 363 }, 364 { 365 /* Amoi M636/A737 */ 366 .matches = { 367 DMI_MATCH(DMI_SYS_VENDOR, "Amoi Electronics CO.,LTD."), 368 DMI_MATCH(DMI_PRODUCT_NAME, "M636/A737 platform"), 369 }, 370 }, 371 { 372 /* Lenovo 3000 n100 */ 373 .matches = { 374 DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), 375 DMI_MATCH(DMI_PRODUCT_NAME, "076804U"), 376 }, 377 }, 378 { 379 .matches = { 380 DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 381 DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 1360"), 382 }, 383 }, 384 { 385 /* Gericom Bellagio */ 386 .matches = { 387 DMI_MATCH(DMI_SYS_VENDOR, "Gericom"), 388 DMI_MATCH(DMI_PRODUCT_NAME, "N34AS6"), 389 }, 390 }, 391 { 392 /* IBM 2656 */ 393 .matches = { 394 DMI_MATCH(DMI_SYS_VENDOR, "IBM"), 395 DMI_MATCH(DMI_PRODUCT_NAME, "2656"), 396 }, 397 }, 398 { 399 /* Dell XPS M1530 */ 400 .matches = { 401 DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), 402 DMI_MATCH(DMI_PRODUCT_NAME, "XPS M1530"), 403 }, 404 }, 405 { 406 /* Compal HEL80I */ 407 .matches = { 408 DMI_MATCH(DMI_SYS_VENDOR, "COMPAL"), 409 DMI_MATCH(DMI_PRODUCT_NAME, "HEL80I"), 410 }, 411 }, 412 { 413 /* Dell Vostro 1510 */ 414 .matches = { 415 DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), 416 DMI_MATCH(DMI_PRODUCT_NAME, "Vostro1510"), 417 }, 418 }, 419 { 420 /* Acer Aspire 5536 */ 421 .matches = { 422 DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 423 DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5536"), 424 DMI_MATCH(DMI_PRODUCT_VERSION, "0100"), 425 }, 426 }, 427 { 428 /* Dell Vostro V13 */ 429 .matches = { 430 DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), 431 DMI_MATCH(DMI_PRODUCT_NAME, "Vostro V13"), 432 }, 433 }, 434 { 435 /* Newer HP Pavilion dv4 models */ 436 .matches = { 437 DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), 438 DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dv4 Notebook PC"), 439 }, 440 }, 441 { } 442}; 443 444static const struct dmi_system_id __initconst i8042_dmi_reset_table[] = { 445 { 446 /* MSI Wind U-100 */ 447 .matches = { 448 DMI_MATCH(DMI_BOARD_NAME, "U-100"), 449 DMI_MATCH(DMI_BOARD_VENDOR, "MICRO-STAR INTERNATIONAL CO., LTD"), 450 }, 451 }, 452 { 453 /* LG Electronics X110 */ 454 .matches = { 455 DMI_MATCH(DMI_BOARD_NAME, "X110"), 456 DMI_MATCH(DMI_BOARD_VENDOR, "LG Electronics Inc."), 457 }, 458 }, 459 { 460 /* Acer Aspire One 150 */ 461 .matches = { 462 DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 463 DMI_MATCH(DMI_PRODUCT_NAME, "AOA150"), 464 }, 465 }, 466 { 467 /* Advent 4211 */ 468 .matches = { 469 DMI_MATCH(DMI_SYS_VENDOR, "DIXONSXP"), 470 DMI_MATCH(DMI_PRODUCT_NAME, "Advent 4211"), 471 }, 472 }, 473 { 474 /* Medion Akoya Mini E1210 */ 475 .matches = { 476 DMI_MATCH(DMI_SYS_VENDOR, "MEDION"), 477 DMI_MATCH(DMI_PRODUCT_NAME, "E1210"), 478 }, 479 }, 480 { 481 /* Medion Akoya E1222 */ 482 .matches = { 483 DMI_MATCH(DMI_SYS_VENDOR, "MEDION"), 484 DMI_MATCH(DMI_PRODUCT_NAME, "E122X"), 485 }, 486 }, 487 { 488 /* Mivvy M310 */ 489 .matches = { 490 DMI_MATCH(DMI_SYS_VENDOR, "VIOOO"), 491 DMI_MATCH(DMI_PRODUCT_NAME, "N10"), 492 }, 493 }, 494 { 495 /* Dell Vostro 1320 */ 496 .matches = { 497 DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), 498 DMI_MATCH(DMI_PRODUCT_NAME, "Vostro 1320"), 499 }, 500 }, 501 { 502 /* Dell Vostro 1520 */ 503 .matches = { 504 DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), 505 DMI_MATCH(DMI_PRODUCT_NAME, "Vostro 1520"), 506 }, 507 }, 508 { 509 /* Dell Vostro 1720 */ 510 .matches = { 511 DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), 512 DMI_MATCH(DMI_PRODUCT_NAME, "Vostro 1720"), 513 }, 514 }, 515 { 516 /* Lenovo Ideapad U455 */ 517 .matches = { 518 DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), 519 DMI_MATCH(DMI_PRODUCT_NAME, "20046"), 520 }, 521 }, 522 { } 523}; 524 525#ifdef CONFIG_PNP 526static const struct dmi_system_id __initconst i8042_dmi_nopnp_table[] = { 527 { 528 /* Intel MBO Desktop D845PESV */ 529 .matches = { 530 DMI_MATCH(DMI_BOARD_NAME, "D845PESV"), 531 DMI_MATCH(DMI_BOARD_VENDOR, "Intel Corporation"), 532 }, 533 }, 534 { 535 /* MSI Wind U-100 */ 536 .matches = { 537 DMI_MATCH(DMI_BOARD_NAME, "U-100"), 538 DMI_MATCH(DMI_BOARD_VENDOR, "MICRO-STAR INTERNATIONAL CO., LTD"), 539 }, 540 }, 541 { } 542}; 543 544static const struct dmi_system_id __initconst i8042_dmi_laptop_table[] = { 545 { 546 .matches = { 547 DMI_MATCH(DMI_CHASSIS_TYPE, "8"), /* Portable */ 548 }, 549 }, 550 { 551 .matches = { 552 DMI_MATCH(DMI_CHASSIS_TYPE, "9"), /* Laptop */ 553 }, 554 }, 555 { 556 .matches = { 557 DMI_MATCH(DMI_CHASSIS_TYPE, "10"), /* Notebook */ 558 }, 559 }, 560 { 561 .matches = { 562 DMI_MATCH(DMI_CHASSIS_TYPE, "14"), /* Sub-Notebook */ 563 }, 564 }, 565 { } 566}; 567#endif 568 569static const struct dmi_system_id __initconst i8042_dmi_notimeout_table[] = { 570 { 571 /* Dell Vostro V13 */ 572 .matches = { 573 DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), 574 DMI_MATCH(DMI_PRODUCT_NAME, "Vostro V13"), 575 }, 576 }, 577 { 578 /* Newer HP Pavilion dv4 models */ 579 .matches = { 580 DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), 581 DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dv4 Notebook PC"), 582 }, 583 }, 584 { } 585}; 586 587/* 588 * Some Wistron based laptops need us to explicitly enable the 'Dritek 589 * keyboard extension' to make their extra keys start generating scancodes. 590 * Originally, this was just confined to older laptops, but a few Acer laptops 591 * have turned up in 2007 that also need this again. 592 */ 593static const struct dmi_system_id __initconst i8042_dmi_dritek_table[] = { 594 { 595 /* Acer Aspire 5100 */ 596 .matches = { 597 DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 598 DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5100"), 599 }, 600 }, 601 { 602 /* Acer Aspire 5610 */ 603 .matches = { 604 DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 605 DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5610"), 606 }, 607 }, 608 { 609 /* Acer Aspire 5630 */ 610 .matches = { 611 DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 612 DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5630"), 613 }, 614 }, 615 { 616 /* Acer Aspire 5650 */ 617 .matches = { 618 DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 619 DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5650"), 620 }, 621 }, 622 { 623 /* Acer Aspire 5680 */ 624 .matches = { 625 DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 626 DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5680"), 627 }, 628 }, 629 { 630 /* Acer Aspire 5720 */ 631 .matches = { 632 DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 633 DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5720"), 634 }, 635 }, 636 { 637 /* Acer Aspire 9110 */ 638 .matches = { 639 DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 640 DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 9110"), 641 }, 642 }, 643 { 644 /* Acer TravelMate 660 */ 645 .matches = { 646 DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 647 DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 660"), 648 }, 649 }, 650 { 651 /* Acer TravelMate 2490 */ 652 .matches = { 653 DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 654 DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 2490"), 655 }, 656 }, 657 { 658 /* Acer TravelMate 4280 */ 659 .matches = { 660 DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 661 DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 4280"), 662 }, 663 }, 664 { } 665}; 666 667#endif /* CONFIG_X86 */ 668 669#ifdef CONFIG_PNP 670#include <linux/pnp.h> 671 672static bool i8042_pnp_kbd_registered; 673static unsigned int i8042_pnp_kbd_devices; 674static bool i8042_pnp_aux_registered; 675static unsigned int i8042_pnp_aux_devices; 676 677static int i8042_pnp_command_reg; 678static int i8042_pnp_data_reg; 679static int i8042_pnp_kbd_irq; 680static int i8042_pnp_aux_irq; 681 682static char i8042_pnp_kbd_name[32]; 683static char i8042_pnp_aux_name[32]; 684 685static int i8042_pnp_kbd_probe(struct pnp_dev *dev, const struct pnp_device_id *did) 686{ 687 if (pnp_port_valid(dev, 0) && pnp_port_len(dev, 0) == 1) 688 i8042_pnp_data_reg = pnp_port_start(dev,0); 689 690 if (pnp_port_valid(dev, 1) && pnp_port_len(dev, 1) == 1) 691 i8042_pnp_command_reg = pnp_port_start(dev, 1); 692 693 if (pnp_irq_valid(dev,0)) 694 i8042_pnp_kbd_irq = pnp_irq(dev, 0); 695 696 strlcpy(i8042_pnp_kbd_name, did->id, sizeof(i8042_pnp_kbd_name)); 697 if (strlen(pnp_dev_name(dev))) { 698 strlcat(i8042_pnp_kbd_name, ":", sizeof(i8042_pnp_kbd_name)); 699 strlcat(i8042_pnp_kbd_name, pnp_dev_name(dev), sizeof(i8042_pnp_kbd_name)); 700 } 701 702 /* Keyboard ports are always supposed to be wakeup-enabled */ 703 device_set_wakeup_enable(&dev->dev, true); 704 705 i8042_pnp_kbd_devices++; 706 return 0; 707} 708 709static int i8042_pnp_aux_probe(struct pnp_dev *dev, const struct pnp_device_id *did) 710{ 711 if (pnp_port_valid(dev, 0) && pnp_port_len(dev, 0) == 1) 712 i8042_pnp_data_reg = pnp_port_start(dev,0); 713 714 if (pnp_port_valid(dev, 1) && pnp_port_len(dev, 1) == 1) 715 i8042_pnp_command_reg = pnp_port_start(dev, 1); 716 717 if (pnp_irq_valid(dev, 0)) 718 i8042_pnp_aux_irq = pnp_irq(dev, 0); 719 720 strlcpy(i8042_pnp_aux_name, did->id, sizeof(i8042_pnp_aux_name)); 721 if (strlen(pnp_dev_name(dev))) { 722 strlcat(i8042_pnp_aux_name, ":", sizeof(i8042_pnp_aux_name)); 723 strlcat(i8042_pnp_aux_name, pnp_dev_name(dev), sizeof(i8042_pnp_aux_name)); 724 } 725 726 i8042_pnp_aux_devices++; 727 return 0; 728} 729 730static struct pnp_device_id pnp_kbd_devids[] = { 731 { .id = "PNP0300", .driver_data = 0 }, 732 { .id = "PNP0301", .driver_data = 0 }, 733 { .id = "PNP0302", .driver_data = 0 }, 734 { .id = "PNP0303", .driver_data = 0 }, 735 { .id = "PNP0304", .driver_data = 0 }, 736 { .id = "PNP0305", .driver_data = 0 }, 737 { .id = "PNP0306", .driver_data = 0 }, 738 { .id = "PNP0309", .driver_data = 0 }, 739 { .id = "PNP030a", .driver_data = 0 }, 740 { .id = "PNP030b", .driver_data = 0 }, 741 { .id = "PNP0320", .driver_data = 0 }, 742 { .id = "PNP0343", .driver_data = 0 }, 743 { .id = "PNP0344", .driver_data = 0 }, 744 { .id = "PNP0345", .driver_data = 0 }, 745 { .id = "CPQA0D7", .driver_data = 0 }, 746 { .id = "", }, 747}; 748 749static struct pnp_driver i8042_pnp_kbd_driver = { 750 .name = "i8042 kbd", 751 .id_table = pnp_kbd_devids, 752 .probe = i8042_pnp_kbd_probe, 753}; 754 755static struct pnp_device_id pnp_aux_devids[] = { 756 { .id = "AUI0200", .driver_data = 0 }, 757 { .id = "FJC6000", .driver_data = 0 }, 758 { .id = "FJC6001", .driver_data = 0 }, 759 { .id = "PNP0f03", .driver_data = 0 }, 760 { .id = "PNP0f0b", .driver_data = 0 }, 761 { .id = "PNP0f0e", .driver_data = 0 }, 762 { .id = "PNP0f12", .driver_data = 0 }, 763 { .id = "PNP0f13", .driver_data = 0 }, 764 { .id = "PNP0f19", .driver_data = 0 }, 765 { .id = "PNP0f1c", .driver_data = 0 }, 766 { .id = "SYN0801", .driver_data = 0 }, 767 { .id = "", }, 768}; 769 770static struct pnp_driver i8042_pnp_aux_driver = { 771 .name = "i8042 aux", 772 .id_table = pnp_aux_devids, 773 .probe = i8042_pnp_aux_probe, 774}; 775 776static void i8042_pnp_exit(void) 777{ 778 if (i8042_pnp_kbd_registered) { 779 i8042_pnp_kbd_registered = false; 780 pnp_unregister_driver(&i8042_pnp_kbd_driver); 781 } 782 783 if (i8042_pnp_aux_registered) { 784 i8042_pnp_aux_registered = false; 785 pnp_unregister_driver(&i8042_pnp_aux_driver); 786 } 787} 788 789static int __init i8042_pnp_init(void) 790{ 791 char kbd_irq_str[4] = { 0 }, aux_irq_str[4] = { 0 }; 792 bool pnp_data_busted = false; 793 int err; 794 795#ifdef CONFIG_X86 796 if (dmi_check_system(i8042_dmi_nopnp_table)) 797 i8042_nopnp = true; 798#endif 799 800 if (i8042_nopnp) { 801 pr_info("PNP detection disabled\n"); 802 return 0; 803 } 804 805 err = pnp_register_driver(&i8042_pnp_kbd_driver); 806 if (!err) 807 i8042_pnp_kbd_registered = true; 808 809 err = pnp_register_driver(&i8042_pnp_aux_driver); 810 if (!err) 811 i8042_pnp_aux_registered = true; 812 813 if (!i8042_pnp_kbd_devices && !i8042_pnp_aux_devices) { 814 i8042_pnp_exit(); 815#if defined(__ia64__) 816 return -ENODEV; 817#else 818 pr_info("PNP: No PS/2 controller found. Probing ports directly.\n"); 819 return 0; 820#endif 821 } 822 823 if (i8042_pnp_kbd_devices) 824 snprintf(kbd_irq_str, sizeof(kbd_irq_str), 825 "%d", i8042_pnp_kbd_irq); 826 if (i8042_pnp_aux_devices) 827 snprintf(aux_irq_str, sizeof(aux_irq_str), 828 "%d", i8042_pnp_aux_irq); 829 830 pr_info("PNP: PS/2 Controller [%s%s%s] at %#x,%#x irq %s%s%s\n", 831 i8042_pnp_kbd_name, (i8042_pnp_kbd_devices && i8042_pnp_aux_devices) ? "," : "", 832 i8042_pnp_aux_name, 833 i8042_pnp_data_reg, i8042_pnp_command_reg, 834 kbd_irq_str, (i8042_pnp_kbd_devices && i8042_pnp_aux_devices) ? "," : "", 835 aux_irq_str); 836 837#if defined(__ia64__) 838 if (!i8042_pnp_kbd_devices) 839 i8042_nokbd = true; 840 if (!i8042_pnp_aux_devices) 841 i8042_noaux = true; 842#endif 843 844 if (((i8042_pnp_data_reg & ~0xf) == (i8042_data_reg & ~0xf) && 845 i8042_pnp_data_reg != i8042_data_reg) || 846 !i8042_pnp_data_reg) { 847 pr_warn("PNP: PS/2 controller has invalid data port %#x; using default %#x\n", 848 i8042_pnp_data_reg, i8042_data_reg); 849 i8042_pnp_data_reg = i8042_data_reg; 850 pnp_data_busted = true; 851 } 852 853 if (((i8042_pnp_command_reg & ~0xf) == (i8042_command_reg & ~0xf) && 854 i8042_pnp_command_reg != i8042_command_reg) || 855 !i8042_pnp_command_reg) { 856 pr_warn("PNP: PS/2 controller has invalid command port %#x; using default %#x\n", 857 i8042_pnp_command_reg, i8042_command_reg); 858 i8042_pnp_command_reg = i8042_command_reg; 859 pnp_data_busted = true; 860 } 861 862 if (!i8042_nokbd && !i8042_pnp_kbd_irq) { 863 pr_warn("PNP: PS/2 controller doesn't have KBD irq; using default %d\n", 864 i8042_kbd_irq); 865 i8042_pnp_kbd_irq = i8042_kbd_irq; 866 pnp_data_busted = true; 867 } 868 869 if (!i8042_noaux && !i8042_pnp_aux_irq) { 870 if (!pnp_data_busted && i8042_pnp_kbd_irq) { 871 pr_warn("PNP: PS/2 appears to have AUX port disabled, " 872 "if this is incorrect please boot with i8042.nopnp\n"); 873 i8042_noaux = true; 874 } else { 875 pr_warn("PNP: PS/2 controller doesn't have AUX irq; using default %d\n", 876 i8042_aux_irq); 877 i8042_pnp_aux_irq = i8042_aux_irq; 878 } 879 } 880 881 i8042_data_reg = i8042_pnp_data_reg; 882 i8042_command_reg = i8042_pnp_command_reg; 883 i8042_kbd_irq = i8042_pnp_kbd_irq; 884 i8042_aux_irq = i8042_pnp_aux_irq; 885 886#ifdef CONFIG_X86 887 i8042_bypass_aux_irq_test = !pnp_data_busted && 888 dmi_check_system(i8042_dmi_laptop_table); 889#endif 890 891 return 0; 892} 893 894#else 895static inline int i8042_pnp_init(void) { return 0; } 896static inline void i8042_pnp_exit(void) { } 897#endif 898 899static int __init i8042_platform_init(void) 900{ 901 int retval; 902 903#ifdef CONFIG_X86 904 /* Just return if pre-detection shows no i8042 controller exist */ 905 if (!x86_platform.i8042_detect()) 906 return -ENODEV; 907#endif 908 909/* 910 * On ix86 platforms touching the i8042 data register region can do really 911 * bad things. Because of this the region is always reserved on ix86 boxes. 912 * 913 * if (!request_region(I8042_DATA_REG, 16, "i8042")) 914 * return -EBUSY; 915 */ 916 917 i8042_kbd_irq = I8042_MAP_IRQ(1); 918 i8042_aux_irq = I8042_MAP_IRQ(12); 919 920 retval = i8042_pnp_init(); 921 if (retval) 922 return retval; 923 924#if defined(__ia64__) 925 i8042_reset = true; 926#endif 927 928#ifdef CONFIG_X86 929 if (dmi_check_system(i8042_dmi_reset_table)) 930 i8042_reset = true; 931 932 if (dmi_check_system(i8042_dmi_noloop_table)) 933 i8042_noloop = true; 934 935 if (dmi_check_system(i8042_dmi_nomux_table)) 936 i8042_nomux = true; 937 938 if (dmi_check_system(i8042_dmi_notimeout_table)) 939 i8042_notimeout = true; 940 941 if (dmi_check_system(i8042_dmi_dritek_table)) 942 i8042_dritek = true; 943#endif /* CONFIG_X86 */ 944 945 return retval; 946} 947 948static inline void i8042_platform_exit(void) 949{ 950 i8042_pnp_exit(); 951} 952 953#endif /* _I8042_X86IA64IO_H */ 954