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