blob: f7ad179f3a453a823aa84287112ab32a09240272 [file] [log] [blame]
Shawn McCarneya2461b32019-10-24 18:53:01 -05001/**
2 * Copyright © 2019 IBM Corporation
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16#pragma once
17
Shawn McCarney0b1a0e72020-03-11 18:01:44 -050018#include "configuration.hpp"
Shawn McCarneyafb7fc32019-12-11 19:42:03 -060019#include "i2c_interface.hpp"
Shawn McCarney0b1a0e72020-03-11 18:01:44 -050020#include "presence_detection.hpp"
21#include "rail.hpp"
Shawn McCarneyafb7fc32019-12-11 19:42:03 -060022
23#include <memory>
Shawn McCarneya2461b32019-10-24 18:53:01 -050024#include <string>
Shawn McCarneyafb7fc32019-12-11 19:42:03 -060025#include <utility>
Shawn McCarney0b1a0e72020-03-11 18:01:44 -050026#include <vector>
Shawn McCarneya2461b32019-10-24 18:53:01 -050027
Shawn McCarneyea7385b2019-11-07 12:19:32 -060028namespace phosphor::power::regulators
Shawn McCarneya2461b32019-10-24 18:53:01 -050029{
30
31/**
32 * @class Device
33 *
34 * A hardware device, such as a voltage regulator or I/O expander.
35 */
36class Device
37{
38 public:
39 // Specify which compiler-generated methods we want
40 Device() = delete;
41 Device(const Device&) = delete;
42 Device(Device&&) = delete;
43 Device& operator=(const Device&) = delete;
44 Device& operator=(Device&&) = delete;
45 ~Device() = default;
46
47 /**
48 * Constructor.
49 *
50 * @param id unique device ID
Shawn McCarneyafb7fc32019-12-11 19:42:03 -060051 * @param isRegulator indicates whether this device is a voltage regulator
52 * @param fru Field-Replaceable Unit (FRU) for this device
53 * @param i2cInterface I2C interface to this device
Shawn McCarney0b1a0e72020-03-11 18:01:44 -050054 * @param presenceDetection presence detection for this device, if any
55 * @param configuration configuration changes to apply to this device, if
56 * any
57 * @param rails voltage rails produced by this device, if any
Shawn McCarneya2461b32019-10-24 18:53:01 -050058 */
Shawn McCarney0b1a0e72020-03-11 18:01:44 -050059 explicit Device(
60 const std::string& id, bool isRegulator, const std::string& fru,
61 std::unique_ptr<i2c::I2CInterface> i2cInterface,
62 std::unique_ptr<PresenceDetection> presenceDetection = nullptr,
63 std::unique_ptr<Configuration> configuration = nullptr,
64 std::vector<std::unique_ptr<Rail>> rails =
65 std::vector<std::unique_ptr<Rail>>{}) :
Shawn McCarneyafb7fc32019-12-11 19:42:03 -060066 id{id},
Shawn McCarney0b1a0e72020-03-11 18:01:44 -050067 isRegulatorDevice{isRegulator}, fru{fru},
68 i2cInterface{std::move(i2cInterface)}, presenceDetection{std::move(
69 presenceDetection)},
70 configuration{std::move(configuration)}, rails{std::move(rails)}
Shawn McCarneya2461b32019-10-24 18:53:01 -050071 {
72 }
73
74 /**
Shawn McCarney0b1a0e72020-03-11 18:01:44 -050075 * Returns the configuration changes to apply to this device, if any.
Shawn McCarneya2461b32019-10-24 18:53:01 -050076 *
Shawn McCarney0b1a0e72020-03-11 18:01:44 -050077 * @return Pointer to Configuration object. Will equal nullptr if no
78 * configuration changes are defined for this device.
Shawn McCarneya2461b32019-10-24 18:53:01 -050079 */
Shawn McCarney0b1a0e72020-03-11 18:01:44 -050080 const std::unique_ptr<Configuration>& getConfiguration() const
Shawn McCarneya2461b32019-10-24 18:53:01 -050081 {
Shawn McCarney0b1a0e72020-03-11 18:01:44 -050082 return configuration;
Shawn McCarneyafb7fc32019-12-11 19:42:03 -060083 }
84
85 /**
86 * Returns the Field-Replaceable Unit (FRU) for this device.
87 *
88 * Returns the D-Bus inventory path of the FRU. If the device itself is not
89 * a FRU, returns the FRU that contains the device.
90 *
91 * @return FRU for this device
92 */
93 const std::string& getFRU() const
94 {
95 return fru;
96 }
97
98 /**
Shawn McCarney0b1a0e72020-03-11 18:01:44 -050099 * Returns the I2C interface to this device.
Shawn McCarneyafb7fc32019-12-11 19:42:03 -0600100 *
101 * @return I2C interface to device
102 */
103 i2c::I2CInterface& getI2CInterface()
104 {
105 return *i2cInterface;
106 }
107
Shawn McCarney0b1a0e72020-03-11 18:01:44 -0500108 /**
109 * Returns the unique ID of this device.
110 *
111 * @return device ID
112 */
113 const std::string& getID() const
114 {
115 return id;
116 }
117
118 /**
119 * Returns the presence detection for this device, if any.
120 *
121 * @return Pointer to PresenceDetection object. Will equal nullptr if no
122 * presence detection is defined for this device.
123 */
124 const std::unique_ptr<PresenceDetection>& getPresenceDetection() const
125 {
126 return presenceDetection;
127 }
128
129 /**
130 * Returns the voltage rails produced by this device, if any.
131 *
132 * @return voltage rails
133 */
134 const std::vector<std::unique_ptr<Rail>>& getRails() const
135 {
136 return rails;
137 }
138
139 /**
140 * Returns whether this device is a voltage regulator.
141 *
142 * @return true if device is a voltage regulator, false otherwise
143 */
144 bool isRegulator() const
145 {
146 return isRegulatorDevice;
147 }
148
Shawn McCarneya2461b32019-10-24 18:53:01 -0500149 private:
150 /**
151 * Unique ID of this device.
152 */
153 const std::string id{};
Shawn McCarneyafb7fc32019-12-11 19:42:03 -0600154
155 /**
156 * Indicates whether this device is a voltage regulator.
157 */
158 const bool isRegulatorDevice{false};
159
160 /**
161 * Field-Replaceable Unit (FRU) for this device.
162 *
163 * Set to the D-Bus inventory path of the FRU. If the device itself is not
164 * a FRU, set to the FRU that contains the device.
165 */
166 const std::string fru{};
167
168 /**
169 * I2C interface to this device.
170 */
171 std::unique_ptr<i2c::I2CInterface> i2cInterface{};
Shawn McCarney0b1a0e72020-03-11 18:01:44 -0500172
173 /**
174 * Presence detection for this device, if any. Set to nullptr if no
175 * presence detection is defined for this device.
176 */
177 std::unique_ptr<PresenceDetection> presenceDetection{};
178
179 /**
180 * Configuration changes to apply to this device, if any. Set to nullptr if
181 * no configuration changes are defined for this device.
182 */
183 std::unique_ptr<Configuration> configuration{};
184
185 /**
186 * Voltage rails produced by this device, if any. Vector is empty if no
187 * voltage rails are defined for this device.
188 */
189 std::vector<std::unique_ptr<Rail>> rails{};
Shawn McCarneya2461b32019-10-24 18:53:01 -0500190};
191
Shawn McCarneyea7385b2019-11-07 12:19:32 -0600192} // namespace phosphor::power::regulators