aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Brown <broonie@kernel.org>2017-09-01 07:12:18 -0400
committerMark Brown <broonie@kernel.org>2017-09-01 07:12:18 -0400
commit39e0a0ae6957a7eafcd3245f45f40bf822e49812 (patch)
treebac0168f535ba57ea0a9804b458665d664581d0e
parent0314f6947c5132c63413855c34d8cff22e95ae2b (diff)
parent88c27465dc7e3f11c43de295f623c44f593a0912 (diff)
Merge remote-tracking branch 'asoc/topic/core' into asoc-next
-rw-r--r--include/sound/soc.h21
-rw-r--r--sound/soc/codecs/max98927.c1
-rw-r--r--sound/soc/soc-core.c142
-rw-r--r--sound/soc/soc-pcm.c43
4 files changed, 133 insertions, 74 deletions
diff --git a/include/sound/soc.h b/include/sound/soc.h
index feb896815069..d22de9712c45 100644
--- a/include/sound/soc.h
+++ b/include/sound/soc.h
@@ -889,6 +889,18 @@ struct snd_soc_component {
889#endif 889#endif
890}; 890};
891 891
892struct snd_soc_rtdcom_list {
893 struct snd_soc_component *component;
894 struct list_head list; /* rtd::component_list */
895};
896struct snd_soc_component*
897snd_soc_rtdcom_lookup(struct snd_soc_pcm_runtime *rtd,
898 const char *driver_name);
899#define for_each_rtdcom(rtd, rtdcom) \
900 list_for_each_entry(rtdcom, &(rtd)->component_list, list)
901#define for_each_rtdcom_safe(rtd, rtdcom1, rtdcom2) \
902 list_for_each_entry_safe(rtdcom1, rtdcom2, &(rtd)->component_list, list)
903
892/* SoC Audio Codec device */ 904/* SoC Audio Codec device */
893struct snd_soc_codec { 905struct snd_soc_codec {
894 struct device *dev; 906 struct device *dev;
@@ -897,7 +909,6 @@ struct snd_soc_codec {
897 struct list_head list; 909 struct list_head list;
898 910
899 /* runtime */ 911 /* runtime */
900 unsigned int cache_bypass:1; /* Suppress access to the cache */
901 unsigned int cache_init:1; /* codec cache has been initialized */ 912 unsigned int cache_init:1; /* codec cache has been initialized */
902 913
903 /* codec IO */ 914 /* codec IO */
@@ -907,10 +918,6 @@ struct snd_soc_codec {
907 918
908 /* component */ 919 /* component */
909 struct snd_soc_component component; 920 struct snd_soc_component component;
910
911#ifdef CONFIG_DEBUG_FS
912 struct dentry *debugfs_reg;
913#endif
914}; 921};
915 922
916/* codec driver */ 923/* codec driver */
@@ -1233,7 +1240,7 @@ struct snd_soc_pcm_runtime {
1233 struct snd_pcm *pcm; 1240 struct snd_pcm *pcm;
1234 struct snd_compr *compr; 1241 struct snd_compr *compr;
1235 struct snd_soc_codec *codec; 1242 struct snd_soc_codec *codec;
1236 struct snd_soc_platform *platform; 1243 struct snd_soc_platform *platform; /* will be removed */
1237 struct snd_soc_dai *codec_dai; 1244 struct snd_soc_dai *codec_dai;
1238 struct snd_soc_dai *cpu_dai; 1245 struct snd_soc_dai *cpu_dai;
1239 1246
@@ -1243,11 +1250,11 @@ struct snd_soc_pcm_runtime {
1243 struct delayed_work delayed_work; 1250 struct delayed_work delayed_work;
1244#ifdef CONFIG_DEBUG_FS 1251#ifdef CONFIG_DEBUG_FS
1245 struct dentry *debugfs_dpcm_root; 1252 struct dentry *debugfs_dpcm_root;
1246 struct dentry *debugfs_dpcm_state;
1247#endif 1253#endif
1248 1254
1249 unsigned int num; /* 0-based and monotonic increasing */ 1255 unsigned int num; /* 0-based and monotonic increasing */
1250 struct list_head list; /* rtd list of the soc card */ 1256 struct list_head list; /* rtd list of the soc card */
1257 struct list_head component_list; /* list of connected components */
1251 1258
1252 /* bit field */ 1259 /* bit field */
1253 unsigned int dev_registered:1; 1260 unsigned int dev_registered:1;
diff --git a/sound/soc/codecs/max98927.c b/sound/soc/codecs/max98927.c
index b5ee29499e16..b0380b560bf5 100644
--- a/sound/soc/codecs/max98927.c
+++ b/sound/soc/codecs/max98927.c
@@ -577,7 +577,6 @@ static int max98927_probe(struct snd_soc_codec *codec)
577 577
578 max98927->codec = codec; 578 max98927->codec = codec;
579 codec->control_data = max98927->regmap; 579 codec->control_data = max98927->regmap;
580 codec->cache_bypass = 1;
581 580
582 /* Software Reset */ 581 /* Software Reset */
583 regmap_write(max98927->regmap, 582 regmap_write(max98927->regmap,
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
index 3d7287858609..e4ea5d4aa8d5 100644
--- a/sound/soc/soc-core.c
+++ b/sound/soc/soc-core.c
@@ -339,11 +339,12 @@ static void soc_cleanup_component_debugfs(struct snd_soc_component *component)
339static void soc_init_codec_debugfs(struct snd_soc_component *component) 339static void soc_init_codec_debugfs(struct snd_soc_component *component)
340{ 340{
341 struct snd_soc_codec *codec = snd_soc_component_to_codec(component); 341 struct snd_soc_codec *codec = snd_soc_component_to_codec(component);
342 struct dentry *debugfs_reg;
342 343
343 codec->debugfs_reg = debugfs_create_file("codec_reg", 0644, 344 debugfs_reg = debugfs_create_file("codec_reg", 0644,
344 codec->component.debugfs_root, 345 codec->component.debugfs_root,
345 codec, &codec_reg_fops); 346 codec, &codec_reg_fops);
346 if (!codec->debugfs_reg) 347 if (!debugfs_reg)
347 dev_warn(codec->dev, 348 dev_warn(codec->dev,
348 "ASoC: Failed to create codec register debugfs file\n"); 349 "ASoC: Failed to create codec register debugfs file\n");
349} 350}
@@ -494,7 +495,7 @@ static void soc_cleanup_card_debugfs(struct snd_soc_card *card)
494static void snd_soc_debugfs_init(void) 495static void snd_soc_debugfs_init(void)
495{ 496{
496 snd_soc_debugfs_root = debugfs_create_dir("asoc", NULL); 497 snd_soc_debugfs_root = debugfs_create_dir("asoc", NULL);
497 if (IS_ERR(snd_soc_debugfs_root) || !snd_soc_debugfs_root) { 498 if (IS_ERR_OR_NULL(snd_soc_debugfs_root)) {
498 pr_warn("ASoC: Failed to create debugfs directory\n"); 499 pr_warn("ASoC: Failed to create debugfs directory\n");
499 snd_soc_debugfs_root = NULL; 500 snd_soc_debugfs_root = NULL;
500 return; 501 return;
@@ -550,6 +551,54 @@ static inline void snd_soc_debugfs_exit(void)
550 551
551#endif 552#endif
552 553
554static int snd_soc_rtdcom_add(struct snd_soc_pcm_runtime *rtd,
555 struct snd_soc_component *component)
556{
557 struct snd_soc_rtdcom_list *rtdcom;
558 struct snd_soc_rtdcom_list *new_rtdcom;
559
560 for_each_rtdcom(rtd, rtdcom) {
561 /* already connected */
562 if (rtdcom->component == component)
563 return 0;
564 }
565
566 new_rtdcom = kmalloc(sizeof(*new_rtdcom), GFP_KERNEL);
567 if (!new_rtdcom)
568 return -ENOMEM;
569
570 new_rtdcom->component = component;
571 INIT_LIST_HEAD(&new_rtdcom->list);
572
573 list_add_tail(&new_rtdcom->list, &rtd->component_list);
574
575 return 0;
576}
577
578static void snd_soc_rtdcom_del_all(struct snd_soc_pcm_runtime *rtd)
579{
580 struct snd_soc_rtdcom_list *rtdcom1, *rtdcom2;
581
582 for_each_rtdcom_safe(rtd, rtdcom1, rtdcom2)
583 kfree(rtdcom1);
584
585 INIT_LIST_HEAD(&rtd->component_list);
586}
587
588struct snd_soc_component *snd_soc_rtdcom_lookup(struct snd_soc_pcm_runtime *rtd,
589 const char *driver_name)
590{
591 struct snd_soc_rtdcom_list *rtdcom;
592
593 for_each_rtdcom(rtd, rtdcom) {
594 if ((rtdcom->component->driver->name == driver_name) ||
595 strcmp(rtdcom->component->driver->name, driver_name) == 0)
596 return rtdcom->component;
597 }
598
599 return NULL;
600}
601
553struct snd_pcm_substream *snd_soc_get_dai_substream(struct snd_soc_card *card, 602struct snd_pcm_substream *snd_soc_get_dai_substream(struct snd_soc_card *card,
554 const char *dai_link, int stream) 603 const char *dai_link, int stream)
555{ 604{
@@ -574,6 +623,7 @@ static struct snd_soc_pcm_runtime *soc_new_pcm_runtime(
574 if (!rtd) 623 if (!rtd)
575 return NULL; 624 return NULL;
576 625
626 INIT_LIST_HEAD(&rtd->component_list);
577 rtd->card = card; 627 rtd->card = card;
578 rtd->dai_link = dai_link; 628 rtd->dai_link = dai_link;
579 rtd->codec_dais = kzalloc(sizeof(struct snd_soc_dai *) * 629 rtd->codec_dais = kzalloc(sizeof(struct snd_soc_dai *) *
@@ -591,6 +641,7 @@ static void soc_free_pcm_runtime(struct snd_soc_pcm_runtime *rtd)
591{ 641{
592 if (rtd && rtd->codec_dais) 642 if (rtd && rtd->codec_dais)
593 kfree(rtd->codec_dais); 643 kfree(rtd->codec_dais);
644 snd_soc_rtdcom_del_all(rtd);
594 kfree(rtd); 645 kfree(rtd);
595} 646}
596 647
@@ -949,7 +1000,7 @@ static struct snd_soc_component *soc_find_component(
949/** 1000/**
950 * snd_soc_find_dai - Find a registered DAI 1001 * snd_soc_find_dai - Find a registered DAI
951 * 1002 *
952 * @dlc: name of the DAI and optional component info to match 1003 * @dlc: name of the DAI or the DAI driver and optional component info to match
953 * 1004 *
954 * This function will search all registered components and their DAIs to 1005 * This function will search all registered components and their DAIs to
955 * find the DAI of the same name. The component's of_node and name 1006 * find the DAI of the same name. The component's of_node and name
@@ -977,7 +1028,9 @@ struct snd_soc_dai *snd_soc_find_dai(
977 if (dlc->name && strcmp(component->name, dlc->name)) 1028 if (dlc->name && strcmp(component->name, dlc->name))
978 continue; 1029 continue;
979 list_for_each_entry(dai, &component->dai_list, list) { 1030 list_for_each_entry(dai, &component->dai_list, list) {
980 if (dlc->dai_name && strcmp(dai->name, dlc->dai_name)) 1031 if (dlc->dai_name && strcmp(dai->name, dlc->dai_name)
1032 && (!dai->driver->name
1033 || strcmp(dai->driver->name, dlc->dai_name)))
981 continue; 1034 continue;
982 1035
983 return dai; 1036 return dai;
@@ -1049,6 +1102,7 @@ static int soc_bind_dai_link(struct snd_soc_card *card,
1049 struct snd_soc_pcm_runtime *rtd; 1102 struct snd_soc_pcm_runtime *rtd;
1050 struct snd_soc_dai_link_component *codecs = dai_link->codecs; 1103 struct snd_soc_dai_link_component *codecs = dai_link->codecs;
1051 struct snd_soc_dai_link_component cpu_dai_component; 1104 struct snd_soc_dai_link_component cpu_dai_component;
1105 struct snd_soc_component *component;
1052 struct snd_soc_dai **codec_dais; 1106 struct snd_soc_dai **codec_dais;
1053 struct snd_soc_platform *platform; 1107 struct snd_soc_platform *platform;
1054 struct device_node *platform_of_node; 1108 struct device_node *platform_of_node;
@@ -1076,6 +1130,7 @@ static int soc_bind_dai_link(struct snd_soc_card *card,
1076 dai_link->cpu_dai_name); 1130 dai_link->cpu_dai_name);
1077 goto _err_defer; 1131 goto _err_defer;
1078 } 1132 }
1133 snd_soc_rtdcom_add(rtd, rtd->cpu_dai->component);
1079 1134
1080 rtd->num_codecs = dai_link->num_codecs; 1135 rtd->num_codecs = dai_link->num_codecs;
1081 1136
@@ -1088,6 +1143,7 @@ static int soc_bind_dai_link(struct snd_soc_card *card,
1088 codecs[i].dai_name); 1143 codecs[i].dai_name);
1089 goto _err_defer; 1144 goto _err_defer;
1090 } 1145 }
1146 snd_soc_rtdcom_add(rtd, codec_dais[i]->component);
1091 } 1147 }
1092 1148
1093 /* Single codec links expect codec and codec_dai in runtime data */ 1149 /* Single codec links expect codec and codec_dai in runtime data */
@@ -1100,6 +1156,23 @@ static int soc_bind_dai_link(struct snd_soc_card *card,
1100 platform_name = "snd-soc-dummy"; 1156 platform_name = "snd-soc-dummy";
1101 1157
1102 /* find one from the set of registered platforms */ 1158 /* find one from the set of registered platforms */
1159 list_for_each_entry(component, &component_list, list) {
1160 platform_of_node = component->dev->of_node;
1161 if (!platform_of_node && component->dev->parent->of_node)
1162 platform_of_node = component->dev->parent->of_node;
1163
1164 if (dai_link->platform_of_node) {
1165 if (platform_of_node != dai_link->platform_of_node)
1166 continue;
1167 } else {
1168 if (strcmp(component->name, platform_name))
1169 continue;
1170 }
1171
1172 snd_soc_rtdcom_add(rtd, component);
1173 }
1174
1175 /* find one from the set of registered platforms */
1103 list_for_each_entry(platform, &platform_list, list) { 1176 list_for_each_entry(platform, &platform_list, list) {
1104 platform_of_node = platform->dev->of_node; 1177 platform_of_node = platform->dev->of_node;
1105 if (!platform_of_node && platform->dev->parent->of_node) 1178 if (!platform_of_node && platform->dev->parent->of_node)
@@ -1184,27 +1257,15 @@ static void soc_remove_link_dais(struct snd_soc_card *card,
1184static void soc_remove_link_components(struct snd_soc_card *card, 1257static void soc_remove_link_components(struct snd_soc_card *card,
1185 struct snd_soc_pcm_runtime *rtd, int order) 1258 struct snd_soc_pcm_runtime *rtd, int order)
1186{ 1259{
1187 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
1188 struct snd_soc_platform *platform = rtd->platform;
1189 struct snd_soc_component *component; 1260 struct snd_soc_component *component;
1190 int i; 1261 struct snd_soc_rtdcom_list *rtdcom;
1191 1262
1192 /* remove the platform */ 1263 for_each_rtdcom(rtd, rtdcom) {
1193 if (platform && platform->component.driver->remove_order == order) 1264 component = rtdcom->component;
1194 soc_remove_component(&platform->component);
1195 1265
1196 /* remove the CODEC-side CODEC */
1197 for (i = 0; i < rtd->num_codecs; i++) {
1198 component = rtd->codec_dais[i]->component;
1199 if (component->driver->remove_order == order) 1266 if (component->driver->remove_order == order)
1200 soc_remove_component(component); 1267 soc_remove_component(component);
1201 } 1268 }
1202
1203 /* remove any CPU-side CODEC */
1204 if (cpu_dai) {
1205 if (cpu_dai->component->driver->remove_order == order)
1206 soc_remove_component(cpu_dai->component);
1207 }
1208} 1269}
1209 1270
1210static void soc_remove_dai_links(struct snd_soc_card *card) 1271static void soc_remove_dai_links(struct snd_soc_card *card)
@@ -1559,21 +1620,13 @@ static int soc_probe_link_components(struct snd_soc_card *card,
1559 struct snd_soc_pcm_runtime *rtd, 1620 struct snd_soc_pcm_runtime *rtd,
1560 int order) 1621 int order)
1561{ 1622{
1562 struct snd_soc_platform *platform = rtd->platform;
1563 struct snd_soc_component *component; 1623 struct snd_soc_component *component;
1564 int i, ret; 1624 struct snd_soc_rtdcom_list *rtdcom;
1625 int ret;
1565 1626
1566 /* probe the CPU-side component, if it is a CODEC */ 1627 for_each_rtdcom(rtd, rtdcom) {
1567 component = rtd->cpu_dai->component; 1628 component = rtdcom->component;
1568 if (component->driver->probe_order == order) {
1569 ret = soc_probe_component(card, component);
1570 if (ret < 0)
1571 return ret;
1572 }
1573 1629
1574 /* probe the CODEC-side components */
1575 for (i = 0; i < rtd->num_codecs; i++) {
1576 component = rtd->codec_dais[i]->component;
1577 if (component->driver->probe_order == order) { 1630 if (component->driver->probe_order == order) {
1578 ret = soc_probe_component(card, component); 1631 ret = soc_probe_component(card, component);
1579 if (ret < 0) 1632 if (ret < 0)
@@ -1581,13 +1634,6 @@ static int soc_probe_link_components(struct snd_soc_card *card,
1581 } 1634 }
1582 } 1635 }
1583 1636
1584 /* probe the platform */
1585 if (platform->component.driver->probe_order == order) {
1586 ret = soc_probe_component(card, &platform->component);
1587 if (ret < 0)
1588 return ret;
1589 }
1590
1591 return 0; 1637 return 0;
1592} 1638}
1593 1639
@@ -3227,7 +3273,7 @@ static int snd_soc_component_initialize(struct snd_soc_component *component,
3227 component->set_pll = component->driver->set_pll; 3273 component->set_pll = component->driver->set_pll;
3228 component->set_jack = component->driver->set_jack; 3274 component->set_jack = component->driver->set_jack;
3229 3275
3230 dapm = &component->dapm; 3276 dapm = snd_soc_component_get_dapm(component);
3231 dapm->dev = dev; 3277 dapm->dev = dev;
3232 dapm->component = component; 3278 dapm->component = component;
3233 dapm->bias_level = SND_SOC_BIAS_OFF; 3279 dapm->bias_level = SND_SOC_BIAS_OFF;
@@ -3367,11 +3413,12 @@ err_free:
3367EXPORT_SYMBOL_GPL(snd_soc_register_component); 3413EXPORT_SYMBOL_GPL(snd_soc_register_component);
3368 3414
3369/** 3415/**
3370 * snd_soc_unregister_component - Unregister a component from the ASoC core 3416 * snd_soc_unregister_component - Unregister all related component
3417 * from the ASoC core
3371 * 3418 *
3372 * @dev: The device to unregister 3419 * @dev: The device to unregister
3373 */ 3420 */
3374void snd_soc_unregister_component(struct device *dev) 3421static int __snd_soc_unregister_component(struct device *dev)
3375{ 3422{
3376 struct snd_soc_component *component; 3423 struct snd_soc_component *component;
3377 int found = 0; 3424 int found = 0;
@@ -3393,6 +3440,13 @@ void snd_soc_unregister_component(struct device *dev)
3393 snd_soc_component_cleanup(component); 3440 snd_soc_component_cleanup(component);
3394 kfree(component); 3441 kfree(component);
3395 } 3442 }
3443
3444 return found;
3445}
3446
3447void snd_soc_unregister_component(struct device *dev)
3448{
3449 while (__snd_soc_unregister_component(dev));
3396} 3450}
3397EXPORT_SYMBOL_GPL(snd_soc_unregister_component); 3451EXPORT_SYMBOL_GPL(snd_soc_unregister_component);
3398 3452
diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c
index 7d3859e1a7b9..94b88b897c3b 100644
--- a/sound/soc/soc-pcm.c
+++ b/sound/soc/soc-pcm.c
@@ -454,6 +454,8 @@ static int soc_pcm_open(struct snd_pcm_substream *substream)
454 struct snd_soc_pcm_runtime *rtd = substream->private_data; 454 struct snd_soc_pcm_runtime *rtd = substream->private_data;
455 struct snd_pcm_runtime *runtime = substream->runtime; 455 struct snd_pcm_runtime *runtime = substream->runtime;
456 struct snd_soc_platform *platform = rtd->platform; 456 struct snd_soc_platform *platform = rtd->platform;
457 struct snd_soc_component *component;
458 struct snd_soc_rtdcom_list *rtdcom;
457 struct snd_soc_dai *cpu_dai = rtd->cpu_dai; 459 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
458 struct snd_soc_dai *codec_dai; 460 struct snd_soc_dai *codec_dai;
459 const char *codec_dai_name = "multicodec"; 461 const char *codec_dai_name = "multicodec";
@@ -462,10 +464,12 @@ static int soc_pcm_open(struct snd_pcm_substream *substream)
462 pinctrl_pm_select_default_state(cpu_dai->dev); 464 pinctrl_pm_select_default_state(cpu_dai->dev);
463 for (i = 0; i < rtd->num_codecs; i++) 465 for (i = 0; i < rtd->num_codecs; i++)
464 pinctrl_pm_select_default_state(rtd->codec_dais[i]->dev); 466 pinctrl_pm_select_default_state(rtd->codec_dais[i]->dev);
465 pm_runtime_get_sync(cpu_dai->dev); 467
466 for (i = 0; i < rtd->num_codecs; i++) 468 for_each_rtdcom(rtd, rtdcom) {
467 pm_runtime_get_sync(rtd->codec_dais[i]->dev); 469 component = rtdcom->component;
468 pm_runtime_get_sync(platform->dev); 470
471 pm_runtime_get_sync(component->dev);
472 }
469 473
470 mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass); 474 mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
471 475
@@ -603,15 +607,13 @@ platform_err:
603out: 607out:
604 mutex_unlock(&rtd->pcm_mutex); 608 mutex_unlock(&rtd->pcm_mutex);
605 609
606 pm_runtime_mark_last_busy(platform->dev); 610 for_each_rtdcom(rtd, rtdcom) {
607 pm_runtime_put_autosuspend(platform->dev); 611 component = rtdcom->component;
608 for (i = 0; i < rtd->num_codecs; i++) { 612
609 pm_runtime_mark_last_busy(rtd->codec_dais[i]->dev); 613 pm_runtime_mark_last_busy(component->dev);
610 pm_runtime_put_autosuspend(rtd->codec_dais[i]->dev); 614 pm_runtime_put_autosuspend(component->dev);
611 } 615 }
612 616
613 pm_runtime_mark_last_busy(cpu_dai->dev);
614 pm_runtime_put_autosuspend(cpu_dai->dev);
615 for (i = 0; i < rtd->num_codecs; i++) { 617 for (i = 0; i < rtd->num_codecs; i++) {
616 if (!rtd->codec_dais[i]->active) 618 if (!rtd->codec_dais[i]->active)
617 pinctrl_pm_select_sleep_state(rtd->codec_dais[i]->dev); 619 pinctrl_pm_select_sleep_state(rtd->codec_dais[i]->dev);
@@ -659,6 +661,8 @@ static int soc_pcm_close(struct snd_pcm_substream *substream)
659{ 661{
660 struct snd_soc_pcm_runtime *rtd = substream->private_data; 662 struct snd_soc_pcm_runtime *rtd = substream->private_data;
661 struct snd_soc_platform *platform = rtd->platform; 663 struct snd_soc_platform *platform = rtd->platform;
664 struct snd_soc_component *component;
665 struct snd_soc_rtdcom_list *rtdcom;
662 struct snd_soc_dai *cpu_dai = rtd->cpu_dai; 666 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
663 struct snd_soc_dai *codec_dai; 667 struct snd_soc_dai *codec_dai;
664 int i; 668 int i;
@@ -715,17 +719,13 @@ static int soc_pcm_close(struct snd_pcm_substream *substream)
715 719
716 mutex_unlock(&rtd->pcm_mutex); 720 mutex_unlock(&rtd->pcm_mutex);
717 721
718 pm_runtime_mark_last_busy(platform->dev); 722 for_each_rtdcom(rtd, rtdcom) {
719 pm_runtime_put_autosuspend(platform->dev); 723 component = rtdcom->component;
720 724
721 for (i = 0; i < rtd->num_codecs; i++) { 725 pm_runtime_mark_last_busy(component->dev);
722 pm_runtime_mark_last_busy(rtd->codec_dais[i]->dev); 726 pm_runtime_put_autosuspend(component->dev);
723 pm_runtime_put_autosuspend(rtd->codec_dais[i]->dev);
724 } 727 }
725 728
726 pm_runtime_mark_last_busy(cpu_dai->dev);
727 pm_runtime_put_autosuspend(cpu_dai->dev);
728
729 for (i = 0; i < rtd->num_codecs; i++) { 729 for (i = 0; i < rtd->num_codecs; i++) {
730 if (!rtd->codec_dais[i]->active) 730 if (!rtd->codec_dais[i]->active)
731 pinctrl_pm_select_sleep_state(rtd->codec_dais[i]->dev); 731 pinctrl_pm_select_sleep_state(rtd->codec_dais[i]->dev);
@@ -3000,8 +3000,7 @@ void soc_dpcm_debugfs_add(struct snd_soc_pcm_runtime *rtd)
3000 return; 3000 return;
3001 } 3001 }
3002 3002
3003 rtd->debugfs_dpcm_state = debugfs_create_file("state", 0444, 3003 debugfs_create_file("state", 0444, rtd->debugfs_dpcm_root,
3004 rtd->debugfs_dpcm_root, 3004 rtd, &dpcm_state_fops);
3005 rtd, &dpcm_state_fops);
3006} 3005}
3007#endif 3006#endif