1 #ifndef _I8042_X86IA64IO_H
2 #define _I8042_X86IA64IO_H
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.
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"
23 # define I8042_MAP_IRQ(x) isa_irq_to_vector((x))
25 # define I8042_MAP_IRQ(x) (x)
28 #define I8042_KBD_IRQ i8042_kbd_irq
29 #define I8042_AUX_IRQ i8042_aux_irq
31 static int i8042_kbd_irq;
32 static int i8042_aux_irq;
38 #define I8042_COMMAND_REG i8042_command_reg
39 #define I8042_STATUS_REG i8042_command_reg
40 #define I8042_DATA_REG i8042_data_reg
42 static int i8042_command_reg = 0x64;
43 static int i8042_data_reg = 0x60;
46 static inline int i8042_read_data(void)
48 return inb(I8042_DATA_REG);
51 static inline int i8042_read_status(void)
53 return inb(I8042_STATUS_REG);
56 static inline void i8042_write_data(int val)
58 outb(val, I8042_DATA_REG);
61 static inline void i8042_write_command(int val)
63 outb(val, I8042_COMMAND_REG);
68 #include <linux/dmi.h>
70 static struct dmi_system_id __initdata i8042_dmi_table[] = {
72 .ident = "Compaq Proliant 8500",
74 DMI_MATCH(DMI_SYS_VENDOR, "Compaq"),
75 DMI_MATCH(DMI_PRODUCT_NAME , "ProLiant"),
76 DMI_MATCH(DMI_PRODUCT_VERSION, "8500"),
80 .ident = "Compaq Proliant DL760",
82 DMI_MATCH(DMI_SYS_VENDOR, "Compaq"),
83 DMI_MATCH(DMI_PRODUCT_NAME , "ProLiant"),
84 DMI_MATCH(DMI_PRODUCT_VERSION, "DL760"),
91 #if defined(__ia64__) && defined(CONFIG_ACPI)
92 #include <linux/acpi.h>
93 #include <acpi/acpi_bus.h>
95 struct i8042_acpi_resources {
101 static int i8042_acpi_kbd_registered;
102 static int i8042_acpi_aux_registered;
104 static acpi_status i8042_acpi_parse_resource(struct acpi_resource *res, void *data)
106 struct i8042_acpi_resources *i8042_res = data;
107 struct acpi_resource_io *io;
108 struct acpi_resource_fixed_io *fixed_io;
109 struct acpi_resource_irq *irq;
110 struct acpi_resource_ext_irq *ext_irq;
115 if (io->range_length) {
116 if (!i8042_res->port1)
117 i8042_res->port1 = io->min_base_address;
119 i8042_res->port2 = io->min_base_address;
123 case ACPI_RSTYPE_FIXED_IO:
124 fixed_io = &res->data.fixed_io;
125 if (fixed_io->range_length) {
126 if (!i8042_res->port1)
127 i8042_res->port1 = fixed_io->base_address;
129 i8042_res->port2 = fixed_io->base_address;
133 case ACPI_RSTYPE_IRQ:
134 irq = &res->data.irq;
135 if (irq->number_of_interrupts > 0)
137 acpi_register_gsi(irq->interrupts[0],
139 irq->active_high_low);
142 case ACPI_RSTYPE_EXT_IRQ:
143 ext_irq = &res->data.extended_irq;
144 if (ext_irq->number_of_interrupts > 0)
146 acpi_register_gsi(ext_irq->interrupts[0],
148 ext_irq->active_high_low);
154 static int i8042_acpi_kbd_add(struct acpi_device *device)
156 struct i8042_acpi_resources kbd_res;
159 memset(&kbd_res, 0, sizeof(kbd_res));
160 status = acpi_walk_resources(device->handle, METHOD_NAME__CRS,
161 i8042_acpi_parse_resource, &kbd_res);
162 if (ACPI_FAILURE(status))
166 i8042_data_reg = kbd_res.port1;
168 printk(KERN_WARNING "ACPI: [%s] has no data port; default is 0x%x\n",
169 acpi_device_bid(device), i8042_data_reg);
172 i8042_command_reg = kbd_res.port2;
174 printk(KERN_WARNING "ACPI: [%s] has no command port; default is 0x%x\n",
175 acpi_device_bid(device), i8042_command_reg);
178 i8042_kbd_irq = kbd_res.irq;
180 printk(KERN_WARNING "ACPI: [%s] has no IRQ; default is %d\n",
181 acpi_device_bid(device), i8042_kbd_irq);
183 strncpy(acpi_device_name(device), "PS/2 Keyboard Controller",
184 sizeof(acpi_device_name(device)));
185 printk("ACPI: %s [%s] at I/O 0x%x, 0x%x, irq %d\n",
186 acpi_device_name(device), acpi_device_bid(device),
187 i8042_data_reg, i8042_command_reg, i8042_kbd_irq);
192 static int i8042_acpi_aux_add(struct acpi_device *device)
194 struct i8042_acpi_resources aux_res;
197 memset(&aux_res, 0, sizeof(aux_res));
198 status = acpi_walk_resources(device->handle, METHOD_NAME__CRS,
199 i8042_acpi_parse_resource, &aux_res);
200 if (ACPI_FAILURE(status))
204 i8042_aux_irq = aux_res.irq;
206 printk(KERN_WARNING "ACPI: [%s] has no IRQ; default is %d\n",
207 acpi_device_bid(device), i8042_aux_irq);
209 strncpy(acpi_device_name(device), "PS/2 Mouse Controller",
210 sizeof(acpi_device_name(device)));
211 printk("ACPI: %s [%s] at irq %d\n",
212 acpi_device_name(device), acpi_device_bid(device), i8042_aux_irq);
217 static struct acpi_driver i8042_acpi_kbd_driver = {
219 .ids = "PNP0303,PNP030B",
221 .add = i8042_acpi_kbd_add,
225 static struct acpi_driver i8042_acpi_aux_driver = {
227 .ids = "PNP0F03,PNP0F0B,PNP0F0E,PNP0F12,PNP0F13,SYN0801",
229 .add = i8042_acpi_aux_add,
233 static int i8042_acpi_init(void)
237 if (acpi_disabled || i8042_noacpi) {
238 printk("i8042: ACPI detection disabled\n");
242 result = acpi_bus_register_driver(&i8042_acpi_kbd_driver);
247 acpi_bus_unregister_driver(&i8042_acpi_kbd_driver);
250 i8042_acpi_kbd_registered = 1;
252 result = acpi_bus_register_driver(&i8042_acpi_aux_driver);
254 i8042_acpi_aux_registered = 1;
261 static void i8042_acpi_exit(void)
263 if (i8042_acpi_kbd_registered)
264 acpi_bus_unregister_driver(&i8042_acpi_kbd_driver);
266 if (i8042_acpi_aux_registered)
267 acpi_bus_unregister_driver(&i8042_acpi_aux_driver);
271 static inline int i8042_platform_init(void)
274 * On ix86 platforms touching the i8042 data register region can do really
275 * bad things. Because of this the region is always reserved on ix86 boxes.
277 * if (!request_region(I8042_DATA_REG, 16, "i8042"))
281 i8042_kbd_irq = I8042_MAP_IRQ(1);
282 i8042_aux_irq = I8042_MAP_IRQ(12);
284 #if defined(__ia64__) && defined(CONFIG_ACPI)
285 if (i8042_acpi_init())
289 #if defined(__ia64__)
293 #if defined(__i386__)
294 if (dmi_check_system(i8042_dmi_table))
301 static inline void i8042_platform_exit(void)
303 #if defined(__ia64__) && defined(CONFIG_ACPI)
308 #endif /* _I8042_X86IA64IO_H */