Skip to content

Commit

Permalink
ASoC: Fix missing spin_unlock_irqrestore
Browse files Browse the repository at this point in the history
In nuc900_dma_hw_params(), if snd_pcm_lib_malloc_pages failed
it returns without calling spin_unlock_irqrestore().

Since snd_pcm_lib_malloc_pages() does not touch struct nuc900_audio,
we don't need to hold the lock while calling snd_pcm_lib_malloc_pages().
Fix it by moving spin_lock_irqsave() down to after snd_pcm_lib_malloc_pages().

In nuc900_dma_prepare(), spin_unlock_irqrestore() is missing in the error path.
Fix it by removing the return in default case.

Signed-off-by: Axel Lin <axel.lin@gmail.com>
Acked-by: Wan ZongShun <mcuos.com@gmail.com>
Acked-by: Liam Girdwood <lrg@slimlogic.co.uk>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
  • Loading branch information
Axel Lin authored and Mark Brown committed Nov 30, 2010
1 parent 39a5455 commit 3f1af9d
Showing 1 changed file with 5 additions and 4 deletions.
9 changes: 5 additions & 4 deletions sound/soc/nuc900/nuc900-pcm.c
Original file line number Diff line number Diff line change
Expand Up @@ -50,12 +50,12 @@ static int nuc900_dma_hw_params(struct snd_pcm_substream *substream,
unsigned long flags;
int ret = 0;

spin_lock_irqsave(&nuc900_audio->lock, flags);

ret = snd_pcm_lib_malloc_pages(substream, params_buffer_bytes(params));
if (ret < 0)
return ret;

spin_lock_irqsave(&nuc900_audio->lock, flags);

nuc900_audio->substream = substream;
nuc900_audio->dma_addr[substream->stream] = runtime->dma_addr;
nuc900_audio->buffersize[substream->stream] =
Expand Down Expand Up @@ -169,6 +169,7 @@ static int nuc900_dma_prepare(struct snd_pcm_substream *substream)
struct snd_pcm_runtime *runtime = substream->runtime;
struct nuc900_audio *nuc900_audio = runtime->private_data;
unsigned long flags, val;
int ret = 0;

spin_lock_irqsave(&nuc900_audio->lock, flags);

Expand Down Expand Up @@ -197,10 +198,10 @@ static int nuc900_dma_prepare(struct snd_pcm_substream *substream)
AUDIO_WRITE(nuc900_audio->mmio + ACTL_RESET, val);
break;
default:
return -EINVAL;
ret = -EINVAL;
}
spin_unlock_irqrestore(&nuc900_audio->lock, flags);
return 0;
return ret;
}

static int nuc900_dma_trigger(struct snd_pcm_substream *substream, int cmd)
Expand Down

0 comments on commit 3f1af9d

Please sign in to comment.