H A D | mousedev.c | 60 struct mousedev { struct 80 int (*open_device)(struct mousedev *mousedev); 81 void (*close_device)(struct mousedev *mousedev); 98 struct mousedev *mousedev; member in struct:mousedev_client 118 static struct mousedev *mousedev_mix; 121 #define fx(i) (mousedev->old_x[(mousedev->pkt_count - (i)) & 03]) 122 #define fy(i) (mousedev->old_y[(mousedev->pkt_count - (i)) & 03]) 125 struct mousedev *mousedev, mousedev_touchpad_event() 136 if (mousedev->touch && mousedev->pkt_count >= 2) { mousedev_touchpad_event() 143 tmp += mousedev->frac_dx; mousedev_touchpad_event() 144 mousedev->packet.dx = tmp / FRACTION_DENOM; mousedev_touchpad_event() 145 mousedev->frac_dx = mousedev_touchpad_event() 146 tmp - mousedev->packet.dx * FRACTION_DENOM; mousedev_touchpad_event() 152 if (mousedev->touch && mousedev->pkt_count >= 2) { mousedev_touchpad_event() 160 tmp += mousedev->frac_dy; mousedev_touchpad_event() 161 mousedev->packet.dy = tmp / FRACTION_DENOM; mousedev_touchpad_event() 162 mousedev->frac_dy = tmp - mousedev_touchpad_event() 163 mousedev->packet.dy * FRACTION_DENOM; mousedev_touchpad_event() 169 static void mousedev_abs_event(struct input_dev *dev, struct mousedev *mousedev, mousedev_abs_event() argument 186 mousedev->packet.x = ((value - min) * xres) / size; mousedev_abs_event() 187 mousedev->packet.abs_event = 1; mousedev_abs_event() 200 mousedev->packet.y = yres - ((value - min) * yres) / size; mousedev_abs_event() 201 mousedev->packet.abs_event = 1; mousedev_abs_event() 206 static void mousedev_rel_event(struct mousedev *mousedev, mousedev_rel_event() argument 211 mousedev->packet.dx += value; mousedev_rel_event() 215 mousedev->packet.dy -= value; mousedev_rel_event() 219 mousedev->packet.dz -= value; mousedev_rel_event() 224 static void mousedev_key_event(struct mousedev *mousedev, mousedev_key_event() argument 255 set_bit(index, &mousedev->packet.buttons); mousedev_key_event() 258 clear_bit(index, &mousedev->packet.buttons); mousedev_key_event() 263 static void mousedev_notify_readers(struct mousedev *mousedev, mousedev_notify_readers() argument 272 list_for_each_entry_rcu(client, &mousedev->client_list, node) { mousedev_notify_readers() 278 if (client->ready && p->buttons != mousedev->packet.buttons) { mousedev_notify_readers() 303 p->buttons = mousedev->packet.buttons; mousedev_notify_readers() 319 wake_up_interruptible(&mousedev->wait); mousedev_notify_readers() 322 static void mousedev_touchpad_touch(struct mousedev *mousedev, int value) mousedev_touchpad_touch() argument 325 if (mousedev->touch && mousedev_touchpad_touch() 327 mousedev->touch + msecs_to_jiffies(tap_time))) { mousedev_touchpad_touch() 333 set_bit(0, &mousedev->packet.buttons); mousedev_touchpad_touch() 335 mousedev_notify_readers(mousedev, &mousedev_mix->packet); mousedev_touchpad_touch() 338 clear_bit(0, &mousedev->packet.buttons); mousedev_touchpad_touch() 341 mousedev->touch = mousedev->pkt_count = 0; mousedev_touchpad_touch() 342 mousedev->frac_dx = 0; mousedev_touchpad_touch() 343 mousedev->frac_dy = 0; mousedev_touchpad_touch() 345 } else if (!mousedev->touch) mousedev_touchpad_touch() 346 mousedev->touch = jiffies; mousedev_touchpad_touch() 352 struct mousedev *mousedev = handle->private; mousedev_event() local 363 mousedev, code, value); mousedev_event() 365 mousedev_abs_event(handle->dev, mousedev, code, value); mousedev_event() 370 mousedev_rel_event(mousedev, code, value); mousedev_event() 377 mousedev_touchpad_touch(mousedev, value); mousedev_event() 379 mousedev_key_event(mousedev, code, value); mousedev_event() 385 if (mousedev->touch) { mousedev_event() 386 mousedev->pkt_count++; mousedev_event() 396 mousedev_notify_readers(mousedev, &mousedev->packet); mousedev_event() 397 mousedev_notify_readers(mousedev_mix, &mousedev->packet); mousedev_event() 399 mousedev->packet.dx = mousedev->packet.dy = mousedev_event() 400 mousedev->packet.dz = 0; mousedev_event() 401 mousedev->packet.abs_event = 0; mousedev_event() 416 struct mousedev *mousedev = container_of(dev, struct mousedev, dev); mousedev_free() local 418 input_put_device(mousedev->handle.dev); mousedev_free() 419 kfree(mousedev); mousedev_free() 422 static int mousedev_open_device(struct mousedev *mousedev) mousedev_open_device() argument 426 retval = mutex_lock_interruptible(&mousedev->mutex); mousedev_open_device() 430 if (!mousedev->exist) mousedev_open_device() 432 else if (!mousedev->open++) { mousedev_open_device() 433 retval = input_open_device(&mousedev->handle); mousedev_open_device() 435 mousedev->open--; mousedev_open_device() 438 mutex_unlock(&mousedev->mutex); mousedev_open_device() 442 static void mousedev_close_device(struct mousedev *mousedev) mousedev_close_device() argument 444 mutex_lock(&mousedev->mutex); mousedev_close_device() 446 if (mousedev->exist && !--mousedev->open) mousedev_close_device() 447 input_close_device(&mousedev->handle); mousedev_close_device() 449 mutex_unlock(&mousedev->mutex); mousedev_close_device() 457 static int mixdev_open_devices(struct mousedev *mixdev) mixdev_open_devices() 466 struct mousedev *mousedev; mixdev_open_devices() local 468 list_for_each_entry(mousedev, &mousedev_mix_list, mixdev_node) { mixdev_open_devices() 469 if (!mousedev->opened_by_mixdev) { mixdev_open_devices() 470 if (mousedev_open_device(mousedev)) mixdev_open_devices() 473 mousedev->opened_by_mixdev = true; mixdev_open_devices() 487 static void mixdev_close_devices(struct mousedev *mixdev) mixdev_close_devices() 492 struct mousedev *mousedev; mixdev_close_devices() local 494 list_for_each_entry(mousedev, &mousedev_mix_list, mixdev_node) { mixdev_close_devices() 495 if (mousedev->opened_by_mixdev) { mixdev_close_devices() 496 mousedev->opened_by_mixdev = false; mixdev_close_devices() 497 mousedev_close_device(mousedev); mixdev_close_devices() 506 static void mousedev_attach_client(struct mousedev *mousedev, mousedev_attach_client() argument 509 spin_lock(&mousedev->client_lock); mousedev_attach_client() 510 list_add_tail_rcu(&client->node, &mousedev->client_list); mousedev_attach_client() 511 spin_unlock(&mousedev->client_lock); mousedev_attach_client() 514 static void mousedev_detach_client(struct mousedev *mousedev, mousedev_detach_client() argument 517 spin_lock(&mousedev->client_lock); mousedev_detach_client() 519 spin_unlock(&mousedev->client_lock); mousedev_detach_client() 526 struct mousedev *mousedev = client->mousedev; mousedev_release() local 528 mousedev_detach_client(mousedev, client); mousedev_release() 531 mousedev->close_device(mousedev); mousedev_release() 539 struct mousedev *mousedev; mousedev_open() local 544 mousedev = mousedev_mix; mousedev_open() 547 mousedev = container_of(inode->i_cdev, struct mousedev, cdev); mousedev_open() 556 client->mousedev = mousedev; mousedev_open() 557 mousedev_attach_client(mousedev, client); mousedev_open() 559 error = mousedev->open_device(mousedev); mousedev_open() 569 mousedev_detach_client(mousedev, client); mousedev_open() 707 wake_up_interruptible(&client->mousedev->wait); mousedev_write() 716 struct mousedev *mousedev = client->mousedev; mousedev_read() local 720 if (!client->ready && !client->buffer && mousedev->exist && mousedev_read() 724 retval = wait_event_interruptible(mousedev->wait, mousedev_read() 725 !mousedev->exist || client->ready || client->buffer); mousedev_read() 729 if (!mousedev->exist) mousedev_read() 757 struct mousedev *mousedev = client->mousedev; mousedev_poll() local 760 poll_wait(file, &mousedev->wait, wait); mousedev_poll() 762 mask = mousedev->exist ? POLLOUT | POLLWRNORM : POLLHUP | POLLERR; mousedev_poll() 785 static void mousedev_mark_dead(struct mousedev *mousedev) mousedev_mark_dead() argument 787 mutex_lock(&mousedev->mutex); mousedev_mark_dead() 788 mousedev->exist = false; mousedev_mark_dead() 789 mutex_unlock(&mousedev->mutex); mousedev_mark_dead() 796 static void mousedev_hangup(struct mousedev *mousedev) mousedev_hangup() argument 800 spin_lock(&mousedev->client_lock); mousedev_hangup() 801 list_for_each_entry(client, &mousedev->client_list, node) mousedev_hangup() 803 spin_unlock(&mousedev->client_lock); mousedev_hangup() 805 wake_up_interruptible(&mousedev->wait); mousedev_hangup() 808 static void mousedev_cleanup(struct mousedev *mousedev) mousedev_cleanup() argument 810 struct input_handle *handle = &mousedev->handle; mousedev_cleanup() 812 mousedev_mark_dead(mousedev); mousedev_cleanup() 813 mousedev_hangup(mousedev); mousedev_cleanup() 815 cdev_del(&mousedev->cdev); mousedev_cleanup() 817 /* mousedev is marked dead so no one else accesses mousedev->open */ mousedev_cleanup() 818 if (mousedev->open) mousedev_cleanup() 840 static struct mousedev *mousedev_create(struct input_dev *dev, mousedev_create() 844 struct mousedev *mousedev; mousedev_create() local 854 mousedev = kzalloc(sizeof(struct mousedev), GFP_KERNEL); mousedev_create() 855 if (!mousedev) { mousedev_create() 860 INIT_LIST_HEAD(&mousedev->client_list); mousedev_create() 861 INIT_LIST_HEAD(&mousedev->mixdev_node); mousedev_create() 862 spin_lock_init(&mousedev->client_lock); mousedev_create() 863 mutex_init(&mousedev->mutex); mousedev_create() 864 lockdep_set_subclass(&mousedev->mutex, mousedev_create() 866 init_waitqueue_head(&mousedev->wait); mousedev_create() 869 dev_set_name(&mousedev->dev, "mice"); mousedev_create() 871 mousedev->open_device = mixdev_open_devices; mousedev_create() 872 mousedev->close_device = mixdev_close_devices; mousedev_create() 878 dev_set_name(&mousedev->dev, "mouse%d", dev_no); mousedev_create() 880 mousedev->open_device = mousedev_open_device; mousedev_create() 881 mousedev->close_device = mousedev_close_device; mousedev_create() 884 mousedev->exist = true; mousedev_create() 885 mousedev->handle.dev = input_get_device(dev); mousedev_create() 886 mousedev->handle.name = dev_name(&mousedev->dev); mousedev_create() 887 mousedev->handle.handler = handler; mousedev_create() 888 mousedev->handle.private = mousedev; mousedev_create() 890 mousedev->dev.class = &input_class; mousedev_create() 892 mousedev->dev.parent = &dev->dev; mousedev_create() 893 mousedev->dev.devt = MKDEV(INPUT_MAJOR, minor); mousedev_create() 894 mousedev->dev.release = mousedev_free; mousedev_create() 895 device_initialize(&mousedev->dev); mousedev_create() 898 error = input_register_handle(&mousedev->handle); mousedev_create() 903 cdev_init(&mousedev->cdev, &mousedev_fops); mousedev_create() 904 mousedev->cdev.kobj.parent = &mousedev->dev.kobj; mousedev_create() 905 error = cdev_add(&mousedev->cdev, mousedev->dev.devt, 1); mousedev_create() 909 error = device_add(&mousedev->dev); mousedev_create() 913 return mousedev; mousedev_create() 916 mousedev_cleanup(mousedev); mousedev_create() 919 input_unregister_handle(&mousedev->handle); mousedev_create() 921 put_device(&mousedev->dev); mousedev_create() 928 static void mousedev_destroy(struct mousedev *mousedev) mousedev_destroy() argument 930 device_del(&mousedev->dev); mousedev_destroy() 931 mousedev_cleanup(mousedev); mousedev_destroy() 932 input_free_minor(MINOR(mousedev->dev.devt)); mousedev_destroy() 933 if (mousedev != mousedev_mix) mousedev_destroy() 934 input_unregister_handle(&mousedev->handle); mousedev_destroy() 935 put_device(&mousedev->dev); mousedev_destroy() 938 static int mixdev_add_device(struct mousedev *mousedev) mixdev_add_device() argument 947 retval = mousedev_open_device(mousedev); mixdev_add_device() 951 mousedev->opened_by_mixdev = true; mixdev_add_device() 954 get_device(&mousedev->dev); mixdev_add_device() 955 list_add_tail(&mousedev->mixdev_node, &mousedev_mix_list); mixdev_add_device() 962 static void mixdev_remove_device(struct mousedev *mousedev) mixdev_remove_device() argument 966 if (mousedev->opened_by_mixdev) { mixdev_remove_device() 967 mousedev->opened_by_mixdev = false; mixdev_remove_device() 968 mousedev_close_device(mousedev); mixdev_remove_device() 971 list_del_init(&mousedev->mixdev_node); mixdev_remove_device() 974 put_device(&mousedev->dev); mixdev_remove_device() 981 struct mousedev *mousedev; mousedev_connect() local 984 mousedev = mousedev_create(dev, handler, false); mousedev_connect() 985 if (IS_ERR(mousedev)) mousedev_connect() 986 return PTR_ERR(mousedev); mousedev_connect() 988 error = mixdev_add_device(mousedev); mousedev_connect() 990 mousedev_destroy(mousedev); mousedev_connect() 999 struct mousedev *mousedev = handle->private; mousedev_disconnect() local 1001 mixdev_remove_device(mousedev); mousedev_disconnect() 1002 mousedev_destroy(mousedev); mousedev_disconnect() 1062 .name = "mousedev", 124 mousedev_touchpad_event(struct input_dev *dev, struct mousedev *mousedev, unsigned int code, int value) mousedev_touchpad_event() argument
|