Exemplo n.º 1
0
/* 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;
}
Exemplo n.º 2
0
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
}
Exemplo n.º 3
0
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
}
Exemplo n.º 4
0
Arquivo: trix.c Projeto: 274914765/C
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;
}
Exemplo n.º 5
0
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;
}
Exemplo n.º 6
0
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;
}
Exemplo n.º 7
0
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);
}