blob: a353d4cefc5810b0275d099351fadf7bbf3e1bea [file] [log] [blame]
// Copyright 2019 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.
#ifndef SRC_DEVICES_LIB_MT8167_INCLUDE_SOC_MT8167_MT8167_AUDIO_REGS_H_
#define SRC_DEVICES_LIB_MT8167_INCLUDE_SOC_MT8167_MT8167_AUDIO_REGS_H_
#include <zircon/types.h>
#include <hwreg/bitfields.h>
#include <soc/mt8167/mt8167-hw.h>
// Partial Glossary:
// AFE Audio Front End.
// CG Clock Gating.
// DL Downlink.
// PDN Power Down.
// VUL Voice Uplink.
// Top Control Register 0.
class AUDIO_TOP_CON0 : public hwreg::RegisterBase<AUDIO_TOP_CON0, uint32_t> {
public:
DEF_BIT(20, PDN_HDMI_CK);
DEF_BIT(5, PDN_I2S);
DEF_BIT(2, PDN_AFE);
static auto Get() { return hwreg::RegisterAddr<AUDIO_TOP_CON0>(0x000); }
};
// Top Control Register 1.
class AUDIO_TOP_CON1 : public hwreg::RegisterBase<AUDIO_TOP_CON1, uint32_t> {
public:
DEF_BIT(7, I2S4_BCLK_SW_CG);
DEF_BIT(6, I2S3_BCLK_SW_CG);
DEF_BIT(5, I2S2_BCLK_SW_CG);
DEF_BIT(4, I2S1_BCLK_SW_CG);
DEF_BIT(2, I2S_SOFT_RST2);
DEF_BIT(1, I2S_SOFT_RST);
static auto Get() { return hwreg::RegisterAddr<AUDIO_TOP_CON1>(0x004); }
};
// AFE Control Register 0.
class AFE_DAC_CON0 : public hwreg::RegisterBase<AFE_DAC_CON0, uint32_t> {
public:
DEF_BIT(26, MOD_PCM_DUP_WR);
DEF_FIELD(25, 24, DAI_MODE);
DEF_BIT(7, MOD_DAI_ON);
DEF_BIT(6, AWB_ON);
DEF_BIT(4, DAI_ON);
DEF_BIT(3, VUL_ON);
DEF_BIT(2, DL2_ON);
DEF_BIT(1, DL1_ON);
DEF_BIT(0, AFE_ON);
static auto Get() { return hwreg::RegisterAddr<AFE_DAC_CON0>(0x010); }
};
// AFE Control Register 1.
class AFE_DAC_CON1 : public hwreg::RegisterBase<AFE_DAC_CON1, uint32_t> {
public:
DEF_FIELD(31, 30, MOD_PCM_MODE);
DEF_BIT(29, DAI_DUP_WR);
DEF_BIT(28, VUL_R_MONO);
DEF_BIT(27, VUL_DATA);
DEF_BIT(26, AXI_2X1_CG_DISABLE);
DEF_BIT(25, AWB_R_MONO);
DEF_BIT(24, AWB_DATA);
DEF_BIT(22, DL2_DATA);
DEF_BIT(21, DL1_DATA);
DEF_FIELD(19, 16, VUL_MODE);
DEF_FIELD(15, 12, AWB_MODE);
DEF_FIELD(11, 8, I2S_MODE);
DEF_FIELD(7, 4, DL2_MODE);
DEF_FIELD(3, 0, DL1_MODE);
static auto Get() { return hwreg::RegisterAddr<AFE_DAC_CON1>(0x014); }
};
// AFE I2S Control Register 0.
class AFE_I2S_CON : public hwreg::RegisterBase<AFE_I2S_CON, uint32_t> {
public:
DEF_BIT(31, PHASE_SHIFT_FIX);
DEF_BIT(30, BCK_NEG_EG_LATCH);
DEF_BIT(29, BCK_INV);
DEF_BIT(28, I2SIN_PAD_SEL);
DEF_BIT(20, I2S_LOOPBACK);
DEF_BIT(12, I2S1_HD_EN);
DEF_BIT(7, INV_PAD_CTRL);
DEF_BIT(5, INV_LRCK);
DEF_BIT(3, I2S_FMT);
DEF_BIT(2, I2S_SRC);
DEF_BIT(1, I2S_WLEN);
DEF_BIT(0, I2S_EN);
static auto Get() { return hwreg::RegisterAddr<AFE_I2S_CON>(0x018); }
};
// AFE Connection Register 1.
// _R Controls enabling the right shift 1 bit from Ixx to Oyy.
// _S Controls turning on the path from Ixx to Oyy.
class AFE_CONN1 : public hwreg::RegisterBase<AFE_CONN1, uint32_t> {
public:
DEF_BIT(31, I08_O03_R);
DEF_BIT(30, I07_O03_R);
DEF_BIT(29, I06_O03_R);
DEF_BIT(28, I04_O03_R);
DEF_BIT(27, I05_O03_R);
DEF_BIT(26, I00_O03_R);
DEF_BIT(24, I08_O03_S);
DEF_BIT(23, I07_O03_S);
DEF_BIT(22, I06_O03_S);
DEF_BIT(21, I05_O03_S);
DEF_BIT(20, I04_O03_S);
DEF_BIT(19, I03_O03_S);
DEF_BIT(18, I02_O03_S);
DEF_BIT(17, I01_O03_S);
DEF_BIT(16, I00_O03_S);
DEF_BIT(15, I08_O02_R);
DEF_BIT(14, I07_O02_R);
DEF_BIT(13, I06_O02_R);
DEF_BIT(12, I04_O02_R);
DEF_BIT(11, I05_O02_R);
DEF_BIT(10, I00_O02_R);
DEF_BIT(8, I08_O02_S);
DEF_BIT(7, I07_O02_S);
DEF_BIT(6, I06_O02_S);
DEF_BIT(5, I05_O02_S);
DEF_BIT(4, I04_O02_S);
DEF_BIT(3, I03_O02_S);
DEF_BIT(2, I02_O02_S);
DEF_BIT(1, I01_O02_S);
DEF_BIT(0, I00_O02_S);
static auto Get() { return hwreg::RegisterAddr<AFE_CONN1>(0x024); }
};
// AFE Connection Register 2.
// _R Controls enabling the right shift 1 bit from Ixx to Oyy.
// _S Controls turning on the path from Ixx to Oyy.
class AFE_CONN2 : public hwreg::RegisterBase<AFE_CONN2, uint32_t> {
public:
DEF_BIT(31, I08_O08_R);
DEF_BIT(30, I06_O08_R);
DEF_BIT(29, I04_O08_R);
DEF_BIT(28, I07_O07_R);
DEF_BIT(27, I05_O07_R);
DEF_BIT(26, I03_O07_R);
DEF_BIT(24, I08_O06_S);
DEF_BIT(23, I06_O06_S);
DEF_BIT(22, I04_O06_S);
DEF_BIT(21, I01_O06_S);
DEF_BIT(20, I07_O05_S);
DEF_BIT(19, I05_O05_S);
DEF_BIT(18, I03_O05_S);
DEF_BIT(17, I02_O05_S);
DEF_BIT(16, I00_O05_S);
DEF_BIT(15, I08_O04_R);
DEF_BIT(14, I07_O04_R);
DEF_BIT(13, I06_O04_R);
DEF_BIT(12, I04_O04_R);
DEF_BIT(11, I05_O04_R);
DEF_BIT(10, I00_O04_R);
DEF_BIT(8, I08_O04_S);
DEF_BIT(7, I07_O04_S);
DEF_BIT(6, I06_O04_S);
DEF_BIT(5, I05_O04_S);
DEF_BIT(4, I04_O04_S);
DEF_BIT(3, I03_O04_S);
DEF_BIT(2, I02_O04_S);
DEF_BIT(1, I01_O04_S);
DEF_BIT(0, I00_O04_S);
static auto Get() { return hwreg::RegisterAddr<AFE_CONN2>(0x028); }
};
// AFE Connection Register 3.
// _R Controls enabling the right shift 1 bit from Ixx to Oyy.
// _S Controls turning on the path from Ixx to Oyy.
class AFE_CONN3 : public hwreg::RegisterBase<AFE_CONN3, uint32_t> {
public:
DEF_BIT(31, I16_O03_R);
DEF_BIT(30, I15_O03_R);
DEF_BIT(29, I16_O03_S);
DEF_BIT(28, I15_O03_S);
DEF_BIT(26, I16_O02_R);
DEF_BIT(25, I15_O02_R);
DEF_BIT(24, I16_O02_S);
DEF_BIT(23, I15_O02_S);
DEF_BIT(21, I16_O01_R);
DEF_BIT(20, I15_O01_R);
DEF_BIT(19, I16_O01_S);
DEF_BIT(18, I15_O01_S);
DEF_BIT(16, I16_O00_R);
DEF_BIT(15, I15_O00_R);
DEF_BIT(14, I16_O00_S);
DEF_BIT(13, I15_O00_S);
DEF_BIT(10, I08_O12_S);
DEF_BIT(9, I06_O12_S);
DEF_BIT(8, I07_O11_S);
DEF_BIT(7, I05_O11_S);
DEF_BIT(6, I02_O11_S);
DEF_BIT(5, I08_O10_S);
DEF_BIT(4, I06_O10_S);
DEF_BIT(3, I04_O10_S);
DEF_BIT(2, I07_O09_S);
DEF_BIT(1, I05_O09_S);
DEF_BIT(0, I03_O09_S);
static auto Get() { return hwreg::RegisterAddr<AFE_CONN3>(0x02C); }
};
// AFE I2S Control Register 1.
class AFE_I2S_CON1 : public hwreg::RegisterBase<AFE_I2S_CON1, uint32_t> {
public:
DEF_BIT(31, I2S2_LR_SWAP);
DEF_BIT(18, I2S2_TDMOUT_MUX);
DEF_BIT(12, I2S2_HD_EN);
DEF_FIELD(11, 8, I2S2_OUT_MODE);
DEF_BIT(5, INV_LRCK);
DEF_BIT(3, I2S2_FMT);
DEF_BIT(1, I2S2_WLEN);
DEF_BIT(0, I2S2_EN);
static auto Get() { return hwreg::RegisterAddr<AFE_I2S_CON1>(0x034); }
};
// AFE I2S Control Register 2.
class AFE_I2S_CON2 : public hwreg::RegisterBase<AFE_I2S_CON2, uint32_t> {
public:
DEF_BIT(31, I2S3_LR_SWAP);
DEF_FIELD(28, 24, I2S3_UPDATE_WORD);
DEF_BIT(23, I2S3_bck_inv);
DEF_BIT(22, I2S3_fpga_bit_test);
DEF_BIT(21, I2S3_fpga_bit);
DEF_BIT(20, I2S3_LOOPBACK);
DEF_BIT(12, I2S3_HD_EN);
DEF_FIELD(11, 8, I2S3_OUT_MODE);
DEF_BIT(3, I2S3_FMT);
DEF_BIT(1, I2S3_WLEN);
DEF_BIT(0, I2S3_EN);
static auto Get() { return hwreg::RegisterAddr<AFE_I2S_CON2>(0x038); }
};
// AFE Merge Interface Control Register.
class AFE_MRGIF_CON : public hwreg::RegisterBase<AFE_MRGIF_CON, uint32_t> {
public:
DEF_FIELD(23, 20, MRGIF_I2S_MODE);
DEF_BIT(19, MRGIF_LOOPBACK);
DEF_BIT(16, MRGIF_I2S_EN);
DEF_BIT(14, MRG_CLK_NO_INV);
DEF_BIT(13, MRG_I2S_TX_DIS);
DEF_BIT(12, MRG_CNT_CLR);
DEF_FIELD(11, 8, MRG_SYNC_DLY);
DEF_FIELD(7, 6, MRG_CLK_EDGE_DLY);
DEF_FIELD(5, 4, MRG_CLK_DLY);
DEF_BIT(0, MRGIF_EN);
static auto Get() { return hwreg::RegisterAddr<AFE_MRGIF_CON>(0x03C); }
};
// AFE DL1 Base Address Register.
class AFE_DL1_BASE : public hwreg::RegisterBase<AFE_DL1_BASE, uint32_t> {
public:
static auto Get() { return hwreg::RegisterAddr<AFE_DL1_BASE>(0x040); }
};
// AFE DL1 Base Cursor Register.
class AFE_DL1_CUR : public hwreg::RegisterBase<AFE_DL1_CUR, uint32_t> {
public:
static auto Get() { return hwreg::RegisterAddr<AFE_DL1_CUR>(0x044); }
};
// AFE DL1 End Adress Register.
class AFE_DL1_END : public hwreg::RegisterBase<AFE_DL1_END, uint32_t> {
public:
static auto Get() { return hwreg::RegisterAddr<AFE_DL1_END>(0x048); }
};
// AFE I2S Control Register 3.
class AFE_I2S_CON3 : public hwreg::RegisterBase<AFE_I2S_CON3, uint32_t> {
public:
DEF_BIT(31, I2S4_LR_SWAP);
DEF_BIT(12, I2S4_HD_EN);
DEF_FIELD(11, 8, I2S4_OUT_MODE);
DEF_BIT(5, INV_LRCK);
DEF_BIT(3, I2S4_FMT);
DEF_BIT(1, I2S4_WLEN);
DEF_BIT(0, I2S4_EN);
static auto Get() { return hwreg::RegisterAddr<AFE_I2S_CON3>(0x04C); }
};
// AFE Connection 24 bit Register.
class AFE_CONN_24BIT : public hwreg::RegisterBase<AFE_CONN_24BIT, uint32_t> {
public:
DEF_BIT(22, O22_24BIT);
DEF_BIT(21, O21_24BIT);
DEF_BIT(20, O20_24BIT);
DEF_BIT(19, O19_24BIT);
DEF_BIT(18, O18_24BIT);
DEF_BIT(17, O17_24BIT);
DEF_BIT(16, O16_24BIT);
DEF_BIT(15, O15_24BIT);
DEF_BIT(14, O14_24BIT);
DEF_BIT(13, O13_24BIT);
DEF_BIT(12, O12_24BIT);
DEF_BIT(11, O11_24BIT);
DEF_BIT(10, O10_24BIT);
DEF_BIT(9, O09_24BIT);
DEF_BIT(8, O08_24BIT);
DEF_BIT(7, O07_24BIT);
DEF_BIT(6, O06_24BIT);
DEF_BIT(5, O05_24BIT);
DEF_BIT(4, O04_24BIT);
DEF_BIT(3, O03_24BIT);
DEF_BIT(2, O02_24BIT);
DEF_BIT(1, O01_24BIT);
DEF_BIT(0, O00_24BIT);
static auto Get() { return hwreg::RegisterAddr<AFE_CONN_24BIT>(0x06C); }
};
// AFE VUL Base Address Register.
class AFE_VUL_BASE : public hwreg::RegisterBase<AFE_VUL_BASE, uint32_t> {
public:
static auto Get() { return hwreg::RegisterAddr<AFE_VUL_BASE>(0x080); }
};
// AFE VUL End Adress Register.
class AFE_VUL_END : public hwreg::RegisterBase<AFE_VUL_END, uint32_t> {
public:
static auto Get() { return hwreg::RegisterAddr<AFE_VUL_END>(0x088); }
};
// AFE VUL Base Cursor Register.
class AFE_VUL_CUR : public hwreg::RegisterBase<AFE_VUL_CUR, uint32_t> {
public:
static auto Get() { return hwreg::RegisterAddr<AFE_VUL_CUR>(0x08C); }
};
// AFE Uplink SRC Control Register.
class AFE_ADDA_UL_SRC_CON0 : public hwreg::RegisterBase<AFE_ADDA_UL_SRC_CON0, uint32_t> {
public:
DEF_BIT(31, c_comb_out_sin_gen_ctl);
DEF_BIT(30, c_baseband_sin_gen_ctl);
DEF_FIELD(29, 27, c_digmic_phase_sel_ch1_ctl);
DEF_FIELD(26, 24, c_digmic_phase_sel_ch2_ctl);
DEF_BIT(23, c_two_digital_mic_ctl);
DEF_BIT(22, ul_mode_3p25m_ch2_ctl);
DEF_BIT(21, ul_mode_3p25m_ch1_ctl);
DEF_FIELD(20, 19, ul_voice_mode_ch2_ctl);
DEF_FIELD(18, 17, ul_voice_mode_ch1_ctl);
DEF_BIT(10, ul_iir_on_tmp_ctl);
DEF_FIELD(9, 7, ul_iirmode_ctl);
DEF_BIT(5, digmic_3p25m_1p625m_sel_ctl);
DEF_BIT(4, agc_260k_sel_ch2_ctl);
DEF_BIT(3, agc_260k_sel_ch1_ctl);
DEF_BIT(2, ul_loop_back_mode_ctl);
DEF_BIT(1, ul_sdm_3_level_ctl);
DEF_BIT(0, ul_src_on_tmp_ctl);
static auto Get() { return hwreg::RegisterAddr<AFE_ADDA_UL_SRC_CON0>(0x114); }
};
// AFE DL SRC2 Control Register.
class AFE_ADDA_DL_SRC2_CON0 : public hwreg::RegisterBase<AFE_ADDA_DL_SRC2_CON0, uint32_t> {
public:
DEF_BIT(0, dl_2_src_on_tmp_ctl_pre);
static auto Get() { return hwreg::RegisterAddr<AFE_ADDA_DL_SRC2_CON0>(0x108); }
};
// AFE ADDA Top Control Register.
class AFE_ADDA_TOP_CON0 : public hwreg::RegisterBase<AFE_ADDA_TOP_CON0, uint32_t> {
public:
DEF_FIELD(15, 12, c_loop_back_mode_ctl);
DEF_BIT(0, c_ext_adc_ctl);
static auto Get() { return hwreg::RegisterAddr<AFE_ADDA_TOP_CON0>(0x108); }
};
// AFE Sine-wave Gen Config 0. Called AFE_SINEGEN_CON0 in some of the docs.
class AFE_SGEN_CON0 : public hwreg::RegisterBase<AFE_SGEN_CON0, uint32_t> {
public:
DEF_FIELD(31, 28, INNER_LOOP_BACK_MODE);
DEF_BIT(27, IN_OUT_SEL);
DEF_BIT(26, dac_en);
DEF_BIT(25, mute_sw_ch2);
DEF_BIT(24, mute_sw_ch1);
DEF_FIELD(23, 20, sine_mode_ch2);
DEF_FIELD(19, 17, amp_div_ch2);
DEF_FIELD(16, 12, freq_div_ch2);
DEF_FIELD(11, 8, sine_mode_ch1);
DEF_FIELD(7, 5, amp_div_ch1);
DEF_FIELD(4, 0, freq_div_ch1);
static auto Get() { return hwreg::RegisterAddr<AFE_SGEN_CON0>(0x1F0); }
};
// AFE SGEN for TDM OUT Control.
class AFE_SINEGEN_CON_TDM : public hwreg::RegisterBase<AFE_SINEGEN_CON_TDM, uint32_t> {
public:
DEF_BIT(28, sgen_tdm_input_en);
DEF_BIT(24, c_dac_en_tdm);
DEF_BIT(20, c_mute_sw_tdm2);
DEF_FIELD(19, 17, c_amp_div_tdm2);
DEF_FIELD(16, 12, c_freq_div_tdm2);
DEF_BIT(8, c_mute_sw_tdm1);
DEF_FIELD(7, 5, c_amp_div_tdm1);
DEF_FIELD(4, 0, c_freq_div_tdm1);
static auto Get() { return hwreg::RegisterAddr<AFE_SINEGEN_CON_TDM>(0x1F8); }
};
// AFE TDMIN Connection Control.
class AFE_CONN_TDMIN_CON : public hwreg::RegisterBase<AFE_CONN_TDMIN_CON, uint32_t> {
public:
DEF_FIELD(5, 3, o_41_cfg);
DEF_FIELD(2, 0, o_40_cfg);
static auto Get() { return hwreg::RegisterAddr<AFE_CONN_TDMIN_CON>(0x39C); }
};
// AFE TDM Config 1.
class AFE_TDM_CON1 : public hwreg::RegisterBase<AFE_TDM_CON1, uint32_t> {
public:
DEF_BIT(3, DELAY_DATA);
DEF_BIT(0, TDM_EN);
static auto Get() { return hwreg::RegisterAddr<AFE_TDM_CON1>(0x548); }
};
// AFE TDM Config 2.
class AFE_TDM_CON2 : public hwreg::RegisterBase<AFE_TDM_CON2, uint32_t> {
public:
DEF_FIELD(31, 24, TDM_FIX_VALUE);
DEF_BIT(20, TDM_I2S_LOOPBACK);
DEF_BIT(16, TDM_FIX_VALUE_SEL);
static auto Get() { return hwreg::RegisterAddr<AFE_TDM_CON2>(0x54C); }
};
// AFE TDM IN Control Register 0.
class AFE_TDM_IN_CON1 : public hwreg::RegisterBase<AFE_TDM_IN_CON1, uint32_t> {
public:
DEF_FIELD(31, 24, LRCK_TDM_WIDTH);
DEF_FIELD(22, 21, tdm_in_loopback_ch); // Datasheet says tdm_in_loopack_ch.
DEF_BIT(20, tdm_in_loopback);
DEF_FIELD(19, 16, disable_out);
DEF_FIELD(13, 12, fast_lrck_cycle_sel);
DEF_FIELD(11, 10, tdm_channel);
DEF_FIELD(9, 8, tdm_wlen);
DEF_BIT(4, tdm_lr_swap);
DEF_BIT(3, tdm_fmt);
DEF_BIT(2, tdm_lrck_inv);
DEF_BIT(1, tdm_bck_inv);
DEF_BIT(0, tdm_en);
static auto Get() { return hwreg::RegisterAddr<AFE_TDM_IN_CON1>(0x588); }
};
// AFE IRQ10 MCU Counter Register.
class AFE_IRQ_MCU_CNT10 : public hwreg::RegisterBase<AFE_IRQ_MCU_CNT10, uint32_t> {
public:
DEF_FIELD(17, 0, cnt);
static auto Get() { return hwreg::RegisterAddr<AFE_IRQ_MCU_CNT10>(0x8DC); }
};
// AFE HDMI_IN_2CH Config Register.
class AFE_HDMI_IN_2CH_CON0 : public hwreg::RegisterBase<AFE_HDMI_IN_2CH_CON0, uint32_t> {
public:
DEF_BIT(2, AFE_HDMI_IN_2CH_R_MONO);
DEF_BIT(1, AFE_HDMI_IN_2CH_DATA);
DEF_BIT(0, AFE_HDMI_IN_2CH_OUT_ON);
static auto Get() { return hwreg::RegisterAddr<AFE_HDMI_IN_2CH_CON0>(0x9C0); }
};
// AFE HDMI_IN_2CH Base Address Register.
class AFE_HDMI_IN_2CH_BASE : public hwreg::RegisterBase<AFE_HDMI_IN_2CH_BASE, uint32_t> {
public:
static auto Get() { return hwreg::RegisterAddr<AFE_HDMI_IN_2CH_BASE>(0x9C4); }
};
// AFE HDMI_IN_2CH End Adress Register.
class AFE_HDMI_IN_2CH_END : public hwreg::RegisterBase<AFE_HDMI_IN_2CH_END, uint32_t> {
public:
static auto Get() { return hwreg::RegisterAddr<AFE_HDMI_IN_2CH_END>(0x9C8); }
};
// AFE HDMI_IN_2CH Base Cursor Register.
class AFE_HDMI_IN_2CH_CUR : public hwreg::RegisterBase<AFE_HDMI_IN_2CH_CUR, uint32_t> {
public:
static auto Get() { return hwreg::RegisterAddr<AFE_HDMI_IN_2CH_CUR>(0x9CC); }
};
#endif // SRC_DEVICES_LIB_MT8167_INCLUDE_SOC_MT8167_MT8167_AUDIO_REGS_H_