msm: Asoc: LPA: Fix pause and next clip play issue

- When paused and press next button to play next song,
sometimes CMD_EOS fails to get Ack from LPASS and
is wait timeout for 5sec causing delay for next
playback start.
- In the failure case, even before trigger start
of driver is done,LPA driver receives pcm_close.
In this case, though EOS is issued, it is not
getting honored from LPASS.
- If trigger start not happen in LPA driver,
avoid CMD_EOS to LPASS as it will not be handled.

CRs-Fixed: 368519, 366926
Change-Id: Ib5ff21925bb44849b27ed4709b72efcccf412b5d
Signed-off-by: Laxminath Kasam <lkasam@codeaurora.org>
This commit is contained in:
Laxminath Kasam
2012-06-05 19:01:54 +05:30
committed by Stephen Boyd
parent 8d1efcd1c2
commit 28feaa0fea
2 changed files with 7 additions and 1 deletions

View File

@@ -232,10 +232,12 @@ static int msm_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
pr_debug("SNDRV_PCM_TRIGGER_START\n"); pr_debug("SNDRV_PCM_TRIGGER_START\n");
q6asm_run_nowait(prtd->audio_client, 0, 0, 0); q6asm_run_nowait(prtd->audio_client, 0, 0, 0);
atomic_set(&prtd->start, 1); atomic_set(&prtd->start, 1);
atomic_set(&prtd->stop, 0);
break; break;
case SNDRV_PCM_TRIGGER_STOP: case SNDRV_PCM_TRIGGER_STOP:
pr_debug("SNDRV_PCM_TRIGGER_STOP\n"); pr_debug("SNDRV_PCM_TRIGGER_STOP\n");
atomic_set(&prtd->start, 0); atomic_set(&prtd->start, 0);
atomic_set(&prtd->stop, 1);
if (substream->stream != SNDRV_PCM_STREAM_PLAYBACK) if (substream->stream != SNDRV_PCM_STREAM_PLAYBACK)
break; break;
break; break;
@@ -323,6 +325,7 @@ static int msm_pcm_open(struct snd_pcm_substream *substream)
prtd->dsp_cnt = 0; prtd->dsp_cnt = 0;
atomic_set(&prtd->pending_buffer, 1); atomic_set(&prtd->pending_buffer, 1);
atomic_set(&prtd->stop, 1);
runtime->private_data = prtd; runtime->private_data = prtd;
lpa_audio.prtd = prtd; lpa_audio.prtd = prtd;
lpa_set_volume(lpa_audio.volume); lpa_set_volume(lpa_audio.volume);
@@ -366,7 +369,8 @@ static int msm_pcm_playback_close(struct snd_pcm_substream *substream)
To issue EOS to dsp, we need to be run state otherwise To issue EOS to dsp, we need to be run state otherwise
EOS is not honored. EOS is not honored.
*/ */
if (msm_routing_check_backend_enabled(soc_prtd->dai_link->be_id)) { if (msm_routing_check_backend_enabled(soc_prtd->dai_link->be_id) &&
(!atomic_read(&prtd->stop))) {
rc = q6asm_run(prtd->audio_client, 0, 0, 0); rc = q6asm_run(prtd->audio_client, 0, 0, 0);
atomic_set(&prtd->pending_buffer, 0); atomic_set(&prtd->pending_buffer, 0);
prtd->cmd_ack = 0; prtd->cmd_ack = 0;
@@ -386,6 +390,7 @@ static int msm_pcm_playback_close(struct snd_pcm_substream *substream)
q6asm_audio_client_buf_free_contiguous(dir, q6asm_audio_client_buf_free_contiguous(dir,
prtd->audio_client); prtd->audio_client);
atomic_set(&prtd->stop, 1);
pr_debug("%s\n", __func__); pr_debug("%s\n", __func__);
msm_pcm_routing_dereg_phy_stream(soc_prtd->dai_link->be_id, msm_pcm_routing_dereg_phy_stream(soc_prtd->dai_link->be_id,
SNDRV_PCM_STREAM_PLAYBACK); SNDRV_PCM_STREAM_PLAYBACK);

View File

@@ -71,6 +71,7 @@ struct msm_audio {
int close_ack; int close_ack;
int cmd_ack; int cmd_ack;
atomic_t start; atomic_t start;
atomic_t stop;
atomic_t out_count; atomic_t out_count;
atomic_t in_count; atomic_t in_count;
atomic_t out_needed; atomic_t out_needed;