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