1 // SPDX-License-Identifier: GPL-2.0-only
3 // Copyright(c) 2021-2022 Intel Corporation
9 #include <linux/module.h>
10 #include <sound/pcm.h>
11 #include <sound/pcm_params.h>
12 #include <sound/soc.h>
13 #include <sound/soc-acpi.h>
14 #include <sound/soc-dapm.h>
17 static int avs_create_dai_link(struct device *dev, const char *platform_name, int ssp_port,
18 int tdm_slot, struct snd_soc_dai_link **dai_link)
20 struct snd_soc_dai_link_component *platform;
21 struct snd_soc_dai_link *dl;
23 dl = devm_kzalloc(dev, sizeof(*dl), GFP_KERNEL);
24 platform = devm_kzalloc(dev, sizeof(*platform), GFP_KERNEL);
28 platform->name = platform_name;
30 dl->name = devm_kasprintf(dev, GFP_KERNEL,
31 AVS_STRING_FMT("SSP", "-Codec", ssp_port, tdm_slot));
32 dl->cpus = devm_kzalloc(dev, sizeof(*dl->cpus), GFP_KERNEL);
33 if (!dl->name || !dl->cpus)
36 dl->cpus->dai_name = devm_kasprintf(dev, GFP_KERNEL,
37 AVS_STRING_FMT("SSP", " Pin", ssp_port, tdm_slot));
38 dl->codecs = &snd_soc_dummy_dlc;
39 if (!dl->cpus->dai_name || !dl->codecs->name || !dl->codecs->dai_name)
44 dl->platforms = platform;
45 dl->num_platforms = 1;
55 static int avs_i2s_test_probe(struct platform_device *pdev)
57 struct snd_soc_dai_link *dai_link;
58 struct snd_soc_acpi_mach *mach;
59 struct snd_soc_card *card;
60 struct device *dev = &pdev->dev;
62 int ssp_port, tdm_slot, ret;
64 mach = dev_get_platdata(dev);
65 pname = mach->mach_params.platform;
67 if (!avs_mach_singular_ssp(mach)) {
68 dev_err(dev, "Invalid SSP configuration\n");
71 ssp_port = avs_mach_ssp_port(mach);
73 if (!avs_mach_singular_tdm(mach, ssp_port)) {
74 dev_err(dev, "Invalid TDM configuration\n");
77 tdm_slot = avs_mach_ssp_tdm(mach, ssp_port);
79 card = devm_kzalloc(dev, sizeof(*card), GFP_KERNEL);
83 card->name = devm_kasprintf(dev, GFP_KERNEL,
84 AVS_STRING_FMT("ssp", "-loopback", ssp_port, tdm_slot));
88 ret = avs_create_dai_link(dev, pname, ssp_port, tdm_slot, &dai_link);
90 dev_err(dev, "Failed to create dai link: %d\n", ret);
95 card->owner = THIS_MODULE;
96 card->dai_link = dai_link;
98 card->fully_routed = true;
100 ret = snd_soc_fixup_dai_links_platform_name(card, pname);
104 return devm_snd_soc_register_card(dev, card);
107 static const struct platform_device_id avs_i2s_test_driver_ids[] = {
109 .name = "avs_i2s_test",
113 MODULE_DEVICE_TABLE(platform, avs_i2s_test_driver_ids);
115 static struct platform_driver avs_i2s_test_driver = {
116 .probe = avs_i2s_test_probe,
118 .name = "avs_i2s_test",
119 .pm = &snd_soc_pm_ops,
121 .id_table = avs_i2s_test_driver_ids,
124 module_platform_driver(avs_i2s_test_driver);
126 MODULE_DESCRIPTION("Intel i2s test machine driver");
127 MODULE_LICENSE("GPL");