aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/input/mousedev.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/input/mousedev.c')
-rw-r--r--drivers/input/mousedev.c43
1 files changed, 27 insertions, 16 deletions
diff --git a/drivers/input/mousedev.c b/drivers/input/mousedev.c
index b685a507955..1f851acab30 100644
--- a/drivers/input/mousedev.c
+++ b/drivers/input/mousedev.c
@@ -19,7 +19,6 @@
19#include <linux/moduleparam.h> 19#include <linux/moduleparam.h>
20#include <linux/init.h> 20#include <linux/init.h>
21#include <linux/input.h> 21#include <linux/input.h>
22#include <linux/config.h>
23#include <linux/smp_lock.h> 22#include <linux/smp_lock.h>
24#include <linux/random.h> 23#include <linux/random.h>
25#include <linux/major.h> 24#include <linux/major.h>
@@ -123,7 +122,9 @@ static void mousedev_touchpad_event(struct input_dev *dev, struct mousedev *mous
123 122
124 if (mousedev->touch) { 123 if (mousedev->touch) {
125 size = dev->absmax[ABS_X] - dev->absmin[ABS_X]; 124 size = dev->absmax[ABS_X] - dev->absmin[ABS_X];
126 if (size == 0) size = 256 * 2; 125 if (size == 0)
126 size = 256 * 2;
127
127 switch (code) { 128 switch (code) {
128 case ABS_X: 129 case ABS_X:
129 fx(0) = value; 130 fx(0) = value;
@@ -155,18 +156,24 @@ static void mousedev_abs_event(struct input_dev *dev, struct mousedev *mousedev,
155 switch (code) { 156 switch (code) {
156 case ABS_X: 157 case ABS_X:
157 size = dev->absmax[ABS_X] - dev->absmin[ABS_X]; 158 size = dev->absmax[ABS_X] - dev->absmin[ABS_X];
158 if (size == 0) size = xres ? : 1; 159 if (size == 0)
159 if (value > dev->absmax[ABS_X]) value = dev->absmax[ABS_X]; 160 size = xres ? : 1;
160 if (value < dev->absmin[ABS_X]) value = dev->absmin[ABS_X]; 161 if (value > dev->absmax[ABS_X])
162 value = dev->absmax[ABS_X];
163 if (value < dev->absmin[ABS_X])
164 value = dev->absmin[ABS_X];
161 mousedev->packet.x = ((value - dev->absmin[ABS_X]) * xres) / size; 165 mousedev->packet.x = ((value - dev->absmin[ABS_X]) * xres) / size;
162 mousedev->packet.abs_event = 1; 166 mousedev->packet.abs_event = 1;
163 break; 167 break;
164 168
165 case ABS_Y: 169 case ABS_Y:
166 size = dev->absmax[ABS_Y] - dev->absmin[ABS_Y]; 170 size = dev->absmax[ABS_Y] - dev->absmin[ABS_Y];
167 if (size == 0) size = yres ? : 1; 171 if (size == 0)
168 if (value > dev->absmax[ABS_Y]) value = dev->absmax[ABS_Y]; 172 size = yres ? : 1;
169 if (value < dev->absmin[ABS_Y]) value = dev->absmin[ABS_Y]; 173 if (value > dev->absmax[ABS_Y])
174 value = dev->absmax[ABS_Y];
175 if (value < dev->absmin[ABS_Y])
176 value = dev->absmin[ABS_Y];
170 mousedev->packet.y = yres - ((value - dev->absmin[ABS_Y]) * yres) / size; 177 mousedev->packet.y = yres - ((value - dev->absmin[ABS_Y]) * yres) / size;
171 mousedev->packet.abs_event = 1; 178 mousedev->packet.abs_event = 1;
172 break; 179 break;
@@ -202,7 +209,7 @@ static void mousedev_key_event(struct mousedev *mousedev, unsigned int code, int
202 case BTN_SIDE: index = 3; break; 209 case BTN_SIDE: index = 3; break;
203 case BTN_4: 210 case BTN_4:
204 case BTN_EXTRA: index = 4; break; 211 case BTN_EXTRA: index = 4; break;
205 default: return; 212 default: return;
206 } 213 }
207 214
208 if (value) { 215 if (value) {
@@ -285,10 +292,9 @@ static void mousedev_touchpad_touch(struct mousedev *mousedev, int value)
285 mousedev->touch = mousedev->pkt_count = 0; 292 mousedev->touch = mousedev->pkt_count = 0;
286 mousedev->frac_dx = 0; 293 mousedev->frac_dx = 0;
287 mousedev->frac_dy = 0; 294 mousedev->frac_dy = 0;
288 } 295
289 else 296 } else if (!mousedev->touch)
290 if (!mousedev->touch) 297 mousedev->touch = jiffies;
291 mousedev->touch = jiffies;
292} 298}
293 299
294static void mousedev_event(struct input_handle *handle, unsigned int type, unsigned int code, int value) 300static void mousedev_event(struct input_handle *handle, unsigned int type, unsigned int code, int value)
@@ -327,7 +333,7 @@ static void mousedev_event(struct input_handle *handle, unsigned int type, unsig
327 mousedev->pkt_count++; 333 mousedev->pkt_count++;
328 /* Input system eats duplicate events, but we need all of them 334 /* Input system eats duplicate events, but we need all of them
329 * to do correct averaging so apply present one forward 335 * to do correct averaging so apply present one forward
330 */ 336 */
331 fx(0) = fx(1); 337 fx(0) = fx(1);
332 fy(0) = fy(1); 338 fy(0) = fy(1);
333 } 339 }
@@ -346,7 +352,9 @@ static int mousedev_fasync(int fd, struct file *file, int on)
346{ 352{
347 int retval; 353 int retval;
348 struct mousedev_list *list = file->private_data; 354 struct mousedev_list *list = file->private_data;
355
349 retval = fasync_helper(fd, file, on, &list->fasync); 356 retval = fasync_helper(fd, file, on, &list->fasync);
357
350 return retval < 0 ? retval : 0; 358 return retval < 0 ? retval : 0;
351} 359}
352 360
@@ -507,14 +515,16 @@ static ssize_t mousedev_write(struct file * file, const char __user * buffer, si
507 list->imexseq = 0; 515 list->imexseq = 0;
508 list->mode = MOUSEDEV_EMUL_EXPS; 516 list->mode = MOUSEDEV_EMUL_EXPS;
509 } 517 }
510 } else list->imexseq = 0; 518 } else
519 list->imexseq = 0;
511 520
512 if (c == mousedev_imps_seq[list->impsseq]) { 521 if (c == mousedev_imps_seq[list->impsseq]) {
513 if (++list->impsseq == MOUSEDEV_SEQ_LEN) { 522 if (++list->impsseq == MOUSEDEV_SEQ_LEN) {
514 list->impsseq = 0; 523 list->impsseq = 0;
515 list->mode = MOUSEDEV_EMUL_IMPS; 524 list->mode = MOUSEDEV_EMUL_IMPS;
516 } 525 }
517 } else list->impsseq = 0; 526 } else
527 list->impsseq = 0;
518 528
519 list->ps2[0] = 0xfa; 529 list->ps2[0] = 0xfa;
520 530
@@ -598,6 +608,7 @@ static ssize_t mousedev_read(struct file * file, char __user * buffer, size_t co
598static unsigned int mousedev_poll(struct file *file, poll_table *wait) 608static unsigned int mousedev_poll(struct file *file, poll_table *wait)
599{ 609{
600 struct mousedev_list *list = file->private_data; 610 struct mousedev_list *list = file->private_data;
611
601 poll_wait(file, &list->mousedev->wait, wait); 612 poll_wait(file, &list->mousedev->wait, wait);
602 return ((list->ready || list->buffer) ? (POLLIN | POLLRDNORM) : 0) | 613 return ((list->ready || list->buffer) ? (POLLIN | POLLRDNORM) : 0) |
603 (list->mousedev->exist ? 0 : (POLLHUP | POLLERR)); 614 (list->mousedev->exist ? 0 : (POLLHUP | POLLERR));