1 // SPDX-License-Identifier: GPL-2.0-only 2 // 3 // Copyright(c) 2021-2022 Intel Corporation 4 // 5 // Authors: Cezary Rojewski <cezary.rojewski@intel.com> 6 // Amadeusz Slawinski <amadeuszx.slawinski@linux.intel.com> 7 // 8 9 #include <linux/device.h> 10 #include <linux/module.h> 11 #include <sound/soc.h> 12 #include <sound/soc-acpi.h> 13 #include "../utils.h" 14 15 SND_SOC_DAILINK_DEF(dmic_pin, DAILINK_COMP_ARRAY(COMP_CPU("DMIC Pin"))); 16 SND_SOC_DAILINK_DEF(dmic_wov_pin, DAILINK_COMP_ARRAY(COMP_CPU("DMIC WoV Pin"))); 17 SND_SOC_DAILINK_DEF(dmic_codec, DAILINK_COMP_ARRAY(COMP_CODEC("dmic-codec", "dmic-hifi"))); 18 /* Name overridden on probe */ 19 SND_SOC_DAILINK_DEF(platform, DAILINK_COMP_ARRAY(COMP_PLATFORM(""))); 20 21 static struct snd_soc_dai_link card_dai_links[] = { 22 /* Back ends */ 23 { 24 .name = "DMIC", 25 .id = 0, 26 .capture_only = 1, 27 .nonatomic = 1, 28 .no_pcm = 1, 29 SND_SOC_DAILINK_REG(dmic_pin, dmic_codec, platform), 30 }, 31 { 32 .name = "DMIC WoV", 33 .id = 1, 34 .capture_only = 1, 35 .nonatomic = 1, 36 .no_pcm = 1, 37 .ignore_suspend = 1, 38 SND_SOC_DAILINK_REG(dmic_wov_pin, dmic_codec, platform), 39 }, 40 }; 41 42 static const struct snd_soc_dapm_widget card_widgets[] = { 43 SND_SOC_DAPM_MIC("SoC DMIC", NULL), 44 }; 45 46 static const struct snd_soc_dapm_route card_routes[] = { 47 {"DMic", NULL, "SoC DMIC"}, 48 }; 49 50 static int avs_dmic_probe(struct platform_device *pdev) 51 { 52 struct snd_soc_acpi_mach *mach; 53 struct avs_mach_pdata *pdata; 54 struct snd_soc_card *card; 55 struct device *dev = &pdev->dev; 56 int ret; 57 58 mach = dev_get_platdata(dev); 59 pdata = mach->pdata; 60 61 card = devm_kzalloc(dev, sizeof(*card), GFP_KERNEL); 62 if (!card) 63 return -ENOMEM; 64 65 if (pdata->obsolete_card_names) { 66 card->name = "avs_dmic"; 67 } else { 68 card->driver_name = "avs_dmic"; 69 card->long_name = card->name = "AVS DMIC"; 70 } 71 card->dev = dev; 72 card->owner = THIS_MODULE; 73 card->dai_link = card_dai_links; 74 card->num_links = ARRAY_SIZE(card_dai_links); 75 card->dapm_widgets = card_widgets; 76 card->num_dapm_widgets = ARRAY_SIZE(card_widgets); 77 card->dapm_routes = card_routes; 78 card->num_dapm_routes = ARRAY_SIZE(card_routes); 79 card->fully_routed = true; 80 81 ret = snd_soc_fixup_dai_links_platform_name(card, mach->mach_params.platform); 82 if (ret) 83 return ret; 84 85 return devm_snd_soc_register_deferrable_card(dev, card); 86 } 87 88 static const struct platform_device_id avs_dmic_driver_ids[] = { 89 { 90 .name = "avs_dmic", 91 }, 92 {}, 93 }; 94 MODULE_DEVICE_TABLE(platform, avs_dmic_driver_ids); 95 96 static struct platform_driver avs_dmic_driver = { 97 .probe = avs_dmic_probe, 98 .driver = { 99 .name = "avs_dmic", 100 .pm = &snd_soc_pm_ops, 101 }, 102 .id_table = avs_dmic_driver_ids, 103 }; 104 105 module_platform_driver(avs_dmic_driver); 106 107 MODULE_DESCRIPTION("Intel DMIC machine driver"); 108 MODULE_LICENSE("GPL"); 109