xref: /openbmc/phosphor-hwmon/fan_speed.hpp (revision ad6043f6)
1 #pragma once
2 
3 #include "hwmonio.hpp"
4 #include "interface.hpp"
5 #include "sysfs.hpp"
6 
7 #include <memory>
8 
9 namespace hwmon
10 {
11 
12 /**
13  * @class FanSpeed
14  * @brief Target fan speed control implementation
15  * @details Derived FanSpeedObject type that writes the target value to sysfs
16  * which in turn sets the fan speed to that target value
17  */
18 class FanSpeed : public FanSpeedObject
19 {
20   public:
21     /**
22      * @brief Constructs FanSpeed Object
23      *
24      * @param[in] io -  HwmonIO(instance path) (ex /sys/class/hwmon/hwmon1)
25      * @param[in] devPath - The /sys/devices sysfs path
26      * @param[in] id - The hwmon id
27      * @param[in] bus - Dbus bus object
28      * @param[in] objPath - Dbus object path
29      * @param[in] defer - Dbus object registration defer
30      * @param[in] target - initial target speed value
31      */
32     FanSpeed(std::unique_ptr<hwmonio::HwmonIOInterface> io,
33              const std::string& devPath, const std::string& id,
34              sdbusplus::bus_t& bus, const char* objPath, bool defer,
35              uint64_t target) :
36         FanSpeedObject(bus, objPath,
37                        defer ? FanSpeedObject::action::emit_no_signals
38                              : FanSpeedObject::action::emit_object_added),
39         _id(id), _ioAccess(std::move(io)), _devPath(devPath)
40     {
41         FanSpeedObject::target(target);
42     }
43 
44     /**
45      * @brief Set the value of target
46      *
47      * @return Value of target
48      */
49     uint64_t target(uint64_t value) override;
50 
51     /**
52      * @brief Writes the pwm_enable sysfs entry if the
53      *        env var with the value to write is present
54      */
55     void enable();
56 
57   private:
58     /** @brief hwmon type */
59     static constexpr auto _type = "fan";
60     /** @brief hwmon id */
61     std::string _id;
62     /** @brief Hwmon sysfs access. */
63     std::unique_ptr<hwmonio::HwmonIOInterface> _ioAccess;
64     /** @brief Physical device path. */
65     std::string _devPath;
66 };
67 
68 } // namespace hwmon
69