Lines Matching +full:dmic +full:- +full:codec
1 // SPDX-License-Identifier: GPL-2.0-only
5 * acp-sdw-sof-mach - ASoC Machine driver for AMD SoundWire platforms
15 #include <sound/soc-acpi.h>
20 static int quirk_override = -1;
22 MODULE_PARM_DESC(quirk, "Board-specific quirk override");
27 dev_dbg(dev, "quirk realtek,jack-detect-source %ld\n", in log_quirks()
35 sof_sdw_quirk = (unsigned long)id->driver_data; in sof_sdw_quirk_cb()
44 DMI_MATCH(DMI_PRODUCT_NAME, "Birman-PHX"),
74 struct device *dev = card->dev; in create_sdw_dailink()
76 struct amd_mc_ctx *amd_ctx = (struct amd_mc_ctx *)ctx->private; in create_sdw_dailink()
82 list_for_each_entry(sof_end, &sof_dai->endpoints, list) { in create_sdw_dailink()
83 if (sof_end->name_prefix) { in create_sdw_dailink()
84 (*codec_conf)->dlc.name = sof_end->codec_name; in create_sdw_dailink()
85 (*codec_conf)->name_prefix = sof_end->name_prefix; in create_sdw_dailink()
89 if (sof_end->include_sidecar) { in create_sdw_dailink()
90 ret = sof_end->codec_info->add_sidecar(card, dai_links, codec_conf); in create_sdw_dailink()
98 "SDW%d-PIN%d-PLAYBACK", in create_sdw_dailink()
99 "SDW%d-PIN%d-CAPTURE", in create_sdw_dailink()
100 "SDW%d-PIN%d-PLAYBACK-%s", in create_sdw_dailink()
101 "SDW%d-PIN%d-CAPTURE-%s", in create_sdw_dailink()
106 int num_cpus = hweight32(sof_dai->link_mask[stream]); in create_sdw_dailink()
107 int num_codecs = sof_dai->num_devs[stream]; in create_sdw_dailink()
112 if (!sof_dai->num_devs[stream]) in create_sdw_dailink()
115 sof_end = list_first_entry(&sof_dai->endpoints, in create_sdw_dailink()
118 *be_id = sof_end->dai_info->dailink[stream]; in create_sdw_dailink()
121 return -EINVAL; in create_sdw_dailink()
124 switch (amd_ctx->acp_rev) { in create_sdw_dailink()
126 ret = get_acp63_cpu_pin_id(ffs(sof_end->link_mask - 1), in create_sdw_dailink()
133 ret = get_acp70_cpu_pin_id(ffs(sof_end->link_mask - 1), in create_sdw_dailink()
139 return -EINVAL; in create_sdw_dailink()
142 if (ctx->append_dai_type) { in create_sdw_dailink()
145 ffs(sof_end->link_mask) - 1, in create_sdw_dailink()
147 type_strings[sof_end->dai_info->dai_type]); in create_sdw_dailink()
151 ffs(sof_end->link_mask) - 1, in create_sdw_dailink()
155 return -ENOMEM; in create_sdw_dailink()
159 return -ENOMEM; in create_sdw_dailink()
163 return -ENOMEM; in create_sdw_dailink()
167 return -ENOMEM; in create_sdw_dailink()
169 list_for_each_entry(sof_end, &sof_dai->endpoints, list) { in create_sdw_dailink()
170 if (!sof_end->dai_info->direction[stream]) in create_sdw_dailink()
173 int link_num = ffs(sof_end->link_mask) - 1; in create_sdw_dailink()
175 cpus->dai_name = devm_kasprintf(dev, GFP_KERNEL, in create_sdw_dailink()
178 dev_dbg(dev, "cpu->dai_name:%s\n", cpus->dai_name); in create_sdw_dailink()
179 if (!cpus->dai_name) in create_sdw_dailink()
180 return -ENOMEM; in create_sdw_dailink()
183 codec_maps[j].codec = j; in create_sdw_dailink()
185 codecs[j].name = sof_end->codec_name; in create_sdw_dailink()
186 codecs[j].dai_name = sof_end->dai_info->dai_name; in create_sdw_dailink()
204 (*dai_links)->nonatomic = true; in create_sdw_dailink()
205 (*dai_links)->ch_maps = codec_maps; in create_sdw_dailink()
207 list_for_each_entry(sof_end, &sof_dai->endpoints, list) { in create_sdw_dailink()
208 if (sof_end->dai_info->init) in create_sdw_dailink()
209 sof_end->dai_info->init(card, *dai_links, in create_sdw_dailink()
210 sof_end->codec_info, in create_sdw_dailink()
228 while (sof_dais->initialised) { in create_sdw_dailinks()
249 struct device *dev = card->dev; in create_dmic_dailinks()
252 ret = asoc_sdw_init_simple_dai_link(dev, *dai_links, be_id, "acp-dmic-codec", in create_dmic_dailinks()
253 0, 1, // DMIC only supports capture in create_dmic_dailinks()
254 "acp-sof-dmic", platform_component->name, in create_dmic_dailinks()
255 "dmic-codec", "dmic-hifi", no_pcm, in create_dmic_dailinks()
267 struct device *dev = card->dev; in sof_card_dai_links_create()
268 struct snd_soc_acpi_mach *mach = dev_get_platdata(card->dev); in sof_card_dai_links_create()
271 struct snd_soc_acpi_mach_params *mach_params = &mach->mach_params; in sof_card_dai_links_create()
291 return -ENOMEM; in sof_card_dai_links_create()
293 /* One per endpoint, ie. each DAI on each codec/amp */ in sof_card_dai_links_create()
296 return -ENOMEM; in sof_card_dai_links_create()
304 /* enable dmic */ in sof_card_dai_links_create()
305 if (sof_sdw_quirk & ASOC_SDW_ACP_DMIC || mach_params->dmic_num) in sof_card_dai_links_create()
308 dev_dbg(dev, "sdw %d, dmic %d", sdw_be_num, dmic_num); in sof_card_dai_links_create()
312 return -ENOMEM; in sof_card_dai_links_create()
318 return -ENOMEM; in sof_card_dai_links_create()
320 card->codec_conf = codec_conf; in sof_card_dai_links_create()
321 card->num_configs = num_devs; in sof_card_dai_links_create()
322 card->dai_link = dai_links; in sof_card_dai_links_create()
323 card->num_links = num_links; in sof_card_dai_links_create()
333 /* dmic */ in sof_card_dai_links_create()
335 if (ctx->ignore_internal_dmic) { in sof_card_dai_links_create()
336 dev_warn(dev, "Ignoring ACP DMIC\n"); in sof_card_dai_links_create()
344 WARN_ON(codec_conf != card->codec_conf + card->num_configs); in sof_card_dai_links_create()
345 WARN_ON(dai_links != card->dai_link + card->num_links); in sof_card_dai_links_create()
352 struct snd_soc_acpi_mach *mach = dev_get_platdata(&pdev->dev); in mc_probe()
359 amd_ctx = devm_kzalloc(&pdev->dev, sizeof(*amd_ctx), GFP_KERNEL); in mc_probe()
361 return -ENOMEM; in mc_probe()
363 amd_ctx->acp_rev = mach->mach_params.subsystem_rev; in mc_probe()
364 amd_ctx->max_sdw_links = ACP63_SDW_MAX_LINKS; in mc_probe()
365 ctx = devm_kzalloc(&pdev->dev, sizeof(*ctx), GFP_KERNEL); in mc_probe()
367 return -ENOMEM; in mc_probe()
368 ctx->codec_info_list_count = asoc_sdw_get_codec_info_list_count(); in mc_probe()
369 ctx->private = amd_ctx; in mc_probe()
370 card = &ctx->card; in mc_probe()
371 card->dev = &pdev->dev; in mc_probe()
372 card->name = "amd-soundwire"; in mc_probe()
373 card->owner = THIS_MODULE; in mc_probe()
374 card->late_probe = asoc_sdw_card_late_probe; in mc_probe()
380 if (quirk_override != -1) { in mc_probe()
381 dev_info(card->dev, "Overriding quirk 0x%lx => 0x%x\n", in mc_probe()
386 log_quirks(card->dev); in mc_probe()
388 ctx->mc_quirk = sof_sdw_quirk; in mc_probe()
390 for (i = 0; i < ctx->codec_info_list_count; i++) in mc_probe()
398 * the default amp_num is zero for each codec and in mc_probe()
402 for (i = 0; i < ctx->codec_info_list_count; i++) in mc_probe()
405 card->components = devm_kasprintf(card->dev, GFP_KERNEL, in mc_probe()
406 " cfg-amp:%d", amp_num); in mc_probe()
407 if (!card->components) in mc_probe()
408 return -ENOMEM; in mc_probe()
411 ret = devm_snd_soc_register_card(card->dev, card); in mc_probe()
413 dev_err_probe(card->dev, ret, "snd_soc_register_card failed %d\n", ret); in mc_probe()