Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 35f1674

Browse files
jwrdegoedeMauro Carvalho Chehab
authored andcommitted
[media] uvcvideo: Refactor uvc_ctrl_get and query
This is a preparation patch for adding ctrl event support. Signed-off-by: Hans de Goede <[email protected]> Signed-off-by: Laurent Pinchart <[email protected]> Signed-off-by: Mauro Carvalho Chehab <[email protected]>
1 parent 57fb4a4 commit 35f1674

File tree

1 file changed

+49
-28
lines changed

1 file changed

+49
-28
lines changed

drivers/media/video/uvc/uvc_ctrl.c

Lines changed: 49 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -899,24 +899,13 @@ static int uvc_ctrl_populate_cache(struct uvc_video_chain *chain,
899899
return 0;
900900
}
901901

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,
903905
struct v4l2_queryctrl *v4l2_ctrl)
904906
{
905-
struct uvc_control *ctrl;
906-
struct uvc_control_mapping *mapping;
907907
struct uvc_menu_info *menu;
908908
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-
}
920909

921910
memset(v4l2_ctrl, 0, sizeof *v4l2_ctrl);
922911
v4l2_ctrl->id = mapping->id;
@@ -930,9 +919,9 @@ int uvc_query_v4l2_ctrl(struct uvc_video_chain *chain,
930919
v4l2_ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY;
931920

932921
if (!ctrl->cached) {
933-
ret = uvc_ctrl_populate_cache(chain, ctrl);
922+
int ret = uvc_ctrl_populate_cache(chain, ctrl);
934923
if (ret < 0)
935-
goto done;
924+
return ret;
936925
}
937926

938927
if (ctrl->info.flags & UVC_CTRL_FLAG_GET_DEF) {
@@ -954,19 +943,19 @@ int uvc_query_v4l2_ctrl(struct uvc_video_chain *chain,
954943
}
955944
}
956945

957-
goto done;
946+
return 0;
958947

959948
case V4L2_CTRL_TYPE_BOOLEAN:
960949
v4l2_ctrl->minimum = 0;
961950
v4l2_ctrl->maximum = 1;
962951
v4l2_ctrl->step = 1;
963-
goto done;
952+
return 0;
964953

965954
case V4L2_CTRL_TYPE_BUTTON:
966955
v4l2_ctrl->minimum = 0;
967956
v4l2_ctrl->maximum = 0;
968957
v4l2_ctrl->step = 0;
969-
goto done;
958+
return 0;
970959

971960
default:
972961
break;
@@ -984,6 +973,27 @@ int uvc_query_v4l2_ctrl(struct uvc_video_chain *chain,
984973
v4l2_ctrl->step = mapping->get(mapping, UVC_GET_RES,
985974
uvc_ctrl_data(ctrl, UVC_CTRL_DATA_RES));
986975

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);
987997
done:
988998
mutex_unlock(&chain->ctrl_mutex);
989999
return ret;
@@ -1148,17 +1158,15 @@ int __uvc_ctrl_commit(struct uvc_video_chain *chain, int rollback)
11481158
return ret;
11491159
}
11501160

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)
11531164
{
1154-
struct uvc_control *ctrl;
1155-
struct uvc_control_mapping *mapping;
11561165
struct uvc_menu_info *menu;
11571166
unsigned int i;
11581167
int ret;
11591168

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)
11621170
return -EINVAL;
11631171

11641172
if (!ctrl->loaded) {
@@ -1172,14 +1180,14 @@ int uvc_ctrl_get(struct uvc_video_chain *chain,
11721180
ctrl->loaded = 1;
11731181
}
11741182

1175-
xctrl->value = mapping->get(mapping, UVC_GET_CUR,
1183+
*value = mapping->get(mapping, UVC_GET_CUR,
11761184
uvc_ctrl_data(ctrl, UVC_CTRL_DATA_CURRENT));
11771185

11781186
if (mapping->v4l2_type == V4L2_CTRL_TYPE_MENU) {
11791187
menu = mapping->menu_info;
11801188
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;
11831191
break;
11841192
}
11851193
}
@@ -1188,6 +1196,19 @@ int uvc_ctrl_get(struct uvc_video_chain *chain,
11881196
return 0;
11891197
}
11901198

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+
11911212
int uvc_ctrl_set(struct uvc_video_chain *chain,
11921213
struct v4l2_ext_control *xctrl)
11931214
{

0 commit comments

Comments
 (0)