// Copyright 2019 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.
library fuchsia.hardware.powerimpl;

using zx;

type PowerDomainStatus = strict enum : uint8 {
    DISABLED = 1;
    ENABLED = 2;
};

@transport("Banjo")
@banjo_layout("ddk-protocol")
closed protocol PowerImpl {
    /// Get status of a power domain
    strict GetPowerDomainStatus(struct {
        index uint32;
    }) -> (struct {
        s zx.Status;
        status PowerDomainStatus;
    });
    /// Enable a power domain
    strict EnablePowerDomain(struct {
        index uint32;
    }) -> (struct {
        s zx.Status;
    });
    /// Disable a power domain
    strict DisablePowerDomain(struct {
        index uint32;
    }) -> (struct {
        s zx.Status;
    });
    /// Get Supported Voltage Range. min and max are in uV.
    strict GetSupportedVoltageRange(struct {
        index uint32;
    }) -> (struct {
        s zx.Status;
        min uint32;
        max uint32;
    });
    /// Request for a particular voltage. "voltage" and actual_voltage are in microvolts(uV)
    strict RequestVoltage(struct {
        index uint32;
        voltage uint32;
    }) -> (struct {
        s zx.Status;
        actual_voltage uint32;
    });
    /// Get current voltage in uV.
    strict GetCurrentVoltage(struct {
        index uint32;
    }) -> (struct {
        s zx.Status;
        current_voltage uint32;
    });
    /// Write to ctrl register of PMIC
    strict WritePmicCtrlReg(struct {
        index uint32;
        reg_addr uint32;
        value uint32;
    }) -> (struct {
        s zx.Status;
    });
    /// Read ctrl register of PMIC
    strict ReadPmicCtrlReg(struct {
        index uint32;
        reg_addr uint32;
    }) -> (struct {
        s zx.Status;
        value uint32;
    });
};
