diff options
-rw-r--r-- | sys/arch/i386/conf/GENERIC | 3 | ||||
-rw-r--r-- | sys/dev/isa/aria.c | 1736 | ||||
-rw-r--r-- | sys/dev/isa/ariareg.h | 138 |
3 files changed, 1 insertions, 1876 deletions
diff --git a/sys/arch/i386/conf/GENERIC b/sys/arch/i386/conf/GENERIC index b027e0c11ea..0d4092c0168 100644 --- a/sys/arch/i386/conf/GENERIC +++ b/sys/arch/i386/conf/GENERIC @@ -1,4 +1,4 @@ -# $OpenBSD: GENERIC,v 1.680 2010/03/03 20:57:28 mk Exp $ +# $OpenBSD: GENERIC,v 1.681 2010/03/27 16:02:19 jakemsr Exp $ # # For further information on compiling OpenBSD kernels, see the config(8) # man page. @@ -737,7 +737,6 @@ gus0 at isa? port 0x220 irq 7 drq 1 drq2 6 # Gravis (drq2 is record drq) ym* at isapnp? mpu* at isapnp? mpu* at isa? port 0x300 # generic MPU, Yamaha SW60XG -#aria0 at isa? port 0x280 irq 10 drq 0 flags 0x1 # Prometheus Aria 16 # OPL[23] FM synthesizers #opl0 at isa? port 0x388 # use only if not attached to sound card diff --git a/sys/dev/isa/aria.c b/sys/dev/isa/aria.c deleted file mode 100644 index 5330eea255f..00000000000 --- a/sys/dev/isa/aria.c +++ /dev/null @@ -1,1736 +0,0 @@ -/* $OpenBSD: aria.c,v 1.13 2006/05/11 18:50:18 miod Exp $ */ - -/* - * Copyright (c) 1995, 1996 Roland C. Dowdeswell. All rights reserved. - * - * 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 - * notice, this list of conditions and the following disclaimer. - * 2. 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. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Roland C. Dowdeswell. - * 4. The name of the authors may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``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 DISCLAIMED. - * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 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. - */ - -/* - * TODO: - * o Test the driver on cards other than a single - * Prometheus Aria 16. - * o Look into where aria_prometheus_kludge() belongs. - * o Add some dma code. It accomplishes its goal by - * direct IO at the moment. - * o Look into return values on aria_set_sr(), if there is - * no matching rate. (I think that this behaves in the - * same way as sbdsp.c) - * o Different programs should be able to open the device - * with O_RDONLY and O_WRONLY at the same time. But I - * do not see support for this in /sys/dev/audio.c, so - * I cannot effectively code it. - * o Separate the debugging code, with a #define. - * Write more into aria_printsc(). - * o Rework the mixer interface. - * o Deal with the lvls better. We need to do better mapping - * between logarithmic scales and the one byte that - * we are passed. - * o Deal better with cards that have no mixer. - * - * roland@imrryr.org - * update from http://www.imrryr.org/NetBSD/hacks/aria/ - */ - -#include "aria.h" -#if NARIA > 0 - -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/errno.h> -#include <sys/ioctl.h> -#include <sys/syslog.h> -#include <sys/device.h> -#include <sys/proc.h> -#include <sys/buf.h> - -#include <machine/cpu.h> -#include <machine/pio.h> - -#include <sys/audioio.h> -#include <dev/audio_if.h> - -#include <dev/mulaw.h> -#include <dev/isa/isavar.h> -#include <dev/isa/isadmavar.h> - -#include <dev/isa/ariareg.h> - -#define FREAD 1 -#define FWRITE 2 - -#ifdef AUDIO_DEBUG -extern void Dprintf(const char *, ...); -#define DPRINTF(x) if (ariadebug) Dprintf x -int ariadebug = 0; -#else -#define DPRINTF(x) -#endif - -struct aria_mixdev_info { - u_char num_channels; - u_char level[2]; - u_char mute; -}; - -struct aria_mixmaster { - u_char num_channels; - u_char level[2]; - u_char treble[2]; - u_char bass[2]; -}; - -struct aria_softc { - struct device sc_dev; /* base device */ - struct isadev sc_id; /* ISA device */ - void *sc_ih; /* interrupt vectoring */ - - u_short sc_iobase; /* I/O port base address */ - u_short sc_irq; /* interrupt */ - u_short sc_drq; /* dma chan */ - - u_short sc_open; /* reference count of open calls */ - u_short sc_play; /* non-paused play chans 2**chan */ - u_short sc_record; /* non-paused record chans 2**chan */ - u_short sc_change; /* to keep track of changes of a type */ - u_short gain[2]; /* left/right gain (play) */ - u_int spkr_state; /* non-null is on */ - - u_long sc_rate; /* Sample rate for input and output */ - u_int sc_encoding; /* audio encoding -- ulaw/linear */ - int sc_chans; /* # of channels */ - int sc_precision; /* # bits per sample */ - - u_long sc_interrupts; /* number of interrupts taken */ - void (*sc_rintr)(void *); /* record transfer completion intr handler */ - void (*sc_pintr)(void *); /* play transfer completion intr handler */ - void *sc_rarg; /* arg for sc_rintr() */ - void *sc_parg; /* arg for sc_pintr() */ - - int sc_blocksize; /* literal dio block size */ - void *sc_rdiobuffer; /* record: where the next samples should be */ - void *sc_pdiobuffer; /* play: where the next samples are */ - - u_short sc_hardware; /* bit field of hardware present */ -#define ARIA_TELEPHONE 0x0001 /* has telephone input */ -#define ARIA_MIXER 0x0002 /* has SC18075 digital mixer */ -#define ARIA_MODEL 0x0004 /* is SC18025 (=0) or SC18026 (=1) */ - - struct aria_mixdev_info aria_mix[6]; - struct aria_mixmaster ariamix_master; - u_char aria_mix_source; -}; - -struct { - int sendcmd; - int wmidi; -} ariaerr; - - - -int ariaprobe(); -void ariaattach(struct device *, struct device *, void *); -void ariaclose(void *); -int ariaopen(dev_t, int); -int aria_getdev(void *, struct audio_device *); - -void aria_do_kludge(u_short, u_short, u_short, u_short, u_short); -void aria_prometheus_kludge(struct isa_attach_args *); - -int aria_set_sr(void *, u_long); -u_long aria_get_sr(void *); -int aria_query_encoding(void *, struct audio_encoding *); -int aria_set_format(void *, u_int, u_int); -int aria_get_encoding(void *); -int aria_get_precision(void *); -int aria_set_channels(void *, int); -int aria_get_channels(void *); -int aria_round_blocksize(void *, int); -int aria_set_out_port(void *, int); -int aria_get_out_port(void *); -int aria_set_in_port(void *, int); -int aria_get_in_port(void *); -int aria_speaker_ctl(void *, int); -int aria_commit_settings(void *); - -int aria_start_output(void *, void *, int, void (*)(), void *); -int aria_start_input(void *, void *, int, void (*)(), void *); - -int aria_halt_input(void *); -int aria_halt_output(void *); -int aria_cont(void *); - -int aria_sendcmd(u_short, u_short, int, int, int); - -u_short aria_getdspmem(u_short, u_short); -u_short aria_putdspmem(u_short, u_short, u_short); - -int aria_intr(void *); -short ariaversion(struct aria_softc *); - -int aria_setfd(void *, int); - -void aria_mix_write(struct aria_softc *, int, int); -int aria_mix_read(struct aria_softc *, int); - -int aria_mixer_set_port(void *, mixer_ctrl_t *); -int aria_mixer_get_port(void *, mixer_ctrl_t *); -int aria_mixer_query_devinfo(void *, mixer_devinfo_t *); - -/* - * Mixer defines... - */ - -struct cfattach aria_ca = { - sizeof(struct aria_softc), ariaprobe, ariaattach -}; - -struct cfdriver aria_cd = { - NULL, "aria", DV_DULL -}; - -struct audio_device aria_device = { - "Aria 16(se)", - "x", - "aria" -}; - -/* - * Define our interface to the higher level audio driver. - */ - -struct audio_hw_if aria_hw_if = { - ariaopen, - ariaclose, - NULL, - aria_set_sr, - aria_get_sr, - aria_set_sr, - aria_get_sr, - aria_query_encoding, - aria_set_format, - aria_get_encoding, - aria_get_precision, - aria_set_channels, - aria_get_channels, - aria_round_blocksize, - aria_set_out_port, - aria_get_out_port, - aria_set_in_port, - aria_get_in_port, - aria_commit_settings, - mulaw_expand, - mulaw_compress, - aria_start_output, - aria_start_input, - aria_halt_input, - aria_halt_output, - aria_cont, - aria_cont, - aria_speaker_ctl, - aria_getdev, - aria_setfd, - aria_mixer_set_port, - aria_mixer_get_port, - aria_mixer_query_devinfo, - 1, /* full-duplex */ - 0, - NULL, - NULL -}; - -/* - * Probe / attach routines. - */ - -/* - * Probe for the aria hardware. - */ -int -ariaprobe(parent, self, aux) - struct device *parent, *self; - void *aux; -{ - register struct aria_softc *sc = (void *)self; - register struct isa_attach_args *ia = aux; - struct cfdata *cf = sc->sc_dev.dv_cfdata; - register u_short iobase = ia->ia_iobase; - static u_char irq_conf[11] = { - -1, -1, 0x01, -1, -1, 0x02, -1, 0x04, -1, 0x01, 0x08 - }; - int i,j; - int flags = cf->cf_flags; - - if (!ARIA_BASE_VALID(ia->ia_iobase)) { - printf("aria: configured iobase %d invalid\n", ia->ia_iobase); - return 0; - } - sc->sc_iobase = iobase; - - if (!ARIA_IRQ_VALID(ia->ia_irq)) { - printf("aria: configured irq %d invalid\n", ia->ia_irq); - return 0; - } - - sc->sc_irq = ia->ia_irq; - - if (flags & ARIAR_PROMETHEUS_KLUDGE) - aria_prometheus_kludge(ia); - - if (aria_reset(sc) != 0) { - DPRINTF(("aria: aria probe failed\n")); - return 0; - } - - ia->ia_iosize = ARIADSP_NPORT; - return 1; -} - - - -/* - * I didn't call this a kludge for - * nothing. This is cribbed from - * ariainit, the author of that - * disassembled some code to discover - * how to set up the initial values of - * the card. Without this, the card - * is dead. (It will not respond to _any_ - * input at all.) - * - * ariainit can be found (ftp) at: - * ftp://ftp.wi.leidenuniv.nl/pub/audio/aria/programming/contrib/ariainit.zip - * currently. - */ - -void -aria_prometheus_kludge(ia) - register struct isa_attach_args *ia; -{ - int i, j; - u_short end; - u_short rba = ia->ia_iobase; - - DPRINTF(("aria_prometheus_kludge\n")); - -/* Begin Config Sequence */ - - outb(0x204, 0x4c); - outb(0x205, 0x42); - outb(0x206, 0x00); - outw(0x200, 0x0f); - outb(0x201, 0x00); - outw(0x200, 0x02); - outb(0x201, rba>>2); - -/* These next three lines set up the iobase, and the irq; and disable the drq. */ - - aria_do_kludge(0x111, ((ia->ia_iobase-0x280)>>2)+0xA0, 0xbf, 0xa0, rba); - aria_do_kludge(0x011, ia->ia_irq-6, 0xf8, 0x00, rba); - aria_do_kludge(0x011, 0x00, 0xef, 0x00, rba); - -/* The rest of these lines just disable everything else */ - - aria_do_kludge(0x113, 0x00, 0x88, 0x00, rba); - aria_do_kludge(0x013, 0x00, 0xf8, 0x00, rba); - aria_do_kludge(0x013, 0x00, 0xef, 0x00, rba); - aria_do_kludge(0x117, 0x00, 0x88, 0x00, rba); - aria_do_kludge(0x017, 0x00, 0xff, 0x00, rba); - -/* End Sequence */ - - outb(0x200, 0x0f); - end = inb(rba); - outw(0x200, 0x0f); - outb(0x201, end|0x80); - inb(0x200); -/* - * This delay is necessary for some reason, - * at least it would crash, and sometimes not - * probe properly if it did not exist. - */ - delay(1000000); -} - -void -aria_do_kludge(func, bits, and, or, rba) - u_short func; - u_short bits; - u_short and; - u_short or; - u_short rba; -{ - u_int i; - if (func & 0x100) { - func &= ~0x100; - if (bits) { - outw(0x200, func-1); - outb(0x201, bits); - } - } else - or |= bits; - - outb(0x200, func); - i = inb(rba); - outw(0x200, func); - outb(0x201, (i&and) | or); -} - -/* - * Attach hardware to driver, attach hardware driver to audio - * pseudo-device driver. - */ -void -ariaattach(parent, self, aux) - struct device *parent, *self; - void *aux; -{ - register struct aria_softc *sc = (struct aria_softc *)self; - struct isa_attach_args *ia = (struct isa_attach_args *)aux; - register u_short iobase = ia->ia_iobase; - register u_short i; - int err; - - sc->sc_ih = isa_intr_establish(ia->ia_ic, ia->ia_irq, IST_EDGE, - IPL_AUDIO, aria_intr, sc, sc->sc_dev.dv_xname); - - i = aria_getdspmem(iobase, ARIAA_HARDWARE_A); - - sc->sc_hardware = 0; - sc->sc_hardware |= ((i>>13)&0x01==1)?ARIA_TELEPHONE:0; - sc->sc_hardware |= (((i>>5)&0x07)==0x04)?ARIA_MIXER:0; - sc->sc_hardware |= (aria_getdspmem(iobase, ARIAA_MODEL_A)==1)?ARIA_MODEL:0; - - sc->sc_open = 0; - sc->sc_play = 0; - sc->sc_record = 0; - sc->sc_rate = 7875; - sc->sc_chans = 1; - sc->sc_change = 1; - sc->sc_blocksize = 1024; - sc->sc_precision = 8; - sc->sc_rintr = 0; - sc->sc_rarg = 0; - sc->sc_pintr = 0; - sc->sc_parg = 0; - sc->gain[0] = 127; - sc->gain[1] = 127; - - for (i=0; i<6; i++) { - if (i == ARIAMIX_TEL_LVL) - sc->aria_mix[i].num_channels = 1; - else - sc->aria_mix[i].num_channels = 2; - sc->aria_mix[i].level[0] = 127; - sc->aria_mix[i].level[1] = 127; - } - - sc->ariamix_master.num_channels = 2; - sc->ariamix_master.level[0] = 222; - sc->ariamix_master.level[1] = 222; - sc->ariamix_master.bass[0] = 127; - sc->ariamix_master.bass[1] = 127; - sc->ariamix_master.treble[0] = 127; - sc->ariamix_master.treble[1] = 127; - sc->aria_mix_source = 0; - - sc->sc_change = 1; - aria_commit_settings(sc); /* so that my cdplayer is at the 'right' vol */ - - printf(": dsp %s", (ARIA_MODEL&sc->sc_hardware)?"SC18026":"SC18025"); - if (ARIA_TELEPHONE&sc->sc_hardware) - printf(", tel"); - if (ARIA_MIXER&sc->sc_hardware) - printf(", SC18075 mixer"); - printf("\n"); - - snprintf(aria_device.version, sizeof aria_device.version, "%s", - (ARIA_MODEL&sc->sc_hardware?"SC18026":"SC18025")); - - if ((err = audio_hardware_attach(&aria_hw_if, sc)) != 0) - printf("aria: could not attach to audio pseudo-device driver (%d)\n", err); -} - -/* - * Various routines to interface to higher level audio driver - */ - -int -ariaopen(dev, flags) - dev_t dev; - int flags; -{ - struct aria_softc *sc; - register u_short iobase = sc->sc_iobase; - int unit = AUDIOUNIT(dev); - short err; - - DPRINTF(("ariaopen() called\n")); - - if (unit >= aria_cd.cd_ndevs) - return ENXIO; - - sc = aria_cd.cd_devs[unit]; - - if (!sc || sc->sc_open != 0) - return ENXIO; - - sc->sc_open = 0; - if (flags&FREAD) - sc->sc_open |= ARIAR_OPEN_RECORD; - if (flags&FWRITE) - sc->sc_open |= ARIAR_OPEN_PLAY; - sc->sc_play = 0; - sc->sc_record= 0; - sc->sc_rintr = 0; - sc->sc_rarg = 0; - sc->sc_pintr = 0; - sc->sc_parg = 0; - sc->sc_change= 1; - - return 0; -} - -int -aria_getdev(addr, retp) - void *addr; - struct audio_device *retp; -{ - *retp = aria_device; - return 0; -} - -#ifdef AUDIO_DEBUG -void -aria_printsc(struct aria_softc *sc) -{ - printf("open %x dmachan %d irq %d iobase %x nintr %d\n", sc->sc_open, sc->sc_drq, - sc->sc_irq, sc->sc_iobase, sc->sc_interrupts); - printf("irate %d encoding %x chans %d\n", sc->sc_rate, sc->encoding, - sc->sc_chans); - printf("\n"); -} -#endif - - -/* - * Various routines to interface to higher level audio driver - */ - -int -aria_set_sr(addr, sr) - void *addr; - u_long sr; -{ - struct aria_softc *sc = addr; - - if (sr<=9000) - sr = 7875; - else if (sr<=15000) - sr = 11025; - else if (sr<=20000) - sr = 15750; - else if (sr<=25000) - sr = 22050; - else if (sr<=40000) - sr = 31500; - else - sr = 44100; - - sc->sc_rate = sr; - return 0; -} - -u_long -aria_get_sr(addr) - void *addr; -{ - struct aria_softc *sc = addr; - return sc->sc_rate; -} - -int -aria_query_encoding(addr, fp) - void *addr; - struct audio_encoding *fp; -{ - register struct aria_softc *sc = addr; - - switch (fp->index) { - case 0: - strlcpy(fp->name, AudioEmulaw, sizeof fp->name); - fp->format_id = AUDIO_ENCODING_ULAW; - break; - case 1: - strlcpy(fp->name, AudioEpcm16, sizeof fp->name); - fp->format_id = AUDIO_ENCODING_PCM16; - break; - default: - return(EINVAL); - /*NOTREACHED*/ - } - - return (0); -} - -int -aria_set_format(addr, enc, precision) - void *addr; - u_int enc, prec; -{ - register struct aria_softc *sc = addr; - - DPRINTF(("aria_set_format\n")); - - switch(enc){ - case AUDIO_ENCODING_ULAW: - case AUDIO_ENCODING_PCM16: - case AUDIO_ENCODING_PCM8: - break; - default: - return (EINVAL); - } - - if (prec!=8 && prec!=16) - return (EINVAL); - - if (sc->encoding!=AUDIO_ENCODING_PCM16 && prec==16) - return (EINVAL); - - sc->sc_encoding = enc; - sc->sc_precision = prec; - return (0); -} - -int -aria_get_encoding(addr) - void *addr; -{ - register struct aria_softc *sc = addr; - - DPRINTF(("aria_get_encoding\n")); - - return(sc->encoding); -} - -int -aria_get_precision(addr) - void *addr; -{ - struct aria_softc *sc = addr; - - DPRINTF(("aria_get_precision\n")); - - return sc->sc_precision; -} - -int -aria_set_channels(addr, chans) - void *addr; - int chans; -{ - struct aria_softc *sc = addr; - - DPRINTF(("aria_set_channels\n")); - - if (chans != 1 && chans != 2) - return EINVAL; - - sc->sc_chans = chans; - - return(0); -} - -int -aria_get_channels(addr) - void *addr; -{ - struct aria_softc *sc = addr; - - DPRINTF(("aria_get_channels\n")); - - return sc->sc_chans; -} - -/* - * There is only one way to output on - * this card. - */ -int -aria_set_out_port(addr, port) - void *addr; - int port; -{ - DPRINTF(("aria_set_out_port\n")); - return(0); -} - -int -aria_get_out_port(addr) - void *addr; -{ - DPRINTF(("aria_get_out_port\n")); - return(ARIAMIX_OUT_LVL); -} - - -int -aria_set_in_port(addr, port) - void *addr; - int port; -{ - register struct aria_softc *sc = addr; - - DPRINTF(("aria_set_in_port\n")); - - if (port<0 || port>6) - return ENXIO; - - sc->aria_mix_source = port; - return(0); -} - -int -aria_get_in_port(addr) - void *addr; -{ - register struct aria_softc *sc = addr; - - DPRINTF(("aria_get_in_port\n")); - - return(sc->aria_mix_source); -} - -/* - * XXX -- to be done - * I should probably just add a mixer thing, and - * access it through here. - */ -int -aria_speaker_ctl(addr, newstate) - void *addr; - int newstate; -{ - return(0); -} - -/* - * Store blocksize in words (what the chipset - * understands), but report and take values - * in bytes. - */ - -int -aria_round_blocksize(addr, blk) - void *addr; - int blk; -{ - int i; - struct aria_softc *sc = addr; - for (i=64; i<1024; i*=2) - if (blk <= i) - break; - sc->sc_blocksize = i; - sc->sc_change = 1; - return(i); -} - -/* - * This is where all of the twiddling goes on. - */ - -int -aria_commit_settings(addr) - void *addr; -{ - struct aria_softc *sc = addr; - register u_short iobase = sc->sc_iobase; - u_char tones[16] = { 7, 6, 5, 4, 3, 2, 1, 0, 8, 9, 10, 11, 12, 13, 14, 15 }; - u_short format; - u_short left, right; - u_short samp; - u_char i; - - DPRINTF(("aria_commit_settings\n")); - - switch (sc->sc_rate) { - case 7875: format = 0x00; samp = 0x60; break; - case 11025: format = 0x00; samp = 0x40; break; - case 15750: format = 0x10; samp = 0x60; break; - case 22050: format = 0x10; samp = 0x40; break; - case 31500: format = 0x10; samp = 0x20; break; - case 44100: format = 0x20; samp = 0x00; break; - default: format = 0x00; samp = 0x40; break; - } - - format |= (sc->sc_chans==2)?1:0; - format |= (sc->sc_precision==16)?2:0; - - aria_sendcmd(iobase, ARIADSPC_FORMAT, format, -1, -1); - outw(iobase+ARIADSP_CONTROL, (inw(iobase+ARIADSP_STATUS)&~0x60)|samp); /* Addition parm for sample rate */ - - if (sc->sc_hardware&ARIA_MIXER) { - for (i=0; i<6; i++) { - u_char source; - switch(i) { - case ARIAMIX_MIC_LVL: source = 0x0001; break; - case ARIAMIX_CD_LVL: source = 0x0002; break; - case ARIAMIX_LINE_IN_LVL: source = 0x0008; break; - case ARIAMIX_TEL_LVL: source = 0x0020; break; - case ARIAMIX_AUX_LVL: source = 0x0010; break; - case ARIAMIX_DAC_LVL: source = 0x0004; break; - default: source = 0x0000; break; - } - - if (source != 0x0000 && source != 0x0004) { - if (sc->aria_mix[i].mute == 1) - aria_sendcmd(iobase, ARIADSPC_INPMONMODE, source, 3, -1); - else - aria_sendcmd(iobase, ARIADSPC_INPMONMODE, source, (sc->aria_mix[i].num_channels==2)?0:1, -1); - - aria_sendcmd(iobase, ARIADSPC_INPMONMODE, 0x8000|source, (sc->aria_mix[i].num_channels==2)?0:1, -1); - aria_sendcmd(iobase, ARIADSPC_MIXERVOL, source, sc->aria_mix[i].level[0] << 7, sc->aria_mix[i].level[1] << 7); - } - - if (sc->aria_mix_source == i) { - aria_sendcmd(iobase, ARIADSPC_ADCSOURCE, source, -1, -1); - - if (sc->sc_open & ARIAR_OPEN_RECORD) - aria_sendcmd(iobase, ARIADSPC_ADCCONTROL, 1, -1, -1); - else - aria_sendcmd(iobase, ARIADSPC_ADCCONTROL, 0, -1, -1); - } - } - - if (sc->sc_chans==2) { - aria_sendcmd(iobase, ARIADSPC_CHAN_VOL, (sc->gain[0]+sc->gain[1])/2, -1, -1); - aria_sendcmd(iobase, ARIADSPC_CHAN_PAN, (sc->gain[0]-sc->gain[1])/4+0x40, -1, -1); - } else { - aria_sendcmd(iobase, ARIADSPC_CHAN_VOL, sc->gain[0], -1, -1); - aria_sendcmd(iobase, ARIADSPC_CHAN_PAN, 0x40, -1, -1); - } - - /* aria_sendcmd(iobase, ARIADSPC_MASMONMODE, (sc->ariamix_master.num_channels==2)?0:1 | (1<<8), -1, -1); */ - aria_sendcmd(iobase, ARIADSPC_MASMONMODE, (sc->ariamix_master.num_channels==2)?0:1, -1, -1); - - aria_sendcmd(iobase, ARIADSPC_MIXERVOL, 0x0004, sc->ariamix_master.level[0] << 7, sc->ariamix_master.level[1] << 7); - - /* Convert treb/bass from byte to soundcard style */ - - left = tones[(sc->ariamix_master.bass[0]>>4)&0x0f]<<8 | tones[(sc->ariamix_master.treble[0]>>4)&0x0f]; - right = tones[(sc->ariamix_master.bass[1]>>4)&0x0f]<<8 | tones[(sc->ariamix_master.treble[1]>>4)&0x0f]; - - aria_sendcmd(iobase, ARIADSPC_TONE, left, right, -1); - } - - if (sc->sc_change != 0) - aria_sendcmd(iobase, ARIADSPC_BLOCKSIZE, sc->sc_blocksize/2, -1, -1); - -/* - * If we think that the card is recording or playing, start it up again here. - * Some of the previous commands turn the channels off. - */ - - if (sc->sc_record&(1<<ARIAR_RECORD_CHAN)) { - aria_sendcmd(iobase, ARIADSPC_START_REC, ARIAR_PLAY_CHAN, -1, -1); - sc->sc_play |= (1<<ARIAR_RECORD_CHAN); - } - - if (sc->sc_play&(1<<ARIAR_PLAY_CHAN)) { - aria_sendcmd(iobase, ARIADSPC_START_PLAY, ARIAR_PLAY_CHAN, -1, -1); - sc->sc_play |= (1<<ARIAR_PLAY_CHAN); - } - - sc->sc_change = 0; - - return(0); -} - -void -ariaclose(addr) - void *addr; -{ - struct aria_softc *sc = addr; - register u_int iobase = sc->sc_iobase; - - DPRINTF(("aria_close sc=0x%x\n", sc)); - - sc->spkr_state = SPKR_OFF; - sc->sc_rintr = 0; - sc->sc_pintr = 0; - sc->sc_rdiobuffer = 0; - sc->sc_pdiobuffer = 0; - - if (sc->sc_play&(1<<ARIAR_PLAY_CHAN) && sc->sc_open & ARIAR_OPEN_PLAY) { - aria_sendcmd(iobase, ARIADSPC_STOP_PLAY, ARIAR_PLAY_CHAN, -1, -1); - sc->sc_play &= ~(1<<ARIAR_PLAY_CHAN); - } - - if (sc->sc_record&(1<<ARIAR_RECORD_CHAN) && sc->sc_open & ARIAR_OPEN_RECORD) { - aria_sendcmd(iobase, ARIADSPC_STOP_REC, ARIAR_RECORD_CHAN, -1, -1); - sc->sc_record &= ~(1<<ARIAR_RECORD_CHAN); - } - - sc->sc_open = 0; - - if (aria_reset(sc) != 0) { - delay(500); - aria_reset(sc); - } -} - -/* - * Reset the hardware. - */ - -int -aria_reset(sc) - register struct aria_softc *sc; -{ - register u_short iobase = sc->sc_iobase; - int fail=0; - - outw(iobase + ARIADSP_CONTROL, ARIAR_ARIA_SYNTH|ARIAR_SR22K|ARIAR_DSPINTWR); - aria_putdspmem(iobase, 0x6102, 0); - - fail |= aria_sendcmd(iobase, ARIADSPC_SYSINIT, 0x0000, 0x0000, 0x0000); - - while (aria_getdspmem(iobase, ARIAA_TASK_A) != 1) - ; - - outw(iobase+ARIADSP_CONTROL, ARIAR_ARIA_SYNTH|ARIAR_SR22K|ARIAR_DSPINTWR|ARIAR_PCINTWR); - fail |= aria_sendcmd(iobase, ARIADSPC_MODE, ARIAV_MODE_NO_SYNTH,-1,-1); - - return (fail); -} - -/* - * Lower-level routines - */ - -u_short -aria_putdspmem(iobase, loc, val) - register u_short iobase; - register u_short loc; - register u_short val; -{ - outw(iobase + ARIADSP_DMAADDRESS, loc); - outw(iobase + ARIADSP_DMADATA, val); -} - -u_short -aria_getdspmem(iobase, loc) - register u_short iobase; - register u_short loc; -{ - outw(iobase+ARIADSP_DMAADDRESS, loc); - return inw(iobase+ARIADSP_DMADATA); -} - -/* - * aria_sendcmd() - * each full DSP command is unified into this - * function. - */ - -int -aria_sendcmd(iobase, command, arg1, arg2, arg3) - u_short iobase; - u_short command; - int arg1; - int arg2; - int arg3; -{ - int i, fail = 0; - - for (i = ARIAR_NPOLL; (inw(iobase + ARIADSP_STATUS) & ARIAR_BUSY) != 0 && i>0; i-- ) - ; - - fail |= (inw(iobase + ARIADSP_STATUS) & ARIAR_BUSY)==0?0:1; - outw(iobase + ARIADSP_WRITE, (u_short) command); - - if (arg1 != -1) { - for (i = ARIAR_NPOLL; (inw(iobase + ARIADSP_STATUS) & ARIAR_BUSY) != 0 && i>0; i-- ) - ; - - fail |= (inw(iobase + ARIADSP_STATUS) & ARIAR_BUSY)==0?0:2; - outw(iobase + ARIADSP_WRITE, (u_short) arg1); - } - - if (arg2 != -1) { - for (i = ARIAR_NPOLL; (inw(iobase + ARIADSP_STATUS) & ARIAR_BUSY) != 0 && i>0; i-- ) - ; - - fail |= (inw(iobase + ARIADSP_STATUS) & ARIAR_BUSY)==0?0:4; - outw(iobase + ARIADSP_WRITE, (u_short) arg2); - } - - if (arg3 != -1) { - for (i = ARIAR_NPOLL; (inw(iobase + ARIADSP_STATUS) & ARIAR_BUSY) != 0 && i>0; i-- ) - ; - - fail |= (inw(iobase + ARIADSP_STATUS) & ARIAR_BUSY)==0?0:8; - outw(iobase + ARIADSP_WRITE, (u_short) arg3); - } - - for (i = ARIAR_NPOLL; (inw(iobase + ARIADSP_STATUS) & ARIAR_BUSY) != 0 && i>0; i-- ) - ; - - fail |= (inw(iobase + ARIADSP_STATUS) & ARIAR_BUSY)==0?0:16; - outw(iobase + ARIADSP_WRITE, (u_short) ARIADSPC_TERM); - -#ifdef AUDIO_DEBUG - if (fail) { - ++ariaerr.sendcmd; - DPRINTF(("aria_sendcmd: failure=(%d) cmd=(0x%x) fail=(0x%x)\n", ariaerr.sendcmd, command, fail)); - return -1; - } -#else - if (fail != 0) { - ++ariaerr.sendcmd; - return -1; - } -#endif - - return 0; -} - -int -aria_halt_input(addr) - void *addr; -{ - register struct aria_softc *sc = addr; - - DPRINTF(("aria_halt_input\n")); - - if (sc->sc_record&(1<<0)) { - aria_sendcmd(sc->sc_iobase, ARIADSPC_STOP_REC, 0, -1, -1); - sc->sc_record &= ~(1<<0); - } - - return(0); -} - -int -aria_halt_output(addr) - void *addr; -{ - register struct aria_softc *sc = addr; - - DPRINTF(("aria_halt_output\n")); - - if (sc->sc_play & (1<<1)) { - aria_sendcmd(sc->sc_iobase, ARIADSPC_STOP_PLAY, 1, -1, -1); - sc->sc_play &= ~(1<<1); - } - - return(0); -} - -/* - * This is not called in dev/audio.c? - */ -int -aria_cont(addr) - void *addr; -{ - register struct aria_softc *sc = addr; - - DPRINTF(("aria_cont\n")); - - if (!(sc->sc_record&(1<<0)) && (sc->sc_open&ARIAR_OPEN_RECORD)) { - aria_sendcmd(sc->sc_iobase, ARIADSPC_START_REC, ARIAR_RECORD_CHAN, -1, -1); - sc->sc_record |= ~(1<<ARIAR_RECORD_CHAN); - } - - if (!(sc->sc_play&(1<<ARIAR_PLAY_CHAN)) && (sc->sc_open&ARIAR_OPEN_PLAY)) { - aria_sendcmd(sc->sc_iobase, ARIADSPC_START_PLAY, 1, -1, -1); - sc->sc_play |= ~(1<<ARIAR_PLAY_CHAN); - } - - return(0); -} - -/* - * Here we just set up the buffers. If we receive - * an interrupt without these set, it is ignored. - */ - -int -aria_start_input(addr, p, cc, intr, arg) - void *addr; - void *p; - int cc; - void (*intr)(); - void *arg; -{ - register struct aria_softc *sc = addr; - register int i; - - DPRINTF(("aria_start_input %d @ %x\n", cc, p)); - - if (cc != sc->sc_blocksize) { - DPRINTF(("aria_start_input reqsize %d not sc_blocksize %d\n", - cc, sc->sc_blocksize)); - return EINVAL; - } - - sc->sc_rarg = arg; - sc->sc_rintr = intr; - sc->sc_rdiobuffer = p; - - if (!(sc->sc_record&(1<<0))) { - aria_sendcmd(sc->sc_iobase, ARIADSPC_START_REC, 0, -1, -1); - sc->sc_record |= (1<<0); - } - - return 0; -} - -int -aria_start_output(addr, p, cc, intr, arg) - void *addr; - void *p; - int cc; - void (*intr)(); - void *arg; -{ - register struct aria_softc *sc = addr; - register int i; - - DPRINTF(("aria_start_output %d @ %x\n", cc, p)); - - if (cc != sc->sc_blocksize) { - DPRINTF(("aria_start_output reqsize %d not sc_blocksize %d\n", - cc, sc->sc_blocksize)); - return EINVAL; - } - - sc->sc_parg = arg; - sc->sc_pintr = intr; - sc->sc_pdiobuffer = p; - - if (!(sc->sc_play&(1<<1))) { - aria_sendcmd(sc->sc_iobase, ARIADSPC_START_PLAY, 1, -1, -1); - sc->sc_play |= (1<<1); - } - - return 0; -} - -/* - * Process an interrupt. This should be a - * request (from the card) to write or read - * samples. - */ -int -aria_intr(arg) - void *arg; -{ - register struct aria_softc *sc = arg; - register u_short iobase = sc->sc_iobase; - register u_short *pdata = sc->sc_pdiobuffer; - register u_short *rdata = sc->sc_rdiobuffer; - u_short address; - int i; - - if (inw(iobase) & 1 != 0x1) - return 0; /* not for us */ - - sc->sc_interrupts++; - - DPRINTF(("aria_intr\n")); - - if ((sc->sc_open & ARIAR_OPEN_PLAY) && (pdata!=NULL)) { - DPRINTF(("aria_intr play=(%x)\n", pdata)); - address = 0x8000 - 2*(sc->sc_blocksize); - address+= aria_getdspmem(iobase, ARIAA_PLAY_FIFO_A); - outw(iobase+ARIADSP_DMAADDRESS, address); - outsw(iobase + ARIADSP_DMADATA, pdata, sc->sc_blocksize/2); - if (sc->sc_pintr != NULL) - (*sc->sc_pintr)(sc->sc_parg); - } - - if ((sc->sc_open & ARIAR_OPEN_RECORD) && (rdata!=NULL)) { - DPRINTF(("aria_intr record=(%x)\n", rdata)); - address = 0x8000 - (sc->sc_blocksize); - address+= aria_getdspmem(iobase, ARIAA_REC_FIFO_A); - outw(iobase+ARIADSP_DMAADDRESS, address); - insw(iobase + ARIADSP_DMADATA, rdata, sc->sc_blocksize/2); - if (sc->sc_rintr != NULL) - (*sc->sc_rintr)(sc->sc_rarg); - } - - aria_sendcmd(iobase, ARIADSPC_TRANSCOMPLETE, -1, -1, -1); - - return 1; -} - -int -aria_setfd(addr, flag) - void *addr; - int flag; -{ -/* - * okay return yes. I'll assume that it will only - * ask when the file open read/write... Or before... - */ - return(0); -} - -int -aria_mixer_set_port(addr, cp) - void *addr; - mixer_ctrl_t *cp; -{ - register struct aria_softc *sc = addr; - int error = EINVAL; - - DPRINTF(("aria_mixer_set_port\n")); - - if (!(ARIA_MIXER&sc->sc_hardware)) /* This could be done better, no mixer still has some controls. */ - return ENXIO; - - if (cp->type == AUDIO_MIXER_VALUE) { - register mixer_level_t *mv = &cp->un.value; - switch (cp->dev) { - case ARIAMIX_MIC_LVL: - if (mv->num_channels == 1 || mv->num_channels == 2) { - sc->aria_mix[ARIAMIX_MIC_LVL].num_channels = mv->num_channels; - sc->aria_mix[ARIAMIX_MIC_LVL].level[0] = mv->level[0]; - sc->aria_mix[ARIAMIX_MIC_LVL].level[1] = mv->level[1]; - error = 0; - } - break; - - case ARIAMIX_LINE_IN_LVL: - if (mv->num_channels == 1 || mv->num_channels == 2) { - sc->aria_mix[ARIAMIX_LINE_IN_LVL].num_channels = mv->num_channels; - sc->aria_mix[ARIAMIX_LINE_IN_LVL].level[0] = mv->level[0]; - sc->aria_mix[ARIAMIX_LINE_IN_LVL].level[1] = mv->level[1]; - error = 0; - } - break; - - case ARIAMIX_CD_LVL: - if (mv->num_channels == 1 || mv->num_channels == 2) { - sc->aria_mix[ARIAMIX_CD_LVL].num_channels = mv->num_channels; - sc->aria_mix[ARIAMIX_CD_LVL].level[0] = mv->level[0]; - sc->aria_mix[ARIAMIX_CD_LVL].level[1] = mv->level[1]; - error = 0; - } - break; - - case ARIAMIX_TEL_LVL: - if (mv->num_channels == 1) { - sc->aria_mix[ARIAMIX_TEL_LVL].num_channels = mv->num_channels; - sc->aria_mix[ARIAMIX_TEL_LVL].level[0] = mv->level[0]; - error = 0; - } - break; - - case ARIAMIX_DAC_LVL: - if (mv->num_channels == 1 || mv->num_channels == 2) { - sc->aria_mix[ARIAMIX_DAC_LVL].num_channels = mv->num_channels; - sc->aria_mix[ARIAMIX_DAC_LVL].level[0] = mv->level[0]; - sc->aria_mix[ARIAMIX_DAC_LVL].level[1] = mv->level[1]; - error = 0; - } - break; - - case ARIAMIX_AUX_LVL: - if (mv->num_channels == 1 || mv->num_channels == 2) { - sc->aria_mix[ARIAMIX_AUX_LVL].num_channels = mv->num_channels; - sc->aria_mix[ARIAMIX_AUX_LVL].level[0] = mv->level[0]; - sc->aria_mix[ARIAMIX_AUX_LVL].level[1] = mv->level[1]; - error = 0; - } - break; - - case ARIAMIX_MASTER_LVL: - if (mv->num_channels == 1 || mv->num_channels == 2) { - sc->ariamix_master.num_channels = mv->num_channels; - sc->ariamix_master.level[0] = mv->level[0]; - sc->ariamix_master.level[1] = mv->level[1]; - error = 0; - } - break; - - case ARIAMIX_MASTER_TREBLE: - if (mv->num_channels == 2) { - sc->ariamix_master.treble[0] = (mv->level[0]==0)?1:mv->level[0]; - sc->ariamix_master.treble[1] = (mv->level[1]==0)?1:mv->level[1]; - error = 0; - } - break; - case ARIAMIX_MASTER_BASS: - if (mv->num_channels == 2) { - sc->ariamix_master.bass[0] = (mv->level[0]==0)?1:mv->level[0]; - sc->ariamix_master.bass[1] = (mv->level[1]==0)?1:mv->level[1]; - error = 0; - } - break; - case ARIAMIX_OUT_LVL: - if (mv->num_channels == 1 || mv->num_channels == 2) { - sc->gain[0] = mv->level[0]; - sc->gain[1] = mv->level[1]; - error = 0; - } - break; - default: - } - } - - if (cp->type == AUDIO_MIXER_ENUM) - switch(cp->dev) { - case ARIAMIX_RECORD_SOURCE: - if (cp->un.ord>=0 && cp->un.ord<=6) { - sc->aria_mix_source = cp->un.ord; - error = 0; - } - break; - - case ARIAMIX_MIC_MUTE: - if (cp->un.ord == 0 || cp->un.ord == 1) { - sc->aria_mix[ARIAMIX_MIC_LVL].mute = cp->un.ord; - error = 0; - } - break; - - case ARIAMIX_LINE_IN_MUTE: - if (cp->un.ord == 0 || cp->un.ord == 1) { - sc->aria_mix[ARIAMIX_LINE_IN_LVL].mute = cp->un.ord; - error = 0; - } - break; - - case ARIAMIX_CD_MUTE: - if (cp->un.ord == 0 || cp->un.ord == 1) { - sc->aria_mix[ARIAMIX_CD_LVL].mute = cp->un.ord; - error = 0; - } - break; - - case ARIAMIX_DAC_MUTE: - if (cp->un.ord == 0 || cp->un.ord == 1) { - sc->aria_mix[ARIAMIX_DAC_LVL].mute = cp->un.ord; - error = 0; - } - break; - - case ARIAMIX_AUX_MUTE: - if (cp->un.ord == 0 || cp->un.ord == 1) { - sc->aria_mix[ARIAMIX_AUX_LVL].mute = cp->un.ord; - error = 0; - } - break; - - case ARIAMIX_TEL_MUTE: - if (cp->un.ord == 0 || cp->un.ord == 1) { - sc->aria_mix[ARIAMIX_TEL_LVL].mute = cp->un.ord; - error = 0; - } - break; - - default: - return ENXIO; - /* NOTREACHED */ - } - - return(error); -} - -int -aria_mixer_get_port(addr, cp) - void *addr; - mixer_ctrl_t *cp; -{ - register struct aria_softc *sc = addr; - int error = EINVAL; - - DPRINTF(("aria_mixer_get_port\n")); - - if (!(ARIA_MIXER&sc->sc_hardware)) /* This could be done better, no mixer still has some controls. */ - return ENXIO; - - switch (cp->dev) { - case ARIAMIX_MIC_LVL: - if (cp->type == AUDIO_MIXER_VALUE) { - cp->un.value.num_channels = sc->aria_mix[ARIAMIX_MIC_LVL].num_channels; - cp->un.value.level[0] = sc->aria_mix[ARIAMIX_MIC_LVL].level[0]; - cp->un.value.level[1] = sc->aria_mix[ARIAMIX_MIC_LVL].level[1]; - error = 0; - } - break; - - case ARIAMIX_LINE_IN_LVL: - if (cp->type == AUDIO_MIXER_VALUE) { - cp->un.value.num_channels = sc->aria_mix[ARIAMIX_LINE_IN_LVL].num_channels; - cp->un.value.level[0] = sc->aria_mix[ARIAMIX_LINE_IN_LVL].level[0]; - cp->un.value.level[1] = sc->aria_mix[ARIAMIX_LINE_IN_LVL].level[1]; - error = 0; - } - break; - - case ARIAMIX_CD_LVL: - if (cp->type == AUDIO_MIXER_VALUE) { - cp->un.value.num_channels = sc->aria_mix[ARIAMIX_CD_LVL].num_channels; - cp->un.value.level[0] = sc->aria_mix[ARIAMIX_CD_LVL].level[0]; - cp->un.value.level[1] = sc->aria_mix[ARIAMIX_CD_LVL].level[1]; - error = 0; - } - break; - - case ARIAMIX_TEL_LVL: - if (cp->type == AUDIO_MIXER_VALUE) { - cp->un.value.num_channels = sc->aria_mix[ARIAMIX_TEL_LVL].num_channels; - cp->un.value.level[0] = sc->aria_mix[ARIAMIX_TEL_LVL].level[0]; - error = 0; - } - break; - case ARIAMIX_DAC_LVL: - if (cp->type == AUDIO_MIXER_VALUE) { - cp->un.value.num_channels = sc->aria_mix[ARIAMIX_DAC_LVL].num_channels; - cp->un.value.level[0] = sc->aria_mix[ARIAMIX_DAC_LVL].level[0]; - cp->un.value.level[1] = sc->aria_mix[ARIAMIX_DAC_LVL].level[1]; - error = 0; - } - break; - - case ARIAMIX_AUX_LVL: - if (cp->type == AUDIO_MIXER_VALUE) { - cp->un.value.num_channels = sc->aria_mix[ARIAMIX_AUX_LVL].num_channels; - cp->un.value.level[0] = sc->aria_mix[ARIAMIX_AUX_LVL].level[0]; - cp->un.value.level[1] = sc->aria_mix[ARIAMIX_AUX_LVL].level[1]; - error = 0; - } - break; - - case ARIAMIX_MIC_MUTE: - if (cp->type == AUDIO_MIXER_ENUM) { - cp->un.ord = sc->aria_mix[ARIAMIX_MIC_LVL].mute; - error = 0; - } - break; - - case ARIAMIX_LINE_IN_MUTE: - if (cp->type == AUDIO_MIXER_ENUM) { - cp->un.ord = sc->aria_mix[ARIAMIX_LINE_IN_LVL].mute; - error = 0; - } - break; - - case ARIAMIX_CD_MUTE: - if (cp->type == AUDIO_MIXER_ENUM) { - cp->un.ord = sc->aria_mix[ARIAMIX_CD_LVL].mute; - error = 0; - } - break; - - case ARIAMIX_DAC_MUTE: - if (cp->type == AUDIO_MIXER_ENUM) { - cp->un.ord = sc->aria_mix[ARIAMIX_DAC_LVL].mute; - error = 0; - } - break; - - case ARIAMIX_AUX_MUTE: - if (cp->type == AUDIO_MIXER_ENUM) { - cp->un.ord = sc->aria_mix[ARIAMIX_AUX_LVL].mute; - error = 0; - } - break; - - case ARIAMIX_TEL_MUTE: - if (cp->type == AUDIO_MIXER_ENUM) { - cp->un.ord = sc->aria_mix[ARIAMIX_TEL_LVL].mute; - error = 0; - } - break; - - case ARIAMIX_MASTER_LVL: - if (cp->type == AUDIO_MIXER_VALUE) { - cp->un.value.num_channels = sc->ariamix_master.num_channels; - cp->un.value.level[0] = sc->ariamix_master.level[0]; - cp->un.value.level[1] = sc->ariamix_master.level[1]; - error = 0; - } - break; - - case ARIAMIX_MASTER_TREBLE: - if (cp->type == AUDIO_MIXER_VALUE) { - cp->un.value.num_channels = 2; - cp->un.value.level[0] = sc->ariamix_master.treble[0]; - cp->un.value.level[1] = sc->ariamix_master.treble[1]; - error = 0; - } - break; - - case ARIAMIX_MASTER_BASS: - if (cp->type == AUDIO_MIXER_VALUE) { - cp->un.value.num_channels = 2; - cp->un.value.level[0] = sc->ariamix_master.bass[0]; - cp->un.value.level[1] = sc->ariamix_master.bass[1]; - error = 0; - } - break; - - case ARIAMIX_OUT_LVL: - if (cp->type == AUDIO_MIXER_VALUE) { - cp->un.value.num_channels = sc->sc_chans; - cp->un.value.level[0] = sc->gain[0]; - cp->un.value.level[1] = sc->gain[1]; - error = 0; - } - break; - case ARIAMIX_RECORD_SOURCE: - if (cp->type == AUDIO_MIXER_ENUM) { - cp->un.ord = sc->aria_mix_source; - error = 0; - } - break; - - default: - return ENXIO; - /* NOT REACHED */ - } - - return(error); -} - -int -aria_mixer_query_devinfo(addr, dip) - void *addr; - register mixer_devinfo_t *dip; -{ - - register struct aria_softc *sc = addr; - - DPRINTF(("aria_mixer_query_devinfo\n")); - - if (!(ARIA_MIXER&sc->sc_hardware)) /* This could be done better, no mixer still has some controls. */ - return ENXIO; - - dip->prev = dip->next = AUDIO_MIXER_LAST; - - switch(dip->index) { - case ARIAMIX_MIC_LVL: - dip->type = AUDIO_MIXER_VALUE; - dip->mixer_class = ARIAMIX_INPUT_CLASS; - dip->next = ARIAMIX_MIC_MUTE; - strlcpy(dip->label.name, AudioNmicrophone, - sizeof dip->label.name); - dip->un.v.num_channels = 2; - strlcpy(dip->un.v.units.name, AudioNvolume, - sizeof dip->un.v.units.name); - break; - - case ARIAMIX_LINE_IN_LVL: - dip->type = AUDIO_MIXER_VALUE; - dip->mixer_class = ARIAMIX_INPUT_CLASS; - dip->next = ARIAMIX_LINE_IN_MUTE; - strlcpy(dip->label.name, AudioNline, sizeof dip->label.name); - dip->un.v.num_channels = 2; - strlcpy(dip->un.v.units.name, AudioNvolume, - sizeof dip->un.v.units.name); - break; - - case ARIAMIX_CD_LVL: - dip->type = AUDIO_MIXER_VALUE; - dip->mixer_class = ARIAMIX_INPUT_CLASS; - dip->next = ARIAMIX_CD_MUTE; - strlcpy(dip->label.name, AudioNcd, sizeof dip->label.name); - dip->un.v.num_channels = 2; - strlcpy(dip->un.v.units.name, AudioNvolume, - sizeof dip->un.v.units.name); - break; - - case ARIAMIX_TEL_LVL: - dip->type = AUDIO_MIXER_VALUE; - dip->mixer_class = ARIAMIX_INPUT_CLASS; - dip->next = ARIAMIX_TEL_MUTE; - strlcpy(dip->label.name, "telephone", sizeof dip->label.name); - dip->un.v.num_channels = 1; - strlcpy(dip->un.v.units.name, AudioNvolume, - sizeof dip->un.v.units.name); - break; - - case ARIAMIX_DAC_LVL: - dip->type = AUDIO_MIXER_VALUE; - dip->mixer_class = ARIAMIX_INPUT_CLASS; - dip->next = ARIAMIX_DAC_MUTE; - strlcpy(dip->label.name, AudioNdac, sizeof dip->label.name); - dip->un.v.num_channels = 1; - strlcpy(dip->un.v.units.name, AudioNvolume, - sizeof dip->un.v.units.name); - break; - - case ARIAMIX_AUX_LVL: - dip->type = AUDIO_MIXER_VALUE; - dip->mixer_class = ARIAMIX_INPUT_CLASS; - dip->next = ARIAMIX_AUX_MUTE; - strlcpy(dip->label.name, AudioNoutput, sizeof dip->label.name); - dip->un.v.num_channels = 1; - strlcpy(dip->un.v.units.name, AudioNvolume, - sizeof dip->un.v.units.name); - break; - - case ARIAMIX_MIC_MUTE: - dip->prev = ARIAMIX_MIC_LVL; - goto mode; - - case ARIAMIX_LINE_IN_MUTE: - dip->prev = ARIAMIX_LINE_IN_LVL; - goto mode; - - case ARIAMIX_CD_MUTE: - dip->prev = ARIAMIX_CD_LVL; - goto mode; - - case ARIAMIX_DAC_MUTE: - dip->prev = ARIAMIX_DAC_LVL; - goto mode; - - case ARIAMIX_AUX_MUTE: - dip->prev = ARIAMIX_AUX_LVL; - goto mode; - - case ARIAMIX_TEL_MUTE: - dip->prev = ARIAMIX_TEL_LVL; - goto mode; - -mode: - dip->mixer_class = ARIAMIX_INPUT_CLASS; - dip->type = AUDIO_MIXER_ENUM; - strlcpy(dip->label.name, AudioNmute, sizeof dip->label.name); - dip->un.e.num_mem = 2; - strlcpy(dip->un.e.member[0].label.name, AudioNoff, - sizeof dip->un.e.member[0].label.name); - dip->un.e.member[0].ord = 0; - strlcpy(dip->un.e.member[1].label.name, AudioNon, - sizeof dip->un.e.member[0].label.name); - dip->un.e.member[1].ord = 1; - break; - - case ARIAMIX_MASTER_LVL: - dip->type = AUDIO_MIXER_VALUE; - dip->mixer_class = ARIAMIX_OUTPUT_CLASS; - dip->next = ARIAMIX_MASTER_TREBLE; - strlcpy(dip->label.name, AudioNvolume, sizeof dip->label.name); - dip->un.v.num_channels = 2; - strlcpy(dip->un.v.units.name, AudioNvolume, - sizeof dip->un.v.units.name); - break; - - case ARIAMIX_MASTER_TREBLE: - dip->type = AUDIO_MIXER_VALUE; - dip->mixer_class = ARIAMIX_OUTPUT_CLASS; - dip->prev = ARIAMIX_MASTER_LVL; - dip->next = ARIAMIX_MASTER_BASS; - strlcpy(dip->label.name, AudioNmaster, sizeof dip->label.name); - dip->un.v.num_channels = 2; - strlcpy(dip->un.v.units.name, AudioNtreble, - sizeof dip->un.v.units.name); - break; - - case ARIAMIX_MASTER_BASS: - dip->type = AUDIO_MIXER_VALUE; - dip->mixer_class = ARIAMIX_OUTPUT_CLASS; - dip->prev = ARIAMIX_MASTER_TREBLE; - strlcpy(dip->label.name, AudioNmaster, sizeof dip->label.name); - dip->un.v.num_channels = 2; - strlcpy(dip->un.v.units.name, AudioNbass, - sizeof dip->un.v.units.name); - break; - - case ARIAMIX_OUT_LVL: - dip->type = AUDIO_MIXER_VALUE; - dip->mixer_class = ARIAMIX_OUTPUT_CLASS; - strlcpy(dip->label.name, AudioNoutput, sizeof dip->label.name); - dip->un.v.num_channels = 2; - strlcpy(dip->un.v.units.name, AudioNvolume, - sizeof dip->un.v.units.name); - break; - - case ARIAMIX_RECORD_SOURCE: - dip->mixer_class = ARIAMIX_RECORD_CLASS; - dip->type = AUDIO_MIXER_ENUM; - strlcpy(dip->label.name, AudioNsource, sizeof dip->label.name); - dip->un.e.num_mem = 6; - strlcpy(dip->un.e.member[0].label.name, AudioNoutput, - sizeof dip->un.e.member[0].label.name); - dip->un.e.member[0].ord = ARIAMIX_AUX_LVL; - strlcpy(dip->un.e.member[1].label.name, AudioNmicrophone, - sizeof dip->un.e.member[0].label.name); - dip->un.e.member[1].ord = ARIAMIX_MIC_LVL; - strlcpy(dip->un.e.member[2].label.name, AudioNdac, - sizeof dip->un.e.member[0].label.name); - dip->un.e.member[2].ord = ARIAMIX_DAC_LVL; - strlcpy(dip->un.e.member[3].label.name, AudioNline, - sizeof dip->un.e.member[0].label.name); - dip->un.e.member[3].ord = ARIAMIX_LINE_IN_LVL; - strlcpy(dip->un.e.member[3].label.name, AudioNcd, - sizeof dip->un.e.member[0].label.name); - dip->un.e.member[4].ord = ARIAMIX_CD_LVL; - strlcpy(dip->un.e.member[3].label.name, "telephone", - sizeof dip->un.e.member[0].label.name); - dip->un.e.member[5].ord = ARIAMIX_TEL_LVL; - break; - - case ARIAMIX_INPUT_CLASS: - dip->type = AUDIO_MIXER_CLASS; - dip->mixer_class = ARIAMIX_INPUT_CLASS; - strlcpy(dip->label.name, AudioCInputs, sizeof dip->label.name); - break; - - case ARIAMIX_OUTPUT_CLASS: - dip->type = AUDIO_MIXER_CLASS; - dip->mixer_class = ARIAMIX_OUTPUT_CLASS; - strlcpy(dip->label.name, AudioCOutputs, - sizeof dip->label.name); - break; - - case ARIAMIX_RECORD_CLASS: - dip->type = AUDIO_MIXER_CLASS; - dip->mixer_class = ARIAMIX_RECORD_CLASS; - strlcpy(dip->label.name, AudioCRecord, sizeof dip->label.name); - break; - - case ARIAMIX_EQ_CLASS: - dip->type = AUDIO_MIXER_CLASS; - dip->mixer_class = ARIAMIX_EQ_CLASS; - strlcpy(dip->label.name, AudioCEqualization, - sizeof dip->label.name); - break; - - default: - return ENXIO; - /*NOTREACHED*/ - } - return 0; -} - -#endif /* NARIA */ diff --git a/sys/dev/isa/ariareg.h b/sys/dev/isa/ariareg.h deleted file mode 100644 index 71c29d1181d..00000000000 --- a/sys/dev/isa/ariareg.h +++ /dev/null @@ -1,138 +0,0 @@ -/* $OpenBSD: ariareg.h,v 1.2 2007/05/25 21:27:15 krw Exp $ */ - -/* - * Copyright (c) 1995, 1996 Roland C. Dowdeswell. All rights reserved. - * - * 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 - * notice, this list of conditions and the following disclaimer. - * 2. 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. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Roland C. Dowdeswell. - * 4. The name of the authors may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``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 DISCLAIMED. - * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 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. - */ - -/* - * Macros to detect valid hardware configuration data. - */ -#define ARIA_IRQ_VALID(irq) ((irq) == 10 || (irq) == 11 || (irq) == 12) -#define ARIA_DRQ_VALID(chan) ((chan) == 5 || (chan) == 6) -#define ARIA_BASE_VALID(base) ((base) == 0x290 || (base) == 0x280 || (base) == 0x2a0 || (base) == 0x2b0) - -/* - * Aria DSP ports - * (abrieviated ARIADSP_) - */ - -#define ARIADSP_NPORT 8 - -#define ARIADSP_DSPDATA 0 -#define ARIADSP_WRITE 0 -#define ARIADSP_STATUS 2 -#define ARIADSP_CONTROL 2 -#define ARIADSP_DMAADDRESS 4 -#define ARIADSP_DMADATA 6 - -/* - * Aria DSP Addresses and the like... - * (abrieviated ARIAA_) - */ - -#define ARIAA_HARDWARE_A 0x6050 -#define ARIAA_MODEL_A 0x60c3 -#define ARIAA_PLAY_FIFO_A 0x6100 -#define ARIAA_REC_FIFO_A 0x6101 -#define ARIAA_TASK_A 0x6102 - -/* - * DSP random values - * (abrieviated ARIAR_) - */ - -#define ARIAR_PROMETHEUS_KLUDGE 0x0001 -#define ARIAR_NPOLL 30000 -#define ARIAR_OPEN_PLAY 0x0002 -#define ARIAR_OPEN_RECORD 0x0001 -#define ARIAR_PLAY_CHAN 1 -#define ARIAR_RECORD_CHAN 0 -#define ARIAR_BUSY 0x8000 -#define ARIAR_ARIA_SYNTH 0x0080 -#define ARIAR_SR22K 0x0040 -#define ARIAR_DSPINTWR 0x0008 -#define ARIAR_PCINTWR 0x0002 - -/* - * Aria DSP Commands - * (abrieviated ARIADSPC_) - */ - -#define ARIADSPC_SYSINIT 0x0000 /* Initialise system */ -#define ARIADSPC_FORMAT 0x0003 /* format (pcm8, pcm16, etc) */ -#define ARIADSPC_MASTERVOLUME 0x0004 -#define ARIADSPC_BLOCKSIZE 0x0005 -#define ARIADSPC_MODE 0x0006 -#define ARIADSPC_CDVOLUME 0x0007 -#define ARIADSPC_MICVOLUME 0x0008 -#define ARIADSPC_MIXERCONFIG 0x0009 -#define ARIADSPC_FORCEINTR 0x000a /* Force an Interrupt */ -#define ARIADSPC_TRANSCOMPLETE 0x0010 /* Transfer Complete */ -#define ARIADSPC_START_PLAY 0x0011 -#define ARIADSPC_STOP_PLAY 0x0012 -#define ARIADSPC_CHAN_VOL 0x0013 -#define ARIADSPC_CHAN_PAN 0x0014 -#define ARIADSPC_START_REC 0x0015 -#define ARIADSPC_STOP_REC 0x0016 -#define ARIADSPC_DAPVOL 0x0017 /* Digital Audio Playback Vol */ -#define ARIADSPC_ADCSOURCE 0x0030 -#define ARIADSPC_ADCCONTROL 0x0031 /* Turn ADC off/on */ -#define ARIADSPC_INPMONMODE 0x0032 /* Input Monitor Mode */ -#define ARIADSPC_MASMONMODE 0x0033 /* Master Monitor Mode */ -#define ARIADSPC_MIXERVOL 0x0034 /* Mixer Volumes */ -#define ARIADSPC_TONE 0x0035 /* Tone controls */ -#define ARIADSPC_TERM 0xffff /* End of Command */ - -/* - * DSP values (for commands) - * (abrieviated ARIAV_) - */ - -#define ARIAV_MODE_NO_SYNTH 0x0000 /* No synthesizer mode */ - -#define ARIAMIX_MIC_LVL 0 -#define ARIAMIX_LINE_IN_LVL 1 -#define ARIAMIX_CD_LVL 2 -#define ARIAMIX_DAC_LVL 3 -#define ARIAMIX_TEL_LVL 4 -#define ARIAMIX_AUX_LVL 5 -#define ARIAMIX_MASTER_LVL 6 -#define ARIAMIX_MASTER_TREBLE 7 -#define ARIAMIX_MASTER_BASS 8 -#define ARIAMIX_RECORD_SOURCE 9 -#define ARIAMIX_MIC_MUTE 10 -#define ARIAMIX_LINE_IN_MUTE 11 -#define ARIAMIX_CD_MUTE 12 -#define ARIAMIX_DAC_MUTE 13 -#define ARIAMIX_TEL_MUTE 14 -#define ARIAMIX_AUX_MUTE 15 -#define ARIAMIX_OUT_LVL 16 -#define ARIAMIX_OUTPUT_CLASS 17 -#define ARIAMIX_INPUT_CLASS 18 -#define ARIAMIX_RECORD_CLASS 19 -#define ARIAMIX_EQ_CLASS 20 |