diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
index ab7c595f1e3bd39f..501edc20bb43514f 100644
--- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp
+++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
@@ -51,6 +51,7 @@ public:
 private:
 	void updateSensor(V4L2ControlList controls);
 	void queueRequestHardware(const void *cookie);
+	void metaDataReady(const void *cookie, IPAMetaData metaData);
 };
 
 class RkISP1RequestData : public RequestData
@@ -143,6 +144,8 @@ int RkISP1CameraData::initIPA()
 				   &RkISP1CameraData::updateSensor);
 	ipa_->queueRequest.connect(this,
 				   &RkISP1CameraData::queueRequestHardware);
+	ipa_->metaDataReady.connect(this,
+				    &RkISP1CameraData::metaDataReady);
 	return 0;
 }
 
@@ -175,6 +178,17 @@ void RkISP1CameraData::queueRequestHardware(const void *cookie)
 		LOG(RkISP1, Error) << "Failed to queue video";
 }
 
+void RkISP1CameraData::metaDataReady(const void *cookie, IPAMetaData metaData)
+{
+	Request *request = reinterpret_cast<Request *>(const_cast<void *>(cookie));
+	PipelineHandlerRkISP1 *pipe =
+		static_cast<PipelineHandlerRkISP1 *>(pipe_);
+
+	pipe->processMetaData(request, metaData);
+
+	pipe->tryCompleteRequest(request);
+}
+
 RkISP1CameraConfiguration::RkISP1CameraConfiguration(Camera *camera,
 						     RkISP1CameraData *data)
 	: CameraConfiguration()
@@ -709,6 +723,9 @@ void PipelineHandlerRkISP1::tryCompleteRequest(Request *request)
 	if (request->hasPendingBuffers())
 		return;
 
+	if (!request->metaData().ready)
+		return;
+
 	delete reqData;
 	request->data = nullptr;
 
@@ -734,8 +751,6 @@ void PipelineHandlerRkISP1::statReady(Buffer *buffer)
 
 	data->ipa_->updateStatistics(request, *buffer);
 
-	/* TODO: Fetch libcamera status controls from IPA */
-
 	reqData->stat = nullptr;
 
 	statBuffers_.push(buffer);
