diff --git a/include/libcamera/internal/ipa_manager.h b/include/libcamera/internal/ipa_manager.h
index aaa3ca37c..7ab193112 100644
--- a/include/libcamera/internal/ipa_manager.h
+++ b/include/libcamera/internal/ipa_manager.h
@@ -34,10 +34,10 @@ public:
 	~IPAManager();
 
 	template<typename T>
-	std::unique_ptr<T> createIPA(PipelineHandler *pipe, uint32_t minVersion,
+	std::unique_ptr<T> createIPA(const char *name, uint32_t minVersion,
 				     uint32_t maxVersion)
 	{
-		IPAModule *m = module(pipe, minVersion, maxVersion);
+		IPAModule *m = module(name, minVersion, maxVersion);
 		if (!m)
 			return nullptr;
 
@@ -68,7 +68,7 @@ private:
 		      std::vector<std::string> &files);
 	unsigned int addDir(const char *libDir, unsigned int maxDepth = 0);
 
-	IPAModule *module(PipelineHandler *pipe, uint32_t minVersion,
+	IPAModule *module(const char *name, uint32_t minVersion,
 			  uint32_t maxVersion);
 
 	bool isSignatureValid(IPAModule *ipa) const;
diff --git a/include/libcamera/internal/ipa_module.h b/include/libcamera/internal/ipa_module.h
index 15f19492c..a0a53764e 100644
--- a/include/libcamera/internal/ipa_module.h
+++ b/include/libcamera/internal/ipa_module.h
@@ -36,8 +36,8 @@ public:
 
 	IPAInterface *createInterface();
 
-	bool match(PipelineHandler *pipe,
-		   uint32_t minVersion, uint32_t maxVersion) const;
+	bool match(const char *name, uint32_t minVersion,
+		   uint32_t maxVersion) const;
 
 protected:
 	std::string logPrefix() const override;
diff --git a/include/libcamera/internal/pipeline_handler.h b/include/libcamera/internal/pipeline_handler.h
index 6922ce18e..b60c07b13 100644
--- a/include/libcamera/internal/pipeline_handler.h
+++ b/include/libcamera/internal/pipeline_handler.h
@@ -76,7 +76,14 @@ public:
 	std::unique_ptr<T> createIPA(uint32_t minVersion, uint32_t maxVersion)
 	{
 		IPAManager *ipaManager = manager_->_d()->ipaManager();
-		return ipaManager->createIPA<T>(this, minVersion, maxVersion);
+		return ipaManager->createIPA<T>(name_, minVersion, maxVersion);
+	}
+
+	template<typename T>
+	std::unique_ptr<T> createIPA(const char *ipaName, uint32_t minVersion, uint32_t maxVersion)
+	{
+		IPAManager *ipaManager = manager_->_d()->ipaManager();
+		return ipaManager->createIPA<T>(ipaName, minVersion, maxVersion);
 	}
 
 protected:
diff --git a/src/libcamera/ipa_manager.cpp b/src/libcamera/ipa_manager.cpp
index 41918e4c2..b709a024e 100644
--- a/src/libcamera/ipa_manager.cpp
+++ b/src/libcamera/ipa_manager.cpp
@@ -248,15 +248,15 @@ unsigned int IPAManager::addDir(const char *libDir, unsigned int maxDepth)
 
 /**
  * \brief Retrieve an IPA module that matches a given pipeline handler
- * \param[in] pipe The pipeline handler
+ * \param[in] name The IPA module string identifier
  * \param[in] minVersion Minimum acceptable version of IPA module
  * \param[in] maxVersion Maximum acceptable version of IPA module
  */
-IPAModule *IPAManager::module(PipelineHandler *pipe, uint32_t minVersion,
+IPAModule *IPAManager::module(const char *name, uint32_t minVersion,
 			      uint32_t maxVersion)
 {
 	for (const auto &module : modules_) {
-		if (module->match(pipe, minVersion, maxVersion))
+		if (module->match(name, minVersion, maxVersion))
 			return module.get();
 	}
 
@@ -266,7 +266,7 @@ IPAModule *IPAManager::module(PipelineHandler *pipe, uint32_t minVersion,
 /**
  * \fn IPAManager::createIPA()
  * \brief Create an IPA proxy that matches a given pipeline handler
- * \param[in] pipe The pipeline handler that wants a matching IPA proxy
+ * \param[in] name The IPA module name
  * \param[in] minVersion Minimum acceptable version of IPA module
  * \param[in] maxVersion Maximum acceptable version of IPA module
  *
diff --git a/src/libcamera/ipa_module.cpp b/src/libcamera/ipa_module.cpp
index e6ea61e44..c89887954 100644
--- a/src/libcamera/ipa_module.cpp
+++ b/src/libcamera/ipa_module.cpp
@@ -462,22 +462,22 @@ IPAInterface *IPAModule::createInterface()
 }
 
 /**
- * \brief Verify if the IPA module matches a given pipeline handler
- * \param[in] pipe Pipeline handler to match with
+ * \brief Verify if the IPA module matches a given name
+ * \param[in] name The IPA module name
  * \param[in] minVersion Minimum acceptable version of IPA module
  * \param[in] maxVersion Maximum acceptable version of IPA module
  *
- * This function checks if this IPA module matches the \a pipe pipeline handler,
+ * This function checks if this IPA module matches the requested \a name
  * and the input version range.
  *
- * \return True if the pipeline handler matches the IPA module, or false otherwise
+ * \return True if the IPA module matches, or false otherwise
  */
-bool IPAModule::match(PipelineHandler *pipe,
-		      uint32_t minVersion, uint32_t maxVersion) const
+bool IPAModule::match(const char *name, uint32_t minVersion,
+		      uint32_t maxVersion) const
 {
 	return info_.pipelineVersion >= minVersion &&
 	       info_.pipelineVersion <= maxVersion &&
-	       !strcmp(info_.pipelineName, pipe->name());
+	       !strcmp(info_.name, name);
 }
 
 std::string IPAModule::logPrefix() const
diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp
index e7145c1d4..25fc11989 100644
--- a/src/libcamera/pipeline_handler.cpp
+++ b/src/libcamera/pipeline_handler.cpp
@@ -836,11 +836,32 @@ void PipelineHandler::disconnect()
  */
 
 /**
- * \fn PipelineHandler::createIPA()
- * \brief Create an IPA proxy that matches this pipeline handler
+ * \fn PipelineHandler::createIPA(const char *ipaName, uint32_t minVersion, uint32_t maxVersion)
+ * \brief Create an IPA proxy that matches the requested name and version
+ * \param[in] ipaName The IPA module name
  * \param[in] minVersion Minimum acceptable version of IPA module
  * \param[in] maxVersion Maximum acceptable version of IPA module
  *
+ * Create an IPA module using \a ipaName as the matching identifier. This
+ * overload allows pipeline handlers to create an IPA module by specifying its
+ * name instead of relying on the fact that the IPA module matches the pipeline
+ * handler's one.
+ *
+ * \return A newly created IPA proxy, or nullptr if no matching IPA module is
+ * found or if the IPA proxy fails to initialize
+ */
+
+/**
+ * \fn PipelineHandler::createIPA(uint32_t minVersion, uint32_t maxVersion)
+ * \brief Create an IPA proxy that matches the pipeline handler name and the
+ * requested version
+ * \param[in] minVersion Minimum acceptable version of IPA module
+ * \param[in] maxVersion Maximum acceptable version of IPA module
+ *
+ * Create an IPA module using the pipeline handler name as the matching
+ * identifier. This overload allows pipeline handler to create an IPA module
+ * whose name matches the pipeline handler one.
+ *
  * \return A newly created IPA proxy, or nullptr if no matching IPA module is
  * found or if the IPA proxy fails to initialize
  */
