diff options
author | Mark Brown <broonie@kernel.org> | 2017-09-01 07:12:18 -0400 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2017-09-01 07:12:18 -0400 |
commit | 39e0a0ae6957a7eafcd3245f45f40bf822e49812 (patch) | |
tree | bac0168f535ba57ea0a9804b458665d664581d0e | |
parent | 0314f6947c5132c63413855c34d8cff22e95ae2b (diff) | |
parent | 88c27465dc7e3f11c43de295f623c44f593a0912 (diff) |
Merge remote-tracking branch 'asoc/topic/core' into asoc-next
-rw-r--r-- | include/sound/soc.h | 21 | ||||
-rw-r--r-- | sound/soc/codecs/max98927.c | 1 | ||||
-rw-r--r-- | sound/soc/soc-core.c | 142 | ||||
-rw-r--r-- | sound/soc/soc-pcm.c | 43 |
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 | ||
892 | struct snd_soc_rtdcom_list { | ||
893 | struct snd_soc_component *component; | ||
894 | struct list_head list; /* rtd::component_list */ | ||
895 | }; | ||
896 | struct snd_soc_component* | ||
897 | snd_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 */ |
893 | struct snd_soc_codec { | 905 | struct 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) | |||
339 | static void soc_init_codec_debugfs(struct snd_soc_component *component) | 339 | static 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) | |||
494 | static void snd_soc_debugfs_init(void) | 495 | static 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 | ||
554 | static 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 | |||
578 | static 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 | |||
588 | struct 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 | |||
553 | struct snd_pcm_substream *snd_soc_get_dai_substream(struct snd_soc_card *card, | 602 | struct 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, | |||
1184 | static void soc_remove_link_components(struct snd_soc_card *card, | 1257 | static 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 | ||
1210 | static void soc_remove_dai_links(struct snd_soc_card *card) | 1271 | static 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: | |||
3367 | EXPORT_SYMBOL_GPL(snd_soc_register_component); | 3413 | EXPORT_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 | */ |
3374 | void snd_soc_unregister_component(struct device *dev) | 3421 | static 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 | |||
3447 | void snd_soc_unregister_component(struct device *dev) | ||
3448 | { | ||
3449 | while (__snd_soc_unregister_component(dev)); | ||
3396 | } | 3450 | } |
3397 | EXPORT_SYMBOL_GPL(snd_soc_unregister_component); | 3451 | EXPORT_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: | |||
603 | out: | 607 | out: |
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 |