xref: /OK3568_Linux_fs/kernel/include/linux/gameport.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  *  Copyright (c) 1999-2002 Vojtech Pavlik
4*4882a593Smuzhiyun  */
5*4882a593Smuzhiyun #ifndef _GAMEPORT_H
6*4882a593Smuzhiyun #define _GAMEPORT_H
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun #include <asm/io.h>
9*4882a593Smuzhiyun #include <linux/types.h>
10*4882a593Smuzhiyun #include <linux/list.h>
11*4882a593Smuzhiyun #include <linux/mutex.h>
12*4882a593Smuzhiyun #include <linux/device.h>
13*4882a593Smuzhiyun #include <linux/timer.h>
14*4882a593Smuzhiyun #include <linux/slab.h>
15*4882a593Smuzhiyun #include <uapi/linux/gameport.h>
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun struct gameport {
18*4882a593Smuzhiyun 
19*4882a593Smuzhiyun 	void *port_data;	/* Private pointer for gameport drivers */
20*4882a593Smuzhiyun 	char name[32];
21*4882a593Smuzhiyun 	char phys[32];
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun 	int io;
24*4882a593Smuzhiyun 	int speed;
25*4882a593Smuzhiyun 	int fuzz;
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun 	void (*trigger)(struct gameport *);
28*4882a593Smuzhiyun 	unsigned char (*read)(struct gameport *);
29*4882a593Smuzhiyun 	int (*cooked_read)(struct gameport *, int *, int *);
30*4882a593Smuzhiyun 	int (*calibrate)(struct gameport *, int *, int *);
31*4882a593Smuzhiyun 	int (*open)(struct gameport *, int);
32*4882a593Smuzhiyun 	void (*close)(struct gameport *);
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun 	struct timer_list poll_timer;
35*4882a593Smuzhiyun 	unsigned int poll_interval;	/* in msecs */
36*4882a593Smuzhiyun 	spinlock_t timer_lock;
37*4882a593Smuzhiyun 	unsigned int poll_cnt;
38*4882a593Smuzhiyun 	void (*poll_handler)(struct gameport *);
39*4882a593Smuzhiyun 
40*4882a593Smuzhiyun 	struct gameport *parent, *child;
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun 	struct gameport_driver *drv;
43*4882a593Smuzhiyun 	struct mutex drv_mutex;		/* protects serio->drv so attributes can pin driver */
44*4882a593Smuzhiyun 
45*4882a593Smuzhiyun 	struct device dev;
46*4882a593Smuzhiyun 
47*4882a593Smuzhiyun 	struct list_head node;
48*4882a593Smuzhiyun };
49*4882a593Smuzhiyun #define to_gameport_port(d)	container_of(d, struct gameport, dev)
50*4882a593Smuzhiyun 
51*4882a593Smuzhiyun struct gameport_driver {
52*4882a593Smuzhiyun 	const char *description;
53*4882a593Smuzhiyun 
54*4882a593Smuzhiyun 	int (*connect)(struct gameport *, struct gameport_driver *drv);
55*4882a593Smuzhiyun 	int (*reconnect)(struct gameport *);
56*4882a593Smuzhiyun 	void (*disconnect)(struct gameport *);
57*4882a593Smuzhiyun 
58*4882a593Smuzhiyun 	struct device_driver driver;
59*4882a593Smuzhiyun 
60*4882a593Smuzhiyun 	bool ignore;
61*4882a593Smuzhiyun };
62*4882a593Smuzhiyun #define to_gameport_driver(d)	container_of(d, struct gameport_driver, driver)
63*4882a593Smuzhiyun 
64*4882a593Smuzhiyun int gameport_open(struct gameport *gameport, struct gameport_driver *drv, int mode);
65*4882a593Smuzhiyun void gameport_close(struct gameport *gameport);
66*4882a593Smuzhiyun 
67*4882a593Smuzhiyun #if defined(CONFIG_GAMEPORT) || (defined(MODULE) && defined(CONFIG_GAMEPORT_MODULE))
68*4882a593Smuzhiyun 
69*4882a593Smuzhiyun void __gameport_register_port(struct gameport *gameport, struct module *owner);
70*4882a593Smuzhiyun /* use a define to avoid include chaining to get THIS_MODULE */
71*4882a593Smuzhiyun #define gameport_register_port(gameport) \
72*4882a593Smuzhiyun 	__gameport_register_port(gameport, THIS_MODULE)
73*4882a593Smuzhiyun 
74*4882a593Smuzhiyun void gameport_unregister_port(struct gameport *gameport);
75*4882a593Smuzhiyun 
76*4882a593Smuzhiyun __printf(2, 3)
77*4882a593Smuzhiyun void gameport_set_phys(struct gameport *gameport, const char *fmt, ...);
78*4882a593Smuzhiyun 
79*4882a593Smuzhiyun #else
80*4882a593Smuzhiyun 
gameport_register_port(struct gameport * gameport)81*4882a593Smuzhiyun static inline void gameport_register_port(struct gameport *gameport)
82*4882a593Smuzhiyun {
83*4882a593Smuzhiyun 	return;
84*4882a593Smuzhiyun }
85*4882a593Smuzhiyun 
gameport_unregister_port(struct gameport * gameport)86*4882a593Smuzhiyun static inline void gameport_unregister_port(struct gameport *gameport)
87*4882a593Smuzhiyun {
88*4882a593Smuzhiyun 	return;
89*4882a593Smuzhiyun }
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun static inline __printf(2, 3)
gameport_set_phys(struct gameport * gameport,const char * fmt,...)92*4882a593Smuzhiyun void gameport_set_phys(struct gameport *gameport, const char *fmt, ...)
93*4882a593Smuzhiyun {
94*4882a593Smuzhiyun 	return;
95*4882a593Smuzhiyun }
96*4882a593Smuzhiyun 
97*4882a593Smuzhiyun #endif
98*4882a593Smuzhiyun 
gameport_allocate_port(void)99*4882a593Smuzhiyun static inline struct gameport *gameport_allocate_port(void)
100*4882a593Smuzhiyun {
101*4882a593Smuzhiyun 	struct gameport *gameport = kzalloc(sizeof(struct gameport), GFP_KERNEL);
102*4882a593Smuzhiyun 
103*4882a593Smuzhiyun 	return gameport;
104*4882a593Smuzhiyun }
105*4882a593Smuzhiyun 
gameport_free_port(struct gameport * gameport)106*4882a593Smuzhiyun static inline void gameport_free_port(struct gameport *gameport)
107*4882a593Smuzhiyun {
108*4882a593Smuzhiyun 	kfree(gameport);
109*4882a593Smuzhiyun }
110*4882a593Smuzhiyun 
gameport_set_name(struct gameport * gameport,const char * name)111*4882a593Smuzhiyun static inline void gameport_set_name(struct gameport *gameport, const char *name)
112*4882a593Smuzhiyun {
113*4882a593Smuzhiyun 	strlcpy(gameport->name, name, sizeof(gameport->name));
114*4882a593Smuzhiyun }
115*4882a593Smuzhiyun 
116*4882a593Smuzhiyun /*
117*4882a593Smuzhiyun  * Use the following functions to manipulate gameport's per-port
118*4882a593Smuzhiyun  * driver-specific data.
119*4882a593Smuzhiyun  */
gameport_get_drvdata(struct gameport * gameport)120*4882a593Smuzhiyun static inline void *gameport_get_drvdata(struct gameport *gameport)
121*4882a593Smuzhiyun {
122*4882a593Smuzhiyun 	return dev_get_drvdata(&gameport->dev);
123*4882a593Smuzhiyun }
124*4882a593Smuzhiyun 
gameport_set_drvdata(struct gameport * gameport,void * data)125*4882a593Smuzhiyun static inline void gameport_set_drvdata(struct gameport *gameport, void *data)
126*4882a593Smuzhiyun {
127*4882a593Smuzhiyun 	dev_set_drvdata(&gameport->dev, data);
128*4882a593Smuzhiyun }
129*4882a593Smuzhiyun 
130*4882a593Smuzhiyun /*
131*4882a593Smuzhiyun  * Use the following functions to pin gameport's driver in process context
132*4882a593Smuzhiyun  */
gameport_pin_driver(struct gameport * gameport)133*4882a593Smuzhiyun static inline int gameport_pin_driver(struct gameport *gameport)
134*4882a593Smuzhiyun {
135*4882a593Smuzhiyun 	return mutex_lock_interruptible(&gameport->drv_mutex);
136*4882a593Smuzhiyun }
137*4882a593Smuzhiyun 
gameport_unpin_driver(struct gameport * gameport)138*4882a593Smuzhiyun static inline void gameport_unpin_driver(struct gameport *gameport)
139*4882a593Smuzhiyun {
140*4882a593Smuzhiyun 	mutex_unlock(&gameport->drv_mutex);
141*4882a593Smuzhiyun }
142*4882a593Smuzhiyun 
143*4882a593Smuzhiyun int __must_check __gameport_register_driver(struct gameport_driver *drv,
144*4882a593Smuzhiyun 				struct module *owner, const char *mod_name);
145*4882a593Smuzhiyun 
146*4882a593Smuzhiyun /* use a define to avoid include chaining to get THIS_MODULE & friends */
147*4882a593Smuzhiyun #define gameport_register_driver(drv) \
148*4882a593Smuzhiyun 	__gameport_register_driver(drv, THIS_MODULE, KBUILD_MODNAME)
149*4882a593Smuzhiyun 
150*4882a593Smuzhiyun void gameport_unregister_driver(struct gameport_driver *drv);
151*4882a593Smuzhiyun 
152*4882a593Smuzhiyun /**
153*4882a593Smuzhiyun  * module_gameport_driver() - Helper macro for registering a gameport driver
154*4882a593Smuzhiyun  * @__gameport_driver: gameport_driver struct
155*4882a593Smuzhiyun  *
156*4882a593Smuzhiyun  * Helper macro for gameport drivers which do not do anything special in
157*4882a593Smuzhiyun  * module init/exit. This eliminates a lot of boilerplate. Each module may
158*4882a593Smuzhiyun  * only use this macro once, and calling it replaces module_init() and
159*4882a593Smuzhiyun  * module_exit().
160*4882a593Smuzhiyun  */
161*4882a593Smuzhiyun #define module_gameport_driver(__gameport_driver) \
162*4882a593Smuzhiyun 	module_driver(__gameport_driver, gameport_register_driver, \
163*4882a593Smuzhiyun 		       gameport_unregister_driver)
164*4882a593Smuzhiyun 
165*4882a593Smuzhiyun 
gameport_trigger(struct gameport * gameport)166*4882a593Smuzhiyun static inline void gameport_trigger(struct gameport *gameport)
167*4882a593Smuzhiyun {
168*4882a593Smuzhiyun 	if (gameport->trigger)
169*4882a593Smuzhiyun 		gameport->trigger(gameport);
170*4882a593Smuzhiyun 	else
171*4882a593Smuzhiyun 		outb(0xff, gameport->io);
172*4882a593Smuzhiyun }
173*4882a593Smuzhiyun 
gameport_read(struct gameport * gameport)174*4882a593Smuzhiyun static inline unsigned char gameport_read(struct gameport *gameport)
175*4882a593Smuzhiyun {
176*4882a593Smuzhiyun 	if (gameport->read)
177*4882a593Smuzhiyun 		return gameport->read(gameport);
178*4882a593Smuzhiyun 	else
179*4882a593Smuzhiyun 		return inb(gameport->io);
180*4882a593Smuzhiyun }
181*4882a593Smuzhiyun 
gameport_cooked_read(struct gameport * gameport,int * axes,int * buttons)182*4882a593Smuzhiyun static inline int gameport_cooked_read(struct gameport *gameport, int *axes, int *buttons)
183*4882a593Smuzhiyun {
184*4882a593Smuzhiyun 	if (gameport->cooked_read)
185*4882a593Smuzhiyun 		return gameport->cooked_read(gameport, axes, buttons);
186*4882a593Smuzhiyun 	else
187*4882a593Smuzhiyun 		return -1;
188*4882a593Smuzhiyun }
189*4882a593Smuzhiyun 
gameport_calibrate(struct gameport * gameport,int * axes,int * max)190*4882a593Smuzhiyun static inline int gameport_calibrate(struct gameport *gameport, int *axes, int *max)
191*4882a593Smuzhiyun {
192*4882a593Smuzhiyun 	if (gameport->calibrate)
193*4882a593Smuzhiyun 		return gameport->calibrate(gameport, axes, max);
194*4882a593Smuzhiyun 	else
195*4882a593Smuzhiyun 		return -1;
196*4882a593Smuzhiyun }
197*4882a593Smuzhiyun 
gameport_time(struct gameport * gameport,int time)198*4882a593Smuzhiyun static inline int gameport_time(struct gameport *gameport, int time)
199*4882a593Smuzhiyun {
200*4882a593Smuzhiyun 	return (time * gameport->speed) / 1000;
201*4882a593Smuzhiyun }
202*4882a593Smuzhiyun 
gameport_set_poll_handler(struct gameport * gameport,void (* handler)(struct gameport *))203*4882a593Smuzhiyun static inline void gameport_set_poll_handler(struct gameport *gameport, void (*handler)(struct gameport *))
204*4882a593Smuzhiyun {
205*4882a593Smuzhiyun 	gameport->poll_handler = handler;
206*4882a593Smuzhiyun }
207*4882a593Smuzhiyun 
gameport_set_poll_interval(struct gameport * gameport,unsigned int msecs)208*4882a593Smuzhiyun static inline void gameport_set_poll_interval(struct gameport *gameport, unsigned int msecs)
209*4882a593Smuzhiyun {
210*4882a593Smuzhiyun 	gameport->poll_interval = msecs;
211*4882a593Smuzhiyun }
212*4882a593Smuzhiyun 
213*4882a593Smuzhiyun void gameport_start_polling(struct gameport *gameport);
214*4882a593Smuzhiyun void gameport_stop_polling(struct gameport *gameport);
215*4882a593Smuzhiyun 
216*4882a593Smuzhiyun #endif
217