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/protocol/i2c.h>
8 #include <ddktl/device.h>
9 #include <ddktl/protocol/empty-protocol.h>
10 #include <zircon/types.h>
11 #include <fbl/unique_ptr.h>
12 
13 namespace audio {
14 namespace alc5514 {
15 
16 class Alc5514Device;
17 using DeviceType = ddk::Device<Alc5514Device, ddk::Ioctlable, ddk::Unbindable>;
18 
19 class Alc5514Device : public DeviceType,
20                       public ddk::EmptyProtocol<ZX_PROTOCOL_AUDIO_CODEC> {
21 public:
22     static fbl::unique_ptr<Alc5514Device> Create(zx_device_t* parent);
23 
Alc5514Device(zx_device_t * parent)24     Alc5514Device(zx_device_t* parent) : DeviceType(parent) { }
~Alc5514Device()25     ~Alc5514Device() { }
26 
27     zx_status_t Bind();
28     zx_status_t Initialize();
29 
30     // Methods required by the ddk mixins
31     zx_status_t DdkIoctl(uint32_t op, const void* in_buf, size_t in_len,
32                          void* out_buf, size_t out_len, size_t* actual);
33     void DdkUnbind();
34     void DdkRelease();
35 
36 private:
37     void DumpRegs();
38 
39     // Methods to read/write registers
40     uint32_t ReadReg(uint32_t addr);
41     void WriteReg(uint32_t addr, uint32_t val);
42     void UpdateReg(uint32_t addr, uint32_t mask, uint32_t bits);
43 
44     i2c_protocol_t i2c_;
45 };
46 
47 }  // namespace alc5514
48 }  // namespace audio
49