git://git.onelab.eu
/
linux-2.6.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fedora kernel-2.6.17-1.2142_FC4 patched with stable patch-2.6.17.4-vs2.0.2-rc26.diff
[linux-2.6.git]
/
drivers
/
input
/
joystick
/
grip_mp.c
diff --git
a/drivers/input/joystick/grip_mp.c
b/drivers/input/joystick/grip_mp.c
index
42e5005
..
6243894
100644
(file)
--- a/
drivers/input/joystick/grip_mp.c
+++ b/
drivers/input/joystick/grip_mp.c
@@
-19,6
+19,7
@@
#include <linux/input.h>
#include <linux/delay.h>
#include <linux/proc_fs.h>
#include <linux/input.h>
#include <linux/delay.h>
#include <linux/proc_fs.h>
+#include <linux/jiffies.h>
#define DRIVER_DESC "Gravis Grip Multiport driver"
#define DRIVER_DESC "Gravis Grip Multiport driver"
@@
-32,23
+33,28
@@
MODULE_LICENSE("GPL");
#define dbg(format, arg...) do {} while (0)
#endif
#define dbg(format, arg...) do {} while (0)
#endif
+#define GRIP_MAX_PORTS 4
/*
* Grip multiport state
*/
/*
* Grip multiport state
*/
+struct grip_port {
+ struct input_dev *dev;
+ int mode;
+ int registered;
+
+ /* individual gamepad states */
+ int buttons;
+ int xaxes;
+ int yaxes;
+ int dirty; /* has the state been updated? */
+};
+
struct grip_mp {
struct gameport *gameport;
struct grip_mp {
struct gameport *gameport;
- struct input_dev dev[4];
- int mode[4];
- int registered[4];
+ struct grip_port *port[GRIP_MAX_PORTS];
int reads;
int bads;
int reads;
int bads;
-
- /* individual gamepad states */
- int buttons[4];
- int xaxes[4];
- int yaxes[4];
- int dirty[4]; /* has the state been updated? */
};
/*
};
/*
@@
-85,16
+91,16
@@
struct grip_mp {
#define GRIP_MODE_GP 2
#define GRIP_MODE_C64 3
#define GRIP_MODE_GP 2
#define GRIP_MODE_C64 3
-static int grip_btn_gp[] = { BTN_TR, BTN_TL, BTN_A, BTN_B, BTN_C, BTN_X, BTN_Y, BTN_Z, -1 };
-static int grip_btn_c64[] = { BTN_JOYSTICK, -1 };
+static
const
int grip_btn_gp[] = { BTN_TR, BTN_TL, BTN_A, BTN_B, BTN_C, BTN_X, BTN_Y, BTN_Z, -1 };
+static
const
int grip_btn_c64[] = { BTN_JOYSTICK, -1 };
-static int grip_abs_gp[] = { ABS_X, ABS_Y, -1 };
-static int grip_abs_c64[] = { ABS_X, ABS_Y, -1 };
+static
const
int grip_abs_gp[] = { ABS_X, ABS_Y, -1 };
+static
const
int grip_abs_c64[] = { ABS_X, ABS_Y, -1 };
-static int *grip_abs[] = { NULL, NULL, grip_abs_gp, grip_abs_c64 };
-static int *grip_btn[] = { NULL, NULL, grip_btn_gp, grip_btn_c64 };
+static
const
int *grip_abs[] = { NULL, NULL, grip_abs_gp, grip_abs_c64 };
+static
const
int *grip_btn[] = { NULL, NULL, grip_btn_gp, grip_btn_c64 };
-static char *grip_name[] = { NULL, NULL, "Gravis Grip Pad", "Commodore 64 Joystick" };
+static c
onst c
har *grip_name[] = { NULL, NULL, "Gravis Grip Pad", "Commodore 64 Joystick" };
static const int init_seq[] = {
1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1,
static const int init_seq[] = {
1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1,
@@
-104,9
+110,9
@@
static const int init_seq[] = {
/* Maps multiport directional values to X,Y axis values (each axis encoded in 3 bits) */
/* Maps multiport directional values to X,Y axis values (each axis encoded in 3 bits) */
-static int axis_map[] = { 5, 9, 1, 5, 6, 10, 2, 6, 4, 8, 0, 4, 5, 9, 1, 5 };
+static
const
int axis_map[] = { 5, 9, 1, 5, 6, 10, 2, 6, 4, 8, 0, 4, 5, 9, 1, 5 };
-static
void
register_slot(int i, struct grip_mp *grip);
+static
int
register_slot(int i, struct grip_mp *grip);
/*
* Returns whether an odd or even number of bits are on in pkt.
/*
* Returns whether an odd or even number of bits are on in pkt.
@@
-171,7
+177,7
@@
static int mp_io(struct gameport* gameport, int sendflags, int sendcode, u32 *pa
*packet = 0;
raw_data = gameport_read(gameport);
if (raw_data & 1)
*packet = 0;
raw_data = gameport_read(gameport);
if (raw_data & 1)
- return IO_RETRY;
+ return IO_RETRY;
for (i = 0; i < 64; i++) {
raw_data = gameport_read(gameport);
for (i = 0; i < 64; i++) {
raw_data = gameport_read(gameport);
@@
-353,9
+359,10
@@
static int dig_mode_start(struct gameport *gameport, u32 *packet)
static int get_and_decode_packet(struct grip_mp *grip, int flags)
{
static int get_and_decode_packet(struct grip_mp *grip, int flags)
{
+ struct grip_port *port;
u32 packet;
int joytype = 0;
u32 packet;
int joytype = 0;
- int slot
= 0
;
+ int slot;
/* Get a packet and check for validity */
/* Get a packet and check for validity */
@@
-377,6
+384,8
@@
static int get_and_decode_packet(struct grip_mp *grip, int flags)
if ((slot < 0) || (slot > 3))
return flags;
if ((slot < 0) || (slot > 3))
return flags;
+ port = grip->port[slot];
+
/*
* Handle "reset" packets, which occur at startup, and when gamepads
* are removed or plugged in. May contain configuration of a new gamepad.
/*
* Handle "reset" packets, which occur at startup, and when gamepads
* are removed or plugged in. May contain configuration of a new gamepad.
@@
-385,14
+394,14
@@
static int get_and_decode_packet(struct grip_mp *grip, int flags)
joytype = (packet >> 16) & 0x1f;
if (!joytype) {
joytype = (packet >> 16) & 0x1f;
if (!joytype) {
- if (
grip->registered[slot]
) {
+ if (
port->registered
) {
printk(KERN_INFO "grip_mp: removing %s, slot %d\n",
printk(KERN_INFO "grip_mp: removing %s, slot %d\n",
- grip_name[
grip->mode[slot]
], slot);
- input_unregister_device(
grip->dev + slot
);
-
grip->registered[slot]
= 0;
+ grip_name[
port->mode
], slot);
+ input_unregister_device(
port->dev
);
+
port->registered
= 0;
}
dbg("Reset: grip multiport slot %d\n", slot);
}
dbg("Reset: grip multiport slot %d\n", slot);
-
grip->mode[slot]
= GRIP_MODE_RESET;
+
port->mode
= GRIP_MODE_RESET;
flags |= IO_SLOT_CHANGE;
return flags;
}
flags |= IO_SLOT_CHANGE;
return flags;
}
@@
-402,17
+411,17
@@
static int get_and_decode_packet(struct grip_mp *grip, int flags)
if (joytype == 0x1f) {
int dir = (packet >> 8) & 0xf; /* eight way directional value */
if (joytype == 0x1f) {
int dir = (packet >> 8) & 0xf; /* eight way directional value */
-
grip->buttons[slot]
= (~packet) & 0xff;
-
grip->yaxes[slot]
= ((axis_map[dir] >> 2) & 3) - 1;
-
grip->xaxes[slot]
= (axis_map[dir] & 3) - 1;
-
grip->dirty[slot]
= 1;
+
port->buttons
= (~packet) & 0xff;
+
port->yaxes
= ((axis_map[dir] >> 2) & 3) - 1;
+
port->xaxes
= (axis_map[dir] & 3) - 1;
+
port->dirty
= 1;
- if (
grip->mode[slot]
== GRIP_MODE_RESET)
+ if (
port->mode
== GRIP_MODE_RESET)
flags |= IO_SLOT_CHANGE;
flags |= IO_SLOT_CHANGE;
-
grip->mode[slot]
= GRIP_MODE_GP;
+
port->mode
= GRIP_MODE_GP;
- if (!
grip->registered[slot]
) {
+ if (!
port->registered
) {
dbg("New Grip pad in multiport slot %d.\n", slot);
register_slot(slot, grip);
}
dbg("New Grip pad in multiport slot %d.\n", slot);
register_slot(slot, grip);
}
@@
-445,9
+454,9
@@
static int slots_valid(struct grip_mp *grip)
return 0;
for (slot = 0; slot < 4; slot++) {
return 0;
for (slot = 0; slot < 4; slot++) {
- if (grip->
mode[slot]
== GRIP_MODE_RESET)
+ if (grip->
port[slot]->mode
== GRIP_MODE_RESET)
invalid = 1;
invalid = 1;
- if (grip->
mode[slot]
!= GRIP_MODE_NONE)
+ if (grip->
port[slot]->mode
!= GRIP_MODE_NONE)
active = 1;
}
active = 1;
}
@@
-484,7
+493,7
@@
static int multiport_init(struct grip_mp *grip)
/* Get packets, store multiport state, and check state's validity */
for (tries = 0; tries < 4096; tries++) {
/* Get packets, store multiport state, and check state's validity */
for (tries = 0; tries < 4096; tries++) {
- if (
slots_valid(grip)
) {
+ if (
slots_valid(grip)
) {
initialized = 1;
break;
}
initialized = 1;
break;
}
@@
-499,24
+508,24
@@
static int multiport_init(struct grip_mp *grip)
static void report_slot(struct grip_mp *grip, int slot)
{
static void report_slot(struct grip_mp *grip, int slot)
{
- struct
input_dev *dev = &(grip->dev[slot])
;
- int i
, buttons = grip->buttons[slot]
;
+ struct
grip_port *port = grip->port[slot]
;
+ int i;
/* Store button states with linux input driver */
for (i = 0; i < 8; i++)
/* Store button states with linux input driver */
for (i = 0; i < 8; i++)
- input_report_key(
dev, grip_btn_gp[i], (
buttons >> i) & 1);
+ input_report_key(
port->dev, grip_btn_gp[i], (port->
buttons >> i) & 1);
/* Store axis states with linux driver */
/* Store axis states with linux driver */
- input_report_abs(
dev, ABS_X, grip->xaxes[slot]
);
- input_report_abs(
dev, ABS_Y, grip->yaxes[slot]
);
+ input_report_abs(
port->dev, ABS_X, port->xaxes
);
+ input_report_abs(
port->dev, ABS_Y, port->yaxes
);
/* Tell the receiver of the events to process them */
/* Tell the receiver of the events to process them */
- input_sync(dev);
+ input_sync(
port->
dev);
-
grip->dirty[slot]
= 0;
+
port->dirty
= 0;
}
/*
}
/*
@@
-540,7
+549,7
@@
static void grip_poll(struct gameport *gameport)
}
for (i = 0; i < 4; i++)
}
for (i = 0; i < 4; i++)
- if (grip->
dirty[i]
)
+ if (grip->
port[i]->dirty
)
report_slot(grip, i);
}
report_slot(grip, i);
}
@@
-571,35
+580,43
@@
static void grip_close(struct input_dev *dev)
* Tell the linux input layer about a newly plugged-in gamepad.
*/
* Tell the linux input layer about a newly plugged-in gamepad.
*/
-static
void
register_slot(int slot, struct grip_mp *grip)
+static
int
register_slot(int slot, struct grip_mp *grip)
{
{
+ struct grip_port *port = grip->port[slot];
+ struct input_dev *input_dev;
int j, t;
int j, t;
- grip->dev[slot].private = grip;
- grip->dev[slot].open = grip_open;
- grip->dev[slot].close = grip_close;
- grip->dev[slot].name = grip_name[grip->mode[slot]];
- grip->dev[slot].id.bustype = BUS_GAMEPORT;
- grip->dev[slot].id.vendor = GAMEPORT_ID_VENDOR_GRAVIS;
- grip->dev[slot].id.product = 0x0100 + grip->mode[slot];
- grip->dev[slot].id.version = 0x0100;
- grip->dev[slot].evbit[0] = BIT(EV_KEY) | BIT(EV_ABS);
+ port->dev = input_dev = input_allocate_device();
+ if (!input_dev)
+ return -ENOMEM;
+
+ input_dev->name = grip_name[port->mode];
+ input_dev->id.bustype = BUS_GAMEPORT;
+ input_dev->id.vendor = GAMEPORT_ID_VENDOR_GRAVIS;
+ input_dev->id.product = 0x0100 + port->mode;
+ input_dev->id.version = 0x0100;
+ input_dev->cdev.dev = &grip->gameport->dev;
+ input_dev->private = grip;
- for (j = 0; (t = grip_abs[grip->mode[slot]][j]) >= 0; j++)
-
input_set_abs_params(&grip->dev[slot], t, -1, 1, 0, 0)
;
+ input_dev->open = grip_open;
+
input_dev->close = grip_close
;
- for (j = 0; (t = grip_btn[grip->mode[slot]][j]) >= 0; j++)
+ input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_ABS);
+
+ for (j = 0; (t = grip_abs[port->mode][j]) >= 0; j++)
+ input_set_abs_params(input_dev, t, -1, 1, 0, 0);
+
+ for (j = 0; (t = grip_btn[port->mode][j]) >= 0; j++)
if (t > 0)
if (t > 0)
- set_bit(t,
grip->dev[slot].
keybit);
+ set_bit(t,
input_dev->
keybit);
- input_register_device(
grip->dev + slot
);
-
grip->registered[slot]
= 1;
+ input_register_device(
port->dev
);
+
port->registered
= 1;
- if (
grip->dirty[slot])
/* report initial state, if any */
+ if (
port->dirty)
/* report initial state, if any */
report_slot(grip, slot);
report_slot(grip, slot);
- printk(KERN_INFO "grip_mp: added %s, slot %d\n",
- grip_name[grip->mode[slot]], slot);
+ return 0;
}
static int grip_connect(struct gameport *gameport, struct gameport_driver *drv)
}
static int grip_connect(struct gameport *gameport, struct gameport_driver *drv)
@@
-607,7
+624,7
@@
static int grip_connect(struct gameport *gameport, struct gameport_driver *drv)
struct grip_mp *grip;
int err;
struct grip_mp *grip;
int err;
- if (!(grip = k
calloc(1,
sizeof(struct grip_mp), GFP_KERNEL)))
+ if (!(grip = k
zalloc(
sizeof(struct grip_mp), GFP_KERNEL)))
return -ENOMEM;
grip->gameport = gameport;
return -ENOMEM;
grip->gameport = gameport;
@@
-626,7
+643,7
@@
static int grip_connect(struct gameport *gameport, struct gameport_driver *drv)
goto fail2;
}
goto fail2;
}
- if (!grip->
mode[0] && !grip->mode[1] && !grip->mode[2] && !grip->mode[3]
) {
+ if (!grip->
port[0]->mode && !grip->port[1]->mode && !grip->port[2]->mode && !grip->port[3]->mode
) {
/* nothing plugged in */
err = -ENODEV;
goto fail2;
/* nothing plugged in */
err = -ENODEV;
goto fail2;
@@
-646,8
+663,8
@@
static void grip_disconnect(struct gameport *gameport)
int i;
for (i = 0; i < 4; i++)
int i;
for (i = 0; i < 4; i++)
- if (grip->
registered[i]
)
- input_unregister_device(grip->
dev + i
);
+ if (grip->
port[i]->registered
)
+ input_unregister_device(grip->
port[i]->dev
);
gameport_close(gameport);
gameport_set_drvdata(gameport, NULL);
kfree(grip);
gameport_close(gameport);
gameport_set_drvdata(gameport, NULL);
kfree(grip);