Port gamecon to ff-memless-next

Signed-off-by: Michal Malý <madcatxs...@devoid-pointer.net>
---
 drivers/input/joystick/Kconfig   |  2 +-
 drivers/input/joystick/gamecon.c | 57 ++++++++++++++++++++++------------------
 2 files changed, 33 insertions(+), 26 deletions(-)

diff --git a/drivers/input/joystick/Kconfig b/drivers/input/joystick/Kconfig
index 56eb471..2dd3ba1 100644
--- a/drivers/input/joystick/Kconfig
+++ b/drivers/input/joystick/Kconfig
@@ -221,7 +221,7 @@ config JOYSTICK_DB9
 config JOYSTICK_GAMECON
        tristate "Multisystem, NES, SNES, N64, PSX joysticks and gamepads"
        depends on PARPORT
-       select INPUT_FF_MEMLESS
+       select INPUT_FF_MEMLESS_NEXT
        ---help---
          Say Y here if you have a Nintendo Entertainment System gamepad,
          Super Nintendo Entertainment System gamepad, Nintendo 64 gamepad,
diff --git a/drivers/input/joystick/gamecon.c b/drivers/input/joystick/gamecon.c
index e68e497..209d0fb 100644
--- a/drivers/input/joystick/gamecon.c
+++ b/drivers/input/joystick/gamecon.c
@@ -40,6 +40,7 @@
 #include <linux/input.h>
 #include <linux/mutex.h>
 #include <linux/slab.h>
+#include <linux/input/ff-memless-next.h>
 
 MODULE_AUTHOR("Vojtech Pavlik <vojt...@ucw.cz>");
 MODULE_DESCRIPTION("NES, SNES, N64, MultiSystem, PSX gamepad driver");
@@ -47,6 +48,7 @@ MODULE_LICENSE("GPL");
 
 #define GC_MAX_PORTS           3
 #define GC_MAX_DEVICES         5
+#define FF_UPDATE_RATE 50
 
 struct gc_config {
        int args[GC_MAX_DEVICES + 1];
@@ -263,43 +265,48 @@ static void gc_n64_process_packet(struct gc *gc)
 }
 
 static int gc_n64_play_effect(struct input_dev *dev, void *data,
-                             struct ff_effect *effect)
+                             const struct mlnx_effect_command *command)
 {
+       const struct mlnx_rumble_force *rumble_force = &command->u.rumble_force;
        int i;
        unsigned long flags;
        struct gc *gc = input_get_drvdata(dev);
        struct gc_subdev *sdev = data;
        unsigned char target = 1 << sdev->idx; /* select desired pin */
+       unsigned int cmd;
 
-       if (effect->type == FF_RUMBLE) {
-               struct ff_rumble_effect *rumble = &effect->u.rumble;
-               unsigned int cmd =
-                       rumble->strong_magnitude || rumble->weak_magnitude ?
-                       GC_N64_CMD_01 : GC_N64_CMD_00;
+       switch (command->cmd) {
+       case MLNX_START_RUMBLE:
+               cmd = (rumble_force->strong || rumble_force->weak) ? 
GC_N64_CMD_01 : GC_N64_CMD_00;
+               break;
+       case MLNX_STOP_RUMBLE:
+               cmd = GC_N64_CMD_00;
+               break;
+       default:
+               return -EINVAL;
+       }
 
-               local_irq_save(flags);
+       local_irq_save(flags);
 
-               /* Init Rumble - 0x03, 0x80, 0x01, (34)0x80 */
-               gc_n64_send_command(gc, GC_N64_CMD_03, target);
+       /* Init Rumble - 0x03, 0x80, 0x01, (34)0x80 */
+       gc_n64_send_command(gc, GC_N64_CMD_03, target);
+       gc_n64_send_command(gc, GC_N64_CMD_80, target);
+       gc_n64_send_command(gc, GC_N64_CMD_01, target);
+       for (i = 0; i < 32; i++)
                gc_n64_send_command(gc, GC_N64_CMD_80, target);
-               gc_n64_send_command(gc, GC_N64_CMD_01, target);
-               for (i = 0; i < 32; i++)
-                       gc_n64_send_command(gc, GC_N64_CMD_80, target);
-               gc_n64_send_stop_bit(gc, target);
+       gc_n64_send_stop_bit(gc, target);
 
-               udelay(GC_N64_DELAY);
-
-               /* Now start or stop it - 0x03, 0xc0, 0zx1b, (32)0x01/0x00 */
-               gc_n64_send_command(gc, GC_N64_CMD_03, target);
-               gc_n64_send_command(gc, GC_N64_CMD_c0, target);
-               gc_n64_send_command(gc, GC_N64_CMD_1b, target);
-               for (i = 0; i < 32; i++)
-                       gc_n64_send_command(gc, cmd, target);
-               gc_n64_send_stop_bit(gc, target);
+       udelay(GC_N64_DELAY);
 
-               local_irq_restore(flags);
+       /* Now start or stop it - 0x03, 0xc0, 0zx1b, (32)0x01/0x00 */
+       gc_n64_send_command(gc, GC_N64_CMD_03, target);
+       gc_n64_send_command(gc, GC_N64_CMD_c0, target);
+       gc_n64_send_command(gc, GC_N64_CMD_1b, target);
+       for (i = 0; i < 32; i++)
+               gc_n64_send_command(gc, cmd, target);
+       gc_n64_send_stop_bit(gc, target);
 
-       }
+       local_irq_restore(flags);
 
        return 0;
 }
@@ -317,7 +324,7 @@ static int __init gc_n64_init_ff(struct input_dev *dev, int 
i)
 
        input_set_capability(dev, EV_FF, FF_RUMBLE);
 
-       err = input_ff_create_memless(dev, sdev, gc_n64_play_effect);
+       err = input_ff_create_mlnx(dev, sdev, gc_n64_play_effect, 
FF_UPDATE_RATE);
        if (err) {
                kfree(sdev);
                return err;
-- 
1.9.1


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to