Hi Ricardo, Thank you for the patch. On Thu, Oct 22, 2020 at 03:37:49PM +0200, Ricardo Ribalda wrote: > This flag allows controls to get their current value from an entity > defined function instead of via a query to the USB device. > > Signed-off-by: Ricardo Ribalda <ribalda@xxxxxxxxxxxx> > --- > drivers/media/usb/uvc/uvc_ctrl.c | 17 +++++++++++++---- > include/uapi/linux/uvcvideo.h | 1 + > 2 files changed, 14 insertions(+), 4 deletions(-) > > diff --git a/drivers/media/usb/uvc/uvc_ctrl.c b/drivers/media/usb/uvc/uvc_ctrl.c > index 7acdc055613b..0a8835742d49 100644 > --- a/drivers/media/usb/uvc/uvc_ctrl.c > +++ b/drivers/media/usb/uvc/uvc_ctrl.c > @@ -1001,10 +1001,19 @@ static int __uvc_ctrl_get(struct uvc_video_chain *chain, > return -EACCES; > > if (!ctrl->loaded) { > - ret = uvc_query_ctrl(chain->dev, UVC_GET_CUR, ctrl->entity->id, > - chain->dev->intfnum, ctrl->info.selector, > - uvc_ctrl_data(ctrl, UVC_CTRL_DATA_CURRENT), > - ctrl->info.size); > + if (ctrl->info.flags & UVC_CTRL_FLAG_ENTITY_GET_CUR) { Same question as for 2/6, do we need this flag ? > + if (!ctrl->entity->get_cur) > + return -EINVAL; > + ret = ctrl->entity->get_cur(ctrl->entity, > + ctrl->info.selector, > + uvc_ctrl_data(ctrl, UVC_CTRL_DATA_CURRENT), > + ctrl->info.size); > + } else { > + ret = uvc_query_ctrl(chain->dev, UVC_GET_CUR, ctrl->entity->id, > + chain->dev->intfnum, ctrl->info.selector, > + uvc_ctrl_data(ctrl, UVC_CTRL_DATA_CURRENT), > + ctrl->info.size); > + } > if (ret < 0) > return ret; > > diff --git a/include/uapi/linux/uvcvideo.h b/include/uapi/linux/uvcvideo.h > index 69b636290c31..cb91797d2a09 100644 > --- a/include/uapi/linux/uvcvideo.h > +++ b/include/uapi/linux/uvcvideo.h > @@ -32,6 +32,7 @@ > #define UVC_CTRL_FLAG_ASYNCHRONOUS (1 << 8) > /* Entity queries */ > #define UVC_CTRL_FLAG_ENTITY_GET_INFO (1 << 9) > +#define UVC_CTRL_FLAG_ENTITY_GET_CUR (1 << 10) > > #define UVC_CTRL_FLAG_GET_RANGE \ > (UVC_CTRL_FLAG_GET_CUR | UVC_CTRL_FLAG_GET_MIN | \ -- Regards, Laurent Pinchart