diff options
author | Peter Ujfalusi <peter.ujfalusi@ti.com> | 2014-01-30 08:21:30 -0500 |
---|---|---|
committer | Mark Brown <broonie@linaro.org> | 2014-01-31 11:19:19 -0500 |
commit | 1d17a04ef2f2982fb81fde8ca3fe75723204a68a (patch) | |
tree | 7253824cde75c5731d940051ba99f305587cd425 /sound | |
parent | 2c56c4c27c59edfaa779da156f6a70a38bb1f2df (diff) |
ASoC: davinci-mcasp: Consolidate pm_runtime_get/put() use in the driver
The use of pm_runtime in trigger() callback is not correct and it will lead
to unbalanced power.usage_count.
The only place which might need to call pm_runtime is the set_fmt callback.
Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
Signed-off-by: Mark Brown <broonie@linaro.org>
Diffstat (limited to 'sound')
-rw-r--r-- | sound/soc/davinci/davinci-mcasp.c | 23 |
1 files changed, 9 insertions, 14 deletions
diff --git a/sound/soc/davinci/davinci-mcasp.c b/sound/soc/davinci/davinci-mcasp.c index ae3e40a63e5e..670afa29e30d 100644 --- a/sound/soc/davinci/davinci-mcasp.c +++ b/sound/soc/davinci/davinci-mcasp.c | |||
@@ -263,7 +263,9 @@ static int davinci_mcasp_set_dai_fmt(struct snd_soc_dai *cpu_dai, | |||
263 | unsigned int fmt) | 263 | unsigned int fmt) |
264 | { | 264 | { |
265 | struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(cpu_dai); | 265 | struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(cpu_dai); |
266 | int ret = 0; | ||
266 | 267 | ||
268 | pm_runtime_get_sync(mcasp->dev); | ||
267 | switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { | 269 | switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { |
268 | case SND_SOC_DAIFMT_DSP_B: | 270 | case SND_SOC_DAIFMT_DSP_B: |
269 | case SND_SOC_DAIFMT_AC97: | 271 | case SND_SOC_DAIFMT_AC97: |
@@ -317,7 +319,8 @@ static int davinci_mcasp_set_dai_fmt(struct snd_soc_dai *cpu_dai, | |||
317 | break; | 319 | break; |
318 | 320 | ||
319 | default: | 321 | default: |
320 | return -EINVAL; | 322 | ret = -EINVAL; |
323 | goto out; | ||
321 | } | 324 | } |
322 | 325 | ||
323 | switch (fmt & SND_SOC_DAIFMT_INV_MASK) { | 326 | switch (fmt & SND_SOC_DAIFMT_INV_MASK) { |
@@ -354,10 +357,12 @@ static int davinci_mcasp_set_dai_fmt(struct snd_soc_dai *cpu_dai, | |||
354 | break; | 357 | break; |
355 | 358 | ||
356 | default: | 359 | default: |
357 | return -EINVAL; | 360 | ret = -EINVAL; |
361 | break; | ||
358 | } | 362 | } |
359 | 363 | out: | |
360 | return 0; | 364 | pm_runtime_put_sync(mcasp->dev); |
365 | return ret; | ||
361 | } | 366 | } |
362 | 367 | ||
363 | static int davinci_mcasp_set_clkdiv(struct snd_soc_dai *dai, int div_id, int div) | 368 | static int davinci_mcasp_set_clkdiv(struct snd_soc_dai *dai, int div_id, int div) |
@@ -676,19 +681,9 @@ static int davinci_mcasp_trigger(struct snd_pcm_substream *substream, | |||
676 | case SNDRV_PCM_TRIGGER_RESUME: | 681 | case SNDRV_PCM_TRIGGER_RESUME: |
677 | case SNDRV_PCM_TRIGGER_START: | 682 | case SNDRV_PCM_TRIGGER_START: |
678 | case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: | 683 | case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: |
679 | ret = pm_runtime_get_sync(mcasp->dev); | ||
680 | if (IS_ERR_VALUE(ret)) | ||
681 | dev_err(mcasp->dev, "pm_runtime_get_sync() failed\n"); | ||
682 | davinci_mcasp_start(mcasp, substream->stream); | 684 | davinci_mcasp_start(mcasp, substream->stream); |
683 | break; | 685 | break; |
684 | |||
685 | case SNDRV_PCM_TRIGGER_SUSPEND: | 686 | case SNDRV_PCM_TRIGGER_SUSPEND: |
686 | davinci_mcasp_stop(mcasp, substream->stream); | ||
687 | ret = pm_runtime_put_sync(mcasp->dev); | ||
688 | if (IS_ERR_VALUE(ret)) | ||
689 | dev_err(mcasp->dev, "pm_runtime_put_sync() failed\n"); | ||
690 | break; | ||
691 | |||
692 | case SNDRV_PCM_TRIGGER_STOP: | 687 | case SNDRV_PCM_TRIGGER_STOP: |
693 | case SNDRV_PCM_TRIGGER_PAUSE_PUSH: | 688 | case SNDRV_PCM_TRIGGER_PAUSE_PUSH: |
694 | davinci_mcasp_stop(mcasp, substream->stream); | 689 | davinci_mcasp_stop(mcasp, substream->stream); |