linux/drivers/input/joydev.c
<<
>>
Prefs
   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
  13#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  14
  15#include <asm/io.h>
  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>
  22#include <linux/sched.h>
  23#include <linux/slab.h>
  24#include <linux/mm.h>
  25#include <linux/module.h>
  26#include <linux/poll.h>
  27#include <linux/init.h>
  28#include <linux/device.h>
  29#include <linux/cdev.h>
  30
  31MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>");
  32MODULE_DESCRIPTION("Joystick device interfaces");
  33MODULE_SUPPORTED_DEVICE("input/js");
  34MODULE_LICENSE("GPL");
  35
  36#define JOYDEV_MINOR_BASE       0
  37#define JOYDEV_MINORS           16
  38#define JOYDEV_BUFFER_SIZE      64
  39
  40struct joydev {
  41        int open;
  42        struct input_handle handle;
  43        wait_queue_head_t wait;
  44        struct list_head client_list;
  45        spinlock_t client_lock; /* protects client_list */
  46        struct mutex mutex;
  47        struct device dev;
  48        struct cdev cdev;
  49        bool exist;
  50
  51        struct js_corr corr[ABS_CNT];
  52        struct JS_DATA_SAVE_TYPE glue;
  53        int nabs;
  54        int nkey;
  55        __u16 keymap[KEY_MAX - BTN_MISC + 1];
  56        __u16 keypam[KEY_MAX - BTN_MISC + 1];
  57        __u8 absmap[ABS_CNT];
  58        __u8 abspam[ABS_CNT];
  59        __s16 abs[ABS_CNT];
  60};
  61
  62struct joydev_client {
  63        struct js_event buffer[JOYDEV_BUFFER_SIZE];
  64        int head;
  65        int tail;
  66        int startup;
  67        spinlock_t buffer_lock; /* protects access to buffer, head and tail */
  68        struct fasync_struct *fasync;
  69        struct joydev *joydev;
  70        struct list_head node;
  71};
  72
  73static int joydev_correct(int value, struct js_corr *corr)
  74{
  75        switch (corr->type) {
  76
  77        case JS_CORR_NONE:
  78                break;
  79
  80        case JS_CORR_BROKEN:
  81                value = value > corr->coef[0] ? (value < corr->coef[1] ? 0 :
  82                        ((corr->coef[3] * (value - corr->coef[1])) >> 14)) :
  83                        ((corr->coef[2] * (value - corr->coef[0])) >> 14);
  84                break;
  85
  86        default:
  87                return 0;
  88        }
  89
  90        return clamp(value, -32767, 32767);
  91}
  92
  93static void joydev_pass_event(struct joydev_client *client,
  94                              struct js_event *event)
  95{
  96        struct joydev *joydev = client->joydev;
  97
  98        /*
  99         * IRQs already disabled, just acquire the lock
 100         */
 101        spin_lock(&client->buffer_lock);
 102
 103        client->buffer[client->head] = *event;
 104
 105        if (client->startup == joydev->nabs + joydev->nkey) {
 106                client->head++;
 107                client->head &= JOYDEV_BUFFER_SIZE - 1;
 108                if (client->tail == client->head)
 109                        client->startup = 0;
 110        }
 111
 112        spin_unlock(&client->buffer_lock);
 113
 114        kill_fasync(&client->fasync, SIGIO, POLL_IN);
 115}
 116
 117static void joydev_event(struct input_handle *handle,
 118                         unsigned int type, unsigned int code, int value)
 119{
 120        struct joydev *joydev = handle->private;
 121        struct joydev_client *client;
 122        struct js_event event;
 123
 124        switch (type) {
 125
 126        case EV_KEY:
 127                if (code < BTN_MISC || value == 2)
 128                        return;
 129                event.type = JS_EVENT_BUTTON;
 130                event.number = joydev->keymap[code - BTN_MISC];
 131                event.value = value;
 132                break;
 133
 134        case EV_ABS:
 135                event.type = JS_EVENT_AXIS;
 136                event.number = joydev->absmap[code];
 137                event.value = joydev_correct(value,
 138                                        &joydev->corr[event.number]);
 139                if (event.value == joydev->abs[event.number])
 140                        return;
 141                joydev->abs[event.number] = event.value;
 142                break;
 143
 144        default:
 145                return;
 146        }
 147
 148        event.time = jiffies_to_msecs(jiffies);
 149
 150        rcu_read_lock();
 151        list_for_each_entry_rcu(client, &joydev->client_list, node)
 152                joydev_pass_event(client, &event);
 153        rcu_read_unlock();
 154
 155        wake_up_interruptible(&joydev->wait);
 156}
 157
 158static int joydev_fasync(int fd, struct file *file, int on)
 159{
 160        struct joydev_client *client = file->private_data;
 161
 162        return fasync_helper(fd, file, on, &client->fasync);
 163}
 164
 165static void joydev_free(struct device *dev)
 166{
 167        struct joydev *joydev = container_of(dev, struct joydev, dev);
 168
 169        input_put_device(joydev->handle.dev);
 170        kfree(joydev);
 171}
 172
 173static void joydev_attach_client(struct joydev *joydev,
 174                                 struct joydev_client *client)
 175{
 176        spin_lock(&joydev->client_lock);
 177        list_add_tail_rcu(&client->node, &joydev->client_list);
 178        spin_unlock(&joydev->client_lock);
 179}
 180
 181static void joydev_detach_client(struct joydev *joydev,
 182                                 struct joydev_client *client)
 183{
 184        spin_lock(&joydev->client_lock);
 185        list_del_rcu(&client->node);
 186        spin_unlock(&joydev->client_lock);
 187        synchronize_rcu();
 188}
 189
 190static void joydev_refresh_state(struct joydev *joydev)
 191{
 192        struct input_dev *dev = joydev->handle.dev;
 193        int i, val;
 194
 195        for (i = 0; i < joydev->nabs; i++) {
 196                val = input_abs_get_val(dev, joydev->abspam[i]);
 197                joydev->abs[i] = joydev_correct(val, &joydev->corr[i]);
 198        }
 199}
 200
 201static int joydev_open_device(struct joydev *joydev)
 202{
 203        int retval;
 204
 205        retval = mutex_lock_interruptible(&joydev->mutex);
 206        if (retval)
 207                return retval;
 208
 209        if (!joydev->exist)
 210                retval = -ENODEV;
 211        else if (!joydev->open++) {
 212                retval = input_open_device(&joydev->handle);
 213                if (retval)
 214                        joydev->open--;
 215                else
 216                        joydev_refresh_state(joydev);
 217        }
 218
 219        mutex_unlock(&joydev->mutex);
 220        return retval;
 221}
 222
 223static void joydev_close_device(struct joydev *joydev)
 224{
 225        mutex_lock(&joydev->mutex);
 226
 227        if (joydev->exist && !--joydev->open)
 228                input_close_device(&joydev->handle);
 229
 230        mutex_unlock(&joydev->mutex);
 231}
 232
 233/*
 234 * Wake up users waiting for IO so they can disconnect from
 235 * dead device.
 236 */
 237static void joydev_hangup(struct joydev *joydev)
 238{
 239        struct joydev_client *client;
 240
 241        spin_lock(&joydev->client_lock);
 242        list_for_each_entry(client, &joydev->client_list, node)
 243                kill_fasync(&client->fasync, SIGIO, POLL_HUP);
 244        spin_unlock(&joydev->client_lock);
 245
 246        wake_up_interruptible(&joydev->wait);
 247}
 248
 249static int joydev_release(struct inode *inode, struct file *file)
 250{
 251        struct joydev_client *client = file->private_data;
 252        struct joydev *joydev = client->joydev;
 253
 254        joydev_detach_client(joydev, client);
 255        kfree(client);
 256
 257        joydev_close_device(joydev);
 258
 259        return 0;
 260}
 261
 262static int joydev_open(struct inode *inode, struct file *file)
 263{
 264        struct joydev *joydev =
 265                        container_of(inode->i_cdev, struct joydev, cdev);
 266        struct joydev_client *client;
 267        int error;
 268
 269        client = kzalloc(sizeof(struct joydev_client), GFP_KERNEL);
 270        if (!client)
 271                return -ENOMEM;
 272
 273        spin_lock_init(&client->buffer_lock);
 274        client->joydev = joydev;
 275        joydev_attach_client(joydev, client);
 276
 277        error = joydev_open_device(joydev);
 278        if (error)
 279                goto err_free_client;
 280
 281        file->private_data = client;
 282        nonseekable_open(inode, file);
 283
 284        return 0;
 285
 286 err_free_client:
 287        joydev_detach_client(joydev, client);
 288        kfree(client);
 289        return error;
 290}
 291
 292static int joydev_generate_startup_event(struct joydev_client *client,
 293                                         struct input_dev *input,
 294                                         struct js_event *event)
 295{
 296        struct joydev *joydev = client->joydev;
 297        int have_event;
 298
 299        spin_lock_irq(&client->buffer_lock);
 300
 301        have_event = client->startup < joydev->nabs + joydev->nkey;
 302
 303        if (have_event) {
 304
 305                event->time = jiffies_to_msecs(jiffies);
 306                if (client->startup < joydev->nkey) {
 307                        event->type = JS_EVENT_BUTTON | JS_EVENT_INIT;
 308                        event->number = client->startup;
 309                        event->value = !!test_bit(joydev->keypam[event->number],
 310                                                  input->key);
 311                } else {
 312                        event->type = JS_EVENT_AXIS | JS_EVENT_INIT;
 313                        event->number = client->startup - joydev->nkey;
 314                        event->value = joydev->abs[event->number];
 315                }
 316                client->startup++;
 317        }
 318
 319        spin_unlock_irq(&client->buffer_lock);
 320
 321        return have_event;
 322}
 323
 324static int joydev_fetch_next_event(struct joydev_client *client,
 325                                   struct js_event *event)
 326{
 327        int have_event;
 328
 329        spin_lock_irq(&client->buffer_lock);
 330
 331        have_event = client->head != client->tail;
 332        if (have_event) {
 333                *event = client->buffer[client->tail++];
 334                client->tail &= JOYDEV_BUFFER_SIZE - 1;
 335        }
 336
 337        spin_unlock_irq(&client->buffer_lock);
 338
 339        return have_event;
 340}
 341
 342/*
 343 * Old joystick interface
 344 */
 345static ssize_t joydev_0x_read(struct joydev_client *client,
 346                              struct input_dev *input,
 347                              char __user *buf)
 348{
 349        struct joydev *joydev = client->joydev;
 350        struct JS_DATA_TYPE data;
 351        int i;
 352
 353        spin_lock_irq(&input->event_lock);
 354
 355        /*
 356         * Get device state
 357         */
 358        for (data.buttons = i = 0; i < 32 && i < joydev->nkey; i++)
 359                data.buttons |=
 360                        test_bit(joydev->keypam[i], input->key) ? (1 << i) : 0;
 361        data.x = (joydev->abs[0] / 256 + 128) >> joydev->glue.JS_CORR.x;
 362        data.y = (joydev->abs[1] / 256 + 128) >> joydev->glue.JS_CORR.y;
 363
 364        /*
 365         * Reset reader's event queue
 366         */
 367        spin_lock(&client->buffer_lock);
 368        client->startup = 0;
 369        client->tail = client->head;
 370        spin_unlock(&client->buffer_lock);
 371
 372        spin_unlock_irq(&input->event_lock);
 373
 374        if (copy_to_user(buf, &data, sizeof(struct JS_DATA_TYPE)))
 375                return -EFAULT;
 376
 377        return sizeof(struct JS_DATA_TYPE);
 378}
 379
 380static inline int joydev_data_pending(struct joydev_client *client)
 381{
 382        struct joydev *joydev = client->joydev;
 383
 384        return client->startup < joydev->nabs + joydev->nkey ||
 385                client->head != client->tail;
 386}
 387
 388static ssize_t joydev_read(struct file *file, char __user *buf,
 389                           size_t count, loff_t *ppos)
 390{
 391        struct joydev_client *client = file->private_data;
 392        struct joydev *joydev = client->joydev;
 393        struct input_dev *input = joydev->handle.dev;
 394        struct js_event event;
 395        int retval;
 396
 397        if (!joydev->exist)
 398                return -ENODEV;
 399
 400        if (count < sizeof(struct js_event))
 401                return -EINVAL;
 402
 403        if (count == sizeof(struct JS_DATA_TYPE))
 404                return joydev_0x_read(client, input, buf);
 405
 406        if (!joydev_data_pending(client) && (file->f_flags & O_NONBLOCK))
 407                return -EAGAIN;
 408
 409        retval = wait_event_interruptible(joydev->wait,
 410                        !joydev->exist || joydev_data_pending(client));
 411        if (retval)
 412                return retval;
 413
 414        if (!joydev->exist)
 415                return -ENODEV;
 416
 417        while (retval + sizeof(struct js_event) <= count &&
 418               joydev_generate_startup_event(client, input, &event)) {
 419
 420                if (copy_to_user(buf + retval, &event, sizeof(struct js_event)))
 421                        return -EFAULT;
 422
 423                retval += sizeof(struct js_event);
 424        }
 425
 426        while (retval + sizeof(struct js_event) <= count &&
 427               joydev_fetch_next_event(client, &event)) {
 428
 429                if (copy_to_user(buf + retval, &event, sizeof(struct js_event)))
 430                        return -EFAULT;
 431
 432                retval += sizeof(struct js_event);
 433        }
 434
 435        return retval;
 436}
 437
 438/* No kernel lock - fine */
 439static __poll_t joydev_poll(struct file *file, poll_table *wait)
 440{
 441        struct joydev_client *client = file->private_data;
 442        struct joydev *joydev = client->joydev;
 443
 444        poll_wait(file, &joydev->wait, wait);
 445        return (joydev_data_pending(client) ? (EPOLLIN | EPOLLRDNORM) : 0) |
 446                (joydev->exist ?  0 : (EPOLLHUP | EPOLLERR));
 447}
 448
 449static int joydev_handle_JSIOCSAXMAP(struct joydev *joydev,
 450                                     void __user *argp, size_t len)
 451{
 452        __u8 *abspam;
 453        int i;
 454        int retval = 0;
 455
 456        len = min(len, sizeof(joydev->abspam));
 457
 458        /* Validate the map. */
 459        abspam = memdup_user(argp, len);
 460        if (IS_ERR(abspam))
 461                return PTR_ERR(abspam);
 462
 463        for (i = 0; i < joydev->nabs; i++) {
 464                if (abspam[i] > ABS_MAX) {
 465                        retval = -EINVAL;
 466                        goto out;
 467                }
 468        }
 469
 470        memcpy(joydev->abspam, abspam, len);
 471
 472        for (i = 0; i < joydev->nabs; i++)
 473                joydev->absmap[joydev->abspam[i]] = i;
 474
 475 out:
 476        kfree(abspam);
 477        return retval;
 478}
 479
 480static int joydev_handle_JSIOCSBTNMAP(struct joydev *joydev,
 481                                      void __user *argp, size_t len)
 482{
 483        __u16 *keypam;
 484        int i;
 485        int retval = 0;
 486
 487        len = min(len, sizeof(joydev->keypam));
 488
 489        /* Validate the map. */
 490        keypam = memdup_user(argp, len);
 491        if (IS_ERR(keypam))
 492                return PTR_ERR(keypam);
 493
 494        for (i = 0; i < joydev->nkey; i++) {
 495                if (keypam[i] > KEY_MAX || keypam[i] < BTN_MISC) {
 496                        retval = -EINVAL;
 497                        goto out;
 498                }
 499        }
 500
 501        memcpy(joydev->keypam, keypam, len);
 502
 503        for (i = 0; i < joydev->nkey; i++)
 504                joydev->keymap[keypam[i] - BTN_MISC] = i;
 505
 506 out:
 507        kfree(keypam);
 508        return retval;
 509}
 510
 511
 512static int joydev_ioctl_common(struct joydev *joydev,
 513                                unsigned int cmd, void __user *argp)
 514{
 515        struct input_dev *dev = joydev->handle.dev;
 516        size_t len;
 517        int i;
 518        const char *name;
 519
 520        /* Process fixed-sized commands. */
 521        switch (cmd) {
 522
 523        case JS_SET_CAL:
 524                return copy_from_user(&joydev->glue.JS_CORR, argp,
 525                                sizeof(joydev->glue.JS_CORR)) ? -EFAULT : 0;
 526
 527        case JS_GET_CAL:
 528                return copy_to_user(argp, &joydev->glue.JS_CORR,
 529                                sizeof(joydev->glue.JS_CORR)) ? -EFAULT : 0;
 530
 531        case JS_SET_TIMEOUT:
 532                return get_user(joydev->glue.JS_TIMEOUT, (s32 __user *) argp);
 533
 534        case JS_GET_TIMEOUT:
 535                return put_user(joydev->glue.JS_TIMEOUT, (s32 __user *) argp);
 536
 537        case JSIOCGVERSION:
 538                return put_user(JS_VERSION, (__u32 __user *) argp);
 539
 540        case JSIOCGAXES:
 541                return put_user(joydev->nabs, (__u8 __user *) argp);
 542
 543        case JSIOCGBUTTONS:
 544                return put_user(joydev->nkey, (__u8 __user *) argp);
 545
 546        case JSIOCSCORR:
 547                if (copy_from_user(joydev->corr, argp,
 548                              sizeof(joydev->corr[0]) * joydev->nabs))
 549                        return -EFAULT;
 550
 551                for (i = 0; i < joydev->nabs; i++) {
 552                        int val = input_abs_get_val(dev, joydev->abspam[i]);
 553                        joydev->abs[i] = joydev_correct(val, &joydev->corr[i]);
 554                }
 555                return 0;
 556
 557        case JSIOCGCORR:
 558                return copy_to_user(argp, joydev->corr,
 559                        sizeof(joydev->corr[0]) * joydev->nabs) ? -EFAULT : 0;
 560
 561        }
 562
 563        /*
 564         * Process variable-sized commands (the axis and button map commands
 565         * are considered variable-sized to decouple them from the values of
 566         * ABS_MAX and KEY_MAX).
 567         */
 568        switch (cmd & ~IOCSIZE_MASK) {
 569
 570        case (JSIOCSAXMAP & ~IOCSIZE_MASK):
 571                return joydev_handle_JSIOCSAXMAP(joydev, argp, _IOC_SIZE(cmd));
 572
 573        case (JSIOCGAXMAP & ~IOCSIZE_MASK):
 574                len = min_t(size_t, _IOC_SIZE(cmd), sizeof(joydev->abspam));
 575                return copy_to_user(argp, joydev->abspam, len) ? -EFAULT : len;
 576
 577        case (JSIOCSBTNMAP & ~IOCSIZE_MASK):
 578                return joydev_handle_JSIOCSBTNMAP(joydev, argp, _IOC_SIZE(cmd));
 579
 580        case (JSIOCGBTNMAP & ~IOCSIZE_MASK):
 581                len = min_t(size_t, _IOC_SIZE(cmd), sizeof(joydev->keypam));
 582                return copy_to_user(argp, joydev->keypam, len) ? -EFAULT : len;
 583
 584        case JSIOCGNAME(0):
 585                name = dev->name;
 586                if (!name)
 587                        return 0;
 588
 589                len = min_t(size_t, _IOC_SIZE(cmd), strlen(name) + 1);
 590                return copy_to_user(argp, name, len) ? -EFAULT : len;
 591        }
 592
 593        return -EINVAL;
 594}
 595
 596#ifdef CONFIG_COMPAT
 597static long joydev_compat_ioctl(struct file *file,
 598                                unsigned int cmd, unsigned long arg)
 599{
 600        struct joydev_client *client = file->private_data;
 601        struct joydev *joydev = client->joydev;
 602        void __user *argp = (void __user *)arg;
 603        s32 tmp32;
 604        struct JS_DATA_SAVE_TYPE_32 ds32;
 605        int retval;
 606
 607        retval = mutex_lock_interruptible(&joydev->mutex);
 608        if (retval)
 609                return retval;
 610
 611        if (!joydev->exist) {
 612                retval = -ENODEV;
 613                goto out;
 614        }
 615
 616        switch (cmd) {
 617
 618        case JS_SET_TIMELIMIT:
 619                retval = get_user(tmp32, (s32 __user *) arg);
 620                if (retval == 0)
 621                        joydev->glue.JS_TIMELIMIT = tmp32;
 622                break;
 623
 624        case JS_GET_TIMELIMIT:
 625                tmp32 = joydev->glue.JS_TIMELIMIT;
 626                retval = put_user(tmp32, (s32 __user *) arg);
 627                break;
 628
 629        case JS_SET_ALL:
 630                retval = copy_from_user(&ds32, argp,
 631                                        sizeof(ds32)) ? -EFAULT : 0;
 632                if (retval == 0) {
 633                        joydev->glue.JS_TIMEOUT    = ds32.JS_TIMEOUT;
 634                        joydev->glue.BUSY          = ds32.BUSY;
 635                        joydev->glue.JS_EXPIRETIME = ds32.JS_EXPIRETIME;
 636                        joydev->glue.JS_TIMELIMIT  = ds32.JS_TIMELIMIT;
 637                        joydev->glue.JS_SAVE       = ds32.JS_SAVE;
 638                        joydev->glue.JS_CORR       = ds32.JS_CORR;
 639                }
 640                break;
 641
 642        case JS_GET_ALL:
 643                ds32.JS_TIMEOUT    = joydev->glue.JS_TIMEOUT;
 644                ds32.BUSY          = joydev->glue.BUSY;
 645                ds32.JS_EXPIRETIME = joydev->glue.JS_EXPIRETIME;
 646                ds32.JS_TIMELIMIT  = joydev->glue.JS_TIMELIMIT;
 647                ds32.JS_SAVE       = joydev->glue.JS_SAVE;
 648                ds32.JS_CORR       = joydev->glue.JS_CORR;
 649
 650                retval = copy_to_user(argp, &ds32, sizeof(ds32)) ? -EFAULT : 0;
 651                break;
 652
 653        default:
 654                retval = joydev_ioctl_common(joydev, cmd, argp);
 655                break;
 656        }
 657
 658 out:
 659        mutex_unlock(&joydev->mutex);
 660        return retval;
 661}
 662#endif /* CONFIG_COMPAT */
 663
 664static long joydev_ioctl(struct file *file,
 665                         unsigned int cmd, unsigned long arg)
 666{
 667        struct joydev_client *client = file->private_data;
 668        struct joydev *joydev = client->joydev;
 669        void __user *argp = (void __user *)arg;
 670        int retval;
 671
 672        retval = mutex_lock_interruptible(&joydev->mutex);
 673        if (retval)
 674                return retval;
 675
 676        if (!joydev->exist) {
 677                retval = -ENODEV;
 678                goto out;
 679        }
 680
 681        switch (cmd) {
 682
 683        case JS_SET_TIMELIMIT:
 684                retval = get_user(joydev->glue.JS_TIMELIMIT,
 685                                  (long __user *) arg);
 686                break;
 687
 688        case JS_GET_TIMELIMIT:
 689                retval = put_user(joydev->glue.JS_TIMELIMIT,
 690                                  (long __user *) arg);
 691                break;
 692
 693        case JS_SET_ALL:
 694                retval = copy_from_user(&joydev->glue, argp,
 695                                        sizeof(joydev->glue)) ? -EFAULT : 0;
 696                break;
 697
 698        case JS_GET_ALL:
 699                retval = copy_to_user(argp, &joydev->glue,
 700                                      sizeof(joydev->glue)) ? -EFAULT : 0;
 701                break;
 702
 703        default:
 704                retval = joydev_ioctl_common(joydev, cmd, argp);
 705                break;
 706        }
 707 out:
 708        mutex_unlock(&joydev->mutex);
 709        return retval;
 710}
 711
 712static const struct file_operations joydev_fops = {
 713        .owner          = THIS_MODULE,
 714        .read           = joydev_read,
 715        .poll           = joydev_poll,
 716        .open           = joydev_open,
 717        .release        = joydev_release,
 718        .unlocked_ioctl = joydev_ioctl,
 719#ifdef CONFIG_COMPAT
 720        .compat_ioctl   = joydev_compat_ioctl,
 721#endif
 722        .fasync         = joydev_fasync,
 723        .llseek         = no_llseek,
 724};
 725
 726/*
 727 * Mark device non-existent. This disables writes, ioctls and
 728 * prevents new users from opening the device. Already posted
 729 * blocking reads will stay, however new ones will fail.
 730 */
 731static void joydev_mark_dead(struct joydev *joydev)
 732{
 733        mutex_lock(&joydev->mutex);
 734        joydev->exist = false;
 735        mutex_unlock(&joydev->mutex);
 736}
 737
 738static void joydev_cleanup(struct joydev *joydev)
 739{
 740        struct input_handle *handle = &joydev->handle;
 741
 742        joydev_mark_dead(joydev);
 743        joydev_hangup(joydev);
 744
 745        /* joydev is marked dead so no one else accesses joydev->open */
 746        if (joydev->open)
 747                input_close_device(handle);
 748}
 749
 750/*
 751 * These codes are copied from from hid-ids.h, unfortunately there is no common
 752 * usb_ids/bt_ids.h header.
 753 */
 754#define USB_VENDOR_ID_SONY                      0x054c
 755#define USB_DEVICE_ID_SONY_PS3_CONTROLLER               0x0268
 756#define USB_DEVICE_ID_SONY_PS4_CONTROLLER               0x05c4
 757#define USB_DEVICE_ID_SONY_PS4_CONTROLLER_2             0x09cc
 758#define USB_DEVICE_ID_SONY_PS4_CONTROLLER_DONGLE        0x0ba0
 759
 760#define USB_VENDOR_ID_THQ                       0x20d6
 761#define USB_DEVICE_ID_THQ_PS3_UDRAW                     0xcb17
 762
 763#define ACCEL_DEV(vnd, prd)                                             \
 764        {                                                               \
 765                .flags = INPUT_DEVICE_ID_MATCH_VENDOR |                 \
 766                                INPUT_DEVICE_ID_MATCH_PRODUCT |         \
 767                                INPUT_DEVICE_ID_MATCH_PROPBIT,          \
 768                .vendor = (vnd),                                        \
 769                .product = (prd),                                       \
 770                .propbit = { BIT_MASK(INPUT_PROP_ACCELEROMETER) },      \
 771        }
 772
 773static const struct input_device_id joydev_blacklist[] = {
 774        /* Avoid touchpads and touchscreens */
 775        {
 776                .flags = INPUT_DEVICE_ID_MATCH_EVBIT |
 777                                INPUT_DEVICE_ID_MATCH_KEYBIT,
 778                .evbit = { BIT_MASK(EV_KEY) },
 779                .keybit = { [BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH) },
 780        },
 781        /* Avoid tablets, digitisers and similar devices */
 782        {
 783                .flags = INPUT_DEVICE_ID_MATCH_EVBIT |
 784                                INPUT_DEVICE_ID_MATCH_KEYBIT,
 785                .evbit = { BIT_MASK(EV_KEY) },
 786                .keybit = { [BIT_WORD(BTN_DIGI)] = BIT_MASK(BTN_DIGI) },
 787        },
 788        /* Disable accelerometers on composite devices */
 789        ACCEL_DEV(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER),
 790        ACCEL_DEV(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER),
 791        ACCEL_DEV(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER_2),
 792        ACCEL_DEV(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER_DONGLE),
 793        ACCEL_DEV(USB_VENDOR_ID_THQ, USB_DEVICE_ID_THQ_PS3_UDRAW),
 794        { /* sentinel */ }
 795};
 796
 797static bool joydev_dev_is_blacklisted(struct input_dev *dev)
 798{
 799        const struct input_device_id *id;
 800
 801        for (id = joydev_blacklist; id->flags; id++) {
 802                if (input_match_device_id(dev, id)) {
 803                        dev_dbg(&dev->dev,
 804                                "joydev: blacklisting '%s'\n", dev->name);
 805                        return true;
 806                }
 807        }
 808
 809        return false;
 810}
 811
 812static bool joydev_dev_is_absolute_mouse(struct input_dev *dev)
 813{
 814        DECLARE_BITMAP(jd_scratch, KEY_CNT);
 815
 816        BUILD_BUG_ON(ABS_CNT > KEY_CNT || EV_CNT > KEY_CNT);
 817
 818        /*
 819         * Virtualization (VMware, etc) and remote management (HP
 820         * ILO2) solutions use absolute coordinates for their virtual
 821         * pointing devices so that there is one-to-one relationship
 822         * between pointer position on the host screen and virtual
 823         * guest screen, and so their mice use ABS_X, ABS_Y and 3
 824         * primary button events. This clashes with what joydev
 825         * considers to be joysticks (a device with at minimum ABS_X
 826         * axis).
 827         *
 828         * Here we are trying to separate absolute mice from
 829         * joysticks. A device is, for joystick detection purposes,
 830         * considered to be an absolute mouse if the following is
 831         * true:
 832         *
 833         * 1) Event types are exactly EV_ABS, EV_KEY and EV_SYN.
 834         * 2) Absolute events are exactly ABS_X and ABS_Y.
 835         * 3) Keys are exactly BTN_LEFT, BTN_RIGHT and BTN_MIDDLE.
 836         * 4) Device is not on "Amiga" bus.
 837         */
 838
 839        bitmap_zero(jd_scratch, EV_CNT);
 840        __set_bit(EV_ABS, jd_scratch);
 841        __set_bit(EV_KEY, jd_scratch);
 842        __set_bit(EV_SYN, jd_scratch);
 843        if (!bitmap_equal(jd_scratch, dev->evbit, EV_CNT))
 844                return false;
 845
 846        bitmap_zero(jd_scratch, ABS_CNT);
 847        __set_bit(ABS_X, jd_scratch);
 848        __set_bit(ABS_Y, jd_scratch);
 849        if (!bitmap_equal(dev->absbit, jd_scratch, ABS_CNT))
 850                return false;
 851
 852        bitmap_zero(jd_scratch, KEY_CNT);
 853        __set_bit(BTN_LEFT, jd_scratch);
 854        __set_bit(BTN_RIGHT, jd_scratch);
 855        __set_bit(BTN_MIDDLE, jd_scratch);
 856
 857        if (!bitmap_equal(dev->keybit, jd_scratch, KEY_CNT))
 858                return false;
 859
 860        /*
 861         * Amiga joystick (amijoy) historically uses left/middle/right
 862         * button events.
 863         */
 864        if (dev->id.bustype == BUS_AMIGA)
 865                return false;
 866
 867        return true;
 868}
 869
 870static bool joydev_match(struct input_handler *handler, struct input_dev *dev)
 871{
 872        /* Disable blacklisted devices */
 873        if (joydev_dev_is_blacklisted(dev))
 874                return false;
 875
 876        /* Avoid absolute mice */
 877        if (joydev_dev_is_absolute_mouse(dev))
 878                return false;
 879
 880        return true;
 881}
 882
 883static int joydev_connect(struct input_handler *handler, struct input_dev *dev,
 884                          const struct input_device_id *id)
 885{
 886        struct joydev *joydev;
 887        int i, j, t, minor, dev_no;
 888        int error;
 889
 890        minor = input_get_new_minor(JOYDEV_MINOR_BASE, JOYDEV_MINORS, true);
 891        if (minor < 0) {
 892                error = minor;
 893                pr_err("failed to reserve new minor: %d\n", error);
 894                return error;
 895        }
 896
 897        joydev = kzalloc(sizeof(struct joydev), GFP_KERNEL);
 898        if (!joydev) {
 899                error = -ENOMEM;
 900                goto err_free_minor;
 901        }
 902
 903        INIT_LIST_HEAD(&joydev->client_list);
 904        spin_lock_init(&joydev->client_lock);
 905        mutex_init(&joydev->mutex);
 906        init_waitqueue_head(&joydev->wait);
 907        joydev->exist = true;
 908
 909        dev_no = minor;
 910        /* Normalize device number if it falls into legacy range */
 911        if (dev_no < JOYDEV_MINOR_BASE + JOYDEV_MINORS)
 912                dev_no -= JOYDEV_MINOR_BASE;
 913        dev_set_name(&joydev->dev, "js%d", dev_no);
 914
 915        joydev->handle.dev = input_get_device(dev);
 916        joydev->handle.name = dev_name(&joydev->dev);
 917        joydev->handle.handler = handler;
 918        joydev->handle.private = joydev;
 919
 920        for_each_set_bit(i, dev->absbit, ABS_CNT) {
 921                joydev->absmap[i] = joydev->nabs;
 922                joydev->abspam[joydev->nabs] = i;
 923                joydev->nabs++;
 924        }
 925
 926        for (i = BTN_JOYSTICK - BTN_MISC; i < KEY_MAX - BTN_MISC + 1; i++)
 927                if (test_bit(i + BTN_MISC, dev->keybit)) {
 928                        joydev->keymap[i] = joydev->nkey;
 929                        joydev->keypam[joydev->nkey] = i + BTN_MISC;
 930                        joydev->nkey++;
 931                }
 932
 933        for (i = 0; i < BTN_JOYSTICK - BTN_MISC; i++)
 934                if (test_bit(i + BTN_MISC, dev->keybit)) {
 935                        joydev->keymap[i] = joydev->nkey;
 936                        joydev->keypam[joydev->nkey] = i + BTN_MISC;
 937                        joydev->nkey++;
 938                }
 939
 940        for (i = 0; i < joydev->nabs; i++) {
 941                j = joydev->abspam[i];
 942                if (input_abs_get_max(dev, j) == input_abs_get_min(dev, j)) {
 943                        joydev->corr[i].type = JS_CORR_NONE;
 944                        continue;
 945                }
 946                joydev->corr[i].type = JS_CORR_BROKEN;
 947                joydev->corr[i].prec = input_abs_get_fuzz(dev, j);
 948
 949                t = (input_abs_get_max(dev, j) + input_abs_get_min(dev, j)) / 2;
 950                joydev->corr[i].coef[0] = t - input_abs_get_flat(dev, j);
 951                joydev->corr[i].coef[1] = t + input_abs_get_flat(dev, j);
 952
 953                t = (input_abs_get_max(dev, j) - input_abs_get_min(dev, j)) / 2
 954                        - 2 * input_abs_get_flat(dev, j);
 955                if (t) {
 956                        joydev->corr[i].coef[2] = (1 << 29) / t;
 957                        joydev->corr[i].coef[3] = (1 << 29) / t;
 958                }
 959        }
 960
 961        joydev->dev.devt = MKDEV(INPUT_MAJOR, minor);
 962        joydev->dev.class = &input_class;
 963        joydev->dev.parent = &dev->dev;
 964        joydev->dev.release = joydev_free;
 965        device_initialize(&joydev->dev);
 966
 967        error = input_register_handle(&joydev->handle);
 968        if (error)
 969                goto err_free_joydev;
 970
 971        cdev_init(&joydev->cdev, &joydev_fops);
 972
 973        error = cdev_device_add(&joydev->cdev, &joydev->dev);
 974        if (error)
 975                goto err_cleanup_joydev;
 976
 977        return 0;
 978
 979 err_cleanup_joydev:
 980        joydev_cleanup(joydev);
 981        input_unregister_handle(&joydev->handle);
 982 err_free_joydev:
 983        put_device(&joydev->dev);
 984 err_free_minor:
 985        input_free_minor(minor);
 986        return error;
 987}
 988
 989static void joydev_disconnect(struct input_handle *handle)
 990{
 991        struct joydev *joydev = handle->private;
 992
 993        cdev_device_del(&joydev->cdev, &joydev->dev);
 994        joydev_cleanup(joydev);
 995        input_free_minor(MINOR(joydev->dev.devt));
 996        input_unregister_handle(handle);
 997        put_device(&joydev->dev);
 998}
 999
