[libcamera-devel,v7,5/6] libcamera: ipu3: Set pipe_mode based on stream configuration

Message ID 20190625064830.951-6-jacopo@jmondi.org
State Accepted
Headers show
Series
  • Add support for V4L2 controls
Related show

Commit Message

Jacopo Mondi June 25, 2019, 6:48 a.m. UTC
Set the ImgU pipe_mode control based on the active stream configuration.
Use 'Video' pipe mode unless the viewfinder stream is not active.

Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
---
 src/libcamera/pipeline/ipu3/ipu3.cpp | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

Patch

diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
index 1c0a9825b4cd..0fb044ba5513 100644
--- a/src/libcamera/pipeline/ipu3/ipu3.cpp
+++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
@@ -22,6 +22,7 @@ 
 #include "media_device.h"
 #include "pipeline_handler.h"
 #include "utils.h"
+#include "v4l2_controls.h"
 #include "v4l2_subdevice.h"
 #include "v4l2_videodevice.h"
 
@@ -194,6 +195,12 @@  private:
 class PipelineHandlerIPU3 : public PipelineHandler
 {
 public:
+	static constexpr unsigned int V4L2_CID_IPU3_PIPE_MODE = 0x009819c1;
+	enum IPU3PipeModes {
+		IPU3PipeModeVideo = 0,
+		IPU3PipeModeStillCapture = 1,
+	};
+
 	PipelineHandlerIPU3(CameraManager *manager);
 
 	CameraConfiguration *generateConfiguration(Camera *camera,
@@ -559,6 +566,17 @@  int PipelineHandlerIPU3::configure(Camera *camera, CameraConfiguration *c)
 	if (ret)
 		return ret;
 
+	/* Apply the "pipe_mode" control to the ImgU subdevice. */
+	V4L2ControlList ctrls;
+	ctrls.add(V4L2_CID_IPU3_PIPE_MODE, vfStream->active_ ?
+		       			   IPU3PipeModeVideo :
+					   IPU3PipeModeStillCapture);
+	ret = imgu->imgu_->setControls(&ctrls);
+	if (ret) {
+		LOG(IPU3, Error) << "Unable to set pipe_mode control";
+		return ret;
+	}
+
 	return 0;
 }