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