blob: ccf82210d3f64d22de94372d0a1d0270d1636d54 [file] [log] [blame]
// 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 "a113-ddr.h"
#include "a113-audio-device.h"
void a113_audio_register_toddr(a113_audio_device_t* audio_device) {
// For now, we only use DDR B for PDM in. For other inputs, we will needs
// other TODDRs.
uint32_t id = 1;
// Enable audio ddr arb
a113_ee_audio_update_bits(audio_device, EE_AUDIO_ARB_CTRL,
1 << 31 | 1 << id, 1 << 31 | 1 << id);
}
void a113_audio_unregister_toddr(a113_audio_device_t* audio_device) {
uint32_t mask_bit = 1; // for now, we only use TODDR_B.
uint32_t value;
a113_ee_audio_update_bits(audio_device, EE_AUDIO_ARB_CTRL, 1 << mask_bit,
0 << mask_bit);
// No ddr active, disable arb switch
value = a113_ee_audio_read(audio_device, EE_AUDIO_ARB_CTRL) & 0x77;
if (value == 0)
a113_ee_audio_update_bits(audio_device, EE_AUDIO_ARB_CTRL, 1 << 31,
0 << 31);
}
void a113_toddr_set_buf(a113_audio_device_t* audio_device, uint32_t start,
uint32_t end) {
a113_ee_audio_write(audio_device, EE_AUDIO_TODDR_B_START_ADDR, start);
a113_ee_audio_write(audio_device, EE_AUDIO_TODDR_B_FINISH_ADDR, end);
}
void a113_toddr_set_intrpt(a113_audio_device_t* audio_device, uint32_t intrpt) {
a113_ee_audio_write(audio_device, EE_AUDIO_TODDR_B_INT_ADDR, intrpt);
a113_ee_audio_update_bits(audio_device, EE_AUDIO_TODDR_B_CTRL0, 0xff << 16,
1 << 18);
}
uint32_t a113_toddr_get_position(a113_audio_device_t* audio_device) {
return a113_ee_audio_read(audio_device, EE_AUDIO_TODDR_B_STATUS2);
}
uint32_t a113_toddr_get_int_status(a113_audio_device_t* audio_device) {
return a113_ee_audio_read(audio_device, EE_AUDIO_TODDR_B_STATUS1) & 0xff;
}
void a113_toddr_clear_interrupt(a113_audio_device_t* audio_device,
uint32_t interrupt_mask) {
a113_ee_audio_update_bits(audio_device, EE_AUDIO_TODDR_B_CTRL1,
interrupt_mask, 0xff);
a113_ee_audio_update_bits(audio_device, EE_AUDIO_TODDR_B_CTRL1,
interrupt_mask, 0x0);
}
void a113_toddr_enable(a113_audio_device_t* audio_device, bool enable) {
a113_ee_audio_update_bits(audio_device, EE_AUDIO_TODDR_B_CTRL0, 1 << 31,
enable << 31);
}
void a113_toddr_select_src(a113_audio_device_t* audio_device,
enum toddr_src src) {
a113_ee_audio_update_bits(audio_device, EE_AUDIO_TODDR_B_CTRL0, 0x7,
src & 0x7);
}
void a113_toddr_set_fifos(a113_audio_device_t* audio_device, uint32_t thresh) {
a113_ee_audio_write(audio_device, EE_AUDIO_TODDR_B_CTRL1,
(thresh - 1) << 16 | 2 << 8);
}
void a113_toddr_set_format(a113_audio_device_t* audio_device, uint32_t type,
uint32_t msb, uint32_t lsb) {
a113_ee_audio_update_bits(audio_device, EE_AUDIO_TODDR_B_CTRL0, 0x1fff << 3,
type << 13 | msb << 8 | lsb << 3);
}