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 | |
| 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>
| -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); |
