diff options
Diffstat (limited to 'include/linux/serio.h')
-rw-r--r-- | include/linux/serio.h | 214 |
1 files changed, 214 insertions, 0 deletions
diff --git a/include/linux/serio.h b/include/linux/serio.h new file mode 100644 index 000000000000..a2d3b9ae06f4 --- /dev/null +++ b/include/linux/serio.h | |||
@@ -0,0 +1,214 @@ | |||
1 | #ifndef _SERIO_H | ||
2 | #define _SERIO_H | ||
3 | |||
4 | /* | ||
5 | * Copyright (C) 1999-2002 Vojtech Pavlik | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify it | ||
8 | * under the terms of the GNU General Public License version 2 as published by | ||
9 | * the Free Software Foundation. | ||
10 | */ | ||
11 | |||
12 | #include <linux/ioctl.h> | ||
13 | |||
14 | #define SPIOCSTYPE _IOW('q', 0x01, unsigned long) | ||
15 | |||
16 | #ifdef __KERNEL__ | ||
17 | |||
18 | #include <linux/interrupt.h> | ||
19 | #include <linux/list.h> | ||
20 | #include <linux/spinlock.h> | ||
21 | #include <linux/device.h> | ||
22 | #include <linux/mod_devicetable.h> | ||
23 | |||
24 | struct serio { | ||
25 | void *port_data; | ||
26 | |||
27 | char name[32]; | ||
28 | char phys[32]; | ||
29 | |||
30 | unsigned int manual_bind; | ||
31 | |||
32 | struct serio_device_id id; | ||
33 | |||
34 | spinlock_t lock; /* protects critical sections from port's interrupt handler */ | ||
35 | |||
36 | int (*write)(struct serio *, unsigned char); | ||
37 | int (*open)(struct serio *); | ||
38 | void (*close)(struct serio *); | ||
39 | int (*start)(struct serio *); | ||
40 | void (*stop)(struct serio *); | ||
41 | |||
42 | struct serio *parent, *child; | ||
43 | |||
44 | struct serio_driver *drv; /* accessed from interrupt, must be protected by serio->lock and serio->sem */ | ||
45 | struct semaphore drv_sem; /* protects serio->drv so attributes can pin driver */ | ||
46 | |||
47 | struct device dev; | ||
48 | unsigned int registered; /* port has been fully registered with driver core */ | ||
49 | |||
50 | struct list_head node; | ||
51 | }; | ||
52 | #define to_serio_port(d) container_of(d, struct serio, dev) | ||
53 | |||
54 | struct serio_driver { | ||
55 | void *private; | ||
56 | char *description; | ||
57 | |||
58 | struct serio_device_id *id_table; | ||
59 | unsigned int manual_bind; | ||
60 | |||
61 | void (*write_wakeup)(struct serio *); | ||
62 | irqreturn_t (*interrupt)(struct serio *, unsigned char, | ||
63 | unsigned int, struct pt_regs *); | ||
64 | int (*connect)(struct serio *, struct serio_driver *drv); | ||
65 | int (*reconnect)(struct serio *); | ||
66 | void (*disconnect)(struct serio *); | ||
67 | void (*cleanup)(struct serio *); | ||
68 | |||
69 | struct device_driver driver; | ||
70 | }; | ||
71 | #define to_serio_driver(d) container_of(d, struct serio_driver, driver) | ||
72 | |||
73 | int serio_open(struct serio *serio, struct serio_driver *drv); | ||
74 | void serio_close(struct serio *serio); | ||
75 | void serio_rescan(struct serio *serio); | ||
76 | void serio_reconnect(struct serio *serio); | ||
77 | irqreturn_t serio_interrupt(struct serio *serio, unsigned char data, unsigned int flags, struct pt_regs *regs); | ||
78 | |||
79 | void __serio_register_port(struct serio *serio, struct module *owner); | ||
80 | static inline void serio_register_port(struct serio *serio) | ||
81 | { | ||
82 | __serio_register_port(serio, THIS_MODULE); | ||
83 | } | ||
84 | |||
85 | void serio_unregister_port(struct serio *serio); | ||
86 | void __serio_unregister_port_delayed(struct serio *serio, struct module *owner); | ||
87 | static inline void serio_unregister_port_delayed(struct serio *serio) | ||
88 | { | ||
89 | __serio_unregister_port_delayed(serio, THIS_MODULE); | ||
90 | } | ||
91 | |||
92 | void __serio_register_driver(struct serio_driver *drv, struct module *owner); | ||
93 | static inline void serio_register_driver(struct serio_driver *drv) | ||
94 | { | ||
95 | __serio_register_driver(drv, THIS_MODULE); | ||
96 | } | ||
97 | |||
98 | void serio_unregister_driver(struct serio_driver *drv); | ||
99 | |||
100 | static inline int serio_write(struct serio *serio, unsigned char data) | ||
101 | { | ||
102 | if (serio->write) | ||
103 | return serio->write(serio, data); | ||
104 | else | ||
105 | return -1; | ||
106 | } | ||
107 | |||
108 | static inline void serio_drv_write_wakeup(struct serio *serio) | ||
109 | { | ||
110 | if (serio->drv && serio->drv->write_wakeup) | ||
111 | serio->drv->write_wakeup(serio); | ||
112 | } | ||
113 | |||
114 | static inline void serio_cleanup(struct serio *serio) | ||
115 | { | ||
116 | if (serio->drv && serio->drv->cleanup) | ||
117 | serio->drv->cleanup(serio); | ||
118 | } | ||
119 | |||
120 | /* | ||
121 | * Use the following fucntions to manipulate serio's per-port | ||
122 | * driver-specific data. | ||
123 | */ | ||
124 | static inline void *serio_get_drvdata(struct serio *serio) | ||
125 | { | ||
126 | return dev_get_drvdata(&serio->dev); | ||
127 | } | ||
128 | |||
129 | static inline void serio_set_drvdata(struct serio *serio, void *data) | ||
130 | { | ||
131 | dev_set_drvdata(&serio->dev, data); | ||
132 | } | ||
133 | |||
134 | /* | ||
135 | * Use the following fucntions to protect critical sections in | ||
136 | * driver code from port's interrupt handler | ||
137 | */ | ||
138 | static inline void serio_pause_rx(struct serio *serio) | ||
139 | { | ||
140 | spin_lock_irq(&serio->lock); | ||
141 | } | ||
142 | |||
143 | static inline void serio_continue_rx(struct serio *serio) | ||
144 | { | ||
145 | spin_unlock_irq(&serio->lock); | ||
146 | } | ||
147 | |||
148 | /* | ||
149 | * Use the following fucntions to pin serio's driver in process context | ||
150 | */ | ||
151 | static inline int serio_pin_driver(struct serio *serio) | ||
152 | { | ||
153 | return down_interruptible(&serio->drv_sem); | ||
154 | } | ||
155 | |||
156 | static inline void serio_unpin_driver(struct serio *serio) | ||
157 | { | ||
158 | up(&serio->drv_sem); | ||
159 | } | ||
160 | |||
161 | |||
162 | #endif | ||
163 | |||
164 | /* | ||
165 | * bit masks for use in "interrupt" flags (3rd argument) | ||
166 | */ | ||
167 | #define SERIO_TIMEOUT 1 | ||
168 | #define SERIO_PARITY 2 | ||
169 | #define SERIO_FRAME 4 | ||
170 | |||
171 | /* | ||
172 | * Serio types | ||
173 | */ | ||
174 | #define SERIO_XT 0x00 | ||
175 | #define SERIO_8042 0x01 | ||
176 | #define SERIO_RS232 0x02 | ||
177 | #define SERIO_HIL_MLC 0x03 | ||
178 | #define SERIO_PS_PSTHRU 0x05 | ||
179 | #define SERIO_8042_XL 0x06 | ||
180 | |||
181 | /* | ||
182 | * Serio types | ||
183 | */ | ||
184 | #define SERIO_UNKNOWN 0x00 | ||
185 | #define SERIO_MSC 0x01 | ||
186 | #define SERIO_SUN 0x02 | ||
187 | #define SERIO_MS 0x03 | ||
188 | #define SERIO_MP 0x04 | ||
189 | #define SERIO_MZ 0x05 | ||
190 | #define SERIO_MZP 0x06 | ||
191 | #define SERIO_MZPP 0x07 | ||
192 | #define SERIO_VSXXXAA 0x08 | ||
193 | #define SERIO_SUNKBD 0x10 | ||
194 | #define SERIO_WARRIOR 0x18 | ||
195 | #define SERIO_SPACEORB 0x19 | ||
196 | #define SERIO_MAGELLAN 0x1a | ||
197 | #define SERIO_SPACEBALL 0x1b | ||
198 | #define SERIO_GUNZE 0x1c | ||
199 | #define SERIO_IFORCE 0x1d | ||
200 | #define SERIO_STINGER 0x1e | ||
201 | #define SERIO_NEWTON 0x1f | ||
202 | #define SERIO_STOWAWAY 0x20 | ||
203 | #define SERIO_H3600 0x21 | ||
204 | #define SERIO_PS2SER 0x22 | ||
205 | #define SERIO_TWIDKBD 0x23 | ||
206 | #define SERIO_TWIDJOY 0x24 | ||
207 | #define SERIO_HIL 0x25 | ||
208 | #define SERIO_SNES232 0x26 | ||
209 | #define SERIO_SEMTECH 0x27 | ||
210 | #define SERIO_LKKBD 0x28 | ||
211 | #define SERIO_ELO 0x29 | ||
212 | #define SERIO_MICROTOUCH 0x30 | ||
213 | |||
214 | #endif | ||