1*88d5b698SShawn McCarney /** 2*88d5b698SShawn McCarney * Copyright © 2020 IBM Corporation 3*88d5b698SShawn McCarney * 4*88d5b698SShawn McCarney * Licensed under the Apache License, Version 2.0 (the "License"); 5*88d5b698SShawn McCarney * you may not use this file except in compliance with the License. 6*88d5b698SShawn McCarney * You may obtain a copy of the License at 7*88d5b698SShawn McCarney * 8*88d5b698SShawn McCarney * http://www.apache.org/licenses/LICENSE-2.0 9*88d5b698SShawn McCarney * 10*88d5b698SShawn McCarney * Unless required by applicable law or agreed to in writing, software 11*88d5b698SShawn McCarney * distributed under the License is distributed on an "AS IS" BASIS, 12*88d5b698SShawn McCarney * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*88d5b698SShawn McCarney * See the License for the specific language governing permissions and 14*88d5b698SShawn McCarney * limitations under the License. 15*88d5b698SShawn McCarney */ 16*88d5b698SShawn McCarney 17*88d5b698SShawn McCarney #include "i2c_write_bit_action.hpp" 18*88d5b698SShawn McCarney 19*88d5b698SShawn McCarney #include "action_error.hpp" 20*88d5b698SShawn McCarney #include "i2c_interface.hpp" 21*88d5b698SShawn McCarney 22*88d5b698SShawn McCarney #include <exception> 23*88d5b698SShawn McCarney #include <ios> 24*88d5b698SShawn McCarney #include <sstream> 25*88d5b698SShawn McCarney 26*88d5b698SShawn McCarney namespace phosphor::power::regulators 27*88d5b698SShawn McCarney { 28*88d5b698SShawn McCarney execute(ActionEnvironment & environment)29*88d5b698SShawn McCarneybool I2CWriteBitAction::execute(ActionEnvironment& environment) 30*88d5b698SShawn McCarney { 31*88d5b698SShawn McCarney try 32*88d5b698SShawn McCarney { 33*88d5b698SShawn McCarney // Read value of device register 34*88d5b698SShawn McCarney uint8_t registerValue{0x00}; 35*88d5b698SShawn McCarney i2c::I2CInterface& interface = getI2CInterface(environment); 36*88d5b698SShawn McCarney interface.read(reg, registerValue); 37*88d5b698SShawn McCarney 38*88d5b698SShawn McCarney // Write bit to register value 39*88d5b698SShawn McCarney if (value == 0) 40*88d5b698SShawn McCarney { 41*88d5b698SShawn McCarney // Clear bit within register value 42*88d5b698SShawn McCarney registerValue &= ~(0x01 << position); 43*88d5b698SShawn McCarney } 44*88d5b698SShawn McCarney else 45*88d5b698SShawn McCarney { 46*88d5b698SShawn McCarney // Set bit within register value 47*88d5b698SShawn McCarney registerValue |= (0x01 << position); 48*88d5b698SShawn McCarney } 49*88d5b698SShawn McCarney 50*88d5b698SShawn McCarney // Write modified value to device register 51*88d5b698SShawn McCarney interface.write(reg, registerValue); 52*88d5b698SShawn McCarney } 53*88d5b698SShawn McCarney catch (const i2c::I2CException& e) 54*88d5b698SShawn McCarney { 55*88d5b698SShawn McCarney // Nest I2CException within an ActionError so caller will have both the 56*88d5b698SShawn McCarney // low level I2C error information and the action information 57*88d5b698SShawn McCarney std::throw_with_nested(ActionError(*this)); 58*88d5b698SShawn McCarney } 59*88d5b698SShawn McCarney return true; 60*88d5b698SShawn McCarney } 61*88d5b698SShawn McCarney toString() const62*88d5b698SShawn McCarneystd::string I2CWriteBitAction::toString() const 63*88d5b698SShawn McCarney { 64*88d5b698SShawn McCarney std::ostringstream ss; 65*88d5b698SShawn McCarney ss << "i2c_write_bit: { register: 0x" << std::hex << std::uppercase 66*88d5b698SShawn McCarney << static_cast<uint16_t>(reg) << ", position: " << std::dec 67*88d5b698SShawn McCarney << static_cast<uint16_t>(position) 68*88d5b698SShawn McCarney << ", value: " << static_cast<uint16_t>(value) << " }"; 69*88d5b698SShawn McCarney return ss.str(); 70*88d5b698SShawn McCarney } 71*88d5b698SShawn McCarney 72*88d5b698SShawn McCarney } // namespace phosphor::power::regulators 73