1 /* 2 * sound/gus_card.c 3 * 4 * Detection routine for the Gravis Ultrasound. 5 * 6 * Copyright by Hannu Savolainen 1993 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions are 10 * met: 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 2. 12 * Redistributions in binary form must reproduce the above copyright notice, 13 * this list of conditions and the following disclaimer in the documentation 14 * and/or other materials provided with the distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY 17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 19 * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR 20 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 22 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 23 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26 * SUCH DAMAGE. 27 * 28 */ 29
30 #include "sound_config.h"
31
32 #ifdefined(CONFIGURE_SOUNDCARD) && !defined(EXCLUDE_GUS)
33
34 #include "gus_hw.h"
35
36 voidgusintr (int);
37
38 intgus_base, gus_irq, gus_dma;
39
40 long 41 attach_gus_card (longmem_start, structaddress_info *hw_config)
/* */ 42 { 43 intio_addr;
44
45 snd_set_irq_handler (hw_config->irq, gusintr);
46
47 if (gus_wave_detect (hw_config->io_base)) /* Try first the default */ 48 { 49 mem_start = gus_wave_init (mem_start, hw_config->irq, hw_config->dma);
50 #ifndefEXCLUDE_MIDI 51 mem_start = gus_midi_init (mem_start);
52 #endif 53 returnmem_start;
54 } 55
56 #ifndefEXCLUDE_GUS_IODETECT 57
58 /* 59 * Look at the possible base addresses (0x2X0, X=1, 2, 3, 4, 5, 6) 60 */ 61
62 for (io_addr = 0x210; io_addr <= 0x260; io_addr += 0x10)
63 if (io_addr != hw_config->io_base) /* Already tested */ 64 if (gus_wave_detect (io_addr))
65 { 66 printk (" WARNING! GUS found at %x, config was %x ", io_addr, hw_config->io_base);
67 mem_start = gus_wave_init (mem_start, hw_config->irq, hw_config->dma);
68 #ifndefEXCLUDE_MIDI 69 mem_start = gus_midi_init (mem_start);
70 #endif 71 returnmem_start;
72 } 73
74 #endif 75
76 returnmem_start; /* Not detected */ 77 } 78
79 int 80 probe_gus (structaddress_info *hw_config)
/* */ 81 { 82 intio_addr;
83
84 if (gus_wave_detect (hw_config->io_base))
85 return 1;
86
87 #ifndefEXCLUDE_GUS_IODETECT 88
89 /* 90 * Look at the possible base addresses (0x2X0, X=1, 2, 3, 4, 5, 6) 91 */ 92
93 for (io_addr = 0x210; io_addr <= 0x260; io_addr += 0x10)
94 if (io_addr != hw_config->io_base) /* Already tested */ 95 if (gus_wave_detect (io_addr))
96 return 1;
97
98 #endif 99
100 return 0;
101 } 102
103 void 104 gusintr (intunit)
/* */ 105 { 106 unsignedcharsrc;
107
108 #ifdeflinux 109 sti();
110 #endif 111
112 while (1)
113 { 114 if (!(src = INB (u_IrqStatus)))
115 return;
116
117 if (src & DMA_TC_IRQ)
118 { 119 guswave_dma_irq ();
120 } 121
122 if (src & (MIDI_TX_IRQ | MIDI_RX_IRQ))
123 { 124 #ifndefEXCLUDE_MIDI 125 gus_midi_interrupt (0);
126 #endif 127 } 128
129 if (src & (GF1_TIMER1_IRQ | GF1_TIMER2_IRQ))
130 { 131 printk ("T");
132 gus_write8 (0x45, 0); /* Timer control */ 133 } 134
135 if (src & (WAVETABLE_IRQ | ENVELOPE_IRQ))
136 { 137 gus_voice_irq ();
138 } 139 } 140 } 141
142 #endif