diff --git a/include/libcamera/ipa/raspberrypi.mojom b/include/libcamera/ipa/raspberrypi.mojom
index c0de435b7b33..40f78d9e3b3f 100644
--- a/include/libcamera/ipa/raspberrypi.mojom
+++ b/include/libcamera/ipa/raspberrypi.mojom
@@ -23,6 +23,7 @@ struct SensorConfig {
 	uint32 gainDelay;
 	uint32 exposureDelay;
 	uint32 vblankDelay;
+	uint32 hblankDelay;
 	uint32 sensorMetadata;
 };
 
diff --git a/src/ipa/raspberrypi/cam_helper.cpp b/src/ipa/raspberrypi/cam_helper.cpp
index fd3527b94501..916632f83037 100644
--- a/src/ipa/raspberrypi/cam_helper.cpp
+++ b/src/ipa/raspberrypi/cam_helper.cpp
@@ -114,7 +114,7 @@ void CamHelper::setCameraMode(const CameraMode &mode)
 }
 
 void CamHelper::getDelays(int &exposureDelay, int &gainDelay,
-			  int &vblankDelay) const
+			  int &vblankDelay, int &hblankDelay) const
 {
 	/*
 	 * These values are correct for many sensors. Other sensors will
@@ -123,6 +123,7 @@ void CamHelper::getDelays(int &exposureDelay, int &gainDelay,
 	exposureDelay = 2;
 	gainDelay = 1;
 	vblankDelay = 2;
+	hblankDelay = 2;
 }
 
 bool CamHelper::sensorEmbeddedDataPresent() const
diff --git a/src/ipa/raspberrypi/cam_helper.h b/src/ipa/raspberrypi/cam_helper.h
index 9b5e602689f3..1bbdd715d2b1 100644
--- a/src/ipa/raspberrypi/cam_helper.h
+++ b/src/ipa/raspberrypi/cam_helper.h
@@ -88,7 +88,7 @@ public:
 	virtual uint32_t gainCode(double gain) const = 0;
 	virtual double gain(uint32_t gainCode) const = 0;
 	virtual void getDelays(int &exposureDelay, int &gainDelay,
-			       int &vblankDelay) const;
+			       int &vblankDelay, int &hblankDelay) const;
 	virtual bool sensorEmbeddedDataPresent() const;
 	virtual double getModeSensitivity(const CameraMode &mode) const;
 	virtual unsigned int hideFramesStartup() const;
diff --git a/src/ipa/raspberrypi/cam_helper_imx290.cpp b/src/ipa/raspberrypi/cam_helper_imx290.cpp
index 25f23d531c72..7d6f5b549a73 100644
--- a/src/ipa/raspberrypi/cam_helper_imx290.cpp
+++ b/src/ipa/raspberrypi/cam_helper_imx290.cpp
@@ -18,7 +18,7 @@ public:
 	uint32_t gainCode(double gain) const override;
 	double gain(uint32_t gainCode) const override;
 	void getDelays(int &exposureDelay, int &gainDelay,
-		       int &vblankDelay) const override;
+		       int &vblankDelay, int &hblankDelay) const override;
 	unsigned int hideFramesModeSwitch() const override;
 
 private:
@@ -46,11 +46,12 @@ double CamHelperImx290::gain(uint32_t gainCode) const
 }
 
 void CamHelperImx290::getDelays(int &exposureDelay, int &gainDelay,
-				int &vblankDelay) const
+				int &vblankDelay, int &hblankDelay) const
 {
 	exposureDelay = 2;
 	gainDelay = 2;
 	vblankDelay = 2;
+	hblankDelay = 2;
 }
 
 unsigned int CamHelperImx290::hideFramesModeSwitch() const
diff --git a/src/ipa/raspberrypi/cam_helper_imx477.cpp b/src/ipa/raspberrypi/cam_helper_imx477.cpp
index 71529bdd3034..76a82cc51378 100644
--- a/src/ipa/raspberrypi/cam_helper_imx477.cpp
+++ b/src/ipa/raspberrypi/cam_helper_imx477.cpp
@@ -49,7 +49,7 @@ public:
 	uint32_t getVBlanking(Duration &exposure, Duration minFrameDuration,
 			      Duration maxFrameDuration) const override;
 	void getDelays(int &exposureDelay, int &gainDelay,
-		       int &vblankDelay) const override;
+		       int &vblankDelay, int &hblankDelay) const override;
 	bool sensorEmbeddedDataPresent() const override;
 
 private:
@@ -153,11 +153,12 @@ uint32_t CamHelperImx477::getVBlanking(Duration &exposure,
 }
 
 void CamHelperImx477::getDelays(int &exposureDelay, int &gainDelay,
-				int &vblankDelay) const
+				int &vblankDelay, int &hblankDelay) const
 {
 	exposureDelay = 2;
 	gainDelay = 2;
 	vblankDelay = 3;
+	hblankDelay = 3;
 }
 
 bool CamHelperImx477::sensorEmbeddedDataPresent() const
diff --git a/src/ipa/raspberrypi/cam_helper_imx519.cpp b/src/ipa/raspberrypi/cam_helper_imx519.cpp
index 2c120dad1680..9dff1eeb899f 100644
--- a/src/ipa/raspberrypi/cam_helper_imx519.cpp
+++ b/src/ipa/raspberrypi/cam_helper_imx519.cpp
@@ -49,7 +49,7 @@ public:
 	uint32_t getVBlanking(Duration &exposure, Duration minFrameDuration,
 			      Duration maxFrameDuration) const override;
 	void getDelays(int &exposureDelay, int &gainDelay,
-		       int &vblankDelay) const override;
+		       int &vblankDelay, int &hblankDelay) const override;
 	bool sensorEmbeddedDataPresent() const override;
 
 private:
@@ -153,11 +153,12 @@ uint32_t CamHelperImx519::getVBlanking(Duration &exposure,
 }
 
 void CamHelperImx519::getDelays(int &exposureDelay, int &gainDelay,
-				int &vblankDelay) const
+				int &vblankDelay, int &hblankDelay) const
 {
 	exposureDelay = 2;
 	gainDelay = 2;
 	vblankDelay = 3;
+	hblankDelay = 3;
 }
 
 bool CamHelperImx519::sensorEmbeddedDataPresent() const
diff --git a/src/ipa/raspberrypi/cam_helper_ov5647.cpp b/src/ipa/raspberrypi/cam_helper_ov5647.cpp
index 04fb725d42db..5a99083dee78 100644
--- a/src/ipa/raspberrypi/cam_helper_ov5647.cpp
+++ b/src/ipa/raspberrypi/cam_helper_ov5647.cpp
@@ -18,7 +18,7 @@ public:
 	uint32_t gainCode(double gain) const override;
 	double gain(uint32_t gainCode) const override;
 	void getDelays(int &exposureDelay, int &gainDelay,
-		       int &vblankDelay) const override;
+		       int &vblankDelay, int &hblankDelay) const override;
 	unsigned int hideFramesStartup() const override;
 	unsigned int hideFramesModeSwitch() const override;
 	unsigned int mistrustFramesStartup() const override;
@@ -53,7 +53,7 @@ double CamHelperOv5647::gain(uint32_t gainCode) const
 }
 
 void CamHelperOv5647::getDelays(int &exposureDelay, int &gainDelay,
-				int &vblankDelay) const
+				int &vblankDelay, int &hblankDelay) const
 {
 	/*
 	 * We run this sensor in a mode where the gain delay is bumped up to
@@ -62,6 +62,7 @@ void CamHelperOv5647::getDelays(int &exposureDelay, int &gainDelay,
 	exposureDelay = 2;
 	gainDelay = 2;
 	vblankDelay = 2;
+	hblankDelay = 2;
 }
 
 unsigned int CamHelperOv5647::hideFramesStartup() const
diff --git a/src/ipa/raspberrypi/cam_helper_ov9281.cpp b/src/ipa/raspberrypi/cam_helper_ov9281.cpp
index 66f56a31e1b8..86c5bc4c8fda 100644
--- a/src/ipa/raspberrypi/cam_helper_ov9281.cpp
+++ b/src/ipa/raspberrypi/cam_helper_ov9281.cpp
@@ -18,7 +18,7 @@ public:
 	uint32_t gainCode(double gain) const override;
 	double gain(uint32_t gainCode) const override;
 	void getDelays(int &exposureDelay, int &gainDelay,
-		       int &vblankDelay) const override;
+		       int &vblankDelay, int &hblankDelay) const override;
 
 private:
 	/*
@@ -49,12 +49,13 @@ double CamHelperOv9281::gain(uint32_t gainCode) const
 }
 
 void CamHelperOv9281::getDelays(int &exposureDelay, int &gainDelay,
-				int &vblankDelay) const
+				int &vblankDelay, int &hblankDelay) const
 {
 	/* The driver appears to behave as follows: */
 	exposureDelay = 2;
 	gainDelay = 2;
 	vblankDelay = 2;
+	hblankDelay = 2;
 }
 
 static CamHelper *create()
