Lines Matching refs:evdev

38 struct evdev {  struct
57 struct evdev *evdev; argument
262 struct evdev *evdev = client->evdev; in evdev_pass_values() local
296 wake_up_interruptible(&evdev->wait); in evdev_pass_values()
305 struct evdev *evdev = handle->private; in evdev_events() local
316 client = rcu_dereference(evdev->grab); in evdev_events()
321 list_for_each_entry_rcu(client, &evdev->client_list, node) in evdev_events()
348 struct evdev *evdev = client->evdev; in evdev_flush() local
350 mutex_lock(&evdev->mutex); in evdev_flush()
352 if (evdev->exist && !client->revoked) in evdev_flush()
353 input_flush_device(&evdev->handle, file); in evdev_flush()
355 mutex_unlock(&evdev->mutex); in evdev_flush()
361 struct evdev *evdev = container_of(dev, struct evdev, dev); in evdev_free() local
363 input_put_device(evdev->handle.dev); in evdev_free()
364 kfree(evdev); in evdev_free()
371 static int evdev_grab(struct evdev *evdev, struct evdev_client *client) in evdev_grab() argument
375 if (evdev->grab) in evdev_grab()
378 error = input_grab_device(&evdev->handle); in evdev_grab()
382 rcu_assign_pointer(evdev->grab, client); in evdev_grab()
387 static int evdev_ungrab(struct evdev *evdev, struct evdev_client *client) in evdev_ungrab() argument
389 struct evdev_client *grab = rcu_dereference_protected(evdev->grab, in evdev_ungrab()
390 lockdep_is_held(&evdev->mutex)); in evdev_ungrab()
395 rcu_assign_pointer(evdev->grab, NULL); in evdev_ungrab()
397 input_release_device(&evdev->handle); in evdev_ungrab()
402 static void evdev_attach_client(struct evdev *evdev, in evdev_attach_client() argument
405 spin_lock(&evdev->client_lock); in evdev_attach_client()
406 list_add_tail_rcu(&client->node, &evdev->client_list); in evdev_attach_client()
407 spin_unlock(&evdev->client_lock); in evdev_attach_client()
410 static void evdev_detach_client(struct evdev *evdev, in evdev_detach_client() argument
413 spin_lock(&evdev->client_lock); in evdev_detach_client()
415 spin_unlock(&evdev->client_lock); in evdev_detach_client()
419 static int evdev_open_device(struct evdev *evdev) in evdev_open_device() argument
423 retval = mutex_lock_interruptible(&evdev->mutex); in evdev_open_device()
427 if (!evdev->exist) in evdev_open_device()
429 else if (!evdev->open++) { in evdev_open_device()
430 retval = input_open_device(&evdev->handle); in evdev_open_device()
432 evdev->open--; in evdev_open_device()
435 mutex_unlock(&evdev->mutex); in evdev_open_device()
439 static void evdev_close_device(struct evdev *evdev) in evdev_close_device() argument
441 mutex_lock(&evdev->mutex); in evdev_close_device()
443 if (evdev->exist && !--evdev->open) in evdev_close_device()
444 input_close_device(&evdev->handle); in evdev_close_device()
446 mutex_unlock(&evdev->mutex); in evdev_close_device()
453 static void evdev_hangup(struct evdev *evdev) in evdev_hangup() argument
457 spin_lock(&evdev->client_lock); in evdev_hangup()
458 list_for_each_entry(client, &evdev->client_list, node) in evdev_hangup()
460 spin_unlock(&evdev->client_lock); in evdev_hangup()
462 wake_up_interruptible(&evdev->wait); in evdev_hangup()
468 struct evdev *evdev = client->evdev; in evdev_release() local
471 mutex_lock(&evdev->mutex); in evdev_release()
472 evdev_ungrab(evdev, client); in evdev_release()
473 mutex_unlock(&evdev->mutex); in evdev_release()
475 evdev_detach_client(evdev, client); in evdev_release()
482 evdev_close_device(evdev); in evdev_release()
498 struct evdev *evdev = container_of(inode->i_cdev, struct evdev, cdev); in evdev_open() local
499 unsigned int bufsize = evdev_compute_buffer_size(evdev->handle.dev); in evdev_open()
513 client->evdev = evdev; in evdev_open()
514 evdev_attach_client(evdev, client); in evdev_open()
516 error = evdev_open_device(evdev); in evdev_open()
526 evdev_detach_client(evdev, client); in evdev_open()
535 struct evdev *evdev = client->evdev; in evdev_write() local
542 retval = mutex_lock_interruptible(&evdev->mutex); in evdev_write()
546 if (!evdev->exist || client->revoked) { in evdev_write()
559 input_inject_event(&evdev->handle, in evdev_write()
564 mutex_unlock(&evdev->mutex); in evdev_write()
590 struct evdev *evdev = client->evdev; in evdev_read() local
599 if (!evdev->exist || client->revoked) in evdev_read()
626 error = wait_event_interruptible(evdev->wait, in evdev_read()
628 !evdev->exist || client->revoked); in evdev_read()
641 struct evdev *evdev = client->evdev; in evdev_poll() local
644 poll_wait(file, &evdev->wait, wait); in evdev_poll()
646 if (evdev->exist && !client->revoked) in evdev_poll()
973 static int evdev_revoke(struct evdev *evdev, struct evdev_client *client, in evdev_revoke() argument
977 evdev_ungrab(evdev, client); in evdev_revoke()
978 input_flush_device(&evdev->handle, file); in evdev_revoke()
979 wake_up_interruptible(&evdev->wait); in evdev_revoke()
1063 struct evdev *evdev = client->evdev; in evdev_do_ioctl() local
1064 struct input_dev *dev = evdev->handle.dev; in evdev_do_ioctl()
1101 input_inject_event(&evdev->handle, EV_REP, REP_DELAY, u); in evdev_do_ioctl()
1102 input_inject_event(&evdev->handle, EV_REP, REP_PERIOD, v); in evdev_do_ioctl()
1118 return evdev_grab(evdev, client); in evdev_do_ioctl()
1120 return evdev_ungrab(evdev, client); in evdev_do_ioctl()
1126 return evdev_revoke(evdev, client, file); in evdev_do_ioctl()
1290 struct evdev *evdev = client->evdev; in evdev_ioctl_handler() local
1293 retval = mutex_lock_interruptible(&evdev->mutex); in evdev_ioctl_handler()
1297 if (!evdev->exist || client->revoked) { in evdev_ioctl_handler()
1305 mutex_unlock(&evdev->mutex); in evdev_ioctl_handler()
1343 static void evdev_mark_dead(struct evdev *evdev) in evdev_mark_dead() argument
1345 mutex_lock(&evdev->mutex); in evdev_mark_dead()
1346 evdev->exist = false; in evdev_mark_dead()
1347 mutex_unlock(&evdev->mutex); in evdev_mark_dead()
1350 static void evdev_cleanup(struct evdev *evdev) in evdev_cleanup() argument
1352 struct input_handle *handle = &evdev->handle; in evdev_cleanup()
1354 evdev_mark_dead(evdev); in evdev_cleanup()
1355 evdev_hangup(evdev); in evdev_cleanup()
1357 cdev_del(&evdev->cdev); in evdev_cleanup()
1360 if (evdev->open) { in evdev_cleanup()
1373 struct evdev *evdev; in evdev_connect() local
1385 evdev = kzalloc(sizeof(struct evdev), GFP_KERNEL); in evdev_connect()
1386 if (!evdev) { in evdev_connect()
1391 INIT_LIST_HEAD(&evdev->client_list); in evdev_connect()
1392 spin_lock_init(&evdev->client_lock); in evdev_connect()
1393 mutex_init(&evdev->mutex); in evdev_connect()
1394 init_waitqueue_head(&evdev->wait); in evdev_connect()
1395 evdev->exist = true; in evdev_connect()
1401 dev_set_name(&evdev->dev, "event%d", dev_no); in evdev_connect()
1403 evdev->handle.dev = input_get_device(dev); in evdev_connect()
1404 evdev->handle.name = dev_name(&evdev->dev); in evdev_connect()
1405 evdev->handle.handler = handler; in evdev_connect()
1406 evdev->handle.private = evdev; in evdev_connect()
1408 evdev->dev.devt = MKDEV(INPUT_MAJOR, minor); in evdev_connect()
1409 evdev->dev.class = &input_class; in evdev_connect()
1410 evdev->dev.parent = &dev->dev; in evdev_connect()
1411 evdev->dev.release = evdev_free; in evdev_connect()
1412 device_initialize(&evdev->dev); in evdev_connect()
1414 error = input_register_handle(&evdev->handle); in evdev_connect()
1418 cdev_init(&evdev->cdev, &evdev_fops); in evdev_connect()
1419 evdev->cdev.kobj.parent = &evdev->dev.kobj; in evdev_connect()
1420 error = cdev_add(&evdev->cdev, evdev->dev.devt, 1); in evdev_connect()
1424 error = device_add(&evdev->dev); in evdev_connect()
1431 evdev_cleanup(evdev); in evdev_connect()
1433 input_unregister_handle(&evdev->handle); in evdev_connect()
1435 put_device(&evdev->dev); in evdev_connect()
1443 struct evdev *evdev = handle->private; in evdev_disconnect() local
1445 device_del(&evdev->dev); in evdev_disconnect()
1446 evdev_cleanup(evdev); in evdev_disconnect()
1447 input_free_minor(MINOR(evdev->dev.devt)); in evdev_disconnect()
1449 put_device(&evdev->dev); in evdev_disconnect()