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) { + 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 | \ -- 2.29.0.rc1.297.gfa9743e501-goog