diff options
author | Ricardo Ribalda <ribalda@chromium.org> | 2022-01-17 19:26:58 +0100 |
---|---|---|
committer | Ricardo Ribalda <ribalda@chromium.org> | 2023-01-17 16:59:03 +0100 |
commit | 4824c257edad4841f819f14b71ae17b4c7e41d2d (patch) | |
tree | 2ec8171b3e1194634b98b5e871525c30b5a75b1a | |
parent | 8ebc5e8acb2f4a4adf59ef815eee7acc3184867f (diff) | |
download | linux-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.c | 21 | ||||
-rw-r--r-- | drivers/media/usb/uvc/uvc_metadata.c | 4 | ||||
-rw-r--r-- | drivers/media/usb/uvc/uvcvideo.h | 3 |
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 215fb483efb00..01d5ca3da6ced 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 82de7781f5b6b..d28f2f147acd6 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 df93db259312e..e87894b966f2a 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, |