Path: blob/master/drivers/input/serio/i8042-x86ia64io.h
15111 views
#ifndef _I8042_X86IA64IO_H1#define _I8042_X86IA64IO_H23/*4* This program is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 as published by6* the Free Software Foundation.7*/89#ifdef CONFIG_X8610#include <asm/x86_init.h>11#endif1213/*14* Names.15*/1617#define I8042_KBD_PHYS_DESC "isa0060/serio0"18#define I8042_AUX_PHYS_DESC "isa0060/serio1"19#define I8042_MUX_PHYS_DESC "isa0060/serio%d"2021/*22* IRQs.23*/2425#if defined(__ia64__)26# define I8042_MAP_IRQ(x) isa_irq_to_vector((x))27#else28# define I8042_MAP_IRQ(x) (x)29#endif3031#define I8042_KBD_IRQ i8042_kbd_irq32#define I8042_AUX_IRQ i8042_aux_irq3334static int i8042_kbd_irq;35static int i8042_aux_irq;3637/*38* Register numbers.39*/4041#define I8042_COMMAND_REG i8042_command_reg42#define I8042_STATUS_REG i8042_command_reg43#define I8042_DATA_REG i8042_data_reg4445static int i8042_command_reg = 0x64;46static int i8042_data_reg = 0x60;474849static inline int i8042_read_data(void)50{51return inb(I8042_DATA_REG);52}5354static inline int i8042_read_status(void)55{56return inb(I8042_STATUS_REG);57}5859static inline void i8042_write_data(int val)60{61outb(val, I8042_DATA_REG);62}6364static inline void i8042_write_command(int val)65{66outb(val, I8042_COMMAND_REG);67}6869#ifdef CONFIG_X867071#include <linux/dmi.h>7273static const struct dmi_system_id __initconst i8042_dmi_noloop_table[] = {74{75/*76* Arima-Rioworks HDAMB -77* AUX LOOP command does not raise AUX IRQ78*/79.matches = {80DMI_MATCH(DMI_BOARD_VENDOR, "RIOWORKS"),81DMI_MATCH(DMI_BOARD_NAME, "HDAMB"),82DMI_MATCH(DMI_BOARD_VERSION, "Rev E"),83},84},85{86/* ASUS G1S */87.matches = {88DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer Inc."),89DMI_MATCH(DMI_BOARD_NAME, "G1S"),90DMI_MATCH(DMI_BOARD_VERSION, "1.0"),91},92},93{94/* ASUS P65UP5 - AUX LOOP command does not raise AUX IRQ */95.matches = {96DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),97DMI_MATCH(DMI_BOARD_NAME, "P/I-P65UP5"),98DMI_MATCH(DMI_BOARD_VERSION, "REV 2.X"),99},100},101{102.matches = {103DMI_MATCH(DMI_SYS_VENDOR, "Compaq"),104DMI_MATCH(DMI_PRODUCT_NAME , "ProLiant"),105DMI_MATCH(DMI_PRODUCT_VERSION, "8500"),106},107},108{109.matches = {110DMI_MATCH(DMI_SYS_VENDOR, "Compaq"),111DMI_MATCH(DMI_PRODUCT_NAME , "ProLiant"),112DMI_MATCH(DMI_PRODUCT_VERSION, "DL760"),113},114},115{116/* OQO Model 01 */117.matches = {118DMI_MATCH(DMI_SYS_VENDOR, "OQO"),119DMI_MATCH(DMI_PRODUCT_NAME, "ZEPTO"),120DMI_MATCH(DMI_PRODUCT_VERSION, "00"),121},122},123{124/* ULI EV4873 - AUX LOOP does not work properly */125.matches = {126DMI_MATCH(DMI_SYS_VENDOR, "ULI"),127DMI_MATCH(DMI_PRODUCT_NAME, "EV4873"),128DMI_MATCH(DMI_PRODUCT_VERSION, "5a"),129},130},131{132/* Microsoft Virtual Machine */133.matches = {134DMI_MATCH(DMI_SYS_VENDOR, "Microsoft Corporation"),135DMI_MATCH(DMI_PRODUCT_NAME, "Virtual Machine"),136DMI_MATCH(DMI_PRODUCT_VERSION, "VS2005R2"),137},138},139{140/* Medion MAM 2070 */141.matches = {142DMI_MATCH(DMI_SYS_VENDOR, "Notebook"),143DMI_MATCH(DMI_PRODUCT_NAME, "MAM 2070"),144DMI_MATCH(DMI_PRODUCT_VERSION, "5a"),145},146},147{148/* Blue FB5601 */149.matches = {150DMI_MATCH(DMI_SYS_VENDOR, "blue"),151DMI_MATCH(DMI_PRODUCT_NAME, "FB5601"),152DMI_MATCH(DMI_PRODUCT_VERSION, "M606"),153},154},155{156/* Gigabyte M912 */157.matches = {158DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"),159DMI_MATCH(DMI_PRODUCT_NAME, "M912"),160DMI_MATCH(DMI_PRODUCT_VERSION, "01"),161},162},163{164/* Gigabyte M1022M netbook */165.matches = {166DMI_MATCH(DMI_BOARD_VENDOR, "Gigabyte Technology Co.,Ltd."),167DMI_MATCH(DMI_BOARD_NAME, "M1022E"),168DMI_MATCH(DMI_BOARD_VERSION, "1.02"),169},170},171{172/* Gigabyte Spring Peak - defines wrong chassis type */173.matches = {174DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"),175DMI_MATCH(DMI_PRODUCT_NAME, "Spring Peak"),176},177},178{179.matches = {180DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),181DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dv9700"),182DMI_MATCH(DMI_PRODUCT_VERSION, "Rev 1"),183},184},185{ }186};187188/*189* Some Fujitsu notebooks are having trouble with touchpads if190* active multiplexing mode is activated. Luckily they don't have191* external PS/2 ports so we can safely disable it.192* ... apparently some Toshibas don't like MUX mode either and193* die horrible death on reboot.194*/195static const struct dmi_system_id __initconst i8042_dmi_nomux_table[] = {196{197/* Fujitsu Lifebook P7010/P7010D */198.matches = {199DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),200DMI_MATCH(DMI_PRODUCT_NAME, "P7010"),201},202},203{204/* Fujitsu Lifebook P7010 */205.matches = {206DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),207DMI_MATCH(DMI_PRODUCT_NAME, "0000000000"),208},209},210{211/* Fujitsu Lifebook P5020D */212.matches = {213DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),214DMI_MATCH(DMI_PRODUCT_NAME, "LifeBook P Series"),215},216},217{218/* Fujitsu Lifebook S2000 */219.matches = {220DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),221DMI_MATCH(DMI_PRODUCT_NAME, "LifeBook S Series"),222},223},224{225/* Fujitsu Lifebook S6230 */226.matches = {227DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),228DMI_MATCH(DMI_PRODUCT_NAME, "LifeBook S6230"),229},230},231{232/* Fujitsu T70H */233.matches = {234DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),235DMI_MATCH(DMI_PRODUCT_NAME, "FMVLT70H"),236},237},238{239/* Fujitsu-Siemens Lifebook T3010 */240.matches = {241DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),242DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK T3010"),243},244},245{246/* Fujitsu-Siemens Lifebook E4010 */247.matches = {248DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),249DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK E4010"),250},251},252{253/* Fujitsu-Siemens Amilo Pro 2010 */254.matches = {255DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),256DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pro V2010"),257},258},259{260/* Fujitsu-Siemens Amilo Pro 2030 */261.matches = {262DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),263DMI_MATCH(DMI_PRODUCT_NAME, "AMILO PRO V2030"),264},265},266{267/*268* No data is coming from the touchscreen unless KBC269* is in legacy mode.270*/271/* Panasonic CF-29 */272.matches = {273DMI_MATCH(DMI_SYS_VENDOR, "Matsushita"),274DMI_MATCH(DMI_PRODUCT_NAME, "CF-29"),275},276},277{278/*279* HP Pavilion DV4017EA -280* errors on MUX ports are reported without raising AUXDATA281* causing "spurious NAK" messages.282*/283.matches = {284DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),285DMI_MATCH(DMI_PRODUCT_NAME, "Pavilion dv4000 (EA032EA#ABF)"),286},287},288{289/*290* HP Pavilion ZT1000 -291* like DV4017EA does not raise AUXERR for errors on MUX ports.292*/293.matches = {294DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),295DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion Notebook PC"),296DMI_MATCH(DMI_PRODUCT_VERSION, "HP Pavilion Notebook ZT1000"),297},298},299{300/*301* HP Pavilion DV4270ca -302* like DV4017EA does not raise AUXERR for errors on MUX ports.303*/304.matches = {305DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),306DMI_MATCH(DMI_PRODUCT_NAME, "Pavilion dv4000 (EH476UA#ABL)"),307},308},309{310.matches = {311DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),312DMI_MATCH(DMI_PRODUCT_NAME, "Satellite P10"),313},314},315{316.matches = {317DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),318DMI_MATCH(DMI_PRODUCT_NAME, "EQUIUM A110"),319},320},321{322.matches = {323DMI_MATCH(DMI_SYS_VENDOR, "ALIENWARE"),324DMI_MATCH(DMI_PRODUCT_NAME, "Sentia"),325},326},327{328/* Sharp Actius MM20 */329.matches = {330DMI_MATCH(DMI_SYS_VENDOR, "SHARP"),331DMI_MATCH(DMI_PRODUCT_NAME, "PC-MM20 Series"),332},333},334{335/* Sony Vaio FS-115b */336.matches = {337DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"),338DMI_MATCH(DMI_PRODUCT_NAME, "VGN-FS115B"),339},340},341{342/*343* Sony Vaio FZ-240E -344* reset and GET ID commands issued via KBD port are345* sometimes being delivered to AUX3.346*/347.matches = {348DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"),349DMI_MATCH(DMI_PRODUCT_NAME, "VGN-FZ240E"),350},351},352{353/*354* Most (all?) VAIOs do not have external PS/2 ports nor355* they implement active multiplexing properly, and356* MUX discovery usually messes up keyboard/touchpad.357*/358.matches = {359DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"),360DMI_MATCH(DMI_BOARD_NAME, "VAIO"),361},362},363{364/* Amoi M636/A737 */365.matches = {366DMI_MATCH(DMI_SYS_VENDOR, "Amoi Electronics CO.,LTD."),367DMI_MATCH(DMI_PRODUCT_NAME, "M636/A737 platform"),368},369},370{371/* Lenovo 3000 n100 */372.matches = {373DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),374DMI_MATCH(DMI_PRODUCT_NAME, "076804U"),375},376},377{378.matches = {379DMI_MATCH(DMI_SYS_VENDOR, "Acer"),380DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 1360"),381},382},383{384/* Gericom Bellagio */385.matches = {386DMI_MATCH(DMI_SYS_VENDOR, "Gericom"),387DMI_MATCH(DMI_PRODUCT_NAME, "N34AS6"),388},389},390{391/* IBM 2656 */392.matches = {393DMI_MATCH(DMI_SYS_VENDOR, "IBM"),394DMI_MATCH(DMI_PRODUCT_NAME, "2656"),395},396},397{398/* Dell XPS M1530 */399.matches = {400DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),401DMI_MATCH(DMI_PRODUCT_NAME, "XPS M1530"),402},403},404{405/* Compal HEL80I */406.matches = {407DMI_MATCH(DMI_SYS_VENDOR, "COMPAL"),408DMI_MATCH(DMI_PRODUCT_NAME, "HEL80I"),409},410},411{412/* Dell Vostro 1510 */413.matches = {414DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),415DMI_MATCH(DMI_PRODUCT_NAME, "Vostro1510"),416},417},418{419/* Acer Aspire 5536 */420.matches = {421DMI_MATCH(DMI_SYS_VENDOR, "Acer"),422DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5536"),423DMI_MATCH(DMI_PRODUCT_VERSION, "0100"),424},425},426{427/* Dell Vostro V13 */428.matches = {429DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),430DMI_MATCH(DMI_PRODUCT_NAME, "Vostro V13"),431},432},433{ }434};435436static const struct dmi_system_id __initconst i8042_dmi_reset_table[] = {437{438/* MSI Wind U-100 */439.matches = {440DMI_MATCH(DMI_BOARD_NAME, "U-100"),441DMI_MATCH(DMI_BOARD_VENDOR, "MICRO-STAR INTERNATIONAL CO., LTD"),442},443},444{445/* LG Electronics X110 */446.matches = {447DMI_MATCH(DMI_BOARD_NAME, "X110"),448DMI_MATCH(DMI_BOARD_VENDOR, "LG Electronics Inc."),449},450},451{452/* Acer Aspire One 150 */453.matches = {454DMI_MATCH(DMI_SYS_VENDOR, "Acer"),455DMI_MATCH(DMI_PRODUCT_NAME, "AOA150"),456},457},458{459/* Advent 4211 */460.matches = {461DMI_MATCH(DMI_SYS_VENDOR, "DIXONSXP"),462DMI_MATCH(DMI_PRODUCT_NAME, "Advent 4211"),463},464},465{466/* Medion Akoya Mini E1210 */467.matches = {468DMI_MATCH(DMI_SYS_VENDOR, "MEDION"),469DMI_MATCH(DMI_PRODUCT_NAME, "E1210"),470},471},472{473/* Medion Akoya E1222 */474.matches = {475DMI_MATCH(DMI_SYS_VENDOR, "MEDION"),476DMI_MATCH(DMI_PRODUCT_NAME, "E122X"),477},478},479{480/* Mivvy M310 */481.matches = {482DMI_MATCH(DMI_SYS_VENDOR, "VIOOO"),483DMI_MATCH(DMI_PRODUCT_NAME, "N10"),484},485},486{487/* Dell Vostro 1320 */488.matches = {489DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),490DMI_MATCH(DMI_PRODUCT_NAME, "Vostro 1320"),491},492},493{494/* Dell Vostro 1520 */495.matches = {496DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),497DMI_MATCH(DMI_PRODUCT_NAME, "Vostro 1520"),498},499},500{501/* Dell Vostro 1720 */502.matches = {503DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),504DMI_MATCH(DMI_PRODUCT_NAME, "Vostro 1720"),505},506},507{ }508};509510#ifdef CONFIG_PNP511static const struct dmi_system_id __initconst i8042_dmi_nopnp_table[] = {512{513/* Intel MBO Desktop D845PESV */514.matches = {515DMI_MATCH(DMI_BOARD_NAME, "D845PESV"),516DMI_MATCH(DMI_BOARD_VENDOR, "Intel Corporation"),517},518},519{520/* MSI Wind U-100 */521.matches = {522DMI_MATCH(DMI_BOARD_NAME, "U-100"),523DMI_MATCH(DMI_BOARD_VENDOR, "MICRO-STAR INTERNATIONAL CO., LTD"),524},525},526{ }527};528529static const struct dmi_system_id __initconst i8042_dmi_laptop_table[] = {530{531.matches = {532DMI_MATCH(DMI_CHASSIS_TYPE, "8"), /* Portable */533},534},535{536.matches = {537DMI_MATCH(DMI_CHASSIS_TYPE, "9"), /* Laptop */538},539},540{541.matches = {542DMI_MATCH(DMI_CHASSIS_TYPE, "10"), /* Notebook */543},544},545{546.matches = {547DMI_MATCH(DMI_CHASSIS_TYPE, "14"), /* Sub-Notebook */548},549},550{ }551};552#endif553554static const struct dmi_system_id __initconst i8042_dmi_notimeout_table[] = {555{556/* Dell Vostro V13 */557.matches = {558DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),559DMI_MATCH(DMI_PRODUCT_NAME, "Vostro V13"),560},561},562{ }563};564565/*566* Some Wistron based laptops need us to explicitly enable the 'Dritek567* keyboard extension' to make their extra keys start generating scancodes.568* Originally, this was just confined to older laptops, but a few Acer laptops569* have turned up in 2007 that also need this again.570*/571static const struct dmi_system_id __initconst i8042_dmi_dritek_table[] = {572{573/* Acer Aspire 5100 */574.matches = {575DMI_MATCH(DMI_SYS_VENDOR, "Acer"),576DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5100"),577},578},579{580/* Acer Aspire 5610 */581.matches = {582DMI_MATCH(DMI_SYS_VENDOR, "Acer"),583DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5610"),584},585},586{587/* Acer Aspire 5630 */588.matches = {589DMI_MATCH(DMI_SYS_VENDOR, "Acer"),590DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5630"),591},592},593{594/* Acer Aspire 5650 */595.matches = {596DMI_MATCH(DMI_SYS_VENDOR, "Acer"),597DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5650"),598},599},600{601/* Acer Aspire 5680 */602.matches = {603DMI_MATCH(DMI_SYS_VENDOR, "Acer"),604DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5680"),605},606},607{608/* Acer Aspire 5720 */609.matches = {610DMI_MATCH(DMI_SYS_VENDOR, "Acer"),611DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5720"),612},613},614{615/* Acer Aspire 9110 */616.matches = {617DMI_MATCH(DMI_SYS_VENDOR, "Acer"),618DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 9110"),619},620},621{622/* Acer TravelMate 660 */623.matches = {624DMI_MATCH(DMI_SYS_VENDOR, "Acer"),625DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 660"),626},627},628{629/* Acer TravelMate 2490 */630.matches = {631DMI_MATCH(DMI_SYS_VENDOR, "Acer"),632DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 2490"),633},634},635{636/* Acer TravelMate 4280 */637.matches = {638DMI_MATCH(DMI_SYS_VENDOR, "Acer"),639DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 4280"),640},641},642{ }643};644645#endif /* CONFIG_X86 */646647#ifdef CONFIG_PNP648#include <linux/pnp.h>649650static bool i8042_pnp_kbd_registered;651static unsigned int i8042_pnp_kbd_devices;652static bool i8042_pnp_aux_registered;653static unsigned int i8042_pnp_aux_devices;654655static int i8042_pnp_command_reg;656static int i8042_pnp_data_reg;657static int i8042_pnp_kbd_irq;658static int i8042_pnp_aux_irq;659660static char i8042_pnp_kbd_name[32];661static char i8042_pnp_aux_name[32];662663static int i8042_pnp_kbd_probe(struct pnp_dev *dev, const struct pnp_device_id *did)664{665if (pnp_port_valid(dev, 0) && pnp_port_len(dev, 0) == 1)666i8042_pnp_data_reg = pnp_port_start(dev,0);667668if (pnp_port_valid(dev, 1) && pnp_port_len(dev, 1) == 1)669i8042_pnp_command_reg = pnp_port_start(dev, 1);670671if (pnp_irq_valid(dev,0))672i8042_pnp_kbd_irq = pnp_irq(dev, 0);673674strlcpy(i8042_pnp_kbd_name, did->id, sizeof(i8042_pnp_kbd_name));675if (strlen(pnp_dev_name(dev))) {676strlcat(i8042_pnp_kbd_name, ":", sizeof(i8042_pnp_kbd_name));677strlcat(i8042_pnp_kbd_name, pnp_dev_name(dev), sizeof(i8042_pnp_kbd_name));678}679680/* Keyboard ports are always supposed to be wakeup-enabled */681device_set_wakeup_enable(&dev->dev, true);682683i8042_pnp_kbd_devices++;684return 0;685}686687static int i8042_pnp_aux_probe(struct pnp_dev *dev, const struct pnp_device_id *did)688{689if (pnp_port_valid(dev, 0) && pnp_port_len(dev, 0) == 1)690i8042_pnp_data_reg = pnp_port_start(dev,0);691692if (pnp_port_valid(dev, 1) && pnp_port_len(dev, 1) == 1)693i8042_pnp_command_reg = pnp_port_start(dev, 1);694695if (pnp_irq_valid(dev, 0))696i8042_pnp_aux_irq = pnp_irq(dev, 0);697698strlcpy(i8042_pnp_aux_name, did->id, sizeof(i8042_pnp_aux_name));699if (strlen(pnp_dev_name(dev))) {700strlcat(i8042_pnp_aux_name, ":", sizeof(i8042_pnp_aux_name));701strlcat(i8042_pnp_aux_name, pnp_dev_name(dev), sizeof(i8042_pnp_aux_name));702}703704i8042_pnp_aux_devices++;705return 0;706}707708static struct pnp_device_id pnp_kbd_devids[] = {709{ .id = "PNP0300", .driver_data = 0 },710{ .id = "PNP0301", .driver_data = 0 },711{ .id = "PNP0302", .driver_data = 0 },712{ .id = "PNP0303", .driver_data = 0 },713{ .id = "PNP0304", .driver_data = 0 },714{ .id = "PNP0305", .driver_data = 0 },715{ .id = "PNP0306", .driver_data = 0 },716{ .id = "PNP0309", .driver_data = 0 },717{ .id = "PNP030a", .driver_data = 0 },718{ .id = "PNP030b", .driver_data = 0 },719{ .id = "PNP0320", .driver_data = 0 },720{ .id = "PNP0343", .driver_data = 0 },721{ .id = "PNP0344", .driver_data = 0 },722{ .id = "PNP0345", .driver_data = 0 },723{ .id = "CPQA0D7", .driver_data = 0 },724{ .id = "", },725};726727static struct pnp_driver i8042_pnp_kbd_driver = {728.name = "i8042 kbd",729.id_table = pnp_kbd_devids,730.probe = i8042_pnp_kbd_probe,731};732733static struct pnp_device_id pnp_aux_devids[] = {734{ .id = "AUI0200", .driver_data = 0 },735{ .id = "FJC6000", .driver_data = 0 },736{ .id = "FJC6001", .driver_data = 0 },737{ .id = "PNP0f03", .driver_data = 0 },738{ .id = "PNP0f0b", .driver_data = 0 },739{ .id = "PNP0f0e", .driver_data = 0 },740{ .id = "PNP0f12", .driver_data = 0 },741{ .id = "PNP0f13", .driver_data = 0 },742{ .id = "PNP0f19", .driver_data = 0 },743{ .id = "PNP0f1c", .driver_data = 0 },744{ .id = "SYN0801", .driver_data = 0 },745{ .id = "", },746};747748static struct pnp_driver i8042_pnp_aux_driver = {749.name = "i8042 aux",750.id_table = pnp_aux_devids,751.probe = i8042_pnp_aux_probe,752};753754static void i8042_pnp_exit(void)755{756if (i8042_pnp_kbd_registered) {757i8042_pnp_kbd_registered = false;758pnp_unregister_driver(&i8042_pnp_kbd_driver);759}760761if (i8042_pnp_aux_registered) {762i8042_pnp_aux_registered = false;763pnp_unregister_driver(&i8042_pnp_aux_driver);764}765}766767static int __init i8042_pnp_init(void)768{769char kbd_irq_str[4] = { 0 }, aux_irq_str[4] = { 0 };770bool pnp_data_busted = false;771int err;772773#ifdef CONFIG_X86774if (dmi_check_system(i8042_dmi_nopnp_table))775i8042_nopnp = true;776#endif777778if (i8042_nopnp) {779pr_info("PNP detection disabled\n");780return 0;781}782783err = pnp_register_driver(&i8042_pnp_kbd_driver);784if (!err)785i8042_pnp_kbd_registered = true;786787err = pnp_register_driver(&i8042_pnp_aux_driver);788if (!err)789i8042_pnp_aux_registered = true;790791if (!i8042_pnp_kbd_devices && !i8042_pnp_aux_devices) {792i8042_pnp_exit();793#if defined(__ia64__)794return -ENODEV;795#else796pr_info("PNP: No PS/2 controller found. Probing ports directly.\n");797return 0;798#endif799}800801if (i8042_pnp_kbd_devices)802snprintf(kbd_irq_str, sizeof(kbd_irq_str),803"%d", i8042_pnp_kbd_irq);804if (i8042_pnp_aux_devices)805snprintf(aux_irq_str, sizeof(aux_irq_str),806"%d", i8042_pnp_aux_irq);807808pr_info("PNP: PS/2 Controller [%s%s%s] at %#x,%#x irq %s%s%s\n",809i8042_pnp_kbd_name, (i8042_pnp_kbd_devices && i8042_pnp_aux_devices) ? "," : "",810i8042_pnp_aux_name,811i8042_pnp_data_reg, i8042_pnp_command_reg,812kbd_irq_str, (i8042_pnp_kbd_devices && i8042_pnp_aux_devices) ? "," : "",813aux_irq_str);814815#if defined(__ia64__)816if (!i8042_pnp_kbd_devices)817i8042_nokbd = true;818if (!i8042_pnp_aux_devices)819i8042_noaux = true;820#endif821822if (((i8042_pnp_data_reg & ~0xf) == (i8042_data_reg & ~0xf) &&823i8042_pnp_data_reg != i8042_data_reg) ||824!i8042_pnp_data_reg) {825pr_warn("PNP: PS/2 controller has invalid data port %#x; using default %#x\n",826i8042_pnp_data_reg, i8042_data_reg);827i8042_pnp_data_reg = i8042_data_reg;828pnp_data_busted = true;829}830831if (((i8042_pnp_command_reg & ~0xf) == (i8042_command_reg & ~0xf) &&832i8042_pnp_command_reg != i8042_command_reg) ||833!i8042_pnp_command_reg) {834pr_warn("PNP: PS/2 controller has invalid command port %#x; using default %#x\n",835i8042_pnp_command_reg, i8042_command_reg);836i8042_pnp_command_reg = i8042_command_reg;837pnp_data_busted = true;838}839840if (!i8042_nokbd && !i8042_pnp_kbd_irq) {841pr_warn("PNP: PS/2 controller doesn't have KBD irq; using default %d\n",842i8042_kbd_irq);843i8042_pnp_kbd_irq = i8042_kbd_irq;844pnp_data_busted = true;845}846847if (!i8042_noaux && !i8042_pnp_aux_irq) {848if (!pnp_data_busted && i8042_pnp_kbd_irq) {849pr_warn("PNP: PS/2 appears to have AUX port disabled, "850"if this is incorrect please boot with i8042.nopnp\n");851i8042_noaux = true;852} else {853pr_warn("PNP: PS/2 controller doesn't have AUX irq; using default %d\n",854i8042_aux_irq);855i8042_pnp_aux_irq = i8042_aux_irq;856}857}858859i8042_data_reg = i8042_pnp_data_reg;860i8042_command_reg = i8042_pnp_command_reg;861i8042_kbd_irq = i8042_pnp_kbd_irq;862i8042_aux_irq = i8042_pnp_aux_irq;863864#ifdef CONFIG_X86865i8042_bypass_aux_irq_test = !pnp_data_busted &&866dmi_check_system(i8042_dmi_laptop_table);867#endif868869return 0;870}871872#else873static inline int i8042_pnp_init(void) { return 0; }874static inline void i8042_pnp_exit(void) { }875#endif876877static int __init i8042_platform_init(void)878{879int retval;880881#ifdef CONFIG_X86882/* Just return if pre-detection shows no i8042 controller exist */883if (!x86_platform.i8042_detect())884return -ENODEV;885#endif886887/*888* On ix86 platforms touching the i8042 data register region can do really889* bad things. Because of this the region is always reserved on ix86 boxes.890*891* if (!request_region(I8042_DATA_REG, 16, "i8042"))892* return -EBUSY;893*/894895i8042_kbd_irq = I8042_MAP_IRQ(1);896i8042_aux_irq = I8042_MAP_IRQ(12);897898retval = i8042_pnp_init();899if (retval)900return retval;901902#if defined(__ia64__)903i8042_reset = true;904#endif905906#ifdef CONFIG_X86907if (dmi_check_system(i8042_dmi_reset_table))908i8042_reset = true;909910if (dmi_check_system(i8042_dmi_noloop_table))911i8042_noloop = true;912913if (dmi_check_system(i8042_dmi_nomux_table))914i8042_nomux = true;915916if (dmi_check_system(i8042_dmi_notimeout_table))917i8042_notimeout = true;918919if (dmi_check_system(i8042_dmi_dritek_table))920i8042_dritek = true;921#endif /* CONFIG_X86 */922923return retval;924}925926static inline void i8042_platform_exit(void)927{928i8042_pnp_exit();929}930931#endif /* _I8042_X86IA64IO_H */932933934