OpenCores
URL https://opencores.org/ocsvn/test_project/test_project/trunk

Subversion Repositories test_project

[/] [test_project/] [trunk/] [linux_sd_driver/] [drivers/] [input/] [evdev.c] - Blame information for rev 62

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 62 marcus.erl
/*
2
 * Event char devices, giving access to raw input device events.
3
 *
4
 * Copyright (c) 1999-2002 Vojtech Pavlik
5
 *
6
 * This program is free software; you can redistribute it and/or modify it
7
 * under the terms of the GNU General Public License version 2 as published by
8
 * the Free Software Foundation.
9
 */
10
 
11
#define EVDEV_MINOR_BASE        64
12
#define EVDEV_MINORS            32
13
#define EVDEV_BUFFER_SIZE       64
14
 
15
#include <linux/poll.h>
16
#include <linux/slab.h>
17
#include <linux/module.h>
18
#include <linux/init.h>
19
#include <linux/input.h>
20
#include <linux/major.h>
21
#include <linux/device.h>
22
#include <linux/compat.h>
23
 
24
struct evdev {
25
        int exist;
26
        int open;
27
        int minor;
28
        char name[16];
29
        struct input_handle handle;
30
        wait_queue_head_t wait;
31
        struct evdev_client *grab;
32
        struct list_head client_list;
33
        spinlock_t client_lock; /* protects client_list */
34
        struct mutex mutex;
35
        struct device dev;
36
};
37
 
38
struct evdev_client {
39
        struct input_event buffer[EVDEV_BUFFER_SIZE];
40
        int head;
41
        int tail;
42
        spinlock_t buffer_lock; /* protects access to buffer, head and tail */
43
        struct fasync_struct *fasync;
44
        struct evdev *evdev;
45
        struct list_head node;
46
};
47
 
48
static struct evdev *evdev_table[EVDEV_MINORS];
49
static DEFINE_MUTEX(evdev_table_mutex);
50
 
51
static void evdev_pass_event(struct evdev_client *client,
52
                             struct input_event *event)
53
{
54
        /*
55
         * Interrupts are disabled, just acquire the lock
56
         */
57
        spin_lock(&client->buffer_lock);
58
        client->buffer[client->head++] = *event;
59
        client->head &= EVDEV_BUFFER_SIZE - 1;
60
        spin_unlock(&client->buffer_lock);
61
 
62
        kill_fasync(&client->fasync, SIGIO, POLL_IN);
63
}
64
 
65
/*
66
 * Pass incoming event to all connected clients.
67
 */
68
static void evdev_event(struct input_handle *handle,
69
                        unsigned int type, unsigned int code, int value)
70
{
71
        struct evdev *evdev = handle->private;
72
        struct evdev_client *client;
73
        struct input_event event;
74
 
75
        do_gettimeofday(&event.time);
76
        event.type = type;
77
        event.code = code;
78
        event.value = value;
79
 
80
        rcu_read_lock();
81
 
82
        client = rcu_dereference(evdev->grab);
83
        if (client)
84
                evdev_pass_event(client, &event);
85
        else
86
                list_for_each_entry_rcu(client, &evdev->client_list, node)
87
                        evdev_pass_event(client, &event);
88
 
89
        rcu_read_unlock();
90
 
91
        wake_up_interruptible(&evdev->wait);
92
}
93
 
94
static int evdev_fasync(int fd, struct file *file, int on)
95
{
96
        struct evdev_client *client = file->private_data;
97
        int retval;
98
 
99
        retval = fasync_helper(fd, file, on, &client->fasync);
100
 
101
        return retval < 0 ? retval : 0;
102
}
103
 
104
static int evdev_flush(struct file *file, fl_owner_t id)
105
{
106
        struct evdev_client *client = file->private_data;
107
        struct evdev *evdev = client->evdev;
108
        int retval;
109
 
110
        retval = mutex_lock_interruptible(&evdev->mutex);
111
        if (retval)
112
                return retval;
113
 
114
        if (!evdev->exist)
115
                retval = -ENODEV;
116
        else
117
                retval = input_flush_device(&evdev->handle, file);
118
 
119
        mutex_unlock(&evdev->mutex);
120
        return retval;
121
}
122
 
