@@ -767,6 +767,7 @@ static const struct psmouse_protocol psmouse_protocols[] = {
767
767
.type = PSMOUSE_LIFEBOOK ,
768
768
.name = "LBPS/2" ,
769
769
.alias = "lifebook" ,
770
+ .detect = lifebook_detect ,
770
771
.init = lifebook_init ,
771
772
},
772
773
#endif
@@ -844,14 +845,25 @@ static const struct psmouse_protocol psmouse_protocols[] = {
844
845
},
845
846
};
846
847
847
- static const struct psmouse_protocol * psmouse_protocol_by_type (enum psmouse_type type )
848
+ static const struct psmouse_protocol * __psmouse_protocol_by_type (enum psmouse_type type )
848
849
{
849
850
int i ;
850
851
851
852
for (i = 0 ; i < ARRAY_SIZE (psmouse_protocols ); i ++ )
852
853
if (psmouse_protocols [i ].type == type )
853
854
return & psmouse_protocols [i ];
854
855
856
+ return NULL ;
857
+ }
858
+
859
+ static const struct psmouse_protocol * psmouse_protocol_by_type (enum psmouse_type type )
860
+ {
861
+ const struct psmouse_protocol * proto ;
862
+
863
+ proto = __psmouse_protocol_by_type (type );
864
+ if (proto )
865
+ return proto ;
866
+
855
867
WARN_ON (1 );
856
868
return & psmouse_protocols [0 ];
857
869
}
@@ -910,18 +922,37 @@ static void psmouse_apply_defaults(struct psmouse *psmouse)
910
922
psmouse -> pt_deactivate = NULL ;
911
923
}
912
924
913
- /*
914
- * Apply default settings to the psmouse structure and call specified
915
- * protocol detection or initialization routine.
916
- */
917
- static int psmouse_do_detect (int (* detect )(struct psmouse * psmouse ,
918
- bool set_properties ),
919
- struct psmouse * psmouse , bool set_properties )
925
+ static bool psmouse_try_protocol (struct psmouse * psmouse ,
926
+ enum psmouse_type type ,
927
+ unsigned int * max_proto ,
928
+ bool set_properties , bool init_allowed )
920
929
{
930
+ const struct psmouse_protocol * proto ;
931
+
932
+ proto = __psmouse_protocol_by_type (type );
933
+ if (!proto )
934
+ return false;
935
+
921
936
if (set_properties )
922
937
psmouse_apply_defaults (psmouse );
923
938
924
- return detect (psmouse , set_properties );
939
+ if (proto -> detect (psmouse , set_properties ) != 0 )
940
+ return false;
941
+
942
+ if (set_properties && proto -> init && init_allowed ) {
943
+ if (proto -> init (psmouse ) != 0 ) {
944
+ /*
945
+ * We detected device, but init failed. Adjust
946
+ * max_proto so we only try standard protocols.
947
+ */
948
+ if (* max_proto > PSMOUSE_IMEX )
949
+ * max_proto = PSMOUSE_IMEX ;
950
+
951
+ return false;
952
+ }
953
+ }
954
+
955
+ return true;
925
956
}
926
957
927
958
/*
@@ -937,12 +968,12 @@ static int psmouse_extensions(struct psmouse *psmouse,
937
968
* Always check for focaltech, this is safe as it uses pnp-id
938
969
* matching.
939
970
*/
940
- if (psmouse_do_detect ( focaltech_detect , psmouse , set_properties ) == 0 ) {
941
- if ( max_proto > PSMOUSE_IMEX ) {
942
- if (IS_ENABLED ( CONFIG_MOUSE_PS2_FOCALTECH ) &&
943
- (! set_properties || focaltech_init ( psmouse ) == 0 )) {
944
- return PSMOUSE_FOCALTECH ;
945
- }
971
+ if (psmouse_try_protocol ( psmouse , PSMOUSE_FOCALTECH ,
972
+ & max_proto , set_properties , false) ) {
973
+ if (max_proto > PSMOUSE_IMEX &&
974
+ IS_ENABLED ( CONFIG_MOUSE_PS2_FOCALTECH ) &&
975
+ (! set_properties || focaltech_init ( psmouse ) == 0 )) {
976
+ return PSMOUSE_FOCALTECH ;
946
977
}
947
978
/*
948
979
* Restrict psmouse_max_proto so that psmouse_initialize()
@@ -959,26 +990,21 @@ static int psmouse_extensions(struct psmouse *psmouse,
959
990
* We always check for LifeBook because it does not disturb mouse
960
991
* (it only checks DMI information).
961
992
*/
962
- if (psmouse_do_detect (lifebook_detect , psmouse , set_properties ) == 0 ) {
963
- if (max_proto > PSMOUSE_IMEX ) {
964
- if (!set_properties || lifebook_init (psmouse ) == 0 )
965
- return PSMOUSE_LIFEBOOK ;
966
- }
967
- }
993
+ if (psmouse_try_protocol (psmouse , PSMOUSE_LIFEBOOK , & max_proto ,
994
+ set_properties , max_proto > PSMOUSE_IMEX ))
995
+ return PSMOUSE_LIFEBOOK ;
968
996
969
- if (psmouse_do_detect (vmmouse_detect , psmouse , set_properties ) == 0 ) {
970
- if (max_proto > PSMOUSE_IMEX ) {
971
- if (!set_properties || vmmouse_init (psmouse ) == 0 )
972
- return PSMOUSE_VMMOUSE ;
973
- }
974
- }
997
+ if (psmouse_try_protocol (psmouse , PSMOUSE_VMMOUSE , & max_proto ,
998
+ set_properties , max_proto > PSMOUSE_IMEX ))
999
+ return PSMOUSE_VMMOUSE ;
975
1000
976
1001
/*
977
1002
* Try Kensington ThinkingMouse (we try first, because Synaptics
978
1003
* probe upsets the ThinkingMouse).
979
1004
*/
980
1005
if (max_proto > PSMOUSE_IMEX &&
981
- psmouse_do_detect (thinking_detect , psmouse , set_properties ) == 0 ) {
1006
+ psmouse_try_protocol (psmouse , PSMOUSE_THINKPS , & max_proto ,
1007
+ set_properties , true)) {
982
1008
return PSMOUSE_THINKPS ;
983
1009
}
984
1010
@@ -989,7 +1015,8 @@ static int psmouse_extensions(struct psmouse *psmouse,
989
1015
* probing for IntelliMouse.
990
1016
*/
991
1017
if (max_proto > PSMOUSE_PS2 &&
992
- psmouse_do_detect (synaptics_detect , psmouse , set_properties ) == 0 ) {
1018
+ psmouse_try_protocol (psmouse , PSMOUSE_SYNAPTICS , & max_proto ,
1019
+ set_properties , false)) {
993
1020
synaptics_hardware = true;
994
1021
995
1022
if (max_proto > PSMOUSE_IMEX ) {
@@ -1025,79 +1052,59 @@ static int psmouse_extensions(struct psmouse *psmouse,
1025
1052
* Trackpads.
1026
1053
*/
1027
1054
if (max_proto > PSMOUSE_IMEX &&
1028
- psmouse_do_detect (cypress_detect , psmouse , set_properties ) == 0 ) {
1029
- if (!set_properties || cypress_init (psmouse ) == 0 )
1030
- return PSMOUSE_CYPRESS ;
1031
-
1032
- /*
1033
- * Finger Sensing Pad probe upsets some modules of
1034
- * Cypress Trackpad, must avoid Finger Sensing Pad
1035
- * probe if Cypress Trackpad device detected.
1036
- */
1037
- max_proto = PSMOUSE_IMEX ;
1055
+ psmouse_try_protocol (psmouse , PSMOUSE_CYPRESS , & max_proto ,
1056
+ set_properties , true)) {
1057
+ return PSMOUSE_CYPRESS ;
1038
1058
}
1039
1059
1040
1060
/* Try ALPS TouchPad */
1041
1061
if (max_proto > PSMOUSE_IMEX ) {
1042
1062
ps2_command (& psmouse -> ps2dev , NULL , PSMOUSE_CMD_RESET_DIS );
1043
- if (psmouse_do_detect (alps_detect ,
1044
- psmouse , set_properties ) == 0 ) {
1045
- if (!set_properties || alps_init (psmouse ) == 0 )
1046
- return PSMOUSE_ALPS ;
1047
-
1048
- /* Init failed, try basic relative protocols */
1049
- max_proto = PSMOUSE_IMEX ;
1050
- }
1063
+ if (psmouse_try_protocol (psmouse , PSMOUSE_ALPS ,
1064
+ & max_proto , set_properties , true))
1065
+ return PSMOUSE_ALPS ;
1051
1066
}
1052
1067
1053
1068
/* Try OLPC HGPK touchpad */
1054
1069
if (max_proto > PSMOUSE_IMEX &&
1055
- psmouse_do_detect (hgpk_detect , psmouse , set_properties ) == 0 ) {
1056
- if (!set_properties || hgpk_init (psmouse ) == 0 )
1057
- return PSMOUSE_HGPK ;
1058
- /* Init failed, try basic relative protocols */
1059
- max_proto = PSMOUSE_IMEX ;
1070
+ psmouse_try_protocol (psmouse , PSMOUSE_HGPK , & max_proto ,
1071
+ set_properties , true)) {
1072
+ return PSMOUSE_HGPK ;
1060
1073
}
1061
1074
1062
1075
/* Try Elantech touchpad */
1063
1076
if (max_proto > PSMOUSE_IMEX &&
1064
- psmouse_do_detect (elantech_detect , psmouse , set_properties ) == 0 ) {
1065
- if (!set_properties || elantech_init (psmouse ) == 0 )
1066
- return PSMOUSE_ELANTECH ;
1067
- /* Init failed, try basic relative protocols */
1068
- max_proto = PSMOUSE_IMEX ;
1077
+ psmouse_try_protocol (psmouse , PSMOUSE_ELANTECH ,
1078
+ & max_proto , set_properties , true)) {
1079
+ return PSMOUSE_ELANTECH ;
1069
1080
}
1070
1081
1071
1082
if (max_proto > PSMOUSE_IMEX ) {
1072
- if (psmouse_do_detect ( genius_detect ,
1073
- psmouse , set_properties ) == 0 )
1083
+ if (psmouse_try_protocol ( psmouse , PSMOUSE_GENPS ,
1084
+ & max_proto , set_properties , true) )
1074
1085
return PSMOUSE_GENPS ;
1075
1086
1076
- if (psmouse_do_detect ( ps2pp_init ,
1077
- psmouse , set_properties ) == 0 )
1087
+ if (psmouse_try_protocol ( psmouse , PSMOUSE_PS2PP ,
1088
+ & max_proto , set_properties , true) )
1078
1089
return PSMOUSE_PS2PP ;
1079
1090
1080
- if (psmouse_do_detect ( trackpoint_detect ,
1081
- psmouse , set_properties ) == 0 )
1091
+ if (psmouse_try_protocol ( psmouse , PSMOUSE_TRACKPOINT ,
1092
+ & max_proto , set_properties , true) )
1082
1093
return PSMOUSE_TRACKPOINT ;
1083
1094
1084
- if (psmouse_do_detect ( touchkit_ps2_detect ,
1085
- psmouse , set_properties ) == 0 )
1095
+ if (psmouse_try_protocol ( psmouse , PSMOUSE_TOUCHKIT_PS2 ,
1096
+ & max_proto , set_properties , true) )
1086
1097
return PSMOUSE_TOUCHKIT_PS2 ;
1087
1098
}
1088
1099
1089
1100
/*
1090
1101
* Try Finger Sensing Pad. We do it here because its probe upsets
1091
1102
* Trackpoint devices (causing TP_READ_ID command to time out).
1092
1103
*/
1093
- if (max_proto > PSMOUSE_IMEX ) {
1094
- if (psmouse_do_detect (fsp_detect ,
1095
- psmouse , set_properties ) == 0 ) {
1096
- if (!set_properties || fsp_init (psmouse ) == 0 )
1097
- return PSMOUSE_FSP ;
1098
- /* Init failed, try basic relative protocols */
1099
- max_proto = PSMOUSE_IMEX ;
1100
- }
1104
+ if (max_proto > PSMOUSE_IMEX &&
1105
+ psmouse_try_protocol (psmouse , PSMOUSE_FSP ,
1106
+ & max_proto , set_properties , true)) {
1107
+ return PSMOUSE_FSP ;
1101
1108
}
1102
1109
1103
1110
/*
@@ -1109,22 +1116,23 @@ static int psmouse_extensions(struct psmouse *psmouse,
1109
1116
psmouse_reset (psmouse );
1110
1117
1111
1118
if (max_proto >= PSMOUSE_IMEX &&
1112
- psmouse_do_detect ( im_explorer_detect ,
1113
- psmouse , set_properties ) == 0 ) {
1119
+ psmouse_try_protocol ( psmouse , PSMOUSE_IMEX ,
1120
+ & max_proto , set_properties , true) ) {
1114
1121
return PSMOUSE_IMEX ;
1115
1122
}
1116
1123
1117
1124
if (max_proto >= PSMOUSE_IMPS &&
1118
- psmouse_do_detect ( intellimouse_detect ,
1119
- psmouse , set_properties ) == 0 ) {
1125
+ psmouse_try_protocol ( psmouse , PSMOUSE_IMPS ,
1126
+ & max_proto , set_properties , true) ) {
1120
1127
return PSMOUSE_IMPS ;
1121
1128
}
1122
1129
1123
1130
/*
1124
1131
* Okay, all failed, we have a standard mouse here. The number of
1125
1132
* the buttons is still a question, though. We assume 3.
1126
1133
*/
1127
- psmouse_do_detect (ps2bare_detect , psmouse , set_properties );
1134
+ psmouse_try_protocol (psmouse , PSMOUSE_PS2 ,
1135
+ & max_proto , set_properties , true);
1128
1136
1129
1137
if (synaptics_hardware ) {
1130
1138
/*
0 commit comments