aboutsummaryrefslogtreecommitdiffstats
path: root/sound/pci/ca0106
diff options
context:
space:
mode:
Diffstat (limited to 'sound/pci/ca0106')
-rw-r--r--sound/pci/ca0106/ca0106_main.c105
1 files changed, 82 insertions, 23 deletions
diff --git a/sound/pci/ca0106/ca0106_main.c b/sound/pci/ca0106/ca0106_main.c
index 0e62205d4081..df757575798a 100644
--- a/sound/pci/ca0106/ca0106_main.c
+++ b/sound/pci/ca0106/ca0106_main.c
@@ -255,6 +255,14 @@ static struct snd_ca0106_details ca0106_chip_details[] = {
255 .gpio_type = 2, 255 .gpio_type = 2,
256 .i2c_adc = 1, 256 .i2c_adc = 1,
257 .spi_dac = 1 } , 257 .spi_dac = 1 } ,
258 /* Giga-byte GA-G1975X mobo
259 * Novell bnc#395807
260 */
261 /* FIXME: the GPIO and I2C setting aren't tested well */
262 { .serial = 0x1458a006,
263 .name = "Giga-byte GA-G1975X",
264 .gpio_type = 1,
265 .i2c_adc = 1 },
258 /* Shuttle XPC SD31P which has an onboard Creative Labs 266 /* Shuttle XPC SD31P which has an onboard Creative Labs
259 * Sound Blaster Live! 24-bit EAX 267 * Sound Blaster Live! 24-bit EAX
260 * high-definition 7.1 audio processor". 268 * high-definition 7.1 audio processor".
@@ -404,7 +412,9 @@ int snd_ca0106_i2c_write(struct snd_ca0106 *emu,
404 } 412 }
405 413
406 tmp = reg << 25 | value << 16; 414 tmp = reg << 25 | value << 16;
407 // snd_printk("I2C-write:reg=0x%x, value=0x%x\n", reg, value); 415 /*
416 snd_printk(KERN_DEBUG "I2C-write:reg=0x%x, value=0x%x\n", reg, value);
417 */
408 /* Not sure what this I2C channel controls. */ 418 /* Not sure what this I2C channel controls. */
409 /* snd_ca0106_ptr_write(emu, I2C_D0, 0, tmp); */ 419 /* snd_ca0106_ptr_write(emu, I2C_D0, 0, tmp); */
410 420
@@ -422,7 +432,7 @@ int snd_ca0106_i2c_write(struct snd_ca0106 *emu,
422 /* Wait till the transaction ends */ 432 /* Wait till the transaction ends */
423 while (1) { 433 while (1) {
424 status = snd_ca0106_ptr_read(emu, I2C_A, 0); 434 status = snd_ca0106_ptr_read(emu, I2C_A, 0);
425 //snd_printk("I2C:status=0x%x\n", status); 435 /*snd_printk(KERN_DEBUG "I2C:status=0x%x\n", status);*/
426 timeout++; 436 timeout++;
427 if ((status & I2C_A_ADC_START) == 0) 437 if ((status & I2C_A_ADC_START) == 0)
428 break; 438 break;
@@ -521,7 +531,10 @@ static int snd_ca0106_pcm_open_playback_channel(struct snd_pcm_substream *substr
521 channel->number = channel_id; 531 channel->number = channel_id;
522 532
523 channel->use = 1; 533 channel->use = 1;
524 //printk("open:channel_id=%d, chip=%p, channel=%p\n",channel_id, chip, channel); 534 /*
535 printk(KERN_DEBUG "open:channel_id=%d, chip=%p, channel=%p\n",
536 channel_id, chip, channel);
537 */
525 //channel->interrupt = snd_ca0106_pcm_channel_interrupt; 538 //channel->interrupt = snd_ca0106_pcm_channel_interrupt;
526 channel->epcm = epcm; 539 channel->epcm = epcm;
527 if ((err = snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS)) < 0) 540 if ((err = snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS)) < 0)
@@ -614,7 +627,10 @@ static int snd_ca0106_pcm_open_capture_channel(struct snd_pcm_substream *substre
614 channel->number = channel_id; 627 channel->number = channel_id;
615 628
616 channel->use = 1; 629 channel->use = 1;
617 //printk("open:channel_id=%d, chip=%p, channel=%p\n",channel_id, chip, channel); 630 /*
631 printk(KERN_DEBUG "open:channel_id=%d, chip=%p, channel=%p\n",
632 channel_id, chip, channel);
633 */
618 //channel->interrupt = snd_ca0106_pcm_channel_interrupt; 634 //channel->interrupt = snd_ca0106_pcm_channel_interrupt;
619 channel->epcm = epcm; 635 channel->epcm = epcm;
620 if ((err = snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS)) < 0) 636 if ((err = snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS)) < 0)
@@ -705,9 +721,20 @@ static int snd_ca0106_pcm_prepare_playback(struct snd_pcm_substream *substream)
705 u32 reg71; 721 u32 reg71;
706 int i; 722 int i;
707 723
708 //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)); 724#if 0 /* debug */
709 //snd_printk("dma_addr=%x, dma_area=%p, table_base=%p\n",runtime->dma_addr, runtime->dma_area, table_base); 725 snd_printk(KERN_DEBUG
710 //snd_printk("dma_addr=%x, dma_area=%p, dma_bytes(size)=%x\n",emu->buffer.addr, emu->buffer.area, emu->buffer.bytes); 726 "prepare:channel_number=%d, rate=%d, format=0x%x, "
727 "channels=%d, buffer_size=%ld, period_size=%ld, "
728 "periods=%u, frames_to_bytes=%d\n",
729 channel, runtime->rate, runtime->format,
730 runtime->channels, runtime->buffer_size,
731 runtime->period_size, runtime->periods,
732 frames_to_bytes(runtime, 1));
733 snd_printk(KERN_DEBUG "dma_addr=%x, dma_area=%p, table_base=%p\n",
734 runtime->dma_addr, runtime->dma_area, table_base);
735 snd_printk(KERN_DEBUG "dma_addr=%x, dma_area=%p, dma_bytes(size)=%x\n",
736 emu->buffer.addr, emu->buffer.area, emu->buffer.bytes);
737#endif /* debug */
711 /* Rate can be set per channel. */ 738 /* Rate can be set per channel. */
712 /* reg40 control host to fifo */ 739 /* reg40 control host to fifo */
713 /* reg71 controls DAC rate. */ 740 /* reg71 controls DAC rate. */
@@ -799,9 +826,20 @@ static int snd_ca0106_pcm_prepare_capture(struct snd_pcm_substream *substream)
799 u32 reg71_set = 0; 826 u32 reg71_set = 0;
800 u32 reg71; 827 u32 reg71;
801 828
802 //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)); 829#if 0 /* debug */
803 //snd_printk("dma_addr=%x, dma_area=%p, table_base=%p\n",runtime->dma_addr, runtime->dma_area, table_base); 830 snd_printk(KERN_DEBUG
804 //snd_printk("dma_addr=%x, dma_area=%p, dma_bytes(size)=%x\n",emu->buffer.addr, emu->buffer.area, emu->buffer.bytes); 831 "prepare:channel_number=%d, rate=%d, format=0x%x, "
832 "channels=%d, buffer_size=%ld, period_size=%ld, "
833 "periods=%u, frames_to_bytes=%d\n",
834 channel, runtime->rate, runtime->format,
835 runtime->channels, runtime->buffer_size,
836 runtime->period_size, runtime->periods,
837 frames_to_bytes(runtime, 1));
838 snd_printk(KERN_DEBUG "dma_addr=%x, dma_area=%p, table_base=%p\n",
839 runtime->dma_addr, runtime->dma_area, table_base);
840 snd_printk(KERN_DEBUG "dma_addr=%x, dma_area=%p, dma_bytes(size)=%x\n",
841 emu->buffer.addr, emu->buffer.area, emu->buffer.bytes);
842#endif /* debug */
805 /* reg71 controls ADC rate. */ 843 /* reg71 controls ADC rate. */
806 switch (runtime->rate) { 844 switch (runtime->rate) {
807 case 44100: 845 case 44100:
@@ -846,7 +884,14 @@ static int snd_ca0106_pcm_prepare_capture(struct snd_pcm_substream *substream)
846 } 884 }
847 885
848 886
849 //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)); 887 /*
888 printk(KERN_DEBUG
889 "prepare:channel_number=%d, rate=%d, format=0x%x, channels=%d, "
890 "buffer_size=%ld, period_size=%ld, frames_to_bytes=%d\n",
891 channel, runtime->rate, runtime->format, runtime->channels,
892 runtime->buffer_size, runtime->period_size,
893 frames_to_bytes(runtime, 1));
894 */
850 snd_ca0106_ptr_write(emu, 0x13, channel, 0); 895 snd_ca0106_ptr_write(emu, 0x13, channel, 0);
851 snd_ca0106_ptr_write(emu, CAPTURE_DMA_ADDR, channel, runtime->dma_addr); 896 snd_ca0106_ptr_write(emu, CAPTURE_DMA_ADDR, channel, runtime->dma_addr);
852 snd_ca0106_ptr_write(emu, CAPTURE_BUFFER_SIZE, channel, frames_to_bytes(runtime, runtime->buffer_size)<<16); // buffer size in bytes 897 snd_ca0106_ptr_write(emu, CAPTURE_BUFFER_SIZE, channel, frames_to_bytes(runtime, runtime->buffer_size)<<16); // buffer size in bytes
@@ -888,13 +933,13 @@ static int snd_ca0106_pcm_trigger_playback(struct snd_pcm_substream *substream,
888 runtime = s->runtime; 933 runtime = s->runtime;
889 epcm = runtime->private_data; 934 epcm = runtime->private_data;
890 channel = epcm->channel_id; 935 channel = epcm->channel_id;
891 /* snd_printk("channel=%d\n",channel); */ 936 /* snd_printk(KERN_DEBUG "channel=%d\n", channel); */
892 epcm->running = running; 937 epcm->running = running;
893 basic |= (0x1 << channel); 938 basic |= (0x1 << channel);
894 extended |= (0x10 << channel); 939 extended |= (0x10 << channel);
895 snd_pcm_trigger_done(s, substream); 940 snd_pcm_trigger_done(s, substream);
896 } 941 }
897 /* snd_printk("basic=0x%x, extended=0x%x\n",basic, extended); */ 942 /* snd_printk(KERN_DEBUG "basic=0x%x, extended=0x%x\n",basic, extended); */
898 943
899 switch (cmd) { 944 switch (cmd) {
900 case SNDRV_PCM_TRIGGER_START: 945 case SNDRV_PCM_TRIGGER_START:
@@ -972,8 +1017,13 @@ snd_ca0106_pcm_pointer_playback(struct snd_pcm_substream *substream)
972 ptr=ptr2; 1017 ptr=ptr2;
973 if (ptr >= runtime->buffer_size) 1018 if (ptr >= runtime->buffer_size)
974 ptr -= runtime->buffer_size; 1019 ptr -= runtime->buffer_size;
975 //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); 1020 /*
976 1021 printk(KERN_DEBUG "ptr1 = 0x%lx, ptr2=0x%lx, ptr=0x%lx, "
1022 "buffer_size = 0x%x, period_size = 0x%x, bits=%d, rate=%d\n",
1023 ptr1, ptr2, ptr, (int)runtime->buffer_size,
1024 (int)runtime->period_size, (int)runtime->frame_bits,
1025 (int)runtime->rate);
1026 */
977 return ptr; 1027 return ptr;
978} 1028}
979 1029
@@ -995,8 +1045,13 @@ snd_ca0106_pcm_pointer_capture(struct snd_pcm_substream *substream)
995 ptr=ptr2; 1045 ptr=ptr2;
996 if (ptr >= runtime->buffer_size) 1046 if (ptr >= runtime->buffer_size)
997 ptr -= runtime->buffer_size; 1047 ptr -= runtime->buffer_size;
998 //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); 1048 /*
999 1049 printk(KERN_DEBUG "ptr1 = 0x%lx, ptr2=0x%lx, ptr=0x%lx, "
1050 "buffer_size = 0x%x, period_size = 0x%x, bits=%d, rate=%d\n",
1051 ptr1, ptr2, ptr, (int)runtime->buffer_size,
1052 (int)runtime->period_size, (int)runtime->frame_bits,
1053 (int)runtime->rate);
1054 */
1000 return ptr; 1055 return ptr;
1001} 1056}
1002 1057
@@ -1181,8 +1236,12 @@ static irqreturn_t snd_ca0106_interrupt(int irq, void *dev_id)
1181 return IRQ_NONE; 1236 return IRQ_NONE;
1182 1237
1183 stat76 = snd_ca0106_ptr_read(chip, EXTENDED_INT, 0); 1238 stat76 = snd_ca0106_ptr_read(chip, EXTENDED_INT, 0);
1184 //snd_printk("interrupt status = 0x%08x, stat76=0x%08x\n", status, stat76); 1239 /*
1185 //snd_printk("ptr=0x%08x\n",snd_ca0106_ptr_read(chip, PLAYBACK_POINTER, 0)); 1240 snd_printk(KERN_DEBUG "interrupt status = 0x%08x, stat76=0x%08x\n",
1241 status, stat76);
1242 snd_printk(KERN_DEBUG "ptr=0x%08x\n",
1243 snd_ca0106_ptr_read(chip, PLAYBACK_POINTER, 0));
1244 */
1186 mask = 0x11; /* 0x1 for one half, 0x10 for the other half period. */ 1245 mask = 0x11; /* 0x1 for one half, 0x10 for the other half period. */
1187 for(i = 0; i < 4; i++) { 1246 for(i = 0; i < 4; i++) {
1188 pchannel = &(chip->playback_channels[i]); 1247 pchannel = &(chip->playback_channels[i]);
@@ -1470,7 +1529,7 @@ static void ca0106_init_chip(struct snd_ca0106 *chip, int resume)
1470 int size, n; 1529 int size, n;
1471 1530
1472 size = ARRAY_SIZE(i2c_adc_init); 1531 size = ARRAY_SIZE(i2c_adc_init);
1473 /* snd_printk("I2C:array size=0x%x\n", size); */ 1532 /* snd_printk(KERN_DEBUG "I2C:array size=0x%x\n", size); */
1474 for (n = 0; n < size; n++) 1533 for (n = 0; n < size; n++)
1475 snd_ca0106_i2c_write(chip, i2c_adc_init[n][0], 1534 snd_ca0106_i2c_write(chip, i2c_adc_init[n][0],
1476 i2c_adc_init[n][1]); 1535 i2c_adc_init[n][1]);
@@ -1707,9 +1766,9 @@ static int __devinit snd_ca0106_probe(struct pci_dev *pci,
1707 return -ENOENT; 1766 return -ENOENT;
1708 } 1767 }
1709 1768
1710 card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0); 1769 err = snd_card_create(index[dev], id[dev], THIS_MODULE, 0, &card);
1711 if (card == NULL) 1770 if (err < 0)
1712 return -ENOMEM; 1771 return err;
1713 1772
1714 err = snd_ca0106_create(dev, card, pci, &chip); 1773 err = snd_ca0106_create(dev, card, pci, &chip);
1715 if (err < 0) 1774 if (err < 0)