diff options
author | Ricardo Cerqueira <v4l@cerqueira.org> | 2005-11-09 00:38:54 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2005-11-09 10:56:32 -0500 |
commit | b54134be53be720da423692665ec215eb14a678b (patch) | |
tree | cf9c5a895a6c657ef23317c6256e7eb284e93b95 /drivers/media/video/saa7134/saa7134-alsa.c | |
parent | 79dd0c69f05fccb0396bdcd861ad4686ce888cda (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.c | 239 |
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; | |||
40 | module_param(debug, int, 0644); | 39 | module_param(debug, int, 0644); |
41 | MODULE_PARM_DESC(debug,"enable debug messages [alsa]"); | 40 | MODULE_PARM_DESC(debug,"enable debug messages [alsa]"); |
42 | 41 | ||
43 | unsigned int dsp_nr = 0; | ||
44 | module_param(dsp_nr, int, 0444); | ||
45 | MODULE_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 */ | |||
72 | static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR; /* ID for this card */ | 53 | static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR; /* ID for this card */ |
73 | static int enable[SNDRV_CARDS] = {1, [1 ... (SNDRV_CARDS - 1)] = 0}; | 54 | static int enable[SNDRV_CARDS] = {1, [1 ... (SNDRV_CARDS - 1)] = 0}; |
74 | 55 | ||
56 | module_param_array(index, int, NULL, 0444); | ||
57 | MODULE_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 | ||
111 | static snd_card_t *snd_saa7134_cards[SNDRV_CARDS] = SNDRV_DEFAULT_PTR; | 95 | static 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; | |||
124 | static void saa7134_dma_stop(struct saa7134_dev *dev) | 108 | static 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 | ||
142 | static void saa7134_dma_start(struct saa7134_dev *dev) | 126 | static 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: | |||
262 | static int snd_card_saa7134_capture_trigger(snd_pcm_substream_t * substream, | 247 | static 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 | ||
540 | static void snd_card_saa7134_runtime_free(snd_pcm_runtime_t *runtime) | 541 | static 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 | ||
591 | static int dsp_buffer_free(struct saa7134_dev *dev) | 592 | static 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_ | |||
731 | static int snd_saa7134_volume_get(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol) | 726 | static 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 | ||
928 | int alsa_card_saa7134_create (struct saa7134_dev *saadev, unsigned int devicenum) | 920 | int 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) | |||
1045 | void saa7134_alsa_exit(void) | 1031 | void 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 | ||