123
static void evdev_free(struct device *dev)
124
{
125
        struct evdev *evdev = container_of(dev, struct evdev, dev);
126
 
127
        kfree(evdev);
128
}
129
 
130
/*
131
 * Grabs an event device (along with underlying input device).
132
 * This function is called with evdev->mutex taken.
133
 */
134
static int evdev_grab(struct evdev *evdev, struct evdev_client *client)
135
{
136
        int error;
137
 
138
        if (evdev->grab)
139
                return -EBUSY;
140
 
141
        error = input_grab_device(&evdev->handle);
142
        if (error)
143
                return error;
144
 
145
        rcu_assign_pointer(evdev->grab, client);
146
        synchronize_rcu();
147
 
148
        return 0;
149
}
150
 
151
static int evdev_ungrab(struct evdev *evdev, struct evdev_client *client)
152
{
153
        if (evdev->grab != client)
154
                return  -EINVAL;
155
 
156
        rcu_assign_pointer(evdev->grab, NULL);
157
        synchronize_rcu();
158
        input_release_device(&evdev->handle);
159
 
160
        return 0;
161
}
162
 
163
static void evdev_attach_client(struct evdev *evdev,
164
                                struct evdev_client *client)
165
{
166
        spin_lock(&evdev->client_lock);
167
        list_add_tail_rcu(&client->node, &evdev->client_list);
168
        spin_unlock(&evdev->client_lock);
169
        synchronize_rcu();
170
}
171
 
172
static void evdev_detach_client(struct evdev *evdev,
173
                                struct evdev_client *client)
174
{
175
        spin_lock(&evdev->client_lock);
176
        list_del_rcu(&client->node);
177
        spin_unlock(&evdev->client_lock);
178
        synchronize_rcu();
179
}
180
 
181
static int evdev_open_device(struct evdev *evdev)
182
{
183
        int retval;
184
 
185
        retval = mutex_lock_interruptible(&evdev->mutex);
186
        if (retval)
187
                return retval;
188
 
189
        if (!evdev->exist)
190
                retval = -ENODEV;
191
        else if (!evdev->open++) {
192
                retval = input_open_device(&evdev->handle);
193
                if (retval)
194
                        evdev->open--;
195
        }
196
 
197
        mutex_unlock(&evdev->mutex);
198
        return retval;
199
}
200
 
201
static void evdev_close_device(struct evdev *evdev)
202
{
203
        mutex_lock(&evdev->mutex);
204
 
205
        if (evdev->exist && !--evdev->open)
206
                input_close_device(&evdev->handle);
207
 
208
        mutex_unlock(&evdev->mutex);
209
}
210
 
211
/*
212
 * Wake up users waiting for IO so they can disconnect from
213
 * dead device.
214
 */
215
static void evdev_hangup(struct evdev *evdev)
216
{
217
        struct evdev_client *client;
218
 
219
        spin_lock(&evdev->client_lock);
220
        list_for_each_entry(client, &evdev->client_list, node)
221
                kill_fasync(&client->fasync, SIGIO, POLL_HUP);
222
        spin_unlock(&evdev->client_lock);
223
 
224
        wake_up_interruptible(&evdev->wait);
225
}
226
 
227
static int evdev_release(struct inode *inode, struct file *file)
228
{
229
        struct evdev_client *client = file->private_data;
230
        struct evdev *evdev = client->evdev;
231
 
232
        mutex_lock(&evdev->mutex);
233
        if (evdev->grab == client)
234
                evdev_ungrab(evdev, client);
235
        mutex_unlock(&evdev->mutex);
236
 
237
        evdev_fasync(-1, file, 0);
238
        evdev_detach_client(evdev, client);
239
        kfree(client);
240
 
241
        evdev_close_device(evdev);
242
        put_device(&evdev->dev);
243
 
244
        return 0;
245
}
246
 
