On Thu Mar 27 21:05:27 2025 +0000, Ricardo Ribalda wrote:
> Add a variable in the file handle state to figure out if a camera is in
> the streaming state or not. This variable will be used in the future for
> power management policies.
> 
> Now that we are at it, make use of guards to simplify the code.
> 
> Reviewed-by: Laurent Pinchart <laurent.pinch...@ideasonboard.com>
> Reviewed-by: Hans de Goede <hdego...@redhat.com>
> Signed-off-by: Ricardo Ribalda <riba...@chromium.org>
> Message-ID: <20250327-uvc-granpower-ng-v6-1-35a2357ff...@chromium.org>
> Signed-off-by: Hans de Goede <hdego...@redhat.com>
> Signed-off-by: Hans Verkuil <hverk...@xs4all.nl>

Patch committed.

Thanks,
Hans Verkuil

 drivers/media/usb/uvc/uvc_v4l2.c | 18 +++++++++++++-----
 drivers/media/usb/uvc/uvcvideo.h |  1 +
 2 files changed, 14 insertions(+), 5 deletions(-)

---

diff --git a/drivers/media/usb/uvc/uvc_v4l2.c b/drivers/media/usb/uvc/uvc_v4l2.c
index 39065db44e86..22886b47d81c 100644
--- a/drivers/media/usb/uvc/uvc_v4l2.c
+++ b/drivers/media/usb/uvc/uvc_v4l2.c
@@ -841,11 +841,18 @@ static int uvc_ioctl_streamon(struct file *file, void *fh,
        if (!uvc_has_privileges(handle))
                return -EBUSY;
 
-       mutex_lock(&stream->mutex);
+       guard(mutex)(&stream->mutex);
+
+       if (handle->is_streaming)
+               return 0;
+
        ret = uvc_queue_streamon(&stream->queue, type);
-       mutex_unlock(&stream->mutex);
+       if (ret)
+               return ret;
 
-       return ret;
+       handle->is_streaming = true;
+
+       return 0;
 }
 
 static int uvc_ioctl_streamoff(struct file *file, void *fh,
@@ -857,9 +864,10 @@ static int uvc_ioctl_streamoff(struct file *file, void *fh,
        if (!uvc_has_privileges(handle))
                return -EBUSY;
 
-       mutex_lock(&stream->mutex);
+       guard(mutex)(&stream->mutex);
+
        uvc_queue_streamoff(&stream->queue, type);
-       mutex_unlock(&stream->mutex);
+       handle->is_streaming = false;
 
        return 0;
 }
diff --git a/drivers/media/usb/uvc/uvcvideo.h b/drivers/media/usb/uvc/uvcvideo.h
index b4ee701835fc..5ceb01e7831a 100644
--- a/drivers/media/usb/uvc/uvcvideo.h
+++ b/drivers/media/usb/uvc/uvcvideo.h
@@ -630,6 +630,7 @@ struct uvc_fh {
        struct uvc_streaming *stream;
        enum uvc_handle_state state;
        unsigned int pending_async_ctrls;
+       bool is_streaming;
 };
 
 /* ------------------------------------------------------------------------

Reply via email to