blob: da01fb00df1f7cd520850136c8be27097cc3f7bb [file] [log] [blame]
/*
* Copyright 2024 NXP
*
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef ZEPHYR_INCLUDE_CODEC_WM8904_H_
#define ZEPHYR_INCLUDE_CODEC_WM8904_H_
/*******************************************************************************
* Definitions
******************************************************************************/
#define WM8904_REG_RESET (0x00)
#define WM8904_REG_ANALOG_ADC_0 (0x0A)
#define WM8904_REG_POWER_MGMT_0 (0x0C)
#define WM8904_REG_POWER_MGMT_2 (0x0E)
#define WM8904_REG_POWER_MGMT_3 (0x0F)
#define WM8904_REG_POWER_MGMT_6 (0x12)
#define WM8904_REG_CLK_RATES_0 (0x14)
#define WM8904_REG_CLK_RATES_1 (0x15)
#define WM8904_REG_CLK_RATES_2 (0x16)
#define WM8904_REG_AUDIO_IF_0 (0x18)
#define WM8904_REG_AUDIO_IF_1 (0x19)
#define WM8904_REG_AUDIO_IF_2 (0x1A)
#define WM8904_REG_AUDIO_IF_3 (0x1B)
#define WM8904_REG_DAC_DIG_1 (0x21)
#define WM8904_REG_DAC_DIG_0 (0x27)
#define WM8904_REG_ANALOG_LEFT_IN_0 (0x2C)
#define WM8904_REG_ANALOG_RIGHT_IN_0 (0x2D)
#define WM8904_REG_ANALOG_LEFT_IN_1 (0x2E)
#define WM8904_REG_ANALOG_RIGHT_IN_1 (0x2F)
#define WM8904_REG_ANALOG_OUT1_LEFT (0x39)
#define WM8904_REG_ANALOG_OUT1_RIGHT (0x3A)
#define WM8904_REG_ANALOG_OUT12_ZC (0x3D)
#define WM8904_REG_DC_SERVO_0 (0x43)
#define WM8904_REG_ANALOG_HP_0 (0x5A)
#define WM8904_REG_CHRG_PUMP_0 (0x62)
#define WM8904_REG_CLS_W_0 (0x68)
#define WM8904_REG_WRT_SEQUENCER_0 (0x6C)
#define WM8904_REG_WRT_SEQUENCER_3 (0x6F)
#define WM8904_REG_WRT_SEQUENCER_4 (0x70)
#define WM8904_REG_DAC_DIGITAL_VOLUME_LEFT (0x1E)
#define WM8904_REG_DAC_DIGITAL_VOLUME_RIGHT (0x1F)
#define WM8904_REG_ADC_DIGITAL_VOLUME_LEFT (0x24)
#define WM8904_REG_ADC_DIGITAL_VOLUME_RIGHT (0x25)
#define WM8904_REG_ANALOG_OUT2_LEFT (0x3B)
#define WM8904_REG_ANALOG_OUT2_RIGHT (0x3C)
#define WM8904_REG_GPIO_CONTROL_4 (0x7C)
/* FLL control register */
#define WM8904_REG_FLL_CONTROL_1 (0x74)
#define WM8904_REG_FLL_CONTROL_2 (0x75)
#define WM8904_REG_FLL_CONTROL_3 (0x76)
#define WM8904_REG_FLL_CONTROL_4 (0x77)
#define WM8904_REG_FLL_CONTROL_5 (0x78)
/* GPIO control register */
#define WM8904_REG_GPIO_CONTROL_1 (0x79)
#define WM8904_REG_GPIO_CONTROL_2 (0x7A)
#define WM8904_REG_GPIO_CONTROL_3 (0x7B)
#define WM8904_REG_GPIO_CONTROL_4 (0x7C)
/* fll nco */
#define WM8904_REG_FLL_NCO_TEST_0 (0xF7U)
#define WM8904_REG_FLL_NCO_TEST_1 (0xF8U)
#define WM8904_OUTPUT_VOLUME_MIN (0b000000)
#define WM8904_OUTPUT_VOLUME_MAX (0b111111)
#define WM8904_OUTPUT_VOLUME_DEFAULT (0b101101)
#define WM8904_INPUT_VOLUME_MIN (0b00000)
#define WM8904_INPUT_VOLUME_MAX (0b11111)
#define WM8904_INPUT_VOLUME_DEFAULT (0b00101)
/**
* WM8904_ANALOG_OUT1_LEFT, WM8904_ANALOG_OUT1_RIGHT (headphone outs),
* WM8904_ANALOG_OUT2_LEFT, WM8904_ANALOG_OUT2_RIGHT (line outs):
* [8] - MUTE: Output mute
* [7] - VU: Volume update, works for entire channel pair
* [6] - ZC: Zero-crossing enable
* [5:0] - VOL: 6-bit volume value
*/
#define WM8904_REGVAL_OUT_VOL(mute, vu, zc, vol) \
(((mute & 0b1) << 8) | (vu & 0b1) << 7 | (zc & 0b1) << 6 | (vol & 0b000111111))
#define WM8904_REGMASK_OUT_MUTE 0b100000000
#define WM8904_REGMASK_OUT_VU 0b010000000
#define WM8904_REGMASK_OUT_ZC 0b001000000
#define WM8904_REGMASK_OUT_VOL 0b000111111
/**
* WM8904_ANALOG_LEFT_IN_0, WM8904_ANALOG_RIGHT_IN_0:
* [7] - MUTE: Input mute
* [4:0] - VOL: 5 bit volume value
*/
#define WM8904_REGVAL_IN_VOL(mute, vol) \
((mute & 0b1) << 7 | (vol & 0b00011111))
#define WM8904_REGMASK_IN_MUTE 0b10000000
#define WM8904_REGMASK_IN_VOLUME 0b00011111
/**
* WM8904_ANALOG_LEFT_IN_1, WM8904_ANALOG_RIGHT_IN_1:
* [6] - INx_CM_ENA: Common-mode rejection enable (N/A for single-mode)
* [5:4] - x_IP_SEL_N: Inverting input selection
* [3:2] - x_IP_SEL_P: Non-inverting input selection
* [1:0] - x_MODE: Input mode
*/
#define WM8904_REGVAL_INSEL(cm, nin, pin, mode) \
(((cm) & 0b1) << 6) | (((nin) & 0b11) << 4)
#define WM8904_REGMASK_INSEL_CMENA 0b01000000
#define WM8904_REGMASK_INSEL_IP_SEL_N 0b00110000
#define WM8904_REGMASK_INSEL_IP_SEL_P 0b00001100
#define WM8904_REGMASK_INSEL_MODE 0b00000011
/*!@brief WM8904 maximum volume */
#define WM8904_MAP_HEADPHONE_LINEOUT_MAX_VOLUME 0x3FU
#define WM8904_DAC_MAX_VOLUME 0xC0U
/*! @brief The audio data transfer protocol. */
typedef enum _wm8904_protocol {
kWM8904_ProtocolI2S = 0x2, /*!< I2S type */
kWM8904_ProtocolLeftJustified = 0x1, /*!< Left justified mode */
kWM8904_ProtocolRightJustified = 0x0, /*!< Right justified mode */
kWM8904_ProtocolPCMA = 0x3, /*!< PCM A mode */
kWM8904_ProtocolPCMB = 0x3 | (1 << 4), /*!< PCM B mode */
} wm8904_protocol_t;
/*! @brief The SYSCLK / fs ratio. */
typedef enum _wm8904_fs_ratio {
kWM8904_FsRatio64X = 0x0, /*!< SYSCLK is 64 * sample rate * frame width */
kWM8904_FsRatio128X = 0x1, /*!< SYSCLK is 128 * sample rate * frame width */
kWM8904_FsRatio192X = 0x2, /*!< SYSCLK is 192 * sample rate * frame width */
kWM8904_FsRatio256X = 0x3, /*!< SYSCLK is 256 * sample rate * frame width */
kWM8904_FsRatio384X = 0x4, /*!< SYSCLK is 384 * sample rate * frame width */
kWM8904_FsRatio512X = 0x5, /*!< SYSCLK is 512 * sample rate * frame width */
kWM8904_FsRatio768X = 0x6, /*!< SYSCLK is 768 * sample rate * frame width */
kWM8904_FsRatio1024X = 0x7, /*!< SYSCLK is 1024 * sample rate * frame width */
kWM8904_FsRatio1408X = 0x8, /*!< SYSCLK is 1408 * sample rate * frame width */
kWM8904_FsRatio1536X = 0x9 /*!< SYSCLK is 1536 * sample rate * frame width */
} wm8904_fs_ratio_t;
/*! @brief Sample rate. */
typedef enum _wm8904_sample_rate {
kWM8904_SampleRate8kHz = 0x0, /*!< 8 kHz */
kWM8904_SampleRate12kHz = 0x1, /*!< 12kHz */
kWM8904_SampleRate16kHz = 0x2, /*!< 16kHz */
kWM8904_SampleRate24kHz = 0x3, /*!< 24kHz */
kWM8904_SampleRate32kHz = 0x4, /*!< 32kHz */
kWM8904_SampleRate48kHz = 0x5, /*!< 48kHz */
kWM8904_SampleRate11025Hz = 0x6, /*!< 11.025kHz */
kWM8904_SampleRate22050Hz = 0x7, /*!< 22.05kHz */
kWM8904_SampleRate44100Hz = 0x8 /*!< 44.1kHz */
} wm8904_sample_rate_t;
#endif /* ZEPHYR_INCLUDE_CODEC_WM8904_H_ */