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