diff options
author | kato <kato@FreeBSD.org> | 1999-04-02 08:51:06 +0000 |
---|---|---|
committer | kato <kato@FreeBSD.org> | 1999-04-02 08:51:06 +0000 |
commit | c6e82c444c39a44a6e20c98c83baf73d1db9c4da (patch) | |
tree | 87d50eadd417b1ad050a622e350b52d9ca84f281 /sys/i386/isa/sound | |
parent | 1e7868a058ae6739b34cf6e0d009af192e8f180c (diff) | |
download | FreeBSD-src-c6e82c444c39a44a6e20c98c83baf73d1db9c4da.zip FreeBSD-src-c6e82c444c39a44a6e20c98c83baf73d1db9c4da.tar.gz |
o sys/i386/include/soundcard.h
Add Sound Card ID for the nss(NEC PC-9801-86 Sound System) driver.
Old name of this driver was pcm driver in FreeBSD 2.2.x.
Fix lack of the length of the name member of the synth_info structure.
(attach_mpu401 in sys/i386/isa/sound/mpu401.c requires 33 chars.)
o sys/i386/isa/sound/dev_table.h
Add the DMAbuf flags definition DMA_DISABLE.
Add the nss driver entry.
o sys/i386/isa/sound/dmabuf.c
Add the DMA_DISABLE flag check in DMAbuf_outputintr and DMAbuf_inputintr
to disable DMA control in FIFO only use (nss driver required).
o sys/i386/isa/sound/local.h
Add the nss driver entry.
o sys/i386/isa/sound/mpu401.c
Replace inb function in probe_mpu401 to mpu401_status macro.
Wrap macro argument for above replace.
Add I/O port maping macro for NEC PC-98x1 arch.
Add delay in NEC PC-98x1 arch.
o sys/i386/isa/sound/pcm86.c
Change driver name to avoid name space conflict to new pcm driver.
Fix NEC PC-9801-86 driver to work on RELENG_3 branch or latter.
o sys/i386/isa/sound/sound_calls.h
Fix the mpuintr definition.
Add the nss driver entry.
attach_nss, probe_nss, nssintr
o sys/i386/isa/sound/soundcard.c
Fix lack of the mpuintr registration.
Add the nss driver entry.
o sys/pc98/conf/files.pc98
Add the nss driver entry.
Reviewed by: kato
Submitted by: Akio Morita <amorita@meadow.scphys.kyoto-u.ac.jp>
Diffstat (limited to 'sys/i386/isa/sound')
-rw-r--r-- | sys/i386/isa/sound/dev_table.h | 10 | ||||
-rw-r--r-- | sys/i386/isa/sound/dmabuf.c | 4 | ||||
-rw-r--r-- | sys/i386/isa/sound/local.h | 5 | ||||
-rw-r--r-- | sys/i386/isa/sound/mpu401.c | 24 | ||||
-rw-r--r-- | sys/i386/isa/sound/pcm86.c | 272 | ||||
-rw-r--r-- | sys/i386/isa/sound/sound_calls.h | 7 | ||||
-rw-r--r-- | sys/i386/isa/sound/soundcard.c | 11 |
7 files changed, 199 insertions, 134 deletions
diff --git a/sys/i386/isa/sound/dev_table.h b/sys/i386/isa/sound/dev_table.h index e8332e9..f355163 100644 --- a/sys/i386/isa/sound/dev_table.h +++ b/sys/i386/isa/sound/dev_table.h @@ -135,6 +135,7 @@ struct audio_operations { #define NEEDS_RESTART 1 #define DMA_AUTOMODE 2 #define DMA_DUPLEX 4 +#define DMA_DISABLE 8 int format_mask; /* Bitmask for supported audio formats */ void *devc; /* Driver specific info */ int (*open) (int dev, int mode); @@ -396,6 +397,11 @@ struct driver_info sound_drivers[] = { attach_pnp_ad1848, probe_pnp_ad1848}, #endif +#ifdef CONFIG_NSS + {"NSS", 0, SNDCARD_NSS, "NEC PC-9801-86 Sound System", + attach_nss, probe_nss}, +#endif + {NULL, 0, 0, "*?*", NULL, NULL} }; @@ -525,6 +531,10 @@ struct card_info snd_installed_cards[] = { #ifdef CONFIG_YM3812 {SNDCARD_ADLIB, {FM_MONO, 0, 0, -1}, SND_DEFAULT_ENABLE}, #endif + +#ifdef CONFIG_NSS + {SNDCARD_NSS, {NSS_BASE, NSS_IRQ, 0, -1}, SND_DEFAULT_ENABLE}, +#endif /* Define some expansion space */ {0, {0}, 0}, {0, {0}, 0}, diff --git a/sys/i386/isa/sound/dmabuf.c b/sys/i386/isa/sound/dmabuf.c index 269f5ae..81d23de 100644 --- a/sys/i386/isa/sound/dmabuf.c +++ b/sys/i386/isa/sound/dmabuf.c @@ -1187,7 +1187,8 @@ DMAbuf_outputintr(int dev, int event_type) dev, dmap->qlen, dmap->nbufs); return; } - isa_dmadone(0, 0, 0, audio_devs[dev]->dmachan1); + if (!(audio_devs[dev]->flags & DMA_DISABLE)) + isa_dmadone(0, 0, 0, audio_devs[dev]->dmachan1); dmap->qlen--; dmap->qhead = (dmap->qhead + 1) % dmap->nbufs; @@ -1253,6 +1254,7 @@ DMAbuf_inputintr(int dev) #ifdef OS_DMA_INTR sound_dma_intr(dev, audio_devs[dev]->dmap_in, audio_devs[dev]->dmachan2); #endif + if (!(audio_devs[dev]->flags & DMA_DISABLE)) isa_dmadone(0, 0, 0, audio_devs[dev]->dmachan2); #ifdef ALLOW_BUFFER_MAPPING diff --git a/sys/i386/isa/sound/local.h b/sys/i386/isa/sound/local.h index 3f02968..2d81c52 100644 --- a/sys/i386/isa/sound/local.h +++ b/sys/i386/isa/sound/local.h @@ -101,6 +101,11 @@ #define CONFIG_YM3812 #endif +#include "nss.h" +#if NNSS != 0 +#define CONFIG_NSS +#endif + #define ALLOW_POLL /* #undef CONFIG_PAS */ diff --git a/sys/i386/isa/sound/mpu401.c b/sys/i386/isa/sound/mpu401.c index 0bd1412..14c920c 100644 --- a/sys/i386/isa/sound/mpu401.c +++ b/sys/i386/isa/sound/mpu401.c @@ -79,17 +79,23 @@ struct mpu_config { sound_os_info *osp; }; +#ifdef PC98 +#define DATAPORT(base) (base) +#define COMDPORT(base) (base+2) +#define STATPORT(base) (base+2) +#else #define DATAPORT(base) (base) #define COMDPORT(base) (base+1) #define STATPORT(base) (base+1) +#endif /* PC98 */ -#define mpu401_status(devc) inb( STATPORT(devc->base)) +#define mpu401_status(devc) inb( STATPORT((devc)->base)) #define input_avail(devc) (!(mpu401_status(devc)&INPUT_AVAIL)) #define output_ready(devc) (!(mpu401_status(devc)&OUTPUT_READY)) -#define write_command(devc, cmd) outb( COMDPORT(devc->base), cmd) -#define read_data(devc) inb( DATAPORT(devc->base)) +#define write_command(devc, cmd) outb( COMDPORT((devc)->base), cmd) +#define read_data(devc) inb( DATAPORT((devc)->base)) -#define write_data(devc, byte) outb( DATAPORT(devc->base), byte) +#define write_data(devc, byte) outb( DATAPORT((devc)->base), byte) #define OUTPUT_READY 0x40 #define INPUT_AVAIL 0x80 @@ -526,7 +532,11 @@ mpu401_out(int dev, u_char midi_byte) * ready (After reset). Normally it takes just about 10 loops. */ +#ifdef PC98 + for (timeout = 23000; timeout > 0 && !output_ready(devc); timeout--); +#else for (timeout = 3000; timeout > 0 && !output_ready(devc); timeout--); +#endif flags = splhigh(); if (!output_ready(devc)) { @@ -564,7 +574,11 @@ mpu401_command(int dev, mpu_command_rec * cmd) * ready (After reset). Normally it takes just about 10 loops. */ +#ifdef PC98 + timeout = 50000; +#else timeout = 30000; +#endif retry: if (timeout-- <= 0) { printf("MPU-401: Command (0x%x) timeout\n", (int) cmd->cmd); @@ -1129,7 +1143,7 @@ probe_mpu401(struct address_info * hw_config) if (hw_config->always_detect) return 1; - if (inb(hw_config->io_base + 1) == 0xff) { + if (mpu401_status(&tmp_devc) == 0xff) { DDB(printf("MPU401: Port %x looks dead.\n", hw_config->io_base)); return 0; /* Just bus float? */ } diff --git a/sys/i386/isa/sound/pcm86.c b/sys/i386/isa/sound/pcm86.c index 9c16d9a..c6f11f3 100644 --- a/sys/i386/isa/sound/pcm86.c +++ b/sys/i386/isa/sound/pcm86.c @@ -25,7 +25,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: pcm86.c,v 1.5 1998/12/04 22:54:50 archie Exp $ + * $Id: pcm86.c,v 1.7 1999/01/01 08:18:06 peter Exp $ */ /* @@ -40,7 +40,7 @@ #ifdef CONFIGURE_SOUNDCARD -#if !defined(EXCLUDE_PCM86) && !defined(EXCLUDE_AUDIO) +#if !defined(EXCLUDE_NSS) && !defined(EXCLUDE_AUDIO) /* @@ -68,9 +68,9 @@ * Switches for debugging and experiments */ -/* #define PCM86_DEBUG */ +/* #define NSS_DEBUG */ -#ifdef PCM86_DEBUG +#ifdef NSS_DEBUG # ifdef DEB # undef DEB # endif @@ -121,6 +121,7 @@ static struct { int acc; int last_l; int last_r; + sound_os_info *osp; } pcm_s; static struct { @@ -129,7 +130,7 @@ static struct { } tmpbuf; static int my_dev = 0; -static char pcm_initialized = NO; +static char nss_initialized = NO; /* 86-board supports only the following rates. */ static int rates_tbl[8] = { @@ -223,17 +224,17 @@ static pcm_data linear2ulaw[256] = { * Prototypes */ -static int pcm86_detect(struct address_info *); +static int nss_detect(struct address_info *); -static int pcm86_open(int, int); -static void pcm86_close(int); -static void pcm86_output_block(int, unsigned long, int, int, int); -static void pcm86_start_input(int, unsigned long, int, int, int); -static int pcm86_ioctl(int, unsigned int, unsigned int, int); -static int pcm86_prepare_for_input(int, int, int); -static int pcm86_prepare_for_output(int, int, int); -static void pcm86_reset(int); -static void pcm86_halt_xfer(int); +static int nss_open(int, int); +static void nss_close(int); +static void nss_output_block(int, unsigned long, int, int, int); +static void nss_start_input(int, unsigned long, int, int, int); +static int nss_ioctl(int, u_int, ioctl_arg, int); +static int nss_prepare_for_input(int, int, int); +static int nss_prepare_for_output(int, int, int); +static void nss_reset(int); +static void nss_halt_xfer(int); static void dsp73_send_command(unsigned char); static void dsp73_send_data(unsigned char); @@ -270,31 +271,31 @@ static void fifo_recv_mono_ulaw(pcm_data *, int); static void fifo_recv_mono_8(pcm_data *, int, int); static void fifo_recv_mono_16le(pcm_data *, int, int); static void fifo_recv_mono_16be(pcm_data *, int, int); -static void pcm_stop(void); -static void pcm_init(void); +static void nss_stop(void); +static void nss_init(void); /* * Identity */ -static struct audio_operations pcm86_operations = +static struct audio_operations nss_operations = { "PC-9801-86 SoundBoard", /* filled in properly by auto configuration */ - NOTHING_SPECIAL, + DMA_DISABLE, ( AFMT_MU_LAW | AFMT_U8 | AFMT_S16_LE | AFMT_S16_BE | AFMT_S8 | AFMT_U16_LE | AFMT_U16_BE ), NULL, - pcm86_open, - pcm86_close, - pcm86_output_block, - pcm86_start_input, - pcm86_ioctl, - pcm86_prepare_for_input, - pcm86_prepare_for_output, - pcm86_reset, - pcm86_halt_xfer, + nss_open, + nss_close, + nss_output_block, + nss_start_input, + nss_ioctl, + nss_prepare_for_input, + nss_prepare_for_output, + nss_reset, + nss_halt_xfer, NULL, NULL }; @@ -525,11 +526,11 @@ fifo_output_block(void) count = fifo_send(pcm_s.pdma_buf, chunksize); } else { /* ??? something wrong... */ - printk("pcm0: chunkcount overrun\n"); + printf("nss0: chunkcount overrun\n"); chunksize = count = 0; } - if (((audio_devs[my_dev]->dmap->qlen < 2) && (pcm_s.pdma_chunkcount == 0)) + if (((audio_devs[my_dev]->dmap_out->qlen < 2) && (pcm_s.pdma_chunkcount == 0)) || (count < pcm_s.intr_size)) { /* The sent chunk seems to be the last one. */ fifo_sendtrailer(pcm_s.intr_size); @@ -571,8 +572,8 @@ fifo_send(pcm_data *buf, int count) tmpbuf.size = r; rslt = ((cnt / length) * pcm_s.chipspeed / pcm_s.speed) * pcm_s.bytes * 2; -#ifdef PCM86_DEBUG - printk("fifo_send(): %d bytes sent\n", rslt); +#ifdef NSS_DEBUG + printf("fifo_send(): %d bytes sent\n", rslt); #endif return rslt; } @@ -588,8 +589,8 @@ fifo_sendtrailer(int count) outb(pcm_s.iobase + 12, 0); pcm_s.intr_trailer = YES; -#ifdef PCM86_DEBUG - printk("fifo_sendtrailer(): %d bytes sent\n", count); +#ifdef NSS_DEBUG + printf("fifo_sendtrailer(): %d bytes sent\n", count); #endif } @@ -1099,7 +1100,7 @@ fifo_input_block(void) pcm_s.pdma_count -= chunksize; } else /* ??? something wrong... */ - printk("pcm0: chunkcount overrun\n"); + printf("nss0: chunkcount overrun\n"); } @@ -1125,8 +1126,8 @@ fifo_recv(pcm_data *buf, int count) tmpbuf.size -= count; } -#ifdef PCM86_DEBUG - printk("fifo_recv(): %d bytes received\n", +#ifdef NSS_DEBUG + printf("fifo_recv(): %d bytes received\n", ((count / (pcm_s.bytes << pcm_s.stereo)) * pcm_s.chipspeed / pcm_s.speed) * pcm_s.bytes * 2); #endif @@ -1725,7 +1726,7 @@ fifo_recv_mono_16be(pcm_data *buf, int count, int uflag) static void -pcm_stop(void) +nss_stop(void) { fifo_stop(); /* stop FIFO */ fifo_reset(); /* reset FIFO buffer */ @@ -1738,15 +1739,15 @@ pcm_stop(void) pcm_s.last_l = 0; pcm_s.last_r = 0; - DEB(printk("pcm_stop\n")); + DEB(printf("nss_stop\n")); } static void -pcm_init(void) +nss_init(void) { /* Initialize registers on the board. */ - pcm_stop(); + nss_stop(); if (pcm_s.board_type == PC980173_FAMILY) dsp73_init(); @@ -1755,7 +1756,7 @@ pcm_init(void) /* Initialize driver's status. */ pcm_s.opened = NO; - pcm_initialized = YES; + nss_initialized = YES; } @@ -1764,52 +1765,67 @@ pcm_init(void) */ int -probe_pcm86(struct address_info *hw_config) +probe_nss(struct address_info *hw_config) { - return pcm86_detect(hw_config); + return nss_detect(hw_config); } -long -attach_pcm86(long mem_start, struct address_info *hw_config) +void +attach_nss(struct address_info *hw_config) { if (pcm_s.board_type == NO_SUPPORTED_BOARD) - return mem_start; + return ; /* Initialize the board. */ - pcm_init(); + nss_init(); - printk("pcm0: <%s>", pcm86_operations.name); + conf_printf(nss_operations.name, hw_config); if (num_audiodevs < MAX_AUDIO_DEV) { my_dev = num_audiodevs++; - audio_devs[my_dev] = &pcm86_operations; - audio_devs[my_dev]->buffcount = DSP_BUFFCOUNT; + audio_devs[my_dev] = &nss_operations; + /* audio_devs[my_dev]->buffcount = DSP_BUFFCOUNT; */ audio_devs[my_dev]->buffsize = DSP_BUFFSIZE; -#ifdef PCM86_DEBUG - printk("\nbuffsize = %d", DSP_BUFFSIZE); +#ifdef NSS_DEBUG + printf("\nbuffsize = %d", DSP_BUFFSIZE); #endif } else - printk("pcm0: Too many PCM devices available"); + printf("nss0: Too many PCM devices available"); - return mem_start; + return ; } static int -pcm86_detect(struct address_info *hw_config) +nss_detect(struct address_info *hw_config) { int opna_iobase = 0x188, irq = 12, i; unsigned char tmp; if (hw_config->io_base == -1) { - printf("pcm0: iobase not specified. Assume default port(0x%x)\n", + printf("nss0: iobase not specified. Assume default port(0x%x)\n", PCM86_IOBASE); hw_config->io_base = PCM86_IOBASE; } pcm_s.iobase = hw_config->io_base; /* auto configuration */ + tmp = (inb(pcm_s.iobase) & 0xf0) >> 4; + if (tmp == 0x07) { + /* + * Remap MATE-X PCM Sound ID register (0xA460 -> 0xB460) + * to avoid corrision with 86 Sound System. + */ + /* + printf("nss0: Found MATE-X PCM Sound ID\n"); + printf("nss0: Remaped 0xa460 to 0xb460\n"); + */ + outb(0xc24, 0xe1); + outb(0xc2b, 0x60); + outb(0xc2d, 0xb4); + } + tmp = inb(pcm_s.iobase) & 0xfc; switch ((tmp & 0xf0) >> 4) { case 2: @@ -1890,34 +1906,36 @@ pcm86_detect(struct address_info *hw_config) outb(opna_iobase + 2, 0x30); /* Ok. Detection finished. */ - snprintf(pcm86_operations.name, sizeof(pcm86_operations.name), + snprintf(nss_operations.name, sizeof(nss_operations.name), "%s", board_name[pcm_s.board_type]); - pcm_initialized = NO; + nss_initialized = NO; pcm_s.irq = irq; if ((hw_config->irq > 0) && (hw_config->irq != irq)) - printf("pcm0: change irq %d -> %d\n", hw_config->irq, irq); + printf("nss0: change irq %d -> %d\n", hw_config->irq, irq); hw_config->irq = irq; + pcm_s.osp = hw_config->osp; + return YES; } static int -pcm86_open(int dev, int mode) +nss_open(int dev, int mode) { int err; - if (!pcm_initialized) - return RET_ERROR(ENXIO); + if (!nss_initialized) + return -(ENXIO); if (pcm_s.intr_busy || pcm_s.opened) - return RET_ERROR(EBUSY); + return -(EBUSY); - if ((err = snd_set_irq_handler(pcm_s.irq, pcmintr, "PC-9801-73/86")) < 0) + if ((err = snd_set_irq_handler(pcm_s.irq, nssintr, pcm_s.osp)) < 0) return err; - pcm_stop(); + nss_stop(); tmpbuf.size = 0; pcm_s.intr_mode = IMODE_NONE; @@ -1928,42 +1946,42 @@ pcm86_open(int dev, int mode) static void -pcm86_close(int dev) +nss_close(int dev) { - snd_release_irq(pcm_s.irq); + /* snd_release_irq(pcm_s.irq); */ pcm_s.opened = NO; } static void -pcm86_output_block(int dev, unsigned long buf, int count, int intrflag, +nss_output_block(int dev, unsigned long buf, int count, int intrflag, int dma_restart) { unsigned long flags, cnt; int maxchunksize; -#ifdef PCM86_DEBUG - printk("pcm86_output_block():"); - if (audio_devs[dev]->dmap->flags & DMA_BUSY) - printk(" DMA_BUSY"); - if (audio_devs[dev]->dmap->flags & DMA_RESTART) - printk(" DMA_RESTART"); - if (audio_devs[dev]->dmap->flags & DMA_ACTIVE) - printk(" DMA_ACTIVE"); - if (audio_devs[dev]->dmap->flags & DMA_STARTED) - printk(" DMA_STARTED"); - if (audio_devs[dev]->dmap->flags & DMA_ALLOC_DONE) - printk(" DMA_ALLOC_DONE"); - printk("\n"); +#ifdef NSS_DEBUG + printf("nss_output_block():"); + if (audio_devs[dev]->dmap_out->flags & DMA_BUSY) + printf(" DMA_BUSY"); + if (audio_devs[dev]->dmap_out->flags & DMA_RESTART) + printf(" DMA_RESTART"); + if (audio_devs[dev]->dmap_out->flags & DMA_ACTIVE) + printf(" DMA_ACTIVE"); + if (audio_devs[dev]->dmap_out->flags & DMA_STARTED) + printf(" DMA_STARTED"); + if (audio_devs[dev]->dmap_out->flags & DMA_ALLOC_DONE) + printf(" DMA_ALLOC_DONE"); + printf("\n"); #endif #if 0 DISABLE_INTR(flags); #endif -#ifdef PCM86_DEBUG - printk("pcm86_output_block(): count = %d, intrsize= %d\n", +#ifdef NSS_DEBUG + printf("nss_output_block(): count = %d, intrsize= %d\n", count, pcm_s.intr_size); #endif @@ -2004,25 +2022,25 @@ pcm86_output_block(int dev, unsigned long buf, int count, int intrflag, static void -pcm86_start_input(int dev, unsigned long buf, int count, int intrflag, +nss_start_input(int dev, unsigned long buf, int count, int intrflag, int dma_restart) { unsigned long flags, cnt; int maxchunksize; -#ifdef PCM86_DEBUG - printk("pcm86_start_input():"); - if (audio_devs[dev]->dmap->flags & DMA_BUSY) - printk(" DMA_BUSY"); - if (audio_devs[dev]->dmap->flags & DMA_RESTART) - printk(" DMA_RESTART"); - if (audio_devs[dev]->dmap->flags & DMA_ACTIVE) - printk(" DMA_ACTIVE"); - if (audio_devs[dev]->dmap->flags & DMA_STARTED) - printk(" DMA_STARTED"); - if (audio_devs[dev]->dmap->flags & DMA_ALLOC_DONE) - printk(" DMA_ALLOC_DONE"); - printk("\n"); +#ifdef NSS_DEBUG + printf("nss_start_input():"); + if (audio_devs[dev]->dmap_in->flags & DMA_BUSY) + printf(" DMA_BUSY"); + if (audio_devs[dev]->dmap_in->flags & DMA_RESTART) + printf(" DMA_RESTART"); + if (audio_devs[dev]->dmap_in->flags & DMA_ACTIVE) + printf(" DMA_ACTIVE"); + if (audio_devs[dev]->dmap_in->flags & DMA_STARTED) + printf(" DMA_STARTED"); + if (audio_devs[dev]->dmap_in->flags & DMA_ALLOC_DONE) + printf(" DMA_ALLOC_DONE"); + printf("\n"); #endif #if 0 @@ -2031,8 +2049,8 @@ pcm86_start_input(int dev, unsigned long buf, int count, int intrflag, pcm_s.intr_size = PCM86_INTRSIZE_IN; -#ifdef PCM86_DEBUG - printk("pcm86_start_input(): count = %d, intrsize= %d\n", +#ifdef NSS_DEBUG + printf("nss_start_input(): count = %d, intrsize= %d\n", count, pcm_s.intr_size); #endif @@ -2056,52 +2074,52 @@ pcm86_start_input(int dev, unsigned long buf, int count, int intrflag, static int -pcm86_ioctl(int dev, unsigned int cmd, unsigned int arg, int local) +nss_ioctl(int dev, u_int cmd, ioctl_arg arg, int local) { switch (cmd) { case SOUND_PCM_WRITE_RATE: if (local) - return set_speed(arg); - return IOCTL_OUT(arg, set_speed(IOCTL_IN(arg))); + return set_speed((int) arg); + return *(int *) arg = set_speed((*(int *) arg)); case SOUND_PCM_READ_RATE: if (local) return pcm_s.speed; - return IOCTL_OUT(arg, pcm_s.speed); + return *(int *) arg = pcm_s.speed; case SNDCTL_DSP_STEREO: if (local) - return set_stereo(arg); - return IOCTL_OUT(arg, set_stereo(IOCTL_IN(arg))); + return set_stereo((int) arg); + return *(int *) arg = set_stereo((*(int *) arg)); case SOUND_PCM_WRITE_CHANNELS: if (local) - return set_stereo(arg - 1) + 1; - return IOCTL_OUT(arg, set_stereo(IOCTL_IN(arg) - 1) + 1); + return set_stereo((int) arg - 1) + 1; + return *(int *) arg = set_stereo((*(int *) arg) - 1) + 1; case SOUND_PCM_READ_CHANNELS: if (local) return pcm_s.stereo + 1; - return IOCTL_OUT(arg, pcm_s.stereo + 1); + return *(int *) arg = pcm_s.stereo + 1; case SNDCTL_DSP_SETFMT: if (local) - return set_format(arg); - return IOCTL_OUT(arg, set_format(IOCTL_IN(arg))); + return set_format((int) arg); + return *(int *) arg = set_format((*(int *) arg)); case SOUND_PCM_READ_BITS: if (local) return pcm_s.bytes * 8; - return IOCTL_OUT(arg, pcm_s.bytes * 8); + return *(int *) arg = pcm_s.bytes * 8; } /* Invalid ioctl request */ - return RET_ERROR(EINVAL); + return -(EINVAL); } static int -pcm86_prepare_for_input(int dev, int bufsize, int nbufs) +nss_prepare_for_input(int dev, int bufsize, int nbufs) { pcm_s.intr_size = PCM86_INTRSIZE_IN; pcm_s.intr_mode = IMODE_NONE; @@ -2109,14 +2127,14 @@ pcm86_prepare_for_input(int dev, int bufsize, int nbufs) pcm_s.last_l = 0; pcm_s.last_r = 0; - DEB(printk("pcm86_prepare_for_input\n")); + DEB(printf("nss_prepare_for_input\n")); return 0; } static int -pcm86_prepare_for_output(int dev, int bufsize, int nbufs) +nss_prepare_for_output(int dev, int bufsize, int nbufs) { pcm_s.intr_size = PCM86_INTRSIZE_OUT; pcm_s.intr_mode = IMODE_NONE; @@ -2124,30 +2142,30 @@ pcm86_prepare_for_output(int dev, int bufsize, int nbufs) pcm_s.last_l = 0; pcm_s.last_r = 0; - DEB(printk("pcm86_prepare_for_output\n")); + DEB(printf("nss_prepare_for_output\n")); return 0; } static void -pcm86_reset(int dev) +nss_reset(int dev) { - pcm_stop(); + nss_stop(); } static void -pcm86_halt_xfer(int dev) +nss_halt_xfer(int dev) { - pcm_stop(); + nss_stop(); - DEB(printk("pcm86_halt_xfer\n")); + DEB(printf("nss_halt_xfer\n")); } void -pcmintr(int unit) +nssintr(int unit) { unsigned char tmp; @@ -2157,7 +2175,7 @@ pcmintr(int unit) switch(pcm_s.intr_mode) { case IMODE_OUTPUT: if (pcm_s.intr_trailer) { - DEB(printk("pcmintr(): fifo_reset\n")); + DEB(printf("nssintr(): fifo_reset\n")); fifo_reset(); pcm_s.intr_trailer = NO; pcm_s.intr_busy = NO; @@ -2183,12 +2201,12 @@ pcmintr(int unit) break; default: - pcm_stop(); - printk("pcm0: unexpected interrupt\n"); + nss_stop(); + printf("nss0: unexpected interrupt\n"); } } -#endif /* EXCLUDE_PCM86, EXCLUDE_AUDIO */ +#endif /* EXCLUDE_NSS, EXCLUDE_AUDIO */ #endif /* CONFIGURE_SOUNDCARD */ diff --git a/sys/i386/isa/sound/sound_calls.h b/sys/i386/isa/sound/sound_calls.h index cb00e30..7f96317 100644 --- a/sys/i386/isa/sound/sound_calls.h +++ b/sys/i386/isa/sound/sound_calls.h @@ -184,7 +184,7 @@ void gus_midi_interrupt(int dummy); /* From mpu401.c */ void attach_mpu401(struct address_info * hw_config); int probe_mpu401(struct address_info *hw_config); -void mpuintr(int irq); +ointhand2_t mpuintr; /* From uart6850.c */ void attach_uart6850(struct address_info * hw_config); @@ -286,3 +286,8 @@ int probe_maui(struct address_info *hw_config); /* From sound_pnp.c */ void sound_pnp_init(void); void sound_pnp_disconnect(void); + +/* From pcm86.c */ +void attach_nss(struct address_info * hw_config); +int probe_nss(struct address_info *hw_config); +ointhand2_t nssintr; diff --git a/sys/i386/isa/sound/soundcard.c b/sys/i386/isa/sound/soundcard.c index 648c35a..6c306c9 100644 --- a/sys/i386/isa/sound/soundcard.c +++ b/sys/i386/isa/sound/soundcard.c @@ -130,6 +130,7 @@ struct isa_driver mssdriver = {sndprobe, sndattach, "mss"}; struct isa_driver cssdriver = {sndprobe, sndattach, "css"}; struct isa_driver sscapedriver = {sndprobe, sndattach, "sscape"}; struct isa_driver sscape_mssdriver = {sndprobe, sndattach, "sscape_mss"}; +struct isa_driver nssdriver = {sndprobe, sndattach, "nss"}; short ipri_to_irq(u_short ipri); @@ -324,6 +325,8 @@ driver_to_voxunit(struct isa_driver * driver) return (SNDCARD_TRXPRO); else if (driver == &trixsbdriver) return (SNDCARD_TRXPRO_SB); + else if (driver == &nssdriver) + return (SNDCARD_NSS); else return (0); } @@ -434,6 +437,14 @@ sndattach(struct isa_device * dev) if (strcmp(dname, "uart0") == 0) dev->id_ointr = m6850intr; #endif +#if NMPU > 0 + if (strcmp(dname, "mpu") == 0) + dev->id_ointr = mpuintr; +#endif +#if NNSS > 0 + if (strcmp(dname, "nss") == 0) + dev->id_ointr = nssintr; +#endif unit = driver_to_voxunit(dev->id_driver); hw_config.io_base = dev->id_iobase; |