blob: 2ccd95a338217b1762be299a5452dd5c59a7f6b6 [file] [log] [blame]
// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef SRC_DEVICES_POWER_DRIVERS_VS680_POWER_VS680_POWER_H_
#define SRC_DEVICES_POWER_DRIVERS_VS680_POWER_VS680_POWER_H_
#include <fuchsia/hardware/i2c/cpp/banjo.h>
#include <fuchsia/hardware/powerimpl/cpp/banjo.h>
#include <lib/zircon-internal/thread_annotations.h>
#include <ddktl/device.h>
#include <fbl/mutex.h>
namespace power {
class Vs680Power : public ddk::Device<Vs680Power>,
public ddk::PowerImplProtocol<Vs680Power, ddk::base_protocol> {
public:
static zx_status_t Create(void* ctx, zx_device_t* parent);
Vs680Power(zx_device_t* parent, const ddk::I2cProtocolClient& pmic_i2c)
: ddk::Device<Vs680Power>(parent), pmic_i2c_(pmic_i2c) {}
~Vs680Power() {}
void DdkRelease() { delete this; }
zx_status_t PowerImplGetPowerDomainStatus(uint32_t index, power_domain_status_t* out_status);
zx_status_t PowerImplEnablePowerDomain(uint32_t index);
zx_status_t PowerImplDisablePowerDomain(uint32_t index);
zx_status_t PowerImplGetSupportedVoltageRange(uint32_t index, uint32_t* out_min,
uint32_t* out_max);
zx_status_t PowerImplRequestVoltage(uint32_t index, uint32_t voltage,
uint32_t* out_actual_voltage);
zx_status_t PowerImplGetCurrentVoltage(uint32_t index, uint32_t* out_current_voltage);
zx_status_t PowerImplWritePmicCtrlReg(uint32_t index, uint32_t reg_addr, uint32_t value);
zx_status_t PowerImplReadPmicCtrlReg(uint32_t index, uint32_t reg_addr, uint32_t* out_value);
private:
fbl::Mutex lock_;
ddk::I2cProtocolClient pmic_i2c_ TA_GUARDED(lock_);
};
} // namespace power
#endif // SRC_DEVICES_POWER_DRIVERS_VS680_POWER_VS680_POWER_H_