0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020 #include <linux/module.h>
0021 #include <linux/moduleparam.h>
0022 #include <linux/init.h>
0023 #include <linux/delay.h>
0024 #include <linux/pm.h>
0025 #include <linux/bitops.h>
0026 #include <linux/debugfs.h>
0027 #include <linux/platform_device.h>
0028 #include <linux/pinctrl/consumer.h>
0029 #include <linux/ctype.h>
0030 #include <linux/slab.h>
0031 #include <linux/of.h>
0032 #include <linux/of_graph.h>
0033 #include <linux/dmi.h>
0034 #include <linux/acpi.h>
0035 #include <sound/core.h>
0036 #include <sound/pcm.h>
0037 #include <sound/pcm_params.h>
0038 #include <sound/soc.h>
0039 #include <sound/soc-dpcm.h>
0040 #include <sound/soc-topology.h>
0041 #include <sound/soc-link.h>
0042 #include <sound/initval.h>
0043
0044 #define CREATE_TRACE_POINTS
0045 #include <trace/events/asoc.h>
0046
0047 static DEFINE_MUTEX(client_mutex);
0048 static LIST_HEAD(component_list);
0049 static LIST_HEAD(unbind_card_list);
0050
0051 #define for_each_component(component) \
0052 list_for_each_entry(component, &component_list, list)
0053
0054
0055
0056
0057
0058 struct snd_soc_dai_link_component null_dailink_component[0];
0059 EXPORT_SYMBOL_GPL(null_dailink_component);
0060
0061
0062
0063
0064
0065
0066 static int pmdown_time = 5000;
0067 module_param(pmdown_time, int, 0);
0068 MODULE_PARM_DESC(pmdown_time, "DAPM stream powerdown time (msecs)");
0069
0070 static ssize_t pmdown_time_show(struct device *dev,
0071 struct device_attribute *attr, char *buf)
0072 {
0073 struct snd_soc_pcm_runtime *rtd = dev_get_drvdata(dev);
0074
0075 return sprintf(buf, "%ld\n", rtd->pmdown_time);
0076 }
0077
0078 static ssize_t pmdown_time_store(struct device *dev,
0079 struct device_attribute *attr,
0080 const char *buf, size_t count)
0081 {
0082 struct snd_soc_pcm_runtime *rtd = dev_get_drvdata(dev);
0083 int ret;
0084
0085 ret = kstrtol(buf, 10, &rtd->pmdown_time);
0086 if (ret)
0087 return ret;
0088
0089 return count;
0090 }
0091
0092 static DEVICE_ATTR_RW(pmdown_time);
0093
0094 static struct attribute *soc_dev_attrs[] = {
0095 &dev_attr_pmdown_time.attr,
0096 NULL
0097 };
0098
0099 static umode_t soc_dev_attr_is_visible(struct kobject *kobj,
0100 struct attribute *attr, int idx)
0101 {
0102 struct device *dev = kobj_to_dev(kobj);
0103 struct snd_soc_pcm_runtime *rtd = dev_get_drvdata(dev);
0104
0105 if (!rtd)
0106 return 0;
0107
0108 if (attr == &dev_attr_pmdown_time.attr)
0109 return attr->mode;
0110 return rtd->num_codecs ? attr->mode : 0;
0111 }
0112
0113 static const struct attribute_group soc_dapm_dev_group = {
0114 .attrs = soc_dapm_dev_attrs,
0115 .is_visible = soc_dev_attr_is_visible,
0116 };
0117
0118 static const struct attribute_group soc_dev_group = {
0119 .attrs = soc_dev_attrs,
0120 .is_visible = soc_dev_attr_is_visible,
0121 };
0122
0123 static const struct attribute_group *soc_dev_attr_groups[] = {
0124 &soc_dapm_dev_group,
0125 &soc_dev_group,
0126 NULL
0127 };
0128
0129 #ifdef CONFIG_DEBUG_FS
0130 struct dentry *snd_soc_debugfs_root;
0131 EXPORT_SYMBOL_GPL(snd_soc_debugfs_root);
0132
0133 static void soc_init_component_debugfs(struct snd_soc_component *component)
0134 {
0135 if (!component->card->debugfs_card_root)
0136 return;
0137
0138 if (component->debugfs_prefix) {
0139 char *name;
0140
0141 name = kasprintf(GFP_KERNEL, "%s:%s",
0142 component->debugfs_prefix, component->name);
0143 if (name) {
0144 component->debugfs_root = debugfs_create_dir(name,
0145 component->card->debugfs_card_root);
0146 kfree(name);
0147 }
0148 } else {
0149 component->debugfs_root = debugfs_create_dir(component->name,
0150 component->card->debugfs_card_root);
0151 }
0152
0153 snd_soc_dapm_debugfs_init(snd_soc_component_get_dapm(component),
0154 component->debugfs_root);
0155 }
0156
0157 static void soc_cleanup_component_debugfs(struct snd_soc_component *component)
0158 {
0159 if (!component->debugfs_root)
0160 return;
0161 debugfs_remove_recursive(component->debugfs_root);
0162 component->debugfs_root = NULL;
0163 }
0164
0165 static int dai_list_show(struct seq_file *m, void *v)
0166 {
0167 struct snd_soc_component *component;
0168 struct snd_soc_dai *dai;
0169
0170 mutex_lock(&client_mutex);
0171
0172 for_each_component(component)
0173 for_each_component_dais(component, dai)
0174 seq_printf(m, "%s\n", dai->name);
0175
0176 mutex_unlock(&client_mutex);
0177
0178 return 0;
0179 }
0180 DEFINE_SHOW_ATTRIBUTE(dai_list);
0181
0182 static int component_list_show(struct seq_file *m, void *v)
0183 {
0184 struct snd_soc_component *component;
0185
0186 mutex_lock(&client_mutex);
0187
0188 for_each_component(component)
0189 seq_printf(m, "%s\n", component->name);
0190
0191 mutex_unlock(&client_mutex);
0192
0193 return 0;
0194 }
0195 DEFINE_SHOW_ATTRIBUTE(component_list);
0196
0197 static void soc_init_card_debugfs(struct snd_soc_card *card)
0198 {
0199 card->debugfs_card_root = debugfs_create_dir(card->name,
0200 snd_soc_debugfs_root);
0201
0202 debugfs_create_u32("dapm_pop_time", 0644, card->debugfs_card_root,
0203 &card->pop_time);
0204
0205 snd_soc_dapm_debugfs_init(&card->dapm, card->debugfs_card_root);
0206 }
0207
0208 static void soc_cleanup_card_debugfs(struct snd_soc_card *card)
0209 {
0210 debugfs_remove_recursive(card->debugfs_card_root);
0211 card->debugfs_card_root = NULL;
0212 }
0213
0214 static void snd_soc_debugfs_init(void)
0215 {
0216 snd_soc_debugfs_root = debugfs_create_dir("asoc", NULL);
0217
0218 debugfs_create_file("dais", 0444, snd_soc_debugfs_root, NULL,
0219 &dai_list_fops);
0220
0221 debugfs_create_file("components", 0444, snd_soc_debugfs_root, NULL,
0222 &component_list_fops);
0223 }
0224
0225 static void snd_soc_debugfs_exit(void)
0226 {
0227 debugfs_remove_recursive(snd_soc_debugfs_root);
0228 }
0229
0230 #else
0231
0232 static inline void soc_init_component_debugfs(struct snd_soc_component *component) { }
0233 static inline void soc_cleanup_component_debugfs(struct snd_soc_component *component) { }
0234 static inline void soc_init_card_debugfs(struct snd_soc_card *card) { }
0235 static inline void soc_cleanup_card_debugfs(struct snd_soc_card *card) { }
0236 static inline void snd_soc_debugfs_init(void) { }
0237 static inline void snd_soc_debugfs_exit(void) { }
0238
0239 #endif
0240
0241 static int snd_soc_rtd_add_component(struct snd_soc_pcm_runtime *rtd,
0242 struct snd_soc_component *component)
0243 {
0244 struct snd_soc_component *comp;
0245 int i;
0246
0247 for_each_rtd_components(rtd, i, comp) {
0248
0249 if (comp == component)
0250 return 0;
0251 }
0252
0253
0254 rtd->components[rtd->num_components] = component;
0255 rtd->num_components++;
0256
0257 return 0;
0258 }
0259
0260 struct snd_soc_component *snd_soc_rtdcom_lookup(struct snd_soc_pcm_runtime *rtd,
0261 const char *driver_name)
0262 {
0263 struct snd_soc_component *component;
0264 int i;
0265
0266 if (!driver_name)
0267 return NULL;
0268
0269
0270
0271
0272
0273
0274
0275
0276
0277 for_each_rtd_components(rtd, i, component) {
0278 const char *component_name = component->driver->name;
0279
0280 if (!component_name)
0281 continue;
0282
0283 if ((component_name == driver_name) ||
0284 strcmp(component_name, driver_name) == 0)
0285 return component;
0286 }
0287
0288 return NULL;
0289 }
0290 EXPORT_SYMBOL_GPL(snd_soc_rtdcom_lookup);
0291
0292 struct snd_soc_component
0293 *snd_soc_lookup_component_nolocked(struct device *dev, const char *driver_name)
0294 {
0295 struct snd_soc_component *component;
0296 struct snd_soc_component *found_component;
0297
0298 found_component = NULL;
0299 for_each_component(component) {
0300 if ((dev == component->dev) &&
0301 (!driver_name ||
0302 (driver_name == component->driver->name) ||
0303 (strcmp(component->driver->name, driver_name) == 0))) {
0304 found_component = component;
0305 break;
0306 }
0307 }
0308
0309 return found_component;
0310 }
0311 EXPORT_SYMBOL_GPL(snd_soc_lookup_component_nolocked);
0312
0313 struct snd_soc_component *snd_soc_lookup_component(struct device *dev,
0314 const char *driver_name)
0315 {
0316 struct snd_soc_component *component;
0317
0318 mutex_lock(&client_mutex);
0319 component = snd_soc_lookup_component_nolocked(dev, driver_name);
0320 mutex_unlock(&client_mutex);
0321
0322 return component;
0323 }
0324 EXPORT_SYMBOL_GPL(snd_soc_lookup_component);
0325
0326 struct snd_soc_pcm_runtime
0327 *snd_soc_get_pcm_runtime(struct snd_soc_card *card,
0328 struct snd_soc_dai_link *dai_link)
0329 {
0330 struct snd_soc_pcm_runtime *rtd;
0331
0332 for_each_card_rtds(card, rtd) {
0333 if (rtd->dai_link == dai_link)
0334 return rtd;
0335 }
0336 dev_dbg(card->dev, "ASoC: failed to find rtd %s\n", dai_link->name);
0337 return NULL;
0338 }
0339 EXPORT_SYMBOL_GPL(snd_soc_get_pcm_runtime);
0340
0341
0342
0343
0344
0345
0346 void snd_soc_close_delayed_work(struct snd_soc_pcm_runtime *rtd)
0347 {
0348 struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0);
0349 int playback = SNDRV_PCM_STREAM_PLAYBACK;
0350
0351 mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass);
0352
0353 dev_dbg(rtd->dev,
0354 "ASoC: pop wq checking: %s status: %s waiting: %s\n",
0355 codec_dai->driver->playback.stream_name,
0356 snd_soc_dai_stream_active(codec_dai, playback) ?
0357 "active" : "inactive",
0358 rtd->pop_wait ? "yes" : "no");
0359
0360
0361 if (rtd->pop_wait == 1) {
0362 rtd->pop_wait = 0;
0363 snd_soc_dapm_stream_event(rtd, playback,
0364 SND_SOC_DAPM_STREAM_STOP);
0365 }
0366
0367 mutex_unlock(&rtd->card->pcm_mutex);
0368 }
0369 EXPORT_SYMBOL_GPL(snd_soc_close_delayed_work);
0370
0371 static void soc_release_rtd_dev(struct device *dev)
0372 {
0373
0374 kfree(dev);
0375 }
0376
0377 static void soc_free_pcm_runtime(struct snd_soc_pcm_runtime *rtd)
0378 {
0379 if (!rtd)
0380 return;
0381
0382 list_del(&rtd->list);
0383
0384 if (delayed_work_pending(&rtd->delayed_work))
0385 flush_delayed_work(&rtd->delayed_work);
0386 snd_soc_pcm_component_free(rtd);
0387
0388
0389
0390
0391
0392
0393
0394
0395
0396
0397
0398
0399
0400
0401
0402
0403
0404
0405
0406 device_unregister(rtd->dev);
0407 }
0408
0409 static void close_delayed_work(struct work_struct *work) {
0410 struct snd_soc_pcm_runtime *rtd =
0411 container_of(work, struct snd_soc_pcm_runtime,
0412 delayed_work.work);
0413
0414 if (rtd->close_delayed_work_func)
0415 rtd->close_delayed_work_func(rtd);
0416 }
0417
0418 static struct snd_soc_pcm_runtime *soc_new_pcm_runtime(
0419 struct snd_soc_card *card, struct snd_soc_dai_link *dai_link)
0420 {
0421 struct snd_soc_pcm_runtime *rtd;
0422 struct snd_soc_component *component;
0423 struct device *dev;
0424 int ret;
0425 int stream;
0426
0427
0428
0429
0430 dev = kzalloc(sizeof(struct device), GFP_KERNEL);
0431 if (!dev)
0432 return NULL;
0433
0434 dev->parent = card->dev;
0435 dev->release = soc_release_rtd_dev;
0436
0437 dev_set_name(dev, "%s", dai_link->name);
0438
0439 ret = device_register(dev);
0440 if (ret < 0) {
0441 put_device(dev);
0442 return NULL;
0443 }
0444
0445
0446
0447
0448 rtd = devm_kzalloc(dev,
0449 sizeof(*rtd) +
0450 sizeof(*component) * (dai_link->num_cpus +
0451 dai_link->num_codecs +
0452 dai_link->num_platforms),
0453 GFP_KERNEL);
0454 if (!rtd) {
0455 device_unregister(dev);
0456 return NULL;
0457 }
0458
0459 rtd->dev = dev;
0460 INIT_LIST_HEAD(&rtd->list);
0461 for_each_pcm_streams(stream) {
0462 INIT_LIST_HEAD(&rtd->dpcm[stream].be_clients);
0463 INIT_LIST_HEAD(&rtd->dpcm[stream].fe_clients);
0464 }
0465 dev_set_drvdata(dev, rtd);
0466 INIT_DELAYED_WORK(&rtd->delayed_work, close_delayed_work);
0467
0468
0469
0470
0471 rtd->dais = devm_kcalloc(dev, dai_link->num_cpus + dai_link->num_codecs,
0472 sizeof(struct snd_soc_dai *),
0473 GFP_KERNEL);
0474 if (!rtd->dais)
0475 goto free_rtd;
0476
0477
0478
0479
0480
0481
0482
0483
0484
0485 rtd->num_cpus = dai_link->num_cpus;
0486 rtd->num_codecs = dai_link->num_codecs;
0487 rtd->card = card;
0488 rtd->dai_link = dai_link;
0489 rtd->num = card->num_rtd++;
0490
0491
0492 list_add_tail(&rtd->list, &card->rtd_list);
0493
0494 ret = device_add_groups(dev, soc_dev_attr_groups);
0495 if (ret < 0)
0496 goto free_rtd;
0497
0498 return rtd;
0499
0500 free_rtd:
0501 soc_free_pcm_runtime(rtd);
0502 return NULL;
0503 }
0504
0505 static void snd_soc_flush_all_delayed_work(struct snd_soc_card *card)
0506 {
0507 struct snd_soc_pcm_runtime *rtd;
0508
0509 for_each_card_rtds(card, rtd)
0510 flush_delayed_work(&rtd->delayed_work);
0511 }
0512
0513 #ifdef CONFIG_PM_SLEEP
0514 static void soc_playback_digital_mute(struct snd_soc_card *card, int mute)
0515 {
0516 struct snd_soc_pcm_runtime *rtd;
0517 struct snd_soc_dai *dai;
0518 int playback = SNDRV_PCM_STREAM_PLAYBACK;
0519 int i;
0520
0521 for_each_card_rtds(card, rtd) {
0522
0523 if (rtd->dai_link->ignore_suspend)
0524 continue;
0525
0526 for_each_rtd_dais(rtd, i, dai) {
0527 if (snd_soc_dai_stream_active(dai, playback))
0528 snd_soc_dai_digital_mute(dai, mute, playback);
0529 }
0530 }
0531 }
0532
0533 static void soc_dapm_suspend_resume(struct snd_soc_card *card, int event)
0534 {
0535 struct snd_soc_pcm_runtime *rtd;
0536 int stream;
0537
0538 for_each_card_rtds(card, rtd) {
0539
0540 if (rtd->dai_link->ignore_suspend)
0541 continue;
0542
0543 for_each_pcm_streams(stream)
0544 snd_soc_dapm_stream_event(rtd, stream, event);
0545 }
0546 }
0547
0548
0549 int snd_soc_suspend(struct device *dev)
0550 {
0551 struct snd_soc_card *card = dev_get_drvdata(dev);
0552 struct snd_soc_component *component;
0553 struct snd_soc_pcm_runtime *rtd;
0554 int i;
0555
0556
0557 if (!card->instantiated)
0558 return 0;
0559
0560
0561
0562
0563
0564 snd_power_wait(card->snd_card);
0565
0566
0567 snd_power_change_state(card->snd_card, SNDRV_CTL_POWER_D3hot);
0568
0569
0570 soc_playback_digital_mute(card, 1);
0571
0572
0573 for_each_card_rtds(card, rtd) {
0574 if (rtd->dai_link->ignore_suspend)
0575 continue;
0576
0577 snd_pcm_suspend_all(rtd->pcm);
0578 }
0579
0580 snd_soc_card_suspend_pre(card);
0581
0582
0583 snd_soc_flush_all_delayed_work(card);
0584
0585 soc_dapm_suspend_resume(card, SND_SOC_DAPM_STREAM_SUSPEND);
0586
0587
0588 dapm_mark_endpoints_dirty(card);
0589 snd_soc_dapm_sync(&card->dapm);
0590
0591
0592 for_each_card_rtds(card, rtd) {
0593
0594 if (rtd->dai_link->ignore_suspend)
0595 continue;
0596
0597 for_each_rtd_components(rtd, i, component) {
0598 struct snd_soc_dapm_context *dapm =
0599 snd_soc_component_get_dapm(component);
0600
0601
0602
0603
0604 if (snd_soc_component_is_suspended(component))
0605 continue;
0606
0607
0608
0609
0610
0611 switch (snd_soc_dapm_get_bias_level(dapm)) {
0612 case SND_SOC_BIAS_STANDBY:
0613
0614
0615
0616
0617
0618
0619 if (dapm->idle_bias_off) {
0620 dev_dbg(component->dev,
0621 "ASoC: idle_bias_off CODEC on over suspend\n");
0622 break;
0623 }
0624 fallthrough;
0625
0626 case SND_SOC_BIAS_OFF:
0627 snd_soc_component_suspend(component);
0628 if (component->regmap)
0629 regcache_mark_dirty(component->regmap);
0630
0631 pinctrl_pm_select_sleep_state(component->dev);
0632 break;
0633 default:
0634 dev_dbg(component->dev,
0635 "ASoC: COMPONENT is on over suspend\n");
0636 break;
0637 }
0638 }
0639 }
0640
0641 snd_soc_card_suspend_post(card);
0642
0643 return 0;
0644 }
0645 EXPORT_SYMBOL_GPL(snd_soc_suspend);
0646
0647
0648
0649
0650
0651 static void soc_resume_deferred(struct work_struct *work)
0652 {
0653 struct snd_soc_card *card =
0654 container_of(work, struct snd_soc_card,
0655 deferred_resume_work);
0656 struct snd_soc_component *component;
0657
0658
0659
0660
0661
0662
0663 dev_dbg(card->dev, "ASoC: starting resume work\n");
0664
0665
0666 snd_power_change_state(card->snd_card, SNDRV_CTL_POWER_D2);
0667
0668 snd_soc_card_resume_pre(card);
0669
0670 for_each_card_components(card, component) {
0671 if (snd_soc_component_is_suspended(component))
0672 snd_soc_component_resume(component);
0673 }
0674
0675 soc_dapm_suspend_resume(card, SND_SOC_DAPM_STREAM_RESUME);
0676
0677
0678 soc_playback_digital_mute(card, 0);
0679
0680 snd_soc_card_resume_post(card);
0681
0682 dev_dbg(card->dev, "ASoC: resume work completed\n");
0683
0684
0685 dapm_mark_endpoints_dirty(card);
0686 snd_soc_dapm_sync(&card->dapm);
0687
0688
0689 snd_power_change_state(card->snd_card, SNDRV_CTL_POWER_D0);
0690 }
0691
0692
0693 int snd_soc_resume(struct device *dev)
0694 {
0695 struct snd_soc_card *card = dev_get_drvdata(dev);
0696 struct snd_soc_component *component;
0697
0698
0699 if (!card->instantiated)
0700 return 0;
0701
0702
0703 for_each_card_components(card, component)
0704 if (snd_soc_component_active(component))
0705 pinctrl_pm_select_default_state(component->dev);
0706
0707 dev_dbg(dev, "ASoC: Scheduling resume work\n");
0708 if (!schedule_work(&card->deferred_resume_work))
0709 dev_err(dev, "ASoC: resume work item may be lost\n");
0710
0711 return 0;
0712 }
0713 EXPORT_SYMBOL_GPL(snd_soc_resume);
0714
0715 static void soc_resume_init(struct snd_soc_card *card)
0716 {
0717
0718 INIT_WORK(&card->deferred_resume_work, soc_resume_deferred);
0719 }
0720 #else
0721 #define snd_soc_suspend NULL
0722 #define snd_soc_resume NULL
0723 static inline void soc_resume_init(struct snd_soc_card *card) { }
0724 #endif
0725
0726 static struct device_node
0727 *soc_component_to_node(struct snd_soc_component *component)
0728 {
0729 struct device_node *of_node;
0730
0731 of_node = component->dev->of_node;
0732 if (!of_node && component->dev->parent)
0733 of_node = component->dev->parent->of_node;
0734
0735 return of_node;
0736 }
0737
0738 static int snd_soc_is_matching_component(
0739 const struct snd_soc_dai_link_component *dlc,
0740 struct snd_soc_component *component)
0741 {
0742 struct device_node *component_of_node;
0743
0744 if (!dlc)
0745 return 0;
0746
0747 component_of_node = soc_component_to_node(component);
0748
0749 if (dlc->of_node && component_of_node != dlc->of_node)
0750 return 0;
0751 if (dlc->name && strcmp(component->name, dlc->name))
0752 return 0;
0753
0754 return 1;
0755 }
0756
0757 static struct snd_soc_component *soc_find_component(
0758 const struct snd_soc_dai_link_component *dlc)
0759 {
0760 struct snd_soc_component *component;
0761
0762 lockdep_assert_held(&client_mutex);
0763
0764
0765
0766
0767
0768
0769
0770
0771
0772 for_each_component(component)
0773 if (snd_soc_is_matching_component(dlc, component))
0774 return component;
0775
0776 return NULL;
0777 }
0778
0779
0780
0781
0782
0783
0784
0785
0786
0787
0788
0789
0790 struct snd_soc_dai *snd_soc_find_dai(
0791 const struct snd_soc_dai_link_component *dlc)
0792 {
0793 struct snd_soc_component *component;
0794 struct snd_soc_dai *dai;
0795
0796 lockdep_assert_held(&client_mutex);
0797
0798
0799 for_each_component(component) {
0800 if (!snd_soc_is_matching_component(dlc, component))
0801 continue;
0802 for_each_component_dais(component, dai) {
0803 if (dlc->dai_name && strcmp(dai->name, dlc->dai_name)
0804 && (!dai->driver->name
0805 || strcmp(dai->driver->name, dlc->dai_name)))
0806 continue;
0807
0808 return dai;
0809 }
0810 }
0811
0812 return NULL;
0813 }
0814 EXPORT_SYMBOL_GPL(snd_soc_find_dai);
0815
0816 struct snd_soc_dai *snd_soc_find_dai_with_mutex(
0817 const struct snd_soc_dai_link_component *dlc)
0818 {
0819 struct snd_soc_dai *dai;
0820
0821 mutex_lock(&client_mutex);
0822 dai = snd_soc_find_dai(dlc);
0823 mutex_unlock(&client_mutex);
0824
0825 return dai;
0826 }
0827 EXPORT_SYMBOL_GPL(snd_soc_find_dai_with_mutex);
0828
0829 static int soc_dai_link_sanity_check(struct snd_soc_card *card,
0830 struct snd_soc_dai_link *link)
0831 {
0832 int i;
0833 struct snd_soc_dai_link_component *cpu, *codec, *platform;
0834
0835 for_each_link_codecs(link, i, codec) {
0836
0837
0838
0839
0840 if (!!codec->name == !!codec->of_node) {
0841 dev_err(card->dev, "ASoC: Neither/both codec name/of_node are set for %s\n",
0842 link->name);
0843 return -EINVAL;
0844 }
0845
0846
0847 if (!codec->dai_name) {
0848 dev_err(card->dev, "ASoC: codec_dai_name not set for %s\n",
0849 link->name);
0850 return -EINVAL;
0851 }
0852
0853
0854
0855
0856
0857 if (!soc_find_component(codec)) {
0858 dev_dbg(card->dev,
0859 "ASoC: codec component %s not found for link %s\n",
0860 codec->name, link->name);
0861 return -EPROBE_DEFER;
0862 }
0863 }
0864
0865 for_each_link_platforms(link, i, platform) {
0866
0867
0868
0869
0870
0871 if (!!platform->name == !!platform->of_node) {
0872 dev_err(card->dev,
0873 "ASoC: Neither/both platform name/of_node are set for %s\n",
0874 link->name);
0875 return -EINVAL;
0876 }
0877
0878
0879
0880
0881
0882 if (!soc_find_component(platform)) {
0883 dev_dbg(card->dev,
0884 "ASoC: platform component %s not found for link %s\n",
0885 platform->name, link->name);
0886 return -EPROBE_DEFER;
0887 }
0888 }
0889
0890 for_each_link_cpus(link, i, cpu) {
0891
0892
0893
0894
0895
0896 if (cpu->name && cpu->of_node) {
0897 dev_err(card->dev,
0898 "ASoC: Neither/both cpu name/of_node are set for %s\n",
0899 link->name);
0900 return -EINVAL;
0901 }
0902
0903
0904
0905
0906
0907 if ((cpu->of_node || cpu->name) &&
0908 !soc_find_component(cpu)) {
0909 dev_dbg(card->dev,
0910 "ASoC: cpu component %s not found for link %s\n",
0911 cpu->name, link->name);
0912 return -EPROBE_DEFER;
0913 }
0914
0915
0916
0917
0918
0919 if (!cpu->dai_name &&
0920 !(cpu->name || cpu->of_node)) {
0921 dev_err(card->dev,
0922 "ASoC: Neither cpu_dai_name nor cpu_name/of_node are set for %s\n",
0923 link->name);
0924 return -EINVAL;
0925 }
0926 }
0927
0928 return 0;
0929 }
0930
0931
0932
0933
0934
0935
0936
0937
0938 void snd_soc_remove_pcm_runtime(struct snd_soc_card *card,
0939 struct snd_soc_pcm_runtime *rtd)
0940 {
0941 lockdep_assert_held(&client_mutex);
0942
0943
0944 snd_soc_link_exit(rtd);
0945
0946
0947
0948
0949 snd_soc_card_remove_dai_link(card, rtd->dai_link);
0950
0951 soc_free_pcm_runtime(rtd);
0952 }
0953 EXPORT_SYMBOL_GPL(snd_soc_remove_pcm_runtime);
0954
0955
0956
0957
0958
0959
0960
0961
0962
0963
0964
0965
0966 int snd_soc_add_pcm_runtime(struct snd_soc_card *card,
0967 struct snd_soc_dai_link *dai_link)
0968 {
0969 struct snd_soc_pcm_runtime *rtd;
0970 struct snd_soc_dai_link_component *codec, *platform, *cpu;
0971 struct snd_soc_component *component;
0972 int i, ret;
0973
0974 lockdep_assert_held(&client_mutex);
0975
0976
0977
0978
0979 ret = snd_soc_card_add_dai_link(card, dai_link);
0980 if (ret < 0)
0981 return ret;
0982
0983 if (dai_link->ignore)
0984 return 0;
0985
0986 dev_dbg(card->dev, "ASoC: binding %s\n", dai_link->name);
0987
0988 ret = soc_dai_link_sanity_check(card, dai_link);
0989 if (ret < 0)
0990 return ret;
0991
0992 rtd = soc_new_pcm_runtime(card, dai_link);
0993 if (!rtd)
0994 return -ENOMEM;
0995
0996 for_each_link_cpus(dai_link, i, cpu) {
0997 asoc_rtd_to_cpu(rtd, i) = snd_soc_find_dai(cpu);
0998 if (!asoc_rtd_to_cpu(rtd, i)) {
0999 dev_info(card->dev, "ASoC: CPU DAI %s not registered\n",
1000 cpu->dai_name);
1001 goto _err_defer;
1002 }
1003 snd_soc_rtd_add_component(rtd, asoc_rtd_to_cpu(rtd, i)->component);
1004 }
1005
1006
1007 for_each_link_codecs(dai_link, i, codec) {
1008 asoc_rtd_to_codec(rtd, i) = snd_soc_find_dai(codec);
1009 if (!asoc_rtd_to_codec(rtd, i)) {
1010 dev_info(card->dev, "ASoC: CODEC DAI %s not registered\n",
1011 codec->dai_name);
1012 goto _err_defer;
1013 }
1014
1015 snd_soc_rtd_add_component(rtd, asoc_rtd_to_codec(rtd, i)->component);
1016 }
1017
1018
1019 for_each_link_platforms(dai_link, i, platform) {
1020 for_each_component(component) {
1021 if (!snd_soc_is_matching_component(platform, component))
1022 continue;
1023
1024 snd_soc_rtd_add_component(rtd, component);
1025 }
1026 }
1027
1028 return 0;
1029
1030 _err_defer:
1031 snd_soc_remove_pcm_runtime(card, rtd);
1032 return -EPROBE_DEFER;
1033 }
1034 EXPORT_SYMBOL_GPL(snd_soc_add_pcm_runtime);
1035
1036 static void snd_soc_runtime_get_dai_fmt(struct snd_soc_pcm_runtime *rtd)
1037 {
1038 struct snd_soc_dai_link *dai_link = rtd->dai_link;
1039 struct snd_soc_dai *dai, *not_used;
1040 struct device *dev = rtd->dev;
1041 u64 pos, possible_fmt;
1042 unsigned int mask = 0, dai_fmt = 0;
1043 int i, j, priority, pri, until;
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080 until = snd_soc_dai_get_fmt_max_priority(rtd);
1081 for (priority = 1; priority <= until; priority++) {
1082
1083 dev_dbg(dev, "priority = %d\n", priority);
1084 for_each_rtd_dais(rtd, j, not_used) {
1085
1086 possible_fmt = ULLONG_MAX;
1087 for_each_rtd_dais(rtd, i, dai) {
1088 u64 fmt = 0;
1089
1090 pri = (j >= i) ? priority : priority - 1;
1091 fmt = snd_soc_dai_get_fmt(dai, pri);
1092 dev_dbg(dev, "%s: (pri, fmt) = (%d, %016llX)\n", dai->name, pri, fmt);
1093 possible_fmt &= fmt;
1094 }
1095 if (possible_fmt)
1096 goto found;
1097 }
1098 }
1099
1100 return;
1101 found:
1102 dev_dbg(dev, "found auto selected format: %016llX\n", possible_fmt);
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120 for (i = 63; i >= 0; i--) {
1121 pos = 1ULL << i;
1122 switch (possible_fmt & pos) {
1123
1124
1125
1126 case SND_SOC_POSSIBLE_DAIFMT_I2S:
1127 case SND_SOC_POSSIBLE_DAIFMT_RIGHT_J:
1128 case SND_SOC_POSSIBLE_DAIFMT_LEFT_J:
1129 case SND_SOC_POSSIBLE_DAIFMT_DSP_A:
1130 case SND_SOC_POSSIBLE_DAIFMT_DSP_B:
1131 case SND_SOC_POSSIBLE_DAIFMT_AC97:
1132 case SND_SOC_POSSIBLE_DAIFMT_PDM:
1133 dai_fmt = (dai_fmt & ~SND_SOC_DAIFMT_FORMAT_MASK) | i;
1134 break;
1135
1136
1137
1138 case SND_SOC_POSSIBLE_DAIFMT_CONT:
1139 dai_fmt = (dai_fmt & ~SND_SOC_DAIFMT_CLOCK_MASK) | SND_SOC_DAIFMT_CONT;
1140 break;
1141 case SND_SOC_POSSIBLE_DAIFMT_GATED:
1142 dai_fmt = (dai_fmt & ~SND_SOC_DAIFMT_CLOCK_MASK) | SND_SOC_DAIFMT_GATED;
1143 break;
1144
1145
1146
1147 case SND_SOC_POSSIBLE_DAIFMT_NB_NF:
1148 dai_fmt = (dai_fmt & ~SND_SOC_DAIFMT_INV_MASK) | SND_SOC_DAIFMT_NB_NF;
1149 break;
1150 case SND_SOC_POSSIBLE_DAIFMT_NB_IF:
1151 dai_fmt = (dai_fmt & ~SND_SOC_DAIFMT_INV_MASK) | SND_SOC_DAIFMT_NB_IF;
1152 break;
1153 case SND_SOC_POSSIBLE_DAIFMT_IB_NF:
1154 dai_fmt = (dai_fmt & ~SND_SOC_DAIFMT_INV_MASK) | SND_SOC_DAIFMT_IB_NF;
1155 break;
1156 case SND_SOC_POSSIBLE_DAIFMT_IB_IF:
1157 dai_fmt = (dai_fmt & ~SND_SOC_DAIFMT_INV_MASK) | SND_SOC_DAIFMT_IB_IF;
1158 break;
1159
1160
1161
1162 case SND_SOC_POSSIBLE_DAIFMT_CBP_CFP:
1163 dai_fmt = (dai_fmt & ~SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) | SND_SOC_DAIFMT_CBP_CFP;
1164 break;
1165 case SND_SOC_POSSIBLE_DAIFMT_CBC_CFP:
1166 dai_fmt = (dai_fmt & ~SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) | SND_SOC_DAIFMT_CBC_CFP;
1167 break;
1168 case SND_SOC_POSSIBLE_DAIFMT_CBP_CFC:
1169 dai_fmt = (dai_fmt & ~SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) | SND_SOC_DAIFMT_CBP_CFC;
1170 break;
1171 case SND_SOC_POSSIBLE_DAIFMT_CBC_CFC:
1172 dai_fmt = (dai_fmt & ~SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) | SND_SOC_DAIFMT_CBC_CFC;
1173 break;
1174 }
1175 }
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187 if (!(dai_link->dai_fmt & SND_SOC_DAIFMT_FORMAT_MASK))
1188 mask |= SND_SOC_DAIFMT_FORMAT_MASK;
1189 if (!(dai_link->dai_fmt & SND_SOC_DAIFMT_CLOCK_MASK))
1190 mask |= SND_SOC_DAIFMT_CLOCK_MASK;
1191 if (!(dai_link->dai_fmt & SND_SOC_DAIFMT_INV_MASK))
1192 mask |= SND_SOC_DAIFMT_INV_MASK;
1193 if (!(dai_link->dai_fmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK))
1194 mask |= SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK;
1195
1196 dai_link->dai_fmt |= (dai_fmt & mask);
1197 }
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212 int snd_soc_runtime_set_dai_fmt(struct snd_soc_pcm_runtime *rtd,
1213 unsigned int dai_fmt)
1214 {
1215 struct snd_soc_dai *cpu_dai;
1216 struct snd_soc_dai *codec_dai;
1217 unsigned int i;
1218 int ret;
1219
1220 if (!dai_fmt)
1221 return 0;
1222
1223 for_each_rtd_codec_dais(rtd, i, codec_dai) {
1224 ret = snd_soc_dai_set_fmt(codec_dai, dai_fmt);
1225 if (ret != 0 && ret != -ENOTSUPP)
1226 return ret;
1227 }
1228
1229
1230 dai_fmt = snd_soc_daifmt_clock_provider_flipped(dai_fmt);
1231
1232 for_each_rtd_cpu_dais(rtd, i, cpu_dai) {
1233 ret = snd_soc_dai_set_fmt(cpu_dai, dai_fmt);
1234 if (ret != 0 && ret != -ENOTSUPP)
1235 return ret;
1236 }
1237
1238 return 0;
1239 }
1240 EXPORT_SYMBOL_GPL(snd_soc_runtime_set_dai_fmt);
1241
1242 static int soc_init_pcm_runtime(struct snd_soc_card *card,
1243 struct snd_soc_pcm_runtime *rtd)
1244 {
1245 struct snd_soc_dai_link *dai_link = rtd->dai_link;
1246 struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0);
1247 struct snd_soc_component *component;
1248 int ret, num, i;
1249
1250
1251 rtd->pmdown_time = pmdown_time;
1252
1253
1254 ret = snd_soc_link_init(rtd);
1255 if (ret < 0)
1256 return ret;
1257
1258 snd_soc_runtime_get_dai_fmt(rtd);
1259 ret = snd_soc_runtime_set_dai_fmt(rtd, dai_link->dai_fmt);
1260 if (ret)
1261 return ret;
1262
1263
1264 soc_dpcm_debugfs_add(rtd);
1265
1266 num = rtd->num;
1267
1268
1269
1270
1271
1272
1273 for_each_rtd_components(rtd, i, component) {
1274 if (!component->driver->use_dai_pcm_id)
1275 continue;
1276
1277 if (rtd->dai_link->no_pcm)
1278 num += component->driver->be_pcm_base;
1279 else
1280 num = rtd->dai_link->id;
1281 }
1282
1283
1284 ret = snd_soc_dai_compress_new(cpu_dai, rtd, num);
1285 if (ret != -ENOTSUPP)
1286 return ret;
1287
1288
1289 ret = soc_new_pcm(rtd, num);
1290 if (ret < 0) {
1291 dev_err(card->dev, "ASoC: can't create pcm %s :%d\n",
1292 dai_link->stream_name, ret);
1293 return ret;
1294 }
1295
1296 return snd_soc_pcm_dai_new(rtd);
1297 }
1298
1299 static void soc_set_name_prefix(struct snd_soc_card *card,
1300 struct snd_soc_component *component)
1301 {
1302 struct device_node *of_node = soc_component_to_node(component);
1303 const char *str;
1304 int ret, i;
1305
1306 for (i = 0; i < card->num_configs; i++) {
1307 struct snd_soc_codec_conf *map = &card->codec_conf[i];
1308
1309 if (snd_soc_is_matching_component(&map->dlc, component) &&
1310 map->name_prefix) {
1311 component->name_prefix = map->name_prefix;
1312 return;
1313 }
1314 }
1315
1316
1317
1318
1319
1320 ret = of_property_read_string(of_node, "sound-name-prefix", &str);
1321 if (ret < 0)
1322 return;
1323
1324 component->name_prefix = str;
1325 }
1326
1327 static void soc_remove_component(struct snd_soc_component *component,
1328 int probed)
1329 {
1330
1331 if (!component->card)
1332 return;
1333
1334 if (probed)
1335 snd_soc_component_remove(component);
1336
1337 list_del_init(&component->card_list);
1338 snd_soc_dapm_free(snd_soc_component_get_dapm(component));
1339 soc_cleanup_component_debugfs(component);
1340 component->card = NULL;
1341 snd_soc_component_module_put_when_remove(component);
1342 }
1343
1344 static int soc_probe_component(struct snd_soc_card *card,
1345 struct snd_soc_component *component)
1346 {
1347 struct snd_soc_dapm_context *dapm =
1348 snd_soc_component_get_dapm(component);
1349 struct snd_soc_dai *dai;
1350 int probed = 0;
1351 int ret;
1352
1353 if (snd_soc_component_is_dummy(component))
1354 return 0;
1355
1356 if (component->card) {
1357 if (component->card != card) {
1358 dev_err(component->dev,
1359 "Trying to bind component to card \"%s\" but is already bound to card \"%s\"\n",
1360 card->name, component->card->name);
1361 return -ENODEV;
1362 }
1363 return 0;
1364 }
1365
1366 ret = snd_soc_component_module_get_when_probe(component);
1367 if (ret < 0)
1368 return ret;
1369
1370 component->card = card;
1371 soc_set_name_prefix(card, component);
1372
1373 soc_init_component_debugfs(component);
1374
1375 snd_soc_dapm_init(dapm, card, component);
1376
1377 ret = snd_soc_dapm_new_controls(dapm,
1378 component->driver->dapm_widgets,
1379 component->driver->num_dapm_widgets);
1380
1381 if (ret != 0) {
1382 dev_err(component->dev,
1383 "Failed to create new controls %d\n", ret);
1384 goto err_probe;
1385 }
1386
1387 for_each_component_dais(component, dai) {
1388 ret = snd_soc_dapm_new_dai_widgets(dapm, dai);
1389 if (ret != 0) {
1390 dev_err(component->dev,
1391 "Failed to create DAI widgets %d\n", ret);
1392 goto err_probe;
1393 }
1394 }
1395
1396 ret = snd_soc_component_probe(component);
1397 if (ret < 0)
1398 goto err_probe;
1399
1400 WARN(dapm->idle_bias_off &&
1401 dapm->bias_level != SND_SOC_BIAS_OFF,
1402 "codec %s can not start from non-off bias with idle_bias_off==1\n",
1403 component->name);
1404 probed = 1;
1405
1406
1407
1408
1409
1410
1411 ret = snd_soc_component_init(component);
1412 if (ret < 0)
1413 goto err_probe;
1414
1415 ret = snd_soc_add_component_controls(component,
1416 component->driver->controls,
1417 component->driver->num_controls);
1418 if (ret < 0)
1419 goto err_probe;
1420
1421 ret = snd_soc_dapm_add_routes(dapm,
1422 component->driver->dapm_routes,
1423 component->driver->num_dapm_routes);
1424 if (ret < 0) {
1425 if (card->disable_route_checks) {
1426 dev_info(card->dev,
1427 "%s: disable_route_checks set, ignoring errors on add_routes\n",
1428 __func__);
1429 } else {
1430 dev_err(card->dev,
1431 "%s: snd_soc_dapm_add_routes failed: %d\n",
1432 __func__, ret);
1433 goto err_probe;
1434 }
1435 }
1436
1437
1438 list_add(&component->card_list, &card->component_dev_list);
1439
1440 err_probe:
1441 if (ret < 0)
1442 soc_remove_component(component, probed);
1443
1444 return ret;
1445 }
1446
1447 static void soc_remove_link_dais(struct snd_soc_card *card)
1448 {
1449 struct snd_soc_pcm_runtime *rtd;
1450 int order;
1451
1452 for_each_comp_order(order) {
1453 for_each_card_rtds(card, rtd) {
1454
1455 snd_soc_pcm_dai_remove(rtd, order);
1456 }
1457 }
1458 }
1459
1460 static int soc_probe_link_dais(struct snd_soc_card *card)
1461 {
1462 struct snd_soc_pcm_runtime *rtd;
1463 int order, ret;
1464
1465 for_each_comp_order(order) {
1466 for_each_card_rtds(card, rtd) {
1467
1468 dev_dbg(card->dev,
1469 "ASoC: probe %s dai link %d late %d\n",
1470 card->name, rtd->num, order);
1471
1472
1473 ret = snd_soc_pcm_dai_probe(rtd, order);
1474 if (ret)
1475 return ret;
1476 }
1477 }
1478
1479 return 0;
1480 }
1481
1482 static void soc_remove_link_components(struct snd_soc_card *card)
1483 {
1484 struct snd_soc_component *component;
1485 struct snd_soc_pcm_runtime *rtd;
1486 int i, order;
1487
1488 for_each_comp_order(order) {
1489 for_each_card_rtds(card, rtd) {
1490 for_each_rtd_components(rtd, i, component) {
1491 if (component->driver->remove_order != order)
1492 continue;
1493
1494 soc_remove_component(component, 1);
1495 }
1496 }
1497 }
1498 }
1499
1500 static int soc_probe_link_components(struct snd_soc_card *card)
1501 {
1502 struct snd_soc_component *component;
1503 struct snd_soc_pcm_runtime *rtd;
1504 int i, ret, order;
1505
1506 for_each_comp_order(order) {
1507 for_each_card_rtds(card, rtd) {
1508 for_each_rtd_components(rtd, i, component) {
1509 if (component->driver->probe_order != order)
1510 continue;
1511
1512 ret = soc_probe_component(card, component);
1513 if (ret < 0)
1514 return ret;
1515 }
1516 }
1517 }
1518
1519 return 0;
1520 }
1521
1522 static void soc_unbind_aux_dev(struct snd_soc_card *card)
1523 {
1524 struct snd_soc_component *component, *_component;
1525
1526 for_each_card_auxs_safe(card, component, _component) {
1527
1528 snd_soc_component_set_aux(component, NULL);
1529 list_del(&component->card_aux_list);
1530 }
1531 }
1532
1533 static int soc_bind_aux_dev(struct snd_soc_card *card)
1534 {
1535 struct snd_soc_component *component;
1536 struct snd_soc_aux_dev *aux;
1537 int i;
1538
1539 for_each_card_pre_auxs(card, i, aux) {
1540
1541 component = soc_find_component(&aux->dlc);
1542 if (!component)
1543 return -EPROBE_DEFER;
1544
1545
1546 snd_soc_component_set_aux(component, aux);
1547
1548 list_add(&component->card_aux_list, &card->aux_comp_list);
1549 }
1550 return 0;
1551 }
1552
1553 static int soc_probe_aux_devices(struct snd_soc_card *card)
1554 {
1555 struct snd_soc_component *component;
1556 int order;
1557 int ret;
1558
1559 for_each_comp_order(order) {
1560 for_each_card_auxs(card, component) {
1561 if (component->driver->probe_order != order)
1562 continue;
1563
1564 ret = soc_probe_component(card, component);
1565 if (ret < 0)
1566 return ret;
1567 }
1568 }
1569
1570 return 0;
1571 }
1572
1573 static void soc_remove_aux_devices(struct snd_soc_card *card)
1574 {
1575 struct snd_soc_component *comp, *_comp;
1576 int order;
1577
1578 for_each_comp_order(order) {
1579 for_each_card_auxs_safe(card, comp, _comp) {
1580 if (comp->driver->remove_order == order)
1581 soc_remove_component(comp, 1);
1582 }
1583 }
1584 }
1585
1586 #ifdef CONFIG_DMI
1587
1588
1589
1590
1591
1592 static const char * const dmi_blacklist[] = {
1593 "To be filled by OEM",
1594 "TBD by OEM",
1595 "Default String",
1596 "Board Manufacturer",
1597 "Board Vendor Name",
1598 "Board Product Name",
1599 NULL,
1600 };
1601
1602
1603
1604
1605
1606
1607 static void cleanup_dmi_name(char *name)
1608 {
1609 int i, j = 0;
1610
1611 for (i = 0; name[i]; i++) {
1612 if (isalnum(name[i]) || (name[i] == '.')
1613 || (name[i] == '_'))
1614 name[j++] = name[i];
1615 else if (name[i] == '-')
1616 name[j++] = '_';
1617 }
1618
1619 name[j] = '\0';
1620 }
1621
1622
1623
1624
1625
1626 static int is_dmi_valid(const char *field)
1627 {
1628 int i = 0;
1629
1630 while (dmi_blacklist[i]) {
1631 if (strstr(field, dmi_blacklist[i]))
1632 return 0;
1633 i++;
1634 }
1635
1636 return 1;
1637 }
1638
1639
1640
1641
1642 static void append_dmi_string(struct snd_soc_card *card, const char *str)
1643 {
1644 char *dst = card->dmi_longname;
1645 size_t dst_len = sizeof(card->dmi_longname);
1646 size_t len;
1647
1648 len = strlen(dst);
1649 snprintf(dst + len, dst_len - len, "-%s", str);
1650
1651 len++;
1652 if (len < dst_len)
1653 cleanup_dmi_name(dst + len);
1654 }
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687 int snd_soc_set_dmi_name(struct snd_soc_card *card, const char *flavour)
1688 {
1689 const char *vendor, *product, *board;
1690
1691 if (card->long_name)
1692 return 0;
1693
1694 if (!dmi_available)
1695 return 0;
1696
1697
1698 vendor = dmi_get_system_info(DMI_BOARD_VENDOR);
1699 if (!vendor || !is_dmi_valid(vendor)) {
1700 dev_warn(card->dev, "ASoC: no DMI vendor name!\n");
1701 return 0;
1702 }
1703
1704 snprintf(card->dmi_longname, sizeof(card->dmi_longname), "%s", vendor);
1705 cleanup_dmi_name(card->dmi_longname);
1706
1707 product = dmi_get_system_info(DMI_PRODUCT_NAME);
1708 if (product && is_dmi_valid(product)) {
1709 const char *product_version = dmi_get_system_info(DMI_PRODUCT_VERSION);
1710
1711 append_dmi_string(card, product);
1712
1713
1714
1715
1716
1717 if (product_version && is_dmi_valid(product_version))
1718 append_dmi_string(card, product_version);
1719 }
1720
1721 board = dmi_get_system_info(DMI_BOARD_NAME);
1722 if (board && is_dmi_valid(board)) {
1723 if (!product || strcasecmp(board, product))
1724 append_dmi_string(card, board);
1725 } else if (!product) {
1726
1727 dev_warn(card->dev, "ASoC: no DMI board/product name!\n");
1728 return 0;
1729 }
1730
1731
1732 if (flavour)
1733 append_dmi_string(card, flavour);
1734
1735
1736 card->long_name = card->dmi_longname;
1737
1738 return 0;
1739 }
1740 EXPORT_SYMBOL_GPL(snd_soc_set_dmi_name);
1741 #endif
1742
1743 static void soc_check_tplg_fes(struct snd_soc_card *card)
1744 {
1745 struct snd_soc_component *component;
1746 const struct snd_soc_component_driver *comp_drv;
1747 struct snd_soc_dai_link *dai_link;
1748 int i;
1749
1750 for_each_component(component) {
1751
1752
1753 if (!component->driver->ignore_machine)
1754 continue;
1755
1756
1757 if (!strcmp(component->driver->ignore_machine,
1758 card->dev->driver->name))
1759 goto match;
1760 if (strcmp(component->driver->ignore_machine,
1761 dev_name(card->dev)))
1762 continue;
1763 match:
1764
1765 for_each_card_prelinks(card, i, dai_link) {
1766
1767
1768 if (dai_link->dynamic) {
1769 dai_link->ignore = true;
1770 continue;
1771 }
1772
1773 dev_dbg(card->dev, "info: override BE DAI link %s\n",
1774 card->dai_link[i].name);
1775
1776
1777 if (!dai_link->platforms) {
1778 dev_err(card->dev, "init platform error");
1779 continue;
1780 }
1781
1782 if (component->dev->of_node)
1783 dai_link->platforms->of_node = component->dev->of_node;
1784 else
1785 dai_link->platforms->name = component->name;
1786
1787
1788 if (!dai_link->no_pcm) {
1789 dai_link->no_pcm = 1;
1790
1791 if (dai_link->dpcm_playback)
1792 dev_warn(card->dev,
1793 "invalid configuration, dailink %s has flags no_pcm=0 and dpcm_playback=1\n",
1794 dai_link->name);
1795 if (dai_link->dpcm_capture)
1796 dev_warn(card->dev,
1797 "invalid configuration, dailink %s has flags no_pcm=0 and dpcm_capture=1\n",
1798 dai_link->name);
1799
1800
1801 if (!(dai_link->dpcm_playback ||
1802 dai_link->dpcm_capture)) {
1803 dai_link->dpcm_playback = !dai_link->capture_only;
1804 dai_link->dpcm_capture = !dai_link->playback_only;
1805 }
1806 }
1807
1808
1809
1810
1811
1812
1813 dai_link->be_hw_params_fixup =
1814 component->driver->be_hw_params_fixup;
1815
1816
1817
1818
1819
1820 if (!dai_link->stream_name)
1821 dai_link->stream_name = dai_link->name;
1822 }
1823
1824
1825 if (component->driver->topology_name_prefix) {
1826
1827
1828 if (!card->topology_shortname_created) {
1829 comp_drv = component->driver;
1830
1831 snprintf(card->topology_shortname, 32, "%s-%s",
1832 comp_drv->topology_name_prefix,
1833 card->name);
1834 card->topology_shortname_created = true;
1835 }
1836
1837
1838 card->name = card->topology_shortname;
1839 }
1840 }
1841 }
1842
1843 #define soc_setup_card_name(name, name1, name2, norm) \
1844 __soc_setup_card_name(name, sizeof(name), name1, name2, norm)
1845 static void __soc_setup_card_name(char *name, int len,
1846 const char *name1, const char *name2,
1847 int normalization)
1848 {
1849 int i;
1850
1851 snprintf(name, len, "%s", name1 ? name1 : name2);
1852
1853 if (!normalization)
1854 return;
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865 for (i = 0; i < len; i++) {
1866 switch (name[i]) {
1867 case '_':
1868 case '-':
1869 case '\0':
1870 break;
1871 default:
1872 if (!isalnum(name[i]))
1873 name[i] = '_';
1874 break;
1875 }
1876 }
1877 }
1878
1879 static void soc_cleanup_card_resources(struct snd_soc_card *card)
1880 {
1881 struct snd_soc_pcm_runtime *rtd, *n;
1882
1883 if (card->snd_card)
1884 snd_card_disconnect_sync(card->snd_card);
1885
1886 snd_soc_dapm_shutdown(card);
1887
1888
1889 soc_remove_link_dais(card);
1890 soc_remove_link_components(card);
1891
1892 for_each_card_rtds_safe(card, rtd, n)
1893 snd_soc_remove_pcm_runtime(card, rtd);
1894
1895
1896 soc_remove_aux_devices(card);
1897 soc_unbind_aux_dev(card);
1898
1899 snd_soc_dapm_free(&card->dapm);
1900 soc_cleanup_card_debugfs(card);
1901
1902
1903 snd_soc_card_remove(card);
1904
1905 if (card->snd_card) {
1906 snd_card_free(card->snd_card);
1907 card->snd_card = NULL;
1908 }
1909 }
1910
1911 static void snd_soc_unbind_card(struct snd_soc_card *card, bool unregister)
1912 {
1913 if (card->instantiated) {
1914 card->instantiated = false;
1915 snd_soc_flush_all_delayed_work(card);
1916
1917 soc_cleanup_card_resources(card);
1918 if (!unregister)
1919 list_add(&card->list, &unbind_card_list);
1920 } else {
1921 if (unregister)
1922 list_del(&card->list);
1923 }
1924 }
1925
1926 static int snd_soc_bind_card(struct snd_soc_card *card)
1927 {
1928 struct snd_soc_pcm_runtime *rtd;
1929 struct snd_soc_component *component;
1930 struct snd_soc_dai_link *dai_link;
1931 int ret, i;
1932
1933 mutex_lock(&client_mutex);
1934 mutex_lock_nested(&card->mutex, SND_SOC_CARD_CLASS_INIT);
1935
1936 snd_soc_dapm_init(&card->dapm, card, NULL);
1937
1938
1939 soc_check_tplg_fes(card);
1940
1941
1942 ret = soc_bind_aux_dev(card);
1943 if (ret < 0)
1944 goto probe_end;
1945
1946
1947 card->num_rtd = 0;
1948 for_each_card_prelinks(card, i, dai_link) {
1949 ret = snd_soc_add_pcm_runtime(card, dai_link);
1950 if (ret < 0)
1951 goto probe_end;
1952 }
1953
1954
1955 ret = snd_card_new(card->dev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1,
1956 card->owner, 0, &card->snd_card);
1957 if (ret < 0) {
1958 dev_err(card->dev,
1959 "ASoC: can't create sound card for card %s: %d\n",
1960 card->name, ret);
1961 goto probe_end;
1962 }
1963
1964 soc_init_card_debugfs(card);
1965
1966 soc_resume_init(card);
1967
1968 ret = snd_soc_dapm_new_controls(&card->dapm, card->dapm_widgets,
1969 card->num_dapm_widgets);
1970 if (ret < 0)
1971 goto probe_end;
1972
1973 ret = snd_soc_dapm_new_controls(&card->dapm, card->of_dapm_widgets,
1974 card->num_of_dapm_widgets);
1975 if (ret < 0)
1976 goto probe_end;
1977
1978
1979 ret = snd_soc_card_probe(card);
1980 if (ret < 0)
1981 goto probe_end;
1982
1983
1984 ret = soc_probe_link_components(card);
1985 if (ret < 0) {
1986 dev_err(card->dev,
1987 "ASoC: failed to instantiate card %d\n", ret);
1988 goto probe_end;
1989 }
1990
1991
1992 ret = soc_probe_aux_devices(card);
1993 if (ret < 0) {
1994 dev_err(card->dev,
1995 "ASoC: failed to probe aux component %d\n", ret);
1996 goto probe_end;
1997 }
1998
1999
2000 ret = soc_probe_link_dais(card);
2001 if (ret < 0) {
2002 dev_err(card->dev,
2003 "ASoC: failed to instantiate card %d\n", ret);
2004 goto probe_end;
2005 }
2006
2007 for_each_card_rtds(card, rtd) {
2008 ret = soc_init_pcm_runtime(card, rtd);
2009 if (ret < 0)
2010 goto probe_end;
2011 }
2012
2013 snd_soc_dapm_link_dai_widgets(card);
2014 snd_soc_dapm_connect_dai_link_widgets(card);
2015
2016 ret = snd_soc_add_card_controls(card, card->controls,
2017 card->num_controls);
2018 if (ret < 0)
2019 goto probe_end;
2020
2021 ret = snd_soc_dapm_add_routes(&card->dapm, card->dapm_routes,
2022 card->num_dapm_routes);
2023 if (ret < 0) {
2024 if (card->disable_route_checks) {
2025 dev_info(card->dev,
2026 "%s: disable_route_checks set, ignoring errors on add_routes\n",
2027 __func__);
2028 } else {
2029 dev_err(card->dev,
2030 "%s: snd_soc_dapm_add_routes failed: %d\n",
2031 __func__, ret);
2032 goto probe_end;
2033 }
2034 }
2035
2036 ret = snd_soc_dapm_add_routes(&card->dapm, card->of_dapm_routes,
2037 card->num_of_dapm_routes);
2038 if (ret < 0)
2039 goto probe_end;
2040
2041
2042 snd_soc_set_dmi_name(card, NULL);
2043
2044 soc_setup_card_name(card->snd_card->shortname,
2045 card->name, NULL, 0);
2046 soc_setup_card_name(card->snd_card->longname,
2047 card->long_name, card->name, 0);
2048 soc_setup_card_name(card->snd_card->driver,
2049 card->driver_name, card->name, 1);
2050
2051 if (card->components) {
2052
2053
2054
2055
2056 ret = snd_component_add(card->snd_card, card->components);
2057 if (ret < 0) {
2058 dev_err(card->dev, "ASoC: %s snd_component_add() failed: %d\n",
2059 card->name, ret);
2060 goto probe_end;
2061 }
2062 }
2063
2064 ret = snd_soc_card_late_probe(card);
2065 if (ret < 0)
2066 goto probe_end;
2067
2068 snd_soc_dapm_new_widgets(card);
2069 snd_soc_card_fixup_controls(card);
2070
2071 ret = snd_card_register(card->snd_card);
2072 if (ret < 0) {
2073 dev_err(card->dev, "ASoC: failed to register soundcard %d\n",
2074 ret);
2075 goto probe_end;
2076 }
2077
2078 card->instantiated = 1;
2079 dapm_mark_endpoints_dirty(card);
2080 snd_soc_dapm_sync(&card->dapm);
2081
2082
2083 for_each_card_components(card, component)
2084 if (!snd_soc_component_active(component))
2085 pinctrl_pm_select_sleep_state(component->dev);
2086
2087 probe_end:
2088 if (ret < 0)
2089 soc_cleanup_card_resources(card);
2090
2091 mutex_unlock(&card->mutex);
2092 mutex_unlock(&client_mutex);
2093
2094 return ret;
2095 }
2096
2097
2098 static int soc_probe(struct platform_device *pdev)
2099 {
2100 struct snd_soc_card *card = platform_get_drvdata(pdev);
2101
2102
2103
2104
2105
2106 if (!card)
2107 return -EINVAL;
2108
2109 dev_warn(&pdev->dev,
2110 "ASoC: machine %s should use snd_soc_register_card()\n",
2111 card->name);
2112
2113
2114 card->dev = &pdev->dev;
2115
2116 return devm_snd_soc_register_card(&pdev->dev, card);
2117 }
2118
2119 int snd_soc_poweroff(struct device *dev)
2120 {
2121 struct snd_soc_card *card = dev_get_drvdata(dev);
2122 struct snd_soc_component *component;
2123
2124 if (!card->instantiated)
2125 return 0;
2126
2127
2128
2129
2130
2131 snd_soc_flush_all_delayed_work(card);
2132
2133 snd_soc_dapm_shutdown(card);
2134
2135
2136 for_each_card_components(card, component)
2137 pinctrl_pm_select_sleep_state(component->dev);
2138
2139 return 0;
2140 }
2141 EXPORT_SYMBOL_GPL(snd_soc_poweroff);
2142
2143 const struct dev_pm_ops snd_soc_pm_ops = {
2144 .suspend = snd_soc_suspend,
2145 .resume = snd_soc_resume,
2146 .freeze = snd_soc_suspend,
2147 .thaw = snd_soc_resume,
2148 .poweroff = snd_soc_poweroff,
2149 .restore = snd_soc_resume,
2150 };
2151 EXPORT_SYMBOL_GPL(snd_soc_pm_ops);
2152
2153
2154 static struct platform_driver soc_driver = {
2155 .driver = {
2156 .name = "soc-audio",
2157 .pm = &snd_soc_pm_ops,
2158 },
2159 .probe = soc_probe,
2160 };
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173 struct snd_kcontrol *snd_soc_cnew(const struct snd_kcontrol_new *_template,
2174 void *data, const char *long_name,
2175 const char *prefix)
2176 {
2177 struct snd_kcontrol_new template;
2178 struct snd_kcontrol *kcontrol;
2179 char *name = NULL;
2180
2181 memcpy(&template, _template, sizeof(template));
2182 template.index = 0;
2183
2184 if (!long_name)
2185 long_name = template.name;
2186
2187 if (prefix) {
2188 name = kasprintf(GFP_KERNEL, "%s %s", prefix, long_name);
2189 if (!name)
2190 return NULL;
2191
2192 template.name = name;
2193 } else {
2194 template.name = long_name;
2195 }
2196
2197 kcontrol = snd_ctl_new1(&template, data);
2198
2199 kfree(name);
2200
2201 return kcontrol;
2202 }
2203 EXPORT_SYMBOL_GPL(snd_soc_cnew);
2204
2205 static int snd_soc_add_controls(struct snd_card *card, struct device *dev,
2206 const struct snd_kcontrol_new *controls, int num_controls,
2207 const char *prefix, void *data)
2208 {
2209 int i;
2210
2211 for (i = 0; i < num_controls; i++) {
2212 const struct snd_kcontrol_new *control = &controls[i];
2213 int err = snd_ctl_add(card, snd_soc_cnew(control, data,
2214 control->name, prefix));
2215 if (err < 0) {
2216 dev_err(dev, "ASoC: Failed to add %s: %d\n",
2217 control->name, err);
2218 return err;
2219 }
2220 }
2221
2222 return 0;
2223 }
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234 int snd_soc_add_component_controls(struct snd_soc_component *component,
2235 const struct snd_kcontrol_new *controls, unsigned int num_controls)
2236 {
2237 struct snd_card *card = component->card->snd_card;
2238
2239 return snd_soc_add_controls(card, component->dev, controls,
2240 num_controls, component->name_prefix, component);
2241 }
2242 EXPORT_SYMBOL_GPL(snd_soc_add_component_controls);
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254 int snd_soc_add_card_controls(struct snd_soc_card *soc_card,
2255 const struct snd_kcontrol_new *controls, int num_controls)
2256 {
2257 struct snd_card *card = soc_card->snd_card;
2258
2259 return snd_soc_add_controls(card, soc_card->dev, controls, num_controls,
2260 NULL, soc_card);
2261 }
2262 EXPORT_SYMBOL_GPL(snd_soc_add_card_controls);
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274 int snd_soc_add_dai_controls(struct snd_soc_dai *dai,
2275 const struct snd_kcontrol_new *controls, int num_controls)
2276 {
2277 struct snd_card *card = dai->component->card->snd_card;
2278
2279 return snd_soc_add_controls(card, dai->dev, controls, num_controls,
2280 NULL, dai);
2281 }
2282 EXPORT_SYMBOL_GPL(snd_soc_add_dai_controls);
2283
2284
2285
2286
2287
2288
2289
2290 int snd_soc_register_card(struct snd_soc_card *card)
2291 {
2292 if (!card->name || !card->dev)
2293 return -EINVAL;
2294
2295 dev_set_drvdata(card->dev, card);
2296
2297 INIT_LIST_HEAD(&card->widgets);
2298 INIT_LIST_HEAD(&card->paths);
2299 INIT_LIST_HEAD(&card->dapm_list);
2300 INIT_LIST_HEAD(&card->aux_comp_list);
2301 INIT_LIST_HEAD(&card->component_dev_list);
2302 INIT_LIST_HEAD(&card->list);
2303 INIT_LIST_HEAD(&card->rtd_list);
2304 INIT_LIST_HEAD(&card->dapm_dirty);
2305 INIT_LIST_HEAD(&card->dobj_list);
2306
2307 card->instantiated = 0;
2308 mutex_init(&card->mutex);
2309 mutex_init(&card->dapm_mutex);
2310 mutex_init(&card->pcm_mutex);
2311
2312 return snd_soc_bind_card(card);
2313 }
2314 EXPORT_SYMBOL_GPL(snd_soc_register_card);
2315
2316
2317
2318
2319
2320
2321
2322 void snd_soc_unregister_card(struct snd_soc_card *card)
2323 {
2324 mutex_lock(&client_mutex);
2325 snd_soc_unbind_card(card, true);
2326 mutex_unlock(&client_mutex);
2327 dev_dbg(card->dev, "ASoC: Unregistered card '%s'\n", card->name);
2328 }
2329 EXPORT_SYMBOL_GPL(snd_soc_unregister_card);
2330
2331
2332
2333
2334
2335 static char *fmt_single_name(struct device *dev, int *id)
2336 {
2337 const char *devname = dev_name(dev);
2338 char *found, *name;
2339 unsigned int id1, id2;
2340
2341 if (devname == NULL)
2342 return NULL;
2343
2344 name = devm_kstrdup(dev, devname, GFP_KERNEL);
2345 if (!name)
2346 return NULL;
2347
2348
2349 found = strstr(name, dev->driver->name);
2350 if (found) {
2351
2352 if (sscanf(&found[strlen(dev->driver->name)], ".%d", id) == 1) {
2353
2354
2355 if (*id == -1)
2356 found[strlen(dev->driver->name)] = '\0';
2357 }
2358
2359
2360 } else if (sscanf(name, "%x-%x", &id1, &id2) == 2) {
2361
2362
2363 *id = ((id1 & 0xffff) << 16) + id2;
2364
2365 devm_kfree(dev, name);
2366
2367
2368 name = devm_kasprintf(dev, GFP_KERNEL, "%s.%s", dev->driver->name, devname);
2369 } else {
2370 *id = 0;
2371 }
2372
2373 return name;
2374 }
2375
2376
2377
2378
2379
2380 static inline char *fmt_multiple_name(struct device *dev,
2381 struct snd_soc_dai_driver *dai_drv)
2382 {
2383 if (dai_drv->name == NULL) {
2384 dev_err(dev,
2385 "ASoC: error - multiple DAI %s registered with no name\n",
2386 dev_name(dev));
2387 return NULL;
2388 }
2389
2390 return devm_kstrdup(dev, dai_drv->name, GFP_KERNEL);
2391 }
2392
2393 void snd_soc_unregister_dai(struct snd_soc_dai *dai)
2394 {
2395 dev_dbg(dai->dev, "ASoC: Unregistered DAI '%s'\n", dai->name);
2396 list_del(&dai->list);
2397 }
2398 EXPORT_SYMBOL_GPL(snd_soc_unregister_dai);
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412 struct snd_soc_dai *snd_soc_register_dai(struct snd_soc_component *component,
2413 struct snd_soc_dai_driver *dai_drv,
2414 bool legacy_dai_naming)
2415 {
2416 struct device *dev = component->dev;
2417 struct snd_soc_dai *dai;
2418
2419 dev_dbg(dev, "ASoC: dynamically register DAI %s\n", dev_name(dev));
2420
2421 lockdep_assert_held(&client_mutex);
2422
2423 dai = devm_kzalloc(dev, sizeof(*dai), GFP_KERNEL);
2424 if (dai == NULL)
2425 return NULL;
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435 if (legacy_dai_naming &&
2436 (dai_drv->id == 0 || dai_drv->name == NULL)) {
2437 dai->name = fmt_single_name(dev, &dai->id);
2438 } else {
2439 dai->name = fmt_multiple_name(dev, dai_drv);
2440 if (dai_drv->id)
2441 dai->id = dai_drv->id;
2442 else
2443 dai->id = component->num_dai;
2444 }
2445 if (!dai->name)
2446 return NULL;
2447
2448 dai->component = component;
2449 dai->dev = dev;
2450 dai->driver = dai_drv;
2451
2452
2453 list_add_tail(&dai->list, &component->dai_list);
2454 component->num_dai++;
2455
2456 dev_dbg(dev, "ASoC: Registered DAI '%s'\n", dai->name);
2457 return dai;
2458 }
2459 EXPORT_SYMBOL_GPL(snd_soc_register_dai);
2460
2461
2462
2463
2464
2465
2466 static void snd_soc_unregister_dais(struct snd_soc_component *component)
2467 {
2468 struct snd_soc_dai *dai, *_dai;
2469
2470 for_each_component_dais_safe(component, dai, _dai)
2471 snd_soc_unregister_dai(dai);
2472 }
2473
2474
2475
2476
2477
2478
2479
2480
2481 static int snd_soc_register_dais(struct snd_soc_component *component,
2482 struct snd_soc_dai_driver *dai_drv,
2483 size_t count)
2484 {
2485 struct snd_soc_dai *dai;
2486 unsigned int i;
2487 int ret;
2488
2489 for (i = 0; i < count; i++) {
2490 dai = snd_soc_register_dai(component, dai_drv + i, count == 1 &&
2491 component->driver->legacy_dai_naming);
2492 if (dai == NULL) {
2493 ret = -ENOMEM;
2494 goto err;
2495 }
2496 }
2497
2498 return 0;
2499
2500 err:
2501 snd_soc_unregister_dais(component);
2502
2503 return ret;
2504 }
2505
2506 #define ENDIANNESS_MAP(name) \
2507 (SNDRV_PCM_FMTBIT_##name##LE | SNDRV_PCM_FMTBIT_##name##BE)
2508 static u64 endianness_format_map[] = {
2509 ENDIANNESS_MAP(S16_),
2510 ENDIANNESS_MAP(U16_),
2511 ENDIANNESS_MAP(S24_),
2512 ENDIANNESS_MAP(U24_),
2513 ENDIANNESS_MAP(S32_),
2514 ENDIANNESS_MAP(U32_),
2515 ENDIANNESS_MAP(S24_3),
2516 ENDIANNESS_MAP(U24_3),
2517 ENDIANNESS_MAP(S20_3),
2518 ENDIANNESS_MAP(U20_3),
2519 ENDIANNESS_MAP(S18_3),
2520 ENDIANNESS_MAP(U18_3),
2521 ENDIANNESS_MAP(FLOAT_),
2522 ENDIANNESS_MAP(FLOAT64_),
2523 ENDIANNESS_MAP(IEC958_SUBFRAME_),
2524 };
2525
2526
2527
2528
2529
2530
2531
2532 static void convert_endianness_formats(struct snd_soc_pcm_stream *stream)
2533 {
2534 int i;
2535
2536 for (i = 0; i < ARRAY_SIZE(endianness_format_map); i++)
2537 if (stream->formats & endianness_format_map[i])
2538 stream->formats |= endianness_format_map[i];
2539 }
2540
2541 static void snd_soc_try_rebind_card(void)
2542 {
2543 struct snd_soc_card *card, *c;
2544
2545 list_for_each_entry_safe(card, c, &unbind_card_list, list)
2546 if (!snd_soc_bind_card(card))
2547 list_del(&card->list);
2548 }
2549
2550 static void snd_soc_del_component_unlocked(struct snd_soc_component *component)
2551 {
2552 struct snd_soc_card *card = component->card;
2553
2554 snd_soc_unregister_dais(component);
2555
2556 if (card)
2557 snd_soc_unbind_card(card, false);
2558
2559 list_del(&component->list);
2560 }
2561
2562 int snd_soc_component_initialize(struct snd_soc_component *component,
2563 const struct snd_soc_component_driver *driver,
2564 struct device *dev)
2565 {
2566 INIT_LIST_HEAD(&component->dai_list);
2567 INIT_LIST_HEAD(&component->dobj_list);
2568 INIT_LIST_HEAD(&component->card_list);
2569 INIT_LIST_HEAD(&component->list);
2570 mutex_init(&component->io_mutex);
2571
2572 component->name = fmt_single_name(dev, &component->id);
2573 if (!component->name) {
2574 dev_err(dev, "ASoC: Failed to allocate name\n");
2575 return -ENOMEM;
2576 }
2577
2578 component->dev = dev;
2579 component->driver = driver;
2580
2581 #ifdef CONFIG_DEBUG_FS
2582 if (!component->debugfs_prefix)
2583 component->debugfs_prefix = driver->debugfs_prefix;
2584 #endif
2585
2586 return 0;
2587 }
2588 EXPORT_SYMBOL_GPL(snd_soc_component_initialize);
2589
2590 int snd_soc_add_component(struct snd_soc_component *component,
2591 struct snd_soc_dai_driver *dai_drv,
2592 int num_dai)
2593 {
2594 int ret;
2595 int i;
2596
2597 mutex_lock(&client_mutex);
2598
2599 if (component->driver->endianness) {
2600 for (i = 0; i < num_dai; i++) {
2601 convert_endianness_formats(&dai_drv[i].playback);
2602 convert_endianness_formats(&dai_drv[i].capture);
2603 }
2604 }
2605
2606 ret = snd_soc_register_dais(component, dai_drv, num_dai);
2607 if (ret < 0) {
2608 dev_err(component->dev, "ASoC: Failed to register DAIs: %d\n",
2609 ret);
2610 goto err_cleanup;
2611 }
2612
2613 if (!component->driver->write && !component->driver->read) {
2614 if (!component->regmap)
2615 component->regmap = dev_get_regmap(component->dev,
2616 NULL);
2617 if (component->regmap)
2618 snd_soc_component_setup_regmap(component);
2619 }
2620
2621
2622 list_add(&component->list, &component_list);
2623
2624 err_cleanup:
2625 if (ret < 0)
2626 snd_soc_del_component_unlocked(component);
2627
2628 mutex_unlock(&client_mutex);
2629
2630 if (ret == 0)
2631 snd_soc_try_rebind_card();
2632
2633 return ret;
2634 }
2635 EXPORT_SYMBOL_GPL(snd_soc_add_component);
2636
2637 int snd_soc_register_component(struct device *dev,
2638 const struct snd_soc_component_driver *component_driver,
2639 struct snd_soc_dai_driver *dai_drv,
2640 int num_dai)
2641 {
2642 struct snd_soc_component *component;
2643 int ret;
2644
2645 component = devm_kzalloc(dev, sizeof(*component), GFP_KERNEL);
2646 if (!component)
2647 return -ENOMEM;
2648
2649 ret = snd_soc_component_initialize(component, component_driver, dev);
2650 if (ret < 0)
2651 return ret;
2652
2653 return snd_soc_add_component(component, dai_drv, num_dai);
2654 }
2655 EXPORT_SYMBOL_GPL(snd_soc_register_component);
2656
2657
2658
2659
2660
2661
2662
2663
2664 void snd_soc_unregister_component_by_driver(struct device *dev,
2665 const struct snd_soc_component_driver *component_driver)
2666 {
2667 struct snd_soc_component *component;
2668
2669 if (!component_driver)
2670 return;
2671
2672 mutex_lock(&client_mutex);
2673 component = snd_soc_lookup_component_nolocked(dev, component_driver->name);
2674 if (!component)
2675 goto out;
2676
2677 snd_soc_del_component_unlocked(component);
2678
2679 out:
2680 mutex_unlock(&client_mutex);
2681 }
2682 EXPORT_SYMBOL_GPL(snd_soc_unregister_component_by_driver);
2683
2684
2685
2686
2687
2688
2689
2690 void snd_soc_unregister_component(struct device *dev)
2691 {
2692 mutex_lock(&client_mutex);
2693 while (1) {
2694 struct snd_soc_component *component = snd_soc_lookup_component_nolocked(dev, NULL);
2695
2696 if (!component)
2697 break;
2698
2699 snd_soc_del_component_unlocked(component);
2700 }
2701 mutex_unlock(&client_mutex);
2702 }
2703 EXPORT_SYMBOL_GPL(snd_soc_unregister_component);
2704
2705
2706 int snd_soc_of_parse_card_name(struct snd_soc_card *card,
2707 const char *propname)
2708 {
2709 struct device_node *np;
2710 int ret;
2711
2712 if (!card->dev) {
2713 pr_err("card->dev is not set before calling %s\n", __func__);
2714 return -EINVAL;
2715 }
2716
2717 np = card->dev->of_node;
2718
2719 ret = of_property_read_string_index(np, propname, 0, &card->name);
2720
2721
2722
2723
2724
2725 if (ret < 0 && ret != -EINVAL) {
2726 dev_err(card->dev,
2727 "ASoC: Property '%s' could not be read: %d\n",
2728 propname, ret);
2729 return ret;
2730 }
2731
2732 return 0;
2733 }
2734 EXPORT_SYMBOL_GPL(snd_soc_of_parse_card_name);
2735
2736 static const struct snd_soc_dapm_widget simple_widgets[] = {
2737 SND_SOC_DAPM_MIC("Microphone", NULL),
2738 SND_SOC_DAPM_LINE("Line", NULL),
2739 SND_SOC_DAPM_HP("Headphone", NULL),
2740 SND_SOC_DAPM_SPK("Speaker", NULL),
2741 };
2742
2743 int snd_soc_of_parse_audio_simple_widgets(struct snd_soc_card *card,
2744 const char *propname)
2745 {
2746 struct device_node *np = card->dev->of_node;
2747 struct snd_soc_dapm_widget *widgets;
2748 const char *template, *wname;
2749 int i, j, num_widgets;
2750
2751 num_widgets = of_property_count_strings(np, propname);
2752 if (num_widgets < 0) {
2753 dev_err(card->dev,
2754 "ASoC: Property '%s' does not exist\n", propname);
2755 return -EINVAL;
2756 }
2757 if (!num_widgets) {
2758 dev_err(card->dev, "ASoC: Property '%s's length is zero\n",
2759 propname);
2760 return -EINVAL;
2761 }
2762 if (num_widgets & 1) {
2763 dev_err(card->dev,
2764 "ASoC: Property '%s' length is not even\n", propname);
2765 return -EINVAL;
2766 }
2767
2768 num_widgets /= 2;
2769
2770 widgets = devm_kcalloc(card->dev, num_widgets, sizeof(*widgets),
2771 GFP_KERNEL);
2772 if (!widgets) {
2773 dev_err(card->dev,
2774 "ASoC: Could not allocate memory for widgets\n");
2775 return -ENOMEM;
2776 }
2777
2778 for (i = 0; i < num_widgets; i++) {
2779 int ret = of_property_read_string_index(np, propname,
2780 2 * i, &template);
2781 if (ret) {
2782 dev_err(card->dev,
2783 "ASoC: Property '%s' index %d read error:%d\n",
2784 propname, 2 * i, ret);
2785 return -EINVAL;
2786 }
2787
2788 for (j = 0; j < ARRAY_SIZE(simple_widgets); j++) {
2789 if (!strncmp(template, simple_widgets[j].name,
2790 strlen(simple_widgets[j].name))) {
2791 widgets[i] = simple_widgets[j];
2792 break;
2793 }
2794 }
2795
2796 if (j >= ARRAY_SIZE(simple_widgets)) {
2797 dev_err(card->dev,
2798 "ASoC: DAPM widget '%s' is not supported\n",
2799 template);
2800 return -EINVAL;
2801 }
2802
2803 ret = of_property_read_string_index(np, propname,
2804 (2 * i) + 1,
2805 &wname);
2806 if (ret) {
2807 dev_err(card->dev,
2808 "ASoC: Property '%s' index %d read error:%d\n",
2809 propname, (2 * i) + 1, ret);
2810 return -EINVAL;
2811 }
2812
2813 widgets[i].name = wname;
2814 }
2815
2816 card->of_dapm_widgets = widgets;
2817 card->num_of_dapm_widgets = num_widgets;
2818
2819 return 0;
2820 }
2821 EXPORT_SYMBOL_GPL(snd_soc_of_parse_audio_simple_widgets);
2822
2823 int snd_soc_of_parse_pin_switches(struct snd_soc_card *card, const char *prop)
2824 {
2825 const unsigned int nb_controls_max = 16;
2826 const char **strings, *control_name;
2827 struct snd_kcontrol_new *controls;
2828 struct device *dev = card->dev;
2829 unsigned int i, nb_controls;
2830 int ret;
2831
2832 if (!of_property_read_bool(dev->of_node, prop))
2833 return 0;
2834
2835 strings = devm_kcalloc(dev, nb_controls_max,
2836 sizeof(*strings), GFP_KERNEL);
2837 if (!strings)
2838 return -ENOMEM;
2839
2840 ret = of_property_read_string_array(dev->of_node, prop,
2841 strings, nb_controls_max);
2842 if (ret < 0)
2843 return ret;
2844
2845 nb_controls = (unsigned int)ret;
2846
2847 controls = devm_kcalloc(dev, nb_controls,
2848 sizeof(*controls), GFP_KERNEL);
2849 if (!controls)
2850 return -ENOMEM;
2851
2852 for (i = 0; i < nb_controls; i++) {
2853 control_name = devm_kasprintf(dev, GFP_KERNEL,
2854 "%s Switch", strings[i]);
2855 if (!control_name)
2856 return -ENOMEM;
2857
2858 controls[i].iface = SNDRV_CTL_ELEM_IFACE_MIXER;
2859 controls[i].name = control_name;
2860 controls[i].info = snd_soc_dapm_info_pin_switch;
2861 controls[i].get = snd_soc_dapm_get_pin_switch;
2862 controls[i].put = snd_soc_dapm_put_pin_switch;
2863 controls[i].private_value = (unsigned long)strings[i];
2864 }
2865
2866 card->controls = controls;
2867 card->num_controls = nb_controls;
2868
2869 return 0;
2870 }
2871 EXPORT_SYMBOL_GPL(snd_soc_of_parse_pin_switches);
2872
2873 int snd_soc_of_get_slot_mask(struct device_node *np,
2874 const char *prop_name,
2875 unsigned int *mask)
2876 {
2877 u32 val;
2878 const __be32 *of_slot_mask = of_get_property(np, prop_name, &val);
2879 int i;
2880
2881 if (!of_slot_mask)
2882 return 0;
2883 val /= sizeof(u32);
2884 for (i = 0; i < val; i++)
2885 if (be32_to_cpup(&of_slot_mask[i]))
2886 *mask |= (1 << i);
2887
2888 return val;
2889 }
2890 EXPORT_SYMBOL_GPL(snd_soc_of_get_slot_mask);
2891
2892 int snd_soc_of_parse_tdm_slot(struct device_node *np,
2893 unsigned int *tx_mask,
2894 unsigned int *rx_mask,
2895 unsigned int *slots,
2896 unsigned int *slot_width)
2897 {
2898 u32 val;
2899 int ret;
2900
2901 if (tx_mask)
2902 snd_soc_of_get_slot_mask(np, "dai-tdm-slot-tx-mask", tx_mask);
2903 if (rx_mask)
2904 snd_soc_of_get_slot_mask(np, "dai-tdm-slot-rx-mask", rx_mask);
2905
2906 if (of_property_read_bool(np, "dai-tdm-slot-num")) {
2907 ret = of_property_read_u32(np, "dai-tdm-slot-num", &val);
2908 if (ret)
2909 return ret;
2910
2911 if (slots)
2912 *slots = val;
2913 }
2914
2915 if (of_property_read_bool(np, "dai-tdm-slot-width")) {
2916 ret = of_property_read_u32(np, "dai-tdm-slot-width", &val);
2917 if (ret)
2918 return ret;
2919
2920 if (slot_width)
2921 *slot_width = val;
2922 }
2923
2924 return 0;
2925 }
2926 EXPORT_SYMBOL_GPL(snd_soc_of_parse_tdm_slot);
2927
2928 void snd_soc_of_parse_node_prefix(struct device_node *np,
2929 struct snd_soc_codec_conf *codec_conf,
2930 struct device_node *of_node,
2931 const char *propname)
2932 {
2933 const char *str;
2934 int ret;
2935
2936 ret = of_property_read_string(np, propname, &str);
2937 if (ret < 0) {
2938
2939 return;
2940 }
2941
2942 codec_conf->dlc.of_node = of_node;
2943 codec_conf->name_prefix = str;
2944 }
2945 EXPORT_SYMBOL_GPL(snd_soc_of_parse_node_prefix);
2946
2947 int snd_soc_of_parse_audio_routing(struct snd_soc_card *card,
2948 const char *propname)
2949 {
2950 struct device_node *np = card->dev->of_node;
2951 int num_routes;
2952 struct snd_soc_dapm_route *routes;
2953 int i;
2954
2955 num_routes = of_property_count_strings(np, propname);
2956 if (num_routes < 0 || num_routes & 1) {
2957 dev_err(card->dev,
2958 "ASoC: Property '%s' does not exist or its length is not even\n",
2959 propname);
2960 return -EINVAL;
2961 }
2962 num_routes /= 2;
2963
2964 routes = devm_kcalloc(card->dev, num_routes, sizeof(*routes),
2965 GFP_KERNEL);
2966 if (!routes) {
2967 dev_err(card->dev,
2968 "ASoC: Could not allocate DAPM route table\n");
2969 return -ENOMEM;
2970 }
2971
2972 for (i = 0; i < num_routes; i++) {
2973 int ret = of_property_read_string_index(np, propname,
2974 2 * i, &routes[i].sink);
2975 if (ret) {
2976 dev_err(card->dev,
2977 "ASoC: Property '%s' index %d could not be read: %d\n",
2978 propname, 2 * i, ret);
2979 return -EINVAL;
2980 }
2981 ret = of_property_read_string_index(np, propname,
2982 (2 * i) + 1, &routes[i].source);
2983 if (ret) {
2984 dev_err(card->dev,
2985 "ASoC: Property '%s' index %d could not be read: %d\n",
2986 propname, (2 * i) + 1, ret);
2987 return -EINVAL;
2988 }
2989 }
2990
2991 card->num_of_dapm_routes = num_routes;
2992 card->of_dapm_routes = routes;
2993
2994 return 0;
2995 }
2996 EXPORT_SYMBOL_GPL(snd_soc_of_parse_audio_routing);
2997
2998 int snd_soc_of_parse_aux_devs(struct snd_soc_card *card, const char *propname)
2999 {
3000 struct device_node *node = card->dev->of_node;
3001 struct snd_soc_aux_dev *aux;
3002 int num, i;
3003
3004 num = of_count_phandle_with_args(node, propname, NULL);
3005 if (num == -ENOENT) {
3006 return 0;
3007 } else if (num < 0) {
3008 dev_err(card->dev, "ASOC: Property '%s' could not be read: %d\n",
3009 propname, num);
3010 return num;
3011 }
3012
3013 aux = devm_kcalloc(card->dev, num, sizeof(*aux), GFP_KERNEL);
3014 if (!aux)
3015 return -ENOMEM;
3016 card->aux_dev = aux;
3017 card->num_aux_devs = num;
3018
3019 for_each_card_pre_auxs(card, i, aux) {
3020 aux->dlc.of_node = of_parse_phandle(node, propname, i);
3021 if (!aux->dlc.of_node)
3022 return -EINVAL;
3023 }
3024
3025 return 0;
3026 }
3027 EXPORT_SYMBOL_GPL(snd_soc_of_parse_aux_devs);
3028
3029 unsigned int snd_soc_daifmt_clock_provider_flipped(unsigned int dai_fmt)
3030 {
3031 unsigned int inv_dai_fmt = dai_fmt & ~SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK;
3032
3033 switch (dai_fmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) {
3034 case SND_SOC_DAIFMT_CBP_CFP:
3035 inv_dai_fmt |= SND_SOC_DAIFMT_CBC_CFC;
3036 break;
3037 case SND_SOC_DAIFMT_CBP_CFC:
3038 inv_dai_fmt |= SND_SOC_DAIFMT_CBC_CFP;
3039 break;
3040 case SND_SOC_DAIFMT_CBC_CFP:
3041 inv_dai_fmt |= SND_SOC_DAIFMT_CBP_CFC;
3042 break;
3043 case SND_SOC_DAIFMT_CBC_CFC:
3044 inv_dai_fmt |= SND_SOC_DAIFMT_CBP_CFP;
3045 break;
3046 }
3047
3048 return inv_dai_fmt;
3049 }
3050 EXPORT_SYMBOL_GPL(snd_soc_daifmt_clock_provider_flipped);
3051
3052 unsigned int snd_soc_daifmt_clock_provider_from_bitmap(unsigned int bit_frame)
3053 {
3054
3055
3056
3057
3058
3059
3060 switch (bit_frame) {
3061 case 0x11:
3062 return SND_SOC_DAIFMT_CBP_CFP;
3063 case 0x10:
3064 return SND_SOC_DAIFMT_CBP_CFC;
3065 case 0x01:
3066 return SND_SOC_DAIFMT_CBC_CFP;
3067 default:
3068 return SND_SOC_DAIFMT_CBC_CFC;
3069 }
3070
3071 return 0;
3072 }
3073 EXPORT_SYMBOL_GPL(snd_soc_daifmt_clock_provider_from_bitmap);
3074
3075 unsigned int snd_soc_daifmt_parse_format(struct device_node *np,
3076 const char *prefix)
3077 {
3078 int ret;
3079 char prop[128];
3080 unsigned int format = 0;
3081 int bit, frame;
3082 const char *str;
3083 struct {
3084 char *name;
3085 unsigned int val;
3086 } of_fmt_table[] = {
3087 { "i2s", SND_SOC_DAIFMT_I2S },
3088 { "right_j", SND_SOC_DAIFMT_RIGHT_J },
3089 { "left_j", SND_SOC_DAIFMT_LEFT_J },
3090 { "dsp_a", SND_SOC_DAIFMT_DSP_A },
3091 { "dsp_b", SND_SOC_DAIFMT_DSP_B },
3092 { "ac97", SND_SOC_DAIFMT_AC97 },
3093 { "pdm", SND_SOC_DAIFMT_PDM},
3094 { "msb", SND_SOC_DAIFMT_MSB },
3095 { "lsb", SND_SOC_DAIFMT_LSB },
3096 };
3097
3098 if (!prefix)
3099 prefix = "";
3100
3101
3102
3103
3104
3105
3106 ret = of_property_read_string(np, "dai-format", &str);
3107 if (ret < 0) {
3108 snprintf(prop, sizeof(prop), "%sformat", prefix);
3109 ret = of_property_read_string(np, prop, &str);
3110 }
3111 if (ret == 0) {
3112 int i;
3113
3114 for (i = 0; i < ARRAY_SIZE(of_fmt_table); i++) {
3115 if (strcmp(str, of_fmt_table[i].name) == 0) {
3116 format |= of_fmt_table[i].val;
3117 break;
3118 }
3119 }
3120 }
3121
3122
3123
3124
3125
3126 snprintf(prop, sizeof(prop), "%scontinuous-clock", prefix);
3127 if (of_property_read_bool(np, prop))
3128 format |= SND_SOC_DAIFMT_CONT;
3129 else
3130 format |= SND_SOC_DAIFMT_GATED;
3131
3132
3133
3134
3135
3136
3137 snprintf(prop, sizeof(prop), "%sbitclock-inversion", prefix);
3138 bit = !!of_get_property(np, prop, NULL);
3139
3140 snprintf(prop, sizeof(prop), "%sframe-inversion", prefix);
3141 frame = !!of_get_property(np, prop, NULL);
3142
3143 switch ((bit << 4) + frame) {
3144 case 0x11:
3145 format |= SND_SOC_DAIFMT_IB_IF;
3146 break;
3147 case 0x10:
3148 format |= SND_SOC_DAIFMT_IB_NF;
3149 break;
3150 case 0x01:
3151 format |= SND_SOC_DAIFMT_NB_IF;
3152 break;
3153 default:
3154
3155 break;
3156 }
3157
3158 return format;
3159 }
3160 EXPORT_SYMBOL_GPL(snd_soc_daifmt_parse_format);
3161
3162 unsigned int snd_soc_daifmt_parse_clock_provider_raw(struct device_node *np,
3163 const char *prefix,
3164 struct device_node **bitclkmaster,
3165 struct device_node **framemaster)
3166 {
3167 char prop[128];
3168 unsigned int bit, frame;
3169
3170 if (!prefix)
3171 prefix = "";
3172
3173
3174
3175
3176
3177 snprintf(prop, sizeof(prop), "%sbitclock-master", prefix);
3178 bit = !!of_get_property(np, prop, NULL);
3179 if (bit && bitclkmaster)
3180 *bitclkmaster = of_parse_phandle(np, prop, 0);
3181
3182 snprintf(prop, sizeof(prop), "%sframe-master", prefix);
3183 frame = !!of_get_property(np, prop, NULL);
3184 if (frame && framemaster)
3185 *framemaster = of_parse_phandle(np, prop, 0);
3186
3187
3188
3189
3190
3191
3192 return (bit << 4) + frame;
3193 }
3194 EXPORT_SYMBOL_GPL(snd_soc_daifmt_parse_clock_provider_raw);
3195
3196 int snd_soc_get_dai_id(struct device_node *ep)
3197 {
3198 struct snd_soc_component *component;
3199 struct snd_soc_dai_link_component dlc;
3200 int ret;
3201
3202 dlc.of_node = of_graph_get_port_parent(ep);
3203 dlc.name = NULL;
3204
3205
3206
3207
3208
3209
3210 ret = -ENOTSUPP;
3211 mutex_lock(&client_mutex);
3212 component = soc_find_component(&dlc);
3213 if (component)
3214 ret = snd_soc_component_of_xlate_dai_id(component, ep);
3215 mutex_unlock(&client_mutex);
3216
3217 of_node_put(dlc.of_node);
3218
3219 return ret;
3220 }
3221 EXPORT_SYMBOL_GPL(snd_soc_get_dai_id);
3222
3223 int snd_soc_get_dai_name(const struct of_phandle_args *args,
3224 const char **dai_name)
3225 {
3226 struct snd_soc_component *pos;
3227 int ret = -EPROBE_DEFER;
3228
3229 mutex_lock(&client_mutex);
3230 for_each_component(pos) {
3231 struct device_node *component_of_node = soc_component_to_node(pos);
3232
3233 if (component_of_node != args->np || !pos->num_dai)
3234 continue;
3235
3236 ret = snd_soc_component_of_xlate_dai_name(pos, args, dai_name);
3237 if (ret == -ENOTSUPP) {
3238 struct snd_soc_dai *dai;
3239 int id = -1;
3240
3241 switch (args->args_count) {
3242 case 0:
3243 id = 0;
3244 break;
3245 case 1:
3246 id = args->args[0];
3247 break;
3248 default:
3249
3250 break;
3251 }
3252
3253 if (id < 0 || id >= pos->num_dai) {
3254 ret = -EINVAL;
3255 continue;
3256 }
3257
3258 ret = 0;
3259
3260
3261 for_each_component_dais(pos, dai) {
3262 if (id == 0)
3263 break;
3264 id--;
3265 }
3266
3267 *dai_name = dai->driver->name;
3268 if (!*dai_name)
3269 *dai_name = pos->name;
3270 } else if (ret) {
3271
3272
3273
3274
3275
3276
3277 continue;
3278 }
3279
3280 break;
3281 }
3282 mutex_unlock(&client_mutex);
3283 return ret;
3284 }
3285 EXPORT_SYMBOL_GPL(snd_soc_get_dai_name);
3286
3287 int snd_soc_of_get_dai_name(struct device_node *of_node,
3288 const char **dai_name)
3289 {
3290 struct of_phandle_args args;
3291 int ret;
3292
3293 ret = of_parse_phandle_with_args(of_node, "sound-dai",
3294 "#sound-dai-cells", 0, &args);
3295 if (ret)
3296 return ret;
3297
3298 ret = snd_soc_get_dai_name(&args, dai_name);
3299
3300 of_node_put(args.np);
3301
3302 return ret;
3303 }
3304 EXPORT_SYMBOL_GPL(snd_soc_of_get_dai_name);
3305
3306 static void __snd_soc_of_put_component(struct snd_soc_dai_link_component *component)
3307 {
3308 if (component->of_node) {
3309 of_node_put(component->of_node);
3310 component->of_node = NULL;
3311 }
3312 }
3313
3314 static int __snd_soc_of_get_dai_link_component_alloc(
3315 struct device *dev, struct device_node *of_node,
3316 struct snd_soc_dai_link_component **ret_component,
3317 int *ret_num)
3318 {
3319 struct snd_soc_dai_link_component *component;
3320 int num;
3321
3322
3323 num = of_count_phandle_with_args(of_node, "sound-dai", "#sound-dai-cells");
3324 if (num <= 0) {
3325 if (num == -ENOENT)
3326 dev_err(dev, "No 'sound-dai' property\n");
3327 else
3328 dev_err(dev, "Bad phandle in 'sound-dai'\n");
3329 return num;
3330 }
3331 component = devm_kcalloc(dev, num, sizeof(*component), GFP_KERNEL);
3332 if (!component)
3333 return -ENOMEM;
3334
3335 *ret_component = component;
3336 *ret_num = num;
3337
3338 return 0;
3339 }
3340
3341 static int __snd_soc_of_get_dai_link_component_parse(
3342 struct device_node *of_node,
3343 struct snd_soc_dai_link_component *component, int index)
3344 {
3345 struct of_phandle_args args;
3346 int ret;
3347
3348 ret = of_parse_phandle_with_args(of_node, "sound-dai", "#sound-dai-cells",
3349 index, &args);
3350 if (ret)
3351 return ret;
3352
3353 ret = snd_soc_get_dai_name(&args, &component->dai_name);
3354 if (ret < 0)
3355 return ret;
3356
3357 component->of_node = args.np;
3358 return 0;
3359 }
3360
3361
3362
3363
3364
3365
3366
3367 void snd_soc_of_put_dai_link_codecs(struct snd_soc_dai_link *dai_link)
3368 {
3369 struct snd_soc_dai_link_component *component;
3370 int index;
3371
3372 for_each_link_codecs(dai_link, index, component)
3373 __snd_soc_of_put_component(component);
3374 }
3375 EXPORT_SYMBOL_GPL(snd_soc_of_put_dai_link_codecs);
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391 int snd_soc_of_get_dai_link_codecs(struct device *dev,
3392 struct device_node *of_node,
3393 struct snd_soc_dai_link *dai_link)
3394 {
3395 struct snd_soc_dai_link_component *component;
3396 int index, ret;
3397
3398 ret = __snd_soc_of_get_dai_link_component_alloc(dev, of_node,
3399 &dai_link->codecs, &dai_link->num_codecs);
3400 if (ret < 0)
3401 return ret;
3402
3403
3404 for_each_link_codecs(dai_link, index, component) {
3405 ret = __snd_soc_of_get_dai_link_component_parse(of_node, component, index);
3406 if (ret)
3407 goto err;
3408 }
3409 return 0;
3410 err:
3411 snd_soc_of_put_dai_link_codecs(dai_link);
3412 dai_link->codecs = NULL;
3413 dai_link->num_codecs = 0;
3414 return ret;
3415 }
3416 EXPORT_SYMBOL_GPL(snd_soc_of_get_dai_link_codecs);
3417
3418
3419
3420
3421
3422
3423
3424 void snd_soc_of_put_dai_link_cpus(struct snd_soc_dai_link *dai_link)
3425 {
3426 struct snd_soc_dai_link_component *component;
3427 int index;
3428
3429 for_each_link_cpus(dai_link, index, component)
3430 __snd_soc_of_put_component(component);
3431 }
3432 EXPORT_SYMBOL_GPL(snd_soc_of_put_dai_link_cpus);
3433
3434
3435
3436
3437
3438
3439
3440
3441
3442
3443
3444
3445 int snd_soc_of_get_dai_link_cpus(struct device *dev,
3446 struct device_node *of_node,
3447 struct snd_soc_dai_link *dai_link)
3448 {
3449 struct snd_soc_dai_link_component *component;
3450 int index, ret;
3451
3452
3453 ret = __snd_soc_of_get_dai_link_component_alloc(dev, of_node,
3454 &dai_link->cpus, &dai_link->num_cpus);
3455 if (ret < 0)
3456 return ret;
3457
3458
3459 for_each_link_cpus(dai_link, index, component) {
3460 ret = __snd_soc_of_get_dai_link_component_parse(of_node, component, index);
3461 if (ret)
3462 goto err;
3463 }
3464 return 0;
3465 err:
3466 snd_soc_of_put_dai_link_cpus(dai_link);
3467 dai_link->cpus = NULL;
3468 dai_link->num_cpus = 0;
3469 return ret;
3470 }
3471 EXPORT_SYMBOL_GPL(snd_soc_of_get_dai_link_cpus);
3472
3473 static int __init snd_soc_init(void)
3474 {
3475 snd_soc_debugfs_init();
3476 snd_soc_util_init();
3477
3478 return platform_driver_register(&soc_driver);
3479 }
3480 module_init(snd_soc_init);
3481
3482 static void __exit snd_soc_exit(void)
3483 {
3484 snd_soc_util_exit();
3485 snd_soc_debugfs_exit();
3486
3487 platform_driver_unregister(&soc_driver);
3488 }
3489 module_exit(snd_soc_exit);
3490
3491
3492 MODULE_AUTHOR("Liam Girdwood, lrg@slimlogic.co.uk");
3493 MODULE_DESCRIPTION("ALSA SoC Core");
3494 MODULE_LICENSE("GPL");
3495 MODULE_ALIAS("platform:soc-audio");