diff options
Diffstat (limited to 'sound/pci/cs5535audio/cs5535audio_pcm.c')
-rw-r--r-- | sound/pci/cs5535audio/cs5535audio_pcm.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/sound/pci/cs5535audio/cs5535audio_pcm.c b/sound/pci/cs5535audio/cs5535audio_pcm.c index cdcda87116c3..0f48a871f17b 100644 --- a/sound/pci/cs5535audio/cs5535audio_pcm.c +++ b/sound/pci/cs5535audio/cs5535audio_pcm.c | |||
@@ -260,6 +260,9 @@ static int snd_cs5535audio_hw_params(struct snd_pcm_substream *substream, | |||
260 | err = cs5535audio_build_dma_packets(cs5535au, dma, substream, | 260 | err = cs5535audio_build_dma_packets(cs5535au, dma, substream, |
261 | params_periods(hw_params), | 261 | params_periods(hw_params), |
262 | params_period_bytes(hw_params)); | 262 | params_period_bytes(hw_params)); |
263 | if (!err) | ||
264 | dma->pcm_open_flag = 1; | ||
265 | |||
263 | return err; | 266 | return err; |
264 | } | 267 | } |
265 | 268 | ||
@@ -268,6 +271,15 @@ static int snd_cs5535audio_hw_free(struct snd_pcm_substream *substream) | |||
268 | struct cs5535audio *cs5535au = snd_pcm_substream_chip(substream); | 271 | struct cs5535audio *cs5535au = snd_pcm_substream_chip(substream); |
269 | struct cs5535audio_dma *dma = substream->runtime->private_data; | 272 | struct cs5535audio_dma *dma = substream->runtime->private_data; |
270 | 273 | ||
274 | if (dma->pcm_open_flag) { | ||
275 | if (substream == cs5535au->playback_substream) | ||
276 | snd_ac97_update_power(cs5535au->ac97, | ||
277 | AC97_PCM_FRONT_DAC_RATE, 0); | ||
278 | else | ||
279 | snd_ac97_update_power(cs5535au->ac97, | ||
280 | AC97_PCM_LR_ADC_RATE, 0); | ||
281 | dma->pcm_open_flag = 0; | ||
282 | } | ||
271 | cs5535audio_clear_dma_packets(cs5535au, dma, substream); | 283 | cs5535audio_clear_dma_packets(cs5535au, dma, substream); |
272 | return snd_pcm_lib_free_pages(substream); | 284 | return snd_pcm_lib_free_pages(substream); |
273 | } | 285 | } |
@@ -351,11 +363,14 @@ static int snd_cs5535audio_capture_open(struct snd_pcm_substream *substream) | |||
351 | if ((err = snd_pcm_hw_constraint_integer(runtime, | 363 | if ((err = snd_pcm_hw_constraint_integer(runtime, |
352 | SNDRV_PCM_HW_PARAM_PERIODS)) < 0) | 364 | SNDRV_PCM_HW_PARAM_PERIODS)) < 0) |
353 | return err; | 365 | return err; |
366 | olpc_capture_open(cs5535au->ac97); | ||
354 | return 0; | 367 | return 0; |
355 | } | 368 | } |
356 | 369 | ||
357 | static int snd_cs5535audio_capture_close(struct snd_pcm_substream *substream) | 370 | static int snd_cs5535audio_capture_close(struct snd_pcm_substream *substream) |
358 | { | 371 | { |
372 | struct cs5535audio *cs5535au = snd_pcm_substream_chip(substream); | ||
373 | olpc_capture_close(cs5535au->ac97); | ||
359 | return 0; | 374 | return 0; |
360 | } | 375 | } |
361 | 376 | ||