1d2912cb1SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
21da177e4SLinus Torvalds /*
31da177e4SLinus Torvalds * Copyright (c) 1999-2002 Vojtech Pavlik
41da177e4SLinus Torvalds */
5607ca46eSDavid Howells #ifndef _GAMEPORT_H
6607ca46eSDavid Howells #define _GAMEPORT_H
71da177e4SLinus Torvalds
87e044e05SDmitry Torokhov #include <linux/types.h>
91da177e4SLinus Torvalds #include <linux/list.h>
10286295ebSArjan van de Ven #include <linux/mutex.h>
111da177e4SLinus Torvalds #include <linux/device.h>
124e57b681STim Schmielau #include <linux/timer.h>
135a0e3ad6STejun Heo #include <linux/slab.h>
14607ca46eSDavid Howells #include <uapi/linux/gameport.h>
151da177e4SLinus Torvalds
161da177e4SLinus Torvalds struct gameport {
171da177e4SLinus Torvalds
181da177e4SLinus Torvalds void *port_data; /* Private pointer for gameport drivers */
191da177e4SLinus Torvalds char name[32];
201da177e4SLinus Torvalds char phys[32];
211da177e4SLinus Torvalds
221da177e4SLinus Torvalds int io;
231da177e4SLinus Torvalds int speed;
241da177e4SLinus Torvalds int fuzz;
251da177e4SLinus Torvalds
261da177e4SLinus Torvalds void (*trigger)(struct gameport *);
271da177e4SLinus Torvalds unsigned char (*read)(struct gameport *);
281da177e4SLinus Torvalds int (*cooked_read)(struct gameport *, int *, int *);
291da177e4SLinus Torvalds int (*calibrate)(struct gameport *, int *, int *);
301da177e4SLinus Torvalds int (*open)(struct gameport *, int);
311da177e4SLinus Torvalds void (*close)(struct gameport *);
321da177e4SLinus Torvalds
331da177e4SLinus Torvalds struct timer_list poll_timer;
341da177e4SLinus Torvalds unsigned int poll_interval; /* in msecs */
351da177e4SLinus Torvalds spinlock_t timer_lock;
361da177e4SLinus Torvalds unsigned int poll_cnt;
371da177e4SLinus Torvalds void (*poll_handler)(struct gameport *);
381da177e4SLinus Torvalds
391da177e4SLinus Torvalds struct gameport *parent, *child;
401da177e4SLinus Torvalds
411da177e4SLinus Torvalds struct gameport_driver *drv;
42286295ebSArjan van de Ven struct mutex drv_mutex; /* protects serio->drv so attributes can pin driver */
431da177e4SLinus Torvalds
441da177e4SLinus Torvalds struct device dev;
451da177e4SLinus Torvalds
461da177e4SLinus Torvalds struct list_head node;
471da177e4SLinus Torvalds };
481da177e4SLinus Torvalds #define to_gameport_port(d) container_of(d, struct gameport, dev)
491da177e4SLinus Torvalds
501da177e4SLinus Torvalds struct gameport_driver {
5137b0bb11SDmitry Torokhov const char *description;
521da177e4SLinus Torvalds
531da177e4SLinus Torvalds int (*connect)(struct gameport *, struct gameport_driver *drv);
541da177e4SLinus Torvalds int (*reconnect)(struct gameport *);
551da177e4SLinus Torvalds void (*disconnect)(struct gameport *);
561da177e4SLinus Torvalds
571da177e4SLinus Torvalds struct device_driver driver;
581da177e4SLinus Torvalds
597e044e05SDmitry Torokhov bool ignore;
601da177e4SLinus Torvalds };
611da177e4SLinus Torvalds #define to_gameport_driver(d) container_of(d, struct gameport_driver, driver)
621da177e4SLinus Torvalds
631da177e4SLinus Torvalds int gameport_open(struct gameport *gameport, struct gameport_driver *drv, int mode);
641da177e4SLinus Torvalds void gameport_close(struct gameport *gameport);
651da177e4SLinus Torvalds
66*1680ac7aSDmitry Torokhov #if IS_REACHABLE(CONFIG_GAMEPORT)
67668d1e60SAdrian Bunk
681da177e4SLinus Torvalds void __gameport_register_port(struct gameport *gameport, struct module *owner);
69eb5589a8SPaul Gortmaker /* use a define to avoid include chaining to get THIS_MODULE */
70eb5589a8SPaul Gortmaker #define gameport_register_port(gameport) \
71eb5589a8SPaul Gortmaker __gameport_register_port(gameport, THIS_MODULE)
721da177e4SLinus Torvalds
731da177e4SLinus Torvalds void gameport_unregister_port(struct gameport *gameport);
741da177e4SLinus Torvalds
75b9075fa9SJoe Perches __printf(2, 3)
76b9075fa9SJoe Perches void gameport_set_phys(struct gameport *gameport, const char *fmt, ...);
77668d1e60SAdrian Bunk
78668d1e60SAdrian Bunk #else
79668d1e60SAdrian Bunk
gameport_register_port(struct gameport * gameport)80668d1e60SAdrian Bunk static inline void gameport_register_port(struct gameport *gameport)
81668d1e60SAdrian Bunk {
82668d1e60SAdrian Bunk return;
83668d1e60SAdrian Bunk }
84668d1e60SAdrian Bunk
gameport_unregister_port(struct gameport * gameport)85668d1e60SAdrian Bunk static inline void gameport_unregister_port(struct gameport *gameport)
86668d1e60SAdrian Bunk {
87668d1e60SAdrian Bunk return;
88668d1e60SAdrian Bunk }
89668d1e60SAdrian Bunk
90b9075fa9SJoe Perches static inline __printf(2, 3)
gameport_set_phys(struct gameport * gameport,const char * fmt,...)91b9075fa9SJoe Perches void gameport_set_phys(struct gameport *gameport, const char *fmt, ...)
92668d1e60SAdrian Bunk {
93668d1e60SAdrian Bunk return;
94668d1e60SAdrian Bunk }
95668d1e60SAdrian Bunk
96668d1e60SAdrian Bunk #endif
97668d1e60SAdrian Bunk
gameport_allocate_port(void)981da177e4SLinus Torvalds static inline struct gameport *gameport_allocate_port(void)
991da177e4SLinus Torvalds {
100cd861280SRobert P. J. Day struct gameport *gameport = kzalloc(sizeof(struct gameport), GFP_KERNEL);
1011da177e4SLinus Torvalds
1021da177e4SLinus Torvalds return gameport;
1031da177e4SLinus Torvalds }
1041da177e4SLinus Torvalds
gameport_free_port(struct gameport * gameport)1051da177e4SLinus Torvalds static inline void gameport_free_port(struct gameport *gameport)
1061da177e4SLinus Torvalds {
1071da177e4SLinus Torvalds kfree(gameport);
1081da177e4SLinus Torvalds }
1091da177e4SLinus Torvalds
gameport_set_name(struct gameport * gameport,const char * name)1101da177e4SLinus Torvalds static inline void gameport_set_name(struct gameport *gameport, const char *name)
1111da177e4SLinus Torvalds {
112a9da7251SWolfram Sang strscpy(gameport->name, name, sizeof(gameport->name));
1131da177e4SLinus Torvalds }
1141da177e4SLinus Torvalds
1151da177e4SLinus Torvalds /*
1160b28002fSAkinobu Mita * Use the following functions to manipulate gameport's per-port
1171da177e4SLinus Torvalds * driver-specific data.
1181da177e4SLinus Torvalds */
gameport_get_drvdata(struct gameport * gameport)1191da177e4SLinus Torvalds static inline void *gameport_get_drvdata(struct gameport *gameport)
1201da177e4SLinus Torvalds {
1211da177e4SLinus Torvalds return dev_get_drvdata(&gameport->dev);
1221da177e4SLinus Torvalds }
1231da177e4SLinus Torvalds
gameport_set_drvdata(struct gameport * gameport,void * data)1241da177e4SLinus Torvalds static inline void gameport_set_drvdata(struct gameport *gameport, void *data)
1251da177e4SLinus Torvalds {
1261da177e4SLinus Torvalds dev_set_drvdata(&gameport->dev, data);
1271da177e4SLinus Torvalds }
1281da177e4SLinus Torvalds
1291da177e4SLinus Torvalds /*
1300b28002fSAkinobu Mita * Use the following functions to pin gameport's driver in process context
1311da177e4SLinus Torvalds */
gameport_pin_driver(struct gameport * gameport)1321da177e4SLinus Torvalds static inline int gameport_pin_driver(struct gameport *gameport)
1331da177e4SLinus Torvalds {
134286295ebSArjan van de Ven return mutex_lock_interruptible(&gameport->drv_mutex);
1351da177e4SLinus Torvalds }
1361da177e4SLinus Torvalds
gameport_unpin_driver(struct gameport * gameport)1371da177e4SLinus Torvalds static inline void gameport_unpin_driver(struct gameport *gameport)
1381da177e4SLinus Torvalds {
139286295ebSArjan van de Ven mutex_unlock(&gameport->drv_mutex);
1401da177e4SLinus Torvalds }
1411da177e4SLinus Torvalds
142eb5589a8SPaul Gortmaker int __must_check __gameport_register_driver(struct gameport_driver *drv,
1436902c0beSDmitry Torokhov struct module *owner, const char *mod_name);
144eb5589a8SPaul Gortmaker
145eb5589a8SPaul Gortmaker /* use a define to avoid include chaining to get THIS_MODULE & friends */
146eb5589a8SPaul Gortmaker #define gameport_register_driver(drv) \
147eb5589a8SPaul Gortmaker __gameport_register_driver(drv, THIS_MODULE, KBUILD_MODNAME)
1481da177e4SLinus Torvalds
1491da177e4SLinus Torvalds void gameport_unregister_driver(struct gameport_driver *drv);
1501da177e4SLinus Torvalds
15145b2604eSAxel Lin /**
15245b2604eSAxel Lin * module_gameport_driver() - Helper macro for registering a gameport driver
15345b2604eSAxel Lin * @__gameport_driver: gameport_driver struct
15445b2604eSAxel Lin *
15545b2604eSAxel Lin * Helper macro for gameport drivers which do not do anything special in
15645b2604eSAxel Lin * module init/exit. This eliminates a lot of boilerplate. Each module may
15745b2604eSAxel Lin * only use this macro once, and calling it replaces module_init() and
15845b2604eSAxel Lin * module_exit().
15945b2604eSAxel Lin */
16045b2604eSAxel Lin #define module_gameport_driver(__gameport_driver) \
16145b2604eSAxel Lin module_driver(__gameport_driver, gameport_register_driver, \
16245b2604eSAxel Lin gameport_unregister_driver)
16345b2604eSAxel Lin
16425478bb2SDavid Woodhouse
gameport_trigger(struct gameport * gameport)1651da177e4SLinus Torvalds static inline void gameport_trigger(struct gameport *gameport)
1661da177e4SLinus Torvalds {
1671da177e4SLinus Torvalds gameport->trigger(gameport);
1681da177e4SLinus Torvalds }
1691da177e4SLinus Torvalds
gameport_read(struct gameport * gameport)1701da177e4SLinus Torvalds static inline unsigned char gameport_read(struct gameport *gameport)
1711da177e4SLinus Torvalds {
1721da177e4SLinus Torvalds return gameport->read(gameport);
1731da177e4SLinus Torvalds }
1741da177e4SLinus Torvalds
gameport_cooked_read(struct gameport * gameport,int * axes,int * buttons)1751da177e4SLinus Torvalds static inline int gameport_cooked_read(struct gameport *gameport, int *axes, int *buttons)
1761da177e4SLinus Torvalds {
1771da177e4SLinus Torvalds if (gameport->cooked_read)
1781da177e4SLinus Torvalds return gameport->cooked_read(gameport, axes, buttons);
1791da177e4SLinus Torvalds else
1801da177e4SLinus Torvalds return -1;
1811da177e4SLinus Torvalds }
1821da177e4SLinus Torvalds
gameport_calibrate(struct gameport * gameport,int * axes,int * max)1831da177e4SLinus Torvalds static inline int gameport_calibrate(struct gameport *gameport, int *axes, int *max)
1841da177e4SLinus Torvalds {
1851da177e4SLinus Torvalds if (gameport->calibrate)
1861da177e4SLinus Torvalds return gameport->calibrate(gameport, axes, max);
1871da177e4SLinus Torvalds else
1881da177e4SLinus Torvalds return -1;
1891da177e4SLinus Torvalds }
1901da177e4SLinus Torvalds
gameport_time(struct gameport * gameport,int time)1911da177e4SLinus Torvalds static inline int gameport_time(struct gameport *gameport, int time)
1921da177e4SLinus Torvalds {
1931da177e4SLinus Torvalds return (time * gameport->speed) / 1000;
1941da177e4SLinus Torvalds }
1951da177e4SLinus Torvalds
gameport_set_poll_handler(struct gameport * gameport,void (* handler)(struct gameport *))1961da177e4SLinus Torvalds static inline void gameport_set_poll_handler(struct gameport *gameport, void (*handler)(struct gameport *))
1971da177e4SLinus Torvalds {
1981da177e4SLinus Torvalds gameport->poll_handler = handler;
1991da177e4SLinus Torvalds }
2001da177e4SLinus Torvalds
gameport_set_poll_interval(struct gameport * gameport,unsigned int msecs)2011da177e4SLinus Torvalds static inline void gameport_set_poll_interval(struct gameport *gameport, unsigned int msecs)
2021da177e4SLinus Torvalds {
2031da177e4SLinus Torvalds gameport->poll_interval = msecs;
2041da177e4SLinus Torvalds }
2051da177e4SLinus Torvalds
2061da177e4SLinus Torvalds void gameport_start_polling(struct gameport *gameport);
2071da177e4SLinus Torvalds void gameport_stop_polling(struct gameport *gameport);
2081da177e4SLinus Torvalds
2091da177e4SLinus Torvalds #endif
210