Path: blob/master/sound/soc/intel/avs/boards/i2s_test.c
29270 views
// SPDX-License-Identifier: GPL-2.0-only1//2// Copyright(c) 2021-2022 Intel Corporation3//4// Authors: Cezary Rojewski <[email protected]>5// Amadeusz Slawinski <[email protected]>6//78#include <linux/module.h>9#include <sound/pcm.h>10#include <sound/pcm_params.h>11#include <sound/soc.h>12#include <sound/soc-acpi.h>13#include <sound/soc-dapm.h>14#include "../utils.h"1516static int avs_create_dai_link(struct device *dev, int ssp_port, int tdm_slot,17struct snd_soc_dai_link **dai_link)18{19struct snd_soc_dai_link_component *platform;20struct snd_soc_dai_link *dl;2122dl = devm_kzalloc(dev, sizeof(*dl), GFP_KERNEL);23platform = devm_kzalloc(dev, sizeof(*platform), GFP_KERNEL);24if (!dl || !platform)25return -ENOMEM;2627dl->name = devm_kasprintf(dev, GFP_KERNEL,28AVS_STRING_FMT("SSP", "-Codec", ssp_port, tdm_slot));29dl->cpus = devm_kzalloc(dev, sizeof(*dl->cpus), GFP_KERNEL);30if (!dl->name || !dl->cpus)31return -ENOMEM;3233dl->cpus->dai_name = devm_kasprintf(dev, GFP_KERNEL,34AVS_STRING_FMT("SSP", " Pin", ssp_port, tdm_slot));35dl->codecs = &snd_soc_dummy_dlc;36if (!dl->cpus->dai_name || !dl->codecs->name || !dl->codecs->dai_name)37return -ENOMEM;3839platform->name = dev_name(dev);40dl->num_cpus = 1;41dl->num_codecs = 1;42dl->platforms = platform;43dl->num_platforms = 1;44dl->id = 0;45dl->nonatomic = 1;46dl->no_pcm = 1;4748*dai_link = dl;4950return 0;51}5253static int avs_i2s_test_probe(struct platform_device *pdev)54{55struct snd_soc_dai_link *dai_link;56struct snd_soc_acpi_mach *mach;57struct avs_mach_pdata *pdata;58struct snd_soc_card *card;59struct device *dev = &pdev->dev;60int ssp_port, tdm_slot, ret;6162mach = dev_get_platdata(dev);63pdata = mach->pdata;6465if (!avs_mach_singular_ssp(mach)) {66dev_err(dev, "Invalid SSP configuration\n");67return -EINVAL;68}69ssp_port = avs_mach_ssp_port(mach);7071if (!avs_mach_singular_tdm(mach, ssp_port)) {72dev_err(dev, "Invalid TDM configuration\n");73return -EINVAL;74}75tdm_slot = avs_mach_ssp_tdm(mach, ssp_port);7677card = devm_kzalloc(dev, sizeof(*card), GFP_KERNEL);78if (!card)79return -ENOMEM;8081if (pdata->obsolete_card_names) {82card->name = devm_kasprintf(dev, GFP_KERNEL,83AVS_STRING_FMT("ssp", "-loopback", ssp_port, tdm_slot));84} else {85card->driver_name = "avs_i2s_test";86card->long_name = card->name = devm_kasprintf(dev, GFP_KERNEL,87AVS_STRING_FMT("AVS I2S TEST-", "",88ssp_port, tdm_slot));89}90if (!card->name)91return -ENOMEM;9293ret = avs_create_dai_link(dev, ssp_port, tdm_slot, &dai_link);94if (ret) {95dev_err(dev, "Failed to create dai link: %d\n", ret);96return ret;97}9899card->dev = dev;100card->owner = THIS_MODULE;101card->dai_link = dai_link;102card->num_links = 1;103card->fully_routed = true;104105return devm_snd_soc_register_deferrable_card(dev, card);106}107108static const struct platform_device_id avs_i2s_test_driver_ids[] = {109{110.name = "avs_i2s_test",111},112{},113};114MODULE_DEVICE_TABLE(platform, avs_i2s_test_driver_ids);115116static struct platform_driver avs_i2s_test_driver = {117.probe = avs_i2s_test_probe,118.driver = {119.name = "avs_i2s_test",120.pm = &snd_soc_pm_ops,121},122.id_table = avs_i2s_test_driver_ids,123};124125module_platform_driver(avs_i2s_test_driver);126127MODULE_DESCRIPTION("Intel i2s test machine driver");128MODULE_LICENSE("GPL");129130131