From fbb03cb8f49b2bd20d80e63fcf01bcbe596d8dde Mon Sep 17 00:00:00 2001 From: Hou Zhiqiang Date: Fri, 24 Oct 2025 16:57:56 +0800 Subject: [PATCH 01/14] boards: frdm_imx91: fix board dts and pinctrl dtsi format issue Compliance check reports some format issue, so fix it. Signed-off-by: Hou Zhiqiang --- boards/nxp/frdm_imx91/frdm_imx91-pinctrl.dtsi | 84 +++++++++---------- boards/nxp/frdm_imx91/frdm_imx91_mimx9131.dts | 5 +- 2 files changed, 45 insertions(+), 44 deletions(-) diff --git a/boards/nxp/frdm_imx91/frdm_imx91-pinctrl.dtsi b/boards/nxp/frdm_imx91/frdm_imx91-pinctrl.dtsi index b17f345ad53d5..8ead023932738 100644 --- a/boards/nxp/frdm_imx91/frdm_imx91-pinctrl.dtsi +++ b/boards/nxp/frdm_imx91/frdm_imx91-pinctrl.dtsi @@ -30,7 +30,7 @@ pinmux_usdhc1: pinmux_usdhc1 { group0 { pinmux = <&iomuxc1_sd1_clk_usdhc_clk_usdhc1_clk>, - <&iomuxc1_sd1_strobe_usdhc_strobe_usdhc1_strobe>; + <&iomuxc1_sd1_strobe_usdhc_strobe_usdhc1_strobe>; drive-strength = "x1"; bias-pull-down; slew-rate = "fast"; @@ -39,14 +39,14 @@ group1 { pinmux = <&iomuxc1_sd1_cmd_usdhc_cmd_usdhc1_cmd>, - <&iomuxc1_sd1_data0_usdhc_data_usdhc1_data0>, - <&iomuxc1_sd1_data1_usdhc_data_usdhc1_data1>, - <&iomuxc1_sd1_data2_usdhc_data_usdhc1_data2>, - <&iomuxc1_sd1_data3_usdhc_data_usdhc1_data3>, - <&iomuxc1_sd1_data4_usdhc_data_usdhc1_data4>, - <&iomuxc1_sd1_data5_usdhc_data_usdhc1_data5>, - <&iomuxc1_sd1_data6_usdhc_data_usdhc1_data6>, - <&iomuxc1_sd1_data7_usdhc_data_usdhc1_data7>; + <&iomuxc1_sd1_data0_usdhc_data_usdhc1_data0>, + <&iomuxc1_sd1_data1_usdhc_data_usdhc1_data1>, + <&iomuxc1_sd1_data2_usdhc_data_usdhc1_data2>, + <&iomuxc1_sd1_data3_usdhc_data_usdhc1_data3>, + <&iomuxc1_sd1_data4_usdhc_data_usdhc1_data4>, + <&iomuxc1_sd1_data5_usdhc_data_usdhc1_data5>, + <&iomuxc1_sd1_data6_usdhc_data_usdhc1_data6>, + <&iomuxc1_sd1_data7_usdhc_data_usdhc1_data7>; drive-strength = "x1"; slew-rate = "fast"; input-schmitt-enable; @@ -58,7 +58,7 @@ pinmux_usdhc1_100mhz: pinmux_usdhc1_100mhz { group0 { pinmux = <&iomuxc1_sd1_clk_usdhc_clk_usdhc1_clk>, - <&iomuxc1_sd1_strobe_usdhc_strobe_usdhc1_strobe>; + <&iomuxc1_sd1_strobe_usdhc_strobe_usdhc1_strobe>; drive-strength = "x3"; bias-pull-down; slew-rate = "fast"; @@ -67,14 +67,14 @@ group1 { pinmux = <&iomuxc1_sd1_cmd_usdhc_cmd_usdhc1_cmd>, - <&iomuxc1_sd1_data0_usdhc_data_usdhc1_data0>, - <&iomuxc1_sd1_data1_usdhc_data_usdhc1_data1>, - <&iomuxc1_sd1_data2_usdhc_data_usdhc1_data2>, - <&iomuxc1_sd1_data3_usdhc_data_usdhc1_data3>, - <&iomuxc1_sd1_data4_usdhc_data_usdhc1_data4>, - <&iomuxc1_sd1_data5_usdhc_data_usdhc1_data5>, - <&iomuxc1_sd1_data6_usdhc_data_usdhc1_data6>, - <&iomuxc1_sd1_data7_usdhc_data_usdhc1_data7>; + <&iomuxc1_sd1_data0_usdhc_data_usdhc1_data0>, + <&iomuxc1_sd1_data1_usdhc_data_usdhc1_data1>, + <&iomuxc1_sd1_data2_usdhc_data_usdhc1_data2>, + <&iomuxc1_sd1_data3_usdhc_data_usdhc1_data3>, + <&iomuxc1_sd1_data4_usdhc_data_usdhc1_data4>, + <&iomuxc1_sd1_data5_usdhc_data_usdhc1_data5>, + <&iomuxc1_sd1_data6_usdhc_data_usdhc1_data6>, + <&iomuxc1_sd1_data7_usdhc_data_usdhc1_data7>; drive-strength = "x3"; slew-rate = "fast"; input-schmitt-enable; @@ -86,7 +86,7 @@ pinmux_usdhc1_200mhz: pinmux_usdhc1_200mhz { group0 { pinmux = <&iomuxc1_sd1_clk_usdhc_clk_usdhc1_clk>, - <&iomuxc1_sd1_strobe_usdhc_strobe_usdhc1_strobe>; + <&iomuxc1_sd1_strobe_usdhc_strobe_usdhc1_strobe>; drive-strength = "x6"; bias-pull-down; slew-rate = "fast"; @@ -95,14 +95,14 @@ group1 { pinmux = <&iomuxc1_sd1_cmd_usdhc_cmd_usdhc1_cmd>, - <&iomuxc1_sd1_data0_usdhc_data_usdhc1_data0>, - <&iomuxc1_sd1_data1_usdhc_data_usdhc1_data1>, - <&iomuxc1_sd1_data2_usdhc_data_usdhc1_data2>, - <&iomuxc1_sd1_data3_usdhc_data_usdhc1_data3>, - <&iomuxc1_sd1_data4_usdhc_data_usdhc1_data4>, - <&iomuxc1_sd1_data5_usdhc_data_usdhc1_data5>, - <&iomuxc1_sd1_data6_usdhc_data_usdhc1_data6>, - <&iomuxc1_sd1_data7_usdhc_data_usdhc1_data7>; + <&iomuxc1_sd1_data0_usdhc_data_usdhc1_data0>, + <&iomuxc1_sd1_data1_usdhc_data_usdhc1_data1>, + <&iomuxc1_sd1_data2_usdhc_data_usdhc1_data2>, + <&iomuxc1_sd1_data3_usdhc_data_usdhc1_data3>, + <&iomuxc1_sd1_data4_usdhc_data_usdhc1_data4>, + <&iomuxc1_sd1_data5_usdhc_data_usdhc1_data5>, + <&iomuxc1_sd1_data6_usdhc_data_usdhc1_data6>, + <&iomuxc1_sd1_data7_usdhc_data_usdhc1_data7>; drive-strength = "x6"; slew-rate = "fast"; input-schmitt-enable; @@ -122,10 +122,10 @@ group1 { pinmux = <&iomuxc1_sd2_cmd_usdhc_cmd_usdhc2_cmd>, - <&iomuxc1_sd2_data0_usdhc_data_usdhc2_data0>, - <&iomuxc1_sd2_data1_usdhc_data_usdhc2_data1>, - <&iomuxc1_sd2_data2_usdhc_data_usdhc2_data2>, - <&iomuxc1_sd2_data3_usdhc_data_usdhc2_data3>; + <&iomuxc1_sd2_data0_usdhc_data_usdhc2_data0>, + <&iomuxc1_sd2_data1_usdhc_data_usdhc2_data1>, + <&iomuxc1_sd2_data2_usdhc_data_usdhc2_data2>, + <&iomuxc1_sd2_data3_usdhc_data_usdhc2_data3>; drive-strength = "x1"; slew-rate = "fast"; input-schmitt-enable; @@ -141,7 +141,7 @@ group3 { pinmux = <&iomuxc1_sd2_cd_b_gpio_io_gpio3_io0>, - <&iomuxc1_sd2_reset_b_gpio_io_gpio3_io7>; + <&iomuxc1_sd2_reset_b_gpio_io_gpio3_io7>; drive-strength = "x4"; slew-rate = "slightly_fast"; bias-pull-up; @@ -159,10 +159,10 @@ group1 { pinmux = <&iomuxc1_sd2_cmd_usdhc_cmd_usdhc2_cmd>, - <&iomuxc1_sd2_data0_usdhc_data_usdhc2_data0>, - <&iomuxc1_sd2_data1_usdhc_data_usdhc2_data1>, - <&iomuxc1_sd2_data2_usdhc_data_usdhc2_data2>, - <&iomuxc1_sd2_data3_usdhc_data_usdhc2_data3>; + <&iomuxc1_sd2_data0_usdhc_data_usdhc2_data0>, + <&iomuxc1_sd2_data1_usdhc_data_usdhc2_data1>, + <&iomuxc1_sd2_data2_usdhc_data_usdhc2_data2>, + <&iomuxc1_sd2_data3_usdhc_data_usdhc2_data3>; drive-strength = "x3"; slew-rate = "fast"; input-schmitt-enable; @@ -178,7 +178,7 @@ group3 { pinmux = <&iomuxc1_sd2_cd_b_gpio_io_gpio3_io0>, - <&iomuxc1_sd2_reset_b_gpio_io_gpio3_io7>; + <&iomuxc1_sd2_reset_b_gpio_io_gpio3_io7>; drive-strength = "x4"; slew-rate = "slightly_fast"; bias-pull-up; @@ -196,10 +196,10 @@ group1 { pinmux = <&iomuxc1_sd2_cmd_usdhc_cmd_usdhc2_cmd>, - <&iomuxc1_sd2_data0_usdhc_data_usdhc2_data0>, - <&iomuxc1_sd2_data1_usdhc_data_usdhc2_data1>, - <&iomuxc1_sd2_data2_usdhc_data_usdhc2_data2>, - <&iomuxc1_sd2_data3_usdhc_data_usdhc2_data3>; + <&iomuxc1_sd2_data0_usdhc_data_usdhc2_data0>, + <&iomuxc1_sd2_data1_usdhc_data_usdhc2_data1>, + <&iomuxc1_sd2_data2_usdhc_data_usdhc2_data2>, + <&iomuxc1_sd2_data3_usdhc_data_usdhc2_data3>; drive-strength = "x6"; slew-rate = "fast"; input-schmitt-enable; @@ -215,7 +215,7 @@ group3 { pinmux = <&iomuxc1_sd2_cd_b_gpio_io_gpio3_io0>, - <&iomuxc1_sd2_reset_b_gpio_io_gpio3_io7>; + <&iomuxc1_sd2_reset_b_gpio_io_gpio3_io7>; drive-strength = "x4"; slew-rate = "slightly_fast"; bias-pull-up; diff --git a/boards/nxp/frdm_imx91/frdm_imx91_mimx9131.dts b/boards/nxp/frdm_imx91/frdm_imx91_mimx9131.dts index b36f451daf8f6..3a4c8069bfe4a 100644 --- a/boards/nxp/frdm_imx91/frdm_imx91_mimx9131.dts +++ b/boards/nxp/frdm_imx91/frdm_imx91_mimx9131.dts @@ -22,10 +22,9 @@ dram: memory@80000000 { reg = <0x80000000 DT_SIZE_M(1)>; }; - }; -&gpio3{ +&gpio3 { status = "okay"; }; @@ -50,6 +49,7 @@ read-watermark = <0x10>; write-watermark = <0x80>; status = "disabled"; + mmc { compatible = "zephyr,mmc-disk"; disk-name = "SD2"; @@ -70,6 +70,7 @@ read-watermark = <0x10>; write-watermark = <0x80>; status = "disabled"; + sdmmc { compatible = "zephyr,sdmmc-disk"; disk-name = "SD"; From bcc64c0980f0b29b7a710245e59b9b38ebb1533d Mon Sep 17 00:00:00 2001 From: Yanan Yang Date: Fri, 11 Jul 2025 10:52:50 +0900 Subject: [PATCH 02/14] drivers: dma: dma_mcux_edma: enable MMIO mapping Enable MMIO mapping in dma_mcux_edma driver Signed-off-by: Yanan Yang --- drivers/dma/dma_mcux_edma.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/drivers/dma/dma_mcux_edma.c b/drivers/dma/dma_mcux_edma.c index 0f7b85cbc0d20..4ff72ec14c45b 100644 --- a/drivers/dma/dma_mcux_edma.c +++ b/drivers/dma/dma_mcux_edma.c @@ -1,5 +1,5 @@ /* - * Copyright 2020-2024 NXP + * Copyright 2020-2025 NXP * * SPDX-License-Identifier: Apache-2.0 */ @@ -47,7 +47,7 @@ typedef DMA_Type DMAx_Type; #endif struct dma_mcux_edma_config { - DMAx_Type *base; + DEVICE_MMIO_NAMED_ROM(edma_mmio); #if defined(FSL_FEATURE_SOC_DMAMUX_COUNT) && FSL_FEATURE_SOC_DMAMUX_COUNT DMAMUX_Type **dmamux_base; #endif @@ -91,6 +91,7 @@ struct call_back { }; struct dma_mcux_edma_data { + DEVICE_MMIO_NAMED_RAM(edma_mmio); struct dma_context dma_ctx; struct call_back *data_cb; atomic_t *channels_atomic; @@ -99,7 +100,7 @@ struct dma_mcux_edma_data { #define DEV_CFG(dev) \ ((const struct dma_mcux_edma_config *const)dev->config) #define DEV_DATA(dev) ((struct dma_mcux_edma_data *)dev->data) -#define DEV_BASE(dev) ((DMAx_Type *)DEV_CFG(dev)->base) +#define DEV_BASE(dev) ((DMAx_Type *)DEVICE_MMIO_NAMED_GET(dev, edma_mmio)) #define DEV_CHANNEL_DATA(dev, ch) \ ((struct call_back *)(&(DEV_DATA(dev)->data_cb[ch]))) @@ -1013,6 +1014,8 @@ static int dma_mcux_edma_init(const struct device *dev) LOG_DBG("INIT NXP EDMA"); + DEVICE_MMIO_NAMED_MAP(dev, edma_mmio, K_MEM_CACHE_NONE | K_MEM_DIRECT_MAP); + #if defined(FSL_FEATURE_SOC_DMAMUX_COUNT) && FSL_FEATURE_SOC_DMAMUX_COUNT uint8_t i; @@ -1156,7 +1159,7 @@ static int dma_mcux_edma_init(const struct device *dev) static __aligned(DMA_TCD_ALIGN_SIZE) EDMA_TCDPOOL_CACHE_ATTR edma_tcd_t \ dma_tcdpool##n[DT_INST_PROP(n, dma_channels)][CONFIG_DMA_TCD_QUEUE_SIZE];\ static const struct dma_mcux_edma_config dma_config_##n = { \ - .base = (DMAx_Type *)DT_INST_REG_ADDR(n), \ + DEVICE_MMIO_NAMED_ROM_INIT(edma_mmio, DT_DRV_INST(n)), \ DMAMUX_BASE_INIT(n) \ .dma_requests = DT_INST_PROP(n, dma_requests), \ .dma_channels = DT_INST_PROP(n, dma_channels), \ From 74ca8f017baad89ea3cf35dadf3a6fa2309939fd Mon Sep 17 00:00:00 2001 From: Yanan Yang Date: Fri, 11 Jul 2025 17:01:58 +0900 Subject: [PATCH 03/14] drivers: mcux_ccm_rev2: add SAI clock support for i.MX9 platform add SAI clock support for i.MX9 platform Signed-off-by: Yanan Yang Signed-off-by: Jiafei Pan Fix CI failure: LEADING_SPACE: please, no spaces at the start of a line Split code format fixing into a new patch Signed-off-by: Hou Zhiqiang --- .../clock_control_mcux_ccm_rev2.c | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/drivers/clock_control/clock_control_mcux_ccm_rev2.c b/drivers/clock_control/clock_control_mcux_ccm_rev2.c index d1e13affecc49..fa616bade35d0 100644 --- a/drivers/clock_control/clock_control_mcux_ccm_rev2.c +++ b/drivers/clock_control/clock_control_mcux_ccm_rev2.c @@ -42,6 +42,13 @@ static int mcux_ccm_on(const struct device *dev, case IMX_CCM_ENET1G_CLK: CLOCK_EnableClock(ENET1G_CLOCK); return 0; +#endif +#ifdef CONFIG_I2S_MCUX_SAI +#if defined(CONFIG_SOC_MIMX9352) || defined(CONFIG_SOC_MIMX9131) || defined(CONFIG_SOC_MIMX9111) + case IMX_CCM_SAI1_CLK: + CLOCK_EnableClock(kCLOCK_Sai1 + instance); + return 0; +#endif #endif default: (void)instance; @@ -127,6 +134,7 @@ static int mcux_ccm_get_subsys_rate(const struct device *dev, #endif #ifdef CONFIG_DMA_MCUX_EDMA_V4 +#if !defined(CONFIG_SOC_MIMX9352) && !defined(CONFIG_SOC_MIMX9131) && !defined(CONFIG_SOC_MIMX9111) case IMX_CCM_EDMA3_CLK: clock_root = kCLOCK_Root_M33; break; @@ -134,6 +142,7 @@ static int mcux_ccm_get_subsys_rate(const struct device *dev, clock_root = kCLOCK_Root_Wakeup_Axi; break; #endif +#endif #ifdef CONFIG_PWM_MCUX #if defined(CONFIG_SOC_SERIES_IMXRT118X) @@ -160,6 +169,11 @@ static int mcux_ccm_get_subsys_rate(const struct device *dev, #endif #ifdef CONFIG_I2S_MCUX_SAI +#if (defined(CONFIG_SOC_MIMX9352) || defined(CONFIG_SOC_MIMX9131) || defined(CONFIG_SOC_MIMX9111)) + case IMX_CCM_SAI1_CLK: + clock_root = kCLOCK_Root_Sai1 + instance; + break; +#else case IMX_CCM_SAI1_CLK: clock_root = kCLOCK_Root_Sai1; break; @@ -173,6 +187,7 @@ static int mcux_ccm_get_subsys_rate(const struct device *dev, clock_root = kCLOCK_Root_Sai4; break; #endif +#endif #ifdef CONFIG_ETH_NXP_ENET case IMX_CCM_ENET_CLK: @@ -405,6 +420,40 @@ static int CCM_SET_FUNC_ATTR mcux_ccm_set_subsys_rate(const struct device *dev, case IMX_CCM_CAM_PIX_CLK: return common_clock_set_freq(clock_name, (uint32_t)clock_rate); #endif + +#if (defined(CONFIG_SOC_MIMX9352) || defined(CONFIG_SOC_MIMX9131) || \ + defined(CONFIG_SOC_MIMX9111)) && defined(CONFIG_I2S_MCUX_SAI) + case IMX_CCM_SAI1_CLK: + case IMX_CCM_SAI2_CLK: + case IMX_CCM_SAI3_CLK: + uint32_t clock_root, instance; + clock_root_config_t saiClkCfg; + fracn_pll_init_t g_audioPllCfg; + + instance = (clock_name & IMX_CCM_INSTANCE_MASK); + clock_root = kCLOCK_Root_Sai1 + instance; + + /* Fixed AUDIO_PLL's frequency at 393216000 Hz */ +#define AUDIO_PLL_CLK_FREQ 393216000 + g_clockSourceFreq[kCLOCK_AudioPll1Out] = AUDIO_PLL_CLK_FREQ; + g_clockSourceFreq[kCLOCK_AudioPll1] = AUDIO_PLL_CLK_FREQ; + g_audioPllCfg.rdiv = 1; + g_audioPllCfg.mfi = 163; + g_audioPllCfg.mfn = 84; + g_audioPllCfg.mfd = 100; + g_audioPllCfg.odiv = 10; + + CLOCK_PllInit(AUDIOPLL, &g_audioPllCfg); + + saiClkCfg.clockOff = false; + saiClkCfg.mux = 1; + saiClkCfg.div = (AUDIO_PLL_CLK_FREQ + (clock_rate - 1)) / clock_rate; + + CLOCK_SetRootClock(clock_root, &saiClkCfg); + + return 0; +#endif + default: /* Silence unused variable warning */ ARG_UNUSED(clock_rate); From d1668d84bb911d2990695e711f9657f006c9227d Mon Sep 17 00:00:00 2001 From: Hou Zhiqiang Date: Wed, 22 Oct 2025 17:08:15 +0800 Subject: [PATCH 04/14] drivers: mcux_ccm_rev2: fix code format Remove extra space between the '=' and rvalue. Signed-off-by: Yanan Yang Signed-off-by: Hou Zhiqiang --- drivers/clock_control/clock_control_mcux_ccm_rev2.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/drivers/clock_control/clock_control_mcux_ccm_rev2.c b/drivers/clock_control/clock_control_mcux_ccm_rev2.c index fa616bade35d0..08267d2283c2a 100644 --- a/drivers/clock_control/clock_control_mcux_ccm_rev2.c +++ b/drivers/clock_control/clock_control_mcux_ccm_rev2.c @@ -175,16 +175,16 @@ static int mcux_ccm_get_subsys_rate(const struct device *dev, break; #else case IMX_CCM_SAI1_CLK: - clock_root = kCLOCK_Root_Sai1; + clock_root = kCLOCK_Root_Sai1; break; case IMX_CCM_SAI2_CLK: - clock_root = kCLOCK_Root_Sai2; + clock_root = kCLOCK_Root_Sai2; break; case IMX_CCM_SAI3_CLK: - clock_root = kCLOCK_Root_Sai3; + clock_root = kCLOCK_Root_Sai3; break; case IMX_CCM_SAI4_CLK: - clock_root = kCLOCK_Root_Sai4; + clock_root = kCLOCK_Root_Sai4; break; #endif #endif From 0286c8005ff09952e3c2b9bf8e27ba2247afe42b Mon Sep 17 00:00:00 2001 From: Hou Zhiqiang Date: Wed, 22 Oct 2025 17:43:12 +0800 Subject: [PATCH 05/14] drivers: i2s: mcux_sai: correct DMA burst length The burst length should be initialized with 'word_size_bits'. Signed-off-by: Yanan Yang Signed-off-by: Hou Zhiqiang --- drivers/i2s/i2s_mcux_sai.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/drivers/i2s/i2s_mcux_sai.c b/drivers/i2s/i2s_mcux_sai.c index 6b90c50a06da8..9bf93509849e9 100644 --- a/drivers/i2s/i2s_mcux_sai.c +++ b/drivers/i2s/i2s_mcux_sai.c @@ -1,5 +1,5 @@ /* - * Copyright 2021,2023-2025 NXP Semiconductor INC. + * Copyright 2021,2023-2025 NXP * All rights reserved. * * SPDX-License-Identifier: Apache-2.0 @@ -627,8 +627,8 @@ static int i2s_mcux_config(const struct device *dev, enum i2s_dir dir, /*set up dma settings*/ dev_data->tx.dma_cfg.source_data_size = word_size_bytes; dev_data->tx.dma_cfg.dest_data_size = word_size_bytes; - dev_data->tx.dma_cfg.source_burst_length = word_size_bytes; - dev_data->tx.dma_cfg.dest_burst_length = word_size_bytes; + dev_data->tx.dma_cfg.source_burst_length = word_size_bits; + dev_data->tx.dma_cfg.dest_burst_length = word_size_bits; dev_data->tx.dma_cfg.user_data = (void *)dev; dev_data->tx.state = I2S_STATE_READY; } else { @@ -653,8 +653,8 @@ static int i2s_mcux_config(const struct device *dev, enum i2s_dir dir, /*set up dma settings*/ dev_data->rx.dma_cfg.source_data_size = word_size_bytes; dev_data->rx.dma_cfg.dest_data_size = word_size_bytes; - dev_data->rx.dma_cfg.source_burst_length = word_size_bytes; - dev_data->rx.dma_cfg.dest_burst_length = word_size_bytes; + dev_data->rx.dma_cfg.source_burst_length = word_size_bits; + dev_data->rx.dma_cfg.dest_burst_length = word_size_bits; dev_data->rx.dma_cfg.user_data = (void *)dev; dev_data->rx.state = I2S_STATE_READY; } From d4ac17d98360171178ff5576b0402e1a17e9ab55 Mon Sep 17 00:00:00 2001 From: Yanan Yang Date: Fri, 11 Jul 2025 17:05:27 +0900 Subject: [PATCH 06/14] drivers: i2s: i2s_mcux_sai: use device model MMIO mapping Change to use device model MMIO mapping APIs. Signed-off-by: Yanan Yang Signed-off-by: Jiafei Pan Fix CI failures: Clean unused code Signed-off-by: Hou Zhiqiang --- drivers/i2s/i2s_mcux_sai.c | 72 +++++++++++++++++++++----------------- 1 file changed, 39 insertions(+), 33 deletions(-) diff --git a/drivers/i2s/i2s_mcux_sai.c b/drivers/i2s/i2s_mcux_sai.c index 9bf93509849e9..4e165704c9c5d 100644 --- a/drivers/i2s/i2s_mcux_sai.c +++ b/drivers/i2s/i2s_mcux_sai.c @@ -85,7 +85,7 @@ struct stream { }; struct i2s_mcux_config { - I2S_Type *base; + DEVICE_MMIO_NAMED_ROM(sai_mmio); uint32_t clk_src; uint32_t clk_pre_div; uint32_t clk_src_div; @@ -109,6 +109,7 @@ struct i2s_mcux_config { /* Device run time data */ struct i2s_dev_data { + DEVICE_MMIO_NAMED_RAM(sai_mmio); const struct device *dev_dma; struct stream tx; void *tx_in_msgs[CONFIG_I2S_TX_BLOCK_COUNT]; @@ -118,6 +119,14 @@ struct i2s_dev_data { void *rx_out_msgs[CONFIG_I2S_RX_BLOCK_COUNT]; }; +#define DEV_CFG(_dev) ((const struct i2s_mcux_config *)(_dev)->config) +#define DEV_DATA(_dev) ((struct i2s_dev_data *)(_dev)->data) + +static I2S_Type *get_base(const struct device *dev) +{ + return (I2S_Type *)DEVICE_MMIO_NAMED_GET(dev, sai_mmio); +} + static void i2s_purge_stream_buffers(struct stream *strm, struct k_mem_slab *mem_slab, bool in_drop, bool out_drop) { @@ -138,33 +147,33 @@ static void i2s_purge_stream_buffers(struct stream *strm, struct k_mem_slab *mem static void i2s_tx_stream_disable(const struct device *dev, bool drop) { + I2S_Type *base = get_base(dev); struct i2s_dev_data *dev_data = dev->data; struct stream *strm = &dev_data->tx; const struct device *dev_dma = dev_data->dev_dma; - const struct i2s_mcux_config *dev_cfg = dev->config; LOG_DBG("Stopping DMA channel %u for TX stream", strm->dma_channel); /* Disable FIFO DMA request */ - SAI_TxEnableDMA(dev_cfg->base, kSAI_FIFORequestDMAEnable, false); + SAI_TxEnableDMA(base, kSAI_FIFORequestDMAEnable, false); dma_stop(dev_dma, strm->dma_channel); /* wait for TX FIFO to drain before disabling */ - while ((dev_cfg->base->TCSR & I2S_TCSR_FWF_MASK) == 0) { + while ((base->TCSR & I2S_TCSR_FWF_MASK) == 0) { ; } /* Disable the channel FIFO */ - SAI_TxSetChannelFIFOMask(dev_cfg->base, 0); + SAI_TxSetChannelFIFOMask(base, 0); /* Disable Tx */ - SAI_TxEnable(dev_cfg->base, false); + SAI_TxEnable(base, false); /* If Tx is disabled, reset the FIFO pointer, clear error flags */ - if ((dev_cfg->base->TCSR & I2S_TCSR_TE_MASK) == 0UL) { - dev_cfg->base->TCSR |= (I2S_TCSR_FR_MASK | I2S_TCSR_SR_MASK); - dev_cfg->base->TCSR &= ~I2S_TCSR_SR_MASK; + if ((base->TCSR & I2S_TCSR_TE_MASK) == 0UL) { + base->TCSR |= (I2S_TCSR_FR_MASK | I2S_TCSR_SR_MASK); + base->TCSR &= ~I2S_TCSR_SR_MASK; } /* purge buffers queued in the stream */ @@ -173,30 +182,30 @@ static void i2s_tx_stream_disable(const struct device *dev, bool drop) static void i2s_rx_stream_disable(const struct device *dev, bool in_drop, bool out_drop) { + I2S_Type *base = get_base(dev); struct i2s_dev_data *dev_data = dev->data; struct stream *strm = &dev_data->rx; const struct device *dev_dma = dev_data->dev_dma; - const struct i2s_mcux_config *dev_cfg = dev->config; LOG_DBG("Stopping RX stream & DMA channel %u", strm->dma_channel); dma_stop(dev_dma, strm->dma_channel); /* Disable the channel FIFO */ - SAI_RxSetChannelFIFOMask(dev_cfg->base, 0); + SAI_RxSetChannelFIFOMask(base, 0); /* Disable DMA enable bit */ - SAI_RxEnableDMA(dev_cfg->base, kSAI_FIFORequestDMAEnable, false); + SAI_RxEnableDMA(base, kSAI_FIFORequestDMAEnable, false); /* Disable Rx */ - SAI_RxEnable(dev_cfg->base, false); + SAI_RxEnable(base, false); /* wait for Receiver to disable */ - while (dev_cfg->base->RCSR & I2S_RCSR_RE_MASK) { + while (base->RCSR & I2S_RCSR_RE_MASK) { ; } /* reset the FIFO pointer and clear error flags */ - dev_cfg->base->RCSR |= (I2S_RCSR_FR_MASK | I2S_RCSR_SR_MASK); - dev_cfg->base->RCSR &= ~I2S_RCSR_SR_MASK; + base->RCSR |= (I2S_RCSR_FR_MASK | I2S_RCSR_SR_MASK); + base->RCSR &= ~I2S_RCSR_SR_MASK; /* purge buffers queued in the stream */ i2s_purge_stream_buffers(strm, dev_data->rx.cfg.mem_slab, in_drop, out_drop); @@ -205,8 +214,7 @@ static void i2s_rx_stream_disable(const struct device *dev, bool in_drop, bool o static int i2s_tx_reload_multiple_dma_blocks(const struct device *dev, uint8_t *blocks_queued) { struct i2s_dev_data *dev_data = dev->data; - const struct i2s_mcux_config *dev_cfg = dev->config; - I2S_Type *base = (I2S_Type *)dev_cfg->base; + I2S_Type *base = get_base(dev); struct stream *strm = &dev_data->tx; void *buffer = NULL; int ret = 0; @@ -318,8 +326,7 @@ static void i2s_dma_tx_callback(const struct device *dma_dev, void *arg, uint32_ * TX (This will disable bit clock to avoid dummy bits * received in RX side. */ - const struct i2s_mcux_config *dev_cfg = dev->config; - I2S_Type *base = (I2S_Type *)dev_cfg->base; + I2S_Type *base = get_base(dev); SAI_TxEnable(base, false); LOG_WRN("TX is paused."); @@ -343,8 +350,7 @@ static void i2s_dma_rx_callback(const struct device *dma_dev, void *arg, uint32_ int status) { struct device *dev = (struct device *)arg; - const struct i2s_mcux_config *dev_cfg = dev->config; - I2S_Type *base = (I2S_Type *)dev_cfg->base; + I2S_Type *base = get_base(dev); struct i2s_dev_data *dev_data = dev->data; struct stream *strm = &dev_data->rx; void *buffer; @@ -446,7 +452,7 @@ static int i2s_mcux_config(const struct device *dev, enum i2s_dir dir, const struct i2s_config *i2s_cfg) { const struct i2s_mcux_config *dev_cfg = dev->config; - I2S_Type *base = (I2S_Type *)dev_cfg->base; + I2S_Type *base = get_base(dev); struct i2s_dev_data *dev_data = dev->data; enum i2s_state *tx_state = &(dev_data->tx.state); enum i2s_state *rx_state = &(dev_data->rx.state); @@ -689,7 +695,7 @@ static int i2s_tx_stream_start(const struct device *dev) struct stream *strm = &dev_data->tx; const struct device *dev_dma = dev_data->dev_dma; const struct i2s_mcux_config *dev_cfg = dev->config; - I2S_Type *base = (I2S_Type *)dev_cfg->base; + I2S_Type *base = get_base(dev); /* retrieve buffer from input queue */ ret = k_msgq_get(&strm->in_queue, &buffer, K_NO_WAIT); @@ -764,7 +770,7 @@ static int i2s_rx_stream_start(const struct device *dev) struct stream *strm = &dev_data->rx; const struct device *dev_dma = dev_data->dev_dma; const struct i2s_mcux_config *dev_cfg = dev->config; - I2S_Type *base = (I2S_Type *)dev_cfg->base; + I2S_Type *base = get_base(dev); uint8_t num_of_bufs; num_of_bufs = k_mem_slab_num_free_get(strm->cfg.mem_slab); @@ -1000,8 +1006,7 @@ static int i2s_mcux_write(const struct device *dev, void *mem_block, size_t size if (strm->state == I2S_STATE_RUNNING && strm->free_tx_dma_blocks >= MAX_TX_DMA_BLOCKS) { uint8_t blocks_queued = 0; - const struct i2s_mcux_config *dev_cfg = dev->config; - I2S_Type *base = (I2S_Type *)dev_cfg->base; + I2S_Type *base = get_base(dev); /* As DMA has been stopped because reloading failure in TX callback, * here is a good place to reload it and resume TX. */ @@ -1020,8 +1025,7 @@ static int i2s_mcux_write(const struct device *dev, void *mem_block, size_t size static void sai_driver_irq(const struct device *dev) { - const struct i2s_mcux_config *dev_cfg = dev->config; - I2S_Type *base = (I2S_Type *)dev_cfg->base; + I2S_Type *base = get_base(dev); if ((base->TCSR & I2S_TCSR_FEF_MASK) == I2S_TCSR_FEF_MASK) { /* Clear FIFO error flag to continue transfer */ @@ -1048,8 +1052,7 @@ static void sai_driver_irq(const struct device *dev) static void i2s_mcux_isr(void *arg) { struct device *dev = (struct device *)arg; - const struct i2s_mcux_config *dev_cfg = dev->config; - I2S_Type *base = (I2S_Type *)dev_cfg->base; + I2S_Type *base = get_base(dev); if ((base->RCSR & I2S_TCSR_FEF_MASK) == I2S_TCSR_FEF_MASK) { sai_driver_irq(dev); @@ -1102,7 +1105,7 @@ static void audio_clock_settings(const struct device *dev) static int i2s_mcux_initialize(const struct device *dev) { const struct i2s_mcux_config *dev_cfg = dev->config; - I2S_Type *base = (I2S_Type *)dev_cfg->base; + I2S_Type *base; struct i2s_dev_data *dev_data = dev->data; uint32_t mclk; int err; @@ -1112,6 +1115,9 @@ static int i2s_mcux_initialize(const struct device *dev) return -ENODEV; } + DEVICE_MMIO_NAMED_MAP(dev, sai_mmio, K_MEM_CACHE_NONE | K_MEM_DIRECT_MAP); + base = get_base(dev); + /* Initialize the buffer queues */ k_msgq_init(&dev_data->tx.in_queue, (char *)dev_data->tx_in_msgs, sizeof(void *), CONFIG_I2S_TX_BLOCK_COUNT); @@ -1184,7 +1190,7 @@ static DEVICE_API(i2s, i2s_mcux_driver_api) = { PINCTRL_DT_INST_DEFINE(i2s_id); \ \ static const struct i2s_mcux_config i2s_##i2s_id##_config = { \ - .base = (I2S_Type *)DT_INST_REG_ADDR(i2s_id), \ + DEVICE_MMIO_NAMED_ROM_INIT(sai_mmio, DT_DRV_INST(i2s_id)), \ .clk_src = DT_INST_PROP_OR(i2s_id, clock_mux, 0), \ .clk_pre_div = DT_INST_PROP_OR(i2s_id, pre_div, 0), \ .clk_src_div = DT_INST_PROP_OR(i2s_id, podf, 0), \ From c79e92abbf72c0d76a2782f873d6c6b716eda92d Mon Sep 17 00:00:00 2001 From: Hou Zhiqiang Date: Wed, 22 Oct 2025 20:02:31 +0800 Subject: [PATCH 07/14] drivers: i2s: mcux_sai: fix the type of var num_of_bufs Correct the type of num_of_bufs to uint32_t. Signed-off-by: Hou Zhiqiang --- drivers/i2s/i2s_mcux_sai.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/i2s/i2s_mcux_sai.c b/drivers/i2s/i2s_mcux_sai.c index 4e165704c9c5d..3189b4a074aa9 100644 --- a/drivers/i2s/i2s_mcux_sai.c +++ b/drivers/i2s/i2s_mcux_sai.c @@ -771,7 +771,7 @@ static int i2s_rx_stream_start(const struct device *dev) const struct device *dev_dma = dev_data->dev_dma; const struct i2s_mcux_config *dev_cfg = dev->config; I2S_Type *base = get_base(dev); - uint8_t num_of_bufs; + uint32_t num_of_bufs; num_of_bufs = k_mem_slab_num_free_get(strm->cfg.mem_slab); From 325852ab2ad3cc4215b84343fda3714a1f15223a Mon Sep 17 00:00:00 2001 From: Hou Zhiqiang Date: Wed, 22 Oct 2025 20:11:02 +0800 Subject: [PATCH 08/14] drivers: i2s: mcux_sai: set the Bit Clock Swap on the feature enabled When the platform has the Bit Clock Swap feature, enable it. Signed-off-by: Hou Zhiqiang --- drivers/i2s/i2s_mcux_sai.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/i2s/i2s_mcux_sai.c b/drivers/i2s/i2s_mcux_sai.c index 3189b4a074aa9..42617d8316679 100644 --- a/drivers/i2s/i2s_mcux_sai.c +++ b/drivers/i2s/i2s_mcux_sai.c @@ -522,7 +522,11 @@ static int i2s_mcux_config(const struct device *dev, enum i2s_dir dir, #endif config.frameSync.frameSyncPolarity = kSAI_PolarityActiveLow; +#if defined(FSL_FEATURE_SAI_HAS_BIT_CLOCK_SWAP) && FSL_FEATURE_SAI_HAS_BIT_CLOCK_SWAP + config.bitClock.bclkSrcSwap = true; +#else config.bitClock.bclkSrcSwap = false; +#endif /* format */ switch (i2s_cfg->format & I2S_FMT_DATA_FORMAT_MASK) { case I2S_FMT_DATA_FORMAT_I2S: From 809c28dffb2f6c9ffcb7bc5fc355577b9a2cf683 Mon Sep 17 00:00:00 2001 From: Hou Zhiqiang Date: Wed, 22 Oct 2025 20:24:01 +0800 Subject: [PATCH 09/14] drivers: i2s: i2s_mcux_sai: add i.MX9 platform support Rework the driver to support i.MX9 platforms. Signed-off-by: Hou Zhiqiang Signed-off-by: Yanan Yang Signed-off-by: Jiafei Pan --- drivers/i2s/i2s_mcux_sai.c | 38 +++++++++++++++++++++++++++++++++----- 1 file changed, 33 insertions(+), 5 deletions(-) diff --git a/drivers/i2s/i2s_mcux_sai.c b/drivers/i2s/i2s_mcux_sai.c index 42617d8316679..813babf176d5f 100644 --- a/drivers/i2s/i2s_mcux_sai.c +++ b/drivers/i2s/i2s_mcux_sai.c @@ -21,7 +21,10 @@ #include #include #include +#ifdef CONFIG_CLOCK_CONTROL_MCUX_CCM #include +#endif + #include #include #include @@ -448,6 +451,24 @@ static void get_mclk_rate(const struct device *dev, uint32_t *mclk) *mclk = rate; } +#ifndef CONFIG_I2S_HAS_PLL_SETTING +static void set_mclk_rate(const struct device *dev, uint32_t rate) +{ + const struct i2s_mcux_config *dev_cfg = dev->config; + const struct device *ccm_dev = dev_cfg->ccm_dev; + clock_control_subsys_t clk_sub_sys = dev_cfg->clk_sub_sys; + + if (device_is_ready(ccm_dev)) { + clock_control_set_rate(ccm_dev, clk_sub_sys, + (clock_control_subsys_rate_t)rate); + clock_control_on(ccm_dev, clk_sub_sys); + } else { + LOG_ERR("CCM driver is not installed"); + return; + } +} +#endif + static int i2s_mcux_config(const struct device *dev, enum i2s_dir dir, const struct i2s_config *i2s_cfg) { @@ -498,7 +519,9 @@ static int i2s_mcux_config(const struct device *dev, enum i2s_dir dir, memset(&config, 0, sizeof(config)); - enable_mclk_direction(dev, dev_cfg->mclk_output); + if (dev_cfg->mclk_control_base) { + enable_mclk_direction(dev, dev_cfg->mclk_output); + } get_mclk_rate(dev, &mclk); LOG_DBG("mclk is %d", mclk); @@ -1103,6 +1126,8 @@ static void audio_clock_settings(const struct device *dev) #endif /* CONFIG_SOC_SERIES */ CLOCK_InitAudioPll(&audioPllConfig); +#else + set_mclk_rate(dev, 12288000); #endif } @@ -1144,7 +1169,9 @@ static int i2s_mcux_initialize(const struct device *dev) /*clock configuration*/ audio_clock_settings(dev); - enable_mclk_direction(dev, dev_cfg->mclk_output); + if (dev_cfg->mclk_control_base) { + enable_mclk_direction(dev, dev_cfg->mclk_output); + } SAI_Init(base); @@ -1203,9 +1230,10 @@ static DEVICE_API(i2s, i2s_mcux_driver_api) = { .pll_pd = DT_PHA_BY_NAME_OR(DT_DRV_INST(i2s_id), pll_clocks, pd, value, 0), \ .pll_num = DT_PHA_BY_NAME_OR(DT_DRV_INST(i2s_id), pll_clocks, num, value, 0), \ .pll_den = DT_PHA_BY_NAME_OR(DT_DRV_INST(i2s_id), pll_clocks, den, value, 0), \ - .mclk_control_base = DT_REG_ADDR(DT_PHANDLE(DT_DRV_INST(i2s_id), pinmuxes)), \ - .mclk_pin_mask = DT_PHA_BY_IDX(DT_DRV_INST(i2s_id), pinmuxes, 0, mask), \ - .mclk_pin_offset = DT_PHA_BY_IDX(DT_DRV_INST(i2s_id), pinmuxes, 0, offset), \ + .mclk_control_base = COND_CODE_1(DT_NODE_HAS_PROP(DT_DRV_INST(i2s_id), pinmuxes), \ + (DT_REG_ADDR(DT_PHANDLE(DT_DRV_INST(i2s_id), pinmuxes))), (0)), \ + .mclk_pin_mask = DT_PHA_BY_IDX_OR(DT_DRV_INST(i2s_id), pinmuxes, 0, mask, 0), \ + .mclk_pin_offset = DT_PHA_BY_IDX_OR(DT_DRV_INST(i2s_id), pinmuxes, 0, offset, 0), \ .mclk_output = DT_INST_PROP_OR(i2s_id, mclk_output, 0), \ .clk_sub_sys = \ (clock_control_subsys_t)DT_INST_CLOCKS_CELL_BY_IDX(i2s_id, 0, name), \ From 5a645e9ca52b5d4abd480496ed1d6a4004c3cf4c Mon Sep 17 00:00:00 2001 From: Yanan Yang Date: Wed, 16 Jul 2025 14:50:41 +0900 Subject: [PATCH 10/14] dts: arm64: imx93: add sai3_2 and edma4_2 node for i2s_mcux_sai driver Add sai3_2 and edma4_2 dts node for use with i2s_mcux_sai driver. Signed-off-by: Yanan Yang Fix indent format issue. Signed-off-by: Hou Zhiqiang --- dts/arm64/nxp/nxp_mimx93_a55.dtsi | 34 +++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/dts/arm64/nxp/nxp_mimx93_a55.dtsi b/dts/arm64/nxp/nxp_mimx93_a55.dtsi index 84a6c00fcae70..31305b51f2032 100644 --- a/dts/arm64/nxp/nxp_mimx93_a55.dtsi +++ b/dts/arm64/nxp/nxp_mimx93_a55.dtsi @@ -446,6 +446,22 @@ status = "disabled"; }; + edma4_2: edma@42000000 { + compatible = "nxp,mcux-edma"; + nxp,version = <4>; + no-error-irq; + dma-requests = <159>; + reg = <0x42000000 0x400000>; + dma-channels = <4>; + interrupt-parent = <&gic>; + interrupts = , + , + , + ; + #dma-cells = <2>; + status = "disabled"; + }; + sai3: dai@42660000 { compatible = "nxp,dai-sai"; reg = <0x42660000 DT_SIZE_K(64)>; @@ -460,6 +476,24 @@ status = "disabled"; }; + sai3_2: sai@42660000 { + compatible = "nxp,mcux-i2s"; + #address-cells = <1>; + #size-cells = <0>; + reg = <0x42660000 DT_SIZE_K(64)>; + clocks = <&ccm IMX_CCM_SAI3_CLK 0x0 0x0>; + clock-names = "mclk1"; + interrupt-parent = <&gic>; + interrupts = ; + dma-names = "tx", "rx"; + dmas = <&edma4_2 2 60>, <&edma4_2 3 61>; + nxp,tx-channel = <1>; + nxp,tx-dma-channel = <2>; + nxp,rx-dma-channel = <3>; + nxp,rx-sync-mode; + status = "disabled"; + }; + usdhc1: usdhc@42850000 { compatible = "nxp,imx-usdhc"; reg = <0x42850000 0x10000>; From a21db4c0a02d62b41e21ef5d894c770e2e55bbf3 Mon Sep 17 00:00:00 2001 From: Yanan Yang Date: Wed, 16 Jul 2025 14:54:31 +0900 Subject: [PATCH 11/14] boards: imx93_evk: add sai3_2 and edma4_2 node for i2s_mcux_sai driver add sai3_2 and edma4_2 dts node for use with i2s_mcux_sai driver Signed-off-by: Yanan Yang --- boards/nxp/imx93_evk/imx93_evk-pinctrl.dtsi | 13 +++++++++++++ boards/nxp/imx93_evk/imx93_evk_mimx9352_a55.dts | 10 ++++++++++ 2 files changed, 23 insertions(+) diff --git a/boards/nxp/imx93_evk/imx93_evk-pinctrl.dtsi b/boards/nxp/imx93_evk/imx93_evk-pinctrl.dtsi index 263e8c8017c1b..5b15bbbe9b1f0 100644 --- a/boards/nxp/imx93_evk/imx93_evk-pinctrl.dtsi +++ b/boards/nxp/imx93_evk/imx93_evk-pinctrl.dtsi @@ -71,6 +71,19 @@ }; }; + sai3_default: sai3_default { + group0 { + pinmux = <&iomuxc1_gpio_io16_sai_tx_bclk_sai3_tx_bclk>, + <&iomuxc1_gpio_io17_sai_mclk_sai3_mclk>, + <&iomuxc1_gpio_io19_sai_tx_data_sai3_tx_data00>, + <&iomuxc1_gpio_io20_sai_rx_data_sai3_rx_data00>, + <&iomuxc1_gpio_io26_sai_tx_sync_sai3_tx_sync>; + bias-pull-up; + slew-rate = "slightly_fast"; + drive-strength = "x4"; + }; + }; + spi3_default: spi3_default { group0 { pinmux = <&iomuxc1_gpio_io07_lpspi_pcs_lpspi3_pcs1>, diff --git a/boards/nxp/imx93_evk/imx93_evk_mimx9352_a55.dts b/boards/nxp/imx93_evk/imx93_evk_mimx9352_a55.dts index 64bf50ebd4a44..8c0e5389dd326 100644 --- a/boards/nxp/imx93_evk/imx93_evk_mimx9352_a55.dts +++ b/boards/nxp/imx93_evk/imx93_evk_mimx9352_a55.dts @@ -185,6 +185,10 @@ pinctrl-names = "default"; }; +&edma4_2 { + status = "disabled"; +}; + &gpio1 { status = "okay"; }; @@ -208,6 +212,12 @@ status = "okay"; }; +&sai3_2 { + status = "disabled"; + pinctrl-0 = <&sai3_default>; + pinctrl-names = "default"; +}; + &usdhc1 { pinctrl-0 = <&pinmux_usdhc1>; pinctrl-1 = <&pinmux_usdhc1_100mhz>; From 18b5dd385922301bd3de960e20cea44d2acadbe9 Mon Sep 17 00:00:00 2001 From: Yanan Yang Date: Wed, 16 Jul 2025 15:06:46 +0900 Subject: [PATCH 12/14] boards: frdm_imx93: add sai3_2 and edma4_2 node for i2s_mcux_sai driver add sai3_2 and edma4_2 dts node for use with i2s_mcux_sai driver Signed-off-by: Yanan Yang --- boards/nxp/frdm_imx93/frdm_imx93-pinctrl.dtsi | 15 +++++++++++++++ boards/nxp/frdm_imx93/frdm_imx93_mimx9352_a55.dts | 6 ++++++ 2 files changed, 21 insertions(+) diff --git a/boards/nxp/frdm_imx93/frdm_imx93-pinctrl.dtsi b/boards/nxp/frdm_imx93/frdm_imx93-pinctrl.dtsi index 3279ad3ebe1f1..67ae08e274c8d 100644 --- a/boards/nxp/frdm_imx93/frdm_imx93-pinctrl.dtsi +++ b/boards/nxp/frdm_imx93/frdm_imx93-pinctrl.dtsi @@ -71,6 +71,21 @@ }; }; + sai3_default: sai3_default { + group0 { + pinmux = <&iomuxc1_gpio_io16_sai_tx_bclk_sai3_tx_bclk>, + <&iomuxc1_gpio_io17_sai_mclk_sai3_mclk>, + <&iomuxc1_gpio_io18_sai_rx_bclk_sai3_rx_bclk>, + <&iomuxc1_gpio_io19_sai_rx_sync_sai3_rx_sync>, + <&iomuxc1_gpio_io20_sai_rx_data_sai3_rx_data00>, + <&iomuxc1_gpio_io21_sai_tx_data_sai3_tx_data00>, + <&iomuxc1_gpio_io26_sai_tx_sync_sai3_tx_sync>; + bias-pull-up; + slew-rate = "slightly_fast"; + drive-strength = "x4"; + }; + }; + spi3_default: spi3_default { group0 { pinmux = <&iomuxc1_gpio_io07_lpspi_pcs_lpspi3_pcs1>, diff --git a/boards/nxp/frdm_imx93/frdm_imx93_mimx9352_a55.dts b/boards/nxp/frdm_imx93/frdm_imx93_mimx9352_a55.dts index 6eb62daab225a..4218de5c37286 100644 --- a/boards/nxp/frdm_imx93/frdm_imx93_mimx9352_a55.dts +++ b/boards/nxp/frdm_imx93/frdm_imx93_mimx9352_a55.dts @@ -146,6 +146,12 @@ status = "okay"; }; +&sai3_2 { + status = "disabled"; + pinctrl-0 = <&sai3_default>; + pinctrl-names = "default"; +}; + &wdog4 { status = "okay"; }; From eaa92fd6d24c46fdbb4129d4a4e7b620942a8db7 Mon Sep 17 00:00:00 2001 From: Yanan Yang Date: Wed, 15 Oct 2025 22:29:09 +0900 Subject: [PATCH 13/14] dts: arm64: imx9131: add sai3_2 and edma4_2 node for i2s_mcux_sai driver add sai3_2 and edma4_2 node for use with i2s_mcux_sai driver Signed-off-by: Yanan Yang Fix the indent format issue. Signed-off-by: Hou Zhiqiang --- dts/arm64/nxp/nxp_mimx9131.dtsi | 34 +++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/dts/arm64/nxp/nxp_mimx9131.dtsi b/dts/arm64/nxp/nxp_mimx9131.dtsi index 37a0850b489e5..6e90e3832e519 100644 --- a/dts/arm64/nxp/nxp_mimx9131.dtsi +++ b/dts/arm64/nxp/nxp_mimx9131.dtsi @@ -76,6 +76,22 @@ #clock-cells = <3>; }; + edma4_2: edma@42000000 { + compatible = "nxp,mcux-edma"; + nxp,version = <4>; + no-error-irq; + dma-requests = <159>; + reg = <0x42000000 0x400000>; + dma-channels = <4>; + interrupt-parent = <&gic>; + interrupts = , + , + , + ; + #dma-cells = <2>; + status = "disabled"; + }; + gpio1: gpio@47400000 { compatible = "nxp,imx-rgpio"; reg = <0x47400000 DT_SIZE_K(64)>; @@ -240,6 +256,24 @@ status = "disabled"; }; + sai3_2: sai@42660000 { + compatible = "nxp,mcux-i2s"; + #address-cells = <1>; + #size-cells = <0>; + reg = <0x42660000 DT_SIZE_K(64)>; + clocks = <&ccm IMX_CCM_SAI3_CLK 0x0 0x0>; + clock-names = "mclk1"; + interrupt-parent = <&gic>; + interrupts = ; + dma-names = "tx", "rx"; + dmas = <&edma4_2 2 60>, <&edma4_2 3 61>; + nxp,tx-channel = <1>; + nxp,tx-dma-channel = <2>; + nxp,rx-dma-channel = <3>; + nxp,rx-sync-mode; + status = "disabled"; + }; + usdhc1: usdhc@42850000 { compatible = "nxp,imx-usdhc"; reg = <0x42850000 0x10000>; From 22ea7b7eca86c20f6b618de28feb1b36cb8822d7 Mon Sep 17 00:00:00 2001 From: Yanan Yang Date: Wed, 16 Jul 2025 15:09:04 +0900 Subject: [PATCH 14/14] boards: frdm_imx91: add sai3_2 and edma4_2 node for i2s_mcux_sai driver add sai3_2 and edma4_2 node for use with i2s_mcux_sai driver Signed-off-by: Yanan Yang --- boards/nxp/frdm_imx91/frdm_imx91-pinctrl.dtsi | 15 +++++++++++++++ boards/nxp/frdm_imx91/frdm_imx91_mimx9131.dts | 10 ++++++++++ 2 files changed, 25 insertions(+) diff --git a/boards/nxp/frdm_imx91/frdm_imx91-pinctrl.dtsi b/boards/nxp/frdm_imx91/frdm_imx91-pinctrl.dtsi index 8ead023932738..13e148be0fc22 100644 --- a/boards/nxp/frdm_imx91/frdm_imx91-pinctrl.dtsi +++ b/boards/nxp/frdm_imx91/frdm_imx91-pinctrl.dtsi @@ -7,6 +7,21 @@ #include &pinctrl { + sai3_default: sai3_default { + group0 { + pinmux = <&iomuxc1_gpio_io16_sai_tx_bclk_sai3_tx_bclk>, + <&iomuxc1_gpio_io17_sai_mclk_sai3_mclk>, + <&iomuxc1_gpio_io18_sai_rx_bclk_sai3_rx_bclk>, + <&iomuxc1_gpio_io19_sai_rx_sync_sai3_rx_sync>, + <&iomuxc1_gpio_io20_sai_rx_data_sai3_rx_data0>, + <&iomuxc1_gpio_io21_sai_tx_data_sai3_tx_data0>, + <&iomuxc1_gpio_io26_sai_tx_sync_sai3_tx_sync>; + bias-pull-up; + slew-rate = "slightly_fast"; + drive-strength = "x4"; + }; + }; + uart1_default: uart1_default { group0 { pinmux = <&iomuxc1_uart1_rxd_lpuart_rx_lpuart1_rx>, diff --git a/boards/nxp/frdm_imx91/frdm_imx91_mimx9131.dts b/boards/nxp/frdm_imx91/frdm_imx91_mimx9131.dts index 3a4c8069bfe4a..b69fe518d4a73 100644 --- a/boards/nxp/frdm_imx91/frdm_imx91_mimx9131.dts +++ b/boards/nxp/frdm_imx91/frdm_imx91_mimx9131.dts @@ -35,6 +35,16 @@ pinctrl-names = "default"; }; +&edma4_2 { + status = "disabled"; +}; + +&sai3_2 { + status = "disabled"; + pinctrl-0 = <&sai3_default>; + pinctrl-names = "default"; +}; + &tpm2 { status = "okay"; };