media: uvcvideo: Prevent setting unavailable flags
The addition of an extra operation to use the GET_INFO command
overwrites all existing flags from the uvc_ctrls table. This includes
setting all controls as supporting GET_MIN, GET_MAX, GET_RES, and
GET_DEF regardless of whether they do or not.
Move the initialisation of these control capabilities directly to the
uvc_ctrl_fill_xu_info() call where they were originally located in that
use case, and ensure that the new functionality in uvc_ctrl_get_flags()
will only set flags based on their reported capability from the GET_INFO
call.
Fixes: 859086ae36
("media: uvcvideo: Apply flags from device to actual properties")
Cc: stable@vger.kernel.org
Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Tested-by: Guennadi Liakhovetski <guennadi.liakhovetski@intel.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
This commit is contained in:
parent
a00031c159
commit
0dc68cabdb
|
@ -1607,14 +1607,12 @@ static int uvc_ctrl_get_flags(struct uvc_device *dev,
|
|||
ret = uvc_query_ctrl(dev, UVC_GET_INFO, ctrl->entity->id, dev->intfnum,
|
||||
info->selector, data, 1);
|
||||
if (!ret)
|
||||
info->flags = UVC_CTRL_FLAG_GET_MIN | UVC_CTRL_FLAG_GET_MAX
|
||||
| UVC_CTRL_FLAG_GET_RES | UVC_CTRL_FLAG_GET_DEF
|
||||
| (data[0] & UVC_CONTROL_CAP_GET ?
|
||||
UVC_CTRL_FLAG_GET_CUR : 0)
|
||||
| (data[0] & UVC_CONTROL_CAP_SET ?
|
||||
UVC_CTRL_FLAG_SET_CUR : 0)
|
||||
| (data[0] & UVC_CONTROL_CAP_AUTOUPDATE ?
|
||||
UVC_CTRL_FLAG_AUTO_UPDATE : 0);
|
||||
info->flags |= (data[0] & UVC_CONTROL_CAP_GET ?
|
||||
UVC_CTRL_FLAG_GET_CUR : 0)
|
||||
| (data[0] & UVC_CONTROL_CAP_SET ?
|
||||
UVC_CTRL_FLAG_SET_CUR : 0)
|
||||
| (data[0] & UVC_CONTROL_CAP_AUTOUPDATE ?
|
||||
UVC_CTRL_FLAG_AUTO_UPDATE : 0);
|
||||
|
||||
kfree(data);
|
||||
return ret;
|
||||
|
@ -1689,6 +1687,9 @@ static int uvc_ctrl_fill_xu_info(struct uvc_device *dev,
|
|||
|
||||
info->size = le16_to_cpup((__le16 *)data);
|
||||
|
||||
info->flags = UVC_CTRL_FLAG_GET_MIN | UVC_CTRL_FLAG_GET_MAX
|
||||
| UVC_CTRL_FLAG_GET_RES | UVC_CTRL_FLAG_GET_DEF;
|
||||
|
||||
ret = uvc_ctrl_get_flags(dev, ctrl, info);
|
||||
if (ret < 0) {
|
||||
uvc_trace(UVC_TRACE_CONTROL,
|
||||
|
|
Loading…
Reference in New Issue