Add driver for the Texas Instruments TLV320AIC3110 audio codec. Signed-off-by: Florijan Plohl <florijan.plohl@norik.com>
301 lines
9.6 KiB
C
301 lines
9.6 KiB
C
/*
|
|
* Copyright (c) 2025 PHYTEC America LLC
|
|
* Author: Florijan Plohl <florijan.plohl@norik.com>
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#ifndef ZEPHYR_DRIVERS_AUDIO_TLV320DAC310X_H_
|
|
#define ZEPHYR_DRIVERS_AUDIO_TLV320DAC310X_H_
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/* Register addresses */
|
|
#define PAGE_CONTROL_ADDR 0
|
|
|
|
/* Register addresses {page, address} and fields */
|
|
#define SOFT_RESET_ADDR (struct reg_addr){0, 1}
|
|
#define SOFT_RESET_ASSERT (1)
|
|
|
|
#define CLOCK_GEN_MUX_ADDR (struct reg_addr){0, 4}
|
|
#define CLOCK_GEN_MUX_DEFAULT (0x3)
|
|
|
|
#define PLL_P_R_ADDR (struct reg_addr){0, 5}
|
|
#define PLL_POWER_UP BIT(7)
|
|
#define PLL_POWER_UP_MASK BIT(7)
|
|
#define PLL_P_MASK BIT_MASK(3)
|
|
#define PLL_P(val) (((val) & PLL_P_MASK) << 4)
|
|
#define PLL_R_MASK BIT_MASK(4)
|
|
#define PLL_R(val) ((val) & PLL_R_MASK)
|
|
|
|
#define PLL_J_ADDR (struct reg_addr){0, 6}
|
|
|
|
#define PLL_D_MSB_ADDR (struct reg_addr){0, 7}
|
|
#define PLL_D_LSB_ADDR (struct reg_addr){0, 8}
|
|
|
|
#define NDAC_DIV_ADDR (struct reg_addr){0, 11}
|
|
#define NDAC_POWER_UP BIT(7)
|
|
#define NDAC_POWER_UP_MASK BIT(7)
|
|
#define NDAC_DIV_MASK BIT_MASK(7)
|
|
#define NDAC_DIV(val) ((val) & NDAC_DIV_MASK)
|
|
|
|
#define MDAC_DIV_ADDR (struct reg_addr){0, 12}
|
|
#define MDAC_POWER_UP BIT(7)
|
|
#define MDAC_POWER_UP_MASK BIT(7)
|
|
#define MDAC_DIV_MASK BIT_MASK(7)
|
|
#define MDAC_DIV(val) ((val) & MDAC_DIV_MASK)
|
|
|
|
#define OSR_MSB_ADDR (struct reg_addr){0, 13}
|
|
#define OSR_MSB_MASK BIT_MASK(2)
|
|
|
|
#define OSR_LSB_ADDR (struct reg_addr){0, 14}
|
|
#define OSR_LSB_MASK BIT_MASK(8)
|
|
|
|
#define NADC_DIV_ADDR (struct reg_addr){0, 18}
|
|
#define NADC_POWER_UP BIT(7)
|
|
#define NADC_POWER_UP_MASK BIT(7)
|
|
#define NADC_DIV_MASK BIT_MASK(7)
|
|
#define NADC_DIV(val) ((val) & NADC_DIV_MASK)
|
|
|
|
#define MADC_DIV_ADDR (struct reg_addr){0, 19}
|
|
#define MADC_POWER_UP BIT(7)
|
|
#define MADC_POWER_UP_MASK BIT(7)
|
|
#define MADC_DIV_MASK BIT_MASK(7)
|
|
#define MADC_DIV(val) ((val) & MADC_DIV_MASK)
|
|
|
|
#define AOSR_ADDR (struct reg_addr){0, 20}
|
|
|
|
#define IF_CTRL1_ADDR (struct reg_addr){0, 27}
|
|
#define IF_CTRL_IFTYPE_MASK BIT_MASK(1)
|
|
#define IF_CTRL_IFTYPE_I2S 0
|
|
#define IF_CTRL_IFTYPE_DSP 1
|
|
#define IF_CTRL_IFTYPE_RJF 2
|
|
#define IF_CTRL_IFTYPE_LJF 3
|
|
#define IF_CTRL_IFTYPE(val) (((val) & IF_CTRL_IFTYPE_MASK) << 6)
|
|
#define IF_CTRL_WLEN_MASK BIT_MASK(2)
|
|
#define IF_CTRL_WLEN(val) (((val) & IF_CTRL_WLEN_MASK) << 4)
|
|
#define IF_CTRL_WLEN_16 0
|
|
#define IF_CTRL_WLEN_20 1
|
|
#define IF_CTRL_WLEN_24 2
|
|
#define IF_CTRL_WLEN_32 3
|
|
#define IF_CTRL_BCLK_OUT BIT(3)
|
|
#define IF_CTRL_WCLK_OUT BIT(2)
|
|
#define IF_CTRL_DOUT_HIGH_Z BIT(0)
|
|
|
|
#define BCLK_DIV_ADDR (struct reg_addr){0, 30}
|
|
#define BCLK_DIV_POWER_UP BIT(7)
|
|
#define BCLK_DIV_POWER_UP_MASK BIT(7)
|
|
#define BCLK_DIV_MASK BIT_MASK(7)
|
|
#define BCLK_DIV(val) ((val) & MDAC_DIV_MASK)
|
|
|
|
#define OVF_FLAG_ADDR (struct reg_addr){0, 39}
|
|
|
|
#define DAC_PROC_BLK_SEL_ADDR (struct reg_addr){0, 60}
|
|
#define DAC_PROC_BLK_SEL_MASK BIT_MASK(5)
|
|
#define DAC_PROC_BLK_SEL(val) ((val) & DAC_PROC_BLK_SEL_MASK)
|
|
|
|
#define ADC_PROC_BLK_SEL_ADDR (struct reg_addr){0, 61}
|
|
#define ADC_PROC_BLK_SEL_MASK BIT_MASK(5)
|
|
#define ADC_PROC_BLK_SEL(val) ((val) & ADC_PROC_BLK_SEL_MASK)
|
|
|
|
#define DATA_PATH_SETUP_ADDR (struct reg_addr){0, 63}
|
|
#define DAC_LR_POWERUP_DEFAULT (BIT(7) | BIT(6) | BIT(4) | BIT(2))
|
|
#define DAC_LR_POWERDN_DEFAULT (BIT(4) | BIT(2))
|
|
|
|
#define VOL_CTRL_ADDR (struct reg_addr){0, 64}
|
|
#define VOL_CTRL_UNMUTE_DEFAULT (0)
|
|
#define VOL_CTRL_MUTE_DEFAULT (BIT(3) | BIT(2))
|
|
|
|
#define L_DIG_VOL_CTRL_ADDR (struct reg_addr){0, 65}
|
|
#define DRC_CTRL1_ADDR (struct reg_addr){0, 68}
|
|
#define L_BEEP_GEN_ADDR (struct reg_addr){0, 71}
|
|
#define BEEP_GEN_EN_BEEP (BIT(7))
|
|
#define R_BEEP_GEN_ADDR (struct reg_addr){0, 72}
|
|
#define BEEP_LEN_MSB_ADDR (struct reg_addr){0, 73}
|
|
#define BEEP_LEN_MIB_ADDR (struct reg_addr){0, 74}
|
|
#define BEEP_LEN_LSB_ADDR (struct reg_addr){0, 75}
|
|
|
|
/* Page 1 registers */
|
|
/* Headphone driver registers */
|
|
#define HEADPHONE_DRV_ADDR (struct reg_addr){1, 31}
|
|
#define HEADPHONE_DRV_POWERUP (BIT(7) | BIT(6))
|
|
#define HEADPHONE_DRV_CM_MASK (BIT_MASK(2) << 3)
|
|
#define HEADPHONE_DRV_CM(val) (((val) << 3) & HEADPHONE_DRV_CM_MASK)
|
|
#define HEADPHONE_DRV_RESERVED (BIT(2))
|
|
|
|
#define HP_OUT_POP_RM_ADDR (struct reg_addr){1, 33}
|
|
#define HP_OUT_POP_RM_ENABLE (BIT(7))
|
|
|
|
#define OUTPUT_ROUTING_ADDR (struct reg_addr){1, 35}
|
|
#define OUTPUT_ROUTING_HPL BIT(7)
|
|
#define OUTPUT_ROUTING_HPR BIT(3)
|
|
|
|
#define HPL_ANA_VOL_CTRL_ADDR (struct reg_addr){1, 36}
|
|
#define HPR_ANA_VOL_CTRL_ADDR (struct reg_addr){1, 37}
|
|
#define HPX_ANA_VOL_ENABLE BIT(7)
|
|
#define HPX_ANA_VOL_MASK BIT_MASK(7)
|
|
#define HPX_ANA_VOL(val) (((val) & HPX_ANA_VOL_MASK) | \
|
|
HPX_ANA_VOL_ENABLE)
|
|
#define HPX_ANA_VOL_MAX (0)
|
|
#define HPX_ANA_VOL_DEFAULT (0)
|
|
#define HPX_ANA_VOL_MIN (127)
|
|
#define HPX_ANA_VOL_MUTE (HPX_ANA_VOL_MIN | ~HPX_ANA_VOL_ENABLE)
|
|
#define HPX_ANA_VOL_LOW_THRESH (105)
|
|
#define HPX_ANA_VOL_FLOOR (144)
|
|
|
|
#define HPL_DRV_GAIN_CTRL_ADDR (struct reg_addr){1, 40}
|
|
#define HPR_DRV_GAIN_CTRL_ADDR (struct reg_addr){1, 41}
|
|
#define HPX_DRV_UNMUTE (BIT(2))
|
|
#define HPX_DRV_RESERVED (BIT(1)) /* Write only 1 */
|
|
|
|
#define HEADPHONE_DRV_CTRL_ADDR (struct reg_addr){1, 44}
|
|
#define HEADPHONE_DRV_LINEOUT (BIT(1) | BIT(2))
|
|
|
|
/* Class-D speaker amplifier registers */
|
|
#define SPEAKER_DRV_ADDR (struct reg_addr){1, 32}
|
|
#define SPEAKER_DRV_POWERUP BIT(7) | BIT(6)
|
|
#define SPEAKER_DRV_RESERVED BIT(2) | BIT(1)
|
|
|
|
#define OUTPUT_ROUTING_MIXER BIT(6) | BIT(2)
|
|
|
|
#define SPL_ANA_VOL_CTRL_ADDR (struct reg_addr){1, 38}
|
|
#define SPR_ANA_VOL_CTRL_ADDR (struct reg_addr){1, 39}
|
|
#define SPX_ANA_VOL_ENABLE BIT(7)
|
|
#define SPX_ANA_VOL_MASK (BIT_MASK(7))
|
|
#define SPX_ANA_VOL(val) (((val) & SPX_ANA_VOL_MASK) | \
|
|
SPX_ANA_VOL_ENABLE)
|
|
#define SPX_ANA_VOL_MAX (0)
|
|
#define SPX_ANA_VOL_DEFAULT (0)
|
|
#define SPX_ANA_VOL_MIN (127)
|
|
#define SPX_ANA_VOL_MUTE (SPX_ANA_VOL_MIN | ~SPX_ANA_VOL_ENABLE)
|
|
#define SPX_ANA_VOL_LOW_THRESH (105)
|
|
#define SPX_ANA_VOL_FLOOR (144)
|
|
|
|
#define SPL_DRV_GAIN_CTRL_ADDR (struct reg_addr){1, 42}
|
|
#define SPR_DRV_GAIN_CTRL_ADDR (struct reg_addr){1, 43}
|
|
#define SPX_DRV_UNMUTE (BIT(2))
|
|
#define SPX_DRV_RESERVED (BIT(1)) /* Write only 0 */
|
|
|
|
/* ADC Mic registers */
|
|
#define MIC_ADC_CTRL_ADDR (struct reg_addr){0, 81}
|
|
#define MIC_ADC_POWERUP BIT(7)
|
|
#define MIC_ADC_FLAG_ADDR (struct reg_addr){0, 36}
|
|
|
|
#define MIC_FCTRL_ADDR (struct reg_addr){0, 82}
|
|
#define MIC_FCTRL_DEFAULT 0x0
|
|
|
|
#define MIC_CCTRL_ADDR (struct reg_addr){0, 83}
|
|
#define MIC_CCTRL_DEFAULT 0x0
|
|
|
|
#define MIC_BIAS_ADDR (struct reg_addr){1, 46}
|
|
#define MICBIAS_DEFAULT (BIT(3) | BIT(1))
|
|
|
|
#define MIC_PGA_ADDR (struct reg_addr){1, 47} /* Missing in datasheet */
|
|
#define MIC_PGA_VOL_DEFAULT 0x0 /* 0.5 dB/bit, max volume: 59.5 dB */
|
|
#define MIC_PGAPI_ADDR (struct reg_addr){1, 48}
|
|
#define MIC_PGAPI_L_DEFAULT (BIT(7) | BIT(6))
|
|
#define MIC_PGAPI_R_DEFAULT (BIT(5) | BIT(4))
|
|
#define MIC_PGAMI_ADDR (struct reg_addr){1, 49}
|
|
#define MIC_ICM_ADDR (struct reg_addr){1, 50}
|
|
|
|
/* Page 3 registers */
|
|
#define TIMER_MCLK_DIV_ADDR (struct reg_addr){3, 16}
|
|
#define TIMER_MCLK_DIV_EN_EXT (BIT(7))
|
|
#define TIMER_MCLK_DIV_MASK (BIT_MASK(7))
|
|
#define TIMER_MCLK_DIV_VAL(val) ((val) & TIMER_MCLK_DIV_MASK)
|
|
|
|
struct reg_addr {
|
|
uint8_t page; /* page number */
|
|
uint8_t reg_addr; /* register address */
|
|
};
|
|
|
|
enum dac_proc_block {
|
|
PRB_P1_DECIMATION_A = 1,
|
|
PRB_P7_DECIMATION_B = 7,
|
|
PRB_P17_DECIMATION_C = 17,
|
|
};
|
|
|
|
enum adc_proc_block {
|
|
PRB_R4_DECIMATION_A = 4,
|
|
PRB_R10_DECIMATION_B = 10,
|
|
PRB_R16_DECIMATION_C = 16,
|
|
};
|
|
|
|
enum cm_voltage {
|
|
CM_VOLTAGE_1P35 = 0,
|
|
CM_VOLTAGE_1P5 = 1,
|
|
CM_VOLTAGE_1P65 = 2,
|
|
CM_VOLTAGE_1P8 = 3,
|
|
};
|
|
|
|
struct tlv320aic3110_rate_divs {
|
|
uint32_t mclk;
|
|
uint32_t rate;
|
|
uint8_t pll_p;
|
|
uint8_t pll_j;
|
|
uint16_t pll_d;
|
|
uint8_t dosr;
|
|
uint8_t ndac;
|
|
uint8_t mdac;
|
|
uint8_t aosr;
|
|
uint8_t nadc;
|
|
uint8_t madc;
|
|
};
|
|
|
|
/* PLL configurations */
|
|
static const struct tlv320aic3110_rate_divs pll_div_table[] = {
|
|
/* mclk rate pll: p j d dosr ndac mdac aors nadc madc */
|
|
/* 8k rate */
|
|
{12000000, 8000, 1, 8, 1920, 128, 48, 2, 128, 48, 2},
|
|
{24000000, 8000, 2, 8, 1920, 128, 48, 2, 128, 48, 2},
|
|
{25000000, 8000, 2, 7, 8643, 128, 48, 2, 128, 48, 2},
|
|
/* 11.025k rate */
|
|
{12000000, 11025, 1, 7, 5264, 128, 32, 2, 128, 32, 2},
|
|
{24000000, 11025, 2, 7, 5264, 128, 32, 2, 128, 32, 2},
|
|
{25000000, 11025, 2, 7, 2253, 128, 32, 2, 128, 32, 2},
|
|
/* 16k rate */
|
|
{12000000, 16000, 1, 8, 1920, 128, 24, 2, 128, 24, 2},
|
|
{24000000, 16000, 2, 8, 1920, 128, 24, 2, 128, 24, 2},
|
|
{25000000, 16000, 2, 7, 8643, 128, 24, 2, 128, 24, 2},
|
|
/* 22.05k rate */
|
|
{12000000, 22050, 1, 7, 5264, 128, 16, 2, 128, 16, 2},
|
|
{24000000, 22050, 2, 7, 5264, 128, 16, 2, 128, 16, 2},
|
|
{25000000, 22050, 2, 7, 2253, 128, 16, 2, 128, 16, 2},
|
|
/* 32k rate */
|
|
{12000000, 32000, 1, 8, 1920, 128, 12, 2, 128, 12, 2},
|
|
{24000000, 32000, 2, 8, 1920, 128, 12, 2, 128, 12, 2},
|
|
{25000000, 32000, 2, 7, 8643, 128, 12, 2, 128, 12, 2},
|
|
/* 44.1k rate */
|
|
{12000000, 44100, 1, 7, 5264, 128, 8, 2, 128, 8, 2},
|
|
{24000000, 44100, 2, 7, 5264, 128, 8, 2, 128, 8, 2},
|
|
{25000000, 44100, 2, 7, 2253, 128, 8, 2, 128, 8, 2},
|
|
/* 48k rate */
|
|
{12000000, 48000, 1, 8, 1920, 128, 8, 2, 128, 8, 2},
|
|
{24000000, 48000, 2, 8, 1920, 128, 8, 2, 128, 8, 2},
|
|
{25000000, 48000, 2, 7, 8643, 128, 8, 2, 128, 8, 2},
|
|
/* 88.2k rate */
|
|
{12000000, 88200, 1, 7, 5264, 64, 8, 2, 64, 8, 2},
|
|
{24000000, 88200, 2, 7, 5264, 64, 8, 2, 64, 8, 2},
|
|
{25000000, 88200, 2, 7, 2253, 64, 8, 2, 64, 8, 2},
|
|
/* 96k rate */
|
|
{12000000, 96000, 1, 8, 1920, 64, 8, 2, 64, 8, 2},
|
|
{24000000, 96000, 2, 8, 1920, 64, 8, 2, 64, 8, 2},
|
|
{25000000, 96000, 2, 7, 8643, 64, 8, 2, 64, 8, 2},
|
|
/* 176.4k rate */
|
|
{12000000, 176400, 1, 7, 5264, 32, 8, 2, 32, 8, 2},
|
|
{24000000, 176400, 2, 7, 5264, 32, 8, 2, 32, 8, 2},
|
|
{25000000, 176400, 2, 7, 2253, 32, 8, 2, 32, 8, 2},
|
|
/* 192k rate */
|
|
{12000000, 192000, 1, 8, 1920, 32, 8, 2, 32, 8, 2},
|
|
{24000000, 192000, 2, 8, 1920, 32, 8, 2, 32, 8, 2},
|
|
{25000000, 192000, 2, 7, 8643, 32, 8, 2, 32, 8, 2},
|
|
};
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* ZEPHYR_DRIVERS_AUDIO_TLV320DAC310X_H_ */
|