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 */
793 quirk_entry = snd_pci_quirk_lookup_id(mach->mach_params.subsystem_vendor, in sof_sdw_check_ssid_quirk()
794 mach->mach_params.subsystem_device, in sof_sdw_check_ssid_quirk()
798 sof_sdw_quirk = quirk_entry->value; in sof_sdw_check_ssid_quirk()
817 struct device *dev = card->dev; in create_sdw_dailink()
818 struct snd_soc_acpi_mach *mach = dev_get_platdata(card->dev); in create_sdw_dailink()
820 struct snd_soc_acpi_mach_params *mach_params = &mach->mach_params; in create_sdw_dailink()
821 struct intel_mc_ctx *intel_ctx = (struct intel_mc_ctx *)ctx->private; in create_sdw_dailink()
826 list_for_each_entry(sof_end, &sof_dai->endpoints, list) { in create_sdw_dailink()
827 if (sof_end->name_prefix) { in create_sdw_dailink()
828 (*codec_conf)->dlc.name = sof_end->codec_name; in create_sdw_dailink()
829 (*codec_conf)->name_prefix = sof_end->name_prefix; in create_sdw_dailink()
833 if (sof_end->include_sidecar) { in create_sdw_dailink()
834 ret = sof_end->codec_info->add_sidecar(card, dai_links, codec_conf); in create_sdw_dailink()
842 "SDW%d-Playback", in create_sdw_dailink()
843 "SDW%d-Capture", in create_sdw_dailink()
844 "SDW%d-Playback-%s", in create_sdw_dailink()
845 "SDW%d-Capture-%s", in create_sdw_dailink()
851 int num_cpus = hweight32(sof_dai->link_mask[stream]); in create_sdw_dailink()
852 int num_codecs = sof_dai->num_devs[stream]; in create_sdw_dailink()
858 if (!sof_dai->num_devs[stream]) in create_sdw_dailink()
861 sof_end = list_first_entry(&sof_dai->endpoints, in create_sdw_dailink()
864 *be_id = sof_end->dai_info->dailink[stream]; in create_sdw_dailink()
867 return -EINVAL; in create_sdw_dailink()
871 if (ctx->append_dai_type) in create_sdw_dailink()
874 ffs(sof_end->link_mask) - 1, in create_sdw_dailink()
875 type_strings[sof_end->dai_info->dai_type]); in create_sdw_dailink()
879 ffs(sof_end->link_mask) - 1); in create_sdw_dailink()
881 return -ENOMEM; in create_sdw_dailink()
885 return -ENOMEM; in create_sdw_dailink()
889 return -ENOMEM; in create_sdw_dailink()
893 return -ENOMEM; in create_sdw_dailink()
897 return -ENOMEM; in create_sdw_dailink()
899 list_for_each_entry(sof_end, &sof_dai->endpoints, list) { in create_sdw_dailink()
900 if (!sof_end->dai_info->direction[stream]) in create_sdw_dailink()
903 if (cur_link != sof_end->link_mask) { in create_sdw_dailink()
904 int link_num = ffs(sof_end->link_mask) - 1; in create_sdw_dailink()
905 int pin_num = intel_ctx->sdw_pin_index[link_num]++; in create_sdw_dailink()
907 cur_link = sof_end->link_mask; in create_sdw_dailink()
913 return -ENOMEM; in create_sdw_dailink()
917 codec_maps[j].cpu = i - 1; in create_sdw_dailink()
920 codecs[j].name = sof_end->codec_name; in create_sdw_dailink()
921 codecs[j].dai_name = sof_end->dai_info->dai_name; in create_sdw_dailink()
922 if (sof_end->dai_info->dai_type == SOC_SDW_DAI_TYPE_MIC && in create_sdw_dailink()
923 mach_params->dmic_num > 0) { in create_sdw_dailink()
925 …"Both SDW DMIC and PCH DMIC are present, if incorrect, please set kernel params snd_sof_intel_hda_… in create_sdw_dailink()
943 (*dai_links)->nonatomic = true; in create_sdw_dailink()
944 (*dai_links)->ch_maps = codec_maps; in create_sdw_dailink()
946 list_for_each_entry(sof_end, &sof_dai->endpoints, list) { in create_sdw_dailink()
947 if (sof_end->dai_info->init) in create_sdw_dailink()
948 sof_end->dai_info->init(card, *dai_links, in create_sdw_dailink()
949 sof_end->codec_info, in create_sdw_dailink()
965 struct intel_mc_ctx *intel_ctx = (struct intel_mc_ctx *)ctx->private; in create_sdw_dailinks()
969 intel_ctx->sdw_pin_index[i] = SOC_SDW_INTEL_BIDIR_PDI_BASE; in create_sdw_dailinks()
972 while (sof_dais->initialised) { in create_sdw_dailinks()
995 struct device *dev = card->dev; in create_ssp_dailinks()
1000 char *name = devm_kasprintf(dev, GFP_KERNEL, "SSP%d-Codec", i); in create_ssp_dailinks()
1002 char *codec_name = devm_kasprintf(dev, GFP_KERNEL, "i2c-%s:0%d", in create_ssp_dailinks()
1003 ssp_info->acpi_id, j++); in create_ssp_dailinks()
1005 return -ENOMEM; in create_ssp_dailinks()
1007 int playback = ssp_info->dais[0].direction[SNDRV_PCM_STREAM_PLAYBACK]; in create_ssp_dailinks()
1008 int capture = ssp_info->dais[0].direction[SNDRV_PCM_STREAM_CAPTURE]; in create_ssp_dailinks()
1013 ssp_info->dais[0].dai_name, 1, NULL, in create_ssp_dailinks()
1014 ssp_info->ops); in create_ssp_dailinks()
1018 ret = ssp_info->dais[0].init(card, *dai_links, ssp_info, 0); in create_ssp_dailinks()
1031 struct device *dev = card->dev; in create_dmic_dailinks()
1035 0, 1, // DMIC only supports capture in create_dmic_dailinks()
1037 "dmic-codec", "dmic-hifi", 1, in create_dmic_dailinks()
1045 0, 1, // DMIC only supports capture in create_dmic_dailinks()
1047 "dmic-codec", "dmic-hifi", 1, in create_dmic_dailinks()
1062 struct device *dev = card->dev; in create_hdmi_dailinks()
1064 struct intel_mc_ctx *intel_ctx = (struct intel_mc_ctx *)ctx->private; in create_hdmi_dailinks()
1071 return -ENOMEM; in create_hdmi_dailinks()
1075 if (intel_ctx->hdmi.idisp_codec) { in create_hdmi_dailinks()
1078 "intel-hdmi-hifi%d", i + 1); in create_hdmi_dailinks()
1080 codec_name = "snd-soc-dummy"; in create_hdmi_dailinks()
1081 codec_dai_name = "snd-soc-dummy-dai"; in create_hdmi_dailinks()
1085 return -ENOMEM; in create_hdmi_dailinks()
1104 struct device *dev = card->dev; in create_bt_dailinks()
1107 char *name = devm_kasprintf(dev, GFP_KERNEL, "SSP%d-BT", port); in create_bt_dailinks()
1110 return -ENOMEM; in create_bt_dailinks()
1128 struct device *dev = card->dev; in sof_card_dai_links_create()
1129 struct snd_soc_acpi_mach *mach = dev_get_platdata(card->dev); in sof_card_dai_links_create()
1132 struct intel_mc_ctx *intel_ctx = (struct intel_mc_ctx *)ctx->private; in sof_card_dai_links_create()
1133 struct snd_soc_acpi_mach_params *mach_params = &mach->mach_params; in sof_card_dai_links_create()
1160 return -ENOMEM; in sof_card_dai_links_create()
1165 ret = -ENOMEM; in sof_card_dai_links_create()
1176 * on generic tgl platform, I2S or sdw mode is supported in sof_card_dai_links_create()
1178 * system only when I2S mode is supported, not sdw mode. in sof_card_dai_links_create()
1181 ssp_info = asoc_sdw_find_codec_info_acpi(mach->id); in sof_card_dai_links_create()
1187 if (mach_params->codec_mask & IDISP_CODEC_MASK) in sof_card_dai_links_create()
1188 intel_ctx->hdmi.idisp_codec = true; in sof_card_dai_links_create()
1196 if (ctx->ignore_internal_dmic) { in sof_card_dai_links_create()
1197 dev_dbg(dev, "SoundWire DMIC is used, ignoring internal DMIC\n"); in sof_card_dai_links_create()
1198 mach_params->dmic_num = 0; in sof_card_dai_links_create()
1199 } else if (mach_params->dmic_num) { in sof_card_dai_links_create()
1204 * mach_params->dmic_num will be used to set the cfg-mics value of in sof_card_dai_links_create()
1205 * card->components string. Set it to the default value. in sof_card_dai_links_create()
1207 mach_params->dmic_num = DMIC_DEFAULT_CHANNELS; in sof_card_dai_links_create()
1213 dev_dbg(dev, "DAI link numbers: sdw %d, ssp %d, dmic %d, hdmi %d, bt: %d\n", in sof_card_dai_links_create()
1215 intel_ctx->hdmi.idisp_codec ? hdmi_num : 0, bt_num); in sof_card_dai_links_create()
1219 ret = -ENOMEM; in sof_card_dai_links_create()
1227 ret = -ENOMEM; in sof_card_dai_links_create()
1231 card->codec_conf = codec_conf; in sof_card_dai_links_create()
1232 card->num_configs = num_devs; in sof_card_dai_links_create()
1233 card->dai_link = dai_links; in sof_card_dai_links_create()
1234 card->num_links = num_links; in sof_card_dai_links_create()
1252 /* dmic */ in sof_card_dai_links_create()
1271 WARN_ON(codec_conf != card->codec_conf + card->num_configs); in sof_card_dai_links_create()
1272 WARN_ON(dai_links != card->dai_link + card->num_links); in sof_card_dai_links_create()
1285 struct intel_mc_ctx *intel_ctx = (struct intel_mc_ctx *)ctx->private; in sof_sdw_card_late_probe()
1292 if (intel_ctx->hdmi.idisp_codec) in sof_sdw_card_late_probe()
1300 struct snd_soc_acpi_mach *mach = dev_get_platdata(&pdev->dev); in mc_probe()
1307 dev_dbg(&pdev->dev, "Entry\n"); in mc_probe()
1309 intel_ctx = devm_kzalloc(&pdev->dev, sizeof(*intel_ctx), GFP_KERNEL); in mc_probe()
1311 return -ENOMEM; in mc_probe()
1313 ctx = devm_kzalloc(&pdev->dev, sizeof(*ctx), GFP_KERNEL); in mc_probe()
1315 return -ENOMEM; in mc_probe()
1317 ctx->private = intel_ctx; in mc_probe()
1318 ctx->codec_info_list_count = asoc_sdw_get_codec_info_list_count(); in mc_probe()
1319 card = &ctx->card; in mc_probe()
1320 card->dev = &pdev->dev; in mc_probe()
1321 card->name = "soundwire"; in mc_probe()
1322 card->owner = THIS_MODULE; in mc_probe()
1323 card->late_probe = sof_sdw_card_late_probe; in mc_probe()
1327 if (mach->mach_params.subsystem_id_set) { in mc_probe()
1329 mach->mach_params.subsystem_vendor, in mc_probe()
1330 mach->mach_params.subsystem_device); in mc_probe()
1336 if (quirk_override != -1) { in mc_probe()
1337 dev_info(card->dev, "Overriding quirk 0x%lx => 0x%x\n", in mc_probe()
1342 log_quirks(card->dev); in mc_probe()
1344 ctx->mc_quirk = sof_sdw_quirk; in mc_probe()
1346 for (i = 0; i < ctx->codec_info_list_count; i++) in mc_probe()
1358 for (i = 0; i < ctx->codec_info_list_count; i++) in mc_probe()
1361 card->components = devm_kasprintf(card->dev, GFP_KERNEL, in mc_probe()
1362 " cfg-amp:%d", amp_num); in mc_probe()
1363 if (!card->components) in mc_probe()
1364 return -ENOMEM; in mc_probe()
1366 if (mach->mach_params.dmic_num) { in mc_probe()
1367 card->components = devm_kasprintf(card->dev, GFP_KERNEL, in mc_probe()
1368 "%s mic:dmic cfg-mics:%d", in mc_probe()
1369 card->components, in mc_probe()
1370 mach->mach_params.dmic_num); in mc_probe()
1371 if (!card->components) in mc_probe()
1372 return -ENOMEM; in mc_probe()
1376 ret = devm_snd_soc_register_card(card->dev, card); in mc_probe()
1378 dev_err_probe(card->dev, ret, "snd_soc_register_card failed %d\n", ret); in mc_probe()
1414 MODULE_AUTHOR("Bard Liao <yung-chuan.liao@linux.intel.com>");
1416 MODULE_AUTHOR("Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>");