diff --git a/include/libcamera/internal/global_configuration.h b/include/libcamera/internal/global_configuration.h
index 7ae923977aa6..84bdf90244d9 100644
--- a/include/libcamera/internal/global_configuration.h
+++ b/include/libcamera/internal/global_configuration.h
@@ -52,8 +52,8 @@ public:
 		const std::string delimiter = ":") const;
 
 private:
-	bool loadFile(const std::filesystem::path &fileName);
 	void load();
+	bool loadFile(const std::filesystem::path &fileName);
 
 	std::unique_ptr<ValueNode> yamlConfiguration_ =
 		std::make_unique<ValueNode>();
diff --git a/src/libcamera/global_configuration.cpp b/src/libcamera/global_configuration.cpp
index c4999d32d7c7..c853a028c91d 100644
--- a/src/libcamera/global_configuration.cpp
+++ b/src/libcamera/global_configuration.cpp
@@ -53,6 +53,48 @@ LOG_DEFINE_CATEGORY(Configuration)
  * options, or configuration() to access the whole configuration.
  */
 
+/**
+ * \typedef GlobalConfiguration::Configuration
+ * \brief Type representing global libcamera configuration
+ *
+ * All code outside GlobalConfiguration must use this type declaration and not
+ * the underlying type.
+ */
+
+/**
+ * \brief Initialize the global configuration
+ */
+GlobalConfiguration::GlobalConfiguration()
+{
+	load();
+}
+
+void GlobalConfiguration::load()
+{
+	std::filesystem::path userConfigurationDirectory;
+	const char *xdgConfigHome = utils::secure_getenv("XDG_CONFIG_HOME");
+	if (xdgConfigHome) {
+		userConfigurationDirectory = xdgConfigHome;
+	} else {
+		const char *home = utils::secure_getenv("HOME");
+		if (home)
+			userConfigurationDirectory =
+				std::filesystem::path(home) / ".config";
+	}
+
+	if (!userConfigurationDirectory.empty()) {
+		std::filesystem::path user_configuration_file =
+			userConfigurationDirectory / "libcamera" / "configuration.yaml";
+		if (loadFile(user_configuration_file))
+			return;
+	}
+
+	for (const auto &path : globalConfigurationFiles) {
+		if (loadFile(path))
+			return;
+	}
+}
+
 bool GlobalConfiguration::loadFile(const std::filesystem::path &fileName)
 {
 	File file(fileName);
@@ -85,47 +127,39 @@ bool GlobalConfiguration::loadFile(const std::filesystem::path &fileName)
 	return true;
 }
 
-void GlobalConfiguration::load()
-{
-	std::filesystem::path userConfigurationDirectory;
-	const char *xdgConfigHome = utils::secure_getenv("XDG_CONFIG_HOME");
-	if (xdgConfigHome) {
-		userConfigurationDirectory = xdgConfigHome;
-	} else {
-		const char *home = utils::secure_getenv("HOME");
-		if (home)
-			userConfigurationDirectory =
-				std::filesystem::path(home) / ".config";
-	}
-
-	if (!userConfigurationDirectory.empty()) {
-		std::filesystem::path user_configuration_file =
-			userConfigurationDirectory / "libcamera" / "configuration.yaml";
-		if (loadFile(user_configuration_file))
-			return;
-	}
-
-	for (const auto &path : globalConfigurationFiles) {
-		if (loadFile(path))
-			return;
-	}
-}
-
 /**
- * \brief Initialize the global configuration
- */
-GlobalConfiguration::GlobalConfiguration()
-{
-	load();
-}
-
-/**
- * \typedef GlobalConfiguration::Configuration
- * \brief Type representing global libcamera configuration
+ * \brief Retrieve the configuration version
  *
- * All code outside GlobalConfiguration must use this type declaration and not
- * the underlying type.
+ * The version is declared in the configuration file in the top-level `%version`
+ * element, alongside `%configuration`. This has currently no real use but may be
+ * needed in future if configuration incompatibilities occur.
+ *
+ * \return Configuration version as declared in the configuration file or 0 if
+ * no global configuration is available
  */
+unsigned int GlobalConfiguration::version() const
+{
+	return (*yamlConfiguration_)["version"].get<unsigned int>().value_or(0);
+}
+
+/**
+ * \brief Retrieve the libcamera global configuration
+ *
+ * This returns the whole configuration stored in the top-level section
+ * `%configuration` of the YAML configuration file.
+ *
+ * The requested part of the configuration can be accessed using \a ValueNode
+ * methods.
+ *
+ * \note \a ValueNode type itself shouldn't be used in type declarations to
+ * avoid trouble if we decide to change the underlying data objects in future.
+ *
+ * \return The whole configuration section
+ */
+GlobalConfiguration::Configuration GlobalConfiguration::configuration() const
+{
+	return (*yamlConfiguration_)["configuration"];
+}
 
 /**
  * \fn std::optional<T> GlobalConfiguration::option(const std::initializer_list<std::string_view> &confPath) const
@@ -216,38 +250,4 @@ std::optional<std::vector<std::string>> GlobalConfiguration::envListOption(
 	return listOption(confPath);
 }
 
-/**
- * \brief Retrieve the configuration version
- *
- * The version is declared in the configuration file in the top-level `%version`
- * element, alongside `%configuration`. This has currently no real use but may be
- * needed in future if configuration incompatibilities occur.
- *
- * \return Configuration version as declared in the configuration file or 0 if
- * no global configuration is available
- */
-unsigned int GlobalConfiguration::version() const
-{
-	return (*yamlConfiguration_)["version"].get<unsigned int>().value_or(0);
-}
-
-/**
- * \brief Retrieve the libcamera global configuration
- *
- * This returns the whole configuration stored in the top-level section
- * `%configuration` of the YAML configuration file.
- *
- * The requested part of the configuration can be accessed using \a ValueNode
- * methods.
- *
- * \note \a ValueNode type itself shouldn't be used in type declarations to
- * avoid trouble if we decide to change the underlying data objects in future.
- *
- * \return The whole configuration section
- */
-GlobalConfiguration::Configuration GlobalConfiguration::configuration() const
-{
-	return (*yamlConfiguration_)["configuration"];
-}
-
 } /* namespace libcamera */
