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 v2.6.30 747 lines 18 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/* 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 struct dmi_system_id __initdata i8042_dmi_noloop_table[] = { 71 { 72 /* AUX LOOP command does not raise AUX IRQ */ 73 .ident = "Arima-Rioworks HDAMB", 74 .matches = { 75 DMI_MATCH(DMI_BOARD_VENDOR, "RIOWORKS"), 76 DMI_MATCH(DMI_BOARD_NAME, "HDAMB"), 77 DMI_MATCH(DMI_BOARD_VERSION, "Rev E"), 78 }, 79 }, 80 { 81 /* AUX LOOP command does not raise AUX IRQ */ 82 .ident = "ASUS P65UP5", 83 .matches = { 84 DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."), 85 DMI_MATCH(DMI_BOARD_NAME, "P/I-P65UP5"), 86 DMI_MATCH(DMI_BOARD_VERSION, "REV 2.X"), 87 }, 88 }, 89 { 90 .ident = "Compaq Proliant 8500", 91 .matches = { 92 DMI_MATCH(DMI_SYS_VENDOR, "Compaq"), 93 DMI_MATCH(DMI_PRODUCT_NAME , "ProLiant"), 94 DMI_MATCH(DMI_PRODUCT_VERSION, "8500"), 95 }, 96 }, 97 { 98 .ident = "Compaq Proliant DL760", 99 .matches = { 100 DMI_MATCH(DMI_SYS_VENDOR, "Compaq"), 101 DMI_MATCH(DMI_PRODUCT_NAME , "ProLiant"), 102 DMI_MATCH(DMI_PRODUCT_VERSION, "DL760"), 103 }, 104 }, 105 { 106 .ident = "OQO Model 01", 107 .matches = { 108 DMI_MATCH(DMI_SYS_VENDOR, "OQO"), 109 DMI_MATCH(DMI_PRODUCT_NAME, "ZEPTO"), 110 DMI_MATCH(DMI_PRODUCT_VERSION, "00"), 111 }, 112 }, 113 { 114 /* AUX LOOP does not work properly */ 115 .ident = "ULI EV4873", 116 .matches = { 117 DMI_MATCH(DMI_SYS_VENDOR, "ULI"), 118 DMI_MATCH(DMI_PRODUCT_NAME, "EV4873"), 119 DMI_MATCH(DMI_PRODUCT_VERSION, "5a"), 120 }, 121 }, 122 { 123 .ident = "Microsoft Virtual Machine", 124 .matches = { 125 DMI_MATCH(DMI_SYS_VENDOR, "Microsoft Corporation"), 126 DMI_MATCH(DMI_PRODUCT_NAME, "Virtual Machine"), 127 DMI_MATCH(DMI_PRODUCT_VERSION, "VS2005R2"), 128 }, 129 }, 130 { 131 .ident = "Medion MAM 2070", 132 .matches = { 133 DMI_MATCH(DMI_SYS_VENDOR, "Notebook"), 134 DMI_MATCH(DMI_PRODUCT_NAME, "MAM 2070"), 135 DMI_MATCH(DMI_PRODUCT_VERSION, "5a"), 136 }, 137 }, 138 { 139 .ident = "Blue FB5601", 140 .matches = { 141 DMI_MATCH(DMI_SYS_VENDOR, "blue"), 142 DMI_MATCH(DMI_PRODUCT_NAME, "FB5601"), 143 DMI_MATCH(DMI_PRODUCT_VERSION, "M606"), 144 }, 145 }, 146 { 147 .ident = "Gigabyte M912", 148 .matches = { 149 DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"), 150 DMI_MATCH(DMI_PRODUCT_NAME, "M912"), 151 DMI_MATCH(DMI_PRODUCT_VERSION, "01"), 152 }, 153 }, 154 { 155 .ident = "HP DV9700", 156 .matches = { 157 DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), 158 DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dv9700"), 159 DMI_MATCH(DMI_PRODUCT_VERSION, "Rev 1"), 160 }, 161 }, 162 { } 163}; 164 165/* 166 * Some Fujitsu notebooks are having trouble with touchpads if 167 * active multiplexing mode is activated. Luckily they don't have 168 * external PS/2 ports so we can safely disable it. 169 * ... apparently some Toshibas don't like MUX mode either and 170 * die horrible death on reboot. 171 */ 172static struct dmi_system_id __initdata i8042_dmi_nomux_table[] = { 173 { 174 .ident = "Fujitsu Lifebook P7010/P7010D", 175 .matches = { 176 DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), 177 DMI_MATCH(DMI_PRODUCT_NAME, "P7010"), 178 }, 179 }, 180 { 181 .ident = "Fujitsu Lifebook P7010", 182 .matches = { 183 DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), 184 DMI_MATCH(DMI_PRODUCT_NAME, "0000000000"), 185 }, 186 }, 187 { 188 .ident = "Fujitsu Lifebook P5020D", 189 .matches = { 190 DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), 191 DMI_MATCH(DMI_PRODUCT_NAME, "LifeBook P Series"), 192 }, 193 }, 194 { 195 .ident = "Fujitsu Lifebook S2000", 196 .matches = { 197 DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), 198 DMI_MATCH(DMI_PRODUCT_NAME, "LifeBook S Series"), 199 }, 200 }, 201 { 202 .ident = "Fujitsu Lifebook S6230", 203 .matches = { 204 DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), 205 DMI_MATCH(DMI_PRODUCT_NAME, "LifeBook S6230"), 206 }, 207 }, 208 { 209 .ident = "Fujitsu T70H", 210 .matches = { 211 DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), 212 DMI_MATCH(DMI_PRODUCT_NAME, "FMVLT70H"), 213 }, 214 }, 215 { 216 .ident = "Fujitsu-Siemens Lifebook T3010", 217 .matches = { 218 DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), 219 DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK T3010"), 220 }, 221 }, 222 { 223 .ident = "Fujitsu-Siemens Lifebook E4010", 224 .matches = { 225 DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), 226 DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK E4010"), 227 }, 228 }, 229 { 230 .ident = "Fujitsu-Siemens Amilo Pro 2010", 231 .matches = { 232 DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), 233 DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pro V2010"), 234 }, 235 }, 236 { 237 .ident = "Fujitsu-Siemens Amilo Pro 2030", 238 .matches = { 239 DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), 240 DMI_MATCH(DMI_PRODUCT_NAME, "AMILO PRO V2030"), 241 }, 242 }, 243 { 244 /* 245 * No data is coming from the touchscreen unless KBC 246 * is in legacy mode. 247 */ 248 .ident = "Panasonic CF-29", 249 .matches = { 250 DMI_MATCH(DMI_SYS_VENDOR, "Matsushita"), 251 DMI_MATCH(DMI_PRODUCT_NAME, "CF-29"), 252 }, 253 }, 254 { 255 /* 256 * Errors on MUX ports are reported without raising AUXDATA 257 * causing "spurious NAK" messages. 258 */ 259 .ident = "HP Pavilion DV4017EA", 260 .matches = { 261 DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), 262 DMI_MATCH(DMI_PRODUCT_NAME, "Pavilion dv4000 (EA032EA#ABF)"), 263 }, 264 }, 265 { 266 /* 267 * Like DV4017EA does not raise AUXERR for errors on MUX ports. 268 */ 269 .ident = "HP Pavilion ZT1000", 270 .matches = { 271 DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), 272 DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion Notebook PC"), 273 DMI_MATCH(DMI_PRODUCT_VERSION, "HP Pavilion Notebook ZT1000"), 274 }, 275 }, 276 { 277 /* 278 * Like DV4017EA does not raise AUXERR for errors on MUX ports. 279 */ 280 .ident = "HP Pavilion DV4270ca", 281 .matches = { 282 DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), 283 DMI_MATCH(DMI_PRODUCT_NAME, "Pavilion dv4000 (EH476UA#ABL)"), 284 }, 285 }, 286 { 287 .ident = "Toshiba P10", 288 .matches = { 289 DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), 290 DMI_MATCH(DMI_PRODUCT_NAME, "Satellite P10"), 291 }, 292 }, 293 { 294 .ident = "Toshiba Equium A110", 295 .matches = { 296 DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), 297 DMI_MATCH(DMI_PRODUCT_NAME, "EQUIUM A110"), 298 }, 299 }, 300 { 301 .ident = "Alienware Sentia", 302 .matches = { 303 DMI_MATCH(DMI_SYS_VENDOR, "ALIENWARE"), 304 DMI_MATCH(DMI_PRODUCT_NAME, "Sentia"), 305 }, 306 }, 307 { 308 .ident = "Sharp Actius MM20", 309 .matches = { 310 DMI_MATCH(DMI_SYS_VENDOR, "SHARP"), 311 DMI_MATCH(DMI_PRODUCT_NAME, "PC-MM20 Series"), 312 }, 313 }, 314 { 315 .ident = "Sony Vaio FS-115b", 316 .matches = { 317 DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"), 318 DMI_MATCH(DMI_PRODUCT_NAME, "VGN-FS115B"), 319 }, 320 }, 321 { 322 .ident = "Amoi M636/A737", 323 .matches = { 324 DMI_MATCH(DMI_SYS_VENDOR, "Amoi Electronics CO.,LTD."), 325 DMI_MATCH(DMI_PRODUCT_NAME, "M636/A737 platform"), 326 }, 327 }, 328 { 329 .ident = "Lenovo 3000 n100", 330 .matches = { 331 DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), 332 DMI_MATCH(DMI_PRODUCT_NAME, "076804U"), 333 }, 334 }, 335 { 336 .ident = "Acer Aspire 1360", 337 .matches = { 338 DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 339 DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 1360"), 340 }, 341 }, 342 { 343 .ident = "Gericom Bellagio", 344 .matches = { 345 DMI_MATCH(DMI_SYS_VENDOR, "Gericom"), 346 DMI_MATCH(DMI_PRODUCT_NAME, "N34AS6"), 347 }, 348 }, 349 { 350 .ident = "IBM 2656", 351 .matches = { 352 DMI_MATCH(DMI_SYS_VENDOR, "IBM"), 353 DMI_MATCH(DMI_PRODUCT_NAME, "2656"), 354 }, 355 }, 356 { 357 .ident = "Dell XPS M1530", 358 .matches = { 359 DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), 360 DMI_MATCH(DMI_PRODUCT_NAME, "XPS M1530"), 361 }, 362 }, 363 { 364 .ident = "Compal HEL80I", 365 .matches = { 366 DMI_MATCH(DMI_SYS_VENDOR, "COMPAL"), 367 DMI_MATCH(DMI_PRODUCT_NAME, "HEL80I"), 368 }, 369 }, 370 { 371 .ident = "Dell Vostro 1510", 372 .matches = { 373 DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), 374 DMI_MATCH(DMI_PRODUCT_NAME, "Vostro1510"), 375 }, 376 }, 377 { } 378}; 379 380static struct dmi_system_id __initdata i8042_dmi_reset_table[] = { 381 { 382 .ident = "MSI Wind U-100", 383 .matches = { 384 DMI_MATCH(DMI_BOARD_NAME, "U-100"), 385 DMI_MATCH(DMI_BOARD_VENDOR, "MICRO-STAR INTERNATIONAL CO., LTD"), 386 }, 387 }, 388 { 389 .ident = "LG Electronics X110", 390 .matches = { 391 DMI_MATCH(DMI_BOARD_NAME, "X110"), 392 DMI_MATCH(DMI_BOARD_VENDOR, "LG Electronics Inc."), 393 }, 394 }, 395 { } 396}; 397 398#ifdef CONFIG_PNP 399static struct dmi_system_id __initdata i8042_dmi_nopnp_table[] = { 400 { 401 .ident = "Intel MBO Desktop D845PESV", 402 .matches = { 403 DMI_MATCH(DMI_BOARD_NAME, "D845PESV"), 404 DMI_MATCH(DMI_BOARD_VENDOR, "Intel Corporation"), 405 }, 406 }, 407 { 408 .ident = "MSI Wind U-100", 409 .matches = { 410 DMI_MATCH(DMI_BOARD_NAME, "U-100"), 411 DMI_MATCH(DMI_BOARD_VENDOR, "MICRO-STAR INTERNATIONAL CO., LTD"), 412 }, 413 }, 414 { } 415}; 416#endif 417 418/* 419 * Some Wistron based laptops need us to explicitly enable the 'Dritek 420 * keyboard extension' to make their extra keys start generating scancodes. 421 * Originally, this was just confined to older laptops, but a few Acer laptops 422 * have turned up in 2007 that also need this again. 423 */ 424static struct dmi_system_id __initdata i8042_dmi_dritek_table[] = { 425 { 426 .ident = "Acer Aspire 5630", 427 .matches = { 428 DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 429 DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5630"), 430 }, 431 }, 432 { 433 .ident = "Acer Aspire 5650", 434 .matches = { 435 DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 436 DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5650"), 437 }, 438 }, 439 { 440 .ident = "Acer Aspire 5680", 441 .matches = { 442 DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 443 DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5680"), 444 }, 445 }, 446 { 447 .ident = "Acer Aspire 5720", 448 .matches = { 449 DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 450 DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5720"), 451 }, 452 }, 453 { 454 .ident = "Acer Aspire 9110", 455 .matches = { 456 DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 457 DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 9110"), 458 }, 459 }, 460 { 461 .ident = "Acer TravelMate 660", 462 .matches = { 463 DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 464 DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 660"), 465 }, 466 }, 467 { 468 .ident = "Acer TravelMate 2490", 469 .matches = { 470 DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 471 DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 2490"), 472 }, 473 }, 474 { 475 .ident = "Acer TravelMate 4280", 476 .matches = { 477 DMI_MATCH(DMI_SYS_VENDOR, "Acer"), 478 DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 4280"), 479 }, 480 }, 481 { } 482}; 483 484#endif /* CONFIG_X86 */ 485 486#ifdef CONFIG_PNP 487#include <linux/pnp.h> 488 489static int i8042_pnp_kbd_registered; 490static unsigned int i8042_pnp_kbd_devices; 491static int i8042_pnp_aux_registered; 492static unsigned int i8042_pnp_aux_devices; 493 494static int i8042_pnp_command_reg; 495static int i8042_pnp_data_reg; 496static int i8042_pnp_kbd_irq; 497static int i8042_pnp_aux_irq; 498 499static char i8042_pnp_kbd_name[32]; 500static char i8042_pnp_aux_name[32]; 501 502static int i8042_pnp_kbd_probe(struct pnp_dev *dev, const struct pnp_device_id *did) 503{ 504 if (pnp_port_valid(dev, 0) && pnp_port_len(dev, 0) == 1) 505 i8042_pnp_data_reg = pnp_port_start(dev,0); 506 507 if (pnp_port_valid(dev, 1) && pnp_port_len(dev, 1) == 1) 508 i8042_pnp_command_reg = pnp_port_start(dev, 1); 509 510 if (pnp_irq_valid(dev,0)) 511 i8042_pnp_kbd_irq = pnp_irq(dev, 0); 512 513 strlcpy(i8042_pnp_kbd_name, did->id, sizeof(i8042_pnp_kbd_name)); 514 if (strlen(pnp_dev_name(dev))) { 515 strlcat(i8042_pnp_kbd_name, ":", sizeof(i8042_pnp_kbd_name)); 516 strlcat(i8042_pnp_kbd_name, pnp_dev_name(dev), sizeof(i8042_pnp_kbd_name)); 517 } 518 519 i8042_pnp_kbd_devices++; 520 return 0; 521} 522 523static int i8042_pnp_aux_probe(struct pnp_dev *dev, const struct pnp_device_id *did) 524{ 525 if (pnp_port_valid(dev, 0) && pnp_port_len(dev, 0) == 1) 526 i8042_pnp_data_reg = pnp_port_start(dev,0); 527 528 if (pnp_port_valid(dev, 1) && pnp_port_len(dev, 1) == 1) 529 i8042_pnp_command_reg = pnp_port_start(dev, 1); 530 531 if (pnp_irq_valid(dev, 0)) 532 i8042_pnp_aux_irq = pnp_irq(dev, 0); 533 534 strlcpy(i8042_pnp_aux_name, did->id, sizeof(i8042_pnp_aux_name)); 535 if (strlen(pnp_dev_name(dev))) { 536 strlcat(i8042_pnp_aux_name, ":", sizeof(i8042_pnp_aux_name)); 537 strlcat(i8042_pnp_aux_name, pnp_dev_name(dev), sizeof(i8042_pnp_aux_name)); 538 } 539 540 i8042_pnp_aux_devices++; 541 return 0; 542} 543 544static struct pnp_device_id pnp_kbd_devids[] = { 545 { .id = "PNP0303", .driver_data = 0 }, 546 { .id = "PNP030b", .driver_data = 0 }, 547 { .id = "", }, 548}; 549 550static struct pnp_driver i8042_pnp_kbd_driver = { 551 .name = "i8042 kbd", 552 .id_table = pnp_kbd_devids, 553 .probe = i8042_pnp_kbd_probe, 554}; 555 556static struct pnp_device_id pnp_aux_devids[] = { 557 { .id = "FJC6000", .driver_data = 0 }, 558 { .id = "FJC6001", .driver_data = 0 }, 559 { .id = "PNP0f03", .driver_data = 0 }, 560 { .id = "PNP0f0b", .driver_data = 0 }, 561 { .id = "PNP0f0e", .driver_data = 0 }, 562 { .id = "PNP0f12", .driver_data = 0 }, 563 { .id = "PNP0f13", .driver_data = 0 }, 564 { .id = "PNP0f19", .driver_data = 0 }, 565 { .id = "PNP0f1c", .driver_data = 0 }, 566 { .id = "SYN0801", .driver_data = 0 }, 567 { .id = "", }, 568}; 569 570static struct pnp_driver i8042_pnp_aux_driver = { 571 .name = "i8042 aux", 572 .id_table = pnp_aux_devids, 573 .probe = i8042_pnp_aux_probe, 574}; 575 576static void i8042_pnp_exit(void) 577{ 578 if (i8042_pnp_kbd_registered) { 579 i8042_pnp_kbd_registered = 0; 580 pnp_unregister_driver(&i8042_pnp_kbd_driver); 581 } 582 583 if (i8042_pnp_aux_registered) { 584 i8042_pnp_aux_registered = 0; 585 pnp_unregister_driver(&i8042_pnp_aux_driver); 586 } 587} 588 589static int __init i8042_pnp_init(void) 590{ 591 char kbd_irq_str[4] = { 0 }, aux_irq_str[4] = { 0 }; 592 int pnp_data_busted = 0; 593 int err; 594 595#ifdef CONFIG_X86 596 if (dmi_check_system(i8042_dmi_nopnp_table)) 597 i8042_nopnp = 1; 598#endif 599 600 if (i8042_nopnp) { 601 printk(KERN_INFO "i8042: PNP detection disabled\n"); 602 return 0; 603 } 604 605 err = pnp_register_driver(&i8042_pnp_kbd_driver); 606 if (!err) 607 i8042_pnp_kbd_registered = 1; 608 609 err = pnp_register_driver(&i8042_pnp_aux_driver); 610 if (!err) 611 i8042_pnp_aux_registered = 1; 612 613 if (!i8042_pnp_kbd_devices && !i8042_pnp_aux_devices) { 614 i8042_pnp_exit(); 615#if defined(__ia64__) 616 return -ENODEV; 617#else 618 printk(KERN_INFO "PNP: No PS/2 controller found. Probing ports directly.\n"); 619 return 0; 620#endif 621 } 622 623 if (i8042_pnp_kbd_devices) 624 snprintf(kbd_irq_str, sizeof(kbd_irq_str), 625 "%d", i8042_pnp_kbd_irq); 626 if (i8042_pnp_aux_devices) 627 snprintf(aux_irq_str, sizeof(aux_irq_str), 628 "%d", i8042_pnp_aux_irq); 629 630 printk(KERN_INFO "PNP: PS/2 Controller [%s%s%s] at %#x,%#x irq %s%s%s\n", 631 i8042_pnp_kbd_name, (i8042_pnp_kbd_devices && i8042_pnp_aux_devices) ? "," : "", 632 i8042_pnp_aux_name, 633 i8042_pnp_data_reg, i8042_pnp_command_reg, 634 kbd_irq_str, (i8042_pnp_kbd_devices && i8042_pnp_aux_devices) ? "," : "", 635 aux_irq_str); 636 637#if defined(__ia64__) 638 if (!i8042_pnp_kbd_devices) 639 i8042_nokbd = 1; 640 if (!i8042_pnp_aux_devices) 641 i8042_noaux = 1; 642#endif 643 644 if (((i8042_pnp_data_reg & ~0xf) == (i8042_data_reg & ~0xf) && 645 i8042_pnp_data_reg != i8042_data_reg) || 646 !i8042_pnp_data_reg) { 647 printk(KERN_WARNING 648 "PNP: PS/2 controller has invalid data port %#x; " 649 "using default %#x\n", 650 i8042_pnp_data_reg, i8042_data_reg); 651 i8042_pnp_data_reg = i8042_data_reg; 652 pnp_data_busted = 1; 653 } 654 655 if (((i8042_pnp_command_reg & ~0xf) == (i8042_command_reg & ~0xf) && 656 i8042_pnp_command_reg != i8042_command_reg) || 657 !i8042_pnp_command_reg) { 658 printk(KERN_WARNING 659 "PNP: PS/2 controller has invalid command port %#x; " 660 "using default %#x\n", 661 i8042_pnp_command_reg, i8042_command_reg); 662 i8042_pnp_command_reg = i8042_command_reg; 663 pnp_data_busted = 1; 664 } 665 666 if (!i8042_nokbd && !i8042_pnp_kbd_irq) { 667 printk(KERN_WARNING 668 "PNP: PS/2 controller doesn't have KBD irq; " 669 "using default %d\n", i8042_kbd_irq); 670 i8042_pnp_kbd_irq = i8042_kbd_irq; 671 pnp_data_busted = 1; 672 } 673 674 if (!i8042_noaux && !i8042_pnp_aux_irq) { 675 if (!pnp_data_busted && i8042_pnp_kbd_irq) { 676 printk(KERN_WARNING 677 "PNP: PS/2 appears to have AUX port disabled, " 678 "if this is incorrect please boot with " 679 "i8042.nopnp\n"); 680 i8042_noaux = 1; 681 } else { 682 printk(KERN_WARNING 683 "PNP: PS/2 controller doesn't have AUX irq; " 684 "using default %d\n", i8042_aux_irq); 685 i8042_pnp_aux_irq = i8042_aux_irq; 686 } 687 } 688 689 i8042_data_reg = i8042_pnp_data_reg; 690 i8042_command_reg = i8042_pnp_command_reg; 691 i8042_kbd_irq = i8042_pnp_kbd_irq; 692 i8042_aux_irq = i8042_pnp_aux_irq; 693 694 return 0; 695} 696 697#else 698static inline int i8042_pnp_init(void) { return 0; } 699static inline void i8042_pnp_exit(void) { } 700#endif 701 702static int __init i8042_platform_init(void) 703{ 704 int retval; 705 706/* 707 * On ix86 platforms touching the i8042 data register region can do really 708 * bad things. Because of this the region is always reserved on ix86 boxes. 709 * 710 * if (!request_region(I8042_DATA_REG, 16, "i8042")) 711 * return -EBUSY; 712 */ 713 714 i8042_kbd_irq = I8042_MAP_IRQ(1); 715 i8042_aux_irq = I8042_MAP_IRQ(12); 716 717 retval = i8042_pnp_init(); 718 if (retval) 719 return retval; 720 721#if defined(__ia64__) 722 i8042_reset = 1; 723#endif 724 725#ifdef CONFIG_X86 726 if (dmi_check_system(i8042_dmi_reset_table)) 727 i8042_reset = 1; 728 729 if (dmi_check_system(i8042_dmi_noloop_table)) 730 i8042_noloop = 1; 731 732 if (dmi_check_system(i8042_dmi_nomux_table)) 733 i8042_nomux = 1; 734 735 if (dmi_check_system(i8042_dmi_dritek_table)) 736 i8042_dritek = 1; 737#endif /* CONFIG_X86 */ 738 739 return retval; 740} 741 742static inline void i8042_platform_exit(void) 743{ 744 i8042_pnp_exit(); 745} 746 747#endif /* _I8042_X86IA64IO_H */