Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3fdbc340 authored by Dmitry Torokhov's avatar Dmitry Torokhov
Browse files

HWMON: ams - convert to use input-polldev



Switch to using input-polldev skeleton instead of implementing polling
loop by itself.

Signed-off-by: default avatarDmitry Torokhov <dtor@mail.ru>
Acked-by: default avatarMichael Hanselmann <linux-kernel@hansmi.ch>
parent d5cf2b99
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -131,6 +131,7 @@ config SENSORS_K8TEMP
config SENSORS_AMS
config SENSORS_AMS
	tristate "Apple Motion Sensor driver"
	tristate "Apple Motion Sensor driver"
	depends on PPC_PMAC && !PPC64 && INPUT && ((ADB_PMU && I2C = y) || (ADB_PMU && !I2C) || I2C) && EXPERIMENTAL
	depends on PPC_PMAC && !PPC64 && INPUT && ((ADB_PMU && I2C = y) || (ADB_PMU && !I2C) || I2C) && EXPERIMENTAL
	select INPUT_POLLDEV
	help
	help
	  Support for the motion sensor included in PowerBooks. Includes
	  Support for the motion sensor included in PowerBooks. Includes
	  implementations for PMU and I2C.
	  implementations for PMU and I2C.
+32 −44
Original line number Original line Diff line number Diff line
@@ -27,11 +27,11 @@ static unsigned int invert;
module_param(invert, bool, 0644);
module_param(invert, bool, 0644);
MODULE_PARM_DESC(invert, "Invert input data on X and Y axis");
MODULE_PARM_DESC(invert, "Invert input data on X and Y axis");


static int ams_input_kthread(void *data)
static void ams_idev_poll(struct input_polled_dev *dev)
{
{
	struct input_dev *idev = dev->input;
	s8 x, y, z;
	s8 x, y, z;


	while (!kthread_should_stop()) {
	mutex_lock(&ams_info.lock);
	mutex_lock(&ams_info.lock);


	ams_sensors(&x, &y, &z);
	ams_sensors(&x, &y, &z);
@@ -40,34 +40,19 @@ static int ams_input_kthread(void *data)
	y -= ams_info.ycalib;
	y -= ams_info.ycalib;
	z -= ams_info.zcalib;
	z -= ams_info.zcalib;


		input_report_abs(ams_info.idev, ABS_X, invert ? -x : x);
	input_report_abs(idev, ABS_X, invert ? -x : x);
		input_report_abs(ams_info.idev, ABS_Y, invert ? -y : y);
	input_report_abs(idev, ABS_Y, invert ? -y : y);
		input_report_abs(ams_info.idev, ABS_Z, z);
	input_report_abs(idev, ABS_Z, z);


		input_sync(ams_info.idev);
	input_sync(idev);


	mutex_unlock(&ams_info.lock);
	mutex_unlock(&ams_info.lock);

		msleep(25);
	}

	return 0;
}

static int ams_input_open(struct input_dev *dev)
{
	ams_info.kthread = kthread_run(ams_input_kthread, NULL, "kams");
	return IS_ERR(ams_info.kthread) ? PTR_ERR(ams_info.kthread) : 0;
}

static void ams_input_close(struct input_dev *dev)
{
	kthread_stop(ams_info.kthread);
}
}


/* Call with ams_info.lock held! */
/* Call with ams_info.lock held! */
static void ams_input_enable(void)
static void ams_input_enable(void)
{
{
	struct input_dev *input;
	s8 x, y, z;
	s8 x, y, z;


	if (ams_info.idev)
	if (ams_info.idev)
@@ -78,27 +63,29 @@ static void ams_input_enable(void)
	ams_info.ycalib = y;
	ams_info.ycalib = y;
	ams_info.zcalib = z;
	ams_info.zcalib = z;


	ams_info.idev = input_allocate_device();
	ams_info.idev = input_allocate_polled_device();
	if (!ams_info.idev)
	if (!ams_info.idev)
		return;
		return;


	ams_info.idev->name = "Apple Motion Sensor";
	ams_info.idev->poll = ams_idev_poll;
	ams_info.idev->id.bustype = ams_info.bustype;
	ams_info.idev->poll_interval = 25;
	ams_info.idev->id.vendor = 0;

	ams_info.idev->open = ams_input_open;
	input = ams_info.idev->input;
	ams_info.idev->close = ams_input_close;
	input->name = "Apple Motion Sensor";
	ams_info.idev->dev.parent = &ams_info.of_dev->dev;
	input->id.bustype = ams_info.bustype;
	input->id.vendor = 0;
	input->dev.parent = &ams_info.of_dev->dev;


	input_set_abs_params(ams_info.idev, ABS_X, -50, 50, 3, 0);
	input_set_abs_params(input, ABS_X, -50, 50, 3, 0);
	input_set_abs_params(ams_info.idev, ABS_Y, -50, 50, 3, 0);
	input_set_abs_params(input, ABS_Y, -50, 50, 3, 0);
	input_set_abs_params(ams_info.idev, ABS_Z, -50, 50, 3, 0);
	input_set_abs_params(input, ABS_Z, -50, 50, 3, 0);


	set_bit(EV_ABS, ams_info.idev->evbit);
	set_bit(EV_ABS, input->evbit);
	set_bit(EV_KEY, ams_info.idev->evbit);
	set_bit(EV_KEY, input->evbit);
	set_bit(BTN_TOUCH, ams_info.idev->keybit);
	set_bit(BTN_TOUCH, input->keybit);


	if (input_register_device(ams_info.idev)) {
	if (input_register_polled_device(ams_info.idev)) {
		input_free_device(ams_info.idev);
		input_free_polled_device(ams_info.idev);
		ams_info.idev = NULL;
		ams_info.idev = NULL;
		return;
		return;
	}
	}
@@ -108,7 +95,8 @@ static void ams_input_enable(void)
static void ams_input_disable(void)
static void ams_input_disable(void)
{
{
	if (ams_info.idev) {
	if (ams_info.idev) {
		input_unregister_device(ams_info.idev);
		input_unregister_polled_device(ams_info.idev);
		input_free_polled_device(ams_info.idev);
		ams_info.idev = NULL;
		ams_info.idev = NULL;
	}
	}
}
}
+2 −3
Original line number Original line Diff line number Diff line
#include <linux/i2c.h>
#include <linux/i2c.h>
#include <linux/input.h>
#include <linux/input-polldev.h>
#include <linux/kthread.h>
#include <linux/kthread.h>
#include <linux/mutex.h>
#include <linux/mutex.h>
#include <linux/spinlock.h>
#include <linux/spinlock.h>
@@ -52,8 +52,7 @@ struct ams {
#endif
#endif


	/* Joystick emulation */
	/* Joystick emulation */
	struct task_struct *kthread;
	struct input_polled_dev *idev;
	struct input_dev *idev;
	__u16 bustype;
	__u16 bustype;


	/* calibrated null values */
	/* calibrated null values */