aboutsummaryrefslogtreecommitdiffstats
path: root/sound/pci/ice1712/ice1712.c
diff options
context:
space:
mode:
Diffstat (limited to 'sound/pci/ice1712/ice1712.c')
-rw-r--r--sound/pci/ice1712/ice1712.c68
1 files changed, 44 insertions, 24 deletions
diff --git a/sound/pci/ice1712/ice1712.c b/sound/pci/ice1712/ice1712.c
index ef6f18558c95..672e198317e1 100644
--- a/sound/pci/ice1712/ice1712.c
+++ b/sound/pci/ice1712/ice1712.c
@@ -53,8 +53,10 @@
53#include <linux/interrupt.h> 53#include <linux/interrupt.h>
54#include <linux/init.h> 54#include <linux/init.h>
55#include <linux/pci.h> 55#include <linux/pci.h>
56#include <linux/dma-mapping.h>
56#include <linux/slab.h> 57#include <linux/slab.h>
57#include <linux/moduleparam.h> 58#include <linux/moduleparam.h>
59#include <linux/mutex.h>
58#include <sound/core.h> 60#include <sound/core.h>
59#include <sound/cs8427.h> 61#include <sound/cs8427.h>
60#include <sound/info.h> 62#include <sound/info.h>
@@ -82,10 +84,11 @@ MODULE_SUPPORTED_DEVICE("{"
82 84
83static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX; /* Index 0-MAX */ 85static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX; /* Index 0-MAX */
84static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR; /* ID for this card */ 86static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR; /* ID for this card */
85static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP; /* Enable this card */ 87static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;/* Enable this card */
86static char *model[SNDRV_CARDS]; 88static char *model[SNDRV_CARDS];
87static int omni[SNDRV_CARDS]; /* Delta44 & 66 Omni I/O support */ 89static int omni[SNDRV_CARDS]; /* Delta44 & 66 Omni I/O support */
88static int cs8427_timeout[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)] = 500}; /* CS8427 S/PDIF transciever reset timeout value in msec */ 90static int cs8427_timeout[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)] = 500}; /* CS8427 S/PDIF transciever reset timeout value in msec */
91static int dxr_enable[SNDRV_CARDS]; /* DXR enable for DMX6FIRE */
89 92
90module_param_array(index, int, NULL, 0444); 93module_param_array(index, int, NULL, 0444);
91MODULE_PARM_DESC(index, "Index value for ICE1712 soundcard."); 94MODULE_PARM_DESC(index, "Index value for ICE1712 soundcard.");
@@ -99,6 +102,8 @@ module_param_array(cs8427_timeout, int, NULL, 0444);
99MODULE_PARM_DESC(cs8427_timeout, "Define reset timeout for cs8427 chip in msec resolution."); 102MODULE_PARM_DESC(cs8427_timeout, "Define reset timeout for cs8427 chip in msec resolution.");
100module_param_array(model, charp, NULL, 0444); 103module_param_array(model, charp, NULL, 0444);
101MODULE_PARM_DESC(model, "Use the given board model."); 104MODULE_PARM_DESC(model, "Use the given board model.");
105module_param_array(dxr_enable, int, NULL, 0444);
106MODULE_PARM_DESC(dxr_enable, "Enable DXR support for Terratec DMX6FIRE.");
102 107
103 108
104static struct pci_device_id snd_ice1712_ids[] = { 109static struct pci_device_id snd_ice1712_ids[] = {
@@ -316,7 +321,6 @@ static void snd_ice1712_set_gpio_data(struct snd_ice1712 *ice, unsigned int val)
316 inb(ICEREG(ice, DATA)); /* dummy read for pci-posting */ 321 inb(ICEREG(ice, DATA)); /* dummy read for pci-posting */
317} 322}
318 323
319
320/* 324/*
321 * 325 *
322 * CS8427 interface 326 * CS8427 interface
@@ -396,6 +400,20 @@ int __devinit snd_ice1712_init_cs8427(struct snd_ice1712 *ice, int addr)
396 return 0; 400 return 0;
397} 401}
398 402
403static void snd_ice1712_set_input_clock_source(struct snd_ice1712 *ice, int spdif_is_master)
404{
405 /* change CS8427 clock source too */
406 if (ice->cs8427)
407 snd_ice1712_cs8427_set_input_clock(ice, spdif_is_master);
408 /* notify ak4524 chip as well */
409 if (spdif_is_master) {
410 unsigned int i;
411 for (i = 0; i < ice->akm_codecs; i++) {
412 if (ice->akm[i].ops.set_rate_val)
413 ice->akm[i].ops.set_rate_val(&ice->akm[i], 0);
414 }
415 }
416}
399 417
400/* 418/*
401 * Interrupt handler 419 * Interrupt handler
@@ -1567,6 +1585,9 @@ static void snd_ice1712_proc_read(struct snd_info_entry *entry,
1567 snd_iprintf(buffer, " CAPTURE : 0x%08x\n", inl(ICEMT(ice, ROUTE_CAPTURE))); 1585 snd_iprintf(buffer, " CAPTURE : 0x%08x\n", inl(ICEMT(ice, ROUTE_CAPTURE)));
1568 snd_iprintf(buffer, " SPDOUT : 0x%04x\n", (unsigned)inw(ICEMT(ice, ROUTE_SPDOUT))); 1586 snd_iprintf(buffer, " SPDOUT : 0x%04x\n", (unsigned)inw(ICEMT(ice, ROUTE_SPDOUT)));
1569 snd_iprintf(buffer, " RATE : 0x%02x\n", (unsigned)inb(ICEMT(ice, RATE))); 1587 snd_iprintf(buffer, " RATE : 0x%02x\n", (unsigned)inb(ICEMT(ice, RATE)));
1588 snd_iprintf(buffer, " GPIO_DATA : 0x%02x\n", (unsigned)snd_ice1712_get_gpio_data(ice));
1589 snd_iprintf(buffer, " GPIO_WRITE_MASK : 0x%02x\n", (unsigned)snd_ice1712_read(ice, ICE1712_IREG_GPIO_WRITE_MASK));
1590 snd_iprintf(buffer, " GPIO_DIRECTION : 0x%02x\n", (unsigned)snd_ice1712_read(ice, ICE1712_IREG_GPIO_DIRECTION));
1570} 1591}
1571 1592
1572static void __devinit snd_ice1712_proc_init(struct snd_ice1712 * ice) 1593static void __devinit snd_ice1712_proc_init(struct snd_ice1712 * ice)
@@ -1856,20 +1877,8 @@ static int snd_ice1712_pro_internal_clock_put(struct snd_kcontrol *kcontrol,
1856 spin_unlock_irq(&ice->reg_lock); 1877 spin_unlock_irq(&ice->reg_lock);
1857 1878
1858 if ((oval & ICE1712_SPDIF_MASTER) != 1879 if ((oval & ICE1712_SPDIF_MASTER) !=
1859 (inb(ICEMT(ice, RATE)) & ICE1712_SPDIF_MASTER)) { 1880 (inb(ICEMT(ice, RATE)) & ICE1712_SPDIF_MASTER))
1860 /* change CS8427 clock source too */ 1881 snd_ice1712_set_input_clock_source(ice, is_spdif_master(ice));
1861 if (ice->cs8427) {
1862 snd_ice1712_cs8427_set_input_clock(ice, is_spdif_master(ice));
1863 }
1864 /* notify ak4524 chip as well */
1865 if (is_spdif_master(ice)) {
1866 unsigned int i;
1867 for (i = 0; i < ice->akm_codecs; i++) {
1868 if (ice->akm[i].ops.set_rate_val)
1869 ice->akm[i].ops.set_rate_val(&ice->akm[i], 0);
1870 }
1871 }
1872 }
1873 1882
1874 return change; 1883 return change;
1875} 1884}
@@ -2388,7 +2397,13 @@ static int __devinit snd_ice1712_chip_init(struct snd_ice1712 *ice)
2388 udelay(200); 2397 udelay(200);
2389 outb(ICE1712_NATIVE, ICEREG(ice, CONTROL)); 2398 outb(ICE1712_NATIVE, ICEREG(ice, CONTROL));
2390 udelay(200); 2399 udelay(200);
2391 pci_write_config_byte(ice->pci, 0x60, ice->eeprom.data[ICE_EEP1_CODEC]); 2400 if (ice->eeprom.subvendor == ICE1712_SUBDEVICE_DMX6FIRE && !ice->dxr_enable) {
2401 /* Limit active ADCs and DACs to 6; */
2402 /* Note: DXR extension not supported */
2403 pci_write_config_byte(ice->pci, 0x60, 0x0a);
2404 } else {
2405 pci_write_config_byte(ice->pci, 0x60, ice->eeprom.data[ICE_EEP1_CODEC]);
2406 }
2392 pci_write_config_byte(ice->pci, 0x61, ice->eeprom.data[ICE_EEP1_ACLINK]); 2407 pci_write_config_byte(ice->pci, 0x61, ice->eeprom.data[ICE_EEP1_ACLINK]);
2393 pci_write_config_byte(ice->pci, 0x62, ice->eeprom.data[ICE_EEP1_I2SID]); 2408 pci_write_config_byte(ice->pci, 0x62, ice->eeprom.data[ICE_EEP1_I2SID]);
2394 pci_write_config_byte(ice->pci, 0x63, ice->eeprom.data[ICE_EEP1_SPDIF]); 2409 pci_write_config_byte(ice->pci, 0x63, ice->eeprom.data[ICE_EEP1_SPDIF]);
@@ -2524,6 +2539,7 @@ static int __devinit snd_ice1712_create(struct snd_card *card,
2524 const char *modelname, 2539 const char *modelname,
2525 int omni, 2540 int omni,
2526 int cs8427_timeout, 2541 int cs8427_timeout,
2542 int dxr_enable,
2527 struct snd_ice1712 ** r_ice1712) 2543 struct snd_ice1712 ** r_ice1712)
2528{ 2544{
2529 struct snd_ice1712 *ice; 2545 struct snd_ice1712 *ice;
@@ -2538,8 +2554,8 @@ static int __devinit snd_ice1712_create(struct snd_card *card,
2538 if ((err = pci_enable_device(pci)) < 0) 2554 if ((err = pci_enable_device(pci)) < 0)
2539 return err; 2555 return err;
2540 /* check, if we can restrict PCI DMA transfers to 28 bits */ 2556 /* check, if we can restrict PCI DMA transfers to 28 bits */
2541 if (pci_set_dma_mask(pci, 0x0fffffff) < 0 || 2557 if (pci_set_dma_mask(pci, DMA_28BIT_MASK) < 0 ||
2542 pci_set_consistent_dma_mask(pci, 0x0fffffff) < 0) { 2558 pci_set_consistent_dma_mask(pci, DMA_28BIT_MASK) < 0) {
2543 snd_printk(KERN_ERR "architecture does not support 28bit PCI busmaster DMA\n"); 2559 snd_printk(KERN_ERR "architecture does not support 28bit PCI busmaster DMA\n");
2544 pci_disable_device(pci); 2560 pci_disable_device(pci);
2545 return -ENXIO; 2561 return -ENXIO;
@@ -2556,10 +2572,11 @@ static int __devinit snd_ice1712_create(struct snd_card *card,
2556 else if (cs8427_timeout > 1000) 2572 else if (cs8427_timeout > 1000)
2557 cs8427_timeout = 1000; 2573 cs8427_timeout = 1000;
2558 ice->cs8427_timeout = cs8427_timeout; 2574 ice->cs8427_timeout = cs8427_timeout;
2575 ice->dxr_enable = dxr_enable;
2559 spin_lock_init(&ice->reg_lock); 2576 spin_lock_init(&ice->reg_lock);
2560 init_MUTEX(&ice->gpio_mutex); 2577 mutex_init(&ice->gpio_mutex);
2561 init_MUTEX(&ice->i2c_mutex); 2578 mutex_init(&ice->i2c_mutex);
2562 init_MUTEX(&ice->open_mutex); 2579 mutex_init(&ice->open_mutex);
2563 ice->gpio.set_mask = snd_ice1712_set_gpio_mask; 2580 ice->gpio.set_mask = snd_ice1712_set_gpio_mask;
2564 ice->gpio.set_dir = snd_ice1712_set_gpio_dir; 2581 ice->gpio.set_dir = snd_ice1712_set_gpio_dir;
2565 ice->gpio.set_data = snd_ice1712_set_gpio_data; 2582 ice->gpio.set_data = snd_ice1712_set_gpio_data;
@@ -2658,7 +2675,8 @@ static int __devinit snd_ice1712_probe(struct pci_dev *pci,
2658 strcpy(card->shortname, "ICEnsemble ICE1712"); 2675 strcpy(card->shortname, "ICEnsemble ICE1712");
2659 2676
2660 if ((err = snd_ice1712_create(card, pci, model[dev], omni[dev], 2677 if ((err = snd_ice1712_create(card, pci, model[dev], omni[dev],
2661 cs8427_timeout[dev], &ice)) < 0) { 2678 cs8427_timeout[dev], dxr_enable[dev],
2679 &ice)) < 0) {
2662 snd_card_free(card); 2680 snd_card_free(card);
2663 return err; 2681 return err;
2664 } 2682 }
@@ -2735,6 +2753,8 @@ static int __devinit snd_ice1712_probe(struct pci_dev *pci,
2735 } 2753 }
2736 } 2754 }
2737 2755
2756 snd_ice1712_set_input_clock_source(ice, 0);
2757
2738 sprintf(card->longname, "%s at 0x%lx, irq %i", 2758 sprintf(card->longname, "%s at 0x%lx, irq %i",
2739 card->shortname, ice->port, ice->irq); 2759 card->shortname, ice->port, ice->irq);
2740 2760