diff --git a/include/libcamera/internal/pipeline_handler.h b/include/libcamera/internal/pipeline_handler.h
index dedc29e815fb..86b86d5971dc 100644
--- a/include/libcamera/internal/pipeline_handler.h
+++ b/include/libcamera/internal/pipeline_handler.h
@@ -79,6 +79,11 @@ protected:
 	virtual bool acquireDevice(Camera *camera);
 	virtual void releaseDevice(Camera *camera);
 
+	virtual unsigned int maxQueuedRequestsDevice() const
+	{
+		return std::numeric_limits<unsigned int>::max();
+	}
+
 	CameraManager *manager_;
 
 private:
diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp
index 14d8602e67d8..1853bca71371 100644
--- a/src/libcamera/pipeline_handler.cpp
+++ b/src/libcamera/pipeline_handler.cpp
@@ -490,6 +490,9 @@ void PipelineHandler::doQueueRequests()
 
 		Camera::Private *data = camera->_d();
 		while (!data->waitingRequests_.empty()) {
+			if (data->queuedRequests_.size() == maxQueuedRequestsDevice())
+				break;
+
 			Request *request = data->waitingRequests_.front();
 			if (!request->_d()->prepared_)
 				break;
