|
|
75499ef |
From 0dc68cabdb626e33d02561529e6a4c681b72a784 Mon Sep 17 00:00:00 2001
|
|
|
75499ef |
From: Kieran Bingham <kieran.bingham@ideasonboard.com>
|
|
|
75499ef |
Date: Wed, 21 Mar 2018 11:43:08 -0400
|
|
|
75499ef |
Subject: [PATCH] media: uvcvideo: Prevent setting unavailable flags
|
|
|
75499ef |
|
|
|
75499ef |
The addition of an extra operation to use the GET_INFO command
|
|
|
75499ef |
overwrites all existing flags from the uvc_ctrls table. This includes
|
|
|
75499ef |
setting all controls as supporting GET_MIN, GET_MAX, GET_RES, and
|
|
|
75499ef |
GET_DEF regardless of whether they do or not.
|
|
|
75499ef |
|
|
|
75499ef |
Move the initialisation of these control capabilities directly to the
|
|
|
75499ef |
uvc_ctrl_fill_xu_info() call where they were originally located in that
|
|
|
75499ef |
use case, and ensure that the new functionality in uvc_ctrl_get_flags()
|
|
|
75499ef |
will only set flags based on their reported capability from the GET_INFO
|
|
|
75499ef |
call.
|
|
|
75499ef |
|
|
|
75499ef |
Fixes: 859086ae3636 ("media: uvcvideo: Apply flags from device to actual properties")
|
|
|
75499ef |
|
|
|
75499ef |
Cc: stable@vger.kernel.org
|
|
|
75499ef |
Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
|
|
|
75499ef |
Tested-by: Guennadi Liakhovetski <guennadi.liakhovetski@intel.com>
|
|
|
75499ef |
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
|
|
|
75499ef |
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
|
|
|
75499ef |
---
|
|
|
75499ef |
drivers/media/usb/uvc/uvc_ctrl.c | 17 +++++++++--------
|
|
|
75499ef |
1 file changed, 9 insertions(+), 8 deletions(-)
|
|
|
75499ef |
|
|
|
75499ef |
diff --git a/drivers/media/usb/uvc/uvc_ctrl.c b/drivers/media/usb/uvc/uvc_ctrl.c
|
|
|
75499ef |
index 102594ec3e97..a36b4fb949fa 100644
|
|
|
75499ef |
--- a/drivers/media/usb/uvc/uvc_ctrl.c
|
|
|
75499ef |
+++ b/drivers/media/usb/uvc/uvc_ctrl.c
|
|
|
75499ef |
@@ -1607,14 +1607,12 @@ static int uvc_ctrl_get_flags(struct uvc_device *dev,
|
|
|
75499ef |
ret = uvc_query_ctrl(dev, UVC_GET_INFO, ctrl->entity->id, dev->intfnum,
|
|
|
75499ef |
info->selector, data, 1);
|
|
|
75499ef |
if (!ret)
|
|
|
75499ef |
- info->flags = UVC_CTRL_FLAG_GET_MIN | UVC_CTRL_FLAG_GET_MAX
|
|
|
75499ef |
- | UVC_CTRL_FLAG_GET_RES | UVC_CTRL_FLAG_GET_DEF
|
|
|
75499ef |
- | (data[0] & UVC_CONTROL_CAP_GET ?
|
|
|
75499ef |
- UVC_CTRL_FLAG_GET_CUR : 0)
|
|
|
75499ef |
- | (data[0] & UVC_CONTROL_CAP_SET ?
|
|
|
75499ef |
- UVC_CTRL_FLAG_SET_CUR : 0)
|
|
|
75499ef |
- | (data[0] & UVC_CONTROL_CAP_AUTOUPDATE ?
|
|
|
75499ef |
- UVC_CTRL_FLAG_AUTO_UPDATE : 0);
|
|
|
75499ef |
+ info->flags |= (data[0] & UVC_CONTROL_CAP_GET ?
|
|
|
75499ef |
+ UVC_CTRL_FLAG_GET_CUR : 0)
|
|
|
75499ef |
+ | (data[0] & UVC_CONTROL_CAP_SET ?
|
|
|
75499ef |
+ UVC_CTRL_FLAG_SET_CUR : 0)
|
|
|
75499ef |
+ | (data[0] & UVC_CONTROL_CAP_AUTOUPDATE ?
|
|
|
75499ef |
+ UVC_CTRL_FLAG_AUTO_UPDATE : 0);
|
|
|
75499ef |
|
|
|
75499ef |
kfree(data);
|
|
|
75499ef |
return ret;
|
|
|
75499ef |
@@ -1689,6 +1687,9 @@ static int uvc_ctrl_fill_xu_info(struct uvc_device *dev,
|
|
|
75499ef |
|
|
|
75499ef |
info->size = le16_to_cpup((__le16 *)data);
|
|
|
75499ef |
|
|
|
75499ef |
+ info->flags = UVC_CTRL_FLAG_GET_MIN | UVC_CTRL_FLAG_GET_MAX
|
|
|
75499ef |
+ | UVC_CTRL_FLAG_GET_RES | UVC_CTRL_FLAG_GET_DEF;
|
|
|
75499ef |
+
|
|
|
75499ef |
ret = uvc_ctrl_get_flags(dev, ctrl, info);
|
|
|
75499ef |
if (ret < 0) {
|
|
|
75499ef |
uvc_trace(UVC_TRACE_CONTROL,
|
|
|
75499ef |
--
|
|
|
75499ef |
2.17.1
|
|
|
75499ef |
|