p54: remove get_tx_stats() mac80211 op
[safe/jmp/linux-2.6] / drivers / input / mousedev.c
index 79146d6..a13d80f 100644 (file)
 #define MOUSEDEV_MINORS                32
 #define MOUSEDEV_MIX           31
 
+#include <linux/sched.h>
 #include <linux/slab.h>
+#include <linux/smp_lock.h>
 #include <linux/poll.h>
 #include <linux/module.h>
-#include <linux/moduleparam.h>
 #include <linux/init.h>
 #include <linux/input.h>
 #include <linux/random.h>
@@ -60,7 +61,6 @@ struct mousedev {
        int exist;
        int open;
        int minor;
-       char name[16];
        struct input_handle handle;
        wait_queue_head_t wait;
        struct list_head client_list;
@@ -403,18 +403,16 @@ static void mousedev_event(struct input_handle *handle,
 
 static int mousedev_fasync(int fd, struct file *file, int on)
 {
-       int retval;
        struct mousedev_client *client = file->private_data;
 
-       retval = fasync_helper(fd, file, on, &client->fasync);
-
-       return retval < 0 ? retval : 0;
+       return fasync_helper(fd, file, on, &client->fasync);
 }
 
 static void mousedev_free(struct device *dev)
 {
        struct mousedev *mousedev = container_of(dev, struct mousedev, dev);
 
+       input_put_device(mousedev->handle.dev);
        kfree(mousedev);
 }
 
@@ -518,7 +516,6 @@ static int mousedev_release(struct inode *inode, struct file *file)
        struct mousedev_client *client = file->private_data;
        struct mousedev *mousedev = client->mousedev;
 
-       mousedev_fasync(-1, file, 0);
        mousedev_detach_client(mousedev, client);
        kfree(client);
 
@@ -545,16 +542,21 @@ static int mousedev_open(struct inode *inode, struct file *file)
        if (i >= MOUSEDEV_MINORS)
                return -ENODEV;
 
+       lock_kernel();
        error = mutex_lock_interruptible(&mousedev_table_mutex);
-       if (error)
+       if (error) {
+               unlock_kernel();
                return error;
+       }
        mousedev = mousedev_table[i];
        if (mousedev)
                get_device(&mousedev->dev);
        mutex_unlock(&mousedev_table_mutex);
 
-       if (!mousedev)
+       if (!mousedev) {
+               unlock_kernel();
                return -ENODEV;
+       }
 
        client = kzalloc(sizeof(struct mousedev_client), GFP_KERNEL);
        if (!client) {
@@ -573,6 +575,7 @@ static int mousedev_open(struct inode *inode, struct file *file)
                goto err_free_client;
 
        file->private_data = client;
+       unlock_kernel();
        return 0;
 
  err_free_client:
@@ -580,6 +583,7 @@ static int mousedev_open(struct inode *inode, struct file *file)
        kfree(client);
  err_put_mousedev:
        put_device(&mousedev->dev);
+       unlock_kernel();
        return error;
 }
 
@@ -859,20 +863,17 @@ static struct mousedev *mousedev_create(struct input_dev *dev,
        init_waitqueue_head(&mousedev->wait);
 
        if (minor == MOUSEDEV_MIX)
-               strlcpy(mousedev->name, "mice", sizeof(mousedev->name));
+               dev_set_name(&mousedev->dev, "mice");
        else
-               snprintf(mousedev->name, sizeof(mousedev->name),
-                        "mouse%d", minor);
+               dev_set_name(&mousedev->dev, "mouse%d", minor);
 
        mousedev->minor = minor;
        mousedev->exist = 1;
-       mousedev->handle.dev = dev;
-       mousedev->handle.name = mousedev->name;
+       mousedev->handle.dev = input_get_device(dev);
+       mousedev->handle.name = dev_name(&mousedev->dev);
        mousedev->handle.handler = handler;
        mousedev->handle.private = mousedev;
 
-       strlcpy(mousedev->dev.bus_id, mousedev->name,
-               sizeof(mousedev->dev.bus_id));
        mousedev->dev.class = &input_class;
        if (dev)
                mousedev->dev.parent = &dev->dev;
@@ -998,35 +999,46 @@ static const struct input_device_id mousedev_ids[] = {
                .flags = INPUT_DEVICE_ID_MATCH_EVBIT |
                                INPUT_DEVICE_ID_MATCH_KEYBIT |
                                INPUT_DEVICE_ID_MATCH_RELBIT,
-               .evbit = { BIT(EV_KEY) | BIT(EV_REL) },
-               .keybit = { [LONG(BTN_LEFT)] = BIT(BTN_LEFT) },
-               .relbit = { BIT(REL_X) | BIT(REL_Y) },
+               .evbit = { BIT_MASK(EV_KEY) | BIT_MASK(EV_REL) },
+               .keybit = { [BIT_WORD(BTN_LEFT)] = BIT_MASK(BTN_LEFT) },
+               .relbit = { BIT_MASK(REL_X) | BIT_MASK(REL_Y) },
        },      /* A mouse like device, at least one button,
                   two relative axes */
        {
                .flags = INPUT_DEVICE_ID_MATCH_EVBIT |
                                INPUT_DEVICE_ID_MATCH_RELBIT,
-               .evbit = { BIT(EV_KEY) | BIT(EV_REL) },
-               .relbit = { BIT(REL_WHEEL) },
+               .evbit = { BIT_MASK(EV_KEY) | BIT_MASK(EV_REL) },
+               .relbit = { BIT_MASK(REL_WHEEL) },
        },      /* A separate scrollwheel */
        {
                .flags = INPUT_DEVICE_ID_MATCH_EVBIT |
                                INPUT_DEVICE_ID_MATCH_KEYBIT |
                                INPUT_DEVICE_ID_MATCH_ABSBIT,
-               .evbit = { BIT(EV_KEY) | BIT(EV_ABS) },
-               .keybit = { [LONG(BTN_TOUCH)] = BIT(BTN_TOUCH) },
-               .absbit = { BIT(ABS_X) | BIT(ABS_Y) },
+               .evbit = { BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS) },
+               .keybit = { [BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH) },
+               .absbit = { BIT_MASK(ABS_X) | BIT_MASK(ABS_Y) },
        },      /* A tablet like device, at least touch detection,
                   two absolute axes */
        {
                .flags = INPUT_DEVICE_ID_MATCH_EVBIT |
                                INPUT_DEVICE_ID_MATCH_KEYBIT |
                                INPUT_DEVICE_ID_MATCH_ABSBIT,
-               .evbit = { BIT(EV_KEY) | BIT(EV_ABS) },
-               .keybit = { [LONG(BTN_TOOL_FINGER)] = BIT(BTN_TOOL_FINGER) },
-               .absbit = { BIT(ABS_X) | BIT(ABS_Y) | BIT(ABS_PRESSURE) |
-                               BIT(ABS_TOOL_WIDTH) },
+               .evbit = { BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS) },
+               .keybit = { [BIT_WORD(BTN_TOOL_FINGER)] =
+                               BIT_MASK(BTN_TOOL_FINGER) },
+               .absbit = { BIT_MASK(ABS_X) | BIT_MASK(ABS_Y) |
+                               BIT_MASK(ABS_PRESSURE) |
+                               BIT_MASK(ABS_TOOL_WIDTH) },
        },      /* A touchpad */
+       {
+               .flags = INPUT_DEVICE_ID_MATCH_EVBIT |
+                       INPUT_DEVICE_ID_MATCH_KEYBIT |
+                       INPUT_DEVICE_ID_MATCH_ABSBIT,
+               .evbit = { BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS) },
+               .keybit = { [BIT_WORD(BTN_LEFT)] = BIT_MASK(BTN_LEFT) },
+               .absbit = { BIT_MASK(ABS_X) | BIT_MASK(ABS_Y) },
+       },      /* Mouse-like device with absolute X and Y but ordinary
+                  clicks, like hp ILO2 High Performance mouse */
 
        { },    /* Terminating entry */
 };