diff options
Diffstat (limited to 'drivers/input/mouse')
| -rw-r--r-- | drivers/input/mouse/bcm5974.c | 44 | ||||
| -rw-r--r-- | drivers/input/mouse/lifebook.c | 6 | ||||
| -rw-r--r-- | drivers/input/mouse/psmouse-base.c | 69 | ||||
| -rw-r--r-- | drivers/input/mouse/sentelic.c | 6 | ||||
| -rw-r--r-- | drivers/input/mouse/synaptics.c | 10 | ||||
| -rw-r--r-- | drivers/input/mouse/synaptics.h | 1 |
6 files changed, 89 insertions, 47 deletions
diff --git a/drivers/input/mouse/bcm5974.c b/drivers/input/mouse/bcm5974.c index 0d1d33468b43..4f8fe0886b2a 100644 --- a/drivers/input/mouse/bcm5974.c +++ b/drivers/input/mouse/bcm5974.c | |||
| @@ -139,6 +139,7 @@ struct tp_finger { | |||
| 139 | /* trackpad finger data size, empirically at least ten fingers */ | 139 | /* trackpad finger data size, empirically at least ten fingers */ |
| 140 | #define SIZEOF_FINGER sizeof(struct tp_finger) | 140 | #define SIZEOF_FINGER sizeof(struct tp_finger) |
| 141 | #define SIZEOF_ALL_FINGERS (16 * SIZEOF_FINGER) | 141 | #define SIZEOF_ALL_FINGERS (16 * SIZEOF_FINGER) |
| 142 | #define MAX_FINGER_ORIENTATION 16384 | ||
| 142 | 143 | ||
| 143 | /* device-specific parameters */ | 144 | /* device-specific parameters */ |
| 144 | struct bcm5974_param { | 145 | struct bcm5974_param { |
| @@ -284,6 +285,26 @@ static void setup_events_to_report(struct input_dev *input_dev, | |||
| 284 | input_set_abs_params(input_dev, ABS_Y, | 285 | input_set_abs_params(input_dev, ABS_Y, |
| 285 | 0, cfg->y.dim, cfg->y.fuzz, 0); | 286 | 0, cfg->y.dim, cfg->y.fuzz, 0); |
| 286 | 287 | ||
| 288 | /* finger touch area */ | ||
| 289 | input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR, | ||
| 290 | cfg->w.devmin, cfg->w.devmax, 0, 0); | ||
| 291 | input_set_abs_params(input_dev, ABS_MT_TOUCH_MINOR, | ||
| 292 | cfg->w.devmin, cfg->w.devmax, 0, 0); | ||
| 293 | /* finger approach area */ | ||
| 294 | input_set_abs_params(input_dev, ABS_MT_WIDTH_MAJOR, | ||
| 295 | cfg->w.devmin, cfg->w.devmax, 0, 0); | ||
| 296 | input_set_abs_params(input_dev, ABS_MT_WIDTH_MINOR, | ||
| 297 | cfg->w.devmin, cfg->w.devmax, 0, 0); | ||
| 298 | /* finger orientation */ | ||
| 299 | input_set_abs_params(input_dev, ABS_MT_ORIENTATION, | ||
| 300 | -MAX_FINGER_ORIENTATION, | ||
| 301 | MAX_FINGER_ORIENTATION, 0, 0); | ||
| 302 | /* finger position */ | ||
| 303 | input_set_abs_params(input_dev, ABS_MT_POSITION_X, | ||
| 304 | cfg->x.devmin, cfg->x.devmax, 0, 0); | ||
| 305 | input_set_abs_params(input_dev, ABS_MT_POSITION_Y, | ||
| 306 | cfg->y.devmin, cfg->y.devmax, 0, 0); | ||
| 307 | |||
| 287 | __set_bit(EV_KEY, input_dev->evbit); | 308 | __set_bit(EV_KEY, input_dev->evbit); |
| 288 | __set_bit(BTN_TOUCH, input_dev->keybit); | 309 | __set_bit(BTN_TOUCH, input_dev->keybit); |
| 289 | __set_bit(BTN_TOOL_FINGER, input_dev->keybit); | 310 | __set_bit(BTN_TOOL_FINGER, input_dev->keybit); |
| @@ -310,13 +331,29 @@ static int report_bt_state(struct bcm5974 *dev, int size) | |||
| 310 | return 0; | 331 | return 0; |
| 311 | } | 332 | } |
| 312 | 333 | ||
| 334 | static void report_finger_data(struct input_dev *input, | ||
| 335 | const struct bcm5974_config *cfg, | ||
| 336 | const struct tp_finger *f) | ||
| 337 | { | ||
| 338 | input_report_abs(input, ABS_MT_TOUCH_MAJOR, raw2int(f->force_major)); | ||
| 339 | input_report_abs(input, ABS_MT_TOUCH_MINOR, raw2int(f->force_minor)); | ||
| 340 | input_report_abs(input, ABS_MT_WIDTH_MAJOR, raw2int(f->size_major)); | ||
| 341 | input_report_abs(input, ABS_MT_WIDTH_MINOR, raw2int(f->size_minor)); | ||
| 342 | input_report_abs(input, ABS_MT_ORIENTATION, | ||
| 343 | MAX_FINGER_ORIENTATION - raw2int(f->orientation)); | ||
| 344 | input_report_abs(input, ABS_MT_POSITION_X, raw2int(f->abs_x)); | ||
| 345 | input_report_abs(input, ABS_MT_POSITION_Y, | ||
| 346 | cfg->y.devmin + cfg->y.devmax - raw2int(f->abs_y)); | ||
| 347 | input_mt_sync(input); | ||
| 348 | } | ||
| 349 | |||
| 313 | /* report trackpad data as logical trackpad state */ | 350 | /* report trackpad data as logical trackpad state */ |
| 314 | static int report_tp_state(struct bcm5974 *dev, int size) | 351 | static int report_tp_state(struct bcm5974 *dev, int size) |
| 315 | { | 352 | { |
| 316 | const struct bcm5974_config *c = &dev->cfg; | 353 | const struct bcm5974_config *c = &dev->cfg; |
| 317 | const struct tp_finger *f; | 354 | const struct tp_finger *f; |
| 318 | struct input_dev *input = dev->input; | 355 | struct input_dev *input = dev->input; |
| 319 | int raw_p, raw_w, raw_x, raw_y, raw_n; | 356 | int raw_p, raw_w, raw_x, raw_y, raw_n, i; |
| 320 | int ptest, origin, ibt = 0, nmin = 0, nmax = 0; | 357 | int ptest, origin, ibt = 0, nmin = 0, nmax = 0; |
| 321 | int abs_p = 0, abs_w = 0, abs_x = 0, abs_y = 0; | 358 | int abs_p = 0, abs_w = 0, abs_x = 0, abs_y = 0; |
| 322 | 359 | ||
| @@ -329,6 +366,11 @@ static int report_tp_state(struct bcm5974 *dev, int size) | |||
| 329 | 366 | ||
| 330 | /* always track the first finger; when detached, start over */ | 367 | /* always track the first finger; when detached, start over */ |
| 331 | if (raw_n) { | 368 | if (raw_n) { |
| 369 | |||
| 370 | /* report raw trackpad data */ | ||
| 371 | for (i = 0; i < raw_n; i++) | ||
| 372 | report_finger_data(input, c, &f[i]); | ||
| 373 | |||
| 332 | raw_p = raw2int(f->force_major); | 374 | raw_p = raw2int(f->force_major); |
| 333 | raw_w = raw2int(f->size_major); | 375 | raw_w = raw2int(f->size_major); |
| 334 | raw_x = raw2int(f->abs_x); | 376 | raw_x = raw2int(f->abs_x); |
diff --git a/drivers/input/mouse/lifebook.c b/drivers/input/mouse/lifebook.c index 6d7aa10d10f0..7c1d7d420ae3 100644 --- a/drivers/input/mouse/lifebook.c +++ b/drivers/input/mouse/lifebook.c | |||
| @@ -53,6 +53,12 @@ static const struct dmi_system_id __initconst lifebook_dmi_table[] = { | |||
| 53 | { | 53 | { |
| 54 | /* LifeBook B */ | 54 | /* LifeBook B */ |
| 55 | .matches = { | 55 | .matches = { |
| 56 | DMI_MATCH(DMI_PRODUCT_NAME, "Lifebook B Series"), | ||
| 57 | }, | ||
| 58 | }, | ||
| 59 | { | ||
| 60 | /* LifeBook B */ | ||
| 61 | .matches = { | ||
| 56 | DMI_MATCH(DMI_PRODUCT_NAME, "LifeBook B Series"), | 62 | DMI_MATCH(DMI_PRODUCT_NAME, "LifeBook B Series"), |
| 57 | }, | 63 | }, |
| 58 | }, | 64 | }, |
diff --git a/drivers/input/mouse/psmouse-base.c b/drivers/input/mouse/psmouse-base.c index 401ac6b6edd4..9774bdfaa482 100644 --- a/drivers/input/mouse/psmouse-base.c +++ b/drivers/input/mouse/psmouse-base.c | |||
| @@ -627,8 +627,15 @@ static int psmouse_extensions(struct psmouse *psmouse, | |||
| 627 | synaptics_hardware = true; | 627 | synaptics_hardware = true; |
| 628 | 628 | ||
| 629 | if (max_proto > PSMOUSE_IMEX) { | 629 | if (max_proto > PSMOUSE_IMEX) { |
| 630 | if (!set_properties || synaptics_init(psmouse) == 0) | 630 | /* |
| 631 | * Try activating protocol, but check if support is enabled first, since | ||
| 632 | * we try detecting Synaptics even when protocol is disabled. | ||
| 633 | */ | ||
| 634 | if (synaptics_supported() && | ||
| 635 | (!set_properties || synaptics_init(psmouse) == 0)) { | ||
| 631 | return PSMOUSE_SYNAPTICS; | 636 | return PSMOUSE_SYNAPTICS; |
| 637 | } | ||
| 638 | |||
| 632 | /* | 639 | /* |
| 633 | * Some Synaptics touchpads can emulate extended protocols (like IMPS/2). | 640 | * Some Synaptics touchpads can emulate extended protocols (like IMPS/2). |
| 634 | * Unfortunately Logitech/Genius probes confuse some firmware versions so | 641 | * Unfortunately Logitech/Genius probes confuse some firmware versions so |
| @@ -683,19 +690,6 @@ static int psmouse_extensions(struct psmouse *psmouse, | |||
| 683 | max_proto = PSMOUSE_IMEX; | 690 | max_proto = PSMOUSE_IMEX; |
| 684 | } | 691 | } |
| 685 | 692 | ||
| 686 | /* | ||
| 687 | * Try Finger Sensing Pad | ||
| 688 | */ | ||
| 689 | if (max_proto > PSMOUSE_IMEX) { | ||
| 690 | if (fsp_detect(psmouse, set_properties) == 0) { | ||
| 691 | if (!set_properties || fsp_init(psmouse) == 0) | ||
| 692 | return PSMOUSE_FSP; | ||
| 693 | /* | ||
| 694 | * Init failed, try basic relative protocols | ||
| 695 | */ | ||
| 696 | max_proto = PSMOUSE_IMEX; | ||
| 697 | } | ||
| 698 | } | ||
| 699 | 693 | ||
| 700 | if (max_proto > PSMOUSE_IMEX) { | 694 | if (max_proto > PSMOUSE_IMEX) { |
| 701 | if (genius_detect(psmouse, set_properties) == 0) | 695 | if (genius_detect(psmouse, set_properties) == 0) |
| @@ -712,6 +706,21 @@ static int psmouse_extensions(struct psmouse *psmouse, | |||
| 712 | } | 706 | } |
| 713 | 707 | ||
| 714 | /* | 708 | /* |
| 709 | * Try Finger Sensing Pad. We do it here because its probe upsets | ||
| 710 | * Trackpoint devices (causing TP_READ_ID command to time out). | ||
| 711 | */ | ||
| 712 | if (max_proto > PSMOUSE_IMEX) { | ||
| 713 | if (fsp_detect(psmouse, set_properties) == 0) { | ||
| 714 | if (!set_properties || fsp_init(psmouse) == 0) | ||
| 715 | return PSMOUSE_FSP; | ||
| 716 | /* | ||
| 717 | * Init failed, try basic relative protocols | ||
| 718 | */ | ||
| 719 | max_proto = PSMOUSE_IMEX; | ||
| 720 | } | ||
| 721 | } | ||
| 722 | |||
| 723 | /* | ||
| 715 | * Reset to defaults in case the device got confused by extended | 724 | * Reset to defaults in case the device got confused by extended |
| 716 | * protocol probes. Note that we follow up with full reset because | 725 | * protocol probes. Note that we follow up with full reset because |
| 717 | * some mice put themselves to sleep when they see PSMOUSE_RESET_DIS. | 726 | * some mice put themselves to sleep when they see PSMOUSE_RESET_DIS. |
| @@ -1450,24 +1459,10 @@ ssize_t psmouse_attr_show_helper(struct device *dev, struct device_attribute *de | |||
| 1450 | struct serio *serio = to_serio_port(dev); | 1459 | struct serio *serio = to_serio_port(dev); |
| 1451 | struct psmouse_attribute *attr = to_psmouse_attr(devattr); | 1460 | struct psmouse_attribute *attr = to_psmouse_attr(devattr); |
| 1452 | struct psmouse *psmouse; | 1461 | struct psmouse *psmouse; |
| 1453 | int retval; | ||
| 1454 | |||
| 1455 | retval = serio_pin_driver(serio); | ||
| 1456 | if (retval) | ||
| 1457 | return retval; | ||
| 1458 | |||
| 1459 | if (serio->drv != &psmouse_drv) { | ||
| 1460 | retval = -ENODEV; | ||
| 1461 | goto out; | ||
| 1462 | } | ||
| 1463 | 1462 | ||
| 1464 | psmouse = serio_get_drvdata(serio); | 1463 | psmouse = serio_get_drvdata(serio); |
| 1465 | 1464 | ||
| 1466 | retval = attr->show(psmouse, attr->data, buf); | 1465 | return attr->show(psmouse, attr->data, buf); |
| 1467 | |||
| 1468 | out: | ||
| 1469 | serio_unpin_driver(serio); | ||
| 1470 | return retval; | ||
| 1471 | } | 1466 | } |
| 1472 | 1467 | ||
| 1473 | ssize_t psmouse_attr_set_helper(struct device *dev, struct device_attribute *devattr, | 1468 | ssize_t psmouse_attr_set_helper(struct device *dev, struct device_attribute *devattr, |
| @@ -1478,18 +1473,9 @@ ssize_t psmouse_attr_set_helper(struct device *dev, struct device_attribute *dev | |||
| 1478 | struct psmouse *psmouse, *parent = NULL; | 1473 | struct psmouse *psmouse, *parent = NULL; |
| 1479 | int retval; | 1474 | int retval; |
| 1480 | 1475 | ||
| 1481 | retval = serio_pin_driver(serio); | ||
| 1482 | if (retval) | ||
| 1483 | return retval; | ||
| 1484 | |||
| 1485 | if (serio->drv != &psmouse_drv) { | ||
| 1486 | retval = -ENODEV; | ||
| 1487 | goto out_unpin; | ||
| 1488 | } | ||
| 1489 | |||
| 1490 | retval = mutex_lock_interruptible(&psmouse_mutex); | 1476 | retval = mutex_lock_interruptible(&psmouse_mutex); |
| 1491 | if (retval) | 1477 | if (retval) |
| 1492 | goto out_unpin; | 1478 | goto out; |
| 1493 | 1479 | ||
| 1494 | psmouse = serio_get_drvdata(serio); | 1480 | psmouse = serio_get_drvdata(serio); |
| 1495 | 1481 | ||
| @@ -1519,8 +1505,7 @@ ssize_t psmouse_attr_set_helper(struct device *dev, struct device_attribute *dev | |||
| 1519 | 1505 | ||
| 1520 | out_unlock: | 1506 | out_unlock: |
| 1521 | mutex_unlock(&psmouse_mutex); | 1507 | mutex_unlock(&psmouse_mutex); |
| 1522 | out_unpin: | 1508 | out: |
| 1523 | serio_unpin_driver(serio); | ||
| 1524 | return retval; | 1509 | return retval; |
| 1525 | } | 1510 | } |
| 1526 | 1511 | ||
| @@ -1582,9 +1567,7 @@ static ssize_t psmouse_attr_set_protocol(struct psmouse *psmouse, void *data, co | |||
| 1582 | } | 1567 | } |
| 1583 | 1568 | ||
| 1584 | mutex_unlock(&psmouse_mutex); | 1569 | mutex_unlock(&psmouse_mutex); |
| 1585 | serio_unpin_driver(serio); | ||
| 1586 | serio_unregister_child_port(serio); | 1570 | serio_unregister_child_port(serio); |
| 1587 | serio_pin_driver_uninterruptible(serio); | ||
| 1588 | mutex_lock(&psmouse_mutex); | 1571 | mutex_lock(&psmouse_mutex); |
| 1589 | 1572 | ||
| 1590 | if (serio->drv != &psmouse_drv) { | 1573 | if (serio->drv != &psmouse_drv) { |
diff --git a/drivers/input/mouse/sentelic.c b/drivers/input/mouse/sentelic.c index 77b9fd0b3fbf..81a6b81cb2fe 100644 --- a/drivers/input/mouse/sentelic.c +++ b/drivers/input/mouse/sentelic.c | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | * Finger Sensing Pad PS/2 mouse driver. | 2 | * Finger Sensing Pad PS/2 mouse driver. |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2005-2007 Asia Vital Components Co., Ltd. | 4 | * Copyright (C) 2005-2007 Asia Vital Components Co., Ltd. |
| 5 | * Copyright (C) 2005-2009 Tai-hwa Liang, Sentelic Corporation. | 5 | * Copyright (C) 2005-2010 Tai-hwa Liang, Sentelic Corporation. |
| 6 | * | 6 | * |
| 7 | * This program is free software; you can redistribute it and/or | 7 | * This program is free software; you can redistribute it and/or |
| 8 | * modify it under the terms of the GNU General Public License | 8 | * modify it under the terms of the GNU General Public License |
| @@ -658,9 +658,9 @@ static psmouse_ret_t fsp_process_byte(struct psmouse *psmouse) | |||
| 658 | if (packet[3] & BIT(1)) | 658 | if (packet[3] & BIT(1)) |
| 659 | button_status |= 0x0f; /* wheel up */ | 659 | button_status |= 0x0f; /* wheel up */ |
| 660 | if (packet[3] & BIT(2)) | 660 | if (packet[3] & BIT(2)) |
| 661 | button_status |= BIT(5);/* horizontal left */ | 661 | button_status |= BIT(4);/* horizontal left */ |
| 662 | if (packet[3] & BIT(3)) | 662 | if (packet[3] & BIT(3)) |
| 663 | button_status |= BIT(4);/* horizontal right */ | 663 | button_status |= BIT(5);/* horizontal right */ |
| 664 | /* push back to packet queue */ | 664 | /* push back to packet queue */ |
| 665 | if (button_status != 0) | 665 | if (button_status != 0) |
| 666 | packet[3] = button_status; | 666 | packet[3] = button_status; |
diff --git a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c index 05689e732191..d3f5243fa093 100644 --- a/drivers/input/mouse/synaptics.c +++ b/drivers/input/mouse/synaptics.c | |||
| @@ -743,6 +743,11 @@ int synaptics_init(struct psmouse *psmouse) | |||
| 743 | return -1; | 743 | return -1; |
| 744 | } | 744 | } |
| 745 | 745 | ||
| 746 | bool synaptics_supported(void) | ||
| 747 | { | ||
| 748 | return true; | ||
| 749 | } | ||
| 750 | |||
| 746 | #else /* CONFIG_MOUSE_PS2_SYNAPTICS */ | 751 | #else /* CONFIG_MOUSE_PS2_SYNAPTICS */ |
| 747 | 752 | ||
| 748 | void __init synaptics_module_init(void) | 753 | void __init synaptics_module_init(void) |
| @@ -754,5 +759,10 @@ int synaptics_init(struct psmouse *psmouse) | |||
| 754 | return -ENOSYS; | 759 | return -ENOSYS; |
| 755 | } | 760 | } |
| 756 | 761 | ||
| 762 | bool synaptics_supported(void) | ||
| 763 | { | ||
| 764 | return false; | ||
| 765 | } | ||
| 766 | |||
| 757 | #endif /* CONFIG_MOUSE_PS2_SYNAPTICS */ | 767 | #endif /* CONFIG_MOUSE_PS2_SYNAPTICS */ |
| 758 | 768 | ||
diff --git a/drivers/input/mouse/synaptics.h b/drivers/input/mouse/synaptics.h index 838e7f2c9b30..f0f40a331dc8 100644 --- a/drivers/input/mouse/synaptics.h +++ b/drivers/input/mouse/synaptics.h | |||
| @@ -109,5 +109,6 @@ void synaptics_module_init(void); | |||
| 109 | int synaptics_detect(struct psmouse *psmouse, bool set_properties); | 109 | int synaptics_detect(struct psmouse *psmouse, bool set_properties); |
| 110 | int synaptics_init(struct psmouse *psmouse); | 110 | int synaptics_init(struct psmouse *psmouse); |
| 111 | void synaptics_reset(struct psmouse *psmouse); | 111 | void synaptics_reset(struct psmouse *psmouse); |
| 112 | bool synaptics_supported(void); | ||
| 112 | 113 | ||
| 113 | #endif /* _SYNAPTICS_H */ | 114 | #endif /* _SYNAPTICS_H */ |