247
static int evdev_open(struct inode *inode, struct file *file)
248
{
249
        struct evdev *evdev;
250
        struct evdev_client *client;
251
        int i = iminor(inode) - EVDEV_MINOR_BASE;
252
        int error;
253
 
254
        if (i >= EVDEV_MINORS)
255
                return -ENODEV;
256
 
257
        error = mutex_lock_interruptible(&evdev_table_mutex);
258
        if (error)
259
                return error;
260
        evdev = evdev_table[i];
261
        if (evdev)
262
                get_device(&evdev->dev);
263
        mutex_unlock(&evdev_table_mutex);
264
 
265
        if (!evdev)
266
                return -ENODEV;
267
 
268
        client = kzalloc(sizeof(struct evdev_client), GFP_KERNEL);
269
        if (!client) {
270
                error = -ENOMEM;
271
                goto err_put_evdev;
272
        }
273
 
274
        spin_lock_init(&client->buffer_lock);
275
        client->evdev = evdev;
276
        evdev_attach_client(evdev, client);
277
 
278
        error = evdev_open_device(evdev);
279
        if (error)
280
                goto err_free_client;
281
 
282
        file->private_data = client;
283
        return 0;
284
 
285
 err_free_client:
286
        evdev_detach_client(evdev, client);
287
        kfree(client);
288
 err_put_evdev:
289
        put_device(&evdev->dev);
290
        return error;
291
}
292
 
293
#ifdef CONFIG_COMPAT
294
 
295
struct input_event_compat {
296
        struct compat_timeval time;
297
        __u16 type;
298
        __u16 code;
299
        __s32 value;
300
};
301
 
302
/* Note to the author of this code: did it ever occur to
303
   you why the ifdefs are needed? Think about it again. -AK */
304
#ifdef CONFIG_X86_64
305
#  define COMPAT_TEST is_compat_task()
306
#elif defined(CONFIG_IA64)
307
#  define COMPAT_TEST IS_IA32_PROCESS(task_pt_regs(current))
308
#elif defined(CONFIG_S390)
309
#  define COMPAT_TEST test_thread_flag(TIF_31BIT)
310
#elif defined(CONFIG_MIPS)
311
#  define COMPAT_TEST test_thread_flag(TIF_32BIT_ADDR)
312
#else
313
#  define COMPAT_TEST test_thread_flag(TIF_32BIT)
314
#endif
315
 
316
static inline size_t evdev_event_size(void)
317
{
318
        return COMPAT_TEST ?
319
                sizeof(struct input_event_compat) : sizeof(struct input_event);
320
}
321
 
322
static int evdev_event_from_user(const char __user *buffer,
323
                                 struct input_event *event)
324
{
325
        if (COMPAT_TEST) {
326
                struct input_event_compat compat_event;
327
 
328
                if (copy_from_user(&compat_event, buffer,
329
                                   sizeof(struct input_event_compat)))
330
                        return -EFAULT;
331
 
332
                event->time.tv_sec = compat_event.time.tv_sec;
333
                event->time.tv_usec = compat_event.time.tv_usec;
334
                event->type = compat_event.type;
335
                event->code = compat_event.code;
336
                event->value = compat_event.value;
337
 
338
        } else {
339
                if (copy_from_user(event, buffer, sizeof(struct input_event)))
340
                        return -EFAULT;
341
        }
342
 
343
        return 0;
344
}
345
 
346
static int evdev_event_to_user(char __user *buffer,
347
                                const struct input_event *event)
348
{
349
        if (COMPAT_TEST) {
350
                struct input_event_compat compat_event;
351
 
352
                compat_event.time.tv_sec = event->time.tv_sec;
353
                compat_event.time.tv_usec = event->time.tv_usec;
354
                compat_event.type = event->type;
355
                compat_event.code = event->code;
356
                compat_event.value = event->value;
357
 
358
                if (copy_to_user(buffer, &compat_event,
359
                                 sizeof(struct input_event_compat)))
360
                        return -EFAULT;
361
 
362
        } else {
363
                if (copy_to_user(buffer, event, sizeof(struct input_event)))
364
                        return -EFAULT;
365
        }
366
 
367
        return 0;
368
}
369
 
370
#else
371
 
372
static inline size_t evdev_event_size(void)
373
{
374
        return sizeof(struct input_event);
375
}
376
 
377
static int evdev_event_from_user(const char __user *buffer,
378
                                 struct input_event *event)
379
{
380
        if (copy_from_user(event, buffer, sizeof(struct input_event)))
381
                return -EFAULT;
382
 
383
        return 0;
384
}
385
 
386
static int evdev_event_to_user(char __user *buffer,
387
                                const struct input_event *event)
388
{
389
        if (copy_to_user(buffer, event, sizeof(struct input_event)))
390
                return -EFAULT;
391
 
392
        return 0;
393
}
394
 
