Commit f620d1d7 authored by ming_qian's avatar ming_qian Committed by Mauro Carvalho Chehab

media: uvcvideo: Support realtek's UVC 1.5 device

media: uvcvideo: Support UVC 1.5 video probe & commit controls

The length of UVC 1.5 video control is 48, and it is 34 for UVC 1.1.
Change it to 48 for UVC 1.5 device, and the UVC 1.5 device can be
recognized.

More changes to the driver are needed for full UVC 1.5 compatibility.
However, at least the UVC 1.5 Realtek RTS5847/RTS5852 cameras have been
reported to work well.

[laurent.pinchart@ideasonboard.com: Factor out code to helper function, update size checks]

Cc: stable@vger.kernel.org
Signed-off-by: default avatarming_qian <ming_qian@realsil.com.cn>
Signed-off-by: default avatarLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Tested-by: default avatarKai-Heng Feng <kai.heng.feng@canonical.com>
Tested-by: default avatarAna Guerrero Lopez <ana.guerrero@collabora.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+samsung@kernel.org>
parent f9ffcb0a
...@@ -163,14 +163,27 @@ static void uvc_fixup_video_ctrl(struct uvc_streaming *stream, ...@@ -163,14 +163,27 @@ static void uvc_fixup_video_ctrl(struct uvc_streaming *stream,
} }
} }
static size_t uvc_video_ctrl_size(struct uvc_streaming *stream)
{
/*
* Return the size of the video probe and commit controls, which depends
* on the protocol version.
*/
if (stream->dev->uvc_version < 0x0110)
return 26;
else if (stream->dev->uvc_version < 0x0150)
return 34;
else
return 48;
}
static int uvc_get_video_ctrl(struct uvc_streaming *stream, static int uvc_get_video_ctrl(struct uvc_streaming *stream,
struct uvc_streaming_control *ctrl, int probe, u8 query) struct uvc_streaming_control *ctrl, int probe, u8 query)
{ {
u16 size = uvc_video_ctrl_size(stream);
u8 *data; u8 *data;
u16 size;
int ret; int ret;
size = stream->dev->uvc_version >= 0x0110 ? 34 : 26;
if ((stream->dev->quirks & UVC_QUIRK_PROBE_DEF) && if ((stream->dev->quirks & UVC_QUIRK_PROBE_DEF) &&
query == UVC_GET_DEF) query == UVC_GET_DEF)
return -EIO; return -EIO;
...@@ -225,7 +238,7 @@ static int uvc_get_video_ctrl(struct uvc_streaming *stream, ...@@ -225,7 +238,7 @@ static int uvc_get_video_ctrl(struct uvc_streaming *stream,
ctrl->dwMaxVideoFrameSize = get_unaligned_le32(&data[18]); ctrl->dwMaxVideoFrameSize = get_unaligned_le32(&data[18]);
ctrl->dwMaxPayloadTransferSize = get_unaligned_le32(&data[22]); ctrl->dwMaxPayloadTransferSize = get_unaligned_le32(&data[22]);
if (size == 34) { if (size >= 34) {
ctrl->dwClockFrequency = get_unaligned_le32(&data[26]); ctrl->dwClockFrequency = get_unaligned_le32(&data[26]);
ctrl->bmFramingInfo = data[30]; ctrl->bmFramingInfo = data[30];
ctrl->bPreferedVersion = data[31]; ctrl->bPreferedVersion = data[31];
...@@ -254,11 +267,10 @@ static int uvc_get_video_ctrl(struct uvc_streaming *stream, ...@@ -254,11 +267,10 @@ static int uvc_get_video_ctrl(struct uvc_streaming *stream,
static int uvc_set_video_ctrl(struct uvc_streaming *stream, static int uvc_set_video_ctrl(struct uvc_streaming *stream,
struct uvc_streaming_control *ctrl, int probe) struct uvc_streaming_control *ctrl, int probe)
{ {
u16 size = uvc_video_ctrl_size(stream);
u8 *data; u8 *data;
u16 size;
int ret; int ret;
size = stream->dev->uvc_version >= 0x0110 ? 34 : 26;
data = kzalloc(size, GFP_KERNEL); data = kzalloc(size, GFP_KERNEL);
if (data == NULL) if (data == NULL)
return -ENOMEM; return -ENOMEM;
...@@ -275,7 +287,7 @@ static int uvc_set_video_ctrl(struct uvc_streaming *stream, ...@@ -275,7 +287,7 @@ static int uvc_set_video_ctrl(struct uvc_streaming *stream,
put_unaligned_le32(ctrl->dwMaxVideoFrameSize, &data[18]); put_unaligned_le32(ctrl->dwMaxVideoFrameSize, &data[18]);
put_unaligned_le32(ctrl->dwMaxPayloadTransferSize, &data[22]); put_unaligned_le32(ctrl->dwMaxPayloadTransferSize, &data[22]);
if (size == 34) { if (size >= 34) {
put_unaligned_le32(ctrl->dwClockFrequency, &data[26]); put_unaligned_le32(ctrl->dwClockFrequency, &data[26]);
data[30] = ctrl->bmFramingInfo; data[30] = ctrl->bmFramingInfo;
data[31] = ctrl->bPreferedVersion; data[31] = ctrl->bPreferedVersion;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment