diff options
| author | Vojtech Pavlik <vojtech@suse.cz> | 2004-09-16 19:10:08 +0200 |
|---|---|---|
| committer | Vojtech Pavlik <vojtech@suse.cz> | 2004-09-16 19:10:08 +0200 |
| commit | a21165ce22bea18419fc20f2b58b392680453ff4 (patch) | |
| tree | e35a63a15ae5861cd93175f9bee84722c1a86c1e /include/linux/serio.h | |
| parent | 5c5b9c24188adf7a37ad51844910f2dea4d0dfab (diff) | |
| parent | 8718a604d60d615845e9d6bacd7107f795560694 (diff) | |
Merge suse.cz:/data2/bk/linus into suse.cz:/data2/bk/input
Diffstat (limited to 'include/linux/serio.h')
| -rw-r--r-- | include/linux/serio.h | 66 |
1 files changed, 49 insertions, 17 deletions
diff --git a/include/linux/serio.h b/include/linux/serio.h index be0ccba864c6..f84b362a561f 100644 --- a/include/linux/serio.h +++ b/include/linux/serio.h @@ -17,12 +17,17 @@ #ifdef __KERNEL__ #include <linux/list.h> +#include <linux/spinlock.h> +#include <linux/device.h> struct serio { void *private; - void *driver; - char *name; - char *phys; + void *port_data; + + char name[32]; + char phys[32]; + + unsigned int manual_bind; unsigned short idbus; unsigned short idvendor; @@ -32,31 +37,43 @@ struct serio { unsigned long type; unsigned long event; + spinlock_t lock; /* protects critical sections from port's interrupt handler */ + int (*write)(struct serio *, unsigned char); int (*open)(struct serio *); void (*close)(struct serio *); - struct serio_dev *dev; + struct serio *parent, *child; + + struct serio_driver *drv; /* accessed from interrupt, must be protected by serio->lock */ + + struct device dev; struct list_head node; }; +#define to_serio_port(d) container_of(d, struct serio, dev) -struct serio_dev { +struct serio_driver { void *private; - char *name; + char *description; + + unsigned int manual_bind; void (*write_wakeup)(struct serio *); irqreturn_t (*interrupt)(struct serio *, unsigned char, unsigned int, struct pt_regs *); - void (*connect)(struct serio *, struct serio_dev *dev); + void (*connect)(struct serio *, struct serio_driver *drv); int (*reconnect)(struct serio *); void (*disconnect)(struct serio *); void (*cleanup)(struct serio *); + struct device_driver driver; + struct list_head node; }; +#define to_serio_driver(d) container_of(d, struct serio_driver, driver) -int serio_open(struct serio *serio, struct serio_dev *dev); +int serio_open(struct serio *serio, struct serio_driver *drv); void serio_close(struct serio *serio); void serio_rescan(struct serio *serio); void serio_reconnect(struct serio *serio); @@ -64,12 +81,11 @@ irqreturn_t serio_interrupt(struct serio *serio, unsigned char data, unsigned in void serio_register_port(struct serio *serio); void serio_register_port_delayed(struct serio *serio); -void __serio_register_port(struct serio *serio); void serio_unregister_port(struct serio *serio); void serio_unregister_port_delayed(struct serio *serio); -void __serio_unregister_port(struct serio *serio); -void serio_register_device(struct serio_dev *dev); -void serio_unregister_device(struct serio_dev *dev); + +void serio_register_driver(struct serio_driver *drv); +void serio_unregister_driver(struct serio_driver *drv); static __inline__ int serio_write(struct serio *serio, unsigned char data) { @@ -79,18 +95,34 @@ static __inline__ int serio_write(struct serio *serio, unsigned char data) return -1; } -static __inline__ void serio_dev_write_wakeup(struct serio *serio) +static __inline__ void serio_drv_write_wakeup(struct serio *serio) { - if (serio->dev && serio->dev->write_wakeup) - serio->dev->write_wakeup(serio); + if (serio->drv && serio->drv->write_wakeup) + serio->drv->write_wakeup(serio); } static __inline__ void serio_cleanup(struct serio *serio) { - if (serio->dev && serio->dev->cleanup) - serio->dev->cleanup(serio); + if (serio->drv && serio->drv->cleanup) + serio->drv->cleanup(serio); +} + + +/* + * Use the following fucntions to protect critical sections in + * driver code from port's interrupt handler + */ +static __inline__ void serio_pause_rx(struct serio *serio) +{ + spin_lock_irq(&serio->lock); } +static __inline__ void serio_continue_rx(struct serio *serio) +{ + spin_unlock_irq(&serio->lock); +} + + #endif /* |
