Lines Matching +full:wake +full:- +full:on +full:- +full:motion
4 * Copyright (c) 1999-2002 Vojtech Pavlik
122 #define fx(i) (mousedev->old_x[(mousedev->pkt_count - (i)) & 03])
123 #define fy(i) (mousedev->old_y[(mousedev->pkt_count - (i)) & 03])
137 if (mousedev->touch && mousedev->pkt_count >= 2) { in mousedev_touchpad_event()
138 size = input_abs_get_max(dev, ABS_X) - in mousedev_touchpad_event()
143 tmp = ((value - fx(2)) * 256 * FRACTION_DENOM) / size; 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()
155 size = input_abs_get_max(dev, ABS_X) - in mousedev_touchpad_event()
160 tmp = -((value - fy(2)) * 256 * FRACTION_DENOM) / size; 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()
181 size = max - min; in mousedev_abs_event()
187 mousedev->packet.x = ((value - min) * xres) / size; in mousedev_abs_event()
188 mousedev->packet.abs_event = 1; in mousedev_abs_event()
195 size = max - min; 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()
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()
256 set_bit(index, &mousedev->packet.buttons); in mousedev_key_event()
257 set_bit(index, &mousedev_mix->packet.buttons); in mousedev_key_event()
259 clear_bit(index, &mousedev->packet.buttons); in mousedev_key_event()
260 clear_bit(index, &mousedev_mix->packet.buttons); in mousedev_key_event()
273 list_for_each_entry_rcu(client, &mousedev->client_list, node) { in mousedev_notify_readers()
276 spin_lock(&client->packet_lock); in mousedev_notify_readers()
278 p = &client->packets[client->head]; in mousedev_notify_readers()
279 if (client->ready && p->buttons != mousedev->packet.buttons) { in mousedev_notify_readers()
280 new_head = (client->head + 1) % PACKET_QUEUE_LEN; in mousedev_notify_readers()
281 if (new_head != client->tail) { in mousedev_notify_readers()
282 p = &client->packets[client->head = new_head]; in mousedev_notify_readers()
287 if (packet->abs_event) { in mousedev_notify_readers()
288 p->dx += packet->x - client->pos_x; in mousedev_notify_readers()
289 p->dy += packet->y - client->pos_y; in mousedev_notify_readers()
290 client->pos_x = packet->x; in mousedev_notify_readers()
291 client->pos_y = packet->y; in mousedev_notify_readers()
294 client->pos_x += packet->dx; in mousedev_notify_readers()
295 client->pos_x = clamp_val(client->pos_x, 0, xres); in mousedev_notify_readers()
297 client->pos_y += packet->dy; in mousedev_notify_readers()
298 client->pos_y = clamp_val(client->pos_y, 0, yres); in mousedev_notify_readers()
300 p->dx += packet->dx; in mousedev_notify_readers()
301 p->dy += packet->dy; in mousedev_notify_readers()
302 p->dz += packet->dz; in mousedev_notify_readers()
303 p->buttons = mousedev->packet.buttons; in mousedev_notify_readers()
305 if (p->dx || p->dy || p->dz || in mousedev_notify_readers()
306 p->buttons != client->last_buttons) in mousedev_notify_readers()
307 client->ready = 1; in mousedev_notify_readers()
309 spin_unlock(&client->packet_lock); in mousedev_notify_readers()
311 if (client->ready) { in mousedev_notify_readers()
312 kill_fasync(&client->fasync, SIGIO, POLL_IN); in mousedev_notify_readers()
319 wake_up_interruptible(&mousedev->wait); in mousedev_notify_readers()
325 if (mousedev->touch && in mousedev_touchpad_touch()
327 mousedev->touch + msecs_to_jiffies(tap_time))) { in mousedev_touchpad_touch()
330 * We rely on the fact that mousedev_mix always has 0 in mousedev_touchpad_touch()
331 * motion packet so we won't mess current position. in mousedev_touchpad_touch()
333 set_bit(0, &mousedev->packet.buttons); in mousedev_touchpad_touch()
334 set_bit(0, &mousedev_mix->packet.buttons); in mousedev_touchpad_touch()
335 mousedev_notify_readers(mousedev, &mousedev_mix->packet); in mousedev_touchpad_touch()
337 &mousedev_mix->packet); in mousedev_touchpad_touch()
338 clear_bit(0, &mousedev->packet.buttons); in mousedev_touchpad_touch()
339 clear_bit(0, &mousedev_mix->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()
358 if (test_bit(BTN_TRIGGER, handle->dev->keybit)) in mousedev_event()
361 if (test_bit(BTN_TOOL_FINGER, handle->dev->keybit)) in mousedev_event()
362 mousedev_touchpad_event(handle->dev, in mousedev_event()
365 mousedev_abs_event(handle->dev, mousedev, code, value); in mousedev_event()
376 test_bit(BTN_TOOL_FINGER, handle->dev->keybit)) 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()
407 static int mousedev_fasync(int fd, struct file *file, int on) in mousedev_fasync() argument
409 struct mousedev_client *client = file->private_data; in mousedev_fasync()
411 return fasync_helper(fd, file, on, &client->fasync); in mousedev_fasync()
418 input_put_device(mousedev->handle.dev); in mousedev_free()
426 retval = mutex_lock_interruptible(&mousedev->mutex); in mousedev_open_device()
430 if (!mousedev->exist) in mousedev_open_device()
431 retval = -ENODEV; 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()
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()
454 * stream. Note that this function is called with mousedev_mix->mutex
461 error = mutex_lock_interruptible(&mixdev->mutex); in mixdev_open_devices()
465 if (!mixdev->open++) { in mixdev_open_devices()
469 if (!mousedev->opened_by_mixdev) { in mixdev_open_devices()
473 mousedev->opened_by_mixdev = true; in mixdev_open_devices()
478 mutex_unlock(&mixdev->mutex); in mixdev_open_devices()
484 * device. Note that this function is called with mousedev_mix->mutex
489 mutex_lock(&mixdev->mutex); in mixdev_close_devices()
491 if (!--mixdev->open) { in mixdev_close_devices()
495 if (mousedev->opened_by_mixdev) { in mixdev_close_devices()
496 mousedev->opened_by_mixdev = false; in mixdev_close_devices()
502 mutex_unlock(&mixdev->mutex); in mixdev_close_devices()
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()
517 spin_lock(&mousedev->client_lock); in mousedev_detach_client()
518 list_del_rcu(&client->node); in mousedev_detach_client()
519 spin_unlock(&mousedev->client_lock); in mousedev_detach_client()
525 struct mousedev_client *client = file->private_data; in mousedev_release()
526 struct mousedev *mousedev = client->mousedev; in mousedev_release()
531 mousedev->close_device(mousedev); in mousedev_release()
547 mousedev = container_of(inode->i_cdev, struct mousedev, cdev); in mousedev_open()
551 return -ENOMEM; in mousedev_open()
553 spin_lock_init(&client->packet_lock); in mousedev_open()
554 client->pos_x = xres / 2; in mousedev_open()
555 client->pos_y = yres / 2; in mousedev_open()
556 client->mousedev = mousedev; in mousedev_open()
559 error = mousedev->open_device(mousedev); in mousedev_open()
563 file->private_data = client; in mousedev_open()
576 struct mousedev_motion *p = &client->packets[client->tail]; in mousedev_packet()
579 dx = clamp_val(p->dx, -127, 127); in mousedev_packet()
580 p->dx -= dx; in mousedev_packet()
582 dy = clamp_val(p->dy, -127, 127); in mousedev_packet()
583 p->dy -= dy; in mousedev_packet()
587 ps2_data[0] |= p->buttons & 0x07; in mousedev_packet()
591 switch (client->mode) { in mousedev_packet()
593 dz = clamp_val(p->dz, -7, 7); in mousedev_packet()
594 p->dz -= dz; in mousedev_packet()
596 ps2_data[3] = (dz & 0x0f) | ((p->buttons & 0x18) << 1); in mousedev_packet()
597 client->bufsiz = 4; in mousedev_packet()
601 dz = clamp_val(p->dz, -127, 127); in mousedev_packet()
602 p->dz -= dz; in mousedev_packet()
604 ps2_data[0] |= ((p->buttons & 0x10) >> 3) | in mousedev_packet()
605 ((p->buttons & 0x08) >> 1); in mousedev_packet()
608 client->bufsiz = 4; in mousedev_packet()
613 p->dz = 0; in mousedev_packet()
615 ps2_data[0] |= ((p->buttons & 0x10) >> 3) | in mousedev_packet()
616 ((p->buttons & 0x08) >> 1); in mousedev_packet()
618 client->bufsiz = 3; in mousedev_packet()
622 if (!p->dx && !p->dy && !p->dz) { in mousedev_packet()
623 if (client->tail == client->head) { in mousedev_packet()
624 client->ready = 0; in mousedev_packet()
625 client->last_buttons = p->buttons; in mousedev_packet()
627 client->tail = (client->tail + 1) % PACKET_QUEUE_LEN; in mousedev_packet()
634 client->ps2[0] = 0xfa; /* ACK */ in mousedev_generate_response()
639 mousedev_packet(client, &client->ps2[1]); in mousedev_generate_response()
640 client->bufsiz++; /* account for leading ACK */ in mousedev_generate_response()
644 switch (client->mode) { in mousedev_generate_response()
646 client->ps2[1] = 0; in mousedev_generate_response()
649 client->ps2[1] = 3; in mousedev_generate_response()
652 client->ps2[1] = 4; in mousedev_generate_response()
655 client->bufsiz = 2; in mousedev_generate_response()
659 client->ps2[1] = 0x60; client->ps2[2] = 3; client->ps2[3] = 200; in mousedev_generate_response()
660 client->bufsiz = 4; in mousedev_generate_response()
664 client->impsseq = client->imexseq = 0; in mousedev_generate_response()
665 client->mode = MOUSEDEV_EMUL_PS2; in mousedev_generate_response()
666 client->ps2[1] = 0xaa; client->ps2[2] = 0x00; in mousedev_generate_response()
667 client->bufsiz = 3; in mousedev_generate_response()
671 client->bufsiz = 1; in mousedev_generate_response()
674 client->buffer = client->bufsiz; in mousedev_generate_response()
680 struct mousedev_client *client = file->private_data; in mousedev_write()
687 return -EFAULT; in mousedev_write()
689 spin_lock_irq(&client->packet_lock); in mousedev_write()
691 if (c == mousedev_imex_seq[client->imexseq]) { in mousedev_write()
692 if (++client->imexseq == MOUSEDEV_SEQ_LEN) { in mousedev_write()
693 client->imexseq = 0; in mousedev_write()
694 client->mode = MOUSEDEV_EMUL_EXPS; in mousedev_write()
697 client->imexseq = 0; in mousedev_write()
699 if (c == mousedev_imps_seq[client->impsseq]) { in mousedev_write()
700 if (++client->impsseq == MOUSEDEV_SEQ_LEN) { in mousedev_write()
701 client->impsseq = 0; in mousedev_write()
702 client->mode = MOUSEDEV_EMUL_IMPS; in mousedev_write()
705 client->impsseq = 0; in mousedev_write()
709 spin_unlock_irq(&client->packet_lock); in mousedev_write()
713 kill_fasync(&client->fasync, SIGIO, POLL_IN); in mousedev_write()
714 wake_up_interruptible(&client->mousedev->wait); in mousedev_write()
722 struct mousedev_client *client = file->private_data; in mousedev_read()
723 struct mousedev *mousedev = client->mousedev; in mousedev_read()
724 u8 data[sizeof(client->ps2)]; in mousedev_read()
727 if (!client->ready && !client->buffer && mousedev->exist && in mousedev_read()
728 (file->f_flags & O_NONBLOCK)) in mousedev_read()
729 return -EAGAIN; 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()
737 return -ENODEV; in mousedev_read()
739 spin_lock_irq(&client->packet_lock); in mousedev_read()
741 if (!client->buffer && client->ready) { in mousedev_read()
742 mousedev_packet(client, client->ps2); in mousedev_read()
743 client->buffer = client->bufsiz; in mousedev_read()
746 if (count > client->buffer) in mousedev_read()
747 count = client->buffer; in mousedev_read()
749 memcpy(data, client->ps2 + client->bufsiz - client->buffer, count); in mousedev_read()
750 client->buffer -= count; in mousedev_read()
752 spin_unlock_irq(&client->packet_lock); in mousedev_read()
755 return -EFAULT; in mousedev_read()
760 /* No kernel lock - fine */
763 struct mousedev_client *client = file->private_data; in mousedev_poll()
764 struct mousedev *mousedev = client->mousedev; in mousedev_poll()
767 poll_wait(file, &mousedev->wait, wait); in mousedev_poll()
769 mask = mousedev->exist ? EPOLLOUT | EPOLLWRNORM : EPOLLHUP | EPOLLERR; in mousedev_poll()
770 if (client->ready || client->buffer) in mousedev_poll()
788 * Mark device non-existent. This disables writes, ioctls and
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()
800 * Wake up users waiting for IO so they can disconnect from
807 spin_lock(&mousedev->client_lock); in mousedev_hangup()
808 list_for_each_entry(client, &mousedev->client_list, node) in mousedev_hangup()
809 kill_fasync(&client->fasync, SIGIO, POLL_HUP); in mousedev_hangup()
810 spin_unlock(&mousedev->client_lock); in mousedev_hangup()
812 wake_up_interruptible(&mousedev->wait); in mousedev_hangup()
817 struct input_handle *handle = &mousedev->handle; in mousedev_cleanup()
822 /* mousedev is marked dead so no one else accesses mousedev->open */ in mousedev_cleanup()
823 if (mousedev->open) in mousedev_cleanup()
861 error = -ENOMEM; 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()
882 dev_no -= MOUSEDEV_MINOR_BASE; 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()
919 input_unregister_handle(&mousedev->handle); in mousedev_create()
921 put_device(&mousedev->dev); in mousedev_create()
930 cdev_device_del(&mousedev->cdev, &mousedev->dev); in mousedev_destroy()
932 input_free_minor(MINOR(mousedev->dev.devt)); in mousedev_destroy()
934 input_unregister_handle(&mousedev->handle); in mousedev_destroy()
935 put_device(&mousedev->dev); in mousedev_destroy()
942 retval = mutex_lock_interruptible(&mousedev_mix->mutex); in mixdev_add_device()
946 if (mousedev_mix->open) { 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()
958 mutex_unlock(&mousedev_mix->mutex); in mixdev_add_device()
964 mutex_lock(&mousedev_mix->mutex); in mixdev_remove_device()
966 if (mousedev->opened_by_mixdev) { in mixdev_remove_device()
967 mousedev->opened_by_mixdev = false; in mixdev_remove_device()
971 list_del_init(&mousedev->mixdev_node); in mixdev_remove_device()
972 mutex_unlock(&mousedev_mix->mutex); in mixdev_remove_device()
974 put_device(&mousedev->dev); in mixdev_remove_device()
999 struct mousedev *mousedev = handle->private; in mousedev_disconnect()
1048 }, /* Mouse-like device with absolute X and Y but ordinary