xref: /openbmc/phosphor-power/phosphor-power-sequencer/src/basic_device.hpp (revision 739446763f6f398dac57e82e44b07ea198df4761)
1*73944676SShawn McCarney /**
2*73944676SShawn McCarney  * Copyright © 2025 IBM Corporation
3*73944676SShawn McCarney  *
4*73944676SShawn McCarney  * Licensed under the Apache License, Version 2.0 (the "License");
5*73944676SShawn McCarney  * you may not use this file except in compliance with the License.
6*73944676SShawn McCarney  * You may obtain a copy of the License at
7*73944676SShawn McCarney  *
8*73944676SShawn McCarney  *     http://www.apache.org/licenses/LICENSE-2.0
9*73944676SShawn McCarney  *
10*73944676SShawn McCarney  * Unless required by applicable law or agreed to in writing, software
11*73944676SShawn McCarney  * distributed under the License is distributed on an "AS IS" BASIS,
12*73944676SShawn McCarney  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*73944676SShawn McCarney  * See the License for the specific language governing permissions and
14*73944676SShawn McCarney  * limitations under the License.
15*73944676SShawn McCarney  */
16*73944676SShawn McCarney #pragma once
17*73944676SShawn McCarney 
18*73944676SShawn McCarney #include "gpio.hpp"
19*73944676SShawn McCarney #include "power_sequencer_device.hpp"
20*73944676SShawn McCarney #include "rail.hpp"
21*73944676SShawn McCarney #include "services.hpp"
22*73944676SShawn McCarney 
23*73944676SShawn McCarney #include <cstdint>
24*73944676SShawn McCarney #include <memory>
25*73944676SShawn McCarney #include <string>
26*73944676SShawn McCarney #include <utility>
27*73944676SShawn McCarney #include <vector>
28*73944676SShawn McCarney 
29*73944676SShawn McCarney namespace phosphor::power::sequencer
30*73944676SShawn McCarney {
31*73944676SShawn McCarney 
32*73944676SShawn McCarney /**
33*73944676SShawn McCarney  * @class BasicDevice
34*73944676SShawn McCarney  *
35*73944676SShawn McCarney  * PowerSequencerDevice sub-class that implements basic functionality.
36*73944676SShawn McCarney  *
37*73944676SShawn McCarney  * BasicDevice implements the following:
38*73944676SShawn McCarney  * - Data members and methods for the power sequencer properties from the JSON
39*73944676SShawn McCarney  *   configuration file.
40*73944676SShawn McCarney  * - Methods that utilize the named GPIOs, such as powerOn() and getPowerGood().
41*73944676SShawn McCarney  */
42*73944676SShawn McCarney class BasicDevice : public PowerSequencerDevice
43*73944676SShawn McCarney {
44*73944676SShawn McCarney   public:
45*73944676SShawn McCarney     BasicDevice() = delete;
46*73944676SShawn McCarney     BasicDevice(const BasicDevice&) = delete;
47*73944676SShawn McCarney     BasicDevice(BasicDevice&&) = delete;
48*73944676SShawn McCarney     BasicDevice& operator=(const BasicDevice&) = delete;
49*73944676SShawn McCarney     BasicDevice& operator=(BasicDevice&&) = delete;
50*73944676SShawn McCarney     virtual ~BasicDevice() = default;
51*73944676SShawn McCarney 
52*73944676SShawn McCarney     /**
53*73944676SShawn McCarney      * Constructor.
54*73944676SShawn McCarney      *
55*73944676SShawn McCarney      * Throws an exception if an error occurs during initialization.
56*73944676SShawn McCarney      *
57*73944676SShawn McCarney      * @param name device name
58*73944676SShawn McCarney      * @param bus I2C bus for the device
59*73944676SShawn McCarney      * @param address I2C address for the device
60*73944676SShawn McCarney      * @param powerControlGPIOName name of the GPIO that turns this device on
61*73944676SShawn McCarney      *                             and off
62*73944676SShawn McCarney      * @param powerGoodGPIOName name of the GPIO that reads the power good
63*73944676SShawn McCarney      *                          signal from this device
64*73944676SShawn McCarney      * @param rails voltage rails that are enabled and monitored by this device
65*73944676SShawn McCarney      * @param services System services like hardware presence and the journal
66*73944676SShawn McCarney      */
BasicDevice(const std::string & name,uint8_t bus,uint16_t address,const std::string & powerControlGPIOName,const std::string & powerGoodGPIOName,std::vector<std::unique_ptr<Rail>> rails,Services & services)67*73944676SShawn McCarney     explicit BasicDevice(const std::string& name, uint8_t bus, uint16_t address,
68*73944676SShawn McCarney                          const std::string& powerControlGPIOName,
69*73944676SShawn McCarney                          const std::string& powerGoodGPIOName,
70*73944676SShawn McCarney                          std::vector<std::unique_ptr<Rail>> rails,
71*73944676SShawn McCarney                          Services& services) :
72*73944676SShawn McCarney         name{name}, bus{bus}, address{address},
73*73944676SShawn McCarney         powerControlGPIOName{powerControlGPIOName},
74*73944676SShawn McCarney         powerGoodGPIOName{powerGoodGPIOName}, rails{std::move(rails)}
75*73944676SShawn McCarney     {
76*73944676SShawn McCarney         powerControlGPIO = services.createGPIO(powerControlGPIOName);
77*73944676SShawn McCarney 
78*73944676SShawn McCarney         powerGoodGPIO = services.createGPIO(powerGoodGPIOName);
79*73944676SShawn McCarney         powerGoodGPIO->requestRead();
80*73944676SShawn McCarney     }
81*73944676SShawn McCarney 
82*73944676SShawn McCarney     /** @copydoc PowerSequencerDevice::getName() */
getName() const83*73944676SShawn McCarney     virtual const std::string& getName() const override
84*73944676SShawn McCarney     {
85*73944676SShawn McCarney         return name;
86*73944676SShawn McCarney     }
87*73944676SShawn McCarney 
88*73944676SShawn McCarney     /** @copydoc PowerSequencerDevice::getBus() */
getBus() const89*73944676SShawn McCarney     virtual uint8_t getBus() const override
90*73944676SShawn McCarney     {
91*73944676SShawn McCarney         return bus;
92*73944676SShawn McCarney     }
93*73944676SShawn McCarney 
94*73944676SShawn McCarney     /** @copydoc PowerSequencerDevice::getAddress() */
getAddress() const95*73944676SShawn McCarney     virtual uint16_t getAddress() const override
96*73944676SShawn McCarney     {
97*73944676SShawn McCarney         return address;
98*73944676SShawn McCarney     }
99*73944676SShawn McCarney 
100*73944676SShawn McCarney     /** @copydoc PowerSequencerDevice::getPowerControlGPIOName() */
getPowerControlGPIOName() const101*73944676SShawn McCarney     virtual const std::string& getPowerControlGPIOName() const override
102*73944676SShawn McCarney     {
103*73944676SShawn McCarney         return powerControlGPIOName;
104*73944676SShawn McCarney     }
105*73944676SShawn McCarney 
106*73944676SShawn McCarney     /** @copydoc PowerSequencerDevice::getPowerGoodGPIOName() */
getPowerGoodGPIOName() const107*73944676SShawn McCarney     virtual const std::string& getPowerGoodGPIOName() const override
108*73944676SShawn McCarney     {
109*73944676SShawn McCarney         return powerGoodGPIOName;
110*73944676SShawn McCarney     }
111*73944676SShawn McCarney 
112*73944676SShawn McCarney     /** @copydoc PowerSequencerDevice::getRails() */
getRails() const113*73944676SShawn McCarney     virtual const std::vector<std::unique_ptr<Rail>>& getRails() const override
114*73944676SShawn McCarney     {
115*73944676SShawn McCarney         return rails;
116*73944676SShawn McCarney     }
117*73944676SShawn McCarney 
118*73944676SShawn McCarney     /** @copydoc PowerSequencerDevice::getPowerControlGPIO() */
getPowerControlGPIO()119*73944676SShawn McCarney     virtual GPIO& getPowerControlGPIO() override
120*73944676SShawn McCarney     {
121*73944676SShawn McCarney         return *powerControlGPIO;
122*73944676SShawn McCarney     }
123*73944676SShawn McCarney 
124*73944676SShawn McCarney     /** @copydoc PowerSequencerDevice::getPowerGoodGPIO() */
getPowerGoodGPIO()125*73944676SShawn McCarney     virtual GPIO& getPowerGoodGPIO() override
126*73944676SShawn McCarney     {
127*73944676SShawn McCarney         return *powerGoodGPIO;
128*73944676SShawn McCarney     }
129*73944676SShawn McCarney 
130*73944676SShawn McCarney     /** @copydoc PowerSequencerDevice::powerOn() */
powerOn()131*73944676SShawn McCarney     virtual void powerOn() override
132*73944676SShawn McCarney     {
133*73944676SShawn McCarney         powerControlGPIO->requestWrite(1);
134*73944676SShawn McCarney         powerControlGPIO->setValue(1);
135*73944676SShawn McCarney         powerControlGPIO->release();
136*73944676SShawn McCarney     }
137*73944676SShawn McCarney 
138*73944676SShawn McCarney     /** @copydoc PowerSequencerDevice::powerOff() */
powerOff()139*73944676SShawn McCarney     virtual void powerOff() override
140*73944676SShawn McCarney     {
141*73944676SShawn McCarney         powerControlGPIO->requestWrite(0);
142*73944676SShawn McCarney         powerControlGPIO->setValue(0);
143*73944676SShawn McCarney         powerControlGPIO->release();
144*73944676SShawn McCarney     }
145*73944676SShawn McCarney 
146*73944676SShawn McCarney     /** @copydoc PowerSequencerDevice::getPowerGood() */
getPowerGood()147*73944676SShawn McCarney     virtual bool getPowerGood() override
148*73944676SShawn McCarney     {
149*73944676SShawn McCarney         return (powerGoodGPIO->getValue() == 1);
150*73944676SShawn McCarney     }
151*73944676SShawn McCarney 
152*73944676SShawn McCarney   protected:
153*73944676SShawn McCarney     /**
154*73944676SShawn McCarney      * Device name.
155*73944676SShawn McCarney      */
156*73944676SShawn McCarney     std::string name{};
157*73944676SShawn McCarney 
158*73944676SShawn McCarney     /**
159*73944676SShawn McCarney      * I2C bus for the device.
160*73944676SShawn McCarney      */
161*73944676SShawn McCarney     uint8_t bus;
162*73944676SShawn McCarney 
163*73944676SShawn McCarney     /**
164*73944676SShawn McCarney      * I2C address for the device.
165*73944676SShawn McCarney      */
166*73944676SShawn McCarney     uint16_t address;
167*73944676SShawn McCarney 
168*73944676SShawn McCarney     /**
169*73944676SShawn McCarney      * Name of the GPIO that turns this device on and off.
170*73944676SShawn McCarney      */
171*73944676SShawn McCarney     std::string powerControlGPIOName{};
172*73944676SShawn McCarney 
173*73944676SShawn McCarney     /**
174*73944676SShawn McCarney      * Name of the GPIO that reads the power good signal from this device.
175*73944676SShawn McCarney      */
176*73944676SShawn McCarney     std::string powerGoodGPIOName{};
177*73944676SShawn McCarney 
178*73944676SShawn McCarney     /**
179*73944676SShawn McCarney      * Voltage rails that are enabled and monitored by this device.
180*73944676SShawn McCarney      */
181*73944676SShawn McCarney     std::vector<std::unique_ptr<Rail>> rails{};
182*73944676SShawn McCarney 
183*73944676SShawn McCarney     /**
184*73944676SShawn McCarney      * GPIO that turns this device on and off.
185*73944676SShawn McCarney      */
186*73944676SShawn McCarney     std::unique_ptr<GPIO> powerControlGPIO{};
187*73944676SShawn McCarney 
188*73944676SShawn McCarney     /**
189*73944676SShawn McCarney      * GPIO that reads the power good signal from this device.
190*73944676SShawn McCarney      */
191*73944676SShawn McCarney     std::unique_ptr<GPIO> powerGoodGPIO{};
192*73944676SShawn McCarney };
193*73944676SShawn McCarney 
194*73944676SShawn McCarney } // namespace phosphor::power::sequencer
195