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