Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/sound/soc/soc-core.c
26381 views
1
// SPDX-License-Identifier: GPL-2.0+
2
//
3
// soc-core.c -- ALSA SoC Audio Layer
4
//
5
// Copyright 2005 Wolfson Microelectronics PLC.
6
// Copyright 2005 Openedhand Ltd.
7
// Copyright (C) 2010 Slimlogic Ltd.
8
// Copyright (C) 2010 Texas Instruments Inc.
9
//
10
// Author: Liam Girdwood <[email protected]>
11
// with code, comments and ideas from :-
12
// Richard Purdie <[email protected]>
13
//
14
// TODO:
15
// o Add hw rules to enforce rates, etc.
16
// o More testing with other codecs/machines.
17
// o Add more codecs and platforms to ensure good API coverage.
18
// o Support TDM on PCM and I2S
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 <linux/string_choices.h>
36
#include <sound/core.h>
37
#include <sound/pcm.h>
38
#include <sound/pcm_params.h>
39
#include <sound/soc.h>
40
#include <sound/soc-dpcm.h>
41
#include <sound/soc-topology.h>
42
#include <sound/soc-link.h>
43
#include <sound/initval.h>
44
45
#define CREATE_TRACE_POINTS
46
#include <trace/events/asoc.h>
47
48
static DEFINE_MUTEX(client_mutex);
49
static LIST_HEAD(component_list);
50
static LIST_HEAD(unbind_card_list);
51
52
#define for_each_component(component) \
53
list_for_each_entry(component, &component_list, list)
54
55
/*
56
* This is used if driver don't need to have CPU/Codec/Platform
57
* dai_link. see soc.h
58
*/
59
struct snd_soc_dai_link_component null_dailink_component[0];
60
EXPORT_SYMBOL_GPL(null_dailink_component);
61
62
/*
63
* This is a timeout to do a DAPM powerdown after a stream is closed().
64
* It can be used to eliminate pops between different playback streams, e.g.
65
* between two audio tracks.
66
*/
67
static int pmdown_time = 5000;
68
module_param(pmdown_time, int, 0);
69
MODULE_PARM_DESC(pmdown_time, "DAPM stream powerdown time (msecs)");
70
71
static ssize_t pmdown_time_show(struct device *dev,
72
struct device_attribute *attr, char *buf)
73
{
74
struct snd_soc_pcm_runtime *rtd = dev_get_drvdata(dev);
75
76
return sysfs_emit(buf, "%ld\n", rtd->pmdown_time);
77
}
78
79
static ssize_t pmdown_time_store(struct device *dev,
80
struct device_attribute *attr,
81
const char *buf, size_t count)
82
{
83
struct snd_soc_pcm_runtime *rtd = dev_get_drvdata(dev);
84
int ret;
85
86
ret = kstrtol(buf, 10, &rtd->pmdown_time);
87
if (ret)
88
return ret;
89
90
return count;
91
}
92
93
static DEVICE_ATTR_RW(pmdown_time);
94
95
static struct attribute *soc_dev_attrs[] = {
96
&dev_attr_pmdown_time.attr,
97
NULL
98
};
99
100
static umode_t soc_dev_attr_is_visible(struct kobject *kobj,
101
struct attribute *attr, int idx)
102
{
103
struct device *dev = kobj_to_dev(kobj);
104
struct snd_soc_pcm_runtime *rtd = dev_get_drvdata(dev);
105
106
if (!rtd)
107
return 0;
108
109
if (attr == &dev_attr_pmdown_time.attr)
110
return attr->mode; /* always visible */
111
return rtd->dai_link->num_codecs ? attr->mode : 0; /* enabled only with codec */
112
}
113
114
static const struct attribute_group soc_dapm_dev_group = {
115
.attrs = snd_soc_dapm_dev_attrs,
116
.is_visible = soc_dev_attr_is_visible,
117
};
118
119
static const struct attribute_group soc_dev_group = {
120
.attrs = soc_dev_attrs,
121
.is_visible = soc_dev_attr_is_visible,
122
};
123
124
static const struct attribute_group *soc_dev_attr_groups[] = {
125
&soc_dapm_dev_group,
126
&soc_dev_group,
127
NULL
128
};
129
130
#ifdef CONFIG_DEBUG_FS
131
struct dentry *snd_soc_debugfs_root;
132
EXPORT_SYMBOL_GPL(snd_soc_debugfs_root);
133
134
static void soc_init_component_debugfs(struct snd_soc_component *component)
135
{
136
if (!component->card->debugfs_card_root)
137
return;
138
139
if (component->debugfs_prefix) {
140
char *name;
141
142
name = kasprintf(GFP_KERNEL, "%s:%s",
143
component->debugfs_prefix, component->name);
144
if (name) {
145
component->debugfs_root = debugfs_create_dir(name,
146
component->card->debugfs_card_root);
147
kfree(name);
148
}
149
} else {
150
component->debugfs_root = debugfs_create_dir(component->name,
151
component->card->debugfs_card_root);
152
}
153
154
snd_soc_dapm_debugfs_init(snd_soc_component_get_dapm(component),
155
component->debugfs_root);
156
}
157
158
static void soc_cleanup_component_debugfs(struct snd_soc_component *component)
159
{
160
if (!component->debugfs_root)
161
return;
162
debugfs_remove_recursive(component->debugfs_root);
163
component->debugfs_root = NULL;
164
}
165
166
static int dai_list_show(struct seq_file *m, void *v)
167
{
168
struct snd_soc_component *component;
169
struct snd_soc_dai *dai;
170
171
mutex_lock(&client_mutex);
172
173
for_each_component(component)
174
for_each_component_dais(component, dai)
175
seq_printf(m, "%s\n", dai->name);
176
177
mutex_unlock(&client_mutex);
178
179
return 0;
180
}
181
DEFINE_SHOW_ATTRIBUTE(dai_list);
182
183
static int component_list_show(struct seq_file *m, void *v)
184
{
185
struct snd_soc_component *component;
186
187
mutex_lock(&client_mutex);
188
189
for_each_component(component)
190
seq_printf(m, "%s\n", component->name);
191
192
mutex_unlock(&client_mutex);
193
194
return 0;
195
}
196
DEFINE_SHOW_ATTRIBUTE(component_list);
197
198
static void soc_init_card_debugfs(struct snd_soc_card *card)
199
{
200
card->debugfs_card_root = debugfs_create_dir(card->name,
201
snd_soc_debugfs_root);
202
203
debugfs_create_u32("dapm_pop_time", 0644, card->debugfs_card_root,
204
&card->pop_time);
205
206
snd_soc_dapm_debugfs_init(&card->dapm, card->debugfs_card_root);
207
}
208
209
static void soc_cleanup_card_debugfs(struct snd_soc_card *card)
210
{
211
debugfs_remove_recursive(card->debugfs_card_root);
212
card->debugfs_card_root = NULL;
213
}
214
215
static void snd_soc_debugfs_init(void)
216
{
217
snd_soc_debugfs_root = debugfs_create_dir("asoc", NULL);
218
219
debugfs_create_file("dais", 0444, snd_soc_debugfs_root, NULL,
220
&dai_list_fops);
221
222
debugfs_create_file("components", 0444, snd_soc_debugfs_root, NULL,
223
&component_list_fops);
224
}
225
226
static void snd_soc_debugfs_exit(void)
227
{
228
debugfs_remove_recursive(snd_soc_debugfs_root);
229
}
230
231
#else
232
233
static inline void soc_init_component_debugfs(struct snd_soc_component *component) { }
234
static inline void soc_cleanup_component_debugfs(struct snd_soc_component *component) { }
235
static inline void soc_init_card_debugfs(struct snd_soc_card *card) { }
236
static inline void soc_cleanup_card_debugfs(struct snd_soc_card *card) { }
237
static inline void snd_soc_debugfs_init(void) { }
238
static inline void snd_soc_debugfs_exit(void) { }
239
240
#endif
241
242
static int snd_soc_is_match_dai_args(const struct of_phandle_args *args1,
243
const struct of_phandle_args *args2)
244
{
245
if (!args1 || !args2)
246
return 0;
247
248
if (args1->np != args2->np)
249
return 0;
250
251
for (int i = 0; i < args1->args_count; i++)
252
if (args1->args[i] != args2->args[i])
253
return 0;
254
255
return 1;
256
}
257
258
static inline int snd_soc_dlc_component_is_empty(struct snd_soc_dai_link_component *dlc)
259
{
260
return !(dlc->dai_args || dlc->name || dlc->of_node);
261
}
262
263
static inline int snd_soc_dlc_component_is_invalid(struct snd_soc_dai_link_component *dlc)
264
{
265
return (dlc->name && dlc->of_node);
266
}
267
268
static inline int snd_soc_dlc_dai_is_empty(struct snd_soc_dai_link_component *dlc)
269
{
270
return !(dlc->dai_args || dlc->dai_name);
271
}
272
273
static int snd_soc_is_matching_dai(const struct snd_soc_dai_link_component *dlc,
274
struct snd_soc_dai *dai)
275
{
276
if (!dlc)
277
return 0;
278
279
if (dlc->dai_args)
280
return snd_soc_is_match_dai_args(dai->driver->dai_args, dlc->dai_args);
281
282
if (!dlc->dai_name)
283
return 1;
284
285
/* see snd_soc_dai_name_get() */
286
287
if (dai->driver->name &&
288
strcmp(dlc->dai_name, dai->driver->name) == 0)
289
return 1;
290
291
if (strcmp(dlc->dai_name, dai->name) == 0)
292
return 1;
293
294
if (dai->component->name &&
295
strcmp(dlc->dai_name, dai->component->name) == 0)
296
return 1;
297
298
return 0;
299
}
300
301
const char *snd_soc_dai_name_get(const struct snd_soc_dai *dai)
302
{
303
/* see snd_soc_is_matching_dai() */
304
if (dai->driver->name)
305
return dai->driver->name;
306
307
if (dai->name)
308
return dai->name;
309
310
if (dai->component->name)
311
return dai->component->name;
312
313
return NULL;
314
}
315
EXPORT_SYMBOL_GPL(snd_soc_dai_name_get);
316
317
static int snd_soc_rtd_add_component(struct snd_soc_pcm_runtime *rtd,
318
struct snd_soc_component *component)
319
{
320
struct snd_soc_component *comp;
321
int i;
322
323
for_each_rtd_components(rtd, i, comp) {
324
/* already connected */
325
if (comp == component)
326
return 0;
327
}
328
329
/* see for_each_rtd_components */
330
rtd->num_components++; // increment flex array count at first
331
rtd->components[rtd->num_components - 1] = component;
332
333
return 0;
334
}
335
336
struct snd_soc_component *snd_soc_rtdcom_lookup(struct snd_soc_pcm_runtime *rtd,
337
const char *driver_name)
338
{
339
struct snd_soc_component *component;
340
int i;
341
342
if (!driver_name)
343
return NULL;
344
345
/*
346
* NOTE
347
*
348
* snd_soc_rtdcom_lookup() will find component from rtd by using
349
* specified driver name.
350
* But, if many components which have same driver name are connected
351
* to 1 rtd, this function will return 1st found component.
352
*/
353
for_each_rtd_components(rtd, i, component) {
354
const char *component_name = component->driver->name;
355
356
if (!component_name)
357
continue;
358
359
if ((component_name == driver_name) ||
360
strcmp(component_name, driver_name) == 0)
361
return component;
362
}
363
364
return NULL;
365
}
366
EXPORT_SYMBOL_GPL(snd_soc_rtdcom_lookup);
367
368
struct snd_soc_component
369
*snd_soc_lookup_component_nolocked(struct device *dev, const char *driver_name)
370
{
371
struct snd_soc_component *component;
372
373
for_each_component(component) {
374
if (dev != component->dev)
375
continue;
376
377
if (!driver_name)
378
return component;
379
380
if (!component->driver->name)
381
continue;
382
383
if (component->driver->name == driver_name)
384
return component;
385
386
if (strcmp(component->driver->name, driver_name) == 0)
387
return component;
388
}
389
390
return NULL;
391
}
392
EXPORT_SYMBOL_GPL(snd_soc_lookup_component_nolocked);
393
394
struct snd_soc_component *snd_soc_lookup_component(struct device *dev,
395
const char *driver_name)
396
{
397
struct snd_soc_component *component;
398
399
mutex_lock(&client_mutex);
400
component = snd_soc_lookup_component_nolocked(dev, driver_name);
401
mutex_unlock(&client_mutex);
402
403
return component;
404
}
405
EXPORT_SYMBOL_GPL(snd_soc_lookup_component);
406
407
struct snd_soc_pcm_runtime
408
*snd_soc_get_pcm_runtime(struct snd_soc_card *card,
409
struct snd_soc_dai_link *dai_link)
410
{
411
struct snd_soc_pcm_runtime *rtd;
412
413
for_each_card_rtds(card, rtd) {
414
if (rtd->dai_link == dai_link)
415
return rtd;
416
}
417
dev_dbg(card->dev, "ASoC: failed to find rtd %s\n", dai_link->name);
418
return NULL;
419
}
420
EXPORT_SYMBOL_GPL(snd_soc_get_pcm_runtime);
421
422
/*
423
* Power down the audio subsystem pmdown_time msecs after close is called.
424
* This is to ensure there are no pops or clicks in between any music tracks
425
* due to DAPM power cycling.
426
*/
427
void snd_soc_close_delayed_work(struct snd_soc_pcm_runtime *rtd)
428
{
429
struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0);
430
int playback = SNDRV_PCM_STREAM_PLAYBACK;
431
432
snd_soc_dpcm_mutex_lock(rtd);
433
434
dev_dbg(rtd->dev,
435
"ASoC: pop wq checking: %s status: %s waiting: %s\n",
436
codec_dai->driver->playback.stream_name,
437
snd_soc_dai_stream_active(codec_dai, playback) ?
438
"active" : "inactive",
439
str_yes_no(rtd->pop_wait));
440
441
/* are we waiting on this codec DAI stream */
442
if (rtd->pop_wait == 1) {
443
rtd->pop_wait = 0;
444
snd_soc_dapm_stream_event(rtd, playback,
445
SND_SOC_DAPM_STREAM_STOP);
446
}
447
448
snd_soc_dpcm_mutex_unlock(rtd);
449
}
450
EXPORT_SYMBOL_GPL(snd_soc_close_delayed_work);
451
452
static void soc_release_rtd_dev(struct device *dev)
453
{
454
/* "dev" means "rtd->dev" */
455
kfree(dev);
456
}
457
458
static void soc_free_pcm_runtime(struct snd_soc_pcm_runtime *rtd)
459
{
460
if (!rtd)
461
return;
462
463
list_del(&rtd->list);
464
465
if (delayed_work_pending(&rtd->delayed_work))
466
flush_delayed_work(&rtd->delayed_work);
467
snd_soc_pcm_component_free(rtd);
468
469
/*
470
* we don't need to call kfree() for rtd->dev
471
* see
472
* soc_release_rtd_dev()
473
*
474
* We don't need rtd->dev NULL check, because
475
* it is alloced *before* rtd.
476
* see
477
* soc_new_pcm_runtime()
478
*
479
* We don't need to mind freeing for rtd,
480
* because it was created from dev (= rtd->dev)
481
* see
482
* soc_new_pcm_runtime()
483
*
484
* rtd = devm_kzalloc(dev, ...);
485
* rtd->dev = dev
486
*/
487
device_unregister(rtd->dev);
488
}
489
490
static void close_delayed_work(struct work_struct *work) {
491
struct snd_soc_pcm_runtime *rtd =
492
container_of(work, struct snd_soc_pcm_runtime,
493
delayed_work.work);
494
495
if (rtd->close_delayed_work_func)
496
rtd->close_delayed_work_func(rtd);
497
}
498
499
static struct snd_soc_pcm_runtime *soc_new_pcm_runtime(
500
struct snd_soc_card *card, struct snd_soc_dai_link *dai_link)
501
{
502
struct snd_soc_pcm_runtime *rtd;
503
struct device *dev;
504
int ret;
505
int stream;
506
507
/*
508
* for rtd->dev
509
*/
510
dev = kzalloc(sizeof(struct device), GFP_KERNEL);
511
if (!dev)
512
return NULL;
513
514
dev->parent = card->dev;
515
dev->release = soc_release_rtd_dev;
516
517
dev_set_name(dev, "%s", dai_link->name);
518
519
ret = device_register(dev);
520
if (ret < 0) {
521
put_device(dev); /* soc_release_rtd_dev */
522
return NULL;
523
}
524
525
/*
526
* for rtd
527
*/
528
rtd = devm_kzalloc(dev,
529
struct_size(rtd, components,
530
dai_link->num_cpus +
531
dai_link->num_codecs +
532
dai_link->num_platforms),
533
GFP_KERNEL);
534
if (!rtd) {
535
device_unregister(dev);
536
return NULL;
537
}
538
539
rtd->dev = dev;
540
INIT_LIST_HEAD(&rtd->list);
541
for_each_pcm_streams(stream) {
542
INIT_LIST_HEAD(&rtd->dpcm[stream].be_clients);
543
INIT_LIST_HEAD(&rtd->dpcm[stream].fe_clients);
544
}
545
dev_set_drvdata(dev, rtd);
546
INIT_DELAYED_WORK(&rtd->delayed_work, close_delayed_work);
547
548
/*
549
* for rtd->dais
550
*/
551
rtd->dais = devm_kcalloc(dev, dai_link->num_cpus + dai_link->num_codecs,
552
sizeof(struct snd_soc_dai *),
553
GFP_KERNEL);
554
if (!rtd->dais)
555
goto free_rtd;
556
557
/*
558
* dais = [][][][][][][][][][][][][][][][][][]
559
* ^cpu_dais ^codec_dais
560
* |--- num_cpus ---|--- num_codecs --|
561
* see
562
* snd_soc_rtd_to_cpu()
563
* snd_soc_rtd_to_codec()
564
*/
565
rtd->card = card;
566
rtd->dai_link = dai_link;
567
rtd->id = card->num_rtd++;
568
rtd->pmdown_time = pmdown_time; /* default power off timeout */
569
570
/* see for_each_card_rtds */
571
list_add_tail(&rtd->list, &card->rtd_list);
572
573
ret = device_add_groups(dev, soc_dev_attr_groups);
574
if (ret < 0)
575
goto free_rtd;
576
577
return rtd;
578
579
free_rtd:
580
soc_free_pcm_runtime(rtd);
581
return NULL;
582
}
583
584
static void snd_soc_fill_dummy_dai(struct snd_soc_card *card)
585
{
586
struct snd_soc_dai_link *dai_link;
587
int i;
588
589
/*
590
* COMP_DUMMY() creates size 0 array on dai_link.
591
* Fill it as dummy DAI in case of CPU/Codec here.
592
* Do nothing for Platform.
593
*/
594
for_each_card_prelinks(card, i, dai_link) {
595
if (dai_link->num_cpus == 0 && dai_link->cpus) {
596
dai_link->num_cpus = 1;
597
dai_link->cpus = &snd_soc_dummy_dlc;
598
}
599
if (dai_link->num_codecs == 0 && dai_link->codecs) {
600
dai_link->num_codecs = 1;
601
dai_link->codecs = &snd_soc_dummy_dlc;
602
}
603
}
604
}
605
606
static void snd_soc_flush_all_delayed_work(struct snd_soc_card *card)
607
{
608
struct snd_soc_pcm_runtime *rtd;
609
610
for_each_card_rtds(card, rtd)
611
flush_delayed_work(&rtd->delayed_work);
612
}
613
614
#ifdef CONFIG_PM_SLEEP
615
static void soc_playback_digital_mute(struct snd_soc_card *card, int mute)
616
{
617
struct snd_soc_pcm_runtime *rtd;
618
struct snd_soc_dai *dai;
619
int playback = SNDRV_PCM_STREAM_PLAYBACK;
620
int i;
621
622
for_each_card_rtds(card, rtd) {
623
624
if (rtd->dai_link->ignore_suspend)
625
continue;
626
627
for_each_rtd_dais(rtd, i, dai) {
628
if (snd_soc_dai_stream_active(dai, playback))
629
snd_soc_dai_digital_mute(dai, mute, playback);
630
}
631
}
632
}
633
634
static void soc_dapm_suspend_resume(struct snd_soc_card *card, int event)
635
{
636
struct snd_soc_pcm_runtime *rtd;
637
int stream;
638
639
for_each_card_rtds(card, rtd) {
640
641
if (rtd->dai_link->ignore_suspend)
642
continue;
643
644
for_each_pcm_streams(stream)
645
snd_soc_dapm_stream_event(rtd, stream, event);
646
}
647
}
648
649
/* powers down audio subsystem for suspend */
650
int snd_soc_suspend(struct device *dev)
651
{
652
struct snd_soc_card *card = dev_get_drvdata(dev);
653
struct snd_soc_component *component;
654
struct snd_soc_pcm_runtime *rtd;
655
int i;
656
657
/* If the card is not initialized yet there is nothing to do */
658
if (!snd_soc_card_is_instantiated(card))
659
return 0;
660
661
/*
662
* Due to the resume being scheduled into a workqueue we could
663
* suspend before that's finished - wait for it to complete.
664
*/
665
snd_power_wait(card->snd_card);
666
667
/* we're going to block userspace touching us until resume completes */
668
snd_power_change_state(card->snd_card, SNDRV_CTL_POWER_D3hot);
669
670
/* mute any active DACs */
671
soc_playback_digital_mute(card, 1);
672
673
/* suspend all pcms */
674
for_each_card_rtds(card, rtd) {
675
if (rtd->dai_link->ignore_suspend)
676
continue;
677
678
snd_pcm_suspend_all(rtd->pcm);
679
}
680
681
snd_soc_card_suspend_pre(card);
682
683
/* close any waiting streams */
684
snd_soc_flush_all_delayed_work(card);
685
686
soc_dapm_suspend_resume(card, SND_SOC_DAPM_STREAM_SUSPEND);
687
688
/* Recheck all endpoints too, their state is affected by suspend */
689
snd_soc_dapm_mark_endpoints_dirty(card);
690
snd_soc_dapm_sync(&card->dapm);
691
692
/* suspend all COMPONENTs */
693
for_each_card_rtds(card, rtd) {
694
695
if (rtd->dai_link->ignore_suspend)
696
continue;
697
698
for_each_rtd_components(rtd, i, component) {
699
struct snd_soc_dapm_context *dapm =
700
snd_soc_component_get_dapm(component);
701
702
/*
703
* ignore if component was already suspended
704
*/
705
if (snd_soc_component_is_suspended(component))
706
continue;
707
708
/*
709
* If there are paths active then the COMPONENT will be
710
* held with bias _ON and should not be suspended.
711
*/
712
switch (snd_soc_dapm_get_bias_level(dapm)) {
713
case SND_SOC_BIAS_STANDBY:
714
/*
715
* If the COMPONENT is capable of idle
716
* bias off then being in STANDBY
717
* means it's doing something,
718
* otherwise fall through.
719
*/
720
if (dapm->idle_bias_off) {
721
dev_dbg(component->dev,
722
"ASoC: idle_bias_off CODEC on over suspend\n");
723
break;
724
}
725
fallthrough;
726
727
case SND_SOC_BIAS_OFF:
728
snd_soc_component_suspend(component);
729
if (component->regmap)
730
regcache_mark_dirty(component->regmap);
731
/* deactivate pins to sleep state */
732
pinctrl_pm_select_sleep_state(component->dev);
733
break;
734
default:
735
dev_dbg(component->dev,
736
"ASoC: COMPONENT is on over suspend\n");
737
break;
738
}
739
}
740
}
741
742
snd_soc_card_suspend_post(card);
743
744
return 0;
745
}
746
EXPORT_SYMBOL_GPL(snd_soc_suspend);
747
748
/*
749
* deferred resume work, so resume can complete before we finished
750
* setting our codec back up, which can be very slow on I2C
751
*/
752
static void soc_resume_deferred(struct work_struct *work)
753
{
754
struct snd_soc_card *card =
755
container_of(work, struct snd_soc_card,
756
deferred_resume_work);
757
struct snd_soc_component *component;
758
759
/*
760
* our power state is still SNDRV_CTL_POWER_D3hot from suspend time,
761
* so userspace apps are blocked from touching us
762
*/
763
764
dev_dbg(card->dev, "ASoC: starting resume work\n");
765
766
/* Bring us up into D2 so that DAPM starts enabling things */
767
snd_power_change_state(card->snd_card, SNDRV_CTL_POWER_D2);
768
769
snd_soc_card_resume_pre(card);
770
771
for_each_card_components(card, component) {
772
if (snd_soc_component_is_suspended(component))
773
snd_soc_component_resume(component);
774
}
775
776
soc_dapm_suspend_resume(card, SND_SOC_DAPM_STREAM_RESUME);
777
778
/* unmute any active DACs */
779
soc_playback_digital_mute(card, 0);
780
781
snd_soc_card_resume_post(card);
782
783
dev_dbg(card->dev, "ASoC: resume work completed\n");
784
785
/* Recheck all endpoints too, their state is affected by suspend */
786
snd_soc_dapm_mark_endpoints_dirty(card);
787
snd_soc_dapm_sync(&card->dapm);
788
789
/* userspace can access us now we are back as we were before */
790
snd_power_change_state(card->snd_card, SNDRV_CTL_POWER_D0);
791
}
792
793
/* powers up audio subsystem after a suspend */
794
int snd_soc_resume(struct device *dev)
795
{
796
struct snd_soc_card *card = dev_get_drvdata(dev);
797
struct snd_soc_component *component;
798
799
/* If the card is not initialized yet there is nothing to do */
800
if (!snd_soc_card_is_instantiated(card))
801
return 0;
802
803
/* activate pins from sleep state */
804
for_each_card_components(card, component)
805
if (snd_soc_component_active(component))
806
pinctrl_pm_select_default_state(component->dev);
807
808
dev_dbg(dev, "ASoC: Scheduling resume work\n");
809
if (!schedule_work(&card->deferred_resume_work))
810
dev_err(dev, "ASoC: resume work item may be lost\n");
811
812
return 0;
813
}
814
EXPORT_SYMBOL_GPL(snd_soc_resume);
815
816
static void soc_resume_init(struct snd_soc_card *card)
817
{
818
/* deferred resume work */
819
INIT_WORK(&card->deferred_resume_work, soc_resume_deferred);
820
}
821
#else
822
#define snd_soc_suspend NULL
823
#define snd_soc_resume NULL
824
static inline void soc_resume_init(struct snd_soc_card *card) { }
825
#endif
826
827
static struct device_node
828
*soc_component_to_node(struct snd_soc_component *component)
829
{
830
struct device_node *of_node;
831
832
of_node = component->dev->of_node;
833
if (!of_node && component->dev->parent)
834
of_node = component->dev->parent->of_node;
835
836
return of_node;
837
}
838
839
struct of_phandle_args *snd_soc_copy_dai_args(struct device *dev,
840
const struct of_phandle_args *args)
841
{
842
struct of_phandle_args *ret = devm_kzalloc(dev, sizeof(*ret), GFP_KERNEL);
843
844
if (!ret)
845
return NULL;
846
847
*ret = *args;
848
849
return ret;
850
}
851
EXPORT_SYMBOL_GPL(snd_soc_copy_dai_args);
852
853
static int snd_soc_is_matching_component(
854
const struct snd_soc_dai_link_component *dlc,
855
struct snd_soc_component *component)
856
{
857
struct device_node *component_of_node;
858
859
if (!dlc)
860
return 0;
861
862
if (dlc->dai_args) {
863
struct snd_soc_dai *dai;
864
865
for_each_component_dais(component, dai)
866
if (snd_soc_is_matching_dai(dlc, dai))
867
return 1;
868
return 0;
869
}
870
871
component_of_node = soc_component_to_node(component);
872
873
if (dlc->of_node && component_of_node != dlc->of_node)
874
return 0;
875
if (dlc->name && strcmp(component->name, dlc->name))
876
return 0;
877
878
return 1;
879
}
880
881
static struct snd_soc_component *soc_find_component(
882
const struct snd_soc_dai_link_component *dlc)
883
{
884
struct snd_soc_component *component;
885
886
lockdep_assert_held(&client_mutex);
887
888
/*
889
* NOTE
890
*
891
* It returns *1st* found component, but some driver
892
* has few components by same of_node/name
893
* ex)
894
* CPU component and generic DMAEngine component
895
*/
896
for_each_component(component)
897
if (snd_soc_is_matching_component(dlc, component))
898
return component;
899
900
return NULL;
901
}
902
903
/**
904
* snd_soc_find_dai - Find a registered DAI
905
*
906
* @dlc: name of the DAI or the DAI driver and optional component info to match
907
*
908
* This function will search all registered components and their DAIs to
909
* find the DAI of the same name. The component's of_node and name
910
* should also match if being specified.
911
*
912
* Return: pointer of DAI, or NULL if not found.
913
*/
914
struct snd_soc_dai *snd_soc_find_dai(
915
const struct snd_soc_dai_link_component *dlc)
916
{
917
struct snd_soc_component *component;
918
struct snd_soc_dai *dai;
919
920
lockdep_assert_held(&client_mutex);
921
922
/* Find CPU DAI from registered DAIs */
923
for_each_component(component)
924
if (snd_soc_is_matching_component(dlc, component))
925
for_each_component_dais(component, dai)
926
if (snd_soc_is_matching_dai(dlc, dai))
927
return dai;
928
929
return NULL;
930
}
931
EXPORT_SYMBOL_GPL(snd_soc_find_dai);
932
933
struct snd_soc_dai *snd_soc_find_dai_with_mutex(
934
const struct snd_soc_dai_link_component *dlc)
935
{
936
struct snd_soc_dai *dai;
937
938
mutex_lock(&client_mutex);
939
dai = snd_soc_find_dai(dlc);
940
mutex_unlock(&client_mutex);
941
942
return dai;
943
}
944
EXPORT_SYMBOL_GPL(snd_soc_find_dai_with_mutex);
945
946
static int soc_dai_link_sanity_check(struct snd_soc_card *card,
947
struct snd_soc_dai_link *link)
948
{
949
int i;
950
struct snd_soc_dai_link_component *dlc;
951
952
/* Codec check */
953
for_each_link_codecs(link, i, dlc) {
954
/*
955
* Codec must be specified by 1 of name or OF node,
956
* not both or neither.
957
*/
958
if (snd_soc_dlc_component_is_invalid(dlc))
959
goto component_invalid;
960
961
if (snd_soc_dlc_component_is_empty(dlc))
962
goto component_empty;
963
964
/* Codec DAI name must be specified */
965
if (snd_soc_dlc_dai_is_empty(dlc))
966
goto dai_empty;
967
968
/*
969
* Defer card registration if codec component is not added to
970
* component list.
971
*/
972
if (!soc_find_component(dlc))
973
goto component_not_found;
974
}
975
976
/* Platform check */
977
for_each_link_platforms(link, i, dlc) {
978
/*
979
* Platform may be specified by either name or OF node, but it
980
* can be left unspecified, then no components will be inserted
981
* in the rtdcom list
982
*/
983
if (snd_soc_dlc_component_is_invalid(dlc))
984
goto component_invalid;
985
986
if (snd_soc_dlc_component_is_empty(dlc))
987
goto component_empty;
988
989
/*
990
* Defer card registration if platform component is not added to
991
* component list.
992
*/
993
if (!soc_find_component(dlc))
994
goto component_not_found;
995
}
996
997
/* CPU check */
998
for_each_link_cpus(link, i, dlc) {
999
/*
1000
* CPU device may be specified by either name or OF node, but
1001
* can be left unspecified, and will be matched based on DAI
1002
* name alone..
1003
*/
1004
if (snd_soc_dlc_component_is_invalid(dlc))
1005
goto component_invalid;
1006
1007
1008
if (snd_soc_dlc_component_is_empty(dlc)) {
1009
/*
1010
* At least one of CPU DAI name or CPU device name/node must be specified
1011
*/
1012
if (snd_soc_dlc_dai_is_empty(dlc))
1013
goto component_dai_empty;
1014
} else {
1015
/*
1016
* Defer card registration if Component is not added
1017
*/
1018
if (!soc_find_component(dlc))
1019
goto component_not_found;
1020
}
1021
}
1022
1023
return 0;
1024
1025
component_invalid:
1026
dev_err(card->dev, "ASoC: Both Component name/of_node are set for %s\n", link->name);
1027
return -EINVAL;
1028
1029
component_empty:
1030
dev_err(card->dev, "ASoC: Neither Component name/of_node are set for %s\n", link->name);
1031
return -EINVAL;
1032
1033
component_not_found:
1034
dev_dbg(card->dev, "ASoC: Component %s not found for link %s\n", dlc->name, link->name);
1035
return -EPROBE_DEFER;
1036
1037
dai_empty:
1038
dev_err(card->dev, "ASoC: DAI name is not set for %s\n", link->name);
1039
return -EINVAL;
1040
1041
component_dai_empty:
1042
dev_err(card->dev, "ASoC: Neither DAI/Component name/of_node are set for %s\n", link->name);
1043
return -EINVAL;
1044
}
1045
1046
#define MAX_DEFAULT_CH_MAP_SIZE 8
1047
static struct snd_soc_dai_link_ch_map default_ch_map_sync[MAX_DEFAULT_CH_MAP_SIZE] = {
1048
{ .cpu = 0, .codec = 0 },
1049
{ .cpu = 1, .codec = 1 },
1050
{ .cpu = 2, .codec = 2 },
1051
{ .cpu = 3, .codec = 3 },
1052
{ .cpu = 4, .codec = 4 },
1053
{ .cpu = 5, .codec = 5 },
1054
{ .cpu = 6, .codec = 6 },
1055
{ .cpu = 7, .codec = 7 },
1056
};
1057
static struct snd_soc_dai_link_ch_map default_ch_map_1cpu[MAX_DEFAULT_CH_MAP_SIZE] = {
1058
{ .cpu = 0, .codec = 0 },
1059
{ .cpu = 0, .codec = 1 },
1060
{ .cpu = 0, .codec = 2 },
1061
{ .cpu = 0, .codec = 3 },
1062
{ .cpu = 0, .codec = 4 },
1063
{ .cpu = 0, .codec = 5 },
1064
{ .cpu = 0, .codec = 6 },
1065
{ .cpu = 0, .codec = 7 },
1066
};
1067
static struct snd_soc_dai_link_ch_map default_ch_map_1codec[MAX_DEFAULT_CH_MAP_SIZE] = {
1068
{ .cpu = 0, .codec = 0 },
1069
{ .cpu = 1, .codec = 0 },
1070
{ .cpu = 2, .codec = 0 },
1071
{ .cpu = 3, .codec = 0 },
1072
{ .cpu = 4, .codec = 0 },
1073
{ .cpu = 5, .codec = 0 },
1074
{ .cpu = 6, .codec = 0 },
1075
{ .cpu = 7, .codec = 0 },
1076
};
1077
static int snd_soc_compensate_channel_connection_map(struct snd_soc_card *card,
1078
struct snd_soc_dai_link *dai_link)
1079
{
1080
struct snd_soc_dai_link_ch_map *ch_maps;
1081
int i;
1082
1083
/*
1084
* dai_link->ch_maps indicates how CPU/Codec are connected.
1085
* It will be a map seen from a larger number of DAI.
1086
* see
1087
* soc.h :: [dai_link->ch_maps Image sample]
1088
*/
1089
1090
/* it should have ch_maps if connection was N:M */
1091
if (dai_link->num_cpus > 1 && dai_link->num_codecs > 1 &&
1092
dai_link->num_cpus != dai_link->num_codecs && !dai_link->ch_maps) {
1093
dev_err(card->dev, "need to have ch_maps when N:M connection (%s)",
1094
dai_link->name);
1095
return -EINVAL;
1096
}
1097
1098
/* do nothing if it has own maps */
1099
if (dai_link->ch_maps)
1100
goto sanity_check;
1101
1102
/* check default map size */
1103
if (dai_link->num_cpus > MAX_DEFAULT_CH_MAP_SIZE ||
1104
dai_link->num_codecs > MAX_DEFAULT_CH_MAP_SIZE) {
1105
dev_err(card->dev, "soc-core.c needs update default_connection_maps");
1106
return -EINVAL;
1107
}
1108
1109
/* Compensate missing map for ... */
1110
if (dai_link->num_cpus == dai_link->num_codecs)
1111
dai_link->ch_maps = default_ch_map_sync; /* for 1:1 or N:N */
1112
else if (dai_link->num_cpus < dai_link->num_codecs)
1113
dai_link->ch_maps = default_ch_map_1cpu; /* for 1:N */
1114
else
1115
dai_link->ch_maps = default_ch_map_1codec; /* for N:1 */
1116
1117
sanity_check:
1118
dev_dbg(card->dev, "dai_link %s\n", dai_link->stream_name);
1119
for_each_link_ch_maps(dai_link, i, ch_maps) {
1120
if ((ch_maps->cpu >= dai_link->num_cpus) ||
1121
(ch_maps->codec >= dai_link->num_codecs)) {
1122
dev_err(card->dev,
1123
"unexpected dai_link->ch_maps[%d] index (cpu(%d/%d) codec(%d/%d))",
1124
i,
1125
ch_maps->cpu, dai_link->num_cpus,
1126
ch_maps->codec, dai_link->num_codecs);
1127
return -EINVAL;
1128
}
1129
1130
dev_dbg(card->dev, " [%d] cpu%d <-> codec%d\n",
1131
i, ch_maps->cpu, ch_maps->codec);
1132
}
1133
1134
return 0;
1135
}
1136
1137
/**
1138
* snd_soc_remove_pcm_runtime - Remove a pcm_runtime from card
1139
* @card: The ASoC card to which the pcm_runtime has
1140
* @rtd: The pcm_runtime to remove
1141
*
1142
* This function removes a pcm_runtime from the ASoC card.
1143
*/
1144
void snd_soc_remove_pcm_runtime(struct snd_soc_card *card,
1145
struct snd_soc_pcm_runtime *rtd)
1146
{
1147
if (!rtd)
1148
return;
1149
1150
lockdep_assert_held(&client_mutex);
1151
1152
/*
1153
* Notify the machine driver for extra destruction
1154
*/
1155
snd_soc_card_remove_dai_link(card, rtd->dai_link);
1156
1157
soc_free_pcm_runtime(rtd);
1158
}
1159
EXPORT_SYMBOL_GPL(snd_soc_remove_pcm_runtime);
1160
1161
/**
1162
* snd_soc_add_pcm_runtime - Add a pcm_runtime dynamically via dai_link
1163
* @card: The ASoC card to which the pcm_runtime is added
1164
* @dai_link: The DAI link to find pcm_runtime
1165
*
1166
* This function adds a pcm_runtime ASoC card by using dai_link.
1167
*
1168
* Note: Topology can use this API to add pcm_runtime when probing the
1169
* topology component. And machine drivers can still define static
1170
* DAI links in dai_link array.
1171
*/
1172
static int snd_soc_add_pcm_runtime(struct snd_soc_card *card,
1173
struct snd_soc_dai_link *dai_link)
1174
{
1175
struct snd_soc_pcm_runtime *rtd;
1176
struct snd_soc_dai_link_component *codec, *platform, *cpu;
1177
struct snd_soc_component *component;
1178
int i, id, ret;
1179
1180
lockdep_assert_held(&client_mutex);
1181
1182
/*
1183
* Notify the machine driver for extra initialization
1184
*/
1185
ret = snd_soc_card_add_dai_link(card, dai_link);
1186
if (ret < 0)
1187
return ret;
1188
1189
if (dai_link->ignore)
1190
return 0;
1191
1192
dev_dbg(card->dev, "ASoC: binding %s\n", dai_link->name);
1193
1194
ret = soc_dai_link_sanity_check(card, dai_link);
1195
if (ret < 0)
1196
return ret;
1197
1198
rtd = soc_new_pcm_runtime(card, dai_link);
1199
if (!rtd)
1200
return -ENOMEM;
1201
1202
for_each_link_cpus(dai_link, i, cpu) {
1203
snd_soc_rtd_to_cpu(rtd, i) = snd_soc_find_dai(cpu);
1204
if (!snd_soc_rtd_to_cpu(rtd, i)) {
1205
dev_info(card->dev, "ASoC: CPU DAI %s not registered\n",
1206
cpu->dai_name);
1207
goto _err_defer;
1208
}
1209
snd_soc_rtd_add_component(rtd, snd_soc_rtd_to_cpu(rtd, i)->component);
1210
}
1211
1212
/* Find CODEC from registered CODECs */
1213
for_each_link_codecs(dai_link, i, codec) {
1214
snd_soc_rtd_to_codec(rtd, i) = snd_soc_find_dai(codec);
1215
if (!snd_soc_rtd_to_codec(rtd, i)) {
1216
dev_info(card->dev, "ASoC: CODEC DAI %s not registered\n",
1217
codec->dai_name);
1218
goto _err_defer;
1219
}
1220
1221
snd_soc_rtd_add_component(rtd, snd_soc_rtd_to_codec(rtd, i)->component);
1222
}
1223
1224
/* Find PLATFORM from registered PLATFORMs */
1225
for_each_link_platforms(dai_link, i, platform) {
1226
for_each_component(component) {
1227
if (!snd_soc_is_matching_component(platform, component))
1228
continue;
1229
1230
if (snd_soc_component_is_dummy(component) && component->num_dai)
1231
continue;
1232
1233
snd_soc_rtd_add_component(rtd, component);
1234
}
1235
}
1236
1237
/*
1238
* Most drivers will register their PCMs using DAI link ordering but
1239
* topology based drivers can use the DAI link id field to set PCM
1240
* device number and then use rtd + a base offset of the BEs.
1241
*
1242
* FIXME
1243
*
1244
* This should be implemented by using "dai_link" feature instead of
1245
* "component" feature.
1246
*/
1247
id = rtd->id;
1248
for_each_rtd_components(rtd, i, component) {
1249
if (!component->driver->use_dai_pcm_id)
1250
continue;
1251
1252
if (rtd->dai_link->no_pcm)
1253
id += component->driver->be_pcm_base;
1254
else
1255
id = rtd->dai_link->id;
1256
}
1257
rtd->id = id;
1258
1259
return 0;
1260
1261
_err_defer:
1262
snd_soc_remove_pcm_runtime(card, rtd);
1263
return -EPROBE_DEFER;
1264
}
1265
1266
int snd_soc_add_pcm_runtimes(struct snd_soc_card *card,
1267
struct snd_soc_dai_link *dai_link,
1268
int num_dai_link)
1269
{
1270
for (int i = 0; i < num_dai_link; i++) {
1271
int ret;
1272
1273
ret = snd_soc_compensate_channel_connection_map(card, dai_link + i);
1274
if (ret < 0)
1275
return ret;
1276
1277
ret = snd_soc_add_pcm_runtime(card, dai_link + i);
1278
if (ret < 0)
1279
return ret;
1280
}
1281
1282
return 0;
1283
}
1284
EXPORT_SYMBOL_GPL(snd_soc_add_pcm_runtimes);
1285
1286
static void snd_soc_runtime_get_dai_fmt(struct snd_soc_pcm_runtime *rtd)
1287
{
1288
struct snd_soc_dai_link *dai_link = rtd->dai_link;
1289
struct snd_soc_dai *dai, *not_used;
1290
u64 pos, possible_fmt;
1291
unsigned int mask = 0, dai_fmt = 0;
1292
int i, j, priority, pri, until;
1293
1294
/*
1295
* Get selectable format from each DAIs.
1296
*
1297
****************************
1298
* NOTE
1299
* Using .auto_selectable_formats is not mandatory,
1300
* we can select format manually from Sound Card.
1301
* When use it, driver should list well tested format only.
1302
****************************
1303
*
1304
* ex)
1305
* auto_selectable_formats (= SND_SOC_POSSIBLE_xxx)
1306
* (A) (B) (C)
1307
* DAI0_: { 0x000F, 0x00F0, 0x0F00 };
1308
* DAI1 : { 0xF000, 0x0F00 };
1309
* (X) (Y)
1310
*
1311
* "until" will be 3 in this case (MAX array size from DAI0 and DAI1)
1312
* Here is dev_dbg() message and comments
1313
*
1314
* priority = 1
1315
* DAI0: (pri, fmt) = (1, 000000000000000F) // 1st check (A) DAI1 is not selected
1316
* DAI1: (pri, fmt) = (0, 0000000000000000) // Necessary Waste
1317
* DAI0: (pri, fmt) = (1, 000000000000000F) // 2nd check (A)
1318
* DAI1: (pri, fmt) = (1, 000000000000F000) // (X)
1319
* priority = 2
1320
* DAI0: (pri, fmt) = (2, 00000000000000FF) // 3rd check (A) + (B)
1321
* DAI1: (pri, fmt) = (1, 000000000000F000) // (X)
1322
* DAI0: (pri, fmt) = (2, 00000000000000FF) // 4th check (A) + (B)
1323
* DAI1: (pri, fmt) = (2, 000000000000FF00) // (X) + (Y)
1324
* priority = 3
1325
* DAI0: (pri, fmt) = (3, 0000000000000FFF) // 5th check (A) + (B) + (C)
1326
* DAI1: (pri, fmt) = (2, 000000000000FF00) // (X) + (Y)
1327
* found auto selected format: 0000000000000F00
1328
*/
1329
until = snd_soc_dai_get_fmt_max_priority(rtd);
1330
for (priority = 1; priority <= until; priority++) {
1331
for_each_rtd_dais(rtd, j, not_used) {
1332
1333
possible_fmt = ULLONG_MAX;
1334
for_each_rtd_dais(rtd, i, dai) {
1335
u64 fmt = 0;
1336
1337
pri = (j >= i) ? priority : priority - 1;
1338
fmt = snd_soc_dai_get_fmt(dai, pri);
1339
possible_fmt &= fmt;
1340
}
1341
if (possible_fmt)
1342
goto found;
1343
}
1344
}
1345
/* Not Found */
1346
return;
1347
found:
1348
/*
1349
* convert POSSIBLE_DAIFMT to DAIFMT
1350
*
1351
* Some basic/default settings on each is defined as 0.
1352
* see
1353
* SND_SOC_DAIFMT_NB_NF
1354
* SND_SOC_DAIFMT_GATED
1355
*
1356
* SND_SOC_DAIFMT_xxx_MASK can't notice it if Sound Card specify
1357
* these value, and will be overwrite to auto selected value.
1358
*
1359
* To avoid such issue, loop from 63 to 0 here.
1360
* Small number of SND_SOC_POSSIBLE_xxx will be Hi priority.
1361
* Basic/Default settings of each part and above are defined
1362
* as Hi priority (= small number) of SND_SOC_POSSIBLE_xxx.
1363
*/
1364
for (i = 63; i >= 0; i--) {
1365
pos = 1ULL << i;
1366
switch (possible_fmt & pos) {
1367
/*
1368
* for format
1369
*/
1370
case SND_SOC_POSSIBLE_DAIFMT_I2S:
1371
case SND_SOC_POSSIBLE_DAIFMT_RIGHT_J:
1372
case SND_SOC_POSSIBLE_DAIFMT_LEFT_J:
1373
case SND_SOC_POSSIBLE_DAIFMT_DSP_A:
1374
case SND_SOC_POSSIBLE_DAIFMT_DSP_B:
1375
case SND_SOC_POSSIBLE_DAIFMT_AC97:
1376
case SND_SOC_POSSIBLE_DAIFMT_PDM:
1377
dai_fmt = (dai_fmt & ~SND_SOC_DAIFMT_FORMAT_MASK) | i;
1378
break;
1379
/*
1380
* for clock
1381
*/
1382
case SND_SOC_POSSIBLE_DAIFMT_CONT:
1383
dai_fmt = (dai_fmt & ~SND_SOC_DAIFMT_CLOCK_MASK) | SND_SOC_DAIFMT_CONT;
1384
break;
1385
case SND_SOC_POSSIBLE_DAIFMT_GATED:
1386
dai_fmt = (dai_fmt & ~SND_SOC_DAIFMT_CLOCK_MASK) | SND_SOC_DAIFMT_GATED;
1387
break;
1388
/*
1389
* for clock invert
1390
*/
1391
case SND_SOC_POSSIBLE_DAIFMT_NB_NF:
1392
dai_fmt = (dai_fmt & ~SND_SOC_DAIFMT_INV_MASK) | SND_SOC_DAIFMT_NB_NF;
1393
break;
1394
case SND_SOC_POSSIBLE_DAIFMT_NB_IF:
1395
dai_fmt = (dai_fmt & ~SND_SOC_DAIFMT_INV_MASK) | SND_SOC_DAIFMT_NB_IF;
1396
break;
1397
case SND_SOC_POSSIBLE_DAIFMT_IB_NF:
1398
dai_fmt = (dai_fmt & ~SND_SOC_DAIFMT_INV_MASK) | SND_SOC_DAIFMT_IB_NF;
1399
break;
1400
case SND_SOC_POSSIBLE_DAIFMT_IB_IF:
1401
dai_fmt = (dai_fmt & ~SND_SOC_DAIFMT_INV_MASK) | SND_SOC_DAIFMT_IB_IF;
1402
break;
1403
/*
1404
* for clock provider / consumer
1405
*/
1406
case SND_SOC_POSSIBLE_DAIFMT_CBP_CFP:
1407
dai_fmt = (dai_fmt & ~SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) | SND_SOC_DAIFMT_CBP_CFP;
1408
break;
1409
case SND_SOC_POSSIBLE_DAIFMT_CBC_CFP:
1410
dai_fmt = (dai_fmt & ~SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) | SND_SOC_DAIFMT_CBC_CFP;
1411
break;
1412
case SND_SOC_POSSIBLE_DAIFMT_CBP_CFC:
1413
dai_fmt = (dai_fmt & ~SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) | SND_SOC_DAIFMT_CBP_CFC;
1414
break;
1415
case SND_SOC_POSSIBLE_DAIFMT_CBC_CFC:
1416
dai_fmt = (dai_fmt & ~SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) | SND_SOC_DAIFMT_CBC_CFC;
1417
break;
1418
}
1419
}
1420
1421
/*
1422
* Some driver might have very complex limitation.
1423
* In such case, user want to auto-select non-limitation part,
1424
* and want to manually specify complex part.
1425
*
1426
* Or for example, if both CPU and Codec can be clock provider,
1427
* but because of its quality, user want to specify it manually.
1428
*
1429
* Use manually specified settings if sound card did.
1430
*/
1431
if (!(dai_link->dai_fmt & SND_SOC_DAIFMT_FORMAT_MASK))
1432
mask |= SND_SOC_DAIFMT_FORMAT_MASK;
1433
if (!(dai_link->dai_fmt & SND_SOC_DAIFMT_CLOCK_MASK))
1434
mask |= SND_SOC_DAIFMT_CLOCK_MASK;
1435
if (!(dai_link->dai_fmt & SND_SOC_DAIFMT_INV_MASK))
1436
mask |= SND_SOC_DAIFMT_INV_MASK;
1437
if (!(dai_link->dai_fmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK))
1438
mask |= SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK;
1439
1440
dai_link->dai_fmt |= (dai_fmt & mask);
1441
}
1442
1443
/**
1444
* snd_soc_runtime_set_dai_fmt() - Change DAI link format for a ASoC runtime
1445
* @rtd: The runtime for which the DAI link format should be changed
1446
* @dai_fmt: The new DAI link format
1447
*
1448
* This function updates the DAI link format for all DAIs connected to the DAI
1449
* link for the specified runtime.
1450
*
1451
* Note: For setups with a static format set the dai_fmt field in the
1452
* corresponding snd_dai_link struct instead of using this function.
1453
*
1454
* Returns 0 on success, otherwise a negative error code.
1455
*/
1456
int snd_soc_runtime_set_dai_fmt(struct snd_soc_pcm_runtime *rtd,
1457
unsigned int dai_fmt)
1458
{
1459
struct snd_soc_dai *cpu_dai;
1460
struct snd_soc_dai *codec_dai;
1461
unsigned int ext_fmt;
1462
unsigned int i;
1463
int ret;
1464
1465
if (!dai_fmt)
1466
return 0;
1467
1468
/*
1469
* dai_fmt has 4 types
1470
* 1. SND_SOC_DAIFMT_FORMAT_MASK
1471
* 2. SND_SOC_DAIFMT_CLOCK
1472
* 3. SND_SOC_DAIFMT_INV
1473
* 4. SND_SOC_DAIFMT_CLOCK_PROVIDER
1474
*
1475
* 4. CLOCK_PROVIDER is set from Codec perspective in dai_fmt. So it will be flipped
1476
* when this function calls set_fmt() for CPU (CBx_CFx -> Bx_Cx). see below.
1477
* This mean, we can't set CPU/Codec both are clock consumer for example.
1478
* New idea handles 4. in each dai->ext_fmt. It can keep compatibility.
1479
*
1480
* Legacy
1481
* dai_fmt includes 1, 2, 3, 4
1482
*
1483
* New idea
1484
* dai_fmt includes 1, 2, 3
1485
* ext_fmt includes 4
1486
*/
1487
for_each_rtd_codec_dais(rtd, i, codec_dai) {
1488
ext_fmt = rtd->dai_link->codecs[i].ext_fmt;
1489
ret = snd_soc_dai_set_fmt(codec_dai, dai_fmt | ext_fmt);
1490
if (ret != 0 && ret != -ENOTSUPP)
1491
return ret;
1492
}
1493
1494
/* Flip the polarity for the "CPU" end of link */
1495
/* Will effect only for 4. SND_SOC_DAIFMT_CLOCK_PROVIDER */
1496
dai_fmt = snd_soc_daifmt_clock_provider_flipped(dai_fmt);
1497
1498
for_each_rtd_cpu_dais(rtd, i, cpu_dai) {
1499
ext_fmt = rtd->dai_link->cpus[i].ext_fmt;
1500
ret = snd_soc_dai_set_fmt(cpu_dai, dai_fmt | ext_fmt);
1501
if (ret != 0 && ret != -ENOTSUPP)
1502
return ret;
1503
}
1504
1505
return 0;
1506
}
1507
EXPORT_SYMBOL_GPL(snd_soc_runtime_set_dai_fmt);
1508
1509
static int soc_init_pcm_runtime(struct snd_soc_card *card,
1510
struct snd_soc_pcm_runtime *rtd)
1511
{
1512
struct snd_soc_dai_link *dai_link = rtd->dai_link;
1513
struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0);
1514
int ret;
1515
1516
/* do machine specific initialization */
1517
ret = snd_soc_link_init(rtd);
1518
if (ret < 0)
1519
return ret;
1520
1521
snd_soc_runtime_get_dai_fmt(rtd);
1522
ret = snd_soc_runtime_set_dai_fmt(rtd, dai_link->dai_fmt);
1523
if (ret)
1524
goto err;
1525
1526
/* add DPCM sysfs entries */
1527
soc_dpcm_debugfs_add(rtd);
1528
1529
/* create compress_device if possible */
1530
ret = snd_soc_dai_compress_new(cpu_dai, rtd);
1531
if (ret != -ENOTSUPP)
1532
goto err;
1533
1534
/* create the pcm */
1535
ret = soc_new_pcm(rtd);
1536
if (ret < 0) {
1537
dev_err(card->dev, "ASoC: can't create pcm %s :%d\n",
1538
dai_link->stream_name, ret);
1539
goto err;
1540
}
1541
1542
ret = snd_soc_pcm_dai_new(rtd);
1543
if (ret < 0)
1544
goto err;
1545
1546
rtd->initialized = true;
1547
1548
return 0;
1549
err:
1550
snd_soc_link_exit(rtd);
1551
return ret;
1552
}
1553
1554
static void soc_set_name_prefix(struct snd_soc_card *card,
1555
struct snd_soc_component *component)
1556
{
1557
struct device_node *of_node = soc_component_to_node(component);
1558
const char *str;
1559
int ret, i;
1560
1561
for (i = 0; i < card->num_configs; i++) {
1562
struct snd_soc_codec_conf *map = &card->codec_conf[i];
1563
1564
if (snd_soc_is_matching_component(&map->dlc, component) &&
1565
map->name_prefix) {
1566
component->name_prefix = map->name_prefix;
1567
return;
1568
}
1569
}
1570
1571
/*
1572
* If there is no configuration table or no match in the table,
1573
* check if a prefix is provided in the node
1574
*/
1575
ret = of_property_read_string(of_node, "sound-name-prefix", &str);
1576
if (ret < 0)
1577
return;
1578
1579
component->name_prefix = str;
1580
}
1581
1582
static void soc_remove_component(struct snd_soc_component *component,
1583
int probed)
1584
{
1585
1586
if (!component->card)
1587
return;
1588
1589
if (probed)
1590
snd_soc_component_remove(component);
1591
1592
list_del_init(&component->card_list);
1593
snd_soc_dapm_free(snd_soc_component_get_dapm(component));
1594
soc_cleanup_component_debugfs(component);
1595
component->card = NULL;
1596
snd_soc_component_module_put_when_remove(component);
1597
}
1598
1599
static int soc_probe_component(struct snd_soc_card *card,
1600
struct snd_soc_component *component)
1601
{
1602
struct snd_soc_dapm_context *dapm =
1603
snd_soc_component_get_dapm(component);
1604
struct snd_soc_dai *dai;
1605
int probed = 0;
1606
int ret;
1607
1608
if (snd_soc_component_is_dummy(component))
1609
return 0;
1610
1611
if (component->card) {
1612
if (component->card != card) {
1613
dev_err(component->dev,
1614
"Trying to bind component \"%s\" to card \"%s\" but is already bound to card \"%s\"\n",
1615
component->name, card->name, component->card->name);
1616
return -ENODEV;
1617
}
1618
return 0;
1619
}
1620
1621
ret = snd_soc_component_module_get_when_probe(component);
1622
if (ret < 0)
1623
return ret;
1624
1625
component->card = card;
1626
soc_set_name_prefix(card, component);
1627
1628
soc_init_component_debugfs(component);
1629
1630
snd_soc_dapm_init(dapm, card, component);
1631
1632
ret = snd_soc_dapm_new_controls(dapm,
1633
component->driver->dapm_widgets,
1634
component->driver->num_dapm_widgets);
1635
1636
if (ret != 0) {
1637
dev_err(component->dev,
1638
"Failed to create new controls %d\n", ret);
1639
goto err_probe;
1640
}
1641
1642
for_each_component_dais(component, dai) {
1643
ret = snd_soc_dapm_new_dai_widgets(dapm, dai);
1644
if (ret != 0) {
1645
dev_err(component->dev,
1646
"Failed to create DAI widgets %d\n", ret);
1647
goto err_probe;
1648
}
1649
}
1650
1651
ret = snd_soc_component_probe(component);
1652
if (ret < 0)
1653
goto err_probe;
1654
1655
WARN(dapm->idle_bias_off &&
1656
dapm->bias_level != SND_SOC_BIAS_OFF,
1657
"codec %s can not start from non-off bias with idle_bias_off==1\n",
1658
component->name);
1659
probed = 1;
1660
1661
/*
1662
* machine specific init
1663
* see
1664
* snd_soc_component_set_aux()
1665
*/
1666
ret = snd_soc_component_init(component);
1667
if (ret < 0)
1668
goto err_probe;
1669
1670
ret = snd_soc_add_component_controls(component,
1671
component->driver->controls,
1672
component->driver->num_controls);
1673
if (ret < 0)
1674
goto err_probe;
1675
1676
ret = snd_soc_dapm_add_routes(dapm,
1677
component->driver->dapm_routes,
1678
component->driver->num_dapm_routes);
1679
if (ret < 0)
1680
goto err_probe;
1681
1682
/* see for_each_card_components */
1683
list_add(&component->card_list, &card->component_dev_list);
1684
1685
err_probe:
1686
if (ret < 0)
1687
soc_remove_component(component, probed);
1688
1689
return ret;
1690
}
1691
1692
static void soc_remove_link_dais(struct snd_soc_card *card)
1693
{
1694
struct snd_soc_pcm_runtime *rtd;
1695
int order;
1696
1697
for_each_comp_order(order) {
1698
for_each_card_rtds(card, rtd) {
1699
/* remove all rtd connected DAIs in good order */
1700
snd_soc_pcm_dai_remove(rtd, order);
1701
}
1702
}
1703
}
1704
1705
static int soc_probe_link_dais(struct snd_soc_card *card)
1706
{
1707
struct snd_soc_pcm_runtime *rtd;
1708
int order, ret;
1709
1710
for_each_comp_order(order) {
1711
for_each_card_rtds(card, rtd) {
1712
/* probe all rtd connected DAIs in good order */
1713
ret = snd_soc_pcm_dai_probe(rtd, order);
1714
if (ret)
1715
return ret;
1716
}
1717
}
1718
1719
return 0;
1720
}
1721
1722
static void soc_remove_link_components(struct snd_soc_card *card)
1723
{
1724
struct snd_soc_component *component;
1725
struct snd_soc_pcm_runtime *rtd;
1726
int i, order;
1727
1728
for_each_comp_order(order) {
1729
for_each_card_rtds(card, rtd) {
1730
for_each_rtd_components(rtd, i, component) {
1731
if (component->driver->remove_order != order)
1732
continue;
1733
1734
soc_remove_component(component, 1);
1735
}
1736
}
1737
}
1738
}
1739
1740
static int soc_probe_link_components(struct snd_soc_card *card)
1741
{
1742
struct snd_soc_component *component;
1743
struct snd_soc_pcm_runtime *rtd;
1744
int i, ret, order;
1745
1746
for_each_comp_order(order) {
1747
for_each_card_rtds(card, rtd) {
1748
for_each_rtd_components(rtd, i, component) {
1749
if (component->driver->probe_order != order)
1750
continue;
1751
1752
ret = soc_probe_component(card, component);
1753
if (ret < 0)
1754
return ret;
1755
}
1756
}
1757
}
1758
1759
return 0;
1760
}
1761
1762
static void soc_unbind_aux_dev(struct snd_soc_card *card)
1763
{
1764
struct snd_soc_component *component, *_component;
1765
1766
for_each_card_auxs_safe(card, component, _component) {
1767
/* for snd_soc_component_init() */
1768
snd_soc_component_set_aux(component, NULL);
1769
list_del(&component->card_aux_list);
1770
}
1771
}
1772
1773
static int soc_bind_aux_dev(struct snd_soc_card *card)
1774
{
1775
struct snd_soc_component *component;
1776
struct snd_soc_aux_dev *aux;
1777
int i;
1778
1779
for_each_card_pre_auxs(card, i, aux) {
1780
/* codecs, usually analog devices */
1781
component = soc_find_component(&aux->dlc);
1782
if (!component)
1783
return -EPROBE_DEFER;
1784
1785
/* for snd_soc_component_init() */
1786
snd_soc_component_set_aux(component, aux);
1787
/* see for_each_card_auxs */
1788
list_add(&component->card_aux_list, &card->aux_comp_list);
1789
}
1790
return 0;
1791
}
1792
1793
static int soc_probe_aux_devices(struct snd_soc_card *card)
1794
{
1795
struct snd_soc_component *component;
1796
int order;
1797
int ret;
1798
1799
for_each_comp_order(order) {
1800
for_each_card_auxs(card, component) {
1801
if (component->driver->probe_order != order)
1802
continue;
1803
1804
ret = soc_probe_component(card, component);
1805
if (ret < 0)
1806
return ret;
1807
}
1808
}
1809
1810
return 0;
1811
}
1812
1813
static void soc_remove_aux_devices(struct snd_soc_card *card)
1814
{
1815
struct snd_soc_component *comp, *_comp;
1816
int order;
1817
1818
for_each_comp_order(order) {
1819
for_each_card_auxs_safe(card, comp, _comp) {
1820
if (comp->driver->remove_order == order)
1821
soc_remove_component(comp, 1);
1822
}
1823
}
1824
}
1825
1826
#ifdef CONFIG_DMI
1827
/*
1828
* If a DMI filed contain strings in this blacklist (e.g.
1829
* "Type2 - Board Manufacturer" or "Type1 - TBD by OEM"), it will be taken
1830
* as invalid and dropped when setting the card long name from DMI info.
1831
*/
1832
static const char * const dmi_blacklist[] = {
1833
"To be filled by OEM",
1834
"TBD by OEM",
1835
"Default String",
1836
"Board Manufacturer",
1837
"Board Vendor Name",
1838
"Board Product Name",
1839
NULL, /* terminator */
1840
};
1841
1842
/*
1843
* Trim special characters, and replace '-' with '_' since '-' is used to
1844
* separate different DMI fields in the card long name. Only number and
1845
* alphabet characters and a few separator characters are kept.
1846
*/
1847
static void cleanup_dmi_name(char *name)
1848
{
1849
int i, j = 0;
1850
1851
for (i = 0; name[i]; i++) {
1852
if (isalnum(name[i]) || (name[i] == '.')
1853
|| (name[i] == '_'))
1854
name[j++] = name[i];
1855
else if (name[i] == '-')
1856
name[j++] = '_';
1857
}
1858
1859
name[j] = '\0';
1860
}
1861
1862
/*
1863
* Check if a DMI field is valid, i.e. not containing any string
1864
* in the black list.
1865
*/
1866
static int is_dmi_valid(const char *field)
1867
{
1868
int i = 0;
1869
1870
while (dmi_blacklist[i]) {
1871
if (strstr(field, dmi_blacklist[i]))
1872
return 0;
1873
i++;
1874
}
1875
1876
return 1;
1877
}
1878
1879
/*
1880
* Append a string to card->dmi_longname with character cleanups.
1881
*/
1882
static void append_dmi_string(struct snd_soc_card *card, const char *str)
1883
{
1884
char *dst = card->dmi_longname;
1885
size_t dst_len = sizeof(card->dmi_longname);
1886
size_t len;
1887
1888
len = strlen(dst);
1889
snprintf(dst + len, dst_len - len, "-%s", str);
1890
1891
len++; /* skip the separator "-" */
1892
if (len < dst_len)
1893
cleanup_dmi_name(dst + len);
1894
}
1895
1896
/**
1897
* snd_soc_set_dmi_name() - Register DMI names to card
1898
* @card: The card to register DMI names
1899
*
1900
* An Intel machine driver may be used by many different devices but are
1901
* difficult for userspace to differentiate, since machine drivers usually
1902
* use their own name as the card short name and leave the card long name
1903
* blank. To differentiate such devices and fix bugs due to lack of
1904
* device-specific configurations, this function allows DMI info to be used
1905
* as the sound card long name, in the format of
1906
* "vendor-product-version-board"
1907
* (Character '-' is used to separate different DMI fields here).
1908
* This will help the user space to load the device-specific Use Case Manager
1909
* (UCM) configurations for the card.
1910
*
1911
* Possible card long names may be:
1912
* DellInc.-XPS139343-01-0310JH
1913
* ASUSTeKCOMPUTERINC.-T100TA-1.0-T100TA
1914
* Circuitco-MinnowboardMaxD0PLATFORM-D0-MinnowBoardMAX
1915
*
1916
* This function also supports flavoring the card longname to provide
1917
* the extra differentiation, like "vendor-product-version-board-flavor".
1918
*
1919
* We only keep number and alphabet characters and a few separator characters
1920
* in the card long name since UCM in the user space uses the card long names
1921
* as card configuration directory names and AudoConf cannot support special
1922
* characters like SPACE.
1923
*
1924
* Returns 0 on success, otherwise a negative error code.
1925
*/
1926
static int snd_soc_set_dmi_name(struct snd_soc_card *card)
1927
{
1928
const char *vendor, *product, *board;
1929
1930
if (card->long_name)
1931
return 0; /* long name already set by driver or from DMI */
1932
1933
if (!dmi_available)
1934
return 0;
1935
1936
/* make up dmi long name as: vendor-product-version-board */
1937
vendor = dmi_get_system_info(DMI_BOARD_VENDOR);
1938
if (!vendor || !is_dmi_valid(vendor)) {
1939
dev_warn(card->dev, "ASoC: no DMI vendor name!\n");
1940
return 0;
1941
}
1942
1943
snprintf(card->dmi_longname, sizeof(card->dmi_longname), "%s", vendor);
1944
cleanup_dmi_name(card->dmi_longname);
1945
1946
product = dmi_get_system_info(DMI_PRODUCT_NAME);
1947
if (product && is_dmi_valid(product)) {
1948
const char *product_version = dmi_get_system_info(DMI_PRODUCT_VERSION);
1949
1950
append_dmi_string(card, product);
1951
1952
/*
1953
* some vendors like Lenovo may only put a self-explanatory
1954
* name in the product version field
1955
*/
1956
if (product_version && is_dmi_valid(product_version))
1957
append_dmi_string(card, product_version);
1958
}
1959
1960
board = dmi_get_system_info(DMI_BOARD_NAME);
1961
if (board && is_dmi_valid(board)) {
1962
if (!product || strcasecmp(board, product))
1963
append_dmi_string(card, board);
1964
} else if (!product) {
1965
/* fall back to using legacy name */
1966
dev_warn(card->dev, "ASoC: no DMI board/product name!\n");
1967
return 0;
1968
}
1969
1970
/* set the card long name */
1971
card->long_name = card->dmi_longname;
1972
1973
return 0;
1974
}
1975
#else
1976
static inline int snd_soc_set_dmi_name(struct snd_soc_card *card)
1977
{
1978
return 0;
1979
}
1980
#endif /* CONFIG_DMI */
1981
1982
static void soc_check_tplg_fes(struct snd_soc_card *card)
1983
{
1984
struct snd_soc_component *component;
1985
const struct snd_soc_component_driver *comp_drv;
1986
struct snd_soc_dai_link *dai_link;
1987
int i;
1988
1989
for_each_component(component) {
1990
1991
/* does this component override BEs ? */
1992
if (!component->driver->ignore_machine)
1993
continue;
1994
1995
/* for this machine ? */
1996
if (!strcmp(component->driver->ignore_machine,
1997
card->dev->driver->name))
1998
goto match;
1999
if (strcmp(component->driver->ignore_machine,
2000
dev_name(card->dev)))
2001
continue;
2002
match:
2003
/* machine matches, so override the rtd data */
2004
for_each_card_prelinks(card, i, dai_link) {
2005
2006
/* ignore this FE */
2007
if (dai_link->dynamic) {
2008
dai_link->ignore = true;
2009
continue;
2010
}
2011
2012
dev_dbg(card->dev, "info: override BE DAI link %s\n",
2013
card->dai_link[i].name);
2014
2015
/* override platform component */
2016
if (!dai_link->platforms) {
2017
dev_err(card->dev, "init platform error");
2018
continue;
2019
}
2020
2021
if (component->dev->of_node)
2022
dai_link->platforms->of_node = component->dev->of_node;
2023
else
2024
dai_link->platforms->name = component->name;
2025
2026
/* convert non BE into BE */
2027
dai_link->no_pcm = 1;
2028
2029
/*
2030
* override any BE fixups
2031
* see
2032
* snd_soc_link_be_hw_params_fixup()
2033
*/
2034
dai_link->be_hw_params_fixup =
2035
component->driver->be_hw_params_fixup;
2036
2037
/*
2038
* most BE links don't set stream name, so set it to
2039
* dai link name if it's NULL to help bind widgets.
2040
*/
2041
if (!dai_link->stream_name)
2042
dai_link->stream_name = dai_link->name;
2043
}
2044
2045
/* Inform userspace we are using alternate topology */
2046
if (component->driver->topology_name_prefix) {
2047
2048
/* topology shortname created? */
2049
if (!card->topology_shortname_created) {
2050
comp_drv = component->driver;
2051
2052
snprintf(card->topology_shortname, 32, "%s-%s",
2053
comp_drv->topology_name_prefix,
2054
card->name);
2055
card->topology_shortname_created = true;
2056
}
2057
2058
/* use topology shortname */
2059
card->name = card->topology_shortname;
2060
}
2061
}
2062
}
2063
2064
#define soc_setup_card_name(card, name, name1, name2) \
2065
__soc_setup_card_name(card, name, sizeof(name), name1, name2)
2066
static void __soc_setup_card_name(struct snd_soc_card *card,
2067
char *name, int len,
2068
const char *name1, const char *name2)
2069
{
2070
const char *src = name1 ? name1 : name2;
2071
int i;
2072
2073
snprintf(name, len, "%s", src);
2074
2075
if (name != card->snd_card->driver)
2076
return;
2077
2078
/*
2079
* Name normalization (driver field)
2080
*
2081
* The driver name is somewhat special, as it's used as a key for
2082
* searches in the user-space.
2083
*
2084
* ex)
2085
* "abcd??efg" -> "abcd__efg"
2086
*/
2087
for (i = 0; i < len; i++) {
2088
switch (name[i]) {
2089
case '_':
2090
case '-':
2091
case '\0':
2092
break;
2093
default:
2094
if (!isalnum(name[i]))
2095
name[i] = '_';
2096
break;
2097
}
2098
}
2099
2100
/*
2101
* The driver field should contain a valid string from the user view.
2102
* The wrapping usually does not work so well here. Set a smaller string
2103
* in the specific ASoC driver.
2104
*/
2105
if (strlen(src) > len - 1)
2106
dev_err(card->dev, "ASoC: driver name too long '%s' -> '%s'\n", src, name);
2107
}
2108
2109
static void soc_cleanup_card_resources(struct snd_soc_card *card)
2110
{
2111
struct snd_soc_pcm_runtime *rtd, *n;
2112
2113
if (card->snd_card)
2114
snd_card_disconnect_sync(card->snd_card);
2115
2116
snd_soc_dapm_shutdown(card);
2117
2118
/* release machine specific resources */
2119
for_each_card_rtds(card, rtd)
2120
if (rtd->initialized)
2121
snd_soc_link_exit(rtd);
2122
/* remove and free each DAI */
2123
soc_remove_link_dais(card);
2124
soc_remove_link_components(card);
2125
2126
for_each_card_rtds_safe(card, rtd, n)
2127
snd_soc_remove_pcm_runtime(card, rtd);
2128
2129
/* remove auxiliary devices */
2130
soc_remove_aux_devices(card);
2131
soc_unbind_aux_dev(card);
2132
2133
snd_soc_dapm_free(&card->dapm);
2134
soc_cleanup_card_debugfs(card);
2135
2136
/* remove the card */
2137
snd_soc_card_remove(card);
2138
2139
if (card->snd_card) {
2140
snd_card_free(card->snd_card);
2141
card->snd_card = NULL;
2142
}
2143
}
2144
2145
static void snd_soc_unbind_card(struct snd_soc_card *card)
2146
{
2147
if (snd_soc_card_is_instantiated(card)) {
2148
card->instantiated = false;
2149
snd_soc_flush_all_delayed_work(card);
2150
2151
soc_cleanup_card_resources(card);
2152
}
2153
}
2154
2155
static int snd_soc_bind_card(struct snd_soc_card *card)
2156
{
2157
struct snd_soc_pcm_runtime *rtd;
2158
struct snd_soc_component *component;
2159
int ret;
2160
2161
snd_soc_card_mutex_lock_root(card);
2162
snd_soc_fill_dummy_dai(card);
2163
2164
snd_soc_dapm_init(&card->dapm, card, NULL);
2165
2166
/* check whether any platform is ignore machine FE and using topology */
2167
soc_check_tplg_fes(card);
2168
2169
/* bind aux_devs too */
2170
ret = soc_bind_aux_dev(card);
2171
if (ret < 0)
2172
goto probe_end;
2173
2174
/* add predefined DAI links to the list */
2175
card->num_rtd = 0;
2176
ret = snd_soc_add_pcm_runtimes(card, card->dai_link, card->num_links);
2177
if (ret < 0)
2178
goto probe_end;
2179
2180
/* card bind complete so register a sound card */
2181
ret = snd_card_new(card->dev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1,
2182
card->owner, 0, &card->snd_card);
2183
if (ret < 0) {
2184
dev_err(card->dev,
2185
"ASoC: can't create sound card for card %s: %d\n",
2186
card->name, ret);
2187
goto probe_end;
2188
}
2189
2190
soc_init_card_debugfs(card);
2191
2192
soc_resume_init(card);
2193
2194
ret = snd_soc_dapm_new_controls(&card->dapm, card->dapm_widgets,
2195
card->num_dapm_widgets);
2196
if (ret < 0)
2197
goto probe_end;
2198
2199
ret = snd_soc_dapm_new_controls(&card->dapm, card->of_dapm_widgets,
2200
card->num_of_dapm_widgets);
2201
if (ret < 0)
2202
goto probe_end;
2203
2204
/* initialise the sound card only once */
2205
ret = snd_soc_card_probe(card);
2206
if (ret < 0)
2207
goto probe_end;
2208
2209
/* probe all components used by DAI links on this card */
2210
ret = soc_probe_link_components(card);
2211
if (ret < 0) {
2212
if (ret != -EPROBE_DEFER) {
2213
dev_err(card->dev,
2214
"ASoC: failed to instantiate card %d\n", ret);
2215
}
2216
goto probe_end;
2217
}
2218
2219
/* probe auxiliary components */
2220
ret = soc_probe_aux_devices(card);
2221
if (ret < 0) {
2222
dev_err(card->dev,
2223
"ASoC: failed to probe aux component %d\n", ret);
2224
goto probe_end;
2225
}
2226
2227
/* probe all DAI links on this card */
2228
ret = soc_probe_link_dais(card);
2229
if (ret < 0) {
2230
dev_err(card->dev,
2231
"ASoC: failed to instantiate card %d\n", ret);
2232
goto probe_end;
2233
}
2234
2235
for_each_card_rtds(card, rtd) {
2236
ret = soc_init_pcm_runtime(card, rtd);
2237
if (ret < 0)
2238
goto probe_end;
2239
}
2240
2241
snd_soc_dapm_link_dai_widgets(card);
2242
snd_soc_dapm_connect_dai_link_widgets(card);
2243
2244
ret = snd_soc_add_card_controls(card, card->controls,
2245
card->num_controls);
2246
if (ret < 0)
2247
goto probe_end;
2248
2249
ret = snd_soc_dapm_add_routes(&card->dapm, card->dapm_routes,
2250
card->num_dapm_routes);
2251
if (ret < 0)
2252
goto probe_end;
2253
2254
ret = snd_soc_dapm_add_routes(&card->dapm, card->of_dapm_routes,
2255
card->num_of_dapm_routes);
2256
if (ret < 0)
2257
goto probe_end;
2258
2259
/* try to set some sane longname if DMI is available */
2260
snd_soc_set_dmi_name(card);
2261
2262
soc_setup_card_name(card, card->snd_card->shortname,
2263
card->name, NULL);
2264
soc_setup_card_name(card, card->snd_card->longname,
2265
card->long_name, card->name);
2266
soc_setup_card_name(card, card->snd_card->driver,
2267
card->driver_name, card->name);
2268
2269
if (card->components) {
2270
/* the current implementation of snd_component_add() accepts */
2271
/* multiple components in the string separated by space, */
2272
/* but the string collision (identical string) check might */
2273
/* not work correctly */
2274
ret = snd_component_add(card->snd_card, card->components);
2275
if (ret < 0) {
2276
dev_err(card->dev, "ASoC: %s snd_component_add() failed: %d\n",
2277
card->name, ret);
2278
goto probe_end;
2279
}
2280
}
2281
2282
ret = snd_soc_card_late_probe(card);
2283
if (ret < 0)
2284
goto probe_end;
2285
2286
snd_soc_dapm_new_widgets(card);
2287
snd_soc_card_fixup_controls(card);
2288
2289
ret = snd_card_register(card->snd_card);
2290
if (ret < 0) {
2291
dev_err(card->dev, "ASoC: failed to register soundcard %d\n",
2292
ret);
2293
goto probe_end;
2294
}
2295
2296
card->instantiated = 1;
2297
snd_soc_dapm_mark_endpoints_dirty(card);
2298
snd_soc_dapm_sync(&card->dapm);
2299
2300
/* deactivate pins to sleep state */
2301
for_each_card_components(card, component)
2302
if (!snd_soc_component_active(component))
2303
pinctrl_pm_select_sleep_state(component->dev);
2304
2305
probe_end:
2306
if (ret < 0)
2307
soc_cleanup_card_resources(card);
2308
snd_soc_card_mutex_unlock(card);
2309
2310
return ret;
2311
}
2312
2313
static void devm_card_bind_release(struct device *dev, void *res)
2314
{
2315
snd_soc_unregister_card(*(struct snd_soc_card **)res);
2316
}
2317
2318
static int devm_snd_soc_bind_card(struct device *dev, struct snd_soc_card *card)
2319
{
2320
struct snd_soc_card **ptr;
2321
int ret;
2322
2323
ptr = devres_alloc(devm_card_bind_release, sizeof(*ptr), GFP_KERNEL);
2324
if (!ptr)
2325
return -ENOMEM;
2326
2327
ret = snd_soc_bind_card(card);
2328
if (ret == 0 || ret == -EPROBE_DEFER) {
2329
*ptr = card;
2330
devres_add(dev, ptr);
2331
} else {
2332
devres_free(ptr);
2333
}
2334
2335
return ret;
2336
}
2337
2338
static int snd_soc_rebind_card(struct snd_soc_card *card)
2339
{
2340
int ret;
2341
2342
if (card->devres_dev) {
2343
devres_destroy(card->devres_dev, devm_card_bind_release, NULL, NULL);
2344
ret = devm_snd_soc_bind_card(card->devres_dev, card);
2345
} else {
2346
ret = snd_soc_bind_card(card);
2347
}
2348
2349
if (ret != -EPROBE_DEFER)
2350
list_del_init(&card->list);
2351
2352
return ret;
2353
}
2354
2355
/* probes a new socdev */
2356
static int soc_probe(struct platform_device *pdev)
2357
{
2358
struct snd_soc_card *card = platform_get_drvdata(pdev);
2359
2360
/*
2361
* no card, so machine driver should be registering card
2362
* we should not be here in that case so ret error
2363
*/
2364
if (!card)
2365
return -EINVAL;
2366
2367
dev_warn(&pdev->dev,
2368
"ASoC: machine %s should use snd_soc_register_card()\n",
2369
card->name);
2370
2371
/* Bodge while we unpick instantiation */
2372
card->dev = &pdev->dev;
2373
2374
return devm_snd_soc_register_card(&pdev->dev, card);
2375
}
2376
2377
int snd_soc_poweroff(struct device *dev)
2378
{
2379
struct snd_soc_card *card = dev_get_drvdata(dev);
2380
struct snd_soc_component *component;
2381
2382
if (!snd_soc_card_is_instantiated(card))
2383
return 0;
2384
2385
/*
2386
* Flush out pmdown_time work - we actually do want to run it
2387
* now, we're shutting down so no imminent restart.
2388
*/
2389
snd_soc_flush_all_delayed_work(card);
2390
2391
snd_soc_dapm_shutdown(card);
2392
2393
/* deactivate pins to sleep state */
2394
for_each_card_components(card, component)
2395
pinctrl_pm_select_sleep_state(component->dev);
2396
2397
return 0;
2398
}
2399
EXPORT_SYMBOL_GPL(snd_soc_poweroff);
2400
2401
const struct dev_pm_ops snd_soc_pm_ops = {
2402
.suspend = snd_soc_suspend,
2403
.resume = snd_soc_resume,
2404
.freeze = snd_soc_suspend,
2405
.thaw = snd_soc_resume,
2406
.poweroff = snd_soc_poweroff,
2407
.restore = snd_soc_resume,
2408
};
2409
EXPORT_SYMBOL_GPL(snd_soc_pm_ops);
2410
2411
/* ASoC platform driver */
2412
static struct platform_driver soc_driver = {
2413
.driver = {
2414
.name = "soc-audio",
2415
.pm = &snd_soc_pm_ops,
2416
},
2417
.probe = soc_probe,
2418
};
2419
2420
/**
2421
* snd_soc_cnew - create new control
2422
* @_template: control template
2423
* @data: control private data
2424
* @long_name: control long name
2425
* @prefix: control name prefix
2426
*
2427
* Create a new mixer control from a template control.
2428
*
2429
* Returns 0 for success, else error.
2430
*/
2431
struct snd_kcontrol *snd_soc_cnew(const struct snd_kcontrol_new *_template,
2432
void *data, const char *long_name,
2433
const char *prefix)
2434
{
2435
struct snd_kcontrol_new template;
2436
struct snd_kcontrol *kcontrol;
2437
char *name = NULL;
2438
2439
memcpy(&template, _template, sizeof(template));
2440
template.index = 0;
2441
2442
if (!long_name)
2443
long_name = template.name;
2444
2445
if (prefix) {
2446
name = kasprintf(GFP_KERNEL, "%s %s", prefix, long_name);
2447
if (!name)
2448
return NULL;
2449
2450
template.name = name;
2451
} else {
2452
template.name = long_name;
2453
}
2454
2455
kcontrol = snd_ctl_new1(&template, data);
2456
2457
kfree(name);
2458
2459
return kcontrol;
2460
}
2461
EXPORT_SYMBOL_GPL(snd_soc_cnew);
2462
2463
static int snd_soc_add_controls(struct snd_card *card, struct device *dev,
2464
const struct snd_kcontrol_new *controls, int num_controls,
2465
const char *prefix, void *data)
2466
{
2467
int i;
2468
2469
for (i = 0; i < num_controls; i++) {
2470
const struct snd_kcontrol_new *control = &controls[i];
2471
int err = snd_ctl_add(card, snd_soc_cnew(control, data,
2472
control->name, prefix));
2473
if (err < 0) {
2474
dev_err(dev, "ASoC: Failed to add %s: %d\n",
2475
control->name, err);
2476
return err;
2477
}
2478
}
2479
2480
return 0;
2481
}
2482
2483
/**
2484
* snd_soc_add_component_controls - Add an array of controls to a component.
2485
*
2486
* @component: Component to add controls to
2487
* @controls: Array of controls to add
2488
* @num_controls: Number of elements in the array
2489
*
2490
* Return: 0 for success, else error.
2491
*/
2492
int snd_soc_add_component_controls(struct snd_soc_component *component,
2493
const struct snd_kcontrol_new *controls, unsigned int num_controls)
2494
{
2495
struct snd_card *card = component->card->snd_card;
2496
2497
return snd_soc_add_controls(card, component->dev, controls,
2498
num_controls, component->name_prefix, component);
2499
}
2500
EXPORT_SYMBOL_GPL(snd_soc_add_component_controls);
2501
2502
/**
2503
* snd_soc_add_card_controls - add an array of controls to a SoC card.
2504
* Convenience function to add a list of controls.
2505
*
2506
* @soc_card: SoC card to add controls to
2507
* @controls: array of controls to add
2508
* @num_controls: number of elements in the array
2509
*
2510
* Return 0 for success, else error.
2511
*/
2512
int snd_soc_add_card_controls(struct snd_soc_card *soc_card,
2513
const struct snd_kcontrol_new *controls, int num_controls)
2514
{
2515
struct snd_card *card = soc_card->snd_card;
2516
2517
return snd_soc_add_controls(card, soc_card->dev, controls, num_controls,
2518
NULL, soc_card);
2519
}
2520
EXPORT_SYMBOL_GPL(snd_soc_add_card_controls);
2521
2522
/**
2523
* snd_soc_add_dai_controls - add an array of controls to a DAI.
2524
* Convenience function to add a list of controls.
2525
*
2526
* @dai: DAI to add controls to
2527
* @controls: array of controls to add
2528
* @num_controls: number of elements in the array
2529
*
2530
* Return 0 for success, else error.
2531
*/
2532
int snd_soc_add_dai_controls(struct snd_soc_dai *dai,
2533
const struct snd_kcontrol_new *controls, int num_controls)
2534
{
2535
struct snd_card *card = dai->component->card->snd_card;
2536
2537
return snd_soc_add_controls(card, dai->dev, controls, num_controls,
2538
NULL, dai);
2539
}
2540
EXPORT_SYMBOL_GPL(snd_soc_add_dai_controls);
2541
2542
/**
2543
* snd_soc_register_card - Register a card with the ASoC core
2544
*
2545
* @card: Card to register
2546
*
2547
*/
2548
int snd_soc_register_card(struct snd_soc_card *card)
2549
{
2550
int ret;
2551
2552
if (!card->name || !card->dev)
2553
return -EINVAL;
2554
2555
dev_set_drvdata(card->dev, card);
2556
2557
INIT_LIST_HEAD(&card->widgets);
2558
INIT_LIST_HEAD(&card->paths);
2559
INIT_LIST_HEAD(&card->dapm_list);
2560
INIT_LIST_HEAD(&card->aux_comp_list);
2561
INIT_LIST_HEAD(&card->component_dev_list);
2562
INIT_LIST_HEAD(&card->list);
2563
INIT_LIST_HEAD(&card->rtd_list);
2564
INIT_LIST_HEAD(&card->dapm_dirty);
2565
INIT_LIST_HEAD(&card->dobj_list);
2566
2567
card->instantiated = 0;
2568
mutex_init(&card->mutex);
2569
mutex_init(&card->dapm_mutex);
2570
mutex_init(&card->pcm_mutex);
2571
2572
mutex_lock(&client_mutex);
2573
2574
if (card->devres_dev) {
2575
ret = devm_snd_soc_bind_card(card->devres_dev, card);
2576
if (ret == -EPROBE_DEFER) {
2577
list_add(&card->list, &unbind_card_list);
2578
ret = 0;
2579
}
2580
} else {
2581
ret = snd_soc_bind_card(card);
2582
}
2583
2584
mutex_unlock(&client_mutex);
2585
2586
return ret;
2587
}
2588
EXPORT_SYMBOL_GPL(snd_soc_register_card);
2589
2590
/**
2591
* snd_soc_unregister_card - Unregister a card with the ASoC core
2592
*
2593
* @card: Card to unregister
2594
*
2595
*/
2596
void snd_soc_unregister_card(struct snd_soc_card *card)
2597
{
2598
mutex_lock(&client_mutex);
2599
snd_soc_unbind_card(card);
2600
list_del(&card->list);
2601
mutex_unlock(&client_mutex);
2602
dev_dbg(card->dev, "ASoC: Unregistered card '%s'\n", card->name);
2603
}
2604
EXPORT_SYMBOL_GPL(snd_soc_unregister_card);
2605
2606
/*
2607
* Simplify DAI link configuration by removing ".-1" from device names
2608
* and sanitizing names.
2609
*/
2610
static char *fmt_single_name(struct device *dev, int *id)
2611
{
2612
const char *devname = dev_name(dev);
2613
char *found, *name;
2614
unsigned int id1, id2;
2615
int __id;
2616
2617
if (devname == NULL)
2618
return NULL;
2619
2620
name = devm_kstrdup(dev, devname, GFP_KERNEL);
2621
if (!name)
2622
return NULL;
2623
2624
/* are we a "%s.%d" name (platform and SPI components) */
2625
found = strstr(name, dev->driver->name);
2626
if (found) {
2627
/* get ID */
2628
if (sscanf(&found[strlen(dev->driver->name)], ".%d", &__id) == 1) {
2629
2630
/* discard ID from name if ID == -1 */
2631
if (__id == -1)
2632
found[strlen(dev->driver->name)] = '\0';
2633
}
2634
2635
/* I2C component devices are named "bus-addr" */
2636
} else if (sscanf(name, "%x-%x", &id1, &id2) == 2) {
2637
2638
/* create unique ID number from I2C addr and bus */
2639
__id = ((id1 & 0xffff) << 16) + id2;
2640
2641
devm_kfree(dev, name);
2642
2643
/* sanitize component name for DAI link creation */
2644
name = devm_kasprintf(dev, GFP_KERNEL, "%s.%s", dev->driver->name, devname);
2645
} else {
2646
__id = 0;
2647
}
2648
2649
if (id)
2650
*id = __id;
2651
2652
return name;
2653
}
2654
2655
/*
2656
* Simplify DAI link naming for single devices with multiple DAIs by removing
2657
* any ".-1" and using the DAI name (instead of device name).
2658
*/
2659
static inline char *fmt_multiple_name(struct device *dev,
2660
struct snd_soc_dai_driver *dai_drv)
2661
{
2662
if (dai_drv->name == NULL) {
2663
dev_err(dev,
2664
"ASoC: error - multiple DAI %s registered with no name\n",
2665
dev_name(dev));
2666
return NULL;
2667
}
2668
2669
return devm_kstrdup(dev, dai_drv->name, GFP_KERNEL);
2670
}
2671
2672
void snd_soc_unregister_dai(struct snd_soc_dai *dai)
2673
{
2674
dev_dbg(dai->dev, "ASoC: Unregistered DAI '%s'\n", dai->name);
2675
list_del(&dai->list);
2676
}
2677
EXPORT_SYMBOL_GPL(snd_soc_unregister_dai);
2678
2679
/**
2680
* snd_soc_register_dai - Register a DAI dynamically & create its widgets
2681
*
2682
* @component: The component the DAIs are registered for
2683
* @dai_drv: DAI driver to use for the DAI
2684
* @legacy_dai_naming: if %true, use legacy single-name format;
2685
* if %false, use multiple-name format;
2686
*
2687
* Topology can use this API to register DAIs when probing a component.
2688
* These DAIs's widgets will be freed in the card cleanup and the DAIs
2689
* will be freed in the component cleanup.
2690
*/
2691
struct snd_soc_dai *snd_soc_register_dai(struct snd_soc_component *component,
2692
struct snd_soc_dai_driver *dai_drv,
2693
bool legacy_dai_naming)
2694
{
2695
struct device *dev = component->dev;
2696
struct snd_soc_dai *dai;
2697
2698
lockdep_assert_held(&client_mutex);
2699
2700
dai = devm_kzalloc(dev, sizeof(*dai), GFP_KERNEL);
2701
if (dai == NULL)
2702
return NULL;
2703
2704
/*
2705
* Back in the old days when we still had component-less DAIs,
2706
* instead of having a static name, component-less DAIs would
2707
* inherit the name of the parent device so it is possible to
2708
* register multiple instances of the DAI. We still need to keep
2709
* the same naming style even though those DAIs are not
2710
* component-less anymore.
2711
*/
2712
if (legacy_dai_naming &&
2713
(dai_drv->id == 0 || dai_drv->name == NULL)) {
2714
dai->name = fmt_single_name(dev, &dai->id);
2715
} else {
2716
dai->name = fmt_multiple_name(dev, dai_drv);
2717
if (dai_drv->id)
2718
dai->id = dai_drv->id;
2719
else
2720
dai->id = component->num_dai;
2721
}
2722
if (!dai->name)
2723
return NULL;
2724
2725
dai->component = component;
2726
dai->dev = dev;
2727
dai->driver = dai_drv;
2728
2729
/* see for_each_component_dais */
2730
list_add_tail(&dai->list, &component->dai_list);
2731
component->num_dai++;
2732
2733
dev_dbg(dev, "ASoC: Registered DAI '%s'\n", dai->name);
2734
return dai;
2735
}
2736
EXPORT_SYMBOL_GPL(snd_soc_register_dai);
2737
2738
/**
2739
* snd_soc_unregister_dais - Unregister DAIs from the ASoC core
2740
*
2741
* @component: The component for which the DAIs should be unregistered
2742
*/
2743
static void snd_soc_unregister_dais(struct snd_soc_component *component)
2744
{
2745
struct snd_soc_dai *dai, *_dai;
2746
2747
for_each_component_dais_safe(component, dai, _dai)
2748
snd_soc_unregister_dai(dai);
2749
}
2750
2751
/**
2752
* snd_soc_register_dais - Register a DAI with the ASoC core
2753
*
2754
* @component: The component the DAIs are registered for
2755
* @dai_drv: DAI driver to use for the DAIs
2756
* @count: Number of DAIs
2757
*/
2758
static int snd_soc_register_dais(struct snd_soc_component *component,
2759
struct snd_soc_dai_driver *dai_drv,
2760
size_t count)
2761
{
2762
struct snd_soc_dai *dai;
2763
unsigned int i;
2764
int ret;
2765
2766
for (i = 0; i < count; i++) {
2767
dai = snd_soc_register_dai(component, dai_drv + i, count == 1 &&
2768
component->driver->legacy_dai_naming);
2769
if (dai == NULL) {
2770
ret = -ENOMEM;
2771
goto err;
2772
}
2773
}
2774
2775
return 0;
2776
2777
err:
2778
snd_soc_unregister_dais(component);
2779
2780
return ret;
2781
}
2782
2783
#define ENDIANNESS_MAP(name) \
2784
(SNDRV_PCM_FMTBIT_##name##LE | SNDRV_PCM_FMTBIT_##name##BE)
2785
static u64 endianness_format_map[] = {
2786
ENDIANNESS_MAP(S16_),
2787
ENDIANNESS_MAP(U16_),
2788
ENDIANNESS_MAP(S24_),
2789
ENDIANNESS_MAP(U24_),
2790
ENDIANNESS_MAP(S32_),
2791
ENDIANNESS_MAP(U32_),
2792
ENDIANNESS_MAP(S24_3),
2793
ENDIANNESS_MAP(U24_3),
2794
ENDIANNESS_MAP(S20_3),
2795
ENDIANNESS_MAP(U20_3),
2796
ENDIANNESS_MAP(S18_3),
2797
ENDIANNESS_MAP(U18_3),
2798
ENDIANNESS_MAP(FLOAT_),
2799
ENDIANNESS_MAP(FLOAT64_),
2800
ENDIANNESS_MAP(IEC958_SUBFRAME_),
2801
};
2802
2803
/*
2804
* Fix up the DAI formats for endianness: codecs don't actually see
2805
* the endianness of the data but we're using the CPU format
2806
* definitions which do need to include endianness so we ensure that
2807
* codec DAIs always have both big and little endian variants set.
2808
*/
2809
static void convert_endianness_formats(struct snd_soc_pcm_stream *stream)
2810
{
2811
int i;
2812
2813
for (i = 0; i < ARRAY_SIZE(endianness_format_map); i++)
2814
if (stream->formats & endianness_format_map[i])
2815
stream->formats |= endianness_format_map[i];
2816
}
2817
2818
static void snd_soc_del_component_unlocked(struct snd_soc_component *component)
2819
{
2820
struct snd_soc_card *card = component->card;
2821
bool instantiated;
2822
2823
snd_soc_unregister_dais(component);
2824
2825
if (card) {
2826
instantiated = card->instantiated;
2827
snd_soc_unbind_card(card);
2828
if (instantiated)
2829
list_add(&card->list, &unbind_card_list);
2830
}
2831
2832
list_del(&component->list);
2833
}
2834
2835
int snd_soc_component_initialize(struct snd_soc_component *component,
2836
const struct snd_soc_component_driver *driver,
2837
struct device *dev)
2838
{
2839
INIT_LIST_HEAD(&component->dai_list);
2840
INIT_LIST_HEAD(&component->dobj_list);
2841
INIT_LIST_HEAD(&component->card_list);
2842
INIT_LIST_HEAD(&component->list);
2843
mutex_init(&component->io_mutex);
2844
2845
if (!component->name) {
2846
component->name = fmt_single_name(dev, NULL);
2847
if (!component->name) {
2848
dev_err(dev, "ASoC: Failed to allocate name\n");
2849
return -ENOMEM;
2850
}
2851
}
2852
2853
component->dev = dev;
2854
component->driver = driver;
2855
2856
#ifdef CONFIG_DEBUG_FS
2857
if (!component->debugfs_prefix)
2858
component->debugfs_prefix = driver->debugfs_prefix;
2859
#endif
2860
2861
return 0;
2862
}
2863
EXPORT_SYMBOL_GPL(snd_soc_component_initialize);
2864
2865
int snd_soc_add_component(struct snd_soc_component *component,
2866
struct snd_soc_dai_driver *dai_drv,
2867
int num_dai)
2868
{
2869
struct snd_soc_card *card, *c;
2870
int ret;
2871
int i;
2872
2873
mutex_lock(&client_mutex);
2874
2875
if (component->driver->endianness) {
2876
for (i = 0; i < num_dai; i++) {
2877
convert_endianness_formats(&dai_drv[i].playback);
2878
convert_endianness_formats(&dai_drv[i].capture);
2879
}
2880
}
2881
2882
ret = snd_soc_register_dais(component, dai_drv, num_dai);
2883
if (ret < 0) {
2884
dev_err(component->dev, "ASoC: Failed to register DAIs: %d\n",
2885
ret);
2886
goto err_cleanup;
2887
}
2888
2889
if (!component->driver->write && !component->driver->read) {
2890
if (!component->regmap)
2891
component->regmap = dev_get_regmap(component->dev,
2892
NULL);
2893
if (component->regmap)
2894
snd_soc_component_setup_regmap(component);
2895
}
2896
2897
/* see for_each_component */
2898
list_add(&component->list, &component_list);
2899
2900
list_for_each_entry_safe(card, c, &unbind_card_list, list)
2901
snd_soc_rebind_card(card);
2902
2903
err_cleanup:
2904
if (ret < 0)
2905
snd_soc_del_component_unlocked(component);
2906
2907
mutex_unlock(&client_mutex);
2908
return ret;
2909
}
2910
EXPORT_SYMBOL_GPL(snd_soc_add_component);
2911
2912
int snd_soc_register_component(struct device *dev,
2913
const struct snd_soc_component_driver *component_driver,
2914
struct snd_soc_dai_driver *dai_drv,
2915
int num_dai)
2916
{
2917
struct snd_soc_component *component;
2918
int ret;
2919
2920
component = devm_kzalloc(dev, sizeof(*component), GFP_KERNEL);
2921
if (!component)
2922
return -ENOMEM;
2923
2924
ret = snd_soc_component_initialize(component, component_driver, dev);
2925
if (ret < 0)
2926
return ret;
2927
2928
return snd_soc_add_component(component, dai_drv, num_dai);
2929
}
2930
EXPORT_SYMBOL_GPL(snd_soc_register_component);
2931
2932
/**
2933
* snd_soc_unregister_component_by_driver - Unregister component using a given driver
2934
* from the ASoC core
2935
*
2936
* @dev: The device to unregister
2937
* @component_driver: The component driver to unregister
2938
*/
2939
void snd_soc_unregister_component_by_driver(struct device *dev,
2940
const struct snd_soc_component_driver *component_driver)
2941
{
2942
const char *driver_name = NULL;
2943
2944
if (component_driver)
2945
driver_name = component_driver->name;
2946
2947
mutex_lock(&client_mutex);
2948
while (1) {
2949
struct snd_soc_component *component = snd_soc_lookup_component_nolocked(dev, driver_name);
2950
2951
if (!component)
2952
break;
2953
2954
snd_soc_del_component_unlocked(component);
2955
}
2956
mutex_unlock(&client_mutex);
2957
}
2958
EXPORT_SYMBOL_GPL(snd_soc_unregister_component_by_driver);
2959
2960
/* Retrieve a card's name from device tree */
2961
int snd_soc_of_parse_card_name(struct snd_soc_card *card,
2962
const char *propname)
2963
{
2964
struct device_node *np;
2965
int ret;
2966
2967
if (!card->dev) {
2968
pr_err("card->dev is not set before calling %s\n", __func__);
2969
return -EINVAL;
2970
}
2971
2972
np = card->dev->of_node;
2973
2974
ret = of_property_read_string_index(np, propname, 0, &card->name);
2975
/*
2976
* EINVAL means the property does not exist. This is fine providing
2977
* card->name was previously set, which is checked later in
2978
* snd_soc_register_card.
2979
*/
2980
if (ret < 0 && ret != -EINVAL) {
2981
dev_err(card->dev,
2982
"ASoC: Property '%s' could not be read: %d\n",
2983
propname, ret);
2984
return ret;
2985
}
2986
2987
return 0;
2988
}
2989
EXPORT_SYMBOL_GPL(snd_soc_of_parse_card_name);
2990
2991
static const struct snd_soc_dapm_widget simple_widgets[] = {
2992
SND_SOC_DAPM_MIC("Microphone", NULL),
2993
SND_SOC_DAPM_LINE("Line", NULL),
2994
SND_SOC_DAPM_HP("Headphone", NULL),
2995
SND_SOC_DAPM_SPK("Speaker", NULL),
2996
};
2997
2998
int snd_soc_of_parse_audio_simple_widgets(struct snd_soc_card *card,
2999
const char *propname)
3000
{
3001
struct device_node *np = card->dev->of_node;
3002
struct snd_soc_dapm_widget *widgets;
3003
const char *template, *wname;
3004
int i, j, num_widgets;
3005
3006
num_widgets = of_property_count_strings(np, propname);
3007
if (num_widgets < 0) {
3008
dev_err(card->dev,
3009
"ASoC: Property '%s' does not exist\n", propname);
3010
return -EINVAL;
3011
}
3012
if (!num_widgets) {
3013
dev_err(card->dev, "ASoC: Property '%s's length is zero\n",
3014
propname);
3015
return -EINVAL;
3016
}
3017
if (num_widgets & 1) {
3018
dev_err(card->dev,
3019
"ASoC: Property '%s' length is not even\n", propname);
3020
return -EINVAL;
3021
}
3022
3023
num_widgets /= 2;
3024
3025
widgets = devm_kcalloc(card->dev, num_widgets, sizeof(*widgets),
3026
GFP_KERNEL);
3027
if (!widgets) {
3028
dev_err(card->dev,
3029
"ASoC: Could not allocate memory for widgets\n");
3030
return -ENOMEM;
3031
}
3032
3033
for (i = 0; i < num_widgets; i++) {
3034
int ret = of_property_read_string_index(np, propname,
3035
2 * i, &template);
3036
if (ret) {
3037
dev_err(card->dev,
3038
"ASoC: Property '%s' index %d read error:%d\n",
3039
propname, 2 * i, ret);
3040
return -EINVAL;
3041
}
3042
3043
for (j = 0; j < ARRAY_SIZE(simple_widgets); j++) {
3044
if (!strncmp(template, simple_widgets[j].name,
3045
strlen(simple_widgets[j].name))) {
3046
widgets[i] = simple_widgets[j];
3047
break;
3048
}
3049
}
3050
3051
if (j >= ARRAY_SIZE(simple_widgets)) {
3052
dev_err(card->dev,
3053
"ASoC: DAPM widget '%s' is not supported\n",
3054
template);
3055
return -EINVAL;
3056
}
3057
3058
ret = of_property_read_string_index(np, propname,
3059
(2 * i) + 1,
3060
&wname);
3061
if (ret) {
3062
dev_err(card->dev,
3063
"ASoC: Property '%s' index %d read error:%d\n",
3064
propname, (2 * i) + 1, ret);
3065
return -EINVAL;
3066
}
3067
3068
widgets[i].name = wname;
3069
}
3070
3071
card->of_dapm_widgets = widgets;
3072
card->num_of_dapm_widgets = num_widgets;
3073
3074
return 0;
3075
}
3076
EXPORT_SYMBOL_GPL(snd_soc_of_parse_audio_simple_widgets);
3077
3078
int snd_soc_of_parse_pin_switches(struct snd_soc_card *card, const char *prop)
3079
{
3080
const unsigned int nb_controls_max = 16;
3081
const char **strings, *control_name;
3082
struct snd_kcontrol_new *controls;
3083
struct device *dev = card->dev;
3084
unsigned int i, nb_controls;
3085
int ret;
3086
3087
if (!of_property_present(dev->of_node, prop))
3088
return 0;
3089
3090
strings = devm_kcalloc(dev, nb_controls_max,
3091
sizeof(*strings), GFP_KERNEL);
3092
if (!strings)
3093
return -ENOMEM;
3094
3095
ret = of_property_read_string_array(dev->of_node, prop,
3096
strings, nb_controls_max);
3097
if (ret < 0)
3098
return ret;
3099
3100
nb_controls = (unsigned int)ret;
3101
3102
controls = devm_kcalloc(dev, nb_controls,
3103
sizeof(*controls), GFP_KERNEL);
3104
if (!controls)
3105
return -ENOMEM;
3106
3107
for (i = 0; i < nb_controls; i++) {
3108
control_name = devm_kasprintf(dev, GFP_KERNEL,
3109
"%s Switch", strings[i]);
3110
if (!control_name)
3111
return -ENOMEM;
3112
3113
controls[i].iface = SNDRV_CTL_ELEM_IFACE_MIXER;
3114
controls[i].name = control_name;
3115
controls[i].info = snd_soc_dapm_info_pin_switch;
3116
controls[i].get = snd_soc_dapm_get_pin_switch;
3117
controls[i].put = snd_soc_dapm_put_pin_switch;
3118
controls[i].private_value = (unsigned long)strings[i];
3119
}
3120
3121
card->controls = controls;
3122
card->num_controls = nb_controls;
3123
3124
return 0;
3125
}
3126
EXPORT_SYMBOL_GPL(snd_soc_of_parse_pin_switches);
3127
3128
int snd_soc_of_get_slot_mask(struct device_node *np,
3129
const char *prop_name,
3130
unsigned int *mask)
3131
{
3132
u32 val;
3133
const __be32 *of_slot_mask = of_get_property(np, prop_name, &val);
3134
int i;
3135
3136
if (!of_slot_mask)
3137
return 0;
3138
val /= sizeof(u32);
3139
for (i = 0; i < val; i++)
3140
if (be32_to_cpup(&of_slot_mask[i]))
3141
*mask |= (1 << i);
3142
3143
return val;
3144
}
3145
EXPORT_SYMBOL_GPL(snd_soc_of_get_slot_mask);
3146
3147
int snd_soc_of_parse_tdm_slot(struct device_node *np,
3148
unsigned int *tx_mask,
3149
unsigned int *rx_mask,
3150
unsigned int *slots,
3151
unsigned int *slot_width)
3152
{
3153
u32 val;
3154
int ret;
3155
3156
if (tx_mask)
3157
snd_soc_of_get_slot_mask(np, "dai-tdm-slot-tx-mask", tx_mask);
3158
if (rx_mask)
3159
snd_soc_of_get_slot_mask(np, "dai-tdm-slot-rx-mask", rx_mask);
3160
3161
ret = of_property_read_u32(np, "dai-tdm-slot-num", &val);
3162
if (ret && ret != -EINVAL)
3163
return ret;
3164
if (!ret && slots)
3165
*slots = val;
3166
3167
ret = of_property_read_u32(np, "dai-tdm-slot-width", &val);
3168
if (ret && ret != -EINVAL)
3169
return ret;
3170
if (!ret && slot_width)
3171
*slot_width = val;
3172
3173
return 0;
3174
}
3175
EXPORT_SYMBOL_GPL(snd_soc_of_parse_tdm_slot);
3176
3177
void snd_soc_dlc_use_cpu_as_platform(struct snd_soc_dai_link_component *platforms,
3178
struct snd_soc_dai_link_component *cpus)
3179
{
3180
platforms->of_node = cpus->of_node;
3181
platforms->dai_args = cpus->dai_args;
3182
}
3183
EXPORT_SYMBOL_GPL(snd_soc_dlc_use_cpu_as_platform);
3184
3185
void snd_soc_of_parse_node_prefix(struct device_node *np,
3186
struct snd_soc_codec_conf *codec_conf,
3187
struct device_node *of_node,
3188
const char *propname)
3189
{
3190
const char *str;
3191
int ret;
3192
3193
ret = of_property_read_string(np, propname, &str);
3194
if (ret < 0) {
3195
/* no prefix is not error */
3196
return;
3197
}
3198
3199
codec_conf->dlc.of_node = of_node;
3200
codec_conf->name_prefix = str;
3201
}
3202
EXPORT_SYMBOL_GPL(snd_soc_of_parse_node_prefix);
3203
3204
int snd_soc_of_parse_audio_routing(struct snd_soc_card *card,
3205
const char *propname)
3206
{
3207
struct device_node *np = card->dev->of_node;
3208
int num_routes;
3209
struct snd_soc_dapm_route *routes;
3210
int i;
3211
3212
num_routes = of_property_count_strings(np, propname);
3213
if (num_routes < 0 || num_routes & 1) {
3214
dev_err(card->dev,
3215
"ASoC: Property '%s' does not exist or its length is not even\n",
3216
propname);
3217
return -EINVAL;
3218
}
3219
num_routes /= 2;
3220
3221
routes = devm_kcalloc(card->dev, num_routes, sizeof(*routes),
3222
GFP_KERNEL);
3223
if (!routes) {
3224
dev_err(card->dev,
3225
"ASoC: Could not allocate DAPM route table\n");
3226
return -ENOMEM;
3227
}
3228
3229
for (i = 0; i < num_routes; i++) {
3230
int ret = of_property_read_string_index(np, propname,
3231
2 * i, &routes[i].sink);
3232
if (ret) {
3233
dev_err(card->dev,
3234
"ASoC: Property '%s' index %d could not be read: %d\n",
3235
propname, 2 * i, ret);
3236
return -EINVAL;
3237
}
3238
ret = of_property_read_string_index(np, propname,
3239
(2 * i) + 1, &routes[i].source);
3240
if (ret) {
3241
dev_err(card->dev,
3242
"ASoC: Property '%s' index %d could not be read: %d\n",
3243
propname, (2 * i) + 1, ret);
3244
return -EINVAL;
3245
}
3246
}
3247
3248
card->num_of_dapm_routes = num_routes;
3249
card->of_dapm_routes = routes;
3250
3251
return 0;
3252
}
3253
EXPORT_SYMBOL_GPL(snd_soc_of_parse_audio_routing);
3254
3255
int snd_soc_of_parse_aux_devs(struct snd_soc_card *card, const char *propname)
3256
{
3257
struct device_node *node = card->dev->of_node;
3258
struct snd_soc_aux_dev *aux;
3259
int num, i;
3260
3261
num = of_count_phandle_with_args(node, propname, NULL);
3262
if (num == -ENOENT) {
3263
return 0;
3264
} else if (num < 0) {
3265
dev_err(card->dev, "ASOC: Property '%s' could not be read: %d\n",
3266
propname, num);
3267
return num;
3268
}
3269
3270
aux = devm_kcalloc(card->dev, num, sizeof(*aux), GFP_KERNEL);
3271
if (!aux)
3272
return -ENOMEM;
3273
card->aux_dev = aux;
3274
card->num_aux_devs = num;
3275
3276
for_each_card_pre_auxs(card, i, aux) {
3277
aux->dlc.of_node = of_parse_phandle(node, propname, i);
3278
if (!aux->dlc.of_node)
3279
return -EINVAL;
3280
}
3281
3282
return 0;
3283
}
3284
EXPORT_SYMBOL_GPL(snd_soc_of_parse_aux_devs);
3285
3286
unsigned int snd_soc_daifmt_clock_provider_flipped(unsigned int dai_fmt)
3287
{
3288
unsigned int inv_dai_fmt = dai_fmt & ~SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK;
3289
3290
switch (dai_fmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) {
3291
case SND_SOC_DAIFMT_CBP_CFP:
3292
inv_dai_fmt |= SND_SOC_DAIFMT_CBC_CFC;
3293
break;
3294
case SND_SOC_DAIFMT_CBP_CFC:
3295
inv_dai_fmt |= SND_SOC_DAIFMT_CBC_CFP;
3296
break;
3297
case SND_SOC_DAIFMT_CBC_CFP:
3298
inv_dai_fmt |= SND_SOC_DAIFMT_CBP_CFC;
3299
break;
3300
case SND_SOC_DAIFMT_CBC_CFC:
3301
inv_dai_fmt |= SND_SOC_DAIFMT_CBP_CFP;
3302
break;
3303
}
3304
3305
return inv_dai_fmt;
3306
}
3307
EXPORT_SYMBOL_GPL(snd_soc_daifmt_clock_provider_flipped);
3308
3309
unsigned int snd_soc_daifmt_clock_provider_from_bitmap(unsigned int bit_frame)
3310
{
3311
/*
3312
* bit_frame is return value from
3313
* snd_soc_daifmt_parse_clock_provider_raw()
3314
*/
3315
3316
/* Codec base */
3317
switch (bit_frame) {
3318
case 0x11:
3319
return SND_SOC_DAIFMT_CBP_CFP;
3320
case 0x10:
3321
return SND_SOC_DAIFMT_CBP_CFC;
3322
case 0x01:
3323
return SND_SOC_DAIFMT_CBC_CFP;
3324
default:
3325
return SND_SOC_DAIFMT_CBC_CFC;
3326
}
3327
3328
return 0;
3329
}
3330
EXPORT_SYMBOL_GPL(snd_soc_daifmt_clock_provider_from_bitmap);
3331
3332
unsigned int snd_soc_daifmt_parse_format(struct device_node *np,
3333
const char *prefix)
3334
{
3335
int ret;
3336
char prop[128];
3337
unsigned int format = 0;
3338
int bit, frame;
3339
const char *str;
3340
struct {
3341
char *name;
3342
unsigned int val;
3343
} of_fmt_table[] = {
3344
{ "i2s", SND_SOC_DAIFMT_I2S },
3345
{ "right_j", SND_SOC_DAIFMT_RIGHT_J },
3346
{ "left_j", SND_SOC_DAIFMT_LEFT_J },
3347
{ "dsp_a", SND_SOC_DAIFMT_DSP_A },
3348
{ "dsp_b", SND_SOC_DAIFMT_DSP_B },
3349
{ "ac97", SND_SOC_DAIFMT_AC97 },
3350
{ "pdm", SND_SOC_DAIFMT_PDM},
3351
{ "msb", SND_SOC_DAIFMT_MSB },
3352
{ "lsb", SND_SOC_DAIFMT_LSB },
3353
};
3354
3355
if (!prefix)
3356
prefix = "";
3357
3358
/*
3359
* check "dai-format = xxx"
3360
* or "[prefix]format = xxx"
3361
* SND_SOC_DAIFMT_FORMAT_MASK area
3362
*/
3363
ret = of_property_read_string(np, "dai-format", &str);
3364
if (ret < 0) {
3365
snprintf(prop, sizeof(prop), "%sformat", prefix);
3366
ret = of_property_read_string(np, prop, &str);
3367
}
3368
if (ret == 0) {
3369
int i;
3370
3371
for (i = 0; i < ARRAY_SIZE(of_fmt_table); i++) {
3372
if (strcmp(str, of_fmt_table[i].name) == 0) {
3373
format |= of_fmt_table[i].val;
3374
break;
3375
}
3376
}
3377
}
3378
3379
/*
3380
* check "[prefix]continuous-clock"
3381
* SND_SOC_DAIFMT_CLOCK_MASK area
3382
*/
3383
snprintf(prop, sizeof(prop), "%scontinuous-clock", prefix);
3384
if (of_property_read_bool(np, prop))
3385
format |= SND_SOC_DAIFMT_CONT;
3386
else
3387
format |= SND_SOC_DAIFMT_GATED;
3388
3389
/*
3390
* check "[prefix]bitclock-inversion"
3391
* check "[prefix]frame-inversion"
3392
* SND_SOC_DAIFMT_INV_MASK area
3393
*/
3394
snprintf(prop, sizeof(prop), "%sbitclock-inversion", prefix);
3395
bit = of_property_read_bool(np, prop);
3396
3397
snprintf(prop, sizeof(prop), "%sframe-inversion", prefix);
3398
frame = of_property_read_bool(np, prop);
3399
3400
switch ((bit << 4) + frame) {
3401
case 0x11:
3402
format |= SND_SOC_DAIFMT_IB_IF;
3403
break;
3404
case 0x10:
3405
format |= SND_SOC_DAIFMT_IB_NF;
3406
break;
3407
case 0x01:
3408
format |= SND_SOC_DAIFMT_NB_IF;
3409
break;
3410
default:
3411
/* SND_SOC_DAIFMT_NB_NF is default */
3412
break;
3413
}
3414
3415
return format;
3416
}
3417
EXPORT_SYMBOL_GPL(snd_soc_daifmt_parse_format);
3418
3419
unsigned int snd_soc_daifmt_parse_clock_provider_raw(struct device_node *np,
3420
const char *prefix,
3421
struct device_node **bitclkmaster,
3422
struct device_node **framemaster)
3423
{
3424
char prop[128];
3425
unsigned int bit, frame;
3426
3427
if (!np)
3428
return 0;
3429
3430
if (!prefix)
3431
prefix = "";
3432
3433
/*
3434
* check "[prefix]bitclock-master"
3435
* check "[prefix]frame-master"
3436
*/
3437
snprintf(prop, sizeof(prop), "%sbitclock-master", prefix);
3438
bit = of_property_present(np, prop);
3439
if (bit && bitclkmaster)
3440
*bitclkmaster = of_parse_phandle(np, prop, 0);
3441
3442
snprintf(prop, sizeof(prop), "%sframe-master", prefix);
3443
frame = of_property_present(np, prop);
3444
if (frame && framemaster)
3445
*framemaster = of_parse_phandle(np, prop, 0);
3446
3447
/*
3448
* return bitmap.
3449
* It will be parameter of
3450
* snd_soc_daifmt_clock_provider_from_bitmap()
3451
*/
3452
return (bit << 4) + frame;
3453
}
3454
EXPORT_SYMBOL_GPL(snd_soc_daifmt_parse_clock_provider_raw);
3455
3456
int snd_soc_get_stream_cpu(const struct snd_soc_dai_link *dai_link, int stream)
3457
{
3458
/*
3459
* [Normal]
3460
*
3461
* Playback
3462
* CPU : SNDRV_PCM_STREAM_PLAYBACK
3463
* Codec: SNDRV_PCM_STREAM_PLAYBACK
3464
*
3465
* Capture
3466
* CPU : SNDRV_PCM_STREAM_CAPTURE
3467
* Codec: SNDRV_PCM_STREAM_CAPTURE
3468
*/
3469
if (!dai_link->c2c_params)
3470
return stream;
3471
3472
/*
3473
* [Codec2Codec]
3474
*
3475
* Playback
3476
* CPU : SNDRV_PCM_STREAM_CAPTURE
3477
* Codec: SNDRV_PCM_STREAM_PLAYBACK
3478
*
3479
* Capture
3480
* CPU : SNDRV_PCM_STREAM_PLAYBACK
3481
* Codec: SNDRV_PCM_STREAM_CAPTURE
3482
*/
3483
if (stream == SNDRV_PCM_STREAM_CAPTURE)
3484
return SNDRV_PCM_STREAM_PLAYBACK;
3485
3486
return SNDRV_PCM_STREAM_CAPTURE;
3487
}
3488
EXPORT_SYMBOL_GPL(snd_soc_get_stream_cpu);
3489
3490
int snd_soc_get_dai_id(struct device_node *ep)
3491
{
3492
struct snd_soc_component *component;
3493
struct snd_soc_dai_link_component dlc = {
3494
.of_node = of_graph_get_port_parent(ep),
3495
};
3496
int ret;
3497
3498
3499
/*
3500
* For example HDMI case, HDMI has video/sound port,
3501
* but ALSA SoC needs sound port number only.
3502
* Thus counting HDMI DT port/endpoint doesn't work.
3503
* Then, it should have .of_xlate_dai_id
3504
*/
3505
ret = -ENOTSUPP;
3506
mutex_lock(&client_mutex);
3507
component = soc_find_component(&dlc);
3508
if (component)
3509
ret = snd_soc_component_of_xlate_dai_id(component, ep);
3510
mutex_unlock(&client_mutex);
3511
3512
of_node_put(dlc.of_node);
3513
3514
return ret;
3515
}
3516
EXPORT_SYMBOL_GPL(snd_soc_get_dai_id);
3517
3518
int snd_soc_get_dlc(const struct of_phandle_args *args, struct snd_soc_dai_link_component *dlc)
3519
{
3520
struct snd_soc_component *pos;
3521
int ret = -EPROBE_DEFER;
3522
3523
mutex_lock(&client_mutex);
3524
for_each_component(pos) {
3525
struct device_node *component_of_node = soc_component_to_node(pos);
3526
3527
if (component_of_node != args->np || !pos->num_dai)
3528
continue;
3529
3530
ret = snd_soc_component_of_xlate_dai_name(pos, args, &dlc->dai_name);
3531
if (ret == -ENOTSUPP) {
3532
struct snd_soc_dai *dai;
3533
int id = -1;
3534
3535
switch (args->args_count) {
3536
case 0:
3537
id = 0; /* same as dai_drv[0] */
3538
break;
3539
case 1:
3540
id = args->args[0];
3541
break;
3542
default:
3543
/* not supported */
3544
break;
3545
}
3546
3547
if (id < 0 || id >= pos->num_dai) {
3548
ret = -EINVAL;
3549
continue;
3550
}
3551
3552
ret = 0;
3553
3554
/* find target DAI */
3555
for_each_component_dais(pos, dai) {
3556
if (id == 0)
3557
break;
3558
id--;
3559
}
3560
3561
dlc->dai_name = snd_soc_dai_name_get(dai);
3562
} else if (ret) {
3563
/*
3564
* if another error than ENOTSUPP is returned go on and
3565
* check if another component is provided with the same
3566
* node. This may happen if a device provides several
3567
* components
3568
*/
3569
continue;
3570
}
3571
3572
break;
3573
}
3574
3575
if (ret == 0)
3576
dlc->of_node = args->np;
3577
3578
mutex_unlock(&client_mutex);
3579
return ret;
3580
}
3581
EXPORT_SYMBOL_GPL(snd_soc_get_dlc);
3582
3583
int snd_soc_of_get_dlc(struct device_node *of_node,
3584
struct of_phandle_args *args,
3585
struct snd_soc_dai_link_component *dlc,
3586
int index)
3587
{
3588
struct of_phandle_args __args;
3589
int ret;
3590
3591
if (!args)
3592
args = &__args;
3593
3594
ret = of_parse_phandle_with_args(of_node, "sound-dai",
3595
"#sound-dai-cells", index, args);
3596
if (ret)
3597
return ret;
3598
3599
return snd_soc_get_dlc(args, dlc);
3600
}
3601
EXPORT_SYMBOL_GPL(snd_soc_of_get_dlc);
3602
3603
int snd_soc_get_dai_name(const struct of_phandle_args *args,
3604
const char **dai_name)
3605
{
3606
struct snd_soc_dai_link_component dlc;
3607
int ret = snd_soc_get_dlc(args, &dlc);
3608
3609
if (ret == 0)
3610
*dai_name = dlc.dai_name;
3611
3612
return ret;
3613
}
3614
EXPORT_SYMBOL_GPL(snd_soc_get_dai_name);
3615
3616
int snd_soc_of_get_dai_name(struct device_node *of_node,
3617
const char **dai_name, int index)
3618
{
3619
struct snd_soc_dai_link_component dlc;
3620
int ret = snd_soc_of_get_dlc(of_node, NULL, &dlc, index);
3621
3622
if (ret == 0)
3623
*dai_name = dlc.dai_name;
3624
3625
return ret;
3626
}
3627
EXPORT_SYMBOL_GPL(snd_soc_of_get_dai_name);
3628
3629
struct snd_soc_dai *snd_soc_get_dai_via_args(const struct of_phandle_args *dai_args)
3630
{
3631
struct snd_soc_dai *dai;
3632
struct snd_soc_component *component;
3633
3634
mutex_lock(&client_mutex);
3635
for_each_component(component) {
3636
for_each_component_dais(component, dai)
3637
if (snd_soc_is_match_dai_args(dai->driver->dai_args, dai_args))
3638
goto found;
3639
}
3640
dai = NULL;
3641
found:
3642
mutex_unlock(&client_mutex);
3643
return dai;
3644
}
3645
EXPORT_SYMBOL_GPL(snd_soc_get_dai_via_args);
3646
3647
static void __snd_soc_of_put_component(struct snd_soc_dai_link_component *component)
3648
{
3649
if (component->of_node) {
3650
of_node_put(component->of_node);
3651
component->of_node = NULL;
3652
}
3653
}
3654
3655
static int __snd_soc_of_get_dai_link_component_alloc(
3656
struct device *dev, struct device_node *of_node,
3657
struct snd_soc_dai_link_component **ret_component,
3658
int *ret_num)
3659
{
3660
struct snd_soc_dai_link_component *component;
3661
int num;
3662
3663
/* Count the number of CPUs/CODECs */
3664
num = of_count_phandle_with_args(of_node, "sound-dai", "#sound-dai-cells");
3665
if (num <= 0) {
3666
if (num == -ENOENT)
3667
dev_err(dev, "No 'sound-dai' property\n");
3668
else
3669
dev_err(dev, "Bad phandle in 'sound-dai'\n");
3670
return num;
3671
}
3672
component = devm_kcalloc(dev, num, sizeof(*component), GFP_KERNEL);
3673
if (!component)
3674
return -ENOMEM;
3675
3676
*ret_component = component;
3677
*ret_num = num;
3678
3679
return 0;
3680
}
3681
3682
/*
3683
* snd_soc_of_put_dai_link_codecs - Dereference device nodes in the codecs array
3684
* @dai_link: DAI link
3685
*
3686
* Dereference device nodes acquired by snd_soc_of_get_dai_link_codecs().
3687
*/
3688
void snd_soc_of_put_dai_link_codecs(struct snd_soc_dai_link *dai_link)
3689
{
3690
struct snd_soc_dai_link_component *component;
3691
int index;
3692
3693
for_each_link_codecs(dai_link, index, component)
3694
__snd_soc_of_put_component(component);
3695
}
3696
EXPORT_SYMBOL_GPL(snd_soc_of_put_dai_link_codecs);
3697
3698
/*
3699
* snd_soc_of_get_dai_link_codecs - Parse a list of CODECs in the devicetree
3700
* @dev: Card device
3701
* @of_node: Device node
3702
* @dai_link: DAI link
3703
*
3704
* Builds an array of CODEC DAI components from the DAI link property
3705
* 'sound-dai'.
3706
* The array is set in the DAI link and the number of DAIs is set accordingly.
3707
* The device nodes in the array (of_node) must be dereferenced by calling
3708
* snd_soc_of_put_dai_link_codecs() on @dai_link.
3709
*
3710
* Returns 0 for success
3711
*/
3712
int snd_soc_of_get_dai_link_codecs(struct device *dev,
3713
struct device_node *of_node,
3714
struct snd_soc_dai_link *dai_link)
3715
{
3716
struct snd_soc_dai_link_component *component;
3717
int index, ret;
3718
3719
ret = __snd_soc_of_get_dai_link_component_alloc(dev, of_node,
3720
&dai_link->codecs, &dai_link->num_codecs);
3721
if (ret < 0)
3722
return ret;
3723
3724
/* Parse the list */
3725
for_each_link_codecs(dai_link, index, component) {
3726
ret = snd_soc_of_get_dlc(of_node, NULL, component, index);
3727
if (ret)
3728
goto err;
3729
}
3730
return 0;
3731
err:
3732
snd_soc_of_put_dai_link_codecs(dai_link);
3733
dai_link->codecs = NULL;
3734
dai_link->num_codecs = 0;
3735
return ret;
3736
}
3737
EXPORT_SYMBOL_GPL(snd_soc_of_get_dai_link_codecs);
3738
3739
/*
3740
* snd_soc_of_put_dai_link_cpus - Dereference device nodes in the codecs array
3741
* @dai_link: DAI link
3742
*
3743
* Dereference device nodes acquired by snd_soc_of_get_dai_link_cpus().
3744
*/
3745
void snd_soc_of_put_dai_link_cpus(struct snd_soc_dai_link *dai_link)
3746
{
3747
struct snd_soc_dai_link_component *component;
3748
int index;
3749
3750
for_each_link_cpus(dai_link, index, component)
3751
__snd_soc_of_put_component(component);
3752
}
3753
EXPORT_SYMBOL_GPL(snd_soc_of_put_dai_link_cpus);
3754
3755
/*
3756
* snd_soc_of_get_dai_link_cpus - Parse a list of CPU DAIs in the devicetree
3757
* @dev: Card device
3758
* @of_node: Device node
3759
* @dai_link: DAI link
3760
*
3761
* Is analogous to snd_soc_of_get_dai_link_codecs but parses a list of CPU DAIs
3762
* instead.
3763
*
3764
* Returns 0 for success
3765
*/
3766
int snd_soc_of_get_dai_link_cpus(struct device *dev,
3767
struct device_node *of_node,
3768
struct snd_soc_dai_link *dai_link)
3769
{
3770
struct snd_soc_dai_link_component *component;
3771
int index, ret;
3772
3773
/* Count the number of CPUs */
3774
ret = __snd_soc_of_get_dai_link_component_alloc(dev, of_node,
3775
&dai_link->cpus, &dai_link->num_cpus);
3776
if (ret < 0)
3777
return ret;
3778
3779
/* Parse the list */
3780
for_each_link_cpus(dai_link, index, component) {
3781
ret = snd_soc_of_get_dlc(of_node, NULL, component, index);
3782
if (ret)
3783
goto err;
3784
}
3785
return 0;
3786
err:
3787
snd_soc_of_put_dai_link_cpus(dai_link);
3788
dai_link->cpus = NULL;
3789
dai_link->num_cpus = 0;
3790
return ret;
3791
}
3792
EXPORT_SYMBOL_GPL(snd_soc_of_get_dai_link_cpus);
3793
3794
static int __init snd_soc_init(void)
3795
{
3796
int ret;
3797
3798
snd_soc_debugfs_init();
3799
ret = snd_soc_util_init();
3800
if (ret)
3801
goto err_util_init;
3802
3803
ret = platform_driver_register(&soc_driver);
3804
if (ret)
3805
goto err_register;
3806
return 0;
3807
3808
err_register:
3809
snd_soc_util_exit();
3810
err_util_init:
3811
snd_soc_debugfs_exit();
3812
return ret;
3813
}
3814
module_init(snd_soc_init);
3815
3816
static void __exit snd_soc_exit(void)
3817
{
3818
snd_soc_util_exit();
3819
snd_soc_debugfs_exit();
3820
3821
platform_driver_unregister(&soc_driver);
3822
}
3823
module_exit(snd_soc_exit);
3824
3825
/* Module information */
3826
MODULE_AUTHOR("Liam Girdwood, [email protected]");
3827
MODULE_DESCRIPTION("ALSA SoC Core");
3828
MODULE_LICENSE("GPL");
3829
MODULE_ALIAS("platform:soc-audio");
3830
3831