Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/bart/ide-2.6
[safe/jmp/linux-2.6] / drivers / input / input.c
index 3070c7a..5d445f4 100644 (file)
@@ -21,6 +21,7 @@
 #include <linux/device.h>
 #include <linux/mutex.h>
 #include <linux/rcupdate.h>
+#include <linux/smp_lock.h>
 
 MODULE_AUTHOR("Vojtech Pavlik <vojtech@suse.cz>");
 MODULE_DESCRIPTION("Input core");
@@ -28,6 +29,24 @@ MODULE_LICENSE("GPL");
 
 #define INPUT_DEVICES  256
 
+/*
+ * EV_ABS events which should not be cached are listed here.
+ */
+static unsigned int input_abs_bypass_init_data[] __initdata = {
+       ABS_MT_TOUCH_MAJOR,
+       ABS_MT_TOUCH_MINOR,
+       ABS_MT_WIDTH_MAJOR,
+       ABS_MT_WIDTH_MINOR,
+       ABS_MT_ORIENTATION,
+       ABS_MT_POSITION_X,
+       ABS_MT_POSITION_Y,
+       ABS_MT_TOOL_TYPE,
+       ABS_MT_BLOB_ID,
+       ABS_MT_TRACKING_ID,
+       0
+};
+static unsigned long input_abs_bypass[BITS_TO_LONGS(ABS_CNT)];
+
 static LIST_HEAD(input_dev_list);
 static LIST_HEAD(input_handler_list);
 
@@ -65,16 +84,16 @@ static int input_defuzz_abs_event(int value, int old_val, int fuzz)
 
 /*
  * Pass event through all open handles. This function is called with
- * dev->event_lock held and interrupts disabled. Because of that we
- * do not need to use rcu_read_lock() here although we are using RCU
- * to access handle list. Note that because of that write-side uses
- * synchronize_sched() instead of synchronize_ru().
+ * dev->event_lock held and interrupts disabled.
  */
 static void input_pass_event(struct input_dev *dev,
                             unsigned int type, unsigned int code, int value)
 {
-       struct input_handle *handle = rcu_dereference(dev->grab);
+       struct input_handle *handle;
+
+       rcu_read_lock();
 
+       handle = rcu_dereference(dev->grab);
        if (handle)
                handle->handler->event(handle, type, code, value);
        else
@@ -82,6 +101,7 @@ static void input_pass_event(struct input_dev *dev,
                        if (handle->open)
                                handle->handler->event(handle,
                                                        type, code, value);
+       rcu_read_unlock();
 }
 
 /*
@@ -130,6 +150,11 @@ static void input_start_autorepeat(struct input_dev *dev, int code)
        }
 }
 
+static void input_stop_autorepeat(struct input_dev *dev)
+{
+       del_timer(&dev->timer);
+}
+
 #define INPUT_IGNORE_EVENT     0
 #define INPUT_PASS_TO_HANDLERS 1
 #define INPUT_PASS_TO_DEVICE   2
@@ -154,6 +179,10 @@ static void input_handle_event(struct input_dev *dev,
                                disposition = INPUT_PASS_TO_HANDLERS;
                        }
                        break;
+               case SYN_MT_REPORT:
+                       dev->sync = 0;
+                       disposition = INPUT_PASS_TO_HANDLERS;
+                       break;
                }
                break;
 
@@ -165,6 +194,8 @@ static void input_handle_event(struct input_dev *dev,
                                __change_bit(code, dev->key);
                                if (value)
                                        input_start_autorepeat(dev, code);
+                               else
+                                       input_stop_autorepeat(dev);
                        }
 
                        disposition = INPUT_PASS_TO_HANDLERS;
@@ -183,6 +214,11 @@ static void input_handle_event(struct input_dev *dev,
        case EV_ABS:
                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,
                                        dev->abs[code], dev->absfuzz[code]);
 
@@ -234,9 +270,13 @@ static void input_handle_event(struct input_dev *dev,
                if (value >= 0)
                        disposition = INPUT_PASS_TO_ALL;
                break;
+
+       case EV_PWR:
+               disposition = INPUT_PASS_TO_ALL;
+               break;
        }
 
-       if (type != EV_SYN)
+       if (disposition != INPUT_IGNORE_EVENT && type != EV_SYN)
                dev->sync = 0;
 
        if ((disposition & INPUT_PASS_TO_DEVICE) && dev->event)
@@ -293,9 +333,11 @@ void input_inject_event(struct input_handle *handle,
        if (is_event_supported(type, dev->evbit, EV_MAX)) {
                spin_lock_irqsave(&dev->event_lock, flags);
 
+               rcu_read_lock();
                grab = rcu_dereference(dev->grab);
                if (!grab || grab == handle)
                        input_handle_event(dev, type, code, value);
+               rcu_read_unlock();
 
                spin_unlock_irqrestore(&dev->event_lock, flags);
        }
@@ -325,11 +367,7 @@ int input_grab_device(struct input_handle *handle)
        }
 
        rcu_assign_pointer(dev->grab, handle);
-       /*
-        * Not using synchronize_rcu() because read-side is protected
-        * by a spinlock with interrupts off instead of rcu_read_lock().
-        */
-       synchronize_sched();
+       synchronize_rcu();
 
  out:
        mutex_unlock(&dev->mutex);
@@ -344,7 +382,7 @@ static void __input_release_device(struct input_handle *handle)
        if (dev->grab == handle) {
                rcu_assign_pointer(dev->grab, NULL);
                /* Make sure input_pass_event() notices that grab is gone */
-               synchronize_sched();
+               synchronize_rcu();
 
                list_for_each_entry(handle, &dev->h_list, d_node)
                        if (handle->open && handle->handler->start)
@@ -404,7 +442,7 @@ int input_open_device(struct input_handle *handle)
                         * Make sure we are not delivering any more events
                         * through this handle
                         */
-                       synchronize_sched();
+                       synchronize_rcu();
                }
        }
 
