1 /*
2  * Copyright (c) 2015-2016, Freescale Semiconductor, Inc.
3  * Copyright 2016-2020 NXP
4  * All rights reserved.
5  *
6  * SPDX-License-Identifier: BSD-3-Clause
7  */
8 
9 #include "fsl_dialog7212.h"
10 
11 /*******************************************************************************
12  * Definitations
13  ******************************************************************************/
14 /*! @brief da7212 reigster structure */
15 typedef struct _da7212_register_value
16 {
17     uint8_t addr;
18     uint8_t value;
19 } da7212_register_value_t;
20 
21 /*******************************************************************************
22  * Prototypes
23  ******************************************************************************/
24 /*!
25  * @brief DA7212 modify register.
26  *
27  * @param handle DA7212 handle structure.
28  * @param reg register address.
29  * @param mask register bits mask.
30  * @param value value to write.
31  * @return kStatus_Success, else failed.
32  */
33 static status_t DA7212_ModifyRegister(da7212_handle_t *handle, uint8_t reg, uint8_t mask, uint8_t value);
34 /*******************************************************************************
35  * Variables
36  ******************************************************************************/
37 static const da7212_register_value_t kInputRegisterSequence[kDA7212_Input_MAX][17] = {
38     /* DA7212_Input_AUX */
39     {
40         {DIALOG7212_MIXIN_L_SELECT, 0x01},
41         {DIALOG7212_MIXIN_R_SELECT, 0x01},
42         {DIALOG7212_CP_CTRL, 0xFD},
43         {DIALOG7212_AUX_L_CTRL, 0xB4},
44         {DIALOG7212_AUX_R_CTRL, 0xB0},
45         {DIALOG7212_MIC_1_CTRL, 0x04},
46         {DIALOG7212_MIC_2_CTRL, 0x04},
47         {DIALOG7212_MIXIN_L_CTRL, 0x88},
48         {DIALOG7212_MIXIN_R_CTRL, 0x88},
49         {DIALOG7212_ADC_L_CTRL, 0xA0},
50         {DIALOG7212_GAIN_RAMP_CTRL, 0x02},
51         {DIALOG7212_PC_COUNT, 0x02},
52         {DIALOG7212_CP_DELAY, 0x95},
53         {0, 0},
54         {0, 0},
55         {0, 0},
56         {0, 0},
57     },
58     /* DA7212_Input_MIC1_Dig */
59     {
60         {DIALOG7212_MICBIAS_CTRL, 0xA9},
61         {DIALOG7212_CP_CTRL, 0xF1},
62         {DIALOG7212_MIXIN_L_SELECT, 0x80},
63         {DIALOG7212_MIXIN_R_SELECT, 0x80},
64         {DIALOG7212_SYSTEM_MODES_INPUT, 0xFE},
65         {DIALOG7212_SYSTEM_MODES_OUTPUT, 0xF7},
66         {DIALOG7212_MIC_CONFIG, 0x07},
67         {DIALOG7212_MIC_2_GAIN, 0x04},
68         {DIALOG7212_MIC_2_CTRL, 0x84},
69         {DIALOG7212_MIC_1_GAIN, 0x01},
70         {DIALOG7212_MIC_1_CTRL, 0x80},
71         {DIALOG7212_ADC_FILTERS1, 0x08},
72         {0, 0},
73         {0, 0},
74         {0, 0},
75         {0, 0},
76         {0, 0},
77     },
78     /* DA7212_Input_MIC1_An */
79     {
80         {DIALOG7212_MIXIN_L_SELECT, 0x02},
81         {DIALOG7212_MIXIN_R_SELECT, 0x04},
82         {DIALOG7212_MIC_1_GAIN, 0x03},
83         {DIALOG7212_CP_CTRL, 0xFD},
84         {DIALOG7212_MIXOUT_L_SELECT, 0x08},
85         {DIALOG7212_MIXOUT_R_SELECT, 0x08},
86         {DIALOG7212_AUX_R_CTRL, 0x40},
87         {DIALOG7212_MICBIAS_CTRL, 0x19},
88         {DIALOG7212_MIC_1_CTRL, 0x84},
89         {DIALOG7212_MIC_2_CTRL, 0x04},
90         {DIALOG7212_MIXIN_L_CTRL, 0x88},
91         {DIALOG7212_MIXIN_R_CTRL, 0x88},
92         {DIALOG7212_ADC_L_CTRL, 0xA0},
93         {DIALOG7212_GAIN_RAMP_CTRL, 0x02},
94         {DIALOG7212_PC_COUNT, 0x02},
95         {DIALOG7212_CP_DELAY, 0x95},
96         {0, 0},
97     },
98     /* DA7212_Input_MIC2 */
99     {
100         {DIALOG7212_MIXIN_L_SELECT, 0x04},
101         {DIALOG7212_MIXIN_R_SELECT, 0x02},
102         {DIALOG7212_MIC_2_GAIN, 0x04},
103         {DIALOG7212_CP_CTRL, 0xFD},
104         {DIALOG7212_AUX_R_CTRL, 0x40},
105         {DIALOG7212_MICBIAS_CTRL, 0x91},
106         {DIALOG7212_MIC_1_CTRL, 0x08},
107         {DIALOG7212_MIC_2_CTRL, 0x84},
108         {DIALOG7212_MIXIN_L_CTRL, 0x88},
109         {DIALOG7212_MIXIN_R_CTRL, 0x88},
110         {DIALOG7212_ADC_L_CTRL, 0xA0},
111         {DIALOG7212_GAIN_RAMP_CTRL, 0x02},
112         {DIALOG7212_PC_COUNT, 0x02},
113         {DIALOG7212_CP_DELAY, 0x95},
114         {0, 0},
115         {0, 0},
116         {0, 0},
117     }};
118 
119 static const da7212_register_value_t kOutputRegisterSequence[kDA7212_Output_MAX][4] = {
120     /* DA7212_Output_HP */
121     {
122         {DIALOG7212_CP_CTRL, 0xF9},
123         {DIALOG7212_LINE_CTRL, 0},
124         {DIALOG7212_HP_L_CTRL, (DIALOG7212_HP_L_CTRL_AMP_EN_MASK | DIALOG7212_HP_L_CTRL_AMP_RAMP_EN_MASK |
125                                 DIALOG7212_HP_L_CTRL_AMP_ZC_EN_MASK | DIALOG7212_HP_L_CTRL_AMP_OE_MASK)},
126         {DIALOG7212_HP_R_CTRL, (DIALOG7212_HP_R_CTRL_AMP_EN_MASK | DIALOG7212_HP_R_CTRL_AMP_RAMP_EN_MASK |
127                                 DIALOG7212_HP_R_CTRL_AMP_ZC_EN_MASK | DIALOG7212_HP_R_CTRL_AMP_OE_MASK)},
128     },
129     /* DA7212_Output_SP */
130     {
131         {DIALOG7212_CP_CTRL, 0x3D},
132         {DIALOG7212_HP_L_CTRL, 0x40},
133         {DIALOG7212_HP_R_CTRL, 0x40},
134         {DIALOG7212_LINE_CTRL, 0xA8},
135     }};
136 
137 static const da7212_register_value_t kInitRegisterSequence[DA7212_INIT_SIZE] = {
138     {
139         DIALOG7212_CIF_CTRL,
140         0x80,
141     },
142     {
143         DIALOG7212_DIG_ROUTING_DAI,
144         0x10,
145     },
146     {
147         DIALOG7212_SR,
148         DIALOG7212_SR_16KHZ,
149     },
150     {
151         DIALOG7212_REFERENCES,
152         DIALOG7212_REFERENCES_BIAS_EN_MASK,
153     },
154     {
155         DIALOG7212_PLL_FRAC_TOP,
156         CLEAR_REGISTER,
157     },
158     {
159         DIALOG7212_PLL_FRAC_BOT,
160         CLEAR_REGISTER,
161     },
162     {
163         DIALOG7212_PLL_INTEGER,
164         0x20,
165     },
166     {
167         DIALOG7212_PLL_CTRL,
168         0U,
169     },
170     {
171         DIALOG7212_DAI_CLK_MODE,
172         (DIALOG7212_DAI_BCLKS_PER_WCLK_BCLK64),
173     },
174     {
175         DIALOG7212_DAI_CTRL,
176         (DIALOG7212_DAI_EN_MASK | DIALOG7212_DAI_OE_MASK | DIALOG7212_DAI_WORD_LENGTH_16B |
177          DIALOG7212_DAI_FORMAT_I2S_MODE),
178     },
179     {
180         DIALOG7212_DIG_ROUTING_DAC,
181         (DIALOG7212_DIG_ROUTING_DAC_R_RSC_DAC_R | DIALOG7212_DIG_ROUTING_DAC_L_RSC_DAC_L),
182     },
183     {
184         DIALOG7212_CP_CTRL,
185         (DIALOG7212_CP_CTRL_EN_MASK | DIALOG7212_CP_CTRL_SMALL_SWIT_CH_FREQ_EN_MASK |
186          DIALOG7212_CP_CTRL_MCHANGE_OUTPUT | DIALOG7212_CP_CTRL_MOD_CPVDD_1 |
187          DIALOG7212_CP_CTRL_ANALOG_VLL_LV_BOOSTS_CP),
188     },
189     {
190         DIALOG7212_MIXOUT_L_SELECT,
191         (DIALOG7212_MIXOUT_L_SELECT_DAC_L_MASK),
192     },
193     {
194         DIALOG7212_MIXOUT_R_SELECT,
195         (DIALOG7212_MIXOUT_R_SELECT_DAC_R_MASK),
196     },
197     {
198         DIALOG7212_DAC_L_CTRL,
199         (DIALOG7212_DAC_L_CTRL_ADC_EN_MASK | DIALOG7212_DAC_L_CTRL_ADC_RAMP_EN_MASK),
200     },
201     {
202         DIALOG7212_DAC_R_CTRL,
203         (DIALOG7212_DAC_R_CTRL_ADC_EN_MASK | DIALOG7212_DAC_R_CTRL_ADC_RAMP_EN_MASK),
204     },
205     {
206         DIALOG7212_HP_L_CTRL,
207         (DIALOG7212_HP_L_CTRL_AMP_EN_MASK |
208          DIALOG7212_HP_L_CTRL_AMP_ZC_EN_MASK | DIALOG7212_HP_L_CTRL_AMP_OE_MASK),
209     },
210     {
211         DIALOG7212_HP_R_CTRL,
212         (DIALOG7212_HP_R_CTRL_AMP_EN_MASK |
213          DIALOG7212_HP_R_CTRL_AMP_ZC_EN_MASK | DIALOG7212_HP_R_CTRL_AMP_OE_MASK),
214     },
215     {
216         DIALOG7212_MIXOUT_L_CTRL,
217         (DIALOG7212_MIXOUT_L_CTRL_AMP_EN_MASK | DIALOG7212_MIXOUT_L_CTRL_AMP_SOFT_MIX_EN_MASK |
218          DIALOG7212_MIXOUT_L_CTRL_AMP_MIX_EN_MASK),
219     },
220     {
221         DIALOG7212_MIXOUT_R_CTRL,
222         (DIALOG7212_MIXOUT_R_CTRL_AMP_EN_MASK | DIALOG7212_MIXOUT_R_CTRL_AMP_SOFT_MIX_EN_MASK |
223          DIALOG7212_MIXOUT_R_CTRL_AMP_MIX_EN_MASK),
224     },
225     {
226         DIALOG7212_CP_VOL_THRESHOLD1,
227         DIALOG7212_CP_VOL_THRESHOLD1_VDD2(0x32),
228     },
229     {
230         DIALOG7212_SYSTEM_STATUS,
231         CLEAR_REGISTER,
232     },
233     {
234         DIALOG7212_DAC_L_GAIN,
235         (uint8_t)kDA7212_DACGainM6DB,
236     },
237     {
238         DIALOG7212_DAC_R_GAIN,
239         (uint8_t)kDA7212_DACGainM6DB,
240     },
241     {
242         DIALOG7212_MIXIN_L_SELECT,
243         DIALOG7212_MIXIN_L_SELECT_AUX_L_SEL_MASK,
244     },
245     {
246         DIALOG7212_MIXIN_R_SELECT,
247         DIALOG7212_MIXIN_R_SELECT_AUX_R_SEL_MASK,
248     },
249     {
250         DIALOG7212_MIXIN_L_GAIN,
251         DIALOG7212_MIXIN_L_AMP_GAIN(0x03),
252     },
253     {
254         DIALOG7212_MIXIN_R_GAIN,
255         DIALOG7212_MIXIN_R_AMP_GAIN(0x03),
256     },
257     {
258         DIALOG7212_ADC_L_GAIN,
259         DIALOG7212_ADC_L_DIGITAL_GAIN(0x6F),
260     },
261     {
262         DIALOG7212_ADC_R_GAIN,
263         DIALOG7212_ADC_R_DIGITAL_GAIN(0x6F),
264     },
265     {
266         DIALOG7212_AUX_L_CTRL,
267         DIALOG7212_AUX_L_CTRL_AMP_EN_MASK | DIALOG7212_AUX_L_CTRL_AMP_RAMP_EN_MASK |
268             DIALOG7212_AUX_L_CTRL_AMP_ZC_EN_MASK,
269     },
270     {
271         DIALOG7212_AUX_R_CTRL,
272         DIALOG7212_AUX_R_CTRL_AMP_EN_MASK | DIALOG7212_AUX_R_CTRL_AMP_RAMP_EN_MASK |
273             DIALOG7212_AUX_R_CTRL_AMP_ZC_EN_MASK,
274     },
275     {
276         DIALOG7212_MIXIN_L_CTRL,
277         DIALOG7212_MIXIN_L_CTRL_AMP_EN_MASK | DIALOG7212_MIXIN_L_CTRL_AMP_MIX_EN_MASK,
278     },
279     {
280         DIALOG7212_MIXIN_R_CTRL,
281         DIALOG7212_MIXIN_R_CTRL_AMP_EN_MASK | DIALOG7212_MIXIN_R_CTRL_AMP_MIX_EN_MASK,
282     },
283     {
284         DIALOG7212_ADC_L_CTRL,
285         DIALOG7212_ADC_L_CTRL_ADC_EN_MASK | DIALOG7212_ADC_L_CTRL_ADC_RAMP_EN_MASK,
286     },
287     {
288         DIALOG7212_ADC_R_CTRL,
289         DIALOG7212_ADC_R_CTRL_ADC_EN_MASK | DIALOG7212_ADC_R_CTRL_ADC_RAMP_EN_MASK,
290     },
291 };
292 
293 /*******************************************************************************
294  * Code
295  ******************************************************************************/
DA7212_WriteRegister(da7212_handle_t * handle,uint8_t u8Register,uint8_t u8RegisterData)296 status_t DA7212_WriteRegister(da7212_handle_t *handle, uint8_t u8Register, uint8_t u8RegisterData)
297 {
298     assert(handle->config);
299     assert(handle->config->slaveAddress != 0U);
300 
301     uint8_t writeValue = u8RegisterData;
302 
303     return CODEC_I2C_Send(handle->i2cHandle, handle->config->slaveAddress, u8Register, 1U, (uint8_t *)&writeValue, 1U);
304 }
305 
DA7212_ReadRegister(da7212_handle_t * handle,uint8_t u8Register,uint8_t * pu8RegisterData)306 status_t DA7212_ReadRegister(da7212_handle_t *handle, uint8_t u8Register, uint8_t *pu8RegisterData)
307 {
308     assert(handle->config);
309     assert(handle->config->slaveAddress != 0U);
310 
311     return CODEC_I2C_Receive(handle->i2cHandle, handle->config->slaveAddress, u8Register, 1U,
312                              (uint8_t *)pu8RegisterData, 1U);
313 }
314 
DA7212_ModifyRegister(da7212_handle_t * handle,uint8_t reg,uint8_t mask,uint8_t value)315 static status_t DA7212_ModifyRegister(da7212_handle_t *handle, uint8_t reg, uint8_t mask, uint8_t value)
316 {
317     status_t result;
318     uint8_t regValue = 0;
319 
320     result = DA7212_ReadRegister(handle, reg, &regValue);
321     if (result != kStatus_Success)
322     {
323         return result;
324     }
325 
326     regValue &= (uint8_t)~mask;
327     regValue |= value;
328 
329     return DA7212_WriteRegister(handle, reg, regValue);
330 }
331 
DA7212_Init(da7212_handle_t * handle,da7212_config_t * codecConfig)332 status_t DA7212_Init(da7212_handle_t *handle, da7212_config_t *codecConfig)
333 {
334     assert(codecConfig != NULL);
335     assert(handle != NULL);
336 
337     uint32_t i              = 0;
338     status_t error          = kStatus_Success;
339     da7212_config_t *config = codecConfig;
340     uint32_t sysClock       = config->format.mclk_HZ;
341     handle->config          = config;
342 
343     /* i2c bus initialization */
344     if (CODEC_I2C_Init(handle->i2cHandle, config->i2cConfig.codecI2CInstance, DA7212_I2C_BAUDRATE,
345                        config->i2cConfig.codecI2CSourceClock) != (status_t)kStatus_HAL_I2cSuccess)
346     {
347         return kStatus_Fail;
348     }
349 
350     /* If no config structure, use default settings */
351     for (i = 0; i < DA7212_INIT_SIZE; i++)
352     {
353         if ((DA7212_WriteRegister(handle, kInitRegisterSequence[i].addr, kInitRegisterSequence[i].value)) !=
354             kStatus_Success)
355         {
356             return kStatus_Fail;
357         }
358     }
359 
360     if (config->isMaster)
361     {
362         /* clock configurations */
363         if ((DA7212_WriteRegister(handle, DIALOG7212_DAI_CLK_MODE,
364                                   (config->format.isBclkInvert ? 1U << 2U : 0U) | (1U << 7U))) != kStatus_Success)
365         {
366             return kStatus_Fail;
367         }
368 
369         if (DA7212_SetMasterModeBits(handle, config->format.bitWidth) != kStatus_Success)
370         {
371             return kStatus_Fail;
372         }
373     }
374 
375     /* Set DA7212 functionality */
376     if (config->dacSource == kDA7212_DACSourceADC)
377     {
378         if ((DA7212_WriteRegister(handle, DIALOG7212_DIG_ROUTING_DAC, 0x10)) != kStatus_Success)
379         {
380             return kStatus_Fail;
381         }
382     }
383     else
384     {
385         if ((DA7212_WriteRegister(handle, DIALOG7212_DIG_ROUTING_DAC, 0x32)) != kStatus_Success)
386         {
387             return kStatus_Fail;
388         }
389     }
390 
391     /* Set the audio protocol */
392     if ((DA7212_WriteRegister(handle, DIALOG7212_DAI_CTRL,
393                               (uint8_t)(DIALOG7212_DAI_EN_MASK | (uint8_t)(config->protocol)))) != kStatus_Success)
394     {
395         return kStatus_Fail;
396     }
397 
398     if (codecConfig->sysClkSource == kDA7212_SysClkSourcePLL)
399     {
400         if (DA7212_SetPLLConfig(handle, codecConfig->pll) != kStatus_Success)
401         {
402             return kStatus_Fail;
403         }
404 
405         sysClock = (uint32_t)(codecConfig->pll->outputClock_HZ);
406     }
407 
408     DA7212_ChangeInput(handle, codecConfig->inputSource);
409 
410     error = DA7212_ConfigAudioFormat(handle, sysClock, config->format.sampleRate, config->format.bitWidth);
411 
412     return error;
413 }
414 
DA7212_SetPLLConfig(da7212_handle_t * handle,da7212_pll_config_t * config)415 status_t DA7212_SetPLLConfig(da7212_handle_t *handle, da7212_pll_config_t *config)
416 {
417     assert(config != NULL);
418     status_t retVal = kStatus_Success;
419 
420     uint8_t indiv = 0, inputDiv = 0, regVal = 0;
421     uint64_t pllValue = 0;
422     uint32_t pllFractional;
423     uint8_t pllInteger;
424     uint8_t pllFracTop;
425     uint8_t pllFracBottom;
426     uint8_t pllEnMask = DIALOG7212_PLL_EN_MASK;
427 
428     if (config->refClock_HZ == 32768U)
429     {
430         pllEnMask |= DIALOG7212_PLL_SRM_EN_MASK | DIALOG7212_PLL_32K_MODE_MASK;
431         indiv    = DIALOG7212_PLL_INDIV_2_10MHZ;
432         inputDiv = 1;
433     }
434     /* Compute the PLL_INDIV and DIV value for sysClock */
435     else if ((config->refClock_HZ > 2000000U) && (config->refClock_HZ <= 10000000U))
436     {
437         indiv    = DIALOG7212_PLL_INDIV_2_10MHZ;
438         inputDiv = 2;
439     }
440     else if ((config->refClock_HZ > 10000000U) && (config->refClock_HZ <= 20000000U))
441     {
442         indiv    = DIALOG7212_PLL_INDIV_10_20MHZ;
443         inputDiv = 4;
444     }
445     else if ((config->refClock_HZ > 20000000U) && (config->refClock_HZ <= 40000000U))
446     {
447         indiv    = DIALOG7212_PLL_INDIV_20_40MHZ;
448         inputDiv = 8;
449     }
450     else
451     {
452         indiv    = DIALOG7212_PLL_INDIV_40_80MHZ;
453         inputDiv = 16;
454     }
455 
456     /* PLL feedback divider is a Q13 value */
457     pllValue =
458         (uint64_t)(((uint64_t)((((uint64_t)config->outputClock_HZ * 8U) * inputDiv) << 13U)) / (config->refClock_HZ));
459 
460     /* extract integer and fractional */
461     pllInteger    = (uint8_t)(pllValue >> 13U);
462     pllFractional = (uint32_t)(pllValue - ((uint64_t)pllInteger << 13U));
463     pllFracTop    = (uint8_t)(pllFractional >> 8U);
464     pllFracBottom = (uint8_t)(pllFractional & 0xFFU);
465 
466     retVal = DA7212_WriteRegister(handle, DIALOG7212_PLL_FRAC_TOP, pllFracTop);
467 
468     retVal = DA7212_WriteRegister(handle, DIALOG7212_PLL_FRAC_BOT, pllFracBottom);
469 
470     retVal = DA7212_WriteRegister(handle, DIALOG7212_PLL_INTEGER, pllInteger);
471 
472     regVal = pllEnMask | indiv;
473 
474     retVal = DA7212_WriteRegister(handle, DIALOG7212_PLL_CTRL, regVal);
475 
476     /* wait for PLL lock bits */
477     while ((regVal & 1U) == 0U)
478     {
479         retVal = DA7212_ReadRegister(handle, DIALOG7212_PLL_STATUS, &regVal);
480     }
481 
482     return retVal;
483 }
484 
DA7212_SetProtocol(da7212_handle_t * handle,da7212_protocol_t protocol)485 status_t DA7212_SetProtocol(da7212_handle_t *handle, da7212_protocol_t protocol)
486 {
487     return DA7212_WriteRegister(handle, DIALOG7212_DAI_CTRL, (uint8_t)(DIALOG7212_DAI_EN_MASK | (uint8_t)protocol));
488 }
489 
DA7212_ConfigAudioFormat(da7212_handle_t * handle,uint32_t masterClock_Hz,uint32_t sampleRate_Hz,uint32_t dataBits)490 status_t DA7212_ConfigAudioFormat(da7212_handle_t *handle,
491                                   uint32_t masterClock_Hz,
492                                   uint32_t sampleRate_Hz,
493                                   uint32_t dataBits)
494 {
495     uint8_t regVal  = 0;
496     status_t retVal = kStatus_Success;
497 
498     switch (sampleRate_Hz)
499     {
500         case 8000:
501             retVal = DA7212_WriteRegister(handle, DIALOG7212_SR, DIALOG7212_SR_8KHZ);
502             break;
503         case 11025:
504             retVal = DA7212_WriteRegister(handle, DIALOG7212_SR, DIALOG7212_SR_11_025KHZ);
505             break;
506         case 12000:
507             retVal = DA7212_WriteRegister(handle, DIALOG7212_SR, DIALOG7212_SR_12KHZ);
508             break;
509         case 16000:
510             retVal = DA7212_WriteRegister(handle, DIALOG7212_SR, DIALOG7212_SR_16KHZ);
511             break;
512         case 22050:
513             retVal = DA7212_WriteRegister(handle, DIALOG7212_SR, DIALOG7212_SR_22KHZ);
514             break;
515         case 24000:
516             retVal = DA7212_WriteRegister(handle, DIALOG7212_SR, DIALOG7212_SR_24KHZ);
517             break;
518         case 32000:
519             retVal = DA7212_WriteRegister(handle, DIALOG7212_SR, DIALOG7212_SR_32KHZ);
520             break;
521         case 44100:
522             retVal = DA7212_WriteRegister(handle, DIALOG7212_SR, DIALOG7212_SR_44_1KHZ);
523             break;
524         case 48000:
525             retVal = DA7212_WriteRegister(handle, DIALOG7212_SR, DIALOG7212_SR_48KHZ);
526             break;
527         case 88200:
528             retVal = DA7212_WriteRegister(handle, DIALOG7212_SR, DIALOG7212_SR_88_2KHZ);
529             break;
530         case 96000:
531             retVal = DA7212_WriteRegister(handle, DIALOG7212_SR, DIALOG7212_SR_96KHZ);
532             break;
533         default:
534             /* Avoid MISRA 16.4 violation */
535             break;
536     }
537 
538     /* Set data bits of word */
539     retVal = DA7212_ReadRegister(handle, DIALOG7212_DAI_CTRL, &regVal);
540     regVal &= ~(uint8_t)DIALOG7212_DAI_WORD_LENGTH_MASK;
541     switch (dataBits)
542     {
543         case 16:
544             regVal |= (uint8_t)DIALOG7212_DAI_WORD_LENGTH_16B;
545             break;
546         case 20:
547             regVal |= (uint8_t)DIALOG7212_DAI_WORD_LENGTH_20B;
548             break;
549         case 24:
550             regVal |= (uint8_t)DIALOG7212_DAI_WORD_LENGTH_24B;
551             break;
552         case 32:
553             regVal |= (uint8_t)DIALOG7212_DAI_WORD_LENGTH_32B;
554             break;
555         default:
556             /* Avoid MISRA 16.4 violation */
557             break;
558     }
559     retVal = DA7212_WriteRegister(handle, DIALOG7212_DAI_CTRL, regVal);
560 
561     return retVal;
562 }
563 
DA7212_SetMasterModeBits(da7212_handle_t * handle,uint32_t bitWidth)564 status_t DA7212_SetMasterModeBits(da7212_handle_t *handle, uint32_t bitWidth)
565 {
566     uint8_t regVal = 0U;
567 
568     switch (bitWidth)
569     {
570         case 16:
571             regVal = 0U;
572             break;
573         case 32:
574             regVal = 1U;
575             break;
576         case 64:
577             regVal = 2U;
578             break;
579         case 128:
580             regVal = 3U;
581             break;
582         default:
583             assert(false);
584             break;
585     }
586 
587     return DA7212_ModifyRegister(handle, DIALOG7212_DAI_CLK_MODE, 3, regVal);
588 }
589 
DA7212_ChangeInput(da7212_handle_t * handle,da7212_Input_t DA7212_Input)590 void DA7212_ChangeInput(da7212_handle_t *handle, da7212_Input_t DA7212_Input)
591 {
592     uint32_t i       = 0;
593     uint32_t seqSize = sizeof(kInputRegisterSequence[DA7212_Input]) / sizeof(da7212_register_value_t);
594 
595     for (i = 0; i < seqSize; i++)
596     {
597         (void)DA7212_WriteRegister(handle, kInputRegisterSequence[DA7212_Input][i].addr,
598                                    kInputRegisterSequence[DA7212_Input][i].value);
599     }
600 }
601 
DA7212_ChangeOutput(da7212_handle_t * handle,da7212_Output_t DA7212_Output)602 void DA7212_ChangeOutput(da7212_handle_t *handle, da7212_Output_t DA7212_Output)
603 {
604     uint32_t i       = 0;
605     uint32_t seqSize = sizeof(kOutputRegisterSequence[DA7212_Output]) / sizeof(da7212_register_value_t);
606 
607     for (i = 0; i < seqSize; i++)
608     {
609         (void)DA7212_WriteRegister(handle, kOutputRegisterSequence[DA7212_Output][i].addr,
610                                    kOutputRegisterSequence[DA7212_Output][i].value);
611     }
612 }
613 
DA7212_ChangeHPVolume(da7212_handle_t * handle,da7212_volume_t volume)614 void DA7212_ChangeHPVolume(da7212_handle_t *handle, da7212_volume_t volume)
615 {
616     (void)DA7212_WriteRegister(handle, DIALOG7212_DAC_L_GAIN, (uint8_t)volume);
617     (void)DA7212_WriteRegister(handle, DIALOG7212_DAC_R_GAIN, (uint8_t)volume);
618 }
619 
DA7212_Mute(da7212_handle_t * handle,bool isMuted)620 void DA7212_Mute(da7212_handle_t *handle, bool isMuted)
621 {
622     uint8_t val = 0;
623 
624     if (isMuted)
625     {
626         val = DA7212_DAC_MUTE_ENABLED;
627     }
628     else
629     {
630         val = DA7212_DAC_MUTE_DISABLED;
631     }
632 
633     (void)DA7212_WriteRegister(handle, DIALOG7212_DAC_L_CTRL, val);
634     (void)DA7212_WriteRegister(handle, DIALOG7212_DAC_R_CTRL, val);
635 }
636 
DA7212_SetChannelVolume(da7212_handle_t * handle,uint32_t channel,uint32_t volume)637 status_t DA7212_SetChannelVolume(da7212_handle_t *handle, uint32_t channel, uint32_t volume)
638 {
639     status_t retVal = kStatus_Success;
640 
641     if (volume > DA7212_HEADPHONE_MAX_VOLUME_VALUE)
642     {
643         return kStatus_InvalidArgument;
644     }
645 
646     if ((channel & (uint32_t)kDA7212_HeadphoneLeft) != 0U)
647     {
648         retVal = DA7212_WriteRegister(handle, DIALOG7212_HP_L_GAIN, (uint8_t)volume);
649     }
650 
651     if ((channel & (uint32_t)kDA7212_HeadphoneRight) != 0U)
652     {
653         retVal = DA7212_WriteRegister(handle, DIALOG7212_HP_R_GAIN, (uint8_t)volume);
654     }
655 
656     if ((channel & (uint32_t)kDA7212_Speaker) != 0U)
657     {
658         retVal = DA7212_WriteRegister(handle, DIALOG7212_LINE_GAIN, (uint8_t)volume);
659     }
660 
661     return retVal;
662 }
663 
DA7212_SetChannelMute(da7212_handle_t * handle,uint32_t channel,bool isMute)664 status_t DA7212_SetChannelMute(da7212_handle_t *handle, uint32_t channel, bool isMute)
665 {
666     uint8_t regValue = isMute == true ? 0x40U : 0x80U;
667     status_t retVal  = kStatus_Success;
668 
669     if ((channel & (uint32_t)kDA7212_HeadphoneLeft) != 0U)
670     {
671         retVal = DA7212_ModifyRegister(handle, DIALOG7212_HP_L_CTRL, 0xC0U, regValue);
672     }
673 
674     if ((channel & (uint32_t)kDA7212_HeadphoneRight) != 0U)
675     {
676         retVal = DA7212_ModifyRegister(handle, DIALOG7212_HP_R_CTRL, 0xC0U, regValue);
677     }
678 
679     if ((channel & (uint32_t)kDA7212_Speaker) != 0U)
680     {
681         retVal = DA7212_ModifyRegister(handle, DIALOG7212_LINE_CTRL, 0xC0U, regValue);
682     }
683 
684     return retVal;
685 }
686 
DA7212_Deinit(da7212_handle_t * handle)687 status_t DA7212_Deinit(da7212_handle_t *handle)
688 {
689     return kStatus_Success;
690 }
691