|
@@ -282,7 +282,7 @@ static int snd_emu10k1_init(struct snd_emu10k1 *emu, int enable_ir, int resume)
|
|
|
snd_emu10k1_ptr_write(emu, TCB, 0, 0); /* taken from original driver */
|
|
|
snd_emu10k1_ptr_write(emu, TCBS, 0, 4); /* taken from original driver */
|
|
|
|
|
|
- silent_page = (emu->silent_page.addr << 1) | MAP_PTI_MASK;
|
|
|
+ silent_page = (emu->silent_page.addr << emu->address_mode) | (emu->address_mode ? MAP_PTI_MASK1 : MAP_PTI_MASK0);
|
|
|
for (ch = 0; ch < NUM_G; ch++) {
|
|
|
snd_emu10k1_ptr_write(emu, MAPA, ch, silent_page);
|
|
|
snd_emu10k1_ptr_write(emu, MAPB, ch, silent_page);
|
|
@@ -348,6 +348,11 @@ static int snd_emu10k1_init(struct snd_emu10k1 *emu, int enable_ir, int resume)
|
|
|
outl(reg | A_IOCFG_GPOUT0, emu->port + A_IOCFG);
|
|
|
}
|
|
|
|
|
|
+ if (emu->address_mode == 0) {
|
|
|
+ /* use 16M in 4G */
|
|
|
+ outl(inl(emu->port + HCFG) | HCFG_EXPANDED_MEM, emu->port + HCFG);
|
|
|
+ }
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -1902,8 +1907,10 @@ int snd_emu10k1_create(struct snd_card *card,
|
|
|
|
|
|
is_audigy = emu->audigy = c->emu10k2_chip;
|
|
|
|
|
|
+ /* set addressing mode */
|
|
|
+ emu->address_mode = is_audigy ? 0 : 1;
|
|
|
/* set the DMA transfer mask */
|
|
|
- emu->dma_mask = is_audigy ? AUDIGY_DMA_MASK : EMU10K1_DMA_MASK;
|
|
|
+ emu->dma_mask = emu->address_mode ? EMU10K1_DMA_MASK : AUDIGY_DMA_MASK;
|
|
|
if (pci_set_dma_mask(pci, emu->dma_mask) < 0 ||
|
|
|
pci_set_consistent_dma_mask(pci, emu->dma_mask) < 0) {
|
|
|
dev_err(card->dev,
|
|
@@ -1928,7 +1935,7 @@ int snd_emu10k1_create(struct snd_card *card,
|
|
|
|
|
|
emu->max_cache_pages = max_cache_bytes >> PAGE_SHIFT;
|
|
|
if (snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, snd_dma_pci_data(pci),
|
|
|
- 32 * 1024, &emu->ptb_pages) < 0) {
|
|
|
+ (emu->address_mode ? 32 : 16) * 1024, &emu->ptb_pages) < 0) {
|
|
|
err = -ENOMEM;
|
|
|
goto error;
|
|
|
}
|
|
@@ -2027,8 +2034,8 @@ int snd_emu10k1_create(struct snd_card *card,
|
|
|
|
|
|
/* Clear silent pages and set up pointers */
|
|
|
memset(emu->silent_page.area, 0, PAGE_SIZE);
|
|
|
- silent_page = emu->silent_page.addr << 1;
|
|
|
- for (idx = 0; idx < MAXPAGES; idx++)
|
|
|
+ silent_page = emu->silent_page.addr << emu->address_mode;
|
|
|
+ for (idx = 0; idx < (emu->address_mode ? MAXPAGES1 : MAXPAGES0); idx++)
|
|
|
((u32 *)emu->ptb_pages.area)[idx] = cpu_to_le32(silent_page | idx);
|
|
|
|
|
|
/* set up voice indices */
|