1 /*
2  * Copyright (c) 2023 HPMicro
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  *
6  */
7 
8 #ifndef HPM_SMIX_DRV_H
9 #define HPM_SMIX_DRV_H
10 
11 #include "hpm_common.h"
12 #include "hpm_soc_feature.h"
13 #include "hpm_smix_regs.h"
14 #include <math.h>
15 
16 /**
17  * @brief SMIX driver APIs
18  * @defgroup smix_interface SMIX driver APIs
19  * @ingroup smix_interfaces
20  * @{
21  */
22 
23 typedef enum {
24     smix_dma_transfer_burst_1t = 0U,
25     smix_dma_transfer_burst_2t = 1U,
26     smix_dma_transfer_burst_4t = 2U,
27     smix_dma_transfer_burst_8t = 3U,
28     smix_dma_transfer_burst_16t = 4U,
29     smix_dma_transfer_burst_32t = 5U,
30     smix_dma_transfer_burst_64t = 6U,
31     smix_dma_transfer_burst_128t = 7U,
32 } smix_dma_transfer_burst_t;
33 
34 typedef enum {
35     smix_dma_transfer_byte = 0U,
36     smix_dma_transfer_half_word = 1U,
37     smix_dma_transfer_word = 2U,
38 } smix_dma_transfer_width_t;
39 
40 typedef enum {
41     smix_dma_address_increment = 0U,
42     smix_dma_address_decrement = 1U,
43     smix_dma_address_fixed = 2U
44 } smix_dma_address_control_t;
45 
46 typedef enum {
47     smix_dma_mode_normal = 0,
48     smix_dma_mode_handshake = 1,
49 } smix_dma_handshake_mode_t;
50 
51 typedef enum {
52     smix_dma_req_i2s0_rx = 6,
53     smix_dma_req_i2s0_tx = 7,
54     smix_dma_req_i2s1_rx = 8,
55     smix_dma_req_i2s1_tx = 9,
56     smix_dma_req_i2s2_rx = 10,
57     smix_dma_req_i2s2_tx = 11,
58     smix_dma_req_i2s3_rx = 12,
59     smix_dma_req_i2s3_tx = 13,
60 
61     smix_dma_req_mixer_src_ch0 = 16,
62     smix_dma_req_mixer_src_ch1 = 17,
63     smix_dma_req_mixer_src_ch2 = 18,
64     smix_dma_req_mixer_src_ch3 = 19,
65     smix_dma_req_mixer_src_ch4 = 20,
66     smix_dma_req_mixer_src_ch5 = 21,
67     smix_dma_req_mixer_src_ch6 = 22,
68     smix_dma_req_mixer_src_ch7 = 23,
69     smix_dma_req_mixer_src_ch8 = 24,
70     smix_dma_req_mixer_src_ch9 = 25,
71     smix_dma_req_mixer_src_ch10 = 26,
72     smix_dma_req_mixer_src_ch11 = 27,
73     smix_dma_req_mixer_src_ch12 = 28,
74     smix_dma_req_mixer_src_ch13 = 29,
75 
76     smix_dma_req_mixer_dst_ch0 = 30,
77     smix_dma_req_mixer_dst_ch1 = 31,
78 } smix_dma_req_t;
79 
80 
81 typedef enum {
82     smix_src_clk_i2s0_bclk = 0,
83     smix_src_clk_i2s0_fclk = 1,
84     smix_src_clk_i2s0_mclk = 2,
85     smix_src_clk_i2s1_bclk = 3,
86     smix_src_clk_i2s1_fclk = 4,
87     smix_src_clk_i2s1_mclk = 5,
88     smix_src_clk_i2s2_bclk = 6,
89     smix_src_clk_i2s2_fclk = 7,
90     smix_src_clk_i2s2_mclk = 8,
91     smix_src_clk_i2s3_bclk = 9,
92     smix_src_clk_i2s3_fclk = 10,
93     smix_src_clk_i2s3_mclk = 11,
94     smix_src_clk_none      = 15,
95 } smix_src_clk_source_t;
96 
97 
98 typedef struct {
99     uint32_t ctrl;              /**< Control */
100     uint32_t trans_size;        /**< Transfer size in source width */
101     uint32_t src_addr;          /**< Source address */
102     uint32_t reserved0;         /**< reserved */
103     uint32_t dst_addr;          /**< Destination address */
104     uint32_t reserved1;         /**< reserved */
105     uint32_t linked_ptr;        /**< Linked descriptor address */
106     uint32_t reserved2;         /**< resetved */
107 } smix_dma_linked_descriptor_t;
108 
109 
110 typedef struct {
111     uint8_t priority;               /**< Channel priority */
112     uint8_t src_burst_size;         /**< Source burst size */
113     uint8_t src_req_sel;
114     uint8_t dst_req_sel;
115     uint8_t src_mode;               /**< Source work mode */
116     uint8_t dst_mode;               /**< Destination work mode */
117     uint8_t src_width;              /**< Source width */
118     uint8_t dst_width;              /**< Destination width */
119     uint8_t src_addr_ctrl;          /**< Source address control */
120     uint8_t dst_addr_ctrl;          /**< Destination address control */
121     bool abort_int_en;              /**< enable abort interrupt */
122     bool error_int_en;              /**< enable error interrupt */
123     bool complete_int_en;           /**< enable complete interrupt */
124     uint32_t src_addr;              /**< Source address */
125     uint32_t dst_addr;              /**< Destination address */
126     uint32_t linked_ptr;            /**< Next linked descriptor */
127     uint32_t trans_bytes;           /**< Total size to be transferred in byte */
128 } smix_dma_ch_config_t;
129 
130 /* gain bit[14:0] */
131 /* low 12 bits is fraction */
132 /* high 3 bits: 1 - right shift 2; 2 - right shift 4 */
133 typedef enum {
134     smix_mixer_gain_decrease_20db = 0x199,
135     smix_mixer_gain_decrease_19db = 0x1cb,
136     smix_mixer_gain_decrease_18db = 0x203,
137     smix_mixer_gain_decrease_17db = 0x242,
138     smix_mixer_gain_decrease_16db = 0x289,
139     smix_mixer_gain_decrease_15db = 0x2d8,
140     smix_mixer_gain_decrease_14db = 0x331,
141     smix_mixer_gain_decrease_13db = 0x395,
142     smix_mixer_gain_decrease_12db = 0x404,
143     smix_mixer_gain_decrease_11db = 0x482,
144     smix_mixer_gain_decrease_10db = 0x50f,
145     smix_mixer_gain_decrease_9db = 0x5ad,
146     smix_mixer_gain_decrease_8db = 0x65e,
147     smix_mixer_gain_decrease_7db = 0x725,
148     smix_mixer_gain_decrease_6db = 0x804,
149     smix_mixer_gain_decrease_5db = 0x8ff,
150     smix_mixer_gain_decrease_4db = 0xa18,
151     smix_mixer_gain_decrease_3db = 0xb53,
152     smix_mixer_gain_decrease_2db = 0xcb5,
153     smix_mixer_gain_decrease_1db = 0xe42,
154     smix_mixer_gain_0db = 0xfff,
155     smix_mixer_gain_increase_1db = 0x147c,
156     smix_mixer_gain_increase_2db = 0x1509,
157     smix_mixer_gain_increase_3db = 0x15a6,
158     smix_mixer_gain_increase_4db = 0x1657,
159     smix_mixer_gain_increase_5db = 0x171c,
160     smix_mixer_gain_increase_6db = 0x17fa,
161     smix_mixer_gain_increase_7db = 0x18f4,
162     smix_mixer_gain_increase_8db = 0x1a0c,
163     smix_mixer_gain_increase_9db = 0x1b45,
164     smix_mixer_gain_increase_10db = 0x1ca5,
165     smix_mixer_gain_increase_11db = 0x1e31,
166     smix_mixer_gain_increase_12db = 0x1fed,
167     smix_mixer_gain_increase_13db = 0x2477,
168     smix_mixer_gain_increase_14db = 0x2503,
169     smix_mixer_gain_increase_15db = 0x259f,
170     smix_mixer_gain_increase_16db = 0x264f,
171     smix_mixer_gain_increase_17db = 0x2714,
172     smix_mixer_gain_increase_18db = 0x27f1,
173     smix_mixer_gain_increase_19db = 0x28e9,
174     smix_mixer_gain_increase_20db = 0x2a00
175 } smix_mixer_gain_t;
176 
177 
178 typedef enum {
179     smix_mixer_no_rate_convert,
180     smix_mixer_upper_2x_sample,
181     smix_mixer_upper_3x_sample,
182     smix_mixer_upper_4x_sample,
183     smix_mixer_upper_6x_sample,
184     smix_mixer_upper_8x_sample,
185     smix_mixer_upper_12x_sample,
186     smix_mixer_lower_2x_sample,
187 } smix_mixer_rate_convert_t;
188 
189 typedef struct {
190     bool underflow_int_en;
191     uint8_t fifo_thr;
192     bool calsat_int_en;
193     bool da_int_en;
194     bool auto_deactivate_en;
195     bool fadeout_done_int_en;
196     bool deactivate_en;
197     bool active_en;
198     bool fadeout_now_en;
199     bool fadeout_auto_en;
200     bool fadein_en;
201     bool channel_en;
202     bool mixer_en;
203 
204     uint16_t gain;
205     uint32_t length;
206     uint32_t fadein_delta;
207     uint32_t fadeout_delta;
208     uint8_t src_ch_mask;
209 } smix_mixer_dst_config_t;
210 
211 
212 typedef struct {
213     uint8_t fifo_thr;
214     bool calsat_int_en;
215     bool dn_int_en;
216     bool auto_deactivate_en;
217     bool fadeout_int_en;
218     uint8_t convert_rate;
219 
220     uint16_t gain;
221     uint32_t fadein_delta;
222     uint32_t fadeout_delta;
223     uint32_t length;
224 } smix_mixer_source_config_t;
225 
226 #ifdef __cplusplus
227 extern "C" {
228 #endif
229 
230 /**
231  * @brief smix dma check transfer complete status
232  *
233  * @param [in] ptr SMIX base address
234  * @param [in] ch_index dma channel
235  * @retval true for transfer complete
236  */
smix_dma_check_transfer_complete(SMIX_Type * ptr,uint8_t ch_index)237 static inline bool smix_dma_check_transfer_complete(SMIX_Type *ptr, uint8_t ch_index)
238 {
239     if ((SMIX_DMAC_TC_ST_CH_GET(ptr->DMAC_TC_ST) & (1U << ch_index)) != 0) {
240         ptr->DMAC_TC_ST = (1U << ch_index); /* W1C clear status*/
241         return true;
242     }
243     return false;
244 }
245 
246 /**
247  * @brief smix dma check transfer abort status
248  *
249  * @param [in] ptr SMIX base address
250  * @param [in] ch_index dma channel
251  * @retval true for transfer abort
252  */
smix_dma_check_transfer_abort(SMIX_Type * ptr,uint8_t ch_index)253 static inline bool smix_dma_check_transfer_abort(SMIX_Type *ptr, uint8_t ch_index)
254 {
255     if ((SMIX_DMAC_ABRT_ST_CH_GET(ptr->DMAC_ABRT_ST) & (1U << ch_index)) != 0) {
256         ptr->DMAC_ABRT_ST = (1U << ch_index); /* W1C clear status*/
257         return true;
258     }
259     return false;
260 }
261 
262 /**
263  * @brief smix dma check transfer error status
264  *
265  * @param [in] ptr SMIX base address
266  * @param [in] ch_index dma channel
267  * @retval true for transfer error
268  */
smix_dma_check_transfer_error(SMIX_Type * ptr,uint8_t ch_index)269 static inline bool smix_dma_check_transfer_error(SMIX_Type *ptr, uint8_t ch_index)
270 {
271     if ((SMIX_DMAC_ERR_ST_CH_GET(ptr->DMAC_ERR_ST) & (1U << ch_index)) != 0) {
272         ptr->DMAC_ERR_ST = (1U << ch_index); /* W1C clear status*/
273         return true;
274     }
275     return false;
276 }
277 
278 /**
279  * @brief smix mixer enable source channel for dst
280  *
281  * @param [in] ptr SMIX base address
282  * @param [in] dst_ch dst channel
283  * @param [in] source_ch_mask source channel mask
284  */
smix_mixer_dst_enable_source_channel(SMIX_Type * ptr,uint8_t dst_ch,uint32_t source_ch_mask)285 static inline void smix_mixer_dst_enable_source_channel(SMIX_Type *ptr, uint8_t dst_ch, uint32_t source_ch_mask)
286 {
287     ptr->DST_CH[dst_ch].SOURCE_EN |= source_ch_mask;
288 }
289 
290 /**
291  * @brief smix mixer disable source channel for dst
292  *
293  * @param [in] ptr SMIX base address
294  * @param [in] dst_ch dst channel
295  * @param [in] source_ch_mask source channel mask
296  */
smix_mixer_dst_disable_source_channel(SMIX_Type * ptr,uint8_t dst_ch,uint32_t source_ch_mask)297 static inline void smix_mixer_dst_disable_source_channel(SMIX_Type *ptr, uint8_t dst_ch, uint32_t source_ch_mask)
298 {
299     ptr->DST_CH[dst_ch].SOURCE_EN &= ~source_ch_mask;
300 }
301 
302 /**
303  * @brief smix mixer active source channel for dst
304  *
305  * @param [in] ptr SMIX base address
306  * @param [in] dst_ch dst channel
307  * @param [in] source_ch_mask source channel mask
308  */
smix_mixer_dst_active_source_channel(SMIX_Type * ptr,uint8_t dst_ch,uint32_t source_ch_mask)309 static inline void smix_mixer_dst_active_source_channel(SMIX_Type *ptr, uint8_t dst_ch, uint32_t source_ch_mask)
310 {
311     ptr->DST_CH[dst_ch].SOURCE_ACT |= source_ch_mask;
312 }
313 
314 /**
315  * @brief smix mixer deactive source channel for dst
316  *
317  * @param [in] ptr SMIX base address
318  * @param [in] dst_ch dst channel
319  * @param [in] source_ch_mask source channel mask
320  */
smix_mixer_dst_deactive_source_channel(SMIX_Type * ptr,uint8_t dst_ch,uint32_t source_ch_mask)321 static inline void smix_mixer_dst_deactive_source_channel(SMIX_Type *ptr, uint8_t dst_ch, uint32_t source_ch_mask)
322 {
323     ptr->DST_CH[dst_ch].SOURCE_DEACT |= source_ch_mask;
324 }
325 
326 /**
327  * @brief smix mixer fadein source channel for dst
328  *
329  * @param [in] ptr SMIX base address
330  * @param [in] dst_ch dst channel
331  * @param [in] source_ch_mask source channel mask
332  */
smix_mixer_dst_fadein_source_channel(SMIX_Type * ptr,uint8_t dst_ch,uint32_t source_ch_mask)333 static inline void smix_mixer_dst_fadein_source_channel(SMIX_Type *ptr, uint8_t dst_ch, uint32_t source_ch_mask)
334 {
335     ptr->DST_CH[dst_ch].SOURCE_FADEIN_CTRL |= source_ch_mask;
336 }
337 
338 /**
339  * @brief smix mixer fadeout source channel for dst
340  *
341  * @param [in] ptr SMIX base address
342  * @param [in] dst_ch dst channel
343  * @param [in] source_ch_mask source channel mask
344  */
smix_mixer_dst_fadeout_source_channel(SMIX_Type * ptr,uint8_t dst_ch,uint32_t source_ch_mask)345 static inline void smix_mixer_dst_fadeout_source_channel(SMIX_Type *ptr, uint8_t dst_ch, uint32_t source_ch_mask)
346 {
347     ptr->DST_CH[dst_ch].SOURCE_MFADEOUT_CTRL |= source_ch_mask;
348 }
349 
350 /**
351  * @brief smix mixer enable dst channel
352  *
353  * @param [in] ptr SMIX base address
354  *
355  * @note two dst channel share same enable bit in DST_CH[0].CTRL.MIXER_EN, DST_CH[1].CTRL.MIXER_EN should not be set
356  */
smix_mixer_dst_enable(SMIX_Type * ptr)357 static inline void smix_mixer_dst_enable(SMIX_Type *ptr)
358 {
359     ptr->DST_CH[0].CTRL |= SMIX_DST_CH_CTRL_DST_EN_MASK;
360     ptr->DST_CH[1].CTRL &= ~SMIX_DST_CH_CTRL_DST_EN_MASK;
361 }
362 
363 /**
364  * @brief smix mixer disable dst channel
365  *
366  * @param [in] ptr SMIX base address
367  *
368  * @note two dst channel share same enable bit in DST_CH[0].CTRL.MIXER_EN, DST_CH[1].CTRL.MIXER_EN should not be set
369  */
smix_mixer_dst_disable(SMIX_Type * ptr)370 static inline void smix_mixer_dst_disable(SMIX_Type *ptr)
371 {
372     ptr->DST_CH[0].CTRL &= ~SMIX_DST_CH_CTRL_DST_EN_MASK;
373 }
374 
375 /**
376  * @brief smix mixer get calculate saturation register value
377  *
378  * @param [in] ptr SMIX base address
379  * @retval calculate saturation register value
380  */
smix_mixer_get_calsat_status(SMIX_Type * ptr)381 static inline uint32_t smix_mixer_get_calsat_status(SMIX_Type *ptr)
382 {
383     return ptr->CALSAT_ST;
384 }
385 
386 /**
387  * @brief smix mixer check dst channel calculate saturation error
388  *
389  * @param [in] ptr SMIX base address
390  * @param [in] dst_ch dst channel
391  * @retval true for calculate saturation error occurred
392  */
smix_mixer_check_dst_cal_saturation_error(SMIX_Type * ptr,uint8_t dst_ch)393 static inline bool smix_mixer_check_dst_cal_saturation_error(SMIX_Type *ptr, uint8_t dst_ch)
394 {
395     return ((SMIX_CALSAT_ST_DST_GET(ptr->CALSAT_ST) & (1U << dst_ch)) != 0) ? true : false;
396 }
397 
398 /**
399  * @brief smix mixer check source channel calculate saturation error
400  *
401  * @param [in] ptr SMIX base address
402  * @param [in] source_ch source channel
403  * @retval true for calculate saturation error occurred
404  */
smix_mixer_check_source_cal_saturation_error(SMIX_Type * ptr,uint8_t source_ch)405 static inline bool smix_mixer_check_source_cal_saturation_error(SMIX_Type *ptr, uint8_t source_ch)
406 {
407     return ((SMIX_CALSAT_ST_SRC_GET(ptr->CALSAT_ST) & (1U << source_ch)) != 0) ? true : false;
408 }
409 
410 /**
411  * @brief smix mixer check dst channel data ubderflew
412  *
413  * @param [in] ptr SMIX base address
414  * @param [in] dst_ch dst channel
415  * @retval true for data underflew
416  */
smix_mixer_check_dst_data_underflew(SMIX_Type * ptr,uint8_t dst_ch)417 static inline bool smix_mixer_check_dst_data_underflew(SMIX_Type *ptr, uint8_t dst_ch)
418 {
419     return ((SMIX_DATA_ST_DST_UNDL_GET(ptr->DATA_ST) & (1U << dst_ch)) != 0) ? true : false;
420 }
421 
422 /**
423  * @brief smix mixer check dst channel data available
424  *
425  * @param [in] ptr SMIX base address
426  * @param [in] dst_ch dst channel
427  * @retval true for data available
428  */
smix_mixer_check_dst_data_available(SMIX_Type * ptr,uint8_t dst_ch)429 static inline bool smix_mixer_check_dst_data_available(SMIX_Type *ptr, uint8_t dst_ch)
430 {
431     return ((SMIX_DATA_ST_DST_DA_GET(ptr->DATA_ST) & (1U << dst_ch)) != 0) ? true : false;
432 }
433 
434 /**
435  * @brief smix mixer check source channel data available
436  *
437  * @param [in] ptr SMIX base address
438  * @param [in] source_ch source channel
439  * @retval true for source channel need new data
440  */
smix_mixer_check_source_data_needed(SMIX_Type * ptr,uint8_t source_ch)441 static inline bool smix_mixer_check_source_data_needed(SMIX_Type *ptr, uint8_t source_ch)
442 {
443     return ((SMIX_DATA_ST_SRC_DN_GET(ptr->DATA_ST) & (1U << source_ch)) != 0) ? true : false;
444 }
445 
446 /**
447  * @brief smix mixer config dst channel fadein delta
448  *
449  * @param [in] ptr SMIX base address
450  * @param [in] ch dst channel
451  * @param [in] target_sample_rate target sample rate
452  * @param [in] ms fadein consumed time in ms
453  * @retval status_success if no error occurs
454  */
455 hpm_stat_t smix_mixer_config_dst_fadein_delta(SMIX_Type *ptr, uint8_t ch, uint32_t target_sample_rate, uint32_t ms);
456 
457 /**
458  * @brief smix mixer config dst channel fadeout delta
459  *
460  * @param [in] ptr SMIX base address
461  * @param [in] ch dst channel
462  * @param [in] target_sample_rate target sample rate
463  * @param [in] ms fadeout consumed time in ms
464  * @retval status_success if no error occurs
465  */
466 hpm_stat_t smix_mixer_config_dst_fadeout_delta(SMIX_Type *ptr, uint8_t ch, uint32_t target_sample_rate, uint32_t ms);
467 
468 /**
469  * @brief smix mixer config source channel fadein delta
470  *
471  * @param [in] ptr SMIX base address
472  * @param [in] ch source channel
473  * @param [in] target_sample_rate target sample rate
474  * @param [in] ms fadein consumed time in ms
475  * @retval status_success if no error occurs
476  */
477 hpm_stat_t smix_mixer_config_source_fadein_delta(SMIX_Type *ptr, uint8_t ch, uint32_t target_sample_rate, uint32_t ms);
478 
479 /**
480  * @brief smix mixer config source channel fadeout delta
481  *
482  * @param [in] ptr SMIX base address
483  * @param [in] ch source channel
484  * @param [in] target_sample_rate target sample rate
485  * @param [in] ms fadeout consumed time in ms
486  * @retval status_success if no error occurs
487  */
488 hpm_stat_t smix_mixer_config_source_fadeout_delta(SMIX_Type *ptr, uint8_t ch, uint32_t target_sample_rate, uint32_t ms);
489 
490 /**
491  * @brief smix get dma channel default config
492  *
493  * @param [in] ptr SMIX base address
494  * @param [in] config smix_dma_ch_config_t
495  */
496 void smix_get_dma_default_ch_config(SMIX_Type *ptr, smix_dma_ch_config_t *config);
497 
498 /**
499  * @brief smix get dst channel default config
500  *
501  * @param [in] ptr SMIX base address
502  * @param [in] config smix_mixer_dst_config_t
503  */
504 void smix_get_mixer_dst_ch_default_config(SMIX_Type *ptr, smix_mixer_dst_config_t *config);
505 
506 /**
507  * @brief smix get source channel default config
508  *
509  * @param [in] ptr SMIX base address
510  * @param [in] config smix_mixer_source_config_t
511  */
512 void smix_get_mixer_source_ch_default_config(SMIX_Type *ptr, smix_mixer_source_config_t *config);
513 
514 /**
515  * @brief smix config dma channel
516  *
517  * @param [in] ptr SMIX base address
518  * @param [in] ch dma channel
519  * @param [in] config smix_dma_ch_config_t
520  * @param [in] start true for start dma
521  * @retval status_success if no error occurs
522  */
523 hpm_stat_t smix_config_dma_channel(SMIX_Type *ptr, uint8_t ch, smix_dma_ch_config_t *config, bool start);
524 
525 /**
526  * @brief smix mixer config source channel
527  *
528  * @param [in] ptr SMIX base address
529  * @param [in] ch source channel
530  * @param [in] src smix_mixer_source_config_t
531  * @retval status_success if no error occurs
532  */
533 hpm_stat_t smix_mixer_config_source_ch(SMIX_Type *ptr, uint8_t ch, smix_mixer_source_config_t *src);
534 
535 /**
536  * @brief smix mixer config dst channel
537  *
538  * @param [in] ptr SMIX base address
539  * @param [in] ch dst channel
540  * @param [in] dst smix_mixer_dst_config_t
541  * @retval status_success if no error occurs
542  */
543 hpm_stat_t smix_mixer_config_dst_ch(SMIX_Type *ptr, uint8_t ch, smix_mixer_dst_config_t *dst);
544 
545 /**
546  * @brief smix mixer config source channel gain
547  *
548  * @param [in] ptr SMIX base address
549  * @param [in] ch_index source channel
550  * @param [in] gain smix_mixer_gain_t
551  */
smix_set_source_gain(SMIX_Type * ptr,uint8_t ch_index,smix_mixer_gain_t gain)552 static inline void smix_set_source_gain(SMIX_Type *ptr, uint8_t ch_index, smix_mixer_gain_t gain)
553 {
554     ptr->SOURCE_CH[ch_index].GAIN = SMIX_SOURCE_CH_GAIN_VAL_SET(gain);
555 }
556 
557 /**
558  * @brief smix mixer config dst channel gain
559  *
560  * @param [in] ptr SMIX base address
561  * @param [in] ch_index dst channel
562  * @param [in] gain smix_mixer_gain_t
563  */
smix_set_dst_gain(SMIX_Type * ptr,uint8_t ch_index,smix_mixer_gain_t gain)564 static inline void smix_set_dst_gain(SMIX_Type *ptr, uint8_t ch_index, smix_mixer_gain_t gain)
565 {
566     ptr->DST_CH[ch_index].GAIN = SMIX_DST_CH_GAIN_VAL_SET(gain);
567 }
568 
569 #ifdef __cplusplus
570 }
571 #endif
572 
573 /**
574  * @}
575  */
576 
577 #endif /* HPM_SMIX_DRV_H */
578