@@ -451,11 +489,11 @@ void input_close_device(struct input_handle *handle)
 
        if (!--handle->open) {
                /*
-                * synchronize_sched() makes sure that input_pass_event()
+                * synchronize_rcu() makes sure that input_pass_event()
                 * completed and that no more input events are delivered
                 * through this handle
                 */
-               synchronize_sched();
+               synchronize_rcu();
        }
 
        mutex_unlock(&dev->mutex);
@@ -490,7 +528,7 @@ static void input_disconnect_device(struct input_dev *dev)
        if (is_event_supported(EV_KEY, dev->evbit, EV_MAX)) {
                for (code = 0; code <= KEY_MAX; code++) {
                        if (is_event_supported(code, dev->keybit, KEY_MAX) &&
-                           test_bit(code, dev->key)) {
+                           __test_and_clear_bit(code, dev->key)) {
                                input_pass_event(dev, EV_KEY, code, 0);
                        }
                }
@@ -523,7 +561,7 @@ static int input_default_getkeycode(struct input_dev *dev,
        if (!dev->keycodesize)
                return -EINVAL;
 
-       if (scancode < 0 || scancode >= dev->keycodemax)
+       if (scancode >= dev->keycodemax)
                return -EINVAL;
 
        *keycode = input_fetch_keycode(dev, scancode);
@@ -537,10 +575,7 @@ static int input_default_setkeycode(struct input_dev *dev,
        int old_keycode;
        int i;
 
-       if (scancode < 0 || scancode >= dev->keycodemax)
-               return -EINVAL;
-
-       if (keycode < 0 || keycode > KEY_MAX)
+       if (scancode >= dev->keycodemax)
                return -EINVAL;
 
        if (!dev->keycodesize)
@@ -583,12 +618,81 @@ static int input_default_setkeycode(struct input_dev *dev,
        return 0;
 }
 
+/**
+ * input_get_keycode - retrieve keycode currently mapped to a given scancode
+ * @dev: input device which keymap is being queried
+ * @scancode: scancode (or its equivalent for device in question) for which
+ *     keycode is needed
+ * @keycode: result
+ *
+ * This function should be called by anyone interested in retrieving current
+ * keymap. Presently keyboard and evdev handlers use it.
+ */
+int input_get_keycode(struct input_dev *dev, int scancode, int *keycode)
+{
+       if (scancode < 0)
+               return -EINVAL;
+
+       return dev->getkeycode(dev, scancode, keycode);
+}
+EXPORT_SYMBOL(input_get_keycode);
+
+/**
+ * input_get_keycode - assign new keycode to a given scancode
+ * @dev: input device which keymap is being updated
+ * @scancode: scancode (or its equivalent for device in question)
+ * @keycode: new keycode to be assigned to the scancode
+ *
+ * This function should be called by anyone needing to update current
+ * keymap. Presently keyboard and evdev handlers use it.
+ */
+int input_set_keycode(struct input_dev *dev, int scancode, int keycode)
+{
+       unsigned long flags;
+       int old_keycode;
+       int retval;
+
+       if (scancode < 0)
+               return -EINVAL;
+
+       if (keycode < 0 || keycode > KEY_MAX)
+               return -EINVAL;
+
+       spin_lock_irqsave(&dev->event_lock, flags);
+
+       retval = dev->getkeycode(dev, scancode, &old_keycode);
+       if (retval)
+               goto out;
+
+       retval = dev->setkeycode(dev, scancode, keycode);
+       if (retval)
+               goto out;
+
+       /*
+        * Simulate keyup event if keycode is not present
+        * in the keymap anymore
+        */
+       if (test_bit(EV_KEY, dev->evbit) &&
+           !is_event_supported(old_keycode, dev->keybit, KEY_MAX) &&
+           __test_and_clear_bit(old_keycode, dev->key)) {
+
+               input_pass_event(dev, EV_KEY, old_keycode, 0);
+               if (dev->sync)
+                       input_pass_event(dev, EV_SYN, SYN_REPORT, 1);
+       }
+
+ out:
+       spin_unlock_irqrestore(&dev->event_lock, flags);
+
+       return retval;
+}
+EXPORT_SYMBOL(input_set_keycode);
 
 #define MATCH_BIT(bit, max) \
-               for (i = 0; i < NBITS(max); i++) \
+               for (i = 0; i < BITS_TO_LONGS(max); i++) \
                        if ((id->bit[i] & dev->bit[i]) != id->bit[i]) \
                                break; \
-               if (i != NBITS(max)) \
+               if (i != BITS_TO_LONGS(max)) \
                        continue;
 
 static const struct input_device_id *input_match_device(const struct input_device_id *id,
@@ -667,11 +771,11 @@ static inline void input_wakeup_procfs_readers(void)
 
 static unsigned int input_proc_devices_poll(struct file *file, poll_table *wait)
 {
-       int state = input_devices_state;
-
        poll_wait(file, &input_devices_poll_wait, wait);
-       if (state != input_devices_state)
+       if (file->f_version != input_devices_state) {
+               file->f_version = input_devices_state;
                return POLLIN | POLLRDNORM;
+       }
 
        return 0;
 }
@@ -699,7 +803,7 @@ static void input_seq_print_bitmap(struct seq_file *seq, const char *name,
 {
        int i;
 
-       for (i = NBITS(max) - 1; i > 0; i--)
+       for (i = BITS_TO_LONGS(max) - 1; i > 0; i--)
                if (bitmap[i])
                        break;
 
@@ -752,7 +856,7 @@ static int input_devices_seq_show(struct seq_file *seq, void *v)
        return 0;
 }
 
-static struct seq_operations input_devices_seq_ops = {
+static const struct seq_operations input_devices_seq_ops = {
        .start  = input_devices_seq_start,
        .next   = input_devices_seq_next,
        .stop   = input_devices_seq_stop,
@@ -805,7 +909,7 @@ static int input_handlers_seq_show(struct seq_file *seq, void *v)
 
        return 0;
 }
-static struct seq_operations input_handlers_seq_ops = {
+static const struct seq_operations input_handlers_seq_ops = {
        .start  = input_handlers_seq_start,
        .next   = input_handlers_seq_next,
        .stop   = input_handlers_seq_stop,
@@ -829,30 +933,24 @@ static int __init input_proc_init(void)
 {
        struct proc_dir_entry *entry;
 
-       proc_bus_input_dir = proc_mkdir("input", proc_bus);
+       proc_bus_input_dir = proc_mkdir("bus/input", NULL);
        if (!proc_bus_input_dir)
                return -ENOMEM;
 
-       proc_bus_input_dir->owner = THIS_MODULE;
-
-       entry = create_proc_entry("devices", 0, proc_bus_input_dir);
+       entry = proc_create("devices", 0, proc_bus_input_dir,
+                           &input_devices_fileops);
        if (!entry)
                goto fail1;
 
-       entry->owner = THIS_MODULE;
-       entry->proc_fops = &input_devices_fileops;
-
-       entry = create_proc_entry("handlers", 0, proc_bus_input_dir);
+       entry = proc_create("handlers", 0, proc_bus_input_dir,
+                           &input_handlers_fileops);
        if (!entry)
                goto fail2;
 
-       entry->owner = THIS_MODULE;
-       entry->proc_fops = &input_handlers_fileops;
-
        return 0;
 
  fail2:        remove_proc_entry("devices", proc_bus_input_dir);
- fail1: remove_proc_entry("input", proc_bus);
+ fail1: remove_proc_entry("bus/input", NULL);
        return -ENOMEM;
 }
 
@@ -860,7 +958,7 @@ static void input_proc_exit(void)
 {
        remove_proc_entry("devices", proc_bus_input_dir);
        remove_proc_entry("handlers", proc_bus_input_dir);
-       remove_proc_entry("input", proc_bus);
+       remove_proc_entry("bus/input", NULL);
 }
 
 #else /* !CONFIG_PROC_FS */
@@ -893,7 +991,7 @@ static int input_print_modalias_bits(char *buf, int size,
 
        len += snprintf(buf, max(size, 0), "%c", name);
        for (i = min_bit; i < max_bit; i++)
-               if (bm[LONG(i)] & BIT(i))
+               if (bm[BIT_WORD(i)] & BIT_MASK(i))
                        len += snprintf(buf + len, max(size - len, 0), "%X,", i);
        return len;
 }
@@ -992,7 +1090,7 @@ static int input_print_bitmap(char *buf, int buf_size, unsigned long *bitmap,
        int i;
        int len = 0;
 
-       for (i = NBITS(max) - 1; i > 0; i--)
+       for (i = BITS_TO_LONGS(max) - 1; i > 0; i--)
                if (bitmap[i])
                        break;
 
@@ -1267,6 +1365,10 @@ void input_set_capability(struct input_dev *dev, unsigned int type, unsigned int
                __set_bit(code, dev->ffbit);
                break;
 
+       case EV_PWR:
+               /* do nothing */
+               break;
+
        default:
                printk(KERN_ERR
                        "input_set_capability: unknown type %u (code %u)\n",
@@ -1319,11 +1421,8 @@ int input_register_device(struct input_dev *dev)
        if (!dev->setkeycode)
                dev->setkeycode = input_default_setkeycode;
 
-       snprintf(dev->dev.bus_id, sizeof(dev->dev.bus_id),
-                "input%ld", (unsigned long) atomic_inc_return(&input_no) - 1);
-
-       if (dev->cdev.dev)
-               dev->dev.parent = dev->cdev.dev;
+       dev_set_name(&dev->dev, "input%ld",
+                    (unsigned long) atomic_inc_return(&input_no) - 1);
 
        error = device_add(&dev->dev);
        if (error)
@@ -1477,12 +1576,6 @@ int input_register_handle(struct input_handle *handle)
                return error;
        list_add_tail_rcu(&handle->d_node, &dev->h_list);
        mutex_unlock(&dev->mutex);
-       /*
-        * We don't use synchronize_rcu() here because we rely
-        * on dev->event_lock to protect read-side critical
-        * section in input_pass_event().
-        */
-       synchronize_sched();
 
        /*
         * Since we are supposed to be called from ->connect()
@@ -1521,19 +1614,23 @@ void input_unregister_handle(struct input_handle *handle)
        mutex_lock(&dev->mutex);
        list_del_rcu(&handle->d_node);
        mutex_unlock(&dev->mutex);
-       synchronize_sched();
+       synchronize_rcu();
 }
 EXPORT_SYMBOL(input_unregister_handle);
 
 static int input_open_file(struct inode *inode, struct file *file)
 {
-       struct input_handler *handler = input_table[iminor(inode) >> 5];
+       struct input_handler *handler;
        const struct file_operations *old_fops, *new_fops = NULL;
        int err;
 
+       lock_kernel();
        /* No load-on-demand here? */
-       if (!handler || !(new_fops = fops_get(handler->fops)))
-               return -ENODEV;
+       handler = input_table[iminor(inode) >> 5];
+       if (!handler || !(new_fops = fops_get(handler->fops))) {
+               err = -ENODEV;
+               goto out;
+       }
 
        /*
         * That's _really_ odd. Usually NULL ->open means "nothing special",
@@ -1541,7 +1638,8 @@ static int input_open_file(struct inode *inode, struct file *file)
         */
        if (!new_fops->open) {
                fops_put(new_fops);
-               return -ENODEV;
+               err = -ENODEV;
+               goto out;
        }
        old_fops = file->f_op;
        file->f_op = new_fops;
@@ -1553,6 +1651,8 @@ static int input_open_file(struct inode *inode, struct file *file)
                file->f_op = fops_get(old_fops);
        }
        fops_put(old_fops);
+out:
+       unlock_kernel();
        return err;
 }
 
@@ -1561,10 +1661,20 @@ static const struct file_operations input_fops = {
        .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)
 {
        int err;
 
+       input_init_abs_bypass();
+
        err = class_register(&input_class);
        if (err) {
                printk(KERN_ERR "input: unable to register input_dev class\n");