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 441da177e4SLinus Torvalds struct serio *parent, *child; 4588aa0103SJiri Kosina unsigned int depth; /* level of nesting in serio hierarchy */ 461da177e4SLinus Torvalds 471da177e4SLinus Torvalds struct serio_driver *drv; /* accessed from interrupt, must be protected by serio->lock and serio->sem */ 48c4e32e9fSArjan van de Ven struct mutex drv_mutex; /* protects serio->drv so attributes can pin driver */ 491da177e4SLinus Torvalds 501da177e4SLinus Torvalds struct device dev; 511da177e4SLinus Torvalds 521da177e4SLinus Torvalds struct list_head node; 531da177e4SLinus Torvalds }; 541da177e4SLinus Torvalds #define to_serio_port(d) container_of(d, struct serio, dev) 551da177e4SLinus Torvalds 561da177e4SLinus Torvalds struct serio_driver { 571da177e4SLinus Torvalds void *private; 58*ceee4271SDmitry Torokhov const char *description; 591da177e4SLinus Torvalds 60*ceee4271SDmitry Torokhov const struct serio_device_id *id_table; 617e044e05SDmitry Torokhov bool manual_bind; 621da177e4SLinus Torvalds 631da177e4SLinus Torvalds void (*write_wakeup)(struct serio *); 647d12e780SDavid Howells irqreturn_t (*interrupt)(struct serio *, unsigned char, unsigned int); 651da177e4SLinus Torvalds int (*connect)(struct serio *, struct serio_driver *drv); 661da177e4SLinus Torvalds int (*reconnect)(struct serio *); 671da177e4SLinus Torvalds void (*disconnect)(struct serio *); 681da177e4SLinus Torvalds void (*cleanup)(struct serio *); 691da177e4SLinus Torvalds 701da177e4SLinus Torvalds struct device_driver driver; 711da177e4SLinus Torvalds }; 721da177e4SLinus Torvalds #define to_serio_driver(d) container_of(d, struct serio_driver, driver) 731da177e4SLinus Torvalds 741da177e4SLinus Torvalds int serio_open(struct serio *serio, struct serio_driver *drv); 751da177e4SLinus Torvalds void serio_close(struct serio *serio); 761da177e4SLinus Torvalds void serio_rescan(struct serio *serio); 771da177e4SLinus Torvalds void serio_reconnect(struct serio *serio); 787d12e780SDavid Howells irqreturn_t serio_interrupt(struct serio *serio, unsigned char data, unsigned int flags); 791da177e4SLinus Torvalds 801da177e4SLinus Torvalds void __serio_register_port(struct serio *serio, struct module *owner); 811da177e4SLinus Torvalds static inline void serio_register_port(struct serio *serio) 821da177e4SLinus Torvalds { 831da177e4SLinus Torvalds __serio_register_port(serio, THIS_MODULE); 841da177e4SLinus Torvalds } 851da177e4SLinus Torvalds 861da177e4SLinus Torvalds void serio_unregister_port(struct serio *serio); 87dbf4ccd6SDmitry Torokhov void serio_unregister_child_port(struct serio *serio); 881da177e4SLinus Torvalds 894b315627SGreg Kroah-Hartman int __serio_register_driver(struct serio_driver *drv, struct module *owner, const char *mod_name); 90a822bea7SDmitry Torokhov static inline int __must_check serio_register_driver(struct serio_driver *drv) 914b315627SGreg Kroah-Hartman { 924b315627SGreg Kroah-Hartman return __serio_register_driver(drv, THIS_MODULE, KBUILD_MODNAME); 934b315627SGreg Kroah-Hartman } 941da177e4SLinus Torvalds void serio_unregister_driver(struct serio_driver *drv); 951da177e4SLinus Torvalds 961da177e4SLinus Torvalds static inline int serio_write(struct serio *serio, unsigned char data) 971da177e4SLinus Torvalds { 981da177e4SLinus Torvalds if (serio->write) 991da177e4SLinus Torvalds return serio->write(serio, data); 1001da177e4SLinus Torvalds else 1011da177e4SLinus Torvalds return -1; 1021da177e4SLinus Torvalds } 1031da177e4SLinus Torvalds 1041da177e4SLinus Torvalds static inline void serio_drv_write_wakeup(struct serio *serio) 1051da177e4SLinus Torvalds { 1061da177e4SLinus Torvalds if (serio->drv && serio->drv->write_wakeup) 1071da177e4SLinus Torvalds serio->drv->write_wakeup(serio); 1081da177e4SLinus Torvalds } 1091da177e4SLinus Torvalds 1101da177e4SLinus Torvalds /* 1110b28002fSAkinobu Mita * Use the following functions to manipulate serio's per-port 1121da177e4SLinus Torvalds * driver-specific data. 1131da177e4SLinus Torvalds */ 1141da177e4SLinus Torvalds static inline void *serio_get_drvdata(struct serio *serio) 1151da177e4SLinus Torvalds { 1161da177e4SLinus Torvalds return dev_get_drvdata(&serio->dev); 1171da177e4SLinus Torvalds } 1181da177e4SLinus Torvalds 1191da177e4SLinus Torvalds static inline void serio_set_drvdata(struct serio *serio, void *data) 1201da177e4SLinus Torvalds { 1211da177e4SLinus Torvalds dev_set_drvdata(&serio->dev, data); 1221da177e4SLinus Torvalds } 1231da177e4SLinus Torvalds 1241da177e4SLinus Torvalds /* 1250b28002fSAkinobu Mita * Use the following functions to protect critical sections in 1261da177e4SLinus Torvalds * driver code from port's interrupt handler 1271da177e4SLinus Torvalds */ 1281da177e4SLinus Torvalds static inline void serio_pause_rx(struct serio *serio) 1291da177e4SLinus Torvalds { 1301da177e4SLinus Torvalds spin_lock_irq(&serio->lock); 1311da177e4SLinus Torvalds } 1321da177e4SLinus Torvalds 1331da177e4SLinus Torvalds static inline void serio_continue_rx(struct serio *serio) 1341da177e4SLinus Torvalds { 1351da177e4SLinus Torvalds spin_unlock_irq(&serio->lock); 1361da177e4SLinus Torvalds } 1371da177e4SLinus Torvalds 1381da177e4SLinus Torvalds #endif 1391da177e4SLinus Torvalds 1401da177e4SLinus Torvalds /* 1411da177e4SLinus Torvalds * bit masks for use in "interrupt" flags (3rd argument) 1421da177e4SLinus Torvalds */ 1431da177e4SLinus Torvalds #define SERIO_TIMEOUT 1 1441da177e4SLinus Torvalds #define SERIO_PARITY 2 1451da177e4SLinus Torvalds #define SERIO_FRAME 4 1461da177e4SLinus Torvalds 1471da177e4SLinus Torvalds /* 1481da177e4SLinus Torvalds * Serio types 1491da177e4SLinus Torvalds */ 1501da177e4SLinus Torvalds #define SERIO_XT 0x00 1511da177e4SLinus Torvalds #define SERIO_8042 0x01 1521da177e4SLinus Torvalds #define SERIO_RS232 0x02 1531da177e4SLinus Torvalds #define SERIO_HIL_MLC 0x03 1541da177e4SLinus Torvalds #define SERIO_PS_PSTHRU 0x05 1551da177e4SLinus Torvalds #define SERIO_8042_XL 0x06 1561da177e4SLinus Torvalds 1571da177e4SLinus Torvalds /* 158f3d1eb19SNiels de Vos * Serio protocols 1591da177e4SLinus Torvalds */ 1601da177e4SLinus Torvalds #define SERIO_UNKNOWN 0x00 1611da177e4SLinus Torvalds #define SERIO_MSC 0x01 1621da177e4SLinus Torvalds #define SERIO_SUN 0x02 1631da177e4SLinus Torvalds #define SERIO_MS 0x03 1641da177e4SLinus Torvalds #define SERIO_MP 0x04 1651da177e4SLinus Torvalds #define SERIO_MZ 0x05 1661da177e4SLinus Torvalds #define SERIO_MZP 0x06 1671da177e4SLinus Torvalds #define SERIO_MZPP 0x07 1681da177e4SLinus Torvalds #define SERIO_VSXXXAA 0x08 1691da177e4SLinus Torvalds #define SERIO_SUNKBD 0x10 1701da177e4SLinus Torvalds #define SERIO_WARRIOR 0x18 1711da177e4SLinus Torvalds #define SERIO_SPACEORB 0x19 1721da177e4SLinus Torvalds #define SERIO_MAGELLAN 0x1a 1731da177e4SLinus Torvalds #define SERIO_SPACEBALL 0x1b 1741da177e4SLinus Torvalds #define SERIO_GUNZE 0x1c 1751da177e4SLinus Torvalds #define SERIO_IFORCE 0x1d 1761da177e4SLinus Torvalds #define SERIO_STINGER 0x1e 1771da177e4SLinus Torvalds #define SERIO_NEWTON 0x1f 1781da177e4SLinus Torvalds #define SERIO_STOWAWAY 0x20 1791da177e4SLinus Torvalds #define SERIO_H3600 0x21 1801da177e4SLinus Torvalds #define SERIO_PS2SER 0x22 1811da177e4SLinus Torvalds #define SERIO_TWIDKBD 0x23 1821da177e4SLinus Torvalds #define SERIO_TWIDJOY 0x24 1831da177e4SLinus Torvalds #define SERIO_HIL 0x25 1841da177e4SLinus Torvalds #define SERIO_SNES232 0x26 1851da177e4SLinus Torvalds #define SERIO_SEMTECH 0x27 1861da177e4SLinus Torvalds #define SERIO_LKKBD 0x28 1871da177e4SLinus Torvalds #define SERIO_ELO 0x29 1881da177e4SLinus Torvalds #define SERIO_MICROTOUCH 0x30 189ee479999SRick Koch #define SERIO_PENMOUNT 0x31 1904003dff4SRick Koch #define SERIO_TOUCHRIGHT 0x32 19111ea3173SRick Koch #define SERIO_TOUCHWIN 0x33 192b9cdad74SJean Delvare #define SERIO_TAOSEVM 0x34 19385f202d5SDmitry Torokhov #define SERIO_FUJITSU 0x35 1943e24e2b5SMartin Kebert #define SERIO_ZHENHUA 0x36 1953cadd2d9SRichard Lemon #define SERIO_INEXIO 0x37 196ab96ddecSDmitry Torokhov #define SERIO_TOUCHIT213 0x38 1973eb1aa43SJaya Kumar #define SERIO_W8001 0x39 198a5f523bcSTias Guns #define SERIO_DYNAPRO 0x3a 199422dee56SAdam Bennett #define SERIO_HAMPSHIRE 0x3b 2001da177e4SLinus Torvalds 2011da177e4SLinus Torvalds #endif 202