On Mon, 9 Dec 2024 at 15:09, Hans de Goede <hdegoede@xxxxxxxxxx> wrote: > > 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) It does not look like. I also thought about that, but then I realised that most of the drivers use the ctrl framework and then this is not needed. But anyway, as you said, it can be done later. I will add it to my todo :). Regards! > > 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); > > > > > -- Ricardo Ribalda