Skip to content

Commit 8b1affb

Browse files
VitekSTfabiobaltieri
authored andcommitted
soc: mimxrt798s/hifi4: Add soc.c
Add soc.c. Handle IRQ mapping (INPUTMUX) and clock setup. Signed-off-by: Vit Stanicek <[email protected]>
1 parent 1a41cbc commit 8b1affb

File tree

3 files changed

+151
-1
lines changed

3 files changed

+151
-1
lines changed

soc/nxp/imxrt/imxrt6xx/hifi4/soc.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
__weak void mimxrt685s_hifi4_irq_init(void)
1515
{
16-
/**
16+
/*
1717
* IRQ assignments
1818
*
1919
* L1: (lowest priority)

soc/nxp/imxrt/imxrt7xx/hifi4/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,6 @@
77
zephyr_include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
88
zephyr_include_directories(${CMAKE_CURRENT_SOURCE_DIR})
99

10+
zephyr_sources(soc.c)
11+
1012
set(SOC_LINKER_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/linker.ld CACHE INTERNAL "")

soc/nxp/imxrt/imxrt7xx/hifi4/soc.c

Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
/*
2+
* Copyright 2024-2025 NXP
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
#include <zephyr/init.h>
7+
#include <zephyr/devicetree.h>
8+
9+
#include <fsl_clock.h>
10+
#include <fsl_inputmux.h>
11+
12+
#if DT_NODE_HAS_STATUS(DT_NODELABEL(edma1), okay)
13+
#define SYSCON_BASE DT_REG_ADDR(DT_NODELABEL(syscon0))
14+
#define EN_NUM 4
15+
16+
#define EDMA_EN_OFFSET 0x420
17+
#define EDMA_EN_REG(instance, idx) ((uint32_t *)((uint32_t)(SYSCON_BASE) + \
18+
(EDMA_EN_OFFSET) + 0x10U * (instance) + 4U * (idx)))
19+
#endif
20+
21+
#define SET_UP_FLEXCOMM_CLOCK(x) \
22+
do { \
23+
CLOCK_AttachClk(kFCCLK0_to_FLEXCOMM##x); \
24+
RESET_ClearPeripheralReset(kFC##x##_RST_SHIFT_RSTn); \
25+
CLOCK_EnableClock(kCLOCK_LPFlexComm##x); \
26+
} while (0)
27+
28+
#if CONFIG_DT_HAS_NXP_MCUX_EDMA_ENABLED
29+
static void edma_enable_all_request(uint8_t instance)
30+
{
31+
uint32_t *reg;
32+
33+
for (uint8_t idx = 0; idx < EN_NUM; idx++) {
34+
reg = EDMA_EN_REG(instance, idx);
35+
*reg |= 0xFFFFFFFFU;
36+
}
37+
}
38+
#endif
39+
40+
__weak void mimxrt798s_hifi4_irq_init(void)
41+
{
42+
/**
43+
* IRQ assignments
44+
*
45+
* NMI:
46+
* - IRQ 0 (SEL 0): Yet unassigned
47+
*
48+
* L1: (lowest priority)
49+
* - IRQ 6 (SEL 1): FLEXCOMM0
50+
* - IRQ 7 (SEL 2): FLEXCOMM2
51+
* - IRQ 8 (SEL 3): WWDT1
52+
* - IRQ 9 (SEL 4): PINT0
53+
* - IRQ 10 (SEL 5): PINT1
54+
* - IRQ 11 (SEL 6): PINT2
55+
* - IRQ 12 (SEL 7): PINT3
56+
* - IRQ 13 (SEL 8): PINT4
57+
* - IRQ 14 (SEL 9): PINT5
58+
* - IRQ 15 (SEL 10): PINT6
59+
*
60+
* L2:
61+
* - IRQ 16 (SEL 11): PINT7
62+
* - IRQ 17 (SEL 12): LPSPI14
63+
* - IRQ 18 (SEL 13): MU2
64+
* - IRQ 19 (SEL 14): MU4
65+
* - IRQ 20 (SEL 15): EDMA1-0
66+
* - IRQ 21 (SEL 16): EDMA1-1
67+
* - IRQ 22 (SEL 17): EDMA1-2
68+
* - IRQ 23 (SEL 18): EDMA1-3
69+
*
70+
* L3: (highest priority)
71+
* - IRQ 24 (SEL 19): EDMA1-4
72+
* - IRQ 25 (SEL 20): EDMA1-5
73+
* - IRQ 26 (SEL 21): EDMA1-6
74+
* - IRQ 27 (SEL 22): EDMA1-7
75+
* - IRQ 28 (SEL 23): MICFIL
76+
* - IRQ 29 (SEL 24): SAI0
77+
* - IRQ 30 (SEL 25): SAI1
78+
* - IRQ 31 (SEL 26): SAI2
79+
*/
80+
INPUTMUX_Init(INPUTMUX0);
81+
82+
INPUTMUX_AttachSignal(INPUTMUX0, 1, kINPUTMUX_Flexcomm0ToDspInterrupt);
83+
INPUTMUX_AttachSignal(INPUTMUX0, 2, kINPUTMUX_Flexcomm2ToDspInterrupt);
84+
INPUTMUX_AttachSignal(INPUTMUX0, 3, kINPUTMUX_Wdt1ToDspInterrupt);
85+
86+
INPUTMUX_AttachSignal(INPUTMUX0, 4, kINPUTMUX_Gpio0Irq0ToDspInterrupt);
87+
INPUTMUX_AttachSignal(INPUTMUX0, 5, kINPUTMUX_Gpio0Irq1ToDspInterrupt);
88+
89+
INPUTMUX_AttachSignal(INPUTMUX0, 6, kINPUTMUX_GpioInt2ToDspInterrupt);
90+
INPUTMUX_AttachSignal(INPUTMUX0, 7, kINPUTMUX_GpioInt3ToDspInterrupt);
91+
INPUTMUX_AttachSignal(INPUTMUX0, 8, kINPUTMUX_GpioInt4ToDspInterrupt);
92+
INPUTMUX_AttachSignal(INPUTMUX0, 9, kINPUTMUX_GpioInt5ToDspInterrupt);
93+
INPUTMUX_AttachSignal(INPUTMUX0, 10, kINPUTMUX_GpioInt6ToDspInterrupt);
94+
95+
INPUTMUX_AttachSignal(INPUTMUX0, 11, kINPUTMUX_GpioInt7ToDspInterrupt);
96+
INPUTMUX_AttachSignal(INPUTMUX0, 12, kINPUTMUX_Spi14ToDspInterrupt);
97+
INPUTMUX_AttachSignal(INPUTMUX0, 13, kINPUTMUX_Mu2AToDspInterrupt);
98+
INPUTMUX_AttachSignal(INPUTMUX0, 14, kINPUTMUX_Mu4BToDspInterrupt);
99+
INPUTMUX_AttachSignal(INPUTMUX0, 15, kINPUTMUX_Dma1Irq0ToDspInterrupt);
100+
INPUTMUX_AttachSignal(INPUTMUX0, 16, kINPUTMUX_Dma1Irq1ToDspInterrupt);
101+
INPUTMUX_AttachSignal(INPUTMUX0, 17, kINPUTMUX_Dma1Irq2ToDspInterrupt);
102+
INPUTMUX_AttachSignal(INPUTMUX0, 18, kINPUTMUX_Dma1Irq3ToDspInterrupt);
103+
104+
INPUTMUX_AttachSignal(INPUTMUX0, 19, kINPUTMUX_Dma1Irq4ToDspInterrupt);
105+
INPUTMUX_AttachSignal(INPUTMUX0, 20, kINPUTMUX_Dma1Irq5ToDspInterrupt);
106+
INPUTMUX_AttachSignal(INPUTMUX0, 21, kINPUTMUX_Dma1Irq6ToDspInterrupt);
107+
INPUTMUX_AttachSignal(INPUTMUX0, 22, kINPUTMUX_Dma1Irq7ToDspInterrupt);
108+
INPUTMUX_AttachSignal(INPUTMUX0, 23, kINPUTMUX_MicfilToDspInterrupt);
109+
INPUTMUX_AttachSignal(INPUTMUX0, 24, kINPUTMUX_Sai0ToDspInterrupt);
110+
INPUTMUX_AttachSignal(INPUTMUX0, 25, kINPUTMUX_Sai1ToDspInterrupt);
111+
INPUTMUX_AttachSignal(INPUTMUX0, 26, kINPUTMUX_Sai2ToDspInterrupt);
112+
113+
INPUTMUX_Deinit(INPUTMUX0);
114+
}
115+
116+
__weak void mimxrt798s_hifi4_clock_init(void)
117+
{
118+
CLOCK_AttachClk(kOSC_CLK_to_FCCLK0);
119+
CLOCK_SetClkDiv(kCLOCK_DivFcclk0Clk, 1U);
120+
121+
#if DT_NODE_HAS_STATUS(DT_NODELABEL(flexcomm0), okay)
122+
SET_UP_FLEXCOMM_CLOCK(0);
123+
#endif
124+
125+
#if DT_NODE_HAS_STATUS(DT_NODELABEL(flexcomm2), okay)
126+
SET_UP_FLEXCOMM_CLOCK(2);
127+
#endif
128+
129+
#if DT_NODE_HAS_STATUS(DT_NODELABEL(edma1), okay)
130+
CLOCK_EnableClock(kCLOCK_Dma1);
131+
RESET_ClearPeripheralReset(kDMA1_RST_SHIFT_RSTn);
132+
edma_enable_all_request(1);
133+
#endif
134+
135+
#if DT_NODE_HAS_STATUS(DT_NODELABEL(sai0), okay)
136+
/* SAI clock 368.64 / 15 = 24.576MHz */
137+
CLOCK_AttachClk(kAUDIO_PLL_PFD3_to_AUDIO_VDD2);
138+
CLOCK_AttachClk(kAUDIO_VDD2_to_SAI012);
139+
CLOCK_SetClkDiv(kCLOCK_DivSai012Clk, 15U);
140+
RESET_ClearPeripheralReset(kSAI0_RST_SHIFT_RSTn);
141+
#endif
142+
}
143+
144+
void soc_early_init_hook(void)
145+
{
146+
mimxrt798s_hifi4_irq_init();
147+
mimxrt798s_hifi4_clock_init();
148+
}

0 commit comments

Comments
 (0)