diff --git a/src/ipa/rpi/controller/rpi/agc_channel.cpp b/src/ipa/rpi/controller/rpi/agc_channel.cpp
index cf0e77bd..c9462eed 100644
--- a/src/ipa/rpi/controller/rpi/agc_channel.cpp
+++ b/src/ipa/rpi/controller/rpi/agc_channel.cpp
@@ -941,8 +941,8 @@ void AgcChannel::divideUpExposure()
 	/* Finally work out the digital gain that we will need. */
 	filtered_.totalExposureNoDG = analogueGain * exposureTime;
 	double digitalGain = filtered_.totalExposure / filtered_.totalExposureNoDG;
-	/* Limit dg by what is allowed. */
-	digitalGain = std::min(digitalGain, config_.maxDigitalGain);
+	/* Limit dg by what is allowed (and to 1.0 to avoid saturation issues). */
+	digitalGain = std::clamp(digitalGain, 1.0, config_.maxDigitalGain);
 	/* Update total exposure, in case the dg went down. */
 	filtered_.totalExposure = filtered_.totalExposureNoDG * digitalGain;
 
