summaryrefslogtreecommitdiffstats
path: root/drivers/usb/input.c
diff options
context:
space:
mode:
authorRalf Baechle <ralf@linux-mips.org>2000-06-19 22:45:37 +0000
committerRalf Baechle <ralf@linux-mips.org>2000-06-19 22:45:37 +0000
commit6d403070f28cd44860fdb3a53be5da0275c65cf4 (patch)
tree0d0e7fe7b5fb7568d19e11d7d862b77a866ce081 /drivers/usb/input.c
parentecf1bf5f6c2e668d03b0a9fb026db7aa41e292e1 (diff)
Merge with 2.4.0-test1-ac21 + pile of MIPS cleanups to make merging
possible. Chainsawed RM200 kernel to compile again. Jazz machine status unknown.
Diffstat (limited to 'drivers/usb/input.c')
-rw-r--r--drivers/usb/input.c39
1 files changed, 32 insertions, 7 deletions
diff --git a/drivers/usb/input.c b/drivers/usb/input.c
index 35f268fac..66a3d2911 100644
--- a/drivers/usb/input.c
+++ b/drivers/usb/input.c
@@ -1,7 +1,7 @@
/*
- * input.c Version 0.1
+ * $Id: input.c,v 1.7 2000/05/28 17:31:36 vojtech Exp $
*
- * Copyright (c) 1999 Vojtech Pavlik
+ * Copyright (c) 1999-2000 Vojtech Pavlik
*
* The input layer module itself
*
@@ -91,11 +91,27 @@ void input_event(struct input_dev *dev, unsigned int type, unsigned int code, in
case EV_ABS:
- if (code > ABS_MAX || !test_bit(code, dev->absbit) || (value == dev->abs[code]))
+ if (code > ABS_MAX || !test_bit(code, dev->absbit))
return;
- dev->abs[code] = value;
+ if (dev->absfuzz[code]) {
+ if ((value > dev->abs[code] - (dev->absfuzz[code] >> 1)) &&
+ (value < dev->abs[code] + (dev->absfuzz[code] >> 1)))
+ return;
+
+ if ((value > dev->abs[code] - dev->absfuzz[code]) &&
+ (value < dev->abs[code] + dev->absfuzz[code]))
+ value = (dev->abs[code] * 3 + value) >> 2;
+ if ((value > dev->abs[code] - (dev->absfuzz[code] << 1)) &&
+ (value < dev->abs[code] + (dev->absfuzz[code] << 1)))
+ value = (dev->abs[code] + value) >> 1;
+ }
+
+ if (dev->abs[code] == value)
+ return;
+
+ dev->abs[code] = value;
break;
case EV_REL:
@@ -344,16 +360,25 @@ void input_unregister_handler(struct input_handler *handler)
static int input_open_file(struct inode *inode, struct file *file)
{
struct input_handler *handler = input_table[MINOR(inode->i_rdev) >> 5];
+ struct file_operations *old_fops;
+ int err;
if (!handler || !handler->fops || !handler->fops->open)
return -ENODEV;
- file->f_op = handler->fops;
-
- return handler->fops->open(inode, file);
+ old_fops = file->f_op;
+ file->f_op = fops_get(handler->fops);
+ err = handler->fops->open(inode, file);
+ if (err) {
+ fops_put(file->f_op);
+ file->f_op = fops_get(old_fops);
+ }
+ fops_put(old_fops);
+ return err;
}
static struct file_operations input_fops = {
+ owner: THIS_MODULE,
open: input_open_file,
};