diff options
Diffstat (limited to 'drivers/input/mousedev.c')
-rw-r--r-- | drivers/input/mousedev.c | 43 |
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 | ||
294 | static void mousedev_event(struct input_handle *handle, unsigned int type, unsigned int code, int value) | 300 | static 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 | |||
598 | static unsigned int mousedev_poll(struct file *file, poll_table *wait) | 608 | static 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)); |