diff options
Diffstat (limited to 'sound/soc/codecs/ssm2602.c')
-rw-r--r-- | sound/soc/codecs/ssm2602.c | 33 |
1 files changed, 19 insertions, 14 deletions
diff --git a/sound/soc/codecs/ssm2602.c b/sound/soc/codecs/ssm2602.c index 87f606c76822..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); |
@@ -497,11 +504,9 @@ static int ssm2602_set_bias_level(struct snd_soc_codec *codec, | |||
497 | return 0; | 504 | return 0; |
498 | } | 505 | } |
499 | 506 | ||
500 | #define SSM2602_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 |\ | 507 | #define SSM2602_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_32000 |\ |
501 | SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 |\ | 508 | SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000 |\ |
502 | SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 |\ | 509 | SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000) |
503 | SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 |\ | ||
504 | SNDRV_PCM_RATE_96000) | ||
505 | 510 | ||
506 | #define SSM2602_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\ | 511 | #define SSM2602_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\ |
507 | SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE) | 512 | SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE) |