1// Copyright 2018 The Fuchsia Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#pragma once
6
7#include <ddk/debug.h>
8#include <ddktl/pdev.h>
9#include <fbl/unique_ptr.h>
10
11
12
13namespace audio {
14namespace astro {
15
16static constexpr uint8_t SW_RESET = 0x01;       //sw reset
17static constexpr uint8_t PWR_CTL = 0x02;        //power control
18static constexpr uint8_t PB_CFG2 = 0x05;        //pcm gain register
19static constexpr uint8_t TDM_CFG0 = 0x0a;
20static constexpr uint8_t TDM_CFG1 = 0x0b;
21static constexpr uint8_t TDM_CFG2 = 0x0c;
22static constexpr uint8_t TDM_CFG3 = 0x0d;
23static constexpr uint8_t TDM_CFG4 = 0x0e;
24static constexpr uint8_t TDM_CFG5 = 0x0f;
25static constexpr uint8_t TDM_CFG6 = 0x10;
26static constexpr uint8_t TDM_CFG7 = 0x11;
27static constexpr uint8_t TDM_CFG8 = 0x12;
28static constexpr uint8_t TDM_CFG9 = 0x13;
29static constexpr uint8_t TDM_CFG10 = 0x14;
30static constexpr uint8_t CLOCK_CFG = 0x3c;      //Clock Config
31
32class Tas27xx : public fbl::unique_ptr<Tas27xx> {
33public:
34    static fbl::unique_ptr<Tas27xx> Create(ddk::I2cChannel&& i2c);
35    bool ValidGain(float gain);
36    zx_status_t SetGain(float gain);
37    float GetGain() const { return current_gain_; }
38    float GetMinGain() const { return kMinGain; }
39    float GetMaxGain() const { return kMaxGain; }
40    float GetGainStep() const { return kGainStep; }
41
42    zx_status_t Init();
43    zx_status_t Reset();
44    zx_status_t Standby();
45    zx_status_t ExitStandby();
46
47private:
48    friend class fbl::unique_ptr<Tas27xx>;
49    static constexpr float kMaxGain = 0;
50    static constexpr float kMinGain = -100.0;
51    static constexpr float kGainStep = 0.5;
52
53    Tas27xx() = default;
54    ~Tas27xx() = default;
55
56    zx_status_t WriteReg(uint8_t reg, uint8_t value);
57    uint8_t ReadReg(uint8_t reg);
58
59    zx_status_t SetStandby(bool stdby);
60
61    ddk::I2cChannel i2c_;
62
63    float current_gain_ = 0;
64};
65} // namespace astro
66} // namespace audio