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