diff options
author | Jassi Brar <jassi.brar@samsung.com> | 2010-02-25 19:12:32 -0500 |
---|---|---|
committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2010-02-26 06:17:48 -0500 |
commit | 14dc5734bdac2629ed4228f3d30662bb440a3982 (patch) | |
tree | 137fb1c076b2f8d8d5292fb4547710f42faf32ce | |
parent | 6423c1875c87fa5ae56974ab8386d7c6110e3701 (diff) |
ASoC: Allow mulitple usage count of codec and cpu dai
If we are to have a snd_soc_dai i.e, cpu_dai and codec_dai, shared among two
or more dai_links we need to log the number of active users of the dai.
For that, we change semantics of the snd_soc_dai.active flag from indicator
to reference counter.
Signed-off-by: Jassi Brar <jassi.brar@samsung.com>
Acked-by: Liam Girdwood <lrg@slimlogic.co.uk>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
-rw-r--r-- | include/sound/soc.h | 2 | ||||
-rw-r--r-- | sound/soc/soc-core.c | 31 |
2 files changed, 19 insertions, 14 deletions
diff --git a/include/sound/soc.h b/include/sound/soc.h index 27a2ad9a6b8b..f792c1881b0a 100644 --- a/include/sound/soc.h +++ b/include/sound/soc.h | |||
@@ -375,7 +375,7 @@ struct snd_soc_pcm_stream { | |||
375 | unsigned int rate_max; /* max rate */ | 375 | unsigned int rate_max; /* max rate */ |
376 | unsigned int channels_min; /* min channels */ | 376 | unsigned int channels_min; /* min channels */ |
377 | unsigned int channels_max; /* max channels */ | 377 | unsigned int channels_max; /* max channels */ |
378 | unsigned int active:1; /* stream is in use */ | 378 | unsigned int active; /* num of active users of the stream */ |
379 | }; | 379 | }; |
380 | 380 | ||
381 | /* SoC audio ops */ | 381 | /* SoC audio ops */ |
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c index 1215a0ec2df0..f30959cc954a 100644 --- a/sound/soc/soc-core.c +++ b/sound/soc/soc-core.c | |||
@@ -454,11 +454,15 @@ static int soc_pcm_open(struct snd_pcm_substream *substream) | |||
454 | pr_debug("asoc: min rate %d max rate %d\n", runtime->hw.rate_min, | 454 | pr_debug("asoc: min rate %d max rate %d\n", runtime->hw.rate_min, |
455 | runtime->hw.rate_max); | 455 | runtime->hw.rate_max); |
456 | 456 | ||
457 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) | 457 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { |
458 | cpu_dai->playback.active = codec_dai->playback.active = 1; | 458 | cpu_dai->playback.active++; |
459 | else | 459 | codec_dai->playback.active++; |
460 | cpu_dai->capture.active = codec_dai->capture.active = 1; | 460 | } else { |
461 | cpu_dai->active = codec_dai->active = 1; | 461 | cpu_dai->capture.active++; |
462 | codec_dai->capture.active++; | ||
463 | } | ||
464 | cpu_dai->active++; | ||
465 | codec_dai->active++; | ||
462 | card->codec->active++; | 466 | card->codec->active++; |
463 | mutex_unlock(&pcm_mutex); | 467 | mutex_unlock(&pcm_mutex); |
464 | return 0; | 468 | return 0; |
@@ -530,15 +534,16 @@ static int soc_codec_close(struct snd_pcm_substream *substream) | |||
530 | 534 | ||
531 | mutex_lock(&pcm_mutex); | 535 | mutex_lock(&pcm_mutex); |
532 | 536 | ||
533 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) | 537 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { |
534 | cpu_dai->playback.active = codec_dai->playback.active = 0; | 538 | cpu_dai->playback.active--; |
535 | else | 539 | codec_dai->playback.active--; |
536 | cpu_dai->capture.active = codec_dai->capture.active = 0; | 540 | } else { |
537 | 541 | cpu_dai->capture.active--; | |
538 | if (codec_dai->playback.active == 0 && | 542 | codec_dai->capture.active--; |
539 | codec_dai->capture.active == 0) { | ||
540 | cpu_dai->active = codec_dai->active = 0; | ||
541 | } | 543 | } |
544 | |||
545 | cpu_dai->active--; | ||
546 | codec_dai->active--; | ||
542 | codec->active--; | 547 | codec->active--; |
543 | 548 | ||
544 | /* Muting the DAC suppresses artifacts caused during digital | 549 | /* Muting the DAC suppresses artifacts caused during digital |