#ifndef __ESCODEC_COMMON_H__
#define __ESCODEC_COMMON_H__

typedef enum BitsLength {
  BIT_LENGTH_MIN = -1,
  BIT_LENGTH_16BITS = 0x03,
  BIT_LENGTH_18BITS = 0x02,
  BIT_LENGTH_20BITS = 0x01,
  BIT_LENGTH_24BITS = 0x00,
  BIT_LENGTH_32BITS = 0x04,
  BIT_LENGTH_MAX,
} BitsLength;

typedef enum {
  SAMPLE_RATE_MIN = -1,
  SAMPLE_RATE_16K,
  SAMPLE_RATE_32K,
  SAMPLE_RATE_44_1K,
  SAMPLE_RATE_MAX,
} SampleRate;

typedef enum {
  MclkDiv_MIN = -1,
  MclkDiv_1 = 1,
  MclkDiv_2 = 2,
  MclkDiv_3 = 3,
  MclkDiv_4 = 4,
  MclkDiv_6 = 5,
  MclkDiv_8 = 6,
  MclkDiv_9 = 7,
  MclkDiv_11 = 8,
  MclkDiv_12 = 9,
  MclkDiv_16 = 10,
  MclkDiv_18 = 11,
  MclkDiv_22 = 12,
  MclkDiv_24 = 13,
  MclkDiv_33 = 14,
  MclkDiv_36 = 15,
  MclkDiv_44 = 16,
  MclkDiv_48 = 17,
  MclkDiv_66 = 18,
  MclkDiv_72 = 19,
  MclkDiv_5 = 20,
  MclkDiv_10 = 21,
  MclkDiv_15 = 22,
  MclkDiv_17 = 23,
  MclkDiv_20 = 24,
  MclkDiv_25 = 25,
  MclkDiv_30 = 26,
  MclkDiv_32 = 27,
  MclkDiv_34 = 28,
  MclkDiv_7 = 29,
  MclkDiv_13 = 30,
  MclkDiv_14 = 31,
  MclkDiv_MAX,
} SclkDiv;

typedef enum {
  LclkDiv_MIN = -1,
  LclkDiv_128 = 0,
  LclkDiv_192 = 1,
  LclkDiv_256 = 2,
  LclkDiv_384 = 3,
  LclkDiv_512 = 4,
  LclkDiv_576 = 5,
  LclkDiv_768 = 6,
  LclkDiv_1024 = 7,
  LclkDiv_1152 = 8,
  LclkDiv_1408 = 9,
  LclkDiv_1536 = 10,
  LclkDiv_2112 = 11,
  LclkDiv_2304 = 12,

  LclkDiv_125 = 16,
  LclkDiv_136 = 17,
  LclkDiv_250 = 18,
  LclkDiv_272 = 19,
  LclkDiv_375 = 20,
  LclkDiv_500 = 21,
  LclkDiv_544 = 22,
  LclkDiv_750 = 23,
  LclkDiv_1000 = 24,
  LclkDiv_1088 = 25,
  LclkDiv_1496 = 26,
  LclkDiv_1500 = 27,
  LclkDiv_MAX,
} LclkDiv;

typedef enum {
  ADC_INPUT_MIN = -1,
  ADC_INPUT_LINPUT1_RINPUT1 = 0x00,
  ADC_INPUT_MIC1 = 0x05,
  ADC_INPUT_MIC2 = 0x06,
  ADC_INPUT_LINPUT2_RINPUT2 = 0x50,
  ADC_INPUT_DIFFERENCE = 0xf0,
  ADC_INPUT_MAX,
} AdcInput;

typedef enum {
  DAC_OUTPUT_MIN = -1,
  DAC_OUTPUT_LOUT1 = 0x04,
  DAC_OUTPUT_LOUT2 = 0x08,
  DAC_OUTPUT_SPK = 0x09,
  DAC_OUTPUT_ROUT1 = 0x10,
  DAC_OUTPUT_ROUT2 = 0x20,
  DAC_OUTPUT_ALL = 0x3c,
  DAC_OUTPUT_MAX,
} DacOutput;

typedef enum {
  D2SE_PGA_GAIN_MIN = -1,
  D2SE_PGA_GAIN_DIS = 0,
  D2SE_PGA_GAIN_EN = 1,
  D2SE_PGA_GAIN_MAX = 2,
} D2SEPGA;

typedef enum {
  MIC_GAIN_MIN = -1,
  MIC_GAIN_0DB = 0,
  MIC_GAIN_3DB = 3,
  MIC_GAIN_6DB = 6,
  MIC_GAIN_9DB = 9,
  MIC_GAIN_12DB = 12,
  MIC_GAIN_15DB = 15,
  MIC_GAIN_18DB = 18,
  MIC_GAIN_21DB = 21,
  MIC_GAIN_24DB = 24,
#if defined CONFIG_CODEC_CHIP_IS_ES8311
  MIC_GAIN_30DB = 30,
  MIC_GAIN_36DB = 36,
  MIC_GAIN_42DB = 42,
#endif
  MIC_GAIN_MAX,
} MicGain;

typedef enum {
  ES_MODULE_MIN = -1,
  ES_MODULE_ADC = 0x01,
  ES_MODULE_DAC = 0x02,
  ES_MODULE_ADC_DAC = 0x03,
  ES_MODULE_LINE = 0x04,
  ES_MODULE_MAX
} ESCodecModule;

typedef enum {
  ES_MODE_MIN = -1,
  ES_MODE_SLAVE = 0x00,
  ES_MODE_MASTER = 0x01,
  ES_MODE_MAX,
} ESCodecMode;

typedef enum {
  ES_ = -1,
  ES_I2S_NORMAL = 0,
  ES_I2S_LEFT = 1,
  ES_I2S_RIGHT = 2,
  ES_I2S_DSP = 3,
  ES_I2S_MAX
} ESCodecI2SFmt;

typedef struct {
  SclkDiv sclkDiv;
  LclkDiv lclkDiv;
} ESCodecI2sClock;

#endif  //__ESCODEC_COMMON_H__