vserver 2.0 rc7
[linux-2.6.git] / drivers / input / joystick / grip_mp.c
index 849d0de..42e5005 100644 (file)
 #include <linux/delay.h>
 #include <linux/proc_fs.h>
 
+#define DRIVER_DESC    "Gravis Grip Multiport driver"
+
 MODULE_AUTHOR("Brian Bonnlander");
-MODULE_DESCRIPTION("Gravis Grip Multiport driver");
+MODULE_DESCRIPTION(DRIVER_DESC);
 MODULE_LICENSE("GPL");
 
 #ifdef GRIP_DEBUG
@@ -36,11 +38,9 @@ MODULE_LICENSE("GPL");
 
 struct grip_mp {
        struct gameport *gameport;
-       struct timer_list timer;
        struct input_dev dev[4];
        int mode[4];
        int registered[4];
-       int used;
        int reads;
        int bads;
 
@@ -79,7 +79,6 @@ struct grip_mp {
  */
 
 #define GRIP_INIT_DELAY         2000          /*  2 ms */
-#define GRIP_REFRESH_TIME       HZ/50        /* 20 ms */
 
 #define GRIP_MODE_NONE         0
 #define GRIP_MODE_RESET         1
@@ -477,9 +476,9 @@ static int multiport_init(struct grip_mp *grip)
        }
 
        if (dig_mode)
-               dbg("multiport_init(): digital mode achieved.\n");
+               dbg("multiport_init(): digital mode activated.\n");
        else {
-               dbg("multiport_init(): unable to achieve digital mode.\n");
+               dbg("multiport_init(): unable to activate digital mode.\n");
                return 0;
        }
 
@@ -524,8 +523,9 @@ static void report_slot(struct grip_mp *grip, int slot)
  * Get the multiport state.
  */
 
-static void get_and_report_mp_state(struct grip_mp *grip)
+static void grip_poll(struct gameport *gameport)
 {
+       struct grip_mp *grip = gameport_get_drvdata(gameport);
        int i, npkts, flags;
 
        for (npkts = 0; npkts < 4; npkts++) {
@@ -551,8 +551,8 @@ static void get_and_report_mp_state(struct grip_mp *grip)
 static int grip_open(struct input_dev *dev)
 {
        struct grip_mp *grip = dev->private;
-       if (!grip->used++)
-               mod_timer(&grip->timer, jiffies + GRIP_REFRESH_TIME);
+
+       gameport_start_polling(grip->gameport);
        return 0;
 }
 
@@ -563,8 +563,8 @@ static int grip_open(struct input_dev *dev)
 static void grip_close(struct input_dev *dev)
 {
        struct grip_mp *grip = dev->private;
-       if (!--grip->used)
-               del_timer(&grip->timer);
+
+       gameport_start_polling(grip->gameport);
 }
 
 /*
@@ -585,11 +585,8 @@ static void register_slot(int slot, struct grip_mp *grip)
        grip->dev[slot].id.version = 0x0100;
        grip->dev[slot].evbit[0] = BIT(EV_KEY) | BIT(EV_ABS);
 
-       for (j = 0; (t = grip_abs[grip->mode[slot]][j]) >= 0; j++) {
-               set_bit(t, grip->dev[slot].absbit);
-               grip->dev[slot].absmin[t] = -1;
-               grip->dev[slot].absmax[t] = 1;
-       }
+       for (j = 0; (t = grip_abs[grip->mode[slot]][j]) >= 0; j++)
+               input_set_abs_params(&grip->dev[slot], t, -1, 1, 0, 0);
 
        for (j = 0; (t = grip_btn[grip->mode[slot]][j]) >= 0; j++)
                if (t > 0)
@@ -605,69 +602,75 @@ static void register_slot(int slot, struct grip_mp *grip)
               grip_name[grip->mode[slot]], slot);
 }
 
-/*
- * Repeatedly polls the multiport and generates events.
- */
-
-static void grip_timer(unsigned long private)
-{
-       struct grip_mp *grip = (void*) private;
-       get_and_report_mp_state(grip);
-       mod_timer(&grip->timer, jiffies + GRIP_REFRESH_TIME);
-}
-
-static void grip_connect(struct gameport *gameport, struct gameport_dev *dev)
+static int grip_connect(struct gameport *gameport, struct gameport_driver *drv)
 {
        struct grip_mp *grip;
+       int err;
+
+       if (!(grip = kcalloc(1, sizeof(struct grip_mp), GFP_KERNEL)))
+               return -ENOMEM;
 
-       if (!(grip = kmalloc(sizeof(struct grip_mp), GFP_KERNEL)))
-               return;
-       memset(grip, 0, sizeof(struct grip_mp));
-       gameport->private = grip;
        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;
-       if (!multiport_init(grip))
+
+       gameport_set_poll_handler(gameport, grip_poll);
+       gameport_set_poll_interval(gameport, 20);
+
+       if (!multiport_init(grip)) {
+               err = -ENODEV;
                goto fail2;
-       if (!grip->mode[0] && !grip->mode[1] &&   /* nothing plugged in */
-           !grip->mode[2] && !grip->mode[3])
+       }
+
+       if (!grip->mode[0] && !grip->mode[1] && !grip->mode[2] && !grip->mode[3]) {
+               /* nothing plugged in */
+               err = -ENODEV;
                goto fail2;
-       return;
+       }
+
+       return 0;
 
 fail2: gameport_close(gameport);
-fail1: kfree(grip);
+fail1: gameport_set_drvdata(gameport, NULL);
+       kfree(grip);
+       return err;
 }
 
 static void grip_disconnect(struct gameport *gameport)
 {
+       struct grip_mp *grip = gameport_get_drvdata(gameport);
        int i;
 
-       struct grip_mp *grip = gameport->private;
        for (i = 0; i < 4; i++)
                if (grip->registered[i])
                        input_unregister_device(grip->dev + i);
        gameport_close(gameport);
+       gameport_set_drvdata(gameport, NULL);
        kfree(grip);
 }
 
-static struct gameport_dev grip_dev = {
+static struct gameport_driver grip_drv = {
+       .driver         = {
+               .name   = "grip_mp",
+       },
+       .description    = DRIVER_DESC,
        .connect        = grip_connect,
        .disconnect     = grip_disconnect,
 };
 
-static int grip_init(void)
+static int __init grip_init(void)
 {
-       gameport_register_device(&grip_dev);
+       gameport_register_driver(&grip_drv);
        return 0;
 }
 
-static void grip_exit(void)
+static void __exit grip_exit(void)
 {
-       gameport_unregister_device(&grip_dev);
+       gameport_unregister_driver(&grip_drv);
 }
 
 module_init(grip_init);