linux/drivers/input/mousedev.c
<<
>>
Prefs
   1/*
   2 * Input driver to ExplorerPS/2 device driver module.
   3 *
   4 * Copyright (c) 1999-2002 Vojtech Pavlik
   5 * Copyright (c) 2004      Dmitry Torokhov
   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 version 2 as published by
   9 * the Free Software Foundation.
  10 */
  11
  12#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  13
  14#define MOUSEDEV_MINOR_BASE     32
  15#define MOUSEDEV_MINORS         32
  16#define MOUSEDEV_MIX            31
  17
  18#include <linux/sched.h>
  19#include <linux/slab.h>
  20#include <linux/poll.h>
  21#include <linux/module.h>
  22#include <linux/init.h>
  23#include <linux/input.h>
  24#include <linux/random.h>
  25#include <linux/major.h>
  26#include <linux/device.h>
  27#include <linux/kernel.h>
  28#ifdef CONFIG_INPUT_MOUSEDEV_PSAUX
  29#include <linux/miscdevice.h>
  30#endif
  31
  32MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>");
  33MODULE_DESCRIPTION("Mouse (ExplorerPS/2) device interfaces");
  34MODULE_LICENSE("GPL");
  35
  36#ifndef CONFIG_INPUT_MOUSEDEV_SCREEN_X
  37#define CONFIG_INPUT_MOUSEDEV_SCREEN_X  1024
  38#endif
  39#ifndef CONFIG_INPUT_MOUSEDEV_SCREEN_Y
  40#define CONFIG_INPUT_MOUSEDEV_SCREEN_Y  768
  41#endif
  42
  43static int xres = CONFIG_INPUT_MOUSEDEV_SCREEN_X;
  44module_param(xres, uint, 0644);
  45MODULE_PARM_DESC(xres, "Horizontal screen resolution");
  46
  47static int yres = CONFIG_INPUT_MOUSEDEV_SCREEN_Y;
  48module_param(yres, uint, 0644);
  49MODULE_PARM_DESC(yres, "Vertical screen resolution");
  50
  51static unsigned tap_time = 200;
  52module_param(tap_time, uint, 0644);
  53MODULE_PARM_DESC(tap_time, "Tap time for touchpads in absolute mode (msecs)");
  54
  55struct mousedev_hw_data {
  56        int dx, dy, dz;
  57        int x, y;
  58        int abs_event;
  59        unsigned long buttons;
  60};
  61
  62struct mousedev {
  63        int open;
  64        int minor;
  65        struct input_handle handle;
  66        wait_queue_head_t wait;
  67        struct list_head client_list;
  68        spinlock_t client_lock; /* protects client_list */
  69        struct mutex mutex;
  70        struct device dev;
  71        bool exist;
  72
  73        struct list_head mixdev_node;
  74        int mixdev_open;
  75
  76        struct mousedev_hw_data packet;
  77        unsigned int pkt_count;
  78        int old_x[4], old_y[4];
  79        int frac_dx, frac_dy;
  80        unsigned long touch;
  81};
  82
  83enum mousedev_emul {
  84        MOUSEDEV_EMUL_PS2,
  85        MOUSEDEV_EMUL_IMPS,
  86        MOUSEDEV_EMUL_EXPS
  87};
  88
  89struct mousedev_motion {
  90        int dx, dy, dz;
  91        unsigned long buttons;
  92};
  93
  94#define PACKET_QUEUE_LEN        16
  95struct mousedev_client {
  96        struct fasync_struct *fasync;
  97        struct mousedev *mousedev;
  98        struct list_head node;
  99
 100        struct mousedev_motion packets[PACKET_QUEUE_LEN];
 101        unsigned int head, tail;
 102        spinlock_t packet_lock;
 103        int pos_x, pos_y;
 104
 105        signed char ps2[6];
 106        unsigned char ready, buffer, bufsiz;
 107        unsigned char imexseq, impsseq;
 108        enum mousedev_emul mode;
 109        unsigned long last_buttons;
 110};
 111
 112#define MOUSEDEV_SEQ_LEN        6
 113
 114static unsigned char mousedev_imps_seq[] = { 0xf3, 200, 0xf3, 100, 0xf3, 80 };
 115static unsigned char mousedev_imex_seq[] = { 0xf3, 200, 0xf3, 200, 0xf3, 80 };
 116
 117static struct input_handler mousedev_handler;
 118
 119static struct mousedev *mousedev_table[MOUSEDEV_MINORS];
 120static DEFINE_MUTEX(mousedev_table_mutex);
 121static struct mousedev *mousedev_mix;
 122static LIST_HEAD(mousedev_mix_list);
 123
 124static void mixdev_open_devices(void);
 125static void mixdev_close_devices(void);
 126
 127#define fx(i)  (mousedev->old_x[(mousedev->pkt_count - (i)) & 03])
 128#define fy(i)  (mousedev->old_y[(mousedev->pkt_count - (i)) & 03])
 129
 130static void mousedev_touchpad_event(struct input_dev *dev,
 131                                    struct mousedev *mousedev,
 132                                    unsigned int code, int value)
 133{
 134        int size, tmp;
 135        enum { FRACTION_DENOM = 128 };
 136
 137        switch (code) {
 138
 139        case ABS_X:
 140
 141                fx(0) = value;
 142                if (mousedev->touch && mousedev->pkt_count >= 2) {
 143                        size = input_abs_get_max(dev, ABS_X) -
 144                                        input_abs_get_min(dev, ABS_X);
 145                        if (size == 0)
 146                                size = 256 * 2;
 147
 148                        tmp = ((value - fx(2)) * 256 * FRACTION_DENOM) / size;
 149                        tmp += mousedev->frac_dx;
 150                        mousedev->packet.dx = tmp / FRACTION_DENOM;
 151                        mousedev->frac_dx =
 152                                tmp - mousedev->packet.dx * FRACTION_DENOM;
 153                }
 154                break;
 155
 156        case ABS_Y:
 157                fy(0) = value;
 158                if (mousedev->touch && mousedev->pkt_count >= 2) {
 159                        /* use X size for ABS_Y to keep the same scale */
 160                        size = input_abs_get_max(dev, ABS_X) -
 161                                        input_abs_get_min(dev, ABS_X);
 162                        if (size == 0)
 163                                size = 256 * 2;
 164
 165                        tmp = -((value - fy(2)) * 256 * FRACTION_DENOM) / size;
 166                        tmp += mousedev->frac_dy;
 167                        mousedev->packet.dy = tmp / FRACTION_DENOM;
 168                        mousedev->frac_dy = tmp -
 169                                mousedev->packet.dy * FRACTION_DENOM;
 170                }
 171                break;
 172        }
 173}
 174
 175static void mousedev_abs_event(struct input_dev *dev, struct mousedev *mousedev,
 176                                unsigned int code, int value)
 177{
 178        int min, max, size;
 179
 180        switch (code) {
 181
 182        case ABS_X:
 183                min = input_abs_get_min(dev, ABS_X);
 184                max = input_abs_get_max(dev, ABS_X);
 185
 186                size = max - min;
 187                if (size == 0)
 188                        size = xres ? : 1;
 189
 190                clamp(value, min, max);
 191
 192                mousedev->packet.x = ((value - min) * xres) / size;
 193                mousedev->packet.abs_event = 1;
 194                break;
 195
 196        case ABS_Y:
 197                min = input_abs_get_min(dev, ABS_Y);
 198                max = input_abs_get_max(dev, ABS_Y);
 199
 200                size = max - min;
 201                if (size == 0)
 202                        size = yres ? : 1;
 203
 204                clamp(value, min, max);
 205
 206                mousedev->packet.y = yres - ((value - min) * yres) / size;
 207                mousedev->packet.abs_event = 1;
 208                break;
 209        }
 210}
 211
 212static void mousedev_rel_event(struct mousedev *mousedev,
 213                                unsigned int code, int value)
 214{
 215        switch (code) {
 216        case REL_X:
 217                mousedev->packet.dx += value;
 218                break;
 219
 220        case REL_Y:
 221                mousedev->packet.dy -= value;
 222                break;
 223
 224        case REL_WHEEL:
 225                mousedev->packet.dz -= value;
 226                break;
 227        }
 228}
 229
 230static void mousedev_key_event(struct mousedev *mousedev,
 231                                unsigned int code, int value)
 232{
 233        int index;
 234
 235        switch (code) {
 236
 237        case BTN_TOUCH:
 238        case BTN_0:
 239        case BTN_LEFT:          index = 0; break;
 240
 241        case BTN_STYLUS:
 242        case BTN_1:
 243        case BTN_RIGHT:         index = 1; break;
 244
 245        case BTN_2:
 246        case BTN_FORWARD:
 247        case BTN_STYLUS2:
 248        case BTN_MIDDLE:        index = 2; break;
 249
 250        case BTN_3:
 251        case BTN_BACK:
 252        case BTN_SIDE:          index = 3; break;
 253
 254        case BTN_4:
 255        case BTN_EXTRA:         index = 4; break;
 256
 257        default:                return;
 258        }
 259
 260        if (value) {
 261                set_bit(index, &mousedev->packet.buttons);
 262                set_bit(index, &mousedev_mix->packet.buttons);
 263        } else {
 264                clear_bit(index, &mousedev->packet.buttons);
 265                clear_bit(index, &mousedev_mix->packet.buttons);
 266        }
 267}
 268
 269static void mousedev_notify_readers(struct mousedev *mousedev,
 270                                    struct mousedev_hw_data *packet)
 271{
 272        struct mousedev_client *client;
 273        struct mousedev_motion *p;
 274        unsigned int new_head;
 275        int wake_readers = 0;
 276
 277        rcu_read_lock();
 278        list_for_each_entry_rcu(client, &mousedev->client_list, node) {
 279
 280                /* Just acquire the lock, interrupts already disabled */
 281                spin_lock(&client->packet_lock);
 282
 283                p = &client->packets[client->head];
 284                if (client->ready && p->buttons != mousedev->packet.buttons) {
 285                        new_head = (client->head + 1) % PACKET_QUEUE_LEN;
 286                        if (new_head != client->tail) {
 287                                p = &client->packets[client->head = new_head];
 288                                memset(p, 0, sizeof(struct mousedev_motion));
 289                        }
 290                }
 291
 292                if (packet->abs_event) {
 293                        p->dx += packet->x - client->pos_x;
 294                        p->dy += packet->y - client->pos_y;
 295                        client->pos_x = packet->x;
 296                        client->pos_y = packet->y;
 297                }
 298
 299                client->pos_x += packet->dx;
 300                client->pos_x = client->pos_x < 0 ?
 301                        0 : (client->pos_x >= xres ? xres : client->pos_x);
 302                client->pos_y += packet->dy;
 303                client->pos_y = client->pos_y < 0 ?
 304                        0 : (client->pos_y >= yres ? yres : client->pos_y);
 305
 306                p->dx += packet->dx;
 307                p->dy += packet->dy;
 308                p->dz += packet->dz;
 309                p->buttons = mousedev->packet.buttons;
 310
 311                if (p->dx || p->dy || p->dz ||
 312                    p->buttons != client->last_buttons)
 313                        client->ready = 1;
 314
 315                spin_unlock(&client->packet_lock);
 316
 317                if (client->ready) {
 318                        kill_fasync(&client->fasync, SIGIO, POLL_IN);
 319                        wake_readers = 1;
 320                }
 321        }
 322        rcu_read_unlock();
 323
 324        if (wake_readers)
 325                wake_up_interruptible(&mousedev->wait);
 326}
 327
 328static void mousedev_touchpad_touch(struct mousedev *mousedev, int value)
 329{
 330        if (!value) {
 331                if (mousedev->touch &&
 332                    time_before(jiffies,
 333                                mousedev->touch + msecs_to_jiffies(tap_time))) {
 334                        /*
 335                         * Toggle left button to emulate tap.
 336                         * We rely on the fact that mousedev_mix always has 0
 337                         * motion packet so we won't mess current position.
 338                         */
 339                        set_bit(0, &mousedev->packet.buttons);
 340                        set_bit(0, &mousedev_mix->packet.buttons);
 341                        mousedev_notify_readers(mousedev, &mousedev_mix->packet);
 342                        mousedev_notify_readers(mousedev_mix,
 343                                                &mousedev_mix->packet);
 344                        clear_bit(0, &mousedev->packet.buttons);
 345                        clear_bit(0, &mousedev_mix->packet.buttons);
 346                }
 347                mousedev->touch = mousedev->pkt_count = 0;
 348                mousedev->frac_dx = 0;
 349                mousedev->frac_dy = 0;
 350
 351        } else if (!mousedev->touch)
 352                mousedev->touch = jiffies;
 353}
 354
 355static void mousedev_event(struct input_handle *handle,
 356                           unsigned int type, unsigned int code, int value)
 357{
 358        struct mousedev *mousedev = handle->private;
 359
 360        switch (type) {
 361
 362        case EV_ABS:
 363                /* Ignore joysticks */
 364                if (test_bit(BTN_TRIGGER, handle->dev->keybit))
 365                        return;
 366
 367                if (test_bit(BTN_TOOL_FINGER, handle->dev->keybit))
 368                        mousedev_touchpad_event(handle->dev,
 369                                                mousedev, code, value);
 370                else
 371                        mousedev_abs_event(handle->dev, mousedev, code, value);
 372
 373                break;
 374
 375        case EV_REL:
 376                mousedev_rel_event(mousedev, code, value);
 377                break;
 378
 379        case EV_KEY:
 380                if (value != 2) {
 381                        if (code == BTN_TOUCH &&
 382                            test_bit(BTN_TOOL_FINGER, handle->dev->keybit))
 383                                mousedev_touchpad_touch(mousedev, value);
 384                        else
 385                                mousedev_key_event(mousedev, code, value);
 386                }
 387                break;
 388
 389        case EV_SYN:
 390                if (code == SYN_REPORT) {
 391                        if (mousedev->touch) {
 392                                mousedev->pkt_count++;
 393                                /*
 394                                 * Input system eats duplicate events,
 395                                 * but we need all of them to do correct
 396                                 * averaging so apply present one forward
 397                                 */
 398                                fx(0) = fx(1);
 399                                fy(0) = fy(1);
 400                        }
 401
 402                        mousedev_notify_readers(mousedev, &mousedev->packet);
 403                        mousedev_notify_readers(mousedev_mix, &mousedev->packet);
 404
 405                        mousedev->packet.dx = mousedev->packet.dy =
 406                                mousedev->packet.dz = 0;
 407                        mousedev->packet.abs_event = 0;
 408                }
 409                break;
 410        }
 411}
 412
 413static int mousedev_fasync(int fd, struct file *file, int on)
 414{
 415        struct mousedev_client *client = file->private_data;
 416
 417        return fasync_helper(fd, file, on, &client->fasync);
 418}
 419
 420static void mousedev_free(struct device *dev)
 421{
 422        struct mousedev *mousedev = container_of(dev, struct mousedev, dev);
 423
 424        input_put_device(mousedev->handle.dev);
 425        kfree(mousedev);
 426}
 427
 428static int mousedev_open_device(struct mousedev *mousedev)
 429{
 430        int retval;
 431
 432        retval = mutex_lock_interruptible(&mousedev->mutex);
 433        if (retval)
 434                return retval;
 435
 436        if (mousedev->minor == MOUSEDEV_MIX)
 437                mixdev_open_devices();
 438        else if (!mousedev->exist)
 439                retval = -ENODEV;
 440        else if (!mousedev->open++) {
 441                retval = input_open_device(&mousedev->handle);
 442                if (retval)
 443                        mousedev->open--;
 444        }
 445
 446        mutex_unlock(&mousedev->mutex);
 447        return retval;
 448}
 449
 450static void mousedev_close_device(struct mousedev *mousedev)
 451{
 452        mutex_lock(&mousedev->mutex);
 453
 454        if (mousedev->minor == MOUSEDEV_MIX)
 455                mixdev_close_devices();
 456        else if (mousedev->exist && !--mousedev->open)
 457                input_close_device(&mousedev->handle);
 458
 459        mutex_unlock(&mousedev->mutex);
 460}
 461
 462/*
 463 * Open all available devices so they can all be multiplexed in one.
 464 * stream. Note that this function is called with mousedev_mix->mutex
 465 * held.
 466 */
 467static void mixdev_open_devices(void)
 468{
 469        struct mousedev *mousedev;
 470
 471        if (mousedev_mix->open++)
 472                return;
 473
 474        list_for_each_entry(mousedev, &mousedev_mix_list, mixdev_node) {
 475                if (!mousedev->mixdev_open) {
 476                        if (mousedev_open_device(mousedev))
 477                                continue;
 478
 479                        mousedev->mixdev_open = 1;
 480                }
 481        }
 482}
 483
 484/*
 485 * Close all devices that were opened as part of multiplexed
 486 * device. Note that this function is called with mousedev_mix->mutex
 487 * held.
 488 */
 489static void mixdev_close_devices(void)
 490{
 491        struct mousedev *mousedev;
 492
 493        if (--mousedev_mix->open)
 494                return;
 495
 496        list_for_each_entry(mousedev, &mousedev_mix_list, mixdev_node) {
 497                if (mousedev->mixdev_open) {
 498                        mousedev->mixdev_open = 0;
 499                        mousedev_close_device(mousedev);
 500                }
 501        }
 502}
 503
 504
 505static void mousedev_attach_client(struct mousedev *mousedev,
 506                                   struct mousedev_client *client)
 507{
 508        spin_lock(&mousedev->client_lock);
 509        list_add_tail_rcu(&client->node, &mousedev->client_list);
 510        spin_unlock(&mousedev->client_lock);
 511        synchronize_rcu();
 512}
 513
 514static void mousedev_detach_client(struct mousedev *mousedev,
 515                                   struct mousedev_client *client)
 516{
 517        spin_lock(&mousedev->client_lock);
 518        list_del_rcu(&client->node);
 519        spin_unlock(&mousedev->client_lock);
 520        synchronize_rcu();
 521}
 522
 523static int mousedev_release(struct inode *inode, struct file *file)
 524{
 525        struct mousedev_client *client = file->private_data;
 526        struct mousedev *mousedev = client->mousedev;
 527
 528        mousedev_detach_client(mousedev, client);
 529        kfree(client);
 530
 531        mousedev_close_device(mousedev);
 532        put_device(&mousedev->dev);
 533
 534        return 0;
 535}
 536
 537static int mousedev_open(struct inode *inode, struct file *file)
 538{
 539        struct mousedev_client *client;
 540        struct mousedev *mousedev;
 541        int error;
 542        int i;
 543
 544#ifdef CONFIG_INPUT_MOUSEDEV_PSAUX
 545        if (imajor(inode) == MISC_MAJOR)
 546                i = MOUSEDEV_MIX;
 547        else
 548#endif
 549                i = iminor(inode) - MOUSEDEV_MINOR_BASE;
 550
 551        if (i >= MOUSEDEV_MINORS)
 552                return -ENODEV;
 553
 554        error = mutex_lock_interruptible(&mousedev_table_mutex);
 555        if (error) {
 556                return error;
 557        }
 558        mousedev = mousedev_table[i];
 559        if (mousedev)
 560                get_device(&mousedev->dev);
 561        mutex_unlock(&mousedev_table_mutex);
 562
 563        if (!mousedev) {
 564                return -ENODEV;
 565        }
 566
 567        client = kzalloc(sizeof(struct mousedev_client), GFP_KERNEL);
 568        if (!client) {
 569                error = -ENOMEM;
 570                goto err_put_mousedev;
 571        }
 572
 573        spin_lock_init(&client->packet_lock);
 574        client->pos_x = xres / 2;
 575        client->pos_y = yres / 2;
 576        client->mousedev = mousedev;
 577        mousedev_attach_client(mousedev, client);
 578
 579        error = mousedev_open_device(mousedev);
 580        if (error)
 581                goto err_free_client;
 582
 583        file->private_data = client;
 584        return 0;
 585
 586 err_free_client:
 587        mousedev_detach_client(mousedev, client);
 588        kfree(client);
 589 err_put_mousedev:
 590        put_device(&mousedev->dev);
 591        return error;
 592}
 593
 594static inline int mousedev_limit_delta(int delta, int limit)
 595{
 596        return delta > limit ? limit : (delta < -limit ? -limit : delta);
 597}
 598
 599static void mousedev_packet(struct mousedev_client *client,
 600                            signed char *ps2_data)
 601{
 602        struct mousedev_motion *p = &client->packets[client->tail];
 603
 604        ps2_data[0] = 0x08 |
 605                ((p->dx < 0) << 4) | ((p->dy < 0) << 5) | (p->buttons & 0x07);
 606        ps2_data[1] = mousedev_limit_delta(p->dx, 127);
 607        ps2_data[2] = mousedev_limit_delta(p->dy, 127);
 608        p->dx -= ps2_data[1];
 609        p->dy -= ps2_data[2];
 610
 611        switch (client->mode) {
 612        case MOUSEDEV_EMUL_EXPS:
 613                ps2_data[3] = mousedev_limit_delta(p->dz, 7);
 614                p->dz -= ps2_data[3];
 615                ps2_data[3] = (ps2_data[3] & 0x0f) | ((p->buttons & 0x18) << 1);
 616                client->bufsiz = 4;
 617                break;
 618
 619        case MOUSEDEV_EMUL_IMPS:
 620                ps2_data[0] |=
 621                        ((p->buttons & 0x10) >> 3) | ((p->buttons & 0x08) >> 1);
 622                ps2_data[3] = mousedev_limit_delta(p->dz, 127);
 623                p->dz -= ps2_data[3];
 624                client->bufsiz = 4;
 625                break;
 626
 627        case MOUSEDEV_EMUL_PS2:
 628        default:
 629                ps2_data[0] |=
 630                        ((p->buttons & 0x10) >> 3) | ((p->buttons & 0x08) >> 1);
 631                p->dz = 0;
 632                client->bufsiz = 3;
 633                break;
 634        }
 635
 636        if (!p->dx && !p->dy && !p->dz) {
 637                if (client->tail == client->head) {
 638                        client->ready = 0;
 639                        client->last_buttons = p->buttons;
 640                } else
 641                        client->tail = (client->tail + 1) % PACKET_QUEUE_LEN;
 642        }
 643}
 644
 645static void mousedev_generate_response(struct mousedev_client *client,
 646                                        int command)
 647{
 648        client->ps2[0] = 0xfa; /* ACK */
 649
 650        switch (command) {
 651
 652        case 0xeb: /* Poll */
 653                mousedev_packet(client, &client->ps2[1]);
 654                client->bufsiz++; /* account for leading ACK */
 655                break;
 656
 657        case 0xf2: /* Get ID */
 658                switch (client->mode) {
 659                case MOUSEDEV_EMUL_PS2:
 660                        client->ps2[1] = 0;
 661                        break;
 662                case MOUSEDEV_EMUL_IMPS:
 663                        client->ps2[1] = 3;
 664                        break;
 665                case MOUSEDEV_EMUL_EXPS:
 666                        client->ps2[1] = 4;
 667                        break;
 668                }
 669                client->bufsiz = 2;
 670                break;
 671
 672        case 0xe9: /* Get info */
 673                client->ps2[1] = 0x60; client->ps2[2] = 3; client->ps2[3] = 200;
 674                client->bufsiz = 4;
 675                break;
 676
 677        case 0xff: /* Reset */
 678                client->impsseq = client->imexseq = 0;
 679                client->mode = MOUSEDEV_EMUL_PS2;
 680                client->ps2[1] = 0xaa; client->ps2[2] = 0x00;
 681                client->bufsiz = 3;
 682                break;
 683
 684        default:
 685                client->bufsiz = 1;
 686                break;
 687        }
 688        client->buffer = client->bufsiz;
 689}
 690
 691static ssize_t mousedev_write(struct file *file, const char __user *buffer,
 692                                size_t count, loff_t *ppos)
 693{
 694        struct mousedev_client *client = file->private_data;
 695        unsigned char c;
 696        unsigned int i;
 697
 698        for (i = 0; i < count; i++) {
 699
 700                if (get_user(c, buffer + i))
 701                        return -EFAULT;
 702
 703                spin_lock_irq(&client->packet_lock);
 704
 705                if (c == mousedev_imex_seq[client->imexseq]) {
 706                        if (++client->imexseq == MOUSEDEV_SEQ_LEN) {
 707                                client->imexseq = 0;
 708                                client->mode = MOUSEDEV_EMUL_EXPS;
 709                        }
 710                } else
 711                        client->imexseq = 0;
 712
 713                if (c == mousedev_imps_seq[client->impsseq]) {
 714                        if (++client->impsseq == MOUSEDEV_SEQ_LEN) {
 715                                client->impsseq = 0;
 716                                client->mode = MOUSEDEV_EMUL_IMPS;
 717                        }
 718                } else
 719                        client->impsseq = 0;
 720
 721                mousedev_generate_response(client, c);
 722
 723                spin_unlock_irq(&client->packet_lock);
 724        }
 725
 726        kill_fasync(&client->fasync, SIGIO, POLL_IN);
 727        wake_up_interruptible(&client->mousedev->wait);
 728
 729        return count;
 730}
 731
 732static ssize_t mousedev_read(struct file *file, char __user *buffer,
 733                             size_t count, loff_t *ppos)
 734{
 735        struct mousedev_client *client = file->private_data;
 736        struct mousedev *mousedev = client->mousedev;
 737        signed char data[sizeof(client->ps2)];
 738        int retval = 0;
 739
 740        if (!client->ready && !client->buffer && mousedev->exist &&
 741            (file->f_flags & O_NONBLOCK))
 742                return -EAGAIN;
 743
 744        retval = wait_event_interruptible(mousedev->wait,
 745                        !mousedev->exist || client->ready || client->buffer);
 746        if (retval)
 747                return retval;
 748
 749        if (!mousedev->exist)
 750                return -ENODEV;
 751
 752        spin_lock_irq(&client->packet_lock);
 753
 754        if (!client->buffer && client->ready) {
 755                mousedev_packet(client, client->ps2);
 756                client->buffer = client->bufsiz;
 757        }
 758
 759        if (count > client->buffer)
 760                count = client->buffer;
 761
 762        memcpy(data, client->ps2 + client->bufsiz - client->buffer, count);
 763        client->buffer -= count;
 764
 765        spin_unlock_irq(&client->packet_lock);
 766
 767        if (copy_to_user(buffer, data, count))
 768                return -EFAULT;
 769
 770        return count;
 771}
 772
 773/* No kernel lock - fine */
 774static unsigned int mousedev_poll(struct file *file, poll_table *wait)
 775{
 776        struct mousedev_client *client = file->private_data;
 777        struct mousedev *mousedev = client->mousedev;
 778        unsigned int mask;
 779
 780        poll_wait(file, &mousedev->wait, wait);
 781
 782        mask = mousedev->exist ? POLLOUT | POLLWRNORM : POLLHUP | POLLERR;
 783        if (client->ready || client->buffer)
 784                mask |= POLLIN | POLLRDNORM;
 785
 786        return mask;
 787}
 788
 789static const struct file_operations mousedev_fops = {
 790        .owner =        THIS_MODULE,
 791        .read =         mousedev_read,
 792        .write =        mousedev_write,
 793        .poll =         mousedev_poll,
 794        .open =         mousedev_open,
 795        .release =      mousedev_release,
 796        .fasync =       mousedev_fasync,
 797        .llseek = noop_llseek,
 798};
 799
 800static int mousedev_install_chrdev(struct mousedev *mousedev)
 801{
 802        mousedev_table[mousedev->minor] = mousedev;
 803        return 0;
 804}
 805
 806static void mousedev_remove_chrdev(struct mousedev *mousedev)
 807{
 808        mutex_lock(&mousedev_table_mutex);
 809        mousedev_table[mousedev->minor] = NULL;
 810        mutex_unlock(&mousedev_table_mutex);
 811}
 812
 813/*
 814 * Mark device non-existent. This disables writes, ioctls and
 815 * prevents new users from opening the device. Already posted
 816 * blocking reads will stay, however new ones will fail.
 817 */
 818static void mousedev_mark_dead(struct mousedev *mousedev)
 819{
 820        mutex_lock(&mousedev->mutex);
 821        mousedev->exist = false;
 822        mutex_unlock(&mousedev->mutex);
 823}
 824
 825/*
 826 * Wake up users waiting for IO so they can disconnect from
 827 * dead device.
 828 */
 829static void mousedev_hangup(struct mousedev *mousedev)
 830{
 831        struct mousedev_client *client;
 832
 833        spin_lock(&mousedev->client_lock);
 834        list_for_each_entry(client, &mousedev->client_list, node)
 835                kill_fasync(&client->fasync, SIGIO, POLL_HUP);
 836        spin_unlock(&mousedev->client_lock);
 837
 838        wake_up_interruptible(&mousedev->wait);
 839}
 840
 841static void mousedev_cleanup(struct mousedev *mousedev)
 842{
 843        struct input_handle *handle = &mousedev->handle;
 844
 845        mousedev_mark_dead(mousedev);
 846        mousedev_hangup(mousedev);
 847        mousedev_remove_chrdev(mousedev);
 848
 849        /* mousedev is marked dead so no one else accesses mousedev->open */
 850        if (mousedev->open)
 851                input_close_device(handle);
 852}
 853
 854static struct mousedev *mousedev_create(struct input_dev *dev,
 855                                        struct input_handler *handler,
 856                                        int minor)
 857{
 858        struct mousedev *mousedev;
 859        int error;
 860
 861        mousedev = kzalloc(sizeof(struct mousedev), GFP_KERNEL);
 862        if (!mousedev) {
 863                error = -ENOMEM;
 864                goto err_out;
 865        }
 866
 867        INIT_LIST_HEAD(&mousedev->client_list);
 868        INIT_LIST_HEAD(&mousedev->mixdev_node);
 869        spin_lock_init(&mousedev->client_lock);
 870        mutex_init(&mousedev->mutex);
 871        lockdep_set_subclass(&mousedev->mutex,
 872                             minor == MOUSEDEV_MIX ? SINGLE_DEPTH_NESTING : 0);
 873        init_waitqueue_head(&mousedev->wait);
 874
 875        if (minor == MOUSEDEV_MIX)
 876                dev_set_name(&mousedev->dev, "mice");
 877        else
 878                dev_set_name(&mousedev->dev, "mouse%d", minor);
 879
 880        mousedev->minor = minor;
 881        mousedev->exist = true;
 882        mousedev->handle.dev = input_get_device(dev);
 883        mousedev->handle.name = dev_name(&mousedev->dev);
 884        mousedev->handle.handler = handler;
 885        mousedev->handle.private = mousedev;
 886
 887        mousedev->dev.class = &input_class;
 888        if (dev)
 889                mousedev->dev.parent = &dev->dev;
 890        mousedev->dev.devt = MKDEV(INPUT_MAJOR, MOUSEDEV_MINOR_BASE + minor);
 891        mousedev->dev.release = mousedev_free;
 892        device_initialize(&mousedev->dev);
 893
 894        if (minor != MOUSEDEV_MIX) {
 895                error = input_register_handle(&mousedev->handle);
 896                if (error)
 897                        goto err_free_mousedev;
 898        }
 899
 900        error = mousedev_install_chrdev(mousedev);
 901        if (error)
 902                goto err_unregister_handle;
 903
 904        error = device_add(&mousedev->dev);
 905        if (error)
 906                goto err_cleanup_mousedev;
 907
 908        return mousedev;
 909
 910 err_cleanup_mousedev:
 911        mousedev_cleanup(mousedev);
 912 err_unregister_handle:
 913        if (minor != MOUSEDEV_MIX)
 914                input_unregister_handle(&mousedev->handle);
 915 err_free_mousedev:
 916        put_device(&mousedev->dev);
 917 err_out:
 918        return ERR_PTR(error);
 919}
 920
 921static void mousedev_destroy(struct mousedev *mousedev)
 922{
 923        device_del(&mousedev->dev);
 924        mousedev_cleanup(mousedev);
 925        if (mousedev->minor != MOUSEDEV_MIX)
 926                input_unregister_handle(&mousedev->handle);
 927        put_device(&mousedev->dev);
 928}
 929
 930static int mixdev_add_device(struct mousedev *mousedev)
 931{
 932        int retval;
 933
 934        retval = mutex_lock_interruptible(&mousedev_mix->mutex);
 935        if (retval)
 936                return retval;
 937
 938        if (mousedev_mix->open) {
 939                retval = mousedev_open_device(mousedev);
 940                if (retval)
 941                        goto out;
 942
 943                mousedev->mixdev_open = 1;
 944        }
 945
 946        get_device(&mousedev->dev);
 947        list_add_tail(&mousedev->mixdev_node, &mousedev_mix_list);
 948
 949 out:
 950        mutex_unlock(&mousedev_mix->mutex);
 951        return retval;
 952}
 953
 954static void mixdev_remove_device(struct mousedev *mousedev)
 955{
 956        mutex_lock(&mousedev_mix->mutex);
 957
 958        if (mousedev->mixdev_open) {
 959                mousedev->mixdev_open = 0;
 960                mousedev_close_device(mousedev);
 961        }
 962
 963        list_del_init(&mousedev->mixdev_node);
 964        mutex_unlock(&mousedev_mix->mutex);
 965
 966        put_device(&mousedev->dev);
 967}
 968
 969static int mousedev_connect(struct input_handler *handler,
 970                            struct input_dev *dev,
 971                            const struct input_device_id *id)
 972{
 973        struct mousedev *mousedev;
 974        int minor;
 975        int error;
 976
 977        for (minor = 0; minor < MOUSEDEV_MINORS; minor++)
 978                if (!mousedev_table[minor])
 979                        break;
 980
 981        if (minor == MOUSEDEV_MINORS) {
 982                pr_err("no more free mousedev devices\n");
 983                return -ENFILE;
 984        }
 985
 986        mousedev = mousedev_create(dev, handler, minor);
 987        if (IS_ERR(mousedev))
 988                return PTR_ERR(mousedev);
 989
 990        error = mixdev_add_device(mousedev);
 991        if (error) {
 992                mousedev_destroy(mousedev);
 993                return error;
 994        }
 995
 996        return 0;
 997}
 998
 999static void mousedev_disconnect(struct input_handle *handle)
