Lines Matching refs:mousedev
58 struct mousedev {
78 int (*open_device)(struct mousedev *mousedev);
79 void (*close_device)(struct mousedev *mousedev);
96 struct mousedev *mousedev;
116 static struct mousedev *mousedev_mix;
119 #define fx(i) (mousedev->old_x[(mousedev->pkt_count - (i)) & 03])
120 #define fy(i) (mousedev->old_y[(mousedev->pkt_count - (i)) & 03])
123 struct mousedev *mousedev,
134 if (mousedev->touch && mousedev->pkt_count >= 2) {
141 tmp += mousedev->frac_dx;
142 mousedev->packet.dx = tmp / FRACTION_DENOM;
143 mousedev->frac_dx =
144 tmp - mousedev->packet.dx * FRACTION_DENOM;
150 if (mousedev->touch && mousedev->pkt_count >= 2) {
158 tmp += mousedev->frac_dy;
159 mousedev->packet.dy = tmp / FRACTION_DENOM;
160 mousedev->frac_dy = tmp -
161 mousedev->packet.dy * FRACTION_DENOM;
167 static void mousedev_abs_event(struct input_dev *dev, struct mousedev *mousedev,
184 mousedev->packet.x = ((value - min) * xres) / size;
185 mousedev->packet.abs_event = 1;
198 mousedev->packet.y = yres - ((value - min) * yres) / size;
199 mousedev->packet.abs_event = 1;
204 static void mousedev_rel_event(struct mousedev *mousedev,
209 mousedev->packet.dx += value;
213 mousedev->packet.dy -= value;
217 mousedev->packet.dz -= value;
222 static void mousedev_key_event(struct mousedev *mousedev,
253 set_bit(index, &mousedev->packet.buttons);
256 clear_bit(index, &mousedev->packet.buttons);
261 static void mousedev_notify_readers(struct mousedev *mousedev,
270 list_for_each_entry_rcu(client, &mousedev->client_list, node) {
276 if (client->ready && p->buttons != mousedev->packet.buttons) {
300 p->buttons = mousedev->packet.buttons;
316 wake_up_interruptible(&mousedev->wait);
319 static void mousedev_touchpad_touch(struct mousedev *mousedev, int value)
322 if (mousedev->touch &&
324 mousedev->touch + msecs_to_jiffies(tap_time))) {
330 set_bit(0, &mousedev->packet.buttons);
332 mousedev_notify_readers(mousedev, &mousedev_mix->packet);
335 clear_bit(0, &mousedev->packet.buttons);
338 mousedev->touch = mousedev->pkt_count = 0;
339 mousedev->frac_dx = 0;
340 mousedev->frac_dy = 0;
342 } else if (!mousedev->touch)
343 mousedev->touch = jiffies;
349 struct mousedev *mousedev = handle->private;
360 mousedev, code, value);
362 mousedev_abs_event(handle->dev, mousedev, code, value);
367 mousedev_rel_event(mousedev, code, value);
374 mousedev_touchpad_touch(mousedev, value);
376 mousedev_key_event(mousedev, code, value);
382 if (mousedev->touch) {
383 mousedev->pkt_count++;
393 mousedev_notify_readers(mousedev, &mousedev->packet);
394 mousedev_notify_readers(mousedev_mix, &mousedev->packet);
396 mousedev->packet.dx = mousedev->packet.dy =
397 mousedev->packet.dz = 0;
398 mousedev->packet.abs_event = 0;
413 struct mousedev *mousedev = container_of(dev, struct mousedev, dev);
415 input_put_device(mousedev->handle.dev);
416 kfree(mousedev);
419 static int mousedev_open_device(struct mousedev *mousedev)
423 retval = mutex_lock_interruptible(&mousedev->mutex);
427 if (!mousedev->exist)
429 else if (!mousedev->open++) {
430 retval = input_open_device(&mousedev->handle);
432 mousedev->open--;
435 mutex_unlock(&mousedev->mutex);
439 static void mousedev_close_device(struct mousedev *mousedev)
441 mutex_lock(&mousedev->mutex);
443 if (mousedev->exist && !--mousedev->open)
444 input_close_device(&mousedev->handle);
446 mutex_unlock(&mousedev->mutex);
454 static int mixdev_open_devices(struct mousedev *mixdev)
463 struct mousedev *mousedev;
465 list_for_each_entry(mousedev, &mousedev_mix_list, mixdev_node) {
466 if (!mousedev->opened_by_mixdev) {
467 if (mousedev_open_device(mousedev))
470 mousedev->opened_by_mixdev = true;
484 static void mixdev_close_devices(struct mousedev *mixdev)
489 struct mousedev *mousedev;
491 list_for_each_entry(mousedev, &mousedev_mix_list, mixdev_node) {
492 if (mousedev->opened_by_mixdev) {
493 mousedev->opened_by_mixdev = false;
494 mousedev_close_device(mousedev);
503 static void mousedev_attach_client(struct mousedev *mousedev,
506 spin_lock(&mousedev->client_lock);
507 list_add_tail_rcu(&client->node, &mousedev->client_list);
508 spin_unlock(&mousedev->client_lock);
511 static void mousedev_detach_client(struct mousedev *mousedev,
514 spin_lock(&mousedev->client_lock);
516 spin_unlock(&mousedev->client_lock);
523 struct mousedev *mousedev = client->mousedev;
525 mousedev_detach_client(mousedev, client);
528 mousedev->close_device(mousedev);
536 struct mousedev *mousedev;
541 mousedev = mousedev_mix;
544 mousedev = container_of(inode->i_cdev, struct mousedev, cdev);
553 client->mousedev = mousedev;
554 mousedev_attach_client(mousedev, client);
556 error = mousedev->open_device(mousedev);
566 mousedev_detach_client(mousedev, client);
711 wake_up_interruptible(&client->mousedev->wait);
720 struct mousedev *mousedev = client->mousedev;
724 if (!client->ready && !client->buffer && mousedev->exist &&
728 retval = wait_event_interruptible(mousedev->wait,
729 !mousedev->exist || client->ready || client->buffer);
733 if (!mousedev->exist)
761 struct mousedev *mousedev = client->mousedev;
764 poll_wait(file, &mousedev->wait, wait);
766 mask = mousedev->exist ? EPOLLOUT | EPOLLWRNORM : EPOLLHUP | EPOLLERR;
789 static void mousedev_mark_dead(struct mousedev *mousedev)
791 mutex_lock(&mousedev->mutex);
792 mousedev->exist = false;
793 mutex_unlock(&mousedev->mutex);
800 static void mousedev_hangup(struct mousedev *mousedev)
804 spin_lock(&mousedev->client_lock);
805 list_for_each_entry(client, &mousedev->client_list, node)
807 spin_unlock(&mousedev->client_lock);
809 wake_up_interruptible(&mousedev->wait);
812 static void mousedev_cleanup(struct mousedev *mousedev)
814 struct input_handle *handle = &mousedev->handle;
816 mousedev_mark_dead(mousedev);
817 mousedev_hangup(mousedev);
819 /* mousedev is marked dead so no one else accesses mousedev->open */
820 if (mousedev->open)
842 static struct mousedev *mousedev_create(struct input_dev *dev,
846 struct mousedev *mousedev;
856 mousedev = kzalloc(sizeof(struct mousedev), GFP_KERNEL);
857 if (!mousedev) {
862 INIT_LIST_HEAD(&mousedev->client_list);
863 INIT_LIST_HEAD(&mousedev->mixdev_node);
864 spin_lock_init(&mousedev->client_lock);
865 mutex_init(&mousedev->mutex);
866 lockdep_set_subclass(&mousedev->mutex,
868 init_waitqueue_head(&mousedev->wait);
871 dev_set_name(&mousedev->dev, "mice");
873 mousedev->open_device = mixdev_open_devices;
874 mousedev->close_device = mixdev_close_devices;
880 dev_set_name(&mousedev->dev, "mouse%d", dev_no);
882 mousedev->open_device = mousedev_open_device;
883 mousedev->close_device = mousedev_close_device;
886 mousedev->exist = true;
887 mousedev->handle.dev = input_get_device(dev);
888 mousedev->handle.name = dev_name(&mousedev->dev);
889 mousedev->handle.handler = handler;
890 mousedev->handle.private = mousedev;
892 mousedev->dev.class = &input_class;
894 mousedev->dev.parent = &dev->dev;
895 mousedev->dev.devt = MKDEV(INPUT_MAJOR, minor);
896 mousedev->dev.release = mousedev_free;
897 device_initialize(&mousedev->dev);
900 error = input_register_handle(&mousedev->handle);
905 cdev_init(&mousedev->cdev, &mousedev_fops);
907 error = cdev_device_add(&mousedev->cdev, &mousedev->dev);
911 return mousedev;
914 mousedev_cleanup(mousedev);
916 input_unregister_handle(&mousedev->handle);
918 put_device(&mousedev->dev);
925 static void mousedev_destroy(struct mousedev *mousedev)
927 cdev_device_del(&mousedev->cdev, &mousedev->dev);
928 mousedev_cleanup(mousedev);
929 input_free_minor(MINOR(mousedev->dev.devt));
930 if (mousedev != mousedev_mix)
931 input_unregister_handle(&mousedev->handle);
932 put_device(&mousedev->dev);
935 static int mixdev_add_device(struct mousedev *mousedev)
944 retval = mousedev_open_device(mousedev);
948 mousedev->opened_by_mixdev = true;
951 get_device(&mousedev->dev);
952 list_add_tail(&mousedev->mixdev_node, &mousedev_mix_list);
959 static void mixdev_remove_device(struct mousedev *mousedev)
963 if (mousedev->opened_by_mixdev) {
964 mousedev->opened_by_mixdev = false;
965 mousedev_close_device(mousedev);
968 list_del_init(&mousedev->mixdev_node);
971 put_device(&mousedev->dev);
978 struct mousedev *mousedev;
981 mousedev = mousedev_create(dev, handler, false);
982 if (IS_ERR(mousedev))
983 return PTR_ERR(mousedev);
985 error = mixdev_add_device(mousedev);
987 mousedev_destroy(mousedev);
996 struct mousedev *mousedev = handle->private;
998 mixdev_remove_device(mousedev);
999 mousedev_destroy(mousedev);
1059 .name = "mousedev",