Message ID | 20201022133753.310506-3-ribalda@chromium.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Show privacy_gpio as a v4l2_ctrl | expand |
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@chromium.org> > --- > 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 | \
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) { + 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 | \
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@chromium.org> --- drivers/media/usb/uvc/uvc_ctrl.c | 17 +++++++++++++---- include/uapi/linux/uvcvideo.h | 1 + 2 files changed, 14 insertions(+), 4 deletions(-)