vserver 1.9.3
[linux-2.6.git] / sound / pci / emu10k1 / emu10k1_main.c
index 9f4c8b3..4f7a0ea 100644 (file)
@@ -119,8 +119,10 @@ static int __devinit snd_emu10k1_init(emu10k1_t * emu, int enable_ir)
        snd_emu10k1_ptr_write(emu, SOLEH, 0, 0);
 
        if (emu->audigy){
-               snd_emu10k1_ptr_write(emu, 0x5e, 0, 0xf00); /* ?? */
-               snd_emu10k1_ptr_write(emu, 0x5f, 0, 0x3); /* ?? */
+               /* set SPDIF bypass mode */
+               snd_emu10k1_ptr_write(emu, SPBYPASS, 0, SPBYPASS_FORMAT);
+               /* enable rear left + rear right AC97 slots */
+               snd_emu10k1_ptr_write(emu, AC97SLOT, 0, AC97SLOT_REAR_RIGHT | AC97SLOT_REAR_LEFT);
        }
 
        /* init envelope engine */
@@ -329,7 +331,7 @@ static int snd_emu10k1_done(emu10k1_t * emu)
        if (emu->audigy)
                snd_emu10k1_ptr_write(emu, A_DBG, 0, A_DBG_SINGLE_STEP);
        else
-               snd_emu10k1_ptr_write(emu, DBG, 0, 0x8000);
+               snd_emu10k1_ptr_write(emu, DBG, 0, EMU10K1_DBG_SINGLE_STEP);
 
        /* disable channel interrupt */
        snd_emu10k1_ptr_write(emu, CLIEL, 0, 0);
@@ -541,33 +543,31 @@ static int __devinit snd_emu10k1_ecard_init(emu10k1_t * emu)
 
 static int snd_emu10k1_free(emu10k1_t *emu)
 {
-       if (emu->res_port != NULL) {    /* avoid access to already used hardware */
+       if (emu->port) {        /* avoid access to already used hardware */
                snd_emu10k1_fx8010_tram_setup(emu, 0);
                snd_emu10k1_done(emu);
                }
        if (emu->memhdr)
                snd_util_memhdr_free(emu->memhdr);
        if (emu->silent_page.area)
-               snd_dma_free_pages(&emu->dma_dev, &emu->silent_page);
+               snd_dma_free_pages(&emu->silent_page);
        if (emu->ptb_pages.area)
-               snd_dma_free_pages(&emu->dma_dev, &emu->ptb_pages);
+               snd_dma_free_pages(&emu->ptb_pages);
        if (emu->page_ptr_table)
                vfree(emu->page_ptr_table);
        if (emu->page_addr_table)
                vfree(emu->page_addr_table);
-       if (emu->res_port) {
-               release_resource(emu->res_port);
-               kfree_nocheck(emu->res_port);
-       }
        if (emu->irq >= 0)
                free_irq(emu->irq, (void *)emu);
-       snd_magic_kfree(emu);
+       if (emu->port)
+               pci_release_regions(emu->pci);
+       kfree(emu);
        return 0;
 }
 
 static int snd_emu10k1_dev_free(snd_device_t *device)
 {
-       emu10k1_t *emu = snd_magic_cast(emu10k1_t, device->device_data, return -ENXIO);
+       emu10k1_t *emu = device->device_data;
        return snd_emu10k1_free(emu);
 }
 
@@ -595,7 +595,7 @@ int __devinit snd_emu10k1_create(snd_card_t * card,
        if ((err = pci_enable_device(pci)) < 0)
                return err;
 
-       emu = snd_magic_kcalloc(emu10k1_t, 0, GFP_KERNEL);
+       emu = kcalloc(1, sizeof(*emu), GFP_KERNEL);
        if (emu == NULL)
                return -ENOMEM;
        /* set the DMA transfer mask */
@@ -603,7 +603,7 @@ int __devinit snd_emu10k1_create(snd_card_t * card,
        if (pci_set_dma_mask(pci, emu->dma_mask) < 0 ||
            pci_set_consistent_dma_mask(pci, emu->dma_mask) < 0) {
                snd_printk(KERN_ERR "architecture does not support PCI busmaster DMA with mask 0x%lx\n", emu->dma_mask);
-               snd_magic_kfree(emu);
+               kfree(emu);
                return -ENXIO;
        }
        emu->card = card;
@@ -620,7 +620,6 @@ int __devinit snd_emu10k1_create(snd_card_t * card,
        emu->irq = -1;
        emu->synth = NULL;
        emu->get_synth_voice = NULL;
-       emu->port = pci_resource_start(pci, 0);
 
        emu->audigy = is_audigy;
        if (is_audigy)
@@ -628,10 +627,11 @@ int __devinit snd_emu10k1_create(snd_card_t * card,
        else
                emu->gpr_base = FXGPREGBASE;
 
-       if ((emu->res_port = request_region(emu->port, 0x20, "EMU10K1")) == NULL) {
-               snd_emu10k1_free(emu);
-               return -EBUSY;
+       if ((err = pci_request_regions(pci, "EMU10K1")) < 0) {
+               kfree(emu);
+               return err;
        }
+       emu->port = pci_resource_start(pci, 0);
 
        if (request_irq(pci->irq, snd_emu10k1_interrupt, SA_INTERRUPT|SA_SHIRQ, "EMU10K1", (void *)emu)) {
                snd_emu10k1_free(emu);
@@ -639,12 +639,9 @@ int __devinit snd_emu10k1_create(snd_card_t * card,
        }
        emu->irq = pci->irq;
 
-       memset(&emu->dma_dev, 0, sizeof(emu->dma_dev));
-       emu->dma_dev.type = SNDRV_DMA_TYPE_DEV;
-       emu->dma_dev.dev = snd_dma_pci_data(pci);
-
        emu->max_cache_pages = max_cache_bytes >> PAGE_SHIFT;
-       if (snd_dma_alloc_pages(&emu->dma_dev, 32 * 1024, &emu->ptb_pages) < 0) {
+       if (snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, snd_dma_pci_data(pci),
+                               32 * 1024, &emu->ptb_pages) < 0) {
                snd_emu10k1_free(emu);
                return -ENOMEM;
        }
@@ -656,7 +653,8 @@ int __devinit snd_emu10k1_create(snd_card_t * card,
                return -ENOMEM;
        }
 
-       if (snd_dma_alloc_pages(&emu->dma_dev, EMUPAGESIZE, &emu->silent_page) < 0) {
+       if (snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, snd_dma_pci_data(pci),
+                               EMUPAGESIZE, &emu->silent_page) < 0) {
                snd_emu10k1_free(emu);
                return -ENOMEM;
        }
@@ -682,10 +680,17 @@ int __devinit snd_emu10k1_create(snd_card_t * card,
                /* Audigy 2 EX has apparently no effective AC97 controls
                 * (for both input and output), so we skip the AC97 detections
                 */
-               snd_printdd(KERN_INFO "Audigy2 EX is detected. skpping ac97.\n");
-               emu->no_ac97 = 1;
+               snd_printdd(KERN_INFO "Audigy2 EX is detected. skipping ac97.\n");
+               emu->no_ac97 = 1;       
        }
        
+       if (emu->revision == 4 && emu->model == 0x2002) {
+               /* Audigy 2 ZS */
+               snd_printdd(KERN_INFO "Audigy2 ZS is detected. setting 7.1 mode.\n");
+               emu->spk71 = 1;
+       }
+       
+       
        emu->fx8010.fxbus_mask = 0x303f;
        if (extin_mask == 0)
                extin_mask = 0x3fcf;