395
#endif /* CONFIG_COMPAT */
396
 
397
static ssize_t evdev_write(struct file *file, const char __user *buffer,
398
                           size_t count, loff_t *ppos)
399
{
400
        struct evdev_client *client = file->private_data;
401
        struct evdev *evdev = client->evdev;
402
        struct input_event event;
403
        int retval;
404
 
405
        retval = mutex_lock_interruptible(&evdev->mutex);
406
        if (retval)
407
                return retval;
408
 
409
        if (!evdev->exist) {
410
                retval = -ENODEV;
411
                goto out;
412
        }
413
 
414
        while (retval < count) {
415
 
416
                if (evdev_event_from_user(buffer + retval, &event)) {
417
                        retval = -EFAULT;
418
                        goto out;
419
                }
420
 
421
                input_inject_event(&evdev->handle,
422
                                   event.type, event.code, event.value);
423
                retval += evdev_event_size();
424
        }
425
 
426
 out:
427
        mutex_unlock(&evdev->mutex);
428
        return retval;
429
}
430
 
431
static int evdev_fetch_next_event(struct evdev_client *client,
432
                                  struct input_event *event)
433
{
434
        int have_event;
435
 
436
        spin_lock_irq(&client->buffer_lock);
437
 
438
        have_event = client->head != client->tail;
439
        if (have_event) {
440
                *event = client->buffer[client->tail++];
441
                client->tail &= EVDEV_BUFFER_SIZE - 1;
442
        }
443
 
444
        spin_unlock_irq(&client->buffer_lock);
445
 
446
        return have_event;
447
}
448
 
449
static ssize_t evdev_read(struct file *file, char __user *buffer,
450
                          size_t count, loff_t *ppos)
451
{
452
        struct evdev_client *client = file->private_data;
453
        struct evdev *evdev = client->evdev;
454
        struct input_event event;
455
        int retval;
456
 
457
        if (count < evdev_event_size())
458
                return -EINVAL;
459
 
460
        if (client->head == client->tail && evdev->exist &&
461
            (file->f_flags & O_NONBLOCK))
462
                return -EAGAIN;
463
 
464
        retval = wait_event_interruptible(evdev->wait,
465
                client->head != client->tail || !evdev->exist);
466
        if (retval)
467
                return retval;
468
 
469
        if (!evdev->exist)
470
                return -ENODEV;
471
 
472
        while (retval + evdev_event_size() <= count &&
473
               evdev_fetch_next_event(client, &event)) {
474
 
475
                if (evdev_event_to_user(buffer + retval, &event))
476
                        return -EFAULT;
477
 
478
                retval += evdev_event_size();
479
        }
480
 
481
        return retval;
482
}
483
 
484
/* No kernel lock - fine */
485
static unsigned int evdev_poll(struct file *file, poll_table *wait)
486
{
487
        struct evdev_client *client = file->private_data;
488
        struct evdev *evdev = client->evdev;
489
 
490
        poll_wait(file, &evdev->wait, wait);
491
        return ((client->head == client->tail) ? 0 : (POLLIN | POLLRDNORM)) |
492
                (evdev->exist ? 0 : (POLLHUP | POLLERR));
493
}
494
 
495
#ifdef CONFIG_COMPAT
496
 
497
#define BITS_PER_LONG_COMPAT (sizeof(compat_long_t) * 8)
498
#define BITS_TO_LONGS_COMPAT(x) ((((x) - 1) / BITS_PER_LONG_COMPAT) + 1)
499
 
500
#ifdef __BIG_ENDIAN
501
static int bits_to_user(unsigned long *bits, unsigned int maxbit,
502
                        unsigned int maxlen, void __user *p, int compat)
503
{
504
        int len, i;
505
 
506
        if (compat) {
507
                len = BITS_TO_LONGS_COMPAT(maxbit) * sizeof(compat_long_t);
508
                if (len > maxlen)
509
                        len = maxlen;
510
 
511
                for (i = 0; i < len / sizeof(compat_long_t); i++)
512
                        if (copy_to_user((compat_long_t __user *) p + i,
513
                                         (compat_long_t *) bits +
514
                                                i + 1 - ((i % 2) << 1),
515
                                         sizeof(compat_long_t)))
516
                                return -EFAULT;
517
        } else {
518
                len = BITS_TO_LONGS(maxbit) * sizeof(long);
519
                if (len > maxlen)
520
                        len = maxlen;
521
 
522
                if (copy_to_user(p, bits, len))
523
                        return -EFAULT;
524
        }
525
 
526
        return len;
527
}
528
#else
529
static int bits_to_user(unsigned long *bits, unsigned int maxbit,
530
                        unsigned int maxlen, void __user *p, int compat)
