Lines Matching defs:userio
2 * userio kernel serio device emulation module
28 #include <uapi/linux/userio.h>
30 #define USERIO_NAME "userio"
51 * userio_device_write - Write data from serio to a userio device in userspace
52 * @id: The serio port for the userio device
57 struct userio_device *userio = id->port_data;
59 scoped_guard(spinlock_irqsave, &userio->buf_lock) {
60 userio->buf[userio->head] = val;
61 userio->head = (userio->head + 1) % USERIO_BUFSIZE;
63 if (userio->head == userio->tail)
65 "Buffer overflowed, userio client isn't keeping up");
68 wake_up_interruptible(&userio->waitq);
75 struct userio_device *userio __free(kfree) =
76 kzalloc_obj(*userio);
77 if (!userio)
80 mutex_init(&userio->mutex);
81 spin_lock_init(&userio->buf_lock);
82 init_waitqueue_head(&userio->waitq);
84 userio->serio = kzalloc_obj(*userio->serio);
85 if (!userio->serio)
88 userio->serio->write = userio_device_write;
89 userio->serio->port_data = userio;
91 file->private_data = no_free_ptr(userio);
98 struct userio_device *userio = file->private_data;
100 if (userio->running) {
105 serio_unregister_port(userio->serio);
107 kfree(userio->serio);
110 kfree(userio);
115 static size_t userio_fetch_data(struct userio_device *userio, u8 *buf,
120 guard(spinlock_irqsave)(&userio->buf_lock);
122 available = CIRC_CNT_TO_END(userio->head, userio->tail,
126 memcpy(buf, &userio->buf[userio->tail], len);
127 userio->tail = (userio->tail + len) % USERIO_BUFSIZE;
137 struct userio_device *userio = file->private_data;
150 available = userio_fetch_data(userio, buf, count, ©len);
165 error = wait_event_interruptible(userio->waitq,
166 userio->head != userio->tail);
178 static int userio_execute_cmd(struct userio_device *userio,
183 if (!userio->serio->id.type) {
185 "No port type given on /dev/userio\n");
189 if (userio->running) {
195 userio->running = true;
196 serio_register_port(userio->serio);
200 if (userio->running) {
202 "Can't change port type on an already running userio instance\n");
206 userio->serio->id.type = cmd->data;
210 if (userio->running) {
212 "Can't change port extra on an already running userio instance\n");
216 userio->serio->id.extra = cmd->data;
220 if (userio->running) {
222 "Can't change port id on an already running userio instance\n");
226 userio->serio->id.id = cmd->data;
230 if (userio->running) {
232 "Can't change port proto on an already running userio instance\n");
236 userio->serio->id.proto = cmd->data;
240 if (!userio->running) {
246 serio_interrupt(userio->serio, cmd->data, 0);
259 struct userio_device *userio = file->private_data;
271 scoped_cond_guard(mutex_intr, return -EINTR, &userio->mutex) {
272 error = userio_execute_cmd(userio, &cmd);
282 struct userio_device *userio = file->private_data;
284 poll_wait(file, &userio->waitq, wait);
286 if (userio->head != userio->tail)