diff --git a/drivers/audio/wm8904.h b/drivers/audio/wm8904.h new file mode 100644 index 0000000000..b20373b121 --- /dev/null +++ b/drivers/audio/wm8904.h @@ -0,0 +1,883 @@ +/**************************************************************************** + * drivers/audio/wm8904.h + * + * Copyright (C) 2014 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt + * + * Reference: + * "WM8904 Ultra Low Power CODEC for Portable Audio Applications, Pre- + * Production", September 2012, Rev 3.3, Wolfson Microelectronics + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +#ifndef __DRIVERS_AUDIO_WM8904_H +#define __DRIVERS_AUDIO_WM8904_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include + +#include + +#ifdef CONFIG_AUDIO + +/**************************************************************************** + * Pre-Processor Definitions + ****************************************************************************/ + +/* Registers Addresses ******************************************************/ + +#define WM8904_SWRST_ID 0x00 /* SW Reset and ID */ +#define WM8904_BIAS_CTRL 0x04 /* Bias Control */ +#define WM8904_VMID_CTRL 0x05 /* VMID Control */ +#define WM8904_MIC_BIAS_CTRL 0x06 /* Mic Bias Control */ +#define WM8904_MIC_BIAS_CTRL 0x07 /* Mic Bias Control */ +#define WM8904_ANALOG_ADC 0x0a /* Analogue ADC */ +#define WM8904_PM0 0x0c /* Power Management 0 */ +#define WM8904_PM2 0x0e /* Power Management 2 */ +#define WM8904_PM3 0x0f /* Power Management 3 */ +#define WM8904_PM6 0x12 /* Power Management 6 */ +#define WM8904_CLKRATE0 0x14 /* Clock Rates 0 */ +#define WM8904_CLKRATE1 0x15 /* Clock Rates 1 */ +#define WM8904_CLKRATE2 0x16 /* Clock Rates 2 */ +#define WM8904_AIF0 0x18 /* Audio Interface 0 */ +#define WM8904_AIF1 0x19 /* Audio Interface 1 */ +#define WM8904_AIF2 0x1a /* Audio Interface 2 */ +#define WM8904_AIF3 0x1b /* Audio Interface 3 */ +#define WM8904_DAC_VOL_LEFT 0x1e /* DAC Digital Volume Left */ +#define WM8904_DAC_VOL_RIGHT 0x1f /* DAC Digital Volume Right */ +#define WM8904_DAC_DIGI0 0x20 /* DAC Digital 0 */ +#define WM8904_DATA_DIGI1 0x21 /* DAC Digital 1 */ +#define WM8904_ADC_VOL_LEFT 0x24 /* ADC Digital Volume Left */ +#define WM8904_ADC_VOL_RIGHT 0x25 /* ADC Digital Volume Right */ +#define WM8904_ADC_DIGI 0x26 /* ADC Digital */ +#define WM8904_MIC_DIGI 0x27 /* Digital Microphone */ +#define WM8904_DRC0 0x28 /* DRC 0 */ +#define WM8904_DRC1 0x29 /* DRC 1 */ +#define WM8904_DRC2 0x2a /* DRC 2 */ +#define WM8904_DRC3 0x2b /* DRC 3 */ +#define WM8904_ANA_LEFT_IN0 0x2c /* Analogue Left Input 0 */ +#define WM8904_ANA_RIGHT_IN0 0x2d /* Analogue Right Input 0 */ +#define WM8904_ANA_LEFT_IN1 0x2e /* Analogue Left Input 1 */ +#define WM8904_ANA_RIGHT_IN1 0x2f /* Analogue Right Input 1 */ +#define WM8904_ANA_LEFT_OUT1 0x39 /* Analogue OUT1 Left */ +#define WM8904_ANA_RIGHT_OUT1 0x3a /* Analogue OUT1 Right */ +#define WM8904_ANA_LEFT_OUT2 0x3b /* Analogue OUT2 Left */ +#define WM8904_ANA_RIGHT_OUT2 0x3c /* Analogue OUT2 Right */ +#define WM8904_ANA_OUT12_ZC 0x3d /* Analogue OUT12 ZC */ +#define WM8904_DC_SERVO0 0x43 /* DC Servo 0 */ +#define WM8904_DC_SERVO1 0x44 /* DC Servo 1 */ +#define WM8904_DC_SERVO2 0x45 /* DC Servo 2 */ +#define WM8904_DC_SERVO4 0x47 /* DC Servo 4 */ +#define WM8904_DC_SERVO5 0x48 /* DC Servo 5 */ +#define WM8904_DC_SERVO6 0x49 /* DC Servo 6 */ +#define WM8904_DC_SERVO7 0x4a /* DC Servo 7 */ +#define WM8904_DC_SERVO8 0x4b /* DC Servo 8 */ +#define WM8904_DC_SERVO9 0x4c /* DC Servo 9 */ +#define WM8904_DC_SERVO_RDBACK 0x4d /* DC Servo Readback 0 */ +#define WM8904_ANA_HP0 0x5a /* Analogue HP 0 */ +#define WM8904_ANA_LINEOUT0 0x5e /* Analogue Lineout 0 */ +#define WM8904_CHG_PUMP0 0x62 /* Charge Pump 0 */ +#define WM8904_CLASS_W0 0x68 /* Class W 0 */ +#define WM8904_WR_SEQ0 0x6c /* Write Sequencer 0 */ +#define WM8904_WR_SEQ1 0x6d /* Write Sequencer 1 */ +#define WM8904_WR_SEQ2 0x6e /* Write Sequencer 2 */ +#define WM8904_WR_SEQ3 0x6f /* Write Sequencer 3 */ +#define WM8904_WR_SEQ4 0x70 /* Write Sequencer 4 */ +#define WM8904_FLL_CTRL1 0x74 /* FLL Control 1 */ +#define WM8904_FLL_CTRL2 0x75 /* FLL Control 2 */ +#define WM8904_FLL_CTRL3 0x76 /* FLL Control 3 */ +#define WM8904_FLL_CTRL4 0x77 /* FLL Control 4 */ +#define WM8904_FLL_CTRL5 0x78 /* FLL Control 5 */ +#define WM8904_GPIO_CTRL1 0x79 /* GPIO Control 1 */ +#define WM8904_GPIO_CTRL2 0x7a /* GPIO Control 2 */ +#define WM8904_GPIO_CTRL3 0x7b /* GPIO Control 3 */ +#define WM8904_GPIO_CTRL4 0x7c /* GPIO Control 4 */ +#define WM8904_DIGI_PULLS 0x7e /* Digital Pulls */ +#define WM8904_INT_STATUS 0x7f /* Interrupt Status */ +#define WM8904_INT_MASK 0x80 /* Interrupt Status Mask */ +#define WM8904_INT_POL 0x81 /* Interrupt Polarity */ +#define WM8904_INT_DEBOUNCE 0x82 /* Interrupt Debounce */ +#define WM8904_EQ1 0x86 /* EQ1 */ +#define WM8904_EQ2 0x87 /* EQ2 */ +#define WM8904_EQ3 0x88 /* EQ3 */ +#define WM8904_EQ4 0x89 /* EQ4 */ +#define WM8904_EQ5 0x8a /* EQ5 */ +#define WM8904_EQ6 0x8b /* EQ6 */ +#define WM8904_EQ7 0x8c /* EQ7 */ +#define WM8904_EQ8 0x8d /* EQ8 */ +#define WM8904_EQ9 0x8e /* EQ9 */ +#define WM8904_EQ10 0x8f /* EQ10 */ +#define WM8904_EQ11 0x90 /* EQ11 */ +#define WM8904_EQ12 0x91 /* EQ12 */ +#define WM8904_EQ13 0x92 /* EQ13 */ +#define WM8904_EQ14 0x93 /* EQ14 */ +#define WM8904_EQ15 0x94 /* EQ15 */ +#define WM8904_EQ16 0x95 /* EQ16 */ +#define WM8904_EQ17 0x96 /* EQ17 */ +#define WM8904_EQ18 0x97 /* EQ18 */ +#define WM8904_EQ19 0x98 /* EQ19 */ +#define WM8904_EQ20 0x99 /* EQ20 */ +#define WM8904_EQ21 0x9a /* EQ21 */ +#define WM8904_EQ22 0x9b /* EQ22 */ +#define WM8904_EQ23 0x9c /* EQ23 */ +#define WM8904_EQ24 0x9d /* EQ24 */ +#define WM8904_ADC_TEST 0xc6 /* ADC Test */ +#define WM8904_FLL_NCO_TEST0 0xf7 /* FLL NCO Test 0 */ +#define WM8904_FLL_NCO_TEST1 0xf8 /* FLL NCO Test 1 */ + +/* Register Bit Definitions *************************************************/ + +/* 0x00 SW Reset and ID */ + +#define WM8904_SW_RST_DEV_ID1 0x8904 + +/* 0x04 Bias Control */ + +#define WM8904_ISEL_SHIFT (2) /* Bits 2-3: Master Bias Control */ +#define WM8904_ISEL_MASK (3 << WM8904_ISEL_SHIFT) +# define WM8904_ISEL_LOW (0 << WM8904_ISEL_SHIFT) /* Low power bias */ +# define WM8904_ISEL_HIGH (2 << WM8904_ISEL_SHIFT) /* High performance bias */ +#define WM8904_BIAS_ENA (1 << 0) /* Bit 0: Normal bias current generator */ + +/* 0x05 VMID Control */ + +#define WM8904_VMID_BUF_ENA (1 << 6) /* Bit 6: Enable VMID buffer to unused I/O */ +#define WM8904_VMID_RES_SHIFT (1) /* Bits 1-2: VMID divider enable and select */ +#define WM8904_VMID_RES_MASK (3 << WM8904_VMID_RES_SHIFT) +# define WM8904_VMID_RES_OFF (0 << WM8904_VMID_RES_SHIFT) /* VMID disabled */ +# define WM8904_VMID_RES_NORMAL (1 << WM8904_VMID_RES_SHIFT) /* 2 x 50k divider */ +# define WM8904_VMID_RES_STANDBY (2 << WM8904_VMID_RES_SHIFT) /* 2 x 250k divider */ +# define WM8904_VMID_RES_FASTSTART (3 << WM8904_VMID_RES_SHIFT) /* 2 x 5k divider */ +#define WM8904_VMID_ENA (1 << 0) /* Bit 0: VMID buffer enable */ + +/* 0x06 Mic Bias Control */ + +#define WM8904_MICDET_THR_SHIFT (4) /* Bits 4-6: MICBIAS current detect threshold */ +#define WM8904_MICDET_THR_MASK (7 << WM8904_MICDET_THR_SHIFT) +# define WM8904_MICDET_THR(n) ((uint16_t)(n) << WM8904_MICDET_THR_SHIFT) +#define WM8904_MICSHORT_THR_SHIFT (2) /* Bits 2-3: MICBIAS short circuit threshold */ +#define WM8904_MICSHORT_THR_MASK (3 << WM8904_MICSHORT_THR_SHIFT) + #define WM8904_MICSHORT_THR(n) ((uint16_t)(n) << WM8904_MICSHORT_THR_SHIFT) +#define WM8904_MICDET_ENA (1 << 1) /* Bit 1: MICBIAS current/short circuit detect enable */ +#define WM8904_MICBIAS_ENA (1 << 0) /* Bit 0: MICBIAS enable */ + +/* 0x07 Mic Bias Control */ + +#define WM8904_MICBIAS_SEL_MASK (0x0007) /* Bits 0-2: Selects MICBIAS voltage */ + +/* 0x0a Analogue ADC */ + +#define WM8904_ADC_OSR128 (1 << 0) /* Bit 0: ADC Oversampling Ratio */ + +/* 0x0c Power Management 0 */ + +#define WM8904_INL_ENA (1 << 1) /* Bit 1: Left input PGA enable */ +#define WM8904_INR_ENA (1 << 0) /* Bit 0: Right input PGA enable */ + +/* 0x0e Power Management 2 */ + +#define WM8904_HPL_PGA_ENA (1 << 1) /* Bit 1: Left headphone output enable */ +#define WM8904_HPR_PGA_ENA (1 << 0) /* Bit 0: Right headphone output enable */ + +/* 0x0f Power Management 3 */ + +#define WM8904_LINEOUTL_PGA_ENA (1 << 1) /* Bit 1: Left line output enable */ +#define WM8904_LINEOUTR_PGA_ENA (1 << 0) /* Bit 0: Right line output enable */ + +/* 0x12 Power Management 6 */ + +#define WM8904_DACL_ENA (1 << 3) /* Bit 3: Left DAC enable */ +#define WM8904_DACR_ENA (1 << 2) /* Bit 2: Right DAC enable */ +#define WM8904_ADCL_ENA (1 << 1) /* Bit 1: Left ADC enable */ +#define WM8904_ADCR_ENA (1 << 0) /* Bit 0: Right ADC enable */ + +/* 0x14 Clock Rates 0 */ + +#define WM8904_TOCLK_RATE_DIV16 (1 << 14) /* Bit 14: TOCLK Rate Divider (/16) */ +#define WM8904_TOCLK_RATE_X4 (1 << 13) /* Bit 13: TOCLK Rate Multiplier */ +#define WM8904_MCLK_DIV (1 << 0) /* Bit 0: Enables divide by 2 on MCLK */ + +/* 0x15 Clock Rates 1 */ + +#define WM8904_CLK_SYS_RATE_SHIFT (10) /* Bits 10-13: Selects the SYSCLK / fs ratio */ +#define WM8904_CLK_SYS_RATE_MASK (15 << WM8904_CLK_SYS_RATE_SHIFT) +# define WM8904_CLK_SYS_RATE_DIV64 (0 << WM8904_CLK_SYS_RATE_SHIFT) +# define WM8904_CLK_SYS_RATE_DIV128 (1 << WM8904_CLK_SYS_RATE_SHIFT) +# define WM8904_CLK_SYS_RATE_DIV192 (2 << WM8904_CLK_SYS_RATE_SHIFT) +# define WM8904_CLK_SYS_RATE_DIV256 (3 << WM8904_CLK_SYS_RATE_SHIFT) +# define WM8904_CLK_SYS_RATE_DIV384 (4 << WM8904_CLK_SYS_RATE_SHIFT) +# define WM8904_CLK_SYS_RATE_DIV512 (5 << WM8904_CLK_SYS_RATE_SHIFT) +# define WM8904_CLK_SYS_RATE_DIV768 (6 << WM8904_CLK_SYS_RATE_SHIFT) +# define WM8904_CLK_SYS_RATE_DIV1024 (7 << WM8904_CLK_SYS_RATE_SHIFT) +# define WM8904_CLK_SYS_RATE_DIV1408 (8 << WM8904_CLK_SYS_RATE_SHIFT) +# define WM8904_CLK_SYS_RATE_DIV1536 (9 << WM8904_CLK_SYS_RATE_SHIFT) +#define WM8904_SAMPLE_RATE_SHIFT (0) /* Bits 0-2: Selects the Sample Rate (fs) */ +#define WM8904_SAMPLE_RATE_MASK (3 << WM8904_SAMPLE_RATE_SHIFT) +# define WM8904_SAMPLE_RATE_8KHZ (0 << WM8904_SAMPLE_RATE_SHIFT) /* 8kHz */ +# define WM8904_SAMPLE_RATE_12KHZ (1 << WM8904_SAMPLE_RATE_SHIFT) /* 11.025kHz, 12kHz */ +# define WM8904_SAMPLE_RATE_16KHZ (2 << WM8904_SAMPLE_RATE_SHIFT) /* 16kHz */ +# define WM8904_SAMPLE_RATE_24KHZ (3 << WM8904_SAMPLE_RATE_SHIFT) /* 22.05kHz, 24kHz */ +# define WM8904_SAMPLE_RATE_32KHZ (4 << WM8904_SAMPLE_RATE_SHIFT) /* 32kHz */ +# define WM8904_SAMPLE_RATE_48KHZ (5 << WM8904_SAMPLE_RATE_SHIFT) /* 44.1kHz, 48kHz */ + +/* 0x16 Clock Rates 2 */ + +#define WM8904_MCLK_INV (1 << 15) /* Bit 15: MCLK invert */ +#define WM8904_SYSCLK_SRC (1 << 14) /* Bit 14: SYSCLK source select */ +#define WM8904_TOCLK_RATE (1 << 12) /* Bit 12: TOCLK rate divider (/2) */ +#define WM8904_OPCLK_ENA (1 << 3) /* Bit 3: GPIO clock output enable */ +#define WM8904_CLK_SYS_ENA (1 << 2) /* Bit 2: System clock enable */ +#define WM8904_CLK_DSP_ENA (1 << 1) /* Bit 1: DSP clock enable */ +#define WM8904_TOCLK_ENA (1 << 0) /* Bit 0: Zero cross timeout enable */ + +/* 0x18 Audio Interface 0 */ + +#define WM8904_DACL_DATINV (1 << 12) /* Bit 12: Left DAC invert */ +#define WM8904_DACR_DATINV (1 << 11) /* Bit 11: Right DAC invert* / +#define WM8904_DAC_BOOST_SHIFT (9) /* Bits 9-10: DAC digital input volume boost */ +#define WM8904_DAC_BOOST_MASK (3 << WM8904_DAC_BOOST_SHIFT) +# define WM8904_DAC_BOOST_0DB (0 << WM8904_DAC_BOOST_SHIFT) +# define WM8904_DAC_BOOST_6DB (1 << WM8904_DAC_BOOST_SHIFT) +# define WM8904_DAC_BOOST_12DB (2 << WM8904_DAC_BOOST_SHIFT) +#define WM8904_LOOPBACK (1 << 8) /* Bit 8: Digital loopback function */ +#define WM8904_AIFADCL_SRC (1 << 7) /* Bit 7: Left digital audio channel source */ +#define WM8904_AIFADCR_SRC (1 << 6) /* Bit 6: Right digital audio channel source */ +#define WM8904_AIFDACL_SRC (1 << 5) /* Bit 5: Left DAC data source select */ +#define WM8904_AIFDACR_SRC (1 << 4) /* Bit 4: Right DAC data source select */ +#define WM8904_ADC_COMP (1 << 3) /* Bit 3: ADC companding enable */ +#define WM8904_ADC_COMPMODE (1 << 2) /* Bit 2: ADC companding type */ +#define WM8904_DAC_COMP (1 << 1) /* Bit 1: DAC companding enable */ +#define WM8904_DAC_COMPMODE (1 << 0) /* Bit 0: DAC companding type */ + +/* 0x19 Audio Interface 1 */ + +#define WM8904_AIFDAC_TDM (1 << 13) /* Bit 13: DAC TDM enable */ +#define WM8904_AIFDAC_TDM_CHAN (1 << 12) /* Bit 12: DACDAT TDM channel select */ +#define WM8904_AIFADC_TDM (1 << 11) /* Bit 11: ADC TDM enable */ +#define WM8904_AIFADC_TDM_CHAN (1 << 10) /* Bit 10: ADCDAT TDM channel select */ +#define WM8904_AIF_TRIS (1 << 8) /* Bit 8: Audio interface tristate */ +#define WM8904_AIF_BCLK_INV (1 << 7) /* Bit 7: BCLK invert */ +#define WM8904_BCLK_DIR (1 << 6) /* Bit 6: Audio interface BCLK direction */ +#define WM8904_AIF_LRCLK_INV (1 << 4) /* Bit 4: LRC polarity/DSP mode A-B select */ +#define WM8904_AIF_WL_SHIFT (2) /* Bits 2-3: Digital audio interface word length */ +#define WM8904_AIF_WL_MASK (3 << WM8904_AIF_WL_SHIFT) +# define WM8904_AIF_WL_16BITS (0 << WM8904_AIF_WL_SHIFT) +# define WM8904_AIF_WL_20BITS (1 << WM8904_AIF_WL_SHIFT) +# define WM8904_AIF_WL_24BITS (2 << WM8904_AIF_WL_SHIFT) +# define WM8904_AIF_WL_32BITS (3 << WM8904_AIF_WL_SHIFT) +#define WM8904_AIF_FMT_SHIFT (0) /* Bits 0-1: Digital audio interface format */ +#define WM8904_AIF_FMT_MASK (3 << WM8904_AIF_FMT_SHIFT) +# define WM8904_AIF_FMT_RJUST (0 << WM8904_AIF_FMT_SHIFT) /* Right Justified */ +# define WM8904_AIF_FMT_LJUST (1 << WM8904_AIF_FMT_SHIFT) /* Left Justified */ +# define WM8904_AIF_FMT_I2S (2 << WM8904_AIF_FMT_SHIFT) /* I2S */ +# define WM8904_AIF_FMT_DSP (3 << WM8904_AIF_FMT_SHIFT) /* DSP */ + +/* 0x1a Audio Interface 2 */ + +#define WM8904_OPCLK_DIV_SHIFT (8) /* Bits 8-11: GPIO Output Clock Divider */ +#define WM8904_OPCLK_DIV_MASK (15 << WM8904_OPCLK_DIV_SHIFT) +# define WM8904_OPCLK_DIV1 (0 << WM8904_OPCLK_DIV_SHIFT) /* SYSCLK */ +# define WM8904_OPCLK_DIV2 (1 << WM8904_OPCLK_DIV_SHIFT) /* SYSCLK / 2 */ +# define WM8904_OPCLK_DIV3 (2 << WM8904_OPCLK_DIV_SHIFT) /* SYSCLK / 3 */ +# define WM8904_OPCLK_DIV4 (3 << WM8904_OPCLK_DIV_SHIFT) /* SYSCLK / 4 */ +# define WM8904_OPCLK_DIV5p5 (4 << WM8904_OPCLK_DIV_SHIFT) /* SYSCLK / 5.5 */ +# define WM8904_OPCLK_DIV6 (5 << WM8904_OPCLK_DIV_SHIFT) /* SYSCLK / 6 */ +# define WM8904_OPCLK_DIV8 (6 << WM8904_OPCLK_DIV_SHIFT) /* SYSCLK / 8 */ +# define WM8904_OPCLK_DIV12 (7 << WM8904_OPCLK_DIV_SHIFT) /* SYSCLK / 12 */ +# define WM8904_OPCLK_DIV16 (8 << WM8904_OPCLK_DIV_SHIFT) /* SYSCLK / 16 */ +#define WM8904_BCLK_DIV_SHIFT (0) /* Bits 0-4: BCLK Frequency (Master Mode) */ +#define WM8904_BCLK_DIV_MASK (31 << WM8904_BCLK_DIV_SHIFT) +# define WM8904_BCLK_DIV1 (0 << WM8904_BCLK_DIV_SHIFT) /* SYSCLK */ +# define WM8904_BCLK_DIV1p5 (1 << WM8904_BCLK_DIV_SHIFT) /* SYSCLK / 1.5 */ +# define WM8904_BCLK_DIV2 (2 << WM8904_BCLK_DIV_SHIFT) /* SYSCLK / 2 */ +# define WM8904_BCLK_DIV3 (3 << WM8904_BCLK_DIV_SHIFT) /* SYSCLK / 3 */ +# define WM8904_BCLK_DIV4 (4 << WM8904_BCLK_DIV_SHIFT) /* SYSCLK / 4 */ +# define WM8904_BCLK_DIV5 (5 << WM8904_BCLK_DIV_SHIFT) /* SYSCLK / 5 */ +# define WM8904_BCLK_DIV5p5 (6 << WM8904_BCLK_DIV_SHIFT) /* SYSCLK / 5.5 */ +# define WM8904_BCLK_DIV6 (7 << WM8904_BCLK_DIV_SHIFT) /* SYSCLK / 6 */ +# define WM8904_BCLK_DIV8 (8 << WM8904_BCLK_DIV_SHIFT) /* SYSCLK / 8 */ +# define WM8904_BCLK_DIV10 (9 << WM8904_BCLK_DIV_SHIFT) /* SYSCLK / 10 */ +# define WM8904_BCLK_DIV11 (10 << WM8904_BCLK_DIV_SHIFT) /* SYSCLK / 11 */ +# define WM8904_BCLK_DIV12 (11 << WM8904_BCLK_DIV_SHIFT) /* SYSCLK / 12 */ +# define WM8904_BCLK_DIV16 (12 << WM8904_BCLK_DIV_SHIFT) /* SYSCLK / 16 */ +# define WM8904_BCLK_DIV20 (13 << WM8904_BCLK_DIV_SHIFT) /* SYSCLK / 20 */ +# define WM8904_BCLK_DIV22 (14 << WM8904_BCLK_DIV_SHIFT) /* SYSCLK / 22 */ +# define WM8904_BCLK_DIV24 (15 << WM8904_BCLK_DIV_SHIFT) /* SYSCLK / 24 */ +# define WM8904_BCLK_DIV25 (16 << WM8904_BCLK_DIV_SHIFT) /* SYSCLK / 25 */ +# define WM8904_BCLK_DIV30 (17 << WM8904_BCLK_DIV_SHIFT) /* SYSCLK / 30 */ +# define WM8904_BCLK_DIV32 (18 << WM8904_BCLK_DIV_SHIFT) /* SYSCLK / 32 */ +# define WM8904_BCLK_DIV44 (19 << WM8904_BCLK_DIV_SHIFT) /* SYSCLK / 44 */ +# define WM8904_BCLK_DIV48 (20 << WM8904_BCLK_DIV_SHIFT) /* SYSCLK / 48 */ + +/* 0x1b Audio Interface 3 */ + +#define WM8904_LRCLK_DIR (1 << 11) /* Bit 11: Audio interface LRC direction */ +#define WM8904_LRCLK_RATE_SHIFT (0) /* Bits 0-10: LRC rate (master mode) */ +#define WM8904_LRCLK_RATE_MASK (0x7ff << WM8904_LRCLK_RATE_SHIFT) +# define WM8904_LRCLK_RATE(n) ((uint16_t)(n) << WM8904_LRCLK_RATE_SHIFT) + +/* 0x1e DAC Digital Volume Left */ +/* 0x1f DAC Digital Volume Right */ + +#define WM8904_DAC_VU (1 << 8) /* Bit 8: DAC volume update */ +#define WM8904_DAC_VOL_SHIFT (0) /* Bits 0-7: DAC digital volume */ +#define WM8904_DAC_VOL_MASK (0xff << WM8904_DAC_VOL_SHIFT) +# define WM8904_DAC_VOL(n) ((uint16_t)(n) << WM8904_DAC_VOL_SHIFT) + +/* 0x20 DAC Digital 0 */ + +#define WM8904_ADCL_DAC_SVOL_SHIFT (8) /* Bits 8-11: Left digital sidetone volume */ +#define WM8904_ADCL_DAC_SVOL_MASK (15 << WM8904_ADCL_DAC_SVOL_SHIFT) +# define WM8904_ADCL_DAC_SVOL(n) ((uint16_t)(n) << WM8904_ADCL_DAC_SVOL_SHIFT) +#define WM8904_ADCR_DAC_SVOL_SHIFT (4) /* Bits 4-7: Right digital sidetone volume*/ +#define WM8904_ADCR_DAC_SVOL_MASK (15 << WM8904_ADCR_DAC_SVOL_SHIFT) +# define WM8904_ADCR_DAC_SVOL(n) ((uint16_t)(n) << WM8904_ADCR_DAC_SVOL_SHIFT) +#define WM8904_ADC_TO_DACL_SHIFT (2) /* Bits 2-3: Left DAC digital sidetone source */ +#define WM8904_ADC_TO_DACL_MASK (3 << WM8904_ADC_TO_DACL_SHIFT) +# define WM8904_ADC_TO_DACL_NONE (0 << WM8904_ADC_TO_DACL_SHIFT) /* No sidetone */ +# define WM8904_ADC_TO_DACL_LEFT (1 << WM8904_ADC_TO_DACL_SHIFT) /* Left ADC */ +# define WM8904_ADC_TO_DACL_RIGHT (2 << WM8904_ADC_TO_DACL_SHIFT) /* Right ADC */ +#define WM8904_ADC_TO_DACR_SHIFT (0) /* Bits 0-1: Right DAC digital sidetone source */ +#define WM8904_ADC_TO_DACR_MASK (3 << WM8904_ADC_TO_DACR_SHIFT) +# define WM8904_ADC_TO_DACR_NONE (0 << WM8904_ADC_TO_DACR_SHIFT) /* No sidetone */ +# define WM8904_ADC_TO_DACR_LEFT (1 << WM8904_ADC_TO_DACR_SHIFT) /* Left ADC */ +# define WM8904_ADC_TO_DACR_RIGHT (2 << WM8904_ADC_TO_DACR_SHIFT) /* Right ADC */ + +/* 0x21 DAC Digital 1 */ + +#define WM8904_DAC_MONO (1 << 12) /* Bit 12: DAC mono mix */ +#define WM8904_DAC_SB_FILT (1 << 11) /* Bit 11: Selects DAC filter characteristics */ +#define WM8904_DAC_MUTERATE (1 << 10) /* Bit 10: DAC soft mute ramp rate */ +#define WM8904_DAC_UNMUTE_RAMP (1 << 9) /* Bit 9: DAC soft mute mode */ +#define WM8904_DAC_OSR128 (1 << 6) /* Bit 6: DAC oversample rate select */ +#define WM8904_DAC_MUTE (1 << 3) /* Bit 3: DAC soft mute control */ +#define WM8904_DEEMPH_SHIFT (1) /* Bits 1-2: DAC de-emphasis control */ +#define WM8904_DEEMPH_MASK (3 << WM8904_DEEMPH_SHIFT) +# define WM8904_DEEMPH_NONE (0 << WM8904_DEEMPH_SHIFT) /* No de-emphasis */ +# define WM8904_DEEMPH_32KHZ (1 << WM8904_DEEMPH_SHIFT) /* 32kHz sample rate */ +# define WM8904_DEEMPH_44p1KHZ (2 << WM8904_DEEMPH_SHIFT) /* 44.1kHz sample rate */ +# define WM8904_DEEMPH_48KHZ (3 << WM8904_DEEMPH_SHIFT) /* 48kHz sample rate */ + +/* 0x24 ADC Digital Volume Left */ +/* 0x25 ADC Digital Volume Right */ + +#define WM8904_ADC_VU (1 << 8) /* Bit 8: ADC Volume Update */ +#define WM8904_ADC_VOL_SHIFT (0) /* Bits 0-7: ADC Digital Volume */ +#define WM8904_ADC_VOL_MASK (0xff << WM8904_ADC_VOL_SHIFT) +# define WM8904_ADC_VOL(n) ((uint16_t)(n) << WM8904_ADC_VOL_SHIFT) + +/* 0x26 ADC Digital */ + +#define WM8904_ADC_HPF_CUT_SHIFT (5) /* Bits 5-6: ADC digital high pass filter cut-off */ +#define WM8904_ADC_HPF_CUT_MASK (3 << WM8904_ADC_HPF_CUT_SHIFT) +# define WM8904_ADC_HPF_CUT_HIFI (0 << WM8904_ADC_HPF_CUT_SHIFT) /* Hi-fi mode */ +# define WM8904_ADC_HPF_CUT_VOICE1 (1 << WM8904_ADC_HPF_CUT_SHIFT) /* Voice mode 1 */ +# define WM8904_ADC_HPF_CUT_VOICE2 (2 << WM8904_ADC_HPF_CUT_SHIFT) /* Voice mode 2 */ +# define WM8904_ADC_HPF_CUT_VOICE3 (3 << WM8904_ADC_HPF_CUT_SHIFT) /* Voice mode 3 */ +#define WM8904_ADC_HPF (1 << 4) /* Bit 4: ADC digital high pass filter enable */ +#define WM8904_ADCL_DATINV (1 << 1) /* Bit 1: Left ADC invert */ +#define WM8904_ADCR_DATINV (1 << 0) /* Bit 0: Right ADC invert */ + +/* 0x27 Digital Microphone */ + +#define WM8904_DMIC_ENA (1 << 12) /* Bit 12: Enables digital microphone mode */ +#define WM8904_DMIC_SRC (1 << 11) /* Bit 11: Selects digital microphone data input */ + +/* 0x28 DRC 0 */ + +#define WM8904_DRC_ENA (1 << 15) /* Bit 15: DRC enable */ +#define WM8904_DRC_DAC_PATH (1 << 14) /* Bit 14: DRC path select */ +#define WM8904_DRC_GS_HYST_LVL_SHIFT (11) /* Bits 11-12: Gain smoothing hysteresis threshold */ +#define WM8904_DRC_GS_HYST_LVL_MASK (3 << WM8904_DRC_GS_HYST_LVL_SHIFT) +# define WM8904_DRC_GS_HYST_LVL(n) ((uint16_t)(n) << WM8904_DRC_GS_HYST_LVL_SHIFT) +# define WM8904_DRC_GS_HYST_LOW (0 << WM8904_DRC_GS_HYST_LVL_SHIFT) /* Low */ +# define WM8904_DRC_GS_HYST_MEDIUM (1 << WM8904_DRC_GS_HYST_LVL_SHIFT) /* Medium */ +# define WM8904_DRC_GS_HYST_HIGH (2 << WM8904_DRC_GS_HYST_LVL_SHIFT) /* High */ +#define WM8904_DRC_STARTUP_GAIN_SHIFT (6) /* Bits 6-10: Initial gain at DRC startup */ +#define WM8904_DRC_STARTUP_GAIN_MASK (31 << WM8904_DRC_STARTUP_GAIN_SHIFT) +# define WM8904_DRC_STARTUP_GAIN(n) ((uint16_t)(n) << WM8904_DRC_STARTUP_GAIN_SHIFT) +#define WM8904_DRC_FF_DELAY (1 << 5) /* Bit 5: Feed-forward delay for anti-clip feature */ +#define WM8904_DRC_GS_ENA (1 << 3) /* Bit 3: Gain smoothing enable */ +#define WM8904_DRC_QR (1 << 2) /* Bit 2: Quick release enable */ +#define WM8904_DRC_ANTICLIP (1 << 1) /* Bit 1: Anti-clip enable */ +#define WM8904_DRC_GS_HYST (1 << 0) /* Bit 0: Gain smoothing hysteresis enable */ + +/* 0x29 DRC 1 */ + +#define WM8904_DRC_ATK_SHIFT (12) /* Bits 13-15: Gain attack rate (seconds/6dB) */ +#define WM8904_DRC_ATK_MASK (15 << WM8904_DRC_ATK_SHIFT) +# define WM8904_DRC_ATK(n) ((uint16_t)(n) << WM8904_DRC_ATK_SHIFT) +#define WM8904_DRC_DCY_SHIFT (8) /* Bits 8-11: Gain decay rate (seconds/6dB) */ +#define WM8904_DRC_DCY_MASK (15 << WM8904_DRC_DCY_SHIFT) +# define WM8904_DRC_DCY(n) ((uint16_t)(n) << WM8904_DRC_DCY_SHIFT) +#define WM8904_DRC_QR_THR_SHIFT (6) /* Bits 6-7: Quick release crest factor threshold */ +#define WM8904_DRC_QR_THR_MASK (3 << WM8904_DRC_QR_THR_SHIFT) +# define WM8904_DRC_QR_THR(n) ((uint16_t)(n) << WM8904_DRC_QR_THR_SHIFT) +#define WM8904_DRC_QR_DCY_SHIFT (4) /* Bits 4-5: Quick release decay rate (seconds/6dB)*/ +#define WM8904_DRC_QR_DCY_MASK (3 << WM8904_DRC_QR_DCY_SHIFT) +# define WM8904_DRC_QR_DCY(n) ((uint16_t)(n) << WM8904_DRC_QR_DCY_SHIFT) +#define WM8904_DRC_MINGAIN_SHIFT (2) /* Bits 2-3: Minimum gain the DRC can use to attenuate audio*/ +#define WM8904_DRC_MINGAIN_MASK (3 << WM8904_DRC_MINGAIN_SHIFT) +# define WM8904_DRC_MINGAIN(n) ((uint16_t)(n) << WM8904_DRC_MINGAIN_SHIFT) +#define WM8904_DRC_MAXGAIN_SHIFT (0) /* Bits 0-1: Maximum gain the DRC can use to boost audio*/ +#define WM8904_DRC_MAXGAIN_MASK (3 << WM8904_DRC_MAXGAIN_SHIFT) +# define WM8904_DRC_MAXGAIN(n) ((uint16_t)(n) << WM8904_DRC_MAXGAIN_SHIFT) + +/* 0x2a DRC 2 */ + +#define WM8904_DRC_HI_COMP_SHIFT (3) /* Bits 3-5: Compressor slope (upper region) */ +#define WM8904_DRC_HI_COMP_MASK (7 << WM8904_DRC_HI_COMP_SHIFT) +# define WM8904_DRC_HI_COMP_DIV1 (0 << WM8904_DRC_HI_COMP_SHIFT) /* 1 (no compression) */ +# define WM8904_DRC_HI_COMP_DIV2 (1 << WM8904_DRC_HI_COMP_SHIFT) /* 1/2 */ +# define WM8904_DRC_HI_COMP_DIV4 (2 << WM8904_DRC_HI_COMP_SHIFT) /* 1/4 */ +# define WM8904_DRC_HI_COMP_DIV8 (3 << WM8904_DRC_HI_COMP_SHIFT) /* 1/8 */ +# define WM8904_DRC_HI_COMP_DIV16 (4 << WM8904_DRC_HI_COMP_SHIFT) /* 1/16 */ +# define WM8904_DRC_HI_COMP_ZERO (5 << WM8904_DRC_HI_COMP_SHIFT) /* 0 */ +#define WM8904_DRC_LO_COMP_SHIFT (0) /* Bits 0-2: Compressor slope (lower region)*/ +#define WM8904_DRC_LO_COMP_MASK (7 << WM8904_DRC_LO_COMP_SHIFT) +# define WM8904_DRC_LO_COMP(n) ((uint16_t)(n) << WM8904_DRC_LO_COMP_SHIFT) +# define WM8904_DRC_LO_COMP_DIV1 (0 << WM8904_DRC_HI_COMP_SHIFT) /* 1 (no compression) */ +# define WM8904_DRC_LO_COMP_DIV2 (1 << WM8904_DRC_HI_COMP_SHIFT) /* 1/2 */ +# define WM8904_DRC_LO_COMP_DIV4 (2 << WM8904_DRC_HI_COMP_SHIFT) /* 1/4 */ +# define WM8904_DRC_LO_COMP_DIV8 (3 << WM8904_DRC_HI_COMP_SHIFT) /* 1/8 */ +# define WM8904_DRC_LO_COMP_DIV16 (4 << WM8904_DRC_HI_COMP_SHIFT) /* 1/16 */ +# define WM8904_DRC_LO_COMP_ZERO (5 << WM8904_DRC_HI_COMP_SHIFT) /* 0 */ + +/* 0x2b DRC 3 */ + +#define WM8904_DRC_KNEE_IP_SHIFT (5) /* Bits 5-10: Input signal at the compressor knee*/ +#define WM8904_DRC_KNEE_IP_MASK (0X3f << WM8904_DRC_KNEE_IP_SHIFT) +# define WM8904_DRC_KNEE_IP(n) ((uint16_t)(n) << WM8904_DRC_KNEE_IP_SHIFT) +#define WM8904_DRC_KNEE_OP_SHIFT (0) /* Bits 0-4: Output signal at the compressor knee */ +#define WM8904_DRC_KNEE_OP_MASK (0x1f << WM8904_DRC_KNEE_OP_SHIFT) +# define WM8904_DRC_KNEE_OP(n) ((uint16_t)(n) << WM8904_DRC_KNEE_OP_SHIFT) + +/* 0x2c Analogue Left Input 0 */ +/* 0x2d Analogue Right Input 0 */ + +#define WM8904_INMUTE (1 << 7) /* Bit 7: Input PGA mute */ +#define WM8904_IN_VOL_SHIFT (0) /* Bits 0-4: Input PGA volume */ +#define WM8904_IN_VOL_MASK (31 << WM8904_IN_VOL_SHIFT) +# define WM8904_IN_VOL(n) ((uint16_t)(n) << WM8904_IN_VOL_SHIFT) + +/* 0x2e Analogue Left Input 1 */ +/* 0x2f Analogue Right Input 1 */ + +#define WM8904_IN_CM_ENA (1 << 6) /* Bit 6: Input PGA common mode rejection enable */ +#define WM8904_IP_SEL_N_SHIFT (4) /* Bits 4-5: Select pin for inverting input */ +#define WM8904_IP_SEL_N_MASK (3 << WM8904_IP_SEL_N_SHIFT) +# define WM8904_IP_SEL_N_IN1L (0 << WM8904_IP_SEL_N_SHIFT) +# define WM8904_IP_SEL_N_IN2L (1 << WM8904_IP_SEL_N_SHIFT) +# define WM8904_IP_SEL_N_IN3L (2 << WM8904_IP_SEL_N_SHIFT) +#define WM8904_IP_SEL_P_SHIFT (2) /* Bits 2-3: Select pin for non-inverting input */ +#define WM8904_IP_SEL_P_MASK (3 << WM8904_IP_SEL_P_SHIFT) +# define WM8904_IP_SEL_P(n) ((uint16_t)(n) << WM8904_IP_SEL_P_SHIFT) +# define WM8904_IP_SEL_P_IN1L (0 << WM8904_IP_SEL_P_SHIFT) +# define WM8904_IP_SEL_P_IN2L (1 << WM8904_IP_SEL_P_SHIFT) +# define WM8904_IP_SEL_P_IN3L (2 << WM8904_IP_SEL_P_SHIFT) +#define WM8904_MODE_SHIFT (0) /* Bits 0-1: Sets mode for analog input */ +#define WM8904_MODE_MASK (23<< WM8904_MODE_SHIFT) +# define WM8904_MODE(n) ((uint16_t)(n) << WM8904_MODE_SHIFT) +# define WM8904_MODE_SINGLE (0 << WM8904_MODE_SHIFT) /* Single-Ended */ +# define WM8904_MODE_DIFFLINE (1 << WM8904_MODE_SHIFT) /* Differential Line */ +# define WM8904_MODE_DIFFMIC (2 << WM8904_MODE_SHIFT) /* Differential MIC */ + +/* 0x39 Analogue OUT1 Left */ +/* 0x3a Analogue OUT1 Right */ + +#define WM8904_HPOUT_MUTE (1 << 8) /* Bit 8: Headphone output mute */ +#define WM8904_HPOUT_VU (1 << 7) /* Bit 7: Headphone output volume update */ +#define WM8904_HPOUTZC (1 << 6) /* Bit 6: Headphone output zero cross enable */ +#define WM8904_HPOUT_VOL_SHIFT (0) /* Bits 0-5: Headphone output volume */ +#define WM8904_HPOUT_VOL_MASK (0x3f << WM8904_HPOUT_VOL_SHIFT) +# define WM8904_HPOUT_VOL(n) ((uint16_t)(n) << WM8904_HPOUT_VOL_SHIFT) + +/* 0x3b Analogue OUT2 Left */ +/* 0x3c Analogue OUT2 Right */ + +#define WM8904_LINEOUT_MUTE (1 << 8) /* Bit 8: Headphone output mute */ +#define WM8904_LINEOUT_VU (1 << 7) /* Bit 7: Headphone output volume update */ +#define WM8904_LINEOUTZC (1 << 6) /* Bit 6: Headphone output zero cross enable */ +#define WM8904_LINEOUT_VOL_SHIFT (0) /* Bits 0-5: Headphone output volume */ +#define WM8904_LINEOUT_VOL_MASK (0x3f << WM8904_LINEOUT_VOL_SHIFT) +# define WM8904_LINEOUT_VOL(n) ((uint16_t)(n) << WM8904_LINEOUT_VOL_SHIFT) + +/* 0x3d Analogue OUT12 ZC */ + +#define WM8904_HPL_BYP_ENA (1 << 3) /* Bit 3: Selects input for left headphone output MUX */ +#define WM8904_HPR_BYP_ENA (1 << 2) /* Bit 2: Selects input for right headphone output MUX */ +#define WM8904_LINEOUTL_BYP_ENA (1 << 1) /* Bit 1: Selects input for left line output MUX */ +#define WM8904_LINEOUTR_BYP_ENA (1 << 0) /* Bit 0: Selects input for right line output MUX */ + +/* 0x43 DC Servo 0 */ + +#define WM8904_DCS_ENA_CHAN_3 (1 << 3) /* Bit 3: DC servo enable for LINEOUTR */ +#define WM8904_DCS_ENA_CHAN_2 (1 << 2) /* Bit 2: DC servo enable for LINEOUTL */ +#define WM8904_DCS_ENA_CHAN_1 (1 << 1) /* Bit 1: DC servo enable for HPOUTR */ +#define WM8904_DCS_ENA_CHAN_0 (1 << 0) /* Bit 0: DC servo enable for HPOUTL */ + +/* 0x44 DC Servo 1 */ + +#define WM8904_DCS_TRIG_SINGLE_3 (1 << 15) /* Bit 15: Single DC offset correction for LINEOUTR */ +#define WM8904_DCS_TRIG_SINGLE_2 (1 << 14) /* Bit 14: Single DC offset correction for LINEOUTL */ +#define WM8904_DCS_TRIG_SINGLE_1 (1 << 13) /* Bit 13: Single DC offset correction for HPOUTR */ +#define WM8904_DCS_TRIG_SINGLE_0 (1 << 12) /* Bit 12: Single DC offset correction for HPOUTL */ +#define WM8904_DCS_TRIG_SERIES_3 (1 << 11) /* Bit 11: Series of DC offset corrections for LINEOUTR */ +#define WM8904_DCS_TRIG_SERIES_2 (1 << 10) /* Bit 10: Series of DC offset corrections for LINEOUTL */ +#define WM8904_DCS_TRIG_SERIES_1 (1 << 9) /* Bit 9: Series of DC offset corrections for HPOUTR */ +#define WM8904_DCS_TRIG_SERIES_0 (1 << 8) /* Bit 8: Series of DC offset corrections for HPOUTL */ +#define WM8904_DCS_TRIG_STARTUP_3 (1 << 7) /* Bit 7: Start-up DC Servo mode for LINEOUTR */ +#define WM8904_DCS_TRIG_STARTUP_2 (1 << 6) /* Bit 6: Start-up DC Servo mode for LINEOUTL */ +#define WM8904_DCS_TRIG_STARTUP_1 (1 << 5) /* Bit 5: Start-up DC Servo mode for HPOUTR */ +#define WM8904_DCS_TRIG_STARTUP_0 (1 << 4) /* Bit 4: Start-up DC Servo mode for HPOUTL */ +#define WM8904_DCS_TRIG_DAC_WR_3 (1 << 3) /* Bit 3: DAC write DC Servo mode for LINEOUTR */ +#define WM8904_DCS_TRIG_DAC_WR_2 (1 << 2) /* Bit 2: DAC write DC Servo mode for LINEOUTL */ +#define WM8904_DCS_TRIG_DAC_WR_1 (1 << 1) /* Bit 1: DAC write DC Servo mode for HPOUTR */ +#define WM8904_DCS_TRIG_DAC_WR_0 (1 << 0) /* Bit 0: DAC write DC Servo mode for HPOUTL */ + +/* 0x45 DC Servo 2 */ + +#define WM8904_DCS_TIMER_PERIOD_23_SHIFT (8) /* Bits 8-11: LINEOUTL/LINEOUTR update period */ +#define WM8904_DCS_TIMER_PERIOD_23_MASK (15 << WM8904_DCS_TIMER_PERIOD_23_SHIFT) +# define WM8904_DCS_TIMER_PERIOD_23(n) ((uint16_t)(n) << WM8904_DCS_TIMER_PERIOD_23_SHIFT) +#define WM8904_DCS_TIMER_PERIOD_01_SHIFT (0) /* Bits 0-3: HPOUTL/HPOUTR update period */ +#define WM8904_DCS_TIMER_PERIOD_01_MASK (15 << WM8904_DCS_TIMER_PERIOD_01_SHIFT) +# define WM8904_DCS_TIMER_PERIOD_01(n) ((uint16_t)(n) << WM8904_DCS_TIMER_PERIOD_01_SHIFT) + +/* 0x47 DC Servo 4 */ + +#define WM8904_DCS_SERIES_NO_23_MASK (0x007f) /* Bits 0-6: Number updates to perform in series for LINEOUTL/R */ + +/* 0x48 DC Servo 5 */ + +#define WM8904_DCS_SERIES_NO_01_MASK (0x007f) /* Bits 0-6: Number updates to perform in series for HPOUTL/R */ + +/* 0x49 DC Servo 6 */ + +#define WM8904_DCS_DAC_WR_VAL_3_MASK (0x00ff) /* Bits 0-7: DC Offset value for LINEOUTR */ + +/* 0x4a DC Servo 7 */ + +#define WM8904_DCS_DAC_WR_VAL_2_MASK (0x00ff) /* Bits 0-7: DC Offset value for LINEOUTL */ + +/* 0x4b DC Servo 8 */ + +#define WM8904_DCS_DAC_WR_VAL_1_MASK (0x00ff) /* Bits 0-7: DC Offset value for HPOUTR */ + +/* 0x4c DC Servo 9 */ + +#define WM8904_DCS_DAC_WR_VAL_0_MASK (0x00ff) /* Bits 0-7: DC Offset value for HPOUTL */ + +/* 0x4d DC Servo Readback 0 */ + +#define WM8904_DCS_CAL_COMPLETE_SHIFT (8) /* Bits 8-11: DC servo complete status */ +#define WM8904_DCS_CAL_COMPLETE_MASK (15 << WM8904_DCS_CAL_COMPLETE_SHIFT) +# define WM8904_DCS_CAL_COMPLETE_LINEOUTR (8 << WM8904_DCS_CAL_COMPLETE_SHIFT) +# define WM8904_DCS_CAL_COMPLETE_LINEOUTL (4 << WM8904_DCS_CAL_COMPLETE_SHIFT) +# define WM8904_DCS_CAL_COMPLETE_HPOUTR (2 << WM8904_DCS_CAL_COMPLETE_SHIFT) +# define WM8904_DCS_CAL_COMPLETE_HPOUTL (1 << WM8904_DCS_CAL_COMPLETE_SHIFT) +#define WM8904_DCS_DAC_WR_COMPLETE_SHIFT (4) /* Bits 4-7: DC servo DAC write status */ +#define WM8904_DCS_DAC_WR_COMPLETE_MASK (15 << WM8904_DCS_DAC_WR_COMPLETE_SHIFT) +# define WM8904_DCS_DAC_WR_COMPLETE_LINEOUTR (8 << WM8904_DCS_DAC_WR_COMPLETE_SHIFT) +# define WM8904_DCS_DAC_WR_COMPLETE_LINEOUTL (4 << WM8904_DCS_DAC_WR_COMPLETE_SHIFT) +# define WM8904_DCS_DAC_WR_COMPLETE_HPOUTR (2 << WM8904_DCS_DAC_WR_COMPLETE_SHIFT) +# define WM8904_DCS_DAC_WR_COMPLETE_HPOUTL (1 << WM8904_DCS_DAC_WR_COMPLETE_SHIFT) +#define WM8904_DCS_STARTUP_COMPLETE_SHIFT (0) /* Bits 0-3: DC servo start-up status */ +#define WM8904_DCS_STARTUP_COMPLETE_MASK (15 << WM8904_DCS_STARTUP_COMPLETE_SHIFT) +# define WM8904_DCS_STARTUP_COMPLETE(n) ((uint16_t)(n) << WM8904_DCS_STARTUP_COMPLETE_SHIFT) +# define WM8904_DCS_STARTUP_COMPLETE_LINEOUTR (8 << WM8904_DCS_DAC_WR_COMPLETE_SHIFT) +# define WM8904_DCS_STARTUP_COMPLETE_LINEOUTL (4 << WM8904_DCS_DAC_WR_COMPLETE_SHIFT) +# define WM8904_DCS_STARTUP_COMPLETE_HPOUTR (2 << WM8904_DCS_DAC_WR_COMPLETE_SHIFT) +# define WM8904_DCS_STARTUP_COMPLETE_HPOUTL (1 << WM8904_DCS_DAC_WR_COMPLETE_SHIFT) + +/* 0x5a Analogue HP 0 */ + +#define WM8904_HPL_RMV_SHORT (1 << 7) /* Bit 7: Removes HPOUTL short */ +#define WM8904_HPL_ENA_OUTP (1 << 6) /* Bit 6: Enables HPOUTL output stage */ +#define WM8904_HPL_ENA_DLY (1 << 5) /* Bit 5: Enables HPOUTL intermediate stage */ +#define WM8904_HPL_ENA (1 << 4) /* Bit 4: Enables HPOUTL input stage */ +#define WM8904_HPR_RMV_SHORT (1 << 3) /* Bit 3: Removes HPOUTR short */ +#define WM8904_HPR_ENA_OUTP (1 << 2) /* Bit 2: Enables HPOUTR output stage */ +#define WM8904_HPR_ENA_DLY (1 << 1) /* Bit 1: Enables HPOUTR intermediate stage */ +#define WM8904_HPR_ENA (1 << 0) /* Bit 0: Enables HPOUTR input stage */ + +/* 0x5e Analogue Lineout 0 */ + +#define WM8904_LINEOUTL_RMV_SHORT (1 << 7) /* Bit 7: Removes LINEOUTL short */ +#define WM8904_LINEOUTL_ENA_OUTP (1 << 6) /* Bit 6: Enables LINEOUTL output stage */ +#define WM8904_LINEOUTL_ENA_DLY (1 << 5) /* Bit 5: Enables LINEOUTL intermediate stage */ +#define WM8904_LINEOUTL_ENA (1 << 4) /* Bit 4: Enables LINEOUTL input stage */ +#define WM8904_LINEOUTR_RMV_SHORT (1 << 3) /* Bit 3: Removes LINEOUTR short */ +#define WM8904_LINEOUTR_ENA_OUTP (1 << 2) /* Bit 2: Enables LINEOUTR output stage */ +#define WM8904_LINEOUTR_ENA_DLY (1 << 1) /* Bit 1: Enables LINEOUTR intermediate stage */ +#define WM8904_LINEOUTR_ENA (1 << 0) /* Bit 0: Enables LINEOUTR input stage */ + +/* 0x62 Charge Pump 0 */ + +#define WM8904_CP_ENA (1 << 0) /* Bit 0: Enable charge-pump digits */ + +/* 0x68 Class W 0 */ + +#define WM8904_CP_DYN_PWR (1 << 0) /* Bit 0: Enable dynamic charge pump power control */ + +/* 0x6c Write Sequencer 0 */ + +#define WM8904_WSEQ_ENA (1 << 8) /* Bit 8: Write sequencer enable */ +#define WM8904_WSEQ_WRITE_INDEX_SHIFT (0) /* Bits 0-4: Sequence write index */ +#define WM8904_WSEQ_WRITE_INDEX_MASK (31 << WM8904_WSEQ_WRITE_INDEX_SHIFT) +# define WM8904_WSEQ_WRITE_INDEX(n) ((uint16_t)(n) << WM8904_WSEQ_WRITE_INDEX_SHIFT) + +/* 0x6d Write Sequencer 1 */ + +#define WM8904_WSEQ_DATA_WIDTH_SHIFT (12) /* Bits 12-14: Width of data block in sequence step */ +#define WM8904_WSEQ_DATA_WIDTH_MASK (7 << WM8904_WSEQ_DATA_WIDTH_SHIFT) +# define WM8904_WSEQ_DATA_WIDTH(n) ((uint16_t)((n)-1) << WM8904_WSEQ_DATA_WIDTH_SHIFT) +#define WM8904_WSEQ_DATA_START_SHIFT (8) /* Bits 8-11: LSB bit of data block in sequence step */ +#define WM8904_WSEQ_DATA_START_MASK (15 << WM8904_WSEQ_DATA_START_SHIFT) +# define WM8904_WSEQ_DATA_START(n) ((uint16_t)(n) << WM8904_WSEQ_DATA_START_SHIFT) +#define WM8904_WSEQ_ADDR_SHIFT (0) /* Bits 0-7: Control Register be written in sequence step */ +#define WM8904_WSEQ_ADDR_MASK (0xff << WM8904_WSEQ_ADDR_SHIFT) +# define WM8904_WSEQ_ADDR(n) ((uint16_t)(n) << WM8904_WSEQ_ADDR_SHIFT) + +/* 0x6e Write Sequencer 2 */ + +#define WM8904_WSEQ_EOS (1 << 14) /* Bit 14: End of sequence flag */ +#define WM8904_WSEQ_DELAY_SHIFT (8) /* Bits 8-11: Time delay after executing this step */ +#define WM8904_WSEQ_DELAY_MASK (15 << WM8904_WSEQ_DELAY_SHIFT) +# define WM8904_WSEQ_DELAY(n) ((uint16_t)(n) << WM8904_WSEQ_DELAY_SHIFT) +#define WM8904_WSEQ_DATA_SHIFT (0) /* Bits 0-7: Data to be written in this sequence step */ +#define WM8904_WSEQ_DATA_MASK (0xff << WM8904_WSEQ_DATA_SHIFT) +# define WM8904_WSEQ_DATA(n) ((uint16_t)(n) << WM8904_WSEQ_DATA_SHIFT) + +/* 0x6f Write Sequencer 3 */ + +#define WM8904_WSEQ_ABORT (1 << 9) /* Bit 9: Aborts the current sequence */ +#define WM8904_WSEQ_START (1 << 8) /* Bit 8: Starts the write sequencer */ +#define WM8904_WSEQ_START_INDEX_SHIFT (0) /* Bits 0-5: Sequence start index */ +#define WM8904_WSEQ_START_INDEX_MASK (63 << WM8904_WSEQ_START_INDEX_SHIFT) +# define WM8904_WSEQ_START_INDEX(n) ((uint16_t)(n) << WM8904_WSEQ_START_INDEX_SHIFT) + +/* 0x70 Write Sequencer 4 */ + +#define WM8904_WSEQ_CURRENT_INDEX_SHIFT (4) /* Bits 4-9: Sequence current index */ +#define WM8904_WSEQ_CURRENT_INDEX_MASK (63 << WM8904_WSEQ_CURRENT_INDEX_SHIFT) +#define WM8904_WSEQ_BUSY (1 << 0) /* Bit 0: Sequencer busy flag */ + +/* 0x74 FLL Control 1 */ + +#define WM8904_FLL_FRACN_ENA (1 << 2) /* Bit 2: FLL fractional enable */ +#define WM8904_FLL_OSC_ENA (1 << 1) /* Bit 1: FLL oscillator enable */ +#define WM8904_FLL_ENA (1 << 0) /* Bit 0: FLL enable */ + +/* 0x75 FLL Control 2 */ + +#define WM8904_FLL_OUTDIV_SHIFT (8) /* Bits 8-13: FLL FOUT clock divider */ +#define WM8904_FLL_OUTDIV_MASK (63 << WM8904_FLL_OUTDIV_SHIFT) +# define WM8904_FLL_OUTDIV(n) ((uint16_t)((n)-1) << WM8904_FLL_OUTDIV_SHIFT) +#define WM8904_FLL_CTRL_RATE_SHIFT (4) /* Bits 4-6: Frequency of the FLL control block */ +#define WM8904_FLL_CTRL_RATE_MASK (7 << WM8904_FLL_CTRL_RATE_SHIFT) +# define WM8904_FLL_CTRL_RATE(n) ((uint16_t)((n)-1) << WM8904_FLL_CTRL_RATE_SHIFT) +#define WM8904_FLL_FRATIO_SHIFT (0) /* Bits 0-2: FVCO clock divider */ +#define WM8904_FLL_FRATIO_MASK (7 << WM8904_FLL_FRATIO_SHIFT) +# define WM8904_FLL_FRATIO_DIV1 (0 << WM8904_FLL_FRATIO_SHIFT) /* Divide by 1 */ +# define WM8904_FLL_FRATIO_DIV2 (1 << WM8904_FLL_FRATIO_SHIFT) /* Divide by 2 */ +# define WM8904_FLL_FRATIO_DIV4 (2 << WM8904_FLL_FRATIO_SHIFT) /* Divide by 4 */ +# define WM8904_FLL_FRATIO_DIV8 (3 << WM8904_FLL_FRATIO_SHIFT) /* Divide by 8 */ +# define WM8904_FLL_FRATIO_DIV16 (4 << WM8904_FLL_FRATIO_SHIFT) /* Divide by 16 */ + +/* 0x76 FLL Control 3, Bits 0-15=Fractional multiply for FREF */ +/* 0x77 FLL Control 4 */ + +#define WM8904_FLL_N_SHIFT (5) /* Bits 5-14: Integer multiply for FREF */ +#define WM8904_FLL_N_MASK (0x3ff << WM8904_FLL_N_SHIFT) +# define WM8904_FLL_N(n) ((uint16_t)(n) << WM8904_FLL_N_SHIFT) +#define WM8904_FLL_GAIN_SHIFT (0) /* Bits 0-3: FLL Gain applied to error */ +#define WM8904_FLL_GAIN_MASK (15 << WM8904_FLL_GAIN_SHIFT) +# define WM8904_FLL_GAIN_X1 (0 << WM8904_FLL_GAIN_SHIFT) +# define WM8904_FLL_GAIN_X2 (1 << WM8904_FLL_GAIN_SHIFT) +# define WM8904_FLL_GAIN_X4 (2 << WM8904_FLL_GAIN_SHIFT) +# define WM8904_FLL_GAIN_X8 (3 << WM8904_FLL_GAIN_SHIFT) +# define WM8904_FLL_GAIN_X16 (4 << WM8904_FLL_GAIN_SHIFT) +# define WM8904_FLL_GAIN_X32 (5 << WM8904_FLL_GAIN_SHIFT) +# define WM8904_FLL_GAIN_X64 (6 << WM8904_FLL_GAIN_SHIFT) +# define WM8904_FLL_GAIN_X128 (7 << WM8904_FLL_GAIN_SHIFT) +# define WM8904_FLL_GAIN_X256 (8 << WM8904_FLL_GAIN_SHIFT) + +/* 0x78 FLL Control 5 */ + +#define WM8904_FLL_CLK_REF_DIV_SHIFT (3) /* Bits 3-4: FLL clock reference divider */ +#define WM8904_FLL_CLK_REF_DIV_MASK (3 << WM8904_FLL_CLK_REF_DIV_SHIFT) +# define WM8904_FLL_CLK_REF_DIV1 (0 << WM8904_FLL_CLK_REF_DIV_SHIFT) /* MCLK / 1 */ +# define WM8904_FLL_CLK_REF_DIV2 (1 << WM8904_FLL_CLK_REF_DIV_SHIFT) /* MCLK / 2 */ +# define WM8904_FLL_CLK_REF_DIV4 (2 << WM8904_FLL_CLK_REF_DIV_SHIFT) /* MCLK / 4 */ +# define WM8904_FLL_CLK_REF_DIV8 (3 << WM8904_FLL_CLK_REF_DIV_SHIFT) /* MCLK / 8 */ +#define WM8904_FLL_CLK_REF_SRC_SHIFT (0) /* Bits 0-2: FLL clock source */ +#define WM8904_FLL_CLK_REF_SRC_MASK (3) << WM8904_FLL_CLK_REF_SRC_SHIFT) +# define WM8904_FLL_CLK_REF_SRC_MCLK (0 << WM8904_FLL_CLK_REF_SRC_SHIFT) +# define WM8904_FLL_CLK_REF_SRC_BCLK (1 << WM8904_FLL_CLK_REF_SRC_SHIFT) +# define WM8904_FLL_CLK_REF_SRC_LRCLK (2 << WM8904_FLL_CLK_REF_SRC_SHIFT) + +/* 0x79 GPIO Control 1 */ + +#define WM8904_GPIO1_PU (1 << 5) /* Bit 5: GPIO1 pull-up resistor enable */ +#define WM8904_GPIO1_PD (1 << 4) /* Bit 4: GPIO1 pull-down resistor enable */ +#define WM8904_GPIO1_SEL_SHIFT (0) /* Bits 0-3: */ +#define WM8904_GPIO1_SEL_MASK (15 << WM8904_GPIO1_SEL_SHIFT) +# define WM8904_GPIO1_SEL_INPUT (0 << WM8904_GPIO1_SEL_SHIFT) /* Input pin */ +# define WM8904_GPIO1_SEL_CLKOUT (1 << WM8904_GPIO1_SEL_SHIFT) /* Clock output (f=SYSCLK/OPCLKDIV) */ +# define WM8904_GPIO1_SEL_ZERO (2 << WM8904_GPIO1_SEL_SHIFT) /* Logic '0' */ +# define WM8904_GPIO1_SEL_ONE (3 << WM8904_GPIO1_SEL_SHIFT) /* Logic '1' */ +# define WM8904_GPIO1_SEL_IRQ (4 << WM8904_GPIO1_SEL_SHIFT) /* IRQ */ +# define WM8904_GPIO1_SEL_FLLLOCK (5 << WM8904_GPIO1_SEL_SHIFT) /* FLL Lock */ +# define WM8904_GPIO1_SEL_MICDET (6 << WM8904_GPIO1_SEL_SHIFT) /* Mic Detect */ +# define WM8904_GPIO1_SEL_MICSHORT (7 << WM8904_GPIO1_SEL_SHIFT) /* Mic Short */ +# define WM8904_GPIO1_SEL_DMICOUT (8 << WM8904_GPIO1_SEL_SHIFT) /* DMIC clock out */ +# define WM8904_GPIO1_SEL_FLLOUT (9 << WM8904_GPIO1_SEL_SHIFT) /* FLL Clock Output */ + +/* 0x7a GPIO Control 2 */ + +#define WM8904_GPIO2_PU (1 << 5) /* Bit 5: GPIO2 pull-up resistor enable */ +#define WM8904_GPIO2_PD (1 << 4) /* Bit 4: GPIO2 pull-down resistor enable */ +#define WM8904_GPIO2_SEL_SHIFT (0) /* Bits 0-3: */ +#define WM8904_GPIO2_SEL_MASK (15 << WM8904_GPIO2_SEL_SHIFT) +# define WM8904_GPIO2_SEL_INPUT (0 << WM8904_GPIO2_SEL_SHIFT) /* Input pin */ +# define WM8904_GPIO2_SEL_CLKOUT (1 << WM8904_GPIO2_SEL_SHIFT) /* Clock output (f=SYSCLK/OPCLKDIV) */ +# define WM8904_GPIO2_SEL_ZERO (2 << WM8904_GPIO2_SEL_SHIFT) /* Logic '0' */ +# define WM8904_GPIO2_SEL_ONE (3 << WM8904_GPIO2_SEL_SHIFT) /* Logic '1' */ +# define WM8904_GPIO2_SEL_IRQ (4 << WM8904_GPIO2_SEL_SHIFT) /* IRQ */ +# define WM8904_GPIO2_SEL_FLLLOCK (5 << WM8904_GPIO2_SEL_SHIFT) /* FLL Lock */ +# define WM8904_GPIO2_SEL_MICDET (6 << WM8904_GPIO2_SEL_SHIFT) /* Mic Detect */ +# define WM8904_GPIO2_SEL_MICSHORT (7 << WM8904_GPIO2_SEL_SHIFT) /* Mic Short */ +# define WM8904_GPIO2_SEL_DMICOUT (8 << WM8904_GPIO2_SEL_SHIFT) /* DMIC clock out */ +# define WM8904_GPIO2_SEL_FLLOUT (9 << WM8904_GPIO2_SEL_SHIFT) /* FLL Clock Output */ + +/* 0x7b GPIO Control 3 */ + +#define WM8904_GPIO3_PU (1 << 5) /* Bit 5: GPIO3 pull-up resistor enable */ +#define WM8904_GPIO3_PD (1 << 4) /* Bit 4: GPIO3 pull-down resistor enable */ +#define WM8904_GPIO3_SEL_SHIFT (0) /* Bits 0-3: */ +#define WM8904_GPIO3_SEL_MASK (15 << WM8904_GPIO3_SEL_SHIFT) +# define WM8904_GPIO3_SEL_INPUT (0 << WM8904_GPIO3_SEL_SHIFT) /* Input pin */ +# define WM8904_GPIO3_SEL_CLKOUT (1 << WM8904_GPIO3_SEL_SHIFT) /* Clock output (f=SYSCLK/OPCLKDIV) */ +# define WM8904_GPIO3_SEL_ZERO (2 << WM8904_GPIO3_SEL_SHIFT) /* Logic '0' */ +# define WM8904_GPIO3_SEL_ONE (3 << WM8904_GPIO3_SEL_SHIFT) /* Logic '1' */ +# define WM8904_GPIO3_SEL_IRQ (4 << WM8904_GPIO3_SEL_SHIFT) /* IRQ */ +# define WM8904_GPIO3_SEL_FLLLOCK (5 << WM8904_GPIO3_SEL_SHIFT) /* FLL Lock */ +# define WM8904_GPIO3_SEL_MICDET (6 << WM8904_GPIO3_SEL_SHIFT) /* Mic Detect */ +# define WM8904_GPIO3_SEL_MICSHORT (7 << WM8904_GPIO3_SEL_SHIFT) /* Mic Short */ +# define WM8904_GPIO3_SEL_DMICOUT (8 << WM8904_GPIO3_SEL_SHIFT) /* DMIC clock out */ +# define WM8904_GPIO3_SEL_FLLOUT (9 << WM8904_GPIO3_SEL_SHIFT) /* FLL Clock Output */ + +/* 0x7c GPIO Control 4 */ + +#define WM8904_GPI7_ENA (1 << 9) /* Bit 9: GPI7 input enable */ +#define WM8904_GPI8_ENA (1 << 8) /* Bit 8: GPI8 input enable */ +#define WM8904_GPIO_BCLK_MODE_ENA (1 << 7) /* Bit 7: Selects BCLK/GPIO4 pin function */ +#define WM8904_GPIO_BCLK_SEL_SHIFT (0) /* Bits 0-3: GPIO_BCLK function select */ +#define WM8904_GPIO_BCLK_SEL_MASK (15 << WM8904_GPIO_BCLK_SEL_SHIFT) +# define WM8904_GPIO_BCLK_SEL_INPUT (0 << WM8904_GPIO_BCLK_SEL_SHIFT) /* Input pin */ +# define WM8904_GPIO_BCLK_SEL_CLKOUT (1 << WM8904_GPIO_BCLK_SEL_SHIFT) /* Clock output (f=SYSCLK/OPCLKDIV) */ +# define WM8904_GPIO_BCLK_SEL_ZERO (2 << WM8904_GPIO_BCLK_SEL_SHIFT) /* Logic '0' */ +# define WM8904_GPIO_BCLK_SEL_ONE (3 << WM8904_GPIO_BCLK_SEL_SHIFT) /* Logic '1' */ +# define WM8904_GPIO_BCLK_SEL_IRQ (4 << WM8904_GPIO_BCLK_SEL_SHIFT) /* IRQ */ +# define WM8904_GPIO_BCLK_SEL_FLLLOCK (5 << WM8904_GPIO_BCLK_SEL_SHIFT) /* FLL Lock */ +# define WM8904_GPIO_BCLK_SEL_MICDET (6 << WM8904_GPIO_BCLK_SEL_SHIFT) /* Mic Detect */ +# define WM8904_GPIO_BCLK_SEL_MICSHORT (7 << WM8904_GPIO_BCLK_SEL_SHIFT) /* Mic Short */ +# define WM8904_GPIO_BCLK_SEL_DMICOUT (8 << WM8904_GPIO_BCLK_SEL_SHIFT) /* DMIC clock out */ +# define WM8904_GPIO_BCLK_SEL_FLLOUT (9 << WM8904_GPIO_BCLK_SEL_SHIFT) /* FLL Clock Output */ + +/* 0x7e Digital Pulls */ + +#define WM8904_MCLK_PU (1 << 7) /* Bit 7: MCLK pull-up resistor enable */ +#define WM8904_MCLK_PD (1 << 6) /* Bit 6: MCLK pull-down resistor enable */ +#define WM8904_DACDAT_PU (1 << 5) /* Bit 5: DACDAT pull-up resistor enable */ +#define WM8904_DACDAT_PD (1 << 4) /* Bit 4: DACDAT pull-down resistor enable */ +#define WM8904_LRCLK_PU (1 << 3) /* Bit 3: LRCLK pull-up resistor enable */ +#define WM8904_LRCLK_PD (1 << 2) /* Bit 2: LRCLK pull-down resistor enable */ +#define WM8904_BCLK_PU (1 << 1) /* Bit 1: BCLK pull-up resistor enable */ +#define WM8904_BCLK_PD (1 << 0) /* Bit 0: BCLK pull-down resistor enable */ + +/* Common interrupt bits */ +/* 0x7f Interrupt Status */ +/* 0x80 Interrupt Status Mask */ +/* 0x81 Interrupt Polarity */ +/* 0x82 Interrupt Debounce */ + +#define WM8904_GPIO_BCLK_EINT (1 << 9) /* Bit 9: GPIO4 interrupt */ +#define WM8904_WSEQ_EINT (1 << 8) /* Bit 8: Write Sequence interrupt */ +#define WM8904_GPIO3_EINT (1 << 7) /* Bit 7: GPIO3 interrupt */ +#define WM8904_GPIO2_EINT (1 << 6) /* Bit 6: GPIO2 interrupt */ +#define WM8904_GPIO1_EINT (1 << 5) /* Bit 5: GPIO1 interrupt */ +#define WM8904_GPI8_EINT (1 << 4) /* Bit 4: GPI8 interrupt */ +#define WM8904_GPI7_EINT (1 << 3) /* Bit 3: GPI7 interrupt */ +#define WM8904_FLL_LOCK_EINT (1 << 2) /* Bit 2: FLL Lock interrupt */ +#define WM8904_MIC_SHRT_EINT (1 << 1) /* Bit 1: MICBIAS short circuit interrupt */ +#define WM8904_MIC_DET_EINT (1 << 0) /* Bit 0: MICBIAS short circuit interrupt */ + +/* 0x7f Interrupt Status (only) */ + +#define WM8904_IRQ (1 << 10) /* Bit 10: Logical OR of all other interrupt flags */ + +/* 0x86 EQ1 */ + +#define WM8904_EQ_ENA (1 << 0) /* Bit 0: EQ enable */ + +/* 0x87-0x8b EQ2-EQ6: 5 bit equalizer value */ +/* 0x8c-0x9d EQ7-EQ24: 16-bit equalizer value */ + +/* 0xc6 ADC Test */ + +#define WM8904_ADC_128_OSR_TST_MODE (1 << 2) /* Bit 2: ADC bias control (1) */ +#define WM8904_ADC_BIASX1P5 (1 << 0) /* Bit 0: ADC bias control (2) */ + +/* 0xf7 FLL NCO Test 0 */ + +#define WM8904_FLL_FRC_NCO (1 << 0) /* Bit 0: FLL Forced control select */ + +/* 0xf8 FLL NCO Test 1 (16-bit FLL forced oscillator value */ + +/**************************************************************************** + * Public Types + ****************************************************************************/ + +/**************************************************************************** + * Public Data + ****************************************************************************/ + +/**************************************************************************** + * Public Function Prototypes + ****************************************************************************/ + +#endif /* CONFIG_AUDIO */ +#endif /* __DRIVERS_AUDIO_WM8904_H */ diff --git a/include/nuttx/audio/vs1053.h b/include/nuttx/audio/vs1053.h index cfc660f005..aa08b7c04c 100644 --- a/include/nuttx/audio/vs1053.h +++ b/include/nuttx/audio/vs1053.h @@ -111,8 +111,9 @@ extern "C" * ****************************************************************************/ -struct spi_dev_s; /* see nuttx/spi/spi.h */ -struct audio_lowerhalf_s; /* see nutt/audio.h */ +struct spi_dev_s; /* See nuttx/spi/spi.h */ +struct audio_lowerhalf_s; /* See nuttx/audio/audio.h */ + FAR struct audio_lowerhalf_s *vs1053_initialize(FAR struct spi_dev_s *spi, FAR const struct vs1053_lower_s *lower, unsigned int devno); diff --git a/include/nuttx/audio/wm8904.h b/include/nuttx/audio/wm8904.h new file mode 100644 index 0000000000..bf00e8a75e --- /dev/null +++ b/include/nuttx/audio/wm8904.h @@ -0,0 +1,172 @@ +/**************************************************************************** + * include/nuttx/audio/wm8904.h + * + * Copyright (C) 2014 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt + * + * Reference: + * "WM8904 Ultra Low Power CODEC for Portable Audio Applications, Pre- + * Production", September 2012, Rev 3.3, Wolfson Microelectronics + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +#ifndef __INCLUDE_NUTTX_AUDIO_WM8904_H +#define __INCLUDE_NUTTX_AUDIO_WM8904_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include + +#include + +#ifdef CONFIG_AUDIO_WM8904 + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ +/* Configuration ************************************************************ + * + * CONFIG_AUDIO_WM8904 - Enabled WM8904 support + */ + +/* Pre-requisistes */ + +#ifndef CONFIG_I2C_TRANSFER +# error "CONFIG_I2C_TRANSFER is required in the I2C configuration" +#endif + +/* Default configuration values */ + +/* Helper macros ************************************************************/ + +#define WM8904_ATTACH(s,isr,arg) ((s)->attach(s,isr,arg)) +#define WM8904_DETACH(s) ((s)->attach(s,NULL,NULL)) +#define WM8904_ENABLE(s) ((s)->enable(s,true)) +#define WM8904_DISABLE(s) ((s)->enable(s,false)) +#define WM8904_CLEAR(s) ((s)->clear(s)) + +/**************************************************************************** + * Public Types + ****************************************************************************/ +/* This is the type of the WM8904 interrupt handler. The lower level code + * will intercept the interrupt and provide the upper level with the private + * data that was provided when the interrupt was attached. + */ + +struct wm8904_lower_s; /* Forward reference. Defined below */ + +typedef CODE int (*wm8904_handler_t)(FAR const struct wm8904_lower_s *lower, + FAR void *arg); + +/* A reference to a structure of this type must be passed to the WM8904 + * driver. This structure provides information about the configuration + * of the WM8904 and provides some board-specific hooks. + * + * Memory for this structure is provided by the caller. It is not copied + * by the driver and is presumed to persist while the driver is active. + */ + +struct wm8904_lower_s +{ + /* Device characterization */ + + uint32_t frequency; /* Initial I2C frequency */ + uint8_t address; /* 7-bit I2C address (only bits 0-6 used) */ + + /* IRQ/GPIO access callbacks. These operations all hidden behind + * callbacks to isolate the WM8904 driver from differences in GPIO + * interrupt handling by varying boards and MCUs. If possible, + * interrupts should be configured on both rising and falling edges + * so that contact and loss-of-contact events can be detected. + * + * attach - Attach the WM8904 interrupt handler to the GPIO interrupt + * enable - Enable or disable the GPIO interrupt + * clear - Acknowledge/clear any pending GPIO interrupt + */ + + int (*attach)(FAR const struct wm8904_lower_s *lower, wm8904_handler_t isr, + FAR void *arg); + void (*enable)(FAR const struct wm8904_lower_s *lower, bool enable); + void (*clear)(FAR const struct wm8904_lower_s *lower); +}; + +/**************************************************************************** + * Public Data + ****************************************************************************/ + +#ifdef __cplusplus +#define EXTERN extern "C" +extern "C" +{ +#else +#define EXTERN extern +#endif + +/**************************************************************************** + * Public Function Prototypes + ****************************************************************************/ + +/**************************************************************************** + * Name: wm8904_register + * + * Description: + * Initialize the WM8904 device. + * + * Input Parameters: + * i2c - An I2C driver instance + * i2s - An I2S driver instance + * lower - Persistent board configuration data + * minor - The input device minor number + * session - Returned if multi-sessions are supported + * + * Returned Value: + * Zero is returned on success. Otherwise, a negated errno value is + * returned to indicate the nature of the failure. + * + ****************************************************************************/ + +struct i2c_dev_s; /* Forward reference. Defined in include/nuttx/i2c.h */ +struct i2s_dev_s; /* Forward reference. Defined in include/nuttx/audio/i2s.h */ +struct audio_lowerhalf_s; /* Forward reference. Defined in nuttx/audio/audio.h */ + +FAR struct audio_lowerhalf_s * + wm8904_initialize(FAR struct i2c_dev_s *i2c, FAR struct i2s_dev_s *i2s, + FAR const struct wm8904_lower_s *lower, unsigned int devno); + +#undef EXTERN +#ifdef __cplusplus +} +#endif + +#endif /* CONFIG_AUDIO_WM8904 */ +#endif /* __INCLUDE_NUTTX_AUDIO_WM8904_H */ diff --git a/include/nuttx/input/mxt.h b/include/nuttx/input/mxt.h index 2b4f1359f1..7de2f3a045 100644 --- a/include/nuttx/input/mxt.h +++ b/include/nuttx/input/mxt.h @@ -106,7 +106,6 @@ #define MXT_ENABLE(s) ((s)->enable(s,true)) #define MXT_DISABLE(s) ((s)->enable(s,false)) #define MXT_CLEAR(s) ((s)->clear(s)) -#define MXT_PENDOWN(s) ((s)->pendown(s)) /**************************************************************************** * Public Types