Пример #1
0
int
probe_trix_wss (struct address_info *hw_config)
{
  /*
     * Check if the IO port returns valid signature. The original MS Sound
     * system returns 0x04 while some cards (AudioTriX Pro for example)
     * return 0x00.
   */
  if (!trix_set_wss_port (hw_config))
    return 0;

  if ((INB (hw_config->io_base + 3) & 0x3f) != 0x00)
    {
      DDB (printk ("No MSS signature detected on port 0x%x\n", hw_config->io_base));
      return 0;
    }

  if (hw_config->irq > 11)
    {
      printk ("AudioTriX: Bad WSS IRQ %d\n", hw_config->irq);
      return 0;
    }

  if (hw_config->dma != 0 && hw_config->dma != 1 && hw_config->dma != 3)
    {
      printk ("AudioTriX: Bad WSS DMA %d\n", hw_config->dma);
      return 0;
    }

  /*
     * Check that DMA0 is not in use with a 8 bit board.
   */

  if (hw_config->dma == 0 && INB (hw_config->io_base + 3) & 0x80)
    {
      printk ("AudioTriX: Can't use DMA0 with a 8 bit card\n");
      return 0;
    }

  if (hw_config->irq > 7 && hw_config->irq != 9 && INB (hw_config->io_base + 3) & 0x80)
    {
      printk ("AudioTriX: Can't use IRQ%d with a 8 bit card\n", hw_config->irq);
      return 0;
    }

  return ad1848_detect (hw_config->io_base + 4);
}
Пример #2
0
Файл: trix.c Проект: 274914765/C
static int __init init_trix_wss(struct address_info *hw_config)
{
    static unsigned char dma_bits[4] = {
        1, 2, 0, 3
    };
    struct resource *ports;
    int config_port = hw_config->io_base + 0;
    int dma1 = hw_config->dma, dma2 = hw_config->dma2;
    int old_num_mixers = num_mixers;
    u8 config, bits;
    int ret;
 
    switch(hw_config->irq) {
    case 7:
        bits = 8;
        break;
    case 9:
        bits = 0x10;
        break;
    case 10:
        bits = 0x18;
        break;
    case 11:
        bits = 0x20;
        break;
    default:
        printk(KERN_ERR "AudioTrix: Bad WSS IRQ %d\n", hw_config->irq);
        return 0;
    }

    switch (dma1) {
    case 0:
    case 1:
    case 3:
        break;
    default:
        printk(KERN_ERR "AudioTrix: Bad WSS DMA %d\n", dma1);
        return 0;
    }

    switch (dma2) {
    case -1:
    case 0:
    case 1:
    case 3:
        break;
    default:
        printk(KERN_ERR "AudioTrix: Bad capture DMA %d\n", dma2);
        return 0;
    }

    /*
     * Check if the IO port returns valid signature. The original MS Sound
     * system returns 0x04 while some cards (AudioTrix Pro for example)
     * return 0x00.
     */
    ports = request_region(hw_config->io_base + 4, 4, "ad1848");
    if (!ports) {
        printk(KERN_ERR "AudioTrix: MSS I/O port conflict (%x)\n", hw_config->io_base);
        return 0;
    }

    if (!request_region(hw_config->io_base, 4, "MSS config")) {
        printk(KERN_ERR "AudioTrix: MSS I/O port conflict (%x)\n", hw_config->io_base);
        release_region(hw_config->io_base + 4, 4);
        return 0;
    }

    if (!trix_set_wss_port(hw_config))
        goto fail;

    config = inb(hw_config->io_base + 3);

    if ((config & 0x3f) != 0x00)
    {
        MDB(printk(KERN_ERR "No MSS signature detected on port 0x%x\n", hw_config->io_base));
        goto fail;
    }

    /*
     * Check that DMA0 is not in use with a 8 bit board.
     */

    if (dma1 == 0 && config & 0x80)
    {
        printk(KERN_ERR "AudioTrix: Can't use DMA0 with a 8 bit card slot\n");
        goto fail;
    }
    if (hw_config->irq > 9 && config & 0x80)
    {
        printk(KERN_ERR "AudioTrix: Can't use IRQ%d with a 8 bit card slot\n", hw_config->irq);
        goto fail;
    }

    ret = ad1848_detect(ports, NULL, hw_config->osp);
    if (!ret)
        goto fail;

    if (joystick==1)
        trix_write(0x15, 0x80);

    /*
     * Set the IRQ and DMA addresses.
     */

    outb((bits | 0x40), config_port);

    if (dma2 == -1 || dma2 == dma1)
    {
          bits |= dma_bits[dma1];
          dma2 = dma1;
    }
    else
    {
        unsigned char tmp;

        tmp = trix_read(0x13) & ~30;
        trix_write(0x13, tmp | 0x80 | (dma1 << 4));

        tmp = trix_read(0x14) & ~30;
        trix_write(0x14, tmp | 0x80 | (dma2 << 4));
    }

    outb((bits), config_port);    /* Write IRQ+DMA setup */

    hw_config->slots[0] = ad1848_init("AudioTrix Pro", ports,
                      hw_config->irq,
                      dma1,
                      dma2,
                      0,
                      hw_config->osp,
                      THIS_MODULE);

    if (num_mixers > old_num_mixers)    /* Mixer got installed */
    {
        AD1848_REROUTE(SOUND_MIXER_LINE1, SOUND_MIXER_LINE);    /* Line in */
        AD1848_REROUTE(SOUND_MIXER_LINE2, SOUND_MIXER_CD);
        AD1848_REROUTE(SOUND_MIXER_LINE3, SOUND_MIXER_SYNTH);        /* OPL4 */
        AD1848_REROUTE(SOUND_MIXER_SPEAKER, SOUND_MIXER_ALTPCM);    /* SB */
    }
    return 1;

fail:
    release_region(hw_config->io_base, 4);
    release_region(hw_config->io_base + 4, 4);
    return 0;
}