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 */
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);
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);
}
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 */
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;
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)
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);
}
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;
}
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;
}
/* 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;