diff options
Diffstat (limited to 'sys/i386/isa/sound/sb16_dsp.c')
-rw-r--r-- | sys/i386/isa/sound/sb16_dsp.c | 733 |
1 files changed, 338 insertions, 395 deletions
diff --git a/sys/i386/isa/sound/sb16_dsp.c b/sys/i386/isa/sound/sb16_dsp.c index e3078bca7bf7..1e94e1529026 100644 --- a/sys/i386/isa/sound/sb16_dsp.c +++ b/sys/i386/isa/sound/sb16_dsp.c @@ -1,12 +1,12 @@ /* * sound/sb16_dsp.c - * + * * The low level driver for the SoundBlaster DSP chip. - * + * * (C) 1993 J. Schubert (jsb@sth.ruhr-uni-bochum.de) - * + * * based on SB-driver by (C) Hannu Savolainen - * + * * 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 @@ -14,7 +14,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 @@ -26,543 +26,486 @@ * 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. - * + * */ #define DEB(x) #define DEB1(x) -/* - * #define DEB_DMARES - */ -#include "sound_config.h" +#include <i386/isa/sound/sound_config.h> #include "sb.h" -#include "sb_mixer.h" +#include <i386/isa/sound/sb_mixer.h> +#include <i386/isa/sound/sbcard.h> -#if defined(CONFIGURE_SOUNDCARD) && !defined(EXCLUDE_SB16) && !defined(EXCLUDE_SB) && !defined(EXCLUDE_AUDIO) && !defined(EXCLUDE_SBPRO) +#if defined(CONFIG_SB16) && (NSB > 0) && defined(CONFIG_AUDIO) && defined(CONFIG_SBPRO) -extern int sbc_base; - -static int sb16_dsp_ok = 0;/* +extern sound_os_info *sb_osp; +extern int sbc_base; - * * * * Set to 1 after successful * - * * initialization */ +static int sb16_dsp_ok = 0; static int dsp_16bit = 0; static int dsp_stereo = 0; -static int dsp_current_speed = 8000; /* - - - * * * * DSP_DEFAULT_SPEED; */ +static int dsp_current_speed = 8000; static int dsp_busy = 0; static int dma16, dma8; -static unsigned long dsp_count = 0; - -static int irq_mode = IMODE_NONE; /* - +static int trigger_bits = 0; +static u_long dsp_count = 0; - * * * * IMODE_INPUT, IMODE_OUTPUT - * or * * IMODE_NONE */ +static int irq_mode = IMODE_NONE; static int my_dev = 0; static volatile int intr_active = 0; -static int sb16_dsp_open (int dev, int mode); -static void sb16_dsp_close (int dev); -static void sb16_dsp_output_block (int dev, unsigned long buf, int count, int intrflag, int dma_restart); -static void sb16_dsp_start_input (int dev, unsigned long buf, int count, int intrflag, int dma_restart); -static int sb16_dsp_ioctl (int dev, unsigned int cmd, unsigned int arg, int local); -static int sb16_dsp_prepare_for_input (int dev, int bsize, int bcount); -static int sb16_dsp_prepare_for_output (int dev, int bsize, int bcount); -static void sb16_dsp_reset (int dev); -static void sb16_dsp_halt (int dev); -static int dsp_set_speed (int); -static int dsp_set_stereo (int); -static void dsp_cleanup (void); -int sb_reset_dsp (void); +static int sb16_dsp_open(int dev, int mode); +static void sb16_dsp_close(int dev); +static void sb16_dsp_output_block(int dev, u_long buf, int count, int intrflag, int dma_restart); +static void sb16_dsp_start_input(int dev, u_long buf, int count, int intrflag, int dma_restart); +static int sb16_dsp_ioctl(int dev, u_int cmd, ioctl_arg arg, int local); +static int sb16_dsp_prepare_for_input(int dev, int bsize, int bcount); +static int sb16_dsp_prepare_for_output(int dev, int bsize, int bcount); +static void sb16_dsp_reset(int dev); +static void sb16_dsp_halt(int dev); +static void sb16_dsp_trigger(int dev, int bits); +static int dsp_set_speed(int); +static int dsp_set_stereo(int); +static void dsp_cleanup(void); static struct audio_operations sb16_dsp_operations = { - "SoundBlaster 16", - DMA_AUTOMODE, - AFMT_U8 | AFMT_S16_LE, - NULL, - sb16_dsp_open, - sb16_dsp_close, - sb16_dsp_output_block, - sb16_dsp_start_input, - sb16_dsp_ioctl, - sb16_dsp_prepare_for_input, - sb16_dsp_prepare_for_output, - sb16_dsp_reset, - sb16_dsp_halt, - NULL, - NULL + "SoundBlaster 16", + DMA_AUTOMODE, + AFMT_U8 | AFMT_S16_LE, + NULL, + sb16_dsp_open, + sb16_dsp_close, + sb16_dsp_output_block, + sb16_dsp_start_input, + sb16_dsp_ioctl, + sb16_dsp_prepare_for_input, + sb16_dsp_prepare_for_output, + sb16_dsp_reset, + sb16_dsp_halt, + NULL, + NULL, + NULL, + NULL, + sb16_dsp_trigger }; static int -sb_dsp_command01 (unsigned char val) +sb_dsp_command01(u_char val) { - int i = 1 << 16; + int i = 1 << 16; - while (--i & (!INB (DSP_STATUS) & 0x80)); - if (!i) - printk ("SB16 sb_dsp_command01 Timeout\n"); - return sb_dsp_command (val); + while (--i & (!inb(DSP_STATUS) & 0x80)); + if (!i) + printf("SB16 sb_dsp_command01 Timeout\n"); + return sb_dsp_command(val); } static int -dsp_set_speed (int mode) +dsp_set_speed(int mode) { - DEB (printk ("dsp_set_speed(%d)\n", mode)); - if (mode) - { - if (mode < 5000) - mode = 5000; - if (mode > 44100) - mode = 44100; - dsp_current_speed = mode; + DEB(printf("dsp_set_speed(%d)\n", mode)); + if (mode) { + RANGE (mode, 5000, 44100); + dsp_current_speed = mode; } - return mode; + return mode; } static int -dsp_set_stereo (int mode) +dsp_set_stereo(int mode) { - DEB (printk ("dsp_set_stereo(%d)\n", mode)); - - dsp_stereo = mode; - - return mode; + DEB(printf("dsp_set_stereo(%d)\n", mode)); + dsp_stereo = mode; + return mode; } static int -dsp_set_bits (int arg) +dsp_set_bits(int arg) { - DEB (printk ("dsp_set_bits(%d)\n", arg)); + DEB(printf("dsp_set_bits(%d)\n", arg)); - if (arg) - switch (arg) - { - case 8: - dsp_16bit = 0; - break; - case 16: - dsp_16bit = 1; - break; - default: - dsp_16bit = 0; - } - return dsp_16bit ? 16 : 8; + if (arg) + dsp_16bit = (arg == 16) ? 1 : 0 ; + return dsp_16bit ? 16 : 8; } static int -sb16_dsp_ioctl (int dev, unsigned int cmd, unsigned int arg, int local) +sb16_dsp_ioctl(int dev, u_int cmd, ioctl_arg arg, int local) { - switch (cmd) - { + switch (cmd) { case SOUND_PCM_WRITE_RATE: - if (local) - return dsp_set_speed (arg); - return IOCTL_OUT (arg, dsp_set_speed (IOCTL_IN (arg))); + if (local) + return dsp_set_speed((int) arg); + return *(int *) arg = dsp_set_speed((*(int *) arg)); case SOUND_PCM_READ_RATE: - if (local) - return dsp_current_speed; - return IOCTL_OUT (arg, dsp_current_speed); + if (local) + return dsp_current_speed; + return *(int *) arg = dsp_current_speed; case SNDCTL_DSP_STEREO: - if (local) - return dsp_set_stereo (arg); - return IOCTL_OUT (arg, dsp_set_stereo (IOCTL_IN (arg))); + if (local) + return dsp_set_stereo((int) arg); + return *(int *) arg = dsp_set_stereo((*(int *) arg)); case SOUND_PCM_WRITE_CHANNELS: - if (local) - return dsp_set_stereo (arg - 1) + 1; - return IOCTL_OUT (arg, dsp_set_stereo (IOCTL_IN (arg) - 1) + 1); + if (local) + return dsp_set_stereo((int) arg - 1) + 1; + return *(int *) arg = dsp_set_stereo((*(int *) arg) - 1) + 1; case SOUND_PCM_READ_CHANNELS: - if (local) - return dsp_stereo + 1; - return IOCTL_OUT (arg, dsp_stereo + 1); + if (local) + return dsp_stereo + 1; + return *(int *) arg = dsp_stereo + 1; case SNDCTL_DSP_SETFMT: - if (local) - return dsp_set_bits (arg); - return IOCTL_OUT (arg, dsp_set_bits (IOCTL_IN (arg))); + if (local) + return dsp_set_bits((int) arg); + return *(int *) arg = dsp_set_bits((*(int *) arg)); case SOUND_PCM_READ_BITS: - if (local) - return dsp_16bit ? 16 : 8; - return IOCTL_OUT (arg, dsp_16bit ? 16 : 8); - - case SOUND_PCM_WRITE_FILTER: /* - * NOT YET IMPLEMENTED - */ - if (IOCTL_IN (arg) > 1) - return IOCTL_OUT (arg, RET_ERROR (EINVAL)); + if (local) + return dsp_16bit ? 16 : 8; + return *(int *) arg = dsp_16bit ? 16 : 8; + + case SOUND_PCM_WRITE_FILTER: /* NOT YET IMPLEMENTED */ + if ((*(int *) arg) > 1) + return *(int *) arg = -(EINVAL); + + case FIOASYNC: + if (local) + return 1; + return *(int *) arg = 1; + + case FIONBIO: + if (local) + return 1; + return *(int *) arg = 1; + default: - return RET_ERROR (EINVAL); + return -(EINVAL); } - return RET_ERROR (EINVAL); + return -(EINVAL); } static int -sb16_dsp_open (int dev, int mode) +sb16_dsp_open(int dev, int mode) { - int retval; - - DEB (printk ("sb16_dsp_open()\n")); - if (!sb16_dsp_ok) - { - printk ("SB16 Error: SoundBlaster board not installed\n"); - return RET_ERROR (ENXIO); - } - - if (intr_active) - return RET_ERROR (EBUSY); - - retval = sb_get_irq (); - if (retval < 0) - return retval; + int retval; - sb_reset_dsp (); - - if (ALLOC_DMA_CHN (dma8)) - { - printk ("SB16: Unable to grab DMA%d\n", dma8); - sb_free_irq (); - return RET_ERROR (EBUSY); + DEB(printf("sb16_dsp_open()\n")); + if (!sb16_dsp_ok) { + printf("SB16 Error: SoundBlaster board not installed\n"); + return -(ENXIO); } + if (intr_active) + return -(EBUSY); - if (dma16 != dma8) - if (ALLOC_DMA_CHN (dma16)) - { - printk ("SB16: Unable to grab DMA%d\n", dma16); - sb_free_irq (); - RELEASE_DMA_CHN (dma8); - return RET_ERROR (EBUSY); - } + sb_reset_dsp(); - irq_mode = IMODE_NONE; - dsp_busy = 1; + irq_mode = IMODE_NONE; + dsp_busy = 1; + trigger_bits = 0; - return 0; + return 0; } static void -sb16_dsp_close (int dev) +sb16_dsp_close(int dev) { - unsigned long flags; + u_long flags; - DEB (printk ("sb16_dsp_close()\n")); - sb_dsp_command01 (0xd9); - sb_dsp_command01 (0xd5); + DEB(printf("sb16_dsp_close()\n")); + sb_dsp_command01(0xd9); + sb_dsp_command01(0xd5); - DISABLE_INTR (flags); - RELEASE_DMA_CHN (dma8); + flags = splhigh(); - if (dma16 != dma8) - RELEASE_DMA_CHN (dma16); - sb_free_irq (); - dsp_cleanup (); - dsp_busy = 0; - RESTORE_INTR (flags); + audio_devs[dev]->dmachan1 = dma8; + + dsp_cleanup(); + dsp_busy = 0; + splx(flags); } static void -sb16_dsp_output_block (int dev, unsigned long buf, int count, int intrflag, int dma_restart) +sb16_dsp_output_block(int dev, u_long buf, int count, int intrflag, int dma_restart) { - unsigned long flags, cnt; - - cnt = count; - if (dsp_16bit) - cnt >>= 1; - cnt--; - -#ifdef DEB_DMARES - printk ("output_block: %x %d %d\n", buf, count, intrflag); - if (intrflag) - { - int pos, chan = audio_devs[dev]->dmachan; - - DISABLE_INTR (flags); - clear_dma_ff (chan); - disable_dma (chan); - pos = get_dma_residue (chan); - enable_dma (chan); - RESTORE_INTR (flags); - printk ("dmapos=%d %x\n", pos, pos); - } -#endif - if (audio_devs[dev]->flags & DMA_AUTOMODE && - intrflag && - cnt == dsp_count) - { - irq_mode = IMODE_OUTPUT; - intr_active = 1; - return; /* - * Auto mode on. No need to react - */ + u_long flags, cnt; + + cnt = count; + if (dsp_16bit) + cnt >>= 1; + cnt--; + if (audio_devs[dev]->flags & DMA_AUTOMODE && intrflag && cnt==dsp_count) { + irq_mode = IMODE_OUTPUT; + intr_active = 1; + return; /* Auto mode on. No need to react */ } - DISABLE_INTR (flags); + flags = splhigh(); + + if (dma_restart) { - if (dma_restart) - { - sb16_dsp_halt (dev); - DMAbuf_start_dma (dev, buf, count, DMA_MODE_WRITE); + sb16_dsp_halt(dev); + DMAbuf_start_dma(dev, buf, count, 1); } - sb_dsp_command (0x41); - sb_dsp_command ((unsigned char) ((dsp_current_speed >> 8) & 0xff)); - sb_dsp_command ((unsigned char) (dsp_current_speed & 0xff)); - sb_dsp_command ((unsigned char) (dsp_16bit ? 0xb6 : 0xc6)); - sb_dsp_command ((unsigned char) ((dsp_stereo ? 0x20 : 0) + - (dsp_16bit ? 0x10 : 0))); - sb_dsp_command01 ((unsigned char) (cnt & 0xff)); - sb_dsp_command ((unsigned char) (cnt >> 8)); - - dsp_count = cnt; - irq_mode = IMODE_OUTPUT; - intr_active = 1; - RESTORE_INTR (flags); + + + sb_dsp_command(0x41); + sb_dsp_command((u_char) ((dsp_current_speed >> 8) & 0xff)); + sb_dsp_command((u_char) (dsp_current_speed & 0xff)); + sb_dsp_command((u_char) (dsp_16bit ? 0xb6 : 0xc6)); + dsp_count = cnt; + sb_dsp_command((u_char) ((dsp_stereo ? 0x20 : 0) + + (dsp_16bit ? 0x10 : 0))); + sb_dsp_command((u_char) (cnt & 0xff)); + sb_dsp_command((u_char) (cnt >> 8)); + + irq_mode = IMODE_OUTPUT; + intr_active = 1; + splx(flags); } static void -sb16_dsp_start_input (int dev, unsigned long buf, int count, int intrflag, int dma_restart) +sb16_dsp_start_input(int dev, u_long buf, int count, int intrflag, int dma_restart) { - unsigned long flags, cnt; - - cnt = count; - if (dsp_16bit) - cnt >>= 1; - cnt--; - -#ifdef DEB_DMARES - printk ("start_input: %x %d %d\n", buf, count, intrflag); - if (intrflag) - { - int pos, chan = audio_devs[dev]->dmachan; - - DISABLE_INTR (flags); - clear_dma_ff (chan); - disable_dma (chan); - pos = get_dma_residue (chan); - enable_dma (chan); - RESTORE_INTR (flags); - printk ("dmapos=%d %x\n", pos, pos); - } -#endif - if (audio_devs[dev]->flags & DMA_AUTOMODE && - intrflag && - cnt == dsp_count) - { - irq_mode = IMODE_INPUT; - intr_active = 1; - return; /* - * Auto mode on. No need to react - */ - } - DISABLE_INTR (flags); + u_long flags, cnt; + + cnt = count; + if (dsp_16bit) + cnt >>= 1; + cnt--; - if (dma_restart) - { - sb_reset_dsp (); - DMAbuf_start_dma (dev, buf, count, DMA_MODE_READ); + if (audio_devs[dev]->flags & DMA_AUTOMODE && intrflag && cnt == dsp_count) { + irq_mode = IMODE_INPUT; + intr_active = 1; + return; /* Auto mode on. No need to react */ } + flags = splhigh(); - sb_dsp_command (0x42); - sb_dsp_command ((unsigned char) ((dsp_current_speed >> 8) & 0xff)); - sb_dsp_command ((unsigned char) (dsp_current_speed & 0xff)); - sb_dsp_command ((unsigned char) (dsp_16bit ? 0xbe : 0xce)); - sb_dsp_command ((unsigned char) ((dsp_stereo ? 0x20 : 0) + - (dsp_16bit ? 0x10 : 0))); - sb_dsp_command01 ((unsigned char) (cnt & 0xff)); - sb_dsp_command ((unsigned char) (cnt >> 8)); - - dsp_count = cnt; - irq_mode = IMODE_INPUT; - intr_active = 1; - RESTORE_INTR (flags); + if (dma_restart) { + sb_reset_dsp(); + DMAbuf_start_dma(dev, buf, count, 0); + } + sb_dsp_command(0x42); + sb_dsp_command((u_char) ((dsp_current_speed >> 8) & 0xff)); + sb_dsp_command((u_char) (dsp_current_speed & 0xff)); + sb_dsp_command((u_char) (dsp_16bit ? 0xbe : 0xce)); + dsp_count = cnt; + sb_dsp_command((u_char) ((dsp_stereo ? 0x20 : 0) + + (dsp_16bit ? 0x10 : 0))); + sb_dsp_command01((u_char) (cnt & 0xff)); + sb_dsp_command((u_char) (cnt >> 8)); + + irq_mode = IMODE_INPUT; + intr_active = 1; + splx(flags); } static int -sb16_dsp_prepare_for_input (int dev, int bsize, int bcount) +sb16_dsp_prepare_for_input(int dev, int bsize, int bcount) { - audio_devs[my_dev]->dmachan = dsp_16bit ? dma16 : dma8; - dsp_count = 0; - dsp_cleanup (); - return 0; + audio_devs[my_dev]->dmachan2 = dsp_16bit ? dma16 : dma8; + dsp_count = 0; + dsp_cleanup(); + if (dsp_16bit) + sb_dsp_command(0xd5); /* Halt DMA until trigger() is called */ + else + sb_dsp_command(0xd0); /* Halt DMA until trigger() is called */ + + trigger_bits = 0; + return 0; } static int -sb16_dsp_prepare_for_output (int dev, int bsize, int bcount) +sb16_dsp_prepare_for_output(int dev, int bsize, int bcount) { - audio_devs[my_dev]->dmachan = dsp_16bit ? dma16 : dma8; - dsp_count = 0; - dsp_cleanup (); - return 0; + int fudge = dsp_16bit ? dma16 : dma8; + + isa_dma_release( audio_devs[my_dev]->dmachan1 ); + isa_dma_acquire(fudge); + + audio_devs[my_dev]->dmachan1 = fudge; + dsp_count = 0; + dsp_cleanup(); + if (dsp_16bit) + sb_dsp_command(0xd5); /* Halt DMA until trigger() is called */ + else + sb_dsp_command(0xd0); /* Halt DMA until trigger() is called */ + + trigger_bits = 0; + return 0; +} + +static void +sb16_dsp_trigger(int dev, int bits) +{ + if (bits != 0) + bits = 1; + + if (bits == trigger_bits) /* No change */ + return; + + trigger_bits = bits; + + if (!bits) + sb_dsp_command(0xd0); /* Halt DMA */ + else if (bits & irq_mode) + sb_dsp_command(0xd4); /* Continue DMA */ } static void -dsp_cleanup (void) +dsp_cleanup(void) { - irq_mode = IMODE_NONE; - intr_active = 0; + irq_mode = IMODE_NONE; + intr_active = 0; } static void -sb16_dsp_reset (int dev) +sb16_dsp_reset(int dev) { - unsigned long flags; + u_long flags; - DISABLE_INTR (flags); + flags = splhigh(); - sb_reset_dsp (); - dsp_cleanup (); + sb_reset_dsp(); + dsp_cleanup(); - RESTORE_INTR (flags); + splx(flags); } static void -sb16_dsp_halt (int dev) +sb16_dsp_halt(int dev) { - if (dsp_16bit) - { - sb_dsp_command01 (0xd9); - sb_dsp_command01 (0xd5); - } - else - { - sb_dsp_command01 (0xda); - sb_dsp_command01 (0xd0); + + if (dsp_16bit) { + sb_dsp_command01(0xd9); + sb_dsp_command01(0xd5); + } else { + sb_dsp_command01(0xda); + sb_dsp_command01(0xd0); } + + } static void -set_irq_hw (int level) +set_irq_hw(int level) { - int ival; + int ival; - switch (level) - { + switch (level) { case 5: - ival = 2; - break; + ival = 2; + break; case 7: - ival = 4; - break; + ival = 4; + break; case 9: - ival = 1; - break; + ival = 1; + break; case 10: - ival = 8; - break; + ival = 8; + break; default: - printk ("SB16_IRQ_LEVEL %d does not exist\n", level); - return; + printf("SB16_IRQ_LEVEL %d does not exist\n", level); + return; } - sb_setmixer (IRQ_NR, ival); + sb_setmixer(IRQ_NR, ival); } -long -sb16_dsp_init (long mem_start, struct address_info *hw_config) +void +sb16_dsp_init(struct address_info * hw_config) { - extern int sbc_major, sbc_minor; + if (sbc_major < 4) + return; /* Not a SB16 */ - if (sbc_major < 4) - return mem_start; /* Not a SB16 */ + sprintf(sb16_dsp_operations.name, "SoundBlaster 16 %d.%d", + sbc_major, sbc_minor); -#ifndef SCO - sprintf (sb16_dsp_operations.name, "SoundBlaster 16 %d.%d", sbc_major, sbc_minor); -#endif + conf_printf(sb16_dsp_operations.name, hw_config); - printk (" <%s>", sb16_dsp_operations.name); + if (num_audiodevs < MAX_AUDIO_DEV) { + audio_devs[my_dev = num_audiodevs++] = &sb16_dsp_operations; + audio_devs[my_dev]->dmachan1 = dma8; + audio_devs[my_dev]->buffsize = DSP_BUFFSIZE; - if (num_audiodevs < MAX_AUDIO_DEV) - { - audio_devs[my_dev = num_audiodevs++] = &sb16_dsp_operations; - audio_devs[my_dev]->dmachan = hw_config->dma; - audio_devs[my_dev]->buffcount = 1; - audio_devs[my_dev]->buffsize = DSP_BUFFSIZE; - } - else - printk ("SB: Too many DSP devices available\n"); - sb16_dsp_ok = 1; - return mem_start; + } else + printf("SB: Too many DSP devices available\n"); + sb16_dsp_ok = 1; + return; } int -sb16_dsp_detect (struct address_info *hw_config) +sb16_dsp_detect(struct address_info * hw_config) { - struct address_info *sb_config; - extern int sbc_major; + struct address_info *sb_config; - if (sb16_dsp_ok) - return 1; /* Can't drive two cards */ + if (sb16_dsp_ok) + return 1; /* Can't drive two cards */ - if (!(sb_config = sound_getconf (SNDCARD_SB))) - { - printk ("SB16 Error: Plain SB not configured\n"); - return 0; + if (!(sb_config = sound_getconf(SNDCARD_SB))) { + printf("SB16 Error: Plain SB not configured\n"); + return 0; } + /* + * sb_setmixer(OPSW,0xf); if(sb_getmixer(OPSW)!=0xf) return 0; + */ - /* - * sb_setmixer(OPSW,0xf); if(sb_getmixer(OPSW)!=0xf) return 0; - */ - - if (!sb_reset_dsp ()) - return 0; - - if (sbc_major < 4) /* Set by the plain SB driver */ - return 0; /* Not a SB16 */ - - if (hw_config->dma < 4) - if (hw_config->dma != sb_config->dma) - { - printk ("SB16 Error: Invalid DMA channel %d/%d\n", - sb_config->dma, hw_config->dma); + if (!sb_reset_dsp()) return 0; - } - dma16 = hw_config->dma; - dma8 = sb_config->dma; - set_irq_hw (sb_config->irq); - sb_setmixer (DMA_NR, (1 << hw_config->dma) | (1 << sb_config->dma)); - - DEB (printk ("SoundBlaster 16: IRQ %d DMA %d OK\n", sb_config->irq, hw_config->dma)); - - /* - * dsp_showmessage(0xe3,99); - */ - sb16_dsp_ok = 1; - return 1; + if (sbc_major < 4) /* Set by the plain SB driver */ + return 0; /* Not a SB16 */ + + if (hw_config->dma < 4) + if (hw_config->dma != sb_config->dma) { + printf("SB16 Error: Invalid DMA channel %d/%d\n", + sb_config->dma, hw_config->dma); + return 0; + } + dma16 = hw_config->dma; + dma8 = sb_config->dma; + /* hw_config->irq = 0; sb_config->irq; + hw_config->io_base = sb_config->io_base; + */ + set_irq_hw(sb_config->irq); + + sb_setmixer(DMA_NR, (1 << hw_config->dma) | (1 << sb_config->dma)); + + DEB(printf("SoundBlaster 16: IRQ %d DMA %d OK\n", + sb_config->irq, hw_config->dma)); + + /* + * dsp_showmessage(0xe3,99); + */ + sb16_dsp_ok = 1; + return 1; } void -sb16_dsp_interrupt (int unused) +sb16_dsp_interrupt(int unused) { - int data; - - data = INB (DSP_DATA_AVL16); /* - * Interrupt acknowledge - */ - - if (intr_active) - switch (irq_mode) - { - case IMODE_OUTPUT: - intr_active = 0; - DMAbuf_outputintr (my_dev, 1); - break; + int data; - case IMODE_INPUT: - intr_active = 0; - DMAbuf_inputintr (my_dev); - break; + data = inb(DSP_DATA_AVL16); /* Interrupt acknowledge */ - default: - printk ("SoundBlaster: Unexpected interrupt\n"); - } -} + if (intr_active) + switch (irq_mode) { + case IMODE_OUTPUT: + DMAbuf_outputintr(my_dev, 1); + break; + case IMODE_INPUT: + DMAbuf_inputintr(my_dev); + break; + + default: + printf("SoundBlaster: Unexpected interrupt\n"); + } +} #endif |