1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25#include <linux/module.h>
26#include <linux/moduleparam.h>
27#include <linux/init.h>
28#include <linux/delay.h>
29#include <linux/pm.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>
36#include <linux/of.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>
47
48#define CREATE_TRACE_POINTS
49#include <trace/events/asoc.h>
50
51#define NAME_SIZE 32
52
53#ifdef CONFIG_DEBUG_FS
54struct dentry *snd_soc_debugfs_root;
55EXPORT_SYMBOL_GPL(snd_soc_debugfs_root);
56#endif
57
58static DEFINE_MUTEX(client_mutex);
59static LIST_HEAD(platform_list);
60static LIST_HEAD(codec_list);
61static LIST_HEAD(component_list);
62
63
64
65
66
67
68static int pmdown_time = 5000;
69module_param(pmdown_time, int, 0);
70MODULE_PARM_DESC(pmdown_time, "DAPM stream powerdown time (msecs)");
71
72
73
74
75
76static const char * const dmi_blacklist[] = {
77 "To be filled by OEM",
78 "TBD by OEM",
79 "Default String",
80 "Board Manufacturer",
81 "Board Vendor Name",
82 "Board Product Name",
83 NULL,
84};
85
86
87
88static int min_bytes_needed(unsigned long val)
89{
90 int c = 0;
91 int i;
92
93 for (i = (sizeof val * 8) - 1; i >= 0; --i, ++c)
94 if (val & (1UL << i))
95 break;
96 c = (sizeof val * 8) - c;
97 if (!c || (c % 8))
98 c = (c + 8) / 8;
99 else
100 c /= 8;
101 return c;
102}
103
104
105
106static int format_register_str(struct snd_soc_codec *codec,
107 unsigned int reg, char *buf, size_t len)
108{
109 int wordsize = min_bytes_needed(codec->driver->reg_cache_size) * 2;
110 int regsize = codec->driver->reg_word_size * 2;
111 int ret;
112
113
114 if (wordsize + regsize + 2 + 1 != len)
115 return -EINVAL;
116
117 sprintf(buf, "%.*x: ", wordsize, reg);
118 buf += wordsize + 2;
119
120 ret = snd_soc_read(codec, reg);
121 if (ret < 0)
122 memset(buf, 'X', regsize);
123 else
124 sprintf(buf, "%.*x", regsize, ret);
125 buf[regsize] = '\n';
126
127 return 0;
128}
129
130
131static ssize_t soc_codec_reg_show(struct snd_soc_codec *codec, char *buf,
132 size_t count, loff_t pos)
133{
134 int i, step = 1;
135 int wordsize, regsize;
136 int len;
137 size_t total = 0;
138 loff_t p = 0;
139
140 wordsize = min_bytes_needed(codec->driver->reg_cache_size) * 2;
141 regsize = codec->driver->reg_word_size * 2;
142
143 len = wordsize + regsize + 2 + 1;
144
145 if (!codec->driver->reg_cache_size)
146 return 0;
147
148 if (codec->driver->reg_cache_step)
149 step = codec->driver->reg_cache_step;
150
151 for (i = 0; i < codec->driver->reg_cache_size; i += step) {
152
153
154 if (p >= pos) {
155 if (total + len >= count - 1)
156 break;
157 format_register_str(codec, i, buf + total, len);
158 total += len;
159 }
160 p += len;
161 }
162
163 total = min(total, count - 1);
164
165 return total;
166}
167
168static ssize_t codec_reg_show(struct device *dev,
169 struct device_attribute *attr, char *buf)
170{
171 struct snd_soc_pcm_runtime *rtd = dev_get_drvdata(dev);
172
173 return soc_codec_reg_show(rtd->codec, buf, PAGE_SIZE, 0);
174}
175
176static DEVICE_ATTR(codec_reg, 0444, codec_reg_show, NULL);
177
178static ssize_t pmdown_time_show(struct device *dev,
179 struct device_attribute *attr, char *buf)
180{
181 struct snd_soc_pcm_runtime *rtd = dev_get_drvdata(dev);
182
183 return sprintf(buf, "%ld\n", rtd->pmdown_time);
184}
185
186static ssize_t pmdown_time_set(struct device *dev,
187 struct device_attribute *attr,
188 const char *buf, size_t count)
189{
190 struct snd_soc_pcm_runtime *rtd = dev_get_drvdata(dev);
191 int ret;
192
193 ret = kstrtol(buf, 10, &rtd->pmdown_time);
194 if (ret)
195 return ret;
196
197 return count;
198}
199
200static DEVICE_ATTR(pmdown_time, 0644, pmdown_time_show, pmdown_time_set);
201
202static struct attribute *soc_dev_attrs[] = {
203 &dev_attr_codec_reg.attr,
204 &dev_attr_pmdown_time.attr,
205 NULL
206};
207
208static umode_t soc_dev_attr_is_visible(struct kobject *kobj,
209 struct attribute *attr, int idx)
210{
211 struct device *dev = kobj_to_dev(kobj);
212 struct snd_soc_pcm_runtime *rtd = dev_get_drvdata(dev);
213
214 if (attr == &dev_attr_pmdown_time.attr)
215 return attr->mode;
216 return rtd->codec ? attr->mode : 0;
217}
218
219static const struct attribute_group soc_dapm_dev_group = {
220 .attrs = soc_dapm_dev_attrs,
221 .is_visible = soc_dev_attr_is_visible,
222};
223
224static const struct attribute_group soc_dev_roup = {
225 .attrs = soc_dev_attrs,
226 .is_visible = soc_dev_attr_is_visible,
227};
228
229static const struct attribute_group *soc_dev_attr_groups[] = {
230 &soc_dapm_dev_group,
231 &soc_dev_roup,
232 NULL
233};
234
235#ifdef CONFIG_DEBUG_FS
236static ssize_t codec_reg_read_file(struct file *file, char __user *user_buf,
237 size_t count, loff_t *ppos)
238{
239 ssize_t ret;
240 struct snd_soc_codec *codec = file->private_data;
241 char *buf;
242
243 if (*ppos < 0 || !count)
244 return -EINVAL;
245
246 buf = kmalloc(count, GFP_KERNEL);
247 if (!buf)
248 return -ENOMEM;
249
250 ret = soc_codec_reg_show(codec, buf, count, *ppos);
251 if (ret >= 0) {
252 if (copy_to_user(user_buf, buf, ret)) {
253 kfree(buf);
254 return -EFAULT;
255 }
256 *ppos += ret;
257 }
258
259 kfree(buf);
260 return ret;
261}
262
263static ssize_t codec_reg_write_file(struct file *file,
264 const char __user *user_buf, size_t count, loff_t *ppos)
265{
266 char buf[32];
267 size_t buf_size;
268 char *start = buf;
269 unsigned long reg, value;
270 struct snd_soc_codec *codec = file->private_data;
271 int ret;
272
273 buf_size = min(count, (sizeof(buf)-1));
274 if (copy_from_user(buf, user_buf, buf_size))
275 return -EFAULT;
276 buf[buf_size] = 0;
277
278 while (*start == ' ')
279 start++;
280 reg = simple_strtoul(start, &start, 16);
281 while (*start == ' ')
282 start++;
283 ret = kstrtoul(start, 16, &value);
284 if (ret)
285 return ret;
286
287
288 add_taint(TAINT_USER, LOCKDEP_NOW_UNRELIABLE);
289
290 snd_soc_write(codec, reg, value);
291 return buf_size;
292}
293
294static const struct file_operations codec_reg_fops = {
295 .open = simple_open,
296 .read = codec_reg_read_file,
297 .write = codec_reg_write_file,
298 .llseek = default_llseek,
299};
300
301static void soc_init_component_debugfs(struct snd_soc_component *component)
302{
303 if (!component->card->debugfs_card_root)
304 return;
305
306 if (component->debugfs_prefix) {
307 char *name;
308
309 name = kasprintf(GFP_KERNEL, "%s:%s",
310 component->debugfs_prefix, component->name);
311 if (name) {
312 component->debugfs_root = debugfs_create_dir(name,
313 component->card->debugfs_card_root);
314 kfree(name);
315 }
316 } else {
317 component->debugfs_root = debugfs_create_dir(component->name,
318 component->card->debugfs_card_root);
319 }
320
321 if (!component->debugfs_root) {
322 dev_warn(component->dev,
323 "ASoC: Failed to create component debugfs directory\n");
324 return;
325 }
326
327 snd_soc_dapm_debugfs_init(snd_soc_component_get_dapm(component),
328 component->debugfs_root);
329
330 if (component->init_debugfs)
331 component->init_debugfs(component);
332}
333
334static void soc_cleanup_component_debugfs(struct snd_soc_component *component)
335{
336 debugfs_remove_recursive(component->debugfs_root);
337}
338
339static void soc_init_codec_debugfs(struct snd_soc_component *component)
340{
341 struct snd_soc_codec *codec = snd_soc_component_to_codec(component);
342 struct dentry *debugfs_reg;
343
344 debugfs_reg = debugfs_create_file("codec_reg", 0644,
345 codec->component.debugfs_root,
346 codec, &codec_reg_fops);
347 if (!debugfs_reg)
348 dev_warn(codec->dev,
349 "ASoC: Failed to create codec register debugfs file\n");
350}
351
352static ssize_t codec_list_read_file(struct file *file, char __user *user_buf,
353 size_t count, loff_t *ppos)
354{
355 char *buf = kmalloc(PAGE_SIZE, GFP_KERNEL);
356 ssize_t len, ret = 0;
357 struct snd_soc_codec *codec;
358
359 if (!buf)
360 return -ENOMEM;
361
362 mutex_lock(&client_mutex);
363
364 list_for_each_entry(codec, &codec_list, list) {
365 len = snprintf(buf + ret, PAGE_SIZE - ret, "%s\n",
366 codec->component.name);
367 if (len >= 0)
368 ret += len;
369 if (ret > PAGE_SIZE) {
370 ret = PAGE_SIZE;
371 break;
372 }
373 }
374
375 mutex_unlock(&client_mutex);
376
377 if (ret >= 0)
378 ret = simple_read_from_buffer(user_buf, count, ppos, buf, ret);
379
380 kfree(buf);
381
382 return ret;
383}
384
385static const struct file_operations codec_list_fops = {
386 .read = codec_list_read_file,
387 .llseek = default_llseek,
388};
389
390static ssize_t dai_list_read_file(struct file *file, char __user *user_buf,
391 size_t count, loff_t *ppos)
392{
393 char *buf = kmalloc(PAGE_SIZE, GFP_KERNEL);
394 ssize_t len, ret = 0;
395 struct snd_soc_component *component;
396 struct snd_soc_dai *dai;
397
398 if (!buf)
399 return -ENOMEM;
400
401 mutex_lock(&client_mutex);
402
403 list_for_each_entry(component, &component_list, list) {
404 list_for_each_entry(dai, &component->dai_list, list) {
405 len = snprintf(buf + ret, PAGE_SIZE - ret, "%s\n",
406 dai->name);
407 if (len >= 0)
408 ret += len;
409 if (ret > PAGE_SIZE) {
410 ret = PAGE_SIZE;
411 break;
412 }
413 }
414 }
415
416 mutex_unlock(&client_mutex);
417
418 ret = simple_read_from_buffer(user_buf, count, ppos, buf, ret);
419
420 kfree(buf);
421
422 return ret;
423}
424
425static const struct file_operations dai_list_fops = {
426 .read = dai_list_read_file,
427 .llseek = default_llseek,
428};
429
430static ssize_t platform_list_read_file(struct file *file,
431 char __user *user_buf,
432 size_t count, loff_t *ppos)
433{
434 char *buf = kmalloc(PAGE_SIZE, GFP_KERNEL);
435 ssize_t len, ret = 0;
436 struct snd_soc_platform *platform;
437
438 if (!buf)
439 return -ENOMEM;
440
441 mutex_lock(&client_mutex);
442
443 list_for_each_entry(platform, &platform_list, list) {
444 len = snprintf(buf + ret, PAGE_SIZE - ret, "%s\n",
445 platform->component.name);
446 if (len >= 0)
447 ret += len;
448 if (ret > PAGE_SIZE) {
449 ret = PAGE_SIZE;
450 break;
451 }
452 }
453
454 mutex_unlock(&client_mutex);
455
456 ret = simple_read_from_buffer(user_buf, count, ppos, buf, ret);
457
458 kfree(buf);
459
460 return ret;
461}
462
463static const struct file_operations platform_list_fops = {
464 .read = platform_list_read_file,
465 .llseek = default_llseek,
466};
467
468static void soc_init_card_debugfs(struct snd_soc_card *card)
469{
470 if (!snd_soc_debugfs_root)
471 return;
472
473 card->debugfs_card_root = debugfs_create_dir(card->name,
474 snd_soc_debugfs_root);
475 if (!card->debugfs_card_root) {
476 dev_warn(card->dev,
477 "ASoC: Failed to create card debugfs directory\n");
478 return;
479 }
480
481 card->debugfs_pop_time = debugfs_create_u32("dapm_pop_time", 0644,
482 card->debugfs_card_root,
483 &card->pop_time);
484 if (!card->debugfs_pop_time)
485 dev_warn(card->dev,
486 "ASoC: Failed to create pop time debugfs file\n");
487}
488
489static void soc_cleanup_card_debugfs(struct snd_soc_card *card)
490{
491 debugfs_remove_recursive(card->debugfs_card_root);
492}
493
494
495static void snd_soc_debugfs_init(void)
496{
497 snd_soc_debugfs_root = debugfs_create_dir("asoc", NULL);
498 if (IS_ERR_OR_NULL(snd_soc_debugfs_root)) {
499 pr_warn("ASoC: Failed to create debugfs directory\n");
500 snd_soc_debugfs_root = NULL;
501 return;
502 }
503
504 if (!debugfs_create_file("codecs", 0444, snd_soc_debugfs_root, NULL,
505 &codec_list_fops))
506 pr_warn("ASoC: Failed to create CODEC list debugfs file\n");
507
508 if (!debugfs_create_file("dais", 0444, snd_soc_debugfs_root, NULL,
509 &dai_list_fops))
510 pr_warn("ASoC: Failed to create DAI list debugfs file\n");
511
512 if (!debugfs_create_file("platforms", 0444, snd_soc_debugfs_root, NULL,
513 &platform_list_fops))
514 pr_warn("ASoC: Failed to create platform list debugfs file\n");
515}
516
517static void snd_soc_debugfs_exit(void)
518{
519 debugfs_remove_recursive(snd_soc_debugfs_root);
520}
521
522#else
523
524#define soc_init_codec_debugfs NULL
525
526static inline void soc_init_component_debugfs(
527 struct snd_soc_component *component)
528{
529}
530
531static inline void soc_cleanup_component_debugfs(
532 struct snd_soc_component *component)
533{
534}
535
536static inline void soc_init_card_debugfs(struct snd_soc_card *card)
537{
538}
539
540static inline void soc_cleanup_card_debugfs(struct snd_soc_card *card)
541{
542}
543
544static inline void snd_soc_debugfs_init(void)
545{
546}
547
548static inline void snd_soc_debugfs_exit(void)
549{
550}
551
552#endif
553
554static int snd_soc_rtdcom_add(struct snd_soc_pcm_runtime *rtd,
555 struct snd_soc_component *component)
556{
557 struct snd_soc_rtdcom_list *rtdcom;
558 struct snd_soc_rtdcom_list *new_rtdcom;
559
560 for_each_rtdcom(rtd, rtdcom) {
561
562 if (rtdcom->component == component)
563 return 0;
564 }
565
566 new_rtdcom = kmalloc(sizeof(*new_rtdcom), GFP_KERNEL);
567 if (!new_rtdcom)
568 return -ENOMEM;
569
570 new_rtdcom->component = component;
571 INIT_LIST_HEAD(&new_rtdcom->list);
572
573 list_add_tail(&new_rtdcom->list, &rtd->component_list);
574
575 return 0;
576}
577
578static void snd_soc_rtdcom_del_all(struct snd_soc_pcm_runtime *rtd)
579{
580 struct snd_soc_rtdcom_list *rtdcom1, *rtdcom2;
581
582 for_each_rtdcom_safe(rtd, rtdcom1, rtdcom2)
583 kfree(rtdcom1);
584
585 INIT_LIST_HEAD(&rtd->component_list);
586}
587
588struct snd_soc_component *snd_soc_rtdcom_lookup(struct snd_soc_pcm_runtime *rtd,
589 const char *driver_name)
590{
591 struct snd_soc_rtdcom_list *rtdcom;
592
593 for_each_rtdcom(rtd, rtdcom) {
594 if ((rtdcom->component->driver->name == driver_name) ||
595 strcmp(rtdcom->component->driver->name, driver_name) == 0)
596 return rtdcom->component;
597 }
598
599 return NULL;
600}
601
602struct snd_pcm_substream *snd_soc_get_dai_substream(struct snd_soc_card *card,
603 const char *dai_link, int stream)
604{
605 struct snd_soc_pcm_runtime *rtd;
606
607 list_for_each_entry(rtd, &card->rtd_list, list) {
608 if (rtd->dai_link->no_pcm &&
609 !strcmp(rtd->dai_link->name, dai_link))
610 return rtd->pcm->streams[stream].substream;
611 }
612 dev_dbg(card->dev, "ASoC: failed to find dai link %s\n", dai_link);
613 return NULL;
614}
615EXPORT_SYMBOL_GPL(snd_soc_get_dai_substream);
616
617static struct snd_soc_pcm_runtime *soc_new_pcm_runtime(
618 struct snd_soc_card *card, struct snd_soc_dai_link *dai_link)
619{
620 struct snd_soc_pcm_runtime *rtd;
621
622 rtd = kzalloc(sizeof(struct snd_soc_pcm_runtime), GFP_KERNEL);
623 if (!rtd)
624 return NULL;
625
626 INIT_LIST_HEAD(&rtd->component_list);
627 rtd->card = card;
628 rtd->dai_link = dai_link;
629 rtd->codec_dais = kzalloc(sizeof(struct snd_soc_dai *) *
630 dai_link->num_codecs,
631 GFP_KERNEL);
632 if (!rtd->codec_dais) {
633 kfree(rtd);
634 return NULL;
635 }
636
637 return rtd;
638}
639
640static void soc_free_pcm_runtime(struct snd_soc_pcm_runtime *rtd)
641{
642 if (rtd && rtd->codec_dais)
643 kfree(rtd->codec_dais);
644 snd_soc_rtdcom_del_all(rtd);
645 kfree(rtd);
646}
647
648static void soc_add_pcm_runtime(struct snd_soc_card *card,
649 struct snd_soc_pcm_runtime *rtd)
650{
651 list_add_tail(&rtd->list, &card->rtd_list);
652 rtd->num = card->num_rtd;
653 card->num_rtd++;
654}
655
656static void soc_remove_pcm_runtimes(struct snd_soc_card *card)
657{
658 struct snd_soc_pcm_runtime *rtd, *_rtd;
659
660 list_for_each_entry_safe(rtd, _rtd, &card->rtd_list, list) {
661 list_del(&rtd->list);
662 soc_free_pcm_runtime(rtd);
663 }
664
665 card->num_rtd = 0;
666}
667
668struct snd_soc_pcm_runtime *snd_soc_get_pcm_runtime(struct snd_soc_card *card,
669 const char *dai_link)
670{
671 struct snd_soc_pcm_runtime *rtd;
672
673 list_for_each_entry(rtd, &card->rtd_list, list) {
674 if (!strcmp(rtd->dai_link->name, dai_link))
675 return rtd;
676 }
677 dev_dbg(card->dev, "ASoC: failed to find rtd %s\n", dai_link);
678 return NULL;
679}
680EXPORT_SYMBOL_GPL(snd_soc_get_pcm_runtime);
681
682static void codec2codec_close_delayed_work(struct work_struct *work)
683{
684
685
686
687
688
689}
690
691#ifdef CONFIG_PM_SLEEP
692
693int snd_soc_suspend(struct device *dev)
694{
695 struct snd_soc_card *card = dev_get_drvdata(dev);
696 struct snd_soc_component *component;
697 struct snd_soc_pcm_runtime *rtd;
698 int i;
699
700
701 if (!card->instantiated)
702 return 0;
703
704
705
706
707 snd_power_wait(card->snd_card, SNDRV_CTL_POWER_D0);
708
709
710 snd_power_change_state(card->snd_card, SNDRV_CTL_POWER_D3hot);
711
712
713 list_for_each_entry(rtd, &card->rtd_list, list) {
714
715 if (rtd->dai_link->ignore_suspend)
716 continue;
717
718 for (i = 0; i < rtd->num_codecs; i++) {
719 struct snd_soc_dai *dai = rtd->codec_dais[i];
720 struct snd_soc_dai_driver *drv = dai->driver;
721
722 if (drv->ops->digital_mute && dai->playback_active)
723 drv->ops->digital_mute(dai, 1);
724 }
725 }
726
727
728 list_for_each_entry(rtd, &card->rtd_list, list) {
729 if (rtd->dai_link->ignore_suspend)
730 continue;
731
732 snd_pcm_suspend_all(rtd->pcm);
733 }
734
735 if (card->suspend_pre)
736 card->suspend_pre(card);
737
738 list_for_each_entry(rtd, &card->rtd_list, list) {
739 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
740
741 if (rtd->dai_link->ignore_suspend)
742 continue;
743
744 if (cpu_dai->driver->suspend && !cpu_dai->driver->bus_control)
745 cpu_dai->driver->suspend(cpu_dai);
746 }
747
748
749 list_for_each_entry(rtd, &card->rtd_list, list)
750 flush_delayed_work(&rtd->delayed_work);
751
752 list_for_each_entry(rtd, &card->rtd_list, list) {
753
754 if (rtd->dai_link->ignore_suspend)
755 continue;
756
757 snd_soc_dapm_stream_event(rtd,
758 SNDRV_PCM_STREAM_PLAYBACK,
759 SND_SOC_DAPM_STREAM_SUSPEND);
760
761 snd_soc_dapm_stream_event(rtd,
762 SNDRV_PCM_STREAM_CAPTURE,
763 SND_SOC_DAPM_STREAM_SUSPEND);
764 }
765
766
767 dapm_mark_endpoints_dirty(card);
768 snd_soc_dapm_sync(&card->dapm);
769
770
771 list_for_each_entry(component, &card->component_dev_list, card_list) {
772 struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component);
773
774
775
776 if (!component->suspended) {
777 switch (snd_soc_dapm_get_bias_level(dapm)) {
778 case SND_SOC_BIAS_STANDBY:
779
780
781
782
783
784
785 if (dapm->idle_bias_off) {
786 dev_dbg(component->dev,
787 "ASoC: idle_bias_off CODEC on over suspend\n");
788 break;
789 }
790
791 case SND_SOC_BIAS_OFF:
792 if (component->suspend)
793 component->suspend(component);
794 component->suspended = 1;
795 if (component->regmap)
796 regcache_mark_dirty(component->regmap);
797
798 pinctrl_pm_select_sleep_state(component->dev);
799 break;
800 default:
801 dev_dbg(component->dev,
802 "ASoC: COMPONENT is on over suspend\n");
803 break;
804 }
805 }
806 }
807
808 list_for_each_entry(rtd, &card->rtd_list, list) {
809 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
810
811 if (rtd->dai_link->ignore_suspend)
812 continue;
813
814 if (cpu_dai->driver->suspend && cpu_dai->driver->bus_control)
815 cpu_dai->driver->suspend(cpu_dai);
816
817
818 pinctrl_pm_select_sleep_state(cpu_dai->dev);
819 }
820
821 if (card->suspend_post)
822 card->suspend_post(card);
823
824 return 0;
825}
826EXPORT_SYMBOL_GPL(snd_soc_suspend);
827
828
829
830
831static void soc_resume_deferred(struct work_struct *work)
832{
833 struct snd_soc_card *card =
834 container_of(work, struct snd_soc_card, deferred_resume_work);
835 struct snd_soc_pcm_runtime *rtd;
836 struct snd_soc_component *component;
837 int i;
838
839
840
841
842
843 dev_dbg(card->dev, "ASoC: starting resume work\n");
844
845
846 snd_power_change_state(card->snd_card, SNDRV_CTL_POWER_D2);
847
848 if (card->resume_pre)
849 card->resume_pre(card);
850
851
852 list_for_each_entry(rtd, &card->rtd_list, list) {
853 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
854
855 if (rtd->dai_link->ignore_suspend)
856 continue;
857
858 if (cpu_dai->driver->resume && cpu_dai->driver->bus_control)
859 cpu_dai->driver->resume(cpu_dai);
860 }
861
862 list_for_each_entry(component, &card->component_dev_list, card_list) {
863 if (component->suspended) {
864 if (component->resume)
865 component->resume(component);
866 component->suspended = 0;
867 }
868 }
869
870 list_for_each_entry(rtd, &card->rtd_list, list) {
871
872 if (rtd->dai_link->ignore_suspend)
873 continue;
874
875 snd_soc_dapm_stream_event(rtd,
876 SNDRV_PCM_STREAM_PLAYBACK,
877 SND_SOC_DAPM_STREAM_RESUME);
878
879 snd_soc_dapm_stream_event(rtd,
880 SNDRV_PCM_STREAM_CAPTURE,
881 SND_SOC_DAPM_STREAM_RESUME);
882 }
883
884
885 list_for_each_entry(rtd, &card->rtd_list, list) {
886
887 if (rtd->dai_link->ignore_suspend)
888 continue;
889
890 for (i = 0; i < rtd->num_codecs; i++) {
891 struct snd_soc_dai *dai = rtd->codec_dais[i];
892 struct snd_soc_dai_driver *drv = dai->driver;
893
894 if (drv->ops->digital_mute && dai->playback_active)
895 drv->ops->digital_mute(dai, 0);
896 }
897 }
898
899 list_for_each_entry(rtd, &card->rtd_list, list) {
900 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
901
902 if (rtd->dai_link->ignore_suspend)
903 continue;
904
905 if (cpu_dai->driver->resume && !cpu_dai->driver->bus_control)
906 cpu_dai->driver->resume(cpu_dai);
907 }
908
909 if (card->resume_post)
910 card->resume_post(card);
911
912 dev_dbg(card->dev, "ASoC: resume work completed\n");
913
914
915 dapm_mark_endpoints_dirty(card);
916 snd_soc_dapm_sync(&card->dapm);
917
918
919 snd_power_change_state(card->snd_card, SNDRV_CTL_POWER_D0);
920}
921
922
923int snd_soc_resume(struct device *dev)
924{
925 struct snd_soc_card *card = dev_get_drvdata(dev);
926 bool bus_control = false;
927 struct snd_soc_pcm_runtime *rtd;
928
929
930 if (!card->instantiated)
931 return 0;
932
933
934 list_for_each_entry(rtd, &card->rtd_list, list) {
935 struct snd_soc_dai **codec_dais = rtd->codec_dais;
936 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
937 int j;
938
939 if (cpu_dai->active)
940 pinctrl_pm_select_default_state(cpu_dai->dev);
941
942 for (j = 0; j < rtd->num_codecs; j++) {
943 struct snd_soc_dai *codec_dai = codec_dais[j];
944 if (codec_dai->active)
945 pinctrl_pm_select_default_state(codec_dai->dev);
946 }
947 }
948
949
950
951
952
953
954
955 list_for_each_entry(rtd, &card->rtd_list, list) {
956 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
957 bus_control |= cpu_dai->driver->bus_control;
958 }
959 if (bus_control) {
960 dev_dbg(dev, "ASoC: Resuming control bus master immediately\n");
961 soc_resume_deferred(&card->deferred_resume_work);
962 } else {
963 dev_dbg(dev, "ASoC: Scheduling resume work\n");
964 if (!schedule_work(&card->deferred_resume_work))
965 dev_err(dev, "ASoC: resume work item may be lost\n");
966 }
967
968 return 0;
969}
970EXPORT_SYMBOL_GPL(snd_soc_resume);
971#else
972#define snd_soc_suspend NULL
973#define snd_soc_resume NULL
974#endif
975
976static const struct snd_soc_dai_ops null_dai_ops = {
977};
978
979static struct snd_soc_component *soc_find_component(
980 const struct device_node *of_node, const char *name)
981{
982 struct snd_soc_component *component;
983
984 lockdep_assert_held(&client_mutex);
985
986 list_for_each_entry(component, &component_list, list) {
987 if (of_node) {
988 if (component->dev->of_node == of_node)
989 return component;
990 } else if (strcmp(component->name, name) == 0) {
991 return component;
992 }
993 }
994
995 return NULL;
996}
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009struct snd_soc_dai *snd_soc_find_dai(
1010 const struct snd_soc_dai_link_component *dlc)
1011{
1012 struct snd_soc_component *component;
1013 struct snd_soc_dai *dai;
1014 struct device_node *component_of_node;
1015
1016 lockdep_assert_held(&client_mutex);
1017
1018
1019 list_for_each_entry(component, &component_list, list) {
1020 component_of_node = component->dev->of_node;
1021 if (!component_of_node && component->dev->parent)
1022 component_of_node = component->dev->parent->of_node;
1023
1024 if (dlc->of_node && component_of_node != dlc->of_node)
1025 continue;
1026 if (dlc->name && strcmp(component->name, dlc->name))
1027 continue;
1028 list_for_each_entry(dai, &component->dai_list, list) {
1029 if (dlc->dai_name && strcmp(dai->name, dlc->dai_name)
1030 && (!dai->driver->name
1031 || strcmp(dai->driver->name, dlc->dai_name)))
1032 continue;
1033
1034 return dai;
1035 }
1036 }
1037
1038 return NULL;
1039}
1040EXPORT_SYMBOL_GPL(snd_soc_find_dai);
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058struct snd_soc_dai_link *snd_soc_find_dai_link(struct snd_soc_card *card,
1059 int id, const char *name,
1060 const char *stream_name)
1061{
1062 struct snd_soc_dai_link *link, *_link;
1063
1064 lockdep_assert_held(&client_mutex);
1065
1066 list_for_each_entry_safe(link, _link, &card->dai_link_list, list) {
1067 if (link->id != id)
1068 continue;
1069
1070 if (name && (!link->name || strcmp(name, link->name)))
1071 continue;
1072
1073 if (stream_name && (!link->stream_name
1074 || strcmp(stream_name, link->stream_name)))
1075 continue;
1076
1077 return link;
1078 }
1079
1080 return NULL;
1081}
1082EXPORT_SYMBOL_GPL(snd_soc_find_dai_link);
1083
1084static bool soc_is_dai_link_bound(struct snd_soc_card *card,
1085 struct snd_soc_dai_link *dai_link)
1086{
1087 struct snd_soc_pcm_runtime *rtd;
1088
1089 list_for_each_entry(rtd, &card->rtd_list, list) {
1090 if (rtd->dai_link == dai_link)
1091 return true;
1092 }
1093
1094 return false;
1095}
1096
1097static int soc_bind_dai_link(struct snd_soc_card *card,
1098 struct snd_soc_dai_link *dai_link)
1099{
1100 struct snd_soc_pcm_runtime *rtd;
1101 struct snd_soc_dai_link_component *codecs = dai_link->codecs;
1102 struct snd_soc_dai_link_component cpu_dai_component;
1103 struct snd_soc_component *component;
1104 struct snd_soc_dai **codec_dais;
1105 struct snd_soc_platform *platform;
1106 struct device_node *platform_of_node;
1107 const char *platform_name;
1108 int i;
1109
1110 dev_dbg(card->dev, "ASoC: binding %s\n", dai_link->name);
1111
1112 if (soc_is_dai_link_bound(card, dai_link)) {
1113 dev_dbg(card->dev, "ASoC: dai link %s already bound\n",
1114 dai_link->name);
1115 return 0;
1116 }
1117
1118 rtd = soc_new_pcm_runtime(card, dai_link);
1119 if (!rtd)
1120 return -ENOMEM;
1121
1122 cpu_dai_component.name = dai_link->cpu_name;
1123 cpu_dai_component.of_node = dai_link->cpu_of_node;
1124 cpu_dai_component.dai_name = dai_link->cpu_dai_name;
1125 rtd->cpu_dai = snd_soc_find_dai(&cpu_dai_component);
1126 if (!rtd->cpu_dai) {
1127 dev_err(card->dev, "ASoC: CPU DAI %s not registered\n",
1128 dai_link->cpu_dai_name);
1129 goto _err_defer;
1130 }
1131 snd_soc_rtdcom_add(rtd, rtd->cpu_dai->component);
1132
1133 rtd->num_codecs = dai_link->num_codecs;
1134
1135
1136 codec_dais = rtd->codec_dais;
1137 for (i = 0; i < rtd->num_codecs; i++) {
1138 codec_dais[i] = snd_soc_find_dai(&codecs[i]);
1139 if (!codec_dais[i]) {
1140 dev_err(card->dev, "ASoC: CODEC DAI %s not registered\n",
1141 codecs[i].dai_name);
1142 goto _err_defer;
1143 }
1144 snd_soc_rtdcom_add(rtd, codec_dais[i]->component);
1145 }
1146
1147
1148 rtd->codec_dai = codec_dais[0];
1149 rtd->codec = rtd->codec_dai->codec;
1150
1151
1152 platform_name = dai_link->platform_name;
1153 if (!platform_name && !dai_link->platform_of_node)
1154 platform_name = "snd-soc-dummy";
1155
1156
1157 list_for_each_entry(component, &component_list, list) {
1158 platform_of_node = component->dev->of_node;
1159 if (!platform_of_node && component->dev->parent->of_node)
1160 platform_of_node = component->dev->parent->of_node;
1161
1162 if (dai_link->platform_of_node) {
1163 if (platform_of_node != dai_link->platform_of_node)
1164 continue;
1165 } else {
1166 if (strcmp(component->name, platform_name))
1167 continue;
1168 }
1169
1170 snd_soc_rtdcom_add(rtd, component);
1171 }
1172
1173
1174 list_for_each_entry(platform, &platform_list, list) {
1175 platform_of_node = platform->dev->of_node;
1176 if (!platform_of_node && platform->dev->parent->of_node)
1177 platform_of_node = platform->dev->parent->of_node;
1178
1179 if (dai_link->platform_of_node) {
1180 if (platform_of_node != dai_link->platform_of_node)
1181 continue;
1182 } else {
1183 if (strcmp(platform->component.name, platform_name))
1184 continue;
1185 }
1186
1187 rtd->platform = platform;
1188 }
1189 if (!rtd->platform) {
1190 dev_err(card->dev, "ASoC: platform %s not registered\n",
1191 dai_link->platform_name);
1192 goto _err_defer;
1193 }
1194
1195 soc_add_pcm_runtime(card, rtd);
1196 return 0;
1197
1198_err_defer:
1199 soc_free_pcm_runtime(rtd);
1200 return -EPROBE_DEFER;
1201}
1202
1203static void soc_remove_component(struct snd_soc_component *component)
1204{
1205 if (!component->card)
1206 return;
1207
1208 list_del(&component->card_list);
1209
1210 if (component->remove)
1211 component->remove(component);
1212
1213 snd_soc_dapm_free(snd_soc_component_get_dapm(component));
1214
1215 soc_cleanup_component_debugfs(component);
1216 component->card = NULL;
1217 module_put(component->dev->driver->owner);
1218}
1219
1220static void soc_remove_dai(struct snd_soc_dai *dai, int order)
1221{
1222 int err;
1223
1224 if (dai && dai->probed &&
1225 dai->driver->remove_order == order) {
1226 if (dai->driver->remove) {
1227 err = dai->driver->remove(dai);
1228 if (err < 0)
1229 dev_err(dai->dev,
1230 "ASoC: failed to remove %s: %d\n",
1231 dai->name, err);
1232 }
1233 dai->probed = 0;
1234 }
1235}
1236
1237static void soc_remove_link_dais(struct snd_soc_card *card,
1238 struct snd_soc_pcm_runtime *rtd, int order)
1239{
1240 int i;
1241
1242
1243 if (rtd->dev_registered) {
1244 device_unregister(rtd->dev);
1245 rtd->dev_registered = 0;
1246 }
1247
1248
1249 for (i = 0; i < rtd->num_codecs; i++)
1250 soc_remove_dai(rtd->codec_dais[i], order);
1251
1252 soc_remove_dai(rtd->cpu_dai, order);
1253}
1254
1255static void soc_remove_link_components(struct snd_soc_card *card,
1256 struct snd_soc_pcm_runtime *rtd, int order)
1257{
1258 struct snd_soc_component *component;
1259 struct snd_soc_rtdcom_list *rtdcom;
1260
1261 for_each_rtdcom(rtd, rtdcom) {
1262 component = rtdcom->component;
1263
1264 if (component->driver->remove_order == order)
1265 soc_remove_component(component);
1266 }
1267}
1268
1269static void soc_remove_dai_links(struct snd_soc_card *card)
1270{
1271 int order;
1272 struct snd_soc_pcm_runtime *rtd;
1273 struct snd_soc_dai_link *link, *_link;
1274
1275 for (order = SND_SOC_COMP_ORDER_FIRST; order <= SND_SOC_COMP_ORDER_LAST;
1276 order++) {
1277 list_for_each_entry(rtd, &card->rtd_list, list)
1278 soc_remove_link_dais(card, rtd, order);
1279 }
1280
1281 for (order = SND_SOC_COMP_ORDER_FIRST; order <= SND_SOC_COMP_ORDER_LAST;
1282 order++) {
1283 list_for_each_entry(rtd, &card->rtd_list, list)
1284 soc_remove_link_components(card, rtd, order);
1285 }
1286
1287 list_for_each_entry_safe(link, _link, &card->dai_link_list, list) {
1288 if (link->dobj.type == SND_SOC_DOBJ_DAI_LINK)
1289 dev_warn(card->dev, "Topology forgot to remove link %s?\n",
1290 link->name);
1291
1292 list_del(&link->list);
1293 card->num_dai_links--;
1294 }
1295}
1296
1297static int snd_soc_init_multicodec(struct snd_soc_card *card,
1298 struct snd_soc_dai_link *dai_link)
1299{
1300
1301 if (dai_link->codec_name || dai_link->codec_of_node ||
1302 dai_link->codec_dai_name) {
1303 dai_link->num_codecs = 1;
1304
1305 dai_link->codecs = devm_kzalloc(card->dev,
1306 sizeof(struct snd_soc_dai_link_component),
1307 GFP_KERNEL);
1308 if (!dai_link->codecs)
1309 return -ENOMEM;
1310
1311 dai_link->codecs[0].name = dai_link->codec_name;
1312 dai_link->codecs[0].of_node = dai_link->codec_of_node;
1313 dai_link->codecs[0].dai_name = dai_link->codec_dai_name;
1314 }
1315
1316 if (!dai_link->codecs) {
1317 dev_err(card->dev, "ASoC: DAI link has no CODECs\n");
1318 return -EINVAL;
1319 }
1320
1321 return 0;
1322}
1323
1324static int soc_init_dai_link(struct snd_soc_card *card,
1325 struct snd_soc_dai_link *link)
1326{
1327 int i, ret;
1328
1329 ret = snd_soc_init_multicodec(card, link);
1330 if (ret) {
1331 dev_err(card->dev, "ASoC: failed to init multicodec\n");
1332 return ret;
1333 }
1334
1335 for (i = 0; i < link->num_codecs; i++) {
1336
1337
1338
1339
1340 if (!!link->codecs[i].name ==
1341 !!link->codecs[i].of_node) {
1342 dev_err(card->dev, "ASoC: Neither/both codec name/of_node are set for %s\n",
1343 link->name);
1344 return -EINVAL;
1345 }
1346
1347 if (!link->codecs[i].dai_name) {
1348 dev_err(card->dev, "ASoC: codec_dai_name not set for %s\n",
1349 link->name);
1350 return -EINVAL;
1351 }
1352 }
1353
1354
1355
1356
1357
1358 if (link->platform_name && link->platform_of_node) {
1359 dev_err(card->dev,
1360 "ASoC: Both platform name/of_node are set for %s\n",
1361 link->name);
1362 return -EINVAL;
1363 }
1364
1365
1366
1367
1368
1369
1370 if (link->cpu_name && link->cpu_of_node) {
1371 dev_err(card->dev,
1372 "ASoC: Neither/both cpu name/of_node are set for %s\n",
1373 link->name);
1374 return -EINVAL;
1375 }
1376
1377
1378
1379
1380 if (!link->cpu_dai_name &&
1381 !(link->cpu_name || link->cpu_of_node)) {
1382 dev_err(card->dev,
1383 "ASoC: Neither cpu_dai_name nor cpu_name/of_node are set for %s\n",
1384 link->name);
1385 return -EINVAL;
1386 }
1387
1388 return 0;
1389}
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402int snd_soc_add_dai_link(struct snd_soc_card *card,
1403 struct snd_soc_dai_link *dai_link)
1404{
1405 if (dai_link->dobj.type
1406 && dai_link->dobj.type != SND_SOC_DOBJ_DAI_LINK) {
1407 dev_err(card->dev, "Invalid dai link type %d\n",
1408 dai_link->dobj.type);
1409 return -EINVAL;
1410 }
1411
1412 lockdep_assert_held(&client_mutex);
1413
1414
1415
1416 if (dai_link->dobj.type && card->add_dai_link)
1417 card->add_dai_link(card, dai_link);
1418
1419 list_add_tail(&dai_link->list, &card->dai_link_list);
1420 card->num_dai_links++;
1421
1422 return 0;
1423}
1424EXPORT_SYMBOL_GPL(snd_soc_add_dai_link);
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436void snd_soc_remove_dai_link(struct snd_soc_card *card,
1437 struct snd_soc_dai_link *dai_link)
1438{
1439 struct snd_soc_dai_link *link, *_link;
1440
1441 if (dai_link->dobj.type
1442 && dai_link->dobj.type != SND_SOC_DOBJ_DAI_LINK) {
1443 dev_err(card->dev, "Invalid dai link type %d\n",
1444 dai_link->dobj.type);
1445 return;
1446 }
1447
1448 lockdep_assert_held(&client_mutex);
1449
1450
1451
1452 if (dai_link->dobj.type && card->remove_dai_link)
1453 card->remove_dai_link(card, dai_link);
1454
1455 list_for_each_entry_safe(link, _link, &card->dai_link_list, list) {
1456 if (link == dai_link) {
1457 list_del(&link->list);
1458 card->num_dai_links--;
1459 return;
1460 }
1461 }
1462}
1463EXPORT_SYMBOL_GPL(snd_soc_remove_dai_link);
1464
1465static void soc_set_name_prefix(struct snd_soc_card *card,
1466 struct snd_soc_component *component)
1467{
1468 int i;
1469
1470 if (card->codec_conf == NULL)
1471 return;
1472
1473 for (i = 0; i < card->num_configs; i++) {
1474 struct snd_soc_codec_conf *map = &card->codec_conf[i];
1475 if (map->of_node && component->dev->of_node != map->of_node)
1476 continue;
1477 if (map->dev_name && strcmp(component->name, map->dev_name))
1478 continue;
1479 component->name_prefix = map->name_prefix;
1480 break;
1481 }
1482}
1483
1484static int soc_probe_component(struct snd_soc_card *card,
1485 struct snd_soc_component *component)
1486{
1487 struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component);
1488 struct snd_soc_dai *dai;
1489 int ret;
1490
1491 if (!strcmp(component->name, "snd-soc-dummy"))
1492 return 0;
1493
1494 if (component->card) {
1495 if (component->card != card) {
1496 dev_err(component->dev,
1497 "Trying to bind component to card \"%s\" but is already bound to card \"%s\"\n",
1498 card->name, component->card->name);
1499 return -ENODEV;
1500 }
1501 return 0;
1502 }
1503
1504 if (!try_module_get(component->dev->driver->owner))
1505 return -ENODEV;
1506
1507 component->card = card;
1508 dapm->card = card;
1509 soc_set_name_prefix(card, component);
1510
1511 soc_init_component_debugfs(component);
1512
1513 if (component->driver->dapm_widgets) {
1514 ret = snd_soc_dapm_new_controls(dapm,
1515 component->driver->dapm_widgets,
1516 component->driver->num_dapm_widgets);
1517
1518 if (ret != 0) {
1519 dev_err(component->dev,
1520 "Failed to create new controls %d\n", ret);
1521 goto err_probe;
1522 }
1523 }
1524
1525 list_for_each_entry(dai, &component->dai_list, list) {
1526 ret = snd_soc_dapm_new_dai_widgets(dapm, dai);
1527 if (ret != 0) {
1528 dev_err(component->dev,
1529 "Failed to create DAI widgets %d\n", ret);
1530 goto err_probe;
1531 }
1532 }
1533
1534 if (component->probe) {
1535 ret = component->probe(component);
1536 if (ret < 0) {
1537 dev_err(component->dev,
1538 "ASoC: failed to probe component %d\n", ret);
1539 goto err_probe;
1540 }
1541
1542 WARN(dapm->idle_bias_off &&
1543 dapm->bias_level != SND_SOC_BIAS_OFF,
1544 "codec %s can not start from non-off bias with idle_bias_off==1\n",
1545 component->name);
1546 }
1547
1548
1549 if (component->init) {
1550 ret = component->init(component);
1551 if (ret < 0) {
1552 dev_err(component->dev,
1553 "Failed to do machine specific init %d\n", ret);
1554 goto err_probe;
1555 }
1556 }
1557
1558 if (component->driver->controls)
1559 snd_soc_add_component_controls(component,
1560 component->driver->controls,
1561 component->driver->num_controls);
1562 if (component->driver->dapm_routes)
1563 snd_soc_dapm_add_routes(dapm,
1564 component->driver->dapm_routes,
1565 component->driver->num_dapm_routes);
1566
1567 list_add(&dapm->list, &card->dapm_list);
1568 list_add(&component->card_list, &card->component_dev_list);
1569
1570 return 0;
1571
1572err_probe:
1573 soc_cleanup_component_debugfs(component);
1574 component->card = NULL;
1575 module_put(component->dev->driver->owner);
1576
1577 return ret;
1578}
1579
1580static void rtd_release(struct device *dev)
1581{
1582 kfree(dev);
1583}
1584
1585static int soc_post_component_init(struct snd_soc_pcm_runtime *rtd,
1586 const char *name)
1587{
1588 int ret = 0;
1589
1590
1591 rtd->dev = kzalloc(sizeof(struct device), GFP_KERNEL);
1592 if (!rtd->dev)
1593 return -ENOMEM;
1594 device_initialize(rtd->dev);
1595 rtd->dev->parent = rtd->card->dev;
1596 rtd->dev->release = rtd_release;
1597 rtd->dev->groups = soc_dev_attr_groups;
1598 dev_set_name(rtd->dev, "%s", name);
1599 dev_set_drvdata(rtd->dev, rtd);
1600 mutex_init(&rtd->pcm_mutex);
1601 INIT_LIST_HEAD(&rtd->dpcm[SNDRV_PCM_STREAM_PLAYBACK].be_clients);
1602 INIT_LIST_HEAD(&rtd->dpcm[SNDRV_PCM_STREAM_CAPTURE].be_clients);
1603 INIT_LIST_HEAD(&rtd->dpcm[SNDRV_PCM_STREAM_PLAYBACK].fe_clients);
1604 INIT_LIST_HEAD(&rtd->dpcm[SNDRV_PCM_STREAM_CAPTURE].fe_clients);
1605 ret = device_add(rtd->dev);
1606 if (ret < 0) {
1607
1608 put_device(rtd->dev);
1609 dev_err(rtd->card->dev,
1610 "ASoC: failed to register runtime device: %d\n", ret);
1611 return ret;
1612 }
1613 rtd->dev_registered = 1;
1614 return 0;
1615}
1616
1617static int soc_probe_link_components(struct snd_soc_card *card,
1618 struct snd_soc_pcm_runtime *rtd,
1619 int order)
1620{
1621 struct snd_soc_component *component;
1622 struct snd_soc_rtdcom_list *rtdcom;
1623 int ret;
1624
1625 for_each_rtdcom(rtd, rtdcom) {
1626 component = rtdcom->component;
1627
1628 if (component->driver->probe_order == order) {
1629 ret = soc_probe_component(card, component);
1630 if (ret < 0)
1631 return ret;
1632 }
1633 }
1634
1635 return 0;
1636}
1637
1638static int soc_probe_dai(struct snd_soc_dai *dai, int order)
1639{
1640 int ret;
1641
1642 if (!dai->probed && dai->driver->probe_order == order) {
1643 if (dai->driver->probe) {
1644 ret = dai->driver->probe(dai);
1645 if (ret < 0) {
1646 dev_err(dai->dev,
1647 "ASoC: failed to probe DAI %s: %d\n",
1648 dai->name, ret);
1649 return ret;
1650 }
1651 }
1652
1653 dai->probed = 1;
1654 }
1655
1656 return 0;
1657}
1658
1659static int soc_link_dai_pcm_new(struct snd_soc_dai **dais, int num_dais,
1660 struct snd_soc_pcm_runtime *rtd)
1661{
1662 int i, ret = 0;
1663
1664 for (i = 0; i < num_dais; ++i) {
1665 struct snd_soc_dai_driver *drv = dais[i]->driver;
1666
1667 if (!rtd->dai_link->no_pcm && drv->pcm_new)
1668 ret = drv->pcm_new(rtd, dais[i]);
1669 if (ret < 0) {
1670 dev_err(dais[i]->dev,
1671 "ASoC: Failed to bind %s with pcm device\n",
1672 dais[i]->name);
1673 return ret;
1674 }
1675 }
1676
1677 return 0;
1678}
1679
1680static int soc_link_dai_widgets(struct snd_soc_card *card,
1681 struct snd_soc_dai_link *dai_link,
1682 struct snd_soc_pcm_runtime *rtd)
1683{
1684 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
1685 struct snd_soc_dai *codec_dai = rtd->codec_dai;
1686 struct snd_soc_dapm_widget *sink, *source;
1687 int ret;
1688
1689 if (rtd->num_codecs > 1)
1690 dev_warn(card->dev, "ASoC: Multiple codecs not supported yet\n");
1691
1692
1693 sink = codec_dai->playback_widget;
1694 source = cpu_dai->capture_widget;
1695 if (sink && source) {
1696 ret = snd_soc_dapm_new_pcm(card, dai_link->params,
1697 dai_link->num_params,
1698 source, sink);
1699 if (ret != 0) {
1700 dev_err(card->dev, "ASoC: Can't link %s to %s: %d\n",
1701 sink->name, source->name, ret);
1702 return ret;
1703 }
1704 }
1705
1706 sink = cpu_dai->playback_widget;
1707 source = codec_dai->capture_widget;
1708 if (sink && source) {
1709 ret = snd_soc_dapm_new_pcm(card, dai_link->params,
1710 dai_link->num_params,
1711 source, sink);
1712 if (ret != 0) {
1713 dev_err(card->dev, "ASoC: Can't link %s to %s: %d\n",
1714 sink->name, source->name, ret);
1715 return ret;
1716 }
1717 }
1718
1719 return 0;
1720}
1721
1722static int soc_probe_link_dais(struct snd_soc_card *card,
1723 struct snd_soc_pcm_runtime *rtd, int order)
1724{
1725 struct snd_soc_dai_link *dai_link = rtd->dai_link;
1726 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
1727 int i, ret;
1728
1729 dev_dbg(card->dev, "ASoC: probe %s dai link %d late %d\n",
1730 card->name, rtd->num, order);
1731
1732
1733 rtd->pmdown_time = pmdown_time;
1734
1735 ret = soc_probe_dai(cpu_dai, order);
1736 if (ret)
1737 return ret;
1738
1739
1740 for (i = 0; i < rtd->num_codecs; i++) {
1741 ret = soc_probe_dai(rtd->codec_dais[i], order);
1742 if (ret)
1743 return ret;
1744 }
1745
1746
1747 if (order != SND_SOC_COMP_ORDER_LAST)
1748 return 0;
1749
1750
1751 if (dai_link->init) {
1752 ret = dai_link->init(rtd);
1753 if (ret < 0) {
1754 dev_err(card->dev, "ASoC: failed to init %s: %d\n",
1755 dai_link->name, ret);
1756 return ret;
1757 }
1758 }
1759
1760 if (dai_link->dai_fmt)
1761 snd_soc_runtime_set_dai_fmt(rtd, dai_link->dai_fmt);
1762
1763 ret = soc_post_component_init(rtd, dai_link->name);
1764 if (ret)
1765 return ret;
1766
1767#ifdef CONFIG_DEBUG_FS
1768
1769 if (dai_link->dynamic)
1770 soc_dpcm_debugfs_add(rtd);
1771#endif
1772
1773 if (cpu_dai->driver->compress_new) {
1774
1775 ret = cpu_dai->driver->compress_new(rtd, rtd->num);
1776 if (ret < 0) {
1777 dev_err(card->dev, "ASoC: can't create compress %s\n",
1778 dai_link->stream_name);
1779 return ret;
1780 }
1781 } else {
1782
1783 if (!dai_link->params) {
1784
1785 ret = soc_new_pcm(rtd, rtd->num);
1786 if (ret < 0) {
1787 dev_err(card->dev, "ASoC: can't create pcm %s :%d\n",
1788 dai_link->stream_name, ret);
1789 return ret;
1790 }
1791 ret = soc_link_dai_pcm_new(&cpu_dai, 1, rtd);
1792 if (ret < 0)
1793 return ret;
1794 ret = soc_link_dai_pcm_new(rtd->codec_dais,
1795 rtd->num_codecs, rtd);
1796 if (ret < 0)
1797 return ret;
1798 } else {
1799 INIT_DELAYED_WORK(&rtd->delayed_work,
1800 codec2codec_close_delayed_work);
1801
1802
1803 ret = soc_link_dai_widgets(card, dai_link, rtd);
1804 if (ret)
1805 return ret;
1806 }
1807 }
1808
1809 return 0;
1810}
1811
1812static int soc_bind_aux_dev(struct snd_soc_card *card, int num)
1813{
1814 struct snd_soc_aux_dev *aux_dev = &card->aux_dev[num];
1815 struct snd_soc_component *component;
1816 const char *name;
1817 struct device_node *codec_of_node;
1818
1819 if (aux_dev->codec_of_node || aux_dev->codec_name) {
1820
1821 name = aux_dev->codec_name;
1822 codec_of_node = aux_dev->codec_of_node;
1823 component = soc_find_component(codec_of_node, name);
1824 if (!component) {
1825 if (codec_of_node)
1826 name = of_node_full_name(codec_of_node);
1827 goto err_defer;
1828 }
1829 } else if (aux_dev->name) {
1830
1831 name = aux_dev->name;
1832 component = soc_find_component(NULL, name);
1833 if (!component)
1834 goto err_defer;
1835 } else {
1836 dev_err(card->dev, "ASoC: Invalid auxiliary device\n");
1837 return -EINVAL;
1838 }
1839
1840 component->init = aux_dev->init;
1841 list_add(&component->card_aux_list, &card->aux_comp_list);
1842
1843 return 0;
1844
1845err_defer:
1846 dev_err(card->dev, "ASoC: %s not registered\n", name);
1847 return -EPROBE_DEFER;
1848}
1849
1850static int soc_probe_aux_devices(struct snd_soc_card *card)
1851{
1852 struct snd_soc_component *comp;
1853 int order;
1854 int ret;
1855
1856 for (order = SND_SOC_COMP_ORDER_FIRST; order <= SND_SOC_COMP_ORDER_LAST;
1857 order++) {
1858 list_for_each_entry(comp, &card->aux_comp_list, card_aux_list) {
1859 if (comp->driver->probe_order == order) {
1860 ret = soc_probe_component(card, comp);
1861 if (ret < 0) {
1862 dev_err(card->dev,
1863 "ASoC: failed to probe aux component %s %d\n",
1864 comp->name, ret);
1865 return ret;
1866 }
1867 }
1868 }
1869 }
1870
1871 return 0;
1872}
1873
1874static void soc_remove_aux_devices(struct snd_soc_card *card)
1875{
1876 struct snd_soc_component *comp, *_comp;
1877 int order;
1878
1879 for (order = SND_SOC_COMP_ORDER_FIRST; order <= SND_SOC_COMP_ORDER_LAST;
1880 order++) {
1881 list_for_each_entry_safe(comp, _comp,
1882 &card->aux_comp_list, card_aux_list) {
1883
1884 if (comp->driver->remove_order == order) {
1885 soc_remove_component(comp);
1886
1887 list_del(&comp->card_aux_list);
1888 }
1889 }
1890 }
1891}
1892
1893static int snd_soc_init_codec_cache(struct snd_soc_codec *codec)
1894{
1895 int ret;
1896
1897 if (codec->cache_init)
1898 return 0;
1899
1900 ret = snd_soc_cache_init(codec);
1901 if (ret < 0) {
1902 dev_err(codec->dev,
1903 "ASoC: Failed to set cache compression type: %d\n",
1904 ret);
1905 return ret;
1906 }
1907 codec->cache_init = 1;
1908 return 0;
1909}
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924int snd_soc_runtime_set_dai_fmt(struct snd_soc_pcm_runtime *rtd,
1925 unsigned int dai_fmt)
1926{
1927 struct snd_soc_dai **codec_dais = rtd->codec_dais;
1928 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
1929 unsigned int i;
1930 int ret;
1931
1932 for (i = 0; i < rtd->num_codecs; i++) {
1933 struct snd_soc_dai *codec_dai = codec_dais[i];
1934
1935 ret = snd_soc_dai_set_fmt(codec_dai, dai_fmt);
1936 if (ret != 0 && ret != -ENOTSUPP) {
1937 dev_warn(codec_dai->dev,
1938 "ASoC: Failed to set DAI format: %d\n", ret);
1939 return ret;
1940 }
1941 }
1942
1943
1944 if (cpu_dai->codec) {
1945 unsigned int inv_dai_fmt;
1946
1947 inv_dai_fmt = dai_fmt & ~SND_SOC_DAIFMT_MASTER_MASK;
1948 switch (dai_fmt & SND_SOC_DAIFMT_MASTER_MASK) {
1949 case SND_SOC_DAIFMT_CBM_CFM:
1950 inv_dai_fmt |= SND_SOC_DAIFMT_CBS_CFS;
1951 break;
1952 case SND_SOC_DAIFMT_CBM_CFS:
1953 inv_dai_fmt |= SND_SOC_DAIFMT_CBS_CFM;
1954 break;
1955 case SND_SOC_DAIFMT_CBS_CFM:
1956 inv_dai_fmt |= SND_SOC_DAIFMT_CBM_CFS;
1957 break;
1958 case SND_SOC_DAIFMT_CBS_CFS:
1959 inv_dai_fmt |= SND_SOC_DAIFMT_CBM_CFM;
1960 break;
1961 }
1962
1963 dai_fmt = inv_dai_fmt;
1964 }
1965
1966 ret = snd_soc_dai_set_fmt(cpu_dai, dai_fmt);
1967 if (ret != 0 && ret != -ENOTSUPP) {
1968 dev_warn(cpu_dai->dev,
1969 "ASoC: Failed to set DAI format: %d\n", ret);
1970 return ret;
1971 }
1972
1973 return 0;
1974}
1975EXPORT_SYMBOL_GPL(snd_soc_runtime_set_dai_fmt);
1976
1977
1978#ifdef CONFIG_DMI
1979
1980
1981
1982
1983static void cleanup_dmi_name(char *name)
1984{
1985 int i, j = 0;
1986
1987 for (i = 0; name[i]; i++) {
1988 if (isalnum(name[i]) || (name[i] == '.')
1989 || (name[i] == '_'))
1990 name[j++] = name[i];
1991 else if (name[i] == '-')
1992 name[j++] = '_';
1993 }
1994
1995 name[j] = '\0';
1996}
1997
1998
1999
2000
2001static int is_dmi_valid(const char *field)
2002{
2003 int i = 0;
2004
2005 while (dmi_blacklist[i]) {
2006 if (strstr(field, dmi_blacklist[i]))
2007 return 0;
2008 i++;
2009 }
2010
2011 return 1;
2012}
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045int snd_soc_set_dmi_name(struct snd_soc_card *card, const char *flavour)
2046{
2047 const char *vendor, *product, *product_version, *board;
2048 size_t longname_buf_size = sizeof(card->snd_card->longname);
2049 size_t len;
2050
2051 if (card->long_name)
2052 return 0;
2053
2054
2055 vendor = dmi_get_system_info(DMI_BOARD_VENDOR);
2056 if (!vendor || !is_dmi_valid(vendor)) {
2057 dev_warn(card->dev, "ASoC: no DMI vendor name!\n");
2058 return 0;
2059 }
2060
2061
2062 snprintf(card->dmi_longname, sizeof(card->snd_card->longname),
2063 "%s", vendor);
2064 cleanup_dmi_name(card->dmi_longname);
2065
2066 product = dmi_get_system_info(DMI_PRODUCT_NAME);
2067 if (product && is_dmi_valid(product)) {
2068 len = strlen(card->dmi_longname);
2069 snprintf(card->dmi_longname + len,
2070 longname_buf_size - len,
2071 "-%s", product);
2072
2073 len++;
2074 if (len < longname_buf_size)
2075 cleanup_dmi_name(card->dmi_longname + len);
2076
2077
2078
2079
2080 product_version = dmi_get_system_info(DMI_PRODUCT_VERSION);
2081 if (product_version && is_dmi_valid(product_version)) {
2082 len = strlen(card->dmi_longname);
2083 snprintf(card->dmi_longname + len,
2084 longname_buf_size - len,
2085 "-%s", product_version);
2086
2087 len++;
2088 if (len < longname_buf_size)
2089 cleanup_dmi_name(card->dmi_longname + len);
2090 }
2091 }
2092
2093 board = dmi_get_system_info(DMI_BOARD_NAME);
2094 if (board && is_dmi_valid(board)) {
2095 len = strlen(card->dmi_longname);
2096 snprintf(card->dmi_longname + len,
2097 longname_buf_size - len,
2098 "-%s", board);
2099
2100 len++;
2101 if (len < longname_buf_size)
2102 cleanup_dmi_name(card->dmi_longname + len);
2103 } else if (!product) {
2104
2105 dev_warn(card->dev, "ASoC: no DMI board/product name!\n");
2106 return 0;
2107 }
2108
2109
2110 if (flavour) {
2111 len = strlen(card->dmi_longname);
2112 snprintf(card->dmi_longname + len,
2113 longname_buf_size - len,
2114 "-%s", flavour);
2115
2116 len++;
2117 if (len < longname_buf_size)
2118 cleanup_dmi_name(card->dmi_longname + len);
2119 }
2120
2121
2122 card->long_name = card->dmi_longname;
2123
2124 return 0;
2125}
2126EXPORT_SYMBOL_GPL(snd_soc_set_dmi_name);
2127#endif
2128
2129static int snd_soc_instantiate_card(struct snd_soc_card *card)
2130{
2131 struct snd_soc_codec *codec;
2132 struct snd_soc_pcm_runtime *rtd;
2133 struct snd_soc_dai_link *dai_link;
2134 int ret, i, order;
2135
2136 mutex_lock(&client_mutex);
2137 mutex_lock_nested(&card->mutex, SND_SOC_CARD_CLASS_INIT);
2138
2139
2140 for (i = 0; i < card->num_links; i++) {
2141 ret = soc_bind_dai_link(card, &card->dai_link[i]);
2142 if (ret != 0)
2143 goto base_error;
2144 }
2145
2146
2147 for (i = 0; i < card->num_aux_devs; i++) {
2148 ret = soc_bind_aux_dev(card, i);
2149 if (ret != 0)
2150 goto base_error;
2151 }
2152
2153
2154 for (i = 0; i < card->num_links; i++)
2155 snd_soc_add_dai_link(card, card->dai_link+i);
2156
2157
2158 list_for_each_entry(codec, &codec_list, list) {
2159 if (codec->cache_init)
2160 continue;
2161 ret = snd_soc_init_codec_cache(codec);
2162 if (ret < 0)
2163 goto base_error;
2164 }
2165
2166
2167 ret = snd_card_new(card->dev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1,
2168 card->owner, 0, &card->snd_card);
2169 if (ret < 0) {
2170 dev_err(card->dev,
2171 "ASoC: can't create sound card for card %s: %d\n",
2172 card->name, ret);
2173 goto base_error;
2174 }
2175
2176 soc_init_card_debugfs(card);
2177
2178 card->dapm.bias_level = SND_SOC_BIAS_OFF;
2179 card->dapm.dev = card->dev;
2180 card->dapm.card = card;
2181 list_add(&card->dapm.list, &card->dapm_list);
2182
2183#ifdef CONFIG_DEBUG_FS
2184 snd_soc_dapm_debugfs_init(&card->dapm, card->debugfs_card_root);
2185#endif
2186
2187#ifdef CONFIG_PM_SLEEP
2188
2189 INIT_WORK(&card->deferred_resume_work, soc_resume_deferred);
2190#endif
2191
2192 if (card->dapm_widgets)
2193 snd_soc_dapm_new_controls(&card->dapm, card->dapm_widgets,
2194 card->num_dapm_widgets);
2195
2196 if (card->of_dapm_widgets)
2197 snd_soc_dapm_new_controls(&card->dapm, card->of_dapm_widgets,
2198 card->num_of_dapm_widgets);
2199
2200
2201 if (card->probe) {
2202 ret = card->probe(card);
2203 if (ret < 0)
2204 goto card_probe_error;
2205 }
2206
2207
2208 for (order = SND_SOC_COMP_ORDER_FIRST; order <= SND_SOC_COMP_ORDER_LAST;
2209 order++) {
2210 list_for_each_entry(rtd, &card->rtd_list, list) {
2211 ret = soc_probe_link_components(card, rtd, order);
2212 if (ret < 0) {
2213 dev_err(card->dev,
2214 "ASoC: failed to instantiate card %d\n",
2215 ret);
2216 goto probe_dai_err;
2217 }
2218 }
2219 }
2220
2221
2222 ret = soc_probe_aux_devices(card);
2223 if (ret < 0)
2224 goto probe_dai_err;
2225
2226
2227
2228
2229 list_for_each_entry(dai_link, &card->dai_link_list, list) {
2230 if (soc_is_dai_link_bound(card, dai_link))
2231 continue;
2232
2233 ret = soc_init_dai_link(card, dai_link);
2234 if (ret)
2235 goto probe_dai_err;
2236 ret = soc_bind_dai_link(card, dai_link);
2237 if (ret)
2238 goto probe_dai_err;
2239 }
2240
2241
2242 for (order = SND_SOC_COMP_ORDER_FIRST; order <= SND_SOC_COMP_ORDER_LAST;
2243 order++) {
2244 list_for_each_entry(rtd, &card->rtd_list, list) {
2245 ret = soc_probe_link_dais(card, rtd, order);
2246 if (ret < 0) {
2247 dev_err(card->dev,
2248 "ASoC: failed to instantiate card %d\n",
2249 ret);
2250 goto probe_dai_err;
2251 }
2252 }
2253 }
2254
2255 snd_soc_dapm_link_dai_widgets(card);
2256 snd_soc_dapm_connect_dai_link_widgets(card);
2257
2258 if (card->controls)
2259 snd_soc_add_card_controls(card, card->controls, card->num_controls);
2260
2261 if (card->dapm_routes)
2262 snd_soc_dapm_add_routes(&card->dapm, card->dapm_routes,
2263 card->num_dapm_routes);
2264
2265 if (card->of_dapm_routes)
2266 snd_soc_dapm_add_routes(&card->dapm, card->of_dapm_routes,
2267 card->num_of_dapm_routes);
2268
2269
2270 snd_soc_set_dmi_name(card, NULL);
2271
2272 snprintf(card->snd_card->shortname, sizeof(card->snd_card->shortname),
2273 "%s", card->name);
2274 snprintf(card->snd_card->longname, sizeof(card->snd_card->longname),
2275 "%s", card->long_name ? card->long_name : card->name);
2276 snprintf(card->snd_card->driver, sizeof(card->snd_card->driver),
2277 "%s", card->driver_name ? card->driver_name : card->name);
2278 for (i = 0; i < ARRAY_SIZE(card->snd_card->driver); i++) {
2279 switch (card->snd_card->driver[i]) {
2280 case '_':
2281 case '-':
2282 case '\0':
2283 break;
2284 default:
2285 if (!isalnum(card->snd_card->driver[i]))
2286 card->snd_card->driver[i] = '_';
2287 break;
2288 }
2289 }
2290
2291 if (card->late_probe) {
2292 ret = card->late_probe(card);
2293 if (ret < 0) {
2294 dev_err(card->dev, "ASoC: %s late_probe() failed: %d\n",
2295 card->name, ret);
2296 goto probe_aux_dev_err;
2297 }
2298 }
2299
2300 snd_soc_dapm_new_widgets(card);
2301
2302 ret = snd_card_register(card->snd_card);
2303 if (ret < 0) {
2304 dev_err(card->dev, "ASoC: failed to register soundcard %d\n",
2305 ret);
2306 goto probe_aux_dev_err;
2307 }
2308
2309 card->instantiated = 1;
2310 snd_soc_dapm_sync(&card->dapm);
2311 mutex_unlock(&card->mutex);
2312 mutex_unlock(&client_mutex);
2313
2314 return 0;
2315
2316probe_aux_dev_err:
2317 soc_remove_aux_devices(card);
2318
2319probe_dai_err:
2320 soc_remove_dai_links(card);
2321
2322card_probe_error:
2323 if (card->remove)
2324 card->remove(card);
2325
2326 snd_soc_dapm_free(&card->dapm);
2327 soc_cleanup_card_debugfs(card);
2328 snd_card_free(card->snd_card);
2329
2330base_error:
2331 soc_remove_pcm_runtimes(card);
2332 mutex_unlock(&card->mutex);
2333 mutex_unlock(&client_mutex);
2334
2335 return ret;
2336}
2337
2338
2339static int soc_probe(struct platform_device *pdev)
2340{
2341 struct snd_soc_card *card = platform_get_drvdata(pdev);
2342
2343
2344
2345
2346
2347 if (!card)
2348 return -EINVAL;
2349
2350 dev_warn(&pdev->dev,
2351 "ASoC: machine %s should use snd_soc_register_card()\n",
2352 card->name);
2353
2354
2355 card->dev = &pdev->dev;
2356
2357 return snd_soc_register_card(card);
2358}
2359
2360static int soc_cleanup_card_resources(struct snd_soc_card *card)
2361{
2362 struct snd_soc_pcm_runtime *rtd;
2363
2364
2365 list_for_each_entry(rtd, &card->rtd_list, list)
2366 flush_delayed_work(&rtd->delayed_work);
2367
2368
2369 snd_card_free(card->snd_card);
2370
2371
2372 soc_remove_dai_links(card);
2373 soc_remove_pcm_runtimes(card);
2374
2375
2376 soc_remove_aux_devices(card);
2377
2378 snd_soc_dapm_free(&card->dapm);
2379 soc_cleanup_card_debugfs(card);
2380
2381
2382 if (card->remove)
2383 card->remove(card);
2384
2385 return 0;
2386}
2387
2388
2389static int soc_remove(struct platform_device *pdev)
2390{
2391 struct snd_soc_card *card = platform_get_drvdata(pdev);
2392
2393 snd_soc_unregister_card(card);
2394 return 0;
2395}
2396
2397int snd_soc_poweroff(struct device *dev)
2398{
2399 struct snd_soc_card *card = dev_get_drvdata(dev);
2400 struct snd_soc_pcm_runtime *rtd;
2401
2402 if (!card->instantiated)
2403 return 0;
2404
2405
2406
2407 list_for_each_entry(rtd, &card->rtd_list, list)
2408 flush_delayed_work(&rtd->delayed_work);
2409
2410 snd_soc_dapm_shutdown(card);
2411
2412
2413 list_for_each_entry(rtd, &card->rtd_list, list) {
2414 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
2415 int i;
2416
2417 pinctrl_pm_select_sleep_state(cpu_dai->dev);
2418 for (i = 0; i < rtd->num_codecs; i++) {
2419 struct snd_soc_dai *codec_dai = rtd->codec_dais[i];
2420 pinctrl_pm_select_sleep_state(codec_dai->dev);
2421 }
2422 }
2423
2424 return 0;
2425}
2426EXPORT_SYMBOL_GPL(snd_soc_poweroff);
2427
2428const struct dev_pm_ops snd_soc_pm_ops = {
2429 .suspend = snd_soc_suspend,
2430 .resume = snd_soc_resume,
2431 .freeze = snd_soc_suspend,
2432 .thaw = snd_soc_resume,
2433 .poweroff = snd_soc_poweroff,
2434 .restore = snd_soc_resume,
2435};
2436EXPORT_SYMBOL_GPL(snd_soc_pm_ops);
2437
2438
2439static struct platform_driver soc_driver = {
2440 .driver = {
2441 .name = "soc-audio",
2442 .pm = &snd_soc_pm_ops,
2443 },
2444 .probe = soc_probe,
2445 .remove = soc_remove,
2446};
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459struct snd_kcontrol *snd_soc_cnew(const struct snd_kcontrol_new *_template,
2460 void *data, const char *long_name,
2461 const char *prefix)
2462{
2463 struct snd_kcontrol_new template;
2464 struct snd_kcontrol *kcontrol;
2465 char *name = NULL;
2466
2467 memcpy(&template, _template, sizeof(template));
2468 template.index = 0;
2469
2470 if (!long_name)
2471 long_name = template.name;
2472
2473 if (prefix) {
2474 name = kasprintf(GFP_KERNEL, "%s %s", prefix, long_name);
2475 if (!name)
2476 return NULL;
2477
2478 template.name = name;
2479 } else {
2480 template.name = long_name;
2481 }
2482
2483 kcontrol = snd_ctl_new1(&template, data);
2484
2485 kfree(name);
2486
2487 return kcontrol;
2488}
2489EXPORT_SYMBOL_GPL(snd_soc_cnew);
2490
2491static int snd_soc_add_controls(struct snd_card *card, struct device *dev,
2492 const struct snd_kcontrol_new *controls, int num_controls,
2493 const char *prefix, void *data)
2494{
2495 int err, i;
2496
2497 for (i = 0; i < num_controls; i++) {
2498 const struct snd_kcontrol_new *control = &controls[i];
2499 err = snd_ctl_add(card, snd_soc_cnew(control, data,
2500 control->name, prefix));
2501 if (err < 0) {
2502 dev_err(dev, "ASoC: Failed to add %s: %d\n",
2503 control->name, err);
2504 return err;
2505 }
2506 }
2507
2508 return 0;
2509}
2510
2511struct snd_kcontrol *snd_soc_card_get_kcontrol(struct snd_soc_card *soc_card,
2512 const char *name)
2513{
2514 struct snd_card *card = soc_card->snd_card;
2515 struct snd_kcontrol *kctl;
2516
2517 if (unlikely(!name))
2518 return NULL;
2519
2520 list_for_each_entry(kctl, &card->controls, list)
2521 if (!strncmp(kctl->id.name, name, sizeof(kctl->id.name)))
2522 return kctl;
2523 return NULL;
2524}
2525EXPORT_SYMBOL_GPL(snd_soc_card_get_kcontrol);
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536int snd_soc_add_component_controls(struct snd_soc_component *component,
2537 const struct snd_kcontrol_new *controls, unsigned int num_controls)
2538{
2539 struct snd_card *card = component->card->snd_card;
2540
2541 return snd_soc_add_controls(card, component->dev, controls,
2542 num_controls, component->name_prefix, component);
2543}
2544EXPORT_SYMBOL_GPL(snd_soc_add_component_controls);
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557int snd_soc_add_codec_controls(struct snd_soc_codec *codec,
2558 const struct snd_kcontrol_new *controls, unsigned int num_controls)
2559{
2560 return snd_soc_add_component_controls(&codec->component, controls,
2561 num_controls);
2562}
2563EXPORT_SYMBOL_GPL(snd_soc_add_codec_controls);
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575int snd_soc_add_platform_controls(struct snd_soc_platform *platform,
2576 const struct snd_kcontrol_new *controls, unsigned int num_controls)
2577{
2578 return snd_soc_add_component_controls(&platform->component, controls,
2579 num_controls);
2580}
2581EXPORT_SYMBOL_GPL(snd_soc_add_platform_controls);
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593int snd_soc_add_card_controls(struct snd_soc_card *soc_card,
2594 const struct snd_kcontrol_new *controls, int num_controls)
2595{
2596 struct snd_card *card = soc_card->snd_card;
2597
2598 return snd_soc_add_controls(card, soc_card->dev, controls, num_controls,
2599 NULL, soc_card);
2600}
2601EXPORT_SYMBOL_GPL(snd_soc_add_card_controls);
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613int snd_soc_add_dai_controls(struct snd_soc_dai *dai,
2614 const struct snd_kcontrol_new *controls, int num_controls)
2615{
2616 struct snd_card *card = dai->component->card->snd_card;
2617
2618 return snd_soc_add_controls(card, dai->dev, controls, num_controls,
2619 NULL, dai);
2620}
2621EXPORT_SYMBOL_GPL(snd_soc_add_dai_controls);
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632int snd_soc_dai_set_sysclk(struct snd_soc_dai *dai, int clk_id,
2633 unsigned int freq, int dir)
2634{
2635 if (dai->driver && dai->driver->ops->set_sysclk)
2636 return dai->driver->ops->set_sysclk(dai, clk_id, freq, dir);
2637
2638 return snd_soc_component_set_sysclk(dai->component, clk_id, 0,
2639 freq, dir);
2640}
2641EXPORT_SYMBOL_GPL(snd_soc_dai_set_sysclk);
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653int snd_soc_codec_set_sysclk(struct snd_soc_codec *codec, int clk_id,
2654 int source, unsigned int freq, int dir)
2655{
2656 if (codec->driver->set_sysclk)
2657 return codec->driver->set_sysclk(codec, clk_id, source,
2658 freq, dir);
2659 else
2660 return -ENOTSUPP;
2661}
2662EXPORT_SYMBOL_GPL(snd_soc_codec_set_sysclk);
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674int snd_soc_component_set_sysclk(struct snd_soc_component *component, int clk_id,
2675 int source, unsigned int freq, int dir)
2676{
2677
2678 if (component->set_sysclk)
2679 return component->set_sysclk(component, clk_id, source,
2680 freq, dir);
2681
2682 if (component->driver->set_sysclk)
2683 return component->driver->set_sysclk(component, clk_id, source,
2684 freq, dir);
2685
2686 return -ENOTSUPP;
2687}
2688EXPORT_SYMBOL_GPL(snd_soc_component_set_sysclk);
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700int snd_soc_dai_set_clkdiv(struct snd_soc_dai *dai,
2701 int div_id, int div)
2702{
2703 if (dai->driver && dai->driver->ops->set_clkdiv)
2704 return dai->driver->ops->set_clkdiv(dai, div_id, div);
2705 else
2706 return -EINVAL;
2707}
2708EXPORT_SYMBOL_GPL(snd_soc_dai_set_clkdiv);
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720int snd_soc_dai_set_pll(struct snd_soc_dai *dai, int pll_id, int source,
2721 unsigned int freq_in, unsigned int freq_out)
2722{
2723 if (dai->driver && dai->driver->ops->set_pll)
2724 return dai->driver->ops->set_pll(dai, pll_id, source,
2725 freq_in, freq_out);
2726
2727 return snd_soc_component_set_pll(dai->component, pll_id, source,
2728 freq_in, freq_out);
2729}
2730EXPORT_SYMBOL_GPL(snd_soc_dai_set_pll);
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742int snd_soc_codec_set_pll(struct snd_soc_codec *codec, int pll_id, int source,
2743 unsigned int freq_in, unsigned int freq_out)
2744{
2745 if (codec->driver->set_pll)
2746 return codec->driver->set_pll(codec, pll_id, source,
2747 freq_in, freq_out);
2748 else
2749 return -EINVAL;
2750}
2751EXPORT_SYMBOL_GPL(snd_soc_codec_set_pll);
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763int snd_soc_component_set_pll(struct snd_soc_component *component, int pll_id,
2764 int source, unsigned int freq_in,
2765 unsigned int freq_out)
2766{
2767
2768 if (component->set_pll)
2769 return component->set_pll(component, pll_id, source,
2770 freq_in, freq_out);
2771
2772 if (component->driver->set_pll)
2773 return component->driver->set_pll(component, pll_id, source,
2774 freq_in, freq_out);
2775
2776 return -EINVAL;
2777}
2778EXPORT_SYMBOL_GPL(snd_soc_component_set_pll);
2779
2780
2781
2782
2783
2784
2785
2786
2787int snd_soc_dai_set_bclk_ratio(struct snd_soc_dai *dai, unsigned int ratio)
2788{
2789 if (dai->driver && dai->driver->ops->set_bclk_ratio)
2790 return dai->driver->ops->set_bclk_ratio(dai, ratio);
2791 else
2792 return -EINVAL;
2793}
2794EXPORT_SYMBOL_GPL(snd_soc_dai_set_bclk_ratio);
2795
2796
2797
2798
2799
2800
2801
2802
2803int snd_soc_dai_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
2804{
2805 if (dai->driver == NULL)
2806 return -EINVAL;
2807 if (dai->driver->ops->set_fmt == NULL)
2808 return -ENOTSUPP;
2809 return dai->driver->ops->set_fmt(dai, fmt);
2810}
2811EXPORT_SYMBOL_GPL(snd_soc_dai_set_fmt);
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821static int snd_soc_xlate_tdm_slot_mask(unsigned int slots,
2822 unsigned int *tx_mask,
2823 unsigned int *rx_mask)
2824{
2825 if (*tx_mask || *rx_mask)
2826 return 0;
2827
2828 if (!slots)
2829 return -EINVAL;
2830
2831 *tx_mask = (1 << slots) - 1;
2832 *rx_mask = (1 << slots) - 1;
2833
2834 return 0;
2835}
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860int snd_soc_dai_set_tdm_slot(struct snd_soc_dai *dai,
2861 unsigned int tx_mask, unsigned int rx_mask, int slots, int slot_width)
2862{
2863 if (dai->driver && dai->driver->ops->xlate_tdm_slot_mask)
2864 dai->driver->ops->xlate_tdm_slot_mask(slots,
2865 &tx_mask, &rx_mask);
2866 else
2867 snd_soc_xlate_tdm_slot_mask(slots, &tx_mask, &rx_mask);
2868
2869 dai->tx_mask = tx_mask;
2870 dai->rx_mask = rx_mask;
2871
2872 if (dai->driver && dai->driver->ops->set_tdm_slot)
2873 return dai->driver->ops->set_tdm_slot(dai, tx_mask, rx_mask,
2874 slots, slot_width);
2875 else
2876 return -ENOTSUPP;
2877}
2878EXPORT_SYMBOL_GPL(snd_soc_dai_set_tdm_slot);
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892int snd_soc_dai_set_channel_map(struct snd_soc_dai *dai,
2893 unsigned int tx_num, unsigned int *tx_slot,
2894 unsigned int rx_num, unsigned int *rx_slot)
2895{
2896 if (dai->driver && dai->driver->ops->set_channel_map)
2897 return dai->driver->ops->set_channel_map(dai, tx_num, tx_slot,
2898 rx_num, rx_slot);
2899 else
2900 return -EINVAL;
2901}
2902EXPORT_SYMBOL_GPL(snd_soc_dai_set_channel_map);
2903
2904
2905
2906
2907
2908
2909
2910
2911int snd_soc_dai_set_tristate(struct snd_soc_dai *dai, int tristate)
2912{
2913 if (dai->driver && dai->driver->ops->set_tristate)
2914 return dai->driver->ops->set_tristate(dai, tristate);
2915 else
2916 return -EINVAL;
2917}
2918EXPORT_SYMBOL_GPL(snd_soc_dai_set_tristate);
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928int snd_soc_dai_digital_mute(struct snd_soc_dai *dai, int mute,
2929 int direction)
2930{
2931 if (!dai->driver)
2932 return -ENOTSUPP;
2933
2934 if (dai->driver->ops->mute_stream)
2935 return dai->driver->ops->mute_stream(dai, mute, direction);
2936 else if (direction == SNDRV_PCM_STREAM_PLAYBACK &&
2937 dai->driver->ops->digital_mute)
2938 return dai->driver->ops->digital_mute(dai, mute);
2939 else
2940 return -ENOTSUPP;
2941}
2942EXPORT_SYMBOL_GPL(snd_soc_dai_digital_mute);
2943
2944
2945
2946
2947
2948
2949
2950int snd_soc_register_card(struct snd_soc_card *card)
2951{
2952 int i, ret;
2953 struct snd_soc_pcm_runtime *rtd;
2954
2955 if (!card->name || !card->dev)
2956 return -EINVAL;
2957
2958 for (i = 0; i < card->num_links; i++) {
2959 struct snd_soc_dai_link *link = &card->dai_link[i];
2960
2961 ret = soc_init_dai_link(card, link);
2962 if (ret) {
2963 dev_err(card->dev, "ASoC: failed to init link %s\n",
2964 link->name);
2965 return ret;
2966 }
2967 }
2968
2969 dev_set_drvdata(card->dev, card);
2970
2971 snd_soc_initialize_card_lists(card);
2972
2973 INIT_LIST_HEAD(&card->dai_link_list);
2974 card->num_dai_links = 0;
2975
2976 INIT_LIST_HEAD(&card->rtd_list);
2977 card->num_rtd = 0;
2978
2979 INIT_LIST_HEAD(&card->dapm_dirty);
2980 INIT_LIST_HEAD(&card->dobj_list);
2981 card->instantiated = 0;
2982 mutex_init(&card->mutex);
2983 mutex_init(&card->dapm_mutex);
2984
2985 ret = snd_soc_instantiate_card(card);
2986 if (ret != 0)
2987 return ret;
2988
2989
2990 list_for_each_entry(rtd, &card->rtd_list, list) {
2991 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
2992 int j;
2993
2994 for (j = 0; j < rtd->num_codecs; j++) {
2995 struct snd_soc_dai *codec_dai = rtd->codec_dais[j];
2996 if (!codec_dai->active)
2997 pinctrl_pm_select_sleep_state(codec_dai->dev);
2998 }
2999
3000 if (!cpu_dai->active)
3001 pinctrl_pm_select_sleep_state(cpu_dai->dev);
3002 }
3003
3004 return ret;
3005}
3006EXPORT_SYMBOL_GPL(snd_soc_register_card);
3007
3008
3009
3010
3011
3012
3013
3014int snd_soc_unregister_card(struct snd_soc_card *card)
3015{
3016 if (card->instantiated) {
3017 card->instantiated = false;
3018 snd_soc_dapm_shutdown(card);
3019 soc_cleanup_card_resources(card);
3020 dev_dbg(card->dev, "ASoC: Unregistered card '%s'\n", card->name);
3021 }
3022
3023 return 0;
3024}
3025EXPORT_SYMBOL_GPL(snd_soc_unregister_card);
3026
3027
3028
3029
3030
3031static char *fmt_single_name(struct device *dev, int *id)
3032{
3033 char *found, name[NAME_SIZE];
3034 int id1, id2;
3035
3036 if (dev_name(dev) == NULL)
3037 return NULL;
3038
3039 strlcpy(name, dev_name(dev), NAME_SIZE);
3040
3041
3042 found = strstr(name, dev->driver->name);
3043 if (found) {
3044
3045 if (sscanf(&found[strlen(dev->driver->name)], ".%d", id) == 1) {
3046
3047
3048 if (*id == -1)
3049 found[strlen(dev->driver->name)] = '\0';
3050 }
3051
3052 } else {
3053
3054 if (sscanf(name, "%x-%x", &id1, &id2) == 2) {
3055 char tmp[NAME_SIZE];
3056
3057
3058 *id = ((id1 & 0xffff) << 16) + id2;
3059
3060
3061 snprintf(tmp, NAME_SIZE, "%s.%s", dev->driver->name, name);
3062 strlcpy(name, tmp, NAME_SIZE);
3063 } else
3064 *id = 0;
3065 }
3066
3067 return kstrdup(name, GFP_KERNEL);
3068}
3069
3070
3071
3072
3073
3074static inline char *fmt_multiple_name(struct device *dev,
3075 struct snd_soc_dai_driver *dai_drv)
3076{
3077 if (dai_drv->name == NULL) {
3078 dev_err(dev,
3079 "ASoC: error - multiple DAI %s registered with no name\n",
3080 dev_name(dev));
3081 return NULL;
3082 }
3083
3084 return kstrdup(dai_drv->name, GFP_KERNEL);
3085}
3086
3087
3088
3089
3090
3091
3092static void snd_soc_unregister_dais(struct snd_soc_component *component)
3093{
3094 struct snd_soc_dai *dai, *_dai;
3095
3096 list_for_each_entry_safe(dai, _dai, &component->dai_list, list) {
3097 dev_dbg(component->dev, "ASoC: Unregistered DAI '%s'\n",
3098 dai->name);
3099 list_del(&dai->list);
3100 kfree(dai->name);
3101 kfree(dai);
3102 }
3103}
3104
3105
3106static struct snd_soc_dai *soc_add_dai(struct snd_soc_component *component,
3107 struct snd_soc_dai_driver *dai_drv,
3108 bool legacy_dai_naming)
3109{
3110 struct device *dev = component->dev;
3111 struct snd_soc_dai *dai;
3112
3113 dev_dbg(dev, "ASoC: dynamically register DAI %s\n", dev_name(dev));
3114
3115 dai = kzalloc(sizeof(struct snd_soc_dai), GFP_KERNEL);
3116 if (dai == NULL)
3117 return NULL;
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127 if (legacy_dai_naming &&
3128 (dai_drv->id == 0 || dai_drv->name == NULL)) {
3129 dai->name = fmt_single_name(dev, &dai->id);
3130 } else {
3131 dai->name = fmt_multiple_name(dev, dai_drv);
3132 if (dai_drv->id)
3133 dai->id = dai_drv->id;
3134 else
3135 dai->id = component->num_dai;
3136 }
3137 if (dai->name == NULL) {
3138 kfree(dai);
3139 return NULL;
3140 }
3141
3142 dai->component = component;
3143 dai->dev = dev;
3144 dai->driver = dai_drv;
3145 if (!dai->driver->ops)
3146 dai->driver->ops = &null_dai_ops;
3147
3148 list_add(&dai->list, &component->dai_list);
3149 component->num_dai++;
3150
3151 dev_dbg(dev, "ASoC: Registered DAI '%s'\n", dai->name);
3152 return dai;
3153}
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164static int snd_soc_register_dais(struct snd_soc_component *component,
3165 struct snd_soc_dai_driver *dai_drv, size_t count,
3166 bool legacy_dai_naming)
3167{
3168 struct device *dev = component->dev;
3169 struct snd_soc_dai *dai;
3170 unsigned int i;
3171 int ret;
3172
3173 dev_dbg(dev, "ASoC: dai register %s #%zu\n", dev_name(dev), count);
3174
3175 component->dai_drv = dai_drv;
3176
3177 for (i = 0; i < count; i++) {
3178
3179 dai = soc_add_dai(component, dai_drv + i,
3180 count == 1 && legacy_dai_naming);
3181 if (dai == NULL) {
3182 ret = -ENOMEM;
3183 goto err;
3184 }
3185 }
3186
3187 return 0;
3188
3189err:
3190 snd_soc_unregister_dais(component);
3191
3192 return ret;
3193}
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205int snd_soc_register_dai(struct snd_soc_component *component,
3206 struct snd_soc_dai_driver *dai_drv)
3207{
3208 struct snd_soc_dapm_context *dapm =
3209 snd_soc_component_get_dapm(component);
3210 struct snd_soc_dai *dai;
3211 int ret;
3212
3213 if (dai_drv->dobj.type != SND_SOC_DOBJ_PCM) {
3214 dev_err(component->dev, "Invalid dai type %d\n",
3215 dai_drv->dobj.type);
3216 return -EINVAL;
3217 }
3218
3219 lockdep_assert_held(&client_mutex);
3220 dai = soc_add_dai(component, dai_drv, false);
3221 if (!dai)
3222 return -ENOMEM;
3223
3224
3225
3226
3227 ret = snd_soc_dapm_new_dai_widgets(dapm, dai);
3228 if (ret != 0) {
3229 dev_err(component->dev,
3230 "Failed to create DAI widgets %d\n", ret);
3231 }
3232
3233 return ret;
3234}
3235EXPORT_SYMBOL_GPL(snd_soc_register_dai);
3236
3237static void snd_soc_component_seq_notifier(struct snd_soc_dapm_context *dapm,
3238 enum snd_soc_dapm_type type, int subseq)
3239{
3240 struct snd_soc_component *component = dapm->component;
3241
3242 component->driver->seq_notifier(component, type, subseq);
3243}
3244
3245static int snd_soc_component_stream_event(struct snd_soc_dapm_context *dapm,
3246 int event)
3247{
3248 struct snd_soc_component *component = dapm->component;
3249
3250 return component->driver->stream_event(component, event);
3251}
3252
3253static int snd_soc_component_initialize(struct snd_soc_component *component,
3254 const struct snd_soc_component_driver *driver, struct device *dev)
3255{
3256 struct snd_soc_dapm_context *dapm;
3257
3258 component->name = fmt_single_name(dev, &component->id);
3259 if (!component->name) {
3260 dev_err(dev, "ASoC: Failed to allocate name\n");
3261 return -ENOMEM;
3262 }
3263
3264 component->dev = dev;
3265 component->driver = driver;
3266 component->probe = component->driver->probe;
3267 component->remove = component->driver->remove;
3268 component->suspend = component->driver->suspend;
3269 component->resume = component->driver->resume;
3270 component->set_sysclk = component->driver->set_sysclk;
3271 component->set_pll = component->driver->set_pll;
3272 component->set_jack = component->driver->set_jack;
3273
3274 dapm = snd_soc_component_get_dapm(component);
3275 dapm->dev = dev;
3276 dapm->component = component;
3277 dapm->bias_level = SND_SOC_BIAS_OFF;
3278 dapm->idle_bias_off = true;
3279 if (driver->seq_notifier)
3280 dapm->seq_notifier = snd_soc_component_seq_notifier;
3281 if (driver->stream_event)
3282 dapm->stream_event = snd_soc_component_stream_event;
3283
3284 INIT_LIST_HEAD(&component->dai_list);
3285 mutex_init(&component->io_mutex);
3286
3287 return 0;
3288}
3289
3290static void snd_soc_component_setup_regmap(struct snd_soc_component *component)
3291{
3292 int val_bytes = regmap_get_val_bytes(component->regmap);
3293
3294
3295 if (val_bytes > 0)
3296 component->val_bytes = val_bytes;
3297}
3298
3299#ifdef CONFIG_REGMAP
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311void snd_soc_component_init_regmap(struct snd_soc_component *component,
3312 struct regmap *regmap)
3313{
3314 component->regmap = regmap;
3315 snd_soc_component_setup_regmap(component);
3316}
3317EXPORT_SYMBOL_GPL(snd_soc_component_init_regmap);
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329void snd_soc_component_exit_regmap(struct snd_soc_component *component)
3330{
3331 regmap_exit(component->regmap);
3332 component->regmap = NULL;
3333}
3334EXPORT_SYMBOL_GPL(snd_soc_component_exit_regmap);
3335
3336#endif
3337
3338static void snd_soc_component_add_unlocked(struct snd_soc_component *component)
3339{
3340 if (!component->write && !component->read) {
3341 if (!component->regmap)
3342 component->regmap = dev_get_regmap(component->dev, NULL);
3343 if (component->regmap)
3344 snd_soc_component_setup_regmap(component);
3345 }
3346
3347 list_add(&component->list, &component_list);
3348 INIT_LIST_HEAD(&component->dobj_list);
3349}
3350
3351static void snd_soc_component_add(struct snd_soc_component *component)
3352{
3353 mutex_lock(&client_mutex);
3354 snd_soc_component_add_unlocked(component);
3355 mutex_unlock(&client_mutex);
3356}
3357
3358static void snd_soc_component_cleanup(struct snd_soc_component *component)
3359{
3360 snd_soc_unregister_dais(component);
3361 kfree(component->name);
3362}
3363
3364static void snd_soc_component_del_unlocked(struct snd_soc_component *component)
3365{
3366 struct snd_soc_card *card = component->card;
3367
3368 if (card)
3369 snd_soc_unregister_card(card);
3370
3371 list_del(&component->list);
3372}
3373
3374int snd_soc_register_component(struct device *dev,
3375 const struct snd_soc_component_driver *component_driver,
3376 struct snd_soc_dai_driver *dai_drv,
3377 int num_dai)
3378{
3379 struct snd_soc_component *component;
3380 int ret;
3381
3382 component = kzalloc(sizeof(*component), GFP_KERNEL);
3383 if (!component) {
3384 dev_err(dev, "ASoC: Failed to allocate memory\n");
3385 return -ENOMEM;
3386 }
3387
3388 ret = snd_soc_component_initialize(component, component_driver, dev);
3389 if (ret)
3390 goto err_free;
3391
3392 component->ignore_pmdown_time = true;
3393 component->registered_as_component = true;
3394
3395 ret = snd_soc_register_dais(component, dai_drv, num_dai, true);
3396 if (ret < 0) {
3397 dev_err(dev, "ASoC: Failed to register DAIs: %d\n", ret);
3398 goto err_cleanup;
3399 }
3400
3401 snd_soc_component_add(component);
3402
3403 return 0;
3404
3405err_cleanup:
3406 snd_soc_component_cleanup(component);
3407err_free:
3408 kfree(component);
3409 return ret;
3410}
3411EXPORT_SYMBOL_GPL(snd_soc_register_component);
3412
3413
3414
3415
3416
3417
3418
3419static int __snd_soc_unregister_component(struct device *dev)
3420{
3421 struct snd_soc_component *component;
3422 int found = 0;
3423
3424 mutex_lock(&client_mutex);
3425 list_for_each_entry(component, &component_list, list) {
3426 if (dev != component->dev ||
3427 !component->registered_as_component)
3428 continue;
3429
3430 snd_soc_tplg_component_remove(component, SND_SOC_TPLG_INDEX_ALL);
3431 snd_soc_component_del_unlocked(component);
3432 found = 1;
3433 break;
3434 }
3435 mutex_unlock(&client_mutex);
3436
3437 if (found) {
3438 snd_soc_component_cleanup(component);
3439 kfree(component);
3440 }
3441
3442 return found;
3443}
3444
3445void snd_soc_unregister_component(struct device *dev)
3446{
3447 while (__snd_soc_unregister_component(dev));
3448}
3449EXPORT_SYMBOL_GPL(snd_soc_unregister_component);
3450
3451static int snd_soc_platform_drv_probe(struct snd_soc_component *component)
3452{
3453 struct snd_soc_platform *platform = snd_soc_component_to_platform(component);
3454
3455 return platform->driver->probe(platform);
3456}
3457
3458static void snd_soc_platform_drv_remove(struct snd_soc_component *component)
3459{
3460 struct snd_soc_platform *platform = snd_soc_component_to_platform(component);
3461
3462 platform->driver->remove(platform);
3463}
3464
3465
3466
3467
3468
3469
3470
3471int snd_soc_add_platform(struct device *dev, struct snd_soc_platform *platform,
3472 const struct snd_soc_platform_driver *platform_drv)
3473{
3474 int ret;
3475
3476 ret = snd_soc_component_initialize(&platform->component,
3477 &platform_drv->component_driver, dev);
3478 if (ret)
3479 return ret;
3480
3481 platform->dev = dev;
3482 platform->driver = platform_drv;
3483
3484 if (platform_drv->probe)
3485 platform->component.probe = snd_soc_platform_drv_probe;
3486 if (platform_drv->remove)
3487 platform->component.remove = snd_soc_platform_drv_remove;
3488
3489#ifdef CONFIG_DEBUG_FS
3490 platform->component.debugfs_prefix = "platform";
3491#endif
3492
3493 mutex_lock(&client_mutex);
3494 snd_soc_component_add_unlocked(&platform->component);
3495 list_add(&platform->list, &platform_list);
3496 mutex_unlock(&client_mutex);
3497
3498 dev_dbg(dev, "ASoC: Registered platform '%s'\n",
3499 platform->component.name);
3500
3501 return 0;
3502}
3503EXPORT_SYMBOL_GPL(snd_soc_add_platform);
3504
3505
3506
3507
3508
3509
3510
3511int snd_soc_register_platform(struct device *dev,
3512 const struct snd_soc_platform_driver *platform_drv)
3513{
3514 struct snd_soc_platform *platform;
3515 int ret;
3516
3517 dev_dbg(dev, "ASoC: platform register %s\n", dev_name(dev));
3518
3519 platform = kzalloc(sizeof(struct snd_soc_platform), GFP_KERNEL);
3520 if (platform == NULL)
3521 return -ENOMEM;
3522
3523 ret = snd_soc_add_platform(dev, platform, platform_drv);
3524 if (ret)
3525 kfree(platform);
3526
3527 return ret;
3528}
3529EXPORT_SYMBOL_GPL(snd_soc_register_platform);
3530
3531
3532
3533
3534
3535void snd_soc_remove_platform(struct snd_soc_platform *platform)
3536{
3537
3538 mutex_lock(&client_mutex);
3539 list_del(&platform->list);
3540 snd_soc_component_del_unlocked(&platform->component);
3541 mutex_unlock(&client_mutex);
3542
3543 dev_dbg(platform->dev, "ASoC: Unregistered platform '%s'\n",
3544 platform->component.name);
3545
3546 snd_soc_component_cleanup(&platform->component);
3547}
3548EXPORT_SYMBOL_GPL(snd_soc_remove_platform);
3549
3550struct snd_soc_platform *snd_soc_lookup_platform(struct device *dev)
3551{
3552 struct snd_soc_platform *platform;
3553
3554 mutex_lock(&client_mutex);
3555 list_for_each_entry(platform, &platform_list, list) {
3556 if (dev == platform->dev) {
3557 mutex_unlock(&client_mutex);
3558 return platform;
3559 }
3560 }
3561 mutex_unlock(&client_mutex);
3562
3563 return NULL;
3564}
3565EXPORT_SYMBOL_GPL(snd_soc_lookup_platform);
3566
3567
3568
3569
3570
3571
3572void snd_soc_unregister_platform(struct device *dev)
3573{
3574 struct snd_soc_platform *platform;
3575
3576 platform = snd_soc_lookup_platform(dev);
3577 if (!platform)
3578 return;
3579
3580 snd_soc_remove_platform(platform);
3581 kfree(platform);
3582}
3583EXPORT_SYMBOL_GPL(snd_soc_unregister_platform);
3584
3585static u64 codec_format_map[] = {
3586 SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S16_BE,
3587 SNDRV_PCM_FMTBIT_U16_LE | SNDRV_PCM_FMTBIT_U16_BE,
3588 SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S24_BE,
3589 SNDRV_PCM_FMTBIT_U24_LE | SNDRV_PCM_FMTBIT_U24_BE,
3590 SNDRV_PCM_FMTBIT_S32_LE | SNDRV_PCM_FMTBIT_S32_BE,
3591 SNDRV_PCM_FMTBIT_U32_LE | SNDRV_PCM_FMTBIT_U32_BE,
3592 SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_U24_3BE,
3593 SNDRV_PCM_FMTBIT_U24_3LE | SNDRV_PCM_FMTBIT_U24_3BE,
3594 SNDRV_PCM_FMTBIT_S20_3LE | SNDRV_PCM_FMTBIT_S20_3BE,
3595 SNDRV_PCM_FMTBIT_U20_3LE | SNDRV_PCM_FMTBIT_U20_3BE,
3596 SNDRV_PCM_FMTBIT_S18_3LE | SNDRV_PCM_FMTBIT_S18_3BE,
3597 SNDRV_PCM_FMTBIT_U18_3LE | SNDRV_PCM_FMTBIT_U18_3BE,
3598 SNDRV_PCM_FMTBIT_FLOAT_LE | SNDRV_PCM_FMTBIT_FLOAT_BE,
3599 SNDRV_PCM_FMTBIT_FLOAT64_LE | SNDRV_PCM_FMTBIT_FLOAT64_BE,
3600 SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_LE
3601 | SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_BE,
3602};
3603
3604
3605
3606
3607
3608
3609static void fixup_codec_formats(struct snd_soc_pcm_stream *stream)
3610{
3611 int i;
3612
3613 for (i = 0; i < ARRAY_SIZE(codec_format_map); i++)
3614 if (stream->formats & codec_format_map[i])
3615 stream->formats |= codec_format_map[i];
3616}
3617
3618static int snd_soc_codec_drv_probe(struct snd_soc_component *component)
3619{
3620 struct snd_soc_codec *codec = snd_soc_component_to_codec(component);
3621
3622 return codec->driver->probe(codec);
3623}
3624
3625static void snd_soc_codec_drv_remove(struct snd_soc_component *component)
3626{
3627 struct snd_soc_codec *codec = snd_soc_component_to_codec(component);
3628
3629 codec->driver->remove(codec);
3630}
3631
3632static int snd_soc_codec_drv_suspend(struct snd_soc_component *component)
3633{
3634 struct snd_soc_codec *codec = snd_soc_component_to_codec(component);
3635
3636 return codec->driver->suspend(codec);
3637}
3638
3639static int snd_soc_codec_drv_resume(struct snd_soc_component *component)
3640{
3641 struct snd_soc_codec *codec = snd_soc_component_to_codec(component);
3642
3643 return codec->driver->resume(codec);
3644}
3645
3646static int snd_soc_codec_drv_write(struct snd_soc_component *component,
3647 unsigned int reg, unsigned int val)
3648{
3649 struct snd_soc_codec *codec = snd_soc_component_to_codec(component);
3650
3651 return codec->driver->write(codec, reg, val);
3652}
3653
3654static int snd_soc_codec_drv_read(struct snd_soc_component *component,
3655 unsigned int reg, unsigned int *val)
3656{
3657 struct snd_soc_codec *codec = snd_soc_component_to_codec(component);
3658
3659 *val = codec->driver->read(codec, reg);
3660
3661 return 0;
3662}
3663
3664static int snd_soc_codec_set_sysclk_(struct snd_soc_component *component,
3665 int clk_id, int source, unsigned int freq, int dir)
3666{
3667 struct snd_soc_codec *codec = snd_soc_component_to_codec(component);
3668
3669 return snd_soc_codec_set_sysclk(codec, clk_id, source, freq, dir);
3670}
3671
3672static int snd_soc_codec_set_pll_(struct snd_soc_component *component,
3673 int pll_id, int source, unsigned int freq_in,
3674 unsigned int freq_out)
3675{
3676 struct snd_soc_codec *codec = snd_soc_component_to_codec(component);
3677
3678 return snd_soc_codec_set_pll(codec, pll_id, source, freq_in, freq_out);
3679}
3680
3681static int snd_soc_codec_set_jack_(struct snd_soc_component *component,
3682 struct snd_soc_jack *jack, void *data)
3683{
3684 struct snd_soc_codec *codec = snd_soc_component_to_codec(component);
3685
3686 return snd_soc_codec_set_jack(codec, jack, data);
3687}
3688
3689static int snd_soc_codec_set_bias_level(struct snd_soc_dapm_context *dapm,
3690 enum snd_soc_bias_level level)
3691{
3692 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(dapm);
3693
3694 return codec->driver->set_bias_level(codec, level);
3695}
3696
3697
3698
3699
3700
3701
3702
3703
3704
3705int snd_soc_register_codec(struct device *dev,
3706 const struct snd_soc_codec_driver *codec_drv,
3707 struct snd_soc_dai_driver *dai_drv,
3708 int num_dai)
3709{
3710 struct snd_soc_dapm_context *dapm;
3711 struct snd_soc_codec *codec;
3712 struct snd_soc_dai *dai;
3713 int ret, i;
3714
3715 dev_dbg(dev, "codec register %s\n", dev_name(dev));
3716
3717 codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL);
3718 if (codec == NULL)
3719 return -ENOMEM;
3720
3721 codec->component.codec = codec;
3722
3723 ret = snd_soc_component_initialize(&codec->component,
3724 &codec_drv->component_driver, dev);
3725 if (ret)
3726 goto err_free;
3727
3728 if (codec_drv->probe)
3729 codec->component.probe = snd_soc_codec_drv_probe;
3730 if (codec_drv->remove)
3731 codec->component.remove = snd_soc_codec_drv_remove;
3732 if (codec_drv->suspend)
3733 codec->component.suspend = snd_soc_codec_drv_suspend;
3734 if (codec_drv->resume)
3735 codec->component.resume = snd_soc_codec_drv_resume;
3736 if (codec_drv->write)
3737 codec->component.write = snd_soc_codec_drv_write;
3738 if (codec_drv->read)
3739 codec->component.read = snd_soc_codec_drv_read;
3740 if (codec_drv->set_sysclk)
3741 codec->component.set_sysclk = snd_soc_codec_set_sysclk_;
3742 if (codec_drv->set_pll)
3743 codec->component.set_pll = snd_soc_codec_set_pll_;
3744 if (codec_drv->set_jack)
3745 codec->component.set_jack = snd_soc_codec_set_jack_;
3746 codec->component.ignore_pmdown_time = codec_drv->ignore_pmdown_time;
3747
3748 dapm = snd_soc_codec_get_dapm(codec);
3749 dapm->idle_bias_off = codec_drv->idle_bias_off;
3750 dapm->suspend_bias_off = codec_drv->suspend_bias_off;
3751 if (codec_drv->seq_notifier)
3752 dapm->seq_notifier = codec_drv->seq_notifier;
3753 if (codec_drv->set_bias_level)
3754 dapm->set_bias_level = snd_soc_codec_set_bias_level;
3755 codec->dev = dev;
3756 codec->driver = codec_drv;
3757 codec->component.val_bytes = codec_drv->reg_word_size;
3758
3759#ifdef CONFIG_DEBUG_FS
3760 codec->component.init_debugfs = soc_init_codec_debugfs;
3761 codec->component.debugfs_prefix = "codec";
3762#endif
3763
3764 if (codec_drv->get_regmap)
3765 codec->component.regmap = codec_drv->get_regmap(dev);
3766
3767 for (i = 0; i < num_dai; i++) {
3768 fixup_codec_formats(&dai_drv[i].playback);
3769 fixup_codec_formats(&dai_drv[i].capture);
3770 }
3771
3772 ret = snd_soc_register_dais(&codec->component, dai_drv, num_dai, false);
3773 if (ret < 0) {
3774 dev_err(dev, "ASoC: Failed to register DAIs: %d\n", ret);
3775 goto err_cleanup;
3776 }
3777
3778 list_for_each_entry(dai, &codec->component.dai_list, list)
3779 dai->codec = codec;
3780
3781 mutex_lock(&client_mutex);
3782 snd_soc_component_add_unlocked(&codec->component);
3783 list_add(&codec->list, &codec_list);
3784 mutex_unlock(&client_mutex);
3785
3786 dev_dbg(codec->dev, "ASoC: Registered codec '%s'\n",
3787 codec->component.name);
3788 return 0;
3789
3790err_cleanup:
3791 snd_soc_component_cleanup(&codec->component);
3792err_free:
3793 kfree(codec);
3794 return ret;
3795}
3796EXPORT_SYMBOL_GPL(snd_soc_register_codec);
3797
3798
3799
3800
3801
3802
3803void snd_soc_unregister_codec(struct device *dev)
3804{
3805 struct snd_soc_codec *codec;
3806
3807 mutex_lock(&client_mutex);
3808 list_for_each_entry(codec, &codec_list, list) {
3809 if (dev == codec->dev)
3810 goto found;
3811 }
3812 mutex_unlock(&client_mutex);
3813 return;
3814
3815found:
3816 list_del(&codec->list);
3817 snd_soc_component_del_unlocked(&codec->component);
3818 mutex_unlock(&client_mutex);
3819
3820 dev_dbg(codec->dev, "ASoC: Unregistered codec '%s'\n",
3821 codec->component.name);
3822
3823 snd_soc_component_cleanup(&codec->component);
3824 snd_soc_cache_exit(codec);
3825 kfree(codec);
3826}
3827EXPORT_SYMBOL_GPL(snd_soc_unregister_codec);
3828
3829
3830int snd_soc_of_parse_card_name(struct snd_soc_card *card,
3831 const char *propname)
3832{
3833 struct device_node *np;
3834 int ret;
3835
3836 if (!card->dev) {
3837 pr_err("card->dev is not set before calling %s\n", __func__);
3838 return -EINVAL;
3839 }
3840
3841 np = card->dev->of_node;
3842
3843 ret = of_property_read_string_index(np, propname, 0, &card->name);
3844
3845
3846
3847
3848
3849 if (ret < 0 && ret != -EINVAL) {
3850 dev_err(card->dev,
3851 "ASoC: Property '%s' could not be read: %d\n",
3852 propname, ret);
3853 return ret;
3854 }
3855
3856 return 0;
3857}
3858EXPORT_SYMBOL_GPL(snd_soc_of_parse_card_name);
3859
3860static const struct snd_soc_dapm_widget simple_widgets[] = {
3861 SND_SOC_DAPM_MIC("Microphone", NULL),
3862 SND_SOC_DAPM_LINE("Line", NULL),
3863 SND_SOC_DAPM_HP("Headphone", NULL),
3864 SND_SOC_DAPM_SPK("Speaker", NULL),
3865};
3866
3867int snd_soc_of_parse_audio_simple_widgets(struct snd_soc_card *card,
3868 const char *propname)
3869{
3870 struct device_node *np = card->dev->of_node;
3871 struct snd_soc_dapm_widget *widgets;
3872 const char *template, *wname;
3873 int i, j, num_widgets, ret;
3874
3875 num_widgets = of_property_count_strings(np, propname);
3876 if (num_widgets < 0) {
3877 dev_err(card->dev,
3878 "ASoC: Property '%s' does not exist\n", propname);
3879 return -EINVAL;
3880 }
3881 if (num_widgets & 1) {
3882 dev_err(card->dev,
3883 "ASoC: Property '%s' length is not even\n", propname);
3884 return -EINVAL;
3885 }
3886
3887 num_widgets /= 2;
3888 if (!num_widgets) {
3889 dev_err(card->dev, "ASoC: Property '%s's length is zero\n",
3890 propname);
3891 return -EINVAL;
3892 }
3893
3894 widgets = devm_kcalloc(card->dev, num_widgets, sizeof(*widgets),
3895 GFP_KERNEL);
3896 if (!widgets) {
3897 dev_err(card->dev,
3898 "ASoC: Could not allocate memory for widgets\n");
3899 return -ENOMEM;
3900 }
3901
3902 for (i = 0; i < num_widgets; i++) {
3903 ret = of_property_read_string_index(np, propname,
3904 2 * i, &template);
3905 if (ret) {
3906 dev_err(card->dev,
3907 "ASoC: Property '%s' index %d read error:%d\n",
3908 propname, 2 * i, ret);
3909 return -EINVAL;
3910 }
3911
3912 for (j = 0; j < ARRAY_SIZE(simple_widgets); j++) {
3913 if (!strncmp(template, simple_widgets[j].name,
3914 strlen(simple_widgets[j].name))) {
3915 widgets[i] = simple_widgets[j];
3916 break;
3917 }
3918 }
3919
3920 if (j >= ARRAY_SIZE(simple_widgets)) {
3921 dev_err(card->dev,
3922 "ASoC: DAPM widget '%s' is not supported\n",
3923 template);
3924 return -EINVAL;
3925 }
3926
3927 ret = of_property_read_string_index(np, propname,
3928 (2 * i) + 1,
3929 &wname);
3930 if (ret) {
3931 dev_err(card->dev,
3932 "ASoC: Property '%s' index %d read error:%d\n",
3933 propname, (2 * i) + 1, ret);
3934 return -EINVAL;
3935 }
3936
3937 widgets[i].name = wname;
3938 }
3939
3940 card->of_dapm_widgets = widgets;
3941 card->num_of_dapm_widgets = num_widgets;
3942
3943 return 0;
3944}
3945EXPORT_SYMBOL_GPL(snd_soc_of_parse_audio_simple_widgets);
3946
3947static int snd_soc_of_get_slot_mask(struct device_node *np,
3948 const char *prop_name,
3949 unsigned int *mask)
3950{
3951 u32 val;
3952 const __be32 *of_slot_mask = of_get_property(np, prop_name, &val);
3953 int i;
3954
3955 if (!of_slot_mask)
3956 return 0;
3957 val /= sizeof(u32);
3958 for (i = 0; i < val; i++)
3959 if (be32_to_cpup(&of_slot_mask[i]))
3960 *mask |= (1 << i);
3961
3962 return val;
3963}
3964
3965int snd_soc_of_parse_tdm_slot(struct device_node *np,
3966 unsigned int *tx_mask,
3967 unsigned int *rx_mask,
3968 unsigned int *slots,
3969 unsigned int *slot_width)
3970{
3971 u32 val;
3972 int ret;
3973
3974 if (tx_mask)
3975 snd_soc_of_get_slot_mask(np, "dai-tdm-slot-tx-mask", tx_mask);
3976 if (rx_mask)
3977 snd_soc_of_get_slot_mask(np, "dai-tdm-slot-rx-mask", rx_mask);
3978
3979 if (of_property_read_bool(np, "dai-tdm-slot-num")) {
3980 ret = of_property_read_u32(np, "dai-tdm-slot-num", &val);
3981 if (ret)
3982 return ret;
3983
3984 if (slots)
3985 *slots = val;
3986 }
3987
3988 if (of_property_read_bool(np, "dai-tdm-slot-width")) {
3989 ret = of_property_read_u32(np, "dai-tdm-slot-width", &val);
3990 if (ret)
3991 return ret;
3992
3993 if (slot_width)
3994 *slot_width = val;
3995 }
3996
3997 return 0;
3998}
3999EXPORT_SYMBOL_GPL(snd_soc_of_parse_tdm_slot);
4000
4001void snd_soc_of_parse_audio_prefix(struct snd_soc_card *card,
4002 struct snd_soc_codec_conf *codec_conf,
4003 struct device_node *of_node,
4004 const char *propname)
4005{
4006 struct device_node *np = card->dev->of_node;
4007 const char *str;
4008 int ret;
4009
4010 ret = of_property_read_string(np, propname, &str);
4011 if (ret < 0) {
4012
4013 return;
4014 }
4015
4016 codec_conf->of_node = of_node;
4017 codec_conf->name_prefix = str;
4018}
4019EXPORT_SYMBOL_GPL(snd_soc_of_parse_audio_prefix);
4020
4021int snd_soc_of_parse_audio_routing(struct snd_soc_card *card,
4022 const char *propname)
4023{
4024 struct device_node *np = card->dev->of_node;
4025 int num_routes;
4026 struct snd_soc_dapm_route *routes;
4027 int i, ret;
4028
4029 num_routes = of_property_count_strings(np, propname);
4030 if (num_routes < 0 || num_routes & 1) {
4031 dev_err(card->dev,
4032 "ASoC: Property '%s' does not exist or its length is not even\n",
4033 propname);
4034 return -EINVAL;
4035 }
4036 num_routes /= 2;
4037 if (!num_routes) {
4038 dev_err(card->dev, "ASoC: Property '%s's length is zero\n",
4039 propname);
4040 return -EINVAL;
4041 }
4042
4043 routes = devm_kzalloc(card->dev, num_routes * sizeof(*routes),
4044 GFP_KERNEL);
4045 if (!routes) {
4046 dev_err(card->dev,
4047 "ASoC: Could not allocate DAPM route table\n");
4048 return -EINVAL;
4049 }
4050
4051 for (i = 0; i < num_routes; i++) {
4052 ret = of_property_read_string_index(np, propname,
4053 2 * i, &routes[i].sink);
4054 if (ret) {
4055 dev_err(card->dev,
4056 "ASoC: Property '%s' index %d could not be read: %d\n",
4057 propname, 2 * i, ret);
4058 return -EINVAL;
4059 }
4060 ret = of_property_read_string_index(np, propname,
4061 (2 * i) + 1, &routes[i].source);
4062 if (ret) {
4063 dev_err(card->dev,
4064 "ASoC: Property '%s' index %d could not be read: %d\n",
4065 propname, (2 * i) + 1, ret);
4066 return -EINVAL;
4067 }
4068 }
4069
4070 card->num_of_dapm_routes = num_routes;
4071 card->of_dapm_routes = routes;
4072
4073 return 0;
4074}
4075EXPORT_SYMBOL_GPL(snd_soc_of_parse_audio_routing);
4076
4077unsigned int snd_soc_of_parse_daifmt(struct device_node *np,
4078 const char *prefix,
4079 struct device_node **bitclkmaster,
4080 struct device_node **framemaster)
4081{
4082 int ret, i;
4083 char prop[128];
4084 unsigned int format = 0;
4085 int bit, frame;
4086 const char *str;
4087 struct {
4088 char *name;
4089 unsigned int val;
4090 } of_fmt_table[] = {
4091 { "i2s", SND_SOC_DAIFMT_I2S },
4092 { "right_j", SND_SOC_DAIFMT_RIGHT_J },
4093 { "left_j", SND_SOC_DAIFMT_LEFT_J },
4094 { "dsp_a", SND_SOC_DAIFMT_DSP_A },
4095 { "dsp_b", SND_SOC_DAIFMT_DSP_B },
4096 { "ac97", SND_SOC_DAIFMT_AC97 },
4097 { "pdm", SND_SOC_DAIFMT_PDM},
4098 { "msb", SND_SOC_DAIFMT_MSB },
4099 { "lsb", SND_SOC_DAIFMT_LSB },
4100 };
4101
4102 if (!prefix)
4103 prefix = "";
4104
4105
4106
4107
4108
4109
4110 ret = of_property_read_string(np, "dai-format", &str);
4111 if (ret < 0) {
4112 snprintf(prop, sizeof(prop), "%sformat", prefix);
4113 ret = of_property_read_string(np, prop, &str);
4114 }
4115 if (ret == 0) {
4116 for (i = 0; i < ARRAY_SIZE(of_fmt_table); i++) {
4117 if (strcmp(str, of_fmt_table[i].name) == 0) {
4118 format |= of_fmt_table[i].val;
4119 break;
4120 }
4121 }
4122 }
4123
4124
4125
4126
4127
4128 snprintf(prop, sizeof(prop), "%scontinuous-clock", prefix);
4129 if (of_property_read_bool(np, prop))
4130 format |= SND_SOC_DAIFMT_CONT;
4131 else
4132 format |= SND_SOC_DAIFMT_GATED;
4133
4134
4135
4136
4137
4138
4139 snprintf(prop, sizeof(prop), "%sbitclock-inversion", prefix);
4140 bit = !!of_get_property(np, prop, NULL);
4141
4142 snprintf(prop, sizeof(prop), "%sframe-inversion", prefix);
4143 frame = !!of_get_property(np, prop, NULL);
4144
4145 switch ((bit << 4) + frame) {
4146 case 0x11:
4147 format |= SND_SOC_DAIFMT_IB_IF;
4148 break;
4149 case 0x10:
4150 format |= SND_SOC_DAIFMT_IB_NF;
4151 break;
4152 case 0x01:
4153 format |= SND_SOC_DAIFMT_NB_IF;
4154 break;
4155 default:
4156
4157 break;
4158 }
4159
4160
4161
4162
4163
4164
4165 snprintf(prop, sizeof(prop), "%sbitclock-master", prefix);
4166 bit = !!of_get_property(np, prop, NULL);
4167 if (bit && bitclkmaster)
4168 *bitclkmaster = of_parse_phandle(np, prop, 0);
4169
4170 snprintf(prop, sizeof(prop), "%sframe-master", prefix);
4171 frame = !!of_get_property(np, prop, NULL);
4172 if (frame && framemaster)
4173 *framemaster = of_parse_phandle(np, prop, 0);
4174
4175 switch ((bit << 4) + frame) {
4176 case 0x11:
4177 format |= SND_SOC_DAIFMT_CBM_CFM;
4178 break;
4179 case 0x10:
4180 format |= SND_SOC_DAIFMT_CBM_CFS;
4181 break;
4182 case 0x01:
4183 format |= SND_SOC_DAIFMT_CBS_CFM;
4184 break;
4185 default:
4186 format |= SND_SOC_DAIFMT_CBS_CFS;
4187 break;
4188 }
4189
4190 return format;
4191}
4192EXPORT_SYMBOL_GPL(snd_soc_of_parse_daifmt);
4193
4194int snd_soc_get_dai_id(struct device_node *ep)
4195{
4196 struct snd_soc_component *pos;
4197 struct device_node *node;
4198 int ret;
4199
4200 node = of_graph_get_port_parent(ep);
4201
4202
4203
4204
4205
4206
4207
4208 ret = -ENOTSUPP;
4209 mutex_lock(&client_mutex);
4210 list_for_each_entry(pos, &component_list, list) {
4211 struct device_node *component_of_node = pos->dev->of_node;
4212
4213 if (!component_of_node && pos->dev->parent)
4214 component_of_node = pos->dev->parent->of_node;
4215
4216 if (component_of_node != node)
4217 continue;
4218
4219 if (pos->driver->of_xlate_dai_id)
4220 ret = pos->driver->of_xlate_dai_id(pos, ep);
4221
4222 break;
4223 }
4224 mutex_unlock(&client_mutex);
4225
4226 of_node_put(node);
4227
4228 return ret;
4229}
4230EXPORT_SYMBOL_GPL(snd_soc_get_dai_id);
4231
4232int snd_soc_get_dai_name(struct of_phandle_args *args,
4233 const char **dai_name)
4234{
4235 struct snd_soc_component *pos;
4236 struct device_node *component_of_node;
4237 int ret = -EPROBE_DEFER;
4238
4239 mutex_lock(&client_mutex);
4240 list_for_each_entry(pos, &component_list, list) {
4241 component_of_node = pos->dev->of_node;
4242 if (!component_of_node && pos->dev->parent)
4243 component_of_node = pos->dev->parent->of_node;
4244
4245 if (component_of_node != args->np)
4246 continue;
4247
4248 if (pos->driver->of_xlate_dai_name) {
4249 ret = pos->driver->of_xlate_dai_name(pos,
4250 args,
4251 dai_name);
4252 } else {
4253 int id = -1;
4254
4255 switch (args->args_count) {
4256 case 0:
4257 id = 0;
4258 break;
4259 case 1:
4260 id = args->args[0];
4261 break;
4262 default:
4263
4264 break;
4265 }
4266
4267 if (id < 0 || id >= pos->num_dai) {
4268 ret = -EINVAL;
4269 continue;
4270 }
4271
4272 ret = 0;
4273
4274 *dai_name = pos->dai_drv[id].name;
4275 if (!*dai_name)
4276 *dai_name = pos->name;
4277 }
4278
4279 break;
4280 }
4281 mutex_unlock(&client_mutex);
4282 return ret;
4283}
4284EXPORT_SYMBOL_GPL(snd_soc_get_dai_name);
4285
4286int snd_soc_of_get_dai_name(struct device_node *of_node,
4287 const char **dai_name)
4288{
4289 struct of_phandle_args args;
4290 int ret;
4291
4292 ret = of_parse_phandle_with_args(of_node, "sound-dai",
4293 "#sound-dai-cells", 0, &args);
4294 if (ret)
4295 return ret;
4296
4297 ret = snd_soc_get_dai_name(&args, dai_name);
4298
4299 of_node_put(args.np);
4300
4301 return ret;
4302}
4303EXPORT_SYMBOL_GPL(snd_soc_of_get_dai_name);
4304
4305
4306
4307
4308
4309
4310
4311
4312
4313
4314
4315
4316
4317
4318int snd_soc_of_get_dai_link_codecs(struct device *dev,
4319 struct device_node *of_node,
4320 struct snd_soc_dai_link *dai_link)
4321{
4322 struct of_phandle_args args;
4323 struct snd_soc_dai_link_component *component;
4324 char *name;
4325 int index, num_codecs, ret;
4326
4327
4328 name = "sound-dai";
4329 num_codecs = of_count_phandle_with_args(of_node, name,
4330 "#sound-dai-cells");
4331 if (num_codecs <= 0) {
4332 if (num_codecs == -ENOENT)
4333 dev_err(dev, "No 'sound-dai' property\n");
4334 else
4335 dev_err(dev, "Bad phandle in 'sound-dai'\n");
4336 return num_codecs;
4337 }
4338 component = devm_kzalloc(dev,
4339 sizeof *component * num_codecs,
4340 GFP_KERNEL);
4341 if (!component)
4342 return -ENOMEM;
4343 dai_link->codecs = component;
4344 dai_link->num_codecs = num_codecs;
4345
4346
4347 for (index = 0, component = dai_link->codecs;
4348 index < dai_link->num_codecs;
4349 index++, component++) {
4350 ret = of_parse_phandle_with_args(of_node, name,
4351 "#sound-dai-cells",
4352 index, &args);
4353 if (ret)
4354 goto err;
4355 component->of_node = args.np;
4356 ret = snd_soc_get_dai_name(&args, &component->dai_name);
4357 if (ret < 0)
4358 goto err;
4359 }
4360 return 0;
4361err:
4362 for (index = 0, component = dai_link->codecs;
4363 index < dai_link->num_codecs;
4364 index++, component++) {
4365 if (!component->of_node)
4366 break;
4367 of_node_put(component->of_node);
4368 component->of_node = NULL;
4369 }
4370 dai_link->codecs = NULL;
4371 dai_link->num_codecs = 0;
4372 return ret;
4373}
4374EXPORT_SYMBOL_GPL(snd_soc_of_get_dai_link_codecs);
4375
4376static int __init snd_soc_init(void)
4377{
4378 snd_soc_debugfs_init();
4379 snd_soc_util_init();
4380
4381 return platform_driver_register(&soc_driver);
4382}
4383module_init(snd_soc_init);
4384
4385static void __exit snd_soc_exit(void)
4386{
4387 snd_soc_util_exit();
4388 snd_soc_debugfs_exit();
4389
4390 platform_driver_unregister(&soc_driver);
4391}
4392module_exit(snd_soc_exit);
4393
4394
4395MODULE_AUTHOR("Liam Girdwood, lrg@slimlogic.co.uk");
4396MODULE_DESCRIPTION("ALSA SoC Core");
4397MODULE_LICENSE("GPL");
4398MODULE_ALIAS("platform:soc-audio");
4399