/* * Install a OPL3SA2 based card. * * Need to have ad1848 and mpu401 loaded ready. */ static int __init init_opl3sa2(void) { int i; /* Our own config: */ cfg.io_base = io; cfg.irq = irq; cfg.dma = dma; cfg.dma2 = dma2; /* The MSS config: */ cfg2.io_base = mss_io; cfg2.irq = irq; cfg2.dma = dma; cfg2.dma2 = dma2; cfg2.card_subtype = 1; /* No IRQ or DMA setup */ cfg_mpu.io_base = mpu_io; cfg_mpu.irq = irq; cfg_mpu.dma = dma; cfg_mpu.always_detect = 1; /* It's there, so use shared IRQs */ if(cfg.io_base == -1 || cfg.irq == -1 || cfg.dma == -1 || cfg.dma2 == -1 || cfg2.io_base == -1) { printk(KERN_ERR "opl3sa2: io, mss_io, irq, dma, and dma2 must be set.\n"); return -EINVAL; } /* Call me paranoid: */ for(i = 0; i < 6; i++) { cfg.slots[i] = cfg2.slots[i] = cfg_mpu.slots[i] = -1; } if(probe_opl3sa2(&cfg) == 0) { return -ENODEV; } if(probe_opl3sa2_mss(&cfg2) == 0) { return -ENODEV; } attach_opl3sa2(&cfg); attach_opl3sa2_mss(&cfg2); if(cfg_mpu.io_base != -1) { if(probe_opl3sa2_mpu(&cfg_mpu)) { attach_opl3sa2_mpu(&cfg_mpu); } } return 0; }
/* * Install OPL3-SA2 based card(s). * * Need to have ad1848 and mpu401 loaded ready. */ static int __init init_opl3sa2(void) { int card; int max; /* Sanitize isapnp and multiple settings */ isapnp = isapnp != 0 ? 1 : 0; multiple = multiple != 0 ? 1 : 0; max = (multiple && isapnp) ? OPL3SA2_CARDS_MAX : 1; for(card = 0; card < max; card++, opl3sa2_cards_num++) { #if defined CONFIG_ISAPNP || defined CONFIG_ISAPNP_MODULE /* * Please remember that even with CONFIG_ISAPNP defined one * should still be able to disable PNP support for this * single driver! */ if(isapnp && opl3sa2_isapnp_probe(&cfg[card], &cfg_mss[card], &cfg_mpu[card], card) < 0) { if(!opl3sa2_cards_num) printk(KERN_INFO "opl3sa2: No PnP cards found\n"); if(io == -1) break; isapnp=0; printk(KERN_INFO "opl3sa2: Search for a card at 0x%d.\n", io); /* Fall through */ } #endif /* If a user wants an I/O then assume they meant it */ if(!isapnp) { if(io == -1 || irq == -1 || dma == -1 || dma2 == -1 || mss_io == -1) { printk(KERN_ERR "opl3sa2: io, mss_io, irq, dma, and dma2 must be set\n"); return -EINVAL; } /* * Our own config: * (NOTE: IRQ and DMA aren't used, so they're set to * give pretty output from conf_printf. :) */ cfg[card].io_base = io; cfg[card].irq = irq; cfg[card].dma = dma; cfg[card].dma2 = dma2; /* The MSS config: */ cfg_mss[card].io_base = mss_io; cfg_mss[card].irq = irq; cfg_mss[card].dma = dma; cfg_mss[card].dma2 = dma2; cfg_mss[card].card_subtype = 1; /* No IRQ or DMA setup */ cfg_mpu[card].io_base = mpu_io; cfg_mpu[card].irq = irq; cfg_mpu[card].dma = -1; cfg_mpu[card].always_detect = 1; /* Use shared IRQs */ /* Call me paranoid: */ opl3sa2_clear_slots(&cfg[card]); opl3sa2_clear_slots(&cfg_mss[card]); opl3sa2_clear_slots(&cfg_mpu[card]); } if(!probe_opl3sa2(&cfg[card], card) || !probe_opl3sa2_mss(&cfg_mss[card])) { /* * If one or more cards are already registered, don't * return an error but print a warning. Note, this * should never really happen unless the hardware or * ISA PnP screwed up. */ if(opl3sa2_cards_num) { printk(KERN_WARNING "opl3sa2: There was a problem probing one " " of the ISA PNP cards, continuing\n"); opl3sa2_cards_num--; continue; } else return -ENODEV; } attach_opl3sa2(&cfg[card], card); conf_printf(chipset_name[card], &cfg[card]); attach_opl3sa2_mss(&cfg_mss[card]); attach_opl3sa2_mixer(&cfg[card], card); /* * Set the Yamaha 3D enhancement mode (aka Ymersion) if asked to and * it's supported. */ if(ymode != -1) { if(chipset[card] == CHIPSET_OPL3SA2) { printk(KERN_ERR "opl3sa2: ymode not supported on OPL3-SA2\n"); } else { opl3sa2_set_ymode(&cfg[card], ymode); } } /* Set A/D input to Mono loopback if asked to. */ if(loopback != -1) { opl3sa2_set_loopback(&cfg[card], loopback); } /* Attach MPU if we've been asked to do so */ if(cfg_mpu[card].io_base != -1) { if(probe_opl3sa2_mpu(&cfg_mpu[card])) { attach_opl3sa2_mpu(&cfg_mpu[card]); } } } if(isapnp) { printk(KERN_NOTICE "opl3sa2: %d PnP card(s) found.\n", opl3sa2_cards_num); } return 0; }
/* * Install a OPL3SA2 based card. * * Need to have ad1848 and mpu401 loaded ready. */ int init_module(void) { int i; if(io == -1 || irq == -1 || dma == -1 || dma2 == -1 || mss_io == -1) { printk(KERN_ERR "%s: io, mss_io, irq, dma, and dma2 must be set.\n", __FILE__); return -EINVAL; } /* Our own config: */ cfg.io_base = io; cfg.irq = irq; cfg.dma = dma; cfg.dma2 = dma2; /* The MSS config: */ mss_cfg.io_base = mss_io; mss_cfg.irq = irq; mss_cfg.dma = dma; mss_cfg.dma2 = dma2; mss_cfg.card_subtype = 1; /* No IRQ or DMA setup */ /* Call me paranoid: */ for(i = 0; i < 6; i++) { cfg.slots[i] = mss_cfg.slots[i] = mpu_cfg.slots[i] = -1; } if(probe_opl3sa2(&cfg) == 0) { return -ENODEV; } if(probe_opl3sa2_mss(&mss_cfg) == 0) { return -ENODEV; } attach_opl3sa2(&cfg); attach_opl3sa2_mss(&mss_cfg); #if (defined(CONFIG_MPU401) || defined(CONFIG_MPU_EMU)) && defined(CONFIG_MIDI) if(mpu_io != -1) { /* MPU config: */ mpu_cfg.io_base = mpu_io; mpu_cfg.irq = irq; mpu_cfg.dma = dma; mpu_cfg.always_detect = 1; /* It's there, so use shared IRQs */ if(probe_opl3sa2_mpu(&mpu_cfg)) { attach_opl3sa2_mpu(&mpu_cfg); } } #endif SOUND_LOCK; return 0; }