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