Hi, On 14-Nov-24 8:10 PM, Ricardo Ribalda wrote: > 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. > > Signed-off-by: Ricardo Ribalda <ribalda@xxxxxxxxxxxx> Doesn't the v4l2-core ioctl wrapping offers queryctrl emulation using query_ext_ctrl ? If not maybe that should be added there? (this can be done later) Othwerise looks good to me: Reviewed-by: Hans de Goede <hdegoede@xxxxxxxxxx> Regards, Hans > --- > drivers/media/usb/uvc/uvc_ctrl.c | 24 ++++++++++++++---------- > drivers/media/usb/uvc/uvc_v4l2.c | 35 +++++++++++++++-------------------- > drivers/media/usb/uvc/uvcvideo.h | 2 +- > 3 files changed, 30 insertions(+), 31 deletions(-) > > diff --git a/drivers/media/usb/uvc/uvc_ctrl.c b/drivers/media/usb/uvc/uvc_ctrl.c > index 72ed7dc9cfc1..1bc019138995 100644 > --- a/drivers/media/usb/uvc/uvc_ctrl.c > +++ b/drivers/media/usb/uvc/uvc_ctrl.c > @@ -1252,7 +1252,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; > > @@ -1400,7 +1401,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); > @@ -1465,7 +1466,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; > @@ -1503,6 +1504,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; > @@ -1516,7 +1520,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; > @@ -1642,7 +1646,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); > > @@ -2119,7 +2123,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) { > @@ -2133,19 +2137,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; > } > > diff --git a/drivers/media/usb/uvc/uvc_v4l2.c b/drivers/media/usb/uvc/uvc_v4l2.c > index 7e284770149d..5000c74271e0 100644 > --- a/drivers/media/usb/uvc/uvc_v4l2.c > +++ b/drivers/media/usb/uvc/uvc_v4l2.c > @@ -1014,40 +1014,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) > +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; > > - return uvc_query_v4l2_ctrl(chain, qc); > + return uvc_query_v4l2_ctrl(chain, qec); > } > > -static int uvc_ioctl_query_ext_ctrl(struct file *file, void *fh, > - struct v4l2_query_ext_ctrl *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_queryctrl qc = { qec->id }; > + 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; > } > diff --git a/drivers/media/usb/uvc/uvcvideo.h b/drivers/media/usb/uvc/uvcvideo.h > index f429f325433b..8aca1a2fe587 100644 > --- a/drivers/media/usb/uvc/uvcvideo.h > +++ b/drivers/media/usb/uvc/uvcvideo.h > @@ -766,7 +766,7 @@ void uvc_status_put(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); > >