// Copyright 2017 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.

#include <string.h>

#include <ddk/protocol/i2c.h>
#include <ddk/protocol/i2c-lib.h>
#include <fbl/algorithm.h>
#include <fbl/alloc_checker.h>


#include "tas57xx.h"

namespace audio {
namespace gauss {

constexpr float Tas57xx::kMaxGain;
constexpr float Tas57xx::kMinGain;

// static
fbl::unique_ptr<Tas57xx> Tas57xx::Create(i2c_protocol_t *i2c, uint32_t index) {
    fbl::AllocChecker ac;

    auto ptr = fbl::unique_ptr<Tas57xx>(new (&ac) Tas57xx());
    if (!ac.check()) {
        return nullptr;
    }

    memcpy(&ptr->i2c_, i2c, sizeof(*i2c));

    return ptr;
}
Tas57xx::~Tas57xx() {}

Tas57xx::Tas57xx() {}

zx_status_t Tas57xx::Reset(){
    return WriteReg(0x01, 0x01);
}

zx_status_t Tas57xx::SetGain(float gain) {
    gain = fbl::clamp(gain, kMinGain, kMaxGain);

    uint8_t gain_reg = static_cast<uint8_t>( 48 - gain*2);

    zx_status_t status;
    status = WriteReg(61,gain_reg);
    if (status != ZX_OK) return status;
    status = WriteReg(62,gain_reg);
    if (status != ZX_OK) return status;
    current_gain_ = gain;
    return status;
}

zx_status_t Tas57xx::GetGain(float *gain) {
    *gain = current_gain_;
    return ZX_OK;
}

bool Tas57xx::ValidGain(float gain) {
    return (gain <= kMaxGain) && (gain >= kMinGain);
}

zx_status_t Tas57xx::Init(uint8_t slot) {
    if (slot > 7)
        return ZX_ERR_INVALID_ARGS;
    zx_status_t status;
    status = WriteReg(40, 0x13);
    if (status != ZX_OK) return status;
    status = WriteReg(41, static_cast<uint8_t>(1 + 32*slot));
    if (status != ZX_OK) return status;
    return WriteReg(42, 0x22);
}

zx_status_t Tas57xx::Standby() {
    return WriteReg(0x02, 0x10);
}

zx_status_t Tas57xx::ExitStandby() {
    return WriteReg(0x02, 0x00);
}

zx_status_t Tas57xx::WriteReg(uint8_t reg, uint8_t value) {
    uint8_t write_buf[2];
    write_buf[0] = reg;
    write_buf[1] = value;
    return i2c_write_sync(&i2c_, write_buf, 2);
}
} //namespace gauss
} //namespace audio
