]> Git Repo - J-linux.git/blob - drivers/input/serio/serio_raw.c
Merge tag 'vfs-6.13-rc7.fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs
[J-linux.git] / drivers / input / serio / serio_raw.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Raw serio device providing access to a raw byte stream from underlying
4  * serio port. Closely emulates behavior of pre-2.6 /dev/psaux device
5  *
6  * Copyright (c) 2004 Dmitry Torokhov
7  */
8
9 #include <linux/kref.h>
10 #include <linux/sched.h>
11 #include <linux/slab.h>
12 #include <linux/poll.h>
13 #include <linux/module.h>
14 #include <linux/serio.h>
15 #include <linux/major.h>
16 #include <linux/device.h>
17 #include <linux/miscdevice.h>
18 #include <linux/wait.h>
19 #include <linux/mutex.h>
20
21 #define DRIVER_DESC     "Raw serio driver"
22
23 MODULE_AUTHOR("Dmitry Torokhov <[email protected]>");
24 MODULE_DESCRIPTION(DRIVER_DESC);
25 MODULE_LICENSE("GPL");
26
27 #define SERIO_RAW_QUEUE_LEN     64
28 struct serio_raw {
29         unsigned char queue[SERIO_RAW_QUEUE_LEN];
30         unsigned int tail, head;
31
32         char name[20];
33         struct kref kref;
34         struct serio *serio;
35         struct miscdevice dev;
36         wait_queue_head_t wait;
37         struct list_head client_list;
38         struct list_head node;
39         bool dead;
40 };
41
42 struct serio_raw_client {
43         struct fasync_struct *fasync;
44         struct serio_raw *serio_raw;
45         struct list_head node;
46 };
47
48 static DEFINE_MUTEX(serio_raw_mutex);
49 static LIST_HEAD(serio_raw_list);
50
51 /*********************************************************************
52  *             Interface with userspace (file operations)            *
53  *********************************************************************/
54
55 static int serio_raw_fasync(int fd, struct file *file, int on)
56 {
57         struct serio_raw_client *client = file->private_data;
58
59         return fasync_helper(fd, file, on, &client->fasync);
60 }
61
62 static struct serio_raw *serio_raw_locate(int minor)
63 {
64         struct serio_raw *serio_raw;
65
66         list_for_each_entry(serio_raw, &serio_raw_list, node) {
67                 if (serio_raw->dev.minor == minor)
68                         return serio_raw;
69         }
70
71         return NULL;
72 }
73
74 static int serio_raw_open(struct inode *inode, struct file *file)
75 {
76         struct serio_raw *serio_raw;
77         struct serio_raw_client *client;
78
79         scoped_guard(mutex_intr, &serio_raw_mutex) {
80                 serio_raw = serio_raw_locate(iminor(inode));
81                 if (!serio_raw)
82                         return -ENODEV;
83
84                 if (serio_raw->dead)
85                         return -ENODEV;
86
87                 client = kzalloc(sizeof(*client), GFP_KERNEL);
88                 if (!client)
89                         return -ENOMEM;
90
91                 client->serio_raw = serio_raw;
92                 file->private_data = client;
93
94                 kref_get(&serio_raw->kref);
95
96                 scoped_guard(serio_pause_rx, serio_raw->serio)
97                         list_add_tail(&client->node, &serio_raw->client_list);
98
99                 return 0;
100         }
101
102         return -EINTR;
103 }
104
105 static void serio_raw_free(struct kref *kref)
106 {
107         struct serio_raw *serio_raw =
108                         container_of(kref, struct serio_raw, kref);
109
110         put_device(&serio_raw->serio->dev);
111         kfree(serio_raw);
112 }
113
114 static int serio_raw_release(struct inode *inode, struct file *file)
115 {
116         struct serio_raw_client *client = file->private_data;
117         struct serio_raw *serio_raw = client->serio_raw;
118
119         scoped_guard(serio_pause_rx, serio_raw->serio)
120                 list_del(&client->node);
121
122         kfree(client);
123
124         kref_put(&serio_raw->kref, serio_raw_free);
125
126         return 0;
127 }
128
129 static bool serio_raw_fetch_byte(struct serio_raw *serio_raw, char *c)
130 {
131         guard(serio_pause_rx)(serio_raw->serio);
132
133         if (serio_raw->head == serio_raw->tail)
134                 return false; /* queue is empty */
135
136         *c = serio_raw->queue[serio_raw->tail];
137         serio_raw->tail = (serio_raw->tail + 1) % SERIO_RAW_QUEUE_LEN;
138
139         return true;
140 }
141
142 static ssize_t serio_raw_read(struct file *file, char __user *buffer,
143                               size_t count, loff_t *ppos)
144 {
145         struct serio_raw_client *client = file->private_data;
146         struct serio_raw *serio_raw = client->serio_raw;
147         char c;
148         ssize_t read = 0;
149         int error;
150
151         for (;;) {
152                 if (serio_raw->dead)
153                         return -ENODEV;
154
155                 if (serio_raw->head == serio_raw->tail &&
156                     (file->f_flags & O_NONBLOCK))
157                         return -EAGAIN;
158
159                 if (count == 0)
160                         break;
161
162                 while (read < count && serio_raw_fetch_byte(serio_raw, &c)) {
163                         if (put_user(c, buffer++))
164                                 return -EFAULT;
165                         read++;
166                 }
167
168                 if (read)
169                         break;
170
171                 if (!(file->f_flags & O_NONBLOCK)) {
172                         error = wait_event_interruptible(serio_raw->wait,
173                                         serio_raw->head != serio_raw->tail ||
174                                         serio_raw->dead);
175                         if (error)
176                                 return error;
177                 }
178         }
179
180         return read;
181 }
182
183 static ssize_t serio_raw_write(struct file *file, const char __user *buffer,
184                                size_t count, loff_t *ppos)
185 {
186         struct serio_raw_client *client = file->private_data;
187         struct serio_raw *serio_raw = client->serio_raw;
188         int written = 0;
189         unsigned char c;
190
191         scoped_guard(mutex_intr, &serio_raw_mutex) {
192                 if (serio_raw->dead)
193                         return -ENODEV;
194
195                 if (count > 32)
196                         count = 32;
197
198                 while (count--) {
199                         if (get_user(c, buffer++))
200                                 return -EFAULT;
201
202                         if (serio_write(serio_raw->serio, c)) {
203                                 /* Either signal error or partial write */
204                                 return written ?: -EIO;
205                         }
206
207                         written++;
208                 }
209
210                 return written;
211         }
212
213         return -EINTR;
214 }
215
216 static __poll_t serio_raw_poll(struct file *file, poll_table *wait)
217 {
218         struct serio_raw_client *client = file->private_data;
219         struct serio_raw *serio_raw = client->serio_raw;
220         __poll_t mask;
221
222         poll_wait(file, &serio_raw->wait, wait);
223
224         mask = serio_raw->dead ? EPOLLHUP | EPOLLERR : EPOLLOUT | EPOLLWRNORM;
225         if (serio_raw->head != serio_raw->tail)
226                 mask |= EPOLLIN | EPOLLRDNORM;
227
228         return mask;
229 }
230
231 static const struct file_operations serio_raw_fops = {
232         .owner          = THIS_MODULE,
233         .open           = serio_raw_open,
234         .release        = serio_raw_release,
235         .read           = serio_raw_read,
236         .write          = serio_raw_write,
237         .poll           = serio_raw_poll,
238         .fasync         = serio_raw_fasync,
239         .llseek         = noop_llseek,
240 };
241
242
243 /*********************************************************************
244  *                   Interface with serio port                       *
245  *********************************************************************/
246
247 static irqreturn_t serio_raw_interrupt(struct serio *serio, unsigned char data,
248                                         unsigned int dfl)
249 {
250         struct serio_raw *serio_raw = serio_get_drvdata(serio);
251         struct serio_raw_client *client;
252         unsigned int head = serio_raw->head;
253
254         /* we are holding serio->lock here so we are protected */
255         serio_raw->queue[head] = data;
256         head = (head + 1) % SERIO_RAW_QUEUE_LEN;
257         if (likely(head != serio_raw->tail)) {
258                 serio_raw->head = head;
259                 list_for_each_entry(client, &serio_raw->client_list, node)
260                         kill_fasync(&client->fasync, SIGIO, POLL_IN);
261                 wake_up_interruptible(&serio_raw->wait);
262         }
263
264         return IRQ_HANDLED;
265 }
266
267 static int serio_raw_connect(struct serio *serio, struct serio_driver *drv)
268 {
269         static atomic_t serio_raw_no = ATOMIC_INIT(-1);
270         struct serio_raw *serio_raw;
271         int err;
272
273         serio_raw = kzalloc(sizeof(*serio_raw), GFP_KERNEL);
274         if (!serio_raw) {
275                 dev_dbg(&serio->dev, "can't allocate memory for a device\n");
276                 return -ENOMEM;
277         }
278
279         snprintf(serio_raw->name, sizeof(serio_raw->name),
280                  "serio_raw%u", atomic_inc_return(&serio_raw_no));
281         kref_init(&serio_raw->kref);
282         INIT_LIST_HEAD(&serio_raw->client_list);
283         init_waitqueue_head(&serio_raw->wait);
284
285         serio_raw->serio = serio;
286         get_device(&serio->dev);
287
288         serio_set_drvdata(serio, serio_raw);
289
290         err = serio_open(serio, drv);
291         if (err)
292                 goto err_free;
293
294         err = mutex_lock_killable(&serio_raw_mutex);
295         if (err)
296                 goto err_close;
297
298         list_add_tail(&serio_raw->node, &serio_raw_list);
299         mutex_unlock(&serio_raw_mutex);
300
301         serio_raw->dev.minor = PSMOUSE_MINOR;
302         serio_raw->dev.name = serio_raw->name;
303         serio_raw->dev.parent = &serio->dev;
304         serio_raw->dev.fops = &serio_raw_fops;
305
306         err = misc_register(&serio_raw->dev);
307         if (err) {
308                 serio_raw->dev.minor = MISC_DYNAMIC_MINOR;
309                 err = misc_register(&serio_raw->dev);
310         }
311
312         if (err) {
313                 dev_err(&serio->dev,
314                         "failed to register raw access device for %s\n",
315                         serio->phys);
316                 goto err_unlink;
317         }
318
319         dev_info(&serio->dev, "raw access enabled on %s (%s, minor %d)\n",
320                  serio->phys, serio_raw->name, serio_raw->dev.minor);
321         return 0;
322
323 err_unlink:
324         list_del_init(&serio_raw->node);
325 err_close:
326         serio_close(serio);
327 err_free:
328         serio_set_drvdata(serio, NULL);
329         kref_put(&serio_raw->kref, serio_raw_free);
330         return err;
331 }
332
333 static int serio_raw_reconnect(struct serio *serio)
334 {
335         struct serio_raw *serio_raw = serio_get_drvdata(serio);
336         struct serio_driver *drv = serio->drv;
337
338         if (!drv || !serio_raw) {
339                 dev_dbg(&serio->dev,
340                         "reconnect request, but serio is disconnected, ignoring...\n");
341                 return -1;
342         }
343
344         /*
345          * Nothing needs to be done here, we just need this method to
346          * keep the same device.
347          */
348         return 0;
349 }
350
351 /*
352  * Wake up users waiting for IO so they can disconnect from
353  * dead device.
354  */
355 static void serio_raw_hangup(struct serio_raw *serio_raw)
356 {
357         struct serio_raw_client *client;
358
359         scoped_guard(serio_pause_rx, serio_raw->serio) {
360                 list_for_each_entry(client, &serio_raw->client_list, node)
361                         kill_fasync(&client->fasync, SIGIO, POLL_HUP);
362         }
363
364         wake_up_interruptible(&serio_raw->wait);
365 }
366
367
368 static void serio_raw_disconnect(struct serio *serio)
369 {
370         struct serio_raw *serio_raw = serio_get_drvdata(serio);
371
372         misc_deregister(&serio_raw->dev);
373
374         scoped_guard(mutex, &serio_raw_mutex) {
375                 serio_raw->dead = true;
376                 list_del_init(&serio_raw->node);
377         }
378
379         serio_raw_hangup(serio_raw);
380
381         serio_close(serio);
382         kref_put(&serio_raw->kref, serio_raw_free);
383
384         serio_set_drvdata(serio, NULL);
385 }
386
387 static const struct serio_device_id serio_raw_serio_ids[] = {
388         {
389                 .type   = SERIO_8042,
390                 .proto  = SERIO_ANY,
391                 .id     = SERIO_ANY,
392                 .extra  = SERIO_ANY,
393         },
394         {
395                 .type   = SERIO_8042_XL,
396                 .proto  = SERIO_ANY,
397                 .id     = SERIO_ANY,
398                 .extra  = SERIO_ANY,
399         },
400         { 0 }
401 };
402
403 MODULE_DEVICE_TABLE(serio, serio_raw_serio_ids);
404
405 static struct serio_driver serio_raw_drv = {
406         .driver         = {
407                 .name   = "serio_raw",
408         },
409         .description    = DRIVER_DESC,
410         .id_table       = serio_raw_serio_ids,
411         .interrupt      = serio_raw_interrupt,
412         .connect        = serio_raw_connect,
413         .reconnect      = serio_raw_reconnect,
414         .disconnect     = serio_raw_disconnect,
415         .manual_bind    = true,
416 };
417
418 module_serio_driver(serio_raw_drv);
This page took 0.047662 seconds and 4 git commands to generate.