diff --git a/phosphor-power-supply/psu_manager.cpp b/phosphor-power-supply/psu_manager.cpp
index 63473f7..1940eea 100644
--- a/phosphor-power-supply/psu_manager.cpp
+++ b/phosphor-power-supply/psu_manager.cpp
@@ -441,56 +441,59 @@
         return;
     }
 
+    std::map<std::string, std::string> additionalData;
+    auto supported = hasRequiredPSUs(additionalData);
+    if (supported)
+    {
+        runValidateConfig = false;
+        return;
+    }
+
+    // Validation failed, create an error log.
+    // Return without setting the runValidateConfig flag to false because
+    // it may be that an additional supported configuration interface is
+    // added and we need to validate it to see if it matches this system.
+    createError("xyz.openbmc_project.Power.PowerSupply.Error.NotSupported",
+                additionalData);
+}
+
+bool PSUManager::hasRequiredPSUs(
+    std::map<std::string, std::string>& additionalData)
+{
     // Check that all PSUs have the same model name. Initialize the model
     // variable with the first PSU name found, then use it as a base to compare
     // against the rest of the PSUs.
-    // Also record the number of present PSUs to verify afterwards.
-    auto presentCount = 0;
     std::string model{};
-    for (const auto& p : psus)
+    for (const auto& psu : psus)
     {
-        auto psuModel = p->getModelName();
+        auto psuModel = psu->getModelName();
         if (psuModel.empty())
         {
             continue;
         }
-        if (p->isPresent())
-        {
-            presentCount++;
-        }
         if (model.empty())
         {
             model = psuModel;
             continue;
         }
-        if (psuModel.compare(model) != 0)
+        if (psuModel != model)
         {
-            log<level::ERR>(
-                fmt::format("Mismatched power supply models: {}, {}",
-                            model.c_str(), psuModel.c_str())
-                    .c_str());
-            std::map<std::string, std::string> additionalData;
             additionalData["EXPECTED_MODEL"] = model;
             additionalData["ACTUAL_MODEL"] = psuModel;
-            additionalData["CALLOUT_INVENTORY_PATH"] = p->getInventoryPath();
-            createError(
-                "xyz.openbmc_project.Power.PowerSupply.Error.NotSupported",
-                additionalData);
-
-            // No need to do the validation anymore, a mismatched model needs to
-            // be fixed by the user.
-            runValidateConfig = false;
-            return;
+            additionalData["CALLOUT_INVENTORY_PATH"] = psu->getInventoryPath();
+            return false;
         }
     }
 
+    auto presentCount =
+        std::count_if(psus.begin(), psus.end(),
+                      [](const auto& psu) { return psu->isPresent(); });
+
     // Validate the supported configurations. A system may support more than one
     // power supply model configuration.
-    bool supported = false;
-    std::map<std::string, std::string> additionalData;
     for (const auto& config : supportedConfigs)
     {
-        if (config.first.compare(model) != 0)
+        if (config.first != model)
         {
             continue;
         }
@@ -498,24 +501,13 @@
         {
             additionalData["EXPECTED_COUNT"] =
                 std::to_string(config.second.powerSupplyCount);
+            additionalData["ACTUAL_COUNT"] = std::to_string(presentCount);
             continue;
         }
-        supported = true;
-        runValidateConfig = false;
-        break;
+        return true;
     }
-    if (!supported)
-    {
-        additionalData["ACTUAL_MODEL"] = model;
-        additionalData["ACTUAL_COUNT"] = std::to_string(presentCount);
-        createError("xyz.openbmc_project.Power.PowerSupply.Error.NotSupported",
-                    additionalData);
 
-        // Return without setting the runValidateConfig flag to false because
-        // it may be that an additional supported configuration interface is
-        // added and we need to validate it to see if it matches this system.
-        return;
-    }
+    return false;
 }
 
 } // namespace phosphor::power::manager
