diff --git a/targets.hpp b/targets.hpp
index 9867ba9..317eec5 100644
--- a/targets.hpp
+++ b/targets.hpp
@@ -1,14 +1,15 @@
 #pragma once
 
+#include "env.hpp"
+#include "fan_pwm.hpp"
+#include "fan_speed.hpp"
+#include "hwmonio.hpp"
+
 #include <experimental/filesystem>
 #include <memory>
 #include <phosphor-logging/elog-errors.hpp>
 #include <phosphor-logging/log.hpp>
 #include <xyz/openbmc_project/Sensor/Device/error.hpp>
-#include "env.hpp"
-#include "fan_speed.hpp"
-#include "fan_pwm.hpp"
-#include "hwmonio.hpp"
 
 enum class targetType
 {
@@ -64,8 +65,7 @@
 template <typename T>
 std::shared_ptr<T> addTarget(const SensorSet::key_type& sensor,
                              const hwmonio::HwmonIO& ioAccess,
-                             const std::string& devPath,
-                             ObjectInfo& info)
+                             const std::string& devPath, ObjectInfo& info)
 {
     std::shared_ptr<T> target;
     namespace fs = std::experimental::filesystem;
@@ -98,10 +98,8 @@
         entry = empty;
     }
 
-    sysfsFullPath = sysfs::make_sysfs_path(ioAccess.path(),
-                                           targetName,
-                                           targetId,
-                                           entry);
+    sysfsFullPath =
+        sysfs::make_sysfs_path(ioAccess.path(), targetName, targetId, entry);
     if (fs::exists(sysfsFullPath))
     {
         auto useTarget = true;
@@ -128,11 +126,10 @@
             else
             {
                 using namespace phosphor::logging;
-                log<level::ERR>("Invalid TARGET_MODE env var found",
-                        phosphor::logging::entry(
-                                "TARGET_MODE=%s", tmEnv.c_str()),
-                        phosphor::logging::entry(
-                                "DEVPATH=%s", devPath.c_str()));
+                log<level::ERR>(
+                    "Invalid TARGET_MODE env var found",
+                    phosphor::logging::entry("TARGET_MODE=%s", tmEnv.c_str()),
+                    phosphor::logging::entry("DEVPATH=%s", devPath.c_str()));
             }
         }
 
@@ -142,40 +139,31 @@
 
             try
             {
-                targetSpeed = ioAccess.read(
-                    targetName,
-                    targetId,
-                    entry,
-                    hwmonio::retries,
-                    hwmonio::delay);
+                targetSpeed = ioAccess.read(targetName, targetId, entry,
+                                            hwmonio::retries, hwmonio::delay);
             }
             catch (const std::system_error& e)
             {
                 using namespace phosphor::logging;
-                using namespace sdbusplus::xyz::openbmc_project::
-                    Sensor::Device::Error;
-                using metadata = xyz::openbmc_project::Sensor::
-                    Device::ReadFailure;
+                using namespace sdbusplus::xyz::openbmc_project::Sensor::
+                    Device::Error;
+                using metadata =
+                    xyz::openbmc_project::Sensor::Device::ReadFailure;
 
                 report<ReadFailure>(
-                        metadata::CALLOUT_ERRNO(e.code().value()),
-                        metadata::CALLOUT_DEVICE_PATH(devPath.c_str()));
+                    metadata::CALLOUT_ERRNO(e.code().value()),
+                    metadata::CALLOUT_DEVICE_PATH(devPath.c_str()));
 
-                log<level::INFO>("Logging failing sysfs file",
-                        phosphor::logging::entry(
-                                "FILE=%s", sysfsFullPath.c_str()));
+                log<level::INFO>(
+                    "Logging failing sysfs file",
+                    phosphor::logging::entry("FILE=%s", sysfsFullPath.c_str()));
             }
 
             // ioAccess.path() is a path like: /sys/class/hwmon/hwmon1
             target = std::make_shared<T>(
-                    std::move(std::make_unique<hwmonio::HwmonIO>(
-                            ioAccess.path())),
-                    devPath,
-                    targetId,
-                    bus,
-                    objPath.c_str(),
-                    deferSignals,
-                    targetSpeed);
+                std::move(std::make_unique<hwmonio::HwmonIO>(ioAccess.path())),
+                devPath, targetId, bus, objPath.c_str(), deferSignals,
+                targetSpeed);
             obj[type] = target;
         }
     }
