X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sound%2Fpci%2Femu10k1%2Femu10k1_main.c;h=4f7a0ea6075454bc3e219b6a50150c2d3c14f99c;hb=c7b5ebbddf7bcd3651947760f423e3783bbe6573;hp=9f4c8b359b193f5eff735e342ed253427c654001;hpb=a2c21200f1c81b08cb55e417b68150bba439b646;p=linux-2.6.git diff --git a/sound/pci/emu10k1/emu10k1_main.c b/sound/pci/emu10k1/emu10k1_main.c index 9f4c8b359..4f7a0ea60 100644 --- a/sound/pci/emu10k1/emu10k1_main.c +++ b/sound/pci/emu10k1/emu10k1_main.c @@ -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;