13 #include <linux/sched.h>
14 #include <linux/slab.h>
15 #include <linux/poll.h>
16 #include <linux/module.h>
17 #include <linux/serio.h>
20 #include <linux/device.h>
22 #include <linux/wait.h>
25 #define DRIVER_DESC "Raw serio driver"
31 #define SERIO_RAW_QUEUE_LEN 64
59 static int serio_raw_fasync(
int fd,
struct file *
file,
int on)
66 static struct serio_raw *serio_raw_locate(
int minor)
71 if (serio_raw->
dev.minor == minor)
80 struct serio_raw *serio_raw;
88 serio_raw = serio_raw_locate(iminor(inode));
94 if (serio_raw->
dead) {
108 kref_get(&serio_raw->
kref);
110 serio_pause_rx(serio_raw->
serio);
112 serio_continue_rx(serio_raw->
serio);
119 static void serio_raw_free(
struct kref *
kref)
121 struct serio_raw *serio_raw =
128 static int serio_raw_release(
struct inode *inode,
struct file *file)
131 struct serio_raw *serio_raw = client->
serio_raw;
133 serio_pause_rx(serio_raw->
serio);
135 serio_continue_rx(serio_raw->
serio);
139 kref_put(&serio_raw->
kref, serio_raw_free);
144 static bool serio_raw_fetch_byte(
struct serio_raw *serio_raw,
char *
c)
148 serio_pause_rx(serio_raw->
serio);
150 empty = serio_raw->
head == serio_raw->
tail;
156 serio_continue_rx(serio_raw->
serio);
161 static ssize_t serio_raw_read(
struct file *file,
char __user *
buffer,
162 size_t count, loff_t *ppos)
165 struct serio_raw *serio_raw = client->
serio_raw;
174 if (serio_raw->
head == serio_raw->
tail &&
181 while (read < count && serio_raw_fetch_byte(serio_raw, &c)) {
192 serio_raw->
head != serio_raw->
tail ||
202 static ssize_t serio_raw_write(
struct file *file,
const char __user *buffer,
203 size_t count, loff_t *ppos)
206 struct serio_raw *serio_raw = client->
serio_raw;
214 if (serio_raw->
dead) {
228 if (serio_write(serio_raw->
serio, c)) {
243 static unsigned int serio_raw_poll(
struct file *file,
poll_table *
wait)
246 struct serio_raw *serio_raw = client->
serio_raw;
249 poll_wait(file, &serio_raw->
wait, wait);
252 if (serio_raw->
head != serio_raw->
tail)
260 .open = serio_raw_open,
261 .release = serio_raw_release,
262 .read = serio_raw_read,
263 .write = serio_raw_write,
264 .poll = serio_raw_poll,
265 .fasync = serio_raw_fasync,
277 struct serio_raw *serio_raw = serio_get_drvdata(serio);
279 unsigned int head = serio_raw->
head;
297 struct serio_raw *serio_raw;
300 serio_raw = kzalloc(
sizeof(
struct serio_raw),
GFP_KERNEL);
302 dev_dbg(&serio->dev,
"can't allocate memory for a device\n");
308 kref_init(&serio_raw->
kref);
315 serio_set_drvdata(serio, serio_raw);
329 serio_raw->
dev.name = serio_raw->
name;
330 serio_raw->
dev.parent = &serio->dev;
331 serio_raw->
dev.fops = &serio_raw_fops;
341 "failed to register raw access device for %s\n",
346 dev_info(&serio->dev,
"raw access enabled on %s (%s, minor %d)\n",
347 serio->phys, serio_raw->
name, serio_raw->
dev.minor);
351 list_del_init(&serio_raw->
node);
355 serio_set_drvdata(serio,
NULL);
356 kref_put(&serio_raw->
kref, serio_raw_free);
360 static int serio_raw_reconnect(
struct serio *serio)
362 struct serio_raw *serio_raw = serio_get_drvdata(serio);
365 if (!drv || !serio_raw) {
367 "reconnect request, but serio is disconnected, ignoring...\n");
382 static void serio_raw_hangup(
struct serio_raw *serio_raw)
386 serio_pause_rx(serio_raw->
serio);
389 serio_continue_rx(serio_raw->serio);
395 static
void serio_raw_disconnect(
struct serio *serio)
397 struct serio_raw *serio_raw = serio_get_drvdata(serio);
402 serio_raw->
dead =
true;
403 list_del_init(&serio_raw->
node);
406 serio_raw_hangup(serio_raw);
409 kref_put(&serio_raw->
kref, serio_raw_free);
411 serio_set_drvdata(serio,
NULL);
437 .id_table = serio_raw_serio_ids,
438 .interrupt = serio_raw_interrupt,
439 .connect = serio_raw_connect,
440 .reconnect = serio_raw_reconnect,
441 .disconnect = serio_raw_disconnect,