mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-02-24 01:54:01 -05:00
media: uvcvideo: Allow changing noparam on the fly
Right now the parameter value is read during video_registration and cannot be changed afterwards, despite its permissions 0644, that makes the user believe that the value can be written. The parameter only affects the behaviour of uvc_queue_buffer_complete(), with only one check per buffer. We can read the value directly from uvc_queue_buffer_complete() and therefore allowing changing it with sysfs on the fly. Signed-off-by: Ricardo Ribalda <ribalda@chromium.org> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Hans de Goede <hdegoede@redhat.com> Link: https://lore.kernel.org/r/20241218-uvc-deprecate-v2-3-ab814139e983@chromium.org Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
This commit is contained in:
committed by
Mauro Carvalho Chehab
parent
52fbe173ba
commit
8869eb654f
@@ -2024,7 +2024,7 @@ int uvc_register_video_device(struct uvc_device *dev,
|
||||
int ret;
|
||||
|
||||
/* Initialize the video buffers queue. */
|
||||
ret = uvc_queue_init(queue, type, !uvc_no_drop_param);
|
||||
ret = uvc_queue_init(queue, type);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
|
||||
@@ -208,8 +208,7 @@ static const struct vb2_ops uvc_meta_queue_qops = {
|
||||
.stop_streaming = uvc_stop_streaming,
|
||||
};
|
||||
|
||||
int uvc_queue_init(struct uvc_video_queue *queue, enum v4l2_buf_type type,
|
||||
int drop_corrupted)
|
||||
int uvc_queue_init(struct uvc_video_queue *queue, enum v4l2_buf_type type)
|
||||
{
|
||||
int ret;
|
||||
|
||||
@@ -239,7 +238,6 @@ int uvc_queue_init(struct uvc_video_queue *queue, enum v4l2_buf_type type,
|
||||
mutex_init(&queue->mutex);
|
||||
spin_lock_init(&queue->irqlock);
|
||||
INIT_LIST_HEAD(&queue->irqqueue);
|
||||
queue->flags = drop_corrupted ? UVC_QUEUE_DROP_CORRUPTED : 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -472,7 +470,7 @@ static void uvc_queue_buffer_complete(struct kref *ref)
|
||||
struct vb2_buffer *vb = &buf->buf.vb2_buf;
|
||||
struct uvc_video_queue *queue = vb2_get_drv_priv(vb->vb2_queue);
|
||||
|
||||
if ((queue->flags & UVC_QUEUE_DROP_CORRUPTED) && buf->error) {
|
||||
if (buf->error && !uvc_no_drop_param) {
|
||||
uvc_queue_buffer_requeue(queue, buf);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -317,7 +317,6 @@ struct uvc_buffer {
|
||||
};
|
||||
|
||||
#define UVC_QUEUE_DISCONNECTED (1 << 0)
|
||||
#define UVC_QUEUE_DROP_CORRUPTED (1 << 1)
|
||||
|
||||
struct uvc_video_queue {
|
||||
struct vb2_queue queue;
|
||||
@@ -680,8 +679,7 @@ extern struct uvc_driver uvc_driver;
|
||||
struct uvc_entity *uvc_entity_by_id(struct uvc_device *dev, int id);
|
||||
|
||||
/* Video buffers queue management. */
|
||||
int uvc_queue_init(struct uvc_video_queue *queue, enum v4l2_buf_type type,
|
||||
int drop_corrupted);
|
||||
int uvc_queue_init(struct uvc_video_queue *queue, enum v4l2_buf_type type);
|
||||
void uvc_queue_release(struct uvc_video_queue *queue);
|
||||
int uvc_request_buffers(struct uvc_video_queue *queue,
|
||||
struct v4l2_requestbuffers *rb);
|
||||
|
||||
Reference in New Issue
Block a user