diff mbox

[20/24] Port gamecon to ff-memless-next

Message ID 2807349.5CLbAnYOXZ@sigyn (mailing list archive)
State New, archived
Headers show

Commit Message

Michal Malý April 9, 2014, 11:30 a.m. UTC
Port gamecon to ff-memless-next

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

Patch

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 <vojtech@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;