From b7c220ac000de2fea989e69ab5b56a51cd29e45f Mon Sep 17 00:00:00 2001 From: Takashi Iwai Date: Tue, 4 Sep 2018 17:58:38 +0200 Subject: [PATCH 442/782] staging: bcm2835-audio: Fix incorrect draining handling commit 7d2a91f5f1bcf08ca257bcf1ed9721fcd341f834 upstream. The handling of SNDRV_PCM_TRIGGER_STOP at the trigger callback is incorrect: when the STOP is issued, the driver is supposed to drop the stream immediately. Meanwhile bcm2835 driver checks the DRAINING state and tries to issue some different command. This patch straightens things a bit, dropping the incorrect state checks. The draining behavior would be still not perfect at this point, but will be improved in a later patch. Signed-off-by: Takashi Iwai Tested-by: Stefan Wahren Signed-off-by: Greg Kroah-Hartman --- .../vc04_services/bcm2835-audio/bcm2835-pcm.c | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) --- a/drivers/staging/vc04_services/bcm2835-audio/bcm2835-pcm.c +++ b/drivers/staging/vc04_services/bcm2835-audio/bcm2835-pcm.c @@ -153,7 +153,6 @@ static int snd_bcm2835_playback_open_gen chip->alsa_stream[idx] = alsa_stream; chip->opened |= (1 << idx); - alsa_stream->draining = 1; out: mutex_unlock(&chip->audio_mutex); @@ -268,6 +267,7 @@ static int snd_bcm2835_pcm_prepare(struc alsa_stream->buffer_size = snd_pcm_lib_buffer_bytes(substream); alsa_stream->period_size = snd_pcm_lib_period_bytes(substream); alsa_stream->pos = 0; + alsa_stream->draining = false; audio_debug("buffer_size=%d, period_size=%d pos=%d frame_bits=%d\n", alsa_stream->buffer_size, alsa_stream->period_size, @@ -312,21 +312,15 @@ static int snd_bcm2835_pcm_trigger(struc switch (cmd) { case SNDRV_PCM_TRIGGER_START: err = bcm2835_audio_start(alsa_stream); - if (!err) - alsa_stream->draining = 1; - else + if (err) audio_error(" Failed to START alsa device (%d)\n", err); break; + case SNDRV_PCM_TRIGGER_DRAIN: + alsa_stream->draining = true; + break; case SNDRV_PCM_TRIGGER_STOP: - if (runtime->status->state == SNDRV_PCM_STATE_DRAINING) { - audio_info("DRAINING\n"); - alsa_stream->draining = 1; - } else { - audio_info("DROPPING\n"); - alsa_stream->draining = 0; - } err = bcm2835_audio_stop(alsa_stream); - if (err != 0) + if (err) audio_error(" Failed to STOP alsa device (%d)\n", err); break; default: