|
@@ -29,6 +29,14 @@ MODULE_LICENSE("GPL");
|
|
|
|
|
|
#define INPUT_DEVICES 256
|
|
#define INPUT_DEVICES 256
|
|
|
|
|
|
|
|
+/*
|
|
|
|
+ * EV_ABS events which should not be cached are listed here.
|
|
|
|
+ */
|
|
|
|
+static unsigned int input_abs_bypass_init_data[] __initdata = {
|
|
|
|
+ 0
|
|
|
|
+};
|
|
|
|
+static unsigned long input_abs_bypass[BITS_TO_LONGS(ABS_CNT)];
|
|
|
|
+
|
|
static LIST_HEAD(input_dev_list);
|
|
static LIST_HEAD(input_dev_list);
|
|
static LIST_HEAD(input_handler_list);
|
|
static LIST_HEAD(input_handler_list);
|
|
|
|
|
|
@@ -192,6 +200,11 @@ static void input_handle_event(struct input_dev *dev,
|
|
case EV_ABS:
|
|
case EV_ABS:
|
|
if (is_event_supported(code, dev->absbit, ABS_MAX)) {
|
|
if (is_event_supported(code, dev->absbit, ABS_MAX)) {
|
|
|
|
|
|
|
|
+ if (test_bit(code, input_abs_bypass)) {
|
|
|
|
+ disposition = INPUT_PASS_TO_HANDLERS;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+
|
|
value = input_defuzz_abs_event(value,
|
|
value = input_defuzz_abs_event(value,
|
|
dev->abs[code], dev->absfuzz[code]);
|
|
dev->abs[code], dev->absfuzz[code]);
|
|
|
|
|
|
@@ -1634,10 +1647,20 @@ static const struct file_operations input_fops = {
|
|
.open = input_open_file,
|
|
.open = input_open_file,
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+static void __init input_init_abs_bypass(void)
|
|
|
|
+{
|
|
|
|
+ const unsigned int *p;
|
|
|
|
+
|
|
|
|
+ for (p = input_abs_bypass_init_data; *p; p++)
|
|
|
|
+ input_abs_bypass[BIT_WORD(*p)] |= BIT_MASK(*p);
|
|
|
|
+}
|
|
|
|
+
|
|
static int __init input_init(void)
|
|
static int __init input_init(void)
|
|
{
|
|
{
|
|
int err;
|
|
int err;
|
|
|
|
|
|
|
|
+ input_init_abs_bypass();
|
|
|
|
+
|
|
err = class_register(&input_class);
|
|
err = class_register(&input_class);
|
|
if (err) {
|
|
if (err) {
|
|
printk(KERN_ERR "input: unable to register input_dev class\n");
|
|
printk(KERN_ERR "input: unable to register input_dev class\n");
|