evdev
struct clock_event_device *evdev = dev_id;
evdev->event_handler(evdev);
struct clock_event_device *evdev = this_cpu_ptr(&clint_clock_event);
evdev->event_handler(evdev);
struct clock_event_device *evdev = this_cpu_ptr(&riscv_clock_event);
evdev->event_handler(evdev);
struct evdev *evdev = client->evdev;
struct input_dev *dev = evdev->handle.dev;
input_inject_event(&evdev->handle, EV_REP, REP_DELAY, u);
input_inject_event(&evdev->handle, EV_REP, REP_PERIOD, v);
return evdev_grab(evdev, client);
return evdev_ungrab(evdev, client);
return evdev_revoke(evdev, client, file);
struct evdev *evdev = client->evdev;
retval = mutex_lock_interruptible(&evdev->mutex);
if (!evdev->exist || client->revoked) {
mutex_unlock(&evdev->mutex);
static void evdev_mark_dead(struct evdev *evdev)
mutex_lock(&evdev->mutex);
evdev->exist = false;
mutex_unlock(&evdev->mutex);
static void evdev_cleanup(struct evdev *evdev)
struct input_handle *handle = &evdev->handle;
evdev_mark_dead(evdev);
evdev_hangup(evdev);
if (evdev->open) {
struct evdev *evdev;
evdev = kzalloc_obj(struct evdev);
if (!evdev) {
INIT_LIST_HEAD(&evdev->client_list);
spin_lock_init(&evdev->client_lock);
mutex_init(&evdev->mutex);
evdev->exist = true;
dev_set_name(&evdev->dev, "event%d", dev_no);
evdev->handle.dev = input_get_device(dev);
evdev->handle.name = dev_name(&evdev->dev);
evdev->handle.handler = handler;
evdev->handle.private = evdev;
evdev->dev.devt = MKDEV(INPUT_MAJOR, minor);
evdev->dev.class = &input_class;
evdev->dev.parent = &dev->dev;
evdev->dev.release = evdev_free;
device_initialize(&evdev->dev);
error = input_register_handle(&evdev->handle);
cdev_init(&evdev->cdev, &evdev_fops);
error = cdev_device_add(&evdev->cdev, &evdev->dev);
evdev_cleanup(evdev);
input_unregister_handle(&evdev->handle);
put_device(&evdev->dev);
struct evdev *evdev = handle->private;
cdev_device_del(&evdev->cdev, &evdev->dev);
evdev_cleanup(evdev);
input_free_minor(MINOR(evdev->dev.devt));
put_device(&evdev->dev);
ktime_t *ev_time = input_get_timestamp(client->evdev->handle.dev);
struct evdev *evdev = handle->private;
client = rcu_dereference(evdev->grab);
list_for_each_entry_rcu(client, &evdev->client_list, node)
struct evdev *evdev = container_of(dev, struct evdev, dev);
input_put_device(evdev->handle.dev);
kfree(evdev);
static int evdev_grab(struct evdev *evdev, struct evdev_client *client)
if (evdev->grab)
error = input_grab_device(&evdev->handle);
rcu_assign_pointer(evdev->grab, client);
static int evdev_ungrab(struct evdev *evdev, struct evdev_client *client)
struct evdev_client *grab = rcu_dereference_protected(evdev->grab,
lockdep_is_held(&evdev->mutex));
rcu_assign_pointer(evdev->grab, NULL);
input_release_device(&evdev->handle);
static void evdev_attach_client(struct evdev *evdev,
spin_lock(&evdev->client_lock);
list_add_tail_rcu(&client->node, &evdev->client_list);
spin_unlock(&evdev->client_lock);
static void evdev_detach_client(struct evdev *evdev,
spin_lock(&evdev->client_lock);
spin_unlock(&evdev->client_lock);
static int evdev_open_device(struct evdev *evdev)
retval = mutex_lock_interruptible(&evdev->mutex);
if (!evdev->exist)
else if (!evdev->open++) {
retval = input_open_device(&evdev->handle);
evdev->open--;
mutex_unlock(&evdev->mutex);
static void evdev_close_device(struct evdev *evdev)
mutex_lock(&evdev->mutex);
if (evdev->exist && !--evdev->open)
input_close_device(&evdev->handle);
mutex_unlock(&evdev->mutex);
static void evdev_hangup(struct evdev *evdev)
spin_lock(&evdev->client_lock);
list_for_each_entry(client, &evdev->client_list, node) {
spin_unlock(&evdev->client_lock);
struct evdev *evdev = client->evdev;
mutex_lock(&evdev->mutex);
if (evdev->exist && !client->revoked)
input_flush_device(&evdev->handle, file);
evdev_ungrab(evdev, client);
mutex_unlock(&evdev->mutex);
evdev_detach_client(evdev, client);
evdev_close_device(evdev);
struct evdev *evdev = container_of(inode->i_cdev, struct evdev, cdev);
unsigned int bufsize = evdev_compute_buffer_size(evdev->handle.dev);
struct evdev *evdev;
client->evdev = evdev;
evdev_attach_client(evdev, client);
error = evdev_open_device(evdev);
evdev_detach_client(evdev, client);
struct evdev *evdev = client->evdev;
retval = mutex_lock_interruptible(&evdev->mutex);
if (!evdev->exist || client->revoked) {
input_inject_event(&evdev->handle,
mutex_unlock(&evdev->mutex);
struct evdev *evdev = client->evdev;
if (!evdev->exist || client->revoked)
!evdev->exist || client->revoked);
struct evdev *evdev = client->evdev;
if (evdev->exist && !client->revoked)
static int evdev_revoke(struct evdev *evdev, struct evdev_client *client,
evdev_ungrab(evdev, client);
input_flush_device(&evdev->handle, file);