xref: /openbmc/phosphor-power/phosphor-power-supply/util.cpp (revision a2a830b1ffa327bd36dcca5c1cac462ae7737a25)
1 #include "util.hpp"
2 
3 #include <gpiod.hpp>
4 
5 namespace phosphor::power::psu
6 {
7 
8 const UtilBase& getUtils()
9 {
10     static Util util;
11     return util;
12 }
13 
14 GPIOInterface::GPIOInterface(const std::string& namedGpio)
15 {
16     try
17     {
18         line = gpiod::find_line(namedGpio);
19         if (!line)
20         {
21             throw std::runtime_error("Line does not exist: " + namedGpio);
22         }
23     }
24     catch (const std::exception& e)
25     {
26         phosphor::logging::log<phosphor::logging::level::ERR>(
27             fmt::format("Failed to find line: {}", e.what()).c_str());
28         throw;
29     }
30 }
31 
32 std::unique_ptr<GPIOInterfaceBase>
33     GPIOInterface::createGPIO(const std::string& namedGpio)
34 {
35     return std::make_unique<GPIOInterface>(namedGpio);
36 }
37 
38 std::string GPIOInterface::getName() const
39 {
40     return line.name();
41 }
42 
43 int GPIOInterface::read()
44 {
45     using namespace phosphor::logging;
46 
47     int value = -1;
48 
49     if (!line)
50     {
51         log<level::ERR>("Failed line");
52         throw std::runtime_error{std::string{"Failed to find line"}};
53     }
54 
55     try
56     {
57         line.request({__FUNCTION__, gpiod::line_request::DIRECTION_INPUT,
58                       gpiod::line_request::FLAG_ACTIVE_LOW});
59         try
60         {
61             value = line.get_value();
62         }
63         catch (const std::exception& e)
64         {
65             log<level::ERR>(
66                 fmt::format("Failed to get_value of GPIO line: {}", e.what())
67                     .c_str());
68             line.release();
69             throw;
70         }
71 
72         line.release();
73     }
74     catch (const std::exception& e)
75     {
76         log<level::ERR>("Failed to request GPIO line",
77                         entry("MSG=%s", e.what()));
78         throw;
79     }
80 
81     return value;
82 }
83 
84 void GPIOInterface::write(int value, std::bitset<32> flags)
85 {
86     using namespace phosphor::logging;
87 
88     if (!line)
89     {
90         log<level::ERR>("Failed line");
91         throw std::runtime_error{std::string{"Failed to find line"}};
92     }
93 
94     try
95     {
96         line.request(
97             {__FUNCTION__, gpiod::line_request::DIRECTION_OUTPUT, flags},
98             value);
99 
100         line.release();
101     }
102     catch (std::exception& e)
103     {
104         log<level::ERR>("Failed to set GPIO line", entry("MSG=%s", e.what()),
105                         entry("VALUE=%d", value));
106         throw;
107     }
108 }
109 
110 std::unique_ptr<GPIOInterfaceBase> createGPIO(const std::string& namedGpio)
111 {
112     return GPIOInterface::createGPIO(namedGpio);
113 }
114 
115 } // namespace phosphor::power::psu
116