lis3: use input_polled_device

Now that there is no need to hookup on the open/close of the joystick,
it's possible to use the simplified interface input_polled_device, instead
of creating our own kthread.

[randy.dunlap@oracle.com: fix Kconfig]
[randy.dunlap@oracle.com: fix Kconfig some more]
Signed-off-by: Eric Piel <eric.piel@tremplin-utc.net>
Signed-off-by: Pavel Machek <pavel@ucw.cz>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
Eric Piel 2009-06-16 15:34:15 -07:00 committed by Linus Torvalds
parent a002ee896d
commit dc6ea97bac
4 changed files with 29 additions and 55 deletions

View File

@ -940,6 +940,7 @@ config SENSORS_HDAPS
config SENSORS_LIS3LV02D config SENSORS_LIS3LV02D
tristate "STMicroeletronics LIS3LV02Dx three-axis digital accelerometer" tristate "STMicroeletronics LIS3LV02Dx three-axis digital accelerometer"
depends on ACPI && INPUT depends on ACPI && INPUT
select INPUT_POLLDEV
select NEW_LEDS select NEW_LEDS
select LEDS_CLASS select LEDS_CLASS
default n default n
@ -967,6 +968,7 @@ config SENSORS_LIS3LV02D
config SENSORS_LIS3_SPI config SENSORS_LIS3_SPI
tristate "STMicroeletronics LIS3LV02Dx three-axis digital accelerometer (SPI)" tristate "STMicroeletronics LIS3LV02Dx three-axis digital accelerometer (SPI)"
depends on !ACPI && SPI_MASTER && INPUT depends on !ACPI && SPI_MASTER && INPUT
select INPUT_POLLDEV
default n default n
help help
This driver provides support for the LIS3LV02Dx accelerometer connected This driver provides support for the LIS3LV02Dx accelerometer connected

View File

@ -27,9 +27,6 @@
#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.h>
#include <linux/kthread.h>
#include <linux/semaphore.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>

View File

