diff options
-rw-r--r-- | drivers/input/mouse/psmouse-base.c | 193 |
1 files changed, 124 insertions, 69 deletions
diff --git a/drivers/input/mouse/psmouse-base.c b/drivers/input/mouse/psmouse-base.c index 200be9c9dbc7..de7e8bc17b1f 100644 --- a/drivers/input/mouse/psmouse-base.c +++ b/drivers/input/mouse/psmouse-base.c | |||
@@ -418,6 +418,49 @@ int psmouse_reset(struct psmouse *psmouse) | |||
418 | return 0; | 418 | return 0; |
419 | } | 419 | } |
420 | 420 | ||
421 | /* | ||
422 | * Here we set the mouse resolution. | ||
423 | */ | ||
424 | |||
425 | void psmouse_set_resolution(struct psmouse *psmouse, unsigned int resolution) | ||
426 | { | ||
427 | static const unsigned char params[] = { 0, 1, 2, 2, 3 }; | ||
428 | unsigned char p; | ||
429 | |||
430 | if (resolution == 0 || resolution > 200) | ||
431 | resolution = 200; | ||
432 | |||
433 | p = params[resolution / 50]; | ||
434 | ps2_command(&psmouse->ps2dev, &p, PSMOUSE_CMD_SETRES); | ||
435 | psmouse->resolution = 25 << p; | ||
436 | } | ||
437 | |||
438 | /* | ||
439 | * Here we set the mouse report rate. | ||
440 | */ | ||
441 | |||
442 | static void psmouse_set_rate(struct psmouse *psmouse, unsigned int rate) | ||
443 | { | ||
444 | static const unsigned char rates[] = { 200, 100, 80, 60, 40, 20, 10, 0 }; | ||
445 | unsigned char r; | ||
446 | int i = 0; | ||
447 | |||
448 | while (rates[i] > rate) i++; | ||
449 | r = rates[i]; | ||
450 | ps2_command(&psmouse->ps2dev, &r, PSMOUSE_CMD_SETRATE); | ||
451 | psmouse->rate = r; | ||
452 | } | ||
453 | |||
454 | /* | ||
455 | * psmouse_poll() - default poll handler. Everyone except for ALPS uses it. | ||
456 | */ | ||
457 | |||
458 | static int psmouse_poll(struct psmouse *psmouse) | ||
459 | { | ||
460 | return ps2_command(&psmouse->ps2dev, psmouse->packet, | ||
461 | PSMOUSE_CMD_POLL | (psmouse->pktsize << 8)); | ||
462 | } | ||
463 | |||
421 | 464 | ||
422 | /* | 465 | /* |
423 | * Genius NetMouse magic init. | 466 | * Genius NetMouse magic init. |
@@ -603,6 +646,56 @@ static int cortron_detect(struct psmouse *psmouse, bool set_properties) | |||
603 | } | 646 | } |
604 | 647 | ||
605 | /* | 648 | /* |
649 | * Apply default settings to the psmouse structure. Most of them will | ||
650 | * be overridden by individual protocol initialization routines. | ||
651 | */ | ||
652 | |||
653 | static void psmouse_apply_defaults(struct psmouse *psmouse) | ||
654 | { | ||
655 | struct input_dev *input_dev = psmouse->dev; | ||
656 | |||
657 | memset(input_dev->evbit, 0, sizeof(input_dev->evbit)); | ||
658 | memset(input_dev->keybit, 0, sizeof(input_dev->keybit)); | ||
659 | memset(input_dev->relbit, 0, sizeof(input_dev->relbit)); | ||
660 | memset(input_dev->absbit, 0, sizeof(input_dev->absbit)); | ||
661 | memset(input_dev->mscbit, 0, sizeof(input_dev->mscbit)); | ||
662 | |||
663 | __set_bit(EV_KEY, input_dev->evbit); | ||
664 | __set_bit(EV_REL, input_dev->evbit); | ||
665 | |||
666 | __set_bit(BTN_LEFT, input_dev->keybit); | ||
667 | __set_bit(BTN_RIGHT, input_dev->keybit); | ||
668 | |||
669 | __set_bit(REL_X, input_dev->relbit); | ||
670 | __set_bit(REL_Y, input_dev->relbit); | ||
671 | |||
672 | psmouse->set_rate = psmouse_set_rate; | ||
673 | psmouse->set_resolution = psmouse_set_resolution; | ||
674 | psmouse->poll = psmouse_poll; | ||
675 | psmouse->protocol_handler = psmouse_process_byte; | ||
676 | psmouse->pktsize = 3; | ||
677 | psmouse->reconnect = NULL; | ||
678 | psmouse->disconnect = NULL; | ||
679 | psmouse->cleanup = NULL; | ||
680 | psmouse->pt_activate = NULL; | ||
681 | psmouse->pt_deactivate = NULL; | ||
682 | } | ||
683 | |||
684 | /* | ||
685 | * Apply default settings to the psmouse structure and call specified | ||
686 | * protocol detection or initialization routine. | ||
687 | */ | ||
688 | static int psmouse_do_detect(int (*detect)(struct psmouse *psmouse, | ||
689 | bool set_properties), | ||
690 | struct psmouse *psmouse, bool set_properties) | ||
691 | { | ||
692 | if (set_properties) | ||
693 | psmouse_apply_defaults(psmouse); | ||
694 | |||
695 | return detect(psmouse, set_properties); | ||
696 | } | ||
697 | |||
698 | /* | ||
606 | * psmouse_extensions() probes for any extensions to the basic PS/2 protocol | 699 | * psmouse_extensions() probes for any extensions to the basic PS/2 protocol |
607 | * the mouse may have. | 700 | * the mouse may have. |
608 | */ | 701 | */ |
@@ -616,7 +709,7 @@ static int psmouse_extensions(struct psmouse *psmouse, | |||
616 | * We always check for lifebook because it does not disturb mouse | 709 | * We always check for lifebook because it does not disturb mouse |
617 | * (it only checks DMI information). | 710 | * (it only checks DMI information). |
618 | */ | 711 | */ |
619 | if (lifebook_detect(psmouse, set_properties) == 0) { | 712 | if (psmouse_do_detect(lifebook_detect, psmouse, set_properties) == 0) { |
620 | if (max_proto > PSMOUSE_IMEX) { | 713 | if (max_proto > PSMOUSE_IMEX) { |
621 | if (!set_properties || lifebook_init(psmouse) == 0) | 714 | if (!set_properties || lifebook_init(psmouse) == 0) |
622 | return PSMOUSE_LIFEBOOK; | 715 | return PSMOUSE_LIFEBOOK; |
@@ -628,15 +721,18 @@ static int psmouse_extensions(struct psmouse *psmouse, | |||
628 | * upsets the thinkingmouse). | 721 | * upsets the thinkingmouse). |
629 | */ | 722 | */ |
630 | 723 | ||
631 | if (max_proto > PSMOUSE_IMEX && thinking_detect(psmouse, set_properties) == 0) | 724 | if (max_proto > PSMOUSE_IMEX && |
725 | psmouse_do_detect(thinking_detect, psmouse, set_properties) == 0) { | ||
632 | return PSMOUSE_THINKPS; | 726 | return PSMOUSE_THINKPS; |
727 | } | ||
633 | 728 | ||
634 | /* | 729 | /* |
635 | * Try Synaptics TouchPad. Note that probing is done even if Synaptics protocol | 730 | * Try Synaptics TouchPad. Note that probing is done even if Synaptics protocol |
636 | * support is disabled in config - we need to know if it is synaptics so we | 731 | * support is disabled in config - we need to know if it is synaptics so we |
637 | * can reset it properly after probing for intellimouse. | 732 | * can reset it properly after probing for intellimouse. |
638 | */ | 733 | */ |
639 | if (max_proto > PSMOUSE_PS2 && synaptics_detect(psmouse, set_properties) == 0) { | 734 | if (max_proto > PSMOUSE_PS2 && |
735 | psmouse_do_detect(synaptics_detect, psmouse, set_properties) == 0) { | ||
640 | synaptics_hardware = true; | 736 | synaptics_hardware = true; |
641 | 737 | ||
642 | if (max_proto > PSMOUSE_IMEX) { | 738 | if (max_proto > PSMOUSE_IMEX) { |
@@ -667,7 +763,8 @@ static int psmouse_extensions(struct psmouse *psmouse, | |||
667 | */ | 763 | */ |
668 | if (max_proto > PSMOUSE_IMEX) { | 764 | if (max_proto > PSMOUSE_IMEX) { |
669 | ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_RESET_DIS); | 765 | ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_RESET_DIS); |
670 | if (alps_detect(psmouse, set_properties) == 0) { | 766 | if (psmouse_do_detect(alps_detect, |
767 | psmouse, set_properties) == 0) { | ||
671 | if (!set_properties || alps_init(psmouse) == 0) | 768 | if (!set_properties || alps_init(psmouse) == 0) |
672 | return PSMOUSE_ALPS; | 769 | return PSMOUSE_ALPS; |
673 | /* | 770 | /* |
@@ -681,7 +778,7 @@ static int psmouse_extensions(struct psmouse *psmouse, | |||
681 | * Try OLPC HGPK touchpad. | 778 | * Try OLPC HGPK touchpad. |
682 | */ | 779 | */ |
683 | if (max_proto > PSMOUSE_IMEX && | 780 | if (max_proto > PSMOUSE_IMEX && |
684 | hgpk_detect(psmouse, set_properties) == 0) { | 781 | psmouse_do_detect(hgpk_detect, psmouse, set_properties) == 0) { |
685 | if (!set_properties || hgpk_init(psmouse) == 0) | 782 | if (!set_properties || hgpk_init(psmouse) == 0) |
686 | return PSMOUSE_HGPK; | 783 | return PSMOUSE_HGPK; |
687 | /* | 784 | /* |
@@ -694,7 +791,7 @@ static int psmouse_extensions(struct psmouse *psmouse, | |||
694 | * Try Elantech touchpad. | 791 | * Try Elantech touchpad. |
695 | */ | 792 | */ |
696 | if (max_proto > PSMOUSE_IMEX && | 793 | if (max_proto > PSMOUSE_IMEX && |
697 | elantech_detect(psmouse, set_properties) == 0) { | 794 | psmouse_do_detect(elantech_detect, psmouse, set_properties) == 0) { |
698 | if (!set_properties || elantech_init(psmouse) == 0) | 795 | if (!set_properties || elantech_init(psmouse) == 0) |
699 | return PSMOUSE_ELANTECH; | 796 | return PSMOUSE_ELANTECH; |
700 | /* | 797 | /* |
@@ -703,18 +800,21 @@ static int psmouse_extensions(struct psmouse *psmouse, | |||
703 | max_proto = PSMOUSE_IMEX; | 800 | max_proto = PSMOUSE_IMEX; |
704 | } | 801 | } |
705 | 802 | ||
706 | |||
707 | if (max_proto > PSMOUSE_IMEX) { | 803 | if (max_proto > PSMOUSE_IMEX) { |
708 | if (genius_detect(psmouse, set_properties) == 0) | 804 | if (psmouse_do_detect(genius_detect, |
805 | psmouse, set_properties) == 0) | ||
709 | return PSMOUSE_GENPS; | 806 | return PSMOUSE_GENPS; |
710 | 807 | ||
711 | if (ps2pp_init(psmouse, set_properties) == 0) | 808 | if (psmouse_do_detect(ps2pp_init, |
809 | psmouse, set_properties) == 0) | ||
712 | return PSMOUSE_PS2PP; | 810 | return PSMOUSE_PS2PP; |
713 | 811 | ||
714 | if (trackpoint_detect(psmouse, set_properties) == 0) | 812 | if (psmouse_do_detect(trackpoint_detect, |
813 | psmouse, set_properties) == 0) | ||
715 | return PSMOUSE_TRACKPOINT; | 814 | return PSMOUSE_TRACKPOINT; |
716 | 815 | ||
717 | if (touchkit_ps2_detect(psmouse, set_properties) == 0) | 816 | if (psmouse_do_detect(touchkit_ps2_detect, |
817 | psmouse, set_properties) == 0) | ||
718 | return PSMOUSE_TOUCHKIT_PS2; | 818 | return PSMOUSE_TOUCHKIT_PS2; |
719 | } | 819 | } |
720 | 820 | ||
@@ -723,7 +823,8 @@ static int psmouse_extensions(struct psmouse *psmouse, | |||
723 | * Trackpoint devices (causing TP_READ_ID command to time out). | 823 | * Trackpoint devices (causing TP_READ_ID command to time out). |
724 | */ | 824 | */ |
725 | if (max_proto > PSMOUSE_IMEX) { | 825 | if (max_proto > PSMOUSE_IMEX) { |
726 | if (fsp_detect(psmouse, set_properties) == 0) { | 826 | if (psmouse_do_detect(fsp_detect, |
827 | psmouse, set_properties) == 0) { | ||
727 | if (!set_properties || fsp_init(psmouse) == 0) | 828 | if (!set_properties || fsp_init(psmouse) == 0) |
728 | return PSMOUSE_FSP; | 829 | return PSMOUSE_FSP; |
729 | /* | 830 | /* |
@@ -741,17 +842,23 @@ static int psmouse_extensions(struct psmouse *psmouse, | |||
741 | ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_RESET_DIS); | 842 | ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_RESET_DIS); |
742 | psmouse_reset(psmouse); | 843 | psmouse_reset(psmouse); |
743 | 844 | ||
744 | if (max_proto >= PSMOUSE_IMEX && im_explorer_detect(psmouse, set_properties) == 0) | 845 | if (max_proto >= PSMOUSE_IMEX && |
846 | psmouse_do_detect(im_explorer_detect, | ||
847 | psmouse, set_properties) == 0) { | ||
745 | return PSMOUSE_IMEX; | 848 | return PSMOUSE_IMEX; |
849 | } | ||
746 | 850 | ||
747 | if (max_proto >= PSMOUSE_IMPS && intellimouse_detect(psmouse, set_properties) == 0) | 851 | if (max_proto >= PSMOUSE_IMPS && |
852 | psmouse_do_detect(intellimouse_detect, | ||
853 | psmouse, set_properties) == 0) { | ||
748 | return PSMOUSE_IMPS; | 854 | return PSMOUSE_IMPS; |
855 | } | ||
749 | 856 | ||
750 | /* | 857 | /* |
751 | * Okay, all failed, we have a standard mouse here. The number of the buttons | 858 | * Okay, all failed, we have a standard mouse here. The number of the buttons |
752 | * is still a question, though. We assume 3. | 859 | * is still a question, though. We assume 3. |
753 | */ | 860 | */ |
754 | ps2bare_detect(psmouse, set_properties); | 861 | psmouse_do_detect(ps2bare_detect, psmouse, set_properties); |
755 | 862 | ||
756 | if (synaptics_hardware) { | 863 | if (synaptics_hardware) { |
757 | /* | 864 | /* |
@@ -965,39 +1072,6 @@ static int psmouse_probe(struct psmouse *psmouse) | |||
965 | } | 1072 | } |
966 | 1073 | ||
967 | /* | 1074 | /* |
968 | * Here we set the mouse resolution. | ||
969 | */ | ||
970 | |||
971 | void psmouse_set_resolution(struct psmouse *psmouse, unsigned int resolution) | ||
972 | { | ||
973 | static const unsigned char params[] = { 0, 1, 2, 2, 3 }; | ||
974 | unsigned char p; | ||
975 | |||
976 | if (resolution == 0 || resolution > 200) | ||
977 | resolution = 200; | ||
978 | |||
979 | p = params[resolution / 50]; | ||
980 | ps2_command(&psmouse->ps2dev, &p, PSMOUSE_CMD_SETRES); | ||
981 | psmouse->resolution = 25 << p; | ||
982 | } | ||
983 | |||
984 | /* | ||
985 | * Here we set the mouse report rate. | ||
986 | */ | ||
987 | |||
988 | static void psmouse_set_rate(struct psmouse *psmouse, unsigned int rate) | ||
989 | { | ||
990 | static const unsigned char rates[] = { 200, 100, 80, 60, 40, 20, 10, 0 }; | ||
991 | unsigned char r; | ||
992 | int i = 0; | ||
993 | |||
994 | while (rates[i] > rate) i++; | ||
995 | r = rates[i]; | ||
996 | ps2_command(&psmouse->ps2dev, &r, PSMOUSE_CMD_SETRATE); | ||
997 | psmouse->rate = r; | ||
998 | } | ||
999 | |||
1000 | /* | ||
1001 | * psmouse_initialize() initializes the mouse to a sane state. | 1075 | * psmouse_initialize() initializes the mouse to a sane state. |
1002 | */ | 1076 | */ |
1003 | 1077 | ||
@@ -1042,16 +1116,6 @@ static void psmouse_deactivate(struct psmouse *psmouse) | |||
1042 | psmouse_set_state(psmouse, PSMOUSE_CMD_MODE); | 1116 | psmouse_set_state(psmouse, PSMOUSE_CMD_MODE); |
1043 | } | 1117 | } |
1044 | 1118 | ||
1045 | /* | ||
1046 | * psmouse_poll() - default poll handler. Everyone except for ALPS uses it. | ||
1047 | */ | ||
1048 | |||
1049 | static int psmouse_poll(struct psmouse *psmouse) | ||
1050 | { | ||
1051 | return ps2_command(&psmouse->ps2dev, psmouse->packet, | ||
1052 | PSMOUSE_CMD_POLL | (psmouse->pktsize << 8)); | ||
1053 | } | ||
1054 | |||
1055 | 1119 | ||
1056 | /* | 1120 | /* |
1057 | * psmouse_resync() attempts to re-validate current protocol. | 1121 | * psmouse_resync() attempts to re-validate current protocol. |
@@ -1252,18 +1316,9 @@ static int psmouse_switch_protocol(struct psmouse *psmouse, | |||
1252 | 1316 | ||
1253 | input_dev->dev.parent = &psmouse->ps2dev.serio->dev; | 1317 | input_dev->dev.parent = &psmouse->ps2dev.serio->dev; |
1254 | 1318 | ||
1255 | input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REL); | ||
1256 | input_dev->keybit[BIT_WORD(BTN_MOUSE)] = | ||
1257 | BIT_MASK(BTN_LEFT) | BIT_MASK(BTN_RIGHT); | ||
1258 | input_dev->relbit[0] = BIT_MASK(REL_X) | BIT_MASK(REL_Y); | ||
1259 | |||
1260 | psmouse->set_rate = psmouse_set_rate; | ||
1261 | psmouse->set_resolution = psmouse_set_resolution; | ||
1262 | psmouse->poll = psmouse_poll; | ||
1263 | psmouse->protocol_handler = psmouse_process_byte; | ||
1264 | psmouse->pktsize = 3; | ||
1265 | |||
1266 | if (proto && (proto->detect || proto->init)) { | 1319 | if (proto && (proto->detect || proto->init)) { |
1320 | psmouse_apply_defaults(psmouse); | ||
1321 | |||
1267 | if (proto->detect && proto->detect(psmouse, true) < 0) | 1322 | if (proto->detect && proto->detect(psmouse, true) < 0) |
1268 | return -1; | 1323 | return -1; |
1269 | 1324 | ||