提交 7b34a5ff 编写于 作者: L Laurent Pinchart 提交者: Zheng Zengkai

media: uvcvideo: Support devices that report an OT as an entity source

stable inclusion
from stable-5.10.49
commit 8148665cb7fece4acb899f2e2dbbff7ed0720e1d
bugzilla: 174521 https://gitee.com/openeuler/kernel/issues/I4DGQS

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=8148665cb7fece4acb899f2e2dbbff7ed0720e1d

--------------------------------

commit 4ca052b4 upstream.

Some devices reference an output terminal as the source of extension
units. This is incorrect, as output terminals only have an input pin,
and thus can't be connected to any entity in the forward direction. The
resulting topology would cause issues when registering the media
controller graph. To avoid this problem, connect the extension unit to
the source of the output terminal instead.

While at it, and while no device has been reported to be affected by
this issue, also handle forward scans where two output terminals would
be connected together, and skip the terminals found through such an
invalid connection.
Reported-and-tested-by: NJohn Nealy <jnealy3@yahoo.com>
Signed-off-by: NLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: NHans de Goede <hdegoede@redhat.com>
Signed-off-by: NMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: NChen Jun <chenjun102@huawei.com>
Acked-by: NWeilong Chen <chenweilong@huawei.com>
Signed-off-by: NChen Jun <chenjun102@huawei.com>
Signed-off-by: NZheng Zengkai <zhengzengkai@huawei.com>
上级 31489e2a
...@@ -1588,6 +1588,31 @@ static int uvc_scan_chain_forward(struct uvc_video_chain *chain, ...@@ -1588,6 +1588,31 @@ static int uvc_scan_chain_forward(struct uvc_video_chain *chain,
return -EINVAL; return -EINVAL;
} }
/*
* Some devices reference an output terminal as the
* source of extension units. This is incorrect, as
* output terminals only have an input pin, and thus
* can't be connected to any entity in the forward
* direction. The resulting topology would cause issues
* when registering the media controller graph. To
* avoid this problem, connect the extension unit to
* the source of the output terminal instead.
*/
if (UVC_ENTITY_IS_OTERM(entity)) {
struct uvc_entity *source;
source = uvc_entity_by_id(chain->dev,
entity->baSourceID[0]);
if (!source) {
uvc_trace(UVC_TRACE_DESCR,
"Can't connect extension unit %u in chain\n",
forward->id);
break;
}
forward->baSourceID[0] = source->id;
}
list_add_tail(&forward->chain, &chain->entities); list_add_tail(&forward->chain, &chain->entities);
if (uvc_trace_param & UVC_TRACE_PROBE) { if (uvc_trace_param & UVC_TRACE_PROBE) {
if (!found) if (!found)
...@@ -1608,6 +1633,13 @@ static int uvc_scan_chain_forward(struct uvc_video_chain *chain, ...@@ -1608,6 +1633,13 @@ static int uvc_scan_chain_forward(struct uvc_video_chain *chain,
return -EINVAL; return -EINVAL;
} }
if (UVC_ENTITY_IS_OTERM(entity)) {
uvc_trace(UVC_TRACE_DESCR,
"Unsupported connection between output terminals %u and %u\n",
entity->id, forward->id);
break;
}
list_add_tail(&forward->chain, &chain->entities); list_add_tail(&forward->chain, &chain->entities);
if (uvc_trace_param & UVC_TRACE_PROBE) { if (uvc_trace_param & UVC_TRACE_PROBE) {
if (!found) if (!found)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册