diff --git a/src/ipa/rkisp1/rkisp1.cpp b/src/ipa/rkisp1/rkisp1.cpp
index 23d80bc43c5d..b714e2f10c65 100644
--- a/src/ipa/rkisp1/rkisp1.cpp
+++ b/src/ipa/rkisp1/rkisp1.cpp
@@ -86,6 +86,7 @@ private:
 	std::map<unsigned int, MappedFrameBuffer> mappedBuffers_;
 
 	ControlInfoMap sensorControls_;
+	ControlList controlsToApply_;
 
 	/* Local parameter storage */
 	struct IPAContext context_;
@@ -343,16 +344,33 @@ void IPARkISP1::initializeFrameContext(const uint32_t frame,
 				       IPAFrameContext &frameContext,
 				       const ControlList &controls)
 {
-	if (frameContext.initialised)
+	if (frameContext.initialised) {
+		if (!controls.empty()) {
+			/* Too late to apply the controls. Store them for later. */
+			LOG(IPARkISP1, Warning)
+				<< "Request underrun. Controls for frame "
+				<< frame << " are delayed ";
+			controlsToApply_.merge(controls,
+					       ControlList::MergePolicy::OverwriteExisting);
+		}
 		return;
+	}
+
+	const ControlList *controls2 = &controls;
+	if (!controlsToApply_.empty()) {
+		controlsToApply_.merge(controls, ControlList::MergePolicy::OverwriteExisting);
+		controls2 = &controlsToApply_;
+	}
 
 	frameContext.initialised = true;
 	for (auto const &a : algorithms()) {
 		Algorithm *algo = static_cast<Algorithm *>(a.get());
 		if (algo->disabled_)
 			continue;
-		algo->queueRequest(context_, frame, frameContext, controls);
+		algo->queueRequest(context_, frame, frameContext, *controls2);
 	}
+
+	controlsToApply_.clear();
 }
 
 void IPARkISP1::computeParams(const uint32_t frame, const uint32_t bufferId)