531
{
532
        int len = compat ?
533
                        BITS_TO_LONGS_COMPAT(maxbit) * sizeof(compat_long_t) :
534
                        BITS_TO_LONGS(maxbit) * sizeof(long);
535
 
536
        if (len > maxlen)
537
                len = maxlen;
538
 
539
        return copy_to_user(p, bits, len) ? -EFAULT : len;
540
}
541
#endif /* __BIG_ENDIAN */
542
 
543
#else
544
 
545
static int bits_to_user(unsigned long *bits, unsigned int maxbit,
546
                        unsigned int maxlen, void __user *p, int compat)
547
{
548
        int len = BITS_TO_LONGS(maxbit) * sizeof(long);
549
 
550
        if (len > maxlen)
551
                len = maxlen;
552
 
553
        return copy_to_user(p, bits, len) ? -EFAULT : len;
554
}
555
 
556
#endif /* CONFIG_COMPAT */
557
 
558
static int str_to_user(const char *str, unsigned int maxlen, void __user *p)
559
{
560
        int len;
561
 
562
        if (!str)
563
                return -ENOENT;
564
 
565
        len = strlen(str) + 1;
566
        if (len > maxlen)
567
                len = maxlen;
568
 
569
        return copy_to_user(p, str, len) ? -EFAULT : len;
570
}
571
 
572
static long evdev_do_ioctl(struct file *file, unsigned int cmd,
573
                           void __user *p, int compat_mode)
