[go: nahoru, domu]

mousedev.c revision 8c127f0717b438e6abc3d92d4ae248c4224b9dcb
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);
1114