Lines Matching refs:evdev

28 struct evdev {  struct
47 struct evdev *evdev; argument
145 ktime_t *ev_time = input_get_timestamp(client->evdev->handle.dev); in __evdev_queue_syn_dropped()
294 struct evdev *evdev = handle->private; in evdev_events() local
300 client = rcu_dereference(evdev->grab); in evdev_events()
305 list_for_each_entry_rcu(client, &evdev->client_list, node) in evdev_events()
322 struct evdev *evdev = container_of(dev, struct evdev, dev); in evdev_free() local
324 input_put_device(evdev->handle.dev); in evdev_free()
325 kfree(evdev); in evdev_free()
332 static int evdev_grab(struct evdev *evdev, struct evdev_client *client) in evdev_grab() argument
336 if (evdev->grab) in evdev_grab()
339 error = input_grab_device(&evdev->handle); in evdev_grab()
343 rcu_assign_pointer(evdev->grab, client); in evdev_grab()
348 static int evdev_ungrab(struct evdev *evdev, struct evdev_client *client) in evdev_ungrab() argument
350 struct evdev_client *grab = rcu_dereference_protected(evdev->grab, in evdev_ungrab()
351 lockdep_is_held(&evdev->mutex)); in evdev_ungrab()
356 rcu_assign_pointer(evdev->grab, NULL); in evdev_ungrab()
358 input_release_device(&evdev->handle); in evdev_ungrab()
363 static void evdev_attach_client(struct evdev *evdev, in evdev_attach_client() argument
366 spin_lock(&evdev->client_lock); in evdev_attach_client()
367 list_add_tail_rcu(&client->node, &evdev->client_list); in evdev_attach_client()
368 spin_unlock(&evdev->client_lock); in evdev_attach_client()
371 static void evdev_detach_client(struct evdev *evdev, in evdev_detach_client() argument
374 spin_lock(&evdev->client_lock); in evdev_detach_client()
376 spin_unlock(&evdev->client_lock); in evdev_detach_client()
380 static int evdev_open_device(struct evdev *evdev) in evdev_open_device() argument
384 retval = mutex_lock_interruptible(&evdev->mutex); in evdev_open_device()
388 if (!evdev->exist) in evdev_open_device()
390 else if (!evdev->open++) { in evdev_open_device()
391 retval = input_open_device(&evdev->handle); in evdev_open_device()
393 evdev->open--; in evdev_open_device()
396 mutex_unlock(&evdev->mutex); in evdev_open_device()
400 static void evdev_close_device(struct evdev *evdev) in evdev_close_device() argument
402 mutex_lock(&evdev->mutex); in evdev_close_device()
404 if (evdev->exist && !--evdev->open) in evdev_close_device()
405 input_close_device(&evdev->handle); in evdev_close_device()
407 mutex_unlock(&evdev->mutex); in evdev_close_device()
414 static void evdev_hangup(struct evdev *evdev) in evdev_hangup() argument
418 spin_lock(&evdev->client_lock); in evdev_hangup()
419 list_for_each_entry(client, &evdev->client_list, node) { in evdev_hangup()
423 spin_unlock(&evdev->client_lock); in evdev_hangup()
429 struct evdev *evdev = client->evdev; in evdev_release() local
432 mutex_lock(&evdev->mutex); in evdev_release()
434 if (evdev->exist && !client->revoked) in evdev_release()
435 input_flush_device(&evdev->handle, file); in evdev_release()
437 evdev_ungrab(evdev, client); in evdev_release()
438 mutex_unlock(&evdev->mutex); in evdev_release()
440 evdev_detach_client(evdev, client); in evdev_release()
447 evdev_close_device(evdev); in evdev_release()
463 struct evdev *evdev = container_of(inode->i_cdev, struct evdev, cdev); in evdev_open() local
464 unsigned int bufsize = evdev_compute_buffer_size(evdev->handle.dev); in evdev_open()
475 client->evdev = evdev; in evdev_open()
476 evdev_attach_client(evdev, client); in evdev_open()
478 error = evdev_open_device(evdev); in evdev_open()
488 evdev_detach_client(evdev, client); in evdev_open()
497 struct evdev *evdev = client->evdev; in evdev_write() local
511 retval = mutex_lock_interruptible(&evdev->mutex); in evdev_write()
515 if (!evdev->exist || client->revoked) { in evdev_write()
528 input_inject_event(&evdev->handle, in evdev_write()
534 mutex_unlock(&evdev->mutex); in evdev_write()
560 struct evdev *evdev = client->evdev; in evdev_read() local
569 if (!evdev->exist || client->revoked) in evdev_read()
598 !evdev->exist || client->revoked); in evdev_read()
611 struct evdev *evdev = client->evdev; in evdev_poll() local
616 if (evdev->exist && !client->revoked) in evdev_poll()
941 static int evdev_revoke(struct evdev *evdev, struct evdev_client *client, in evdev_revoke() argument
945 evdev_ungrab(evdev, client); in evdev_revoke()
946 input_flush_device(&evdev->handle, file); in evdev_revoke()
1031 struct evdev *evdev = client->evdev; in evdev_do_ioctl() local
1032 struct input_dev *dev = evdev->handle.dev; in evdev_do_ioctl()
1069 input_inject_event(&evdev->handle, EV_REP, REP_DELAY, u); in evdev_do_ioctl()
1070 input_inject_event(&evdev->handle, EV_REP, REP_PERIOD, v); in evdev_do_ioctl()
1086 return evdev_grab(evdev, client); in evdev_do_ioctl()
1088 return evdev_ungrab(evdev, client); in evdev_do_ioctl()
1094 return evdev_revoke(evdev, client, file); in evdev_do_ioctl()
1258 struct evdev *evdev = client->evdev; in evdev_ioctl_handler() local
1261 retval = mutex_lock_interruptible(&evdev->mutex); in evdev_ioctl_handler()
1265 if (!evdev->exist || client->revoked) { in evdev_ioctl_handler()
1273 mutex_unlock(&evdev->mutex); in evdev_ioctl_handler()
1309 static void evdev_mark_dead(struct evdev *evdev) in evdev_mark_dead() argument
1311 mutex_lock(&evdev->mutex); in evdev_mark_dead()
1312 evdev->exist = false; in evdev_mark_dead()
1313 mutex_unlock(&evdev->mutex); in evdev_mark_dead()
1316 static void evdev_cleanup(struct evdev *evdev) in evdev_cleanup() argument
1318 struct input_handle *handle = &evdev->handle; in evdev_cleanup()
1320 evdev_mark_dead(evdev); in evdev_cleanup()
1321 evdev_hangup(evdev); in evdev_cleanup()
1324 if (evdev->open) { in evdev_cleanup()
1337 struct evdev *evdev; in evdev_connect() local
1349 evdev = kzalloc(sizeof(struct evdev), GFP_KERNEL); in evdev_connect()
1350 if (!evdev) { in evdev_connect()
1355 INIT_LIST_HEAD(&evdev->client_list); in evdev_connect()
1356 spin_lock_init(&evdev->client_lock); in evdev_connect()
1357 mutex_init(&evdev->mutex); in evdev_connect()
1358 evdev->exist = true; in evdev_connect()
1364 dev_set_name(&evdev->dev, "event%d", dev_no); in evdev_connect()
1366 evdev->handle.dev = input_get_device(dev); in evdev_connect()
1367 evdev->handle.name = dev_name(&evdev->dev); in evdev_connect()
1368 evdev->handle.handler = handler; in evdev_connect()
1369 evdev->handle.private = evdev; in evdev_connect()
1371 evdev->dev.devt = MKDEV(INPUT_MAJOR, minor); in evdev_connect()
1372 evdev->dev.class = &input_class; in evdev_connect()
1373 evdev->dev.parent = &dev->dev; in evdev_connect()
1374 evdev->dev.release = evdev_free; in evdev_connect()
1375 device_initialize(&evdev->dev); in evdev_connect()
1377 error = input_register_handle(&evdev->handle); in evdev_connect()
1381 cdev_init(&evdev->cdev, &evdev_fops); in evdev_connect()
1383 error = cdev_device_add(&evdev->cdev, &evdev->dev); in evdev_connect()
1390 evdev_cleanup(evdev); in evdev_connect()
1391 input_unregister_handle(&evdev->handle); in evdev_connect()
1393 put_device(&evdev->dev); in evdev_connect()
1401 struct evdev *evdev = handle->private; in evdev_disconnect() local
1403 cdev_device_del(&evdev->cdev, &evdev->dev); in evdev_disconnect()
1404 evdev_cleanup(evdev); in evdev_disconnect()
1405 input_free_minor(MINOR(evdev->dev.devt)); in evdev_disconnect()
1407 put_device(&evdev->dev); in evdev_disconnect()