0001
0002
0003
0004
0005
0006
0007
0008
0009 #include <linux/device.h>
0010 #include <linux/module.h>
0011 #include <sound/soc.h>
0012 #include <sound/soc-acpi.h>
0013
0014 SND_SOC_DAILINK_DEF(dmic_pin, DAILINK_COMP_ARRAY(COMP_CPU("DMIC Pin")));
0015 SND_SOC_DAILINK_DEF(dmic_wov_pin, DAILINK_COMP_ARRAY(COMP_CPU("DMIC WoV Pin")));
0016 SND_SOC_DAILINK_DEF(dmic_codec, DAILINK_COMP_ARRAY(COMP_CODEC("dmic-codec", "dmic-hifi")));
0017
0018 SND_SOC_DAILINK_DEF(platform, DAILINK_COMP_ARRAY(COMP_PLATFORM("")));
0019
0020 static struct snd_soc_dai_link card_dai_links[] = {
0021
0022 {
0023 .name = "DMIC",
0024 .id = 0,
0025 .dpcm_capture = 1,
0026 .nonatomic = 1,
0027 .no_pcm = 1,
0028 SND_SOC_DAILINK_REG(dmic_pin, dmic_codec, platform),
0029 },
0030 {
0031 .name = "DMIC WoV",
0032 .id = 1,
0033 .dpcm_capture = 1,
0034 .nonatomic = 1,
0035 .no_pcm = 1,
0036 .ignore_suspend = 1,
0037 SND_SOC_DAILINK_REG(dmic_wov_pin, dmic_codec, platform),
0038 },
0039 };
0040
0041 static const struct snd_soc_dapm_widget card_widgets[] = {
0042 SND_SOC_DAPM_MIC("SoC DMIC", NULL),
0043 };
0044
0045 static const struct snd_soc_dapm_route card_routes[] = {
0046 {"DMic", NULL, "SoC DMIC"},
0047 {"DMIC Rx", NULL, "Capture"},
0048 {"DMIC WoV Rx", NULL, "Capture"},
0049 };
0050
0051 static int avs_dmic_probe(struct platform_device *pdev)
0052 {
0053 struct snd_soc_acpi_mach *mach;
0054 struct snd_soc_card *card;
0055 struct device *dev = &pdev->dev;
0056 int ret;
0057
0058 mach = dev_get_platdata(dev);
0059
0060 card = devm_kzalloc(dev, sizeof(*card), GFP_KERNEL);
0061 if (!card)
0062 return -ENOMEM;
0063
0064 card->name = "avs_dmic";
0065 card->dev = dev;
0066 card->owner = THIS_MODULE;
0067 card->dai_link = card_dai_links;
0068 card->num_links = ARRAY_SIZE(card_dai_links);
0069 card->dapm_widgets = card_widgets;
0070 card->num_dapm_widgets = ARRAY_SIZE(card_widgets);
0071 card->dapm_routes = card_routes;
0072 card->num_dapm_routes = ARRAY_SIZE(card_routes);
0073 card->fully_routed = true;
0074
0075 ret = snd_soc_fixup_dai_links_platform_name(card, mach->mach_params.platform);
0076 if (ret)
0077 return ret;
0078
0079 return devm_snd_soc_register_card(dev, card);
0080 }
0081
0082 static struct platform_driver avs_dmic_driver = {
0083 .probe = avs_dmic_probe,
0084 .driver = {
0085 .name = "avs_dmic",
0086 .pm = &snd_soc_pm_ops,
0087 },
0088 };
0089
0090 module_platform_driver(avs_dmic_driver);
0091
0092 MODULE_LICENSE("GPL");
0093 MODULE_ALIAS("platform:avs_dmic");