1000static const struct input_device_id joydev_ids[] = {
1001        {
1002                .flags = INPUT_DEVICE_ID_MATCH_EVBIT |
1003                                INPUT_DEVICE_ID_MATCH_ABSBIT,
1004                .evbit = { BIT_MASK(EV_ABS) },
1005                .absbit = { BIT_MASK(ABS_X) },
1006        },
1007        {
1008                .flags = INPUT_DEVICE_ID_MATCH_EVBIT |
1009                                INPUT_DEVICE_ID_MATCH_ABSBIT,
1010                .evbit = { BIT_MASK(EV_ABS) },
1011                .absbit = { BIT_MASK(ABS_Z) },
1012        },
1013        {
1014                .flags = INPUT_DEVICE_ID_MATCH_EVBIT |
1015                                INPUT_DEVICE_ID_MATCH_ABSBIT,
1016                .evbit = { BIT_MASK(EV_ABS) },
1017                .absbit = { BIT_MASK(ABS_WHEEL) },
1018        },
1019        {
1020                .flags = INPUT_DEVICE_ID_MATCH_EVBIT |
1021                                INPUT_DEVICE_ID_MATCH_ABSBIT,
1022                .evbit = { BIT_MASK(EV_ABS) },
1023                .absbit = { BIT_MASK(ABS_THROTTLE) },
1024        },
1025        {
1026                .flags = INPUT_DEVICE_ID_MATCH_EVBIT |
1027                                INPUT_DEVICE_ID_MATCH_KEYBIT,
1028                .evbit = { BIT_MASK(EV_KEY) },
1029                .keybit = {[BIT_WORD(BTN_JOYSTICK)] = BIT_MASK(BTN_JOYSTICK) },
1030        },
1031        {
1032                .flags = INPUT_DEVICE_ID_MATCH_EVBIT |
1033                                INPUT_DEVICE_ID_MATCH_KEYBIT,
1034                .evbit = { BIT_MASK(EV_KEY) },
1035                .keybit = { [BIT_WORD(BTN_GAMEPAD)] = BIT_MASK(BTN_GAMEPAD) },
1036        },
1037        {
1038                .flags = INPUT_DEVICE_ID_MATCH_EVBIT |
1039                                INPUT_DEVICE_ID_MATCH_KEYBIT,
1040                .evbit = { BIT_MASK(EV_KEY) },
1041                .keybit = { [BIT_WORD(BTN_TRIGGER_HAPPY)] = BIT_MASK(BTN_TRIGGER_HAPPY) },
1042        },
1043        { }     /* Terminating entry */
1044};
1045
1046MODULE_DEVICE_TABLE(input, joydev_ids);
1047
1048static struct input_handler joydev_handler = {
1049        .event          = joydev_event,
1050        .match          = joydev_match,
1051        .connect        = joydev_connect,
1052        .disconnect     = joydev_disconnect,
1053        .legacy_minors  = true,
1054        .minor          = JOYDEV_MINOR_BASE,
1055        .name           = "joydev",
1056        .id_table       = joydev_ids,
1057};
1058
1059static int __init joydev_init(void)
1060{
1061        return input_register_handler(&joydev_handler);
1062}
1063
1064static void __exit joydev_exit(void)
1065{
1066        input_unregister_handler(&joydev_handler);
1067}
1068
1069module_init(joydev_init);
1070module_exit(joydev_exit);
1071