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