/* OSS subsystem card registration shared by PnP and legacy routines */ static int sb_register_oss(struct sb_card_config *scc, struct sb_module_options *sbmo) { if (!request_region(scc->conf.io_base, 16, "soundblaster")) { printk(KERN_ERR "sb: ports busy.\n"); kfree(scc); return -EBUSY; } if (!sb_dsp_detect(&scc->conf, 0, 0, sbmo)) { release_region(scc->conf.io_base, 16); printk(KERN_ERR "sb: Failed DSP Detect.\n"); kfree(scc); return -ENODEV; } if(!sb_dsp_init(&scc->conf, THIS_MODULE)) { printk(KERN_ERR "sb: Failed DSP init.\n"); kfree(scc); return -ENODEV; } if(scc->mpucnf.io_base > 0) { scc->mpu = 1; printk(KERN_INFO "sb: Turning on MPU\n"); if(!probe_sbmpu(&scc->mpucnf, THIS_MODULE)) scc->mpu = 0; } return 1; }
void attach_mad16_mpu(struct address_info *hw_config) { if (board_type < C929) /* Early chip. No MPU support. Just SB MIDI */ { #if defined(CONFIG_MIDI) && defined(CONFIG_MAD16_OLDCARD) if (mad_read(MC1_PORT) & 0x20) hw_config->io_base = 0x240; else hw_config->io_base = 0x220; hw_config->name = "Mad16/Mozart"; sb_dsp_init(hw_config); #endif return; } #if defined(CONFIG_UART401) && defined(CONFIG_MIDI) if (!already_initialized) return; hw_config->driver_use_1 = SB_MIDI_ONLY; hw_config->name = "Mad16/Mozart"; attach_uart401(hw_config); #endif }
void attach_sb_card(struct address_info *hw_config) { #if defined(CONFIG_AUDIO) || defined(CONFIG_MIDI) if(!sb_dsp_init(hw_config)) hw_config->slots[0] = -1; #endif }
static int __init probe_trix_sb(struct address_info *hw_config) { int tmp; unsigned char conf; extern int sb_be_quiet; int old_quiet; static signed char irq_translate[] = { -1, -1, -1, 0, 1, 2, -1, 3 }; if (trix_boot_len == 0) return 0; /* No boot code -> no fun */ if ((hw_config->io_base & 0xffffff8f) != 0x200) return 0; tmp = hw_config->irq; if (tmp > 7) return 0; if (irq_translate[tmp] == -1) return 0; tmp = hw_config->dma; if (tmp != 1 && tmp != 3) return 0; if (!request_region(hw_config->io_base, 16, "soundblaster")) { printk(KERN_ERR "AudioTrix: SB I/O port conflict (%x)\n", hw_config->io_base); return 0; } conf = 0x84; /* DMA and IRQ enable */ conf |= hw_config->io_base & 0x70; /* I/O address bits */ conf |= irq_translate[hw_config->irq]; if (hw_config->dma == 3) conf |= 0x08; trix_write(0x1b, conf); download_boot(hw_config->io_base); hw_config->name = "AudioTrix SB"; if (!sb_dsp_detect(hw_config, 0, 0, NULL)) { release_region(hw_config->io_base, 16); return 0; } hw_config->driver_use_1 = SB_NO_MIDI | SB_NO_MIXER | SB_NO_RECORDING; /* Prevent false alarms */ old_quiet = sb_be_quiet; sb_be_quiet = 1; sb_dsp_init(hw_config, THIS_MODULE); sb_be_quiet = old_quiet; return 1; }
void *pas16_init() { pas16_t *pas16 = malloc(sizeof(pas16_t)); memset(pas16, 0, sizeof(pas16_t)); opl3_init(&pas16->opl); sb_dsp_init(&pas16->dsp, SB2); io_sethandler(0x9a01, 0x0001, NULL, NULL, NULL, pas16_out_base, NULL, NULL, pas16); timer_add(pas16_pcm_poll, &pas16->pit.c[0], &pas16->pit.enable[0], pas16); sound_add_handler(pas16_get_buffer, pas16); return pas16; }
static int __devinit probe_one(struct pci_dev *pdev, const struct pci_device_id *ent) { struct address_info *hw_config; unsigned long base; void *mem; unsigned long io; u16 map; u8 irq, dma8, dma16; int oldquiet; extern int sb_be_quiet; base = pci_resource_start(pdev, 0); if(base == 0UL) return 1; mem = ioremap(base, 128); if(mem == 0UL) return 1; map = readw(mem + 0x18); /* Read the SMI enables */ iounmap(mem); /* Map bits 0:1 * 0x20 + 0x200 = sb base 2 sb enable 3 adlib enable 5 MPU enable 0x330 6 MPU enable 0x300 The other bits may be used internally so must be masked */ io = 0x220 + 0x20 * (map & 3); if(map & (1<<2)) printk(KERN_INFO "kahlua: XpressAudio at 0x%lx\n", io); else return 1; if(map & (1<<5)) printk(KERN_INFO "kahlua: MPU at 0x300\n"); else if(map & (1<<6)) printk(KERN_INFO "kahlua: MPU at 0x330\n"); irq = mixer_read(io, 0x80) & 0x0F; dma8 = mixer_read(io, 0x81); // printk("IRQ=%x MAP=%x DMA=%x\n", irq, map, dma8); if(dma8 & 0x20) dma16 = 5; else if(dma8 & 0x40) dma16 = 6; else if(dma8 & 0x80) dma16 = 7; else { printk(KERN_ERR "kahlua: No 16bit DMA enabled.\n"); return 1; } if(dma8 & 0x01) dma8 = 0; else if(dma8 & 0x02) dma8 = 1; else if(dma8 & 0x08) dma8 = 3; else { printk(KERN_ERR "kahlua: No 8bit DMA enabled.\n"); return 1; } if(irq & 1) irq = 9; else if(irq & 2) irq = 5; else if(irq & 4) irq = 7; else if(irq & 8) irq = 10; else { printk(KERN_ERR "kahlua: SB IRQ not set.\n"); return 1; } printk(KERN_INFO "kahlua: XpressAudio on IRQ %d, DMA %d, %d\n", irq, dma8, dma16); hw_config = kmalloc(sizeof(struct address_info), GFP_KERNEL); if(hw_config == NULL) { printk(KERN_ERR "kahlua: out of memory.\n"); return 1; } memset(hw_config, 0, sizeof(*hw_config)); pci_set_drvdata(pdev, hw_config); hw_config->io_base = io; hw_config->irq = irq; hw_config->dma = dma8; hw_config->dma2 = dma16; hw_config->name = "Cyrix XpressAudio"; hw_config->driver_use_1 = SB_NO_MIDI | SB_PCI_IRQ; if(sb_dsp_detect(hw_config, 0, 0, NULL)==0) { printk(KERN_ERR "kahlua: audio not responding.\n"); goto err_out_free; } oldquiet = sb_be_quiet; sb_be_quiet = 1; if(sb_dsp_init(hw_config, THIS_MODULE)) { sb_be_quiet = oldquiet; goto err_out_free; } sb_be_quiet = oldquiet; return 0; err_out_free: pci_set_drvdata(pdev, NULL); kfree(hw_config); return 1; }
static int __init probe_mad16_mpu(struct address_info *hw_config) { static int mpu_attached = 0; unsigned char tmp; if (!already_initialized) /* The MSS port must be initialized first */ return 0; if (mpu_attached) /* Don't let them call this twice */ return 0; mpu_attached = 1; if (board_type < C929) /* Early chip. No MPU support. Just SB MIDI */ { #ifdef CONFIG_MAD16_OLDCARD tmp = mad_read(MC3_PORT); /* * MAD16 SB base is defined by the WSS base. It cannot be changed * alone. * Ignore configured I/O base. Use the active setting. */ if (mad_read(MC1_PORT) & 0x20) hw_config->io_base = 0x240; else hw_config->io_base = 0x220; switch (hw_config->irq) { case 5: tmp = (tmp & 0x3f) | 0x80; break; case 7: tmp = (tmp & 0x3f); break; case 11: tmp = (tmp & 0x3f) | 0x40; break; default: printk(KERN_ERR "mad16/Mozart: Invalid MIDI IRQ\n"); return 0; } mad_write(MC3_PORT, tmp | 0x04); hw_config->driver_use_1 = SB_MIDI_ONLY; if (!sb_dsp_detect(hw_config, 0, 0, NULL)) return 0; if (mad_read(MC1_PORT) & 0x20) hw_config->io_base = 0x240; else hw_config->io_base = 0x220; hw_config->name = "Mad16/Mozart"; sb_dsp_init(hw_config, THIS_MODULE); return 1; #else /* assuming all later Mozart cards are identified as * either 82C928 or Mozart. If so, following code attempts * to set MPU register. TODO - add probing */ tmp = mad_read(MC8_PORT); switch (hw_config->irq) { case 5: tmp |= 0x08; break; case 7: tmp |= 0x10; break; case 9: tmp |= 0x18; break; case 10: tmp |= 0x20; break; case 11: tmp |= 0x28; break; default: printk(KERN_ERR "mad16/MOZART: invalid mpu_irq\n"); return 0; } switch (hw_config->io_base) { case 0x300: tmp |= 0x01; break; case 0x310: tmp |= 0x03; break; case 0x320: tmp |= 0x05; break; case 0x330: tmp |= 0x07; break; default: printk(KERN_ERR "mad16/MOZART: invalid mpu_io\n"); return 0; } mad_write(MC8_PORT, tmp); /* write MPU port parameters */ goto probe_401; #endif } tmp = mad_read(MC6_PORT) & 0x83; tmp |= 0x80; /* MPU-401 enable */ /* Set the MPU base bits */ switch (hw_config->io_base) { case 0x300: tmp |= 0x60; break; case 0x310: tmp |= 0x40; break; case 0x320: tmp |= 0x20; break; case 0x330: tmp |= 0x00; break; default: printk(KERN_ERR "MAD16: Invalid MIDI port 0x%x\n", hw_config->io_base); return 0; } /* Set the MPU IRQ bits */ switch (hw_config->irq) { case 5: tmp |= 0x10; break; case 7: tmp |= 0x18; break; case 9: tmp |= 0x00; break; case 10: tmp |= 0x08; break; default: printk(KERN_ERR "MAD16: Invalid MIDI IRQ %d\n", hw_config->irq); break; } mad_write(MC6_PORT, tmp); /* Write MPU401 config */ #ifndef CONFIG_MAD16_OLDCARD probe_401: #endif hw_config->driver_use_1 = SB_MIDI_ONLY; hw_config->name = "Mad16/Mozart"; return probe_uart401(hw_config, THIS_MODULE); }