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 20struct 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 54struct 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 67int gameport_open(struct gameport *gameport, struct gameport_driver *drv, int mode); 68void gameport_close(struct gameport *gameport); 69 70#if defined(CONFIG_GAMEPORT) || (defined(MODULE) && defined(CONFIG_GAMEPORT_MODULE)) 71 72void __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 77void gameport_unregister_port(struct gameport *gameport); 78 79__printf(2, 3) 80void gameport_set_phys(struct gameport *gameport, const char *fmt, ...); 81 82#else 83 84static inline void gameport_register_port(struct gameport *gameport) 85{ 86 return; 87} 88 89static inline void gameport_unregister_port(struct gameport *gameport) 90{ 91 return; 92} 93 94static inline __printf(2, 3) 95void gameport_set_phys(struct gameport *gameport, const char *fmt, ...) 96{ 97 return; 98} 99 100#endif 101 102static inline struct gameport *gameport_allocate_port(void) 103{ 104 struct gameport *gameport = kzalloc(sizeof(struct gameport), GFP_KERNEL); 105 106 return gameport; 107} 108 109static inline void gameport_free_port(struct gameport *gameport) 110{ 111 kfree(gameport); 112} 113 114static 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 */ 123static inline void *gameport_get_drvdata(struct gameport *gameport) 124{ 125 return dev_get_drvdata(&gameport->dev); 126} 127 128static 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 */ 136static inline int gameport_pin_driver(struct gameport *gameport) 137{ 138 return mutex_lock_interruptible(&gameport->drv_mutex); 139} 140 141static inline void gameport_unpin_driver(struct gameport *gameport) 142{ 143 mutex_unlock(&gameport->drv_mutex); 144} 145 146int __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 153void 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 169static 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 177static 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 185static 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 193static 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 201static inline int gameport_time(struct gameport *gameport, int time) 202{ 203 return (time * gameport->speed) / 1000; 204} 205 206static inline void gameport_set_poll_handler(struct gameport *gameport, void (*handler)(struct gameport *)) 207{ 208 gameport->poll_handler = handler; 209} 210 211static inline void gameport_set_poll_interval(struct gameport *gameport, unsigned int msecs) 212{ 213 gameport->poll_interval = msecs; 214} 215 216void gameport_start_polling(struct gameport *gameport); 217void gameport_stop_polling(struct gameport *gameport); 218 219#endif 220