diff options
author | Cliff Cai <cliff.cai@analog.com> | 2009-06-02 00:18:54 -0400 |
---|---|---|
committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2009-06-03 06:38:23 -0400 |
commit | f692fce0cf8625b6cc8678e802fb0e2e657b1ca6 (patch) | |
tree | 6fce62466d1a3c7ac6e05e86d57b381db41ac234 /sound/soc | |
parent | cf485da15a3b507c7dab42337639e4f4025d3373 (diff) |
ASoC: SSM2602: assign last substream to the master when shutting down
Fixes crash when shutting down.
Signed-off-by: Cliff Cai <cliff.cai@analog.com>
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Diffstat (limited to 'sound/soc')
-rw-r--r-- | sound/soc/codecs/ssm2602.c | 25 |
1 files changed, 16 insertions, 9 deletions
diff --git a/sound/soc/codecs/ssm2602.c b/sound/soc/codecs/ssm2602.c index d6af069b7ed1..1fc4c8e0899c 100644 --- a/sound/soc/codecs/ssm2602.c +++ b/sound/soc/codecs/ssm2602.c | |||
@@ -336,15 +336,17 @@ static int ssm2602_startup(struct snd_pcm_substream *substream, | |||
336 | master_runtime->sample_bits, | 336 | master_runtime->sample_bits, |
337 | master_runtime->rate); | 337 | master_runtime->rate); |
338 | 338 | ||
339 | snd_pcm_hw_constraint_minmax(substream->runtime, | 339 | if (master_runtime->rate != 0) |
340 | SNDRV_PCM_HW_PARAM_RATE, | 340 | snd_pcm_hw_constraint_minmax(substream->runtime, |
341 | master_runtime->rate, | 341 | SNDRV_PCM_HW_PARAM_RATE, |
342 | master_runtime->rate); | 342 | master_runtime->rate, |
343 | 343 | master_runtime->rate); | |
344 | snd_pcm_hw_constraint_minmax(substream->runtime, | 344 | |
345 | SNDRV_PCM_HW_PARAM_SAMPLE_BITS, | 345 | if (master_runtime->sample_bits != 0) |
346 | master_runtime->sample_bits, | 346 | snd_pcm_hw_constraint_minmax(substream->runtime, |
347 | master_runtime->sample_bits); | 347 | SNDRV_PCM_HW_PARAM_SAMPLE_BITS, |
348 | master_runtime->sample_bits, | ||
349 | master_runtime->sample_bits); | ||
348 | 350 | ||
349 | ssm2602->slave_substream = substream; | 351 | ssm2602->slave_substream = substream; |
350 | } else | 352 | } else |
@@ -372,6 +374,11 @@ static void ssm2602_shutdown(struct snd_pcm_substream *substream, | |||
372 | struct snd_soc_device *socdev = rtd->socdev; | 374 | struct snd_soc_device *socdev = rtd->socdev; |
373 | struct snd_soc_codec *codec = socdev->card->codec; | 375 | struct snd_soc_codec *codec = socdev->card->codec; |
374 | struct ssm2602_priv *ssm2602 = codec->private_data; | 376 | struct ssm2602_priv *ssm2602 = codec->private_data; |
377 | |||
378 | if (ssm2602->master_substream == substream) | ||
379 | ssm2602->master_substream = ssm2602->slave_substream; | ||
380 | |||
381 | ssm2602->slave_substream = NULL; | ||
375 | /* deactivate */ | 382 | /* deactivate */ |
376 | if (!codec->active) | 383 | if (!codec->active) |
377 | ssm2602_write(codec, SSM2602_ACTIVE, 0); | 384 | ssm2602_write(codec, SSM2602_ACTIVE, 0); |