diff options
author | Takashi Iwai <tiwai@suse.de> | 2009-12-21 06:05:40 -0500 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2009-12-21 06:05:40 -0500 |
commit | 1f26cb92a28541da1c9b27571e40b08333595773 (patch) | |
tree | 90e9c7f7fe9bdccc6cd356afcf3977af256c9a21 /sound/arm/aaci.c | |
parent | 2c3b9b50db5fe8d6039dfdfc44202fcd49eb9d00 (diff) | |
parent | db8cf334f66bdf1ba2b3d2f7128095fc9b7a6e2b (diff) |
Merge branch 'fix/misc' into for-linus
Diffstat (limited to 'sound/arm/aaci.c')
-rw-r--r-- | sound/arm/aaci.c | 177 |
1 files changed, 59 insertions, 118 deletions
diff --git a/sound/arm/aaci.c b/sound/arm/aaci.c index 1497dce1b04a..c5699863643b 100644 --- a/sound/arm/aaci.c +++ b/sound/arm/aaci.c | |||
@@ -172,14 +172,15 @@ static unsigned short aaci_ac97_read(struct snd_ac97 *ac97, unsigned short reg) | |||
172 | return v; | 172 | return v; |
173 | } | 173 | } |
174 | 174 | ||
175 | static inline void aaci_chan_wait_ready(struct aaci_runtime *aacirun) | 175 | static inline void |
176 | aaci_chan_wait_ready(struct aaci_runtime *aacirun, unsigned long mask) | ||
176 | { | 177 | { |
177 | u32 val; | 178 | u32 val; |
178 | int timeout = 5000; | 179 | int timeout = 5000; |
179 | 180 | ||
180 | do { | 181 | do { |
181 | val = readl(aacirun->base + AACI_SR); | 182 | val = readl(aacirun->base + AACI_SR); |
182 | } while (val & (SR_TXB|SR_RXB) && timeout--); | 183 | } while (val & mask && timeout--); |
183 | } | 184 | } |
184 | 185 | ||
185 | 186 | ||
@@ -208,8 +209,10 @@ static void aaci_fifo_irq(struct aaci *aaci, int channel, u32 mask) | |||
208 | writel(0, aacirun->base + AACI_IE); | 209 | writel(0, aacirun->base + AACI_IE); |
209 | return; | 210 | return; |
210 | } | 211 | } |
211 | ptr = aacirun->ptr; | ||
212 | 212 | ||
213 | spin_lock(&aacirun->lock); | ||
214 | |||
215 | ptr = aacirun->ptr; | ||
213 | do { | 216 | do { |
214 | unsigned int len = aacirun->fifosz; | 217 | unsigned int len = aacirun->fifosz; |
215 | u32 val; | 218 | u32 val; |
@@ -217,9 +220,9 @@ static void aaci_fifo_irq(struct aaci *aaci, int channel, u32 mask) | |||
217 | if (aacirun->bytes <= 0) { | 220 | if (aacirun->bytes <= 0) { |
218 | aacirun->bytes += aacirun->period; | 221 | aacirun->bytes += aacirun->period; |
219 | aacirun->ptr = ptr; | 222 | aacirun->ptr = ptr; |
220 | spin_unlock(&aaci->lock); | 223 | spin_unlock(&aacirun->lock); |
221 | snd_pcm_period_elapsed(aacirun->substream); | 224 | snd_pcm_period_elapsed(aacirun->substream); |
222 | spin_lock(&aaci->lock); | 225 | spin_lock(&aacirun->lock); |
223 | } | 226 | } |
224 | if (!(aacirun->cr & CR_EN)) | 227 | if (!(aacirun->cr & CR_EN)) |
225 | break; | 228 | break; |
@@ -245,7 +248,10 @@ static void aaci_fifo_irq(struct aaci *aaci, int channel, u32 mask) | |||
245 | ptr = aacirun->start; | 248 | ptr = aacirun->start; |
246 | } | 249 | } |
247 | } while(1); | 250 | } while(1); |
251 | |||
248 | aacirun->ptr = ptr; | 252 | aacirun->ptr = ptr; |
253 | |||
254 | spin_unlock(&aacirun->lock); | ||
249 | } | 255 | } |
250 | 256 | ||
251 | if (mask & ISR_URINTR) { | 257 | if (mask & ISR_URINTR) { |
@@ -263,6 +269,8 @@ static void aaci_fifo_irq(struct aaci *aaci, int channel, u32 mask) | |||
263 | return; | 269 | return; |
264 | } | 270 | } |
265 | 271 | ||
272 | spin_lock(&aacirun->lock); | ||
273 | |||
266 | ptr = aacirun->ptr; | 274 | ptr = aacirun->ptr; |
267 | do { | 275 | do { |
268 | unsigned int len = aacirun->fifosz; | 276 | unsigned int len = aacirun->fifosz; |
@@ -271,9 +279,9 @@ static void aaci_fifo_irq(struct aaci *aaci, int channel, u32 mask) | |||
271 | if (aacirun->bytes <= 0) { | 279 | if (aacirun->bytes <= 0) { |
272 | aacirun->bytes += aacirun->period; | 280 | aacirun->bytes += aacirun->period; |
273 | aacirun->ptr = ptr; | 281 | aacirun->ptr = ptr; |
274 | spin_unlock(&aaci->lock); | 282 | spin_unlock(&aacirun->lock); |
275 | snd_pcm_period_elapsed(aacirun->substream); | 283 | snd_pcm_period_elapsed(aacirun->substream); |
276 | spin_lock(&aaci->lock); | 284 | spin_lock(&aacirun->lock); |
277 | } | 285 | } |
278 | if (!(aacirun->cr & CR_EN)) | 286 | if (!(aacirun->cr & CR_EN)) |
279 | break; | 287 | break; |
@@ -301,6 +309,8 @@ static void aaci_fifo_irq(struct aaci *aaci, int channel, u32 mask) | |||
301 | } while (1); | 309 | } while (1); |
302 | 310 | ||
303 | aacirun->ptr = ptr; | 311 | aacirun->ptr = ptr; |
312 | |||
313 | spin_unlock(&aacirun->lock); | ||
304 | } | 314 | } |
305 | } | 315 | } |
306 | 316 | ||
@@ -310,7 +320,6 @@ static irqreturn_t aaci_irq(int irq, void *devid) | |||
310 | u32 mask; | 320 | u32 mask; |
311 | int i; | 321 | int i; |
312 | 322 | ||
313 | spin_lock(&aaci->lock); | ||
314 | mask = readl(aaci->base + AACI_ALLINTS); | 323 | mask = readl(aaci->base + AACI_ALLINTS); |
315 | if (mask) { | 324 | if (mask) { |
316 | u32 m = mask; | 325 | u32 m = mask; |
@@ -320,7 +329,6 @@ static irqreturn_t aaci_irq(int irq, void *devid) | |||
320 | } | 329 | } |
321 | } | 330 | } |
322 | } | 331 | } |
323 | spin_unlock(&aaci->lock); | ||
324 | 332 | ||
325 | return mask ? IRQ_HANDLED : IRQ_NONE; | 333 | return mask ? IRQ_HANDLED : IRQ_NONE; |
326 | } | 334 | } |
@@ -330,63 +338,6 @@ static irqreturn_t aaci_irq(int irq, void *devid) | |||
330 | /* | 338 | /* |
331 | * ALSA support. | 339 | * ALSA support. |
332 | */ | 340 | */ |
333 | |||
334 | struct aaci_stream { | ||
335 | unsigned char codec_idx; | ||
336 | unsigned char rate_idx; | ||
337 | }; | ||
338 | |||
339 | static struct aaci_stream aaci_streams[] = { | ||
340 | [ACSTREAM_FRONT] = { | ||
341 | .codec_idx = 0, | ||
342 | .rate_idx = AC97_RATES_FRONT_DAC, | ||
343 | }, | ||
344 | [ACSTREAM_SURROUND] = { | ||
345 | .codec_idx = 0, | ||
346 | .rate_idx = AC97_RATES_SURR_DAC, | ||
347 | }, | ||
348 | [ACSTREAM_LFE] = { | ||
349 | .codec_idx = 0, | ||
350 | .rate_idx = AC97_RATES_LFE_DAC, | ||
351 | }, | ||
352 | }; | ||
353 | |||
354 | static inline unsigned int aaci_rate_mask(struct aaci *aaci, int streamid) | ||
355 | { | ||
356 | struct aaci_stream *s = aaci_streams + streamid; | ||
357 | return aaci->ac97_bus->codec[s->codec_idx]->rates[s->rate_idx]; | ||
358 | } | ||
359 | |||
360 | static unsigned int rate_list[] = { | ||
361 | 5512, 8000, 11025, 16000, 22050, 32000, 44100, | ||
362 | 48000, 64000, 88200, 96000, 176400, 192000 | ||
363 | }; | ||
364 | |||
365 | /* | ||
366 | * Double-rate rule: we can support double rate iff channels == 2 | ||
367 | * (unimplemented) | ||
368 | */ | ||
369 | static int | ||
370 | aaci_rule_rate_by_channels(struct snd_pcm_hw_params *p, struct snd_pcm_hw_rule *rule) | ||
371 | { | ||
372 | struct aaci *aaci = rule->private; | ||
373 | unsigned int rate_mask = SNDRV_PCM_RATE_8000_48000|SNDRV_PCM_RATE_5512; | ||
374 | struct snd_interval *c = hw_param_interval(p, SNDRV_PCM_HW_PARAM_CHANNELS); | ||
375 | |||
376 | switch (c->max) { | ||
377 | case 6: | ||
378 | rate_mask &= aaci_rate_mask(aaci, ACSTREAM_LFE); | ||
379 | case 4: | ||
380 | rate_mask &= aaci_rate_mask(aaci, ACSTREAM_SURROUND); | ||
381 | case 2: | ||
382 | rate_mask &= aaci_rate_mask(aaci, ACSTREAM_FRONT); | ||
383 | } | ||
384 | |||
385 | return snd_interval_list(hw_param_interval(p, rule->var), | ||
386 | ARRAY_SIZE(rate_list), rate_list, | ||
387 | rate_mask); | ||
388 | } | ||
389 | |||
390 | static struct snd_pcm_hardware aaci_hw_info = { | 341 | static struct snd_pcm_hardware aaci_hw_info = { |
391 | .info = SNDRV_PCM_INFO_MMAP | | 342 | .info = SNDRV_PCM_INFO_MMAP | |
392 | SNDRV_PCM_INFO_MMAP_VALID | | 343 | SNDRV_PCM_INFO_MMAP_VALID | |
@@ -400,10 +351,7 @@ static struct snd_pcm_hardware aaci_hw_info = { | |||
400 | */ | 351 | */ |
401 | .formats = SNDRV_PCM_FMTBIT_S16_LE, | 352 | .formats = SNDRV_PCM_FMTBIT_S16_LE, |
402 | 353 | ||
403 | /* should this be continuous or knot? */ | 354 | /* rates are setup from the AC'97 codec */ |
404 | .rates = SNDRV_PCM_RATE_CONTINUOUS, | ||
405 | .rate_max = 48000, | ||
406 | .rate_min = 4000, | ||
407 | .channels_min = 2, | 355 | .channels_min = 2, |
408 | .channels_max = 6, | 356 | .channels_max = 6, |
409 | .buffer_bytes_max = 64 * 1024, | 357 | .buffer_bytes_max = 64 * 1024, |
@@ -423,6 +371,12 @@ static int __aaci_pcm_open(struct aaci *aaci, | |||
423 | aacirun->substream = substream; | 371 | aacirun->substream = substream; |
424 | runtime->private_data = aacirun; | 372 | runtime->private_data = aacirun; |
425 | runtime->hw = aaci_hw_info; | 373 | runtime->hw = aaci_hw_info; |
374 | runtime->hw.rates = aacirun->pcm->rates; | ||
375 | snd_pcm_limit_hw_rates(runtime); | ||
376 | |||
377 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK && | ||
378 | aacirun->pcm->r[1].slots) | ||
379 | snd_ac97_pcm_double_rate_rules(runtime); | ||
426 | 380 | ||
427 | /* | 381 | /* |
428 | * FIXME: ALSA specifies fifo_size in bytes. If we're in normal | 382 | * FIXME: ALSA specifies fifo_size in bytes. If we're in normal |
@@ -433,17 +387,6 @@ static int __aaci_pcm_open(struct aaci *aaci, | |||
433 | */ | 387 | */ |
434 | runtime->hw.fifo_size = aaci->fifosize * 2; | 388 | runtime->hw.fifo_size = aaci->fifosize * 2; |
435 | 389 | ||
436 | /* | ||
437 | * Add rule describing hardware rate dependency | ||
438 | * on the number of channels. | ||
439 | */ | ||
440 | ret = snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_RATE, | ||
441 | aaci_rule_rate_by_channels, aaci, | ||
442 | SNDRV_PCM_HW_PARAM_CHANNELS, | ||
443 | SNDRV_PCM_HW_PARAM_RATE, -1); | ||
444 | if (ret) | ||
445 | goto out; | ||
446 | |||
447 | ret = request_irq(aaci->dev->irq[0], aaci_irq, IRQF_SHARED|IRQF_DISABLED, | 390 | ret = request_irq(aaci->dev->irq[0], aaci_irq, IRQF_SHARED|IRQF_DISABLED, |
448 | DRIVER_NAME, aaci); | 391 | DRIVER_NAME, aaci); |
449 | if (ret) | 392 | if (ret) |
@@ -507,18 +450,22 @@ static int aaci_pcm_hw_params(struct snd_pcm_substream *substream, | |||
507 | 450 | ||
508 | err = snd_pcm_lib_malloc_pages(substream, | 451 | err = snd_pcm_lib_malloc_pages(substream, |
509 | params_buffer_bytes(params)); | 452 | params_buffer_bytes(params)); |
510 | if (err < 0) | 453 | if (err >= 0) { |
511 | goto out; | 454 | unsigned int rate = params_rate(params); |
455 | int dbl = rate > 48000; | ||
512 | 456 | ||
513 | err = snd_ac97_pcm_open(aacirun->pcm, params_rate(params), | 457 | err = snd_ac97_pcm_open(aacirun->pcm, rate, |
514 | params_channels(params), | 458 | params_channels(params), |
515 | aacirun->pcm->r[0].slots); | 459 | aacirun->pcm->r[dbl].slots); |
516 | if (err) | ||
517 | goto out; | ||
518 | 460 | ||
519 | aacirun->pcm_open = 1; | 461 | aacirun->pcm_open = err == 0; |
462 | aacirun->cr = CR_FEN | CR_COMPACT | CR_SZ16; | ||
463 | aacirun->fifosz = aaci->fifosize * 4; | ||
464 | |||
465 | if (aacirun->cr & CR_COMPACT) | ||
466 | aacirun->fifosz >>= 1; | ||
467 | } | ||
520 | 468 | ||
521 | out: | ||
522 | return err; | 469 | return err; |
523 | } | 470 | } |
524 | 471 | ||
@@ -527,7 +474,7 @@ static int aaci_pcm_prepare(struct snd_pcm_substream *substream) | |||
527 | struct snd_pcm_runtime *runtime = substream->runtime; | 474 | struct snd_pcm_runtime *runtime = substream->runtime; |
528 | struct aaci_runtime *aacirun = runtime->private_data; | 475 | struct aaci_runtime *aacirun = runtime->private_data; |
529 | 476 | ||
530 | aacirun->start = (void *)runtime->dma_area; | 477 | aacirun->start = runtime->dma_area; |
531 | aacirun->end = aacirun->start + snd_pcm_lib_buffer_bytes(substream); | 478 | aacirun->end = aacirun->start + snd_pcm_lib_buffer_bytes(substream); |
532 | aacirun->ptr = aacirun->start; | 479 | aacirun->ptr = aacirun->start; |
533 | aacirun->period = | 480 | aacirun->period = |
@@ -627,14 +574,9 @@ static int aaci_pcm_playback_hw_params(struct snd_pcm_substream *substream, | |||
627 | * Enable FIFO, compact mode, 16 bits per sample. | 574 | * Enable FIFO, compact mode, 16 bits per sample. |
628 | * FIXME: double rate slots? | 575 | * FIXME: double rate slots? |
629 | */ | 576 | */ |
630 | if (ret >= 0) { | 577 | if (ret >= 0) |
631 | aacirun->cr = CR_FEN | CR_COMPACT | CR_SZ16; | ||
632 | aacirun->cr |= channels_to_txmask[channels]; | 578 | aacirun->cr |= channels_to_txmask[channels]; |
633 | 579 | ||
634 | aacirun->fifosz = aaci->fifosize * 4; | ||
635 | if (aacirun->cr & CR_COMPACT) | ||
636 | aacirun->fifosz >>= 1; | ||
637 | } | ||
638 | return ret; | 580 | return ret; |
639 | } | 581 | } |
640 | 582 | ||
@@ -646,7 +588,7 @@ static void aaci_pcm_playback_stop(struct aaci_runtime *aacirun) | |||
646 | ie &= ~(IE_URIE|IE_TXIE); | 588 | ie &= ~(IE_URIE|IE_TXIE); |
647 | writel(ie, aacirun->base + AACI_IE); | 589 | writel(ie, aacirun->base + AACI_IE); |
648 | aacirun->cr &= ~CR_EN; | 590 | aacirun->cr &= ~CR_EN; |
649 | aaci_chan_wait_ready(aacirun); | 591 | aaci_chan_wait_ready(aacirun, SR_TXB); |
650 | writel(aacirun->cr, aacirun->base + AACI_TXCR); | 592 | writel(aacirun->cr, aacirun->base + AACI_TXCR); |
651 | } | 593 | } |
652 | 594 | ||
@@ -654,7 +596,7 @@ static void aaci_pcm_playback_start(struct aaci_runtime *aacirun) | |||
654 | { | 596 | { |
655 | u32 ie; | 597 | u32 ie; |
656 | 598 | ||
657 | aaci_chan_wait_ready(aacirun); | 599 | aaci_chan_wait_ready(aacirun, SR_TXB); |
658 | aacirun->cr |= CR_EN; | 600 | aacirun->cr |= CR_EN; |
659 | 601 | ||
660 | ie = readl(aacirun->base + AACI_IE); | 602 | ie = readl(aacirun->base + AACI_IE); |
@@ -665,12 +607,12 @@ static void aaci_pcm_playback_start(struct aaci_runtime *aacirun) | |||
665 | 607 | ||
666 | static int aaci_pcm_playback_trigger(struct snd_pcm_substream *substream, int cmd) | 608 | static int aaci_pcm_playback_trigger(struct snd_pcm_substream *substream, int cmd) |
667 | { | 609 | { |
668 | struct aaci *aaci = substream->private_data; | ||
669 | struct aaci_runtime *aacirun = substream->runtime->private_data; | 610 | struct aaci_runtime *aacirun = substream->runtime->private_data; |
670 | unsigned long flags; | 611 | unsigned long flags; |
671 | int ret = 0; | 612 | int ret = 0; |
672 | 613 | ||
673 | spin_lock_irqsave(&aaci->lock, flags); | 614 | spin_lock_irqsave(&aacirun->lock, flags); |
615 | |||
674 | switch (cmd) { | 616 | switch (cmd) { |
675 | case SNDRV_PCM_TRIGGER_START: | 617 | case SNDRV_PCM_TRIGGER_START: |
676 | aaci_pcm_playback_start(aacirun); | 618 | aaci_pcm_playback_start(aacirun); |
@@ -697,7 +639,8 @@ static int aaci_pcm_playback_trigger(struct snd_pcm_substream *substream, int cm | |||
697 | default: | 639 | default: |
698 | ret = -EINVAL; | 640 | ret = -EINVAL; |
699 | } | 641 | } |
700 | spin_unlock_irqrestore(&aaci->lock, flags); | 642 | |
643 | spin_unlock_irqrestore(&aacirun->lock, flags); | ||
701 | 644 | ||
702 | return ret; | 645 | return ret; |
703 | } | 646 | } |
@@ -721,18 +664,10 @@ static int aaci_pcm_capture_hw_params(struct snd_pcm_substream *substream, | |||
721 | int ret; | 664 | int ret; |
722 | 665 | ||
723 | ret = aaci_pcm_hw_params(substream, aacirun, params); | 666 | ret = aaci_pcm_hw_params(substream, aacirun, params); |
724 | 667 | if (ret >= 0) | |
725 | if (ret >= 0) { | ||
726 | aacirun->cr = CR_FEN | CR_COMPACT | CR_SZ16; | ||
727 | |||
728 | /* Line in record: slot 3 and 4 */ | 668 | /* Line in record: slot 3 and 4 */ |
729 | aacirun->cr |= CR_SL3 | CR_SL4; | 669 | aacirun->cr |= CR_SL3 | CR_SL4; |
730 | 670 | ||
731 | aacirun->fifosz = aaci->fifosize * 4; | ||
732 | |||
733 | if (aacirun->cr & CR_COMPACT) | ||
734 | aacirun->fifosz >>= 1; | ||
735 | } | ||
736 | return ret; | 671 | return ret; |
737 | } | 672 | } |
738 | 673 | ||
@@ -740,7 +675,7 @@ static void aaci_pcm_capture_stop(struct aaci_runtime *aacirun) | |||
740 | { | 675 | { |
741 | u32 ie; | 676 | u32 ie; |
742 | 677 | ||
743 | aaci_chan_wait_ready(aacirun); | 678 | aaci_chan_wait_ready(aacirun, SR_RXB); |
744 | 679 | ||
745 | ie = readl(aacirun->base + AACI_IE); | 680 | ie = readl(aacirun->base + AACI_IE); |
746 | ie &= ~(IE_ORIE | IE_RXIE); | 681 | ie &= ~(IE_ORIE | IE_RXIE); |
@@ -755,7 +690,7 @@ static void aaci_pcm_capture_start(struct aaci_runtime *aacirun) | |||
755 | { | 690 | { |
756 | u32 ie; | 691 | u32 ie; |
757 | 692 | ||
758 | aaci_chan_wait_ready(aacirun); | 693 | aaci_chan_wait_ready(aacirun, SR_RXB); |
759 | 694 | ||
760 | #ifdef DEBUG | 695 | #ifdef DEBUG |
761 | /* RX Timeout value: bits 28:17 in RXCR */ | 696 | /* RX Timeout value: bits 28:17 in RXCR */ |
@@ -772,12 +707,11 @@ static void aaci_pcm_capture_start(struct aaci_runtime *aacirun) | |||
772 | 707 | ||
773 | static int aaci_pcm_capture_trigger(struct snd_pcm_substream *substream, int cmd) | 708 | static int aaci_pcm_capture_trigger(struct snd_pcm_substream *substream, int cmd) |
774 | { | 709 | { |
775 | struct aaci *aaci = substream->private_data; | ||
776 | struct aaci_runtime *aacirun = substream->runtime->private_data; | 710 | struct aaci_runtime *aacirun = substream->runtime->private_data; |
777 | unsigned long flags; | 711 | unsigned long flags; |
778 | int ret = 0; | 712 | int ret = 0; |
779 | 713 | ||
780 | spin_lock_irqsave(&aaci->lock, flags); | 714 | spin_lock_irqsave(&aacirun->lock, flags); |
781 | 715 | ||
782 | switch (cmd) { | 716 | switch (cmd) { |
783 | case SNDRV_PCM_TRIGGER_START: | 717 | case SNDRV_PCM_TRIGGER_START: |
@@ -806,7 +740,7 @@ static int aaci_pcm_capture_trigger(struct snd_pcm_substream *substream, int cmd | |||
806 | ret = -EINVAL; | 740 | ret = -EINVAL; |
807 | } | 741 | } |
808 | 742 | ||
809 | spin_unlock_irqrestore(&aaci->lock, flags); | 743 | spin_unlock_irqrestore(&aacirun->lock, flags); |
810 | 744 | ||
811 | return ret; | 745 | return ret; |
812 | } | 746 | } |
@@ -889,6 +823,12 @@ static struct ac97_pcm ac97_defs[] __devinitdata = { | |||
889 | (1 << AC97_SLOT_PCM_SRIGHT) | | 823 | (1 << AC97_SLOT_PCM_SRIGHT) | |
890 | (1 << AC97_SLOT_LFE), | 824 | (1 << AC97_SLOT_LFE), |
891 | }, | 825 | }, |
826 | [1] = { | ||
827 | .slots = (1 << AC97_SLOT_PCM_LEFT) | | ||
828 | (1 << AC97_SLOT_PCM_RIGHT) | | ||
829 | (1 << AC97_SLOT_PCM_LEFT_0) | | ||
830 | (1 << AC97_SLOT_PCM_RIGHT_0), | ||
831 | }, | ||
892 | }, | 832 | }, |
893 | }, | 833 | }, |
894 | [1] = { /* PCM in */ | 834 | [1] = { /* PCM in */ |
@@ -1001,7 +941,6 @@ static struct aaci * __devinit aaci_init_card(struct amba_device *dev) | |||
1001 | 941 | ||
1002 | aaci = card->private_data; | 942 | aaci = card->private_data; |
1003 | mutex_init(&aaci->ac97_sem); | 943 | mutex_init(&aaci->ac97_sem); |
1004 | spin_lock_init(&aaci->lock); | ||
1005 | aaci->card = card; | 944 | aaci->card = card; |
1006 | aaci->dev = dev; | 945 | aaci->dev = dev; |
1007 | 946 | ||
@@ -1028,7 +967,7 @@ static int __devinit aaci_init_pcm(struct aaci *aaci) | |||
1028 | snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &aaci_playback_ops); | 967 | snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &aaci_playback_ops); |
1029 | snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &aaci_capture_ops); | 968 | snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &aaci_capture_ops); |
1030 | snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV, | 969 | snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV, |
1031 | NULL, 0, 64 * 104); | 970 | NULL, 0, 64 * 1024); |
1032 | } | 971 | } |
1033 | 972 | ||
1034 | return ret; | 973 | return ret; |
@@ -1088,12 +1027,14 @@ static int __devinit aaci_probe(struct amba_device *dev, struct amba_id *id) | |||
1088 | /* | 1027 | /* |
1089 | * Playback uses AACI channel 0 | 1028 | * Playback uses AACI channel 0 |
1090 | */ | 1029 | */ |
1030 | spin_lock_init(&aaci->playback.lock); | ||
1091 | aaci->playback.base = aaci->base + AACI_CSCH1; | 1031 | aaci->playback.base = aaci->base + AACI_CSCH1; |
1092 | aaci->playback.fifo = aaci->base + AACI_DR1; | 1032 | aaci->playback.fifo = aaci->base + AACI_DR1; |
1093 | 1033 | ||
1094 | /* | 1034 | /* |
1095 | * Capture uses AACI channel 0 | 1035 | * Capture uses AACI channel 0 |
1096 | */ | 1036 | */ |
1037 | spin_lock_init(&aaci->capture.lock); | ||
1097 | aaci->capture.base = aaci->base + AACI_CSCH1; | 1038 | aaci->capture.base = aaci->base + AACI_CSCH1; |
1098 | aaci->capture.fifo = aaci->base + AACI_DR1; | 1039 | aaci->capture.fifo = aaci->base + AACI_DR1; |
1099 | 1040 | ||