示例#1
0
/*
 * 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;
}
示例#2
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;
}
示例#3
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;
}