Lines Matching +full:dai +full:- +full:format
1 // SPDX-License-Identifier: GPL-2.0+
3 // soc-core.c -- ALSA SoC Audio Layer
11 // with code, comments and ideas from :-
39 #include <sound/soc-dpcm.h>
40 #include <sound/soc-topology.h>
41 #include <sound/soc-link.h>
75 return sprintf(buf, "%ld\n", rtd->pmdown_time); in pmdown_time_show()
85 ret = kstrtol(buf, 10, &rtd->pmdown_time); in pmdown_time_set()
109 return attr->mode; /* always visible */ in soc_dev_attr_is_visible()
110 return rtd->num_codecs ? attr->mode : 0; /* enabled only with codec */ in soc_dev_attr_is_visible()
135 if (!component->card->debugfs_card_root) in soc_init_component_debugfs()
138 if (component->debugfs_prefix) { in soc_init_component_debugfs()
142 component->debugfs_prefix, component->name); in soc_init_component_debugfs()
144 component->debugfs_root = debugfs_create_dir(name, in soc_init_component_debugfs()
145 component->card->debugfs_card_root); in soc_init_component_debugfs()
149 component->debugfs_root = debugfs_create_dir(component->name, in soc_init_component_debugfs()
150 component->card->debugfs_card_root); in soc_init_component_debugfs()
154 component->debugfs_root); in soc_init_component_debugfs()
159 if (!component->debugfs_root) in soc_cleanup_component_debugfs()
161 debugfs_remove_recursive(component->debugfs_root); in soc_cleanup_component_debugfs()
162 component->debugfs_root = NULL; in soc_cleanup_component_debugfs()
168 struct snd_soc_dai *dai; in dai_list_show() local
173 for_each_component_dais(component, dai) in dai_list_show()
174 seq_printf(m, "%s\n", dai->name); in dai_list_show()
189 seq_printf(m, "%s\n", component->name); in component_list_show()
199 card->debugfs_card_root = debugfs_create_dir(card->name, in soc_init_card_debugfs()
202 debugfs_create_u32("dapm_pop_time", 0644, card->debugfs_card_root, in soc_init_card_debugfs()
203 &card->pop_time); in soc_init_card_debugfs()
205 snd_soc_dapm_debugfs_init(&card->dapm, card->debugfs_card_root); in soc_init_card_debugfs()
210 debugfs_remove_recursive(card->debugfs_card_root); in soc_cleanup_card_debugfs()
211 card->debugfs_card_root = NULL; in soc_cleanup_card_debugfs()
273 rtd->components[rtd->num_components] = component; in snd_soc_rtd_add_component()
274 rtd->num_components++; in snd_soc_rtd_add_component()
297 const char *component_name = component->driver->name; in snd_soc_rtdcom_lookup()
319 if ((dev == component->dev) && in snd_soc_lookup_component_nolocked()
321 (driver_name == component->driver->name) || in snd_soc_lookup_component_nolocked()
322 (strcmp(component->driver->name, driver_name) == 0))) { in snd_soc_lookup_component_nolocked()
352 if (rtd->dai_link == dai_link) in snd_soc_get_pcm_runtime()
355 dev_dbg(card->dev, "ASoC: failed to find rtd %s\n", dai_link->name); in snd_soc_get_pcm_runtime()
370 mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass); in snd_soc_close_delayed_work()
372 dev_dbg(rtd->dev, in snd_soc_close_delayed_work()
374 codec_dai->driver->playback.stream_name, in snd_soc_close_delayed_work()
377 rtd->pop_wait ? "yes" : "no"); in snd_soc_close_delayed_work()
379 /* are we waiting on this codec DAI stream */ in snd_soc_close_delayed_work()
380 if (rtd->pop_wait == 1) { in snd_soc_close_delayed_work()
381 rtd->pop_wait = 0; in snd_soc_close_delayed_work()
386 mutex_unlock(&rtd->card->pcm_mutex); in snd_soc_close_delayed_work()
392 /* "dev" means "rtd->dev" */ in soc_release_rtd_dev()
401 list_del(&rtd->list); in soc_free_pcm_runtime()
403 if (delayed_work_pending(&rtd->delayed_work)) in soc_free_pcm_runtime()
404 flush_delayed_work(&rtd->delayed_work); in soc_free_pcm_runtime()
408 * we don't need to call kfree() for rtd->dev in soc_free_pcm_runtime()
412 * We don't need rtd->dev NULL check, because in soc_free_pcm_runtime()
417 device_unregister(rtd->dev); in soc_free_pcm_runtime()
425 if (rtd->close_delayed_work_func) in close_delayed_work()
426 rtd->close_delayed_work_func(rtd); in close_delayed_work()
439 * for rtd->dev in soc_new_pcm_runtime()
445 dev->parent = card->dev; in soc_new_pcm_runtime()
446 dev->release = soc_release_rtd_dev; in soc_new_pcm_runtime()
448 dev_set_name(dev, "%s", dai_link->name); in soc_new_pcm_runtime()
461 sizeof(*component) * (dai_link->num_cpus + in soc_new_pcm_runtime()
462 dai_link->num_codecs + in soc_new_pcm_runtime()
463 dai_link->num_platforms), in soc_new_pcm_runtime()
468 rtd->dev = dev; in soc_new_pcm_runtime()
469 INIT_LIST_HEAD(&rtd->list); in soc_new_pcm_runtime()
471 INIT_LIST_HEAD(&rtd->dpcm[stream].be_clients); in soc_new_pcm_runtime()
472 INIT_LIST_HEAD(&rtd->dpcm[stream].fe_clients); in soc_new_pcm_runtime()
475 INIT_DELAYED_WORK(&rtd->delayed_work, close_delayed_work); in soc_new_pcm_runtime()
478 * for rtd->dais in soc_new_pcm_runtime()
480 rtd->dais = devm_kcalloc(dev, dai_link->num_cpus + dai_link->num_codecs, in soc_new_pcm_runtime()
483 if (!rtd->dais) in soc_new_pcm_runtime()
489 * |--- num_cpus ---|--- num_codecs --| in soc_new_pcm_runtime()
494 rtd->num_cpus = dai_link->num_cpus; in soc_new_pcm_runtime()
495 rtd->num_codecs = dai_link->num_codecs; in soc_new_pcm_runtime()
496 rtd->card = card; in soc_new_pcm_runtime()
497 rtd->dai_link = dai_link; in soc_new_pcm_runtime()
498 rtd->num = card->num_rtd++; in soc_new_pcm_runtime()
501 list_add_tail(&rtd->list, &card->rtd_list); in soc_new_pcm_runtime()
519 flush_delayed_work(&rtd->delayed_work); in snd_soc_flush_all_delayed_work()
533 if (!card->instantiated) in snd_soc_suspend()
538 * suspend before that's finished - wait for it to complete. in snd_soc_suspend()
540 snd_power_wait(card->snd_card, SNDRV_CTL_POWER_D0); in snd_soc_suspend()
543 snd_power_change_state(card->snd_card, SNDRV_CTL_POWER_D3hot); in snd_soc_suspend()
547 struct snd_soc_dai *dai; in snd_soc_suspend() local
549 if (rtd->dai_link->ignore_suspend) in snd_soc_suspend()
552 for_each_rtd_dais(rtd, i, dai) { in snd_soc_suspend()
553 if (snd_soc_dai_stream_active(dai, playback)) in snd_soc_suspend()
554 snd_soc_dai_digital_mute(dai, 1, playback); in snd_soc_suspend()
560 if (rtd->dai_link->ignore_suspend) in snd_soc_suspend()
563 snd_pcm_suspend_all(rtd->pcm); in snd_soc_suspend()
574 if (rtd->dai_link->ignore_suspend) in snd_soc_suspend()
584 snd_soc_dapm_sync(&card->dapm); in snd_soc_suspend()
589 if (rtd->dai_link->ignore_suspend) in snd_soc_suspend()
614 if (dapm->idle_bias_off) { in snd_soc_suspend()
615 dev_dbg(component->dev, in snd_soc_suspend()
623 if (component->regmap) in snd_soc_suspend()
624 regcache_mark_dirty(component->regmap); in snd_soc_suspend()
626 pinctrl_pm_select_sleep_state(component->dev); in snd_soc_suspend()
629 dev_dbg(component->dev, in snd_soc_suspend()
660 dev_dbg(card->dev, "ASoC: starting resume work\n"); in soc_resume_deferred()
663 snd_power_change_state(card->snd_card, SNDRV_CTL_POWER_D2); in soc_resume_deferred()
675 if (rtd->dai_link->ignore_suspend) in soc_resume_deferred()
685 struct snd_soc_dai *dai; in soc_resume_deferred() local
688 if (rtd->dai_link->ignore_suspend) in soc_resume_deferred()
691 for_each_rtd_dais(rtd, i, dai) { in soc_resume_deferred()
692 if (snd_soc_dai_stream_active(dai, playback)) in soc_resume_deferred()
693 snd_soc_dai_digital_mute(dai, 0, playback); in soc_resume_deferred()
699 dev_dbg(card->dev, "ASoC: resume work completed\n"); in soc_resume_deferred()
703 snd_soc_dapm_sync(&card->dapm); in soc_resume_deferred()
706 snd_power_change_state(card->snd_card, SNDRV_CTL_POWER_D0); in soc_resume_deferred()
716 if (!card->instantiated) in snd_soc_resume()
722 pinctrl_pm_select_default_state(component->dev); in snd_soc_resume()
725 if (!schedule_work(&card->deferred_resume_work)) in snd_soc_resume()
735 INIT_WORK(&card->deferred_resume_work, soc_resume_deferred); in soc_resume_init()
750 of_node = component->dev->of_node; in soc_component_to_node()
751 if (!of_node && component->dev->parent) in soc_component_to_node()
752 of_node = component->dev->parent->of_node; in soc_component_to_node()
768 if (dlc->of_node && component_of_node != dlc->of_node) in snd_soc_is_matching_component()
770 if (dlc->name && strcmp(component->name, dlc->name)) in snd_soc_is_matching_component()
799 * snd_soc_find_dai - Find a registered DAI
801 * @dlc: name of the DAI or the DAI driver and optional component info to match
804 * find the DAI of the same name. The component's of_node and name
807 * Return: pointer of DAI, or NULL if not found.
813 struct snd_soc_dai *dai; in snd_soc_find_dai() local
817 /* Find CPU DAI from registered DAIs */ in snd_soc_find_dai()
821 for_each_component_dais(component, dai) { in snd_soc_find_dai()
822 if (dlc->dai_name && strcmp(dai->name, dlc->dai_name) in snd_soc_find_dai()
823 && (!dai->driver->name in snd_soc_find_dai()
824 || strcmp(dai->driver->name, dlc->dai_name))) in snd_soc_find_dai()
827 return dai; in snd_soc_find_dai()
838 struct snd_soc_dai *dai; in snd_soc_find_dai_with_mutex() local
841 dai = snd_soc_find_dai(dlc); in snd_soc_find_dai_with_mutex()
844 return dai; in snd_soc_find_dai_with_mutex()
859 if (!!codec->name == !!codec->of_node) { in soc_dai_link_sanity_check()
860 dev_err(card->dev, "ASoC: Neither/both codec name/of_node are set for %s\n", in soc_dai_link_sanity_check()
861 link->name); in soc_dai_link_sanity_check()
862 return -EINVAL; in soc_dai_link_sanity_check()
865 /* Codec DAI name must be specified */ in soc_dai_link_sanity_check()
866 if (!codec->dai_name) { in soc_dai_link_sanity_check()
867 dev_err(card->dev, "ASoC: codec_dai_name not set for %s\n", in soc_dai_link_sanity_check()
868 link->name); in soc_dai_link_sanity_check()
869 return -EINVAL; in soc_dai_link_sanity_check()
877 dev_dbg(card->dev, in soc_dai_link_sanity_check()
879 codec->name, link->name); in soc_dai_link_sanity_check()
880 return -EPROBE_DEFER; in soc_dai_link_sanity_check()
890 if (!!platform->name == !!platform->of_node) { in soc_dai_link_sanity_check()
891 dev_err(card->dev, in soc_dai_link_sanity_check()
893 link->name); in soc_dai_link_sanity_check()
894 return -EINVAL; in soc_dai_link_sanity_check()
902 dev_dbg(card->dev, in soc_dai_link_sanity_check()
904 platform->name, link->name); in soc_dai_link_sanity_check()
905 return -EPROBE_DEFER; in soc_dai_link_sanity_check()
912 * can be left unspecified, and will be matched based on DAI in soc_dai_link_sanity_check()
915 if (cpu->name && cpu->of_node) { in soc_dai_link_sanity_check()
916 dev_err(card->dev, in soc_dai_link_sanity_check()
918 link->name); in soc_dai_link_sanity_check()
919 return -EINVAL; in soc_dai_link_sanity_check()
923 * Defer card registration if cpu dai component is not added to in soc_dai_link_sanity_check()
926 if ((cpu->of_node || cpu->name) && in soc_dai_link_sanity_check()
928 dev_dbg(card->dev, in soc_dai_link_sanity_check()
930 cpu->name, link->name); in soc_dai_link_sanity_check()
931 return -EPROBE_DEFER; in soc_dai_link_sanity_check()
935 * At least one of CPU DAI name or CPU device name/node must be in soc_dai_link_sanity_check()
938 if (!cpu->dai_name && in soc_dai_link_sanity_check()
939 !(cpu->name || cpu->of_node)) { in soc_dai_link_sanity_check()
940 dev_err(card->dev, in soc_dai_link_sanity_check()
942 link->name); in soc_dai_link_sanity_check()
943 return -EINVAL; in soc_dai_link_sanity_check()
951 * snd_soc_remove_pcm_runtime - Remove a pcm_runtime from card
968 snd_soc_card_remove_dai_link(card, rtd->dai_link); in snd_soc_remove_pcm_runtime()
975 * snd_soc_add_pcm_runtime - Add a pcm_runtime dynamically via dai_link
977 * @dai_link: The DAI link to find pcm_runtime
983 * DAI links in dai_link array.
1002 if (dai_link->ignore) in snd_soc_add_pcm_runtime()
1005 dev_dbg(card->dev, "ASoC: binding %s\n", dai_link->name); in snd_soc_add_pcm_runtime()
1013 return -ENOMEM; in snd_soc_add_pcm_runtime()
1018 dev_info(card->dev, "ASoC: CPU DAI %s not registered\n", in snd_soc_add_pcm_runtime()
1019 cpu->dai_name); in snd_soc_add_pcm_runtime()
1022 snd_soc_rtd_add_component(rtd, asoc_rtd_to_cpu(rtd, i)->component); in snd_soc_add_pcm_runtime()
1029 dev_info(card->dev, "ASoC: CODEC DAI %s not registered\n", in snd_soc_add_pcm_runtime()
1030 codec->dai_name); in snd_soc_add_pcm_runtime()
1034 snd_soc_rtd_add_component(rtd, asoc_rtd_to_codec(rtd, i)->component); in snd_soc_add_pcm_runtime()
1051 return -EPROBE_DEFER; in snd_soc_add_pcm_runtime()
1058 struct snd_soc_dai_link *dai_link = rtd->dai_link; in soc_init_pcm_runtime()
1064 rtd->pmdown_time = pmdown_time; in soc_init_pcm_runtime()
1071 if (dai_link->dai_fmt) { in soc_init_pcm_runtime()
1072 ret = snd_soc_runtime_set_dai_fmt(rtd, dai_link->dai_fmt); in soc_init_pcm_runtime()
1080 num = rtd->num; in soc_init_pcm_runtime()
1083 * most drivers will register their PCMs using DAI link ordering but in soc_init_pcm_runtime()
1084 * topology based drivers can use the DAI link id field to set PCM in soc_init_pcm_runtime()
1088 if (!component->driver->use_dai_pcm_id) in soc_init_pcm_runtime()
1091 if (rtd->dai_link->no_pcm) in soc_init_pcm_runtime()
1092 num += component->driver->be_pcm_base; in soc_init_pcm_runtime()
1094 num = rtd->dai_link->id; in soc_init_pcm_runtime()
1099 if (ret != -ENOTSUPP) { in soc_init_pcm_runtime()
1101 dev_err(card->dev, "ASoC: can't create compress %s\n", in soc_init_pcm_runtime()
1102 dai_link->stream_name); in soc_init_pcm_runtime()
1109 dev_err(card->dev, "ASoC: can't create pcm %s :%d\n", in soc_init_pcm_runtime()
1110 dai_link->stream_name, ret); in soc_init_pcm_runtime()
1124 for (i = 0; i < card->num_configs; i++) { in soc_set_name_prefix()
1125 struct snd_soc_codec_conf *map = &card->codec_conf[i]; in soc_set_name_prefix()
1127 if (snd_soc_is_matching_component(&map->dlc, component)) { in soc_set_name_prefix()
1128 component->name_prefix = map->name_prefix; in soc_set_name_prefix()
1137 ret = of_property_read_string(of_node, "sound-name-prefix", &str); in soc_set_name_prefix()
1141 component->name_prefix = str; in soc_set_name_prefix()
1148 if (!component->card) in soc_remove_component()
1157 list_del_init(&component->card_list); in soc_remove_component()
1160 component->card = NULL; in soc_remove_component()
1169 struct snd_soc_dai *dai; in soc_probe_component() local
1173 if (!strcmp(component->name, "snd-soc-dummy")) in soc_probe_component()
1176 if (component->card) { in soc_probe_component()
1177 if (component->card != card) { in soc_probe_component()
1178 dev_err(component->dev, in soc_probe_component()
1180 card->name, component->card->name); in soc_probe_component()
1181 return -ENODEV; in soc_probe_component()
1190 component->card = card; in soc_probe_component()
1198 component->driver->dapm_widgets, in soc_probe_component()
1199 component->driver->num_dapm_widgets); in soc_probe_component()
1202 dev_err(component->dev, in soc_probe_component()
1207 for_each_component_dais(component, dai) { in soc_probe_component()
1208 ret = snd_soc_dapm_new_dai_widgets(dapm, dai); in soc_probe_component()
1210 dev_err(component->dev, in soc_probe_component()
1211 "Failed to create DAI widgets %d\n", ret); in soc_probe_component()
1218 dev_err(component->dev, in soc_probe_component()
1222 WARN(dapm->idle_bias_off && in soc_probe_component()
1223 dapm->bias_level != SND_SOC_BIAS_OFF, in soc_probe_component()
1224 "codec %s can not start from non-off bias with idle_bias_off==1\n", in soc_probe_component()
1225 component->name); in soc_probe_component()
1238 component->driver->controls, in soc_probe_component()
1239 component->driver->num_controls); in soc_probe_component()
1244 component->driver->dapm_routes, in soc_probe_component()
1245 component->driver->num_dapm_routes); in soc_probe_component()
1247 if (card->disable_route_checks) { in soc_probe_component()
1248 dev_info(card->dev, in soc_probe_component()
1252 dev_err(card->dev, in soc_probe_component()
1260 list_add(&component->card_list, &card->component_dev_list); in soc_probe_component()
1290 dev_dbg(card->dev, in soc_probe_link_dais()
1291 "ASoC: probe %s dai link %d late %d\n", in soc_probe_link_dais()
1292 card->name, rtd->num, order); in soc_probe_link_dais()
1313 if (component->driver->remove_order != order) in soc_remove_link_components()
1331 if (component->driver->probe_order != order) in soc_probe_link_components()
1351 list_del(&component->card_aux_list); in soc_unbind_aux_dev()
1363 component = soc_find_component(&aux->dlc); in soc_bind_aux_dev()
1365 return -EPROBE_DEFER; in soc_bind_aux_dev()
1370 list_add(&component->card_aux_list, &card->aux_comp_list); in soc_bind_aux_dev()
1383 if (component->driver->probe_order != order) in soc_probe_aux_devices()
1402 if (comp->driver->remove_order == order) in soc_remove_aux_devices()
1409 * snd_soc_runtime_set_dai_fmt() - Change DAI link format for a ASoC runtime
1410 * @rtd: The runtime for which the DAI link format should be changed
1411 * @dai_fmt: The new DAI link format
1413 * This function updates the DAI link format for all DAIs connected to the DAI
1416 * Note: For setups with a static format set the dai_fmt field in the
1432 if (ret != 0 && ret != -ENOTSUPP) { in snd_soc_runtime_set_dai_fmt()
1433 dev_warn(codec_dai->dev, in snd_soc_runtime_set_dai_fmt()
1434 "ASoC: Failed to set DAI format: %d\n", ret); in snd_soc_runtime_set_dai_fmt()
1440 * Flip the polarity for the "CPU" end of a CODEC<->CODEC link in snd_soc_runtime_set_dai_fmt()
1461 if (cpu_dai->component->driver->non_legacy_dai_naming) in snd_soc_runtime_set_dai_fmt()
1465 if (ret != 0 && ret != -ENOTSUPP) { in snd_soc_runtime_set_dai_fmt()
1466 dev_warn(cpu_dai->dev, in snd_soc_runtime_set_dai_fmt()
1467 "ASoC: Failed to set DAI format: %d\n", ret); in snd_soc_runtime_set_dai_fmt()
1479 * "Type2 - Board Manufacturer" or "Type1 - TBD by OEM"), it will be taken
1493 * Trim special characters, and replace '-' with '_' since '-' is used to
1505 else if (name[i] == '-') in cleanup_dmi_name()
1530 * Append a string to card->dmi_longname with character cleanups.
1534 char *dst = card->dmi_longname; in append_dmi_string()
1535 size_t dst_len = sizeof(card->dmi_longname); in append_dmi_string()
1539 snprintf(dst + len, dst_len - len, "-%s", str); in append_dmi_string()
1541 len++; /* skip the separator "-" */ in append_dmi_string()
1547 * snd_soc_set_dmi_name() - Register DMI names to card
1555 * device-specific configurations, this function allows DMI info to be used
1556 * as the sound card long name, in the format of
1557 * "vendor-product-version-board"
1558 * (Character '-' is used to separate different DMI fields here).
1559 * This will help the user space to load the device-specific Use Case Manager
1563 * DellInc.-XPS139343-01-0310JH
1564 * ASUSTeKCOMPUTERINC.-T100TA-1.0-T100TA
1565 * Circuitco-MinnowboardMaxD0PLATFORM-D0-MinnowBoardMAX
1568 * the extra differentiation, like "vendor-product-version-board-flavor".
1581 if (card->long_name) in snd_soc_set_dmi_name()
1584 /* make up dmi long name as: vendor-product-version-board */ in snd_soc_set_dmi_name()
1587 dev_warn(card->dev, "ASoC: no DMI vendor name!\n"); in snd_soc_set_dmi_name()
1591 snprintf(card->dmi_longname, sizeof(card->dmi_longname), "%s", vendor); in snd_soc_set_dmi_name()
1592 cleanup_dmi_name(card->dmi_longname); in snd_soc_set_dmi_name()
1599 * some vendors like Lenovo may only put a self-explanatory in snd_soc_set_dmi_name()
1613 dev_warn(card->dev, "ASoC: no DMI board/product name!\n"); in snd_soc_set_dmi_name()
1622 card->long_name = card->dmi_longname; in snd_soc_set_dmi_name()
1639 if (!component->driver->ignore_machine) in soc_check_tplg_fes()
1643 if (!strcmp(component->driver->ignore_machine, in soc_check_tplg_fes()
1644 card->dev->driver->name)) in soc_check_tplg_fes()
1646 if (strcmp(component->driver->ignore_machine, in soc_check_tplg_fes()
1647 dev_name(card->dev))) in soc_check_tplg_fes()
1654 if (dai_link->dynamic) { in soc_check_tplg_fes()
1655 dai_link->ignore = true; in soc_check_tplg_fes()
1659 dev_dbg(card->dev, "info: override BE DAI link %s\n", in soc_check_tplg_fes()
1660 card->dai_link[i].name); in soc_check_tplg_fes()
1663 if (!dai_link->platforms) { in soc_check_tplg_fes()
1664 dev_err(card->dev, "init platform error"); in soc_check_tplg_fes()
1667 dai_link->platforms->name = component->name; in soc_check_tplg_fes()
1670 if (!dai_link->no_pcm) { in soc_check_tplg_fes()
1671 dai_link->no_pcm = 1; in soc_check_tplg_fes()
1673 if (dai_link->dpcm_playback) in soc_check_tplg_fes()
1674 dev_warn(card->dev, in soc_check_tplg_fes()
1676 dai_link->name); in soc_check_tplg_fes()
1677 if (dai_link->dpcm_capture) in soc_check_tplg_fes()
1678 dev_warn(card->dev, in soc_check_tplg_fes()
1680 dai_link->name); in soc_check_tplg_fes()
1683 if (!(dai_link->dpcm_playback || in soc_check_tplg_fes()
1684 dai_link->dpcm_capture)) { in soc_check_tplg_fes()
1685 dai_link->dpcm_playback = !dai_link->capture_only; in soc_check_tplg_fes()
1686 dai_link->dpcm_capture = !dai_link->playback_only; in soc_check_tplg_fes()
1695 dai_link->be_hw_params_fixup = in soc_check_tplg_fes()
1696 component->driver->be_hw_params_fixup; in soc_check_tplg_fes()
1700 * dai link name if it's NULL to help bind widgets. in soc_check_tplg_fes()
1702 if (!dai_link->stream_name) in soc_check_tplg_fes()
1703 dai_link->stream_name = dai_link->name; in soc_check_tplg_fes()
1707 if (component->driver->topology_name_prefix) { in soc_check_tplg_fes()
1710 if (!card->topology_shortname_created) { in soc_check_tplg_fes()
1711 comp_drv = component->driver; in soc_check_tplg_fes()
1713 snprintf(card->topology_shortname, 32, "%s-%s", in soc_check_tplg_fes()
1714 comp_drv->topology_name_prefix, in soc_check_tplg_fes()
1715 card->name); in soc_check_tplg_fes()
1716 card->topology_shortname_created = true; in soc_check_tplg_fes()
1720 card->name = card->topology_shortname; in soc_check_tplg_fes()
1742 * searches in the user-space. in __soc_setup_card_name()
1745 * "abcd??efg" -> "abcd__efg" in __soc_setup_card_name()
1750 case '-': in __soc_setup_card_name()
1765 if (card->snd_card) in soc_cleanup_card_resources()
1766 snd_card_disconnect_sync(card->snd_card); in soc_cleanup_card_resources()
1770 /* remove and free each DAI */ in soc_cleanup_card_resources()
1781 snd_soc_dapm_free(&card->dapm); in soc_cleanup_card_resources()
1787 if (card->snd_card) { in soc_cleanup_card_resources()
1788 snd_card_free(card->snd_card); in soc_cleanup_card_resources()
1789 card->snd_card = NULL; in soc_cleanup_card_resources()
1795 if (card->instantiated) { in snd_soc_unbind_card()
1796 card->instantiated = false; in snd_soc_unbind_card()
1801 list_add(&card->list, &unbind_card_list); in snd_soc_unbind_card()
1804 list_del(&card->list); in snd_soc_unbind_card()
1816 mutex_lock_nested(&card->mutex, SND_SOC_CARD_CLASS_INIT); in snd_soc_bind_card()
1818 snd_soc_dapm_init(&card->dapm, card, NULL); in snd_soc_bind_card()
1828 /* add predefined DAI links to the list */ in snd_soc_bind_card()
1829 card->num_rtd = 0; in snd_soc_bind_card()
1837 ret = snd_card_new(card->dev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1, in snd_soc_bind_card()
1838 card->owner, 0, &card->snd_card); in snd_soc_bind_card()
1840 dev_err(card->dev, in snd_soc_bind_card()
1842 card->name, ret); in snd_soc_bind_card()
1850 ret = snd_soc_dapm_new_controls(&card->dapm, card->dapm_widgets, in snd_soc_bind_card()
1851 card->num_dapm_widgets); in snd_soc_bind_card()
1855 ret = snd_soc_dapm_new_controls(&card->dapm, card->of_dapm_widgets, in snd_soc_bind_card()
1856 card->num_of_dapm_widgets); in snd_soc_bind_card()
1865 /* probe all components used by DAI links on this card */ in snd_soc_bind_card()
1868 dev_err(card->dev, in snd_soc_bind_card()
1876 dev_err(card->dev, in snd_soc_bind_card()
1881 /* probe all DAI links on this card */ in snd_soc_bind_card()
1884 dev_err(card->dev, in snd_soc_bind_card()
1898 ret = snd_soc_add_card_controls(card, card->controls, in snd_soc_bind_card()
1899 card->num_controls); in snd_soc_bind_card()
1903 ret = snd_soc_dapm_add_routes(&card->dapm, card->dapm_routes, in snd_soc_bind_card()
1904 card->num_dapm_routes); in snd_soc_bind_card()
1906 if (card->disable_route_checks) { in snd_soc_bind_card()
1907 dev_info(card->dev, in snd_soc_bind_card()
1911 dev_err(card->dev, in snd_soc_bind_card()
1918 ret = snd_soc_dapm_add_routes(&card->dapm, card->of_dapm_routes, in snd_soc_bind_card()
1919 card->num_of_dapm_routes); in snd_soc_bind_card()
1926 soc_setup_card_name(card->snd_card->shortname, in snd_soc_bind_card()
1927 card->name, NULL, 0); in snd_soc_bind_card()
1928 soc_setup_card_name(card->snd_card->longname, in snd_soc_bind_card()
1929 card->long_name, card->name, 0); in snd_soc_bind_card()
1930 soc_setup_card_name(card->snd_card->driver, in snd_soc_bind_card()
1931 card->driver_name, card->name, 1); in snd_soc_bind_card()
1933 if (card->components) { in snd_soc_bind_card()
1938 ret = snd_component_add(card->snd_card, card->components); in snd_soc_bind_card()
1940 dev_err(card->dev, "ASoC: %s snd_component_add() failed: %d\n", in snd_soc_bind_card()
1941 card->name, ret); in snd_soc_bind_card()
1952 ret = snd_card_register(card->snd_card); in snd_soc_bind_card()
1954 dev_err(card->dev, "ASoC: failed to register soundcard %d\n", in snd_soc_bind_card()
1959 card->instantiated = 1; in snd_soc_bind_card()
1961 snd_soc_dapm_sync(&card->dapm); in snd_soc_bind_card()
1966 pinctrl_pm_select_sleep_state(component->dev); in snd_soc_bind_card()
1972 mutex_unlock(&card->mutex); in snd_soc_bind_card()
1988 return -EINVAL; in soc_probe()
1990 dev_warn(&pdev->dev, in soc_probe()
1992 card->name); in soc_probe()
1995 card->dev = &pdev->dev; in soc_probe()
1997 return devm_snd_soc_register_card(&pdev->dev, card); in soc_probe()
2005 if (!card->instantiated) in snd_soc_poweroff()
2009 * Flush out pmdown_time work - we actually do want to run it in snd_soc_poweroff()
2018 pinctrl_pm_select_sleep_state(component->dev); in snd_soc_poweroff()
2037 .name = "soc-audio",
2044 * snd_soc_cnew - create new control
2096 control->name, prefix)); in snd_soc_add_controls()
2099 control->name, err); in snd_soc_add_controls()
2108 * snd_soc_add_component_controls - Add an array of controls to a component.
2119 struct snd_card *card = component->card->snd_card; in snd_soc_add_component_controls()
2121 return snd_soc_add_controls(card, component->dev, controls, in snd_soc_add_component_controls()
2122 num_controls, component->name_prefix, component); in snd_soc_add_component_controls()
2127 * snd_soc_add_card_controls - add an array of controls to a SoC card.
2139 struct snd_card *card = soc_card->snd_card; in snd_soc_add_card_controls()
2141 return snd_soc_add_controls(card, soc_card->dev, controls, num_controls, in snd_soc_add_card_controls()
2147 * snd_soc_add_dai_controls - add an array of controls to a DAI.
2150 * @dai: DAI to add controls to
2156 int snd_soc_add_dai_controls(struct snd_soc_dai *dai, in snd_soc_add_dai_controls() argument
2159 struct snd_card *card = dai->component->card->snd_card; in snd_soc_add_dai_controls()
2161 return snd_soc_add_controls(card, dai->dev, controls, num_controls, in snd_soc_add_dai_controls()
2162 NULL, dai); in snd_soc_add_dai_controls()
2167 * snd_soc_register_card - Register a card with the ASoC core
2174 if (!card->name || !card->dev) in snd_soc_register_card()
2175 return -EINVAL; in snd_soc_register_card()
2177 dev_set_drvdata(card->dev, card); in snd_soc_register_card()
2179 INIT_LIST_HEAD(&card->widgets); in snd_soc_register_card()
2180 INIT_LIST_HEAD(&card->paths); in snd_soc_register_card()
2181 INIT_LIST_HEAD(&card->dapm_list); in snd_soc_register_card()
2182 INIT_LIST_HEAD(&card->aux_comp_list); in snd_soc_register_card()
2183 INIT_LIST_HEAD(&card->component_dev_list); in snd_soc_register_card()
2184 INIT_LIST_HEAD(&card->list); in snd_soc_register_card()
2185 INIT_LIST_HEAD(&card->rtd_list); in snd_soc_register_card()
2186 INIT_LIST_HEAD(&card->dapm_dirty); in snd_soc_register_card()
2187 INIT_LIST_HEAD(&card->dobj_list); in snd_soc_register_card()
2189 card->instantiated = 0; in snd_soc_register_card()
2190 mutex_init(&card->mutex); in snd_soc_register_card()
2191 mutex_init(&card->dapm_mutex); in snd_soc_register_card()
2192 mutex_init(&card->pcm_mutex); in snd_soc_register_card()
2193 spin_lock_init(&card->dpcm_lock); in snd_soc_register_card()
2200 * snd_soc_unregister_card - Unregister a card with the ASoC core
2210 dev_dbg(card->dev, "ASoC: Unregistered card '%s'\n", card->name); in snd_soc_unregister_card()
2217 * Simplify DAI link configuration by removing ".-1" from device names
2232 found = strstr(name, dev->driver->name); in fmt_single_name()
2235 if (sscanf(&found[strlen(dev->driver->name)], ".%d", id) == 1) { in fmt_single_name()
2237 /* discard ID from name if ID == -1 */ in fmt_single_name()
2238 if (*id == -1) in fmt_single_name()
2239 found[strlen(dev->driver->name)] = '\0'; in fmt_single_name()
2242 /* I2C component devices are named "bus-addr" */ in fmt_single_name()
2243 } else if (sscanf(name, "%x-%x", &id1, &id2) == 2) { in fmt_single_name()
2250 /* sanitize component name for DAI link creation */ in fmt_single_name()
2251 name = devm_kasprintf(dev, GFP_KERNEL, "%s.%s", dev->driver->name, devname); in fmt_single_name()
2260 * Simplify DAI link naming for single devices with multiple DAIs by removing
2261 * any ".-1" and using the DAI name (instead of device name).
2266 if (dai_drv->name == NULL) { in fmt_multiple_name()
2268 "ASoC: error - multiple DAI %s registered with no name\n", in fmt_multiple_name()
2273 return devm_kstrdup(dev, dai_drv->name, GFP_KERNEL); in fmt_multiple_name()
2276 void snd_soc_unregister_dai(struct snd_soc_dai *dai) in snd_soc_unregister_dai() argument
2278 dev_dbg(dai->dev, "ASoC: Unregistered DAI '%s'\n", dai->name); in snd_soc_unregister_dai()
2279 list_del(&dai->list); in snd_soc_unregister_dai()
2284 * snd_soc_register_dai - Register a DAI dynamically & create its widgets
2287 * @dai_drv: DAI driver to use for the DAI
2288 * @legacy_dai_naming: if %true, use legacy single-name format;
2289 * if %false, use multiple-name format;
2299 struct device *dev = component->dev; in snd_soc_register_dai()
2300 struct snd_soc_dai *dai; in snd_soc_register_dai() local
2302 dev_dbg(dev, "ASoC: dynamically register DAI %s\n", dev_name(dev)); in snd_soc_register_dai()
2306 dai = devm_kzalloc(dev, sizeof(*dai), GFP_KERNEL); in snd_soc_register_dai()
2307 if (dai == NULL) in snd_soc_register_dai()
2311 * Back in the old days when we still had component-less DAIs, in snd_soc_register_dai()
2312 * instead of having a static name, component-less DAIs would in snd_soc_register_dai()
2314 * register multiple instances of the DAI. We still need to keep in snd_soc_register_dai()
2316 * component-less anymore. in snd_soc_register_dai()
2319 (dai_drv->id == 0 || dai_drv->name == NULL)) { in snd_soc_register_dai()
2320 dai->name = fmt_single_name(dev, &dai->id); in snd_soc_register_dai()
2322 dai->name = fmt_multiple_name(dev, dai_drv); in snd_soc_register_dai()
2323 if (dai_drv->id) in snd_soc_register_dai()
2324 dai->id = dai_drv->id; in snd_soc_register_dai()
2326 dai->id = component->num_dai; in snd_soc_register_dai()
2328 if (!dai->name) in snd_soc_register_dai()
2331 dai->component = component; in snd_soc_register_dai()
2332 dai->dev = dev; in snd_soc_register_dai()
2333 dai->driver = dai_drv; in snd_soc_register_dai()
2336 list_add_tail(&dai->list, &component->dai_list); in snd_soc_register_dai()
2337 component->num_dai++; in snd_soc_register_dai()
2339 dev_dbg(dev, "ASoC: Registered DAI '%s'\n", dai->name); in snd_soc_register_dai()
2340 return dai; in snd_soc_register_dai()
2344 * snd_soc_unregister_dais - Unregister DAIs from the ASoC core
2350 struct snd_soc_dai *dai, *_dai; in snd_soc_unregister_dais() local
2352 for_each_component_dais_safe(component, dai, _dai) in snd_soc_unregister_dais()
2353 snd_soc_unregister_dai(dai); in snd_soc_unregister_dais()
2357 * snd_soc_register_dais - Register a DAI with the ASoC core
2360 * @dai_drv: DAI driver to use for the DAIs
2367 struct snd_soc_dai *dai; in snd_soc_register_dais() local
2372 dai = snd_soc_register_dai(component, dai_drv + i, count == 1 && in snd_soc_register_dais()
2373 !component->driver->non_legacy_dai_naming); in snd_soc_register_dais()
2374 if (dai == NULL) { in snd_soc_register_dais()
2375 ret = -ENOMEM; in snd_soc_register_dais()
2409 * Fix up the DAI formats for endianness: codecs don't actually see
2410 * the endianness of the data but we're using the CPU format
2419 if (stream->formats & endianness_format_map[i]) in convert_endianness_formats()
2420 stream->formats |= endianness_format_map[i]; in convert_endianness_formats()
2429 list_del(&card->list); in snd_soc_try_rebind_card()
2434 struct snd_soc_card *card = component->card; in snd_soc_del_component_unlocked()
2441 list_del(&component->list); in snd_soc_del_component_unlocked()
2448 INIT_LIST_HEAD(&component->dai_list); in snd_soc_component_initialize()
2449 INIT_LIST_HEAD(&component->dobj_list); in snd_soc_component_initialize()
2450 INIT_LIST_HEAD(&component->card_list); in snd_soc_component_initialize()
2451 mutex_init(&component->io_mutex); in snd_soc_component_initialize()
2453 component->name = fmt_single_name(dev, &component->id); in snd_soc_component_initialize()
2454 if (!component->name) { in snd_soc_component_initialize()
2456 return -ENOMEM; in snd_soc_component_initialize()
2459 component->dev = dev; in snd_soc_component_initialize()
2460 component->driver = driver; in snd_soc_component_initialize()
2475 if (component->driver->endianness) { in snd_soc_add_component()
2484 dev_err(component->dev, "ASoC: Failed to register DAIs: %d\n", in snd_soc_add_component()
2489 if (!component->driver->write && !component->driver->read) { in snd_soc_add_component()
2490 if (!component->regmap) in snd_soc_add_component()
2491 component->regmap = dev_get_regmap(component->dev, in snd_soc_add_component()
2493 if (component->regmap) in snd_soc_add_component()
2498 list_add(&component->list, &component_list); in snd_soc_add_component()
2523 return -ENOMEM; in snd_soc_register_component()
2534 * snd_soc_unregister_component_by_driver - Unregister component using a given driver
2549 component = snd_soc_lookup_component_nolocked(dev, component_driver->name); in snd_soc_unregister_component_by_driver()
2561 * snd_soc_unregister_component - Unregister all related component
2589 if (!card->dev) { in snd_soc_of_parse_card_name()
2590 pr_err("card->dev is not set before calling %s\n", __func__); in snd_soc_of_parse_card_name()
2591 return -EINVAL; in snd_soc_of_parse_card_name()
2594 np = card->dev->of_node; in snd_soc_of_parse_card_name()
2596 ret = of_property_read_string_index(np, propname, 0, &card->name); in snd_soc_of_parse_card_name()
2599 * card->name was previously set, which is checked later in in snd_soc_of_parse_card_name()
2602 if (ret < 0 && ret != -EINVAL) { in snd_soc_of_parse_card_name()
2603 dev_err(card->dev, in snd_soc_of_parse_card_name()
2623 struct device_node *np = card->dev->of_node; in snd_soc_of_parse_audio_simple_widgets()
2630 dev_err(card->dev, in snd_soc_of_parse_audio_simple_widgets()
2632 return -EINVAL; in snd_soc_of_parse_audio_simple_widgets()
2635 dev_err(card->dev, in snd_soc_of_parse_audio_simple_widgets()
2637 return -EINVAL; in snd_soc_of_parse_audio_simple_widgets()
2642 dev_err(card->dev, "ASoC: Property '%s's length is zero\n", in snd_soc_of_parse_audio_simple_widgets()
2644 return -EINVAL; in snd_soc_of_parse_audio_simple_widgets()
2647 widgets = devm_kcalloc(card->dev, num_widgets, sizeof(*widgets), in snd_soc_of_parse_audio_simple_widgets()
2650 dev_err(card->dev, in snd_soc_of_parse_audio_simple_widgets()
2652 return -ENOMEM; in snd_soc_of_parse_audio_simple_widgets()
2659 dev_err(card->dev, in snd_soc_of_parse_audio_simple_widgets()
2662 return -EINVAL; in snd_soc_of_parse_audio_simple_widgets()
2674 dev_err(card->dev, in snd_soc_of_parse_audio_simple_widgets()
2677 return -EINVAL; in snd_soc_of_parse_audio_simple_widgets()
2684 dev_err(card->dev, in snd_soc_of_parse_audio_simple_widgets()
2687 return -EINVAL; in snd_soc_of_parse_audio_simple_widgets()
2693 card->of_dapm_widgets = widgets; in snd_soc_of_parse_audio_simple_widgets()
2694 card->num_of_dapm_widgets = num_widgets; in snd_soc_of_parse_audio_simple_widgets()
2729 snd_soc_of_get_slot_mask(np, "dai-tdm-slot-tx-mask", tx_mask); in snd_soc_of_parse_tdm_slot()
2731 snd_soc_of_get_slot_mask(np, "dai-tdm-slot-rx-mask", rx_mask); in snd_soc_of_parse_tdm_slot()
2733 if (of_property_read_bool(np, "dai-tdm-slot-num")) { in snd_soc_of_parse_tdm_slot()
2734 ret = of_property_read_u32(np, "dai-tdm-slot-num", &val); in snd_soc_of_parse_tdm_slot()
2742 if (of_property_read_bool(np, "dai-tdm-slot-width")) { in snd_soc_of_parse_tdm_slot()
2743 ret = of_property_read_u32(np, "dai-tdm-slot-width", &val); in snd_soc_of_parse_tdm_slot()
2769 codec_conf->dlc.of_node = of_node; in snd_soc_of_parse_node_prefix()
2770 codec_conf->name_prefix = str; in snd_soc_of_parse_node_prefix()
2777 struct device_node *np = card->dev->of_node; in snd_soc_of_parse_audio_routing()
2784 dev_err(card->dev, in snd_soc_of_parse_audio_routing()
2787 return -EINVAL; in snd_soc_of_parse_audio_routing()
2791 dev_err(card->dev, "ASoC: Property '%s's length is zero\n", in snd_soc_of_parse_audio_routing()
2793 return -EINVAL; in snd_soc_of_parse_audio_routing()
2796 routes = devm_kcalloc(card->dev, num_routes, sizeof(*routes), in snd_soc_of_parse_audio_routing()
2799 dev_err(card->dev, in snd_soc_of_parse_audio_routing()
2801 return -EINVAL; in snd_soc_of_parse_audio_routing()
2808 dev_err(card->dev, in snd_soc_of_parse_audio_routing()
2811 return -EINVAL; in snd_soc_of_parse_audio_routing()
2816 dev_err(card->dev, in snd_soc_of_parse_audio_routing()
2819 return -EINVAL; in snd_soc_of_parse_audio_routing()
2823 card->num_of_dapm_routes = num_routes; in snd_soc_of_parse_audio_routing()
2824 card->of_dapm_routes = routes; in snd_soc_of_parse_audio_routing()
2832 struct device_node *node = card->dev->of_node; in snd_soc_of_parse_aux_devs()
2837 if (num == -ENOENT) { in snd_soc_of_parse_aux_devs()
2840 dev_err(card->dev, "ASOC: Property '%s' could not be read: %d\n", in snd_soc_of_parse_aux_devs()
2845 aux = devm_kcalloc(card->dev, num, sizeof(*aux), GFP_KERNEL); in snd_soc_of_parse_aux_devs()
2847 return -ENOMEM; in snd_soc_of_parse_aux_devs()
2848 card->aux_dev = aux; in snd_soc_of_parse_aux_devs()
2849 card->num_aux_devs = num; in snd_soc_of_parse_aux_devs()
2852 aux->dlc.of_node = of_parse_phandle(node, propname, i); in snd_soc_of_parse_aux_devs()
2853 if (!aux->dlc.of_node) in snd_soc_of_parse_aux_devs()
2854 return -EINVAL; in snd_soc_of_parse_aux_devs()
2868 unsigned int format = 0; in snd_soc_of_parse_daifmt() local
2890 * check "dai-format = xxx" in snd_soc_of_parse_daifmt()
2891 * or "[prefix]format = xxx" in snd_soc_of_parse_daifmt()
2894 ret = of_property_read_string(np, "dai-format", &str); in snd_soc_of_parse_daifmt()
2902 format |= of_fmt_table[i].val; in snd_soc_of_parse_daifmt()
2909 * check "[prefix]continuous-clock" in snd_soc_of_parse_daifmt()
2912 snprintf(prop, sizeof(prop), "%scontinuous-clock", prefix); in snd_soc_of_parse_daifmt()
2914 format |= SND_SOC_DAIFMT_CONT; in snd_soc_of_parse_daifmt()
2916 format |= SND_SOC_DAIFMT_GATED; in snd_soc_of_parse_daifmt()
2919 * check "[prefix]bitclock-inversion" in snd_soc_of_parse_daifmt()
2920 * check "[prefix]frame-inversion" in snd_soc_of_parse_daifmt()
2923 snprintf(prop, sizeof(prop), "%sbitclock-inversion", prefix); in snd_soc_of_parse_daifmt()
2926 snprintf(prop, sizeof(prop), "%sframe-inversion", prefix); in snd_soc_of_parse_daifmt()
2931 format |= SND_SOC_DAIFMT_IB_IF; in snd_soc_of_parse_daifmt()
2934 format |= SND_SOC_DAIFMT_IB_NF; in snd_soc_of_parse_daifmt()
2937 format |= SND_SOC_DAIFMT_NB_IF; in snd_soc_of_parse_daifmt()
2945 * check "[prefix]bitclock-master" in snd_soc_of_parse_daifmt()
2946 * check "[prefix]frame-master" in snd_soc_of_parse_daifmt()
2949 snprintf(prop, sizeof(prop), "%sbitclock-master", prefix); in snd_soc_of_parse_daifmt()
2954 snprintf(prop, sizeof(prop), "%sframe-master", prefix); in snd_soc_of_parse_daifmt()
2961 format |= SND_SOC_DAIFMT_CBM_CFM; in snd_soc_of_parse_daifmt()
2964 format |= SND_SOC_DAIFMT_CBM_CFS; in snd_soc_of_parse_daifmt()
2967 format |= SND_SOC_DAIFMT_CBS_CFM; in snd_soc_of_parse_daifmt()
2970 format |= SND_SOC_DAIFMT_CBS_CFS; in snd_soc_of_parse_daifmt()
2974 return format; in snd_soc_of_parse_daifmt()
2992 ret = -ENOTSUPP; in snd_soc_get_dai_id()
3010 int ret = -EPROBE_DEFER; in snd_soc_get_dai_name()
3016 if (component_of_node != args->np) in snd_soc_get_dai_name()
3020 if (ret == -ENOTSUPP) { in snd_soc_get_dai_name()
3021 struct snd_soc_dai *dai; in snd_soc_get_dai_name() local
3022 int id = -1; in snd_soc_get_dai_name()
3024 switch (args->args_count) { in snd_soc_get_dai_name()
3029 id = args->args[0]; in snd_soc_get_dai_name()
3036 if (id < 0 || id >= pos->num_dai) { in snd_soc_get_dai_name()
3037 ret = -EINVAL; in snd_soc_get_dai_name()
3043 /* find target DAI */ in snd_soc_get_dai_name()
3044 for_each_component_dais(pos, dai) { in snd_soc_get_dai_name()
3047 id--; in snd_soc_get_dai_name()
3050 *dai_name = dai->driver->name; in snd_soc_get_dai_name()
3052 *dai_name = pos->name; in snd_soc_get_dai_name()
3076 ret = of_parse_phandle_with_args(of_node, "sound-dai", in snd_soc_of_get_dai_name()
3077 "#sound-dai-cells", 0, &args); in snd_soc_of_get_dai_name()
3090 * snd_soc_of_put_dai_link_codecs - Dereference device nodes in the codecs array
3091 * @dai_link: DAI link
3101 if (!component->of_node) in snd_soc_of_put_dai_link_codecs()
3103 of_node_put(component->of_node); in snd_soc_of_put_dai_link_codecs()
3104 component->of_node = NULL; in snd_soc_of_put_dai_link_codecs()
3110 * snd_soc_of_get_dai_link_codecs - Parse a list of CODECs in the devicetree
3113 * @dai_link: DAI link
3115 * Builds an array of CODEC DAI components from the DAI link property
3116 * 'sound-dai'.
3117 * The array is set in the DAI link and the number of DAIs is set accordingly.
3133 name = "sound-dai"; in snd_soc_of_get_dai_link_codecs()
3135 "#sound-dai-cells"); in snd_soc_of_get_dai_link_codecs()
3137 if (num_codecs == -ENOENT) in snd_soc_of_get_dai_link_codecs()
3138 dev_err(dev, "No 'sound-dai' property\n"); in snd_soc_of_get_dai_link_codecs()
3140 dev_err(dev, "Bad phandle in 'sound-dai'\n"); in snd_soc_of_get_dai_link_codecs()
3147 return -ENOMEM; in snd_soc_of_get_dai_link_codecs()
3148 dai_link->codecs = component; in snd_soc_of_get_dai_link_codecs()
3149 dai_link->num_codecs = num_codecs; in snd_soc_of_get_dai_link_codecs()
3154 "#sound-dai-cells", in snd_soc_of_get_dai_link_codecs()
3158 component->of_node = args.np; in snd_soc_of_get_dai_link_codecs()
3159 ret = snd_soc_get_dai_name(&args, &component->dai_name); in snd_soc_of_get_dai_link_codecs()
3166 dai_link->codecs = NULL; in snd_soc_of_get_dai_link_codecs()
3167 dai_link->num_codecs = 0; in snd_soc_of_get_dai_link_codecs()
3194 MODULE_ALIAS("platform:soc-audio");