574
{
575
        struct evdev_client *client = file->private_data;
576
        struct evdev *evdev = client->evdev;
577
        struct input_dev *dev = evdev->handle.dev;
578
        struct input_absinfo abs;
579
        struct ff_effect effect;
580
        int __user *ip = (int __user *)p;
581
        int i, t, u, v;
582
        int error;
583
 
584
        switch (cmd) {
585
 
586
        case EVIOCGVERSION:
587
                return put_user(EV_VERSION, ip);
588
 
589
        case EVIOCGID:
590
                if (copy_to_user(p, &dev->id, sizeof(struct input_id)))
591
                        return -EFAULT;
592
                return 0;
593
 
594
        case EVIOCGREP:
595
                if (!test_bit(EV_REP, dev->evbit))
596
                        return -ENOSYS;
597
                if (put_user(dev->rep[REP_DELAY], ip))
598
                        return -EFAULT;
599
                if (put_user(dev->rep[REP_PERIOD], ip + 1))
600
                        return -EFAULT;
601
                return 0;
602
 
603
        case EVIOCSREP:
604
                if (!test_bit(EV_REP, dev->evbit))
605
                        return -ENOSYS;
606
                if (get_user(u, ip))
607
                        return -EFAULT;
608
                if (get_user(v, ip + 1))
609
                        return -EFAULT;
610
 
611
                input_inject_event(&evdev->handle, EV_REP, REP_DELAY, u);
612
                input_inject_event(&evdev->handle, EV_REP, REP_PERIOD, v);
613
 
614
                return 0;
615
 
616
        case EVIOCGKEYCODE:
617
                if (get_user(t, ip))
618
                        return -EFAULT;
619
 
620
                error = dev->getkeycode(dev, t, &v);
621
                if (error)
622
                        return error;
623
 
624
                if (put_user(v, ip + 1))
625
                        return -EFAULT;
626
 
627
                return 0;
628
 
629
        case EVIOCSKEYCODE:
630
                if (get_user(t, ip) || get_user(v, ip + 1))
631
                        return -EFAULT;
632
 
633
                return dev->setkeycode(dev, t, v);
634
 
635
        case EVIOCSFF:
636
                if (copy_from_user(&effect, p, sizeof(effect)))
637
                        return -EFAULT;
638
 
639
                error = input_ff_upload(dev, &effect, file);
640
 
641
                if (put_user(effect.id, &(((struct ff_effect __user *)p)->id)))
642
                        return -EFAULT;
643
 
644
                return error;
645
 
646
        case EVIOCRMFF:
647
                return input_ff_erase(dev, (int)(unsigned long) p, file);
648
 
649
        case EVIOCGEFFECTS:
650
                i = test_bit(EV_FF, dev->evbit) ?
651
                                dev->ff->max_effects : 0;
652
                if (put_user(i, ip))
653
                        return -EFAULT;
654
                return 0;
655
 
656
        case EVIOCGRAB:
657
                if (p)
658
                        return evdev_grab(evdev, client);
659
                else
660
                        return evdev_ungrab(evdev, client);
661
 
662
        default:
663
 
664
                if (_IOC_TYPE(cmd) != 'E')
665
                        return -EINVAL;
666
 
667
                if (_IOC_DIR(cmd) == _IOC_READ) {
668
 
669
                        if ((_IOC_NR(cmd) & ~EV_MAX) == _IOC_NR(EVIOCGBIT(0, 0))) {
670
 
671
                                unsigned long *bits;
672
                                int len;
673
 
674
                                switch (_IOC_NR(cmd) & EV_MAX) {
675
 
676
                                case      0: bits = dev->evbit;  len = EV_MAX;  break;
677
                                case EV_KEY: bits = dev->keybit; len = KEY_MAX; break;
678
                                case EV_REL: bits = dev->relbit; len = REL_MAX; break;
679
                                case EV_ABS: bits = dev->absbit; len = ABS_MAX; break;
680
                                case EV_MSC: bits = dev->mscbit; len = MSC_MAX; break;
681
                                case EV_LED: bits = dev->ledbit; len = LED_MAX; break;
682
                                case EV_SND: bits = dev->sndbit; len = SND_MAX; break;
683
                                case EV_FF:  bits = dev->ffbit;  len = FF_MAX;  break;
684
                                case EV_SW:  bits = dev->swbit;  len = SW_MAX;  break;
685
                                default: return -EINVAL;
686
                        }
687
                                return bits_to_user(bits, len, _IOC_SIZE(cmd), p, compat_mode);
688
                        }
689
 
690
                        if (_IOC_NR(cmd) == _IOC_NR(EVIOCGKEY(0)))
691
                                return bits_to_user(dev->key, KEY_MAX, _IOC_SIZE(cmd),
692
                                                    p, compat_mode);
693
 
694
                        if (_IOC_NR(cmd) == _IOC_NR(EVIOCGLED(0)))
695
                                return bits_to_user(dev->led, LED_MAX, _IOC_SIZE(cmd),
696
                                                    p, compat_mode);
697
 
698
                        if (_IOC_NR(cmd) == _IOC_NR(EVIOCGSND(0)))
699
                                return bits_to_user(dev->snd, SND_MAX, _IOC_SIZE(cmd),
700
                                                    p, compat_mode);
701
 
702
                        if (_IOC_NR(cmd) == _IOC_NR(EVIOCGSW(0)))
703
                                return bits_to_user(dev->sw, SW_MAX, _IOC_SIZE(cmd),
704
                                                    p, compat_mode);
705
 
706
                        if (_IOC_NR(cmd) == _IOC_NR(EVIOCGNAME(0)))
707
                                return str_to_user(dev->name, _IOC_SIZE(cmd), p);
708
 
709
                        if (_IOC_NR(cmd) == _IOC_NR(EVIOCGPHYS(0)))
710
                                return str_to_user(dev->phys, _IOC_SIZE(cmd), p);
711
 
712
                        if (_IOC_NR(cmd) == _IOC_NR(EVIOCGUNIQ(0)))
713
                                return str_to_user(dev->uniq, _IOC_SIZE(cmd), p);
714
 
715
                        if ((_IOC_NR(cmd) & ~ABS_MAX) == _IOC_NR(EVIOCGABS(0))) {
716
 
717
                                t = _IOC_NR(cmd) & ABS_MAX;
718
 
719
                                abs.value = dev->abs[t];
720
                                abs.minimum = dev->absmin[t];
721
                                abs.maximum = dev->absmax[t];
722
                                abs.fuzz = dev->absfuzz[t];
723
                                abs.flat = dev->absflat[t];
724
 
725
                                if (copy_to_user(p, &abs, sizeof(struct input_absinfo)))
726
                                        return -EFAULT;
727
 
728
                                return 0;
729
                        }
730
 
731
                }
732
 
733
                if (_IOC_DIR(cmd) == _IOC_WRITE) {
734
 
735
                        if ((_IOC_NR(cmd) & ~ABS_MAX) == _IOC_NR(EVIOCSABS(0))) {
736
 
737
                                t = _IOC_NR(cmd) & ABS_MAX;
738
 
739
                                if (copy_from_user(&abs, p,
740
                                                sizeof(struct input_absinfo)))
741
                                        return -EFAULT;
742
 
743
                                /*
744
                                 * Take event lock to ensure that we are not
745
                                 * changing device parameters in the middle
746
                                 * of event.
747
                                 */
748
                                spin_lock_irq(&dev->event_lock);
749
 
750
                                dev->abs[t] = abs.value;
751
                                dev->absmin[t] = abs.minimum;
752
                                dev->absmax[t] = abs.maximum;
753
                                dev->absfuzz[t] = abs.fuzz;
754
                                dev->absflat[t] = abs.flat;
755
 
756
                                spin_unlock_irq(&dev->event_lock);
757
 
758
                                return 0;
759
                        }
760
                }
761
        }
762
        return -EINVAL;
763
}
764
 