@ -27,9 +27,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.h> #include <linux/input-polldev.h>
#include <linux/kthread.h>
#include <linux/semaphore.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>
@ -270,43 +268,16 @@ static struct miscdevice lis3lv02d_misc_device = {
.fops = &lis3lv02d_misc_fops, .fops = &lis3lv02d_misc_fops,
}; };
/** static void lis3lv02d_joystick_poll(struct input_polled_dev *pidev)
* lis3lv02d_joystick_kthread - Kthread polling function
* @data: unused - here to conform to threadfn prototype
*/
static int lis3lv02d_joystick_kthread(void *data)
{ {
int x, y, z; int x, y, z;
while (!kthread_should_stop()) { lis3lv02d_get_xyz(&lis3_dev, &x, &y, &z);
lis3lv02d_get_xyz(&lis3_dev, &x, &y, &z); input_report_abs(pidev->input, ABS_X, x - lis3_dev.xcalib);
input_report_abs(lis3_dev.idev, ABS_X, x - lis3_dev.xcalib); input_report_abs(pidev->input, ABS_Y, y - lis3_dev.ycalib);
input_report_abs(lis3_dev.idev, ABS_Y, y - lis3_dev.ycalib); input_report_abs(pidev->input, ABS_Z, z - lis3_dev.zcalib);
input_report_abs(lis3_dev.idev, ABS_Z, z - lis3_dev.zcalib);
input_sync(lis3_dev.idev);
try_to_freeze();
msleep_interruptible(MDPS_POLL_INTERVAL);
}
return 0;
} }
static int lis3lv02d_joystick_open(struct input_dev *input)
{
lis3_dev.kthread = kthread_run(lis3lv02d_joystick_kthread, NULL, "klis3lv02d");
if (IS_ERR(lis3_dev.kthread)) {
return PTR_ERR(lis3_dev.kthread);
}
return 0;
}
static void lis3lv02d_joystick_close(struct input_dev *input)
{
kthread_stop(lis3_dev.kthread);
}
static inline void lis3lv02d_calibrate_joystick(void) static inline void lis3lv02d_calibrate_joystick(void)
{ {
@ -316,33 +287,36 @@ static inline void lis3lv02d_calibrate_joystick(void)
int lis3lv02d_joystick_enable(void) int lis3lv02d_joystick_enable(void)
{ {
struct input_dev *input_dev;
int err; int err;
if (lis3_dev.idev) if (lis3_dev.idev)
return -EINVAL; return -EINVAL;
lis3_dev.idev = input_allocate_device(); lis3_dev.idev = input_allocate_polled_device();
if (!lis3_dev.idev) if (!lis3_dev.idev)
return -ENOMEM; return -ENOMEM;
lis3_dev.idev->poll = lis3lv02d_joystick_poll;
lis3_dev.idev->poll_interval = MDPS_POLL_INTERVAL;
input_dev = lis3_dev.idev->input;
lis3lv02d_calibrate_joystick(); lis3lv02d_calibrate_joystick();
lis3_dev.idev->name = "ST LIS3LV02DL Accelerometer"; input_dev->name = "ST LIS3LV02DL Accelerometer";
lis3_dev.idev->phys = DRIVER_NAME "/input0"; input_dev->phys = DRIVER_NAME "/input0";
lis3_dev.idev->id.bustype = BUS_HOST; input_dev->id.bustype = BUS_HOST;
lis3_dev.idev->id.vendor = 0; input_dev->id.vendor = 0;
lis3_dev.idev->dev.parent = &lis3_dev.pdev->dev; input_dev->dev.parent = &lis3_dev.pdev->dev;
lis3_dev.idev->open = lis3lv02d_joystick_open;
lis3_dev.idev->close = lis3lv02d_joystick_close;
set_bit(EV_ABS, lis3_dev.idev->evbit); set_bit(EV_ABS, input_dev->evbit);
input_set_abs_params(lis3_dev.idev, ABS_X, -lis3_dev.mdps_max_val, lis3_dev.mdps_max_val, 3, 3); input_set_abs_params(input_dev, ABS_X, -lis3_dev.mdps_max_val, lis3_dev.mdps_max_val, 3, 3);
input_set_abs_params(lis3_dev.idev, ABS_Y, -lis3_dev.mdps_max_val, lis3_dev.mdps_max_val, 3, 3); input_set_abs_params(input_dev, ABS_Y, -lis3_dev.mdps_max_val, lis3_dev.mdps_max_val, 3, 3);
input_set_abs_params(lis3_dev.idev, ABS_Z, -lis3_dev.mdps_max_val, lis3_dev.mdps_max_val, 3, 3); input_set_abs_params(input_dev, ABS_Z, -lis3_dev.mdps_max_val, lis3_dev.mdps_max_val, 3, 3);
err = input_register_device(lis3_dev.idev); err = input_register_polled_device(lis3_dev.idev);
if (err) { if (err) {
input_free_device(lis3_dev.idev); input_free_polled_device(lis3_dev.idev);
lis3_dev.idev = NULL; lis3_dev.idev = NULL;
} }
@ -357,7 +331,7 @@ void lis3lv02d_joystick_disable(void)
if (lis3_dev.irq) if (lis3_dev.irq)
misc_deregister(&lis3lv02d_misc_device); misc_deregister(&lis3lv02d_misc_device);
input_unregister_device(lis3_dev.idev); input_unregister_polled_device(lis3_dev.idev);
lis3_dev.idev = NULL; lis3_dev.idev = NULL;
} }
EXPORT_SYMBOL_GPL(lis3lv02d_joystick_disable); EXPORT_SYMBOL_GPL(lis3lv02d_joystick_disable);

View File

@ -18,6 +18,8 @@
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/ */
#include <linux/platform_device.h>
#include <linux/input-polldev.h>
/* /*
* The actual chip is STMicroelectronics LIS3LV02DL or LIS3LV02DQ that seems to * The actual chip is STMicroelectronics LIS3LV02DL or LIS3LV02DQ that seems to
@ -169,8 +171,7 @@ struct lis3lv02d {
s16 (*read_data) (struct lis3lv02d *lis3, int reg); s16 (*read_data) (struct lis3lv02d *lis3, int reg);
int mdps_max_val; int mdps_max_val;
struct input_dev *idev; /* input device */ struct input_polled_dev *idev; /* input device */
struct task_struct *kthread; /* kthread for input */
struct platform_device *pdev; /* platform device */ struct platform_device *pdev; /* platform device */
atomic_t count; /* interrupt count after last read */ atomic_t count; /* interrupt count after last read */
int xcalib; /* calibrated null value for x */ int xcalib; /* calibrated null value for x */