Signed-off-by: Michal Malý <madcatxs...@devoid-pointer.net>
---
 drivers/input/misc/Kconfig         |  2 +-
 drivers/input/misc/twl6040-vibra.c | 27 ++++++++++++++++++++++-----
 2 files changed, 23 insertions(+), 6 deletions(-)

diff --git a/drivers/input/misc/Kconfig b/drivers/input/misc/Kconfig
index 1016a1b..91dcae8 100644
--- a/drivers/input/misc/Kconfig
+++ b/drivers/input/misc/Kconfig
@@ -417,7 +417,7 @@ config INPUT_TWL4030_VIBRA
 config INPUT_TWL6040_VIBRA
        tristate "Support for TWL6040 Vibrator"
        depends on TWL6040_CORE
-       select INPUT_FF_MEMLESS
+       select INPUT_FF_MEMLESS_NEXT
        help
          This option enables support for TWL6040 Vibrator Driver.
 
diff --git a/drivers/input/misc/twl6040-vibra.c 
b/drivers/input/misc/twl6040-vibra.c
index 77dc23b..7440a74 100644
--- a/drivers/input/misc/twl6040-vibra.c
+++ b/drivers/input/misc/twl6040-vibra.c
@@ -30,12 +30,14 @@
 #include <linux/of.h>
 #include <linux/workqueue.h>
 #include <linux/input.h>
+#include <linux/input/ff-memless-next.h>
 #include <linux/mfd/twl6040.h>
 #include <linux/slab.h>
 #include <linux/delay.h>
 #include <linux/regulator/consumer.h>
 
 #define EFFECT_DIR_180_DEG     0x8000
+#define FF_UPDATE_RATE         50
 
 /* Recommended modulation index 85% */
 #define TWL6040_VIBRA_MOD      85
@@ -197,9 +199,10 @@ static void vibra_play_work(struct work_struct *work)
 }
 
 static int vibra_play(struct input_dev *input, void *data,
-                     struct ff_effect *effect)
+                     const struct mlnx_effect_command *command)
 {
        struct vibra_info *info = input_get_drvdata(input);
+       const struct mlnx_rumble_force *rumble_force = &command->u.rumble_force;
        int ret;
 
        /* Do not allow effect, while the routing is set to use audio */
@@ -209,9 +212,23 @@ static int vibra_play(struct input_dev *input, void *data,
                return -EBUSY;
        }
 
-       info->weak_speed = effect->u.rumble.weak_magnitude;
-       info->strong_speed = effect->u.rumble.strong_magnitude;
-       info->direction = effect->direction < EFFECT_DIR_180_DEG ? 1 : -1;
+       switch (command->cmd) {
+       case MLNX_START_RUMBLE:
+               info->weak_speed = rumble_force->weak;
+               info->strong_speed = rumble_force->strong;
+               if (info->strong_speed >= info->weak_speed)
+                       info->direction = rumble_force->strong_dir < 
EFFECT_DIR_180_DEG ? 1 : -1;
+               else
+                       info->direction = rumble_force->weak_dir < 
EFFECT_DIR_180_DEG ? 1 : -1;
+               break;
+       case MLNX_STOP_RUMBLE:
+               info->weak_speed = 0;
+               info->strong_speed = 0;
+               info->direction = 1;
+               break;
+       default:
+               return -EINVAL;
+       }
 
        ret = queue_work(info->workqueue, &info->play_work);
        if (!ret) {
@@ -367,7 +384,7 @@ static int twl6040_vibra_probe(struct platform_device *pdev)
        info->input_dev->close = twl6040_vibra_close;
        __set_bit(FF_RUMBLE, info->input_dev->ffbit);
 
-       ret = input_ff_create_memless(info->input_dev, NULL, vibra_play);
+       ret = input_ff_create_mlnx(info->input_dev, NULL, vibra_play, 
FF_UPDATE_RATE);
        if (ret < 0) {
                dev_err(info->dev, "couldn't register vibrator to FF\n");
                goto err_ialloc;
-- 
1.9.2

--
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