File Index
Files and directories
Sign in
FILE

imx9.c

File preview with syntax highlighting.

linux-6.19.14/sound/soc/sof/imx/imx9.c C
  1// SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause)
  2/*
  3 * Copyright 2025 NXP
  4 */
  5
  6#include <linux/firmware/imx/sm.h>
  7
  8#include "imx-common.h"
  9
 10#define IMX95_M7_CPU_ID 0x1
 11#define IMX95_M7_LM_ID 0x1
 12
 13static struct snd_soc_dai_driver imx95_dai[] = {
 14	IMX_SOF_DAI_DRV_ENTRY_BIDIR("sai3", 1, 32),
 15};
 16
 17static struct snd_sof_dsp_ops sof_imx9_ops;
 18
 19static int imx95_ops_init(struct snd_sof_dev *sdev)
 20{
 21	/* first copy from template */
 22	memcpy(&sof_imx9_ops, &sof_imx_ops, sizeof(sof_imx_ops));
 23
 24	/* ... and finally set DAI driver */
 25	sof_imx9_ops.drv = get_chip_info(sdev)->drv;
 26	sof_imx9_ops.num_drv = get_chip_info(sdev)->num_drv;
 27
 28	return 0;
 29}
 30
 31static int imx95_chip_probe(struct snd_sof_dev *sdev)
 32{
 33	struct platform_device *pdev;
 34	struct resource *res;
 35
 36	pdev = to_platform_device(sdev->dev);
 37
 38	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "sram");
 39	if (!res)
 40		return dev_err_probe(sdev->dev, -ENODEV,
 41				     "failed to fetch SRAM region\n");
 42
 43	return scmi_imx_lmm_reset_vector_set(IMX95_M7_LM_ID, IMX95_M7_CPU_ID,
 44					     0, res->start);
 45}
 46
 47static int imx95_core_kick(struct snd_sof_dev *sdev)
 48{
 49	return scmi_imx_lmm_operation(IMX95_M7_LM_ID, SCMI_IMX_LMM_BOOT, 0);
 50}
 51
 52static int imx95_core_shutdown(struct snd_sof_dev *sdev)
 53{
 54	return scmi_imx_lmm_operation(IMX95_M7_LM_ID,
 55				      SCMI_IMX_LMM_SHUTDOWN,
 56				      SCMI_IMX_LMM_OP_FORCEFUL);
 57}
 58
 59static const struct imx_chip_ops imx95_chip_ops = {
 60	.probe = imx95_chip_probe,
 61	.core_kick = imx95_core_kick,
 62	.core_shutdown = imx95_core_shutdown,
 63};
 64
 65static struct imx_memory_info imx95_memory_regions[] = {
 66	{ .name = "sram", .reserved = false },
 67	{ }
 68};
 69
 70static const struct imx_chip_info imx95_chip_info = {
 71	.ipc_info = {
 72		.boot_mbox_offset = 0x6001000,
 73		.window_offset = 0x6000000,
 74	},
 75	.has_dma_reserved = true,
 76	.memory = imx95_memory_regions,
 77	.drv = imx95_dai,
 78	.num_drv = ARRAY_SIZE(imx95_dai),
 79	.ops = &imx95_chip_ops,
 80};
 81
 82static struct snd_sof_of_mach sof_imx9_machs[] = {
 83	{
 84		.compatible = "fsl,imx95-19x19-evk",
 85		.sof_tplg_filename = "sof-imx95-wm8962.tplg",
 86		.drv_name = "asoc-audio-graph-card2",
 87	},
 88	{
 89	}
 90};
 91
 92IMX_SOF_DEV_DESC(imx95, sof_imx9_machs, &imx95_chip_info, &sof_imx9_ops, imx95_ops_init);
 93
 94static const struct of_device_id sof_of_imx9_ids[] = {
 95	{
 96		.compatible = "fsl,imx95-cm7-sof",
 97		.data = &IMX_SOF_DEV_DESC_NAME(imx95),
 98	},
 99	{
100	},
101};
102MODULE_DEVICE_TABLE(of, sof_of_imx9_ids);
103
104static struct platform_driver snd_sof_of_imx9_driver = {
105	.probe = sof_of_probe,
106	.remove = sof_of_remove,
107	.driver = {
108		.name = "sof-audio-of-imx9",
109		.pm = pm_ptr(&sof_of_pm),
110		.of_match_table = sof_of_imx9_ids,
111	},
112};
113module_platform_driver(snd_sof_of_imx9_driver);
114
115MODULE_LICENSE("Dual BSD/GPL");
116MODULE_DESCRIPTION("SOF driver for imx9 platforms");
117MODULE_AUTHOR("Laurentiu Mihalcea <laurentiu.mihalcea@nxp.com>");
~/ Read-only file preview.