aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sound/atmel/ac97c.c23
1 files changed, 18 insertions, 5 deletions
diff --git a/sound/atmel/ac97c.c b/sound/atmel/ac97c.c
index 21be9c9fbd53..4e8f66d40812 100644
--- a/sound/atmel/ac97c.c
+++ b/sound/atmel/ac97c.c
@@ -1,5 +1,5 @@
1/* 1/*
2 * Driver for the Atmel AC97C controller 2 * Driver for Atmel AC97C
3 * 3 *
4 * Copyright (C) 2005-2009 Atmel Corporation 4 * Copyright (C) 2005-2009 Atmel Corporation
5 * 5 *
@@ -10,6 +10,7 @@
10#include <linux/clk.h> 10#include <linux/clk.h>
11#include <linux/delay.h> 11#include <linux/delay.h>
12#include <linux/bitmap.h> 12#include <linux/bitmap.h>
13#include <linux/device.h>
13#include <linux/dmaengine.h> 14#include <linux/dmaengine.h>
14#include <linux/dma-mapping.h> 15#include <linux/dma-mapping.h>
15#include <linux/init.h> 16#include <linux/init.h>
@@ -297,9 +298,11 @@ static int atmel_ac97c_playback_prepare(struct snd_pcm_substream *substream)
297{ 298{
298 struct atmel_ac97c *chip = snd_pcm_substream_chip(substream); 299 struct atmel_ac97c *chip = snd_pcm_substream_chip(substream);
299 struct snd_pcm_runtime *runtime = substream->runtime; 300 struct snd_pcm_runtime *runtime = substream->runtime;
300 unsigned long word = 0; 301 unsigned long word = ac97c_readl(chip, OCA);
301 int retval; 302 int retval;
302 303
304 word &= ~(AC97C_CH_MASK(PCM_LEFT) | AC97C_CH_MASK(PCM_RIGHT));
305
303 /* assign channels to AC97C channel A */ 306 /* assign channels to AC97C channel A */
304 switch (runtime->channels) { 307 switch (runtime->channels) {
305 case 1: 308 case 1:
@@ -323,9 +326,13 @@ static int atmel_ac97c_playback_prepare(struct snd_pcm_substream *substream)
323 word |= AC97C_CMR_CEM_LITTLE; 326 word |= AC97C_CMR_CEM_LITTLE;
324 break; 327 break;
325 case SNDRV_PCM_FORMAT_S16_BE: /* fall through */ 328 case SNDRV_PCM_FORMAT_S16_BE: /* fall through */
326 default:
327 word &= ~(AC97C_CMR_CEM_LITTLE); 329 word &= ~(AC97C_CMR_CEM_LITTLE);
328 break; 330 break;
331 default:
332 word = ac97c_readl(chip, OCA);
333 word &= ~(AC97C_CH_MASK(PCM_LEFT) | AC97C_CH_MASK(PCM_RIGHT));
334 ac97c_writel(chip, OCA, word);
335 return -EINVAL;
329 } 336 }
330 337
331 ac97c_writel(chip, CAMR, word); 338 ac97c_writel(chip, CAMR, word);
@@ -358,9 +365,11 @@ static int atmel_ac97c_capture_prepare(struct snd_pcm_substream *substream)
358{ 365{
359 struct atmel_ac97c *chip = snd_pcm_substream_chip(substream); 366 struct atmel_ac97c *chip = snd_pcm_substream_chip(substream);
360 struct snd_pcm_runtime *runtime = substream->runtime; 367 struct snd_pcm_runtime *runtime = substream->runtime;
361 unsigned long word = 0; 368 unsigned long word = ac97c_readl(chip, ICA);
362 int retval; 369 int retval;
363 370
371 word &= ~(AC97C_CH_MASK(PCM_LEFT) | AC97C_CH_MASK(PCM_RIGHT));
372
364 /* assign channels to AC97C channel A */ 373 /* assign channels to AC97C channel A */
365 switch (runtime->channels) { 374 switch (runtime->channels) {
366 case 1: 375 case 1:
@@ -384,9 +393,13 @@ static int atmel_ac97c_capture_prepare(struct snd_pcm_substream *substream)
384 word |= AC97C_CMR_CEM_LITTLE; 393 word |= AC97C_CMR_CEM_LITTLE;
385 break; 394 break;
386 case SNDRV_PCM_FORMAT_S16_BE: /* fall through */ 395 case SNDRV_PCM_FORMAT_S16_BE: /* fall through */
387 default:
388 word &= ~(AC97C_CMR_CEM_LITTLE); 396 word &= ~(AC97C_CMR_CEM_LITTLE);
389 break; 397 break;
398 default:
399 word = ac97c_readl(chip, ICA);
400 word &= ~(AC97C_CH_MASK(PCM_LEFT) | AC97C_CH_MASK(PCM_RIGHT));
401 ac97c_writel(chip, ICA, word);
402 return -EINVAL;
390 } 403 }
391 404
392 ac97c_writel(chip, CAMR, word); 405 ac97c_writel(chip, CAMR, word);