pipeline_handler: Add acquireDevice() function to mirror releaseDevice()

libcamera always keeps all /dev/video# and /dev/v4l2_subdev# nodes for a
pipeline open after enumerating the camera.

This is a problem for the uvcvideo pipeline handler. Keeping /dev/video#
open stops the UVC USB device from being able to enter runtime-suspend
causing significant unnecessary power-usage.

Add a stub acquireDevice() function to the PipelineHandler class which
pipeline handlers can override.

The uvcvideo pipeline handler will use this to delay opening /dev/video#
until the device is acquired. This is a special case because the kernel
uvcvideo driver powers on the USB device as soon as /dev/video# is
opened. This behavior should *not* be copied by other pipeline handlers.

Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Harvey Yang <chenghaoyang@chromium.org>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
Hans de Goede
2024-08-30 13:12:05 +02:00
committed by Laurent Pinchart
parent 9020c2eec9
commit c05e45ac77
3 changed files with 43 additions and 10 deletions

View File

@@ -995,7 +995,7 @@ int Camera::acquire()
if (ret < 0)
return ret == -EACCES ? -EBUSY : ret;
if (!d->pipe_->acquire()) {
if (!d->pipe_->acquire(this)) {
LOG(Camera, Info)
<< "Pipeline handler in use by another process";
return -EBUSY;