3 * linux/kernel/chr_drv/sound/gus_card.c
5 * Detection routine for the Gravis Ultrasound.
7 * (C) 1993 Hannu Savolainen (hsavolai@cs.helsinki.fi) See COPYING for further
8 * details. Should be distributed with this file.
11 #include "sound_config.h"
13 #if defined(CONFIGURE_SOUNDCARD) && !defined(EXCLUDE_GUS)
19 int gus_base, gus_irq, gus_dma;
22 set_gus_irq (int interrupt_level)
29 sa.sa_handler = gusintr;
31 #ifdef SND_SA_INTERRUPT
32 sa.sa_flags = SA_INTERRUPT;
38 sa.sa_restorer = NULL;
40 retcode = irqaction (interrupt_level, &sa);
44 printk ("GUS: IRQ%d already in use\n", interrupt_level);
48 /* # error Unimplemented for this OS */
54 gus_set_midi_irq (int interrupt_level)
61 sa.sa_handler = gus_midi_interrupt;
63 #ifdef SND_SA_INTERRUPT
64 sa.sa_flags = SA_INTERRUPT;
70 sa.sa_restorer = NULL;
72 retcode = irqaction (interrupt_level, &sa);
76 printk ("GUS: IRQ%d already in use\n", interrupt_level);
80 /* # error Unimplemented for this OS */
86 attach_gus_card (long mem_start, struct address_info *hw_config)
90 set_gus_irq (hw_config->irq);
92 if (gus_wave_detect (hw_config->io_base)) /* Try first the default */
94 mem_start = gus_wave_init (mem_start, hw_config->irq, hw_config->dma);
96 mem_start = gus_midi_init (mem_start);
101 #ifndef EXCLUDE_GUS_IODETECT
104 * Look at the possible base addresses (0x2X0, X=1, 2, 3, 4, 5, 6)
107 for (io_addr = 0x210; io_addr <= 0x260; io_addr += 0x10)
108 if (io_addr != hw_config->io_base) /* Already tested */
109 if (gus_wave_detect (io_addr))
111 printk (" WARNING! GUS found at %03x, config was %03x ", io_addr, hw_config->io_base);
112 mem_start = gus_wave_init (mem_start, hw_config->irq, hw_config->dma);
114 mem_start = gus_midi_init (mem_start);
121 return mem_start; /* Not detected */
125 probe_gus (struct address_info *hw_config)
129 if (gus_wave_detect (hw_config->io_base))
132 #ifndef EXCLUDE_GUS_IODETECT
135 * Look at the possible base addresses (0x2X0, X=1, 2, 3, 4, 5, 6)
138 for (io_addr = 0x210; io_addr <= 0x260; io_addr += 0x10)
139 if (io_addr != hw_config->io_base) /* Already tested */
140 if (gus_wave_detect (io_addr))
155 if (!(src = INB (u_IrqStatus)))
158 if (src & DMA_TC_IRQ)
163 if (src & (MIDI_TX_IRQ | MIDI_RX_IRQ))
166 gus_midi_interrupt (0);
170 if (src & (GF1_TIMER1_IRQ | GF1_TIMER2_IRQ))
173 gus_write8 (0x45, 0); /* Timer control */
176 if (src & (WAVETABLE_IRQ | ENVELOPE_IRQ))