1 // Copyright 2017 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 #include "a113-ddr.h"
6
7 #include "a113-audio-device.h"
8
a113_audio_register_toddr(a113_audio_device_t * audio_device)9 void a113_audio_register_toddr(a113_audio_device_t* audio_device) {
10 // For now, we only use DDR B for PDM in. For other inputs, we will needs
11 // other TODDRs.
12 uint32_t id = 1;
13
14 // Enable audio ddr arb
15 a113_ee_audio_update_bits(audio_device, EE_AUDIO_ARB_CTRL,
16 1 << 31 | 1 << id, 1 << 31 | 1 << id);
17 }
18
a113_audio_unregister_toddr(a113_audio_device_t * audio_device)19 void a113_audio_unregister_toddr(a113_audio_device_t* audio_device) {
20 uint32_t mask_bit = 1; // for now, we only use TODDR_B.
21 uint32_t value;
22
23 a113_ee_audio_update_bits(audio_device, EE_AUDIO_ARB_CTRL, 1 << mask_bit,
24 0 << mask_bit);
25
26 // No ddr active, disable arb switch
27 value = a113_ee_audio_read(audio_device, EE_AUDIO_ARB_CTRL) & 0x77;
28 if (value == 0)
29 a113_ee_audio_update_bits(audio_device, EE_AUDIO_ARB_CTRL, 1 << 31,
30 0 << 31);
31 }
32
a113_toddr_set_buf(a113_audio_device_t * audio_device,uint32_t start,uint32_t end)33 void a113_toddr_set_buf(a113_audio_device_t* audio_device, uint32_t start,
34 uint32_t end) {
35 a113_ee_audio_write(audio_device, EE_AUDIO_TODDR_B_START_ADDR, start);
36 a113_ee_audio_write(audio_device, EE_AUDIO_TODDR_B_FINISH_ADDR, end);
37 }
38
a113_toddr_set_intrpt(a113_audio_device_t * audio_device,uint32_t intrpt)39 void a113_toddr_set_intrpt(a113_audio_device_t* audio_device, uint32_t intrpt) {
40 a113_ee_audio_write(audio_device, EE_AUDIO_TODDR_B_INT_ADDR, intrpt);
41 a113_ee_audio_update_bits(audio_device, EE_AUDIO_TODDR_B_CTRL0, 0xff << 16,
42 1 << 18);
43 }
44
a113_toddr_get_position(a113_audio_device_t * audio_device)45 uint32_t a113_toddr_get_position(a113_audio_device_t* audio_device) {
46 return a113_ee_audio_read(audio_device, EE_AUDIO_TODDR_B_STATUS2);
47 }
48
a113_toddr_get_int_status(a113_audio_device_t * audio_device)49 uint32_t a113_toddr_get_int_status(a113_audio_device_t* audio_device) {
50
51 return a113_ee_audio_read(audio_device, EE_AUDIO_TODDR_B_STATUS1) & 0xff;
52 }
53
a113_toddr_clear_interrupt(a113_audio_device_t * audio_device,uint32_t interrupt_mask)54 void a113_toddr_clear_interrupt(a113_audio_device_t* audio_device,
55 uint32_t interrupt_mask) {
56 a113_ee_audio_update_bits(audio_device, EE_AUDIO_TODDR_B_CTRL1,
57 interrupt_mask, 0xff);
58 a113_ee_audio_update_bits(audio_device, EE_AUDIO_TODDR_B_CTRL1,
59 interrupt_mask, 0x0);
60 }
61
a113_toddr_enable(a113_audio_device_t * audio_device,bool enable)62 void a113_toddr_enable(a113_audio_device_t* audio_device, bool enable) {
63
64 a113_ee_audio_update_bits(audio_device, EE_AUDIO_TODDR_B_CTRL0, 1 << 31,
65 enable << 31);
66 }
67
a113_toddr_select_src(a113_audio_device_t * audio_device,enum toddr_src src)68 void a113_toddr_select_src(a113_audio_device_t* audio_device,
69 enum toddr_src src) {
70
71 a113_ee_audio_update_bits(audio_device, EE_AUDIO_TODDR_B_CTRL0, 0x7,
72 src & 0x7);
73 }
74
a113_toddr_set_fifos(a113_audio_device_t * audio_device,uint32_t thresh)75 void a113_toddr_set_fifos(a113_audio_device_t* audio_device, uint32_t thresh) {
76
77 a113_ee_audio_write(audio_device, EE_AUDIO_TODDR_B_CTRL1,
78 (thresh - 1) << 16 | 2 << 8);
79 }
80
a113_toddr_set_format(a113_audio_device_t * audio_device,uint32_t type,uint32_t msb,uint32_t lsb)81 void a113_toddr_set_format(a113_audio_device_t* audio_device, uint32_t type,
82 uint32_t msb, uint32_t lsb) {
83
84 a113_ee_audio_update_bits(audio_device, EE_AUDIO_TODDR_B_CTRL0, 0x1fff << 3,
85 type << 13 | msb << 8 | lsb << 3);
86 }
87