linux/include/linux/gameport.h
<<
>>
Prefs
   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