1 /*
2 * Copyright 2022 NXP
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7 #ifndef _FSL_MISC_H_
8 #define _FSL_MISC_H_
9
10 #include "fsl_common.h"
11
12 /*******************************************************************************
13 * Definitions
14 ******************************************************************************/
15 /* Component ID definition, used by tools. */
16 #ifndef FSL_COMPONENT_ID
17 #define FSL_COMPONENT_ID "platform.drivers.misc"
18 #endif
19
20 #define BLK_CTRL_SAIMCLK_LOWBITMASK (0x7U)
21 #define BLK_CTRL_SAIMCLK_HIGHBITMASK (0x3U)
22
23 typedef enum _blk_ctrl_saimclk
24 {
25 kBLK_CTRL_SAI4MClk1Sel = BLK_CTRL_WAKEUPMIX_SAI4_MCLK_CTRL_SAI4_MCLK1_SEL_SHIFT,
26 kBLK_CTRL_SAI4MClk2Sel = BLK_CTRL_WAKEUPMIX_SAI4_MCLK_CTRL_SAI4_MCLK2_SEL_SHIFT,
27 kBLK_CTRL_SAI4MClk3Sel = BLK_CTRL_WAKEUPMIX_SAI4_MCLK_CTRL_SAI4_MCLK3_SEL_SHIFT,
28 kBLK_CTRL_SAI2MClk3Sel = BLK_CTRL_WAKEUPMIX_SAI2_MCLK_CTRL_SAI2_MCLK3_SEL_SHIFT + 8,
29 kBLK_CTRL_SAI3MClk3Sel = BLK_CTRL_WAKEUPMIX_SAI3_MCLK_CTRL_SAI3_MCLK3_SEL_SHIFT + 10,
30 } blk_ctrl_saimclk_t;
31
32 /*******************************************************************************
33 * API
34 ******************************************************************************/
35 #if defined(__cplusplus)
36 extern "C" {
37 #endif
38
39 /*!
40 * @brief Sets BLK general configuration for SAI MCLK selection.
41 *
42 * @param base The BLK CTRL base address.
43 * @param mclk The SAI MCLK.
44 * @param clkSrc The clock source. Take refer to register setting details for the clock source in RM.
45 */
BLK_CTRL_SetSaiMClkClockSource(BLK_CTRL_WAKEUPMIX_Type * base,blk_ctrl_saimclk_t mclk,uint8_t clkSrc)46 static inline void BLK_CTRL_SetSaiMClkClockSource(BLK_CTRL_WAKEUPMIX_Type *base,
47 blk_ctrl_saimclk_t mclk,
48 uint8_t clkSrc)
49 {
50 uint32_t temp;
51
52 if (mclk > kBLK_CTRL_SAI2MClk3Sel)
53 {
54 temp = base->SAI3_MCLK_CTRL & ~(BLK_CTRL_SAIMCLK_HIGHBITMASK);
55 base->SAI3_MCLK_CTRL = ((uint32_t)clkSrc & BLK_CTRL_SAIMCLK_HIGHBITMASK) | temp;
56 }
57 else if (mclk > kBLK_CTRL_SAI4MClk3Sel)
58 {
59 temp = base->SAI2_MCLK_CTRL & ~(BLK_CTRL_SAIMCLK_HIGHBITMASK);
60 base->SAI2_MCLK_CTRL = ((uint32_t)clkSrc & BLK_CTRL_SAIMCLK_HIGHBITMASK) | temp;
61 }
62 else if (mclk > kBLK_CTRL_SAI4MClk2Sel)
63 {
64 temp = base->SAI4_MCLK_CTRL & ~((uint32_t)BLK_CTRL_SAIMCLK_HIGHBITMASK << (uint32_t)mclk);
65 base->SAI4_MCLK_CTRL = (((uint32_t)clkSrc & BLK_CTRL_SAIMCLK_HIGHBITMASK) << (uint32_t)mclk) | temp;
66 }
67 else
68 {
69 temp = base->SAI4_MCLK_CTRL & ~((uint32_t)BLK_CTRL_SAIMCLK_LOWBITMASK << (uint32_t)mclk);
70 base->SAI4_MCLK_CTRL = (((uint32_t)clkSrc & BLK_CTRL_SAIMCLK_LOWBITMASK) << (uint32_t)mclk) | temp;
71 }
72 }
73
74 #if defined(__cplusplus)
75 }
76 #endif /* __cplusplus */
77 #endif /* _FSL_MISC_H_ */
78