Blame view

include/linux/gameport.h 5.56 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
  /*
   *  Copyright (c) 1999-2002 Vojtech Pavlik
   *
   * This program is free software; you can redistribute it and/or modify it
   * under the terms of the GNU General Public License version 2 as published by
   * the Free Software Foundation.
   */
607ca46e9   David Howells   UAPI: (Scripted) ...
8
9
  #ifndef _GAMEPORT_H
  #define _GAMEPORT_H
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
10
11
  
  #include <asm/io.h>
7e044e056   Dmitry Torokhov   Input: serio - do...
12
  #include <linux/types.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
13
  #include <linux/list.h>
286295eb9   Arjan van de Ven   Input: gameport -...
14
  #include <linux/mutex.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
15
  #include <linux/device.h>
4e57b6817   Tim Schmielau   [PATCH] fix missi...
16
  #include <linux/timer.h>
5a0e3ad6a   Tejun Heo   include cleanup: ...
17
  #include <linux/slab.h>
607ca46e9   David Howells   UAPI: (Scripted) ...
18
  #include <uapi/linux/gameport.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
  
  struct gameport {
  
  	void *port_data;	/* Private pointer for gameport drivers */
  	char name[32];
  	char phys[32];
  
  	int io;
  	int speed;
  	int fuzz;
  
  	void (*trigger)(struct gameport *);
  	unsigned char (*read)(struct gameport *);
  	int (*cooked_read)(struct gameport *, int *, int *);
  	int (*calibrate)(struct gameport *, int *, int *);
  	int (*open)(struct gameport *, int);
  	void (*close)(struct gameport *);
  
  	struct timer_list poll_timer;
  	unsigned int poll_interval;	/* in msecs */
  	spinlock_t timer_lock;
  	unsigned int poll_cnt;
  	void (*poll_handler)(struct gameport *);
  
  	struct gameport *parent, *child;
  
  	struct gameport_driver *drv;
286295eb9   Arjan van de Ven   Input: gameport -...
46
  	struct mutex drv_mutex;		/* protects serio->drv so attributes can pin driver */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
47
48
  
  	struct device dev;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
49
50
51
52
53
54
  
  	struct list_head node;
  };
  #define to_gameport_port(d)	container_of(d, struct gameport, dev)
  
  struct gameport_driver {
37b0bb112   Dmitry Torokhov   Input: gameport_d...
55
  	const char *description;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
56
57
58
59
60
61
  
  	int (*connect)(struct gameport *, struct gameport_driver *drv);
  	int (*reconnect)(struct gameport *);
  	void (*disconnect)(struct gameport *);
  
  	struct device_driver driver;
7e044e056   Dmitry Torokhov   Input: serio - do...
62
  	bool ignore;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
63
64
65
66
67
  };
  #define to_gameport_driver(d)	container_of(d, struct gameport_driver, driver)
  
  int gameport_open(struct gameport *gameport, struct gameport_driver *drv, int mode);
  void gameport_close(struct gameport *gameport);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
68

668d1e609   Adrian Bunk   Input:
69
  #if defined(CONFIG_GAMEPORT) || (defined(MODULE) && defined(CONFIG_GAMEPORT_MODULE))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
70
  void __gameport_register_port(struct gameport *gameport, struct module *owner);
eb5589a8f   Paul Gortmaker   include: convert ...
71
72
73
  /* use a define to avoid include chaining to get THIS_MODULE */
  #define gameport_register_port(gameport) \
  	__gameport_register_port(gameport, THIS_MODULE)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
74
75
  
  void gameport_unregister_port(struct gameport *gameport);
b9075fa96   Joe Perches   treewide: use __p...
76
77
  __printf(2, 3)
  void gameport_set_phys(struct gameport *gameport, const char *fmt, ...);
668d1e609   Adrian Bunk   Input:
78
79
80
81
82
83
84
85
86
87
88
89
  
  #else
  
  static inline void gameport_register_port(struct gameport *gameport)
  {
  	return;
  }
  
  static inline void gameport_unregister_port(struct gameport *gameport)
  {
  	return;
  }
b9075fa96   Joe Perches   treewide: use __p...
90
91
  static inline __printf(2, 3)
  void gameport_set_phys(struct gameport *gameport, const char *fmt, ...)
