1*c1b36628SLeo Yang #pragma once 2*c1b36628SLeo Yang 3*c1b36628SLeo Yang #include "common/include/i2c/i2c.hpp" 4*c1b36628SLeo Yang #include "i2c-vr/vr.hpp" 5*c1b36628SLeo Yang 6*c1b36628SLeo Yang #include <sdbusplus/async.hpp> 7*c1b36628SLeo Yang 8*c1b36628SLeo Yang #include <cstdint> 9*c1b36628SLeo Yang #include <unordered_set> 10*c1b36628SLeo Yang 11*c1b36628SLeo Yang namespace phosphor::software::VR 12*c1b36628SLeo Yang { 13*c1b36628SLeo Yang 14*c1b36628SLeo Yang class TDA38640A : public VoltageRegulator 15*c1b36628SLeo Yang { 16*c1b36628SLeo Yang public: 17*c1b36628SLeo Yang TDA38640A(sdbusplus::async::context& ctx, uint16_t bus, uint16_t address); 18*c1b36628SLeo Yang 19*c1b36628SLeo Yang sdbusplus::async::task<bool> verifyImage(const uint8_t* image, 20*c1b36628SLeo Yang size_t imageSize) final; 21*c1b36628SLeo Yang 22*c1b36628SLeo Yang sdbusplus::async::task<bool> updateFirmware(bool force) final; 23*c1b36628SLeo Yang sdbusplus::async::task<bool> getCRC(uint32_t* checksum) final; 24*c1b36628SLeo Yang 25*c1b36628SLeo Yang bool forcedUpdateAllowed() final; 26*c1b36628SLeo Yang 27*c1b36628SLeo Yang private: 28*c1b36628SLeo Yang struct Configuration 29*c1b36628SLeo Yang { 30*c1b36628SLeo Yang uint32_t rev; 31*c1b36628SLeo Yang uint32_t checksum; 32*c1b36628SLeo Yang std::vector<uint16_t> offsets; 33*c1b36628SLeo Yang std::vector<std::vector<uint8_t>> data; 34*c1b36628SLeo Yang 35*c1b36628SLeo Yang void clear() 36*c1b36628SLeo Yang { 37*c1b36628SLeo Yang rev = 0; 38*c1b36628SLeo Yang checksum = 0; 39*c1b36628SLeo Yang offsets.clear(); 40*c1b36628SLeo Yang data.clear(); 41*c1b36628SLeo Yang } 42*c1b36628SLeo Yang }; 43*c1b36628SLeo Yang 44*c1b36628SLeo Yang sdbusplus::async::task<bool> getUserRemainingWrites(uint8_t* remain); 45*c1b36628SLeo Yang sdbusplus::async::task<bool> getDeviceId(uint32_t* deviceId); 46*c1b36628SLeo Yang sdbusplus::async::task<bool> program(); 47*c1b36628SLeo Yang sdbusplus::async::task<bool> getProgStatus(uint8_t* status); 48*c1b36628SLeo Yang sdbusplus::async::task<bool> unlockDevice(); 49*c1b36628SLeo Yang sdbusplus::async::task<bool> programmingCmd(); 50*c1b36628SLeo Yang sdbusplus::async::task<bool> setPage(uint8_t page); 51*c1b36628SLeo Yang sdbusplus::async::task<bool> getDeviceRevision(uint8_t* revision); 52*c1b36628SLeo Yang 53*c1b36628SLeo Yang bool parseImage(const uint8_t* image, size_t imageSize); 54*c1b36628SLeo Yang 55*c1b36628SLeo Yang phosphor::i2c::I2C i2cInterface; 56*c1b36628SLeo Yang 57*c1b36628SLeo Yang struct Configuration configuration; 58*c1b36628SLeo Yang }; 59*c1b36628SLeo Yang } // namespace phosphor::software::VR 60