lis3lv02d: switch to using input device polling mode
authorDmitry Torokhov <dmitry.torokhov@gmail.com>
Wed, 2 Oct 2019 21:56:58 +0000 (14:56 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 10 Oct 2019 13:24:19 +0000 (15:24 +0200)
Now that instances of input_dev support polling mode natively,
we no longer need to create input_polled_dev instance.

Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Link: https://lore.kernel.org/r/20191002215658.GA134561@dtor-ws
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/misc/Kconfig
drivers/misc/lis3lv02d/lis3lv02d.c
drivers/misc/lis3lv02d/lis3lv02d.h

index c55b637..2fefece 100644 (file)
@@ -8,7 +8,6 @@ menu "Misc devices"
 config SENSORS_LIS3LV02D
        tristate
        depends on INPUT
-       select INPUT_POLLDEV
 
 config AD525X_DPOT
        tristate "Analog Devices Digital Potentiometers"
index 057d7bb..dd65ced 100644 (file)
@@ -16,7 +16,7 @@
 #include <linux/types.h>
 #include <linux/platform_device.h>
 #include <linux/interrupt.h>
-#include <linux/input-polldev.h>
+#include <linux/input.h>
 #include <linux/delay.h>
 #include <linux/wait.h>
 #include <linux/poll.h>
@@ -434,23 +434,23 @@ int lis3lv02d_poweron(struct lis3lv02d *lis3)
 EXPORT_SYMBOL_GPL(lis3lv02d_poweron);
 
 
-static void lis3lv02d_joystick_poll(struct input_polled_dev *pidev)
+static void lis3lv02d_joystick_poll(struct input_dev *input)
 {
-       struct lis3lv02d *lis3 = pidev->private;
+       struct lis3lv02d *lis3 = input_get_drvdata(input);
        int x, y, z;
 
        mutex_lock(&lis3->mutex);
        lis3lv02d_get_xyz(lis3, &x, &y, &z);
-       input_report_abs(pidev->input, ABS_X, x);
-       input_report_abs(pidev->input, ABS_Y, y);
-       input_report_abs(pidev->input, ABS_Z, z);
-       input_sync(pidev->input);
+       input_report_abs(input, ABS_X, x);
+       input_report_abs(input, ABS_Y, y);
+       input_report_abs(input, ABS_Z, z);
+       input_sync(input);
        mutex_unlock(&lis3->mutex);
 }
 
-static void lis3lv02d_joystick_open(struct input_polled_dev *pidev)
+static int lis3lv02d_joystick_open(struct input_dev *input)
 {
-       struct lis3lv02d *lis3 = pidev->private;
+       struct lis3lv02d *lis3 = input_get_drvdata(input);
 
        if (lis3->pm_dev)
                pm_runtime_get_sync(lis3->pm_dev);
@@ -461,12 +461,14 @@ static void lis3lv02d_joystick_open(struct input_polled_dev *pidev)
         * Update coordinates for the case where poll interval is 0 and
         * the chip in running purely under interrupt control
         */
-       lis3lv02d_joystick_poll(pidev);
+       lis3lv02d_joystick_poll(input);
+
+       return 0;
 }
 
-static void lis3lv02d_joystick_close(struct input_polled_dev *pidev)
+static void lis3lv02d_joystick_close(struct input_dev *input)
 {
-       struct lis3lv02d *lis3 = pidev->private;
+       struct lis3lv02d *lis3 = input_get_drvdata(input);
 
        atomic_set(&lis3->wake_thread, 0);
        if (lis3->pm_dev)
@@ -497,7 +499,7 @@ out:
 
 static void lis302dl_interrupt_handle_click(struct lis3lv02d *lis3)
 {
-       struct input_dev *dev = lis3->idev->input;
+       struct input_dev *dev = lis3->idev;
        u8 click_src;
 
        mutex_lock(&lis3->mutex);
@@ -677,26 +679,19 @@ int lis3lv02d_joystick_enable(struct lis3lv02d *lis3)
        if (lis3->idev)
                return -EINVAL;
 
-       lis3->idev = input_allocate_polled_device();
-       if (!lis3->idev)
+       input_dev = input_allocate_device();
+       if (!input_dev)
                return -ENOMEM;
 
-       lis3->idev->poll = lis3lv02d_joystick_poll;
-       lis3->idev->open = lis3lv02d_joystick_open;
-       lis3->idev->close = lis3lv02d_joystick_close;
-       lis3->idev->poll_interval = MDPS_POLL_INTERVAL;
-       lis3->idev->poll_interval_min = MDPS_POLL_MIN;
-       lis3->idev->poll_interval_max = MDPS_POLL_MAX;
-       lis3->idev->private = lis3;
-       input_dev = lis3->idev->input;
-
        input_dev->name       = "ST LIS3LV02DL Accelerometer";
        input_dev->phys       = DRIVER_NAME "/input0";
        input_dev->id.bustype = BUS_HOST;
        input_dev->id.vendor  = 0;
        input_dev->dev.parent = &lis3->pdev->dev;
 
-       set_bit(EV_ABS, input_dev->evbit);
+       input_dev->open = lis3lv02d_joystick_open;
+       input_dev->close = lis3lv02d_joystick_close;
+
        max_val = (lis3->mdps_max_val * lis3->scale) / LIS3_ACCURACY;
        if (lis3->whoami == WAI_12B) {
                fuzz = LIS3_DEFAULT_FUZZ_12B;
@@ -712,17 +707,32 @@ int lis3lv02d_joystick_enable(struct lis3lv02d *lis3)
        input_set_abs_params(input_dev, ABS_Y, -max_val, max_val, fuzz, flat);
        input_set_abs_params(input_dev, ABS_Z, -max_val, max_val, fuzz, flat);
 
+       input_set_drvdata(input_dev, lis3);
+       lis3->idev = input_dev;
+
+       err = input_setup_polling(input_dev, lis3lv02d_joystick_poll);
+       if (err)
+               goto err_free_input;
+
+       input_set_poll_interval(input_dev, MDPS_POLL_INTERVAL);
+       input_set_min_poll_interval(input_dev, MDPS_POLL_MIN);
+       input_set_max_poll_interval(input_dev, MDPS_POLL_MAX);
+
        lis3->mapped_btns[0] = lis3lv02d_get_axis(abs(lis3->ac.x), btns);
        lis3->mapped_btns[1] = lis3lv02d_get_axis(abs(lis3->ac.y), btns);
        lis3->mapped_btns[2] = lis3lv02d_get_axis(abs(lis3->ac.z), btns);
 
-       err = input_register_polled_device(lis3->idev);
-       if (err) {
-               input_free_polled_device(lis3->idev);
-               lis3->idev = NULL;
-       }
+       err = input_register_device(lis3->idev);
+       if (err)
+               goto err_free_input;
 
+       return 0;
+
+err_free_input:
+       input_free_device(input_dev);
+       lis3->idev = NULL;
        return err;
+
 }
 EXPORT_SYMBOL_GPL(lis3lv02d_joystick_enable);
 
@@ -738,8 +748,7 @@ void lis3lv02d_joystick_disable(struct lis3lv02d *lis3)
 
        if (lis3->irq)
                misc_deregister(&lis3->miscdev);
-       input_unregister_polled_device(lis3->idev);
-       input_free_polled_device(lis3->idev);
+       input_unregister_device(lis3->idev);
        lis3->idev = NULL;
 }
 EXPORT_SYMBOL_GPL(lis3lv02d_joystick_disable);
@@ -895,10 +904,9 @@ static void lis3lv02d_8b_configure(struct lis3lv02d *lis3,
                        (p->click_thresh_y << 4));
 
                if (lis3->idev) {
-                       struct input_dev *input_dev = lis3->idev->input;
-                       input_set_capability(input_dev, EV_KEY, BTN_X);
-                       input_set_capability(input_dev, EV_KEY, BTN_Y);
-                       input_set_capability(input_dev, EV_KEY, BTN_Z);
+                       input_set_capability(lis3->idev, EV_KEY, BTN_X);
+                       input_set_capability(lis3->idev, EV_KEY, BTN_Y);
+                       input_set_capability(lis3->idev, EV_KEY, BTN_Z);
                }
        }
 
index 1b0c998..c394c0b 100644 (file)
@@ -6,7 +6,7 @@
  *  Copyright (C) 2008-2009 Eric Piel
  */
 #include <linux/platform_device.h>
-#include <linux/input-polldev.h>
+#include <linux/input.h>
 #include <linux/regulator/consumer.h>
 #include <linux/miscdevice.h>
 
@@ -281,7 +281,7 @@ struct lis3lv02d {
                                        * (1/1000th of earth gravity)
                                        */
 
-       struct input_polled_dev *idev;     /* input device */
+       struct input_dev        *idev;     /* input device */
        struct platform_device  *pdev;     /* platform device */
        struct regulator_bulk_data regulators[2];
        atomic_t                count;     /* interrupt count after last read */