765
static long evdev_ioctl_handler(struct file *file, unsigned int cmd,
766
                                void __user *p, int compat_mode)
767
{
768
        struct evdev_client *client = file->private_data;
769
        struct evdev *evdev = client->evdev;
770
        int retval;
771
 
772
        retval = mutex_lock_interruptible(&evdev->mutex);
773
        if (retval)
774
                return retval;
775
 
776
        if (!evdev->exist) {
777
                retval = -ENODEV;
778
                goto out;
779
        }
780
 
781
        retval = evdev_do_ioctl(file, cmd, p, compat_mode);
782
 
783
 out:
784
        mutex_unlock(&evdev->mutex);
785
        return retval;
786
}
787
 
788
static long evdev_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
789
{
790
        return evdev_ioctl_handler(file, cmd, (void __user *)arg, 0);
791
}
792
 
793
#ifdef CONFIG_COMPAT
794
static long evdev_ioctl_compat(struct file *file,
795
                                unsigned int cmd, unsigned long arg)
796
{
797
        return evdev_ioctl_handler(file, cmd, compat_ptr(arg), 1);
798
}
799
#endif
800
 
801
static const struct file_operations evdev_fops = {
802
        .owner          = THIS_MODULE,
803
        .read           = evdev_read,
804
        .write          = evdev_write,
805
        .poll           = evdev_poll,
806
        .open           = evdev_open,
807
        .release        = evdev_release,
808
        .unlocked_ioctl = evdev_ioctl,
809
#ifdef CONFIG_COMPAT
810
        .compat_ioctl   = evdev_ioctl_compat,
811
#endif
812
        .fasync         = evdev_fasync,
813
        .flush          = evdev_flush
814
};
815
 
816
static int evdev_install_chrdev(struct evdev *evdev)
817
{
818
        /*
819
         * No need to do any locking here as calls to connect and
820
         * disconnect are serialized by the input core
821
         */
822
        evdev_table[evdev->minor] = evdev;
823
        return 0;
824
}
825
 
826
static void evdev_remove_chrdev(struct evdev *evdev)
827
{
828
        /*
829
         * Lock evdev table to prevent race with evdev_open()
830
         */
831
        mutex_lock(&evdev_table_mutex);
832
        evdev_table[evdev->minor] = NULL;
833
        mutex_unlock(&evdev_table_mutex);
834
}
835
 
836
/*
837
 * Mark device non-existent. This disables writes, ioctls and
838
 * prevents new users from opening the device. Already posted
839
 * blocking reads will stay, however new ones will fail.
840
 */
841
static void evdev_mark_dead(struct evdev *evdev)
842
{
843
        mutex_lock(&evdev->mutex);
844
        evdev->exist = 0;
845
        mutex_unlock(&evdev->mutex);
846
}
847
 
