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 core 6 1.2949 + vserver 2.2.0
[linux-2.6.git]
/
drivers
/
input
/
joystick
/
grip.c
diff --git
a/drivers/input/joystick/grip.c
b/drivers/input/joystick/grip.c
index
cd2bb5d
..
17a90c4
100644
(file)
--- a/
drivers/input/joystick/grip.c
+++ b/
drivers/input/joystick/grip.c
@@
-34,9
+34,12
@@
#include <linux/slab.h>
#include <linux/gameport.h>
#include <linux/input.h>
#include <linux/slab.h>
#include <linux/gameport.h>
#include <linux/input.h>
+#include <linux/jiffies.h>
+
+#define DRIVER_DESC "Gravis GrIP protocol joystick driver"
MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>");
MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>");
-MODULE_DESCRIPTION(
"Gravis GrIP protocol joystick driver"
);
+MODULE_DESCRIPTION(
DRIVER_DESC
);
MODULE_LICENSE("GPL");
#define GRIP_MODE_GPP 1
MODULE_LICENSE("GPL");
#define GRIP_MODE_GPP 1
@@
-51,14
+54,10
@@
MODULE_LICENSE("GPL");
#define GRIP_MAX_CHUNKS_XT 10
#define GRIP_MAX_BITS_XT 30
#define GRIP_MAX_CHUNKS_XT 10
#define GRIP_MAX_BITS_XT 30
-#define GRIP_REFRESH_TIME HZ/50 /* 20 ms */
-
struct grip {
struct gameport *gameport;
struct grip {
struct gameport *gameport;
- struct timer_list timer;
- struct input_dev dev[2];
+ struct input_dev *dev[2];
unsigned char mode[2];
unsigned char mode[2];
- int used;
int reads;
int bads;
char phys[2][32];
int reads;
int bads;
char phys[2][32];
@@
-183,16
+182,19
@@
static int grip_xt_read_packet(struct gameport *gameport, int shift, unsigned in
* grip_timer() repeatedly polls the joysticks and generates events.
*/
* grip_timer() repeatedly polls the joysticks and generates events.
*/
-static void grip_
timer(unsigned long private
)
+static void grip_
poll(struct gameport *gameport
)
{
{
- struct grip *grip =
(void*) private
;
+ struct grip *grip =
gameport_get_drvdata(gameport)
;
unsigned int data[GRIP_LENGTH_XT];
struct input_dev *dev;
int i, j;
for (i = 0; i < 2; i++) {
unsigned int data[GRIP_LENGTH_XT];
struct input_dev *dev;
int i, j;
for (i = 0; i < 2; i++) {
- dev = grip->dev + i;
+ dev = grip->dev[i];
+ if (!dev)
+ continue;
+
grip->reads++;
switch (grip->mode[i]) {
grip->reads++;
switch (grip->mode[i]) {
@@
-279,43
+281,40
@@
static void grip_timer(unsigned long private)
input_sync(dev);
}
input_sync(dev);
}
-
- mod_timer(&grip->timer, jiffies + GRIP_REFRESH_TIME);
}
static int grip_open(struct input_dev *dev)
{
struct grip *grip = dev->private;
}
static int grip_open(struct input_dev *dev)
{
struct grip *grip = dev->private;
- if (!grip->used++)
-
mod_timer(&grip->timer, jiffies + GRIP_REFRESH_TIME
);
+
+
gameport_start_polling(grip->gameport
);
return 0;
}
static void grip_close(struct input_dev *dev)
{
struct grip *grip = dev->private;
return 0;
}
static void grip_close(struct input_dev *dev)
{
struct grip *grip = dev->private;
- if (!--grip->used)
-
del_timer(&grip->timer
);
+
+
gameport_stop_polling(grip->gameport
);
}
}
-static
void grip_connect(struct gameport *gameport, struct gameport_dev *de
v)
+static
int grip_connect(struct gameport *gameport, struct gameport_driver *dr
v)
{
struct grip *grip;
{
struct grip *grip;
+ struct input_dev *input_dev;
unsigned int data[GRIP_LENGTH_XT];
int i, j, t;
unsigned int data[GRIP_LENGTH_XT];
int i, j, t;
+ int err;
- if (!(grip = kmalloc(sizeof(struct grip), GFP_KERNEL)))
- return;
- memset(grip, 0, sizeof(struct grip));
-
- gameport->private = grip;
+ if (!(grip = kzalloc(sizeof(struct grip), GFP_KERNEL)))
+ return -ENOMEM;
grip->gameport = gameport;
grip->gameport = gameport;
- init_timer(&grip->timer);
- grip->timer.data = (long) grip;
- grip->timer.function = grip_timer;
- if (gameport_open(gameport, dev, GAMEPORT_MODE_RAW))
+ gameport_set_drvdata(gameport, grip);
+
+ err = gameport_open(gameport, drv, GAMEPORT_MODE_RAW);
+ if (err)
goto fail1;
for (i = 0; i < 2; i++) {
goto fail1;
for (i = 0; i < 2; i++) {
@@
-337,92
+336,104
@@
static void grip_connect(struct gameport *gameport, struct gameport_dev *dev)
}
}
}
}
- if (!grip->mode[0] && !grip->mode[1])
+ if (!grip->mode[0] && !grip->mode[1]) {
+ err = -ENODEV;
goto fail2;
goto fail2;
+ }
- for (i = 0; i < 2; i++)
- if (grip->mode[i]) {
-
- sprintf(grip->phys[i], "%s/input%d", gameport->phys, i);
-
- grip->dev[i].private = grip;
+ gameport_set_poll_handler(gameport, grip_poll);
+ gameport_set_poll_interval(gameport, 20);
- grip->dev[i].open = grip_open;
- grip->dev[i].close = grip_close;
+ for (i = 0; i < 2; i++) {
+ if (!grip->mode[i])
+ continue;
- grip->dev[i].name = grip_name[grip->mode[i]];
- grip->dev[i].phys = grip->phys[i];
- grip->dev[i].id.bustype = BUS_GAMEPORT;
- grip->dev[i].id.vendor = GAMEPORT_ID_VENDOR_GRAVIS;
- grip->dev[i].id.product = grip->mode[i];
- grip->dev[i].id.version = 0x0100;
+ grip->dev[i] = input_dev = input_allocate_device();
+ if (!input_dev) {
+ err = -ENOMEM;
+ goto fail3;
+ }
- grip->dev[i].evbit[0] = BIT(EV_KEY) | BIT(EV_ABS);
+ snprintf(grip->phys[i], sizeof(grip->phys[i]),
+ "%s/input%d", gameport->phys, i);
- for (j = 0; (t = grip_abs[grip->mode[i]][j]) >= 0; j++) {
+ input_dev->name = grip_name[grip->mode[i]];
+ input_dev->phys = grip->phys[i];
+ input_dev->id.bustype = BUS_GAMEPORT;
+ input_dev->id.vendor = GAMEPORT_ID_VENDOR_GRAVIS;
+ input_dev->id.product = grip->mode[i];
+ input_dev->id.version = 0x0100;
+ input_dev->cdev.dev = &gameport->dev;
+ input_dev->private = grip;
- set_bit(t, grip->dev[i].absbit);
+ input_dev->open = grip_open;
+ input_dev->close = grip_close;
- if (j < grip_cen[grip->mode[i]]) {
- grip->dev[i].absmin[t] = 14;
- grip->dev[i].absmax[t] = 52;
- grip->dev[i].absfuzz[t] = 1;
- grip->dev[i].absflat[t] = 2;
- continue;
- }
+ input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_ABS);
- if (j < grip_anx[grip->mode[i]]) {
- grip->dev[i].absmin[t] = 3;
- grip->dev[i].absmax[t] = 57;
- grip->dev[i].absfuzz[t] = 1;
- continue;
- }
+ for (j = 0; (t = grip_abs[grip->mode[i]][j]) >= 0; j++) {
- grip->dev[i].absmin[t] = -1;
- grip->dev[i].absmax[t] = 1;
- }
+ if (j < grip_cen[grip->mode[i]])
+ input_set_abs_params(input_dev, t, 14, 52, 1, 2);
+ else if (j < grip_anx[grip->mode[i]])
+ input_set_abs_params(input_dev, t, 3, 57, 1, 0);
+ else
+ input_set_abs_params(input_dev, t, -1, 1, 0, 0);
+ }
-
for (j = 0; (t = grip_btn[grip->mode[i]][j]) >= 0; j++)
-
if (t > 0)
-
set_bit(t, grip->dev[i].
keybit);
+ for (j = 0; (t = grip_btn[grip->mode[i]][j]) >= 0; j++)
+ if (t > 0)
+
set_bit(t, input_dev->
keybit);
- input_register_device(grip->dev + i);
+ err = input_register_device(grip->dev[i]);
+ if (err)
+ goto fail4;
+ }
- printk(KERN_INFO "input: %s on %s\n",
- grip_name[grip->mode[i]], gameport->phys);
- }
+ return 0;
- return;
-fail2: gameport_close(gameport);
-fail1: kfree(grip);
+ fail4: input_free_device(grip->dev[i]);
+ fail3: while (--i >= 0)
+ if (grip->dev[i])
+ input_unregister_device(grip->dev[i]);
+ fail2: gameport_close(gameport);
+ fail1: gameport_set_drvdata(gameport, NULL);
+ kfree(grip);
+ return err;
}
static void grip_disconnect(struct gameport *gameport)
{
}
static void grip_disconnect(struct gameport *gameport)
{
+ struct grip *grip = gameport_get_drvdata(gameport);
int i;
int i;
- struct grip *grip = gameport->private;
for (i = 0; i < 2; i++)
for (i = 0; i < 2; i++)
- if (grip->
mode
[i])
- input_unregister_device(grip->dev
+ i
);
+ if (grip->
dev
[i])
+ input_unregister_device(grip->dev
[i]
);
gameport_close(gameport);
gameport_close(gameport);
+ gameport_set_drvdata(gameport, NULL);
kfree(grip);
}
kfree(grip);
}
-static struct gameport_dev grip_dev = {
- .connect = grip_connect,
- .disconnect = grip_disconnect,
+static struct gameport_driver grip_drv = {
+ .driver = {
+ .name = "grip",
+ .owner = THIS_MODULE,
+ },
+ .description = DRIVER_DESC,
+ .connect = grip_connect,
+ .disconnect = grip_disconnect,
};
};
-int __init grip_init(void)
+
static
int __init grip_init(void)
{
{
- gameport_register_d
evice(&grip_de
v);
+ gameport_register_d
river(&grip_dr
v);
return 0;
}
return 0;
}
-void __exit grip_exit(void)
+
static
void __exit grip_exit(void)
{
{
- gameport_unregister_d
evice(&grip_de
v);
+ gameport_unregister_d
river(&grip_dr
v);
}
module_init(grip_init);
}
module_init(grip_init);