aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRicardo Ribalda <ribalda@chromium.org>2022-01-17 19:26:58 +0100
committerRicardo Ribalda <ribalda@chromium.org>2023-01-17 16:59:03 +0100
commit4824c257edad4841f819f14b71ae17b4c7e41d2d (patch)
tree2ec8171b3e1194634b98b5e871525c30b5a75b1a
parent8ebc5e8acb2f4a4adf59ef815eee7acc3184867f (diff)
downloadlinux-b4/resend-meta.tar.gz
media: uvcvideo: Add a unique suffix to camera namesb4/resend-meta
Some cameras have multiple data inputs (i.e. IR sensor and RGB sensor), append a unique number to the device name. Do it in a way where devices with only one input are not affected by the change, to avoid any regression. Fixes v4l2-compliance: Media Controller ioctls: fail: v4l2-test-media.cpp(205): v2_entity_names_set.find(key) != v2_entity_names_set.end() test MEDIA_IOC_G_TOPOLOGY: FAIL fail: v4l2-test-media.cpp(394): num_data_links != num_links test MEDIA_IOC_ENUM_ENTITIES/LINKS: FAIL Signed-off-by: Ricardo Ribalda <ribalda@chromium.org>
-rw-r--r--drivers/media/usb/uvc/uvc_driver.c21
-rw-r--r--drivers/media/usb/uvc/uvc_metadata.c4
-rw-r--r--drivers/media/usb/uvc/uvcvideo.h3
3 files changed, 20 insertions, 8 deletions
diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc_driver.c
index 215fb483efb00b..01d5ca3da6cedd 100644
--- a/drivers/media/usb/uvc/uvc_driver.c
+++ b/drivers/media/usb/uvc/uvc_driver.c
@@ -1920,6 +1920,7 @@ static void uvc_unregister_video(struct uvc_device *dev)
int uvc_register_video_device(struct uvc_device *dev,
struct uvc_streaming *stream,
+ unsigned int index,
struct video_device *vdev,
struct uvc_video_queue *queue,
enum v4l2_buf_type type,
@@ -1963,7 +1964,14 @@ int uvc_register_video_device(struct uvc_device *dev,
break;
}
- strscpy(vdev->name, dev->name, sizeof(vdev->name));
+ if (index) {
+ snprintf(vdev->name, sizeof(vdev->name), "%s_%u%s", dev->name,
+ index,
+ type == V4L2_BUF_TYPE_META_CAPTURE ? "-Meta" : "");
+ } else {
+ snprintf(vdev->name, sizeof(vdev->name), "%s%s", dev->name,
+ type == V4L2_BUF_TYPE_META_CAPTURE ? "-Meta" : "");
+ }
/*
* Set the driver data before calling video_register_device, otherwise
@@ -1984,7 +1992,8 @@ int uvc_register_video_device(struct uvc_device *dev,
}
static int uvc_register_video(struct uvc_device *dev,
- struct uvc_streaming *stream)
+ struct uvc_streaming *stream,
+ unsigned int index)
{
int ret;
@@ -2005,7 +2014,7 @@ static int uvc_register_video(struct uvc_device *dev,
uvc_debugfs_init_stream(stream);
/* Register the device with V4L. */
- return uvc_register_video_device(dev, stream, &stream->vdev,
+ return uvc_register_video_device(dev, stream, index, &stream->vdev,
&stream->queue, stream->type,
&uvc_fops, &uvc_ioctl_ops);
}
@@ -2018,6 +2027,7 @@ static int uvc_register_terms(struct uvc_device *dev,
{
struct uvc_streaming *stream;
struct uvc_entity *term;
+ unsigned int index = 0;
int ret;
list_for_each_entry(term, &chain->entities, chain) {
@@ -2033,7 +2043,7 @@ static int uvc_register_terms(struct uvc_device *dev,
}
stream->chain = chain;
- ret = uvc_register_video(dev, stream);
+ ret = uvc_register_video(dev, stream, index);
if (ret < 0)
return ret;
@@ -2041,9 +2051,10 @@ static int uvc_register_terms(struct uvc_device *dev,
* Register a metadata node, but ignore a possible failure,
* complete registration of video nodes anyway.
*/
- uvc_meta_register(stream);
+ uvc_meta_register(stream, index);
term->vdev = &stream->vdev;
+ index += 1;
}
return 0;
diff --git a/drivers/media/usb/uvc/uvc_metadata.c b/drivers/media/usb/uvc/uvc_metadata.c
index 82de7781f5b6b7..d28f2f147acd6f 100644
--- a/drivers/media/usb/uvc/uvc_metadata.c
+++ b/drivers/media/usb/uvc/uvc_metadata.c
@@ -156,7 +156,7 @@ static const struct v4l2_file_operations uvc_meta_fops = {
.mmap = vb2_fop_mmap,
};
-int uvc_meta_register(struct uvc_streaming *stream)
+int uvc_meta_register(struct uvc_streaming *stream, unsigned int index)
{
struct uvc_device *dev = stream->dev;
struct video_device *vdev = &stream->meta.vdev;
@@ -170,7 +170,7 @@ int uvc_meta_register(struct uvc_streaming *stream)
*/
vdev->queue = &queue->queue;
- return uvc_register_video_device(dev, stream, vdev, queue,
+ return uvc_register_video_device(dev, stream, index, vdev, queue,
V4L2_BUF_TYPE_META_CAPTURE,
&uvc_meta_fops, &uvc_meta_ioctl_ops);
}
diff --git a/drivers/media/usb/uvc/uvcvideo.h b/drivers/media/usb/uvc/uvcvideo.h
index df93db259312e7..e87894b966f2af 100644
--- a/drivers/media/usb/uvc/uvcvideo.h
+++ b/drivers/media/usb/uvc/uvcvideo.h
@@ -710,10 +710,11 @@ int uvc_query_ctrl(struct uvc_device *dev, u8 query, u8 unit,
void uvc_video_clock_update(struct uvc_streaming *stream,
struct vb2_v4l2_buffer *vbuf,
struct uvc_buffer *buf);
-int uvc_meta_register(struct uvc_streaming *stream);
+int uvc_meta_register(struct uvc_streaming *stream, unsigned int index);
int uvc_register_video_device(struct uvc_device *dev,
struct uvc_streaming *stream,
+ unsigned int index,
struct video_device *vdev,
struct uvc_video_queue *queue,
enum v4l2_buf_type type,