Add Support to do device bind and unbind based on OCC status
Fixes openbmc/openbmc#1698
Change-Id: Iaa33c3065b0358b62e3ec7e39d4b57c6b9d181e1
Signed-off-by: Vishwanatha Subbanna <vishwa@linux.vnet.ibm.com>
diff --git a/occ_device.hpp b/occ_device.hpp
new file mode 100644
index 0000000..dc057be
--- /dev/null
+++ b/occ_device.hpp
@@ -0,0 +1,79 @@
+#pragma once
+
+#include <fstream>
+#include <experimental/filesystem>
+#include "config.h"
+namespace open_power
+{
+namespace occ
+{
+
+namespace fs = std::experimental::filesystem;
+
+/** @class Device
+ * @brief Binds and unbinds the OCC driver upon request
+ */
+class Device
+{
+ public:
+ Device() = delete;
+ ~Device() = default;
+ Device(const Device&) = delete;
+ Device& operator=(const Device&) = delete;
+ Device(Device&&) = default;
+ Device& operator=(Device&&) = default;
+
+ /** @brief Constructs the Device object
+ *
+ * @param[in] name - OCC instance name
+ */
+ Device(const std::string& name) :
+ config(name + '-' + "dev0")
+ {
+ // Nothing to do here
+ }
+
+ /** @brief Binds device to the OCC driver */
+ inline void bind()
+ {
+ return write(bindPath, config);
+ }
+
+ /** @brief Un-binds device from the OCC driver */
+ inline void unBind()
+ {
+ return write(unBindPath, config);
+ }
+
+ private:
+ /** @brief Config value to be used to do bind and unbind */
+ const std::string config;
+
+ /** @brief To bind the device to the OCC driver, do:
+ * Write occ<#>-dev0 to: /sys/bus/platform/drivers/occ-hwmon/bind
+ */
+ static fs::path bindPath;
+
+ /** @brief To un-bind the device from the OCC driver, do:
+ * Write occ<#>-dev0 to: /sys/bus/platform/drivers/occ-hwmon/unbind
+ */
+ static fs::path unBindPath;
+
+ /** @brief file writer to achieve bind and unbind
+ *
+ * @param[in] filename - Name of file to be written
+ * @param[in] data - Data to be written to
+ * @return - None
+ */
+ void write(const fs::path& fileName, const std::string& data)
+ {
+ // If there is an error, move the exception all the way up
+ std::ofstream file(fileName, std::ios::out);
+ file << data;
+ file.close();
+ return;
+ }
+};
+
+} // namespace occ
+} // namespace open_power