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