diff --git a/include/libcamera/internal/pipeline_handler.h b/include/libcamera/internal/pipeline_handler.h
index b4f97477a..1c88d2e99 100644
--- a/include/libcamera/internal/pipeline_handler.h
+++ b/include/libcamera/internal/pipeline_handler.h
@@ -70,6 +70,7 @@ public:
 
 	CameraManager *cameraManager() const { return manager_; }
 
+
 protected:
 	void registerCamera(std::shared_ptr<Camera> camera);
 	void hotplugMediaDevice(std::shared_ptr<MediaDevice> media);
@@ -83,6 +84,7 @@ protected:
 
 	CameraManager *manager_;
 	const unsigned int maxQueuedRequestsDevice_;
+	bool lockOnAcquire_;
 
 private:
 	void unlockMediaDevices();
diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp
index 5c469e5ba..34bfda4af 100644
--- a/src/libcamera/pipeline_handler.cpp
+++ b/src/libcamera/pipeline_handler.cpp
@@ -72,7 +72,7 @@ LOG_DEFINE_CATEGORY(Pipeline)
 PipelineHandler::PipelineHandler(CameraManager *manager,
 				 unsigned int maxQueuedRequestsDevice)
 	: manager_(manager), maxQueuedRequestsDevice_(maxQueuedRequestsDevice),
-	  useCount_(0)
+	  lockOnAcquire_(true), useCount_(0)
 {
 }
 
@@ -170,7 +170,7 @@ PipelineHandler::acquireMediaDevice(DeviceEnumerator *enumerator,
  */
 bool PipelineHandler::acquire(Camera *camera)
 {
-	if (useCount_ == 0) {
+	if (useCount_ == 0 && lockOnAcquire_) {
 		for (std::shared_ptr<MediaDevice> &media : mediaDevices_) {
 			if (!media->lock()) {
 				unlockMediaDevices();
@@ -180,7 +180,7 @@ bool PipelineHandler::acquire(Camera *camera)
 	}
 
 	if (!acquireDevice(camera)) {
-		if (useCount_ == 0)
+		if (useCount_ == 0 && lockOnAcquire_)
 			unlockMediaDevices();
 
 		return false;
@@ -212,7 +212,7 @@ void PipelineHandler::release(Camera *camera)
 
 	releaseDevice(camera);
 
-	if (useCount_ == 1)
+	if (useCount_ == 1 && lockOnAcquire_)
 		unlockMediaDevices();
 
 	--useCount_;
