summaryrefslogtreecommitdiffstats
path: root/sound/soc/soc-pcm.c
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 /sound/soc/soc-pcm.c
parent0314f6947c5132c63413855c34d8cff22e95ae2b (diff)
parent88c27465dc7e3f11c43de295f623c44f593a0912 (diff)
Merge remote-tracking branch 'asoc/topic/core' into asoc-next
Diffstat (limited to 'sound/soc/soc-pcm.c')
-rw-r--r--sound/soc/soc-pcm.c43
1 files changed, 21 insertions, 22 deletions
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