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:
parent
fa6f90f349
commit
bb4d6e0ee8
@ -8,7 +8,6 @@ menu "Misc devices"
|
|||||||
config SENSORS_LIS3LV02D
|
config SENSORS_LIS3LV02D
|
||||||
tristate
|
tristate
|
||||||
depends on INPUT
|
depends on INPUT
|
||||||
select INPUT_POLLDEV
|
|
||||||
|
|
||||||
config AD525X_DPOT
|
config AD525X_DPOT
|
||||||
tristate "Analog Devices Digital Potentiometers"
|
tristate "Analog Devices Digital Potentiometers"
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/input-polldev.h>
|
#include <linux/input.h>
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
#include <linux/wait.h>
|
#include <linux/wait.h>
|
||||||
#include <linux/poll.h>
|
#include <linux/poll.h>
|
||||||
@ -434,23 +434,23 @@ int lis3lv02d_poweron(struct lis3lv02d *lis3)
|
|||||||
EXPORT_SYMBOL_GPL(lis3lv02d_poweron);
|
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;
|
int x, y, z;
|
||||||
|
|
||||||
mutex_lock(&lis3->mutex);
|
mutex_lock(&lis3->mutex);
|
||||||
lis3lv02d_get_xyz(lis3, &x, &y, &z);
|
lis3lv02d_get_xyz(lis3, &x, &y, &z);
|
||||||
input_report_abs(pidev->input, ABS_X, x);
|
input_report_abs(input, ABS_X, x);
|
||||||
input_report_abs(pidev->input, ABS_Y, y);
|
input_report_abs(input, ABS_Y, y);
|
||||||
input_report_abs(pidev->input, ABS_Z, z);
|
input_report_abs(input, ABS_Z, z);
|
||||||
input_sync(pidev->input);
|
input_sync(input);
|
||||||
mutex_unlock(&lis3->mutex);
|
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)
|
if (lis3->pm_dev)
|
||||||
pm_runtime_get_sync(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
|
* Update coordinates for the case where poll interval is 0 and
|
||||||
* the chip in running purely under interrupt control
|
* 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);
|
atomic_set(&lis3->wake_thread, 0);
|
||||||
if (lis3->pm_dev)
|
if (lis3->pm_dev)
|
||||||
@ -497,7 +499,7 @@ out:
|
|||||||
|
|
||||||
static void lis302dl_interrupt_handle_click(struct lis3lv02d *lis3)
|
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;
|
u8 click_src;
|
||||||
|
|
||||||
mutex_lock(&lis3->mutex);
|
mutex_lock(&lis3->mutex);
|
||||||
@ -677,26 +679,19 @@ int lis3lv02d_joystick_enable(struct lis3lv02d *lis3)
|
|||||||
if (lis3->idev)
|
if (lis3->idev)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
lis3->idev = input_allocate_polled_device();
|
input_dev = input_allocate_device();
|
||||||
if (!lis3->idev)
|
if (!input_dev)
|
||||||
return -ENOMEM;
|
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->name = "ST LIS3LV02DL Accelerometer";
|
||||||
input_dev->phys = DRIVER_NAME "/input0";
|
input_dev->phys = DRIVER_NAME "/input0";
|
||||||
input_dev->id.bustype = BUS_HOST;
|
input_dev->id.bustype = BUS_HOST;
|
||||||
input_dev->id.vendor = 0;
|
input_dev->id.vendor = 0;
|
||||||
input_dev->dev.parent = &lis3->pdev->dev;
|
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;
|
max_val = (lis3->mdps_max_val * lis3->scale) / LIS3_ACCURACY;
|
||||||
if (lis3->whoami == WAI_12B) {
|
if (lis3->whoami == WAI_12B) {
|
||||||
fuzz = LIS3_DEFAULT_FUZZ_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_Y, -max_val, max_val, fuzz, flat);
|
||||||
input_set_abs_params(input_dev, ABS_Z, -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[0] = lis3lv02d_get_axis(abs(lis3->ac.x), btns);
|
||||||
lis3->mapped_btns[1] = lis3lv02d_get_axis(abs(lis3->ac.y), 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);
|
lis3->mapped_btns[2] = lis3lv02d_get_axis(abs(lis3->ac.z), btns);
|
||||||
|
|
||||||
err = input_register_polled_device(lis3->idev);
|
err = input_register_device(lis3->idev);
|
||||||
if (err) {
|
if (err)
|
||||||
input_free_polled_device(lis3->idev);
|
goto err_free_input;
|
||||||
lis3->idev = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
err_free_input:
|
||||||
|
input_free_device(input_dev);
|
||||||
|
lis3->idev = NULL;
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(lis3lv02d_joystick_enable);
|
EXPORT_SYMBOL_GPL(lis3lv02d_joystick_enable);
|
||||||
|
|
||||||
@ -738,8 +748,7 @@ void lis3lv02d_joystick_disable(struct lis3lv02d *lis3)
|
|||||||
|
|
||||||
if (lis3->irq)
|
if (lis3->irq)
|
||||||
misc_deregister(&lis3->miscdev);
|
misc_deregister(&lis3->miscdev);
|
||||||
input_unregister_polled_device(lis3->idev);
|
input_unregister_device(lis3->idev);
|
||||||
input_free_polled_device(lis3->idev);
|
|
||||||
lis3->idev = NULL;
|
lis3->idev = NULL;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(lis3lv02d_joystick_disable);
|
EXPORT_SYMBOL_GPL(lis3lv02d_joystick_disable);
|
||||||
@ -895,10 +904,9 @@ static void lis3lv02d_8b_configure(struct lis3lv02d *lis3,
|
|||||||
(p->click_thresh_y << 4));
|
(p->click_thresh_y << 4));
|
||||||
|
|
||||||
if (lis3->idev) {
|
if (lis3->idev) {
|
||||||
struct input_dev *input_dev = lis3->idev->input;
|
input_set_capability(lis3->idev, EV_KEY, BTN_X);
|
||||||
input_set_capability(input_dev, EV_KEY, BTN_X);
|
input_set_capability(lis3->idev, EV_KEY, BTN_Y);
|
||||||
input_set_capability(input_dev, EV_KEY, BTN_Y);
|
input_set_capability(lis3->idev, EV_KEY, BTN_Z);
|
||||||
input_set_capability(input_dev, EV_KEY, BTN_Z);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
* Copyright (C) 2008-2009 Eric Piel
|
* Copyright (C) 2008-2009 Eric Piel
|
||||||
*/
|
*/
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/input-polldev.h>
|
#include <linux/input.h>
|
||||||
#include <linux/regulator/consumer.h>
|
#include <linux/regulator/consumer.h>
|
||||||
#include <linux/miscdevice.h>
|
#include <linux/miscdevice.h>
|
||||||
|
|
||||||
@ -281,7 +281,7 @@ struct lis3lv02d {
|
|||||||
* (1/1000th of earth gravity)
|
* (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 platform_device *pdev; /* platform device */
|
||||||
struct regulator_bulk_data regulators[2];
|
struct regulator_bulk_data regulators[2];
|
||||||
atomic_t count; /* interrupt count after last read */
|
atomic_t count; /* interrupt count after last read */
|
||||||
|
Loading…
Reference in New Issue
Block a user