Merge tag 'v3.10.107' into update
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / input / joydev.c
CommitLineData
1da177e4
LT
1/*
2 * Joystick device driver for the input driver suite.
3 *
4 * Copyright (c) 1999-2002 Vojtech Pavlik
5 * Copyright (c) 1999 Colin Van Dyke
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 */
12
da0c4901
JP
13#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
14
1da177e4 15#include <asm/io.h>
1da177e4
LT
16#include <linux/delay.h>
17#include <linux/errno.h>
18#include <linux/joystick.h>
19#include <linux/input.h>
20#include <linux/kernel.h>
21#include <linux/major.h>
a99bbaf5 22#include <linux/sched.h>
1da177e4
LT
23#include <linux/slab.h>
24#include <linux/mm.h>
25#include <linux/miscdevice.h>
26#include <linux/module.h>
27#include <linux/poll.h>
28#include <linux/init.h>
1da177e4 29#include <linux/device.h>
7f8d4cad 30#include <linux/cdev.h>
1da177e4
LT
31
32MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>");
33MODULE_DESCRIPTION("Joystick device interfaces");
34MODULE_SUPPORTED_DEVICE("input/js");
35MODULE_LICENSE("GPL");
36
37#define JOYDEV_MINOR_BASE 0
38#define JOYDEV_MINORS 16
39#define JOYDEV_BUFFER_SIZE 64
40
1da177e4 41struct joydev {
1da177e4 42 int open;
1da177e4
LT
43 struct input_handle handle;
44 wait_queue_head_t wait;
d0ffb9be 45 struct list_head client_list;
b126207c
DT
46 spinlock_t client_lock; /* protects client_list */
47 struct mutex mutex;
9657d75c 48 struct device dev;
7f8d4cad 49 struct cdev cdev;
20da92de 50 bool exist;
9657d75c 51
81c2a3ba 52 struct js_corr corr[ABS_CNT];
1da177e4
LT
53 struct JS_DATA_SAVE_TYPE glue;
54 int nabs;
55 int nkey;
56 __u16 keymap[KEY_MAX - BTN_MISC + 1];
57 __u16 keypam[KEY_MAX - BTN_MISC + 1];
81c2a3ba
DM
58 __u8 absmap[ABS_CNT];
59 __u8 abspam[ABS_CNT];
60 __s16 abs[ABS_CNT];
1da177e4
LT
61};
62
d0ffb9be 63struct joydev_client {
1da177e4
LT
64 struct js_event buffer[JOYDEV_BUFFER_SIZE];
65 int head;
66 int tail;
67 int startup;
b126207c 68 spinlock_t buffer_lock; /* protects access to buffer, head and tail */
1da177e4
LT
69 struct fasync_struct *fasync;
70 struct joydev *joydev;
71 struct list_head node;
72};
73
1da177e4
LT
74static int joydev_correct(int value, struct js_corr *corr)
75{
76 switch (corr->type) {
b126207c
DT
77
78 case JS_CORR_NONE:
79 break;
80
81 case JS_CORR_BROKEN:
82 value = value > corr->coef[0] ? (value < corr->coef[1] ? 0 :
83 ((corr->coef[3] * (value - corr->coef[1])) >> 14)) :
84 ((corr->coef[2] * (value - corr->coef[0])) >> 14);
85 break;
86
87 default:
88 return 0;
1da177e4
LT
89 }
90
1e0afb28 91 return value < -32767 ? -32767 : (value > 32767 ? 32767 : value);
1da177e4
LT
92}
93
b126207c
DT
94static void joydev_pass_event(struct joydev_client *client,
95 struct js_event *event)
96{
97 struct joydev *joydev = client->joydev;
98
99 /*
100 * IRQs already disabled, just acquire the lock
101 */
102 spin_lock(&client->buffer_lock);
103
104 client->buffer[client->head] = *event;
105
106 if (client->startup == joydev->nabs + joydev->nkey) {
107 client->head++;
108 client->head &= JOYDEV_BUFFER_SIZE - 1;
109 if (client->tail == client->head)
110 client->startup = 0;
111 }
112
113 spin_unlock(&client->buffer_lock);
114
115 kill_fasync(&client->fasync, SIGIO, POLL_IN);
116}
117
118static void joydev_event(struct input_handle *handle,
119 unsigned int type, unsigned int code, int value)
1da177e4
LT
120{
121 struct joydev *joydev = handle->private;
d0ffb9be 122 struct joydev_client *client;
1da177e4
LT
123 struct js_event event;
124
125 switch (type) {
126
b126207c
DT
127 case EV_KEY:
128 if (code < BTN_MISC || value == 2)
129 return;
130 event.type = JS_EVENT_BUTTON;
131 event.number = joydev->keymap[code - BTN_MISC];
132 event.value = value;
133 break;
1da177e4 134
b126207c
DT
135 case EV_ABS:
136 event.type = JS_EVENT_AXIS;
137 event.number = joydev->absmap[code];
138 event.value = joydev_correct(value,
139 &joydev->corr[event.number]);
140 if (event.value == joydev->abs[event.number])
1da177e4 141 return;
b126207c
DT
142 joydev->abs[event.number] = event.value;
143 break;
144
145 default:
146 return;
1da177e4
LT
147 }
148
6f5eacfc 149 event.time = jiffies_to_msecs(jiffies);
1da177e4 150
82ba56c2 151 rcu_read_lock();
b126207c
DT
152 list_for_each_entry_rcu(client, &joydev->client_list, node)
153 joydev_pass_event(client, &event);
82ba56c2 154 rcu_read_unlock();
1da177e4
LT
155
156 wake_up_interruptible(&joydev->wait);
157}
158
159static int joydev_fasync(int fd, struct file *file, int on)
160{
d0ffb9be 161 struct joydev_client *client = file->private_data;
1e0afb28 162
60aa4924 163 return fasync_helper(fd, file, on, &client->fasync);
1da177e4
LT
164}
165
9657d75c 166static void joydev_free(struct device *dev)
1da177e4 167{
9657d75c
DT
168 struct joydev *joydev = container_of(dev, struct joydev, dev);
169
a7097ff8 170 input_put_device(joydev->handle.dev);
1da177e4
LT
171 kfree(joydev);
172}
173
b126207c
DT
174static void joydev_attach_client(struct joydev *joydev,
175 struct joydev_client *client)
176{
177 spin_lock(&joydev->client_lock);
178 list_add_tail_rcu(&client->node, &joydev->client_list);
179 spin_unlock(&joydev->client_lock);
b126207c
DT
180}
181
182static void joydev_detach_client(struct joydev *joydev,
183 struct joydev_client *client)
184{
185 spin_lock(&joydev->client_lock);
186 list_del_rcu(&client->node);
187 spin_unlock(&joydev->client_lock);
82ba56c2 188 synchronize_rcu();
b126207c
DT
189}
190
840c242b
RA
191static void joydev_refresh_state(struct joydev *joydev)
192{
193 struct input_dev *dev = joydev->handle.dev;
194 int i, val;
195
196 for (i = 0; i < joydev->nabs; i++) {
197 val = input_abs_get_val(dev, joydev->abspam[i]);
198 joydev->abs[i] = joydev_correct(val, &joydev->corr[i]);
199 }
200}
201
b126207c
DT
202static int joydev_open_device(struct joydev *joydev)
203{
204 int retval;
205
206 retval = mutex_lock_interruptible(&joydev->mutex);
207 if (retval)
208 return retval;
209
210 if (!joydev->exist)
211 retval = -ENODEV;
06445014 212 else if (!joydev->open++) {
b126207c 213 retval = input_open_device(&joydev->handle);
06445014
ON
214 if (retval)
215 joydev->open--;
840c242b
RA
216 else
217 joydev_refresh_state(joydev);
06445014 218 }
b126207c
DT
219
220 mutex_unlock(&joydev->mutex);
221 return retval;
222}
223
224static void joydev_close_device(struct joydev *joydev)
225{
226 mutex_lock(&joydev->mutex);
227
228 if (joydev->exist && !--joydev->open)
229 input_close_device(&joydev->handle);
230
231 mutex_unlock(&joydev->mutex);
232}
233
234/*
235 * Wake up users waiting for IO so they can disconnect from
236 * dead device.
237 */
238static void joydev_hangup(struct joydev *joydev)
239{
240 struct joydev_client *client;
241
242 spin_lock(&joydev->client_lock);
243 list_for_each_entry(client, &joydev->client_list, node)
244 kill_fasync(&client->fasync, SIGIO, POLL_HUP);
245 spin_unlock(&joydev->client_lock);
246
247 wake_up_interruptible(&joydev->wait);
248}
249
d0ffb9be 250static int joydev_release(struct inode *inode, struct file *file)
1da177e4 251{
d0ffb9be
DT
252 struct joydev_client *client = file->private_data;
253 struct joydev *joydev = client->joydev;
1da177e4 254
b126207c 255 joydev_detach_client(joydev, client);
d0ffb9be 256 kfree(client);
1da177e4 257
b126207c 258 joydev_close_device(joydev);
1da177e4 259
1da177e4
LT
260 return 0;
261}
262
263static int joydev_open(struct inode *inode, struct file *file)
264{
7f8d4cad
DT
265 struct joydev *joydev =
266 container_of(inode->i_cdev, struct joydev, cdev);
d0ffb9be 267 struct joydev_client *client;
d542ed82 268 int error;
1da177e4 269
d0ffb9be 270 client = kzalloc(sizeof(struct joydev_client), GFP_KERNEL);
7f8d4cad
DT
271 if (!client)
272 return -ENOMEM;
1da177e4 273
b126207c 274 spin_lock_init(&client->buffer_lock);
d0ffb9be 275 client->joydev = joydev;
b126207c 276 joydev_attach_client(joydev, client);
1da177e4 277
b126207c
DT
278 error = joydev_open_device(joydev);
279 if (error)
280 goto err_free_client;
1da177e4 281
d0ffb9be 282 file->private_data = client;
3d7bbd45
DT
283 nonseekable_open(inode, file);
284
1da177e4 285 return 0;
9657d75c
DT
286
287 err_free_client:
b126207c 288 joydev_detach_client(joydev, client);
9657d75c 289 kfree(client);
9657d75c 290 return error;
1da177e4
LT
291}
292
b126207c
DT
293static int joydev_generate_startup_event(struct joydev_client *client,
294 struct input_dev *input,
295 struct js_event *event)
1da177e4 296{
b126207c
DT
297 struct joydev *joydev = client->joydev;
298 int have_event;
299
300 spin_lock_irq(&client->buffer_lock);
301
302 have_event = client->startup < joydev->nabs + joydev->nkey;
303
304 if (have_event) {
305
306 event->time = jiffies_to_msecs(jiffies);
307 if (client->startup < joydev->nkey) {
308 event->type = JS_EVENT_BUTTON | JS_EVENT_INIT;
309 event->number = client->startup;
310 event->value = !!test_bit(joydev->keypam[event->number],
311 input->key);
312 } else {
313 event->type = JS_EVENT_AXIS | JS_EVENT_INIT;
314 event->number = client->startup - joydev->nkey;
315 event->value = joydev->abs[event->number];
316 }
317 client->startup++;
318 }
319
320 spin_unlock_irq(&client->buffer_lock);
321
322 return have_event;
323}
324
325static int joydev_fetch_next_event(struct joydev_client *client,
326 struct js_event *event)
327{
328 int have_event;
329
330 spin_lock_irq(&client->buffer_lock);
331
332 have_event = client->head != client->tail;
333 if (have_event) {
334 *event = client->buffer[client->tail++];
335 client->tail &= JOYDEV_BUFFER_SIZE - 1;
336 }
337
338 spin_unlock_irq(&client->buffer_lock);
339
340 return have_event;
341}
342
343/*
344 * Old joystick interface
345 */
346static ssize_t joydev_0x_read(struct joydev_client *client,
347 struct input_dev *input,
348 char __user *buf)
349{
350 struct joydev *joydev = client->joydev;
351 struct JS_DATA_TYPE data;
352 int i;
353
354 spin_lock_irq(&input->event_lock);
355
356 /*
357 * Get device state
358 */
359 for (data.buttons = i = 0; i < 32 && i < joydev->nkey; i++)
360 data.buttons |=
361 test_bit(joydev->keypam[i], input->key) ? (1 << i) : 0;
362 data.x = (joydev->abs[0] / 256 + 128) >> joydev->glue.JS_CORR.x;
363 data.y = (joydev->abs[1] / 256 + 128) >> joydev->glue.JS_CORR.y;
364
365 /*
366 * Reset reader's event queue
367 */
368 spin_lock(&client->buffer_lock);
369 client->startup = 0;
370 client->tail = client->head;
371 spin_unlock(&client->buffer_lock);
372
373 spin_unlock_irq(&input->event_lock);
374
375 if (copy_to_user(buf, &data, sizeof(struct JS_DATA_TYPE)))
376 return -EFAULT;
377
378 return sizeof(struct JS_DATA_TYPE);
1da177e4
LT
379}
380
b126207c
DT
381static inline int joydev_data_pending(struct joydev_client *client)
382{
383 struct joydev *joydev = client->joydev;
384
385 return client->startup < joydev->nabs + joydev->nkey ||
386 client->head != client->tail;
387}
388
389static ssize_t joydev_read(struct file *file, char __user *buf,
390 size_t count, loff_t *ppos)
1da177e4 391{
d0ffb9be
DT
392 struct joydev_client *client = file->private_data;
393 struct joydev *joydev = client->joydev;
1da177e4 394 struct input_dev *input = joydev->handle.dev;
b126207c
DT
395 struct js_event event;
396 int retval;
1da177e4 397
d0ffb9be 398 if (!joydev->exist)
1da177e4
LT
399 return -ENODEV;
400
401 if (count < sizeof(struct js_event))
402 return -EINVAL;
403
b126207c
DT
404 if (count == sizeof(struct JS_DATA_TYPE))
405 return joydev_0x_read(client, input, buf);
1da177e4 406
b126207c 407 if (!joydev_data_pending(client) && (file->f_flags & O_NONBLOCK))
1e0afb28 408 return -EAGAIN;
1da177e4 409
d0ffb9be 410 retval = wait_event_interruptible(joydev->wait,
b126207c 411 !joydev->exist || joydev_data_pending(client));
1da177e4
LT
412 if (retval)
413 return retval;
414
d0ffb9be 415 if (!joydev->exist)
1da177e4
LT
416 return -ENODEV;
417
b126207c
DT
418 while (retval + sizeof(struct js_event) <= count &&
419 joydev_generate_startup_event(client, input, &event)) {
1da177e4
LT
420
421 if (copy_to_user(buf + retval, &event, sizeof(struct js_event)))
422 return -EFAULT;
423
1da177e4
LT
424 retval += sizeof(struct js_event);
425 }
426
b126207c
DT
427 while (retval + sizeof(struct js_event) <= count &&
428 joydev_fetch_next_event(client, &event)) {
1da177e4 429
b126207c 430 if (copy_to_user(buf + retval, &event, sizeof(struct js_event)))
1da177e4
LT
431 return -EFAULT;
432
1da177e4
LT
433 retval += sizeof(struct js_event);
434 }
435
436 return retval;
437}
438
439/* No kernel lock - fine */
440static unsigned int joydev_poll(struct file *file, poll_table *wait)
441{
d0ffb9be
DT
442 struct joydev_client *client = file->private_data;
443 struct joydev *joydev = client->joydev;
1e0afb28 444
d0ffb9be 445 poll_wait(file, &joydev->wait, wait);
b126207c
DT
446 return (joydev_data_pending(client) ? (POLLIN | POLLRDNORM) : 0) |
447 (joydev->exist ? 0 : (POLLHUP | POLLERR));
1da177e4
LT
448}
449
999b874f
SK
450static int joydev_handle_JSIOCSAXMAP(struct joydev *joydev,
451 void __user *argp, size_t len)
452{
453 __u8 *abspam;
454 int i;
455 int retval = 0;
456
457 len = min(len, sizeof(joydev->abspam));
458
459 /* Validate the map. */
460 abspam = kmalloc(len, GFP_KERNEL);
461 if (!abspam)
462 return -ENOMEM;
463
464 if (copy_from_user(abspam, argp, len)) {
465 retval = -EFAULT;
466 goto out;
467 }
468
469 for (i = 0; i < joydev->nabs; i++) {
470 if (abspam[i] > ABS_MAX) {
471 retval = -EINVAL;
472 goto out;
473 }
474 }
475
476 memcpy(joydev->abspam, abspam, len);
477
d2520a42
KW
478 for (i = 0; i < joydev->nabs; i++)
479 joydev->absmap[joydev->abspam[i]] = i;
480
999b874f
SK
481 out:
482 kfree(abspam);
483 return retval;
484}
485
486static int joydev_handle_JSIOCSBTNMAP(struct joydev *joydev,
487 void __user *argp, size_t len)
488{
489 __u16 *keypam;
490 int i;
491 int retval = 0;
492
493 len = min(len, sizeof(joydev->keypam));
494
495 /* Validate the map. */
496 keypam = kmalloc(len, GFP_KERNEL);
497 if (!keypam)
498 return -ENOMEM;
499
500 if (copy_from_user(keypam, argp, len)) {
501 retval = -EFAULT;
502 goto out;
503 }
504
505 for (i = 0; i < joydev->nkey; i++) {
506 if (keypam[i] > KEY_MAX || keypam[i] < BTN_MISC) {
507 retval = -EINVAL;
508 goto out;
509 }
510 }
511
512 memcpy(joydev->keypam, keypam, len);
513
514 for (i = 0; i < joydev->nkey; i++)
515 joydev->keymap[keypam[i] - BTN_MISC] = i;
516
517 out:
518 kfree(keypam);
519 return retval;
520}
521
522
b126207c
DT
523static int joydev_ioctl_common(struct joydev *joydev,
524 unsigned int cmd, void __user *argp)
1da177e4 525{
1da177e4 526 struct input_dev *dev = joydev->handle.dev;
ec8b4b70 527 size_t len;
987a6c02 528 int i;
ec8b4b70 529 const char *name;
1da177e4 530
ec8b4b70 531 /* Process fixed-sized commands. */
1da177e4
LT
532 switch (cmd) {
533
b126207c
DT
534 case JS_SET_CAL:
535 return copy_from_user(&joydev->glue.JS_CORR, argp,
024ac44c 536 sizeof(joydev->glue.JS_CORR)) ? -EFAULT : 0;
1e0afb28 537
b126207c
DT
538 case JS_GET_CAL:
539 return copy_to_user(argp, &joydev->glue.JS_CORR,
024ac44c 540 sizeof(joydev->glue.JS_CORR)) ? -EFAULT : 0;
1e0afb28 541
b126207c
DT
542 case JS_SET_TIMEOUT:
543 return get_user(joydev->glue.JS_TIMEOUT, (s32 __user *) argp);
1e0afb28 544
b126207c
DT
545 case JS_GET_TIMEOUT:
546 return put_user(joydev->glue.JS_TIMEOUT, (s32 __user *) argp);
1da177e4 547
b126207c
DT
548 case JSIOCGVERSION:
549 return put_user(JS_VERSION, (__u32 __user *) argp);
1e0afb28 550
b126207c
DT
551 case JSIOCGAXES:
552 return put_user(joydev->nabs, (__u8 __user *) argp);
1e0afb28 553
b126207c
DT
554 case JSIOCGBUTTONS:
555 return put_user(joydev->nkey, (__u8 __user *) argp);
1e0afb28 556
b126207c
DT
557 case JSIOCSCORR:
558 if (copy_from_user(joydev->corr, argp,
559 sizeof(joydev->corr[0]) * joydev->nabs))
987a6c02 560 return -EFAULT;
1e0afb28 561
b126207c 562 for (i = 0; i < joydev->nabs; i++) {
987a6c02
DM
563 int val = input_abs_get_val(dev, joydev->abspam[i]);
564 joydev->abs[i] = joydev_correct(val, &joydev->corr[i]);
b126207c
DT
565 }
566 return 0;
1e0afb28 567
b126207c
DT
568 case JSIOCGCORR:
569 return copy_to_user(argp, joydev->corr,
570 sizeof(joydev->corr[0]) * joydev->nabs) ? -EFAULT : 0;
571
ec8b4b70
SK
572 }
573
574 /*
575 * Process variable-sized commands (the axis and button map commands
576 * are considered variable-sized to decouple them from the values of
577 * ABS_MAX and KEY_MAX).
578 */
579 switch (cmd & ~IOCSIZE_MASK) {
580
581 case (JSIOCSAXMAP & ~IOCSIZE_MASK):
999b874f 582 return joydev_handle_JSIOCSAXMAP(joydev, argp, _IOC_SIZE(cmd));
b126207c 583
ec8b4b70
SK
584 case (JSIOCGAXMAP & ~IOCSIZE_MASK):
585 len = min_t(size_t, _IOC_SIZE(cmd), sizeof(joydev->abspam));
999b874f 586 return copy_to_user(argp, joydev->abspam, len) ? -EFAULT : len;
ec8b4b70
SK
587
588 case (JSIOCSBTNMAP & ~IOCSIZE_MASK):
999b874f 589 return joydev_handle_JSIOCSBTNMAP(joydev, argp, _IOC_SIZE(cmd));
b126207c 590
ec8b4b70
SK
591 case (JSIOCGBTNMAP & ~IOCSIZE_MASK):
592 len = min_t(size_t, _IOC_SIZE(cmd), sizeof(joydev->keypam));
999b874f 593 return copy_to_user(argp, joydev->keypam, len) ? -EFAULT : len;
b126207c 594
ec8b4b70
SK
595 case JSIOCGNAME(0):
596 name = dev->name;
597 if (!name)
598 return 0;
599
600 len = min_t(size_t, _IOC_SIZE(cmd), strlen(name) + 1);
601 return copy_to_user(argp, name, len) ? -EFAULT : len;
1da177e4 602 }
ec8b4b70 603
1da177e4
LT
604 return -EINVAL;
605}
606
024ac44c 607#ifdef CONFIG_COMPAT
b126207c
DT
608static long joydev_compat_ioctl(struct file *file,
609 unsigned int cmd, unsigned long arg)
024ac44c 610{
d0ffb9be
DT
611 struct joydev_client *client = file->private_data;
612 struct joydev *joydev = client->joydev;
024ac44c
JF
613 void __user *argp = (void __user *)arg;
614 s32 tmp32;
615 struct JS_DATA_SAVE_TYPE_32 ds32;
b126207c 616 int retval;
024ac44c 617
b126207c
DT
618 retval = mutex_lock_interruptible(&joydev->mutex);
619 if (retval)
620 return retval;
621
622 if (!joydev->exist) {
623 retval = -ENODEV;
624 goto out;
625 }
626
627 switch (cmd) {
1e0afb28 628
024ac44c 629 case JS_SET_TIMELIMIT:
b126207c
DT
630 retval = get_user(tmp32, (s32 __user *) arg);
631 if (retval == 0)
024ac44c
JF
632 joydev->glue.JS_TIMELIMIT = tmp32;
633 break;
b126207c 634
024ac44c
JF
635 case JS_GET_TIMELIMIT:
636 tmp32 = joydev->glue.JS_TIMELIMIT;
b126207c 637 retval = put_user(tmp32, (s32 __user *) arg);
024ac44c
JF
638 break;
639
640 case JS_SET_ALL:
b126207c
DT
641 retval = copy_from_user(&ds32, argp,
642 sizeof(ds32)) ? -EFAULT : 0;
643 if (retval == 0) {
024ac44c
JF
644 joydev->glue.JS_TIMEOUT = ds32.JS_TIMEOUT;
645 joydev->glue.BUSY = ds32.BUSY;
646 joydev->glue.JS_EXPIRETIME = ds32.JS_EXPIRETIME;
647 joydev->glue.JS_TIMELIMIT = ds32.JS_TIMELIMIT;
648 joydev->glue.JS_SAVE = ds32.JS_SAVE;
649 joydev->glue.JS_CORR = ds32.JS_CORR;
650 }
651 break;
652
653 case JS_GET_ALL:
654 ds32.JS_TIMEOUT = joydev->glue.JS_TIMEOUT;
655 ds32.BUSY = joydev->glue.BUSY;
656 ds32.JS_EXPIRETIME = joydev->glue.JS_EXPIRETIME;
657 ds32.JS_TIMELIMIT = joydev->glue.JS_TIMELIMIT;
658 ds32.JS_SAVE = joydev->glue.JS_SAVE;
659 ds32.JS_CORR = joydev->glue.JS_CORR;
660
b126207c 661 retval = copy_to_user(argp, &ds32, sizeof(ds32)) ? -EFAULT : 0;
024ac44c
JF
662 break;
663
664 default:
b126207c
DT
665 retval = joydev_ioctl_common(joydev, cmd, argp);
666 break;
024ac44c 667 }
b126207c
DT
668
669 out:
670 mutex_unlock(&joydev->mutex);
671 return retval;
024ac44c
JF
672}
673#endif /* CONFIG_COMPAT */
674
b126207c
DT
675static long joydev_ioctl(struct file *file,
676 unsigned int cmd, unsigned long arg)
024ac44c 677{
d0ffb9be
DT
678 struct joydev_client *client = file->private_data;
679 struct joydev *joydev = client->joydev;
024ac44c 680 void __user *argp = (void __user *)arg;
b126207c 681 int retval;
024ac44c 682
b126207c
DT
683 retval = mutex_lock_interruptible(&joydev->mutex);
684 if (retval)
685 return retval;
024ac44c 686
b126207c
DT
687 if (!joydev->exist) {
688 retval = -ENODEV;
689 goto out;
024ac44c 690 }
b126207c
DT
691
692 switch (cmd) {
693
694 case JS_SET_TIMELIMIT:
695 retval = get_user(joydev->glue.JS_TIMELIMIT,
696 (long __user *) arg);
697 break;
698
699 case JS_GET_TIMELIMIT:
700 retval = put_user(joydev->glue.JS_TIMELIMIT,
701 (long __user *) arg);
702 break;
703
704 case JS_SET_ALL:
705 retval = copy_from_user(&joydev->glue, argp,
41091ad0 706 sizeof(joydev->glue)) ? -EFAULT : 0;
b126207c
DT
707 break;
708
709 case JS_GET_ALL:
710 retval = copy_to_user(argp, &joydev->glue,
711 sizeof(joydev->glue)) ? -EFAULT : 0;
712 break;
713
714 default:
715 retval = joydev_ioctl_common(joydev, cmd, argp);
716 break;
717 }
718 out:
719 mutex_unlock(&joydev->mutex);
720 return retval;
024ac44c
JF
721}
722
66e66118 723static const struct file_operations joydev_fops = {
b126207c
DT
724 .owner = THIS_MODULE,
725 .read = joydev_read,
726 .poll = joydev_poll,
727 .open = joydev_open,
728 .release = joydev_release,
729 .unlocked_ioctl = joydev_ioctl,
024ac44c 730#ifdef CONFIG_COMPAT
b126207c 731 .compat_ioctl = joydev_compat_ioctl,
024ac44c 732#endif
b126207c 733 .fasync = joydev_fasync,
6038f373 734 .llseek = no_llseek,
1da177e4
LT
735};
736
b126207c 737/*
25985edc 738 * Mark device non-existent. This disables writes, ioctls and
b126207c
DT
739 * prevents new users from opening the device. Already posted
740 * blocking reads will stay, however new ones will fail.
741 */
742static void joydev_mark_dead(struct joydev *joydev)
743{
744 mutex_lock(&joydev->mutex);
20da92de 745 joydev->exist = false;
b126207c
DT
746 mutex_unlock(&joydev->mutex);
747}
748
749static void joydev_cleanup(struct joydev *joydev)
750{
751 struct input_handle *handle = &joydev->handle;
752
753 joydev_mark_dead(joydev);
754 joydev_hangup(joydev);
7f8d4cad
DT
755
756 cdev_del(&joydev->cdev);
b126207c 757
25985edc 758 /* joydev is marked dead so no one else accesses joydev->open */
b126207c
DT
759 if (joydev->open)
760 input_close_device(handle);
761}
762
0b7024ac
DT
763
764static bool joydev_match(struct input_handler *handler, struct input_dev *dev)
765{
766 /* Avoid touchpads and touchscreens */
767 if (test_bit(EV_KEY, dev->evbit) && test_bit(BTN_TOUCH, dev->keybit))
768 return false;
769
770 /* Avoid tablets, digitisers and similar devices */
771 if (test_bit(EV_KEY, dev->evbit) && test_bit(BTN_DIGI, dev->keybit))
772 return false;
773
774 return true;
775}
776
5b2a0826
DT
777static int joydev_connect(struct input_handler *handler, struct input_dev *dev,
778 const struct input_device_id *id)
1da177e4
LT
779{
780 struct joydev *joydev;
7f8d4cad 781 int i, j, t, minor, dev_no;
5b2a0826 782 int error;
1da177e4 783
7f8d4cad
DT
784 minor = input_get_new_minor(JOYDEV_MINOR_BASE, JOYDEV_MINORS, true);
785 if (minor < 0) {
786 error = minor;
787 pr_err("failed to reserve new minor: %d\n", error);
788 return error;
1da177e4
LT
789 }
790
5b2a0826 791 joydev = kzalloc(sizeof(struct joydev), GFP_KERNEL);
7f8d4cad
DT
792 if (!joydev) {
793 error = -ENOMEM;
794 goto err_free_minor;
795 }
1da177e4 796
d0ffb9be 797 INIT_LIST_HEAD(&joydev->client_list);
b126207c
DT
798 spin_lock_init(&joydev->client_lock);
799 mutex_init(&joydev->mutex);
1da177e4 800 init_waitqueue_head(&joydev->wait);
20da92de 801 joydev->exist = true;
7f8d4cad
DT
802
803 dev_no = minor;
804 /* Normalize device number if it falls into legacy range */
805 if (dev_no < JOYDEV_MINOR_BASE + JOYDEV_MINORS)
806 dev_no -= JOYDEV_MINOR_BASE;
807 dev_set_name(&joydev->dev, "js%d", dev_no);
b126207c 808
a7097ff8 809 joydev->handle.dev = input_get_device(dev);
3d5cb60e 810 joydev->handle.name = dev_name(&joydev->dev);
1da177e4
LT
811 joydev->handle.handler = handler;
812 joydev->handle.private = joydev;
1da177e4 813
81c2a3ba 814 for (i = 0; i < ABS_CNT; i++)
1da177e4
LT
815 if (test_bit(i, dev->absbit)) {
816 joydev->absmap[i] = joydev->nabs;
817 joydev->abspam[joydev->nabs] = i;
818 joydev->nabs++;
819 }
820
821 for (i = BTN_JOYSTICK - BTN_MISC; i < KEY_MAX - BTN_MISC + 1; i++)
822 if (test_bit(i + BTN_MISC, dev->keybit)) {
823 joydev->keymap[i] = joydev->nkey;
824 joydev->keypam[joydev->nkey] = i + BTN_MISC;
825 joydev->nkey++;
826 }
827
f24949e8 828 for (i = 0; i < BTN_JOYSTICK - BTN_MISC; i++)
1da177e4
LT
829 if (test_bit(i + BTN_MISC, dev->keybit)) {
830 joydev->keymap[i] = joydev->nkey;
831 joydev->keypam[joydev->nkey] = i + BTN_MISC;
832 joydev->nkey++;
833 }
834
835 for (i = 0; i < joydev->nabs; i++) {
836 j = joydev->abspam[i];
987a6c02 837 if (input_abs_get_max(dev, j) == input_abs_get_min(dev, j)) {
1da177e4 838 joydev->corr[i].type = JS_CORR_NONE;
1da177e4
LT
839 continue;
840 }
841 joydev->corr[i].type = JS_CORR_BROKEN;
987a6c02
DM
842 joydev->corr[i].prec = input_abs_get_fuzz(dev, j);
843
844 t = (input_abs_get_max(dev, j) + input_abs_get_min(dev, j)) / 2;
845 joydev->corr[i].coef[0] = t - input_abs_get_flat(dev, j);
846 joydev->corr[i].coef[1] = t + input_abs_get_flat(dev, j);
b126207c 847
987a6c02
DM
848 t = (input_abs_get_max(dev, j) - input_abs_get_min(dev, j)) / 2
849 - 2 * input_abs_get_flat(dev, j);
b126207c
DT
850 if (t) {
851 joydev->corr[i].coef[2] = (1 << 29) / t;
852 joydev->corr[i].coef[3] = (1 << 29) / t;
b126207c 853 }
1da177e4
LT
854 }
855
7f8d4cad 856 joydev->dev.devt = MKDEV(INPUT_MAJOR, minor);
9657d75c
DT
857 joydev->dev.class = &input_class;
858 joydev->dev.parent = &dev->dev;
9657d75c
DT
859 joydev->dev.release = joydev_free;
860 device_initialize(&joydev->dev);
5b2a0826 861
b126207c 862 error = input_register_handle(&joydev->handle);
5b2a0826 863 if (error)
9657d75c 864 goto err_free_joydev;
5b2a0826 865
7f8d4cad 866 cdev_init(&joydev->cdev, &joydev_fops);
4a215aad 867 joydev->cdev.kobj.parent = &joydev->dev.kobj;
7f8d4cad 868 error = cdev_add(&joydev->cdev, joydev->dev.devt, 1);
5b2a0826 869 if (error)
b126207c
DT
870 goto err_unregister_handle;
871
872 error = device_add(&joydev->dev);
873 if (error)
874 goto err_cleanup_joydev;
5b2a0826
DT
875
876 return 0;
1da177e4 877
b126207c
DT
878 err_cleanup_joydev:
879 joydev_cleanup(joydev);
880 err_unregister_handle:
881 input_unregister_handle(&joydev->handle);
5b2a0826 882 err_free_joydev:
9657d75c 883 put_device(&joydev->dev);
7f8d4cad
DT
884 err_free_minor:
885 input_free_minor(minor);
5b2a0826 886 return error;
1da177e4
LT
887}
888
889static void joydev_disconnect(struct input_handle *handle)
890{
891 struct joydev *joydev = handle->private;
1da177e4 892
9657d75c 893 device_del(&joydev->dev);
b126207c 894 joydev_cleanup(joydev);
7f8d4cad 895 input_free_minor(MINOR(joydev->dev.devt));
b126207c 896 input_unregister_handle(handle);
9657d75c 897 put_device(&joydev->dev);
1da177e4
LT
898}
899
66e66118 900static const struct input_device_id joydev_ids[] = {
1da177e4 901 {
b126207c
DT
902 .flags = INPUT_DEVICE_ID_MATCH_EVBIT |
903 INPUT_DEVICE_ID_MATCH_ABSBIT,
7b19ada2
JS
904 .evbit = { BIT_MASK(EV_ABS) },
905 .absbit = { BIT_MASK(ABS_X) },
1da177e4
LT
906 },
907 {
b126207c
DT
908 .flags = INPUT_DEVICE_ID_MATCH_EVBIT |
909 INPUT_DEVICE_ID_MATCH_ABSBIT,
7b19ada2
JS
910 .evbit = { BIT_MASK(EV_ABS) },
911 .absbit = { BIT_MASK(ABS_WHEEL) },
1da177e4
LT
912 },
913 {
b126207c
DT
914 .flags = INPUT_DEVICE_ID_MATCH_EVBIT |
915 INPUT_DEVICE_ID_MATCH_ABSBIT,
7b19ada2
JS
916 .evbit = { BIT_MASK(EV_ABS) },
917 .absbit = { BIT_MASK(ABS_THROTTLE) },
1da177e4 918 },
26a6931b
CF
919 {
920 .flags = INPUT_DEVICE_ID_MATCH_EVBIT |
921 INPUT_DEVICE_ID_MATCH_KEYBIT,
922 .evbit = { BIT_MASK(EV_KEY) },
923 .keybit = {[BIT_WORD(BTN_JOYSTICK)] = BIT_MASK(BTN_JOYSTICK) },
924 },
925 {
926 .flags = INPUT_DEVICE_ID_MATCH_EVBIT |
927 INPUT_DEVICE_ID_MATCH_KEYBIT,
928 .evbit = { BIT_MASK(EV_KEY) },
929 .keybit = { [BIT_WORD(BTN_GAMEPAD)] = BIT_MASK(BTN_GAMEPAD) },
930 },
931 {
932 .flags = INPUT_DEVICE_ID_MATCH_EVBIT |
933 INPUT_DEVICE_ID_MATCH_KEYBIT,
934 .evbit = { BIT_MASK(EV_KEY) },
935 .keybit = { [BIT_WORD(BTN_TRIGGER_HAPPY)] = BIT_MASK(BTN_TRIGGER_HAPPY) },
936 },
1e0afb28 937 { } /* Terminating entry */
1da177e4
LT
938};
939
940MODULE_DEVICE_TABLE(input, joydev_ids);
941
942static struct input_handler joydev_handler = {
b126207c 943 .event = joydev_event,
0b7024ac 944 .match = joydev_match,
b126207c
DT
945 .connect = joydev_connect,
946 .disconnect = joydev_disconnect,
7f8d4cad 947 .legacy_minors = true,
b126207c
DT
948 .minor = JOYDEV_MINOR_BASE,
949 .name = "joydev",
950 .id_table = joydev_ids,
1da177e4
LT
951};
952
953static int __init joydev_init(void)
954{
4263cf0f 955 return input_register_handler(&joydev_handler);
1da177e4
LT
956}
957
958static void __exit joydev_exit(void)
959{
960 input_unregister_handler(&joydev_handler);
961}
962
963module_init(joydev_init);
964module_exit(joydev_exit);