2 * soc-core.c -- ALSA SoC Audio Layer
4 * Copyright 2005 Wolfson Microelectronics PLC.
5 * Copyright 2005 Openedhand Ltd.
6 * Copyright (C) 2010 Slimlogic Ltd.
7 * Copyright (C) 2010 Texas Instruments Inc.
9 * Author: Liam Girdwood <lrg@slimlogic.co.uk>
10 * with code, comments and ideas from :-
11 * Richard Purdie <richard@openedhand.com>
13 * This program is free software; you can redistribute it and/or modify it
14 * under the terms of the GNU General Public License as published by the
15 * Free Software Foundation; either version 2 of the License, or (at your
16 * option) any later version.
19 * o Add hw rules to enforce rates, etc.
20 * o More testing with other codecs/machines.
21 * o Add more codecs and platforms to ensure good API coverage.
22 * o Support TDM on PCM and I2S
25 #include <linux/module.h>
26 #include <linux/moduleparam.h>
27 #include <linux/init.h>
28 #include <linux/delay.h>
30 #include <linux/bitops.h>
31 #include <linux/debugfs.h>
32 #include <linux/platform_device.h>
33 #include <linux/pinctrl/consumer.h>
34 #include <linux/ctype.h>
35 #include <linux/slab.h>
37 #include <linux/of_graph.h>
38 #include <linux/dmi.h>
39 #include <sound/core.h>
40 #include <sound/jack.h>
41 #include <sound/pcm.h>
42 #include <sound/pcm_params.h>
43 #include <sound/soc.h>
44 #include <sound/soc-dpcm.h>
45 #include <sound/soc-topology.h>
46 #include <sound/initval.h>
48 #define CREATE_TRACE_POINTS
49 #include <trace/events/asoc.h>
53 #ifdef CONFIG_DEBUG_FS
54 struct dentry *snd_soc_debugfs_root;
55 EXPORT_SYMBOL_GPL(snd_soc_debugfs_root);
58 static DEFINE_MUTEX(client_mutex);
59 static LIST_HEAD(platform_list);
60 static LIST_HEAD(codec_list);
61 static LIST_HEAD(component_list);
64 * This is a timeout to do a DAPM powerdown after a stream is closed().
65 * It can be used to eliminate pops between different playback streams, e.g.
66 * between two audio tracks.
68 static int pmdown_time = 5000;
69 module_param(pmdown_time, int, 0);
70 MODULE_PARM_DESC(pmdown_time, "DAPM stream powerdown time (msecs)");
72 /* If a DMI filed contain strings in this blacklist (e.g.
73 * "Type2 - Board Manufacturer" or "Type1 - TBD by OEM"), it will be taken
74 * as invalid and dropped when setting the card long name from DMI info.
76 static const char * const dmi_blacklist[] = {
77 "To be filled by OEM",
83 NULL, /* terminator */
86 /* returns the minimum number of bytes needed to represent
87 * a particular given value */
88 static int min_bytes_needed(unsigned long val)
93 for (i = (sizeof val * 8) - 1; i >= 0; --i, ++c)
96 c = (sizeof val * 8) - c;
104 /* fill buf which is 'len' bytes with a formatted
105 * string of the form 'reg: value\n' */
106 static int format_register_str(struct snd_soc_codec *codec,
107 unsigned int reg, char *buf, size_t len)
109 int wordsize = min_bytes_needed(codec->driver->reg_cache_size) * 2;
110 int regsize = codec->driver->reg_word_size * 2;
113 /* +2 for ': ' and + 1 for '\n' */
114 if (wordsize + regsize + 2 + 1 != len)
117 sprintf(buf, "%.*x: ", wordsize, reg);
120 ret = snd_soc_read(codec, reg);
122 memset(buf, 'X', regsize);
124 sprintf(buf, "%.*x", regsize, ret);
126 /* no NUL-termination needed */
130 /* codec register dump */
131 static ssize_t soc_codec_reg_show(struct snd_soc_codec *codec, char *buf,
132 size_t count, loff_t pos)
135 int wordsize, regsize;
140 wordsize = min_bytes_needed(codec->driver->reg_cache_size) * 2;
141 regsize = codec->driver->reg_word_size * 2;
143 len = wordsize + regsize + 2 + 1;
145 if (!codec->driver->reg_cache_size)
148 if (codec->driver->reg_cache_step)
149 step = codec->driver->reg_cache_step;
151 for (i = 0; i < codec->driver->reg_cache_size; i += step) {
152 /* only support larger than PAGE_SIZE bytes debugfs
153 * entries for the default case */
155 if (total + len >= count - 1)
157 format_register_str(codec, i, buf + total, len);
163 total = min(total, count - 1);
168 static ssize_t codec_reg_show(struct device *dev,
169 struct device_attribute *attr, char *buf)
171 struct snd_soc_pcm_runtime *rtd = dev_get_drvdata(dev);
173 return soc_codec_reg_show(rtd->codec, buf, PAGE_SIZE, 0);
176 static DEVICE_ATTR(codec_reg, 0444, codec_reg_show, NULL);
178 static ssize_t pmdown_time_show(struct device *dev,
179 struct device_attribute *attr, char *buf)
181 struct snd_soc_pcm_runtime *rtd = dev_get_drvdata(dev);
183 return sprintf(buf, "%ld\n", rtd->pmdown_time);
186 static ssize_t pmdown_time_set(struct device *dev,
187 struct device_attribute *attr,
188 const char *buf, size_t count)
190 struct snd_soc_pcm_runtime *rtd = dev_get_drvdata(dev);
193 ret = kstrtol(buf, 10, &rtd->pmdown_time);
200 static DEVICE_ATTR(pmdown_time, 0644, pmdown_time_show, pmdown_time_set);
202 static struct attribute *soc_dev_attrs[] = {
203 &dev_attr_codec_reg.attr,
204 &dev_attr_pmdown_time.attr,
208 static umode_t soc_dev_attr_is_visible(struct kobject *kobj,
209 struct attribute *attr, int idx)
211 struct device *dev = kobj_to_dev(kobj);
212 struct snd_soc_pcm_runtime *rtd = dev_get_drvdata(dev);
214 if (attr == &dev_attr_pmdown_time.attr)
215 return attr->mode; /* always visible */
216 return rtd->codec ? attr->mode : 0; /* enabled only with codec */
219 static const struct attribute_group soc_dapm_dev_group = {
220 .attrs = soc_dapm_dev_attrs,
221 .is_visible = soc_dev_attr_is_visible,
224 static const struct attribute_group soc_dev_roup = {
225 .attrs = soc_dev_attrs,
226 .is_visible = soc_dev_attr_is_visible,
229 static const struct attribute_group *soc_dev_attr_groups[] = {
235 #ifdef CONFIG_DEBUG_FS
236 static ssize_t codec_reg_read_file(struct file *file, char __user *user_buf,
237 size_t count, loff_t *ppos)
240 struct snd_soc_codec *codec = file->private_data;
243 if (*ppos < 0 || !count)
246 buf = kmalloc(count, GFP_KERNEL);
250 ret = soc_codec_reg_show(codec, buf, count, *ppos);
252 if (copy_to_user(user_buf, buf, ret)) {
263 static ssize_t codec_reg_write_file(struct file *file,
264 const char __user *user_buf, size_t count, loff_t *ppos)
269 unsigned long reg, value;
270 struct snd_soc_codec *codec = file->private_data;
273 buf_size = min(count, (sizeof(buf)-1));
274 if (copy_from_user(buf, user_buf, buf_size))
278 while (*start == ' ')
280 reg = simple_strtoul(start, &start, 16);
281 while (*start == ' ')
283 ret = kstrtoul(start, 16, &value);
287 /* Userspace has been fiddling around behind the kernel's back */
288 add_taint(TAINT_USER, LOCKDEP_NOW_UNRELIABLE);
290 snd_soc_write(codec, reg, value);
294 static const struct file_operations codec_reg_fops = {
296 .read = codec_reg_read_file,
297 .write = codec_reg_write_file,
298 .llseek = default_llseek,
301 static void soc_init_component_debugfs(struct snd_soc_component *component)
303 if (!component->card->debugfs_card_root)
306 if (component->debugfs_prefix) {
309 name = kasprintf(GFP_KERNEL, "%s:%s",
310 component->debugfs_prefix, component->name);
312 component->debugfs_root = debugfs_create_dir(name,
313 component->card->debugfs_card_root);
317 component->debugfs_root = debugfs_create_dir(component->name,
318 component->card->debugfs_card_root);
321 if (!component->debugfs_root) {
322 dev_warn(component->dev,
323 "ASoC: Failed to create component debugfs directory\n");
327 snd_soc_dapm_debugfs_init(snd_soc_component_get_dapm(component),
328 component->debugfs_root);
330 if (component->init_debugfs)
331 component->init_debugfs(component);
334 static void soc_cleanup_component_debugfs(struct snd_soc_component *component)
336 debugfs_remove_recursive(component->debugfs_root);
339 static void soc_init_codec_debugfs(struct snd_soc_component *component)
341 struct snd_soc_codec *codec = snd_soc_component_to_codec(component);
343 codec->debugfs_reg = debugfs_create_file("codec_reg", 0644,
344 codec->component.debugfs_root,
345 codec, &codec_reg_fops);
346 if (!codec->debugfs_reg)
348 "ASoC: Failed to create codec register debugfs file\n");
351 static ssize_t codec_list_read_file(struct file *file, char __user *user_buf,
352 size_t count, loff_t *ppos)
354 char *buf = kmalloc(PAGE_SIZE, GFP_KERNEL);
355 ssize_t len, ret = 0;
356 struct snd_soc_codec *codec;
361 mutex_lock(&client_mutex);
363 list_for_each_entry(codec, &codec_list, list) {
364 len = snprintf(buf + ret, PAGE_SIZE - ret, "%s\n",
365 codec->component.name);
368 if (ret > PAGE_SIZE) {
374 mutex_unlock(&client_mutex);
377 ret = simple_read_from_buffer(user_buf, count, ppos, buf, ret);
384 static const struct file_operations codec_list_fops = {
385 .read = codec_list_read_file,
386 .llseek = default_llseek,/* read accesses f_pos */
389 static ssize_t dai_list_read_file(struct file *file, char __user *user_buf,
390 size_t count, loff_t *ppos)
392 char *buf = kmalloc(PAGE_SIZE, GFP_KERNEL);
393 ssize_t len, ret = 0;
394 struct snd_soc_component *component;
395 struct snd_soc_dai *dai;
400 mutex_lock(&client_mutex);
402 list_for_each_entry(component, &component_list, list) {
403 list_for_each_entry(dai, &component->dai_list, list) {
404 len = snprintf(buf + ret, PAGE_SIZE - ret, "%s\n",
408 if (ret > PAGE_SIZE) {
415 mutex_unlock(&client_mutex);
417 ret = simple_read_from_buffer(user_buf, count, ppos, buf, ret);
424 static const struct file_operations dai_list_fops = {
425 .read = dai_list_read_file,
426 .llseek = default_llseek,/* read accesses f_pos */
429 static ssize_t platform_list_read_file(struct file *file,
430 char __user *user_buf,
431 size_t count, loff_t *ppos)
433 char *buf = kmalloc(PAGE_SIZE, GFP_KERNEL);
434 ssize_t len, ret = 0;
435 struct snd_soc_platform *platform;
440 mutex_lock(&client_mutex);
442 list_for_each_entry(platform, &platform_list, list) {
443 len = snprintf(buf + ret, PAGE_SIZE - ret, "%s\n",
444 platform->component.name);
447 if (ret > PAGE_SIZE) {
453 mutex_unlock(&client_mutex);
455 ret = simple_read_from_buffer(user_buf, count, ppos, buf, ret);
462 static const struct file_operations platform_list_fops = {
463 .read = platform_list_read_file,
464 .llseek = default_llseek,/* read accesses f_pos */
467 static void soc_init_card_debugfs(struct snd_soc_card *card)
469 if (!snd_soc_debugfs_root)
472 card->debugfs_card_root = debugfs_create_dir(card->name,
473 snd_soc_debugfs_root);
474 if (!card->debugfs_card_root) {
476 "ASoC: Failed to create card debugfs directory\n");
480 card->debugfs_pop_time = debugfs_create_u32("dapm_pop_time", 0644,
481 card->debugfs_card_root,
483 if (!card->debugfs_pop_time)
485 "ASoC: Failed to create pop time debugfs file\n");
488 static void soc_cleanup_card_debugfs(struct snd_soc_card *card)
490 debugfs_remove_recursive(card->debugfs_card_root);
494 static void snd_soc_debugfs_init(void)
496 snd_soc_debugfs_root = debugfs_create_dir("asoc", NULL);
497 if (IS_ERR(snd_soc_debugfs_root) || !snd_soc_debugfs_root) {
498 pr_warn("ASoC: Failed to create debugfs directory\n");
499 snd_soc_debugfs_root = NULL;
503 if (!debugfs_create_file("codecs", 0444, snd_soc_debugfs_root, NULL,
505 pr_warn("ASoC: Failed to create CODEC list debugfs file\n");
507 if (!debugfs_create_file("dais", 0444, snd_soc_debugfs_root, NULL,
509 pr_warn("ASoC: Failed to create DAI list debugfs file\n");
511 if (!debugfs_create_file("platforms", 0444, snd_soc_debugfs_root, NULL,
512 &platform_list_fops))
513 pr_warn("ASoC: Failed to create platform list debugfs file\n");
516 static void snd_soc_debugfs_exit(void)
518 debugfs_remove_recursive(snd_soc_debugfs_root);
523 #define soc_init_codec_debugfs NULL
525 static inline void soc_init_component_debugfs(
526 struct snd_soc_component *component)
530 static inline void soc_cleanup_component_debugfs(
531 struct snd_soc_component *component)
535 static inline void soc_init_card_debugfs(struct snd_soc_card *card)
539 static inline void soc_cleanup_card_debugfs(struct snd_soc_card *card)
543 static inline void snd_soc_debugfs_init(void)
547 static inline void snd_soc_debugfs_exit(void)
553 struct snd_pcm_substream *snd_soc_get_dai_substream(struct snd_soc_card *card,
554 const char *dai_link, int stream)
556 struct snd_soc_pcm_runtime *rtd;
558 list_for_each_entry(rtd, &card->rtd_list, list) {
559 if (rtd->dai_link->no_pcm &&
560 !strcmp(rtd->dai_link->name, dai_link))
561 return rtd->pcm->streams[stream].substream;
563 dev_dbg(card->dev, "ASoC: failed to find dai link %s\n", dai_link);
566 EXPORT_SYMBOL_GPL(snd_soc_get_dai_substream);
568 static struct snd_soc_pcm_runtime *soc_new_pcm_runtime(
569 struct snd_soc_card *card, struct snd_soc_dai_link *dai_link)
571 struct snd_soc_pcm_runtime *rtd;
573 rtd = kzalloc(sizeof(struct snd_soc_pcm_runtime), GFP_KERNEL);
578 rtd->dai_link = dai_link;
579 rtd->codec_dais = kzalloc(sizeof(struct snd_soc_dai *) *
580 dai_link->num_codecs,
582 if (!rtd->codec_dais) {
590 static void soc_free_pcm_runtime(struct snd_soc_pcm_runtime *rtd)
592 if (rtd && rtd->codec_dais)
593 kfree(rtd->codec_dais);
597 static void soc_add_pcm_runtime(struct snd_soc_card *card,
598 struct snd_soc_pcm_runtime *rtd)
600 list_add_tail(&rtd->list, &card->rtd_list);
601 rtd->num = card->num_rtd;
605 static void soc_remove_pcm_runtimes(struct snd_soc_card *card)
607 struct snd_soc_pcm_runtime *rtd, *_rtd;
609 list_for_each_entry_safe(rtd, _rtd, &card->rtd_list, list) {
610 list_del(&rtd->list);
611 soc_free_pcm_runtime(rtd);
617 struct snd_soc_pcm_runtime *snd_soc_get_pcm_runtime(struct snd_soc_card *card,
618 const char *dai_link)
620 struct snd_soc_pcm_runtime *rtd;
622 list_for_each_entry(rtd, &card->rtd_list, list) {
623 if (!strcmp(rtd->dai_link->name, dai_link))
626 dev_dbg(card->dev, "ASoC: failed to find rtd %s\n", dai_link);
629 EXPORT_SYMBOL_GPL(snd_soc_get_pcm_runtime);
631 static void codec2codec_close_delayed_work(struct work_struct *work)
633 /* Currently nothing to do for c2c links
634 * Since c2c links are internal nodes in the DAPM graph and
635 * don't interface with the outside world or application layer
636 * we don't have to do any special handling on close.
640 #ifdef CONFIG_PM_SLEEP
641 /* powers down audio subsystem for suspend */
642 int snd_soc_suspend(struct device *dev)
644 struct snd_soc_card *card = dev_get_drvdata(dev);
645 struct snd_soc_component *component;
646 struct snd_soc_pcm_runtime *rtd;
649 /* If the card is not initialized yet there is nothing to do */
650 if (!card->instantiated)
653 /* Due to the resume being scheduled into a workqueue we could
654 * suspend before that's finished - wait for it to complete.
656 snd_power_lock(card->snd_card);
657 snd_power_wait(card->snd_card, SNDRV_CTL_POWER_D0);
658 snd_power_unlock(card->snd_card);
660 /* we're going to block userspace touching us until resume completes */
661 snd_power_change_state(card->snd_card, SNDRV_CTL_POWER_D3hot);
663 /* mute any active DACs */
664 list_for_each_entry(rtd, &card->rtd_list, list) {
666 if (rtd->dai_link->ignore_suspend)
669 for (i = 0; i < rtd->num_codecs; i++) {
670 struct snd_soc_dai *dai = rtd->codec_dais[i];
671 struct snd_soc_dai_driver *drv = dai->driver;
673 if (drv->ops->digital_mute && dai->playback_active)
674 drv->ops->digital_mute(dai, 1);
678 /* suspend all pcms */
679 list_for_each_entry(rtd, &card->rtd_list, list) {
680 if (rtd->dai_link->ignore_suspend)
683 snd_pcm_suspend_all(rtd->pcm);
686 if (card->suspend_pre)
687 card->suspend_pre(card);
689 list_for_each_entry(rtd, &card->rtd_list, list) {
690 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
692 if (rtd->dai_link->ignore_suspend)
695 if (cpu_dai->driver->suspend && !cpu_dai->driver->bus_control)
696 cpu_dai->driver->suspend(cpu_dai);
699 /* close any waiting streams */
700 list_for_each_entry(rtd, &card->rtd_list, list)
701 flush_delayed_work(&rtd->delayed_work);
703 list_for_each_entry(rtd, &card->rtd_list, list) {
705 if (rtd->dai_link->ignore_suspend)
708 snd_soc_dapm_stream_event(rtd,
709 SNDRV_PCM_STREAM_PLAYBACK,
710 SND_SOC_DAPM_STREAM_SUSPEND);
712 snd_soc_dapm_stream_event(rtd,
713 SNDRV_PCM_STREAM_CAPTURE,
714 SND_SOC_DAPM_STREAM_SUSPEND);
717 /* Recheck all endpoints too, their state is affected by suspend */
718 dapm_mark_endpoints_dirty(card);
719 snd_soc_dapm_sync(&card->dapm);
721 /* suspend all COMPONENTs */
722 list_for_each_entry(component, &card->component_dev_list, card_list) {
723 struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component);
725 /* If there are paths active then the COMPONENT will be held with
726 * bias _ON and should not be suspended. */
727 if (!component->suspended) {
728 switch (snd_soc_dapm_get_bias_level(dapm)) {
729 case SND_SOC_BIAS_STANDBY:
731 * If the COMPONENT is capable of idle
732 * bias off then being in STANDBY
733 * means it's doing something,
734 * otherwise fall through.
736 if (dapm->idle_bias_off) {
737 dev_dbg(component->dev,
738 "ASoC: idle_bias_off CODEC on over suspend\n");
742 case SND_SOC_BIAS_OFF:
743 if (component->suspend)
744 component->suspend(component);
745 component->suspended = 1;
746 if (component->regmap)
747 regcache_mark_dirty(component->regmap);
748 /* deactivate pins to sleep state */
749 pinctrl_pm_select_sleep_state(component->dev);
752 dev_dbg(component->dev,
753 "ASoC: COMPONENT is on over suspend\n");
759 list_for_each_entry(rtd, &card->rtd_list, list) {
760 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
762 if (rtd->dai_link->ignore_suspend)
765 if (cpu_dai->driver->suspend && cpu_dai->driver->bus_control)
766 cpu_dai->driver->suspend(cpu_dai);
768 /* deactivate pins to sleep state */
769 pinctrl_pm_select_sleep_state(cpu_dai->dev);
772 if (card->suspend_post)
773 card->suspend_post(card);
777 EXPORT_SYMBOL_GPL(snd_soc_suspend);
779 /* deferred resume work, so resume can complete before we finished
780 * setting our codec back up, which can be very slow on I2C
782 static void soc_resume_deferred(struct work_struct *work)
784 struct snd_soc_card *card =
785 container_of(work, struct snd_soc_card, deferred_resume_work);
786 struct snd_soc_pcm_runtime *rtd;
787 struct snd_soc_component *component;
790 /* our power state is still SNDRV_CTL_POWER_D3hot from suspend time,
791 * so userspace apps are blocked from touching us
794 dev_dbg(card->dev, "ASoC: starting resume work\n");
796 /* Bring us up into D2 so that DAPM starts enabling things */
797 snd_power_change_state(card->snd_card, SNDRV_CTL_POWER_D2);
799 if (card->resume_pre)
800 card->resume_pre(card);
802 /* resume control bus DAIs */
803 list_for_each_entry(rtd, &card->rtd_list, list) {
804 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
806 if (rtd->dai_link->ignore_suspend)
809 if (cpu_dai->driver->resume && cpu_dai->driver->bus_control)
810 cpu_dai->driver->resume(cpu_dai);
813 list_for_each_entry(component, &card->component_dev_list, card_list) {
814 if (component->suspended) {
815 if (component->resume)
816 component->resume(component);
817 component->suspended = 0;
821 list_for_each_entry(rtd, &card->rtd_list, list) {
823 if (rtd->dai_link->ignore_suspend)
826 snd_soc_dapm_stream_event(rtd,
827 SNDRV_PCM_STREAM_PLAYBACK,
828 SND_SOC_DAPM_STREAM_RESUME);
830 snd_soc_dapm_stream_event(rtd,
831 SNDRV_PCM_STREAM_CAPTURE,
832 SND_SOC_DAPM_STREAM_RESUME);
835 /* unmute any active DACs */
836 list_for_each_entry(rtd, &card->rtd_list, list) {
838 if (rtd->dai_link->ignore_suspend)
841 for (i = 0; i < rtd->num_codecs; i++) {
842 struct snd_soc_dai *dai = rtd->codec_dais[i];
843 struct snd_soc_dai_driver *drv = dai->driver;
845 if (drv->ops->digital_mute && dai->playback_active)
846 drv->ops->digital_mute(dai, 0);
850 list_for_each_entry(rtd, &card->rtd_list, list) {
851 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
853 if (rtd->dai_link->ignore_suspend)
856 if (cpu_dai->driver->resume && !cpu_dai->driver->bus_control)
857 cpu_dai->driver->resume(cpu_dai);
860 if (card->resume_post)
861 card->resume_post(card);
863 dev_dbg(card->dev, "ASoC: resume work completed\n");
865 /* Recheck all endpoints too, their state is affected by suspend */
866 dapm_mark_endpoints_dirty(card);
867 snd_soc_dapm_sync(&card->dapm);
869 /* userspace can access us now we are back as we were before */
870 snd_power_change_state(card->snd_card, SNDRV_CTL_POWER_D0);
873 /* powers up audio subsystem after a suspend */
874 int snd_soc_resume(struct device *dev)
876 struct snd_soc_card *card = dev_get_drvdata(dev);
877 bool bus_control = false;
878 struct snd_soc_pcm_runtime *rtd;
880 /* If the card is not initialized yet there is nothing to do */
881 if (!card->instantiated)
884 /* activate pins from sleep state */
885 list_for_each_entry(rtd, &card->rtd_list, list) {
886 struct snd_soc_dai **codec_dais = rtd->codec_dais;
887 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
891 pinctrl_pm_select_default_state(cpu_dai->dev);
893 for (j = 0; j < rtd->num_codecs; j++) {
894 struct snd_soc_dai *codec_dai = codec_dais[j];
895 if (codec_dai->active)
896 pinctrl_pm_select_default_state(codec_dai->dev);
901 * DAIs that also act as the control bus master might have other drivers
902 * hanging off them so need to resume immediately. Other drivers don't
903 * have that problem and may take a substantial amount of time to resume
904 * due to I/O costs and anti-pop so handle them out of line.
906 list_for_each_entry(rtd, &card->rtd_list, list) {
907 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
908 bus_control |= cpu_dai->driver->bus_control;
911 dev_dbg(dev, "ASoC: Resuming control bus master immediately\n");
912 soc_resume_deferred(&card->deferred_resume_work);
914 dev_dbg(dev, "ASoC: Scheduling resume work\n");
915 if (!schedule_work(&card->deferred_resume_work))
916 dev_err(dev, "ASoC: resume work item may be lost\n");
921 EXPORT_SYMBOL_GPL(snd_soc_resume);
923 #define snd_soc_suspend NULL
924 #define snd_soc_resume NULL
927 static const struct snd_soc_dai_ops null_dai_ops = {
930 static struct snd_soc_component *soc_find_component(
931 const struct device_node *of_node, const char *name)
933 struct snd_soc_component *component;
935 lockdep_assert_held(&client_mutex);
937 list_for_each_entry(component, &component_list, list) {
939 if (component->dev->of_node == of_node)
941 } else if (strcmp(component->name, name) == 0) {
950 * snd_soc_find_dai - Find a registered DAI
952 * @dlc: name of the DAI and optional component info to match
954 * This function will search all registered components and their DAIs to
955 * find the DAI of the same name. The component's of_node and name
956 * should also match if being specified.
958 * Return: pointer of DAI, or NULL if not found.
960 struct snd_soc_dai *snd_soc_find_dai(
961 const struct snd_soc_dai_link_component *dlc)
963 struct snd_soc_component *component;
964 struct snd_soc_dai *dai;
965 struct device_node *component_of_node;
967 lockdep_assert_held(&client_mutex);
969 /* Find CPU DAI from registered DAIs*/
970 list_for_each_entry(component, &component_list, list) {
971 component_of_node = component->dev->of_node;
972 if (!component_of_node && component->dev->parent)
973 component_of_node = component->dev->parent->of_node;
975 if (dlc->of_node && component_of_node != dlc->of_node)
977 if (dlc->name && strcmp(component->name, dlc->name))
979 list_for_each_entry(dai, &component->dai_list, list) {
980 if (dlc->dai_name && strcmp(dai->name, dlc->dai_name))
989 EXPORT_SYMBOL_GPL(snd_soc_find_dai);
993 * snd_soc_find_dai_link - Find a DAI link
996 * @id: DAI link ID to match
997 * @name: DAI link name to match, optional
998 * @stream_name: DAI link stream name to match, optional
1000 * This function will search all existing DAI links of the soc card to
1001 * find the link of the same ID. Since DAI links may not have their
1002 * unique ID, so name and stream name should also match if being
1005 * Return: pointer of DAI link, or NULL if not found.
1007 struct snd_soc_dai_link *snd_soc_find_dai_link(struct snd_soc_card *card,
1008 int id, const char *name,
1009 const char *stream_name)
1011 struct snd_soc_dai_link *link, *_link;
1013 lockdep_assert_held(&client_mutex);
1015 list_for_each_entry_safe(link, _link, &card->dai_link_list, list) {
1019 if (name && (!link->name || strcmp(name, link->name)))
1022 if (stream_name && (!link->stream_name
1023 || strcmp(stream_name, link->stream_name)))
1031 EXPORT_SYMBOL_GPL(snd_soc_find_dai_link);
1033 static bool soc_is_dai_link_bound(struct snd_soc_card *card,
1034 struct snd_soc_dai_link *dai_link)
1036 struct snd_soc_pcm_runtime *rtd;
1038 list_for_each_entry(rtd, &card->rtd_list, list) {
1039 if (rtd->dai_link == dai_link)
1046 static int soc_bind_dai_link(struct snd_soc_card *card,
1047 struct snd_soc_dai_link *dai_link)
1049 struct snd_soc_pcm_runtime *rtd;
1050 struct snd_soc_dai_link_component *codecs = dai_link->codecs;
1051 struct snd_soc_dai_link_component cpu_dai_component;
1052 struct snd_soc_dai **codec_dais;
1053 struct snd_soc_platform *platform;
1054 struct device_node *platform_of_node;
1055 const char *platform_name;
1058 dev_dbg(card->dev, "ASoC: binding %s\n", dai_link->name);
1060 if (soc_is_dai_link_bound(card, dai_link)) {
1061 dev_dbg(card->dev, "ASoC: dai link %s already bound\n",
1066 rtd = soc_new_pcm_runtime(card, dai_link);
1070 cpu_dai_component.name = dai_link->cpu_name;
1071 cpu_dai_component.of_node = dai_link->cpu_of_node;
1072 cpu_dai_component.dai_name = dai_link->cpu_dai_name;
1073 rtd->cpu_dai = snd_soc_find_dai(&cpu_dai_component);
1074 if (!rtd->cpu_dai) {
1075 dev_err(card->dev, "ASoC: CPU DAI %s not registered\n",
1076 dai_link->cpu_dai_name);
1080 rtd->num_codecs = dai_link->num_codecs;
1082 /* Find CODEC from registered CODECs */
1083 codec_dais = rtd->codec_dais;
1084 for (i = 0; i < rtd->num_codecs; i++) {
1085 codec_dais[i] = snd_soc_find_dai(&codecs[i]);
1086 if (!codec_dais[i]) {
1087 dev_err(card->dev, "ASoC: CODEC DAI %s not registered\n",
1088 codecs[i].dai_name);
1093 /* Single codec links expect codec and codec_dai in runtime data */
1094 rtd->codec_dai = codec_dais[0];
1095 rtd->codec = rtd->codec_dai->codec;
1097 /* if there's no platform we match on the empty platform */
1098 platform_name = dai_link->platform_name;
1099 if (!platform_name && !dai_link->platform_of_node)
1100 platform_name = "snd-soc-dummy";
1102 /* find one from the set of registered platforms */
1103 list_for_each_entry(platform, &platform_list, list) {
1104 platform_of_node = platform->dev->of_node;
1105 if (!platform_of_node && platform->dev->parent->of_node)
1106 platform_of_node = platform->dev->parent->of_node;
1108 if (dai_link->platform_of_node) {
1109 if (platform_of_node != dai_link->platform_of_node)
1112 if (strcmp(platform->component.name, platform_name))
1116 rtd->platform = platform;
1118 if (!rtd->platform) {
1119 dev_err(card->dev, "ASoC: platform %s not registered\n",
1120 dai_link->platform_name);
1124 soc_add_pcm_runtime(card, rtd);
1128 soc_free_pcm_runtime(rtd);
1129 return -EPROBE_DEFER;
1132 static void soc_remove_component(struct snd_soc_component *component)
1134 if (!component->card)
1137 list_del(&component->card_list);
1139 if (component->remove)
1140 component->remove(component);
1142 snd_soc_dapm_free(snd_soc_component_get_dapm(component));
1144 soc_cleanup_component_debugfs(component);
1145 component->card = NULL;
1146 module_put(component->dev->driver->owner);
1149 static void soc_remove_dai(struct snd_soc_dai *dai, int order)
1153 if (dai && dai->probed &&
1154 dai->driver->remove_order == order) {
1155 if (dai->driver->remove) {
1156 err = dai->driver->remove(dai);
1159 "ASoC: failed to remove %s: %d\n",
1166 static void soc_remove_link_dais(struct snd_soc_card *card,
1167 struct snd_soc_pcm_runtime *rtd, int order)
1171 /* unregister the rtd device */
1172 if (rtd->dev_registered) {
1173 device_unregister(rtd->dev);
1174 rtd->dev_registered = 0;
1177 /* remove the CODEC DAI */
1178 for (i = 0; i < rtd->num_codecs; i++)
1179 soc_remove_dai(rtd->codec_dais[i], order);
1181 soc_remove_dai(rtd->cpu_dai, order);
1184 static void soc_remove_link_components(struct snd_soc_card *card,
1185 struct snd_soc_pcm_runtime *rtd, int order)
1187 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
1188 struct snd_soc_platform *platform = rtd->platform;
1189 struct snd_soc_component *component;
1192 /* remove the platform */
1193 if (platform && platform->component.driver->remove_order == order)
1194 soc_remove_component(&platform->component);
1196 /* remove the CODEC-side CODEC */
1197 for (i = 0; i < rtd->num_codecs; i++) {
1198 component = rtd->codec_dais[i]->component;
1199 if (component->driver->remove_order == order)
1200 soc_remove_component(component);
1203 /* remove any CPU-side CODEC */
1205 if (cpu_dai->component->driver->remove_order == order)
1206 soc_remove_component(cpu_dai->component);
1210 static void soc_remove_dai_links(struct snd_soc_card *card)
1213 struct snd_soc_pcm_runtime *rtd;
1214 struct snd_soc_dai_link *link, *_link;
1216 for (order = SND_SOC_COMP_ORDER_FIRST; order <= SND_SOC_COMP_ORDER_LAST;
1218 list_for_each_entry(rtd, &card->rtd_list, list)
1219 soc_remove_link_dais(card, rtd, order);
1222 for (order = SND_SOC_COMP_ORDER_FIRST; order <= SND_SOC_COMP_ORDER_LAST;
1224 list_for_each_entry(rtd, &card->rtd_list, list)
1225 soc_remove_link_components(card, rtd, order);
1228 list_for_each_entry_safe(link, _link, &card->dai_link_list, list) {
1229 if (link->dobj.type == SND_SOC_DOBJ_DAI_LINK)
1230 dev_warn(card->dev, "Topology forgot to remove link %s?\n",
1233 list_del(&link->list);
1234 card->num_dai_links--;
1238 static int snd_soc_init_multicodec(struct snd_soc_card *card,
1239 struct snd_soc_dai_link *dai_link)
1241 /* Legacy codec/codec_dai link is a single entry in multicodec */
1242 if (dai_link->codec_name || dai_link->codec_of_node ||
1243 dai_link->codec_dai_name) {
1244 dai_link->num_codecs = 1;
1246 dai_link->codecs = devm_kzalloc(card->dev,
1247 sizeof(struct snd_soc_dai_link_component),
1249 if (!dai_link->codecs)
1252 dai_link->codecs[0].name = dai_link->codec_name;
1253 dai_link->codecs[0].of_node = dai_link->codec_of_node;
1254 dai_link->codecs[0].dai_name = dai_link->codec_dai_name;
1257 if (!dai_link->codecs) {
1258 dev_err(card->dev, "ASoC: DAI link has no CODECs\n");
1265 static int soc_init_dai_link(struct snd_soc_card *card,
1266 struct snd_soc_dai_link *link)
1270 ret = snd_soc_init_multicodec(card, link);
1272 dev_err(card->dev, "ASoC: failed to init multicodec\n");
1276 for (i = 0; i < link->num_codecs; i++) {
1278 * Codec must be specified by 1 of name or OF node,
1279 * not both or neither.
1281 if (!!link->codecs[i].name ==
1282 !!link->codecs[i].of_node) {
1283 dev_err(card->dev, "ASoC: Neither/both codec name/of_node are set for %s\n",
1287 /* Codec DAI name must be specified */
1288 if (!link->codecs[i].dai_name) {
1289 dev_err(card->dev, "ASoC: codec_dai_name not set for %s\n",
1296 * Platform may be specified by either name or OF node, but
1297 * can be left unspecified, and a dummy platform will be used.
1299 if (link->platform_name && link->platform_of_node) {
1301 "ASoC: Both platform name/of_node are set for %s\n",
1307 * CPU device may be specified by either name or OF node, but
1308 * can be left unspecified, and will be matched based on DAI
1311 if (link->cpu_name && link->cpu_of_node) {
1313 "ASoC: Neither/both cpu name/of_node are set for %s\n",
1318 * At least one of CPU DAI name or CPU device name/node must be
1321 if (!link->cpu_dai_name &&
1322 !(link->cpu_name || link->cpu_of_node)) {
1324 "ASoC: Neither cpu_dai_name nor cpu_name/of_node are set for %s\n",
1333 * snd_soc_add_dai_link - Add a DAI link dynamically
1334 * @card: The ASoC card to which the DAI link is added
1335 * @dai_link: The new DAI link to add
1337 * This function adds a DAI link to the ASoC card's link list.
1339 * Note: Topology can use this API to add DAI links when probing the
1340 * topology component. And machine drivers can still define static
1341 * DAI links in dai_link array.
1343 int snd_soc_add_dai_link(struct snd_soc_card *card,
1344 struct snd_soc_dai_link *dai_link)
1346 if (dai_link->dobj.type
1347 && dai_link->dobj.type != SND_SOC_DOBJ_DAI_LINK) {
1348 dev_err(card->dev, "Invalid dai link type %d\n",
1349 dai_link->dobj.type);
1353 lockdep_assert_held(&client_mutex);
1354 /* Notify the machine driver for extra initialization
1355 * on the link created by topology.
1357 if (dai_link->dobj.type && card->add_dai_link)
1358 card->add_dai_link(card, dai_link);
1360 list_add_tail(&dai_link->list, &card->dai_link_list);
1361 card->num_dai_links++;
1365 EXPORT_SYMBOL_GPL(snd_soc_add_dai_link);
1368 * snd_soc_remove_dai_link - Remove a DAI link from the list
1369 * @card: The ASoC card that owns the link
1370 * @dai_link: The DAI link to remove
1372 * This function removes a DAI link from the ASoC card's link list.
1374 * For DAI links previously added by topology, topology should
1375 * remove them by using the dobj embedded in the link.
1377 void snd_soc_remove_dai_link(struct snd_soc_card *card,
1378 struct snd_soc_dai_link *dai_link)
1380 struct snd_soc_dai_link *link, *_link;
1382 if (dai_link->dobj.type
1383 && dai_link->dobj.type != SND_SOC_DOBJ_DAI_LINK) {
1384 dev_err(card->dev, "Invalid dai link type %d\n",
1385 dai_link->dobj.type);
1389 lockdep_assert_held(&client_mutex);
1390 /* Notify the machine driver for extra destruction
1391 * on the link created by topology.
1393 if (dai_link->dobj.type && card->remove_dai_link)
1394 card->remove_dai_link(card, dai_link);
1396 list_for_each_entry_safe(link, _link, &card->dai_link_list, list) {
1397 if (link == dai_link) {
1398 list_del(&link->list);
1399 card->num_dai_links--;
1404 EXPORT_SYMBOL_GPL(snd_soc_remove_dai_link);
1406 static void soc_set_name_prefix(struct snd_soc_card *card,
1407 struct snd_soc_component *component)
1411 if (card->codec_conf == NULL)
1414 for (i = 0; i < card->num_configs; i++) {
1415 struct snd_soc_codec_conf *map = &card->codec_conf[i];
1416 if (map->of_node && component->dev->of_node != map->of_node)
1418 if (map->dev_name && strcmp(component->name, map->dev_name))
1420 component->name_prefix = map->name_prefix;
1425 static int soc_probe_component(struct snd_soc_card *card,
1426 struct snd_soc_component *component)
1428 struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component);
1429 struct snd_soc_dai *dai;
1432 if (!strcmp(component->name, "snd-soc-dummy"))
1435 if (component->card) {
1436 if (component->card != card) {
1437 dev_err(component->dev,
1438 "Trying to bind component to card \"%s\" but is already bound to card \"%s\"\n",
1439 card->name, component->card->name);
1445 if (!try_module_get(component->dev->driver->owner))
1448 component->card = card;
1450 soc_set_name_prefix(card, component);
1452 soc_init_component_debugfs(component);
1454 if (component->driver->dapm_widgets) {
1455 ret = snd_soc_dapm_new_controls(dapm,
1456 component->driver->dapm_widgets,
1457 component->driver->num_dapm_widgets);
1460 dev_err(component->dev,
1461 "Failed to create new controls %d\n", ret);
1466 list_for_each_entry(dai, &component->dai_list, list) {
1467 ret = snd_soc_dapm_new_dai_widgets(dapm, dai);
1469 dev_err(component->dev,
1470 "Failed to create DAI widgets %d\n", ret);
1475 if (component->probe) {
1476 ret = component->probe(component);
1478 dev_err(component->dev,
1479 "ASoC: failed to probe component %d\n", ret);
1483 WARN(dapm->idle_bias_off &&
1484 dapm->bias_level != SND_SOC_BIAS_OFF,
1485 "codec %s can not start from non-off bias with idle_bias_off==1\n",
1489 /* machine specific init */
1490 if (component->init) {
1491 ret = component->init(component);
1493 dev_err(component->dev,
1494 "Failed to do machine specific init %d\n", ret);
1499 if (component->driver->controls)
1500 snd_soc_add_component_controls(component,
1501 component->driver->controls,
1502 component->driver->num_controls);
1503 if (component->driver->dapm_routes)
1504 snd_soc_dapm_add_routes(dapm,
1505 component->driver->dapm_routes,
1506 component->driver->num_dapm_routes);
1508 list_add(&dapm->list, &card->dapm_list);
1509 list_add(&component->card_list, &card->component_dev_list);
1514 soc_cleanup_component_debugfs(component);
1515 component->card = NULL;
1516 module_put(component->dev->driver->owner);
1521 static void rtd_release(struct device *dev)
1526 static int soc_post_component_init(struct snd_soc_pcm_runtime *rtd,
1531 /* register the rtd device */
1532 rtd->dev = kzalloc(sizeof(struct device), GFP_KERNEL);
1535 device_initialize(rtd->dev);
1536 rtd->dev->parent = rtd->card->dev;
1537 rtd->dev->release = rtd_release;
1538 rtd->dev->groups = soc_dev_attr_groups;
1539 dev_set_name(rtd->dev, "%s", name);
1540 dev_set_drvdata(rtd->dev, rtd);
1541 mutex_init(&rtd->pcm_mutex);
1542 INIT_LIST_HEAD(&rtd->dpcm[SNDRV_PCM_STREAM_PLAYBACK].be_clients);
1543 INIT_LIST_HEAD(&rtd->dpcm[SNDRV_PCM_STREAM_CAPTURE].be_clients);
1544 INIT_LIST_HEAD(&rtd->dpcm[SNDRV_PCM_STREAM_PLAYBACK].fe_clients);
1545 INIT_LIST_HEAD(&rtd->dpcm[SNDRV_PCM_STREAM_CAPTURE].fe_clients);
1546 ret = device_add(rtd->dev);
1548 /* calling put_device() here to free the rtd->dev */
1549 put_device(rtd->dev);
1550 dev_err(rtd->card->dev,
1551 "ASoC: failed to register runtime device: %d\n", ret);
1554 rtd->dev_registered = 1;
1558 static int soc_probe_link_components(struct snd_soc_card *card,
1559 struct snd_soc_pcm_runtime *rtd,
1562 struct snd_soc_platform *platform = rtd->platform;
1563 struct snd_soc_component *component;
1566 /* probe the CPU-side component, if it is a CODEC */
1567 component = rtd->cpu_dai->component;
1568 if (component->driver->probe_order == order) {
1569 ret = soc_probe_component(card, component);
1574 /* probe the CODEC-side components */
1575 for (i = 0; i < rtd->num_codecs; i++) {
1576 component = rtd->codec_dais[i]->component;
1577 if (component->driver->probe_order == order) {
1578 ret = soc_probe_component(card, component);
1584 /* probe the platform */
1585 if (platform->component.driver->probe_order == order) {
1586 ret = soc_probe_component(card, &platform->component);
1594 static int soc_probe_dai(struct snd_soc_dai *dai, int order)
1598 if (!dai->probed && dai->driver->probe_order == order) {
1599 if (dai->driver->probe) {
1600 ret = dai->driver->probe(dai);
1603 "ASoC: failed to probe DAI %s: %d\n",
1615 static int soc_link_dai_pcm_new(struct snd_soc_dai **dais, int num_dais,
1616 struct snd_soc_pcm_runtime *rtd)
1620 for (i = 0; i < num_dais; ++i) {
1621 struct snd_soc_dai_driver *drv = dais[i]->driver;
1623 if (!rtd->dai_link->no_pcm && drv->pcm_new)
1624 ret = drv->pcm_new(rtd, dais[i]);
1626 dev_err(dais[i]->dev,
1627 "ASoC: Failed to bind %s with pcm device\n",
1636 static int soc_link_dai_widgets(struct snd_soc_card *card,
1637 struct snd_soc_dai_link *dai_link,
1638 struct snd_soc_pcm_runtime *rtd)
1640 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
1641 struct snd_soc_dai *codec_dai = rtd->codec_dai;
1642 struct snd_soc_dapm_widget *sink, *source;
1645 if (rtd->num_codecs > 1)
1646 dev_warn(card->dev, "ASoC: Multiple codecs not supported yet\n");
1648 /* link the DAI widgets */
1649 sink = codec_dai->playback_widget;
1650 source = cpu_dai->capture_widget;
1651 if (sink && source) {
1652 ret = snd_soc_dapm_new_pcm(card, dai_link->params,
1653 dai_link->num_params,
1656 dev_err(card->dev, "ASoC: Can't link %s to %s: %d\n",
1657 sink->name, source->name, ret);
1662 sink = cpu_dai->playback_widget;
1663 source = codec_dai->capture_widget;
1664 if (sink && source) {
1665 ret = snd_soc_dapm_new_pcm(card, dai_link->params,
1666 dai_link->num_params,
1669 dev_err(card->dev, "ASoC: Can't link %s to %s: %d\n",
1670 sink->name, source->name, ret);
1678 static int soc_probe_link_dais(struct snd_soc_card *card,
1679 struct snd_soc_pcm_runtime *rtd, int order)
1681 struct snd_soc_dai_link *dai_link = rtd->dai_link;
1682 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
1685 dev_dbg(card->dev, "ASoC: probe %s dai link %d late %d\n",
1686 card->name, rtd->num, order);
1688 /* set default power off timeout */
1689 rtd->pmdown_time = pmdown_time;
1691 ret = soc_probe_dai(cpu_dai, order);
1695 /* probe the CODEC DAI */
1696 for (i = 0; i < rtd->num_codecs; i++) {
1697 ret = soc_probe_dai(rtd->codec_dais[i], order);
1702 /* complete DAI probe during last probe */
1703 if (order != SND_SOC_COMP_ORDER_LAST)
1706 /* do machine specific initialization */
1707 if (dai_link->init) {
1708 ret = dai_link->init(rtd);
1710 dev_err(card->dev, "ASoC: failed to init %s: %d\n",
1711 dai_link->name, ret);
1716 if (dai_link->dai_fmt)
1717 snd_soc_runtime_set_dai_fmt(rtd, dai_link->dai_fmt);
1719 ret = soc_post_component_init(rtd, dai_link->name);
1723 #ifdef CONFIG_DEBUG_FS
1724 /* add DPCM sysfs entries */
1725 if (dai_link->dynamic)
1726 soc_dpcm_debugfs_add(rtd);
1729 if (cpu_dai->driver->compress_new) {
1730 /*create compress_device"*/
1731 ret = cpu_dai->driver->compress_new(rtd, rtd->num);
1733 dev_err(card->dev, "ASoC: can't create compress %s\n",
1734 dai_link->stream_name);
1739 if (!dai_link->params) {
1740 /* create the pcm */
1741 ret = soc_new_pcm(rtd, rtd->num);
1743 dev_err(card->dev, "ASoC: can't create pcm %s :%d\n",
1744 dai_link->stream_name, ret);
1747 ret = soc_link_dai_pcm_new(&cpu_dai, 1, rtd);
1750 ret = soc_link_dai_pcm_new(rtd->codec_dais,
1751 rtd->num_codecs, rtd);
1755 INIT_DELAYED_WORK(&rtd->delayed_work,
1756 codec2codec_close_delayed_work);
1758 /* link the DAI widgets */
1759 ret = soc_link_dai_widgets(card, dai_link, rtd);
1768 static int soc_bind_aux_dev(struct snd_soc_card *card, int num)
1770 struct snd_soc_aux_dev *aux_dev = &card->aux_dev[num];
1771 struct snd_soc_component *component;
1773 struct device_node *codec_of_node;
1775 if (aux_dev->codec_of_node || aux_dev->codec_name) {
1776 /* codecs, usually analog devices */
1777 name = aux_dev->codec_name;
1778 codec_of_node = aux_dev->codec_of_node;
1779 component = soc_find_component(codec_of_node, name);
1782 name = of_node_full_name(codec_of_node);
1785 } else if (aux_dev->name) {
1786 /* generic components */
1787 name = aux_dev->name;
1788 component = soc_find_component(NULL, name);
1792 dev_err(card->dev, "ASoC: Invalid auxiliary device\n");
1796 component->init = aux_dev->init;
1797 list_add(&component->card_aux_list, &card->aux_comp_list);
1802 dev_err(card->dev, "ASoC: %s not registered\n", name);
1803 return -EPROBE_DEFER;
1806 static int soc_probe_aux_devices(struct snd_soc_card *card)
1808 struct snd_soc_component *comp;
1812 for (order = SND_SOC_COMP_ORDER_FIRST; order <= SND_SOC_COMP_ORDER_LAST;
1814 list_for_each_entry(comp, &card->aux_comp_list, card_aux_list) {
1815 if (comp->driver->probe_order == order) {
1816 ret = soc_probe_component(card, comp);
1819 "ASoC: failed to probe aux component %s %d\n",
1830 static void soc_remove_aux_devices(struct snd_soc_card *card)
1832 struct snd_soc_component *comp, *_comp;
1835 for (order = SND_SOC_COMP_ORDER_FIRST; order <= SND_SOC_COMP_ORDER_LAST;
1837 list_for_each_entry_safe(comp, _comp,
1838 &card->aux_comp_list, card_aux_list) {
1840 if (comp->driver->remove_order == order) {
1841 soc_remove_component(comp);
1842 /* remove it from the card's aux_comp_list */
1843 list_del(&comp->card_aux_list);
1849 static int snd_soc_init_codec_cache(struct snd_soc_codec *codec)
1853 if (codec->cache_init)
1856 ret = snd_soc_cache_init(codec);
1859 "ASoC: Failed to set cache compression type: %d\n",
1863 codec->cache_init = 1;
1868 * snd_soc_runtime_set_dai_fmt() - Change DAI link format for a ASoC runtime
1869 * @rtd: The runtime for which the DAI link format should be changed
1870 * @dai_fmt: The new DAI link format
1872 * This function updates the DAI link format for all DAIs connected to the DAI
1873 * link for the specified runtime.
1875 * Note: For setups with a static format set the dai_fmt field in the
1876 * corresponding snd_dai_link struct instead of using this function.
1878 * Returns 0 on success, otherwise a negative error code.
1880 int snd_soc_runtime_set_dai_fmt(struct snd_soc_pcm_runtime *rtd,
1881 unsigned int dai_fmt)
1883 struct snd_soc_dai **codec_dais = rtd->codec_dais;
1884 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
1888 for (i = 0; i < rtd->num_codecs; i++) {
1889 struct snd_soc_dai *codec_dai = codec_dais[i];
1891 ret = snd_soc_dai_set_fmt(codec_dai, dai_fmt);
1892 if (ret != 0 && ret != -ENOTSUPP) {
1893 dev_warn(codec_dai->dev,
1894 "ASoC: Failed to set DAI format: %d\n", ret);
1899 /* Flip the polarity for the "CPU" end of a CODEC<->CODEC link */
1900 if (cpu_dai->codec) {
1901 unsigned int inv_dai_fmt;
1903 inv_dai_fmt = dai_fmt & ~SND_SOC_DAIFMT_MASTER_MASK;
1904 switch (dai_fmt & SND_SOC_DAIFMT_MASTER_MASK) {
1905 case SND_SOC_DAIFMT_CBM_CFM:
1906 inv_dai_fmt |= SND_SOC_DAIFMT_CBS_CFS;
1908 case SND_SOC_DAIFMT_CBM_CFS:
1909 inv_dai_fmt |= SND_SOC_DAIFMT_CBS_CFM;
1911 case SND_SOC_DAIFMT_CBS_CFM:
1912 inv_dai_fmt |= SND_SOC_DAIFMT_CBM_CFS;
1914 case SND_SOC_DAIFMT_CBS_CFS:
1915 inv_dai_fmt |= SND_SOC_DAIFMT_CBM_CFM;
1919 dai_fmt = inv_dai_fmt;
1922 ret = snd_soc_dai_set_fmt(cpu_dai, dai_fmt);
1923 if (ret != 0 && ret != -ENOTSUPP) {
1924 dev_warn(cpu_dai->dev,
1925 "ASoC: Failed to set DAI format: %d\n", ret);
1931 EXPORT_SYMBOL_GPL(snd_soc_runtime_set_dai_fmt);
1935 /* Trim special characters, and replace '-' with '_' since '-' is used to
1936 * separate different DMI fields in the card long name. Only number and
1937 * alphabet characters and a few separator characters are kept.
1939 static void cleanup_dmi_name(char *name)
1943 for (i = 0; name[i]; i++) {
1944 if (isalnum(name[i]) || (name[i] == '.')
1945 || (name[i] == '_'))
1946 name[j++] = name[i];
1947 else if (name[i] == '-')
1954 /* Check if a DMI field is valid, i.e. not containing any string
1955 * in the black list.
1957 static int is_dmi_valid(const char *field)
1961 while (dmi_blacklist[i]) {
1962 if (strstr(field, dmi_blacklist[i]))
1971 * snd_soc_set_dmi_name() - Register DMI names to card
1972 * @card: The card to register DMI names
1973 * @flavour: The flavour "differentiator" for the card amongst its peers.
1975 * An Intel machine driver may be used by many different devices but are
1976 * difficult for userspace to differentiate, since machine drivers ususally
1977 * use their own name as the card short name and leave the card long name
1978 * blank. To differentiate such devices and fix bugs due to lack of
1979 * device-specific configurations, this function allows DMI info to be used
1980 * as the sound card long name, in the format of
1981 * "vendor-product-version-board"
1982 * (Character '-' is used to separate different DMI fields here).
1983 * This will help the user space to load the device-specific Use Case Manager
1984 * (UCM) configurations for the card.
1986 * Possible card long names may be:
1987 * DellInc.-XPS139343-01-0310JH
1988 * ASUSTeKCOMPUTERINC.-T100TA-1.0-T100TA
1989 * Circuitco-MinnowboardMaxD0PLATFORM-D0-MinnowBoardMAX
1991 * This function also supports flavoring the card longname to provide
1992 * the extra differentiation, like "vendor-product-version-board-flavor".
1994 * We only keep number and alphabet characters and a few separator characters
1995 * in the card long name since UCM in the user space uses the card long names
1996 * as card configuration directory names and AudoConf cannot support special
1997 * charactors like SPACE.
1999 * Returns 0 on success, otherwise a negative error code.
2001 int snd_soc_set_dmi_name(struct snd_soc_card *card, const char *flavour)
2003 const char *vendor, *product, *product_version, *board;
2004 size_t longname_buf_size = sizeof(card->snd_card->longname);
2007 if (card->long_name)
2008 return 0; /* long name already set by driver or from DMI */
2010 /* make up dmi long name as: vendor.product.version.board */
2011 vendor = dmi_get_system_info(DMI_BOARD_VENDOR);
2012 if (!vendor || !is_dmi_valid(vendor)) {
2013 dev_warn(card->dev, "ASoC: no DMI vendor name!\n");
2018 snprintf(card->dmi_longname, sizeof(card->snd_card->longname),
2020 cleanup_dmi_name(card->dmi_longname);
2022 product = dmi_get_system_info(DMI_PRODUCT_NAME);
2023 if (product && is_dmi_valid(product)) {
2024 len = strlen(card->dmi_longname);
2025 snprintf(card->dmi_longname + len,
2026 longname_buf_size - len,
2029 len++; /* skip the separator "-" */
2030 if (len < longname_buf_size)
2031 cleanup_dmi_name(card->dmi_longname + len);
2033 /* some vendors like Lenovo may only put a self-explanatory
2034 * name in the product version field
2036 product_version = dmi_get_system_info(DMI_PRODUCT_VERSION);
2037 if (product_version && is_dmi_valid(product_version)) {
2038 len = strlen(card->dmi_longname);
2039 snprintf(card->dmi_longname + len,
2040 longname_buf_size - len,
2041 "-%s", product_version);
2044 if (len < longname_buf_size)
2045 cleanup_dmi_name(card->dmi_longname + len);
2049 board = dmi_get_system_info(DMI_BOARD_NAME);
2050 if (board && is_dmi_valid(board)) {
2051 len = strlen(card->dmi_longname);
2052 snprintf(card->dmi_longname + len,
2053 longname_buf_size - len,
2057 if (len < longname_buf_size)
2058 cleanup_dmi_name(card->dmi_longname + len);
2059 } else if (!product) {
2060 /* fall back to using legacy name */
2061 dev_warn(card->dev, "ASoC: no DMI board/product name!\n");
2065 /* Add flavour to dmi long name */
2067 len = strlen(card->dmi_longname);
2068 snprintf(card->dmi_longname + len,
2069 longname_buf_size - len,
2073 if (len < longname_buf_size)
2074 cleanup_dmi_name(card->dmi_longname + len);
2077 /* set the card long name */
2078 card->long_name = card->dmi_longname;
2082 EXPORT_SYMBOL_GPL(snd_soc_set_dmi_name);
2083 #endif /* CONFIG_DMI */
2085 static int snd_soc_instantiate_card(struct snd_soc_card *card)
2087 struct snd_soc_codec *codec;
2088 struct snd_soc_pcm_runtime *rtd;
2089 struct snd_soc_dai_link *dai_link;
2092 mutex_lock(&client_mutex);
2093 mutex_lock_nested(&card->mutex, SND_SOC_CARD_CLASS_INIT);
2096 for (i = 0; i < card->num_links; i++) {
2097 ret = soc_bind_dai_link(card, &card->dai_link[i]);
2102 /* bind aux_devs too */
2103 for (i = 0; i < card->num_aux_devs; i++) {
2104 ret = soc_bind_aux_dev(card, i);
2109 /* add predefined DAI links to the list */
2110 for (i = 0; i < card->num_links; i++)
2111 snd_soc_add_dai_link(card, card->dai_link+i);
2113 /* initialize the register cache for each available codec */
2114 list_for_each_entry(codec, &codec_list, list) {
2115 if (codec->cache_init)
2117 ret = snd_soc_init_codec_cache(codec);
2122 /* card bind complete so register a sound card */
2123 ret = snd_card_new(card->dev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1,
2124 card->owner, 0, &card->snd_card);
2127 "ASoC: can't create sound card for card %s: %d\n",
2132 soc_init_card_debugfs(card);
2134 card->dapm.bias_level = SND_SOC_BIAS_OFF;
2135 card->dapm.dev = card->dev;
2136 card->dapm.card = card;
2137 list_add(&card->dapm.list, &card->dapm_list);
2139 #ifdef CONFIG_DEBUG_FS
2140 snd_soc_dapm_debugfs_init(&card->dapm, card->debugfs_card_root);
2143 #ifdef CONFIG_PM_SLEEP
2144 /* deferred resume work */
2145 INIT_WORK(&card->deferred_resume_work, soc_resume_deferred);
2148 if (card->dapm_widgets)
2149 snd_soc_dapm_new_controls(&card->dapm, card->dapm_widgets,
2150 card->num_dapm_widgets);
2152 if (card->of_dapm_widgets)
2153 snd_soc_dapm_new_controls(&card->dapm, card->of_dapm_widgets,
2154 card->num_of_dapm_widgets);
2156 /* initialise the sound card only once */
2158 ret = card->probe(card);
2160 goto card_probe_error;
2163 /* probe all components used by DAI links on this card */
2164 for (order = SND_SOC_COMP_ORDER_FIRST; order <= SND_SOC_COMP_ORDER_LAST;
2166 list_for_each_entry(rtd, &card->rtd_list, list) {
2167 ret = soc_probe_link_components(card, rtd, order);
2170 "ASoC: failed to instantiate card %d\n",
2177 /* probe auxiliary components */
2178 ret = soc_probe_aux_devices(card);
2182 /* Find new DAI links added during probing components and bind them.
2183 * Components with topology may bring new DAIs and DAI links.
2185 list_for_each_entry(dai_link, &card->dai_link_list, list) {
2186 if (soc_is_dai_link_bound(card, dai_link))
2189 ret = soc_init_dai_link(card, dai_link);
2192 ret = soc_bind_dai_link(card, dai_link);
2197 /* probe all DAI links on this card */
2198 for (order = SND_SOC_COMP_ORDER_FIRST; order <= SND_SOC_COMP_ORDER_LAST;
2200 list_for_each_entry(rtd, &card->rtd_list, list) {
2201 ret = soc_probe_link_dais(card, rtd, order);
2204 "ASoC: failed to instantiate card %d\n",
2211 snd_soc_dapm_link_dai_widgets(card);
2212 snd_soc_dapm_connect_dai_link_widgets(card);
2215 snd_soc_add_card_controls(card, card->controls, card->num_controls);
2217 if (card->dapm_routes)
2218 snd_soc_dapm_add_routes(&card->dapm, card->dapm_routes,
2219 card->num_dapm_routes);
2221 if (card->of_dapm_routes)
2222 snd_soc_dapm_add_routes(&card->dapm, card->of_dapm_routes,
2223 card->num_of_dapm_routes);
2225 /* try to set some sane longname if DMI is available */
2226 snd_soc_set_dmi_name(card, NULL);
2228 snprintf(card->snd_card->shortname, sizeof(card->snd_card->shortname),
2230 snprintf(card->snd_card->longname, sizeof(card->snd_card->longname),
2231 "%s", card->long_name ? card->long_name : card->name);
2232 snprintf(card->snd_card->driver, sizeof(card->snd_card->driver),
2233 "%s", card->driver_name ? card->driver_name : card->name);
2234 for (i = 0; i < ARRAY_SIZE(card->snd_card->driver); i++) {
2235 switch (card->snd_card->driver[i]) {
2241 if (!isalnum(card->snd_card->driver[i]))
2242 card->snd_card->driver[i] = '_';
2247 if (card->late_probe) {
2248 ret = card->late_probe(card);
2250 dev_err(card->dev, "ASoC: %s late_probe() failed: %d\n",
2252 goto probe_aux_dev_err;
2256 snd_soc_dapm_new_widgets(card);
2258 ret = snd_card_register(card->snd_card);
2260 dev_err(card->dev, "ASoC: failed to register soundcard %d\n",
2262 goto probe_aux_dev_err;
2265 card->instantiated = 1;
2266 snd_soc_dapm_sync(&card->dapm);
2267 mutex_unlock(&card->mutex);
2268 mutex_unlock(&client_mutex);
2273 soc_remove_aux_devices(card);
2276 soc_remove_dai_links(card);
2282 snd_soc_dapm_free(&card->dapm);
2283 soc_cleanup_card_debugfs(card);
2284 snd_card_free(card->snd_card);
2287 soc_remove_pcm_runtimes(card);
2288 mutex_unlock(&card->mutex);
2289 mutex_unlock(&client_mutex);
2294 /* probes a new socdev */
2295 static int soc_probe(struct platform_device *pdev)
2297 struct snd_soc_card *card = platform_get_drvdata(pdev);
2300 * no card, so machine driver should be registering card
2301 * we should not be here in that case so ret error
2306 dev_warn(&pdev->dev,
2307 "ASoC: machine %s should use snd_soc_register_card()\n",
2310 /* Bodge while we unpick instantiation */
2311 card->dev = &pdev->dev;
2313 return snd_soc_register_card(card);
2316 static int soc_cleanup_card_resources(struct snd_soc_card *card)
2318 struct snd_soc_pcm_runtime *rtd;
2320 /* make sure any delayed work runs */
2321 list_for_each_entry(rtd, &card->rtd_list, list)
2322 flush_delayed_work(&rtd->delayed_work);
2324 /* free the ALSA card at first; this syncs with pending operations */
2325 snd_card_free(card->snd_card);
2327 /* remove and free each DAI */
2328 soc_remove_dai_links(card);
2329 soc_remove_pcm_runtimes(card);
2331 /* remove auxiliary devices */
2332 soc_remove_aux_devices(card);
2334 snd_soc_dapm_free(&card->dapm);
2335 soc_cleanup_card_debugfs(card);
2337 /* remove the card */
2344 /* removes a socdev */
2345 static int soc_remove(struct platform_device *pdev)
2347 struct snd_soc_card *card = platform_get_drvdata(pdev);
2349 snd_soc_unregister_card(card);
2353 int snd_soc_poweroff(struct device *dev)
2355 struct snd_soc_card *card = dev_get_drvdata(dev);
2356 struct snd_soc_pcm_runtime *rtd;
2358 if (!card->instantiated)
2361 /* Flush out pmdown_time work - we actually do want to run it
2362 * now, we're shutting down so no imminent restart. */
2363 list_for_each_entry(rtd, &card->rtd_list, list)
2364 flush_delayed_work(&rtd->delayed_work);
2366 snd_soc_dapm_shutdown(card);
2368 /* deactivate pins to sleep state */
2369 list_for_each_entry(rtd, &card->rtd_list, list) {
2370 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
2373 pinctrl_pm_select_sleep_state(cpu_dai->dev);
2374 for (i = 0; i < rtd->num_codecs; i++) {
2375 struct snd_soc_dai *codec_dai = rtd->codec_dais[i];
2376 pinctrl_pm_select_sleep_state(codec_dai->dev);
2382 EXPORT_SYMBOL_GPL(snd_soc_poweroff);
2384 const struct dev_pm_ops snd_soc_pm_ops = {
2385 .suspend = snd_soc_suspend,
2386 .resume = snd_soc_resume,
2387 .freeze = snd_soc_suspend,
2388 .thaw = snd_soc_resume,
2389 .poweroff = snd_soc_poweroff,
2390 .restore = snd_soc_resume,
2392 EXPORT_SYMBOL_GPL(snd_soc_pm_ops);
2394 /* ASoC platform driver */
2395 static struct platform_driver soc_driver = {
2397 .name = "soc-audio",
2398 .pm = &snd_soc_pm_ops,
2401 .remove = soc_remove,
2405 * snd_soc_cnew - create new control
2406 * @_template: control template
2407 * @data: control private data
2408 * @long_name: control long name
2409 * @prefix: control name prefix
2411 * Create a new mixer control from a template control.
2413 * Returns 0 for success, else error.
2415 struct snd_kcontrol *snd_soc_cnew(const struct snd_kcontrol_new *_template,
2416 void *data, const char *long_name,
2419 struct snd_kcontrol_new template;
2420 struct snd_kcontrol *kcontrol;
2423 memcpy(&template, _template, sizeof(template));
2427 long_name = template.name;
2430 name = kasprintf(GFP_KERNEL, "%s %s", prefix, long_name);
2434 template.name = name;
2436 template.name = long_name;
2439 kcontrol = snd_ctl_new1(&template, data);
2445 EXPORT_SYMBOL_GPL(snd_soc_cnew);
2447 static int snd_soc_add_controls(struct snd_card *card, struct device *dev,
2448 const struct snd_kcontrol_new *controls, int num_controls,
2449 const char *prefix, void *data)
2453 for (i = 0; i < num_controls; i++) {
2454 const struct snd_kcontrol_new *control = &controls[i];
2455 err = snd_ctl_add(card, snd_soc_cnew(control, data,
2456 control->name, prefix));
2458 dev_err(dev, "ASoC: Failed to add %s: %d\n",
2459 control->name, err);
2467 struct snd_kcontrol *snd_soc_card_get_kcontrol(struct snd_soc_card *soc_card,
2470 struct snd_card *card = soc_card->snd_card;
2471 struct snd_kcontrol *kctl;
2473 if (unlikely(!name))
2476 list_for_each_entry(kctl, &card->controls, list)
2477 if (!strncmp(kctl->id.name, name, sizeof(kctl->id.name)))
2481 EXPORT_SYMBOL_GPL(snd_soc_card_get_kcontrol);
2484 * snd_soc_add_component_controls - Add an array of controls to a component.
2486 * @component: Component to add controls to
2487 * @controls: Array of controls to add
2488 * @num_controls: Number of elements in the array
2490 * Return: 0 for success, else error.
2492 int snd_soc_add_component_controls(struct snd_soc_component *component,
2493 const struct snd_kcontrol_new *controls, unsigned int num_controls)
2495 struct snd_card *card = component->card->snd_card;
2497 return snd_soc_add_controls(card, component->dev, controls,
2498 num_controls, component->name_prefix, component);
2500 EXPORT_SYMBOL_GPL(snd_soc_add_component_controls);
2503 * snd_soc_add_codec_controls - add an array of controls to a codec.
2504 * Convenience function to add a list of controls. Many codecs were
2505 * duplicating this code.
2507 * @codec: codec to add controls to
2508 * @controls: array of controls to add
2509 * @num_controls: number of elements in the array
2511 * Return 0 for success, else error.
2513 int snd_soc_add_codec_controls(struct snd_soc_codec *codec,
2514 const struct snd_kcontrol_new *controls, unsigned int num_controls)
2516 return snd_soc_add_component_controls(&codec->component, controls,
2519 EXPORT_SYMBOL_GPL(snd_soc_add_codec_controls);
2522 * snd_soc_add_platform_controls - add an array of controls to a platform.
2523 * Convenience function to add a list of controls.
2525 * @platform: platform to add controls to
2526 * @controls: array of controls to add
2527 * @num_controls: number of elements in the array
2529 * Return 0 for success, else error.
2531 int snd_soc_add_platform_controls(struct snd_soc_platform *platform,
2532 const struct snd_kcontrol_new *controls, unsigned int num_controls)
2534 return snd_soc_add_component_controls(&platform->component, controls,
2537 EXPORT_SYMBOL_GPL(snd_soc_add_platform_controls);
2540 * snd_soc_add_card_controls - add an array of controls to a SoC card.
2541 * Convenience function to add a list of controls.
2543 * @soc_card: SoC card to add controls to
2544 * @controls: array of controls to add
2545 * @num_controls: number of elements in the array
2547 * Return 0 for success, else error.
2549 int snd_soc_add_card_controls(struct snd_soc_card *soc_card,
2550 const struct snd_kcontrol_new *controls, int num_controls)
2552 struct snd_card *card = soc_card->snd_card;
2554 return snd_soc_add_controls(card, soc_card->dev, controls, num_controls,
2557 EXPORT_SYMBOL_GPL(snd_soc_add_card_controls);
2560 * snd_soc_add_dai_controls - add an array of controls to a DAI.
2561 * Convienience function to add a list of controls.
2563 * @dai: DAI to add controls to
2564 * @controls: array of controls to add
2565 * @num_controls: number of elements in the array
2567 * Return 0 for success, else error.
2569 int snd_soc_add_dai_controls(struct snd_soc_dai *dai,
2570 const struct snd_kcontrol_new *controls, int num_controls)
2572 struct snd_card *card = dai->component->card->snd_card;
2574 return snd_soc_add_controls(card, dai->dev, controls, num_controls,
2577 EXPORT_SYMBOL_GPL(snd_soc_add_dai_controls);
2580 * snd_soc_dai_set_sysclk - configure DAI system or master clock.
2582 * @clk_id: DAI specific clock ID
2583 * @freq: new clock frequency in Hz
2584 * @dir: new clock direction - input/output.
2586 * Configures the DAI master (MCLK) or system (SYSCLK) clocking.
2588 int snd_soc_dai_set_sysclk(struct snd_soc_dai *dai, int clk_id,
2589 unsigned int freq, int dir)
2591 if (dai->driver && dai->driver->ops->set_sysclk)
2592 return dai->driver->ops->set_sysclk(dai, clk_id, freq, dir);
2594 return snd_soc_component_set_sysclk(dai->component, clk_id, 0,
2597 EXPORT_SYMBOL_GPL(snd_soc_dai_set_sysclk);
2600 * snd_soc_codec_set_sysclk - configure CODEC system or master clock.
2602 * @clk_id: DAI specific clock ID
2603 * @source: Source for the clock
2604 * @freq: new clock frequency in Hz
2605 * @dir: new clock direction - input/output.
2607 * Configures the CODEC master (MCLK) or system (SYSCLK) clocking.
2609 int snd_soc_codec_set_sysclk(struct snd_soc_codec *codec, int clk_id,
2610 int source, unsigned int freq, int dir)
2612 if (codec->driver->set_sysclk)
2613 return codec->driver->set_sysclk(codec, clk_id, source,
2618 EXPORT_SYMBOL_GPL(snd_soc_codec_set_sysclk);
2621 * snd_soc_component_set_sysclk - configure COMPONENT system or master clock.
2622 * @component: COMPONENT
2623 * @clk_id: DAI specific clock ID
2624 * @source: Source for the clock
2625 * @freq: new clock frequency in Hz
2626 * @dir: new clock direction - input/output.
2628 * Configures the CODEC master (MCLK) or system (SYSCLK) clocking.
2630 int snd_soc_component_set_sysclk(struct snd_soc_component *component, int clk_id,
2631 int source, unsigned int freq, int dir)
2633 /* will be removed */
2634 if (component->set_sysclk)
2635 return component->set_sysclk(component, clk_id, source,
2638 if (component->driver->set_sysclk)
2639 return component->driver->set_sysclk(component, clk_id, source,
2644 EXPORT_SYMBOL_GPL(snd_soc_component_set_sysclk);
2647 * snd_soc_dai_set_clkdiv - configure DAI clock dividers.
2649 * @div_id: DAI specific clock divider ID
2650 * @div: new clock divisor.
2652 * Configures the clock dividers. This is used to derive the best DAI bit and
2653 * frame clocks from the system or master clock. It's best to set the DAI bit
2654 * and frame clocks as low as possible to save system power.
2656 int snd_soc_dai_set_clkdiv(struct snd_soc_dai *dai,
2657 int div_id, int div)
2659 if (dai->driver && dai->driver->ops->set_clkdiv)
2660 return dai->driver->ops->set_clkdiv(dai, div_id, div);
2664 EXPORT_SYMBOL_GPL(snd_soc_dai_set_clkdiv);
2667 * snd_soc_dai_set_pll - configure DAI PLL.
2669 * @pll_id: DAI specific PLL ID
2670 * @source: DAI specific source for the PLL
2671 * @freq_in: PLL input clock frequency in Hz
2672 * @freq_out: requested PLL output clock frequency in Hz
2674 * Configures and enables PLL to generate output clock based on input clock.
2676 int snd_soc_dai_set_pll(struct snd_soc_dai *dai, int pll_id, int source,
2677 unsigned int freq_in, unsigned int freq_out)
2679 if (dai->driver && dai->driver->ops->set_pll)
2680 return dai->driver->ops->set_pll(dai, pll_id, source,
2683 return snd_soc_component_set_pll(dai->component, pll_id, source,
2686 EXPORT_SYMBOL_GPL(snd_soc_dai_set_pll);
2689 * snd_soc_codec_set_pll - configure codec PLL.
2691 * @pll_id: DAI specific PLL ID
2692 * @source: DAI specific source for the PLL
2693 * @freq_in: PLL input clock frequency in Hz
2694 * @freq_out: requested PLL output clock frequency in Hz
2696 * Configures and enables PLL to generate output clock based on input clock.
2698 int snd_soc_codec_set_pll(struct snd_soc_codec *codec, int pll_id, int source,
2699 unsigned int freq_in, unsigned int freq_out)
2701 if (codec->driver->set_pll)
2702 return codec->driver->set_pll(codec, pll_id, source,
2707 EXPORT_SYMBOL_GPL(snd_soc_codec_set_pll);
2710 * snd_soc_component_set_pll - configure component PLL.
2711 * @component: COMPONENT
2712 * @pll_id: DAI specific PLL ID
2713 * @source: DAI specific source for the PLL
2714 * @freq_in: PLL input clock frequency in Hz
2715 * @freq_out: requested PLL output clock frequency in Hz
2717 * Configures and enables PLL to generate output clock based on input clock.
2719 int snd_soc_component_set_pll(struct snd_soc_component *component, int pll_id,
2720 int source, unsigned int freq_in,
2721 unsigned int freq_out)
2723 /* will be removed */
2724 if (component->set_pll)
2725 return component->set_pll(component, pll_id, source,
2728 if (component->driver->set_pll)
2729 return component->driver->set_pll(component, pll_id, source,
2734 EXPORT_SYMBOL_GPL(snd_soc_component_set_pll);
2737 * snd_soc_dai_set_bclk_ratio - configure BCLK to sample rate ratio.
2739 * @ratio: Ratio of BCLK to Sample rate.
2741 * Configures the DAI for a preset BCLK to sample rate ratio.
2743 int snd_soc_dai_set_bclk_ratio(struct snd_soc_dai *dai, unsigned int ratio)
2745 if (dai->driver && dai->driver->ops->set_bclk_ratio)
2746 return dai->driver->ops->set_bclk_ratio(dai, ratio);
2750 EXPORT_SYMBOL_GPL(snd_soc_dai_set_bclk_ratio);
2753 * snd_soc_dai_set_fmt - configure DAI hardware audio format.
2755 * @fmt: SND_SOC_DAIFMT_ format value.
2757 * Configures the DAI hardware format and clocking.
2759 int snd_soc_dai_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
2761 if (dai->driver == NULL)
2763 if (dai->driver->ops->set_fmt == NULL)
2765 return dai->driver->ops->set_fmt(dai, fmt);
2767 EXPORT_SYMBOL_GPL(snd_soc_dai_set_fmt);
2770 * snd_soc_xlate_tdm_slot - generate tx/rx slot mask.
2771 * @slots: Number of slots in use.
2772 * @tx_mask: bitmask representing active TX slots.
2773 * @rx_mask: bitmask representing active RX slots.
2775 * Generates the TDM tx and rx slot default masks for DAI.
2777 static int snd_soc_xlate_tdm_slot_mask(unsigned int slots,
2778 unsigned int *tx_mask,
2779 unsigned int *rx_mask)
2781 if (*tx_mask || *rx_mask)
2787 *tx_mask = (1 << slots) - 1;
2788 *rx_mask = (1 << slots) - 1;
2794 * snd_soc_dai_set_tdm_slot() - Configures a DAI for TDM operation
2795 * @dai: The DAI to configure
2796 * @tx_mask: bitmask representing active TX slots.
2797 * @rx_mask: bitmask representing active RX slots.
2798 * @slots: Number of slots in use.
2799 * @slot_width: Width in bits for each slot.
2801 * This function configures the specified DAI for TDM operation. @slot contains
2802 * the total number of slots of the TDM stream and @slot_with the width of each
2803 * slot in bit clock cycles. @tx_mask and @rx_mask are bitmasks specifying the
2804 * active slots of the TDM stream for the specified DAI, i.e. which slots the
2805 * DAI should write to or read from. If a bit is set the corresponding slot is
2806 * active, if a bit is cleared the corresponding slot is inactive. Bit 0 maps to
2807 * the first slot, bit 1 to the second slot and so on. The first active slot
2808 * maps to the first channel of the DAI, the second active slot to the second
2809 * channel and so on.
2811 * TDM mode can be disabled by passing 0 for @slots. In this case @tx_mask,
2812 * @rx_mask and @slot_width will be ignored.
2814 * Returns 0 on success, a negative error code otherwise.
2816 int snd_soc_dai_set_tdm_slot(struct snd_soc_dai *dai,
2817 unsigned int tx_mask, unsigned int rx_mask, int slots, int slot_width)
2819 if (dai->driver && dai->driver->ops->xlate_tdm_slot_mask)
2820 dai->driver->ops->xlate_tdm_slot_mask(slots,
2821 &tx_mask, &rx_mask);
2823 snd_soc_xlate_tdm_slot_mask(slots, &tx_mask, &rx_mask);
2825 dai->tx_mask = tx_mask;
2826 dai->rx_mask = rx_mask;
2828 if (dai->driver && dai->driver->ops->set_tdm_slot)
2829 return dai->driver->ops->set_tdm_slot(dai, tx_mask, rx_mask,
2834 EXPORT_SYMBOL_GPL(snd_soc_dai_set_tdm_slot);
2837 * snd_soc_dai_set_channel_map - configure DAI audio channel map
2839 * @tx_num: how many TX channels
2840 * @tx_slot: pointer to an array which imply the TX slot number channel
2842 * @rx_num: how many RX channels
2843 * @rx_slot: pointer to an array which imply the RX slot number channel
2846 * configure the relationship between channel number and TDM slot number.
2848 int snd_soc_dai_set_channel_map(struct snd_soc_dai *dai,
2849 unsigned int tx_num, unsigned int *tx_slot,
2850 unsigned int rx_num, unsigned int *rx_slot)
2852 if (dai->driver && dai->driver->ops->set_channel_map)
2853 return dai->driver->ops->set_channel_map(dai, tx_num, tx_slot,
2858 EXPORT_SYMBOL_GPL(snd_soc_dai_set_channel_map);
2861 * snd_soc_dai_set_tristate - configure DAI system or master clock.
2863 * @tristate: tristate enable
2865 * Tristates the DAI so that others can use it.
2867 int snd_soc_dai_set_tristate(struct snd_soc_dai *dai, int tristate)
2869 if (dai->driver && dai->driver->ops->set_tristate)
2870 return dai->driver->ops->set_tristate(dai, tristate);
2874 EXPORT_SYMBOL_GPL(snd_soc_dai_set_tristate);
2877 * snd_soc_dai_digital_mute - configure DAI system or master clock.
2879 * @mute: mute enable
2880 * @direction: stream to mute
2882 * Mutes the DAI DAC.
2884 int snd_soc_dai_digital_mute(struct snd_soc_dai *dai, int mute,
2890 if (dai->driver->ops->mute_stream)
2891 return dai->driver->ops->mute_stream(dai, mute, direction);
2892 else if (direction == SNDRV_PCM_STREAM_PLAYBACK &&
2893 dai->driver->ops->digital_mute)
2894 return dai->driver->ops->digital_mute(dai, mute);
2898 EXPORT_SYMBOL_GPL(snd_soc_dai_digital_mute);
2901 * snd_soc_register_card - Register a card with the ASoC core
2903 * @card: Card to register
2906 int snd_soc_register_card(struct snd_soc_card *card)
2909 struct snd_soc_pcm_runtime *rtd;
2911 if (!card->name || !card->dev)
2914 for (i = 0; i < card->num_links; i++) {
2915 struct snd_soc_dai_link *link = &card->dai_link[i];
2917 ret = soc_init_dai_link(card, link);
2919 dev_err(card->dev, "ASoC: failed to init link %s\n",
2925 dev_set_drvdata(card->dev, card);
2927 snd_soc_initialize_card_lists(card);
2929 INIT_LIST_HEAD(&card->dai_link_list);
2930 card->num_dai_links = 0;
2932 INIT_LIST_HEAD(&card->rtd_list);
2935 INIT_LIST_HEAD(&card->dapm_dirty);
2936 INIT_LIST_HEAD(&card->dobj_list);
2937 card->instantiated = 0;
2938 mutex_init(&card->mutex);
2939 mutex_init(&card->dapm_mutex);
2941 ret = snd_soc_instantiate_card(card);
2945 /* deactivate pins to sleep state */
2946 list_for_each_entry(rtd, &card->rtd_list, list) {
2947 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
2950 for (j = 0; j < rtd->num_codecs; j++) {
2951 struct snd_soc_dai *codec_dai = rtd->codec_dais[j];
2952 if (!codec_dai->active)
2953 pinctrl_pm_select_sleep_state(codec_dai->dev);
2956 if (!cpu_dai->active)
2957 pinctrl_pm_select_sleep_state(cpu_dai->dev);
2962 EXPORT_SYMBOL_GPL(snd_soc_register_card);
2965 * snd_soc_unregister_card - Unregister a card with the ASoC core
2967 * @card: Card to unregister
2970 int snd_soc_unregister_card(struct snd_soc_card *card)
2972 if (card->instantiated) {
2973 card->instantiated = false;
2974 snd_soc_dapm_shutdown(card);
2975 soc_cleanup_card_resources(card);
2976 dev_dbg(card->dev, "ASoC: Unregistered card '%s'\n", card->name);
2981 EXPORT_SYMBOL_GPL(snd_soc_unregister_card);
2984 * Simplify DAI link configuration by removing ".-1" from device names
2985 * and sanitizing names.
2987 static char *fmt_single_name(struct device *dev, int *id)
2989 char *found, name[NAME_SIZE];
2992 if (dev_name(dev) == NULL)
2995 strlcpy(name, dev_name(dev), NAME_SIZE);
2997 /* are we a "%s.%d" name (platform and SPI components) */
2998 found = strstr(name, dev->driver->name);
3001 if (sscanf(&found[strlen(dev->driver->name)], ".%d", id) == 1) {
3003 /* discard ID from name if ID == -1 */
3005 found[strlen(dev->driver->name)] = '\0';
3009 /* I2C component devices are named "bus-addr" */
3010 if (sscanf(name, "%x-%x", &id1, &id2) == 2) {
3011 char tmp[NAME_SIZE];
3013 /* create unique ID number from I2C addr and bus */
3014 *id = ((id1 & 0xffff) << 16) + id2;
3016 /* sanitize component name for DAI link creation */
3017 snprintf(tmp, NAME_SIZE, "%s.%s", dev->driver->name, name);
3018 strlcpy(name, tmp, NAME_SIZE);
3023 return kstrdup(name, GFP_KERNEL);
3027 * Simplify DAI link naming for single devices with multiple DAIs by removing
3028 * any ".-1" and using the DAI name (instead of device name).
3030 static inline char *fmt_multiple_name(struct device *dev,
3031 struct snd_soc_dai_driver *dai_drv)
3033 if (dai_drv->name == NULL) {
3035 "ASoC: error - multiple DAI %s registered with no name\n",
3040 return kstrdup(dai_drv->name, GFP_KERNEL);
3044 * snd_soc_unregister_dai - Unregister DAIs from the ASoC core
3046 * @component: The component for which the DAIs should be unregistered
3048 static void snd_soc_unregister_dais(struct snd_soc_component *component)
3050 struct snd_soc_dai *dai, *_dai;
3052 list_for_each_entry_safe(dai, _dai, &component->dai_list, list) {
3053 dev_dbg(component->dev, "ASoC: Unregistered DAI '%s'\n",
3055 list_del(&dai->list);
3061 /* Create a DAI and add it to the component's DAI list */
3062 static struct snd_soc_dai *soc_add_dai(struct snd_soc_component *component,
3063 struct snd_soc_dai_driver *dai_drv,
3064 bool legacy_dai_naming)
3066 struct device *dev = component->dev;
3067 struct snd_soc_dai *dai;
3069 dev_dbg(dev, "ASoC: dynamically register DAI %s\n", dev_name(dev));
3071 dai = kzalloc(sizeof(struct snd_soc_dai), GFP_KERNEL);
3076 * Back in the old days when we still had component-less DAIs,
3077 * instead of having a static name, component-less DAIs would
3078 * inherit the name of the parent device so it is possible to
3079 * register multiple instances of the DAI. We still need to keep
3080 * the same naming style even though those DAIs are not
3081 * component-less anymore.
3083 if (legacy_dai_naming &&
3084 (dai_drv->id == 0 || dai_drv->name == NULL)) {
3085 dai->name = fmt_single_name(dev, &dai->id);
3087 dai->name = fmt_multiple_name(dev, dai_drv);
3089 dai->id = dai_drv->id;
3091 dai->id = component->num_dai;
3093 if (dai->name == NULL) {
3098 dai->component = component;
3100 dai->driver = dai_drv;
3101 if (!dai->driver->ops)
3102 dai->driver->ops = &null_dai_ops;
3104 list_add(&dai->list, &component->dai_list);
3105 component->num_dai++;
3107 dev_dbg(dev, "ASoC: Registered DAI '%s'\n", dai->name);
3112 * snd_soc_register_dais - Register a DAI with the ASoC core
3114 * @component: The component the DAIs are registered for
3115 * @dai_drv: DAI driver to use for the DAIs
3116 * @count: Number of DAIs
3117 * @legacy_dai_naming: Use the legacy naming scheme and let the DAI inherit the
3120 static int snd_soc_register_dais(struct snd_soc_component *component,
3121 struct snd_soc_dai_driver *dai_drv, size_t count,
3122 bool legacy_dai_naming)
3124 struct device *dev = component->dev;
3125 struct snd_soc_dai *dai;
3129 dev_dbg(dev, "ASoC: dai register %s #%zu\n", dev_name(dev), count);
3131 component->dai_drv = dai_drv;
3133 for (i = 0; i < count; i++) {
3135 dai = soc_add_dai(component, dai_drv + i,
3136 count == 1 && legacy_dai_naming);
3146 snd_soc_unregister_dais(component);
3152 * snd_soc_register_dai - Register a DAI dynamically & create its widgets
3154 * @component: The component the DAIs are registered for
3155 * @dai_drv: DAI driver to use for the DAI
3157 * Topology can use this API to register DAIs when probing a component.
3158 * These DAIs's widgets will be freed in the card cleanup and the DAIs
3159 * will be freed in the component cleanup.
3161 int snd_soc_register_dai(struct snd_soc_component *component,
3162 struct snd_soc_dai_driver *dai_drv)
3164 struct snd_soc_dapm_context *dapm =
3165 snd_soc_component_get_dapm(component);
3166 struct snd_soc_dai *dai;
3169 if (dai_drv->dobj.type != SND_SOC_DOBJ_PCM) {
3170 dev_err(component->dev, "Invalid dai type %d\n",
3171 dai_drv->dobj.type);
3175 lockdep_assert_held(&client_mutex);
3176 dai = soc_add_dai(component, dai_drv, false);
3180 /* Create the DAI widgets here. After adding DAIs, topology may
3181 * also add routes that need these widgets as source or sink.
3183 ret = snd_soc_dapm_new_dai_widgets(dapm, dai);
3185 dev_err(component->dev,
3186 "Failed to create DAI widgets %d\n", ret);
3191 EXPORT_SYMBOL_GPL(snd_soc_register_dai);
3193 static void snd_soc_component_seq_notifier(struct snd_soc_dapm_context *dapm,
3194 enum snd_soc_dapm_type type, int subseq)
3196 struct snd_soc_component *component = dapm->component;
3198 component->driver->seq_notifier(component, type, subseq);
3201 static int snd_soc_component_stream_event(struct snd_soc_dapm_context *dapm,
3204 struct snd_soc_component *component = dapm->component;
3206 return component->driver->stream_event(component, event);
3209 static int snd_soc_component_initialize(struct snd_soc_component *component,
3210 const struct snd_soc_component_driver *driver, struct device *dev)
3212 struct snd_soc_dapm_context *dapm;
3214 component->name = fmt_single_name(dev, &component->id);
3215 if (!component->name) {
3216 dev_err(dev, "ASoC: Failed to allocate name\n");
3220 component->dev = dev;
3221 component->driver = driver;
3222 component->probe = component->driver->probe;
3223 component->remove = component->driver->remove;
3224 component->suspend = component->driver->suspend;
3225 component->resume = component->driver->resume;
3226 component->set_sysclk = component->driver->set_sysclk;
3227 component->set_pll = component->driver->set_pll;
3228 component->set_jack = component->driver->set_jack;
3230 dapm = &component->dapm;
3232 dapm->component = component;
3233 dapm->bias_level = SND_SOC_BIAS_OFF;
3234 dapm->idle_bias_off = true;
3235 if (driver->seq_notifier)
3236 dapm->seq_notifier = snd_soc_component_seq_notifier;
3237 if (driver->stream_event)
3238 dapm->stream_event = snd_soc_component_stream_event;
3240 INIT_LIST_HEAD(&component->dai_list);
3241 mutex_init(&component->io_mutex);
3246 static void snd_soc_component_setup_regmap(struct snd_soc_component *component)
3248 int val_bytes = regmap_get_val_bytes(component->regmap);
3250 /* Errors are legitimate for non-integer byte multiples */
3252 component->val_bytes = val_bytes;
3255 #ifdef CONFIG_REGMAP
3258 * snd_soc_component_init_regmap() - Initialize regmap instance for the component
3259 * @component: The component for which to initialize the regmap instance
3260 * @regmap: The regmap instance that should be used by the component
3262 * This function allows deferred assignment of the regmap instance that is
3263 * associated with the component. Only use this if the regmap instance is not
3264 * yet ready when the component is registered. The function must also be called
3265 * before the first IO attempt of the component.
3267 void snd_soc_component_init_regmap(struct snd_soc_component *component,
3268 struct regmap *regmap)
3270 component->regmap = regmap;
3271 snd_soc_component_setup_regmap(component);
3273 EXPORT_SYMBOL_GPL(snd_soc_component_init_regmap);
3276 * snd_soc_component_exit_regmap() - De-initialize regmap instance for the component
3277 * @component: The component for which to de-initialize the regmap instance
3279 * Calls regmap_exit() on the regmap instance associated to the component and
3280 * removes the regmap instance from the component.
3282 * This function should only be used if snd_soc_component_init_regmap() was used
3283 * to initialize the regmap instance.
3285 void snd_soc_component_exit_regmap(struct snd_soc_component *component)
3287 regmap_exit(component->regmap);
3288 component->regmap = NULL;
3290 EXPORT_SYMBOL_GPL(snd_soc_component_exit_regmap);
3294 static void snd_soc_component_add_unlocked(struct snd_soc_component *component)
3296 if (!component->write && !component->read) {
3297 if (!component->regmap)
3298 component->regmap = dev_get_regmap(component->dev, NULL);
3299 if (component->regmap)
3300 snd_soc_component_setup_regmap(component);
3303 list_add(&component->list, &component_list);
3304 INIT_LIST_HEAD(&component->dobj_list);
3307 static void snd_soc_component_add(struct snd_soc_component *component)
3309 mutex_lock(&client_mutex);
3310 snd_soc_component_add_unlocked(component);
3311 mutex_unlock(&client_mutex);
3314 static void snd_soc_component_cleanup(struct snd_soc_component *component)
3316 snd_soc_unregister_dais(component);
3317 kfree(component->name);
3320 static void snd_soc_component_del_unlocked(struct snd_soc_component *component)
3322 struct snd_soc_card *card = component->card;
3325 snd_soc_unregister_card(card);
3327 list_del(&component->list);
3330 int snd_soc_register_component(struct device *dev,
3331 const struct snd_soc_component_driver *component_driver,
3332 struct snd_soc_dai_driver *dai_drv,
3335 struct snd_soc_component *component;
3338 component = kzalloc(sizeof(*component), GFP_KERNEL);
3340 dev_err(dev, "ASoC: Failed to allocate memory\n");
3344 ret = snd_soc_component_initialize(component, component_driver, dev);
3348 component->ignore_pmdown_time = true;
3349 component->registered_as_component = true;
3351 ret = snd_soc_register_dais(component, dai_drv, num_dai, true);
3353 dev_err(dev, "ASoC: Failed to register DAIs: %d\n", ret);
3357 snd_soc_component_add(component);
3362 snd_soc_component_cleanup(component);
3367 EXPORT_SYMBOL_GPL(snd_soc_register_component);
3370 * snd_soc_unregister_component - Unregister a component from the ASoC core
3372 * @dev: The device to unregister
3374 void snd_soc_unregister_component(struct device *dev)
3376 struct snd_soc_component *component;
3379 mutex_lock(&client_mutex);
3380 list_for_each_entry(component, &component_list, list) {
3381 if (dev != component->dev ||
3382 !component->registered_as_component)
3385 snd_soc_tplg_component_remove(component, SND_SOC_TPLG_INDEX_ALL);
3386 snd_soc_component_del_unlocked(component);
3390 mutex_unlock(&client_mutex);
3393 snd_soc_component_cleanup(component);
3397 EXPORT_SYMBOL_GPL(snd_soc_unregister_component);
3399 static int snd_soc_platform_drv_probe(struct snd_soc_component *component)
3401 struct snd_soc_platform *platform = snd_soc_component_to_platform(component);
3403 return platform->driver->probe(platform);
3406 static void snd_soc_platform_drv_remove(struct snd_soc_component *component)
3408 struct snd_soc_platform *platform = snd_soc_component_to_platform(component);
3410 platform->driver->remove(platform);
3414 * snd_soc_add_platform - Add a platform to the ASoC core
3415 * @dev: The parent device for the platform
3416 * @platform: The platform to add
3417 * @platform_drv: The driver for the platform
3419 int snd_soc_add_platform(struct device *dev, struct snd_soc_platform *platform,
3420 const struct snd_soc_platform_driver *platform_drv)
3424 ret = snd_soc_component_initialize(&platform->component,
3425 &platform_drv->component_driver, dev);
3429 platform->dev = dev;
3430 platform->driver = platform_drv;
3432 if (platform_drv->probe)
3433 platform->component.probe = snd_soc_platform_drv_probe;
3434 if (platform_drv->remove)
3435 platform->component.remove = snd_soc_platform_drv_remove;
3437 #ifdef CONFIG_DEBUG_FS
3438 platform->component.debugfs_prefix = "platform";
3441 mutex_lock(&client_mutex);
3442 snd_soc_component_add_unlocked(&platform->component);
3443 list_add(&platform->list, &platform_list);
3444 mutex_unlock(&client_mutex);
3446 dev_dbg(dev, "ASoC: Registered platform '%s'\n",
3447 platform->component.name);
3451 EXPORT_SYMBOL_GPL(snd_soc_add_platform);
3454 * snd_soc_register_platform - Register a platform with the ASoC core
3456 * @dev: The device for the platform
3457 * @platform_drv: The driver for the platform
3459 int snd_soc_register_platform(struct device *dev,
3460 const struct snd_soc_platform_driver *platform_drv)
3462 struct snd_soc_platform *platform;
3465 dev_dbg(dev, "ASoC: platform register %s\n", dev_name(dev));
3467 platform = kzalloc(sizeof(struct snd_soc_platform), GFP_KERNEL);
3468 if (platform == NULL)
3471 ret = snd_soc_add_platform(dev, platform, platform_drv);
3477 EXPORT_SYMBOL_GPL(snd_soc_register_platform);
3480 * snd_soc_remove_platform - Remove a platform from the ASoC core
3481 * @platform: the platform to remove
3483 void snd_soc_remove_platform(struct snd_soc_platform *platform)
3486 mutex_lock(&client_mutex);
3487 list_del(&platform->list);
3488 snd_soc_component_del_unlocked(&platform->component);
3489 mutex_unlock(&client_mutex);
3491 dev_dbg(platform->dev, "ASoC: Unregistered platform '%s'\n",
3492 platform->component.name);
3494 snd_soc_component_cleanup(&platform->component);
3496 EXPORT_SYMBOL_GPL(snd_soc_remove_platform);
3498 struct snd_soc_platform *snd_soc_lookup_platform(struct device *dev)
3500 struct snd_soc_platform *platform;
3502 mutex_lock(&client_mutex);
3503 list_for_each_entry(platform, &platform_list, list) {
3504 if (dev == platform->dev) {
3505 mutex_unlock(&client_mutex);