1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138#include <linux/delay.h>
139#include <linux/init.h>
140#include <linux/interrupt.h>
141#include <linux/pci.h>
142#include <linux/slab.h>
143#include <linux/moduleparam.h>
144#include <linux/dma-mapping.h>
145#include <sound/core.h>
146#include <sound/initval.h>
147#include <sound/pcm.h>
148#include <sound/ac97_codec.h>
149#include <sound/info.h>
150
151MODULE_AUTHOR("James Courtier-Dutton <James@superbug.demon.co.uk>");
152MODULE_DESCRIPTION("CA0106");
153MODULE_LICENSE("GPL");
154MODULE_SUPPORTED_DEVICE("{{Creative,SB CA0106 chip}}");
155
156
157static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;
158static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;
159static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;
160static uint subsystem[SNDRV_CARDS];
161
162module_param_array(index, int, NULL, 0444);
163MODULE_PARM_DESC(index, "Index value for the CA0106 soundcard.");
164module_param_array(id, charp, NULL, 0444);
165MODULE_PARM_DESC(id, "ID string for the CA0106 soundcard.");
166module_param_array(enable, bool, NULL, 0444);
167MODULE_PARM_DESC(enable, "Enable the CA0106 soundcard.");
168module_param_array(subsystem, uint, NULL, 0444);
169MODULE_PARM_DESC(subsystem, "Force card subsystem model.");
170
171#include "ca0106.h"
172
173static struct snd_ca0106_details ca0106_chip_details[] = {
174
175
176
177
178
179 { .serial = 0x10131102,
180 .name = "X-Fi Extreme Audio [SBxxxx]",
181 .gpio_type = 1,
182 .i2c_adc = 1 } ,
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197 { .serial = 0x10121102,
198 .name = "X-Fi Extreme Audio [SB0790]",
199 .gpio_type = 1,
200 .i2c_adc = 1 } ,
201
202
203 { .serial = 0x10021102,
204 .name = "AudigyLS [SB0310]",
205 .ac97 = 1 } ,
206
207 { .serial = 0x10051102,
208 .name = "AudigyLS [SB0310b]",
209 .ac97 = 1 } ,
210
211 { .serial = 0x10061102,
212 .name = "Live! 7.1 24bit [SB0410]",
213 .gpio_type = 1,
214 .i2c_adc = 1 } ,
215
216 { .serial = 0x10071102,
217 .name = "Live! 7.1 24bit [SB0413]",
218 .gpio_type = 1,
219 .i2c_adc = 1 } ,
220
221
222
223
224
225
226 { .serial = 0x100a1102,
227 .name = "Audigy SE [SB0570]",
228 .gpio_type = 1,
229 .i2c_adc = 1,
230 .spi_dac = 1 } ,
231
232
233
234
235
236
237 { .serial = 0x10111102,
238 .name = "Audigy SE OEM [SB0570a]",
239 .gpio_type = 1,
240 .i2c_adc = 1,
241 .spi_dac = 1 } ,
242
243
244
245
246
247
248 { .serial = 0x10091462,
249 .name = "MSI K8N Diamond MB [SB0438]",
250 .gpio_type = 2,
251 .i2c_adc = 1 } ,
252
253
254
255
256
257 { .serial = 0x30381297,
258 .name = "Shuttle XPC SD31P [SD31P]",
259 .gpio_type = 1,
260 .i2c_adc = 1 } ,
261
262
263
264
265
266 { .serial = 0x30411297,
267 .name = "Shuttle XPC SD11G5 [SD11G5]",
268 .gpio_type = 1,
269 .i2c_adc = 1 } ,
270 { .serial = 0,
271 .name = "AudigyLS [Unknown]" }
272};
273
274
275static struct snd_pcm_hardware snd_ca0106_playback_hw = {
276 .info = SNDRV_PCM_INFO_MMAP |
277 SNDRV_PCM_INFO_INTERLEAVED |
278 SNDRV_PCM_INFO_BLOCK_TRANSFER |
279 SNDRV_PCM_INFO_MMAP_VALID |
280 SNDRV_PCM_INFO_SYNC_START,
281 .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S32_LE,
282 .rates = (SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000 |
283 SNDRV_PCM_RATE_192000),
284 .rate_min = 48000,
285 .rate_max = 192000,
286 .channels_min = 2,
287 .channels_max = 2,
288 .buffer_bytes_max = ((65536 - 64) * 8),
289 .period_bytes_min = 64,
290 .period_bytes_max = (65536 - 64),
291 .periods_min = 2,
292 .periods_max = 8,
293 .fifo_size = 0,
294};
295
296static struct snd_pcm_hardware snd_ca0106_capture_hw = {
297 .info = (SNDRV_PCM_INFO_MMAP |
298 SNDRV_PCM_INFO_INTERLEAVED |
299 SNDRV_PCM_INFO_BLOCK_TRANSFER |
300 SNDRV_PCM_INFO_MMAP_VALID),
301 .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S32_LE,
302 .rates = (SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000 |
303 SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_192000),
304 .rate_min = 44100,
305 .rate_max = 192000,
306 .channels_min = 2,
307 .channels_max = 2,
308 .buffer_bytes_max = ((65536 - 64) * 8),
309 .period_bytes_min = 64,
310 .period_bytes_max = (65536 - 64),
311 .periods_min = 2,
312 .periods_max = 2,
313 .fifo_size = 0,
314};
315
316unsigned int snd_ca0106_ptr_read(struct snd_ca0106 * emu,
317 unsigned int reg,
318 unsigned int chn)
319{
320 unsigned long flags;
321 unsigned int regptr, val;
322
323 regptr = (reg << 16) | chn;
324
325 spin_lock_irqsave(&emu->emu_lock, flags);
326 outl(regptr, emu->port + PTR);
327 val = inl(emu->port + DATA);
328 spin_unlock_irqrestore(&emu->emu_lock, flags);
329 return val;
330}
331
332void snd_ca0106_ptr_write(struct snd_ca0106 *emu,
333 unsigned int reg,
334 unsigned int chn,
335 unsigned int data)
336{
337 unsigned int regptr;
338 unsigned long flags;
339
340 regptr = (reg << 16) | chn;
341
342 spin_lock_irqsave(&emu->emu_lock, flags);
343 outl(regptr, emu->port + PTR);
344 outl(data, emu->port + DATA);
345 spin_unlock_irqrestore(&emu->emu_lock, flags);
346}
347
348int snd_ca0106_spi_write(struct snd_ca0106 * emu,
349 unsigned int data)
350{
351 unsigned int reset, set;
352 unsigned int reg, tmp;
353 int n, result;
354 reg = SPI;
355 if (data > 0xffff)
356 return 1;
357 tmp = snd_ca0106_ptr_read(emu, reg, 0);
358 reset = (tmp & ~0x3ffff) | 0x20000;
359 set = reset | 0x10000;
360 snd_ca0106_ptr_write(emu, reg, 0, reset | data);
361 tmp = snd_ca0106_ptr_read(emu, reg, 0);
362 snd_ca0106_ptr_write(emu, reg, 0, set | data);
363 result = 1;
364
365 for (n = 0; n < 100; n++) {
366 udelay(10);
367 tmp = snd_ca0106_ptr_read(emu, reg, 0);
368 if (!(tmp & 0x10000)) {
369 result = 0;
370 break;
371 }
372 }
373 if (result)
374 return 1;
375 snd_ca0106_ptr_write(emu, reg, 0, reset | data);
376 tmp = snd_ca0106_ptr_read(emu, reg, 0);
377 return 0;
378}
379
380
381int snd_ca0106_i2c_write(struct snd_ca0106 *emu,
382 u32 reg,
383 u32 value)
384{
385 u32 tmp;
386 int timeout = 0;
387 int status;
388 int retry;
389 if ((reg > 0x7f) || (value > 0x1ff)) {
390 snd_printk(KERN_ERR "i2c_write: invalid values.\n");
391 return -EINVAL;
392 }
393
394 tmp = reg << 25 | value << 16;
395
396
397
398
399
400 snd_ca0106_ptr_write(emu, I2C_D1, 0, tmp);
401
402 for (retry = 0; retry < 10; retry++) {
403
404
405
406 tmp = 0;
407 tmp = tmp | (I2C_A_ADC_LAST|I2C_A_ADC_START|I2C_A_ADC_ADD);
408 snd_ca0106_ptr_write(emu, I2C_A, 0, tmp);
409
410
411 while (1) {
412 status = snd_ca0106_ptr_read(emu, I2C_A, 0);
413
414 timeout++;
415 if ((status & I2C_A_ADC_START) == 0)
416 break;
417
418 if (timeout > 1000)
419 break;
420 }
421
422 if ((status & I2C_A_ADC_ABORT) == 0)
423 break;
424 }
425
426 if (retry == 10) {
427 snd_printk(KERN_ERR "Writing to ADC failed!\n");
428 return -EINVAL;
429 }
430
431 return 0;
432}
433
434
435static void snd_ca0106_intr_enable(struct snd_ca0106 *emu, unsigned int intrenb)
436{
437 unsigned long flags;
438 unsigned int intr_enable;
439
440 spin_lock_irqsave(&emu->emu_lock, flags);
441 intr_enable = inl(emu->port + INTE) | intrenb;
442 outl(intr_enable, emu->port + INTE);
443 spin_unlock_irqrestore(&emu->emu_lock, flags);
444}
445
446static void snd_ca0106_intr_disable(struct snd_ca0106 *emu, unsigned int intrenb)
447{
448 unsigned long flags;
449 unsigned int intr_enable;
450
451 spin_lock_irqsave(&emu->emu_lock, flags);
452 intr_enable = inl(emu->port + INTE) & ~intrenb;
453 outl(intr_enable, emu->port + INTE);
454 spin_unlock_irqrestore(&emu->emu_lock, flags);
455}
456
457
458static void snd_ca0106_pcm_free_substream(struct snd_pcm_runtime *runtime)
459{
460 kfree(runtime->private_data);
461}
462
463static const int spi_dacd_reg[] = {
464 [PCM_FRONT_CHANNEL] = SPI_DACD4_REG,
465 [PCM_REAR_CHANNEL] = SPI_DACD0_REG,
466 [PCM_CENTER_LFE_CHANNEL]= SPI_DACD2_REG,
467 [PCM_UNKNOWN_CHANNEL] = SPI_DACD1_REG,
468};
469static const int spi_dacd_bit[] = {
470 [PCM_FRONT_CHANNEL] = SPI_DACD4_BIT,
471 [PCM_REAR_CHANNEL] = SPI_DACD0_BIT,
472 [PCM_CENTER_LFE_CHANNEL]= SPI_DACD2_BIT,
473 [PCM_UNKNOWN_CHANNEL] = SPI_DACD1_BIT,
474};
475
476
477static int snd_ca0106_pcm_open_playback_channel(struct snd_pcm_substream *substream,
478 int channel_id)
479{
480 struct snd_ca0106 *chip = snd_pcm_substream_chip(substream);
481 struct snd_ca0106_channel *channel = &(chip->playback_channels[channel_id]);
482 struct snd_ca0106_pcm *epcm;
483 struct snd_pcm_runtime *runtime = substream->runtime;
484 int err;
485
486 epcm = kzalloc(sizeof(*epcm), GFP_KERNEL);
487
488 if (epcm == NULL)
489 return -ENOMEM;
490 epcm->emu = chip;
491 epcm->substream = substream;
492 epcm->channel_id=channel_id;
493
494 runtime->private_data = epcm;
495 runtime->private_free = snd_ca0106_pcm_free_substream;
496
497 runtime->hw = snd_ca0106_playback_hw;
498
499 channel->emu = chip;
500 channel->number = channel_id;
501
502 channel->use = 1;
503
504
505 channel->epcm = epcm;
506 if ((err = snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS)) < 0)
507 return err;
508 if ((err = snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_BYTES, 64)) < 0)
509 return err;
510 snd_pcm_set_sync(substream);
511
512 if (chip->details->spi_dac && channel_id != PCM_FRONT_CHANNEL) {
513 const int reg = spi_dacd_reg[channel_id];
514
515
516 chip->spi_dac_reg[reg] &= ~spi_dacd_bit[channel_id];
517 err = snd_ca0106_spi_write(chip, chip->spi_dac_reg[reg]);
518 if (err < 0)
519 return err;
520 }
521 return 0;
522}
523
524
525static int snd_ca0106_pcm_close_playback(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->playback_channels[epcm->channel_id].use = 0;
531
532 if (chip->details->spi_dac && epcm->channel_id != PCM_FRONT_CHANNEL) {
533 const int reg = spi_dacd_reg[epcm->channel_id];
534
535
536 chip->spi_dac_reg[reg] |= spi_dacd_bit[epcm->channel_id];
537 snd_ca0106_spi_write(chip, chip->spi_dac_reg[reg]);
538 }
539
540 return 0;
541}
542
543static int snd_ca0106_pcm_open_playback_front(struct snd_pcm_substream *substream)
544{
545 return snd_ca0106_pcm_open_playback_channel(substream, PCM_FRONT_CHANNEL);
546}
547
548static int snd_ca0106_pcm_open_playback_center_lfe(struct snd_pcm_substream *substream)
549{
550 return snd_ca0106_pcm_open_playback_channel(substream, PCM_CENTER_LFE_CHANNEL);
551}
552
553static int snd_ca0106_pcm_open_playback_unknown(struct snd_pcm_substream *substream)
554{
555 return snd_ca0106_pcm_open_playback_channel(substream, PCM_UNKNOWN_CHANNEL);
556}
557
558static int snd_ca0106_pcm_open_playback_rear(struct snd_pcm_substream *substream)
559{
560 return snd_ca0106_pcm_open_playback_channel(substream, PCM_REAR_CHANNEL);
561}
562
563
564static int snd_ca0106_pcm_open_capture_channel(struct snd_pcm_substream *substream,
565 int channel_id)
566{
567 struct snd_ca0106 *chip = snd_pcm_substream_chip(substream);
568 struct snd_ca0106_channel *channel = &(chip->capture_channels[channel_id]);
569 struct snd_ca0106_pcm *epcm;
570 struct snd_pcm_runtime *runtime = substream->runtime;
571 int err;
572
573 epcm = kzalloc(sizeof(*epcm), GFP_KERNEL);
574 if (epcm == NULL) {
575 snd_printk(KERN_ERR "open_capture_channel: failed epcm alloc\n");
576 return -ENOMEM;
577 }
578 epcm->emu = chip;
579 epcm->substream = substream;
580 epcm->channel_id=channel_id;
581
582 runtime->private_data = epcm;
583 runtime->private_free = snd_ca0106_pcm_free_substream;
584
585 runtime->hw = snd_ca0106_capture_hw;
586
587 channel->emu = chip;
588 channel->number = channel_id;
589
590 channel->use = 1;
591
592
593 channel->epcm = epcm;
594 if ((err = snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS)) < 0)
595 return err;
596
597 if ((err = snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_BYTES, 64)) < 0)
598 return err;
599 return 0;
600}
601
602
603static int snd_ca0106_pcm_close_capture(struct snd_pcm_substream *substream)
604{
605 struct snd_ca0106 *chip = snd_pcm_substream_chip(substream);
606 struct snd_pcm_runtime *runtime = substream->runtime;
607 struct snd_ca0106_pcm *epcm = runtime->private_data;
608 chip->capture_channels[epcm->channel_id].use = 0;
609
610 return 0;
611}
612
613static int snd_ca0106_pcm_open_0_capture(struct snd_pcm_substream *substream)
614{
615 return snd_ca0106_pcm_open_capture_channel(substream, 0);
616}
617
618static int snd_ca0106_pcm_open_1_capture(struct snd_pcm_substream *substream)
619{
620 return snd_ca0106_pcm_open_capture_channel(substream, 1);
621}
622
623static int snd_ca0106_pcm_open_2_capture(struct snd_pcm_substream *substream)
624{
625 return snd_ca0106_pcm_open_capture_channel(substream, 2);
626}
627
628static int snd_ca0106_pcm_open_3_capture(struct snd_pcm_substream *substream)
629{
630 return snd_ca0106_pcm_open_capture_channel(substream, 3);
631}
632
633
634static int snd_ca0106_pcm_hw_params_playback(struct snd_pcm_substream *substream,
635 struct snd_pcm_hw_params *hw_params)
636{
637 return snd_pcm_lib_malloc_pages(substream,
638 params_buffer_bytes(hw_params));
639}
640
641
642static int snd_ca0106_pcm_hw_free_playback(struct snd_pcm_substream *substream)
643{
644 return snd_pcm_lib_free_pages(substream);
645}
646
647
648static int snd_ca0106_pcm_hw_params_capture(struct snd_pcm_substream *substream,
649 struct snd_pcm_hw_params *hw_params)
650{
651 return snd_pcm_lib_malloc_pages(substream,
652 params_buffer_bytes(hw_params));
653}
654
655
656static int snd_ca0106_pcm_hw_free_capture(struct snd_pcm_substream *substream)
657{
658 return snd_pcm_lib_free_pages(substream);
659}
660
661
662static int snd_ca0106_pcm_prepare_playback(struct snd_pcm_substream *substream)
663{
664 struct snd_ca0106 *emu = snd_pcm_substream_chip(substream);
665 struct snd_pcm_runtime *runtime = substream->runtime;
666 struct snd_ca0106_pcm *epcm = runtime->private_data;
667 int channel = epcm->channel_id;
668 u32 *table_base = (u32 *)(emu->buffer.area+(8*16*channel));
669 u32 period_size_bytes = frames_to_bytes(runtime, runtime->period_size);
670 u32 hcfg_mask = HCFG_PLAYBACK_S32_LE;
671 u32 hcfg_set = 0x00000000;
672 u32 hcfg;
673 u32 reg40_mask = 0x30000 << (channel<<1);
674 u32 reg40_set = 0;
675 u32 reg40;
676
677 u32 reg71_mask = 0x03030000 ;
678 u32 reg71_set = 0;
679 u32 reg71;
680 int i;
681
682
683
684
685
686
687
688 switch (runtime->rate) {
689 case 44100:
690 reg40_set = 0x10000 << (channel<<1);
691 reg71_set = 0x01010000;
692 break;
693 case 48000:
694 reg40_set = 0;
695 reg71_set = 0;
696 break;
697 case 96000:
698 reg40_set = 0x20000 << (channel<<1);
699 reg71_set = 0x02020000;
700 break;
701 case 192000:
702 reg40_set = 0x30000 << (channel<<1);
703 reg71_set = 0x03030000;
704 break;
705 default:
706 reg40_set = 0;
707 reg71_set = 0;
708 break;
709 }
710
711
712 switch (runtime->format) {
713 case SNDRV_PCM_FORMAT_S16_LE:
714 hcfg_set = 0;
715 break;
716 case SNDRV_PCM_FORMAT_S32_LE:
717 hcfg_set = HCFG_PLAYBACK_S32_LE;
718 break;
719 default:
720 hcfg_set = 0;
721 break;
722 }
723 hcfg = inl(emu->port + HCFG) ;
724 hcfg = (hcfg & ~hcfg_mask) | hcfg_set;
725 outl(hcfg, emu->port + HCFG);
726 reg40 = snd_ca0106_ptr_read(emu, 0x40, 0);
727 reg40 = (reg40 & ~reg40_mask) | reg40_set;
728 snd_ca0106_ptr_write(emu, 0x40, 0, reg40);
729 reg71 = snd_ca0106_ptr_read(emu, 0x71, 0);
730 reg71 = (reg71 & ~reg71_mask) | reg71_set;
731 snd_ca0106_ptr_write(emu, 0x71, 0, reg71);
732
733
734 for(i=0; i < runtime->periods; i++) {
735 table_base[i*2] = runtime->dma_addr + (i * period_size_bytes);
736 table_base[i*2+1] = period_size_bytes << 16;
737 }
738
739 snd_ca0106_ptr_write(emu, PLAYBACK_LIST_ADDR, channel, emu->buffer.addr+(8*16*channel));
740 snd_ca0106_ptr_write(emu, PLAYBACK_LIST_SIZE, channel, (runtime->periods - 1) << 19);
741 snd_ca0106_ptr_write(emu, PLAYBACK_LIST_PTR, channel, 0);
742 snd_ca0106_ptr_write(emu, PLAYBACK_DMA_ADDR, channel, runtime->dma_addr);
743 snd_ca0106_ptr_write(emu, PLAYBACK_PERIOD_SIZE, channel, frames_to_bytes(runtime, runtime->period_size)<<16);
744
745 snd_ca0106_ptr_write(emu, PLAYBACK_PERIOD_SIZE, channel, 0);
746 snd_ca0106_ptr_write(emu, PLAYBACK_POINTER, channel, 0);
747 snd_ca0106_ptr_write(emu, 0x07, channel, 0x0);
748 snd_ca0106_ptr_write(emu, 0x08, channel, 0);
749 snd_ca0106_ptr_write(emu, PLAYBACK_MUTE, 0x0, 0x0);
750#if 0
751 snd_ca0106_ptr_write(emu, SPCS0, 0,
752 SPCS_CLKACCY_1000PPM | SPCS_SAMPLERATE_48 |
753 SPCS_CHANNELNUM_LEFT | SPCS_SOURCENUM_UNSPEC |
754 SPCS_GENERATIONSTATUS | 0x00001200 |
755 0x00000000 | SPCS_EMPHASIS_NONE | SPCS_COPYRIGHT );
756 }
757#endif
758
759 return 0;
760}
761
762
763static int snd_ca0106_pcm_prepare_capture(struct snd_pcm_substream *substream)
764{
765 struct snd_ca0106 *emu = snd_pcm_substream_chip(substream);
766 struct snd_pcm_runtime *runtime = substream->runtime;
767 struct snd_ca0106_pcm *epcm = runtime->private_data;
768 int channel = epcm->channel_id;
769 u32 hcfg_mask = HCFG_CAPTURE_S32_LE;
770 u32 hcfg_set = 0x00000000;
771 u32 hcfg;
772 u32 over_sampling=0x2;
773 u32 reg71_mask = 0x0000c000 ;
774 u32 reg71_set = 0;
775 u32 reg71;
776
777
778
779
780
781 switch (runtime->rate) {
782 case 44100:
783 reg71_set = 0x00004000;
784 break;
785 case 48000:
786 reg71_set = 0;
787 break;
788 case 96000:
789 reg71_set = 0x00008000;
790 over_sampling=0xa;
791 break;
792 case 192000:
793 reg71_set = 0x0000c000;
794 over_sampling=0xa;
795 break;
796 default:
797 reg71_set = 0;
798 break;
799 }
800
801
802 switch (runtime->format) {
803 case SNDRV_PCM_FORMAT_S16_LE:
804 hcfg_set = 0;
805 break;
806 case SNDRV_PCM_FORMAT_S32_LE:
807 hcfg_set = HCFG_CAPTURE_S32_LE;
808 break;
809 default:
810 hcfg_set = 0;
811 break;
812 }
813 hcfg = inl(emu->port + HCFG) ;
814 hcfg = (hcfg & ~hcfg_mask) | hcfg_set;
815 outl(hcfg, emu->port + HCFG);
816 reg71 = snd_ca0106_ptr_read(emu, 0x71, 0);
817 reg71 = (reg71 & ~reg71_mask) | reg71_set;
818 snd_ca0106_ptr_write(emu, 0x71, 0, reg71);
819 if (emu->details->i2c_adc == 1) {
820 snd_ca0106_i2c_write(emu, ADC_MASTER, over_sampling);
821 }
822
823
824
825 snd_ca0106_ptr_write(emu, 0x13, channel, 0);
826 snd_ca0106_ptr_write(emu, CAPTURE_DMA_ADDR, channel, runtime->dma_addr);
827 snd_ca0106_ptr_write(emu, CAPTURE_BUFFER_SIZE, channel, frames_to_bytes(runtime, runtime->buffer_size)<<16);
828 snd_ca0106_ptr_write(emu, CAPTURE_POINTER, channel, 0);
829
830 return 0;
831}
832
833
834static int snd_ca0106_pcm_trigger_playback(struct snd_pcm_substream *substream,
835 int cmd)
836{
837 struct snd_ca0106 *emu = snd_pcm_substream_chip(substream);
838 struct snd_pcm_runtime *runtime;
839 struct snd_ca0106_pcm *epcm;
840 int channel;
841 int result = 0;
842 struct snd_pcm_substream *s;
843 u32 basic = 0;
844 u32 extended = 0;
845 int running=0;
846
847 switch (cmd) {
848 case SNDRV_PCM_TRIGGER_START:
849 running=1;
850 break;
851 case SNDRV_PCM_TRIGGER_STOP:
852 default:
853 running=0;
854 break;
855 }
856 snd_pcm_group_for_each_entry(s, substream) {
857 if (snd_pcm_substream_chip(s) != emu ||
858 s->stream != SNDRV_PCM_STREAM_PLAYBACK)
859 continue;
860 runtime = s->runtime;
861 epcm = runtime->private_data;
862 channel = epcm->channel_id;
863
864 epcm->running = running;
865 basic |= (0x1<<channel);
866 extended |= (0x10<<channel);
867 snd_pcm_trigger_done(s, substream);
868 }
869
870
871 switch (cmd) {
872 case SNDRV_PCM_TRIGGER_START:
873 snd_ca0106_ptr_write(emu, EXTENDED_INT_MASK, 0, snd_ca0106_ptr_read(emu, EXTENDED_INT_MASK, 0) | (extended));
874 snd_ca0106_ptr_write(emu, BASIC_INTERRUPT, 0, snd_ca0106_ptr_read(emu, BASIC_INTERRUPT, 0)|(basic));
875 break;
876 case SNDRV_PCM_TRIGGER_STOP:
877 snd_ca0106_ptr_write(emu, BASIC_INTERRUPT, 0, snd_ca0106_ptr_read(emu, BASIC_INTERRUPT, 0) & ~(basic));
878 snd_ca0106_ptr_write(emu, EXTENDED_INT_MASK, 0, snd_ca0106_ptr_read(emu, EXTENDED_INT_MASK, 0) & ~(extended));
879 break;
880 default:
881 result = -EINVAL;
882 break;
883 }
884 return result;
885}
886
887
888static int snd_ca0106_pcm_trigger_capture(struct snd_pcm_substream *substream,
889 int cmd)
890{
891 struct snd_ca0106 *emu = snd_pcm_substream_chip(substream);
892 struct snd_pcm_runtime *runtime = substream->runtime;
893 struct snd_ca0106_pcm *epcm = runtime->private_data;
894 int channel = epcm->channel_id;
895 int result = 0;
896
897 switch (cmd) {
898 case SNDRV_PCM_TRIGGER_START:
899 snd_ca0106_ptr_write(emu, EXTENDED_INT_MASK, 0, snd_ca0106_ptr_read(emu, EXTENDED_INT_MASK, 0) | (0x110000<<channel));
900 snd_ca0106_ptr_write(emu, BASIC_INTERRUPT, 0, snd_ca0106_ptr_read(emu, BASIC_INTERRUPT, 0)|(0x100<<channel));
901 epcm->running = 1;
902 break;
903 case SNDRV_PCM_TRIGGER_STOP:
904 snd_ca0106_ptr_write(emu, BASIC_INTERRUPT, 0, snd_ca0106_ptr_read(emu, BASIC_INTERRUPT, 0) & ~(0x100<<channel));
905 snd_ca0106_ptr_write(emu, EXTENDED_INT_MASK, 0, snd_ca0106_ptr_read(emu, EXTENDED_INT_MASK, 0) & ~(0x110000<<channel));
906 epcm->running = 0;
907 break;
908 default:
909 result = -EINVAL;
910 break;
911 }
912 return result;
913}
914
915
916static snd_pcm_uframes_t
917snd_ca0106_pcm_pointer_playback(struct snd_pcm_substream *substream)
918{
919 struct snd_ca0106 *emu = snd_pcm_substream_chip(substream);
920 struct snd_pcm_runtime *runtime = substream->runtime;
921 struct snd_ca0106_pcm *epcm = runtime->private_data;
922 snd_pcm_uframes_t ptr, ptr1, ptr2,ptr3,ptr4 = 0;
923 int channel = epcm->channel_id;
924
925 if (!epcm->running)
926 return 0;
927
928 ptr3 = snd_ca0106_ptr_read(emu, PLAYBACK_LIST_PTR, channel);
929 ptr1 = snd_ca0106_ptr_read(emu, PLAYBACK_POINTER, channel);
930 ptr4 = snd_ca0106_ptr_read(emu, PLAYBACK_LIST_PTR, channel);
931 if (ptr3 != ptr4) ptr1 = snd_ca0106_ptr_read(emu, PLAYBACK_POINTER, channel);
932 ptr2 = bytes_to_frames(runtime, ptr1);
933 ptr2+= (ptr4 >> 3) * runtime->period_size;
934 ptr=ptr2;
935 if (ptr >= runtime->buffer_size)
936 ptr -= runtime->buffer_size;
937
938
939 return ptr;
940}
941
942
943static snd_pcm_uframes_t
944snd_ca0106_pcm_pointer_capture(struct snd_pcm_substream *substream)
945{
946 struct snd_ca0106 *emu = snd_pcm_substream_chip(substream);
947 struct snd_pcm_runtime *runtime = substream->runtime;
948 struct snd_ca0106_pcm *epcm = runtime->private_data;
949 snd_pcm_uframes_t ptr, ptr1, ptr2 = 0;
950 int channel = channel=epcm->channel_id;
951
952 if (!epcm->running)
953 return 0;
954
955 ptr1 = snd_ca0106_ptr_read(emu, CAPTURE_POINTER, channel);
956 ptr2 = bytes_to_frames(runtime, ptr1);
957 ptr=ptr2;
958 if (ptr >= runtime->buffer_size)
959 ptr -= runtime->buffer_size;
960
961
962 return ptr;
963}
964
965
966static struct snd_pcm_ops snd_ca0106_playback_front_ops = {
967 .open = snd_ca0106_pcm_open_playback_front,
968 .close = snd_ca0106_pcm_close_playback,
969 .ioctl = snd_pcm_lib_ioctl,
970 .hw_params = snd_ca0106_pcm_hw_params_playback,
971 .hw_free = snd_ca0106_pcm_hw_free_playback,
972 .prepare = snd_ca0106_pcm_prepare_playback,
973 .trigger = snd_ca0106_pcm_trigger_playback,
974 .pointer = snd_ca0106_pcm_pointer_playback,
975};
976
977static struct snd_pcm_ops snd_ca0106_capture_0_ops = {
978 .open = snd_ca0106_pcm_open_0_capture,
979 .close = snd_ca0106_pcm_close_capture,
980 .ioctl = snd_pcm_lib_ioctl,
981 .hw_params = snd_ca0106_pcm_hw_params_capture,
982 .hw_free = snd_ca0106_pcm_hw_free_capture,
983 .prepare = snd_ca0106_pcm_prepare_capture,
984 .trigger = snd_ca0106_pcm_trigger_capture,
985 .pointer = snd_ca0106_pcm_pointer_capture,
986};
987
988static struct snd_pcm_ops snd_ca0106_capture_1_ops = {
989 .open = snd_ca0106_pcm_open_1_capture,
990 .close = snd_ca0106_pcm_close_capture,
991 .ioctl = snd_pcm_lib_ioctl,
992 .hw_params = snd_ca0106_pcm_hw_params_capture,
993 .hw_free = snd_ca0106_pcm_hw_free_capture,
994 .prepare = snd_ca0106_pcm_prepare_capture,
995 .trigger = snd_ca0106_pcm_trigger_capture,
996 .pointer = snd_ca0106_pcm_pointer_capture,
997};
998
999static struct snd_pcm_ops snd_ca0106_capture_2_ops = {
1000 .open = snd_ca0106_pcm_open_2_capture,
1001 .close = snd_ca0106_pcm_close_capture,
1002 .ioctl = snd_pcm_lib_ioctl,
1003 .hw_params = snd_ca0106_pcm_hw_params_capture,
1004 .hw_free = snd_ca0106_pcm_hw_free_capture,
1005 .prepare = snd_ca0106_pcm_prepare_capture,
1006 .trigger = snd_ca0106_pcm_trigger_capture,
1007 .pointer = snd_ca0106_pcm_pointer_capture,
1008};
1009
1010static struct snd_pcm_ops snd_ca0106_capture_3_ops = {
1011 .open = snd_ca0106_pcm_open_3_capture,
1012 .close = snd_ca0106_pcm_close_capture,
1013 .ioctl = snd_pcm_lib_ioctl,
1014 .hw_params = snd_ca0106_pcm_hw_params_capture,
1015 .hw_free = snd_ca0106_pcm_hw_free_capture,
1016 .prepare = snd_ca0106_pcm_prepare_capture,
1017 .trigger = snd_ca0106_pcm_trigger_capture,
1018 .pointer = snd_ca0106_pcm_pointer_capture,
1019};
1020
1021static struct snd_pcm_ops snd_ca0106_playback_center_lfe_ops = {
1022 .open = snd_ca0106_pcm_open_playback_center_lfe,
1023 .close = snd_ca0106_pcm_close_playback,
1024 .ioctl = snd_pcm_lib_ioctl,
1025 .hw_params = snd_ca0106_pcm_hw_params_playback,
1026 .hw_free = snd_ca0106_pcm_hw_free_playback,
1027 .prepare = snd_ca0106_pcm_prepare_playback,
1028 .trigger = snd_ca0106_pcm_trigger_playback,
1029 .pointer = snd_ca0106_pcm_pointer_playback,
1030};
1031
1032static struct snd_pcm_ops snd_ca0106_playback_unknown_ops = {
1033 .open = snd_ca0106_pcm_open_playback_unknown,
1034 .close = snd_ca0106_pcm_close_playback,
1035 .ioctl = snd_pcm_lib_ioctl,
1036 .hw_params = snd_ca0106_pcm_hw_params_playback,
1037 .hw_free = snd_ca0106_pcm_hw_free_playback,
1038 .prepare = snd_ca0106_pcm_prepare_playback,
1039 .trigger = snd_ca0106_pcm_trigger_playback,
1040 .pointer = snd_ca0106_pcm_pointer_playback,
1041};
1042
1043static struct snd_pcm_ops snd_ca0106_playback_rear_ops = {
1044 .open = snd_ca0106_pcm_open_playback_rear,
1045 .close = snd_ca0106_pcm_close_playback,
1046 .ioctl = snd_pcm_lib_ioctl,
1047 .hw_params = snd_ca0106_pcm_hw_params_playback,
1048 .hw_free = snd_ca0106_pcm_hw_free_playback,
1049 .prepare = snd_ca0106_pcm_prepare_playback,
1050 .trigger = snd_ca0106_pcm_trigger_playback,
1051 .pointer = snd_ca0106_pcm_pointer_playback,
1052};
1053
1054
1055static unsigned short snd_ca0106_ac97_read(struct snd_ac97 *ac97,
1056 unsigned short reg)
1057{
1058 struct snd_ca0106 *emu = ac97->private_data;
1059 unsigned long flags;
1060 unsigned short val;
1061
1062 spin_lock_irqsave(&emu->emu_lock, flags);
1063 outb(reg, emu->port + AC97ADDRESS);
1064 val = inw(emu->port + AC97DATA);
1065 spin_unlock_irqrestore(&emu->emu_lock, flags);
1066 return val;
1067}
1068
1069static void snd_ca0106_ac97_write(struct snd_ac97 *ac97,
1070 unsigned short reg, unsigned short val)
1071{
1072 struct snd_ca0106 *emu = ac97->private_data;
1073 unsigned long flags;
1074
1075 spin_lock_irqsave(&emu->emu_lock, flags);
1076 outb(reg, emu->port + AC97ADDRESS);
1077 outw(val, emu->port + AC97DATA);
1078 spin_unlock_irqrestore(&emu->emu_lock, flags);
1079}
1080
1081static int snd_ca0106_ac97(struct snd_ca0106 *chip)
1082{
1083 struct snd_ac97_bus *pbus;
1084 struct snd_ac97_template ac97;
1085 int err;
1086 static struct snd_ac97_bus_ops ops = {
1087 .write = snd_ca0106_ac97_write,
1088 .read = snd_ca0106_ac97_read,
1089 };
1090
1091 if ((err = snd_ac97_bus(chip->card, 0, &ops, NULL, &pbus)) < 0)
1092 return err;
1093 pbus->no_vra = 1;
1094
1095 memset(&ac97, 0, sizeof(ac97));
1096 ac97.private_data = chip;
1097 ac97.scaps = AC97_SCAP_NO_SPDIF;
1098 return snd_ac97_mixer(pbus, &ac97, &chip->ac97);
1099}
1100
1101static int snd_ca0106_free(struct snd_ca0106 *chip)
1102{
1103 if (chip->res_port != NULL) {
1104
1105 snd_ca0106_ptr_write(chip, BASIC_INTERRUPT, 0, 0);
1106 outl(0, chip->port + INTE);
1107 snd_ca0106_ptr_write(chip, EXTENDED_INT_MASK, 0, 0);
1108 udelay(1000);
1109
1110
1111 outl(0, chip->port + HCFG);
1112
1113
1114
1115
1116 }
1117 if (chip->irq >= 0)
1118 free_irq(chip->irq, chip);
1119
1120#if 1
1121 if (chip->buffer.area)
1122 snd_dma_free_pages(&chip->buffer);
1123#endif
1124
1125
1126 release_and_free_resource(chip->res_port);
1127
1128 pci_disable_device(chip->pci);
1129 kfree(chip);
1130 return 0;
1131}
1132
1133static int snd_ca0106_dev_free(struct snd_device *device)
1134{
1135 struct snd_ca0106 *chip = device->device_data;
1136 return snd_ca0106_free(chip);
1137}
1138
1139static irqreturn_t snd_ca0106_interrupt(int irq, void *dev_id)
1140{
1141 unsigned int status;
1142
1143 struct snd_ca0106 *chip = dev_id;
1144 int i;
1145 int mask;
1146 unsigned int stat76;
1147 struct snd_ca0106_channel *pchannel;
1148
1149 status = inl(chip->port + IPR);
1150 if (! status)
1151 return IRQ_NONE;
1152
1153 stat76 = snd_ca0106_ptr_read(chip, EXTENDED_INT, 0);
1154
1155
1156 mask = 0x11;
1157 for(i = 0; i < 4; i++) {
1158 pchannel = &(chip->playback_channels[i]);
1159 if (stat76 & mask) {
1160
1161 if(pchannel->use) {
1162 snd_pcm_period_elapsed(pchannel->epcm->substream);
1163
1164 }
1165 }
1166
1167
1168 mask <<= 1;
1169 }
1170 mask = 0x110000;
1171 for(i = 0; i < 4; i++) {
1172 pchannel = &(chip->capture_channels[i]);
1173 if (stat76 & mask) {
1174
1175 if(pchannel->use) {
1176 snd_pcm_period_elapsed(pchannel->epcm->substream);
1177
1178 }
1179 }
1180
1181
1182 mask <<= 1;
1183 }
1184
1185 snd_ca0106_ptr_write(chip, EXTENDED_INT, 0, stat76);
1186
1187 if (chip->midi.dev_id &&
1188 (status & (chip->midi.ipr_tx|chip->midi.ipr_rx))) {
1189 if (chip->midi.interrupt)
1190 chip->midi.interrupt(&chip->midi, status);
1191 else
1192 chip->midi.interrupt_disable(&chip->midi, chip->midi.tx_enable | chip->midi.rx_enable);
1193 }
1194
1195
1196 outl(status, chip->port+IPR);
1197
1198 return IRQ_HANDLED;
1199}
1200
1201static int __devinit snd_ca0106_pcm(struct snd_ca0106 *emu, int device, struct snd_pcm **rpcm)
1202{
1203 struct snd_pcm *pcm;
1204 struct snd_pcm_substream *substream;
1205 int err;
1206
1207 if (rpcm)
1208 *rpcm = NULL;
1209 if ((err = snd_pcm_new(emu->card, "ca0106", device, 1, 1, &pcm)) < 0)
1210 return err;
1211
1212 pcm->private_data = emu;
1213
1214 switch (device) {
1215 case 0:
1216 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_ca0106_playback_front_ops);
1217 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_ca0106_capture_0_ops);
1218 break;
1219 case 1:
1220 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_ca0106_playback_rear_ops);
1221 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_ca0106_capture_1_ops);
1222 break;
1223 case 2:
1224 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_ca0106_playback_center_lfe_ops);
1225 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_ca0106_capture_2_ops);
1226 break;
1227 case 3:
1228 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_ca0106_playback_unknown_ops);
1229 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_ca0106_capture_3_ops);
1230 break;
1231 }
1232
1233 pcm->info_flags = 0;
1234 pcm->dev_subclass = SNDRV_PCM_SUBCLASS_GENERIC_MIX;
1235 strcpy(pcm->name, "CA0106");
1236 emu->pcm = pcm;
1237
1238 for(substream = pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream;
1239 substream;
1240 substream = substream->next) {
1241 if ((err = snd_pcm_lib_preallocate_pages(substream,
1242 SNDRV_DMA_TYPE_DEV,
1243 snd_dma_pci_data(emu->pci),
1244 64*1024, 64*1024)) < 0)
1245 return err;
1246 }
1247
1248 for (substream = pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream;
1249 substream;
1250 substream = substream->next) {
1251 if ((err = snd_pcm_lib_preallocate_pages(substream,
1252 SNDRV_DMA_TYPE_DEV,
1253 snd_dma_pci_data(emu->pci),
1254 64*1024, 64*1024)) < 0)
1255 return err;
1256 }
1257
1258 if (rpcm)
1259 *rpcm = pcm;
1260
1261 return 0;
1262}
1263
1264#define SPI_REG(reg, value) (((reg) << SPI_REG_SHIFT) | (value))
1265static unsigned int spi_dac_init[] = {
1266 SPI_REG(SPI_LDA1_REG, SPI_DA_BIT_0dB),
1267 SPI_REG(SPI_RDA1_REG, SPI_DA_BIT_0dB),
1268 SPI_REG(SPI_PL_REG, SPI_PL_BIT_L_L | SPI_PL_BIT_R_R | SPI_IZD_BIT),
1269 SPI_REG(SPI_FMT_REG, SPI_FMT_BIT_I2S | SPI_IWL_BIT_24),
1270 SPI_REG(SPI_LDA2_REG, SPI_DA_BIT_0dB),
1271 SPI_REG(SPI_RDA2_REG, SPI_DA_BIT_0dB),
1272 SPI_REG(SPI_LDA3_REG, SPI_DA_BIT_0dB),
1273 SPI_REG(SPI_RDA3_REG, SPI_DA_BIT_0dB),
1274 SPI_REG(SPI_MASTDA_REG, SPI_DA_BIT_0dB),
1275 SPI_REG(9, 0x00),
1276 SPI_REG(SPI_MS_REG, SPI_DACD0_BIT | SPI_DACD1_BIT | SPI_DACD2_BIT),
1277 SPI_REG(12, 0x00),
1278 SPI_REG(SPI_LDA4_REG, SPI_DA_BIT_0dB),
1279 SPI_REG(SPI_RDA4_REG, SPI_DA_BIT_0dB | SPI_DA_BIT_UPDATE),
1280 SPI_REG(SPI_DACD4_REG, 0x00),
1281};
1282
1283static unsigned int i2c_adc_init[][2] = {
1284 { 0x17, 0x00 },
1285 { 0x07, 0x00 },
1286 { 0x0b, 0x22 },
1287 { 0x0c, 0x22 },
1288 { 0x0d, 0x08 },
1289 { 0x0e, 0xcf },
1290 { 0x0f, 0xcf },
1291 { 0x10, 0x7b },
1292 { 0x11, 0x00 },
1293 { 0x12, 0x32 },
1294 { 0x13, 0x00 },
1295 { 0x14, 0xa6 },
1296 { 0x15, ADC_MUX_LINEIN },
1297};
1298
1299static int __devinit snd_ca0106_create(int dev, struct snd_card *card,
1300 struct pci_dev *pci,
1301 struct snd_ca0106 **rchip)
1302{
1303 struct snd_ca0106 *chip;
1304 struct snd_ca0106_details *c;
1305 int err;
1306 int ch;
1307 static struct snd_device_ops ops = {
1308 .dev_free = snd_ca0106_dev_free,
1309 };
1310
1311 *rchip = NULL;
1312
1313 if ((err = pci_enable_device(pci)) < 0)
1314 return err;
1315 if (pci_set_dma_mask(pci, DMA_32BIT_MASK) < 0 ||
1316 pci_set_consistent_dma_mask(pci, DMA_32BIT_MASK) < 0) {
1317 printk(KERN_ERR "error to set 32bit mask DMA\n");
1318 pci_disable_device(pci);
1319 return -ENXIO;
1320 }
1321
1322 chip = kzalloc(sizeof(*chip), GFP_KERNEL);
1323 if (chip == NULL) {
1324 pci_disable_device(pci);
1325 return -ENOMEM;
1326 }
1327
1328 chip->card = card;
1329 chip->pci = pci;
1330 chip->irq = -1;
1331
1332 spin_lock_init(&chip->emu_lock);
1333
1334 chip->port = pci_resource_start(pci, 0);
1335 if ((chip->res_port = request_region(chip->port, 0x20,
1336 "snd_ca0106")) == NULL) {
1337 snd_ca0106_free(chip);
1338 printk(KERN_ERR "cannot allocate the port\n");
1339 return -EBUSY;
1340 }
1341
1342 if (request_irq(pci->irq, snd_ca0106_interrupt,
1343 IRQF_SHARED, "snd_ca0106", chip)) {
1344 snd_ca0106_free(chip);
1345 printk(KERN_ERR "cannot grab irq\n");
1346 return -EBUSY;
1347 }
1348 chip->irq = pci->irq;
1349
1350
1351 if(snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, snd_dma_pci_data(pci), 1024, &chip->buffer) < 0) {
1352 snd_ca0106_free(chip);
1353 return -ENOMEM;
1354 }
1355
1356 pci_set_master(pci);
1357
1358 pci_read_config_dword(pci, PCI_SUBSYSTEM_VENDOR_ID, &chip->serial);
1359 pci_read_config_word(pci, PCI_SUBSYSTEM_ID, &chip->model);
1360#if 1
1361 printk(KERN_INFO "snd-ca0106: Model %04x Rev %08x Serial %08x\n", chip->model,
1362 pci->revision, chip->serial);
1363#endif
1364 strcpy(card->driver, "CA0106");
1365 strcpy(card->shortname, "CA0106");
1366
1367 for (c = ca0106_chip_details; c->serial; c++) {
1368 if (subsystem[dev]) {
1369 if (c->serial == subsystem[dev])
1370 break;
1371 } else if (c->serial == chip->serial)
1372 break;
1373 }
1374 chip->details = c;
1375 if (subsystem[dev]) {
1376 printk(KERN_INFO "snd-ca0106: Sound card name=%s, subsystem=0x%x. Forced to subsystem=0x%x\n",
1377 c->name, chip->serial, subsystem[dev]);
1378 }
1379
1380 sprintf(card->longname, "%s at 0x%lx irq %i",
1381 c->name, chip->port, chip->irq);
1382
1383 outl(0, chip->port + INTE);
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399 snd_ca0106_ptr_write(chip, SPCS0, 0,
1400 chip->spdif_bits[0] =
1401 SPCS_CLKACCY_1000PPM | SPCS_SAMPLERATE_48 |
1402 SPCS_CHANNELNUM_LEFT | SPCS_SOURCENUM_UNSPEC |
1403 SPCS_GENERATIONSTATUS | 0x00001200 |
1404 0x00000000 | SPCS_EMPHASIS_NONE | SPCS_COPYRIGHT);
1405
1406 snd_ca0106_ptr_write(chip, SPCS1, 0,
1407 chip->spdif_bits[1] =
1408 SPCS_CLKACCY_1000PPM | SPCS_SAMPLERATE_48 |
1409 SPCS_CHANNELNUM_LEFT | SPCS_SOURCENUM_UNSPEC |
1410 SPCS_GENERATIONSTATUS | 0x00001200 |
1411 0x00000000 | SPCS_EMPHASIS_NONE | SPCS_COPYRIGHT);
1412 snd_ca0106_ptr_write(chip, SPCS2, 0,
1413 chip->spdif_bits[2] =
1414 SPCS_CLKACCY_1000PPM | SPCS_SAMPLERATE_48 |
1415 SPCS_CHANNELNUM_LEFT | SPCS_SOURCENUM_UNSPEC |
1416 SPCS_GENERATIONSTATUS | 0x00001200 |
1417 0x00000000 | SPCS_EMPHASIS_NONE | SPCS_COPYRIGHT);
1418 snd_ca0106_ptr_write(chip, SPCS3, 0,
1419 chip->spdif_bits[3] =
1420 SPCS_CLKACCY_1000PPM | SPCS_SAMPLERATE_48 |
1421 SPCS_CHANNELNUM_LEFT | SPCS_SOURCENUM_UNSPEC |
1422 SPCS_GENERATIONSTATUS | 0x00001200 |
1423 0x00000000 | SPCS_EMPHASIS_NONE | SPCS_COPYRIGHT);
1424
1425 snd_ca0106_ptr_write(chip, PLAYBACK_MUTE, 0, 0x00fc0000);
1426 snd_ca0106_ptr_write(chip, CAPTURE_MUTE, 0, 0x00fc0000);
1427
1428
1429 outb(AC97_REC_GAIN, chip->port + AC97ADDRESS);
1430 outw(0x8000, chip->port + AC97DATA);
1431#if 0
1432 snd_ca0106_ptr_write(chip, SPCS0, 0, 0x2108006);
1433 snd_ca0106_ptr_write(chip, 0x42, 0, 0x2108006);
1434 snd_ca0106_ptr_write(chip, 0x43, 0, 0x2108006);
1435 snd_ca0106_ptr_write(chip, 0x44, 0, 0x2108006);
1436#endif
1437
1438
1439
1440 snd_ca0106_ptr_write(chip, SPDIF_SELECT1, 0, 0xf);
1441 snd_ca0106_ptr_write(chip, SPDIF_SELECT2, 0, 0x000f0000);
1442 chip->spdif_enable = 0;
1443
1444
1445
1446 snd_ca0106_ptr_write(chip, CAPTURE_CONTROL, 0, 0x40c81000);
1447 snd_ca0106_ptr_write(chip, CAPTURE_CONTROL, 1, 0xffffffff);
1448 snd_ca0106_ptr_write(chip, CAPTURE_CONTROL, 2, 0x30300000);
1449 snd_ca0106_ptr_write(chip, CAPTURE_CONTROL, 3, 0x00700000);
1450 snd_ca0106_ptr_write(chip, PLAYBACK_ROUTING1, 0, 0x32765410);
1451 snd_ca0106_ptr_write(chip, PLAYBACK_ROUTING2, 0, 0x76767676);
1452 snd_ca0106_ptr_write(chip, CAPTURE_ROUTING1, 0, 0x32765410);
1453 snd_ca0106_ptr_write(chip, CAPTURE_ROUTING2, 0, 0x76767676);
1454 for(ch = 0; ch < 4; ch++) {
1455 snd_ca0106_ptr_write(chip, CAPTURE_VOLUME1, ch, 0x30303030);
1456 snd_ca0106_ptr_write(chip, CAPTURE_VOLUME2, ch, 0x30303030);
1457
1458
1459 snd_ca0106_ptr_write(chip, PLAYBACK_VOLUME1, ch, 0xffffffff);
1460 snd_ca0106_ptr_write(chip, PLAYBACK_VOLUME2, ch, 0xffffffff);
1461 }
1462 if (chip->details->i2c_adc == 1) {
1463
1464 snd_ca0106_ptr_write(chip, CAPTURE_SOURCE, 0x0, 0x333300e4);
1465
1466 chip->capture_source = 3;
1467 } else if (chip->details->ac97 == 1) {
1468
1469 snd_ca0106_ptr_write(chip, CAPTURE_SOURCE, 0x0, 0x444400e4);
1470
1471 chip->capture_source = 4;
1472 } else {
1473
1474 snd_ca0106_ptr_write(chip, CAPTURE_SOURCE, 0x0, 0x333300e4);
1475
1476 chip->capture_source = 3;
1477 }
1478
1479 if (chip->details->gpio_type == 2) {
1480
1481 outl(0x0, chip->port+GPIO);
1482
1483 outl(0x005f5301, chip->port+GPIO);
1484 } else if (chip->details->gpio_type == 1) {
1485
1486 outl(0x0, chip->port+GPIO);
1487
1488 outl(0x005f5301, chip->port+GPIO);
1489 } else {
1490 outl(0x0, chip->port+GPIO);
1491 outl(0x005f03a3, chip->port+GPIO);
1492
1493 }
1494 snd_ca0106_intr_enable(chip, 0x105);
1495
1496
1497
1498
1499 outl(HCFG_AC97 | HCFG_AUDIOENABLE, chip->port+HCFG);
1500
1501 if (chip->details->i2c_adc == 1) {
1502 int size, n;
1503
1504 size = ARRAY_SIZE(i2c_adc_init);
1505
1506 for (n=0; n < size; n++) {
1507 snd_ca0106_i2c_write(chip, i2c_adc_init[n][0], i2c_adc_init[n][1]);
1508 }
1509 for (n=0; n < 4; n++) {
1510 chip->i2c_capture_volume[n][0]= 0xcf;
1511 chip->i2c_capture_volume[n][1]= 0xcf;
1512 }
1513 chip->i2c_capture_source=2;
1514
1515 }
1516 if (chip->details->spi_dac == 1) {
1517 int size, n;
1518
1519 size = ARRAY_SIZE(spi_dac_init);
1520 for (n = 0; n < size; n++) {
1521 int reg = spi_dac_init[n] >> SPI_REG_SHIFT;
1522
1523 snd_ca0106_spi_write(chip, spi_dac_init[n]);
1524 if (reg < ARRAY_SIZE(chip->spi_dac_reg))
1525 chip->spi_dac_reg[reg] = spi_dac_init[n];
1526 }
1527 }
1528
1529 if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL,
1530 chip, &ops)) < 0) {
1531 snd_ca0106_free(chip);
1532 return err;
1533 }
1534 *rchip = chip;
1535 return 0;
1536}
1537
1538
1539static void ca0106_midi_interrupt_enable(struct snd_ca_midi *midi, int intr)
1540{
1541 snd_ca0106_intr_enable((struct snd_ca0106 *)(midi->dev_id), intr);
1542}
1543
1544static void ca0106_midi_interrupt_disable(struct snd_ca_midi *midi, int intr)
1545{
1546 snd_ca0106_intr_disable((struct snd_ca0106 *)(midi->dev_id), intr);
1547}
1548
1549static unsigned char ca0106_midi_read(struct snd_ca_midi *midi, int idx)
1550{
1551 return (unsigned char)snd_ca0106_ptr_read((struct snd_ca0106 *)(midi->dev_id),
1552 midi->port + idx, 0);
1553}
1554
1555static void ca0106_midi_write(struct snd_ca_midi *midi, int data, int idx)
1556{
1557 snd_ca0106_ptr_write((struct snd_ca0106 *)(midi->dev_id), midi->port + idx, 0, data);
1558}
1559
1560static struct snd_card *ca0106_dev_id_card(void *dev_id)
1561{
1562 return ((struct snd_ca0106 *)dev_id)->card;
1563}
1564
1565static int ca0106_dev_id_port(void *dev_id)
1566{
1567 return ((struct snd_ca0106 *)dev_id)->port;
1568}
1569
1570static int __devinit snd_ca0106_midi(struct snd_ca0106 *chip, unsigned int channel)
1571{
1572 struct snd_ca_midi *midi;
1573 char *name;
1574 int err;
1575
1576 if (channel == CA0106_MIDI_CHAN_B) {
1577 name = "CA0106 MPU-401 (UART) B";
1578 midi = &chip->midi2;
1579 midi->tx_enable = INTE_MIDI_TX_B;
1580 midi->rx_enable = INTE_MIDI_RX_B;
1581 midi->ipr_tx = IPR_MIDI_TX_B;
1582 midi->ipr_rx = IPR_MIDI_RX_B;
1583 midi->port = MIDI_UART_B_DATA;
1584 } else {
1585 name = "CA0106 MPU-401 (UART)";
1586 midi = &chip->midi;
1587 midi->tx_enable = INTE_MIDI_TX_A;
1588 midi->rx_enable = INTE_MIDI_TX_B;
1589 midi->ipr_tx = IPR_MIDI_TX_A;
1590 midi->ipr_rx = IPR_MIDI_RX_A;
1591 midi->port = MIDI_UART_A_DATA;
1592 }
1593
1594 midi->reset = CA0106_MPU401_RESET;
1595 midi->enter_uart = CA0106_MPU401_ENTER_UART;
1596 midi->ack = CA0106_MPU401_ACK;
1597
1598 midi->input_avail = CA0106_MIDI_INPUT_AVAIL;
1599 midi->output_ready = CA0106_MIDI_OUTPUT_READY;
1600
1601 midi->channel = channel;
1602
1603 midi->interrupt_enable = ca0106_midi_interrupt_enable;
1604 midi->interrupt_disable = ca0106_midi_interrupt_disable;
1605
1606 midi->read = ca0106_midi_read;
1607 midi->write = ca0106_midi_write;
1608
1609 midi->get_dev_id_card = ca0106_dev_id_card;
1610 midi->get_dev_id_port = ca0106_dev_id_port;
1611
1612 midi->dev_id = chip;
1613
1614 if ((err = ca_midi_init(chip, midi, 0, name)) < 0)
1615 return err;
1616
1617 return 0;
1618}
1619
1620
1621static int __devinit snd_ca0106_probe(struct pci_dev *pci,
1622 const struct pci_device_id *pci_id)
1623{
1624 static int dev;
1625 struct snd_card *card;
1626 struct snd_ca0106 *chip;
1627 int err;
1628
1629 if (dev >= SNDRV_CARDS)
1630 return -ENODEV;
1631 if (!enable[dev]) {
1632 dev++;
1633 return -ENOENT;
1634 }
1635
1636 card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0);
1637 if (card == NULL)
1638 return -ENOMEM;
1639
1640 if ((err = snd_ca0106_create(dev, card, pci, &chip)) < 0) {
1641 snd_card_free(card);
1642 return err;
1643 }
1644
1645 if ((err = snd_ca0106_pcm(chip, 0, NULL)) < 0) {
1646 snd_card_free(card);
1647 return err;
1648 }
1649 if ((err = snd_ca0106_pcm(chip, 1, NULL)) < 0) {
1650 snd_card_free(card);
1651 return err;
1652 }
1653 if ((err = snd_ca0106_pcm(chip, 2, NULL)) < 0) {
1654 snd_card_free(card);
1655 return err;
1656 }
1657 if ((err = snd_ca0106_pcm(chip, 3, NULL)) < 0) {
1658 snd_card_free(card);
1659 return err;
1660 }
1661 if (chip->details->ac97 == 1) {
1662 if ((err = snd_ca0106_ac97(chip)) < 0) {
1663 snd_card_free(card);
1664 return err;
1665 }
1666 }
1667 if ((err = snd_ca0106_mixer(chip)) < 0) {
1668 snd_card_free(card);
1669 return err;
1670 }
1671
1672 snd_printdd("ca0106: probe for MIDI channel A ...");
1673 if ((err = snd_ca0106_midi(chip,CA0106_MIDI_CHAN_A)) < 0) {
1674 snd_card_free(card);
1675 snd_printdd(" failed, err=0x%x\n",err);
1676 return err;
1677 }
1678 snd_printdd(" done.\n");
1679
1680#ifdef CONFIG_PROC_FS
1681 snd_ca0106_proc_init(chip);
1682#endif
1683
1684 snd_card_set_dev(card, &pci->dev);
1685
1686 if ((err = snd_card_register(card)) < 0) {
1687 snd_card_free(card);
1688 return err;
1689 }
1690
1691 pci_set_drvdata(pci, card);
1692 dev++;
1693 return 0;
1694}
1695
1696static void __devexit snd_ca0106_remove(struct pci_dev *pci)
1697{
1698 snd_card_free(pci_get_drvdata(pci));
1699 pci_set_drvdata(pci, NULL);
1700}
1701
1702
1703static struct pci_device_id snd_ca0106_ids[] = {
1704 { 0x1102, 0x0007, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
1705 { 0, }
1706};
1707MODULE_DEVICE_TABLE(pci, snd_ca0106_ids);
1708
1709
1710static struct pci_driver driver = {
1711 .name = "CA0106",
1712 .id_table = snd_ca0106_ids,
1713 .probe = snd_ca0106_probe,
1714 .remove = __devexit_p(snd_ca0106_remove),
1715};
1716
1717
1718static int __init alsa_card_ca0106_init(void)
1719{
1720 return pci_register_driver(&driver);
1721}
1722
1723
1724static void __exit alsa_card_ca0106_exit(void)
1725{
1726 pci_unregister_driver(&driver);
1727}
1728
1729module_init(alsa_card_ca0106_init)
1730module_exit(alsa_card_ca0106_exit)
1731