Message ID | 20250205203022.2754-9-laurentiumihalcea111@gmail.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | Refactor imx drivers and introduce support for imx95 | expand |
On Wed, Feb 05, 2025 at 03:30:22PM -0500, Laurentiu Mihalcea wrote: > From: Laurentiu Mihalcea <laurentiu.mihalcea@nxp.com> > > Add SOF support for the imx95 chip. Although the support is just > for the imx95 chip, the driver is intended for all chips in the imx9 > family. > > Note that the imx95 support could have just as easily been added > to the imx8 platform driver but a new platform driver was created > because the intention is to keep the families in separate drivers. > > Signed-off-by: Laurentiu Mihalcea <laurentiu.mihalcea@nxp.com> Reviewed-by: Frank Li <Frank.Li@nxp.com> > --- > sound/soc/sof/imx/Kconfig | 9 +++ > sound/soc/sof/imx/Makefile | 2 + > sound/soc/sof/imx/imx9.c | 137 +++++++++++++++++++++++++++++++++++++ > 3 files changed, 148 insertions(+) > create mode 100644 sound/soc/sof/imx/imx9.c > > diff --git a/sound/soc/sof/imx/Kconfig b/sound/soc/sof/imx/Kconfig > index 2edf9de2c886..327e2df94a58 100644 > --- a/sound/soc/sof/imx/Kconfig > +++ b/sound/soc/sof/imx/Kconfig > @@ -32,4 +32,13 @@ config SND_SOC_SOF_IMX8 > Say Y if you have such a device. > If unsure select "N". > > +config SND_SOC_SOF_IMX9 > + tristate "SOF support for i.MX9" > + depends on IMX_DSP > + select SND_SOC_SOF_IMX_COMMON > + help > + This adds support for Sound Open Firmware for NXP i.MX9 platforms. > + Say Y if you need such a device. > + If unsure select "N". > + > endif ## SND_SOC_SOF_IMX_TOPLEVEL > diff --git a/sound/soc/sof/imx/Makefile b/sound/soc/sof/imx/Makefile > index 36a3a67c6efb..74b5ecad8fe8 100644 > --- a/sound/soc/sof/imx/Makefile > +++ b/sound/soc/sof/imx/Makefile > @@ -1,7 +1,9 @@ > # SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) > snd-sof-imx8-y := imx8.o > +snd-sof-imx9-y := imx9.o > > snd-sof-imx-common-y := imx-common.o > > obj-$(CONFIG_SND_SOC_SOF_IMX8) += snd-sof-imx8.o > +obj-$(CONFIG_SND_SOC_SOF_IMX9) += snd-sof-imx9.o > obj-$(CONFIG_SND_SOC_SOF_IMX_COMMON) += imx-common.o > diff --git a/sound/soc/sof/imx/imx9.c b/sound/soc/sof/imx/imx9.c > new file mode 100644 > index 000000000000..598675d4350a > --- /dev/null > +++ b/sound/soc/sof/imx/imx9.c > @@ -0,0 +1,137 @@ > +// SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) > +/* > + * Copyright 2025 NXP > + */ > + > +#include <linux/arm-smccc.h> > + > +#include "imx-common.h" > + > +#define IMX_SIP_SRC 0xC2000005 > +#define IMX_SIP_SRC_M_RESET_ADDR_SET 0x03 > + > +#define IMX95_CPU_VEC_FLAGS_BOOT BIT(29) > + > +#define IMX_SIP_LMM 0xC200000F > +#define IMX_SIP_LMM_BOOT 0x0 > +#define IMX_SIP_LMM_SHUTDOWN 0x1 > + > +#define IMX95_M7_LM_ID 0x1 > + > +static struct snd_soc_dai_driver imx95_dai[] = { > + IMX_SOF_DAI_DRV_ENTRY_BIDIR("sai3", 1, 32), > +}; > + > +static struct snd_sof_dsp_ops sof_imx9_ops; > + > +static int imx95_ops_init(struct snd_sof_dev *sdev) > +{ > + /* first copy from template */ > + memcpy(&sof_imx9_ops, &sof_imx_ops, sizeof(sof_imx_ops)); > + > + /* ... and finally set DAI driver */ > + sof_imx9_ops.drv = get_chip_info(sdev)->drv; > + sof_imx9_ops.num_drv = get_chip_info(sdev)->num_drv; > + > + return 0; > +} > + > +static int imx95_chip_probe(struct snd_sof_dev *sdev) > +{ > + struct arm_smccc_res smc_res; > + struct platform_device *pdev; > + struct resource *res; > + > + pdev = to_platform_device(sdev->dev); > + > + res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "sram"); > + if (!res) > + return dev_err_probe(sdev->dev, -ENODEV, > + "failed to fetch SRAM region\n"); > + > + /* set core boot reset address */ > + arm_smccc_smc(IMX_SIP_SRC, IMX_SIP_SRC_M_RESET_ADDR_SET, res->start, > + IMX95_CPU_VEC_FLAGS_BOOT, 0, 0, 0, 0, &smc_res); > + > + return smc_res.a0; > +} > + > +static int imx95_core_kick(struct snd_sof_dev *sdev) > +{ > + struct arm_smccc_res smc_res; > + > + arm_smccc_smc(IMX_SIP_LMM, IMX_SIP_LMM_BOOT, > + IMX95_M7_LM_ID, 0, 0, 0, 0, 0, &smc_res); > + > + return smc_res.a0; > +} > + > +static int imx95_core_shutdown(struct snd_sof_dev *sdev) > +{ > + struct arm_smccc_res smc_res; > + > + arm_smccc_smc(IMX_SIP_LMM, IMX_SIP_LMM_SHUTDOWN, > + IMX95_M7_LM_ID, 0, 0, 0, 0, 0, &smc_res); > + > + return smc_res.a0; > +} > + > +static const struct imx_chip_ops imx95_chip_ops = { > + .probe = imx95_chip_probe, > + .core_kick = imx95_core_kick, > + .core_shutdown = imx95_core_shutdown, > +}; > + > +static struct imx_memory_info imx95_memory_regions[] = { > + { .name = "sram", .reserved = false }, > + { } > +}; > + > +static const struct imx_chip_info imx95_chip_info = { > + .ipc_info = { > + .boot_mbox_offset = 0x6001000, > + .window_offset = 0x6000000, > + }, > + .has_dma_reserved = true, > + .memory = imx95_memory_regions, > + .drv = imx95_dai, > + .num_drv = ARRAY_SIZE(imx95_dai), > + .ops = &imx95_chip_ops, > +}; > + > +static struct snd_sof_of_mach sof_imx9_machs[] = { > + { > + .compatible = "fsl,imx95-19x19-evk", > + .sof_tplg_filename = "sof-imx95-wm8962.tplg", > + .drv_name = "asoc-audio-graph-card2", > + }, > + { > + } > +}; > + > +IMX_SOF_DEV_DESC(imx95, sof_imx9_machs, &imx95_chip_info, &sof_imx9_ops, imx95_ops_init); > + > +static const struct of_device_id sof_of_imx9_ids[] = { > + { > + .compatible = "fsl,imx95-cm7-sof", > + .data = &IMX_SOF_DEV_DESC_NAME(imx95), > + }, > + { > + }, > +}; > +MODULE_DEVICE_TABLE(of, sof_of_imx9_ids); > + > +static struct platform_driver snd_sof_of_imx9_driver = { > + .probe = sof_of_probe, > + .remove = sof_of_remove, > + .driver = { > + .name = "sof-audio-of-imx9", > + .pm = &sof_of_pm, > + .of_match_table = sof_of_imx9_ids, > + }, > +}; > +module_platform_driver(snd_sof_of_imx9_driver); > + > +MODULE_LICENSE("Dual BSD/GPL"); > +MODULE_DESCRIPTION("SOF driver for imx9 platforms"); > +MODULE_AUTHOR("Laurentiu Mihalcea <laurentiu.mihalcea@nxp.com>"); > -- > 2.34.1 >
diff --git a/sound/soc/sof/imx/Kconfig b/sound/soc/sof/imx/Kconfig index 2edf9de2c886..327e2df94a58 100644 --- a/sound/soc/sof/imx/Kconfig +++ b/sound/soc/sof/imx/Kconfig @@ -32,4 +32,13 @@ config SND_SOC_SOF_IMX8 Say Y if you have such a device. If unsure select "N". +config SND_SOC_SOF_IMX9 + tristate "SOF support for i.MX9" + depends on IMX_DSP + select SND_SOC_SOF_IMX_COMMON + help + This adds support for Sound Open Firmware for NXP i.MX9 platforms. + Say Y if you need such a device. + If unsure select "N". + endif ## SND_SOC_SOF_IMX_TOPLEVEL diff --git a/sound/soc/sof/imx/Makefile b/sound/soc/sof/imx/Makefile index 36a3a67c6efb..74b5ecad8fe8 100644 --- a/sound/soc/sof/imx/Makefile +++ b/sound/soc/sof/imx/Makefile @@ -1,7 +1,9 @@ # SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) snd-sof-imx8-y := imx8.o +snd-sof-imx9-y := imx9.o snd-sof-imx-common-y := imx-common.o obj-$(CONFIG_SND_SOC_SOF_IMX8) += snd-sof-imx8.o +obj-$(CONFIG_SND_SOC_SOF_IMX9) += snd-sof-imx9.o obj-$(CONFIG_SND_SOC_SOF_IMX_COMMON) += imx-common.o diff --git a/sound/soc/sof/imx/imx9.c b/sound/soc/sof/imx/imx9.c new file mode 100644 index 000000000000..598675d4350a --- /dev/null +++ b/sound/soc/sof/imx/imx9.c @@ -0,0 +1,137 @@ +// SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) +/* + * Copyright 2025 NXP + */ + +#include <linux/arm-smccc.h> + +#include "imx-common.h" + +#define IMX_SIP_SRC 0xC2000005 +#define IMX_SIP_SRC_M_RESET_ADDR_SET 0x03 + +#define IMX95_CPU_VEC_FLAGS_BOOT BIT(29) + +#define IMX_SIP_LMM 0xC200000F +#define IMX_SIP_LMM_BOOT 0x0 +#define IMX_SIP_LMM_SHUTDOWN 0x1 + +#define IMX95_M7_LM_ID 0x1 + +static struct snd_soc_dai_driver imx95_dai[] = { + IMX_SOF_DAI_DRV_ENTRY_BIDIR("sai3", 1, 32), +}; + +static struct snd_sof_dsp_ops sof_imx9_ops; + +static int imx95_ops_init(struct snd_sof_dev *sdev) +{ + /* first copy from template */ + memcpy(&sof_imx9_ops, &sof_imx_ops, sizeof(sof_imx_ops)); + + /* ... and finally set DAI driver */ + sof_imx9_ops.drv = get_chip_info(sdev)->drv; + sof_imx9_ops.num_drv = get_chip_info(sdev)->num_drv; + + return 0; +} + +static int imx95_chip_probe(struct snd_sof_dev *sdev) +{ + struct arm_smccc_res smc_res; + struct platform_device *pdev; + struct resource *res; + + pdev = to_platform_device(sdev->dev); + + res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "sram"); + if (!res) + return dev_err_probe(sdev->dev, -ENODEV, + "failed to fetch SRAM region\n"); + + /* set core boot reset address */ + arm_smccc_smc(IMX_SIP_SRC, IMX_SIP_SRC_M_RESET_ADDR_SET, res->start, + IMX95_CPU_VEC_FLAGS_BOOT, 0, 0, 0, 0, &smc_res); + + return smc_res.a0; +} + +static int imx95_core_kick(struct snd_sof_dev *sdev) +{ + struct arm_smccc_res smc_res; + + arm_smccc_smc(IMX_SIP_LMM, IMX_SIP_LMM_BOOT, + IMX95_M7_LM_ID, 0, 0, 0, 0, 0, &smc_res); + + return smc_res.a0; +} + +static int imx95_core_shutdown(struct snd_sof_dev *sdev) +{ + struct arm_smccc_res smc_res; + + arm_smccc_smc(IMX_SIP_LMM, IMX_SIP_LMM_SHUTDOWN, + IMX95_M7_LM_ID, 0, 0, 0, 0, 0, &smc_res); + + return smc_res.a0; +} + +static const struct imx_chip_ops imx95_chip_ops = { + .probe = imx95_chip_probe, + .core_kick = imx95_core_kick, + .core_shutdown = imx95_core_shutdown, +}; + +static struct imx_memory_info imx95_memory_regions[] = { + { .name = "sram", .reserved = false }, + { } +}; + +static const struct imx_chip_info imx95_chip_info = { + .ipc_info = { + .boot_mbox_offset = 0x6001000, + .window_offset = 0x6000000, + }, + .has_dma_reserved = true, + .memory = imx95_memory_regions, + .drv = imx95_dai, + .num_drv = ARRAY_SIZE(imx95_dai), + .ops = &imx95_chip_ops, +}; + +static struct snd_sof_of_mach sof_imx9_machs[] = { + { + .compatible = "fsl,imx95-19x19-evk", + .sof_tplg_filename = "sof-imx95-wm8962.tplg", + .drv_name = "asoc-audio-graph-card2", + }, + { + } +}; + +IMX_SOF_DEV_DESC(imx95, sof_imx9_machs, &imx95_chip_info, &sof_imx9_ops, imx95_ops_init); + +static const struct of_device_id sof_of_imx9_ids[] = { + { + .compatible = "fsl,imx95-cm7-sof", + .data = &IMX_SOF_DEV_DESC_NAME(imx95), + }, + { + }, +}; +MODULE_DEVICE_TABLE(of, sof_of_imx9_ids); + +static struct platform_driver snd_sof_of_imx9_driver = { + .probe = sof_of_probe, + .remove = sof_of_remove, + .driver = { + .name = "sof-audio-of-imx9", + .pm = &sof_of_pm, + .of_match_table = sof_of_imx9_ids, + }, +}; +module_platform_driver(snd_sof_of_imx9_driver); + +MODULE_LICENSE("Dual BSD/GPL"); +MODULE_DESCRIPTION("SOF driver for imx9 platforms"); +MODULE_AUTHOR("Laurentiu Mihalcea <laurentiu.mihalcea@nxp.com>");