xref: /openbmc/phosphor-bmc-code-mgmt/common/include/gpio_controller.hpp (revision e634411ba7c22d18ae01a0b03ce4f7b881c38fcc)
1*e634411bSHenry Wu #pragma once
2*e634411bSHenry Wu 
3*e634411bSHenry Wu #include <gpiod.hpp>
4*e634411bSHenry Wu 
5*e634411bSHenry Wu #include <string>
6*e634411bSHenry Wu 
7*e634411bSHenry Wu std::vector<std::unique_ptr<::gpiod::line_bulk>> requestMuxGPIOs(
8*e634411bSHenry Wu     const std::vector<std::string>& gpioLines,
9*e634411bSHenry Wu     const std::vector<bool>& gpioPolarities, bool inverted);
10*e634411bSHenry Wu 
11*e634411bSHenry Wu /*
12*e634411bSHenry Wu  * @class GPIOGroup
13*e634411bSHenry Wu  * @brief A group of GPIO lines to be muxed together
14*e634411bSHenry Wu  */
15*e634411bSHenry Wu class GPIOGroup
16*e634411bSHenry Wu {
17*e634411bSHenry Wu   public:
18*e634411bSHenry Wu     GPIOGroup(std::vector<std::string> lines, std::vector<bool> polarities);
19*e634411bSHenry Wu 
20*e634411bSHenry Wu     ~GPIOGroup();
21*e634411bSHenry Wu 
22*e634411bSHenry Wu     // GPIOs set to route mux to the BMC
23*e634411bSHenry Wu     bool muxToBMC();
24*e634411bSHenry Wu     // GPIOs set to the opposite values to route mux to the external device
25*e634411bSHenry Wu     bool muxToDevice();
26*e634411bSHenry Wu 
27*e634411bSHenry Wu     void releaseAll();
28*e634411bSHenry Wu 
29*e634411bSHenry Wu     GPIOGroup(const GPIOGroup&) = delete;
30*e634411bSHenry Wu     GPIOGroup& operator=(const GPIOGroup&) = delete;
31*e634411bSHenry Wu     GPIOGroup(GPIOGroup&& /*other*/) noexcept;
32*e634411bSHenry Wu     GPIOGroup& operator=(GPIOGroup&& /*other*/) noexcept;
33*e634411bSHenry Wu 
34*e634411bSHenry Wu   private:
35*e634411bSHenry Wu     bool mux(bool inverted);
36*e634411bSHenry Wu 
37*e634411bSHenry Wu     std::vector<std::string> lines;
38*e634411bSHenry Wu     std::vector<bool> polarities;
39*e634411bSHenry Wu     std::vector<std::unique_ptr<::gpiod::line_bulk>> activeBulks;
40*e634411bSHenry Wu };
41*e634411bSHenry Wu 
42*e634411bSHenry Wu /*
43*e634411bSHenry Wu  * @class ScopedBmcMux
44*e634411bSHenry Wu  * @brief A RAII wrapper to mux GPIO lines to BMC on construction
45*e634411bSHenry Wu  * and back to device on destruction
46*e634411bSHenry Wu  */
47*e634411bSHenry Wu class ScopedBmcMux
48*e634411bSHenry Wu {
49*e634411bSHenry Wu   public:
50*e634411bSHenry Wu     explicit ScopedBmcMux(GPIOGroup& group);
51*e634411bSHenry Wu     ~ScopedBmcMux();
52*e634411bSHenry Wu 
53*e634411bSHenry Wu     ScopedBmcMux(const ScopedBmcMux&) = delete;
54*e634411bSHenry Wu     ScopedBmcMux& operator=(const ScopedBmcMux&) = delete;
55*e634411bSHenry Wu 
56*e634411bSHenry Wu     ScopedBmcMux(ScopedBmcMux&& /*other*/) = delete;
57*e634411bSHenry Wu     ScopedBmcMux& operator=(ScopedBmcMux&& /*other*/) = delete;
58*e634411bSHenry Wu 
59*e634411bSHenry Wu   private:
60*e634411bSHenry Wu     GPIOGroup& gpioGroup;
61*e634411bSHenry Wu };
62