lis3lv02d: switch to using input device polling mode
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>
This commit is contained in:
Родитель
fa6f90f349
Коммит
bb4d6e0ee8
|
@ -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"
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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 */
|
||||
|
|
Загрузка…
Ссылка в новой задаче