848
static void evdev_cleanup(struct evdev *evdev)
849
{
850
        struct input_handle *handle = &evdev->handle;
851
 
852
        evdev_mark_dead(evdev);
853
        evdev_hangup(evdev);
854
        evdev_remove_chrdev(evdev);
855
 
856
        /* evdev is marked dead so no one else accesses evdev->open */
857
        if (evdev->open) {
858
                input_flush_device(handle, NULL);
859
                input_close_device(handle);
860
        }
861
}
862
 
863
/*
864
 * Create new evdev device. Note that input core serializes calls
865
 * to connect and disconnect so we don't need to lock evdev_table here.
866
 */
867
static int evdev_connect(struct input_handler *handler, struct input_dev *dev,
868
                         const struct input_device_id *id)
869
{
870
        struct evdev *evdev;
871
        int minor;
872
        int error;
873
 
874
        for (minor = 0; minor < EVDEV_MINORS; minor++)
875
                if (!evdev_table[minor])
876
                        break;
877
 
878
        if (minor == EVDEV_MINORS) {
879
                printk(KERN_ERR "evdev: no more free evdev devices\n");
880
                return -ENFILE;
881
        }
882
 
883
        evdev = kzalloc(sizeof(struct evdev), GFP_KERNEL);
884
        if (!evdev)
885
                return -ENOMEM;
886
 
887
        INIT_LIST_HEAD(&evdev->client_list);
888
        spin_lock_init(&evdev->client_lock);
889
        mutex_init(&evdev->mutex);
890
        init_waitqueue_head(&evdev->wait);
891
 
892
        snprintf(evdev->name, sizeof(evdev->name), "event%d", minor);
893
        evdev->exist = 1;
894
        evdev->minor = minor;
895
 
896
        evdev->handle.dev = dev;
897
        evdev->handle.name = evdev->name;
898
        evdev->handle.handler = handler;
899
        evdev->handle.private = evdev;
900
 
901
        strlcpy(evdev->dev.bus_id, evdev->name, sizeof(evdev->dev.bus_id));
902
        evdev->dev.devt = MKDEV(INPUT_MAJOR, EVDEV_MINOR_BASE + minor);
903
        evdev->dev.class = &input_class;
904
        evdev->dev.parent = &dev->dev;
905
        evdev->dev.release = evdev_free;
906
        device_initialize(&evdev->dev);
907
 
908
        error = input_register_handle(&evdev->handle);
909
        if (error)
910
                goto err_free_evdev;
911
 
912
        error = evdev_install_chrdev(evdev);
913
        if (error)
914
                goto err_unregister_handle;
915
 
916
        error = device_add(&evdev->dev);
917
        if (error)
918
                goto err_cleanup_evdev;
919
 
920
        return 0;
921
 
922
 err_cleanup_evdev:
923
        evdev_cleanup(evdev);
924
 err_unregister_handle:
925
        input_unregister_handle(&evdev->handle);
926
 err_free_evdev:
927
        put_device(&evdev->dev);
928
        return error;
929
}
930
 
931
static void evdev_disconnect(struct input_handle *handle)
932
{
933
        struct evdev *evdev = handle->private;
934
 
935
        device_del(&evdev->dev);
936
        evdev_cleanup(evdev);
937
        input_unregister_handle(handle);
938
        put_device(&evdev->dev);
939
}
940
 
941
static const struct input_device_id evdev_ids[] = {
942
        { .driver_info = 1 },   /* Matches all devices */
943
        { },                    /* Terminating zero entry */
944
};
945
 
946
MODULE_DEVICE_TABLE(input, evdev_ids);
947
 
948
static struct input_handler evdev_handler = {
949
        .event          = evdev_event,
950
        .connect        = evdev_connect,
951
        .disconnect     = evdev_disconnect,
952
        .fops           = &evdev_fops,
953
        .minor          = EVDEV_MINOR_BASE,
954
        .name           = "evdev",
955
        .id_table       = evdev_ids,
956
};
957
 
958
static int __init evdev_init(void)
959
{
960
        return input_register_handler(&evdev_handler);
961
}
962
 
963
static void __exit evdev_exit(void)
964
{
965
        input_unregister_handler(&evdev_handler);
966
}
967
 
968
module_init(evdev_init);
969
module_exit(evdev_exit);
970
 
971
MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>");
972
MODULE_DESCRIPTION("Input driver event char devices");
973
MODULE_LICENSE("GPL");

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.