Lines Matching refs:mousedev
61 struct mousedev { struct
81 int (*open_device)(struct mousedev *mousedev); argument
82 void (*close_device)(struct mousedev *mousedev); argument
99 struct mousedev *mousedev; member
119 static struct mousedev *mousedev_mix;
122 #define fx(i) (mousedev->old_x[(mousedev->pkt_count - (i)) & 03])
123 #define fy(i) (mousedev->old_y[(mousedev->pkt_count - (i)) & 03])
126 struct mousedev *mousedev, in mousedev_touchpad_event() argument
137 if (mousedev->touch && mousedev->pkt_count >= 2) { in mousedev_touchpad_event()
144 tmp += mousedev->frac_dx; in mousedev_touchpad_event()
145 mousedev->packet.dx = tmp / FRACTION_DENOM; in mousedev_touchpad_event()
146 mousedev->frac_dx = in mousedev_touchpad_event()
147 tmp - mousedev->packet.dx * FRACTION_DENOM; in mousedev_touchpad_event()
153 if (mousedev->touch && mousedev->pkt_count >= 2) { in mousedev_touchpad_event()
161 tmp += mousedev->frac_dy; in mousedev_touchpad_event()
162 mousedev->packet.dy = tmp / FRACTION_DENOM; in mousedev_touchpad_event()
163 mousedev->frac_dy = tmp - in mousedev_touchpad_event()
164 mousedev->packet.dy * FRACTION_DENOM; in mousedev_touchpad_event()
170 static void mousedev_abs_event(struct input_dev *dev, struct mousedev *mousedev, in mousedev_abs_event() argument
187 mousedev->packet.x = ((value - min) * xres) / size; in mousedev_abs_event()
188 mousedev->packet.abs_event = 1; in mousedev_abs_event()
201 mousedev->packet.y = yres - ((value - min) * yres) / size; in mousedev_abs_event()
202 mousedev->packet.abs_event = 1; in mousedev_abs_event()
207 static void mousedev_rel_event(struct mousedev *mousedev, in mousedev_rel_event() argument
212 mousedev->packet.dx += value; in mousedev_rel_event()
216 mousedev->packet.dy -= value; in mousedev_rel_event()
220 mousedev->packet.dz -= value; in mousedev_rel_event()
225 static void mousedev_key_event(struct mousedev *mousedev, in mousedev_key_event() argument
256 set_bit(index, &mousedev->packet.buttons); in mousedev_key_event()
259 clear_bit(index, &mousedev->packet.buttons); in mousedev_key_event()
264 static void mousedev_notify_readers(struct mousedev *mousedev, in mousedev_notify_readers() argument
273 list_for_each_entry_rcu(client, &mousedev->client_list, node) { in mousedev_notify_readers()
279 if (client->ready && p->buttons != mousedev->packet.buttons) { in mousedev_notify_readers()
303 p->buttons = mousedev->packet.buttons; in mousedev_notify_readers()
319 wake_up_interruptible(&mousedev->wait); in mousedev_notify_readers()
322 static void mousedev_touchpad_touch(struct mousedev *mousedev, int value) in mousedev_touchpad_touch() argument
325 if (mousedev->touch && in mousedev_touchpad_touch()
327 mousedev->touch + msecs_to_jiffies(tap_time))) { in mousedev_touchpad_touch()
333 set_bit(0, &mousedev->packet.buttons); in mousedev_touchpad_touch()
335 mousedev_notify_readers(mousedev, &mousedev_mix->packet); in mousedev_touchpad_touch()
338 clear_bit(0, &mousedev->packet.buttons); in mousedev_touchpad_touch()
341 mousedev->touch = mousedev->pkt_count = 0; in mousedev_touchpad_touch()
342 mousedev->frac_dx = 0; in mousedev_touchpad_touch()
343 mousedev->frac_dy = 0; in mousedev_touchpad_touch()
345 } else if (!mousedev->touch) in mousedev_touchpad_touch()
346 mousedev->touch = jiffies; in mousedev_touchpad_touch()
352 struct mousedev *mousedev = handle->private; in mousedev_event() local
363 mousedev, code, value); in mousedev_event()
365 mousedev_abs_event(handle->dev, mousedev, code, value); in mousedev_event()
370 mousedev_rel_event(mousedev, code, value); in mousedev_event()
377 mousedev_touchpad_touch(mousedev, value); in mousedev_event()
379 mousedev_key_event(mousedev, code, value); in mousedev_event()
385 if (mousedev->touch) { in mousedev_event()
386 mousedev->pkt_count++; in mousedev_event()
396 mousedev_notify_readers(mousedev, &mousedev->packet); in mousedev_event()
397 mousedev_notify_readers(mousedev_mix, &mousedev->packet); in mousedev_event()
399 mousedev->packet.dx = mousedev->packet.dy = in mousedev_event()
400 mousedev->packet.dz = 0; in mousedev_event()
401 mousedev->packet.abs_event = 0; in mousedev_event()
416 struct mousedev *mousedev = container_of(dev, struct mousedev, dev); in mousedev_free() local
418 input_put_device(mousedev->handle.dev); in mousedev_free()
419 kfree(mousedev); in mousedev_free()
422 static int mousedev_open_device(struct mousedev *mousedev) in mousedev_open_device() argument
426 retval = mutex_lock_interruptible(&mousedev->mutex); in mousedev_open_device()
430 if (!mousedev->exist) in mousedev_open_device()
432 else if (!mousedev->open++) { in mousedev_open_device()
433 retval = input_open_device(&mousedev->handle); in mousedev_open_device()
435 mousedev->open--; in mousedev_open_device()
438 mutex_unlock(&mousedev->mutex); in mousedev_open_device()
442 static void mousedev_close_device(struct mousedev *mousedev) in mousedev_close_device() argument
444 mutex_lock(&mousedev->mutex); in mousedev_close_device()
446 if (mousedev->exist && !--mousedev->open) in mousedev_close_device()
447 input_close_device(&mousedev->handle); in mousedev_close_device()
449 mutex_unlock(&mousedev->mutex); in mousedev_close_device()
457 static int mixdev_open_devices(struct mousedev *mixdev) in mixdev_open_devices()
466 struct mousedev *mousedev; in mixdev_open_devices() local
468 list_for_each_entry(mousedev, &mousedev_mix_list, mixdev_node) { in mixdev_open_devices()
469 if (!mousedev->opened_by_mixdev) { in mixdev_open_devices()
470 if (mousedev_open_device(mousedev)) in mixdev_open_devices()
473 mousedev->opened_by_mixdev = true; in mixdev_open_devices()
487 static void mixdev_close_devices(struct mousedev *mixdev) in mixdev_close_devices()
492 struct mousedev *mousedev; in mixdev_close_devices() local
494 list_for_each_entry(mousedev, &mousedev_mix_list, mixdev_node) { in mixdev_close_devices()
495 if (mousedev->opened_by_mixdev) { in mixdev_close_devices()
496 mousedev->opened_by_mixdev = false; in mixdev_close_devices()
497 mousedev_close_device(mousedev); in mixdev_close_devices()
506 static void mousedev_attach_client(struct mousedev *mousedev, in mousedev_attach_client() argument
509 spin_lock(&mousedev->client_lock); in mousedev_attach_client()
510 list_add_tail_rcu(&client->node, &mousedev->client_list); in mousedev_attach_client()
511 spin_unlock(&mousedev->client_lock); in mousedev_attach_client()
514 static void mousedev_detach_client(struct mousedev *mousedev, in mousedev_detach_client() argument
517 spin_lock(&mousedev->client_lock); in mousedev_detach_client()
519 spin_unlock(&mousedev->client_lock); in mousedev_detach_client()
526 struct mousedev *mousedev = client->mousedev; in mousedev_release() local
528 mousedev_detach_client(mousedev, client); in mousedev_release()
531 mousedev->close_device(mousedev); in mousedev_release()
539 struct mousedev *mousedev; in mousedev_open() local
544 mousedev = mousedev_mix; in mousedev_open()
547 mousedev = container_of(inode->i_cdev, struct mousedev, cdev); in mousedev_open()
556 client->mousedev = mousedev; in mousedev_open()
557 mousedev_attach_client(mousedev, client); in mousedev_open()
559 error = mousedev->open_device(mousedev); in mousedev_open()
569 mousedev_detach_client(mousedev, client); in mousedev_open()
714 wake_up_interruptible(&client->mousedev->wait); in mousedev_write()
723 struct mousedev *mousedev = client->mousedev; in mousedev_read() local
727 if (!client->ready && !client->buffer && mousedev->exist && in mousedev_read()
731 retval = wait_event_interruptible(mousedev->wait, in mousedev_read()
732 !mousedev->exist || client->ready || client->buffer); in mousedev_read()
736 if (!mousedev->exist) in mousedev_read()
764 struct mousedev *mousedev = client->mousedev; in mousedev_poll() local
767 poll_wait(file, &mousedev->wait, wait); in mousedev_poll()
769 mask = mousedev->exist ? EPOLLOUT | EPOLLWRNORM : EPOLLHUP | EPOLLERR; in mousedev_poll()
792 static void mousedev_mark_dead(struct mousedev *mousedev) in mousedev_mark_dead() argument
794 mutex_lock(&mousedev->mutex); in mousedev_mark_dead()
795 mousedev->exist = false; in mousedev_mark_dead()
796 mutex_unlock(&mousedev->mutex); in mousedev_mark_dead()
803 static void mousedev_hangup(struct mousedev *mousedev) in mousedev_hangup() argument
807 spin_lock(&mousedev->client_lock); in mousedev_hangup()
808 list_for_each_entry(client, &mousedev->client_list, node) in mousedev_hangup()
810 spin_unlock(&mousedev->client_lock); in mousedev_hangup()
812 wake_up_interruptible(&mousedev->wait); in mousedev_hangup()
815 static void mousedev_cleanup(struct mousedev *mousedev) in mousedev_cleanup() argument
817 struct input_handle *handle = &mousedev->handle; in mousedev_cleanup()
819 mousedev_mark_dead(mousedev); in mousedev_cleanup()
820 mousedev_hangup(mousedev); in mousedev_cleanup()
823 if (mousedev->open) in mousedev_cleanup()
845 static struct mousedev *mousedev_create(struct input_dev *dev, in mousedev_create()
849 struct mousedev *mousedev; in mousedev_create() local
859 mousedev = kzalloc(sizeof(struct mousedev), GFP_KERNEL); in mousedev_create()
860 if (!mousedev) { in mousedev_create()
865 INIT_LIST_HEAD(&mousedev->client_list); in mousedev_create()
866 INIT_LIST_HEAD(&mousedev->mixdev_node); in mousedev_create()
867 spin_lock_init(&mousedev->client_lock); in mousedev_create()
868 mutex_init(&mousedev->mutex); in mousedev_create()
869 lockdep_set_subclass(&mousedev->mutex, in mousedev_create()
871 init_waitqueue_head(&mousedev->wait); in mousedev_create()
874 dev_set_name(&mousedev->dev, "mice"); in mousedev_create()
876 mousedev->open_device = mixdev_open_devices; in mousedev_create()
877 mousedev->close_device = mixdev_close_devices; in mousedev_create()
883 dev_set_name(&mousedev->dev, "mouse%d", dev_no); in mousedev_create()
885 mousedev->open_device = mousedev_open_device; in mousedev_create()
886 mousedev->close_device = mousedev_close_device; in mousedev_create()
889 mousedev->exist = true; in mousedev_create()
890 mousedev->handle.dev = input_get_device(dev); in mousedev_create()
891 mousedev->handle.name = dev_name(&mousedev->dev); in mousedev_create()
892 mousedev->handle.handler = handler; in mousedev_create()
893 mousedev->handle.private = mousedev; in mousedev_create()
895 mousedev->dev.class = &input_class; in mousedev_create()
897 mousedev->dev.parent = &dev->dev; in mousedev_create()
898 mousedev->dev.devt = MKDEV(INPUT_MAJOR, minor); in mousedev_create()
899 mousedev->dev.release = mousedev_free; in mousedev_create()
900 device_initialize(&mousedev->dev); in mousedev_create()
903 error = input_register_handle(&mousedev->handle); in mousedev_create()
908 cdev_init(&mousedev->cdev, &mousedev_fops); in mousedev_create()
910 error = cdev_device_add(&mousedev->cdev, &mousedev->dev); in mousedev_create()
914 return mousedev; in mousedev_create()
917 mousedev_cleanup(mousedev); in mousedev_create()
919 input_unregister_handle(&mousedev->handle); in mousedev_create()
921 put_device(&mousedev->dev); in mousedev_create()
928 static void mousedev_destroy(struct mousedev *mousedev) in mousedev_destroy() argument
930 cdev_device_del(&mousedev->cdev, &mousedev->dev); in mousedev_destroy()
931 mousedev_cleanup(mousedev); in mousedev_destroy()
932 input_free_minor(MINOR(mousedev->dev.devt)); in mousedev_destroy()
933 if (mousedev != mousedev_mix) in mousedev_destroy()
934 input_unregister_handle(&mousedev->handle); in mousedev_destroy()
935 put_device(&mousedev->dev); in mousedev_destroy()
938 static int mixdev_add_device(struct mousedev *mousedev) in mixdev_add_device() argument
947 retval = mousedev_open_device(mousedev); in mixdev_add_device()
951 mousedev->opened_by_mixdev = true; in mixdev_add_device()
954 get_device(&mousedev->dev); in mixdev_add_device()
955 list_add_tail(&mousedev->mixdev_node, &mousedev_mix_list); in mixdev_add_device()
962 static void mixdev_remove_device(struct mousedev *mousedev) in mixdev_remove_device() argument
966 if (mousedev->opened_by_mixdev) { in mixdev_remove_device()
967 mousedev->opened_by_mixdev = false; in mixdev_remove_device()
968 mousedev_close_device(mousedev); in mixdev_remove_device()
971 list_del_init(&mousedev->mixdev_node); in mixdev_remove_device()
974 put_device(&mousedev->dev); in mixdev_remove_device()
981 struct mousedev *mousedev; in mousedev_connect() local
984 mousedev = mousedev_create(dev, handler, false); in mousedev_connect()
985 if (IS_ERR(mousedev)) in mousedev_connect()
986 return PTR_ERR(mousedev); in mousedev_connect()
988 error = mixdev_add_device(mousedev); in mousedev_connect()
990 mousedev_destroy(mousedev); in mousedev_connect()
999 struct mousedev *mousedev = handle->private; in mousedev_disconnect() local
1001 mixdev_remove_device(mousedev); in mousedev_disconnect()
1002 mousedev_destroy(mousedev); in mousedev_disconnect()