diff --git a/src/ipa/rkisp1/rkisp1.cpp b/src/ipa/rkisp1/rkisp1.cpp
index ab8583e389d3..ee87c899fcb1 100644
--- a/src/ipa/rkisp1/rkisp1.cpp
+++ b/src/ipa/rkisp1/rkisp1.cpp
@@ -343,6 +343,18 @@ void IPARkISP1::computeParams(const uint32_t frame, const uint32_t bufferId)
 {
 	IPAFrameContext &frameContext = context_.frameContexts.get(frame);
 
+	/*
+	 * \todo: This needs discussion. In raw mode, computeParams is
+	 * called without a params buffer, to trigger the setSensorControls
+	 * signal. Currently our algorithms don't support prepare calls with
+	 * a nullptr. Do we need that or can we safely skip it?
+	 */
+	if (bufferId == 0) {
+		ControlList ctrls = getSensorControls(frameContext);
+		setSensorControls.emit(frame, ctrls);
+		return;
+	}
+
 	RkISP1Params params(context_.configuration.paramFormat,
 			    mappedBuffers_.at(bufferId).planes()[0]);
 
diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
index 9be9f44db479..0e6e45bba75b 100644
--- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp
+++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
@@ -1618,6 +1618,10 @@ void PipelineHandlerRkISP1::frameStart(uint32_t sequence)
 
 	RkISP1CameraData *data = cameraData(activeCamera_);
 	data->delayedCtrls_->applyControls(sequence);
+
+	if (isRaw_) {
+		data->ipa_->computeParams(sequence + 1, 0);
+	}
 }
 
 bool PipelineHandlerRkISP1::match(DeviceEnumerator *enumerator)
