aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video/saa7134/saa7134-alsa.c
diff options
context:
space:
mode:
authorRicardo Cerqueira <v4l@cerqueira.org>2005-11-09 00:38:54 -0500
committerLinus Torvalds <torvalds@g5.osdl.org>2005-11-09 10:56:32 -0500
commitb54134be53be720da423692665ec215eb14a678b (patch)
treecf9c5a895a6c657ef23317c6256e7eb284e93b95 /drivers/media/video/saa7134/saa7134-alsa.c
parent79dd0c69f05fccb0396bdcd861ad4686ce888cda (diff)
[PATCH] V4L: 926: Saa7134 alsa can only be autoloaded after saa7134 is active
- Saa7134-alsa can only be autoloaded after saa7134 is active - Applied pertinent changes proposed by the ALSA team - dsp_nr replaced by ALSA's index[] Signed-off-by: Ricardo Cerqueira <v4l@cerqueira.org> Signed-off-by: Mauro Carvalho Chehab <mchehab@brturbo.com.br> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'drivers/media/video/saa7134/saa7134-alsa.c')
-rw-r--r--drivers/media/video/saa7134/saa7134-alsa.c239
1 files changed, 114 insertions, 125 deletions
diff --git a/drivers/media/video/saa7134/saa7134-alsa.c b/drivers/media/video/saa7134/saa7134-alsa.c
index 7972939cb46c..4f3c42354329 100644
--- a/drivers/media/video/saa7134/saa7134-alsa.c
+++ b/drivers/media/video/saa7134/saa7134-alsa.c
@@ -30,7 +30,6 @@
30#include <sound/core.h> 30#include <sound/core.h>
31#include <sound/control.h> 31#include <sound/control.h>
32#include <sound/pcm.h> 32#include <sound/pcm.h>
33#include <sound/rawmidi.h>
34#include <sound/initval.h> 33#include <sound/initval.h>
35 34
36#include "saa7134.h" 35#include "saa7134.h"
@@ -40,29 +39,11 @@ static unsigned int debug = 0;
40module_param(debug, int, 0644); 39module_param(debug, int, 0644);
41MODULE_PARM_DESC(debug,"enable debug messages [alsa]"); 40MODULE_PARM_DESC(debug,"enable debug messages [alsa]");
42 41
43unsigned int dsp_nr = 0;
44module_param(dsp_nr, int, 0444);
45MODULE_PARM_DESC(dsp_nr, "alsa device number");
46
47/* 42/*
48 * Configuration macros 43 * Configuration macros
49 */ 44 */
50 45
51/* defaults */ 46/* defaults */
52#define MAX_BUFFER_SIZE (256*1024)
53#define USE_FORMATS SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S16_BE | SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_U16_LE | SNDRV_PCM_FMTBIT_U16_BE
54#define USE_RATE SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000
55#define USE_RATE_MIN 32000
56#define USE_RATE_MAX 48000
57#define USE_CHANNELS_MIN 1
58#define USE_CHANNELS_MAX 2
59#ifndef USE_PERIODS_MIN
60#define USE_PERIODS_MIN 2
61#endif
62#ifndef USE_PERIODS_MAX
63#define USE_PERIODS_MAX 1024
64#endif
65
66#define MIXER_ADDR_TVTUNER 0 47#define MIXER_ADDR_TVTUNER 0
67#define MIXER_ADDR_LINE1 1 48#define MIXER_ADDR_LINE1 1
68#define MIXER_ADDR_LINE2 2 49#define MIXER_ADDR_LINE2 2
@@ -72,6 +53,9 @@ static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX; /* Index 0-MAX */
72static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR; /* ID for this card */ 53static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR; /* ID for this card */
73static int enable[SNDRV_CARDS] = {1, [1 ... (SNDRV_CARDS - 1)] = 0}; 54static int enable[SNDRV_CARDS] = {1, [1 ... (SNDRV_CARDS - 1)] = 0};
74 55
56module_param_array(index, int, NULL, 0444);
57MODULE_PARM_DESC(index, "Index value for SAA7134 capture interface(s).");
58
75#define dprintk(fmt, arg...) if (debug) \ 59#define dprintk(fmt, arg...) if (debug) \
76 printk(KERN_DEBUG "%s/alsa: " fmt, dev->name , ## arg) 60 printk(KERN_DEBUG "%s/alsa: " fmt, dev->name , ## arg)
77 61
@@ -108,7 +92,7 @@ typedef struct snd_card_saa7134_pcm {
108 snd_pcm_substream_t *substream; 92 snd_pcm_substream_t *substream;
109} snd_card_saa7134_pcm_t; 93} snd_card_saa7134_pcm_t;
110 94
111static snd_card_t *snd_saa7134_cards[SNDRV_CARDS] = SNDRV_DEFAULT_PTR; 95static snd_card_t *snd_saa7134_cards[SNDRV_CARDS];
112 96
113 97
114/* 98/*
@@ -124,8 +108,8 @@ static snd_card_t *snd_saa7134_cards[SNDRV_CARDS] = SNDRV_DEFAULT_PTR;
124static void saa7134_dma_stop(struct saa7134_dev *dev) 108static void saa7134_dma_stop(struct saa7134_dev *dev)
125 109
126{ 110{
127 dev->oss.dma_blk = -1; 111 dev->dmasound.dma_blk = -1;
128 dev->oss.dma_running = 0; 112 dev->dmasound.dma_running = 0;
129 saa7134_set_dmabits(dev); 113 saa7134_set_dmabits(dev);
130} 114}
131 115
@@ -141,8 +125,8 @@ static void saa7134_dma_stop(struct saa7134_dev *dev)
141 125
142static void saa7134_dma_start(struct saa7134_dev *dev) 126static void saa7134_dma_start(struct saa7134_dev *dev)
143{ 127{
144 dev->oss.dma_blk = 0; 128 dev->dmasound.dma_blk = 0;
145 dev->oss.dma_running = 1; 129 dev->dmasound.dma_running = 1;
146 saa7134_set_dmabits(dev); 130 saa7134_set_dmabits(dev);
147} 131}
148 132
@@ -162,7 +146,7 @@ void saa7134_irq_alsa_done(struct saa7134_dev *dev, unsigned long status)
162 int next_blk, reg = 0; 146 int next_blk, reg = 0;
163 147
164 spin_lock(&dev->slock); 148 spin_lock(&dev->slock);
165 if (UNSET == dev->oss.dma_blk) { 149 if (UNSET == dev->dmasound.dma_blk) {
166 dprintk("irq: recording stopped\n"); 150 dprintk("irq: recording stopped\n");
167 goto done; 151 goto done;
168 } 152 }
@@ -170,11 +154,11 @@ void saa7134_irq_alsa_done(struct saa7134_dev *dev, unsigned long status)
170 dprintk("irq: lost %ld\n", (status >> 24) & 0x0f); 154 dprintk("irq: lost %ld\n", (status >> 24) & 0x0f);
171 if (0 == (status & 0x10000000)) { 155 if (0 == (status & 0x10000000)) {
172 /* odd */ 156 /* odd */
173 if (0 == (dev->oss.dma_blk & 0x01)) 157 if (0 == (dev->dmasound.dma_blk & 0x01))
174 reg = SAA7134_RS_BA1(6); 158 reg = SAA7134_RS_BA1(6);
175 } else { 159 } else {
176 /* even */ 160 /* even */
177 if (1 == (dev->oss.dma_blk & 0x01)) 161 if (1 == (dev->dmasound.dma_blk & 0x01))
178 reg = SAA7134_RS_BA2(6); 162 reg = SAA7134_RS_BA2(6);
179 } 163 }
180 if (0 == reg) { 164 if (0 == reg) {
@@ -183,30 +167,31 @@ void saa7134_irq_alsa_done(struct saa7134_dev *dev, unsigned long status)
183 goto done; 167 goto done;
184 } 168 }
185 169
186 if (dev->oss.read_count >= dev->oss.blksize * (dev->oss.blocks-2)) { 170 if (dev->dmasound.read_count >= dev->dmasound.blksize * (dev->dmasound.blocks-2)) {
187 dprintk("irq: overrun [full=%d/%d] - Blocks in %d\n",dev->oss.read_count, 171 dprintk("irq: overrun [full=%d/%d] - Blocks in %d\n",dev->dmasound.read_count,
188 dev->oss.bufsize, dev->oss.blocks); 172 dev->dmasound.bufsize, dev->dmasound.blocks);
173 snd_pcm_stop(dev->dmasound.substream,SNDRV_PCM_STATE_XRUN);
189 saa7134_dma_stop(dev); 174 saa7134_dma_stop(dev);
190 goto done; 175 goto done;
191 } 176 }
192 177
193 /* next block addr */ 178 /* next block addr */
194 next_blk = (dev->oss.dma_blk + 2) % dev->oss.blocks; 179 next_blk = (dev->dmasound.dma_blk + 2) % dev->dmasound.blocks;
195 saa_writel(reg,next_blk * dev->oss.blksize); 180 saa_writel(reg,next_blk * dev->dmasound.blksize);
196 if (debug > 2) 181 if (debug > 2)
197 dprintk("irq: ok, %s, next_blk=%d, addr=%x, blocks=%u, size=%u, read=%u\n", 182 dprintk("irq: ok, %s, next_blk=%d, addr=%x, blocks=%u, size=%u, read=%u\n",
198 (status & 0x10000000) ? "even" : "odd ", next_blk, 183 (status & 0x10000000) ? "even" : "odd ", next_blk,
199 next_blk * dev->oss.blksize, dev->oss.blocks, dev->oss.blksize, dev->oss.read_count); 184 next_blk * dev->dmasound.blksize, dev->dmasound.blocks, dev->dmasound.blksize, dev->dmasound.read_count);
200 185
201 /* update status & wake waiting readers */ 186 /* update status & wake waiting readers */
202 dev->oss.dma_blk = (dev->oss.dma_blk + 1) % dev->oss.blocks; 187 dev->dmasound.dma_blk = (dev->dmasound.dma_blk + 1) % dev->dmasound.blocks;
203 dev->oss.read_count += dev->oss.blksize; 188 dev->dmasound.read_count += dev->dmasound.blksize;
204 189
205 dev->oss.recording_on = reg; 190 dev->dmasound.recording_on = reg;
206 191
207 if (dev->oss.read_count >= snd_pcm_lib_period_bytes(dev->oss.substream)) { 192 if (dev->dmasound.read_count >= snd_pcm_lib_period_bytes(dev->dmasound.substream)) {
208 spin_unlock(&dev->slock); 193 spin_unlock(&dev->slock);
209 snd_pcm_period_elapsed(dev->oss.substream); 194 snd_pcm_period_elapsed(dev->dmasound.substream);
210 spin_lock(&dev->slock); 195 spin_lock(&dev->slock);
211 } 196 }
212 done: 197 done:
@@ -262,7 +247,24 @@ out:
262static int snd_card_saa7134_capture_trigger(snd_pcm_substream_t * substream, 247static int snd_card_saa7134_capture_trigger(snd_pcm_substream_t * substream,
263 int cmd) 248 int cmd)
264{ 249{
265 return 0; 250 snd_pcm_runtime_t *runtime = substream->runtime;
251 snd_card_saa7134_pcm_t *saapcm = runtime->private_data;
252 struct saa7134_dev *dev=saapcm->saadev;
253 int err = 0;
254
255 spin_lock_irq(&dev->slock);
256 if (cmd == SNDRV_PCM_TRIGGER_START) {
257 /* start dma */
258 saa7134_dma_start(dev);
259 } else if (cmd == SNDRV_PCM_TRIGGER_STOP) {
260 /* stop dma */
261 saa7134_dma_stop(dev);
262 } else {
263 err = -EINVAL;
264 }
265 spin_unlock_irq(&dev->slock);
266
267 return err;
266} 268}
267 269
268/* 270/*
@@ -289,9 +291,9 @@ static int dsp_buffer_conf(struct saa7134_dev *dev, int blksize, int blocks)
289 if ((blksize * blocks) > 1024*1024) 291 if ((blksize * blocks) > 1024*1024)
290 blocks = 1024*1024 / blksize; 292 blocks = 1024*1024 / blksize;
291 293
292 dev->oss.blocks = blocks; 294 dev->dmasound.blocks = blocks;
293 dev->oss.blksize = blksize; 295 dev->dmasound.blksize = blksize;
294 dev->oss.bufsize = blksize * blocks; 296 dev->dmasound.bufsize = blksize * blocks;
295 297
296 dprintk("buffer config: %d blocks / %d bytes, %d kB total\n", 298 dprintk("buffer config: %d blocks / %d bytes, %d kB total\n",
297 blocks,blksize,blksize * blocks / 1024); 299 blocks,blksize,blksize * blocks / 1024);
@@ -313,11 +315,11 @@ static int dsp_buffer_init(struct saa7134_dev *dev)
313{ 315{
314 int err; 316 int err;
315 317
316 if (!dev->oss.bufsize) 318 if (!dev->dmasound.bufsize)
317 BUG(); 319 BUG();
318 videobuf_dma_init(&dev->oss.dma); 320 videobuf_dma_init(&dev->dmasound.dma);
319 err = videobuf_dma_init_kernel(&dev->oss.dma, PCI_DMA_FROMDEVICE, 321 err = videobuf_dma_init_kernel(&dev->dmasound.dma, PCI_DMA_FROMDEVICE,
320 (dev->oss.bufsize + PAGE_SIZE) >> PAGE_SHIFT); 322 (dev->dmasound.bufsize + PAGE_SIZE) >> PAGE_SHIFT);
321 if (0 != err) 323 if (0 != err)
322 return err; 324 return err;
323 return 0; 325 return 0;
@@ -340,7 +342,6 @@ static int snd_card_saa7134_capture_prepare(snd_pcm_substream_t * substream)
340 snd_pcm_runtime_t *runtime = substream->runtime; 342 snd_pcm_runtime_t *runtime = substream->runtime;
341 int err, bswap, sign; 343 int err, bswap, sign;
342 u32 fmt, control; 344 u32 fmt, control;
343 unsigned long flags;
344 snd_card_saa7134_t *saa7134 = snd_pcm_substream_chip(substream); 345 snd_card_saa7134_t *saa7134 = snd_pcm_substream_chip(substream);
345 struct saa7134_dev *dev; 346 struct saa7134_dev *dev;
346 snd_card_saa7134_pcm_t *saapcm = runtime->private_data; 347 snd_card_saa7134_pcm_t *saapcm = runtime->private_data;
@@ -351,7 +352,7 @@ static int snd_card_saa7134_capture_prepare(snd_pcm_substream_t * substream)
351 size = snd_pcm_lib_buffer_bytes(substream); 352 size = snd_pcm_lib_buffer_bytes(substream);
352 count = snd_pcm_lib_period_bytes(substream); 353 count = snd_pcm_lib_period_bytes(substream);
353 354
354 saapcm->saadev->oss.substream = substream; 355 saapcm->saadev->dmasound.substream = substream;
355 bps = runtime->rate * runtime->channels; 356 bps = runtime->rate * runtime->channels;
356 bps *= snd_pcm_format_width(runtime->format); 357 bps *= snd_pcm_format_width(runtime->format);
357 bps /= 8; 358 bps /= 8;
@@ -371,13 +372,13 @@ static int snd_card_saa7134_capture_prepare(snd_pcm_substream_t * substream)
371 goto fail2; 372 goto fail2;
372 373
373 /* prepare buffer */ 374 /* prepare buffer */
374 if (0 != (err = videobuf_dma_pci_map(dev->pci,&dev->oss.dma))) 375 if (0 != (err = videobuf_dma_pci_map(dev->pci,&dev->dmasound.dma)))
375 return err; 376 return err;
376 if (0 != (err = saa7134_pgtable_alloc(dev->pci,&dev->oss.pt))) 377 if (0 != (err = saa7134_pgtable_alloc(dev->pci,&dev->dmasound.pt)))
377 goto fail1; 378 goto fail1;
378 if (0 != (err = saa7134_pgtable_build(dev->pci,&dev->oss.pt, 379 if (0 != (err = saa7134_pgtable_build(dev->pci,&dev->dmasound.pt,
379 dev->oss.dma.sglist, 380 dev->dmasound.dma.sglist,
380 dev->oss.dma.sglen, 381 dev->dmasound.dma.sglen,
381 0))) 382 0)))
382 goto fail2; 383 goto fail2;
383 384
@@ -427,10 +428,10 @@ static int snd_card_saa7134_capture_prepare(snd_pcm_substream_t * substream)
427 if (sign) 428 if (sign)
428 fmt |= 0x04; 429 fmt |= 0x04;
429 430
430 fmt |= (MIXER_ADDR_TVTUNER == dev->oss.input) ? 0xc0 : 0x80; 431 fmt |= (MIXER_ADDR_TVTUNER == dev->dmasound.input) ? 0xc0 : 0x80;
431 saa_writeb(SAA7134_NUM_SAMPLES0, ((dev->oss.blksize - 1) & 0x0000ff)); 432 saa_writeb(SAA7134_NUM_SAMPLES0, ((dev->dmasound.blksize - 1) & 0x0000ff));
432 saa_writeb(SAA7134_NUM_SAMPLES1, ((dev->oss.blksize - 1) & 0x00ff00) >> 8); 433 saa_writeb(SAA7134_NUM_SAMPLES1, ((dev->dmasound.blksize - 1) & 0x00ff00) >> 8);
433 saa_writeb(SAA7134_NUM_SAMPLES2, ((dev->oss.blksize - 1) & 0xff0000) >> 16); 434 saa_writeb(SAA7134_NUM_SAMPLES2, ((dev->dmasound.blksize - 1) & 0xff0000) >> 16);
434 saa_writeb(SAA7134_AUDIO_FORMAT_CTRL, fmt); 435 saa_writeb(SAA7134_AUDIO_FORMAT_CTRL, fmt);
435 436
436 break; 437 break;
@@ -442,7 +443,7 @@ static int snd_card_saa7134_capture_prepare(snd_pcm_substream_t * substream)
442 fmt |= (2 << 4); 443 fmt |= (2 << 4);
443 if (!sign) 444 if (!sign)
444 fmt |= 0x04; 445 fmt |= 0x04;
445 saa_writel(SAA7133_NUM_SAMPLES, dev->oss.blksize -1); 446 saa_writel(SAA7133_NUM_SAMPLES, dev->dmasound.blksize -1);
446 saa_writel(SAA7133_AUDIO_CHANNEL, 0x543210 | (fmt << 24)); 447 saa_writel(SAA7133_AUDIO_CHANNEL, 0x543210 | (fmt << 24));
447 //saa_writel(SAA7133_AUDIO_CHANNEL, 0x543210); 448 //saa_writel(SAA7133_AUDIO_CHANNEL, 0x543210);
448 break; 449 break;
@@ -454,7 +455,7 @@ static int snd_card_saa7134_capture_prepare(snd_pcm_substream_t * substream)
454 /* dma: setup channel 6 (= AUDIO) */ 455 /* dma: setup channel 6 (= AUDIO) */
455 control = SAA7134_RS_CONTROL_BURST_16 | 456 control = SAA7134_RS_CONTROL_BURST_16 |
456 SAA7134_RS_CONTROL_ME | 457 SAA7134_RS_CONTROL_ME |
457 (dev->oss.pt.dma >> 12); 458 (dev->dmasound.pt.dma >> 12);
458 if (bswap) 459 if (bswap)
459 control |= SAA7134_RS_CONTROL_BSWAP; 460 control |= SAA7134_RS_CONTROL_BSWAP;
460 461
@@ -462,24 +463,20 @@ static int snd_card_saa7134_capture_prepare(snd_pcm_substream_t * substream)
462 byte, but it doesn't work. So I allocate the DMA using the 463 byte, but it doesn't work. So I allocate the DMA using the
463 V4L functions, and force ALSA to use that as the DMA area */ 464 V4L functions, and force ALSA to use that as the DMA area */
464 465
465 runtime->dma_area = dev->oss.dma.vmalloc; 466 runtime->dma_area = dev->dmasound.dma.vmalloc;
466 467
467 saa_writel(SAA7134_RS_BA1(6),0); 468 saa_writel(SAA7134_RS_BA1(6),0);
468 saa_writel(SAA7134_RS_BA2(6),dev->oss.blksize); 469 saa_writel(SAA7134_RS_BA2(6),dev->dmasound.blksize);
469 saa_writel(SAA7134_RS_PITCH(6),0); 470 saa_writel(SAA7134_RS_PITCH(6),0);
470 saa_writel(SAA7134_RS_CONTROL(6),control); 471 saa_writel(SAA7134_RS_CONTROL(6),control);
471 472
472 dev->oss.rate = runtime->rate; 473 dev->dmasound.rate = runtime->rate;
473 /* start dma */
474 spin_lock_irqsave(&dev->slock,flags);
475 saa7134_dma_start(dev);
476 spin_unlock_irqrestore(&dev->slock,flags);
477 474
478 return 0; 475 return 0;
479 fail2: 476 fail2:
480 saa7134_pgtable_free(dev->pci,&dev->oss.pt); 477 saa7134_pgtable_free(dev->pci,&dev->dmasound.pt);
481 fail1: 478 fail1:
482 videobuf_dma_pci_unmap(dev->pci,&dev->oss.dma); 479 videobuf_dma_pci_unmap(dev->pci,&dev->dmasound.dma);
483 return err; 480 return err;
484 481
485 482
@@ -504,14 +501,14 @@ static snd_pcm_uframes_t snd_card_saa7134_capture_pointer(snd_pcm_substream_t *
504 501
505 502
506 503
507 if (dev->oss.read_count) { 504 if (dev->dmasound.read_count) {
508 dev->oss.read_count -= snd_pcm_lib_period_bytes(substream); 505 dev->dmasound.read_count -= snd_pcm_lib_period_bytes(substream);
509 dev->oss.read_offset += snd_pcm_lib_period_bytes(substream); 506 dev->dmasound.read_offset += snd_pcm_lib_period_bytes(substream);
510 if (dev->oss.read_offset == dev->oss.bufsize) 507 if (dev->dmasound.read_offset == dev->dmasound.bufsize)
511 dev->oss.read_offset = 0; 508 dev->dmasound.read_offset = 0;
512 } 509 }
513 510
514 return bytes_to_frames(runtime, dev->oss.read_offset); 511 return bytes_to_frames(runtime, dev->dmasound.read_offset);
515} 512}
516 513
517/* 514/*
@@ -523,18 +520,22 @@ static snd_pcm_hardware_t snd_card_saa7134_capture =
523 .info = (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED | 520 .info = (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED |
524 SNDRV_PCM_INFO_BLOCK_TRANSFER | 521 SNDRV_PCM_INFO_BLOCK_TRANSFER |
525 SNDRV_PCM_INFO_MMAP_VALID), 522 SNDRV_PCM_INFO_MMAP_VALID),
526 .formats = USE_FORMATS, 523 .formats = SNDRV_PCM_FMTBIT_S16_LE | \
527 .rates = USE_RATE, 524 SNDRV_PCM_FMTBIT_S16_BE | \
528 .rate_min = USE_RATE_MIN, 525 SNDRV_PCM_FMTBIT_S8 | \
529 .rate_max = USE_RATE_MAX, 526 SNDRV_PCM_FMTBIT_U8 | \
530 .channels_min = USE_CHANNELS_MIN, 527 SNDRV_PCM_FMTBIT_U16_LE | \
531 .channels_max = USE_CHANNELS_MAX, 528 SNDRV_PCM_FMTBIT_U16_BE,
532 .buffer_bytes_max = MAX_BUFFER_SIZE, 529 .rates = SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000,
530 .rate_min = 32000,
531 .rate_max = 48000,
532 .channels_min = 1,
533 .channels_max = 2,
534 .buffer_bytes_max = (256*1024),
533 .period_bytes_min = 64, 535 .period_bytes_min = 64,
534 .period_bytes_max = MAX_BUFFER_SIZE, 536 .period_bytes_max = (256*1024),
535 .periods_min = USE_PERIODS_MIN, 537 .periods_min = 2,
536 .periods_max = USE_PERIODS_MAX, 538 .periods_max = 1024,
537 .fifo_size = 0x08070503,
538}; 539};
539 540
540static void snd_card_saa7134_runtime_free(snd_pcm_runtime_t *runtime) 541static void snd_card_saa7134_runtime_free(snd_pcm_runtime_t *runtime)
@@ -590,14 +591,14 @@ static int snd_card_saa7134_hw_free(snd_pcm_substream_t * substream)
590 591
591static int dsp_buffer_free(struct saa7134_dev *dev) 592static int dsp_buffer_free(struct saa7134_dev *dev)
592{ 593{
593 if (!dev->oss.blksize) 594 if (!dev->dmasound.blksize)
594 BUG(); 595 BUG();
595 596
596 videobuf_dma_free(&dev->oss.dma); 597 videobuf_dma_free(&dev->dmasound.dma);
597 598
598 dev->oss.blocks = 0; 599 dev->dmasound.blocks = 0;
599 dev->oss.blksize = 0; 600 dev->dmasound.blksize = 0;
600 dev->oss.bufsize = 0; 601 dev->dmasound.bufsize = 0;
601 602
602 return 0; 603 return 0;
603} 604}
@@ -616,16 +617,10 @@ static int snd_card_saa7134_capture_close(snd_pcm_substream_t * substream)
616{ 617{
617 snd_card_saa7134_t *chip = snd_pcm_substream_chip(substream); 618 snd_card_saa7134_t *chip = snd_pcm_substream_chip(substream);
618 struct saa7134_dev *dev = chip->saadev; 619 struct saa7134_dev *dev = chip->saadev;
619 unsigned long flags;
620
621 /* stop dma */
622 spin_lock_irqsave(&dev->slock,flags);
623 saa7134_dma_stop(dev);
624 spin_unlock_irqrestore(&dev->slock,flags);
625 620
626 /* unlock buffer */ 621 /* unlock buffer */
627 saa7134_pgtable_free(dev->pci,&dev->oss.pt); 622 saa7134_pgtable_free(dev->pci,&dev->dmasound.pt);
628 videobuf_dma_pci_unmap(dev->pci,&dev->oss.dma); 623 videobuf_dma_pci_unmap(dev->pci,&dev->dmasound.dma);
629 624
630 dsp_buffer_free(dev); 625 dsp_buffer_free(dev);
631 return 0; 626 return 0;
@@ -649,16 +644,16 @@ static int snd_card_saa7134_capture_open(snd_pcm_substream_t * substream)
649 struct saa7134_dev *dev = saa7134->saadev; 644 struct saa7134_dev *dev = saa7134->saadev;
650 int err; 645 int err;
651 646
652 down(&dev->oss.lock); 647 down(&dev->dmasound.lock);
653 648
654 dev->oss.afmt = SNDRV_PCM_FORMAT_U8; 649 dev->dmasound.afmt = SNDRV_PCM_FORMAT_U8;
655 dev->oss.channels = 2; 650 dev->dmasound.channels = 2;
656 dev->oss.read_count = 0; 651 dev->dmasound.read_count = 0;
657 dev->oss.read_offset = 0; 652 dev->dmasound.read_offset = 0;
658 653
659 up(&dev->oss.lock); 654 up(&dev->dmasound.lock);
660 655
661 saapcm = kcalloc(1, sizeof(*saapcm), GFP_KERNEL); 656 saapcm = kzalloc(sizeof(*saapcm), GFP_KERNEL);
662 if (saapcm == NULL) 657 if (saapcm == NULL)
663 return -ENOMEM; 658 return -ENOMEM;
664 saapcm->saadev=saa7134->saadev; 659 saapcm->saadev=saa7134->saadev;
@@ -731,13 +726,10 @@ static int snd_saa7134_volume_info(snd_kcontrol_t * kcontrol, snd_ctl_elem_info_
731static int snd_saa7134_volume_get(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol) 726static int snd_saa7134_volume_get(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
732{ 727{
733 snd_card_saa7134_t *chip = snd_kcontrol_chip(kcontrol); 728 snd_card_saa7134_t *chip = snd_kcontrol_chip(kcontrol);
734 unsigned long flags;
735 int addr = kcontrol->private_value; 729 int addr = kcontrol->private_value;
736 730
737 spin_lock_irqsave(&chip->mixer_lock, flags);
738 ucontrol->value.integer.value[0] = chip->mixer_volume[addr][0]; 731 ucontrol->value.integer.value[0] = chip->mixer_volume[addr][0];
739 ucontrol->value.integer.value[1] = chip->mixer_volume[addr][1]; 732 ucontrol->value.integer.value[1] = chip->mixer_volume[addr][1];
740 spin_unlock_irqrestore(&chip->mixer_lock, flags);
741 return 0; 733 return 0;
742} 734}
743 735
@@ -815,7 +807,7 @@ static int snd_saa7134_capsrc_put(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_
815 chip->capture_source[addr][1] != right; 807 chip->capture_source[addr][1] != right;
816 chip->capture_source[addr][0] = left; 808 chip->capture_source[addr][0] = left;
817 chip->capture_source[addr][1] = right; 809 chip->capture_source[addr][1] = right;
818 dev->oss.input=addr; 810 dev->dmasound.input=addr;
819 spin_unlock_irqrestore(&chip->mixer_lock, flags); 811 spin_unlock_irqrestore(&chip->mixer_lock, flags);
820 812
821 813
@@ -831,7 +823,7 @@ static int snd_saa7134_capsrc_put(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_
831 case MIXER_ADDR_LINE1: 823 case MIXER_ADDR_LINE1:
832 case MIXER_ADDR_LINE2: 824 case MIXER_ADDR_LINE2:
833 analog_io = (MIXER_ADDR_LINE1 == addr) ? 0x00 : 0x08; 825 analog_io = (MIXER_ADDR_LINE1 == addr) ? 0x00 : 0x08;
834 rate = (32000 == dev->oss.rate) ? 0x01 : 0x03; 826 rate = (32000 == dev->dmasound.rate) ? 0x01 : 0x03;
835 saa_andorb(SAA7134_ANALOG_IO_SELECT, 0x08, analog_io); 827 saa_andorb(SAA7134_ANALOG_IO_SELECT, 0x08, analog_io);
836 saa_andorb(SAA7134_AUDIO_FORMAT_CTRL, 0xc0, 0x80); 828 saa_andorb(SAA7134_AUDIO_FORMAT_CTRL, 0xc0, 0x80);
837 saa_andorb(SAA7134_SIF_SAMPLE_FREQ, 0x03, rate); 829 saa_andorb(SAA7134_SIF_SAMPLE_FREQ, 0x03, rate);
@@ -925,7 +917,7 @@ static int snd_saa7134_dev_free(snd_device_t *device)
925 * 917 *
926 */ 918 */
927 919
928int alsa_card_saa7134_create (struct saa7134_dev *saadev, unsigned int devicenum) 920int alsa_card_saa7134_create (struct saa7134_dev *saadev)
929{ 921{
930 static int dev; 922 static int dev;
931 923
@@ -942,12 +934,8 @@ int alsa_card_saa7134_create (struct saa7134_dev *saadev, unsigned int devicenum
942 if (!enable[dev]) 934 if (!enable[dev])
943 return -ENODEV; 935 return -ENODEV;
944 936
945 if (devicenum) { 937 card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0);
946 card = snd_card_new(devicenum, id[dev], THIS_MODULE, 0); 938
947 dsp_nr++;
948 } else {
949 card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0);
950 }
951 if (card == NULL) 939 if (card == NULL)
952 return -ENOMEM; 940 return -ENOMEM;
953 941
@@ -961,6 +949,7 @@ int alsa_card_saa7134_create (struct saa7134_dev *saadev, unsigned int devicenum
961 } 949 }
962 950
963 spin_lock_init(&chip->lock); 951 spin_lock_init(&chip->lock);
952 spin_lock_init(&chip->mixer_lock);
964 953
965 chip->saadev = saadev; 954 chip->saadev = saadev;
966 955
@@ -970,18 +959,17 @@ int alsa_card_saa7134_create (struct saa7134_dev *saadev, unsigned int devicenum
970 chip->irq = saadev->pci->irq; 959 chip->irq = saadev->pci->irq;
971 chip->iobase = pci_resource_start(saadev->pci, 0); 960 chip->iobase = pci_resource_start(saadev->pci, 0);
972 961
973 err = request_irq(chip->pci->irq, saa7134_alsa_irq, 962 err = request_irq(saadev->pci->irq, saa7134_alsa_irq,
974 SA_SHIRQ | SA_INTERRUPT, saadev->name, saadev); 963 SA_SHIRQ | SA_INTERRUPT, saadev->name, saadev);
975 964
976 if (err < 0) { 965 if (err < 0) {
977 printk(KERN_ERR "%s: can't get IRQ %d for ALSA\n", 966 printk(KERN_ERR "%s: can't get IRQ %d for ALSA\n",
978 saadev->name, saadev->pci->irq); 967 saadev->name, saadev->pci->irq);
979 return err; 968 goto __nodev;
980 } 969 }
981 970
982 if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops)) < 0) { 971 if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops)) < 0) {
983 snd_saa7134_free(chip); 972 goto __nodev;
984 return err;
985 } 973 }
986 974
987 if ((err = snd_card_saa7134_new_mixer(chip)) < 0) 975 if ((err = snd_card_saa7134_new_mixer(chip)) < 0)
@@ -990,8 +978,6 @@ int alsa_card_saa7134_create (struct saa7134_dev *saadev, unsigned int devicenum
990 if ((err = snd_card_saa7134_pcm(chip, 0)) < 0) 978 if ((err = snd_card_saa7134_pcm(chip, 0)) < 0)
991 goto __nodev; 979 goto __nodev;
992 980
993 spin_lock_init(&chip->mixer_lock);
994
995 snd_card_set_dev(card, &chip->pci->dev); 981 snd_card_set_dev(card, &chip->pci->dev);
996 982
997 /* End of "creation" */ 983 /* End of "creation" */
@@ -1007,7 +993,7 @@ int alsa_card_saa7134_create (struct saa7134_dev *saadev, unsigned int devicenum
1007 993
1008__nodev: 994__nodev:
1009 snd_card_free(card); 995 snd_card_free(card);
1010 kfree(card); 996 kfree(chip);
1011 return err; 997 return err;
1012} 998}
1013 999
@@ -1028,7 +1014,7 @@ static int saa7134_alsa_init(void)
1028 1014
1029 list_for_each(list,&saa7134_devlist) { 1015 list_for_each(list,&saa7134_devlist) {
1030 saadev = list_entry(list, struct saa7134_dev, devlist); 1016 saadev = list_entry(list, struct saa7134_dev, devlist);
1031 alsa_card_saa7134_create(saadev,dsp_nr); 1017 alsa_card_saa7134_create(saadev);
1032 } 1018 }
1033 1019
1034 if (saadev == NULL) 1020 if (saadev == NULL)
@@ -1045,10 +1031,13 @@ static int saa7134_alsa_init(void)
1045void saa7134_alsa_exit(void) 1031void saa7134_alsa_exit(void)
1046{ 1032{
1047 int idx; 1033 int idx;
1034
1048 for (idx = 0; idx < SNDRV_CARDS; idx++) { 1035 for (idx = 0; idx < SNDRV_CARDS; idx++) {
1049 snd_card_free(snd_saa7134_cards[idx]); 1036 snd_card_free(snd_saa7134_cards[idx]);
1050 } 1037 }
1038
1051 printk(KERN_INFO "saa7134 ALSA driver for DMA sound unloaded\n"); 1039 printk(KERN_INFO "saa7134 ALSA driver for DMA sound unloaded\n");
1040
1052 return; 1041 return;
1053} 1042}
1054 1043