+static int mousedev_connect(struct input_handler *handler, struct input_dev *dev,
+ const struct input_device_id *id)
+{
+ struct mousedev *mousedev;
+ int minor;
+ int error;
+
+ for (minor = 0; minor < MOUSEDEV_MINORS && mousedev_table[minor]; minor++);
+ if (minor == MOUSEDEV_MINORS) {
+ printk(KERN_ERR "mousedev: no more free mousedev devices\n");
+ return -ENFILE;
+ }
+
+ mousedev = mousedev_create(dev, handler, minor);
+ if (IS_ERR(mousedev))
+ return PTR_ERR(mousedev);
+
+ error = input_register_handle(&mousedev->handle);
+ if (error)
+ goto err_delete_mousedev;
+
+ error = mixdev_add_device(mousedev);
+ if (error)
+ goto err_unregister_handle;
+
+ return 0;
+
+ err_unregister_handle:
+ input_unregister_handle(&mousedev->handle);
+ err_delete_mousedev:
+ device_unregister(&mousedev->dev);
+ return error;
+}
+
+static void mousedev_disconnect(struct input_handle *handle)
+{
+ struct mousedev *mousedev = handle->private;
+
+ mixdev_remove_device(mousedev);
+ input_unregister_handle(handle);
+ mousedev_destroy(mousedev);
+}
+
+static const struct input_device_id mousedev_ids[] = {