UPSTREAM: media: uvcvideo: let v4l2_query_v4l2_ctrl() work with v4l2_query_ext_ctrl
v4l2_query_ext_ctrl contains information that is missing in v4l2_queryctrl, like elem_size and elems. With this change we can handle all the element_size information inside uvc_ctrl.c. Now that we are at it, remove the memset of the reserved fields, the v4l2 ioctl handler should do that for us. There is no functional change expected from this change. Reviewed-by: Yunke Cao <yunkec@google.com> Tested-by: Yunke Cao <yunkec@google.com> Reviewed-by: Hans de Goede <hdegoede@redhat.com> Signed-off-by: Ricardo Ribalda <ribalda@chromium.org> Link: https://lore.kernel.org/r/20250203-uvc-roi-v17-13-5900a9fed613@chromium.org Signed-off-by: Hans de Goede <hdegoede@redhat.com> Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl> (cherry picked from commit 1fde21ea0b4fe48da6f3b537d57e5d063d122328) Bug: 381493003 Bug: 408968367 Change-Id: Ie589f6eb68c3b6305cc349b5167a34e4dfb84a54 Signed-off-by: Ricardo Ribalda <ribalda@google.com>
This commit is contained in:
committed by
Carlos Llamas
parent
0d472158ef
commit
bda9af2d35
@@ -1259,7 +1259,8 @@ static int __uvc_query_v4l2_class(struct uvc_video_chain *chain, u32 req_id,
|
||||
}
|
||||
|
||||
static int uvc_query_v4l2_class(struct uvc_video_chain *chain, u32 req_id,
|
||||
u32 found_id, struct v4l2_queryctrl *v4l2_ctrl)
|
||||
u32 found_id,
|
||||
struct v4l2_query_ext_ctrl *v4l2_ctrl)
|
||||
{
|
||||
int idx;
|
||||
|
||||
@@ -1407,7 +1408,7 @@ static u32 uvc_get_ctrl_bitmap(struct uvc_control *ctrl,
|
||||
static int __uvc_queryctrl_boundaries(struct uvc_video_chain *chain,
|
||||
struct uvc_control *ctrl,
|
||||
struct uvc_control_mapping *mapping,
|
||||
struct v4l2_queryctrl *v4l2_ctrl)
|
||||
struct v4l2_query_ext_ctrl *v4l2_ctrl)
|
||||
{
|
||||
if (!ctrl->cached) {
|
||||
int ret = uvc_ctrl_populate_cache(chain, ctrl);
|
||||
@@ -1473,7 +1474,7 @@ static int __uvc_queryctrl_boundaries(struct uvc_video_chain *chain,
|
||||
static int __uvc_query_v4l2_ctrl(struct uvc_video_chain *chain,
|
||||
struct uvc_control *ctrl,
|
||||
struct uvc_control_mapping *mapping,
|
||||
struct v4l2_queryctrl *v4l2_ctrl)
|
||||
struct v4l2_query_ext_ctrl *v4l2_ctrl)
|
||||
{
|
||||
struct uvc_control_mapping *master_map = NULL;
|
||||
struct uvc_control *master_ctrl = NULL;
|
||||
@@ -1511,6 +1512,9 @@ static int __uvc_query_v4l2_ctrl(struct uvc_video_chain *chain,
|
||||
v4l2_ctrl->flags |= V4L2_CTRL_FLAG_INACTIVE;
|
||||
}
|
||||
|
||||
v4l2_ctrl->elem_size = sizeof(s32);
|
||||
v4l2_ctrl->elems = 1;
|
||||
|
||||
if (v4l2_ctrl->type >= V4L2_CTRL_COMPOUND_TYPES) {
|
||||
v4l2_ctrl->flags |= V4L2_CTRL_FLAG_HAS_PAYLOAD;
|
||||
v4l2_ctrl->default_value = 0;
|
||||
@@ -1524,7 +1528,7 @@ static int __uvc_query_v4l2_ctrl(struct uvc_video_chain *chain,
|
||||
}
|
||||
|
||||
int uvc_query_v4l2_ctrl(struct uvc_video_chain *chain,
|
||||
struct v4l2_queryctrl *v4l2_ctrl)
|
||||
struct v4l2_query_ext_ctrl *v4l2_ctrl)
|
||||
{
|
||||
struct uvc_control *ctrl;
|
||||
struct uvc_control_mapping *mapping;
|
||||
@@ -1650,7 +1654,7 @@ static void uvc_ctrl_fill_event(struct uvc_video_chain *chain,
|
||||
struct uvc_control_mapping *mapping,
|
||||
s32 value, u32 changes)
|
||||
{
|
||||
struct v4l2_queryctrl v4l2_ctrl;
|
||||
struct v4l2_query_ext_ctrl v4l2_ctrl;
|
||||
|
||||
__uvc_query_v4l2_ctrl(chain, ctrl, mapping, &v4l2_ctrl);
|
||||
|
||||
@@ -2172,7 +2176,7 @@ static int uvc_mapping_get_xctrl_std(struct uvc_video_chain *chain,
|
||||
struct uvc_control_mapping *mapping,
|
||||
u32 which, struct v4l2_ext_control *xctrl)
|
||||
{
|
||||
struct v4l2_queryctrl qc;
|
||||
struct v4l2_query_ext_ctrl qec;
|
||||
int ret;
|
||||
|
||||
switch (which) {
|
||||
@@ -2186,19 +2190,19 @@ static int uvc_mapping_get_xctrl_std(struct uvc_video_chain *chain,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
ret = __uvc_queryctrl_boundaries(chain, ctrl, mapping, &qc);
|
||||
ret = __uvc_queryctrl_boundaries(chain, ctrl, mapping, &qec);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
switch (which) {
|
||||
case V4L2_CTRL_WHICH_DEF_VAL:
|
||||
xctrl->value = qc.default_value;
|
||||
xctrl->value = qec.default_value;
|
||||
break;
|
||||
case V4L2_CTRL_WHICH_MIN_VAL:
|
||||
xctrl->value = qc.minimum;
|
||||
xctrl->value = qec.minimum;
|
||||
break;
|
||||
case V4L2_CTRL_WHICH_MAX_VAL:
|
||||
xctrl->value = qc.maximum;
|
||||
xctrl->value = qec.maximum;
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
@@ -1026,40 +1026,35 @@ static int uvc_ioctl_s_input(struct file *file, void *fh, unsigned int input)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int uvc_ioctl_queryctrl(struct file *file, void *fh,
|
||||
struct v4l2_queryctrl *qc)
|
||||
{
|
||||
struct uvc_fh *handle = fh;
|
||||
struct uvc_video_chain *chain = handle->chain;
|
||||
|
||||
return uvc_query_v4l2_ctrl(chain, qc);
|
||||
}
|
||||
|
||||
static int uvc_ioctl_query_ext_ctrl(struct file *file, void *fh,
|
||||
struct v4l2_query_ext_ctrl *qec)
|
||||
{
|
||||
struct uvc_fh *handle = fh;
|
||||
struct uvc_video_chain *chain = handle->chain;
|
||||
struct v4l2_queryctrl qc = { qec->id };
|
||||
|
||||
return uvc_query_v4l2_ctrl(chain, qec);
|
||||
}
|
||||
|
||||
static int uvc_ioctl_queryctrl(struct file *file, void *fh,
|
||||
struct v4l2_queryctrl *qc)
|
||||
{
|
||||
struct uvc_fh *handle = fh;
|
||||
struct uvc_video_chain *chain = handle->chain;
|
||||
struct v4l2_query_ext_ctrl qec = { qc->id };
|
||||
int ret;
|
||||
|
||||
ret = uvc_query_v4l2_ctrl(chain, &qc);
|
||||
ret = uvc_query_v4l2_ctrl(chain, &qec);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
qec->id = qc.id;
|
||||
qec->type = qc.type;
|
||||
strscpy(qec->name, qc.name, sizeof(qec->name));
|
||||
qec->minimum = qc.minimum;
|
||||
qec->maximum = qc.maximum;
|
||||
qec->step = qc.step;
|
||||
qec->default_value = qc.default_value;
|
||||
qec->flags = qc.flags;
|
||||
qec->elem_size = 4;
|
||||
qec->elems = 1;
|
||||
qec->nr_of_dims = 0;
|
||||
memset(qec->dims, 0, sizeof(qec->dims));
|
||||
memset(qec->reserved, 0, sizeof(qec->reserved));
|
||||
qc->id = qec.id;
|
||||
qc->type = qec.type;
|
||||
strscpy(qc->name, qec.name, sizeof(qc->name));
|
||||
qc->minimum = qec.minimum;
|
||||
qc->maximum = qec.maximum;
|
||||
qc->step = qec.step;
|
||||
qc->default_value = qec.default_value;
|
||||
qc->flags = qec.flags;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -771,7 +771,7 @@ void uvc_status_stop(struct uvc_device *dev);
|
||||
extern const struct v4l2_subscribed_event_ops uvc_ctrl_sub_ev_ops;
|
||||
|
||||
int uvc_query_v4l2_ctrl(struct uvc_video_chain *chain,
|
||||
struct v4l2_queryctrl *v4l2_ctrl);
|
||||
struct v4l2_query_ext_ctrl *v4l2_ctrl);
|
||||
int uvc_query_v4l2_menu(struct uvc_video_chain *chain,
|
||||
struct v4l2_querymenu *query_menu);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user