@@ -899,24 +899,13 @@ static int uvc_ctrl_populate_cache(struct uvc_video_chain *chain,
899
899
return 0 ;
900
900
}
901
901
902
- int uvc_query_v4l2_ctrl (struct uvc_video_chain * chain ,
902
+ static int __uvc_query_v4l2_ctrl (struct uvc_video_chain * chain ,
903
+ struct uvc_control * ctrl ,
904
+ struct uvc_control_mapping * mapping ,
903
905
struct v4l2_queryctrl * v4l2_ctrl )
904
906
{
905
- struct uvc_control * ctrl ;
906
- struct uvc_control_mapping * mapping ;
907
907
struct uvc_menu_info * menu ;
908
908
unsigned int i ;
909
- int ret ;
910
-
911
- ret = mutex_lock_interruptible (& chain -> ctrl_mutex );
912
- if (ret < 0 )
913
- return - ERESTARTSYS ;
914
-
915
- ctrl = uvc_find_control (chain , v4l2_ctrl -> id , & mapping );
916
- if (ctrl == NULL ) {
917
- ret = - EINVAL ;
918
- goto done ;
919
- }
920
909
921
910
memset (v4l2_ctrl , 0 , sizeof * v4l2_ctrl );
922
911
v4l2_ctrl -> id = mapping -> id ;
@@ -930,9 +919,9 @@ int uvc_query_v4l2_ctrl(struct uvc_video_chain *chain,
930
919
v4l2_ctrl -> flags |= V4L2_CTRL_FLAG_READ_ONLY ;
931
920
932
921
if (!ctrl -> cached ) {
933
- ret = uvc_ctrl_populate_cache (chain , ctrl );
922
+ int ret = uvc_ctrl_populate_cache (chain , ctrl );
934
923
if (ret < 0 )
935
- goto done ;
924
+ return ret ;
936
925
}
937
926
938
927
if (ctrl -> info .flags & UVC_CTRL_FLAG_GET_DEF ) {
@@ -954,19 +943,19 @@ int uvc_query_v4l2_ctrl(struct uvc_video_chain *chain,
954
943
}
955
944
}
956
945
957
- goto done ;
946
+ return 0 ;
958
947
959
948
case V4L2_CTRL_TYPE_BOOLEAN :
960
949
v4l2_ctrl -> minimum = 0 ;
961
950
v4l2_ctrl -> maximum = 1 ;
962
951
v4l2_ctrl -> step = 1 ;
963
- goto done ;
952
+ return 0 ;
964
953
965
954
case V4L2_CTRL_TYPE_BUTTON :
966
955
v4l2_ctrl -> minimum = 0 ;
967
956
v4l2_ctrl -> maximum = 0 ;
968
957
v4l2_ctrl -> step = 0 ;
969
- goto done ;
958
+ return 0 ;
970
959
971
960
default :
972
961
break ;
@@ -984,6 +973,27 @@ int uvc_query_v4l2_ctrl(struct uvc_video_chain *chain,
984
973
v4l2_ctrl -> step = mapping -> get (mapping , UVC_GET_RES ,
985
974
uvc_ctrl_data (ctrl , UVC_CTRL_DATA_RES ));
986
975
976
+ return 0 ;
977
+ }
978
+
979
+ int uvc_query_v4l2_ctrl (struct uvc_video_chain * chain ,
980
+ struct v4l2_queryctrl * v4l2_ctrl )
981
+ {
982
+ struct uvc_control * ctrl ;
983
+ struct uvc_control_mapping * mapping ;
984
+ int ret ;
985
+
986
+ ret = mutex_lock_interruptible (& chain -> ctrl_mutex );
987
+ if (ret < 0 )
988
+ return - ERESTARTSYS ;
989
+
990
+ ctrl = uvc_find_control (chain , v4l2_ctrl -> id , & mapping );
991
+ if (ctrl == NULL ) {
992
+ ret = - EINVAL ;
993
+ goto done ;
994
+ }
995
+
996
+ ret = __uvc_query_v4l2_ctrl (chain , ctrl , mapping , v4l2_ctrl );
987
997
done :
988
998
mutex_unlock (& chain -> ctrl_mutex );
989
999
return ret ;
@@ -1148,17 +1158,15 @@ int __uvc_ctrl_commit(struct uvc_video_chain *chain, int rollback)
1148
1158
return ret ;
1149
1159
}
1150
1160
1151
- int uvc_ctrl_get (struct uvc_video_chain * chain ,
1152
- struct v4l2_ext_control * xctrl )
1161
+ static int __uvc_ctrl_get (struct uvc_video_chain * chain ,
1162
+ struct uvc_control * ctrl , struct uvc_control_mapping * mapping ,
1163
+ s32 * value )
1153
1164
{
1154
- struct uvc_control * ctrl ;
1155
- struct uvc_control_mapping * mapping ;
1156
1165
struct uvc_menu_info * menu ;
1157
1166
unsigned int i ;
1158
1167
int ret ;
1159
1168
1160
- ctrl = uvc_find_control (chain , xctrl -> id , & mapping );
1161
- if (ctrl == NULL || (ctrl -> info .flags & UVC_CTRL_FLAG_GET_CUR ) == 0 )
1169
+ if ((ctrl -> info .flags & UVC_CTRL_FLAG_GET_CUR ) == 0 )
1162
1170
return - EINVAL ;
1163
1171
1164
1172
if (!ctrl -> loaded ) {
@@ -1172,14 +1180,14 @@ int uvc_ctrl_get(struct uvc_video_chain *chain,
1172
1180
ctrl -> loaded = 1 ;
1173
1181
}
1174
1182
1175
- xctrl -> value = mapping -> get (mapping , UVC_GET_CUR ,
1183
+ * value = mapping -> get (mapping , UVC_GET_CUR ,
1176
1184
uvc_ctrl_data (ctrl , UVC_CTRL_DATA_CURRENT ));
1177
1185
1178
1186
if (mapping -> v4l2_type == V4L2_CTRL_TYPE_MENU ) {
1179
1187
menu = mapping -> menu_info ;
1180
1188
for (i = 0 ; i < mapping -> menu_count ; ++ i , ++ menu ) {
1181
- if (menu -> value == xctrl -> value ) {
1182
- xctrl -> value = i ;
1189
+ if (menu -> value == * value ) {
1190
+ * value = i ;
1183
1191
break ;
1184
1192
}
1185
1193
}
@@ -1188,6 +1196,19 @@ int uvc_ctrl_get(struct uvc_video_chain *chain,
1188
1196
return 0 ;
1189
1197
}
1190
1198
1199
+ int uvc_ctrl_get (struct uvc_video_chain * chain ,
1200
+ struct v4l2_ext_control * xctrl )
1201
+ {
1202
+ struct uvc_control * ctrl ;
1203
+ struct uvc_control_mapping * mapping ;
1204
+
1205
+ ctrl = uvc_find_control (chain , xctrl -> id , & mapping );
1206
+ if (ctrl == NULL )
1207
+ return - EINVAL ;
1208
+
1209
+ return __uvc_ctrl_get (chain , ctrl , mapping , & xctrl -> value );
1210
+ }
1211
+
1191
1212
int uvc_ctrl_set (struct uvc_video_chain * chain ,
1192
1213
struct v4l2_ext_control * xctrl )
1193
1214
{
0 commit comments