root/drivers/input/serio/i8042-x86ia64io.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. i8042_read_data
  2. i8042_read_status
  3. i8042_write_data
  4. i8042_write_command
  5. i8042_pnp_id_to_string
  6. i8042_pnp_kbd_probe
  7. i8042_pnp_aux_probe
  8. i8042_pnp_exit
  9. i8042_pnp_init
  10. i8042_pnp_init
  11. i8042_pnp_exit
  12. i8042_platform_init
  13. i8042_platform_exit

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

/* [<][>][^][v][top][bottom][index][help] */