xref: /openbmc/linux/include/linux/gameport.h (revision 1680ac7a)
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