Lines Matching refs:client
66 static void __evdev_flush_queue(struct evdev_client *client, unsigned int type) in __evdev_flush_queue() argument
69 unsigned int mask = client->bufsize - 1; in __evdev_flush_queue()
75 head = client->tail; in __evdev_flush_queue()
76 client->packet_head = client->tail; in __evdev_flush_queue()
81 for (i = client->tail; i != client->head; i = (i + 1) & mask) { in __evdev_flush_queue()
82 ev = &client->buffer[i]; in __evdev_flush_queue()
93 client->buffer[head].time = ev->time; in __evdev_flush_queue()
94 client->buffer[head].type = ev->type; in __evdev_flush_queue()
95 client->buffer[head].code = ev->code; in __evdev_flush_queue()
96 client->buffer[head].value = ev->value; in __evdev_flush_queue()
104 client->packet_head = head; in __evdev_flush_queue()
108 client->head = head; in __evdev_flush_queue()
111 static void __evdev_queue_syn_dropped(struct evdev_client *client) in __evdev_queue_syn_dropped() argument
116 time = client->clk_type == EV_CLK_REAL ? in __evdev_queue_syn_dropped()
118 client->clk_type == EV_CLK_MONO ? in __evdev_queue_syn_dropped()
127 client->buffer[client->head++] = ev; in __evdev_queue_syn_dropped()
128 client->head &= client->bufsize - 1; in __evdev_queue_syn_dropped()
130 if (unlikely(client->head == client->tail)) { in __evdev_queue_syn_dropped()
132 client->tail = (client->head - 1) & (client->bufsize - 1); in __evdev_queue_syn_dropped()
133 client->packet_head = client->tail; in __evdev_queue_syn_dropped()
137 static void evdev_queue_syn_dropped(struct evdev_client *client) in evdev_queue_syn_dropped() argument
141 spin_lock_irqsave(&client->buffer_lock, flags); in evdev_queue_syn_dropped()
142 __evdev_queue_syn_dropped(client); in evdev_queue_syn_dropped()
143 spin_unlock_irqrestore(&client->buffer_lock, flags); in evdev_queue_syn_dropped()
146 static int evdev_set_clk_type(struct evdev_client *client, unsigned int clkid) in evdev_set_clk_type() argument
150 if (client->clk_type == clkid) in evdev_set_clk_type()
156 client->clk_type = EV_CLK_REAL; in evdev_set_clk_type()
159 client->clk_type = EV_CLK_MONO; in evdev_set_clk_type()
162 client->clk_type = EV_CLK_BOOT; in evdev_set_clk_type()
172 spin_lock_irqsave(&client->buffer_lock, flags); in evdev_set_clk_type()
174 if (client->head != client->tail) { in evdev_set_clk_type()
175 client->packet_head = client->head = client->tail; in evdev_set_clk_type()
176 __evdev_queue_syn_dropped(client); in evdev_set_clk_type()
179 spin_unlock_irqrestore(&client->buffer_lock, flags); in evdev_set_clk_type()
184 static void __pass_event(struct evdev_client *client, in __pass_event() argument
187 client->buffer[client->head++] = *event; in __pass_event()
188 client->head &= client->bufsize - 1; in __pass_event()
190 if (unlikely(client->head == client->tail)) { in __pass_event()
195 client->tail = (client->head - 2) & (client->bufsize - 1); in __pass_event()
197 client->buffer[client->tail].time = event->time; in __pass_event()
198 client->buffer[client->tail].type = EV_SYN; in __pass_event()
199 client->buffer[client->tail].code = SYN_DROPPED; in __pass_event()
200 client->buffer[client->tail].value = 0; in __pass_event()
202 client->packet_head = client->tail; in __pass_event()
206 client->packet_head = client->head; in __pass_event()
207 kill_fasync(&client->fasync, SIGIO, POLL_IN); in __pass_event()
211 static void evdev_pass_values(struct evdev_client *client, in evdev_pass_values() argument
215 struct evdev *evdev = client->evdev; in evdev_pass_values()
220 if (client->revoked) in evdev_pass_values()
223 event.time = ktime_to_timeval(ev_time[client->clk_type]); in evdev_pass_values()
226 spin_lock(&client->buffer_lock); in evdev_pass_values()
232 __pass_event(client, &event); in evdev_pass_values()
237 spin_unlock(&client->buffer_lock); in evdev_pass_values()
250 struct evdev_client *client; in evdev_events() local
260 client = rcu_dereference(evdev->grab); in evdev_events()
262 if (client) in evdev_events()
263 evdev_pass_values(client, vals, count, ev_time); in evdev_events()
265 list_for_each_entry_rcu(client, &evdev->client_list, node) in evdev_events()
266 evdev_pass_values(client, vals, count, ev_time); in evdev_events()
284 struct evdev_client *client = file->private_data; in evdev_fasync() local
286 return fasync_helper(fd, file, on, &client->fasync); in evdev_fasync()
291 struct evdev_client *client = file->private_data; in evdev_flush() local
292 struct evdev *evdev = client->evdev; in evdev_flush()
296 if (evdev->exist && !client->revoked) in evdev_flush()
315 static int evdev_grab(struct evdev *evdev, struct evdev_client *client) in evdev_grab() argument
326 rcu_assign_pointer(evdev->grab, client); in evdev_grab()
331 static int evdev_ungrab(struct evdev *evdev, struct evdev_client *client) in evdev_ungrab() argument
336 if (grab != client) in evdev_ungrab()
347 struct evdev_client *client) in evdev_attach_client() argument
350 list_add_tail_rcu(&client->node, &evdev->client_list); in evdev_attach_client()
355 struct evdev_client *client) in evdev_detach_client() argument
358 list_del_rcu(&client->node); in evdev_detach_client()
399 struct evdev_client *client; in evdev_hangup() local
402 list_for_each_entry(client, &evdev->client_list, node) in evdev_hangup()
403 kill_fasync(&client->fasync, SIGIO, POLL_HUP); in evdev_hangup()
411 struct evdev_client *client = file->private_data; in evdev_release() local
412 struct evdev *evdev = client->evdev; in evdev_release()
415 evdev_ungrab(evdev, client); in evdev_release()
418 evdev_detach_client(evdev, client); in evdev_release()
420 if (is_vmalloc_addr(client)) in evdev_release()
421 vfree(client); in evdev_release()
423 kfree(client); in evdev_release()
445 struct evdev_client *client; in evdev_open() local
448 client = kzalloc(size, GFP_KERNEL | __GFP_NOWARN); in evdev_open()
449 if (!client) in evdev_open()
450 client = vzalloc(size); in evdev_open()
451 if (!client) in evdev_open()
454 client->bufsize = bufsize; in evdev_open()
455 spin_lock_init(&client->buffer_lock); in evdev_open()
456 client->evdev = evdev; in evdev_open()
457 evdev_attach_client(evdev, client); in evdev_open()
463 file->private_data = client; in evdev_open()
469 evdev_detach_client(evdev, client); in evdev_open()
470 kvfree(client); in evdev_open()
477 struct evdev_client *client = file->private_data; in evdev_write() local
478 struct evdev *evdev = client->evdev; in evdev_write()
489 if (!evdev->exist || client->revoked) { in evdev_write()
511 static int evdev_fetch_next_event(struct evdev_client *client, in evdev_fetch_next_event() argument
516 spin_lock_irq(&client->buffer_lock); in evdev_fetch_next_event()
518 have_event = client->packet_head != client->tail; in evdev_fetch_next_event()
520 *event = client->buffer[client->tail++]; in evdev_fetch_next_event()
521 client->tail &= client->bufsize - 1; in evdev_fetch_next_event()
524 spin_unlock_irq(&client->buffer_lock); in evdev_fetch_next_event()
532 struct evdev_client *client = file->private_data; in evdev_read() local
533 struct evdev *evdev = client->evdev; in evdev_read()
542 if (!evdev->exist || client->revoked) in evdev_read()
545 if (client->packet_head == client->tail && in evdev_read()
557 evdev_fetch_next_event(client, &event)) { in evdev_read()
570 client->packet_head != client->tail || in evdev_read()
571 !evdev->exist || client->revoked); in evdev_read()
583 struct evdev_client *client = file->private_data; in evdev_poll() local
584 struct evdev *evdev = client->evdev; in evdev_poll()
589 if (evdev->exist && !client->revoked) in evdev_poll()
594 if (client->packet_head != client->tail) in evdev_poll()
785 static int evdev_handle_get_val(struct evdev_client *client, in evdev_handle_get_val() argument
801 spin_lock(&client->buffer_lock); in evdev_handle_get_val()
807 __evdev_flush_queue(client, type); in evdev_handle_get_val()
809 spin_unlock_irq(&client->buffer_lock); in evdev_handle_get_val()
813 evdev_queue_syn_dropped(client); in evdev_handle_get_val()
844 static int evdev_revoke(struct evdev *evdev, struct evdev_client *client, in evdev_revoke() argument
847 client->revoked = true; in evdev_revoke()
848 evdev_ungrab(evdev, client); in evdev_revoke()
858 struct evdev_client *client = file->private_data; in evdev_do_ioctl() local
859 struct evdev *evdev = client->evdev; in evdev_do_ioctl()
913 return evdev_grab(evdev, client); in evdev_do_ioctl()
915 return evdev_ungrab(evdev, client); in evdev_do_ioctl()
921 return evdev_revoke(evdev, client, file); in evdev_do_ioctl()
927 return evdev_set_clk_type(client, i); in evdev_do_ioctl()
956 return evdev_handle_get_val(client, dev, EV_KEY, dev->key, in evdev_do_ioctl()
960 return evdev_handle_get_val(client, dev, EV_LED, dev->led, in evdev_do_ioctl()
964 return evdev_handle_get_val(client, dev, EV_SND, dev->snd, in evdev_do_ioctl()
968 return evdev_handle_get_val(client, dev, EV_SW, dev->sw, in evdev_do_ioctl()
1060 struct evdev_client *client = file->private_data; in evdev_ioctl_handler() local
1061 struct evdev *evdev = client->evdev; in evdev_ioctl_handler()
1068 if (!evdev->exist || client->revoked) { in evdev_ioctl_handler()