diff --git a/src/ipa/raspberrypi/raspberrypi.cpp b/src/ipa/raspberrypi/raspberrypi.cpp
index 13807f4d47f7..9b0ad4361c97 100644
--- a/src/ipa/raspberrypi/raspberrypi.cpp
+++ b/src/ipa/raspberrypi/raspberrypi.cpp
@@ -219,13 +219,14 @@ int IPARPi::init(const IPASettings &settings, IPAInitResult *result)
 	 * Pass out the sensor config to the pipeline handler in order
 	 * to setup the staggered writer class.
 	 */
-	int gainDelay, exposureDelay, vblankDelay, sensorMetadata;
-	helper_->getDelays(exposureDelay, gainDelay, vblankDelay);
+	int gainDelay, exposureDelay, vblankDelay, hblankDelay, sensorMetadata;
+	helper_->getDelays(exposureDelay, gainDelay, vblankDelay, hblankDelay);
 	sensorMetadata = helper_->sensorEmbeddedDataPresent();
 
 	result->sensorConfig.gainDelay = gainDelay;
 	result->sensorConfig.exposureDelay = exposureDelay;
 	result->sensorConfig.vblankDelay = vblankDelay;
+	result->sensorConfig.hblankDelay = hblankDelay;
 	result->sensorConfig.sensorMetadata = sensorMetadata;
 
 	/* Load the tuning file for this sensor. */
@@ -607,6 +608,7 @@ bool IPARPi::validateSensorControls()
 		V4L2_CID_ANALOGUE_GAIN,
 		V4L2_CID_EXPOSURE,
 		V4L2_CID_VBLANK,
+		V4L2_CID_HBLANK,
 	};
 
 	for (auto c : ctrls) {
diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
index dcd81650c32d..623bec6bea3c 100644
--- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
+++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
@@ -1299,6 +1299,7 @@ int PipelineHandlerRPi::registerCamera(MediaDevice *unicam, MediaDevice *isp, Me
 	std::unordered_map<uint32_t, DelayedControls::ControlParams> params = {
 		{ V4L2_CID_ANALOGUE_GAIN, { result.sensorConfig.gainDelay, false } },
 		{ V4L2_CID_EXPOSURE, { result.sensorConfig.exposureDelay, false } },
+		{ V4L2_CID_HBLANK, { result.sensorConfig.hblankDelay, false } },
 		{ V4L2_CID_VBLANK, { result.sensorConfig.vblankDelay, true } }
 	};
 	data->delayedCtrls_ = std::make_unique<DelayedControls>(data->sensor_->device(), params);