1000{
1001        struct mousedev *mousedev = handle->private;
1002
1003        mixdev_remove_device(mousedev);
1004        mousedev_destroy(mousedev);
1005}
1006
1007static const struct input_device_id mousedev_ids[] = {
1008        {
1009                .flags = INPUT_DEVICE_ID_MATCH_EVBIT |
1010                                INPUT_DEVICE_ID_MATCH_KEYBIT |
1011                                INPUT_DEVICE_ID_MATCH_RELBIT,
1012                .evbit = { BIT_MASK(EV_KEY) | BIT_MASK(EV_REL) },
1013                .keybit = { [BIT_WORD(BTN_LEFT)] = BIT_MASK(BTN_LEFT) },
1014                .relbit = { BIT_MASK(REL_X) | BIT_MASK(REL_Y) },
1015        },      /* A mouse like device, at least one button,
1016                   two relative axes */
1017        {
1018                .flags = INPUT_DEVICE_ID_MATCH_EVBIT |
1019                                INPUT_DEVICE_ID_MATCH_RELBIT,
1020                .evbit = { BIT_MASK(EV_KEY) | BIT_MASK(EV_REL) },
1021                .relbit = { BIT_MASK(REL_WHEEL) },
1022        },      /* A separate scrollwheel */
1023        {
1024                .flags = INPUT_DEVICE_ID_MATCH_EVBIT |
1025                                INPUT_DEVICE_ID_MATCH_KEYBIT |
1026                                INPUT_DEVICE_ID_MATCH_ABSBIT,
1027                .evbit = { BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS) },
1028                .keybit = { [BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH) },
1029                .absbit = { BIT_MASK(ABS_X) | BIT_MASK(ABS_Y) },
1030        },      /* A tablet like device, at least touch detection,
1031                   two absolute axes */
1032        {
1033                .flags = INPUT_DEVICE_ID_MATCH_EVBIT |
1034                                INPUT_DEVICE_ID_MATCH_KEYBIT |
1035                                INPUT_DEVICE_ID_MATCH_ABSBIT,
1036                .evbit = { BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS) },
1037                .keybit = { [BIT_WORD(BTN_TOOL_FINGER)] =
1038                                BIT_MASK(BTN_TOOL_FINGER) },
1039                .absbit = { BIT_MASK(ABS_X) | BIT_MASK(ABS_Y) |
1040                                BIT_MASK(ABS_PRESSURE) |
1041                                BIT_MASK(ABS_TOOL_WIDTH) },
1042        },      /* A touchpad */
1043        {
1044                .flags = INPUT_DEVICE_ID_MATCH_EVBIT |
1045                        INPUT_DEVICE_ID_MATCH_KEYBIT |
1046                        INPUT_DEVICE_ID_MATCH_ABSBIT,
1047                .evbit = { BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS) },
1048                .keybit = { [BIT_WORD(BTN_LEFT)] = BIT_MASK(BTN_LEFT) },
1049                .absbit = { BIT_MASK(ABS_X) | BIT_MASK(ABS_Y) },
1050        },      /* Mouse-like device with absolute X and Y but ordinary
1051                   clicks, like hp ILO2 High Performance mouse */
1052
1053        { },    /* Terminating entry */
1054};
1055
1056MODULE_DEVICE_TABLE(input, mousedev_ids);
1057
1058static struct input_handler mousedev_handler = {
1059        .event =        mousedev_event,
1060        .connect =      mousedev_connect,
1061        .disconnect =   mousedev_disconnect,
1062        .fops =         &mousedev_fops,
1063        .minor =        MOUSEDEV_MINOR_BASE,
1064        .name =         "mousedev",
1065        .id_table =     mousedev_ids,
1066};
1067
1068#ifdef CONFIG_INPUT_MOUSEDEV_PSAUX
1069static struct miscdevice psaux_mouse = {
1070        PSMOUSE_MINOR, "psaux", &mousedev_fops
1071};
1072static int psaux_registered;
1073#endif
1074
1075static int __init mousedev_init(void)
1076{
1077        int error;
1078
1079        mousedev_mix = mousedev_create(NULL, &mousedev_handler, MOUSEDEV_MIX);
1080        if (IS_ERR(mousedev_mix))
1081                return PTR_ERR(mousedev_mix);
1082
1083        error = input_register_handler(&mousedev_handler);
1084        if (error) {
1085                mousedev_destroy(mousedev_mix);
1086                return error;
1087        }
1088
1089#ifdef CONFIG_INPUT_MOUSEDEV_PSAUX
1090        error = misc_register(&psaux_mouse);
1091        if (error)
1092                pr_warning("could not register psaux device, error: %d\n",
1093                           error);
1094        else
1095                psaux_registered = 1;
1096#endif
1097
1098        pr_info("PS/2 mouse device common for all mice\n");
1099
1100        return 0;
1101}
1102
1103static void __exit mousedev_exit(void)
1104{
1105#ifdef CONFIG_INPUT_MOUSEDEV_PSAUX
1106        if (psaux_registered)
1107                misc_deregister(&psaux_mouse);
1108#endif
1109        input_unregister_handler(&mousedev_handler);
1110        mousedev_destroy(mousedev_mix);
1111}
1112
1113module_init(mousedev_init);
1114module_exit(mousedev_exit);
1115