summaryrefslogtreecommitdiffstats
path: root/sys/i386/isa/sound/gus_card.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/i386/isa/sound/gus_card.c')
-rw-r--r--sys/i386/isa/sound/gus_card.c225
1 files changed, 108 insertions, 117 deletions
diff --git a/sys/i386/isa/sound/gus_card.c b/sys/i386/isa/sound/gus_card.c
index 0e96df1..2f73ce6 100644
--- a/sys/i386/isa/sound/gus_card.c
+++ b/sys/i386/isa/sound/gus_card.c
@@ -1,10 +1,10 @@
/*
* sound/gus_card.c
- *
+ *
* Detection routine for the Gravis Ultrasound.
- *
+ *
* Copyright by Hannu Savolainen 1993
- *
+ *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met: 1. Redistributions of source code must retain the above copyright
@@ -12,7 +12,7 @@
* Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
- *
+ *
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
@@ -24,147 +24,138 @@
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
- *
+ *
*/
#include <i386/isa/sound/sound_config.h>
-#if defined(CONFIGURE_SOUNDCARD) && !defined(EXCLUDE_GUS)
+#if defined(CONFIG_GUS)
#include <i386/isa/sound/gus_hw.h>
+#include <i386/isa/sound/iwdefs.h>
int gus_base, gus_irq, gus_dma;
extern int gus_wave_volume;
extern int gus_pcm_volume;
extern int have_gus_max;
+extern int gus_timer_enabled;
-long
-attach_gus_card (long mem_start, struct address_info *hw_config)
-{
- int io_addr;
-
- snd_set_irq_handler (hw_config->irq, gusintr, "Gravis Ultrasound");
-
- if (gus_wave_detect (hw_config->io_base)) /*
- * Try first the default
- */
- {
- mem_start = gus_wave_init (mem_start, hw_config->irq, hw_config->dma,
- hw_config->dma_read);
-#ifndef EXCLUDE_MIDI
- mem_start = gus_midi_init (mem_start);
+sound_os_info *gus_osp;
+
+#ifndef NOGUSPNP
+int IwaveOpen(char voices, char mode, struct address_info * hw);
#endif
-#ifndef EXCLUDE_SEQUENCER
- sound_timer_init (hw_config->io_base + 8);
+
+void
+attach_gus_card(struct address_info * hw_config)
+{
+ int io_addr;
+
+ gus_osp = hw_config->osp;
+
+ snd_set_irq_handler(hw_config->irq, gusintr, hw_config->osp);
+
+ if (gus_wave_detect(hw_config->io_base)) {
+ /* Try first the default */
+ gus_wave_init(hw_config);
+
+ /* 0x10c-> is MAX */
+
+ if (hw_config->dma2 != -1 && hw_config->dma2 != hw_config->dma)
+ if (0)
+ printf("gus_card.c: Can't allocate DMA channel2\n");
+#ifdef CONFIG_MIDI
+ gus_midi_init();
#endif
- return mem_start;
+ return ;
}
-
#ifndef EXCLUDE_GUS_IODETECT
- /*
- * Look at the possible base addresses (0x2X0, X=1, 2, 3, 4, 5, 6)
- */
-
- for (io_addr = 0x210; io_addr <= 0x260; io_addr += 0x10)
- if (io_addr != hw_config->io_base) /*
- * Already tested
- */
- if (gus_wave_detect (io_addr))
- {
- printk (" WARNING! GUS found at %x, config was %x ", io_addr, hw_config->io_base);
- mem_start = gus_wave_init (mem_start, hw_config->irq, hw_config->dma,
- hw_config->dma_read);
-#ifndef EXCLUDE_MIDI
- mem_start = gus_midi_init (mem_start);
-#endif
-#ifndef EXCLUDE_SEQUENCER
- sound_timer_init (io_addr + 8);
+ /*
+ * Look at the possible base addresses (0x2X0, X=1, 2, 3, 4, 5, 6)
+ */
+
+ for (io_addr = 0x210; io_addr <= 0x260; io_addr += 0x10)
+ if ( (io_addr != hw_config->io_base) /* Already tested */
+ && (gus_wave_detect(io_addr)) ) {
+ hw_config->io_base = io_addr;
+
+ printf(" WARNING! GUS found at %x, config was %x ",
+ io_addr, hw_config->io_base);
+ gus_wave_init(hw_config);
+ /* 0x10c-> is MAX */
+ if (hw_config->dma2 != -1 && hw_config->dma2 != hw_config->dma)
+ if (0)
+ printf("gus_card.c: Can't allocate DMA channel2\n");
+#ifdef CONFIG_MIDI
+ gus_midi_init();
#endif
- return mem_start;
+ return ;
}
-
#endif
-
- return mem_start; /*
- * Not detected
- */
}
int
-probe_gus (struct address_info *hw_config)
+probe_gus(struct address_info * hw_config)
{
- int io_addr;
-
- if (gus_wave_detect (hw_config->io_base))
- return 1;
+ int io_addr;
-#ifndef EXCLUDE_GUS_IODETECT
-
- /*
- * Look at the possible base addresses (0x2X0, X=1, 2, 3, 4, 5, 6)
- */
-
- for (io_addr = 0x210; io_addr <= 0x260; io_addr += 0x10)
- if (io_addr != hw_config->io_base) /*
- * Already tested
- */
- if (gus_wave_detect (io_addr))
+ gus_osp = hw_config->osp;
+#ifndef NOGUSPNP
+ IwaveOpen((char) 32, (char) GUS_MODE, hw_config);
+#endif
+ if (gus_wave_detect(hw_config->io_base))
return 1;
+ printf("oops I didnt find gus \n");
+#undef EXCLUDE_GUS_IODETECT
+#ifndef EXCLUDE_GUS_IODETECT
+ /*
+ * Look at the possible base addresses (0x2X0, X=1, 2, 3, 4, 5, 6)
+ */
+ for (io_addr = 0x210; io_addr <= 0x260; io_addr += 0x10)
+ if ( (io_addr != hw_config->io_base) /* Already tested */
+ && (gus_wave_detect(io_addr)) ) {
+ hw_config->io_base = io_addr;
+ return 1;
+ }
#endif
- return 0;
+ return 0;
}
void
-gusintr (INT_HANDLER_PARMS (irq, dummy))
+gusintr(int irq)
{
- unsigned char src;
-
-#ifdef linux
- sti ();
-#endif
+ u_char src;
-#ifndef EXCLUDE_GUSMAX
- if (have_gus_max)
-# if defined(__FreeBSD__)
- ad1848_interrupt (INT_HANDLER_CALL (gus_irq));
-# else
- ad1848_interrupt (INT_HANDLER_CALL (irq));
-# endif
+#ifdef CONFIG_GUSMAX
+ if (have_gus_max)
+ ad1848_interrupt(irq);
#endif
- while (1)
- {
- if (!(src = INB (u_IrqStatus)))
- return;
+ for (;;) {
+ if (!(src = inb(u_IrqStatus)))
+ return;
- if (src & DMA_TC_IRQ)
- {
- guswave_dma_irq ();
- }
-
- if (src & (MIDI_TX_IRQ | MIDI_RX_IRQ))
- {
-#ifndef EXCLUDE_MIDI
- gus_midi_interrupt (0);
+ if (src & DMA_TC_IRQ)
+ guswave_dma_irq();
+#ifdef CONFIG_MIDI
+ if (src & (MIDI_TX_IRQ | MIDI_RX_IRQ))
+ gus_midi_interrupt(0);
#endif
- }
-
- if (src & (GF1_TIMER1_IRQ | GF1_TIMER2_IRQ))
- {
-#ifndef EXCLUDE_SEQUENCER
- sound_timer_interrupt ();
+ if (src & (GF1_TIMER1_IRQ | GF1_TIMER2_IRQ)) {
+#ifdef CONFIG_SEQUENCER
+ if (gus_timer_enabled)
+ sound_timer_interrupt();
+ gus_write8(0x45, 0); /* Ack IRQ */
+ gus_timer_command(4, 0x80); /* Reset IRQ flags */
#else
- gus_write8 (0x45, 0); /* Stop timers */
+ gus_write8(0x45, 0); /* Stop timers */
#endif
}
-
- if (src & (WAVETABLE_IRQ | ENVELOPE_IRQ))
- {
- gus_voice_irq ();
- }
+ if (src & (WAVETABLE_IRQ | ENVELOPE_IRQ))
+ gus_voice_irq();
}
}
@@ -173,25 +164,25 @@ gusintr (INT_HANDLER_PARMS (irq, dummy))
/*
* Some extra code for the 16 bit sampling option
*/
-#if defined(CONFIGURE_SOUNDCARD) && !defined(EXCLUDE_GUS16)
+#if defined(CONFIG_GUS16)
int
-probe_gus_db16 (struct address_info *hw_config)
+probe_gus_db16(struct address_info * hw_config)
{
- return ad1848_detect (hw_config->io_base);
+ return ad1848_detect(hw_config->io_base, NULL, hw_config->osp);
}
-long
-attach_gus_db16 (long mem_start, struct address_info *hw_config)
+void
+attach_gus_db16(struct address_info * hw_config)
{
- gus_pcm_volume = 100;
- gus_wave_volume = 90;
-
- ad1848_init ("GUS 16 bit sampling", hw_config->io_base,
- hw_config->irq,
- hw_config->dma,
- hw_config->dma);
- return mem_start;
+ gus_pcm_volume = 100;
+ gus_wave_volume = 90;
+
+ ad1848_init("GUS 16 bit sampling", hw_config->io_base,
+ hw_config->irq,
+ hw_config->dma,
+ hw_config->dma, 0,
+ hw_config->osp);
}
#endif
OpenPOWER on IntegriCloud