11da177e4SLinus Torvalds #ifndef _SERIO_H 21da177e4SLinus Torvalds #define _SERIO_H 31da177e4SLinus Torvalds 41da177e4SLinus Torvalds /* 51da177e4SLinus Torvalds * Copyright (C) 1999-2002 Vojtech Pavlik 61da177e4SLinus Torvalds * 71da177e4SLinus Torvalds * This program is free software; you can redistribute it and/or modify it 81da177e4SLinus Torvalds * under the terms of the GNU General Public License version 2 as published by 91da177e4SLinus Torvalds * the Free Software Foundation. 101da177e4SLinus Torvalds */ 111da177e4SLinus Torvalds 121da177e4SLinus Torvalds #include <linux/ioctl.h> 131da177e4SLinus Torvalds 141da177e4SLinus Torvalds #define SPIOCSTYPE _IOW('q', 0x01, unsigned long) 151da177e4SLinus Torvalds 161da177e4SLinus Torvalds #ifdef __KERNEL__ 171da177e4SLinus Torvalds 187e044e05SDmitry Torokhov #include <linux/types.h> 191da177e4SLinus Torvalds #include <linux/interrupt.h> 201da177e4SLinus Torvalds #include <linux/list.h> 211da177e4SLinus Torvalds #include <linux/spinlock.h> 22c4e32e9fSArjan van de Ven #include <linux/mutex.h> 231da177e4SLinus Torvalds #include <linux/device.h> 241da177e4SLinus Torvalds #include <linux/mod_devicetable.h> 251da177e4SLinus Torvalds 261da177e4SLinus Torvalds struct serio { 271da177e4SLinus Torvalds void *port_data; 281da177e4SLinus Torvalds 291da177e4SLinus Torvalds char name[32]; 301da177e4SLinus Torvalds char phys[32]; 311da177e4SLinus Torvalds 327e044e05SDmitry Torokhov bool manual_bind; 331da177e4SLinus Torvalds 341da177e4SLinus Torvalds struct serio_device_id id; 351da177e4SLinus Torvalds 361da177e4SLinus Torvalds spinlock_t lock; /* protects critical sections from port's interrupt handler */ 371da177e4SLinus Torvalds 381da177e4SLinus Torvalds int (*write)(struct serio *, unsigned char); 391da177e4SLinus Torvalds int (*open)(struct serio *); 401da177e4SLinus Torvalds void (*close)(struct serio *); 411da177e4SLinus Torvalds int (*start)(struct serio *); 421da177e4SLinus Torvalds void (*stop)(struct serio *); 431da177e4SLinus Torvalds 4409822582SDmitry Eremin-Solenikov struct serio *parent; 4509822582SDmitry Eremin-Solenikov struct list_head child_node; /* Entry in parent->children list */ 4609822582SDmitry Eremin-Solenikov struct list_head children; 4788aa0103SJiri Kosina unsigned int depth; /* level of nesting in serio hierarchy */ 481da177e4SLinus Torvalds 491da177e4SLinus Torvalds struct serio_driver *drv; /* accessed from interrupt, must be protected by serio->lock and serio->sem */ 50c4e32e9fSArjan van de Ven struct mutex drv_mutex; /* protects serio->drv so attributes can pin driver */ 511da177e4SLinus Torvalds 521da177e4SLinus Torvalds struct device dev; 531da177e4SLinus Torvalds 541da177e4SLinus Torvalds struct list_head node; 551da177e4SLinus Torvalds }; 561da177e4SLinus Torvalds #define to_serio_port(d) container_of(d, struct serio, dev) 571da177e4SLinus Torvalds 581da177e4SLinus Torvalds struct serio_driver { 59ceee4271SDmitry Torokhov const char *description; 601da177e4SLinus Torvalds 61ceee4271SDmitry Torokhov const struct serio_device_id *id_table; 627e044e05SDmitry Torokhov bool manual_bind; 631da177e4SLinus Torvalds 641da177e4SLinus Torvalds void (*write_wakeup)(struct serio *); 657d12e780SDavid Howells irqreturn_t (*interrupt)(struct serio *, unsigned char, unsigned int); 661da177e4SLinus Torvalds int (*connect)(struct serio *, struct serio_driver *drv); 671da177e4SLinus Torvalds int (*reconnect)(struct serio *); 681da177e4SLinus Torvalds void (*disconnect)(struct serio *); 691da177e4SLinus Torvalds void (*cleanup)(struct serio *); 701da177e4SLinus Torvalds 711da177e4SLinus Torvalds struct device_driver driver; 721da177e4SLinus Torvalds }; 731da177e4SLinus Torvalds #define to_serio_driver(d) container_of(d, struct serio_driver, driver) 741da177e4SLinus Torvalds 751da177e4SLinus Torvalds int serio_open(struct serio *serio, struct serio_driver *drv); 761da177e4SLinus Torvalds void serio_close(struct serio *serio); 771da177e4SLinus Torvalds void serio_rescan(struct serio *serio); 781da177e4SLinus Torvalds void serio_reconnect(struct serio *serio); 797d12e780SDavid Howells irqreturn_t serio_interrupt(struct serio *serio, unsigned char data, unsigned int flags); 801da177e4SLinus Torvalds 811da177e4SLinus Torvalds void __serio_register_port(struct serio *serio, struct module *owner); 82eb5589a8SPaul Gortmaker 83eb5589a8SPaul Gortmaker /* use a define to avoid include chaining to get THIS_MODULE */ 84eb5589a8SPaul Gortmaker #define serio_register_port(serio) \ 85eb5589a8SPaul Gortmaker __serio_register_port(serio, THIS_MODULE) 861da177e4SLinus Torvalds 871da177e4SLinus Torvalds void serio_unregister_port(struct serio *serio); 88dbf4ccd6SDmitry Torokhov void serio_unregister_child_port(struct serio *serio); 891da177e4SLinus Torvalds 90eb5589a8SPaul Gortmaker int __must_check __serio_register_driver(struct serio_driver *drv, 91eb5589a8SPaul Gortmaker struct module *owner, const char *mod_name); 92eb5589a8SPaul Gortmaker 93eb5589a8SPaul Gortmaker /* use a define to avoid include chaining to get THIS_MODULE & friends */ 94eb5589a8SPaul Gortmaker #define serio_register_driver(drv) \ 95eb5589a8SPaul Gortmaker __serio_register_driver(drv, THIS_MODULE, KBUILD_MODNAME) 96eb5589a8SPaul Gortmaker 971da177e4SLinus Torvalds void serio_unregister_driver(struct serio_driver *drv); 981da177e4SLinus Torvalds 99*fa7f86d1SAxel Lin /** 100*fa7f86d1SAxel Lin * module_serio_driver() - Helper macro for registering a serio driver 101*fa7f86d1SAxel Lin * @__serio_driver: serio_driver struct 102*fa7f86d1SAxel Lin * 103*fa7f86d1SAxel Lin * Helper macro for serio drivers which do not do anything special in 104*fa7f86d1SAxel Lin * module init/exit. This eliminates a lot of boilerplate. Each module 105*fa7f86d1SAxel Lin * may only use this macro once, and calling it replaces module_init() 106*fa7f86d1SAxel Lin * and module_exit(). 107*fa7f86d1SAxel Lin */ 108*fa7f86d1SAxel Lin #define module_serio_driver(__serio_driver) \ 109*fa7f86d1SAxel Lin module_driver(__serio_driver, serio_register_driver, \ 110*fa7f86d1SAxel Lin serio_unregister_driver) 111*fa7f86d1SAxel Lin 1121da177e4SLinus Torvalds static inline int serio_write(struct serio *serio, unsigned char data) 1131da177e4SLinus Torvalds { 1141da177e4SLinus Torvalds if (serio->write) 1151da177e4SLinus Torvalds return serio->write(serio, data); 1161da177e4SLinus Torvalds else 1171da177e4SLinus Torvalds return -1; 1181da177e4SLinus Torvalds } 1191da177e4SLinus Torvalds 1201da177e4SLinus Torvalds static inline void serio_drv_write_wakeup(struct serio *serio) 1211da177e4SLinus Torvalds { 1221da177e4SLinus Torvalds if (serio->drv && serio->drv->write_wakeup) 1231da177e4SLinus Torvalds serio->drv->write_wakeup(serio); 1241da177e4SLinus Torvalds } 1251da177e4SLinus Torvalds 1261da177e4SLinus Torvalds /* 1270b28002fSAkinobu Mita * Use the following functions to manipulate serio's per-port 1281da177e4SLinus Torvalds * driver-specific data. 1291da177e4SLinus Torvalds */ 1301da177e4SLinus Torvalds static inline void *serio_get_drvdata(struct serio *serio) 1311da177e4SLinus Torvalds { 1321da177e4SLinus Torvalds return dev_get_drvdata(&serio->dev); 1331da177e4SLinus Torvalds } 1341da177e4SLinus Torvalds 1351da177e4SLinus Torvalds static inline void serio_set_drvdata(struct serio *serio, void *data) 1361da177e4SLinus Torvalds { 1371da177e4SLinus Torvalds dev_set_drvdata(&serio->dev, data); 1381da177e4SLinus Torvalds } 1391da177e4SLinus Torvalds 1401da177e4SLinus Torvalds /* 1410b28002fSAkinobu Mita * Use the following functions to protect critical sections in 1421da177e4SLinus Torvalds * driver code from port's interrupt handler 1431da177e4SLinus Torvalds */ 1441da177e4SLinus Torvalds static inline void serio_pause_rx(struct serio *serio) 1451da177e4SLinus Torvalds { 1461da177e4SLinus Torvalds spin_lock_irq(&serio->lock); 1471da177e4SLinus Torvalds } 1481da177e4SLinus Torvalds 1491da177e4SLinus Torvalds static inline void serio_continue_rx(struct serio *serio) 1501da177e4SLinus Torvalds { 1511da177e4SLinus Torvalds spin_unlock_irq(&serio->lock); 1521da177e4SLinus Torvalds } 1531da177e4SLinus Torvalds 1541da177e4SLinus Torvalds #endif 1551da177e4SLinus Torvalds 1561da177e4SLinus Torvalds /* 1571da177e4SLinus Torvalds * bit masks for use in "interrupt" flags (3rd argument) 1581da177e4SLinus Torvalds */ 1591da177e4SLinus Torvalds #define SERIO_TIMEOUT 1 1601da177e4SLinus Torvalds #define SERIO_PARITY 2 1611da177e4SLinus Torvalds #define SERIO_FRAME 4 1621da177e4SLinus Torvalds 1631da177e4SLinus Torvalds /* 1641da177e4SLinus Torvalds * Serio types 1651da177e4SLinus Torvalds */ 1661da177e4SLinus Torvalds #define SERIO_XT 0x00 1671da177e4SLinus Torvalds #define SERIO_8042 0x01 1681da177e4SLinus Torvalds #define SERIO_RS232 0x02 1691da177e4SLinus Torvalds #define SERIO_HIL_MLC 0x03 1701da177e4SLinus Torvalds #define SERIO_PS_PSTHRU 0x05 1711da177e4SLinus Torvalds #define SERIO_8042_XL 0x06 1721da177e4SLinus Torvalds 1731da177e4SLinus Torvalds /* 174f3d1eb19SNiels de Vos * Serio protocols 1751da177e4SLinus Torvalds */ 1761da177e4SLinus Torvalds #define SERIO_UNKNOWN 0x00 1771da177e4SLinus Torvalds #define SERIO_MSC 0x01 1781da177e4SLinus Torvalds #define SERIO_SUN 0x02 1791da177e4SLinus Torvalds #define SERIO_MS 0x03 1801da177e4SLinus Torvalds #define SERIO_MP 0x04 1811da177e4SLinus Torvalds #define SERIO_MZ 0x05 1821da177e4SLinus Torvalds #define SERIO_MZP 0x06 1831da177e4SLinus Torvalds #define SERIO_MZPP 0x07 1841da177e4SLinus Torvalds #define SERIO_VSXXXAA 0x08 1851da177e4SLinus Torvalds #define SERIO_SUNKBD 0x10 1861da177e4SLinus Torvalds #define SERIO_WARRIOR 0x18 1871da177e4SLinus Torvalds #define SERIO_SPACEORB 0x19 1881da177e4SLinus Torvalds #define SERIO_MAGELLAN 0x1a 1891da177e4SLinus Torvalds #define SERIO_SPACEBALL 0x1b 1901da177e4SLinus Torvalds #define SERIO_GUNZE 0x1c 1911da177e4SLinus Torvalds #define SERIO_IFORCE 0x1d 1921da177e4SLinus Torvalds #define SERIO_STINGER 0x1e 1931da177e4SLinus Torvalds #define SERIO_NEWTON 0x1f 1941da177e4SLinus Torvalds #define SERIO_STOWAWAY 0x20 1951da177e4SLinus Torvalds #define SERIO_H3600 0x21 1961da177e4SLinus Torvalds #define SERIO_PS2SER 0x22 1971da177e4SLinus Torvalds #define SERIO_TWIDKBD 0x23 1981da177e4SLinus Torvalds #define SERIO_TWIDJOY 0x24 1991da177e4SLinus Torvalds #define SERIO_HIL 0x25 2001da177e4SLinus Torvalds #define SERIO_SNES232 0x26 2011da177e4SLinus Torvalds #define SERIO_SEMTECH 0x27 2021da177e4SLinus Torvalds #define SERIO_LKKBD 0x28 2031da177e4SLinus Torvalds #define SERIO_ELO 0x29 2041da177e4SLinus Torvalds #define SERIO_MICROTOUCH 0x30 205ee479999SRick Koch #define SERIO_PENMOUNT 0x31 2064003dff4SRick Koch #define SERIO_TOUCHRIGHT 0x32 20711ea3173SRick Koch #define SERIO_TOUCHWIN 0x33 208b9cdad74SJean Delvare #define SERIO_TAOSEVM 0x34 20985f202d5SDmitry Torokhov #define SERIO_FUJITSU 0x35 2103e24e2b5SMartin Kebert #define SERIO_ZHENHUA 0x36 2113cadd2d9SRichard Lemon #define SERIO_INEXIO 0x37 212ab96ddecSDmitry Torokhov #define SERIO_TOUCHIT213 0x38 2133eb1aa43SJaya Kumar #define SERIO_W8001 0x39 214a5f523bcSTias Guns #define SERIO_DYNAPRO 0x3a 215422dee56SAdam Bennett #define SERIO_HAMPSHIRE 0x3b 216fc58d12bSDmitry Eremin-Solenikov #define SERIO_PS2MULT 0x3c 217f01536e3SSebastian Andrzej Siewior #define SERIO_TSC40 0x3d 2181da177e4SLinus Torvalds 2191da177e4SLinus Torvalds #endif 220