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 44*09822582SDmitry Eremin-Solenikov struct serio *parent; 45*09822582SDmitry Eremin-Solenikov struct list_head child_node; /* Entry in parent->children list */ 46*09822582SDmitry 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); 821da177e4SLinus Torvalds static inline void serio_register_port(struct serio *serio) 831da177e4SLinus Torvalds { 841da177e4SLinus Torvalds __serio_register_port(serio, THIS_MODULE); 851da177e4SLinus Torvalds } 861da177e4SLinus Torvalds 871da177e4SLinus Torvalds void serio_unregister_port(struct serio *serio); 88dbf4ccd6SDmitry Torokhov void serio_unregister_child_port(struct serio *serio); 891da177e4SLinus Torvalds 904b315627SGreg Kroah-Hartman int __serio_register_driver(struct serio_driver *drv, struct module *owner, const char *mod_name); 91a822bea7SDmitry Torokhov static inline int __must_check serio_register_driver(struct serio_driver *drv) 924b315627SGreg Kroah-Hartman { 934b315627SGreg Kroah-Hartman return __serio_register_driver(drv, THIS_MODULE, KBUILD_MODNAME); 944b315627SGreg Kroah-Hartman } 951da177e4SLinus Torvalds void serio_unregister_driver(struct serio_driver *drv); 961da177e4SLinus Torvalds 971da177e4SLinus Torvalds static inline int serio_write(struct serio *serio, unsigned char data) 981da177e4SLinus Torvalds { 991da177e4SLinus Torvalds if (serio->write) 1001da177e4SLinus Torvalds return serio->write(serio, data); 1011da177e4SLinus Torvalds else 1021da177e4SLinus Torvalds return -1; 1031da177e4SLinus Torvalds } 1041da177e4SLinus Torvalds 1051da177e4SLinus Torvalds static inline void serio_drv_write_wakeup(struct serio *serio) 1061da177e4SLinus Torvalds { 1071da177e4SLinus Torvalds if (serio->drv && serio->drv->write_wakeup) 1081da177e4SLinus Torvalds serio->drv->write_wakeup(serio); 1091da177e4SLinus Torvalds } 1101da177e4SLinus Torvalds 1111da177e4SLinus Torvalds /* 1120b28002fSAkinobu Mita * Use the following functions to manipulate serio's per-port 1131da177e4SLinus Torvalds * driver-specific data. 1141da177e4SLinus Torvalds */ 1151da177e4SLinus Torvalds static inline void *serio_get_drvdata(struct serio *serio) 1161da177e4SLinus Torvalds { 1171da177e4SLinus Torvalds return dev_get_drvdata(&serio->dev); 1181da177e4SLinus Torvalds } 1191da177e4SLinus Torvalds 1201da177e4SLinus Torvalds static inline void serio_set_drvdata(struct serio *serio, void *data) 1211da177e4SLinus Torvalds { 1221da177e4SLinus Torvalds dev_set_drvdata(&serio->dev, data); 1231da177e4SLinus Torvalds } 1241da177e4SLinus Torvalds 1251da177e4SLinus Torvalds /* 1260b28002fSAkinobu Mita * Use the following functions to protect critical sections in 1271da177e4SLinus Torvalds * driver code from port's interrupt handler 1281da177e4SLinus Torvalds */ 1291da177e4SLinus Torvalds static inline void serio_pause_rx(struct serio *serio) 1301da177e4SLinus Torvalds { 1311da177e4SLinus Torvalds spin_lock_irq(&serio->lock); 1321da177e4SLinus Torvalds } 1331da177e4SLinus Torvalds 1341da177e4SLinus Torvalds static inline void serio_continue_rx(struct serio *serio) 1351da177e4SLinus Torvalds { 1361da177e4SLinus Torvalds spin_unlock_irq(&serio->lock); 1371da177e4SLinus Torvalds } 1381da177e4SLinus Torvalds 1391da177e4SLinus Torvalds #endif 1401da177e4SLinus Torvalds 1411da177e4SLinus Torvalds /* 1421da177e4SLinus Torvalds * bit masks for use in "interrupt" flags (3rd argument) 1431da177e4SLinus Torvalds */ 1441da177e4SLinus Torvalds #define SERIO_TIMEOUT 1 1451da177e4SLinus Torvalds #define SERIO_PARITY 2 1461da177e4SLinus Torvalds #define SERIO_FRAME 4 1471da177e4SLinus Torvalds 1481da177e4SLinus Torvalds /* 1491da177e4SLinus Torvalds * Serio types 1501da177e4SLinus Torvalds */ 1511da177e4SLinus Torvalds #define SERIO_XT 0x00 1521da177e4SLinus Torvalds #define SERIO_8042 0x01 1531da177e4SLinus Torvalds #define SERIO_RS232 0x02 1541da177e4SLinus Torvalds #define SERIO_HIL_MLC 0x03 1551da177e4SLinus Torvalds #define SERIO_PS_PSTHRU 0x05 1561da177e4SLinus Torvalds #define SERIO_8042_XL 0x06 1571da177e4SLinus Torvalds 1581da177e4SLinus Torvalds /* 159f3d1eb19SNiels de Vos * Serio protocols 1601da177e4SLinus Torvalds */ 1611da177e4SLinus Torvalds #define SERIO_UNKNOWN 0x00 1621da177e4SLinus Torvalds #define SERIO_MSC 0x01 1631da177e4SLinus Torvalds #define SERIO_SUN 0x02 1641da177e4SLinus Torvalds #define SERIO_MS 0x03 1651da177e4SLinus Torvalds #define SERIO_MP 0x04 1661da177e4SLinus Torvalds #define SERIO_MZ 0x05 1671da177e4SLinus Torvalds #define SERIO_MZP 0x06 1681da177e4SLinus Torvalds #define SERIO_MZPP 0x07 1691da177e4SLinus Torvalds #define SERIO_VSXXXAA 0x08 1701da177e4SLinus Torvalds #define SERIO_SUNKBD 0x10 1711da177e4SLinus Torvalds #define SERIO_WARRIOR 0x18 1721da177e4SLinus Torvalds #define SERIO_SPACEORB 0x19 1731da177e4SLinus Torvalds #define SERIO_MAGELLAN 0x1a 1741da177e4SLinus Torvalds #define SERIO_SPACEBALL 0x1b 1751da177e4SLinus Torvalds #define SERIO_GUNZE 0x1c 1761da177e4SLinus Torvalds #define SERIO_IFORCE 0x1d 1771da177e4SLinus Torvalds #define SERIO_STINGER 0x1e 1781da177e4SLinus Torvalds #define SERIO_NEWTON 0x1f 1791da177e4SLinus Torvalds #define SERIO_STOWAWAY 0x20 1801da177e4SLinus Torvalds #define SERIO_H3600 0x21 1811da177e4SLinus Torvalds #define SERIO_PS2SER 0x22 1821da177e4SLinus Torvalds #define SERIO_TWIDKBD 0x23 1831da177e4SLinus Torvalds #define SERIO_TWIDJOY 0x24 1841da177e4SLinus Torvalds #define SERIO_HIL 0x25 1851da177e4SLinus Torvalds #define SERIO_SNES232 0x26 1861da177e4SLinus Torvalds #define SERIO_SEMTECH 0x27 1871da177e4SLinus Torvalds #define SERIO_LKKBD 0x28 1881da177e4SLinus Torvalds #define SERIO_ELO 0x29 1891da177e4SLinus Torvalds #define SERIO_MICROTOUCH 0x30 190ee479999SRick Koch #define SERIO_PENMOUNT 0x31 1914003dff4SRick Koch #define SERIO_TOUCHRIGHT 0x32 19211ea3173SRick Koch #define SERIO_TOUCHWIN 0x33 193b9cdad74SJean Delvare #define SERIO_TAOSEVM 0x34 19485f202d5SDmitry Torokhov #define SERIO_FUJITSU 0x35 1953e24e2b5SMartin Kebert #define SERIO_ZHENHUA 0x36 1963cadd2d9SRichard Lemon #define SERIO_INEXIO 0x37 197ab96ddecSDmitry Torokhov #define SERIO_TOUCHIT213 0x38 1983eb1aa43SJaya Kumar #define SERIO_W8001 0x39 199a5f523bcSTias Guns #define SERIO_DYNAPRO 0x3a 200422dee56SAdam Bennett #define SERIO_HAMPSHIRE 0x3b 2011da177e4SLinus Torvalds 2021da177e4SLinus Torvalds #endif 203