blob: 42b99e0adcfcafe999ddb5584e3c7b8a9d015130 [file] [log] [blame]
Shawn McCarneyb38da992020-02-13 08:55:46 -06001/**
2 * Copyright © 2020 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
18#include "action.hpp"
19#include "action_environment.hpp"
20#include "device.hpp"
21#include "i2c_interface.hpp"
22
23namespace phosphor::power::regulators
24{
25
26/**
27 * @class I2CAction
28 *
29 * Abstract base class for actions that communicate with a device using an I2C
30 * interface.
31 */
32class I2CAction : public Action
33{
34 public:
35 // Specify which compiler-generated methods we want
36 I2CAction() = default;
37 I2CAction(const I2CAction&) = delete;
38 I2CAction(I2CAction&&) = delete;
39 I2CAction& operator=(const I2CAction&) = delete;
40 I2CAction& operator=(I2CAction&&) = delete;
41 virtual ~I2CAction() = default;
42
43 protected:
44 /**
45 * Returns the I2C interface to the current device within the specified
46 * action environment.
47 *
48 * Opens the interface if it was not already open.
49 *
50 * Throws an exception if an error occurs.
51 *
52 * @param environment action execution environment
53 * @return I2C interface to current device
54 */
55 i2c::I2CInterface& getI2CInterface(ActionEnvironment& environment)
56 {
57 // Get current device from action environment
58 Device& device = environment.getDevice();
59
60 // Get I2C interface from device
61 i2c::I2CInterface& interface = device.getI2CInterface();
62
63 // Open interface if necessary
64 if (!interface.isOpen())
65 {
66 interface.open();
67 }
68
69 return interface;
70 }
71};
72
73} // namespace phosphor::power::regulators