[ALSA] snd-ca0106: Add support for X-Fi Extreme Audio.
[deliverable/linux.git] / sound / pci / ca0106 / ca0106_main.c
1 /*
2 * Copyright (c) 2004 James Courtier-Dutton <James@superbug.demon.co.uk>
3 * Driver CA0106 chips. e.g. Sound Blaster Audigy LS and Live 24bit
4 * Version: 0.0.23
5 *
6 * FEATURES currently supported:
7 * Front, Rear and Center/LFE.
8 * Surround40 and Surround51.
9 * Capture from MIC an LINE IN input.
10 * SPDIF digital playback of PCM stereo and AC3/DTS works.
11 * (One can use a standard mono mini-jack to one RCA plugs cable.
12 * or one can use a standard stereo mini-jack to two RCA plugs cable.
13 * Plug one of the RCA plugs into the Coax input of the external decoder/receiver.)
14 * ( In theory one could output 3 different AC3 streams at once, to 3 different SPDIF outputs. )
15 * Notes on how to capture sound:
16 * The AC97 is used in the PLAYBACK direction.
17 * The output from the AC97 chip, instead of reaching the speakers, is fed into the Philips 1361T ADC.
18 * So, to record from the MIC, set the MIC Playback volume to max,
19 * unmute the MIC and turn up the MASTER Playback volume.
20 * So, to prevent feedback when capturing, minimise the "Capture feedback into Playback" volume.
21 *
22 * The only playback controls that currently do anything are: -
23 * Analog Front
24 * Analog Rear
25 * Analog Center/LFE
26 * SPDIF Front
27 * SPDIF Rear
28 * SPDIF Center/LFE
29 *
30 * For capture from Mic in or Line in.
31 * Digital/Analog ( switch must be in Analog mode for CAPTURE. )
32 *
33 * CAPTURE feedback into PLAYBACK
34 *
35 * Changelog:
36 * Support interrupts per period.
37 * Removed noise from Center/LFE channel when in Analog mode.
38 * Rename and remove mixer controls.
39 * 0.0.6
40 * Use separate card based DMA buffer for periods table list.
41 * 0.0.7
42 * Change remove and rename ctrls into lists.
43 * 0.0.8
44 * Try to fix capture sources.
45 * 0.0.9
46 * Fix AC3 output.
47 * Enable S32_LE format support.
48 * 0.0.10
49 * Enable playback 48000 and 96000 rates. (Rates other that these do not work, even with "plug:front".)
50 * 0.0.11
51 * Add Model name recognition.
52 * 0.0.12
53 * Correct interrupt timing. interrupt at end of period, instead of in the middle of a playback period.
54 * Remove redundent "voice" handling.
55 * 0.0.13
56 * Single trigger call for multi channels.
57 * 0.0.14
58 * Set limits based on what the sound card hardware can do.
59 * playback periods_min=2, periods_max=8
60 * capture hw constraints require period_size = n * 64 bytes.
61 * playback hw constraints require period_size = n * 64 bytes.
62 * 0.0.15
63 * Minor updates.
64 * 0.0.16
65 * Implement 192000 sample rate.
66 * 0.0.17
67 * Add support for SB0410 and SB0413.
68 * 0.0.18
69 * Modified Copyright message.
70 * 0.0.19
71 * Finally fix support for SB Live 24 bit. SB0410 and SB0413.
72 * The output codec needs resetting, otherwise all output is muted.
73 * 0.0.20
74 * Merge "pci_disable_device(pci);" fixes.
75 * 0.0.21
76 * Add 4 capture channels. (SPDIF only comes in on channel 0. )
77 * Add SPDIF capture using optional digital I/O module for SB Live 24bit. (Analog capture does not yet work.)
78 * 0.0.22
79 * Add support for MSI K8N Diamond Motherboard with onboard SB Live 24bit without AC97. From kiksen, bug #901
80 * 0.0.23
81 * Implement support for Line-in capture on SB Live 24bit.
82 *
83 * BUGS:
84 * Some stability problems when unloading the snd-ca0106 kernel module.
85 * --
86 *
87 * TODO:
88 * 4 Capture channels, only one implemented so far.
89 * Other capture rates apart from 48khz not implemented.
90 * MIDI
91 * --
92 * GENERAL INFO:
93 * Model: SB0310
94 * P17 Chip: CA0106-DAT
95 * AC97 Codec: STAC 9721
96 * ADC: Philips 1361T (Stereo 24bit)
97 * DAC: WM8746EDS (6-channel, 24bit, 192Khz)
98 *
99 * GENERAL INFO:
100 * Model: SB0410
101 * P17 Chip: CA0106-DAT
102 * AC97 Codec: None
103 * ADC: WM8775EDS (4 Channel)
104 * DAC: CS4382 (114 dB, 24-Bit, 192 kHz, 8-Channel D/A Converter with DSD Support)
105 * SPDIF Out control switches between Mic in and SPDIF out.
106 * No sound out or mic input working yet.
107 *
108 * GENERAL INFO:
109 * Model: SB0413
110 * P17 Chip: CA0106-DAT
111 * AC97 Codec: None.
112 * ADC: Unknown
113 * DAC: Unknown
114 * Trying to handle it like the SB0410.
115 *
116 * This code was initally based on code from ALSA's emu10k1x.c which is:
117 * Copyright (c) by Francisco Moraes <fmoraes@nc.rr.com>
118 *
119 * This program is free software; you can redistribute it and/or modify
120 * it under the terms of the GNU General Public License as published by
121 * the Free Software Foundation; either version 2 of the License, or
122 * (at your option) any later version.
123 *
124 * This program is distributed in the hope that it will be useful,
125 * but WITHOUT ANY WARRANTY; without even the implied warranty of
126 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
127 * GNU General Public License for more details.
128 *
129 * You should have received a copy of the GNU General Public License
130 * along with this program; if not, write to the Free Software
131 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
132 *
133 */
134 #include <sound/driver.h>
135 #include <linux/delay.h>
136 #include <linux/init.h>
137 #include <linux/interrupt.h>
138 #include <linux/pci.h>
139 #include <linux/slab.h>
140 #include <linux/moduleparam.h>
141 #include <linux/dma-mapping.h>
142 #include <sound/core.h>
143 #include <sound/initval.h>
144 #include <sound/pcm.h>
145 #include <sound/ac97_codec.h>
146 #include <sound/info.h>
147
148 MODULE_AUTHOR("James Courtier-Dutton <James@superbug.demon.co.uk>");
149 MODULE_DESCRIPTION("CA0106");
150 MODULE_LICENSE("GPL");
151 MODULE_SUPPORTED_DEVICE("{{Creative,SB CA0106 chip}}");
152
153 // module parameters (see "Module Parameters")
154 static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;
155 static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;
156 static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;
157 static uint subsystem[SNDRV_CARDS]; /* Force card subsystem model */
158
159 module_param_array(index, int, NULL, 0444);
160 MODULE_PARM_DESC(index, "Index value for the CA0106 soundcard.");
161 module_param_array(id, charp, NULL, 0444);
162 MODULE_PARM_DESC(id, "ID string for the CA0106 soundcard.");
163 module_param_array(enable, bool, NULL, 0444);
164 MODULE_PARM_DESC(enable, "Enable the CA0106 soundcard.");
165 module_param_array(subsystem, uint, NULL, 0444);
166 MODULE_PARM_DESC(subsystem, "Force card subsystem model.");
167
168 #include "ca0106.h"
169
170 static struct snd_ca0106_details ca0106_chip_details[] = {
171 /* Sound Blaster X-Fi Extreme Audio. This does not have an AC97. 53SB079000000 */
172 /* It is really just a normal SB Live 24bit. */
173 /*
174 * CTRL:CA0111-WTLF
175 * ADC: WM8775SEDS
176 * DAC: CS4382-KQZ
177 */
178 /* Tested:
179 * Playback on front, rear, center/lfe speakers
180 * Capture from Mic in.
181 * Not-Tested:
182 * Capture from Line in.
183 * Playback to digital out.
184 */
185 { .serial = 0x10121102,
186 .name = "X-Fi Extreme Audio [SB0790]",
187 .gpio_type = 1,
188 .i2c_adc = 1 } ,
189 /* New Dell Sound Blaster Live! 7.1 24bit. This does not have an AC97. */
190 /* AudigyLS[SB0310] */
191 { .serial = 0x10021102,
192 .name = "AudigyLS [SB0310]",
193 .ac97 = 1 } ,
194 /* Unknown AudigyLS that also says SB0310 on it */
195 { .serial = 0x10051102,
196 .name = "AudigyLS [SB0310b]",
197 .ac97 = 1 } ,
198 /* New Sound Blaster Live! 7.1 24bit. This does not have an AC97. 53SB041000001 */
199 { .serial = 0x10061102,
200 .name = "Live! 7.1 24bit [SB0410]",
201 .gpio_type = 1,
202 .i2c_adc = 1 } ,
203 /* New Dell Sound Blaster Live! 7.1 24bit. This does not have an AC97. */
204 { .serial = 0x10071102,
205 .name = "Live! 7.1 24bit [SB0413]",
206 .gpio_type = 1,
207 .i2c_adc = 1 } ,
208 /* New Audigy SE. Has a different DAC. */
209 /* SB0570:
210 * CTRL:CA0106-DAT
211 * ADC: WM8775EDS
212 * DAC: WM8768GEDS
213 */
214 { .serial = 0x100a1102,
215 .name = "Audigy SE [SB0570]",
216 .gpio_type = 1,
217 .i2c_adc = 1,
218 .spi_dac = 1 } ,
219 /* New Audigy LS. Has a different DAC. */
220 /* SB0570:
221 * CTRL:CA0106-DAT
222 * ADC: WM8775EDS
223 * DAC: WM8768GEDS
224 */
225 { .serial = 0x10111102,
226 .name = "Audigy SE OEM [SB0570a]",
227 .gpio_type = 1,
228 .i2c_adc = 1,
229 .spi_dac = 1 } ,
230 /* MSI K8N Diamond Motherboard with onboard SB Live 24bit without AC97 */
231 /* SB0438
232 * CTRL:CA0106-DAT
233 * ADC: WM8775SEDS
234 * DAC: CS4382-KQZ
235 */
236 { .serial = 0x10091462,
237 .name = "MSI K8N Diamond MB [SB0438]",
238 .gpio_type = 2,
239 .i2c_adc = 1 } ,
240 /* Shuttle XPC SD31P which has an onboard Creative Labs
241 * Sound Blaster Live! 24-bit EAX
242 * high-definition 7.1 audio processor".
243 * Added using info from andrewvegan in alsa bug #1298
244 */
245 { .serial = 0x30381297,
246 .name = "Shuttle XPC SD31P [SD31P]",
247 .gpio_type = 1,
248 .i2c_adc = 1 } ,
249 /* Shuttle XPC SD11G5 which has an onboard Creative Labs
250 * Sound Blaster Live! 24-bit EAX
251 * high-definition 7.1 audio processor".
252 * Fixes ALSA bug#1600
253 */
254 { .serial = 0x30411297,
255 .name = "Shuttle XPC SD11G5 [SD11G5]",
256 .gpio_type = 1,
257 .i2c_adc = 1 } ,
258 { .serial = 0,
259 .name = "AudigyLS [Unknown]" }
260 };
261
262 /* hardware definition */
263 static struct snd_pcm_hardware snd_ca0106_playback_hw = {
264 .info = (SNDRV_PCM_INFO_MMAP |
265 SNDRV_PCM_INFO_INTERLEAVED |
266 SNDRV_PCM_INFO_BLOCK_TRANSFER |
267 SNDRV_PCM_INFO_MMAP_VALID),
268 .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S32_LE,
269 .rates = (SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000 |
270 SNDRV_PCM_RATE_192000),
271 .rate_min = 48000,
272 .rate_max = 192000,
273 .channels_min = 2, //1,
274 .channels_max = 2, //6,
275 .buffer_bytes_max = ((65536 - 64) * 8),
276 .period_bytes_min = 64,
277 .period_bytes_max = (65536 - 64),
278 .periods_min = 2,
279 .periods_max = 8,
280 .fifo_size = 0,
281 };
282
283 static struct snd_pcm_hardware snd_ca0106_capture_hw = {
284 .info = (SNDRV_PCM_INFO_MMAP |
285 SNDRV_PCM_INFO_INTERLEAVED |
286 SNDRV_PCM_INFO_BLOCK_TRANSFER |
287 SNDRV_PCM_INFO_MMAP_VALID),
288 .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S32_LE,
289 .rates = (SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000 |
290 SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_192000),
291 .rate_min = 44100,
292 .rate_max = 192000,
293 .channels_min = 2,
294 .channels_max = 2,
295 .buffer_bytes_max = ((65536 - 64) * 8),
296 .period_bytes_min = 64,
297 .period_bytes_max = (65536 - 64),
298 .periods_min = 2,
299 .periods_max = 2,
300 .fifo_size = 0,
301 };
302
303 unsigned int snd_ca0106_ptr_read(struct snd_ca0106 * emu,
304 unsigned int reg,
305 unsigned int chn)
306 {
307 unsigned long flags;
308 unsigned int regptr, val;
309
310 regptr = (reg << 16) | chn;
311
312 spin_lock_irqsave(&emu->emu_lock, flags);
313 outl(regptr, emu->port + PTR);
314 val = inl(emu->port + DATA);
315 spin_unlock_irqrestore(&emu->emu_lock, flags);
316 return val;
317 }
318
319 void snd_ca0106_ptr_write(struct snd_ca0106 *emu,
320 unsigned int reg,
321 unsigned int chn,
322 unsigned int data)
323 {
324 unsigned int regptr;
325 unsigned long flags;
326
327 regptr = (reg << 16) | chn;
328
329 spin_lock_irqsave(&emu->emu_lock, flags);
330 outl(regptr, emu->port + PTR);
331 outl(data, emu->port + DATA);
332 spin_unlock_irqrestore(&emu->emu_lock, flags);
333 }
334
335 int snd_ca0106_spi_write(struct snd_ca0106 * emu,
336 unsigned int data)
337 {
338 unsigned int reset, set;
339 unsigned int reg, tmp;
340 int n, result;
341 reg = SPI;
342 if (data > 0xffff) /* Only 16bit values allowed */
343 return 1;
344 tmp = snd_ca0106_ptr_read(emu, reg, 0);
345 reset = (tmp & ~0x3ffff) | 0x20000; /* Set xxx20000 */
346 set = reset | 0x10000; /* Set xxx1xxxx */
347 snd_ca0106_ptr_write(emu, reg, 0, reset | data);
348 tmp = snd_ca0106_ptr_read(emu, reg, 0); /* write post */
349 snd_ca0106_ptr_write(emu, reg, 0, set | data);
350 result = 1;
351 /* Wait for status bit to return to 0 */
352 for (n = 0; n < 100; n++) {
353 udelay(10);
354 tmp = snd_ca0106_ptr_read(emu, reg, 0);
355 if (!(tmp & 0x10000)) {
356 result = 0;
357 break;
358 }
359 }
360 if (result) /* Timed out */
361 return 1;
362 snd_ca0106_ptr_write(emu, reg, 0, reset | data);
363 tmp = snd_ca0106_ptr_read(emu, reg, 0); /* Write post */
364 return 0;
365 }
366
367 /* The ADC does not support i2c read, so only write is implemented */
368 int snd_ca0106_i2c_write(struct snd_ca0106 *emu,
369 u32 reg,
370 u32 value)
371 {
372 u32 tmp;
373 int timeout = 0;
374 int status;
375 int retry;
376 if ((reg > 0x7f) || (value > 0x1ff)) {
377 snd_printk(KERN_ERR "i2c_write: invalid values.\n");
378 return -EINVAL;
379 }
380
381 tmp = reg << 25 | value << 16;
382 // snd_printk("I2C-write:reg=0x%x, value=0x%x\n", reg, value);
383 /* Not sure what this I2C channel controls. */
384 /* snd_ca0106_ptr_write(emu, I2C_D0, 0, tmp); */
385
386 /* This controls the I2C connected to the WM8775 ADC Codec */
387 snd_ca0106_ptr_write(emu, I2C_D1, 0, tmp);
388
389 for (retry = 0; retry < 10; retry++) {
390 /* Send the data to i2c */
391 //tmp = snd_ca0106_ptr_read(emu, I2C_A, 0);
392 //tmp = tmp & ~(I2C_A_ADC_READ|I2C_A_ADC_LAST|I2C_A_ADC_START|I2C_A_ADC_ADD_MASK);
393 tmp = 0;
394 tmp = tmp | (I2C_A_ADC_LAST|I2C_A_ADC_START|I2C_A_ADC_ADD);
395 snd_ca0106_ptr_write(emu, I2C_A, 0, tmp);
396
397 /* Wait till the transaction ends */
398 while (1) {
399 status = snd_ca0106_ptr_read(emu, I2C_A, 0);
400 //snd_printk("I2C:status=0x%x\n", status);
401 timeout++;
402 if ((status & I2C_A_ADC_START) == 0)
403 break;
404
405 if (timeout > 1000)
406 break;
407 }
408 //Read back and see if the transaction is successful
409 if ((status & I2C_A_ADC_ABORT) == 0)
410 break;
411 }
412
413 if (retry == 10) {
414 snd_printk(KERN_ERR "Writing to ADC failed!\n");
415 return -EINVAL;
416 }
417
418 return 0;
419 }
420
421
422 static void snd_ca0106_intr_enable(struct snd_ca0106 *emu, unsigned int intrenb)
423 {
424 unsigned long flags;
425 unsigned int enable;
426
427 spin_lock_irqsave(&emu->emu_lock, flags);
428 enable = inl(emu->port + INTE) | intrenb;
429 outl(enable, emu->port + INTE);
430 spin_unlock_irqrestore(&emu->emu_lock, flags);
431 }
432
433 static void snd_ca0106_intr_disable(struct snd_ca0106 *emu, unsigned int intrenb)
434 {
435 unsigned long flags;
436 unsigned int enable;
437
438 spin_lock_irqsave(&emu->emu_lock, flags);
439 enable = inl(emu->port + INTE) & ~intrenb;
440 outl(enable, emu->port + INTE);
441 spin_unlock_irqrestore(&emu->emu_lock, flags);
442 }
443
444
445 static void snd_ca0106_pcm_free_substream(struct snd_pcm_runtime *runtime)
446 {
447 kfree(runtime->private_data);
448 }
449
450 /* open_playback callback */
451 static int snd_ca0106_pcm_open_playback_channel(struct snd_pcm_substream *substream,
452 int channel_id)
453 {
454 struct snd_ca0106 *chip = snd_pcm_substream_chip(substream);
455 struct snd_ca0106_channel *channel = &(chip->playback_channels[channel_id]);
456 struct snd_ca0106_pcm *epcm;
457 struct snd_pcm_runtime *runtime = substream->runtime;
458 int err;
459
460 epcm = kzalloc(sizeof(*epcm), GFP_KERNEL);
461
462 if (epcm == NULL)
463 return -ENOMEM;
464 epcm->emu = chip;
465 epcm->substream = substream;
466 epcm->channel_id=channel_id;
467
468 runtime->private_data = epcm;
469 runtime->private_free = snd_ca0106_pcm_free_substream;
470
471 runtime->hw = snd_ca0106_playback_hw;
472
473 channel->emu = chip;
474 channel->number = channel_id;
475
476 channel->use = 1;
477 //printk("open:channel_id=%d, chip=%p, channel=%p\n",channel_id, chip, channel);
478 //channel->interrupt = snd_ca0106_pcm_channel_interrupt;
479 channel->epcm = epcm;
480 if ((err = snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS)) < 0)
481 return err;
482 if ((err = snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_BYTES, 64)) < 0)
483 return err;
484 return 0;
485 }
486
487 /* close callback */
488 static int snd_ca0106_pcm_close_playback(struct snd_pcm_substream *substream)
489 {
490 struct snd_ca0106 *chip = snd_pcm_substream_chip(substream);
491 struct snd_pcm_runtime *runtime = substream->runtime;
492 struct snd_ca0106_pcm *epcm = runtime->private_data;
493 chip->playback_channels[epcm->channel_id].use = 0;
494 /* FIXME: maybe zero others */
495 return 0;
496 }
497
498 static int snd_ca0106_pcm_open_playback_front(struct snd_pcm_substream *substream)
499 {
500 return snd_ca0106_pcm_open_playback_channel(substream, PCM_FRONT_CHANNEL);
501 }
502
503 static int snd_ca0106_pcm_open_playback_center_lfe(struct snd_pcm_substream *substream)
504 {
505 return snd_ca0106_pcm_open_playback_channel(substream, PCM_CENTER_LFE_CHANNEL);
506 }
507
508 static int snd_ca0106_pcm_open_playback_unknown(struct snd_pcm_substream *substream)
509 {
510 return snd_ca0106_pcm_open_playback_channel(substream, PCM_UNKNOWN_CHANNEL);
511 }
512
513 static int snd_ca0106_pcm_open_playback_rear(struct snd_pcm_substream *substream)
514 {
515 return snd_ca0106_pcm_open_playback_channel(substream, PCM_REAR_CHANNEL);
516 }
517
518 /* open_capture callback */
519 static int snd_ca0106_pcm_open_capture_channel(struct snd_pcm_substream *substream,
520 int channel_id)
521 {
522 struct snd_ca0106 *chip = snd_pcm_substream_chip(substream);
523 struct snd_ca0106_channel *channel = &(chip->capture_channels[channel_id]);
524 struct snd_ca0106_pcm *epcm;
525 struct snd_pcm_runtime *runtime = substream->runtime;
526 int err;
527
528 epcm = kzalloc(sizeof(*epcm), GFP_KERNEL);
529 if (epcm == NULL) {
530 snd_printk(KERN_ERR "open_capture_channel: failed epcm alloc\n");
531 return -ENOMEM;
532 }
533 epcm->emu = chip;
534 epcm->substream = substream;
535 epcm->channel_id=channel_id;
536
537 runtime->private_data = epcm;
538 runtime->private_free = snd_ca0106_pcm_free_substream;
539
540 runtime->hw = snd_ca0106_capture_hw;
541
542 channel->emu = chip;
543 channel->number = channel_id;
544
545 channel->use = 1;
546 //printk("open:channel_id=%d, chip=%p, channel=%p\n",channel_id, chip, channel);
547 //channel->interrupt = snd_ca0106_pcm_channel_interrupt;
548 channel->epcm = epcm;
549 if ((err = snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS)) < 0)
550 return err;
551 //snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_SIZE, &hw_constraints_capture_period_sizes);
552 if ((err = snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_BYTES, 64)) < 0)
553 return err;
554 return 0;
555 }
556
557 /* close callback */
558 static int snd_ca0106_pcm_close_capture(struct snd_pcm_substream *substream)
559 {
560 struct snd_ca0106 *chip = snd_pcm_substream_chip(substream);
561 struct snd_pcm_runtime *runtime = substream->runtime;
562 struct snd_ca0106_pcm *epcm = runtime->private_data;
563 chip->capture_channels[epcm->channel_id].use = 0;
564 /* FIXME: maybe zero others */
565 return 0;
566 }
567
568 static int snd_ca0106_pcm_open_0_capture(struct snd_pcm_substream *substream)
569 {
570 return snd_ca0106_pcm_open_capture_channel(substream, 0);
571 }
572
573 static int snd_ca0106_pcm_open_1_capture(struct snd_pcm_substream *substream)
574 {
575 return snd_ca0106_pcm_open_capture_channel(substream, 1);
576 }
577
578 static int snd_ca0106_pcm_open_2_capture(struct snd_pcm_substream *substream)
579 {
580 return snd_ca0106_pcm_open_capture_channel(substream, 2);
581 }
582
583 static int snd_ca0106_pcm_open_3_capture(struct snd_pcm_substream *substream)
584 {
585 return snd_ca0106_pcm_open_capture_channel(substream, 3);
586 }
587
588 /* hw_params callback */
589 static int snd_ca0106_pcm_hw_params_playback(struct snd_pcm_substream *substream,
590 struct snd_pcm_hw_params *hw_params)
591 {
592 return snd_pcm_lib_malloc_pages(substream,
593 params_buffer_bytes(hw_params));
594 }
595
596 /* hw_free callback */
597 static int snd_ca0106_pcm_hw_free_playback(struct snd_pcm_substream *substream)
598 {
599 return snd_pcm_lib_free_pages(substream);
600 }
601
602 /* hw_params callback */
603 static int snd_ca0106_pcm_hw_params_capture(struct snd_pcm_substream *substream,
604 struct snd_pcm_hw_params *hw_params)
605 {
606 return snd_pcm_lib_malloc_pages(substream,
607 params_buffer_bytes(hw_params));
608 }
609
610 /* hw_free callback */
611 static int snd_ca0106_pcm_hw_free_capture(struct snd_pcm_substream *substream)
612 {
613 return snd_pcm_lib_free_pages(substream);
614 }
615
616 /* prepare playback callback */
617 static int snd_ca0106_pcm_prepare_playback(struct snd_pcm_substream *substream)
618 {
619 struct snd_ca0106 *emu = snd_pcm_substream_chip(substream);
620 struct snd_pcm_runtime *runtime = substream->runtime;
621 struct snd_ca0106_pcm *epcm = runtime->private_data;
622 int channel = epcm->channel_id;
623 u32 *table_base = (u32 *)(emu->buffer.area+(8*16*channel));
624 u32 period_size_bytes = frames_to_bytes(runtime, runtime->period_size);
625 u32 hcfg_mask = HCFG_PLAYBACK_S32_LE;
626 u32 hcfg_set = 0x00000000;
627 u32 hcfg;
628 u32 reg40_mask = 0x30000 << (channel<<1);
629 u32 reg40_set = 0;
630 u32 reg40;
631 /* FIXME: Depending on mixer selection of SPDIF out or not, select the spdif rate or the DAC rate. */
632 u32 reg71_mask = 0x03030000 ; /* Global. Set SPDIF rate. We only support 44100 to spdif, not to DAC. */
633 u32 reg71_set = 0;
634 u32 reg71;
635 int i;
636
637 //snd_printk("prepare:channel_number=%d, rate=%d, format=0x%x, channels=%d, buffer_size=%ld, period_size=%ld, periods=%u, frames_to_bytes=%d\n",channel, runtime->rate, runtime->format, runtime->channels, runtime->buffer_size, runtime->period_size, runtime->periods, frames_to_bytes(runtime, 1));
638 //snd_printk("dma_addr=%x, dma_area=%p, table_base=%p\n",runtime->dma_addr, runtime->dma_area, table_base);
639 //snd_printk("dma_addr=%x, dma_area=%p, dma_bytes(size)=%x\n",emu->buffer.addr, emu->buffer.area, emu->buffer.bytes);
640 /* Rate can be set per channel. */
641 /* reg40 control host to fifo */
642 /* reg71 controls DAC rate. */
643 switch (runtime->rate) {
644 case 44100:
645 reg40_set = 0x10000 << (channel<<1);
646 reg71_set = 0x01010000;
647 break;
648 case 48000:
649 reg40_set = 0;
650 reg71_set = 0;
651 break;
652 case 96000:
653 reg40_set = 0x20000 << (channel<<1);
654 reg71_set = 0x02020000;
655 break;
656 case 192000:
657 reg40_set = 0x30000 << (channel<<1);
658 reg71_set = 0x03030000;
659 break;
660 default:
661 reg40_set = 0;
662 reg71_set = 0;
663 break;
664 }
665 /* Format is a global setting */
666 /* FIXME: Only let the first channel accessed set this. */
667 switch (runtime->format) {
668 case SNDRV_PCM_FORMAT_S16_LE:
669 hcfg_set = 0;
670 break;
671 case SNDRV_PCM_FORMAT_S32_LE:
672 hcfg_set = HCFG_PLAYBACK_S32_LE;
673 break;
674 default:
675 hcfg_set = 0;
676 break;
677 }
678 hcfg = inl(emu->port + HCFG) ;
679 hcfg = (hcfg & ~hcfg_mask) | hcfg_set;
680 outl(hcfg, emu->port + HCFG);
681 reg40 = snd_ca0106_ptr_read(emu, 0x40, 0);
682 reg40 = (reg40 & ~reg40_mask) | reg40_set;
683 snd_ca0106_ptr_write(emu, 0x40, 0, reg40);
684 reg71 = snd_ca0106_ptr_read(emu, 0x71, 0);
685 reg71 = (reg71 & ~reg71_mask) | reg71_set;
686 snd_ca0106_ptr_write(emu, 0x71, 0, reg71);
687
688 /* FIXME: Check emu->buffer.size before actually writing to it. */
689 for(i=0; i < runtime->periods; i++) {
690 table_base[i*2] = runtime->dma_addr + (i * period_size_bytes);
691 table_base[i*2+1] = period_size_bytes << 16;
692 }
693
694 snd_ca0106_ptr_write(emu, PLAYBACK_LIST_ADDR, channel, emu->buffer.addr+(8*16*channel));
695 snd_ca0106_ptr_write(emu, PLAYBACK_LIST_SIZE, channel, (runtime->periods - 1) << 19);
696 snd_ca0106_ptr_write(emu, PLAYBACK_LIST_PTR, channel, 0);
697 snd_ca0106_ptr_write(emu, PLAYBACK_DMA_ADDR, channel, runtime->dma_addr);
698 snd_ca0106_ptr_write(emu, PLAYBACK_PERIOD_SIZE, channel, frames_to_bytes(runtime, runtime->period_size)<<16); // buffer size in bytes
699 /* FIXME test what 0 bytes does. */
700 snd_ca0106_ptr_write(emu, PLAYBACK_PERIOD_SIZE, channel, 0); // buffer size in bytes
701 snd_ca0106_ptr_write(emu, PLAYBACK_POINTER, channel, 0);
702 snd_ca0106_ptr_write(emu, 0x07, channel, 0x0);
703 snd_ca0106_ptr_write(emu, 0x08, channel, 0);
704 snd_ca0106_ptr_write(emu, PLAYBACK_MUTE, 0x0, 0x0); /* Unmute output */
705 #if 0
706 snd_ca0106_ptr_write(emu, SPCS0, 0,
707 SPCS_CLKACCY_1000PPM | SPCS_SAMPLERATE_48 |
708 SPCS_CHANNELNUM_LEFT | SPCS_SOURCENUM_UNSPEC |
709 SPCS_GENERATIONSTATUS | 0x00001200 |
710 0x00000000 | SPCS_EMPHASIS_NONE | SPCS_COPYRIGHT );
711 }
712 #endif
713
714 return 0;
715 }
716
717 /* prepare capture callback */
718 static int snd_ca0106_pcm_prepare_capture(struct snd_pcm_substream *substream)
719 {
720 struct snd_ca0106 *emu = snd_pcm_substream_chip(substream);
721 struct snd_pcm_runtime *runtime = substream->runtime;
722 struct snd_ca0106_pcm *epcm = runtime->private_data;
723 int channel = epcm->channel_id;
724 u32 hcfg_mask = HCFG_CAPTURE_S32_LE;
725 u32 hcfg_set = 0x00000000;
726 u32 hcfg;
727 u32 over_sampling=0x2;
728 u32 reg71_mask = 0x0000c000 ; /* Global. Set ADC rate. */
729 u32 reg71_set = 0;
730 u32 reg71;
731
732 //snd_printk("prepare:channel_number=%d, rate=%d, format=0x%x, channels=%d, buffer_size=%ld, period_size=%ld, periods=%u, frames_to_bytes=%d\n",channel, runtime->rate, runtime->format, runtime->channels, runtime->buffer_size, runtime->period_size, runtime->periods, frames_to_bytes(runtime, 1));
733 //snd_printk("dma_addr=%x, dma_area=%p, table_base=%p\n",runtime->dma_addr, runtime->dma_area, table_base);
734 //snd_printk("dma_addr=%x, dma_area=%p, dma_bytes(size)=%x\n",emu->buffer.addr, emu->buffer.area, emu->buffer.bytes);
735 /* reg71 controls ADC rate. */
736 switch (runtime->rate) {
737 case 44100:
738 reg71_set = 0x00004000;
739 break;
740 case 48000:
741 reg71_set = 0;
742 break;
743 case 96000:
744 reg71_set = 0x00008000;
745 over_sampling=0xa;
746 break;
747 case 192000:
748 reg71_set = 0x0000c000;
749 over_sampling=0xa;
750 break;
751 default:
752 reg71_set = 0;
753 break;
754 }
755 /* Format is a global setting */
756 /* FIXME: Only let the first channel accessed set this. */
757 switch (runtime->format) {
758 case SNDRV_PCM_FORMAT_S16_LE:
759 hcfg_set = 0;
760 break;
761 case SNDRV_PCM_FORMAT_S32_LE:
762 hcfg_set = HCFG_CAPTURE_S32_LE;
763 break;
764 default:
765 hcfg_set = 0;
766 break;
767 }
768 hcfg = inl(emu->port + HCFG) ;
769 hcfg = (hcfg & ~hcfg_mask) | hcfg_set;
770 outl(hcfg, emu->port + HCFG);
771 reg71 = snd_ca0106_ptr_read(emu, 0x71, 0);
772 reg71 = (reg71 & ~reg71_mask) | reg71_set;
773 snd_ca0106_ptr_write(emu, 0x71, 0, reg71);
774 if (emu->details->i2c_adc == 1) { /* The SB0410 and SB0413 use I2C to control ADC. */
775 snd_ca0106_i2c_write(emu, ADC_MASTER, over_sampling); /* Adjust the over sampler to better suit the capture rate. */
776 }
777
778
779 //printk("prepare:channel_number=%d, rate=%d, format=0x%x, channels=%d, buffer_size=%ld, period_size=%ld, frames_to_bytes=%d\n",channel, runtime->rate, runtime->format, runtime->channels, runtime->buffer_size, runtime->period_size, frames_to_bytes(runtime, 1));
780 snd_ca0106_ptr_write(emu, 0x13, channel, 0);
781 snd_ca0106_ptr_write(emu, CAPTURE_DMA_ADDR, channel, runtime->dma_addr);
782 snd_ca0106_ptr_write(emu, CAPTURE_BUFFER_SIZE, channel, frames_to_bytes(runtime, runtime->buffer_size)<<16); // buffer size in bytes
783 snd_ca0106_ptr_write(emu, CAPTURE_POINTER, channel, 0);
784
785 return 0;
786 }
787
788 /* trigger_playback callback */
789 static int snd_ca0106_pcm_trigger_playback(struct snd_pcm_substream *substream,
790 int cmd)
791 {
792 struct snd_ca0106 *emu = snd_pcm_substream_chip(substream);
793 struct snd_pcm_runtime *runtime;
794 struct snd_ca0106_pcm *epcm;
795 int channel;
796 int result = 0;
797 struct snd_pcm_substream *s;
798 u32 basic = 0;
799 u32 extended = 0;
800 int running=0;
801
802 switch (cmd) {
803 case SNDRV_PCM_TRIGGER_START:
804 running=1;
805 break;
806 case SNDRV_PCM_TRIGGER_STOP:
807 default:
808 running=0;
809 break;
810 }
811 snd_pcm_group_for_each_entry(s, substream) {
812 runtime = s->runtime;
813 epcm = runtime->private_data;
814 channel = epcm->channel_id;
815 //snd_printk("channel=%d\n",channel);
816 epcm->running = running;
817 basic |= (0x1<<channel);
818 extended |= (0x10<<channel);
819 snd_pcm_trigger_done(s, substream);
820 }
821 //snd_printk("basic=0x%x, extended=0x%x\n",basic, extended);
822
823 switch (cmd) {
824 case SNDRV_PCM_TRIGGER_START:
825 snd_ca0106_ptr_write(emu, EXTENDED_INT_MASK, 0, snd_ca0106_ptr_read(emu, EXTENDED_INT_MASK, 0) | (extended));
826 snd_ca0106_ptr_write(emu, BASIC_INTERRUPT, 0, snd_ca0106_ptr_read(emu, BASIC_INTERRUPT, 0)|(basic));
827 break;
828 case SNDRV_PCM_TRIGGER_STOP:
829 snd_ca0106_ptr_write(emu, BASIC_INTERRUPT, 0, snd_ca0106_ptr_read(emu, BASIC_INTERRUPT, 0) & ~(basic));
830 snd_ca0106_ptr_write(emu, EXTENDED_INT_MASK, 0, snd_ca0106_ptr_read(emu, EXTENDED_INT_MASK, 0) & ~(extended));
831 break;
832 default:
833 result = -EINVAL;
834 break;
835 }
836 return result;
837 }
838
839 /* trigger_capture callback */
840 static int snd_ca0106_pcm_trigger_capture(struct snd_pcm_substream *substream,
841 int cmd)
842 {
843 struct snd_ca0106 *emu = snd_pcm_substream_chip(substream);
844 struct snd_pcm_runtime *runtime = substream->runtime;
845 struct snd_ca0106_pcm *epcm = runtime->private_data;
846 int channel = epcm->channel_id;
847 int result = 0;
848
849 switch (cmd) {
850 case SNDRV_PCM_TRIGGER_START:
851 snd_ca0106_ptr_write(emu, EXTENDED_INT_MASK, 0, snd_ca0106_ptr_read(emu, EXTENDED_INT_MASK, 0) | (0x110000<<channel));
852 snd_ca0106_ptr_write(emu, BASIC_INTERRUPT, 0, snd_ca0106_ptr_read(emu, BASIC_INTERRUPT, 0)|(0x100<<channel));
853 epcm->running = 1;
854 break;
855 case SNDRV_PCM_TRIGGER_STOP:
856 snd_ca0106_ptr_write(emu, BASIC_INTERRUPT, 0, snd_ca0106_ptr_read(emu, BASIC_INTERRUPT, 0) & ~(0x100<<channel));
857 snd_ca0106_ptr_write(emu, EXTENDED_INT_MASK, 0, snd_ca0106_ptr_read(emu, EXTENDED_INT_MASK, 0) & ~(0x110000<<channel));
858 epcm->running = 0;
859 break;
860 default:
861 result = -EINVAL;
862 break;
863 }
864 return result;
865 }
866
867 /* pointer_playback callback */
868 static snd_pcm_uframes_t
869 snd_ca0106_pcm_pointer_playback(struct snd_pcm_substream *substream)
870 {
871 struct snd_ca0106 *emu = snd_pcm_substream_chip(substream);
872 struct snd_pcm_runtime *runtime = substream->runtime;
873 struct snd_ca0106_pcm *epcm = runtime->private_data;
874 snd_pcm_uframes_t ptr, ptr1, ptr2,ptr3,ptr4 = 0;
875 int channel = epcm->channel_id;
876
877 if (!epcm->running)
878 return 0;
879
880 ptr3 = snd_ca0106_ptr_read(emu, PLAYBACK_LIST_PTR, channel);
881 ptr1 = snd_ca0106_ptr_read(emu, PLAYBACK_POINTER, channel);
882 ptr4 = snd_ca0106_ptr_read(emu, PLAYBACK_LIST_PTR, channel);
883 if (ptr3 != ptr4) ptr1 = snd_ca0106_ptr_read(emu, PLAYBACK_POINTER, channel);
884 ptr2 = bytes_to_frames(runtime, ptr1);
885 ptr2+= (ptr4 >> 3) * runtime->period_size;
886 ptr=ptr2;
887 if (ptr >= runtime->buffer_size)
888 ptr -= runtime->buffer_size;
889 //printk("ptr1 = 0x%lx, ptr2=0x%lx, ptr=0x%lx, buffer_size = 0x%x, period_size = 0x%x, bits=%d, rate=%d\n", ptr1, ptr2, ptr, (int)runtime->buffer_size, (int)runtime->period_size, (int)runtime->frame_bits, (int)runtime->rate);
890
891 return ptr;
892 }
893
894 /* pointer_capture callback */
895 static snd_pcm_uframes_t
896 snd_ca0106_pcm_pointer_capture(struct snd_pcm_substream *substream)
897 {
898 struct snd_ca0106 *emu = snd_pcm_substream_chip(substream);
899 struct snd_pcm_runtime *runtime = substream->runtime;
900 struct snd_ca0106_pcm *epcm = runtime->private_data;
901 snd_pcm_uframes_t ptr, ptr1, ptr2 = 0;
902 int channel = channel=epcm->channel_id;
903
904 if (!epcm->running)
905 return 0;
906
907 ptr1 = snd_ca0106_ptr_read(emu, CAPTURE_POINTER, channel);
908 ptr2 = bytes_to_frames(runtime, ptr1);
909 ptr=ptr2;
910 if (ptr >= runtime->buffer_size)
911 ptr -= runtime->buffer_size;
912 //printk("ptr1 = 0x%lx, ptr2=0x%lx, ptr=0x%lx, buffer_size = 0x%x, period_size = 0x%x, bits=%d, rate=%d\n", ptr1, ptr2, ptr, (int)runtime->buffer_size, (int)runtime->period_size, (int)runtime->frame_bits, (int)runtime->rate);
913
914 return ptr;
915 }
916
917 /* operators */
918 static struct snd_pcm_ops snd_ca0106_playback_front_ops = {
919 .open = snd_ca0106_pcm_open_playback_front,
920 .close = snd_ca0106_pcm_close_playback,
921 .ioctl = snd_pcm_lib_ioctl,
922 .hw_params = snd_ca0106_pcm_hw_params_playback,
923 .hw_free = snd_ca0106_pcm_hw_free_playback,
924 .prepare = snd_ca0106_pcm_prepare_playback,
925 .trigger = snd_ca0106_pcm_trigger_playback,
926 .pointer = snd_ca0106_pcm_pointer_playback,
927 };
928
929 static struct snd_pcm_ops snd_ca0106_capture_0_ops = {
930 .open = snd_ca0106_pcm_open_0_capture,
931 .close = snd_ca0106_pcm_close_capture,
932 .ioctl = snd_pcm_lib_ioctl,
933 .hw_params = snd_ca0106_pcm_hw_params_capture,
934 .hw_free = snd_ca0106_pcm_hw_free_capture,
935 .prepare = snd_ca0106_pcm_prepare_capture,
936 .trigger = snd_ca0106_pcm_trigger_capture,
937 .pointer = snd_ca0106_pcm_pointer_capture,
938 };
939
940 static struct snd_pcm_ops snd_ca0106_capture_1_ops = {
941 .open = snd_ca0106_pcm_open_1_capture,
942 .close = snd_ca0106_pcm_close_capture,
943 .ioctl = snd_pcm_lib_ioctl,
944 .hw_params = snd_ca0106_pcm_hw_params_capture,
945 .hw_free = snd_ca0106_pcm_hw_free_capture,
946 .prepare = snd_ca0106_pcm_prepare_capture,
947 .trigger = snd_ca0106_pcm_trigger_capture,
948 .pointer = snd_ca0106_pcm_pointer_capture,
949 };
950
951 static struct snd_pcm_ops snd_ca0106_capture_2_ops = {
952 .open = snd_ca0106_pcm_open_2_capture,
953 .close = snd_ca0106_pcm_close_capture,
954 .ioctl = snd_pcm_lib_ioctl,
955 .hw_params = snd_ca0106_pcm_hw_params_capture,
956 .hw_free = snd_ca0106_pcm_hw_free_capture,
957 .prepare = snd_ca0106_pcm_prepare_capture,
958 .trigger = snd_ca0106_pcm_trigger_capture,
959 .pointer = snd_ca0106_pcm_pointer_capture,
960 };
961
962 static struct snd_pcm_ops snd_ca0106_capture_3_ops = {
963 .open = snd_ca0106_pcm_open_3_capture,
964 .close = snd_ca0106_pcm_close_capture,
965 .ioctl = snd_pcm_lib_ioctl,
966 .hw_params = snd_ca0106_pcm_hw_params_capture,
967 .hw_free = snd_ca0106_pcm_hw_free_capture,
968 .prepare = snd_ca0106_pcm_prepare_capture,
969 .trigger = snd_ca0106_pcm_trigger_capture,
970 .pointer = snd_ca0106_pcm_pointer_capture,
971 };
972
973 static struct snd_pcm_ops snd_ca0106_playback_center_lfe_ops = {
974 .open = snd_ca0106_pcm_open_playback_center_lfe,
975 .close = snd_ca0106_pcm_close_playback,
976 .ioctl = snd_pcm_lib_ioctl,
977 .hw_params = snd_ca0106_pcm_hw_params_playback,
978 .hw_free = snd_ca0106_pcm_hw_free_playback,
979 .prepare = snd_ca0106_pcm_prepare_playback,
980 .trigger = snd_ca0106_pcm_trigger_playback,
981 .pointer = snd_ca0106_pcm_pointer_playback,
982 };
983
984 static struct snd_pcm_ops snd_ca0106_playback_unknown_ops = {
985 .open = snd_ca0106_pcm_open_playback_unknown,
986 .close = snd_ca0106_pcm_close_playback,
987 .ioctl = snd_pcm_lib_ioctl,
988 .hw_params = snd_ca0106_pcm_hw_params_playback,
989 .hw_free = snd_ca0106_pcm_hw_free_playback,
990 .prepare = snd_ca0106_pcm_prepare_playback,
991 .trigger = snd_ca0106_pcm_trigger_playback,
992 .pointer = snd_ca0106_pcm_pointer_playback,
993 };
994
995 static struct snd_pcm_ops snd_ca0106_playback_rear_ops = {
996 .open = snd_ca0106_pcm_open_playback_rear,
997 .close = snd_ca0106_pcm_close_playback,
998 .ioctl = snd_pcm_lib_ioctl,
999 .hw_params = snd_ca0106_pcm_hw_params_playback,
1000 .hw_free = snd_ca0106_pcm_hw_free_playback,
1001 .prepare = snd_ca0106_pcm_prepare_playback,
1002 .trigger = snd_ca0106_pcm_trigger_playback,
1003 .pointer = snd_ca0106_pcm_pointer_playback,
1004 };
1005
1006
1007 static unsigned short snd_ca0106_ac97_read(struct snd_ac97 *ac97,
1008 unsigned short reg)
1009 {
1010 struct snd_ca0106 *emu = ac97->private_data;
1011 unsigned long flags;
1012 unsigned short val;
1013
1014 spin_lock_irqsave(&emu->emu_lock, flags);
1015 outb(reg, emu->port + AC97ADDRESS);
1016 val = inw(emu->port + AC97DATA);
1017 spin_unlock_irqrestore(&emu->emu_lock, flags);
1018 return val;
1019 }
1020
1021 static void snd_ca0106_ac97_write(struct snd_ac97 *ac97,
1022 unsigned short reg, unsigned short val)
1023 {
1024 struct snd_ca0106 *emu = ac97->private_data;
1025 unsigned long flags;
1026
1027 spin_lock_irqsave(&emu->emu_lock, flags);
1028 outb(reg, emu->port + AC97ADDRESS);
1029 outw(val, emu->port + AC97DATA);
1030 spin_unlock_irqrestore(&emu->emu_lock, flags);
1031 }
1032
1033 static int snd_ca0106_ac97(struct snd_ca0106 *chip)
1034 {
1035 struct snd_ac97_bus *pbus;
1036 struct snd_ac97_template ac97;
1037 int err;
1038 static struct snd_ac97_bus_ops ops = {
1039 .write = snd_ca0106_ac97_write,
1040 .read = snd_ca0106_ac97_read,
1041 };
1042
1043 if ((err = snd_ac97_bus(chip->card, 0, &ops, NULL, &pbus)) < 0)
1044 return err;
1045 pbus->no_vra = 1; /* we don't need VRA */
1046
1047 memset(&ac97, 0, sizeof(ac97));
1048 ac97.private_data = chip;
1049 ac97.scaps = AC97_SCAP_NO_SPDIF;
1050 return snd_ac97_mixer(pbus, &ac97, &chip->ac97);
1051 }
1052
1053 static int snd_ca0106_free(struct snd_ca0106 *chip)
1054 {
1055 if (chip->res_port != NULL) { /* avoid access to already used hardware */
1056 // disable interrupts
1057 snd_ca0106_ptr_write(chip, BASIC_INTERRUPT, 0, 0);
1058 outl(0, chip->port + INTE);
1059 snd_ca0106_ptr_write(chip, EXTENDED_INT_MASK, 0, 0);
1060 udelay(1000);
1061 // disable audio
1062 //outl(HCFG_LOCKSOUNDCACHE, chip->port + HCFG);
1063 outl(0, chip->port + HCFG);
1064 /* FIXME: We need to stop and DMA transfers here.
1065 * But as I am not sure how yet, we cannot from the dma pages.
1066 * So we can fix: snd-malloc: Memory leak? pages not freed = 8
1067 */
1068 }
1069 // release the data
1070 #if 1
1071 if (chip->buffer.area)
1072 snd_dma_free_pages(&chip->buffer);
1073 #endif
1074
1075 // release the i/o port
1076 release_and_free_resource(chip->res_port);
1077
1078 // release the irq
1079 if (chip->irq >= 0)
1080 free_irq(chip->irq, chip);
1081 pci_disable_device(chip->pci);
1082 kfree(chip);
1083 return 0;
1084 }
1085
1086 static int snd_ca0106_dev_free(struct snd_device *device)
1087 {
1088 struct snd_ca0106 *chip = device->device_data;
1089 return snd_ca0106_free(chip);
1090 }
1091
1092 static irqreturn_t snd_ca0106_interrupt(int irq, void *dev_id)
1093 {
1094 unsigned int status;
1095
1096 struct snd_ca0106 *chip = dev_id;
1097 int i;
1098 int mask;
1099 unsigned int stat76;
1100 struct snd_ca0106_channel *pchannel;
1101
1102 status = inl(chip->port + IPR);
1103 if (! status)
1104 return IRQ_NONE;
1105
1106 stat76 = snd_ca0106_ptr_read(chip, EXTENDED_INT, 0);
1107 //snd_printk("interrupt status = 0x%08x, stat76=0x%08x\n", status, stat76);
1108 //snd_printk("ptr=0x%08x\n",snd_ca0106_ptr_read(chip, PLAYBACK_POINTER, 0));
1109 mask = 0x11; /* 0x1 for one half, 0x10 for the other half period. */
1110 for(i = 0; i < 4; i++) {
1111 pchannel = &(chip->playback_channels[i]);
1112 if (stat76 & mask) {
1113 /* FIXME: Select the correct substream for period elapsed */
1114 if(pchannel->use) {
1115 snd_pcm_period_elapsed(pchannel->epcm->substream);
1116 //printk(KERN_INFO "interrupt [%d] used\n", i);
1117 }
1118 }
1119 //printk(KERN_INFO "channel=%p\n",pchannel);
1120 //printk(KERN_INFO "interrupt stat76[%d] = %08x, use=%d, channel=%d\n", i, stat76, pchannel->use, pchannel->number);
1121 mask <<= 1;
1122 }
1123 mask = 0x110000; /* 0x1 for one half, 0x10 for the other half period. */
1124 for(i = 0; i < 4; i++) {
1125 pchannel = &(chip->capture_channels[i]);
1126 if (stat76 & mask) {
1127 /* FIXME: Select the correct substream for period elapsed */
1128 if(pchannel->use) {
1129 snd_pcm_period_elapsed(pchannel->epcm->substream);
1130 //printk(KERN_INFO "interrupt [%d] used\n", i);
1131 }
1132 }
1133 //printk(KERN_INFO "channel=%p\n",pchannel);
1134 //printk(KERN_INFO "interrupt stat76[%d] = %08x, use=%d, channel=%d\n", i, stat76, pchannel->use, pchannel->number);
1135 mask <<= 1;
1136 }
1137
1138 snd_ca0106_ptr_write(chip, EXTENDED_INT, 0, stat76);
1139
1140 if (chip->midi.dev_id &&
1141 (status & (chip->midi.ipr_tx|chip->midi.ipr_rx))) {
1142 if (chip->midi.interrupt)
1143 chip->midi.interrupt(&chip->midi, status);
1144 else
1145 chip->midi.interrupt_disable(&chip->midi, chip->midi.tx_enable | chip->midi.rx_enable);
1146 }
1147
1148 // acknowledge the interrupt if necessary
1149 outl(status, chip->port+IPR);
1150
1151 return IRQ_HANDLED;
1152 }
1153
1154 static int __devinit snd_ca0106_pcm(struct snd_ca0106 *emu, int device, struct snd_pcm **rpcm)
1155 {
1156 struct snd_pcm *pcm;
1157 struct snd_pcm_substream *substream;
1158 int err;
1159
1160 if (rpcm)
1161 *rpcm = NULL;
1162 if ((err = snd_pcm_new(emu->card, "ca0106", device, 1, 1, &pcm)) < 0)
1163 return err;
1164
1165 pcm->private_data = emu;
1166
1167 switch (device) {
1168 case 0:
1169 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_ca0106_playback_front_ops);
1170 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_ca0106_capture_0_ops);
1171 break;
1172 case 1:
1173 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_ca0106_playback_rear_ops);
1174 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_ca0106_capture_1_ops);
1175 break;
1176 case 2:
1177 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_ca0106_playback_center_lfe_ops);
1178 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_ca0106_capture_2_ops);
1179 break;
1180 case 3:
1181 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_ca0106_playback_unknown_ops);
1182 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_ca0106_capture_3_ops);
1183 break;
1184 }
1185
1186 pcm->info_flags = 0;
1187 pcm->dev_subclass = SNDRV_PCM_SUBCLASS_GENERIC_MIX;
1188 strcpy(pcm->name, "CA0106");
1189 emu->pcm = pcm;
1190
1191 for(substream = pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream;
1192 substream;
1193 substream = substream->next) {
1194 if ((err = snd_pcm_lib_preallocate_pages(substream,
1195 SNDRV_DMA_TYPE_DEV,
1196 snd_dma_pci_data(emu->pci),
1197 64*1024, 64*1024)) < 0) /* FIXME: 32*1024 for sound buffer, between 32and64 for Periods table. */
1198 return err;
1199 }
1200
1201 for (substream = pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream;
1202 substream;
1203 substream = substream->next) {
1204 if ((err = snd_pcm_lib_preallocate_pages(substream,
1205 SNDRV_DMA_TYPE_DEV,
1206 snd_dma_pci_data(emu->pci),
1207 64*1024, 64*1024)) < 0)
1208 return err;
1209 }
1210
1211 if (rpcm)
1212 *rpcm = pcm;
1213
1214 return 0;
1215 }
1216
1217 static unsigned int spi_dac_init[] = {
1218 0x00ff,
1219 0x02ff,
1220 0x0400,
1221 0x0520,
1222 0x0620, /* Set 24 bit. Was 0x0600 */
1223 0x08ff,
1224 0x0aff,
1225 0x0cff,
1226 0x0eff,
1227 0x10ff,
1228 0x1200,
1229 0x1400,
1230 0x1480,
1231 0x1800,
1232 0x1aff,
1233 0x1cff,
1234 0x1e00,
1235 0x0530,
1236 0x0602,
1237 0x0622,
1238 0x1400,
1239 };
1240
1241 static unsigned int i2c_adc_init[][2] = {
1242 { 0x17, 0x00 }, /* Reset */
1243 { 0x07, 0x00 }, /* Timeout */
1244 { 0x0b, 0x22 }, /* Interface control */
1245 { 0x0c, 0x22 }, /* Master mode control */
1246 { 0x0d, 0x08 }, /* Powerdown control */
1247 { 0x0e, 0xcf }, /* Attenuation Left 0x01 = -103dB, 0xff = 24dB */
1248 { 0x0f, 0xcf }, /* Attenuation Right 0.5dB steps */
1249 { 0x10, 0x7b }, /* ALC Control 1 */
1250 { 0x11, 0x00 }, /* ALC Control 2 */
1251 { 0x12, 0x32 }, /* ALC Control 3 */
1252 { 0x13, 0x00 }, /* Noise gate control */
1253 { 0x14, 0xa6 }, /* Limiter control */
1254 { 0x15, ADC_MUX_LINEIN }, /* ADC Mixer control */
1255 };
1256
1257 static int __devinit snd_ca0106_create(int dev, struct snd_card *card,
1258 struct pci_dev *pci,
1259 struct snd_ca0106 **rchip)
1260 {
1261 struct snd_ca0106 *chip;
1262 struct snd_ca0106_details *c;
1263 int err;
1264 int ch;
1265 static struct snd_device_ops ops = {
1266 .dev_free = snd_ca0106_dev_free,
1267 };
1268
1269 *rchip = NULL;
1270
1271 if ((err = pci_enable_device(pci)) < 0)
1272 return err;
1273 if (pci_set_dma_mask(pci, DMA_32BIT_MASK) < 0 ||
1274 pci_set_consistent_dma_mask(pci, DMA_32BIT_MASK) < 0) {
1275 printk(KERN_ERR "error to set 32bit mask DMA\n");
1276 pci_disable_device(pci);
1277 return -ENXIO;
1278 }
1279
1280 chip = kzalloc(sizeof(*chip), GFP_KERNEL);
1281 if (chip == NULL) {
1282 pci_disable_device(pci);
1283 return -ENOMEM;
1284 }
1285
1286 chip->card = card;
1287 chip->pci = pci;
1288 chip->irq = -1;
1289
1290 spin_lock_init(&chip->emu_lock);
1291
1292 chip->port = pci_resource_start(pci, 0);
1293 if ((chip->res_port = request_region(chip->port, 0x20,
1294 "snd_ca0106")) == NULL) {
1295 snd_ca0106_free(chip);
1296 printk(KERN_ERR "cannot allocate the port\n");
1297 return -EBUSY;
1298 }
1299
1300 if (request_irq(pci->irq, snd_ca0106_interrupt,
1301 IRQF_SHARED, "snd_ca0106", chip)) {
1302 snd_ca0106_free(chip);
1303 printk(KERN_ERR "cannot grab irq\n");
1304 return -EBUSY;
1305 }
1306 chip->irq = pci->irq;
1307
1308 /* This stores the periods table. */
1309 if(snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, snd_dma_pci_data(pci), 1024, &chip->buffer) < 0) {
1310 snd_ca0106_free(chip);
1311 return -ENOMEM;
1312 }
1313
1314 pci_set_master(pci);
1315 /* read serial */
1316 pci_read_config_dword(pci, PCI_SUBSYSTEM_VENDOR_ID, &chip->serial);
1317 pci_read_config_word(pci, PCI_SUBSYSTEM_ID, &chip->model);
1318 #if 1
1319 printk(KERN_INFO "snd-ca0106: Model %04x Rev %08x Serial %08x\n", chip->model,
1320 pci->revision, chip->serial);
1321 #endif
1322 strcpy(card->driver, "CA0106");
1323 strcpy(card->shortname, "CA0106");
1324
1325 for (c = ca0106_chip_details; c->serial; c++) {
1326 if (subsystem[dev]) {
1327 if (c->serial == subsystem[dev])
1328 break;
1329 } else if (c->serial == chip->serial)
1330 break;
1331 }
1332 chip->details = c;
1333 if (subsystem[dev]) {
1334 printk(KERN_INFO "snd-ca0106: Sound card name=%s, subsystem=0x%x. Forced to subsystem=0x%x\n",
1335 c->name, chip->serial, subsystem[dev]);
1336 }
1337
1338 sprintf(card->longname, "%s at 0x%lx irq %i",
1339 c->name, chip->port, chip->irq);
1340
1341 outl(0, chip->port + INTE);
1342
1343 /*
1344 * Init to 0x02109204 :
1345 * Clock accuracy = 0 (1000ppm)
1346 * Sample Rate = 2 (48kHz)
1347 * Audio Channel = 1 (Left of 2)
1348 * Source Number = 0 (Unspecified)
1349 * Generation Status = 1 (Original for Cat Code 12)
1350 * Cat Code = 12 (Digital Signal Mixer)
1351 * Mode = 0 (Mode 0)
1352 * Emphasis = 0 (None)
1353 * CP = 1 (Copyright unasserted)
1354 * AN = 0 (Audio data)
1355 * P = 0 (Consumer)
1356 */
1357 snd_ca0106_ptr_write(chip, SPCS0, 0,
1358 chip->spdif_bits[0] =
1359 SPCS_CLKACCY_1000PPM | SPCS_SAMPLERATE_48 |
1360 SPCS_CHANNELNUM_LEFT | SPCS_SOURCENUM_UNSPEC |
1361 SPCS_GENERATIONSTATUS | 0x00001200 |
1362 0x00000000 | SPCS_EMPHASIS_NONE | SPCS_COPYRIGHT);
1363 /* Only SPCS1 has been tested */
1364 snd_ca0106_ptr_write(chip, SPCS1, 0,
1365 chip->spdif_bits[1] =
1366 SPCS_CLKACCY_1000PPM | SPCS_SAMPLERATE_48 |
1367 SPCS_CHANNELNUM_LEFT | SPCS_SOURCENUM_UNSPEC |
1368 SPCS_GENERATIONSTATUS | 0x00001200 |
1369 0x00000000 | SPCS_EMPHASIS_NONE | SPCS_COPYRIGHT);
1370 snd_ca0106_ptr_write(chip, SPCS2, 0,
1371 chip->spdif_bits[2] =
1372 SPCS_CLKACCY_1000PPM | SPCS_SAMPLERATE_48 |
1373 SPCS_CHANNELNUM_LEFT | SPCS_SOURCENUM_UNSPEC |
1374 SPCS_GENERATIONSTATUS | 0x00001200 |
1375 0x00000000 | SPCS_EMPHASIS_NONE | SPCS_COPYRIGHT);
1376 snd_ca0106_ptr_write(chip, SPCS3, 0,
1377 chip->spdif_bits[3] =
1378 SPCS_CLKACCY_1000PPM | SPCS_SAMPLERATE_48 |
1379 SPCS_CHANNELNUM_LEFT | SPCS_SOURCENUM_UNSPEC |
1380 SPCS_GENERATIONSTATUS | 0x00001200 |
1381 0x00000000 | SPCS_EMPHASIS_NONE | SPCS_COPYRIGHT);
1382
1383 snd_ca0106_ptr_write(chip, PLAYBACK_MUTE, 0, 0x00fc0000);
1384 snd_ca0106_ptr_write(chip, CAPTURE_MUTE, 0, 0x00fc0000);
1385
1386 /* Write 0x8000 to AC97_REC_GAIN to mute it. */
1387 outb(AC97_REC_GAIN, chip->port + AC97ADDRESS);
1388 outw(0x8000, chip->port + AC97DATA);
1389 #if 0
1390 snd_ca0106_ptr_write(chip, SPCS0, 0, 0x2108006);
1391 snd_ca0106_ptr_write(chip, 0x42, 0, 0x2108006);
1392 snd_ca0106_ptr_write(chip, 0x43, 0, 0x2108006);
1393 snd_ca0106_ptr_write(chip, 0x44, 0, 0x2108006);
1394 #endif
1395
1396 //snd_ca0106_ptr_write(chip, SPDIF_SELECT2, 0, 0xf0f003f); /* OSS drivers set this. */
1397 /* Analog or Digital output */
1398 snd_ca0106_ptr_write(chip, SPDIF_SELECT1, 0, 0xf);
1399 snd_ca0106_ptr_write(chip, SPDIF_SELECT2, 0, 0x000f0000); /* 0x0b000000 for digital, 0x000b0000 for analog, from win2000 drivers. Use 0x000f0000 for surround71 */
1400 chip->spdif_enable = 0; /* Set digital SPDIF output off */
1401 //snd_ca0106_ptr_write(chip, 0x45, 0, 0); /* Analogue out */
1402 //snd_ca0106_ptr_write(chip, 0x45, 0, 0xf00); /* Digital out */
1403
1404 snd_ca0106_ptr_write(chip, CAPTURE_CONTROL, 0, 0x40c81000); /* goes to 0x40c80000 when doing SPDIF IN/OUT */
1405 snd_ca0106_ptr_write(chip, CAPTURE_CONTROL, 1, 0xffffffff); /* (Mute) CAPTURE feedback into PLAYBACK volume. Only lower 16 bits matter. */
1406 snd_ca0106_ptr_write(chip, CAPTURE_CONTROL, 2, 0x30300000); /* SPDIF IN Volume */
1407 snd_ca0106_ptr_write(chip, CAPTURE_CONTROL, 3, 0x00700000); /* SPDIF IN Volume, 0x70 = (vol & 0x3f) | 0x40 */
1408 snd_ca0106_ptr_write(chip, PLAYBACK_ROUTING1, 0, 0x32765410);
1409 snd_ca0106_ptr_write(chip, PLAYBACK_ROUTING2, 0, 0x76767676);
1410 snd_ca0106_ptr_write(chip, CAPTURE_ROUTING1, 0, 0x32765410);
1411 snd_ca0106_ptr_write(chip, CAPTURE_ROUTING2, 0, 0x76767676);
1412 for(ch = 0; ch < 4; ch++) {
1413 snd_ca0106_ptr_write(chip, CAPTURE_VOLUME1, ch, 0x30303030); /* Only high 16 bits matter */
1414 snd_ca0106_ptr_write(chip, CAPTURE_VOLUME2, ch, 0x30303030);
1415 //snd_ca0106_ptr_write(chip, PLAYBACK_VOLUME1, ch, 0x40404040); /* Mute */
1416 //snd_ca0106_ptr_write(chip, PLAYBACK_VOLUME2, ch, 0x40404040); /* Mute */
1417 snd_ca0106_ptr_write(chip, PLAYBACK_VOLUME1, ch, 0xffffffff); /* Mute */
1418 snd_ca0106_ptr_write(chip, PLAYBACK_VOLUME2, ch, 0xffffffff); /* Mute */
1419 }
1420 if (chip->details->i2c_adc == 1) {
1421 /* Select MIC, Line in, TAD in, AUX in */
1422 snd_ca0106_ptr_write(chip, CAPTURE_SOURCE, 0x0, 0x333300e4);
1423 /* Default to CAPTURE_SOURCE to i2s in */
1424 chip->capture_source = 3;
1425 } else if (chip->details->ac97 == 1) {
1426 /* Default to AC97 in */
1427 snd_ca0106_ptr_write(chip, CAPTURE_SOURCE, 0x0, 0x444400e4);
1428 /* Default to CAPTURE_SOURCE to AC97 in */
1429 chip->capture_source = 4;
1430 } else {
1431 /* Select MIC, Line in, TAD in, AUX in */
1432 snd_ca0106_ptr_write(chip, CAPTURE_SOURCE, 0x0, 0x333300e4);
1433 /* Default to Set CAPTURE_SOURCE to i2s in */
1434 chip->capture_source = 3;
1435 }
1436
1437 if (chip->details->gpio_type == 2) { /* The SB0438 use GPIO differently. */
1438 /* FIXME: Still need to find out what the other GPIO bits do. E.g. For digital spdif out. */
1439 outl(0x0, chip->port+GPIO);
1440 //outl(0x00f0e000, chip->port+GPIO); /* Analog */
1441 outl(0x005f5301, chip->port+GPIO); /* Analog */
1442 } else if (chip->details->gpio_type == 1) { /* The SB0410 and SB0413 use GPIO differently. */
1443 /* FIXME: Still need to find out what the other GPIO bits do. E.g. For digital spdif out. */
1444 outl(0x0, chip->port+GPIO);
1445 //outl(0x00f0e000, chip->port+GPIO); /* Analog */
1446 outl(0x005f5301, chip->port+GPIO); /* Analog */
1447 } else {
1448 outl(0x0, chip->port+GPIO);
1449 outl(0x005f03a3, chip->port+GPIO); /* Analog */
1450 //outl(0x005f02a2, chip->port+GPIO); /* SPDIF */
1451 }
1452 snd_ca0106_intr_enable(chip, 0x105); /* Win2000 uses 0x1e0 */
1453
1454 //outl(HCFG_LOCKSOUNDCACHE|HCFG_AUDIOENABLE, chip->port+HCFG);
1455 //outl(0x00001409, chip->port+HCFG); /* 0x1000 causes AC3 to fails. Maybe it effects 24 bit output. */
1456 //outl(0x00000009, chip->port+HCFG);
1457 outl(HCFG_AC97 | HCFG_AUDIOENABLE, chip->port+HCFG); /* AC97 2.0, Enable outputs. */
1458
1459 if (chip->details->i2c_adc == 1) { /* The SB0410 and SB0413 use I2C to control ADC. */
1460 int size, n;
1461
1462 size = ARRAY_SIZE(i2c_adc_init);
1463 //snd_printk("I2C:array size=0x%x\n", size);
1464 for (n=0; n < size; n++) {
1465 snd_ca0106_i2c_write(chip, i2c_adc_init[n][0], i2c_adc_init[n][1]);
1466 }
1467 for (n=0; n < 4; n++) {
1468 chip->i2c_capture_volume[n][0]= 0xcf;
1469 chip->i2c_capture_volume[n][1]= 0xcf;
1470 }
1471 chip->i2c_capture_source=2; /* Line in */
1472 //snd_ca0106_i2c_write(chip, ADC_MUX, ADC_MUX_LINEIN); /* Enable Line-in capture. MIC in currently untested. */
1473 }
1474 if (chip->details->spi_dac == 1) { /* The SB0570 use SPI to control DAC. */
1475 int size, n;
1476
1477 size = ARRAY_SIZE(spi_dac_init);
1478 for (n=0; n < size; n++)
1479 snd_ca0106_spi_write(chip, spi_dac_init[n]);
1480 }
1481
1482 if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL,
1483 chip, &ops)) < 0) {
1484 snd_ca0106_free(chip);
1485 return err;
1486 }
1487 *rchip = chip;
1488 return 0;
1489 }
1490
1491
1492 static void ca0106_midi_interrupt_enable(struct snd_ca_midi *midi, int intr)
1493 {
1494 snd_ca0106_intr_enable((struct snd_ca0106 *)(midi->dev_id), intr);
1495 }
1496
1497 static void ca0106_midi_interrupt_disable(struct snd_ca_midi *midi, int intr)
1498 {
1499 snd_ca0106_intr_disable((struct snd_ca0106 *)(midi->dev_id), intr);
1500 }
1501
1502 static unsigned char ca0106_midi_read(struct snd_ca_midi *midi, int idx)
1503 {
1504 return (unsigned char)snd_ca0106_ptr_read((struct snd_ca0106 *)(midi->dev_id),
1505 midi->port + idx, 0);
1506 }
1507
1508 static void ca0106_midi_write(struct snd_ca_midi *midi, int data, int idx)
1509 {
1510 snd_ca0106_ptr_write((struct snd_ca0106 *)(midi->dev_id), midi->port + idx, 0, data);
1511 }
1512
1513 static struct snd_card *ca0106_dev_id_card(void *dev_id)
1514 {
1515 return ((struct snd_ca0106 *)dev_id)->card;
1516 }
1517
1518 static int ca0106_dev_id_port(void *dev_id)
1519 {
1520 return ((struct snd_ca0106 *)dev_id)->port;
1521 }
1522
1523 static int __devinit snd_ca0106_midi(struct snd_ca0106 *chip, unsigned int channel)
1524 {
1525 struct snd_ca_midi *midi;
1526 char *name;
1527 int err;
1528
1529 if (channel == CA0106_MIDI_CHAN_B) {
1530 name = "CA0106 MPU-401 (UART) B";
1531 midi = &chip->midi2;
1532 midi->tx_enable = INTE_MIDI_TX_B;
1533 midi->rx_enable = INTE_MIDI_RX_B;
1534 midi->ipr_tx = IPR_MIDI_TX_B;
1535 midi->ipr_rx = IPR_MIDI_RX_B;
1536 midi->port = MIDI_UART_B_DATA;
1537 } else {
1538 name = "CA0106 MPU-401 (UART)";
1539 midi = &chip->midi;
1540 midi->tx_enable = INTE_MIDI_TX_A;
1541 midi->rx_enable = INTE_MIDI_TX_B;
1542 midi->ipr_tx = IPR_MIDI_TX_A;
1543 midi->ipr_rx = IPR_MIDI_RX_A;
1544 midi->port = MIDI_UART_A_DATA;
1545 }
1546
1547 midi->reset = CA0106_MPU401_RESET;
1548 midi->enter_uart = CA0106_MPU401_ENTER_UART;
1549 midi->ack = CA0106_MPU401_ACK;
1550
1551 midi->input_avail = CA0106_MIDI_INPUT_AVAIL;
1552 midi->output_ready = CA0106_MIDI_OUTPUT_READY;
1553
1554 midi->channel = channel;
1555
1556 midi->interrupt_enable = ca0106_midi_interrupt_enable;
1557 midi->interrupt_disable = ca0106_midi_interrupt_disable;
1558
1559 midi->read = ca0106_midi_read;
1560 midi->write = ca0106_midi_write;
1561
1562 midi->get_dev_id_card = ca0106_dev_id_card;
1563 midi->get_dev_id_port = ca0106_dev_id_port;
1564
1565 midi->dev_id = chip;
1566
1567 if ((err = ca_midi_init(chip, midi, 0, name)) < 0)
1568 return err;
1569
1570 return 0;
1571 }
1572
1573
1574 static int __devinit snd_ca0106_probe(struct pci_dev *pci,
1575 const struct pci_device_id *pci_id)
1576 {
1577 static int dev;
1578 struct snd_card *card;
1579 struct snd_ca0106 *chip;
1580 int err;
1581
1582 if (dev >= SNDRV_CARDS)
1583 return -ENODEV;
1584 if (!enable[dev]) {
1585 dev++;
1586 return -ENOENT;
1587 }
1588
1589 card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0);
1590 if (card == NULL)
1591 return -ENOMEM;
1592
1593 if ((err = snd_ca0106_create(dev, card, pci, &chip)) < 0) {
1594 snd_card_free(card);
1595 return err;
1596 }
1597
1598 if ((err = snd_ca0106_pcm(chip, 0, NULL)) < 0) {
1599 snd_card_free(card);
1600 return err;
1601 }
1602 if ((err = snd_ca0106_pcm(chip, 1, NULL)) < 0) {
1603 snd_card_free(card);
1604 return err;
1605 }
1606 if ((err = snd_ca0106_pcm(chip, 2, NULL)) < 0) {
1607 snd_card_free(card);
1608 return err;
1609 }
1610 if ((err = snd_ca0106_pcm(chip, 3, NULL)) < 0) {
1611 snd_card_free(card);
1612 return err;
1613 }
1614 if (chip->details->ac97 == 1) { /* The SB0410 and SB0413 do not have an AC97 chip. */
1615 if ((err = snd_ca0106_ac97(chip)) < 0) {
1616 snd_card_free(card);
1617 return err;
1618 }
1619 }
1620 if ((err = snd_ca0106_mixer(chip)) < 0) {
1621 snd_card_free(card);
1622 return err;
1623 }
1624
1625 snd_printdd("ca0106: probe for MIDI channel A ...");
1626 if ((err = snd_ca0106_midi(chip,CA0106_MIDI_CHAN_A)) < 0) {
1627 snd_card_free(card);
1628 snd_printdd(" failed, err=0x%x\n",err);
1629 return err;
1630 }
1631 snd_printdd(" done.\n");
1632
1633 #ifdef CONFIG_PROC_FS
1634 snd_ca0106_proc_init(chip);
1635 #endif
1636
1637 snd_card_set_dev(card, &pci->dev);
1638
1639 if ((err = snd_card_register(card)) < 0) {
1640 snd_card_free(card);
1641 return err;
1642 }
1643
1644 pci_set_drvdata(pci, card);
1645 dev++;
1646 return 0;
1647 }
1648
1649 static void __devexit snd_ca0106_remove(struct pci_dev *pci)
1650 {
1651 snd_card_free(pci_get_drvdata(pci));
1652 pci_set_drvdata(pci, NULL);
1653 }
1654
1655 // PCI IDs
1656 static struct pci_device_id snd_ca0106_ids[] = {
1657 { 0x1102, 0x0007, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, /* Audigy LS or Live 24bit */
1658 { 0, }
1659 };
1660 MODULE_DEVICE_TABLE(pci, snd_ca0106_ids);
1661
1662 // pci_driver definition
1663 static struct pci_driver driver = {
1664 .name = "CA0106",
1665 .id_table = snd_ca0106_ids,
1666 .probe = snd_ca0106_probe,
1667 .remove = __devexit_p(snd_ca0106_remove),
1668 };
1669
1670 // initialization of the module
1671 static int __init alsa_card_ca0106_init(void)
1672 {
1673 return pci_register_driver(&driver);
1674 }
1675
1676 // clean up the module
1677 static void __exit alsa_card_ca0106_exit(void)
1678 {
1679 pci_unregister_driver(&driver);
1680 }
1681
1682 module_init(alsa_card_ca0106_init)
1683 module_exit(alsa_card_ca0106_exit)
This page took 0.107297 seconds and 5 git commands to generate.