diff --git a/src/ipa/simple/algorithms/blc.cpp b/src/ipa/simple/algorithms/blc.cpp
index d01c2c14..5dc924bb 100644
--- a/src/ipa/simple/algorithms/blc.cpp
+++ b/src/ipa/simple/algorithms/blc.cpp
@@ -21,10 +21,11 @@ BlackLevel::BlackLevel()
 {
 }
 
-int BlackLevel::init(IPAContext &context,
-		     [[maybe_unused]] const YamlObject &tuningData)
+int BlackLevel::configure(typename Module::Context &context,
+			  [[maybe_unused]] const typename Module::Config &configInfo)
 {
-	context.activeState.black.level = 1.0;
+	context.activeState.black.level =
+		context.configuration.black.level.value_or(1.0);
 	return 0;
 }
 
@@ -34,6 +35,9 @@ void BlackLevel::process(IPAContext &context,
 			 const SwIspStats *stats,
 			 [[maybe_unused]] ControlList &metadata)
 {
+	if (context.configuration.black.level.has_value())
+		return;
+
 	if (frameContext.sensor.exposure == exposure_ &&
 	    frameContext.sensor.gain == gain_) {
 		return;
diff --git a/src/ipa/simple/algorithms/blc.h b/src/ipa/simple/algorithms/blc.h
index 9b9daab1..586a23d2 100644
--- a/src/ipa/simple/algorithms/blc.h
+++ b/src/ipa/simple/algorithms/blc.h
@@ -24,7 +24,8 @@ public:
 	BlackLevel();
 	~BlackLevel() = default;
 
-	int init(IPAContext &context, const YamlObject &tuningData)
+	int configure(typename Module::Context &context,
+		      const typename Module::Config &configInfo)
 		override;
 	void process(IPAContext &context, const uint32_t frame,
 		     IPAFrameContext &frameContext,
diff --git a/src/ipa/simple/ipa_context.h b/src/ipa/simple/ipa_context.h
index 0e2096f8..08f965f4 100644
--- a/src/ipa/simple/ipa_context.h
+++ b/src/ipa/simple/ipa_context.h
@@ -8,6 +8,7 @@
 #pragma once
 
 #include <array>
+#include <optional>
 
 #include <libcamera/controls.h>
 
@@ -24,7 +25,7 @@ struct IPASessionConfiguration {
 		double againMin, againMax, againMinStep;
 	} agc;
 	struct {
-		double level;
+		std::optional<double> level;
 	} black;
 };
 
diff --git a/src/ipa/simple/soft_simple.cpp b/src/ipa/simple/soft_simple.cpp
index aef5f6e5..ac7a22b7 100644
--- a/src/ipa/simple/soft_simple.cpp
+++ b/src/ipa/simple/soft_simple.cpp
@@ -201,6 +201,9 @@ int IPASoftSimple::configure(const IPAConfigInfo &configInfo)
 			(context_.configuration.agc.againMax -
 			 context_.configuration.agc.againMin) /
 			100.0;
+		if (camHelper_->blackLevel().has_value())
+			context_.configuration.black.level =
+				camHelper_->blackLevel().value() / 65536.0;
 	} else {
 		/*
 		 * The camera sensor gain (g) is usually not equal to the value written
