| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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> | 
| Arjan van de Ven | c4e32e9 | 2006-02-19 00:21:55 -0500 | [diff] [blame] | 21 | #include <linux/mutex.h> | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 22 | #include <linux/device.h> | 
|  | 23 | #include <linux/mod_devicetable.h> | 
|  | 24 |  | 
|  | 25 | struct serio { | 
|  | 26 | void *port_data; | 
|  | 27 |  | 
|  | 28 | char name[32]; | 
|  | 29 | char phys[32]; | 
|  | 30 |  | 
|  | 31 | unsigned int manual_bind; | 
|  | 32 |  | 
|  | 33 | struct serio_device_id id; | 
|  | 34 |  | 
|  | 35 | spinlock_t lock;		/* protects critical sections from port's interrupt handler */ | 
|  | 36 |  | 
|  | 37 | int (*write)(struct serio *, unsigned char); | 
|  | 38 | int (*open)(struct serio *); | 
|  | 39 | void (*close)(struct serio *); | 
|  | 40 | int (*start)(struct serio *); | 
|  | 41 | void (*stop)(struct serio *); | 
|  | 42 |  | 
|  | 43 | struct serio *parent, *child; | 
| Jiri Kosina | 88aa010 | 2006-10-11 01:45:31 -0400 | [diff] [blame] | 44 | unsigned int depth;		/* level of nesting in serio hierarchy */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 45 |  | 
|  | 46 | struct serio_driver *drv;	/* accessed from interrupt, must be protected by serio->lock and serio->sem */ | 
| Arjan van de Ven | c4e32e9 | 2006-02-19 00:21:55 -0500 | [diff] [blame] | 47 | struct mutex drv_mutex;		/* protects serio->drv so attributes can pin driver */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 48 |  | 
|  | 49 | struct device dev; | 
|  | 50 | unsigned int registered;	/* port has been fully registered with driver core */ | 
|  | 51 |  | 
|  | 52 | struct list_head node; | 
|  | 53 | }; | 
|  | 54 | #define to_serio_port(d)	container_of(d, struct serio, dev) | 
|  | 55 |  | 
|  | 56 | struct serio_driver { | 
|  | 57 | void *private; | 
|  | 58 | char *description; | 
|  | 59 |  | 
|  | 60 | struct serio_device_id *id_table; | 
|  | 61 | unsigned int manual_bind; | 
|  | 62 |  | 
|  | 63 | void (*write_wakeup)(struct serio *); | 
| David Howells | 7d12e78 | 2006-10-05 14:55:46 +0100 | [diff] [blame] | 64 | irqreturn_t (*interrupt)(struct serio *, unsigned char, unsigned int); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 65 | int  (*connect)(struct serio *, struct serio_driver *drv); | 
|  | 66 | int  (*reconnect)(struct serio *); | 
|  | 67 | void (*disconnect)(struct serio *); | 
|  | 68 | void (*cleanup)(struct serio *); | 
|  | 69 |  | 
|  | 70 | struct device_driver driver; | 
|  | 71 | }; | 
|  | 72 | #define to_serio_driver(d)	container_of(d, struct serio_driver, driver) | 
|  | 73 |  | 
|  | 74 | int serio_open(struct serio *serio, struct serio_driver *drv); | 
|  | 75 | void serio_close(struct serio *serio); | 
|  | 76 | void serio_rescan(struct serio *serio); | 
|  | 77 | void serio_reconnect(struct serio *serio); | 
| David Howells | 7d12e78 | 2006-10-05 14:55:46 +0100 | [diff] [blame] | 78 | irqreturn_t serio_interrupt(struct serio *serio, unsigned char data, unsigned int flags); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 79 |  | 
|  | 80 | void __serio_register_port(struct serio *serio, struct module *owner); | 
|  | 81 | static inline void serio_register_port(struct serio *serio) | 
|  | 82 | { | 
|  | 83 | __serio_register_port(serio, THIS_MODULE); | 
|  | 84 | } | 
|  | 85 |  | 
|  | 86 | void serio_unregister_port(struct serio *serio); | 
| Dmitry Torokhov | dbf4ccd | 2005-06-01 02:40:01 -0500 | [diff] [blame] | 87 | void serio_unregister_child_port(struct serio *serio); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 88 |  | 
| Greg Kroah-Hartman | 4b31562 | 2007-01-15 11:50:02 -0800 | [diff] [blame] | 89 | int __serio_register_driver(struct serio_driver *drv, struct module *owner, const char *mod_name); | 
|  | 90 | static inline int serio_register_driver(struct serio_driver *drv) | 
|  | 91 | { | 
|  | 92 | return __serio_register_driver(drv, THIS_MODULE, KBUILD_MODNAME); | 
|  | 93 | } | 
| Dmitry Torokhov | ed7b1f6 | 2006-11-23 23:34:49 -0500 | [diff] [blame] | 94 | int serio_register_driver(struct serio_driver *drv); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 95 | void serio_unregister_driver(struct serio_driver *drv); | 
|  | 96 |  | 
|  | 97 | static inline int serio_write(struct serio *serio, unsigned char data) | 
|  | 98 | { | 
|  | 99 | if (serio->write) | 
|  | 100 | return serio->write(serio, data); | 
|  | 101 | else | 
|  | 102 | return -1; | 
|  | 103 | } | 
|  | 104 |  | 
|  | 105 | static inline void serio_drv_write_wakeup(struct serio *serio) | 
|  | 106 | { | 
|  | 107 | if (serio->drv && serio->drv->write_wakeup) | 
|  | 108 | serio->drv->write_wakeup(serio); | 
|  | 109 | } | 
|  | 110 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 111 | /* | 
| Akinobu Mita | 0b28002 | 2006-03-26 01:38:58 -0800 | [diff] [blame] | 112 | * Use the following functions to manipulate serio's per-port | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 113 | * driver-specific data. | 
|  | 114 | */ | 
|  | 115 | static inline void *serio_get_drvdata(struct serio *serio) | 
|  | 116 | { | 
|  | 117 | return dev_get_drvdata(&serio->dev); | 
|  | 118 | } | 
|  | 119 |  | 
|  | 120 | static inline void serio_set_drvdata(struct serio *serio, void *data) | 
|  | 121 | { | 
|  | 122 | dev_set_drvdata(&serio->dev, data); | 
|  | 123 | } | 
|  | 124 |  | 
|  | 125 | /* | 
| Akinobu Mita | 0b28002 | 2006-03-26 01:38:58 -0800 | [diff] [blame] | 126 | * Use the following functions to protect critical sections in | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 127 | * driver code from port's interrupt handler | 
|  | 128 | */ | 
|  | 129 | static inline void serio_pause_rx(struct serio *serio) | 
|  | 130 | { | 
|  | 131 | spin_lock_irq(&serio->lock); | 
|  | 132 | } | 
|  | 133 |  | 
|  | 134 | static inline void serio_continue_rx(struct serio *serio) | 
|  | 135 | { | 
|  | 136 | spin_unlock_irq(&serio->lock); | 
|  | 137 | } | 
|  | 138 |  | 
|  | 139 | /* | 
| Akinobu Mita | 0b28002 | 2006-03-26 01:38:58 -0800 | [diff] [blame] | 140 | * Use the following functions to pin serio's driver in process context | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 141 | */ | 
|  | 142 | static inline int serio_pin_driver(struct serio *serio) | 
|  | 143 | { | 
| Arjan van de Ven | c4e32e9 | 2006-02-19 00:21:55 -0500 | [diff] [blame] | 144 | return mutex_lock_interruptible(&serio->drv_mutex); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 145 | } | 
|  | 146 |  | 
| Dmitry Torokhov | dbf4ccd | 2005-06-01 02:40:01 -0500 | [diff] [blame] | 147 | static inline void serio_pin_driver_uninterruptible(struct serio *serio) | 
|  | 148 | { | 
| Arjan van de Ven | c4e32e9 | 2006-02-19 00:21:55 -0500 | [diff] [blame] | 149 | mutex_lock(&serio->drv_mutex); | 
| Dmitry Torokhov | dbf4ccd | 2005-06-01 02:40:01 -0500 | [diff] [blame] | 150 | } | 
|  | 151 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 152 | static inline void serio_unpin_driver(struct serio *serio) | 
|  | 153 | { | 
| Arjan van de Ven | c4e32e9 | 2006-02-19 00:21:55 -0500 | [diff] [blame] | 154 | mutex_unlock(&serio->drv_mutex); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 155 | } | 
|  | 156 |  | 
|  | 157 |  | 
|  | 158 | #endif | 
|  | 159 |  | 
|  | 160 | /* | 
|  | 161 | * bit masks for use in "interrupt" flags (3rd argument) | 
|  | 162 | */ | 
|  | 163 | #define SERIO_TIMEOUT	1 | 
|  | 164 | #define SERIO_PARITY	2 | 
|  | 165 | #define SERIO_FRAME	4 | 
|  | 166 |  | 
|  | 167 | /* | 
|  | 168 | * Serio types | 
|  | 169 | */ | 
|  | 170 | #define SERIO_XT	0x00 | 
|  | 171 | #define SERIO_8042	0x01 | 
|  | 172 | #define SERIO_RS232	0x02 | 
|  | 173 | #define SERIO_HIL_MLC	0x03 | 
|  | 174 | #define SERIO_PS_PSTHRU	0x05 | 
|  | 175 | #define SERIO_8042_XL	0x06 | 
|  | 176 |  | 
|  | 177 | /* | 
|  | 178 | * Serio types | 
|  | 179 | */ | 
|  | 180 | #define SERIO_UNKNOWN	0x00 | 
|  | 181 | #define SERIO_MSC	0x01 | 
|  | 182 | #define SERIO_SUN	0x02 | 
|  | 183 | #define SERIO_MS	0x03 | 
|  | 184 | #define SERIO_MP	0x04 | 
|  | 185 | #define SERIO_MZ	0x05 | 
|  | 186 | #define SERIO_MZP	0x06 | 
|  | 187 | #define SERIO_MZPP	0x07 | 
|  | 188 | #define SERIO_VSXXXAA	0x08 | 
|  | 189 | #define SERIO_SUNKBD	0x10 | 
|  | 190 | #define SERIO_WARRIOR	0x18 | 
|  | 191 | #define SERIO_SPACEORB	0x19 | 
|  | 192 | #define SERIO_MAGELLAN	0x1a | 
|  | 193 | #define SERIO_SPACEBALL	0x1b | 
|  | 194 | #define SERIO_GUNZE	0x1c | 
|  | 195 | #define SERIO_IFORCE	0x1d | 
|  | 196 | #define SERIO_STINGER	0x1e | 
|  | 197 | #define SERIO_NEWTON	0x1f | 
|  | 198 | #define SERIO_STOWAWAY	0x20 | 
|  | 199 | #define SERIO_H3600	0x21 | 
|  | 200 | #define SERIO_PS2SER	0x22 | 
|  | 201 | #define SERIO_TWIDKBD	0x23 | 
|  | 202 | #define SERIO_TWIDJOY	0x24 | 
|  | 203 | #define SERIO_HIL	0x25 | 
|  | 204 | #define SERIO_SNES232	0x26 | 
|  | 205 | #define SERIO_SEMTECH	0x27 | 
|  | 206 | #define SERIO_LKKBD	0x28 | 
|  | 207 | #define SERIO_ELO	0x29 | 
|  | 208 | #define SERIO_MICROTOUCH	0x30 | 
| Rick Koch | ee47999 | 2006-08-05 00:32:18 -0400 | [diff] [blame] | 209 | #define SERIO_PENMOUNT	0x31 | 
| Rick Koch | 4003dff | 2006-08-05 00:32:24 -0400 | [diff] [blame] | 210 | #define SERIO_TOUCHRIGHT	0x32 | 
| Rick Koch | 11ea317 | 2006-08-05 00:32:30 -0400 | [diff] [blame] | 211 | #define SERIO_TOUCHWIN	0x33 | 
| Jean Delvare | b9cdad7 | 2007-07-12 14:12:31 +0200 | [diff] [blame] | 212 | #define SERIO_TAOSEVM	0x34 | 
| Dmitry Torokhov | 85f202d | 2007-07-18 00:37:01 -0400 | [diff] [blame] | 213 | #define SERIO_FUJITSU	0x35 | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 214 |  | 
|  | 215 | #endif |