cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

i8042-x86ia64io.h (31507B)


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