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

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
...@@ -131,6 +131,7 @@ config SENSORS_K8TEMP ...@@ -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.
......
...@@ -27,47 +27,32 @@ static unsigned int invert; ...@@ -27,47 +27,32 @@ 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);
x -= ams_info.xcalib;
y -= ams_info.ycalib;
z -= ams_info.zcalib;
input_report_abs(ams_info.idev, ABS_X, invert ? -x : x);
input_report_abs(ams_info.idev, ABS_Y, invert ? -y : y);
input_report_abs(ams_info.idev, ABS_Z, z);
input_sync(ams_info.idev); ams_sensors(&x, &y, &z);
mutex_unlock(&ams_info.lock); x -= ams_info.xcalib;
y -= ams_info.ycalib;
z -= ams_info.zcalib;
msleep(25); input_report_abs(idev, ABS_X, invert ? -x : x);
} input_report_abs(idev, ABS_Y, invert ? -y : y);
input_report_abs(idev, ABS_Z, z);
return 0; input_sync(idev);
}
static int ams_input_open(struct input_dev *dev) mutex_unlock(&ams_info.lock);
{
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) ...@@ -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) ...@@ -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;
} }
} }
......
#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 { ...@@ -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 */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment