Linux Audio

Check our new training course

Loading...
v3.1
   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		value = 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		value = 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}
 512
 513static void mousedev_detach_client(struct mousedev *mousedev,
 514				   struct mousedev_client *client)
 515{
 516	spin_lock(&mousedev->client_lock);
 517	list_del_rcu(&client->node);
 518	spin_unlock(&mousedev->client_lock);
 519	synchronize_rcu();
 520}
 521
 522static int mousedev_release(struct inode *inode, struct file *file)
 523{
 524	struct mousedev_client *client = file->private_data;
 525	struct mousedev *mousedev = client->mousedev;
 526
 527	mousedev_detach_client(mousedev, client);
 528	kfree(client);
 529
 530	mousedev_close_device(mousedev);
 531	put_device(&mousedev->dev);
 532
 533	return 0;
 534}
 535
 536static int mousedev_open(struct inode *inode, struct file *file)
 537{
 538	struct mousedev_client *client;
 539	struct mousedev *mousedev;
 540	int error;
 541	int i;
 542
 543#ifdef CONFIG_INPUT_MOUSEDEV_PSAUX
 544	if (imajor(inode) == MISC_MAJOR)
 545		i = MOUSEDEV_MIX;
 546	else
 547#endif
 548		i = iminor(inode) - MOUSEDEV_MINOR_BASE;
 549
 550	if (i >= MOUSEDEV_MINORS)
 551		return -ENODEV;
 552
 553	error = mutex_lock_interruptible(&mousedev_table_mutex);
 554	if (error) {
 555		return error;
 556	}
 557	mousedev = mousedev_table[i];
 558	if (mousedev)
 559		get_device(&mousedev->dev);
 560	mutex_unlock(&mousedev_table_mutex);
 561
 562	if (!mousedev) {
 563		return -ENODEV;
 564	}
 565
 566	client = kzalloc(sizeof(struct mousedev_client), GFP_KERNEL);
 567	if (!client) {
 568		error = -ENOMEM;
 569		goto err_put_mousedev;
 570	}
 571
 572	spin_lock_init(&client->packet_lock);
 573	client->pos_x = xres / 2;
 574	client->pos_y = yres / 2;
 575	client->mousedev = mousedev;
 576	mousedev_attach_client(mousedev, client);
 577
 578	error = mousedev_open_device(mousedev);
 579	if (error)
 580		goto err_free_client;
 581
 582	file->private_data = client;
 583	return 0;
 584
 585 err_free_client:
 586	mousedev_detach_client(mousedev, client);
 587	kfree(client);
 588 err_put_mousedev:
 589	put_device(&mousedev->dev);
 590	return error;
 591}
 592
 593static inline int mousedev_limit_delta(int delta, int limit)
 594{
 595	return delta > limit ? limit : (delta < -limit ? -limit : delta);
 596}
 597
 598static void mousedev_packet(struct mousedev_client *client,
 599			    signed char *ps2_data)
 600{
 601	struct mousedev_motion *p = &client->packets[client->tail];
 602
 603	ps2_data[0] = 0x08 |
 604		((p->dx < 0) << 4) | ((p->dy < 0) << 5) | (p->buttons & 0x07);
 605	ps2_data[1] = mousedev_limit_delta(p->dx, 127);
 606	ps2_data[2] = mousedev_limit_delta(p->dy, 127);
 607	p->dx -= ps2_data[1];
 608	p->dy -= ps2_data[2];
 609
 610	switch (client->mode) {
 611	case MOUSEDEV_EMUL_EXPS:
 612		ps2_data[3] = mousedev_limit_delta(p->dz, 7);
 613		p->dz -= ps2_data[3];
 614		ps2_data[3] = (ps2_data[3] & 0x0f) | ((p->buttons & 0x18) << 1);
 615		client->bufsiz = 4;
 616		break;
 617
 618	case MOUSEDEV_EMUL_IMPS:
 619		ps2_data[0] |=
 620			((p->buttons & 0x10) >> 3) | ((p->buttons & 0x08) >> 1);
 621		ps2_data[3] = mousedev_limit_delta(p->dz, 127);
 622		p->dz -= ps2_data[3];
 623		client->bufsiz = 4;
 624		break;
 625
 626	case MOUSEDEV_EMUL_PS2:
 627	default:
 628		ps2_data[0] |=
 629			((p->buttons & 0x10) >> 3) | ((p->buttons & 0x08) >> 1);
 630		p->dz = 0;
 631		client->bufsiz = 3;
 632		break;
 633	}
 634
 635	if (!p->dx && !p->dy && !p->dz) {
 636		if (client->tail == client->head) {
 637			client->ready = 0;
 638			client->last_buttons = p->buttons;
 639		} else
 640			client->tail = (client->tail + 1) % PACKET_QUEUE_LEN;
 641	}
 642}
 643
 644static void mousedev_generate_response(struct mousedev_client *client,
 645					int command)
 646{
 647	client->ps2[0] = 0xfa; /* ACK */
 648
 649	switch (command) {
 650
 651	case 0xeb: /* Poll */
 652		mousedev_packet(client, &client->ps2[1]);
 653		client->bufsiz++; /* account for leading ACK */
 654		break;
 655
 656	case 0xf2: /* Get ID */
 657		switch (client->mode) {
 658		case MOUSEDEV_EMUL_PS2:
 659			client->ps2[1] = 0;
 660			break;
 661		case MOUSEDEV_EMUL_IMPS:
 662			client->ps2[1] = 3;
 663			break;
 664		case MOUSEDEV_EMUL_EXPS:
 665			client->ps2[1] = 4;
 666			break;
 667		}
 668		client->bufsiz = 2;
 669		break;
 670
 671	case 0xe9: /* Get info */
 672		client->ps2[1] = 0x60; client->ps2[2] = 3; client->ps2[3] = 200;
 673		client->bufsiz = 4;
 674		break;
 675
 676	case 0xff: /* Reset */
 677		client->impsseq = client->imexseq = 0;
 678		client->mode = MOUSEDEV_EMUL_PS2;
 679		client->ps2[1] = 0xaa; client->ps2[2] = 0x00;
 680		client->bufsiz = 3;
 681		break;
 682
 683	default:
 684		client->bufsiz = 1;
 685		break;
 686	}
 687	client->buffer = client->bufsiz;
 688}
 689
 690static ssize_t mousedev_write(struct file *file, const char __user *buffer,
 691				size_t count, loff_t *ppos)
 692{
 693	struct mousedev_client *client = file->private_data;
 694	unsigned char c;
 695	unsigned int i;
 696
 697	for (i = 0; i < count; i++) {
 698
 699		if (get_user(c, buffer + i))
 700			return -EFAULT;
 701
 702		spin_lock_irq(&client->packet_lock);
 703
 704		if (c == mousedev_imex_seq[client->imexseq]) {
 705			if (++client->imexseq == MOUSEDEV_SEQ_LEN) {
 706				client->imexseq = 0;
 707				client->mode = MOUSEDEV_EMUL_EXPS;
 708			}
 709		} else
 710			client->imexseq = 0;
 711
 712		if (c == mousedev_imps_seq[client->impsseq]) {
 713			if (++client->impsseq == MOUSEDEV_SEQ_LEN) {
 714				client->impsseq = 0;
 715				client->mode = MOUSEDEV_EMUL_IMPS;
 716			}
 717		} else
 718			client->impsseq = 0;
 719
 720		mousedev_generate_response(client, c);
 721
 722		spin_unlock_irq(&client->packet_lock);
 723	}
 724
 725	kill_fasync(&client->fasync, SIGIO, POLL_IN);
 726	wake_up_interruptible(&client->mousedev->wait);
 727
 728	return count;
 729}
 730
 731static ssize_t mousedev_read(struct file *file, char __user *buffer,
 732			     size_t count, loff_t *ppos)
 733{
 734	struct mousedev_client *client = file->private_data;
 735	struct mousedev *mousedev = client->mousedev;
 736	signed char data[sizeof(client->ps2)];
 737	int retval = 0;
 738
 739	if (!client->ready && !client->buffer && mousedev->exist &&
 740	    (file->f_flags & O_NONBLOCK))
 741		return -EAGAIN;
 742
 743	retval = wait_event_interruptible(mousedev->wait,
 744			!mousedev->exist || client->ready || client->buffer);
 745	if (retval)
 746		return retval;
 747
 748	if (!mousedev->exist)
 749		return -ENODEV;
 750
 751	spin_lock_irq(&client->packet_lock);
 752
 753	if (!client->buffer && client->ready) {
 754		mousedev_packet(client, client->ps2);
 755		client->buffer = client->bufsiz;
 756	}
 757
 758	if (count > client->buffer)
 759		count = client->buffer;
 760
 761	memcpy(data, client->ps2 + client->bufsiz - client->buffer, count);
 762	client->buffer -= count;
 763
 764	spin_unlock_irq(&client->packet_lock);
 765
 766	if (copy_to_user(buffer, data, count))
 767		return -EFAULT;
 768
 769	return count;
 770}
 771
 772/* No kernel lock - fine */
 773static unsigned int mousedev_poll(struct file *file, poll_table *wait)
 774{
 775	struct mousedev_client *client = file->private_data;
 776	struct mousedev *mousedev = client->mousedev;
 777	unsigned int mask;
 778
 779	poll_wait(file, &mousedev->wait, wait);
 780
 781	mask = mousedev->exist ? POLLOUT | POLLWRNORM : POLLHUP | POLLERR;
 782	if (client->ready || client->buffer)
 783		mask |= POLLIN | POLLRDNORM;
 784
 785	return mask;
 786}
 787
 788static const struct file_operations mousedev_fops = {
 789	.owner =	THIS_MODULE,
 790	.read =		mousedev_read,
 791	.write =	mousedev_write,
 792	.poll =		mousedev_poll,
 793	.open =		mousedev_open,
 794	.release =	mousedev_release,
 795	.fasync =	mousedev_fasync,
 796	.llseek = noop_llseek,
 797};
 798
 799static int mousedev_install_chrdev(struct mousedev *mousedev)
 800{
 801	mousedev_table[mousedev->minor] = mousedev;
 802	return 0;
 803}
 804
 805static void mousedev_remove_chrdev(struct mousedev *mousedev)
 806{
 807	mutex_lock(&mousedev_table_mutex);
 808	mousedev_table[mousedev->minor] = NULL;
 809	mutex_unlock(&mousedev_table_mutex);
 810}
 811
 812/*
 813 * Mark device non-existent. This disables writes, ioctls and
 814 * prevents new users from opening the device. Already posted
 815 * blocking reads will stay, however new ones will fail.
 816 */
 817static void mousedev_mark_dead(struct mousedev *mousedev)
 818{
 819	mutex_lock(&mousedev->mutex);
 820	mousedev->exist = false;
 821	mutex_unlock(&mousedev->mutex);
 822}
 823
 824/*
 825 * Wake up users waiting for IO so they can disconnect from
 826 * dead device.
 827 */
 828static void mousedev_hangup(struct mousedev *mousedev)
 829{
 830	struct mousedev_client *client;
 831
 832	spin_lock(&mousedev->client_lock);
 833	list_for_each_entry(client, &mousedev->client_list, node)
 834		kill_fasync(&client->fasync, SIGIO, POLL_HUP);
 835	spin_unlock(&mousedev->client_lock);
 836
 837	wake_up_interruptible(&mousedev->wait);
 838}
 839
 840static void mousedev_cleanup(struct mousedev *mousedev)
 841{
 842	struct input_handle *handle = &mousedev->handle;
 843
 844	mousedev_mark_dead(mousedev);
 845	mousedev_hangup(mousedev);
 846	mousedev_remove_chrdev(mousedev);
 847
 848	/* mousedev is marked dead so no one else accesses mousedev->open */
 849	if (mousedev->open)
 850		input_close_device(handle);
 851}
 852
 853static struct mousedev *mousedev_create(struct input_dev *dev,
 854					struct input_handler *handler,
 855					int minor)
 856{
 857	struct mousedev *mousedev;
 858	int error;
 859
 860	mousedev = kzalloc(sizeof(struct mousedev), GFP_KERNEL);
 861	if (!mousedev) {
 862		error = -ENOMEM;
 863		goto err_out;
 864	}
 865
 866	INIT_LIST_HEAD(&mousedev->client_list);
 867	INIT_LIST_HEAD(&mousedev->mixdev_node);
 868	spin_lock_init(&mousedev->client_lock);
 869	mutex_init(&mousedev->mutex);
 870	lockdep_set_subclass(&mousedev->mutex,
 871			     minor == MOUSEDEV_MIX ? SINGLE_DEPTH_NESTING : 0);
 872	init_waitqueue_head(&mousedev->wait);
 873
 874	if (minor == MOUSEDEV_MIX)
 875		dev_set_name(&mousedev->dev, "mice");
 876	else
 877		dev_set_name(&mousedev->dev, "mouse%d", minor);
 878
 879	mousedev->minor = minor;
 880	mousedev->exist = true;
 881	mousedev->handle.dev = input_get_device(dev);
 882	mousedev->handle.name = dev_name(&mousedev->dev);
 883	mousedev->handle.handler = handler;
 884	mousedev->handle.private = mousedev;
 885
 886	mousedev->dev.class = &input_class;
 887	if (dev)
 888		mousedev->dev.parent = &dev->dev;
 889	mousedev->dev.devt = MKDEV(INPUT_MAJOR, MOUSEDEV_MINOR_BASE + minor);
 890	mousedev->dev.release = mousedev_free;
 891	device_initialize(&mousedev->dev);
 892
 893	if (minor != MOUSEDEV_MIX) {
 894		error = input_register_handle(&mousedev->handle);
 895		if (error)
 896			goto err_free_mousedev;
 897	}
 898
 899	error = mousedev_install_chrdev(mousedev);
 900	if (error)
 901		goto err_unregister_handle;
 902
 903	error = device_add(&mousedev->dev);
 904	if (error)
 905		goto err_cleanup_mousedev;
 906
 907	return mousedev;
 908
 909 err_cleanup_mousedev:
 910	mousedev_cleanup(mousedev);
 911 err_unregister_handle:
 912	if (minor != MOUSEDEV_MIX)
 913		input_unregister_handle(&mousedev->handle);
 914 err_free_mousedev:
 915	put_device(&mousedev->dev);
 916 err_out:
 917	return ERR_PTR(error);
 918}
 919
 920static void mousedev_destroy(struct mousedev *mousedev)
 921{
 922	device_del(&mousedev->dev);
 923	mousedev_cleanup(mousedev);
 924	if (mousedev->minor != MOUSEDEV_MIX)
 925		input_unregister_handle(&mousedev->handle);
 926	put_device(&mousedev->dev);
 927}
 928
 929static int mixdev_add_device(struct mousedev *mousedev)
 930{
 931	int retval;
 932
 933	retval = mutex_lock_interruptible(&mousedev_mix->mutex);
 934	if (retval)
 935		return retval;
 936
 937	if (mousedev_mix->open) {
 938		retval = mousedev_open_device(mousedev);
 939		if (retval)
 940			goto out;
 941
 942		mousedev->mixdev_open = 1;
 943	}
 944
 945	get_device(&mousedev->dev);
 946	list_add_tail(&mousedev->mixdev_node, &mousedev_mix_list);
 947
 948 out:
 949	mutex_unlock(&mousedev_mix->mutex);
 950	return retval;
 951}
 952
 953static void mixdev_remove_device(struct mousedev *mousedev)
 954{
 955	mutex_lock(&mousedev_mix->mutex);
 956
 957	if (mousedev->mixdev_open) {
 958		mousedev->mixdev_open = 0;
 959		mousedev_close_device(mousedev);
 960	}
 961
 962	list_del_init(&mousedev->mixdev_node);
 963	mutex_unlock(&mousedev_mix->mutex);
 964
 965	put_device(&mousedev->dev);
 966}
 967
 968static int mousedev_connect(struct input_handler *handler,
 969			    struct input_dev *dev,
 970			    const struct input_device_id *id)
 971{
 972	struct mousedev *mousedev;
 973	int minor;
 974	int error;
 975
 976	for (minor = 0; minor < MOUSEDEV_MINORS; minor++)
 977		if (!mousedev_table[minor])
 978			break;
 979
 980	if (minor == MOUSEDEV_MINORS) {
 981		pr_err("no more free mousedev devices\n");
 982		return -ENFILE;
 983	}
 984
 985	mousedev = mousedev_create(dev, handler, minor);
 986	if (IS_ERR(mousedev))
 987		return PTR_ERR(mousedev);
 988
 989	error = mixdev_add_device(mousedev);
 990	if (error) {
 991		mousedev_destroy(mousedev);
 992		return error;
 993	}
 994
 995	return 0;
 996}
 997
 998static void mousedev_disconnect(struct input_handle *handle)
 999{
1000	struct mousedev *mousedev = handle->private;
1001
1002	mixdev_remove_device(mousedev);
1003	mousedev_destroy(mousedev);
1004}
1005
1006static const struct input_device_id mousedev_ids[] = {
1007	{
1008		.flags = INPUT_DEVICE_ID_MATCH_EVBIT |
1009				INPUT_DEVICE_ID_MATCH_KEYBIT |
1010				INPUT_DEVICE_ID_MATCH_RELBIT,
1011		.evbit = { BIT_MASK(EV_KEY) | BIT_MASK(EV_REL) },
1012		.keybit = { [BIT_WORD(BTN_LEFT)] = BIT_MASK(BTN_LEFT) },
1013		.relbit = { BIT_MASK(REL_X) | BIT_MASK(REL_Y) },
1014	},	/* A mouse like device, at least one button,
1015		   two relative axes */
1016	{
1017		.flags = INPUT_DEVICE_ID_MATCH_EVBIT |
1018				INPUT_DEVICE_ID_MATCH_RELBIT,
1019		.evbit = { BIT_MASK(EV_KEY) | BIT_MASK(EV_REL) },
1020		.relbit = { BIT_MASK(REL_WHEEL) },
1021	},	/* A separate scrollwheel */
1022	{
1023		.flags = INPUT_DEVICE_ID_MATCH_EVBIT |
1024				INPUT_DEVICE_ID_MATCH_KEYBIT |
1025				INPUT_DEVICE_ID_MATCH_ABSBIT,
1026		.evbit = { BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS) },
1027		.keybit = { [BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH) },
1028		.absbit = { BIT_MASK(ABS_X) | BIT_MASK(ABS_Y) },
1029	},	/* A tablet like device, at least touch detection,
1030		   two absolute axes */
1031	{
1032		.flags = INPUT_DEVICE_ID_MATCH_EVBIT |
1033				INPUT_DEVICE_ID_MATCH_KEYBIT |
1034				INPUT_DEVICE_ID_MATCH_ABSBIT,
1035		.evbit = { BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS) },
1036		.keybit = { [BIT_WORD(BTN_TOOL_FINGER)] =
1037				BIT_MASK(BTN_TOOL_FINGER) },
1038		.absbit = { BIT_MASK(ABS_X) | BIT_MASK(ABS_Y) |
1039				BIT_MASK(ABS_PRESSURE) |
1040				BIT_MASK(ABS_TOOL_WIDTH) },
1041	},	/* A touchpad */
1042	{
1043		.flags = INPUT_DEVICE_ID_MATCH_EVBIT |
1044			INPUT_DEVICE_ID_MATCH_KEYBIT |
1045			INPUT_DEVICE_ID_MATCH_ABSBIT,
1046		.evbit = { BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS) },
1047		.keybit = { [BIT_WORD(BTN_LEFT)] = BIT_MASK(BTN_LEFT) },
1048		.absbit = { BIT_MASK(ABS_X) | BIT_MASK(ABS_Y) },
1049	},	/* Mouse-like device with absolute X and Y but ordinary
1050		   clicks, like hp ILO2 High Performance mouse */
1051
1052	{ },	/* Terminating entry */
1053};
1054
1055MODULE_DEVICE_TABLE(input, mousedev_ids);
1056
1057static struct input_handler mousedev_handler = {
1058	.event =	mousedev_event,
1059	.connect =	mousedev_connect,
1060	.disconnect =	mousedev_disconnect,
1061	.fops =		&mousedev_fops,
1062	.minor =	MOUSEDEV_MINOR_BASE,
1063	.name =		"mousedev",
1064	.id_table =	mousedev_ids,
1065};
1066
1067#ifdef CONFIG_INPUT_MOUSEDEV_PSAUX
1068static struct miscdevice psaux_mouse = {
1069	PSMOUSE_MINOR, "psaux", &mousedev_fops
1070};
1071static int psaux_registered;
1072#endif
1073
1074static int __init mousedev_init(void)
1075{
1076	int error;
1077
1078	mousedev_mix = mousedev_create(NULL, &mousedev_handler, MOUSEDEV_MIX);
1079	if (IS_ERR(mousedev_mix))
1080		return PTR_ERR(mousedev_mix);
1081
1082	error = input_register_handler(&mousedev_handler);
1083	if (error) {
1084		mousedev_destroy(mousedev_mix);
1085		return error;
1086	}
1087
1088#ifdef CONFIG_INPUT_MOUSEDEV_PSAUX
1089	error = misc_register(&psaux_mouse);
1090	if (error)
1091		pr_warning("could not register psaux device, error: %d\n",
1092			   error);
1093	else
1094		psaux_registered = 1;
1095#endif
1096
1097	pr_info("PS/2 mouse device common for all mice\n");
1098
1099	return 0;
1100}
1101
1102static void __exit mousedev_exit(void)
1103{
1104#ifdef CONFIG_INPUT_MOUSEDEV_PSAUX
1105	if (psaux_registered)
1106		misc_deregister(&psaux_mouse);
1107#endif
1108	input_unregister_handler(&mousedev_handler);
1109	mousedev_destroy(mousedev_mix);
1110}
1111
1112module_init(mousedev_init);
1113module_exit(mousedev_exit);
v3.5.6
   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		value = 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		value = 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}
 512
 513static void mousedev_detach_client(struct mousedev *mousedev,
 514				   struct mousedev_client *client)
 515{
 516	spin_lock(&mousedev->client_lock);
 517	list_del_rcu(&client->node);
 518	spin_unlock(&mousedev->client_lock);
 519	synchronize_rcu();
 520}
 521
 522static int mousedev_release(struct inode *inode, struct file *file)
 523{
 524	struct mousedev_client *client = file->private_data;
 525	struct mousedev *mousedev = client->mousedev;
 526
 527	mousedev_detach_client(mousedev, client);
 528	kfree(client);
 529
 530	mousedev_close_device(mousedev);
 531	put_device(&mousedev->dev);
 532
 533	return 0;
 534}
 535
 536static int mousedev_open(struct inode *inode, struct file *file)
 537{
 538	struct mousedev_client *client;
 539	struct mousedev *mousedev;
 540	int error;
 541	int i;
 542
 543#ifdef CONFIG_INPUT_MOUSEDEV_PSAUX
 544	if (imajor(inode) == MISC_MAJOR)
 545		i = MOUSEDEV_MIX;
 546	else
 547#endif
 548		i = iminor(inode) - MOUSEDEV_MINOR_BASE;
 549
 550	if (i >= MOUSEDEV_MINORS)
 551		return -ENODEV;
 552
 553	error = mutex_lock_interruptible(&mousedev_table_mutex);
 554	if (error) {
 555		return error;
 556	}
 557	mousedev = mousedev_table[i];
 558	if (mousedev)
 559		get_device(&mousedev->dev);
 560	mutex_unlock(&mousedev_table_mutex);
 561
 562	if (!mousedev) {
 563		return -ENODEV;
 564	}
 565
 566	client = kzalloc(sizeof(struct mousedev_client), GFP_KERNEL);
 567	if (!client) {
 568		error = -ENOMEM;
 569		goto err_put_mousedev;
 570	}
 571
 572	spin_lock_init(&client->packet_lock);
 573	client->pos_x = xres / 2;
 574	client->pos_y = yres / 2;
 575	client->mousedev = mousedev;
 576	mousedev_attach_client(mousedev, client);
 577
 578	error = mousedev_open_device(mousedev);
 579	if (error)
 580		goto err_free_client;
 581
 582	file->private_data = client;
 583	return 0;
 584
 585 err_free_client:
 586	mousedev_detach_client(mousedev, client);
 587	kfree(client);
 588 err_put_mousedev:
 589	put_device(&mousedev->dev);
 590	return error;
 591}
 592
 593static inline int mousedev_limit_delta(int delta, int limit)
 594{
 595	return delta > limit ? limit : (delta < -limit ? -limit : delta);
 596}
 597
 598static void mousedev_packet(struct mousedev_client *client,
 599			    signed char *ps2_data)
 600{
 601	struct mousedev_motion *p = &client->packets[client->tail];
 602
 603	ps2_data[0] = 0x08 |
 604		((p->dx < 0) << 4) | ((p->dy < 0) << 5) | (p->buttons & 0x07);
 605	ps2_data[1] = mousedev_limit_delta(p->dx, 127);
 606	ps2_data[2] = mousedev_limit_delta(p->dy, 127);
 607	p->dx -= ps2_data[1];
 608	p->dy -= ps2_data[2];
 609
 610	switch (client->mode) {
 611	case MOUSEDEV_EMUL_EXPS:
 612		ps2_data[3] = mousedev_limit_delta(p->dz, 7);
 613		p->dz -= ps2_data[3];
 614		ps2_data[3] = (ps2_data[3] & 0x0f) | ((p->buttons & 0x18) << 1);
 615		client->bufsiz = 4;
 616		break;
 617
 618	case MOUSEDEV_EMUL_IMPS:
 619		ps2_data[0] |=
 620			((p->buttons & 0x10) >> 3) | ((p->buttons & 0x08) >> 1);
 621		ps2_data[3] = mousedev_limit_delta(p->dz, 127);
 622		p->dz -= ps2_data[3];
 623		client->bufsiz = 4;
 624		break;
 625
 626	case MOUSEDEV_EMUL_PS2:
 627	default:
 628		ps2_data[0] |=
 629			((p->buttons & 0x10) >> 3) | ((p->buttons & 0x08) >> 1);
 630		p->dz = 0;
 631		client->bufsiz = 3;
 632		break;
 633	}
 634
 635	if (!p->dx && !p->dy && !p->dz) {
 636		if (client->tail == client->head) {
 637			client->ready = 0;
 638			client->last_buttons = p->buttons;
 639		} else
 640			client->tail = (client->tail + 1) % PACKET_QUEUE_LEN;
 641	}
 642}
 643
 644static void mousedev_generate_response(struct mousedev_client *client,
 645					int command)
 646{
 647	client->ps2[0] = 0xfa; /* ACK */
 648
 649	switch (command) {
 650
 651	case 0xeb: /* Poll */
 652		mousedev_packet(client, &client->ps2[1]);
 653		client->bufsiz++; /* account for leading ACK */
 654		break;
 655
 656	case 0xf2: /* Get ID */
 657		switch (client->mode) {
 658		case MOUSEDEV_EMUL_PS2:
 659			client->ps2[1] = 0;
 660			break;
 661		case MOUSEDEV_EMUL_IMPS:
 662			client->ps2[1] = 3;
 663			break;
 664		case MOUSEDEV_EMUL_EXPS:
 665			client->ps2[1] = 4;
 666			break;
 667		}
 668		client->bufsiz = 2;
 669		break;
 670
 671	case 0xe9: /* Get info */
 672		client->ps2[1] = 0x60; client->ps2[2] = 3; client->ps2[3] = 200;
 673		client->bufsiz = 4;
 674		break;
 675
 676	case 0xff: /* Reset */
 677		client->impsseq = client->imexseq = 0;
 678		client->mode = MOUSEDEV_EMUL_PS2;
 679		client->ps2[1] = 0xaa; client->ps2[2] = 0x00;
 680		client->bufsiz = 3;
 681		break;
 682
 683	default:
 684		client->bufsiz = 1;
 685		break;
 686	}
 687	client->buffer = client->bufsiz;
 688}
 689
 690static ssize_t mousedev_write(struct file *file, const char __user *buffer,
 691				size_t count, loff_t *ppos)
 692{
 693	struct mousedev_client *client = file->private_data;
 694	unsigned char c;
 695	unsigned int i;
 696
 697	for (i = 0; i < count; i++) {
 698
 699		if (get_user(c, buffer + i))
 700			return -EFAULT;
 701
 702		spin_lock_irq(&client->packet_lock);
 703
 704		if (c == mousedev_imex_seq[client->imexseq]) {
 705			if (++client->imexseq == MOUSEDEV_SEQ_LEN) {
 706				client->imexseq = 0;
 707				client->mode = MOUSEDEV_EMUL_EXPS;
 708			}
 709		} else
 710			client->imexseq = 0;
 711
 712		if (c == mousedev_imps_seq[client->impsseq]) {
 713			if (++client->impsseq == MOUSEDEV_SEQ_LEN) {
 714				client->impsseq = 0;
 715				client->mode = MOUSEDEV_EMUL_IMPS;
 716			}
 717		} else
 718			client->impsseq = 0;
 719
 720		mousedev_generate_response(client, c);
 721
 722		spin_unlock_irq(&client->packet_lock);
 723	}
 724
 725	kill_fasync(&client->fasync, SIGIO, POLL_IN);
 726	wake_up_interruptible(&client->mousedev->wait);
 727
 728	return count;
 729}
 730
 731static ssize_t mousedev_read(struct file *file, char __user *buffer,
 732			     size_t count, loff_t *ppos)
 733{
 734	struct mousedev_client *client = file->private_data;
 735	struct mousedev *mousedev = client->mousedev;
 736	signed char data[sizeof(client->ps2)];
 737	int retval = 0;
 738
 739	if (!client->ready && !client->buffer && mousedev->exist &&
 740	    (file->f_flags & O_NONBLOCK))
 741		return -EAGAIN;
 742
 743	retval = wait_event_interruptible(mousedev->wait,
 744			!mousedev->exist || client->ready || client->buffer);
 745	if (retval)
 746		return retval;
 747
 748	if (!mousedev->exist)
 749		return -ENODEV;
 750
 751	spin_lock_irq(&client->packet_lock);
 752
 753	if (!client->buffer && client->ready) {
 754		mousedev_packet(client, client->ps2);
 755		client->buffer = client->bufsiz;
 756	}
 757
 758	if (count > client->buffer)
 759		count = client->buffer;
 760
 761	memcpy(data, client->ps2 + client->bufsiz - client->buffer, count);
 762	client->buffer -= count;
 763
 764	spin_unlock_irq(&client->packet_lock);
 765
 766	if (copy_to_user(buffer, data, count))
 767		return -EFAULT;
 768
 769	return count;
 770}
 771
 772/* No kernel lock - fine */
 773static unsigned int mousedev_poll(struct file *file, poll_table *wait)
 774{
 775	struct mousedev_client *client = file->private_data;
 776	struct mousedev *mousedev = client->mousedev;
 777	unsigned int mask;
 778
 779	poll_wait(file, &mousedev->wait, wait);
 780
 781	mask = mousedev->exist ? POLLOUT | POLLWRNORM : POLLHUP | POLLERR;
 782	if (client->ready || client->buffer)
 783		mask |= POLLIN | POLLRDNORM;
 784
 785	return mask;
 786}
 787
 788static const struct file_operations mousedev_fops = {
 789	.owner =	THIS_MODULE,
 790	.read =		mousedev_read,
 791	.write =	mousedev_write,
 792	.poll =		mousedev_poll,
 793	.open =		mousedev_open,
 794	.release =	mousedev_release,
 795	.fasync =	mousedev_fasync,
 796	.llseek = noop_llseek,
 797};
 798
 799static int mousedev_install_chrdev(struct mousedev *mousedev)
 800{
 801	mousedev_table[mousedev->minor] = mousedev;
 802	return 0;
 803}
 804
 805static void mousedev_remove_chrdev(struct mousedev *mousedev)
 806{
 807	mutex_lock(&mousedev_table_mutex);
 808	mousedev_table[mousedev->minor] = NULL;
 809	mutex_unlock(&mousedev_table_mutex);
 810}
 811
 812/*
 813 * Mark device non-existent. This disables writes, ioctls and
 814 * prevents new users from opening the device. Already posted
 815 * blocking reads will stay, however new ones will fail.
 816 */
 817static void mousedev_mark_dead(struct mousedev *mousedev)
 818{
 819	mutex_lock(&mousedev->mutex);
 820	mousedev->exist = false;
 821	mutex_unlock(&mousedev->mutex);
 822}
 823
 824/*
 825 * Wake up users waiting for IO so they can disconnect from
 826 * dead device.
 827 */
 828static void mousedev_hangup(struct mousedev *mousedev)
 829{
 830	struct mousedev_client *client;
 831
 832	spin_lock(&mousedev->client_lock);
 833	list_for_each_entry(client, &mousedev->client_list, node)
 834		kill_fasync(&client->fasync, SIGIO, POLL_HUP);
 835	spin_unlock(&mousedev->client_lock);
 836
 837	wake_up_interruptible(&mousedev->wait);
 838}
 839
 840static void mousedev_cleanup(struct mousedev *mousedev)
 841{
 842	struct input_handle *handle = &mousedev->handle;
 843
 844	mousedev_mark_dead(mousedev);
 845	mousedev_hangup(mousedev);
 846	mousedev_remove_chrdev(mousedev);
 847
 848	/* mousedev is marked dead so no one else accesses mousedev->open */
 849	if (mousedev->open)
 850		input_close_device(handle);
 851}
 852
 853static struct mousedev *mousedev_create(struct input_dev *dev,
 854					struct input_handler *handler,
 855					int minor)
 856{
 857	struct mousedev *mousedev;
 858	int error;
 859
 860	mousedev = kzalloc(sizeof(struct mousedev), GFP_KERNEL);
 861	if (!mousedev) {
 862		error = -ENOMEM;
 863		goto err_out;
 864	}
 865
 866	INIT_LIST_HEAD(&mousedev->client_list);
 867	INIT_LIST_HEAD(&mousedev->mixdev_node);
 868	spin_lock_init(&mousedev->client_lock);
 869	mutex_init(&mousedev->mutex);
 870	lockdep_set_subclass(&mousedev->mutex,
 871			     minor == MOUSEDEV_MIX ? SINGLE_DEPTH_NESTING : 0);
 872	init_waitqueue_head(&mousedev->wait);
 873
 874	if (minor == MOUSEDEV_MIX)
 875		dev_set_name(&mousedev->dev, "mice");
 876	else
 877		dev_set_name(&mousedev->dev, "mouse%d", minor);
 878
 879	mousedev->minor = minor;
 880	mousedev->exist = true;
 881	mousedev->handle.dev = input_get_device(dev);
 882	mousedev->handle.name = dev_name(&mousedev->dev);
 883	mousedev->handle.handler = handler;
 884	mousedev->handle.private = mousedev;
 885
 886	mousedev->dev.class = &input_class;
 887	if (dev)
 888		mousedev->dev.parent = &dev->dev;
 889	mousedev->dev.devt = MKDEV(INPUT_MAJOR, MOUSEDEV_MINOR_BASE + minor);
 890	mousedev->dev.release = mousedev_free;
 891	device_initialize(&mousedev->dev);
 892
 893	if (minor != MOUSEDEV_MIX) {
 894		error = input_register_handle(&mousedev->handle);
 895		if (error)
 896			goto err_free_mousedev;
 897	}
 898
 899	error = mousedev_install_chrdev(mousedev);
 900	if (error)
 901		goto err_unregister_handle;
 902
 903	error = device_add(&mousedev->dev);
 904	if (error)
 905		goto err_cleanup_mousedev;
 906
 907	return mousedev;
 908
 909 err_cleanup_mousedev:
 910	mousedev_cleanup(mousedev);
 911 err_unregister_handle:
 912	if (minor != MOUSEDEV_MIX)
 913		input_unregister_handle(&mousedev->handle);
 914 err_free_mousedev:
 915	put_device(&mousedev->dev);
 916 err_out:
 917	return ERR_PTR(error);
 918}
 919
 920static void mousedev_destroy(struct mousedev *mousedev)
 921{
 922	device_del(&mousedev->dev);
 923	mousedev_cleanup(mousedev);
 924	if (mousedev->minor != MOUSEDEV_MIX)
 925		input_unregister_handle(&mousedev->handle);
 926	put_device(&mousedev->dev);
 927}
 928
 929static int mixdev_add_device(struct mousedev *mousedev)
 930{
 931	int retval;
 932
 933	retval = mutex_lock_interruptible(&mousedev_mix->mutex);
 934	if (retval)
 935		return retval;
 936
 937	if (mousedev_mix->open) {
 938		retval = mousedev_open_device(mousedev);
 939		if (retval)
 940			goto out;
 941
 942		mousedev->mixdev_open = 1;
 943	}
 944
 945	get_device(&mousedev->dev);
 946	list_add_tail(&mousedev->mixdev_node, &mousedev_mix_list);
 947
 948 out:
 949	mutex_unlock(&mousedev_mix->mutex);
 950	return retval;
 951}
 952
 953static void mixdev_remove_device(struct mousedev *mousedev)
 954{
 955	mutex_lock(&mousedev_mix->mutex);
 956
 957	if (mousedev->mixdev_open) {
 958		mousedev->mixdev_open = 0;
 959		mousedev_close_device(mousedev);
 960	}
 961
 962	list_del_init(&mousedev->mixdev_node);
 963	mutex_unlock(&mousedev_mix->mutex);
 964
 965	put_device(&mousedev->dev);
 966}
 967
 968static int mousedev_connect(struct input_handler *handler,
 969			    struct input_dev *dev,
 970			    const struct input_device_id *id)
 971{
 972	struct mousedev *mousedev;
 973	int minor;
 974	int error;
 975
 976	for (minor = 0; minor < MOUSEDEV_MINORS; minor++)
 977		if (!mousedev_table[minor])
 978			break;
 979
 980	if (minor == MOUSEDEV_MINORS) {
 981		pr_err("no more free mousedev devices\n");
 982		return -ENFILE;
 983	}
 984
 985	mousedev = mousedev_create(dev, handler, minor);
 986	if (IS_ERR(mousedev))
 987		return PTR_ERR(mousedev);
 988
 989	error = mixdev_add_device(mousedev);
 990	if (error) {
 991		mousedev_destroy(mousedev);
 992		return error;
 993	}
 994
 995	return 0;
 996}
 997
 998static void mousedev_disconnect(struct input_handle *handle)
 999{
1000	struct mousedev *mousedev = handle->private;
1001
1002	mixdev_remove_device(mousedev);
1003	mousedev_destroy(mousedev);
1004}
1005
1006static const struct input_device_id mousedev_ids[] = {
1007	{
1008		.flags = INPUT_DEVICE_ID_MATCH_EVBIT |
1009				INPUT_DEVICE_ID_MATCH_KEYBIT |
1010				INPUT_DEVICE_ID_MATCH_RELBIT,
1011		.evbit = { BIT_MASK(EV_KEY) | BIT_MASK(EV_REL) },
1012		.keybit = { [BIT_WORD(BTN_LEFT)] = BIT_MASK(BTN_LEFT) },
1013		.relbit = { BIT_MASK(REL_X) | BIT_MASK(REL_Y) },
1014	},	/* A mouse like device, at least one button,
1015		   two relative axes */
1016	{
1017		.flags = INPUT_DEVICE_ID_MATCH_EVBIT |
1018				INPUT_DEVICE_ID_MATCH_RELBIT,
1019		.evbit = { BIT_MASK(EV_KEY) | BIT_MASK(EV_REL) },
1020		.relbit = { BIT_MASK(REL_WHEEL) },
1021	},	/* A separate scrollwheel */
1022	{
1023		.flags = INPUT_DEVICE_ID_MATCH_EVBIT |
1024				INPUT_DEVICE_ID_MATCH_KEYBIT |
1025				INPUT_DEVICE_ID_MATCH_ABSBIT,
1026		.evbit = { BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS) },
1027		.keybit = { [BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH) },
1028		.absbit = { BIT_MASK(ABS_X) | BIT_MASK(ABS_Y) },
1029	},	/* A tablet like device, at least touch detection,
1030		   two absolute axes */
1031	{
1032		.flags = INPUT_DEVICE_ID_MATCH_EVBIT |
1033				INPUT_DEVICE_ID_MATCH_KEYBIT |
1034				INPUT_DEVICE_ID_MATCH_ABSBIT,
1035		.evbit = { BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS) },
1036		.keybit = { [BIT_WORD(BTN_TOOL_FINGER)] =
1037				BIT_MASK(BTN_TOOL_FINGER) },
1038		.absbit = { BIT_MASK(ABS_X) | BIT_MASK(ABS_Y) |
1039				BIT_MASK(ABS_PRESSURE) |
1040				BIT_MASK(ABS_TOOL_WIDTH) },
1041	},	/* A touchpad */
1042	{
1043		.flags = INPUT_DEVICE_ID_MATCH_EVBIT |
1044			INPUT_DEVICE_ID_MATCH_KEYBIT |
1045			INPUT_DEVICE_ID_MATCH_ABSBIT,
1046		.evbit = { BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS) },
1047		.keybit = { [BIT_WORD(BTN_LEFT)] = BIT_MASK(BTN_LEFT) },
1048		.absbit = { BIT_MASK(ABS_X) | BIT_MASK(ABS_Y) },
1049	},	/* Mouse-like device with absolute X and Y but ordinary
1050		   clicks, like hp ILO2 High Performance mouse */
1051
1052	{ },	/* Terminating entry */
1053};
1054
1055MODULE_DEVICE_TABLE(input, mousedev_ids);
1056
1057static struct input_handler mousedev_handler = {
1058	.event =	mousedev_event,
1059	.connect =	mousedev_connect,
1060	.disconnect =	mousedev_disconnect,
1061	.fops =		&mousedev_fops,
1062	.minor =	MOUSEDEV_MINOR_BASE,
1063	.name =		"mousedev",
1064	.id_table =	mousedev_ids,
1065};
1066
1067#ifdef CONFIG_INPUT_MOUSEDEV_PSAUX
1068static struct miscdevice psaux_mouse = {
1069	PSMOUSE_MINOR, "psaux", &mousedev_fops
1070};
1071static int psaux_registered;
1072#endif
1073
1074static int __init mousedev_init(void)
1075{
1076	int error;
1077
1078	mousedev_mix = mousedev_create(NULL, &mousedev_handler, MOUSEDEV_MIX);
1079	if (IS_ERR(mousedev_mix))
1080		return PTR_ERR(mousedev_mix);
1081
1082	error = input_register_handler(&mousedev_handler);
1083	if (error) {
1084		mousedev_destroy(mousedev_mix);
1085		return error;
1086	}
1087
1088#ifdef CONFIG_INPUT_MOUSEDEV_PSAUX
1089	error = misc_register(&psaux_mouse);
1090	if (error)
1091		pr_warning("could not register psaux device, error: %d\n",
1092			   error);
1093	else
1094		psaux_registered = 1;
1095#endif
1096
1097	pr_info("PS/2 mouse device common for all mice\n");
1098
1099	return 0;
1100}
1101
1102static void __exit mousedev_exit(void)
1103{
1104#ifdef CONFIG_INPUT_MOUSEDEV_PSAUX
1105	if (psaux_registered)
1106		misc_deregister(&psaux_mouse);
1107#endif
1108	input_unregister_handler(&mousedev_handler);
1109	mousedev_destroy(mousedev_mix);
1110}
1111
1112module_init(mousedev_init);
1113module_exit(mousedev_exit);