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 <linux/acpi.h>
35#include <sound/core.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/soc-link.h>
42#include <sound/initval.h>
43
44#define CREATE_TRACE_POINTS
45#include <trace/events/asoc.h>
46
47static DEFINE_MUTEX(client_mutex);
48static LIST_HEAD(component_list);
49static LIST_HEAD(unbind_card_list);
50
51#define for_each_component(component) \
52 list_for_each_entry(component, &component_list, list)
53
54
55
56
57
58struct snd_soc_dai_link_component null_dailink_component[0];
59EXPORT_SYMBOL_GPL(null_dailink_component);
60
61
62
63
64
65
66static int pmdown_time = 5000;
67module_param(pmdown_time, int, 0);
68MODULE_PARM_DESC(pmdown_time, "DAPM stream powerdown time (msecs)");
69
70static ssize_t pmdown_time_show(struct device *dev,
71 struct device_attribute *attr, char *buf)
72{
73 struct snd_soc_pcm_runtime *rtd = dev_get_drvdata(dev);
74
75 return sprintf(buf, "%ld\n", rtd->pmdown_time);
76}
77
78static ssize_t pmdown_time_set(struct device *dev,
79 struct device_attribute *attr,
80 const char *buf, size_t count)
81{
82 struct snd_soc_pcm_runtime *rtd = dev_get_drvdata(dev);
83 int ret;
84
85 ret = kstrtol(buf, 10, &rtd->pmdown_time);
86 if (ret)
87 return ret;
88
89 return count;
90}
91
92static DEVICE_ATTR(pmdown_time, 0644, pmdown_time_show, pmdown_time_set);
93
94static struct attribute *soc_dev_attrs[] = {
95 &dev_attr_pmdown_time.attr,
96 NULL
97};
98
99static umode_t soc_dev_attr_is_visible(struct kobject *kobj,
100 struct attribute *attr, int idx)
101{
102 struct device *dev = kobj_to_dev(kobj);
103 struct snd_soc_pcm_runtime *rtd = dev_get_drvdata(dev);
104
105 if (!rtd)
106 return 0;
107
108 if (attr == &dev_attr_pmdown_time.attr)
109 return attr->mode;
110 return rtd->num_codecs ? attr->mode : 0;
111}
112
113static const struct attribute_group soc_dapm_dev_group = {
114 .attrs = soc_dapm_dev_attrs,
115 .is_visible = soc_dev_attr_is_visible,
116};
117
118static const struct attribute_group soc_dev_group = {
119 .attrs = soc_dev_attrs,
120 .is_visible = soc_dev_attr_is_visible,
121};
122
123static const struct attribute_group *soc_dev_attr_groups[] = {
124 &soc_dapm_dev_group,
125 &soc_dev_group,
126 NULL
127};
128
129#ifdef CONFIG_DEBUG_FS
130struct dentry *snd_soc_debugfs_root;
131EXPORT_SYMBOL_GPL(snd_soc_debugfs_root);
132
133static void soc_init_component_debugfs(struct snd_soc_component *component)
134{
135 if (!component->card->debugfs_card_root)
136 return;
137
138 if (component->debugfs_prefix) {
139 char *name;
140
141 name = kasprintf(GFP_KERNEL, "%s:%s",
142 component->debugfs_prefix, component->name);
143 if (name) {
144 component->debugfs_root = debugfs_create_dir(name,
145 component->card->debugfs_card_root);
146 kfree(name);
147 }
148 } else {
149 component->debugfs_root = debugfs_create_dir(component->name,
150 component->card->debugfs_card_root);
151 }
152
153 snd_soc_dapm_debugfs_init(snd_soc_component_get_dapm(component),
154 component->debugfs_root);
155}
156
157static void soc_cleanup_component_debugfs(struct snd_soc_component *component)
158{
159 if (!component->debugfs_root)
160 return;
161 debugfs_remove_recursive(component->debugfs_root);
162 component->debugfs_root = NULL;
163}
164
165static int dai_list_show(struct seq_file *m, void *v)
166{
167 struct snd_soc_component *component;
168 struct snd_soc_dai *dai;
169
170 mutex_lock(&client_mutex);
171
172 for_each_component(component)
173 for_each_component_dais(component, dai)
174 seq_printf(m, "%s\n", dai->name);
175
176 mutex_unlock(&client_mutex);
177
178 return 0;
179}
180DEFINE_SHOW_ATTRIBUTE(dai_list);
181
182static int component_list_show(struct seq_file *m, void *v)
183{
184 struct snd_soc_component *component;
185
186 mutex_lock(&client_mutex);
187
188 for_each_component(component)
189 seq_printf(m, "%s\n", component->name);
190
191 mutex_unlock(&client_mutex);
192
193 return 0;
194}
195DEFINE_SHOW_ATTRIBUTE(component_list);
196
197static void soc_init_card_debugfs(struct snd_soc_card *card)
198{
199 card->debugfs_card_root = debugfs_create_dir(card->name,
200 snd_soc_debugfs_root);
201
202 debugfs_create_u32("dapm_pop_time", 0644, card->debugfs_card_root,
203 &card->pop_time);
204
205 snd_soc_dapm_debugfs_init(&card->dapm, card->debugfs_card_root);
206}
207
208static void soc_cleanup_card_debugfs(struct snd_soc_card *card)
209{
210 debugfs_remove_recursive(card->debugfs_card_root);
211 card->debugfs_card_root = NULL;
212}
213
214static void snd_soc_debugfs_init(void)
215{
216 snd_soc_debugfs_root = debugfs_create_dir("asoc", NULL);
217
218 debugfs_create_file("dais", 0444, snd_soc_debugfs_root, NULL,
219 &dai_list_fops);
220
221 debugfs_create_file("components", 0444, snd_soc_debugfs_root, NULL,
222 &component_list_fops);
223}
224
225static void snd_soc_debugfs_exit(void)
226{
227 debugfs_remove_recursive(snd_soc_debugfs_root);
228}
229
230#else
231
232static inline void soc_init_component_debugfs(
233 struct snd_soc_component *component)
234{
235}
236
237static inline void soc_cleanup_component_debugfs(
238 struct snd_soc_component *component)
239{
240}
241
242static inline void soc_init_card_debugfs(struct snd_soc_card *card)
243{
244}
245
246static inline void soc_cleanup_card_debugfs(struct snd_soc_card *card)
247{
248}
249
250static inline void snd_soc_debugfs_init(void)
251{
252}
253
254static inline void snd_soc_debugfs_exit(void)
255{
256}
257
258#endif
259
260static int snd_soc_rtd_add_component(struct snd_soc_pcm_runtime *rtd,
261 struct snd_soc_component *component)
262{
263 struct snd_soc_component *comp;
264 int i;
265
266 for_each_rtd_components(rtd, i, comp) {
267
268 if (comp == component)
269 return 0;
270 }
271
272
273 rtd->components[rtd->num_components] = component;
274 rtd->num_components++;
275
276 return 0;
277}
278
279struct snd_soc_component *snd_soc_rtdcom_lookup(struct snd_soc_pcm_runtime *rtd,
280 const char *driver_name)
281{
282 struct snd_soc_component *component;
283 int i;
284
285 if (!driver_name)
286 return NULL;
287
288
289
290
291
292
293
294
295
296 for_each_rtd_components(rtd, i, component) {
297 const char *component_name = component->driver->name;
298
299 if (!component_name)
300 continue;
301
302 if ((component_name == driver_name) ||
303 strcmp(component_name, driver_name) == 0)
304 return component;
305 }
306
307 return NULL;
308}
309EXPORT_SYMBOL_GPL(snd_soc_rtdcom_lookup);
310
311struct snd_soc_component
312*snd_soc_lookup_component_nolocked(struct device *dev, const char *driver_name)
313{
314 struct snd_soc_component *component;
315 struct snd_soc_component *found_component;
316
317 found_component = NULL;
318 for_each_component(component) {
319 if ((dev == component->dev) &&
320 (!driver_name ||
321 (driver_name == component->driver->name) ||
322 (strcmp(component->driver->name, driver_name) == 0))) {
323 found_component = component;
324 break;
325 }
326 }
327
328 return found_component;
329}
330EXPORT_SYMBOL_GPL(snd_soc_lookup_component_nolocked);
331
332struct snd_soc_component *snd_soc_lookup_component(struct device *dev,
333 const char *driver_name)
334{
335 struct snd_soc_component *component;
336
337 mutex_lock(&client_mutex);
338 component = snd_soc_lookup_component_nolocked(dev, driver_name);
339 mutex_unlock(&client_mutex);
340
341 return component;
342}
343EXPORT_SYMBOL_GPL(snd_soc_lookup_component);
344
345struct snd_soc_pcm_runtime
346*snd_soc_get_pcm_runtime(struct snd_soc_card *card,
347 struct snd_soc_dai_link *dai_link)
348{
349 struct snd_soc_pcm_runtime *rtd;
350
351 for_each_card_rtds(card, rtd) {
352 if (rtd->dai_link == dai_link)
353 return rtd;
354 }
355 dev_dbg(card->dev, "ASoC: failed to find rtd %s\n", dai_link->name);
356 return NULL;
357}
358EXPORT_SYMBOL_GPL(snd_soc_get_pcm_runtime);
359
360
361
362
363
364
365void snd_soc_close_delayed_work(struct snd_soc_pcm_runtime *rtd)
366{
367 struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0);
368 int playback = SNDRV_PCM_STREAM_PLAYBACK;
369
370 mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass);
371
372 dev_dbg(rtd->dev,
373 "ASoC: pop wq checking: %s status: %s waiting: %s\n",
374 codec_dai->driver->playback.stream_name,
375 snd_soc_dai_stream_active(codec_dai, playback) ?
376 "active" : "inactive",
377 rtd->pop_wait ? "yes" : "no");
378
379
380 if (rtd->pop_wait == 1) {
381 rtd->pop_wait = 0;
382 snd_soc_dapm_stream_event(rtd, playback,
383 SND_SOC_DAPM_STREAM_STOP);
384 }
385
386 mutex_unlock(&rtd->card->pcm_mutex);
387}
388EXPORT_SYMBOL_GPL(snd_soc_close_delayed_work);
389
390static void soc_release_rtd_dev(struct device *dev)
391{
392
393 kfree(dev);
394}
395
396static void soc_free_pcm_runtime(struct snd_soc_pcm_runtime *rtd)
397{
398 if (!rtd)
399 return;
400
401 list_del(&rtd->list);
402
403 if (delayed_work_pending(&rtd->delayed_work))
404 flush_delayed_work(&rtd->delayed_work);
405 snd_soc_pcm_component_free(rtd);
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425 device_unregister(rtd->dev);
426}
427
428static void close_delayed_work(struct work_struct *work) {
429 struct snd_soc_pcm_runtime *rtd =
430 container_of(work, struct snd_soc_pcm_runtime,
431 delayed_work.work);
432
433 if (rtd->close_delayed_work_func)
434 rtd->close_delayed_work_func(rtd);
435}
436
437static struct snd_soc_pcm_runtime *soc_new_pcm_runtime(
438 struct snd_soc_card *card, struct snd_soc_dai_link *dai_link)
439{
440 struct snd_soc_pcm_runtime *rtd;
441 struct snd_soc_component *component;
442 struct device *dev;
443 int ret;
444 int stream;
445
446
447
448
449 dev = kzalloc(sizeof(struct device), GFP_KERNEL);
450 if (!dev)
451 return NULL;
452
453 dev->parent = card->dev;
454 dev->release = soc_release_rtd_dev;
455
456 dev_set_name(dev, "%s", dai_link->name);
457
458 ret = device_register(dev);
459 if (ret < 0) {
460 put_device(dev);
461 return NULL;
462 }
463
464
465
466
467 rtd = devm_kzalloc(dev,
468 sizeof(*rtd) +
469 sizeof(*component) * (dai_link->num_cpus +
470 dai_link->num_codecs +
471 dai_link->num_platforms),
472 GFP_KERNEL);
473 if (!rtd) {
474 device_unregister(dev);
475 return NULL;
476 }
477
478 rtd->dev = dev;
479 INIT_LIST_HEAD(&rtd->list);
480 for_each_pcm_streams(stream) {
481 INIT_LIST_HEAD(&rtd->dpcm[stream].be_clients);
482 INIT_LIST_HEAD(&rtd->dpcm[stream].fe_clients);
483 }
484 dev_set_drvdata(dev, rtd);
485 INIT_DELAYED_WORK(&rtd->delayed_work, close_delayed_work);
486
487
488
489
490 rtd->dais = devm_kcalloc(dev, dai_link->num_cpus + dai_link->num_codecs,
491 sizeof(struct snd_soc_dai *),
492 GFP_KERNEL);
493 if (!rtd->dais)
494 goto free_rtd;
495
496
497
498
499
500
501
502
503
504 rtd->num_cpus = dai_link->num_cpus;
505 rtd->num_codecs = dai_link->num_codecs;
506 rtd->card = card;
507 rtd->dai_link = dai_link;
508 rtd->num = card->num_rtd++;
509
510
511 list_add_tail(&rtd->list, &card->rtd_list);
512
513 ret = device_add_groups(dev, soc_dev_attr_groups);
514 if (ret < 0)
515 goto free_rtd;
516
517 return rtd;
518
519free_rtd:
520 soc_free_pcm_runtime(rtd);
521 return NULL;
522}
523
524static void snd_soc_flush_all_delayed_work(struct snd_soc_card *card)
525{
526 struct snd_soc_pcm_runtime *rtd;
527
528 for_each_card_rtds(card, rtd)
529 flush_delayed_work(&rtd->delayed_work);
530}
531
532#ifdef CONFIG_PM_SLEEP
533static void soc_playback_digital_mute(struct snd_soc_card *card, int mute)
534{
535 struct snd_soc_pcm_runtime *rtd;
536 struct snd_soc_dai *dai;
537 int playback = SNDRV_PCM_STREAM_PLAYBACK;
538 int i;
539
540 for_each_card_rtds(card, rtd) {
541
542 if (rtd->dai_link->ignore_suspend)
543 continue;
544
545 for_each_rtd_dais(rtd, i, dai) {
546 if (snd_soc_dai_stream_active(dai, playback))
547 snd_soc_dai_digital_mute(dai, mute, playback);
548 }
549 }
550}
551
552static void soc_dapm_suspend_resume(struct snd_soc_card *card, int event)
553{
554 struct snd_soc_pcm_runtime *rtd;
555 int stream;
556
557 for_each_card_rtds(card, rtd) {
558
559 if (rtd->dai_link->ignore_suspend)
560 continue;
561
562 for_each_pcm_streams(stream)
563 snd_soc_dapm_stream_event(rtd, stream, event);
564 }
565}
566
567
568int snd_soc_suspend(struct device *dev)
569{
570 struct snd_soc_card *card = dev_get_drvdata(dev);
571 struct snd_soc_component *component;
572 struct snd_soc_pcm_runtime *rtd;
573 int i;
574
575
576 if (!card->instantiated)
577 return 0;
578
579
580
581
582
583 snd_power_wait(card->snd_card, SNDRV_CTL_POWER_D0);
584
585
586 snd_power_change_state(card->snd_card, SNDRV_CTL_POWER_D3hot);
587
588
589 soc_playback_digital_mute(card, 1);
590
591
592 for_each_card_rtds(card, rtd) {
593 if (rtd->dai_link->ignore_suspend)
594 continue;
595
596 snd_pcm_suspend_all(rtd->pcm);
597 }
598
599 snd_soc_card_suspend_pre(card);
600
601
602 snd_soc_flush_all_delayed_work(card);
603
604 soc_dapm_suspend_resume(card, SND_SOC_DAPM_STREAM_SUSPEND);
605
606
607 dapm_mark_endpoints_dirty(card);
608 snd_soc_dapm_sync(&card->dapm);
609
610
611 for_each_card_rtds(card, rtd) {
612
613 if (rtd->dai_link->ignore_suspend)
614 continue;
615
616 for_each_rtd_components(rtd, i, component) {
617 struct snd_soc_dapm_context *dapm =
618 snd_soc_component_get_dapm(component);
619
620
621
622
623 if (snd_soc_component_is_suspended(component))
624 continue;
625
626
627
628
629
630 switch (snd_soc_dapm_get_bias_level(dapm)) {
631 case SND_SOC_BIAS_STANDBY:
632
633
634
635
636
637
638 if (dapm->idle_bias_off) {
639 dev_dbg(component->dev,
640 "ASoC: idle_bias_off CODEC on over suspend\n");
641 break;
642 }
643 fallthrough;
644
645 case SND_SOC_BIAS_OFF:
646 snd_soc_component_suspend(component);
647 if (component->regmap)
648 regcache_mark_dirty(component->regmap);
649
650 pinctrl_pm_select_sleep_state(component->dev);
651 break;
652 default:
653 dev_dbg(component->dev,
654 "ASoC: COMPONENT is on over suspend\n");
655 break;
656 }
657 }
658 }
659
660 snd_soc_card_suspend_post(card);
661
662 return 0;
663}
664EXPORT_SYMBOL_GPL(snd_soc_suspend);
665
666
667
668
669
670static void soc_resume_deferred(struct work_struct *work)
671{
672 struct snd_soc_card *card =
673 container_of(work, struct snd_soc_card,
674 deferred_resume_work);
675 struct snd_soc_component *component;
676
677
678
679
680
681
682 dev_dbg(card->dev, "ASoC: starting resume work\n");
683
684
685 snd_power_change_state(card->snd_card, SNDRV_CTL_POWER_D2);
686
687 snd_soc_card_resume_pre(card);
688
689 for_each_card_components(card, component) {
690 if (snd_soc_component_is_suspended(component))
691 snd_soc_component_resume(component);
692 }
693
694 soc_dapm_suspend_resume(card, SND_SOC_DAPM_STREAM_RESUME);
695
696
697 soc_playback_digital_mute(card, 0);
698
699 snd_soc_card_resume_post(card);
700
701 dev_dbg(card->dev, "ASoC: resume work completed\n");
702
703
704 dapm_mark_endpoints_dirty(card);
705 snd_soc_dapm_sync(&card->dapm);
706
707
708 snd_power_change_state(card->snd_card, SNDRV_CTL_POWER_D0);
709}
710
711
712int snd_soc_resume(struct device *dev)
713{
714 struct snd_soc_card *card = dev_get_drvdata(dev);
715 struct snd_soc_component *component;
716
717
718 if (!card->instantiated)
719 return 0;
720
721
722 for_each_card_components(card, component)
723 if (snd_soc_component_active(component))
724 pinctrl_pm_select_default_state(component->dev);
725
726 dev_dbg(dev, "ASoC: Scheduling resume work\n");
727 if (!schedule_work(&card->deferred_resume_work))
728 dev_err(dev, "ASoC: resume work item may be lost\n");
729
730 return 0;
731}
732EXPORT_SYMBOL_GPL(snd_soc_resume);
733
734static void soc_resume_init(struct snd_soc_card *card)
735{
736
737 INIT_WORK(&card->deferred_resume_work, soc_resume_deferred);
738}
739#else
740#define snd_soc_suspend NULL
741#define snd_soc_resume NULL
742static inline void soc_resume_init(struct snd_soc_card *card)
743{
744}
745#endif
746
747static struct device_node
748*soc_component_to_node(struct snd_soc_component *component)
749{
750 struct device_node *of_node;
751
752 of_node = component->dev->of_node;
753 if (!of_node && component->dev->parent)
754 of_node = component->dev->parent->of_node;
755
756 return of_node;
757}
758
759static int snd_soc_is_matching_component(
760 const struct snd_soc_dai_link_component *dlc,
761 struct snd_soc_component *component)
762{
763 struct device_node *component_of_node;
764
765 if (!dlc)
766 return 0;
767
768 component_of_node = soc_component_to_node(component);
769
770 if (dlc->of_node && component_of_node != dlc->of_node)
771 return 0;
772 if (dlc->name && strcmp(component->name, dlc->name))
773 return 0;
774
775 return 1;
776}
777
778static struct snd_soc_component *soc_find_component(
779 const struct snd_soc_dai_link_component *dlc)
780{
781 struct snd_soc_component *component;
782
783 lockdep_assert_held(&client_mutex);
784
785
786
787
788
789
790
791
792
793 for_each_component(component)
794 if (snd_soc_is_matching_component(dlc, component))
795 return component;
796
797 return NULL;
798}
799
800
801
802
803
804
805
806
807
808
809
810
811struct snd_soc_dai *snd_soc_find_dai(
812 const struct snd_soc_dai_link_component *dlc)
813{
814 struct snd_soc_component *component;
815 struct snd_soc_dai *dai;
816
817 lockdep_assert_held(&client_mutex);
818
819
820 for_each_component(component) {
821 if (!snd_soc_is_matching_component(dlc, component))
822 continue;
823 for_each_component_dais(component, dai) {
824 if (dlc->dai_name && strcmp(dai->name, dlc->dai_name)
825 && (!dai->driver->name
826 || strcmp(dai->driver->name, dlc->dai_name)))
827 continue;
828
829 return dai;
830 }
831 }
832
833 return NULL;
834}
835EXPORT_SYMBOL_GPL(snd_soc_find_dai);
836
837struct snd_soc_dai *snd_soc_find_dai_with_mutex(
838 const struct snd_soc_dai_link_component *dlc)
839{
840 struct snd_soc_dai *dai;
841
842 mutex_lock(&client_mutex);
843 dai = snd_soc_find_dai(dlc);
844 mutex_unlock(&client_mutex);
845
846 return dai;
847}
848EXPORT_SYMBOL_GPL(snd_soc_find_dai_with_mutex);
849
850static int soc_dai_link_sanity_check(struct snd_soc_card *card,
851 struct snd_soc_dai_link *link)
852{
853 int i;
854 struct snd_soc_dai_link_component *cpu, *codec, *platform;
855
856 for_each_link_codecs(link, i, codec) {
857
858
859
860
861 if (!!codec->name == !!codec->of_node) {
862 dev_err(card->dev, "ASoC: Neither/both codec name/of_node are set for %s\n",
863 link->name);
864 return -EINVAL;
865 }
866
867
868 if (!codec->dai_name) {
869 dev_err(card->dev, "ASoC: codec_dai_name not set for %s\n",
870 link->name);
871 return -EINVAL;
872 }
873
874
875
876
877
878 if (!soc_find_component(codec)) {
879 dev_dbg(card->dev,
880 "ASoC: codec component %s not found for link %s\n",
881 codec->name, link->name);
882 return -EPROBE_DEFER;
883 }
884 }
885
886 for_each_link_platforms(link, i, platform) {
887
888
889
890
891
892 if (!!platform->name == !!platform->of_node) {
893 dev_err(card->dev,
894 "ASoC: Neither/both platform name/of_node are set for %s\n",
895 link->name);
896 return -EINVAL;
897 }
898
899
900
901
902
903 if (!soc_find_component(platform)) {
904 dev_dbg(card->dev,
905 "ASoC: platform component %s not found for link %s\n",
906 platform->name, link->name);
907 return -EPROBE_DEFER;
908 }
909 }
910
911 for_each_link_cpus(link, i, cpu) {
912
913
914
915
916
917 if (cpu->name && cpu->of_node) {
918 dev_err(card->dev,
919 "ASoC: Neither/both cpu name/of_node are set for %s\n",
920 link->name);
921 return -EINVAL;
922 }
923
924
925
926
927
928 if ((cpu->of_node || cpu->name) &&
929 !soc_find_component(cpu)) {
930 dev_dbg(card->dev,
931 "ASoC: cpu component %s not found for link %s\n",
932 cpu->name, link->name);
933 return -EPROBE_DEFER;
934 }
935
936
937
938
939
940 if (!cpu->dai_name &&
941 !(cpu->name || cpu->of_node)) {
942 dev_err(card->dev,
943 "ASoC: Neither cpu_dai_name nor cpu_name/of_node are set for %s\n",
944 link->name);
945 return -EINVAL;
946 }
947 }
948
949 return 0;
950}
951
952
953
954
955
956
957
958
959void snd_soc_remove_pcm_runtime(struct snd_soc_card *card,
960 struct snd_soc_pcm_runtime *rtd)
961{
962 lockdep_assert_held(&client_mutex);
963
964
965 snd_soc_link_exit(rtd);
966
967
968
969
970 snd_soc_card_remove_dai_link(card, rtd->dai_link);
971
972 soc_free_pcm_runtime(rtd);
973}
974EXPORT_SYMBOL_GPL(snd_soc_remove_pcm_runtime);
975
976
977
978
979
980
981
982
983
984
985
986
987int snd_soc_add_pcm_runtime(struct snd_soc_card *card,
988 struct snd_soc_dai_link *dai_link)
989{
990 struct snd_soc_pcm_runtime *rtd;
991 struct snd_soc_dai_link_component *codec, *platform, *cpu;
992 struct snd_soc_component *component;
993 int i, ret;
994
995 lockdep_assert_held(&client_mutex);
996
997
998
999
1000 ret = snd_soc_card_add_dai_link(card, dai_link);
1001 if (ret < 0)
1002 return ret;
1003
1004 if (dai_link->ignore)
1005 return 0;
1006
1007 dev_dbg(card->dev, "ASoC: binding %s\n", dai_link->name);
1008
1009 ret = soc_dai_link_sanity_check(card, dai_link);
1010 if (ret < 0)
1011 return ret;
1012
1013 rtd = soc_new_pcm_runtime(card, dai_link);
1014 if (!rtd)
1015 return -ENOMEM;
1016
1017 for_each_link_cpus(dai_link, i, cpu) {
1018 asoc_rtd_to_cpu(rtd, i) = snd_soc_find_dai(cpu);
1019 if (!asoc_rtd_to_cpu(rtd, i)) {
1020 dev_info(card->dev, "ASoC: CPU DAI %s not registered\n",
1021 cpu->dai_name);
1022 goto _err_defer;
1023 }
1024 snd_soc_rtd_add_component(rtd, asoc_rtd_to_cpu(rtd, i)->component);
1025 }
1026
1027
1028 for_each_link_codecs(dai_link, i, codec) {
1029 asoc_rtd_to_codec(rtd, i) = snd_soc_find_dai(codec);
1030 if (!asoc_rtd_to_codec(rtd, i)) {
1031 dev_info(card->dev, "ASoC: CODEC DAI %s not registered\n",
1032 codec->dai_name);
1033 goto _err_defer;
1034 }
1035
1036 snd_soc_rtd_add_component(rtd, asoc_rtd_to_codec(rtd, i)->component);
1037 }
1038
1039
1040 for_each_link_platforms(dai_link, i, platform) {
1041 for_each_component(component) {
1042 if (!snd_soc_is_matching_component(platform, component))
1043 continue;
1044
1045 snd_soc_rtd_add_component(rtd, component);
1046 }
1047 }
1048
1049 return 0;
1050
1051_err_defer:
1052 snd_soc_remove_pcm_runtime(card, rtd);
1053 return -EPROBE_DEFER;
1054}
1055EXPORT_SYMBOL_GPL(snd_soc_add_pcm_runtime);
1056
1057static int soc_init_pcm_runtime(struct snd_soc_card *card,
1058 struct snd_soc_pcm_runtime *rtd)
1059{
1060 struct snd_soc_dai_link *dai_link = rtd->dai_link;
1061 struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0);
1062 struct snd_soc_component *component;
1063 int ret, num, i;
1064
1065
1066 rtd->pmdown_time = pmdown_time;
1067
1068
1069 ret = snd_soc_link_init(rtd);
1070 if (ret < 0)
1071 return ret;
1072
1073 if (dai_link->dai_fmt) {
1074 ret = snd_soc_runtime_set_dai_fmt(rtd, dai_link->dai_fmt);
1075 if (ret)
1076 return ret;
1077 }
1078
1079
1080 soc_dpcm_debugfs_add(rtd);
1081
1082 num = rtd->num;
1083
1084
1085
1086
1087
1088
1089 for_each_rtd_components(rtd, i, component) {
1090 if (!component->driver->use_dai_pcm_id)
1091 continue;
1092
1093 if (rtd->dai_link->no_pcm)
1094 num += component->driver->be_pcm_base;
1095 else
1096 num = rtd->dai_link->id;
1097 }
1098
1099
1100 ret = snd_soc_dai_compress_new(cpu_dai, rtd, num);
1101 if (ret != -ENOTSUPP)
1102 return ret;
1103
1104
1105 ret = soc_new_pcm(rtd, num);
1106 if (ret < 0) {
1107 dev_err(card->dev, "ASoC: can't create pcm %s :%d\n",
1108 dai_link->stream_name, ret);
1109 return ret;
1110 }
1111
1112 return snd_soc_pcm_dai_new(rtd);
1113}
1114
1115static void soc_set_name_prefix(struct snd_soc_card *card,
1116 struct snd_soc_component *component)
1117{
1118 struct device_node *of_node = soc_component_to_node(component);
1119 const char *str;
1120 int ret, i;
1121
1122 for (i = 0; i < card->num_configs; i++) {
1123 struct snd_soc_codec_conf *map = &card->codec_conf[i];
1124
1125 if (snd_soc_is_matching_component(&map->dlc, component) &&
1126 map->name_prefix) {
1127 component->name_prefix = map->name_prefix;
1128 return;
1129 }
1130 }
1131
1132
1133
1134
1135
1136 ret = of_property_read_string(of_node, "sound-name-prefix", &str);
1137 if (ret < 0)
1138 return;
1139
1140 component->name_prefix = str;
1141}
1142
1143static void soc_remove_component(struct snd_soc_component *component,
1144 int probed)
1145{
1146
1147 if (!component->card)
1148 return;
1149
1150 if (probed)
1151 snd_soc_component_remove(component);
1152
1153
1154 snd_soc_component_set_jack(component, NULL, NULL);
1155
1156 list_del_init(&component->card_list);
1157 snd_soc_dapm_free(snd_soc_component_get_dapm(component));
1158 soc_cleanup_component_debugfs(component);
1159 component->card = NULL;
1160 snd_soc_component_module_put_when_remove(component);
1161}
1162
1163static int soc_probe_component(struct snd_soc_card *card,
1164 struct snd_soc_component *component)
1165{
1166 struct snd_soc_dapm_context *dapm =
1167 snd_soc_component_get_dapm(component);
1168 struct snd_soc_dai *dai;
1169 int probed = 0;
1170 int ret;
1171
1172 if (snd_soc_component_is_dummy(component))
1173 return 0;
1174
1175 if (component->card) {
1176 if (component->card != card) {
1177 dev_err(component->dev,
1178 "Trying to bind component to card \"%s\" but is already bound to card \"%s\"\n",
1179 card->name, component->card->name);
1180 return -ENODEV;
1181 }
1182 return 0;
1183 }
1184
1185 ret = snd_soc_component_module_get_when_probe(component);
1186 if (ret < 0)
1187 return ret;
1188
1189 component->card = card;
1190 soc_set_name_prefix(card, component);
1191
1192 soc_init_component_debugfs(component);
1193
1194 snd_soc_dapm_init(dapm, card, component);
1195
1196 ret = snd_soc_dapm_new_controls(dapm,
1197 component->driver->dapm_widgets,
1198 component->driver->num_dapm_widgets);
1199
1200 if (ret != 0) {
1201 dev_err(component->dev,
1202 "Failed to create new controls %d\n", ret);
1203 goto err_probe;
1204 }
1205
1206 for_each_component_dais(component, dai) {
1207 ret = snd_soc_dapm_new_dai_widgets(dapm, dai);
1208 if (ret != 0) {
1209 dev_err(component->dev,
1210 "Failed to create DAI widgets %d\n", ret);
1211 goto err_probe;
1212 }
1213 }
1214
1215 ret = snd_soc_component_probe(component);
1216 if (ret < 0)
1217 goto err_probe;
1218
1219 WARN(dapm->idle_bias_off &&
1220 dapm->bias_level != SND_SOC_BIAS_OFF,
1221 "codec %s can not start from non-off bias with idle_bias_off==1\n",
1222 component->name);
1223 probed = 1;
1224
1225
1226
1227
1228
1229
1230 ret = snd_soc_component_init(component);
1231 if (ret < 0)
1232 goto err_probe;
1233
1234 ret = snd_soc_add_component_controls(component,
1235 component->driver->controls,
1236 component->driver->num_controls);
1237 if (ret < 0)
1238 goto err_probe;
1239
1240 ret = snd_soc_dapm_add_routes(dapm,
1241 component->driver->dapm_routes,
1242 component->driver->num_dapm_routes);
1243 if (ret < 0) {
1244 if (card->disable_route_checks) {
1245 dev_info(card->dev,
1246 "%s: disable_route_checks set, ignoring errors on add_routes\n",
1247 __func__);
1248 } else {
1249 dev_err(card->dev,
1250 "%s: snd_soc_dapm_add_routes failed: %d\n",
1251 __func__, ret);
1252 goto err_probe;
1253 }
1254 }
1255
1256
1257 list_add(&component->card_list, &card->component_dev_list);
1258
1259err_probe:
1260 if (ret < 0)
1261 soc_remove_component(component, probed);
1262
1263 return ret;
1264}
1265
1266static void soc_remove_link_dais(struct snd_soc_card *card)
1267{
1268 struct snd_soc_pcm_runtime *rtd;
1269 int order;
1270
1271 for_each_comp_order(order) {
1272 for_each_card_rtds(card, rtd) {
1273
1274 snd_soc_pcm_dai_remove(rtd, order);
1275 }
1276 }
1277}
1278
1279static int soc_probe_link_dais(struct snd_soc_card *card)
1280{
1281 struct snd_soc_pcm_runtime *rtd;
1282 int order, ret;
1283
1284 for_each_comp_order(order) {
1285 for_each_card_rtds(card, rtd) {
1286
1287 dev_dbg(card->dev,
1288 "ASoC: probe %s dai link %d late %d\n",
1289 card->name, rtd->num, order);
1290
1291
1292 ret = snd_soc_pcm_dai_probe(rtd, order);
1293 if (ret)
1294 return ret;
1295 }
1296 }
1297
1298 return 0;
1299}
1300
1301static void soc_remove_link_components(struct snd_soc_card *card)
1302{
1303 struct snd_soc_component *component;
1304 struct snd_soc_pcm_runtime *rtd;
1305 int i, order;
1306
1307 for_each_comp_order(order) {
1308 for_each_card_rtds(card, rtd) {
1309 for_each_rtd_components(rtd, i, component) {
1310 if (component->driver->remove_order != order)
1311 continue;
1312
1313 soc_remove_component(component, 1);
1314 }
1315 }
1316 }
1317}
1318
1319static int soc_probe_link_components(struct snd_soc_card *card)
1320{
1321 struct snd_soc_component *component;
1322 struct snd_soc_pcm_runtime *rtd;
1323 int i, ret, order;
1324
1325 for_each_comp_order(order) {
1326 for_each_card_rtds(card, rtd) {
1327 for_each_rtd_components(rtd, i, component) {
1328 if (component->driver->probe_order != order)
1329 continue;
1330
1331 ret = soc_probe_component(card, component);
1332 if (ret < 0)
1333 return ret;
1334 }
1335 }
1336 }
1337
1338 return 0;
1339}
1340
1341static void soc_unbind_aux_dev(struct snd_soc_card *card)
1342{
1343 struct snd_soc_component *component, *_component;
1344
1345 for_each_card_auxs_safe(card, component, _component) {
1346
1347 snd_soc_component_set_aux(component, NULL);
1348 list_del(&component->card_aux_list);
1349 }
1350}
1351
1352static int soc_bind_aux_dev(struct snd_soc_card *card)
1353{
1354 struct snd_soc_component *component;
1355 struct snd_soc_aux_dev *aux;
1356 int i;
1357
1358 for_each_card_pre_auxs(card, i, aux) {
1359
1360 component = soc_find_component(&aux->dlc);
1361 if (!component)
1362 return -EPROBE_DEFER;
1363
1364
1365 snd_soc_component_set_aux(component, aux);
1366
1367 list_add(&component->card_aux_list, &card->aux_comp_list);
1368 }
1369 return 0;
1370}
1371
1372static int soc_probe_aux_devices(struct snd_soc_card *card)
1373{
1374 struct snd_soc_component *component;
1375 int order;
1376 int ret;
1377
1378 for_each_comp_order(order) {
1379 for_each_card_auxs(card, component) {
1380 if (component->driver->probe_order != order)
1381 continue;
1382
1383 ret = soc_probe_component(card, component);
1384 if (ret < 0)
1385 return ret;
1386 }
1387 }
1388
1389 return 0;
1390}
1391
1392static void soc_remove_aux_devices(struct snd_soc_card *card)
1393{
1394 struct snd_soc_component *comp, *_comp;
1395 int order;
1396
1397 for_each_comp_order(order) {
1398 for_each_card_auxs_safe(card, comp, _comp) {
1399 if (comp->driver->remove_order == order)
1400 soc_remove_component(comp, 1);
1401 }
1402 }
1403}
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418int snd_soc_runtime_set_dai_fmt(struct snd_soc_pcm_runtime *rtd,
1419 unsigned int dai_fmt)
1420{
1421 struct snd_soc_dai *cpu_dai;
1422 struct snd_soc_dai *codec_dai;
1423 unsigned int inv_dai_fmt;
1424 unsigned int i;
1425 int ret;
1426
1427 for_each_rtd_codec_dais(rtd, i, codec_dai) {
1428 ret = snd_soc_dai_set_fmt(codec_dai, dai_fmt);
1429 if (ret != 0 && ret != -ENOTSUPP)
1430 return ret;
1431 }
1432
1433
1434
1435
1436
1437 inv_dai_fmt = dai_fmt & ~SND_SOC_DAIFMT_MASTER_MASK;
1438 switch (dai_fmt & SND_SOC_DAIFMT_MASTER_MASK) {
1439 case SND_SOC_DAIFMT_CBM_CFM:
1440 inv_dai_fmt |= SND_SOC_DAIFMT_CBS_CFS;
1441 break;
1442 case SND_SOC_DAIFMT_CBM_CFS:
1443 inv_dai_fmt |= SND_SOC_DAIFMT_CBS_CFM;
1444 break;
1445 case SND_SOC_DAIFMT_CBS_CFM:
1446 inv_dai_fmt |= SND_SOC_DAIFMT_CBM_CFS;
1447 break;
1448 case SND_SOC_DAIFMT_CBS_CFS:
1449 inv_dai_fmt |= SND_SOC_DAIFMT_CBM_CFM;
1450 break;
1451 }
1452 for_each_rtd_cpu_dais(rtd, i, cpu_dai) {
1453 unsigned int fmt = dai_fmt;
1454
1455 if (cpu_dai->component->driver->non_legacy_dai_naming)
1456 fmt = inv_dai_fmt;
1457
1458 ret = snd_soc_dai_set_fmt(cpu_dai, fmt);
1459 if (ret != 0 && ret != -ENOTSUPP)
1460 return ret;
1461 }
1462
1463 return 0;
1464}
1465EXPORT_SYMBOL_GPL(snd_soc_runtime_set_dai_fmt);
1466
1467#ifdef CONFIG_DMI
1468
1469
1470
1471
1472
1473static const char * const dmi_blacklist[] = {
1474 "To be filled by OEM",
1475 "TBD by OEM",
1476 "Default String",
1477 "Board Manufacturer",
1478 "Board Vendor Name",
1479 "Board Product Name",
1480 NULL,
1481};
1482
1483
1484
1485
1486
1487
1488static void cleanup_dmi_name(char *name)
1489{
1490 int i, j = 0;
1491
1492 for (i = 0; name[i]; i++) {
1493 if (isalnum(name[i]) || (name[i] == '.')
1494 || (name[i] == '_'))
1495 name[j++] = name[i];
1496 else if (name[i] == '-')
1497 name[j++] = '_';
1498 }
1499
1500 name[j] = '\0';
1501}
1502
1503
1504
1505
1506
1507static int is_dmi_valid(const char *field)
1508{
1509 int i = 0;
1510
1511 while (dmi_blacklist[i]) {
1512 if (strstr(field, dmi_blacklist[i]))
1513 return 0;
1514 i++;
1515 }
1516
1517 return 1;
1518}
1519
1520
1521
1522
1523static void append_dmi_string(struct snd_soc_card *card, const char *str)
1524{
1525 char *dst = card->dmi_longname;
1526 size_t dst_len = sizeof(card->dmi_longname);
1527 size_t len;
1528
1529 len = strlen(dst);
1530 snprintf(dst + len, dst_len - len, "-%s", str);
1531
1532 len++;
1533 if (len < dst_len)
1534 cleanup_dmi_name(dst + len);
1535}
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568int snd_soc_set_dmi_name(struct snd_soc_card *card, const char *flavour)
1569{
1570 const char *vendor, *product, *product_version, *board;
1571
1572 if (card->long_name)
1573 return 0;
1574
1575 if (!dmi_available)
1576 return 0;
1577
1578
1579 vendor = dmi_get_system_info(DMI_BOARD_VENDOR);
1580 if (!vendor || !is_dmi_valid(vendor)) {
1581 dev_warn(card->dev, "ASoC: no DMI vendor name!\n");
1582 return 0;
1583 }
1584
1585 snprintf(card->dmi_longname, sizeof(card->dmi_longname), "%s", vendor);
1586 cleanup_dmi_name(card->dmi_longname);
1587
1588 product = dmi_get_system_info(DMI_PRODUCT_NAME);
1589 if (product && is_dmi_valid(product)) {
1590 append_dmi_string(card, product);
1591
1592
1593
1594
1595
1596 product_version = dmi_get_system_info(DMI_PRODUCT_VERSION);
1597 if (product_version && is_dmi_valid(product_version))
1598 append_dmi_string(card, product_version);
1599 }
1600
1601 board = dmi_get_system_info(DMI_BOARD_NAME);
1602 if (board && is_dmi_valid(board)) {
1603 if (!product || strcasecmp(board, product))
1604 append_dmi_string(card, board);
1605 } else if (!product) {
1606
1607 dev_warn(card->dev, "ASoC: no DMI board/product name!\n");
1608 return 0;
1609 }
1610
1611
1612 if (flavour)
1613 append_dmi_string(card, flavour);
1614
1615
1616 card->long_name = card->dmi_longname;
1617
1618 return 0;
1619}
1620EXPORT_SYMBOL_GPL(snd_soc_set_dmi_name);
1621#endif
1622
1623static void soc_check_tplg_fes(struct snd_soc_card *card)
1624{
1625 struct snd_soc_component *component;
1626 const struct snd_soc_component_driver *comp_drv;
1627 struct snd_soc_dai_link *dai_link;
1628 int i;
1629
1630 for_each_component(component) {
1631
1632
1633 if (!component->driver->ignore_machine)
1634 continue;
1635
1636
1637 if (!strcmp(component->driver->ignore_machine,
1638 card->dev->driver->name))
1639 goto match;
1640 if (strcmp(component->driver->ignore_machine,
1641 dev_name(card->dev)))
1642 continue;
1643match:
1644
1645 for_each_card_prelinks(card, i, dai_link) {
1646
1647
1648 if (dai_link->dynamic) {
1649 dai_link->ignore = true;
1650 continue;
1651 }
1652
1653 dev_dbg(card->dev, "info: override BE DAI link %s\n",
1654 card->dai_link[i].name);
1655
1656
1657 if (!dai_link->platforms) {
1658 dev_err(card->dev, "init platform error");
1659 continue;
1660 }
1661
1662 if (component->dev->of_node)
1663 dai_link->platforms->of_node = component->dev->of_node;
1664 else
1665 dai_link->platforms->name = component->name;
1666
1667
1668 if (!dai_link->no_pcm) {
1669 dai_link->no_pcm = 1;
1670
1671 if (dai_link->dpcm_playback)
1672 dev_warn(card->dev,
1673 "invalid configuration, dailink %s has flags no_pcm=0 and dpcm_playback=1\n",
1674 dai_link->name);
1675 if (dai_link->dpcm_capture)
1676 dev_warn(card->dev,
1677 "invalid configuration, dailink %s has flags no_pcm=0 and dpcm_capture=1\n",
1678 dai_link->name);
1679
1680
1681 if (!(dai_link->dpcm_playback ||
1682 dai_link->dpcm_capture)) {
1683 dai_link->dpcm_playback = !dai_link->capture_only;
1684 dai_link->dpcm_capture = !dai_link->playback_only;
1685 }
1686 }
1687
1688
1689
1690
1691
1692
1693 dai_link->be_hw_params_fixup =
1694 component->driver->be_hw_params_fixup;
1695
1696
1697
1698
1699
1700 if (!dai_link->stream_name)
1701 dai_link->stream_name = dai_link->name;
1702 }
1703
1704
1705 if (component->driver->topology_name_prefix) {
1706
1707
1708 if (!card->topology_shortname_created) {
1709 comp_drv = component->driver;
1710
1711 snprintf(card->topology_shortname, 32, "%s-%s",
1712 comp_drv->topology_name_prefix,
1713 card->name);
1714 card->topology_shortname_created = true;
1715 }
1716
1717
1718 card->name = card->topology_shortname;
1719 }
1720 }
1721}
1722
1723#define soc_setup_card_name(name, name1, name2, norm) \
1724 __soc_setup_card_name(name, sizeof(name), name1, name2, norm)
1725static void __soc_setup_card_name(char *name, int len,
1726 const char *name1, const char *name2,
1727 int normalization)
1728{
1729 int i;
1730
1731 snprintf(name, len, "%s", name1 ? name1 : name2);
1732
1733 if (!normalization)
1734 return;
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745 for (i = 0; i < len; i++) {
1746 switch (name[i]) {
1747 case '_':
1748 case '-':
1749 case '\0':
1750 break;
1751 default:
1752 if (!isalnum(name[i]))
1753 name[i] = '_';
1754 break;
1755 }
1756 }
1757}
1758
1759static void soc_cleanup_card_resources(struct snd_soc_card *card)
1760{
1761 struct snd_soc_pcm_runtime *rtd, *n;
1762
1763 if (card->snd_card)
1764 snd_card_disconnect_sync(card->snd_card);
1765
1766 snd_soc_dapm_shutdown(card);
1767
1768
1769 soc_remove_link_dais(card);
1770 soc_remove_link_components(card);
1771
1772 for_each_card_rtds_safe(card, rtd, n)
1773 snd_soc_remove_pcm_runtime(card, rtd);
1774
1775
1776 soc_remove_aux_devices(card);
1777 soc_unbind_aux_dev(card);
1778
1779 snd_soc_dapm_free(&card->dapm);
1780 soc_cleanup_card_debugfs(card);
1781
1782
1783 snd_soc_card_remove(card);
1784
1785 if (card->snd_card) {
1786 snd_card_free(card->snd_card);
1787 card->snd_card = NULL;
1788 }
1789}
1790
1791static void snd_soc_unbind_card(struct snd_soc_card *card, bool unregister)
1792{
1793 if (card->instantiated) {
1794 card->instantiated = false;
1795 snd_soc_flush_all_delayed_work(card);
1796
1797 soc_cleanup_card_resources(card);
1798 if (!unregister)
1799 list_add(&card->list, &unbind_card_list);
1800 } else {
1801 if (unregister)
1802 list_del(&card->list);
1803 }
1804}
1805
1806static int snd_soc_bind_card(struct snd_soc_card *card)
1807{
1808 struct snd_soc_pcm_runtime *rtd;
1809 struct snd_soc_component *component;
1810 struct snd_soc_dai_link *dai_link;
1811 int ret, i;
1812
1813 mutex_lock(&client_mutex);
1814 mutex_lock_nested(&card->mutex, SND_SOC_CARD_CLASS_INIT);
1815
1816 snd_soc_dapm_init(&card->dapm, card, NULL);
1817
1818
1819 soc_check_tplg_fes(card);
1820
1821
1822 ret = soc_bind_aux_dev(card);
1823 if (ret < 0)
1824 goto probe_end;
1825
1826
1827 card->num_rtd = 0;
1828 for_each_card_prelinks(card, i, dai_link) {
1829 ret = snd_soc_add_pcm_runtime(card, dai_link);
1830 if (ret < 0)
1831 goto probe_end;
1832 }
1833
1834
1835 ret = snd_card_new(card->dev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1,
1836 card->owner, 0, &card->snd_card);
1837 if (ret < 0) {
1838 dev_err(card->dev,
1839 "ASoC: can't create sound card for card %s: %d\n",
1840 card->name, ret);
1841 goto probe_end;
1842 }
1843
1844 soc_init_card_debugfs(card);
1845
1846 soc_resume_init(card);
1847
1848 ret = snd_soc_dapm_new_controls(&card->dapm, card->dapm_widgets,
1849 card->num_dapm_widgets);
1850 if (ret < 0)
1851 goto probe_end;
1852
1853 ret = snd_soc_dapm_new_controls(&card->dapm, card->of_dapm_widgets,
1854 card->num_of_dapm_widgets);
1855 if (ret < 0)
1856 goto probe_end;
1857
1858
1859 ret = snd_soc_card_probe(card);
1860 if (ret < 0)
1861 goto probe_end;
1862
1863
1864 ret = soc_probe_link_components(card);
1865 if (ret < 0) {
1866 dev_err(card->dev,
1867 "ASoC: failed to instantiate card %d\n", ret);
1868 goto probe_end;
1869 }
1870
1871
1872 ret = soc_probe_aux_devices(card);
1873 if (ret < 0) {
1874 dev_err(card->dev,
1875 "ASoC: failed to probe aux component %d\n", ret);
1876 goto probe_end;
1877 }
1878
1879
1880 ret = soc_probe_link_dais(card);
1881 if (ret < 0) {
1882 dev_err(card->dev,
1883 "ASoC: failed to instantiate card %d\n", ret);
1884 goto probe_end;
1885 }
1886
1887 for_each_card_rtds(card, rtd) {
1888 ret = soc_init_pcm_runtime(card, rtd);
1889 if (ret < 0)
1890 goto probe_end;
1891 }
1892
1893 snd_soc_dapm_link_dai_widgets(card);
1894 snd_soc_dapm_connect_dai_link_widgets(card);
1895
1896 ret = snd_soc_add_card_controls(card, card->controls,
1897 card->num_controls);
1898 if (ret < 0)
1899 goto probe_end;
1900
1901 ret = snd_soc_dapm_add_routes(&card->dapm, card->dapm_routes,
1902 card->num_dapm_routes);
1903 if (ret < 0) {
1904 if (card->disable_route_checks) {
1905 dev_info(card->dev,
1906 "%s: disable_route_checks set, ignoring errors on add_routes\n",
1907 __func__);
1908 } else {
1909 dev_err(card->dev,
1910 "%s: snd_soc_dapm_add_routes failed: %d\n",
1911 __func__, ret);
1912 goto probe_end;
1913 }
1914 }
1915
1916 ret = snd_soc_dapm_add_routes(&card->dapm, card->of_dapm_routes,
1917 card->num_of_dapm_routes);
1918 if (ret < 0)
1919 goto probe_end;
1920
1921
1922 snd_soc_set_dmi_name(card, NULL);
1923
1924 soc_setup_card_name(card->snd_card->shortname,
1925 card->name, NULL, 0);
1926 soc_setup_card_name(card->snd_card->longname,
1927 card->long_name, card->name, 0);
1928 soc_setup_card_name(card->snd_card->driver,
1929 card->driver_name, card->name, 1);
1930
1931 if (card->components) {
1932
1933
1934
1935
1936 ret = snd_component_add(card->snd_card, card->components);
1937 if (ret < 0) {
1938 dev_err(card->dev, "ASoC: %s snd_component_add() failed: %d\n",
1939 card->name, ret);
1940 goto probe_end;
1941 }
1942 }
1943
1944 ret = snd_soc_card_late_probe(card);
1945 if (ret < 0)
1946 goto probe_end;
1947
1948 snd_soc_dapm_new_widgets(card);
1949
1950 ret = snd_card_register(card->snd_card);
1951 if (ret < 0) {
1952 dev_err(card->dev, "ASoC: failed to register soundcard %d\n",
1953 ret);
1954 goto probe_end;
1955 }
1956
1957 card->instantiated = 1;
1958 dapm_mark_endpoints_dirty(card);
1959 snd_soc_dapm_sync(&card->dapm);
1960
1961
1962 for_each_card_components(card, component)
1963 if (!snd_soc_component_active(component))
1964 pinctrl_pm_select_sleep_state(component->dev);
1965
1966probe_end:
1967 if (ret < 0)
1968 soc_cleanup_card_resources(card);
1969
1970 mutex_unlock(&card->mutex);
1971 mutex_unlock(&client_mutex);
1972
1973 return ret;
1974}
1975
1976
1977static int soc_probe(struct platform_device *pdev)
1978{
1979 struct snd_soc_card *card = platform_get_drvdata(pdev);
1980
1981
1982
1983
1984
1985 if (!card)
1986 return -EINVAL;
1987
1988 dev_warn(&pdev->dev,
1989 "ASoC: machine %s should use snd_soc_register_card()\n",
1990 card->name);
1991
1992
1993 card->dev = &pdev->dev;
1994
1995 return devm_snd_soc_register_card(&pdev->dev, card);
1996}
1997
1998int snd_soc_poweroff(struct device *dev)
1999{
2000 struct snd_soc_card *card = dev_get_drvdata(dev);
2001 struct snd_soc_component *component;
2002
2003 if (!card->instantiated)
2004 return 0;
2005
2006
2007
2008
2009
2010 snd_soc_flush_all_delayed_work(card);
2011
2012 snd_soc_dapm_shutdown(card);
2013
2014
2015 for_each_card_components(card, component)
2016 pinctrl_pm_select_sleep_state(component->dev);
2017
2018 return 0;
2019}
2020EXPORT_SYMBOL_GPL(snd_soc_poweroff);
2021
2022const struct dev_pm_ops snd_soc_pm_ops = {
2023 .suspend = snd_soc_suspend,
2024 .resume = snd_soc_resume,
2025 .freeze = snd_soc_suspend,
2026 .thaw = snd_soc_resume,
2027 .poweroff = snd_soc_poweroff,
2028 .restore = snd_soc_resume,
2029};
2030EXPORT_SYMBOL_GPL(snd_soc_pm_ops);
2031
2032
2033static struct platform_driver soc_driver = {
2034 .driver = {
2035 .name = "soc-audio",
2036 .pm = &snd_soc_pm_ops,
2037 },
2038 .probe = soc_probe,
2039};
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052struct snd_kcontrol *snd_soc_cnew(const struct snd_kcontrol_new *_template,
2053 void *data, const char *long_name,
2054 const char *prefix)
2055{
2056 struct snd_kcontrol_new template;
2057 struct snd_kcontrol *kcontrol;
2058 char *name = NULL;
2059
2060 memcpy(&template, _template, sizeof(template));
2061 template.index = 0;
2062
2063 if (!long_name)
2064 long_name = template.name;
2065
2066 if (prefix) {
2067 name = kasprintf(GFP_KERNEL, "%s %s", prefix, long_name);
2068 if (!name)
2069 return NULL;
2070
2071 template.name = name;
2072 } else {
2073 template.name = long_name;
2074 }
2075
2076 kcontrol = snd_ctl_new1(&template, data);
2077
2078 kfree(name);
2079
2080 return kcontrol;
2081}
2082EXPORT_SYMBOL_GPL(snd_soc_cnew);
2083
2084static int snd_soc_add_controls(struct snd_card *card, struct device *dev,
2085 const struct snd_kcontrol_new *controls, int num_controls,
2086 const char *prefix, void *data)
2087{
2088 int err, i;
2089
2090 for (i = 0; i < num_controls; i++) {
2091 const struct snd_kcontrol_new *control = &controls[i];
2092
2093 err = snd_ctl_add(card, snd_soc_cnew(control, data,
2094 control->name, prefix));
2095 if (err < 0) {
2096 dev_err(dev, "ASoC: Failed to add %s: %d\n",
2097 control->name, err);
2098 return err;
2099 }
2100 }
2101
2102 return 0;
2103}
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114int snd_soc_add_component_controls(struct snd_soc_component *component,
2115 const struct snd_kcontrol_new *controls, unsigned int num_controls)
2116{
2117 struct snd_card *card = component->card->snd_card;
2118
2119 return snd_soc_add_controls(card, component->dev, controls,
2120 num_controls, component->name_prefix, component);
2121}
2122EXPORT_SYMBOL_GPL(snd_soc_add_component_controls);
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134int snd_soc_add_card_controls(struct snd_soc_card *soc_card,
2135 const struct snd_kcontrol_new *controls, int num_controls)
2136{
2137 struct snd_card *card = soc_card->snd_card;
2138
2139 return snd_soc_add_controls(card, soc_card->dev, controls, num_controls,
2140 NULL, soc_card);
2141}
2142EXPORT_SYMBOL_GPL(snd_soc_add_card_controls);
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154int snd_soc_add_dai_controls(struct snd_soc_dai *dai,
2155 const struct snd_kcontrol_new *controls, int num_controls)
2156{
2157 struct snd_card *card = dai->component->card->snd_card;
2158
2159 return snd_soc_add_controls(card, dai->dev, controls, num_controls,
2160 NULL, dai);
2161}
2162EXPORT_SYMBOL_GPL(snd_soc_add_dai_controls);
2163
2164
2165
2166
2167
2168
2169
2170int snd_soc_register_card(struct snd_soc_card *card)
2171{
2172 if (!card->name || !card->dev)
2173 return -EINVAL;
2174
2175 dev_set_drvdata(card->dev, card);
2176
2177 INIT_LIST_HEAD(&card->widgets);
2178 INIT_LIST_HEAD(&card->paths);
2179 INIT_LIST_HEAD(&card->dapm_list);
2180 INIT_LIST_HEAD(&card->aux_comp_list);
2181 INIT_LIST_HEAD(&card->component_dev_list);
2182 INIT_LIST_HEAD(&card->list);
2183 INIT_LIST_HEAD(&card->rtd_list);
2184 INIT_LIST_HEAD(&card->dapm_dirty);
2185 INIT_LIST_HEAD(&card->dobj_list);
2186
2187 card->instantiated = 0;
2188 mutex_init(&card->mutex);
2189 mutex_init(&card->dapm_mutex);
2190 mutex_init(&card->pcm_mutex);
2191 spin_lock_init(&card->dpcm_lock);
2192
2193 return snd_soc_bind_card(card);
2194}
2195EXPORT_SYMBOL_GPL(snd_soc_register_card);
2196
2197
2198
2199
2200
2201
2202
2203int snd_soc_unregister_card(struct snd_soc_card *card)
2204{
2205 mutex_lock(&client_mutex);
2206 snd_soc_unbind_card(card, true);
2207 mutex_unlock(&client_mutex);
2208 dev_dbg(card->dev, "ASoC: Unregistered card '%s'\n", card->name);
2209
2210 return 0;
2211}
2212EXPORT_SYMBOL_GPL(snd_soc_unregister_card);
2213
2214
2215
2216
2217
2218static char *fmt_single_name(struct device *dev, int *id)
2219{
2220 const char *devname = dev_name(dev);
2221 char *found, *name;
2222 unsigned int id1, id2;
2223
2224 if (devname == NULL)
2225 return NULL;
2226
2227 name = devm_kstrdup(dev, devname, GFP_KERNEL);
2228 if (!name)
2229 return NULL;
2230
2231
2232 found = strstr(name, dev->driver->name);
2233 if (found) {
2234
2235 if (sscanf(&found[strlen(dev->driver->name)], ".%d", id) == 1) {
2236
2237
2238 if (*id == -1)
2239 found[strlen(dev->driver->name)] = '\0';
2240 }
2241
2242
2243 } else if (sscanf(name, "%x-%x", &id1, &id2) == 2) {
2244
2245
2246 *id = ((id1 & 0xffff) << 16) + id2;
2247
2248 devm_kfree(dev, name);
2249
2250
2251 name = devm_kasprintf(dev, GFP_KERNEL, "%s.%s", dev->driver->name, devname);
2252 } else {
2253 *id = 0;
2254 }
2255
2256 return name;
2257}
2258
2259
2260
2261
2262
2263static inline char *fmt_multiple_name(struct device *dev,
2264 struct snd_soc_dai_driver *dai_drv)
2265{
2266 if (dai_drv->name == NULL) {
2267 dev_err(dev,
2268 "ASoC: error - multiple DAI %s registered with no name\n",
2269 dev_name(dev));
2270 return NULL;
2271 }
2272
2273 return devm_kstrdup(dev, dai_drv->name, GFP_KERNEL);
2274}
2275
2276void snd_soc_unregister_dai(struct snd_soc_dai *dai)
2277{
2278 dev_dbg(dai->dev, "ASoC: Unregistered DAI '%s'\n", dai->name);
2279 list_del(&dai->list);
2280}
2281EXPORT_SYMBOL_GPL(snd_soc_unregister_dai);
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295struct snd_soc_dai *snd_soc_register_dai(struct snd_soc_component *component,
2296 struct snd_soc_dai_driver *dai_drv,
2297 bool legacy_dai_naming)
2298{
2299 struct device *dev = component->dev;
2300 struct snd_soc_dai *dai;
2301
2302 dev_dbg(dev, "ASoC: dynamically register DAI %s\n", dev_name(dev));
2303
2304 lockdep_assert_held(&client_mutex);
2305
2306 dai = devm_kzalloc(dev, sizeof(*dai), GFP_KERNEL);
2307 if (dai == NULL)
2308 return NULL;
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318 if (legacy_dai_naming &&
2319 (dai_drv->id == 0 || dai_drv->name == NULL)) {
2320 dai->name = fmt_single_name(dev, &dai->id);
2321 } else {
2322 dai->name = fmt_multiple_name(dev, dai_drv);
2323 if (dai_drv->id)
2324 dai->id = dai_drv->id;
2325 else
2326 dai->id = component->num_dai;
2327 }
2328 if (!dai->name)
2329 return NULL;
2330
2331 dai->component = component;
2332 dai->dev = dev;
2333 dai->driver = dai_drv;
2334
2335
2336 list_add_tail(&dai->list, &component->dai_list);
2337 component->num_dai++;
2338
2339 dev_dbg(dev, "ASoC: Registered DAI '%s'\n", dai->name);
2340 return dai;
2341}
2342
2343
2344
2345
2346
2347
2348static void snd_soc_unregister_dais(struct snd_soc_component *component)
2349{
2350 struct snd_soc_dai *dai, *_dai;
2351
2352 for_each_component_dais_safe(component, dai, _dai)
2353 snd_soc_unregister_dai(dai);
2354}
2355
2356
2357
2358
2359
2360
2361
2362
2363static int snd_soc_register_dais(struct snd_soc_component *component,
2364 struct snd_soc_dai_driver *dai_drv,
2365 size_t count)
2366{
2367 struct snd_soc_dai *dai;
2368 unsigned int i;
2369 int ret;
2370
2371 for (i = 0; i < count; i++) {
2372 dai = snd_soc_register_dai(component, dai_drv + i, count == 1 &&
2373 !component->driver->non_legacy_dai_naming);
2374 if (dai == NULL) {
2375 ret = -ENOMEM;
2376 goto err;
2377 }
2378 }
2379
2380 return 0;
2381
2382err:
2383 snd_soc_unregister_dais(component);
2384
2385 return ret;
2386}
2387
2388#define ENDIANNESS_MAP(name) \
2389 (SNDRV_PCM_FMTBIT_##name##LE | SNDRV_PCM_FMTBIT_##name##BE)
2390static u64 endianness_format_map[] = {
2391 ENDIANNESS_MAP(S16_),
2392 ENDIANNESS_MAP(U16_),
2393 ENDIANNESS_MAP(S24_),
2394 ENDIANNESS_MAP(U24_),
2395 ENDIANNESS_MAP(S32_),
2396 ENDIANNESS_MAP(U32_),
2397 ENDIANNESS_MAP(S24_3),
2398 ENDIANNESS_MAP(U24_3),
2399 ENDIANNESS_MAP(S20_3),
2400 ENDIANNESS_MAP(U20_3),
2401 ENDIANNESS_MAP(S18_3),
2402 ENDIANNESS_MAP(U18_3),
2403 ENDIANNESS_MAP(FLOAT_),
2404 ENDIANNESS_MAP(FLOAT64_),
2405 ENDIANNESS_MAP(IEC958_SUBFRAME_),
2406};
2407
2408
2409
2410
2411
2412
2413
2414static void convert_endianness_formats(struct snd_soc_pcm_stream *stream)
2415{
2416 int i;
2417
2418 for (i = 0; i < ARRAY_SIZE(endianness_format_map); i++)
2419 if (stream->formats & endianness_format_map[i])
2420 stream->formats |= endianness_format_map[i];
2421}
2422
2423static void snd_soc_try_rebind_card(void)
2424{
2425 struct snd_soc_card *card, *c;
2426
2427 list_for_each_entry_safe(card, c, &unbind_card_list, list)
2428 if (!snd_soc_bind_card(card))
2429 list_del(&card->list);
2430}
2431
2432static void snd_soc_del_component_unlocked(struct snd_soc_component *component)
2433{
2434 struct snd_soc_card *card = component->card;
2435
2436 snd_soc_unregister_dais(component);
2437
2438 if (card)
2439 snd_soc_unbind_card(card, false);
2440
2441 list_del(&component->list);
2442}
2443
2444int snd_soc_component_initialize(struct snd_soc_component *component,
2445 const struct snd_soc_component_driver *driver,
2446 struct device *dev)
2447{
2448 INIT_LIST_HEAD(&component->dai_list);
2449 INIT_LIST_HEAD(&component->dobj_list);
2450 INIT_LIST_HEAD(&component->card_list);
2451 mutex_init(&component->io_mutex);
2452
2453 component->name = fmt_single_name(dev, &component->id);
2454 if (!component->name) {
2455 dev_err(dev, "ASoC: Failed to allocate name\n");
2456 return -ENOMEM;
2457 }
2458
2459 component->dev = dev;
2460 component->driver = driver;
2461
2462 return 0;
2463}
2464EXPORT_SYMBOL_GPL(snd_soc_component_initialize);
2465
2466int snd_soc_add_component(struct snd_soc_component *component,
2467 struct snd_soc_dai_driver *dai_drv,
2468 int num_dai)
2469{
2470 int ret;
2471 int i;
2472
2473 mutex_lock(&client_mutex);
2474
2475 if (component->driver->endianness) {
2476 for (i = 0; i < num_dai; i++) {
2477 convert_endianness_formats(&dai_drv[i].playback);
2478 convert_endianness_formats(&dai_drv[i].capture);
2479 }
2480 }
2481
2482 ret = snd_soc_register_dais(component, dai_drv, num_dai);
2483 if (ret < 0) {
2484 dev_err(component->dev, "ASoC: Failed to register DAIs: %d\n",
2485 ret);
2486 goto err_cleanup;
2487 }
2488
2489 if (!component->driver->write && !component->driver->read) {
2490 if (!component->regmap)
2491 component->regmap = dev_get_regmap(component->dev,
2492 NULL);
2493 if (component->regmap)
2494 snd_soc_component_setup_regmap(component);
2495 }
2496
2497
2498 list_add(&component->list, &component_list);
2499
2500err_cleanup:
2501 if (ret < 0)
2502 snd_soc_del_component_unlocked(component);
2503
2504 mutex_unlock(&client_mutex);
2505
2506 if (ret == 0)
2507 snd_soc_try_rebind_card();
2508
2509 return ret;
2510}
2511EXPORT_SYMBOL_GPL(snd_soc_add_component);
2512
2513int snd_soc_register_component(struct device *dev,
2514 const struct snd_soc_component_driver *component_driver,
2515 struct snd_soc_dai_driver *dai_drv,
2516 int num_dai)
2517{
2518 struct snd_soc_component *component;
2519 int ret;
2520
2521 component = devm_kzalloc(dev, sizeof(*component), GFP_KERNEL);
2522 if (!component)
2523 return -ENOMEM;
2524
2525 ret = snd_soc_component_initialize(component, component_driver, dev);
2526 if (ret < 0)
2527 return ret;
2528
2529 return snd_soc_add_component(component, dai_drv, num_dai);
2530}
2531EXPORT_SYMBOL_GPL(snd_soc_register_component);
2532
2533
2534
2535
2536
2537
2538
2539
2540void snd_soc_unregister_component_by_driver(struct device *dev,
2541 const struct snd_soc_component_driver *component_driver)
2542{
2543 struct snd_soc_component *component;
2544
2545 if (!component_driver)
2546 return;
2547
2548 mutex_lock(&client_mutex);
2549 component = snd_soc_lookup_component_nolocked(dev, component_driver->name);
2550 if (!component)
2551 goto out;
2552
2553 snd_soc_del_component_unlocked(component);
2554
2555out:
2556 mutex_unlock(&client_mutex);
2557}
2558EXPORT_SYMBOL_GPL(snd_soc_unregister_component_by_driver);
2559
2560
2561
2562
2563
2564
2565
2566void snd_soc_unregister_component(struct device *dev)
2567{
2568 struct snd_soc_component *component;
2569
2570 mutex_lock(&client_mutex);
2571 while (1) {
2572 component = snd_soc_lookup_component_nolocked(dev, NULL);
2573 if (!component)
2574 break;
2575
2576 snd_soc_del_component_unlocked(component);
2577 }
2578 mutex_unlock(&client_mutex);
2579}
2580EXPORT_SYMBOL_GPL(snd_soc_unregister_component);
2581
2582
2583int snd_soc_of_parse_card_name(struct snd_soc_card *card,
2584 const char *propname)
2585{
2586 struct device_node *np;
2587 int ret;
2588
2589 if (!card->dev) {
2590 pr_err("card->dev is not set before calling %s\n", __func__);
2591 return -EINVAL;
2592 }
2593
2594 np = card->dev->of_node;
2595
2596 ret = of_property_read_string_index(np, propname, 0, &card->name);
2597
2598
2599
2600
2601
2602 if (ret < 0 && ret != -EINVAL) {
2603 dev_err(card->dev,
2604 "ASoC: Property '%s' could not be read: %d\n",
2605 propname, ret);
2606 return ret;
2607 }
2608
2609 return 0;
2610}
2611EXPORT_SYMBOL_GPL(snd_soc_of_parse_card_name);
2612
2613static const struct snd_soc_dapm_widget simple_widgets[] = {
2614 SND_SOC_DAPM_MIC("Microphone", NULL),
2615 SND_SOC_DAPM_LINE("Line", NULL),
2616 SND_SOC_DAPM_HP("Headphone", NULL),
2617 SND_SOC_DAPM_SPK("Speaker", NULL),
2618};
2619
2620int snd_soc_of_parse_audio_simple_widgets(struct snd_soc_card *card,
2621 const char *propname)
2622{
2623 struct device_node *np = card->dev->of_node;
2624 struct snd_soc_dapm_widget *widgets;
2625 const char *template, *wname;
2626 int i, j, num_widgets, ret;
2627
2628 num_widgets = of_property_count_strings(np, propname);
2629 if (num_widgets < 0) {
2630 dev_err(card->dev,
2631 "ASoC: Property '%s' does not exist\n", propname);
2632 return -EINVAL;
2633 }
2634 if (num_widgets & 1) {
2635 dev_err(card->dev,
2636 "ASoC: Property '%s' length is not even\n", propname);
2637 return -EINVAL;
2638 }
2639
2640 num_widgets /= 2;
2641 if (!num_widgets) {
2642 dev_err(card->dev, "ASoC: Property '%s's length is zero\n",
2643 propname);
2644 return -EINVAL;
2645 }
2646
2647 widgets = devm_kcalloc(card->dev, num_widgets, sizeof(*widgets),
2648 GFP_KERNEL);
2649 if (!widgets) {
2650 dev_err(card->dev,
2651 "ASoC: Could not allocate memory for widgets\n");
2652 return -ENOMEM;
2653 }
2654
2655 for (i = 0; i < num_widgets; i++) {
2656 ret = of_property_read_string_index(np, propname,
2657 2 * i, &template);
2658 if (ret) {
2659 dev_err(card->dev,
2660 "ASoC: Property '%s' index %d read error:%d\n",
2661 propname, 2 * i, ret);
2662 return -EINVAL;
2663 }
2664
2665 for (j = 0; j < ARRAY_SIZE(simple_widgets); j++) {
2666 if (!strncmp(template, simple_widgets[j].name,
2667 strlen(simple_widgets[j].name))) {
2668 widgets[i] = simple_widgets[j];
2669 break;
2670 }
2671 }
2672
2673 if (j >= ARRAY_SIZE(simple_widgets)) {
2674 dev_err(card->dev,
2675 "ASoC: DAPM widget '%s' is not supported\n",
2676 template);
2677 return -EINVAL;
2678 }
2679
2680 ret = of_property_read_string_index(np, propname,
2681 (2 * i) + 1,
2682 &wname);
2683 if (ret) {
2684 dev_err(card->dev,
2685 "ASoC: Property '%s' index %d read error:%d\n",
2686 propname, (2 * i) + 1, ret);
2687 return -EINVAL;
2688 }
2689
2690 widgets[i].name = wname;
2691 }
2692
2693 card->of_dapm_widgets = widgets;
2694 card->num_of_dapm_widgets = num_widgets;
2695
2696 return 0;
2697}
2698EXPORT_SYMBOL_GPL(snd_soc_of_parse_audio_simple_widgets);
2699
2700int snd_soc_of_get_slot_mask(struct device_node *np,
2701 const char *prop_name,
2702 unsigned int *mask)
2703{
2704 u32 val;
2705 const __be32 *of_slot_mask = of_get_property(np, prop_name, &val);
2706 int i;
2707
2708 if (!of_slot_mask)
2709 return 0;
2710 val /= sizeof(u32);
2711 for (i = 0; i < val; i++)
2712 if (be32_to_cpup(&of_slot_mask[i]))
2713 *mask |= (1 << i);
2714
2715 return val;
2716}
2717EXPORT_SYMBOL_GPL(snd_soc_of_get_slot_mask);
2718
2719int snd_soc_of_parse_tdm_slot(struct device_node *np,
2720 unsigned int *tx_mask,
2721 unsigned int *rx_mask,
2722 unsigned int *slots,
2723 unsigned int *slot_width)
2724{
2725 u32 val;
2726 int ret;
2727
2728 if (tx_mask)
2729 snd_soc_of_get_slot_mask(np, "dai-tdm-slot-tx-mask", tx_mask);
2730 if (rx_mask)
2731 snd_soc_of_get_slot_mask(np, "dai-tdm-slot-rx-mask", rx_mask);
2732
2733 if (of_property_read_bool(np, "dai-tdm-slot-num")) {
2734 ret = of_property_read_u32(np, "dai-tdm-slot-num", &val);
2735 if (ret)
2736 return ret;
2737
2738 if (slots)
2739 *slots = val;
2740 }
2741
2742 if (of_property_read_bool(np, "dai-tdm-slot-width")) {
2743 ret = of_property_read_u32(np, "dai-tdm-slot-width", &val);
2744 if (ret)
2745 return ret;
2746
2747 if (slot_width)
2748 *slot_width = val;
2749 }
2750
2751 return 0;
2752}
2753EXPORT_SYMBOL_GPL(snd_soc_of_parse_tdm_slot);
2754
2755void snd_soc_of_parse_node_prefix(struct device_node *np,
2756 struct snd_soc_codec_conf *codec_conf,
2757 struct device_node *of_node,
2758 const char *propname)
2759{
2760 const char *str;
2761 int ret;
2762
2763 ret = of_property_read_string(np, propname, &str);
2764 if (ret < 0) {
2765
2766 return;
2767 }
2768
2769 codec_conf->dlc.of_node = of_node;
2770 codec_conf->name_prefix = str;
2771}
2772EXPORT_SYMBOL_GPL(snd_soc_of_parse_node_prefix);
2773
2774int snd_soc_of_parse_audio_routing(struct snd_soc_card *card,
2775 const char *propname)
2776{
2777 struct device_node *np = card->dev->of_node;
2778 int num_routes;
2779 struct snd_soc_dapm_route *routes;
2780 int i, ret;
2781
2782 num_routes = of_property_count_strings(np, propname);
2783 if (num_routes < 0 || num_routes & 1) {
2784 dev_err(card->dev,
2785 "ASoC: Property '%s' does not exist or its length is not even\n",
2786 propname);
2787 return -EINVAL;
2788 }
2789 num_routes /= 2;
2790
2791 routes = devm_kcalloc(card->dev, num_routes, sizeof(*routes),
2792 GFP_KERNEL);
2793 if (!routes) {
2794 dev_err(card->dev,
2795 "ASoC: Could not allocate DAPM route table\n");
2796 return -ENOMEM;
2797 }
2798
2799 for (i = 0; i < num_routes; i++) {
2800 ret = of_property_read_string_index(np, propname,
2801 2 * i, &routes[i].sink);
2802 if (ret) {
2803 dev_err(card->dev,
2804 "ASoC: Property '%s' index %d could not be read: %d\n",
2805 propname, 2 * i, ret);
2806 return -EINVAL;
2807 }
2808 ret = of_property_read_string_index(np, propname,
2809 (2 * i) + 1, &routes[i].source);
2810 if (ret) {
2811 dev_err(card->dev,
2812 "ASoC: Property '%s' index %d could not be read: %d\n",
2813 propname, (2 * i) + 1, ret);
2814 return -EINVAL;
2815 }
2816 }
2817
2818 card->num_of_dapm_routes = num_routes;
2819 card->of_dapm_routes = routes;
2820
2821 return 0;
2822}
2823EXPORT_SYMBOL_GPL(snd_soc_of_parse_audio_routing);
2824
2825int snd_soc_of_parse_aux_devs(struct snd_soc_card *card, const char *propname)
2826{
2827 struct device_node *node = card->dev->of_node;
2828 struct snd_soc_aux_dev *aux;
2829 int num, i;
2830
2831 num = of_count_phandle_with_args(node, propname, NULL);
2832 if (num == -ENOENT) {
2833 return 0;
2834 } else if (num < 0) {
2835 dev_err(card->dev, "ASOC: Property '%s' could not be read: %d\n",
2836 propname, num);
2837 return num;
2838 }
2839
2840 aux = devm_kcalloc(card->dev, num, sizeof(*aux), GFP_KERNEL);
2841 if (!aux)
2842 return -ENOMEM;
2843 card->aux_dev = aux;
2844 card->num_aux_devs = num;
2845
2846 for_each_card_pre_auxs(card, i, aux) {
2847 aux->dlc.of_node = of_parse_phandle(node, propname, i);
2848 if (!aux->dlc.of_node)
2849 return -EINVAL;
2850 }
2851
2852 return 0;
2853}
2854EXPORT_SYMBOL_GPL(snd_soc_of_parse_aux_devs);
2855
2856unsigned int snd_soc_of_parse_daifmt(struct device_node *np,
2857 const char *prefix,
2858 struct device_node **bitclkmaster,
2859 struct device_node **framemaster)
2860{
2861 int ret, i;
2862 char prop[128];
2863 unsigned int format = 0;
2864 int bit, frame;
2865 const char *str;
2866 struct {
2867 char *name;
2868 unsigned int val;
2869 } of_fmt_table[] = {
2870 { "i2s", SND_SOC_DAIFMT_I2S },
2871 { "right_j", SND_SOC_DAIFMT_RIGHT_J },
2872 { "left_j", SND_SOC_DAIFMT_LEFT_J },
2873 { "dsp_a", SND_SOC_DAIFMT_DSP_A },
2874 { "dsp_b", SND_SOC_DAIFMT_DSP_B },
2875 { "ac97", SND_SOC_DAIFMT_AC97 },
2876 { "pdm", SND_SOC_DAIFMT_PDM},
2877 { "msb", SND_SOC_DAIFMT_MSB },
2878 { "lsb", SND_SOC_DAIFMT_LSB },
2879 };
2880
2881 if (!prefix)
2882 prefix = "";
2883
2884
2885
2886
2887
2888
2889 ret = of_property_read_string(np, "dai-format", &str);
2890 if (ret < 0) {
2891 snprintf(prop, sizeof(prop), "%sformat", prefix);
2892 ret = of_property_read_string(np, prop, &str);
2893 }
2894 if (ret == 0) {
2895 for (i = 0; i < ARRAY_SIZE(of_fmt_table); i++) {
2896 if (strcmp(str, of_fmt_table[i].name) == 0) {
2897 format |= of_fmt_table[i].val;
2898 break;
2899 }
2900 }
2901 }
2902
2903
2904
2905
2906
2907 snprintf(prop, sizeof(prop), "%scontinuous-clock", prefix);
2908 if (of_property_read_bool(np, prop))
2909 format |= SND_SOC_DAIFMT_CONT;
2910 else
2911 format |= SND_SOC_DAIFMT_GATED;
2912
2913
2914
2915
2916
2917
2918 snprintf(prop, sizeof(prop), "%sbitclock-inversion", prefix);
2919 bit = !!of_get_property(np, prop, NULL);
2920
2921 snprintf(prop, sizeof(prop), "%sframe-inversion", prefix);
2922 frame = !!of_get_property(np, prop, NULL);
2923
2924 switch ((bit << 4) + frame) {
2925 case 0x11:
2926 format |= SND_SOC_DAIFMT_IB_IF;
2927 break;
2928 case 0x10:
2929 format |= SND_SOC_DAIFMT_IB_NF;
2930 break;
2931 case 0x01:
2932 format |= SND_SOC_DAIFMT_NB_IF;
2933 break;
2934 default:
2935
2936 break;
2937 }
2938
2939
2940
2941
2942
2943
2944 snprintf(prop, sizeof(prop), "%sbitclock-master", prefix);
2945 bit = !!of_get_property(np, prop, NULL);
2946 if (bit && bitclkmaster)
2947 *bitclkmaster = of_parse_phandle(np, prop, 0);
2948
2949 snprintf(prop, sizeof(prop), "%sframe-master", prefix);
2950 frame = !!of_get_property(np, prop, NULL);
2951 if (frame && framemaster)
2952 *framemaster = of_parse_phandle(np, prop, 0);
2953
2954 switch ((bit << 4) + frame) {
2955 case 0x11:
2956 format |= SND_SOC_DAIFMT_CBM_CFM;
2957 break;
2958 case 0x10:
2959 format |= SND_SOC_DAIFMT_CBM_CFS;
2960 break;
2961 case 0x01:
2962 format |= SND_SOC_DAIFMT_CBS_CFM;
2963 break;
2964 default:
2965 format |= SND_SOC_DAIFMT_CBS_CFS;
2966 break;
2967 }
2968
2969 return format;
2970}
2971EXPORT_SYMBOL_GPL(snd_soc_of_parse_daifmt);
2972
2973int snd_soc_get_dai_id(struct device_node *ep)
2974{
2975 struct snd_soc_component *component;
2976 struct snd_soc_dai_link_component dlc;
2977 int ret;
2978
2979 dlc.of_node = of_graph_get_port_parent(ep);
2980 dlc.name = NULL;
2981
2982
2983
2984
2985
2986
2987 ret = -ENOTSUPP;
2988 mutex_lock(&client_mutex);
2989 component = soc_find_component(&dlc);
2990 if (component)
2991 ret = snd_soc_component_of_xlate_dai_id(component, ep);
2992 mutex_unlock(&client_mutex);
2993
2994 of_node_put(dlc.of_node);
2995
2996 return ret;
2997}
2998EXPORT_SYMBOL_GPL(snd_soc_get_dai_id);
2999
3000int snd_soc_get_dai_name(const struct of_phandle_args *args,
3001 const char **dai_name)
3002{
3003 struct snd_soc_component *pos;
3004 struct device_node *component_of_node;
3005 int ret = -EPROBE_DEFER;
3006
3007 mutex_lock(&client_mutex);
3008 for_each_component(pos) {
3009 component_of_node = soc_component_to_node(pos);
3010
3011 if (component_of_node != args->np)
3012 continue;
3013
3014 ret = snd_soc_component_of_xlate_dai_name(pos, args, dai_name);
3015 if (ret == -ENOTSUPP) {
3016 struct snd_soc_dai *dai;
3017 int id = -1;
3018
3019 switch (args->args_count) {
3020 case 0:
3021 id = 0;
3022 break;
3023 case 1:
3024 id = args->args[0];
3025 break;
3026 default:
3027
3028 break;
3029 }
3030
3031 if (id < 0 || id >= pos->num_dai) {
3032 ret = -EINVAL;
3033 continue;
3034 }
3035
3036 ret = 0;
3037
3038
3039 for_each_component_dais(pos, dai) {
3040 if (id == 0)
3041 break;
3042 id--;
3043 }
3044
3045 *dai_name = dai->driver->name;
3046 if (!*dai_name)
3047 *dai_name = pos->name;
3048 } else if (ret) {
3049
3050
3051
3052
3053
3054
3055 continue;
3056 }
3057
3058 break;
3059 }
3060 mutex_unlock(&client_mutex);
3061 return ret;
3062}
3063EXPORT_SYMBOL_GPL(snd_soc_get_dai_name);
3064
3065int snd_soc_of_get_dai_name(struct device_node *of_node,
3066 const char **dai_name)
3067{
3068 struct of_phandle_args args;
3069 int ret;
3070
3071 ret = of_parse_phandle_with_args(of_node, "sound-dai",
3072 "#sound-dai-cells", 0, &args);
3073 if (ret)
3074 return ret;
3075
3076 ret = snd_soc_get_dai_name(&args, dai_name);
3077
3078 of_node_put(args.np);
3079
3080 return ret;
3081}
3082EXPORT_SYMBOL_GPL(snd_soc_of_get_dai_name);
3083
3084
3085
3086
3087
3088
3089
3090void snd_soc_of_put_dai_link_codecs(struct snd_soc_dai_link *dai_link)
3091{
3092 struct snd_soc_dai_link_component *component;
3093 int index;
3094
3095 for_each_link_codecs(dai_link, index, component) {
3096 if (!component->of_node)
3097 break;
3098 of_node_put(component->of_node);
3099 component->of_node = NULL;
3100 }
3101}
3102EXPORT_SYMBOL_GPL(snd_soc_of_put_dai_link_codecs);
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118int snd_soc_of_get_dai_link_codecs(struct device *dev,
3119 struct device_node *of_node,
3120 struct snd_soc_dai_link *dai_link)
3121{
3122 struct of_phandle_args args;
3123 struct snd_soc_dai_link_component *component;
3124 char *name;
3125 int index, num_codecs, ret;
3126
3127
3128 name = "sound-dai";
3129 num_codecs = of_count_phandle_with_args(of_node, name,
3130 "#sound-dai-cells");
3131 if (num_codecs <= 0) {
3132 if (num_codecs == -ENOENT)
3133 dev_err(dev, "No 'sound-dai' property\n");
3134 else
3135 dev_err(dev, "Bad phandle in 'sound-dai'\n");
3136 return num_codecs;
3137 }
3138 component = devm_kcalloc(dev,
3139 num_codecs, sizeof(*component),
3140 GFP_KERNEL);
3141 if (!component)
3142 return -ENOMEM;
3143 dai_link->codecs = component;
3144 dai_link->num_codecs = num_codecs;
3145
3146
3147 for_each_link_codecs(dai_link, index, component) {
3148 ret = of_parse_phandle_with_args(of_node, name,
3149 "#sound-dai-cells",
3150 index, &args);
3151 if (ret)
3152 goto err;
3153 component->of_node = args.np;
3154 ret = snd_soc_get_dai_name(&args, &component->dai_name);
3155 if (ret < 0)
3156 goto err;
3157 }
3158 return 0;
3159err:
3160 snd_soc_of_put_dai_link_codecs(dai_link);
3161 dai_link->codecs = NULL;
3162 dai_link->num_codecs = 0;
3163 return ret;
3164}
3165EXPORT_SYMBOL_GPL(snd_soc_of_get_dai_link_codecs);
3166
3167static int __init snd_soc_init(void)
3168{
3169 snd_soc_debugfs_init();
3170 snd_soc_util_init();
3171
3172 return platform_driver_register(&soc_driver);
3173}
3174module_init(snd_soc_init);
3175
3176static void __exit snd_soc_exit(void)
3177{
3178 snd_soc_util_exit();
3179 snd_soc_debugfs_exit();
3180
3181 platform_driver_unregister(&soc_driver);
3182}
3183module_exit(snd_soc_exit);
3184
3185
3186MODULE_AUTHOR("Liam Girdwood, lrg@slimlogic.co.uk");
3187MODULE_DESCRIPTION("ALSA SoC Core");
3188MODULE_LICENSE("GPL");
3189MODULE_ALIAS("platform:soc-audio");
3190