xref: /linux/drivers/input/serio/i8042-io.h (revision c532de5a67a70f8533d495f8f2aaa9a0491c3ad0)
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 #ifndef _I8042_IO_H
3 #define _I8042_IO_H
4 
5 
6 /*
7  * Names.
8  */
9 
10 #define I8042_KBD_PHYS_DESC "isa0060/serio0"
11 #define I8042_AUX_PHYS_DESC "isa0060/serio1"
12 #define I8042_MUX_PHYS_DESC "isa0060/serio%d"
13 
14 /*
15  * IRQs.
16  */
17 
18 #if defined(__arm__)
19 /* defined in include/asm-arm/arch-xxx/irqs.h */
20 #include <asm/irq.h>
21 #elif defined(CONFIG_PPC)
22 extern int of_i8042_kbd_irq;
23 extern int of_i8042_aux_irq;
24 # define I8042_KBD_IRQ  of_i8042_kbd_irq
25 # define I8042_AUX_IRQ  of_i8042_aux_irq
26 #else
27 # define I8042_KBD_IRQ	1
28 # define I8042_AUX_IRQ	12
29 #endif
30 
31 
32 /*
33  * Register numbers.
34  */
35 
36 #define I8042_COMMAND_REG	0x64
37 #define I8042_STATUS_REG	0x64
38 #define I8042_DATA_REG		0x60
39 
40 static inline int i8042_read_data(void)
41 {
42 	return inb(I8042_DATA_REG);
43 }
44 
45 static inline int i8042_read_status(void)
46 {
47 	return inb(I8042_STATUS_REG);
48 }
49 
50 static inline void i8042_write_data(int val)
51 {
52 	outb(val, I8042_DATA_REG);
53 }
54 
55 static inline void i8042_write_command(int val)
56 {
57 	outb(val, I8042_COMMAND_REG);
58 }
59 
60 static inline int i8042_platform_init(void)
61 {
62 /*
63  * On some platforms touching the i8042 data register region can do really
64  * bad things. Because of this the region is always reserved on such boxes.
65  */
66 #if defined(CONFIG_PPC)
67 	if (check_legacy_ioport(I8042_DATA_REG))
68 		return -ENODEV;
69 #endif
70 #if !defined(__sh__) && !defined(__alpha__)
71 	if (!request_region(I8042_DATA_REG, 16, "i8042"))
72 		return -EBUSY;
73 #endif
74 
75 	i8042_reset = I8042_RESET_ALWAYS;
76 	return 0;
77 }
78 
79 static inline void i8042_platform_exit(void)
80 {
81 #if !defined(__sh__) && !defined(__alpha__)
82 	release_region(I8042_DATA_REG, 16);
83 #endif
84 }
85 
86 #endif /* _I8042_IO_H */
87