Commit bb4d6e0e authored by Dmitry Torokhov's avatar Dmitry Torokhov Committed by Greg Kroah-Hartman
Browse files

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: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
Link: https://lore.kernel.org/r/20191002215658.GA134561@dtor-ws


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent fa6f90f3
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -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"
+44 −36
Original line number Diff line number Diff line
@@ -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);
		}
	}

+2 −2
Original line number Diff line number Diff line
@@ -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 */