Lines Matching +full:free +full:- +full:running

6  * This program is free software; you can redistribute it and/or modify it
8 * the Free Software Foundation; either version 2 of the License, or (at
39 bool running; member
51 * userio_device_write - Write data from serio to a userio device in userspace
57 struct userio_device *userio = id->port_data; in userio_device_write()
59 scoped_guard(spinlock_irqsave, &userio->buf_lock) { in userio_device_write()
60 userio->buf[userio->head] = val; in userio_device_write()
61 userio->head = (userio->head + 1) % USERIO_BUFSIZE; in userio_device_write()
63 if (userio->head == userio->tail) in userio_device_write()
68 wake_up_interruptible(&userio->waitq); in userio_device_write()
78 return -ENOMEM; in userio_char_open()
80 mutex_init(&userio->mutex); in userio_char_open()
81 spin_lock_init(&userio->buf_lock); in userio_char_open()
82 init_waitqueue_head(&userio->waitq); in userio_char_open()
84 userio->serio = kzalloc(sizeof(*userio->serio), GFP_KERNEL); in userio_char_open()
85 if (!userio->serio) in userio_char_open()
86 return -ENOMEM; in userio_char_open()
88 userio->serio->write = userio_device_write; in userio_char_open()
89 userio->serio->port_data = userio; in userio_char_open()
91 file->private_data = no_free_ptr(userio); in userio_char_open()
98 struct userio_device *userio = file->private_data; in userio_char_release()
100 if (userio->running) { in userio_char_release()
102 * Don't free the serio port here, serio_unregister_port() in userio_char_release()
105 serio_unregister_port(userio->serio); in userio_char_release()
107 kfree(userio->serio); in userio_char_release()
120 guard(spinlock_irqsave)(&userio->buf_lock); in userio_fetch_data()
122 available = CIRC_CNT_TO_END(userio->head, userio->tail, in userio_fetch_data()
126 memcpy(buf, &userio->buf[userio->tail], len); in userio_fetch_data()
127 userio->tail = (userio->tail + len) % USERIO_BUFSIZE; in userio_fetch_data()
137 struct userio_device *userio = file->private_data; in userio_char_read()
146 * until we have data (unless the file descriptor is non-blocking in userio_char_read()
155 if (file->f_flags & O_NONBLOCK) in userio_char_read()
156 return -EAGAIN; in userio_char_read()
159 * count == 0 is special - no IO is done but we check in userio_char_read()
165 error = wait_event_interruptible(userio->waitq, in userio_char_read()
166 userio->head != userio->tail); in userio_char_read()
173 return -EFAULT; in userio_char_read()
181 switch (cmd->type) { in userio_execute_cmd()
183 if (!userio->serio->id.type) { in userio_execute_cmd()
186 return -EINVAL; in userio_execute_cmd()
189 if (userio->running) { in userio_execute_cmd()
191 "Begin command sent, but we're already running\n"); in userio_execute_cmd()
192 return -EBUSY; in userio_execute_cmd()
195 userio->running = true; in userio_execute_cmd()
196 serio_register_port(userio->serio); in userio_execute_cmd()
200 if (userio->running) { in userio_execute_cmd()
202 "Can't change port type on an already running userio instance\n"); in userio_execute_cmd()
203 return -EBUSY; in userio_execute_cmd()
206 userio->serio->id.type = cmd->data; in userio_execute_cmd()
210 if (!userio->running) { in userio_execute_cmd()
213 return -ENODEV; in userio_execute_cmd()
216 serio_interrupt(userio->serio, cmd->data, 0); in userio_execute_cmd()
220 return -EOPNOTSUPP; in userio_execute_cmd()
229 struct userio_device *userio = file->private_data; in userio_char_write()
235 return -EINVAL; in userio_char_write()
239 return -EFAULT; in userio_char_write()
241 scoped_cond_guard(mutex_intr, return -EINTR, &userio->mutex) { in userio_char_write()
252 struct userio_device *userio = file->private_data; in userio_char_poll()
254 poll_wait(file, &userio->waitq, wait); in userio_char_poll()
256 if (userio->head != userio->tail) in userio_char_poll()