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