Lines Matching +full:dmic +full:- +full:mode

1 // SPDX-License-Identifier: GPL-2.0-only
5 * sof_sdw - ASOC Machine driver for Intel SoundWire platforms
17 #include <sound/soc-acpi.h>
22 static int quirk_override = -1;
24 MODULE_PARM_DESC(quirk, "Board-specific quirk override");
31 dev_dbg(dev, "quirk realtek,jack-detect-source %ld\n", in log_quirks()
54 sof_sdw_quirk = (unsigned long)id->driver_data; in sof_sdw_quirk_cb()
186 * (e.g. 15-eb1xxx, 14t-ea000 or 13-aw2xxx)
255 /* TigerLake-SDCA devices */
775 quirk_entry = snd_pci_quirk_lookup_id(mach->mach_params.subsystem_vendor, in sof_sdw_check_ssid_quirk()
776 mach->mach_params.subsystem_device, in sof_sdw_check_ssid_quirk()
780 sof_sdw_quirk = quirk_entry->value; in sof_sdw_check_ssid_quirk()
806 struct device *dev = card->dev; in create_sdw_dailink()
807 struct snd_soc_acpi_mach *mach = dev_get_platdata(card->dev); in create_sdw_dailink()
809 struct snd_soc_acpi_mach_params *mach_params = &mach->mach_params; in create_sdw_dailink()
810 struct intel_mc_ctx *intel_ctx = (struct intel_mc_ctx *)ctx->private; in create_sdw_dailink()
815 list_for_each_entry(sof_end, &sof_dai->endpoints, list) { in create_sdw_dailink()
816 if (sof_end->name_prefix) { in create_sdw_dailink()
817 (*codec_conf)->dlc.name = sof_end->codec_name; in create_sdw_dailink()
818 (*codec_conf)->name_prefix = sof_end->name_prefix; in create_sdw_dailink()
822 if (sof_end->include_sidecar) { in create_sdw_dailink()
823 ret = sof_end->codec_info->add_sidecar(card, dai_links, codec_conf); in create_sdw_dailink()
831 "SDW%d-Playback", in create_sdw_dailink()
832 "SDW%d-Capture", in create_sdw_dailink()
833 "SDW%d-Playback-%s", in create_sdw_dailink()
834 "SDW%d-Capture-%s", in create_sdw_dailink()
839 int num_cpus = hweight32(sof_dai->link_mask[stream]); in create_sdw_dailink()
840 int num_codecs = sof_dai->num_devs[stream]; in create_sdw_dailink()
846 if (!sof_dai->num_devs[stream]) in create_sdw_dailink()
849 sof_end = list_first_entry(&sof_dai->endpoints, in create_sdw_dailink()
852 *be_id = sof_end->dai_info->dailink[stream]; in create_sdw_dailink()
855 return -EINVAL; in create_sdw_dailink()
859 if (ctx->append_dai_type) in create_sdw_dailink()
862 ffs(sof_end->link_mask) - 1, in create_sdw_dailink()
863 type_strings[sof_end->dai_info->dai_type]); in create_sdw_dailink()
867 ffs(sof_end->link_mask) - 1); in create_sdw_dailink()
869 return -ENOMEM; in create_sdw_dailink()
873 return -ENOMEM; in create_sdw_dailink()
877 return -ENOMEM; in create_sdw_dailink()
881 return -ENOMEM; in create_sdw_dailink()
883 list_for_each_entry(sof_end, &sof_dai->endpoints, list) { in create_sdw_dailink()
884 if (!sof_end->dai_info->direction[stream]) in create_sdw_dailink()
887 if (cur_link != sof_end->link_mask) { in create_sdw_dailink()
888 int link_num = ffs(sof_end->link_mask) - 1; in create_sdw_dailink()
889 int pin_num = intel_ctx->sdw_pin_index[link_num]++; in create_sdw_dailink()
891 cur_link = sof_end->link_mask; in create_sdw_dailink()
897 return -ENOMEM; in create_sdw_dailink()
901 codec_maps[j].cpu = i - 1; in create_sdw_dailink()
904 codecs[j].name = sof_end->codec_name; in create_sdw_dailink()
905 codecs[j].dai_name = sof_end->dai_info->dai_name; in create_sdw_dailink()
906 if (sof_end->dai_info->dai_type == SOC_SDW_DAI_TYPE_MIC && in create_sdw_dailink()
907 mach_params->dmic_num > 0) { in create_sdw_dailink()
909 …"Both SDW DMIC and PCH DMIC are present, if incorrect, please set kernel params snd_sof_intel_hda_… in create_sdw_dailink()
928 (*dai_links)->nonatomic = true; in create_sdw_dailink()
929 (*dai_links)->ch_maps = codec_maps; in create_sdw_dailink()
931 list_for_each_entry(sof_end, &sof_dai->endpoints, list) { in create_sdw_dailink()
932 if (sof_end->dai_info->init) in create_sdw_dailink()
933 sof_end->dai_info->init(card, *dai_links, in create_sdw_dailink()
934 sof_end->codec_info, in create_sdw_dailink()
950 struct intel_mc_ctx *intel_ctx = (struct intel_mc_ctx *)ctx->private; in create_sdw_dailinks()
954 intel_ctx->sdw_pin_index[i] = SOC_SDW_INTEL_BIDIR_PDI_BASE; in create_sdw_dailinks()
957 while (sof_dais->initialised) { in create_sdw_dailinks()
980 struct device *dev = card->dev; in create_ssp_dailinks()
985 char *name = devm_kasprintf(dev, GFP_KERNEL, "SSP%d-Codec", i); in create_ssp_dailinks()
987 char *codec_name = devm_kasprintf(dev, GFP_KERNEL, "i2c-%s:0%d", in create_ssp_dailinks()
988 ssp_info->acpi_id, j++); in create_ssp_dailinks()
990 return -ENOMEM; in create_ssp_dailinks()
992 int playback = ssp_info->dais[0].direction[SNDRV_PCM_STREAM_PLAYBACK]; in create_ssp_dailinks()
993 int capture = ssp_info->dais[0].direction[SNDRV_PCM_STREAM_CAPTURE]; in create_ssp_dailinks()
997 platform_component->name, in create_ssp_dailinks()
999 ssp_info->dais[0].dai_name, 1, NULL, in create_ssp_dailinks()
1000 ssp_info->ops); in create_ssp_dailinks()
1004 ret = ssp_info->dais[0].init(card, *dai_links, ssp_info, 0); in create_ssp_dailinks()
1017 struct device *dev = card->dev; in create_dmic_dailinks()
1021 0, 1, // DMIC only supports capture in create_dmic_dailinks()
1022 "DMIC01 Pin", platform_component->name, in create_dmic_dailinks()
1024 "dmic-codec", "dmic-hifi", 1, in create_dmic_dailinks()
1032 0, 1, // DMIC only supports capture in create_dmic_dailinks()
1033 "DMIC16k Pin", platform_component->name, in create_dmic_dailinks()
1035 "dmic-codec", "dmic-hifi", 1, in create_dmic_dailinks()
1050 struct device *dev = card->dev; in create_hdmi_dailinks()
1052 struct intel_mc_ctx *intel_ctx = (struct intel_mc_ctx *)ctx->private; in create_hdmi_dailinks()
1059 return -ENOMEM; in create_hdmi_dailinks()
1063 if (intel_ctx->hdmi.idisp_codec) { in create_hdmi_dailinks()
1066 "intel-hdmi-hifi%d", i + 1); in create_hdmi_dailinks()
1068 codec_name = "snd-soc-dummy"; in create_hdmi_dailinks()
1069 codec_dai_name = "snd-soc-dummy-dai"; in create_hdmi_dailinks()
1073 return -ENOMEM; in create_hdmi_dailinks()
1077 cpu_dai_name, platform_component->name, in create_hdmi_dailinks()
1093 struct device *dev = card->dev; in create_bt_dailinks()
1096 char *name = devm_kasprintf(dev, GFP_KERNEL, "SSP%d-BT", port); in create_bt_dailinks()
1099 return -ENOMEM; in create_bt_dailinks()
1104 1, 1, cpu_dai_name, platform_component->name, in create_bt_dailinks()
1118 struct device *dev = card->dev; in sof_card_dai_links_create()
1119 struct snd_soc_acpi_mach *mach = dev_get_platdata(card->dev); in sof_card_dai_links_create()
1122 struct intel_mc_ctx *intel_ctx = (struct intel_mc_ctx *)ctx->private; in sof_card_dai_links_create()
1123 struct snd_soc_acpi_mach_params *mach_params = &mach->mach_params; in sof_card_dai_links_create()
1150 return -ENOMEM; in sof_card_dai_links_create()
1155 ret = -ENOMEM; in sof_card_dai_links_create()
1166 * on generic tgl platform, I2S or sdw mode is supported in sof_card_dai_links_create()
1168 * system only when I2S mode is supported, not sdw mode. in sof_card_dai_links_create()
1171 ssp_info = asoc_sdw_find_codec_info_acpi(mach->id); in sof_card_dai_links_create()
1177 if (mach_params->codec_mask & IDISP_CODEC_MASK) in sof_card_dai_links_create()
1178 intel_ctx->hdmi.idisp_codec = true; in sof_card_dai_links_create()
1186 if (ctx->ignore_internal_dmic) { in sof_card_dai_links_create()
1187 dev_dbg(dev, "SoundWire DMIC is used, ignoring internal DMIC\n"); in sof_card_dai_links_create()
1188 mach_params->dmic_num = 0; in sof_card_dai_links_create()
1189 } else if (mach_params->dmic_num) { in sof_card_dai_links_create()
1194 * mach_params->dmic_num will be used to set the cfg-mics value of in sof_card_dai_links_create()
1195 * card->components string. Set it to the default value. in sof_card_dai_links_create()
1197 mach_params->dmic_num = DMIC_DEFAULT_CHANNELS; in sof_card_dai_links_create()
1203 dev_dbg(dev, "DAI link numbers: sdw %d, ssp %d, dmic %d, hdmi %d, bt: %d\n", in sof_card_dai_links_create()
1205 intel_ctx->hdmi.idisp_codec ? hdmi_num : 0, bt_num); in sof_card_dai_links_create()
1209 ret = -ENOMEM; in sof_card_dai_links_create()
1217 ret = -ENOMEM; in sof_card_dai_links_create()
1221 card->codec_conf = codec_conf; in sof_card_dai_links_create()
1222 card->num_configs = num_devs; in sof_card_dai_links_create()
1223 card->dai_link = dai_links; in sof_card_dai_links_create()
1224 card->num_links = num_links; in sof_card_dai_links_create()
1242 /* dmic */ in sof_card_dai_links_create()
1261 WARN_ON(codec_conf != card->codec_conf + card->num_configs); in sof_card_dai_links_create()
1262 WARN_ON(dai_links != card->dai_link + card->num_links); in sof_card_dai_links_create()
1275 struct intel_mc_ctx *intel_ctx = (struct intel_mc_ctx *)ctx->private; in sof_sdw_card_late_probe()
1282 if (intel_ctx->hdmi.idisp_codec) in sof_sdw_card_late_probe()
1290 struct snd_soc_acpi_mach *mach = dev_get_platdata(&pdev->dev); in mc_probe()
1297 dev_dbg(&pdev->dev, "Entry\n"); in mc_probe()
1299 intel_ctx = devm_kzalloc(&pdev->dev, sizeof(*intel_ctx), GFP_KERNEL); in mc_probe()
1301 return -ENOMEM; in mc_probe()
1303 ctx = devm_kzalloc(&pdev->dev, sizeof(*ctx), GFP_KERNEL); in mc_probe()
1305 return -ENOMEM; in mc_probe()
1307 ctx->private = intel_ctx; in mc_probe()
1308 ctx->codec_info_list_count = asoc_sdw_get_codec_info_list_count(); in mc_probe()
1309 card = &ctx->card; in mc_probe()
1310 card->dev = &pdev->dev; in mc_probe()
1311 card->name = "soundwire"; in mc_probe()
1312 card->owner = THIS_MODULE; in mc_probe()
1313 card->late_probe = sof_sdw_card_late_probe; in mc_probe()
1317 if (mach->mach_params.subsystem_id_set) { in mc_probe()
1319 mach->mach_params.subsystem_vendor, in mc_probe()
1320 mach->mach_params.subsystem_device); in mc_probe()
1326 if (quirk_override != -1) { in mc_probe()
1327 dev_info(card->dev, "Overriding quirk 0x%lx => 0x%x\n", in mc_probe()
1332 log_quirks(card->dev); in mc_probe()
1334 ctx->mc_quirk = sof_sdw_quirk; in mc_probe()
1336 for (i = 0; i < ctx->codec_info_list_count; i++) in mc_probe()
1348 for (i = 0; i < ctx->codec_info_list_count; i++) in mc_probe()
1351 card->components = devm_kasprintf(card->dev, GFP_KERNEL, in mc_probe()
1352 " cfg-amp:%d", amp_num); in mc_probe()
1353 if (!card->components) in mc_probe()
1354 return -ENOMEM; in mc_probe()
1356 if (mach->mach_params.dmic_num) { in mc_probe()
1357 card->components = devm_kasprintf(card->dev, GFP_KERNEL, in mc_probe()
1358 "%s mic:dmic cfg-mics:%d", in mc_probe()
1359 card->components, in mc_probe()
1360 mach->mach_params.dmic_num); in mc_probe()
1361 if (!card->components) in mc_probe()
1362 return -ENOMEM; in mc_probe()
1366 ret = devm_snd_soc_register_card(card->dev, card); in mc_probe()
1368 dev_err_probe(card->dev, ret, "snd_soc_register_card failed %d\n", ret); in mc_probe()
1404 MODULE_AUTHOR("Bard Liao <yung-[email protected]>");
1406 MODULE_AUTHOR("Pierre-Louis Bossart <pierre-[email protected]>");