668d1e609   Adrian Bunk   Input:
92
93
94
95
96
  {
  	return;
  }
  
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
97
98
  static inline struct gameport *gameport_allocate_port(void)
  {
cd8612808   Robert P. J. Day   [PATCH] Fix numer...
99
  	struct gameport *gameport = kzalloc(sizeof(struct gameport), GFP_KERNEL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
100
101
102
103
104
105
106
107
108
109
110
111
112
  
  	return gameport;
  }
  
  static inline void gameport_free_port(struct gameport *gameport)
  {
  	kfree(gameport);
  }
  
  static inline void gameport_set_name(struct gameport *gameport, const char *name)
  {
  	strlcpy(gameport->name, name, sizeof(gameport->name));
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
113
  /*
0b28002fd   Akinobu Mita   [PATCH] more s/fu...
114
   * Use the following functions to manipulate gameport's per-port
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
115
116
117
118
119
120
121
122
123
124
125
126
127
   * driver-specific data.
   */
  static inline void *gameport_get_drvdata(struct gameport *gameport)
  {
  	return dev_get_drvdata(&gameport->dev);
  }
  
  static inline void gameport_set_drvdata(struct gameport *gameport, void *data)
  {
  	dev_set_drvdata(&gameport->dev, data);
  }
  
  /*
0b28002fd   Akinobu Mita   [PATCH] more s/fu...
128
   * Use the following functions to pin gameport's driver in process context
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
129
130
131
   */
  static inline int gameport_pin_driver(struct gameport *gameport)
  {
286295eb9   Arjan van de Ven   Input: gameport -...
132
  	return mutex_lock_interruptible(&gameport->drv_mutex);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
133
134
135
136
  }
  
  static inline void gameport_unpin_driver(struct gameport *gameport)
  {
286295eb9   Arjan van de Ven   Input: gameport -...
137
  	mutex_unlock(&gameport->drv_mutex);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
138
  }
eb5589a8f   Paul Gortmaker   include: convert ...
139
  int __must_check __gameport_register_driver(struct gameport_driver *drv,
6902c0bea   Dmitry Torokhov   Input: gameport -...
140
  				struct module *owner, const char *mod_name);
eb5589a8f   Paul Gortmaker   include: convert ...
141
142
143
144
  
  /* use a define to avoid include chaining to get THIS_MODULE & friends */
  #define gameport_register_driver(drv) \
  	__gameport_register_driver(drv, THIS_MODULE, KBUILD_MODNAME)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
145
146
  
  void gameport_unregister_driver(struct gameport_driver *drv);
45b2604ea   Axel Lin   Input: gameport -...
147
148
149
150
151
152
153
154
155
156
157
158
  /**
   * module_gameport_driver() - Helper macro for registering a gameport driver
   * @__gameport_driver: gameport_driver struct
   *
   * Helper macro for gameport drivers which do not do anything special in
   * module init/exit. This eliminates a lot of boilerplate. Each module may
   * only use this macro once, and calling it replaces module_init() and
   * module_exit().
   */
  #define module_gameport_driver(__gameport_driver) \
  	module_driver(__gameport_driver, gameport_register_driver, \
  		       gameport_unregister_driver)
25478bb26   David Woodhouse   Use __KERNEL__ to...
159

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
  static inline void gameport_trigger(struct gameport *gameport)
  {
  	if (gameport->trigger)
  		gameport->trigger(gameport);
  	else
  		outb(0xff, gameport->io);
  }
  
  static inline unsigned char gameport_read(struct gameport *gameport)
  {
  	if (gameport->read)
  		return gameport->read(gameport);
  	else
  		return inb(gameport->io);
  }
  
  static inline int gameport_cooked_read(struct gameport *gameport, int *axes, int *buttons)
  {
  	if (gameport->cooked_read)
  		return gameport->cooked_read(gameport, axes, buttons);
  	else
  		return -1;
  }
  
  static inline int gameport_calibrate(struct gameport *gameport, int *axes, int *max)
  {
  	if (gameport->calibrate)
  		return gameport->calibrate(gameport, axes, max);
  	else
  		return -1;
  }
  
  static inline int gameport_time(struct gameport *gameport, int time)
  {
  	return (time * gameport->speed) / 1000;
  }
  
  static inline void gameport_set_poll_handler(struct gameport *gameport, void (*handler)(struct gameport *))
  {
  	gameport->poll_handler = handler;
  }
  
  static inline void gameport_set_poll_interval(struct gameport *gameport, unsigned int msecs)
  {
  	gameport->poll_interval = msecs;
  }
  
  void gameport_start_polling(struct gameport *gameport);
  void gameport_stop_polling(struct gameport *gameport);
  
  #endif