freebsd-dev/sys/i386/isa/sound/mad16.h
Jordan K. Hubbard ae28ee13b4 Update the sound driver to VOXWARE 3.05 with one GUS patch from
Amancio.  There is some SoundSource support here that is primitive and
probably doesn't work, but I'll let the two submitters let me know
how my integration of that was since I don't have this card to test.
I've only tested this on my GUS MAX since it's all I have.

This all probably needs to be re-done anyway since we're widely variant
from the original VOXWARE source in the current layout.
Submitted by:	Amancio Hasty and Jim Lowe
Obtained from:  Hannu Savolainen
1995-07-28 21:40:49 +00:00

92 lines
1.6 KiB
C

/*
* Initialization code for OPTI MAD16 interface chip by
* Davor Jadrijevic <davor@emard.pub.hr>
* (Included by ad1848.c when MAD16 support is enabled)
*
* It looks like MAD16 is similar than the Mozart chip (OAK OTI-601).
* It could be even possible that these chips are exactly the same. Can
* anybody confirm this?
*/
static void wr_a_mad16(int base, int v, int a)
{
OUTB(a, base + 0xf);
OUTB(v, base + 0x11);
}
static void wr_b_mad16(int base, int v, int a)
{
OUTB(a, base + 0xf);
OUTB(v, base + 0xd);
}
/*
static int rd_a_mad16(int base, int a)
{
OUTB(a, base + 0xf);
return INB(base + 0x11);
}
*/
static int rd_b_mad16(int base, int a)
{
OUTB(a, base + 0xf);
return INB(base + 0xd);
}
/*
static int rd_0_mad16(int base, int a)
{
OUTB(a, base + 0xf);
return INB(base + 0xf);
}
static void wr_ad(int base, int v, int a)
{
OUTB(a, base + 4);
OUTB(v, base + 5);
}
static int rd_ad(int base, int a)
{
OUTB(a, base + 4);
return INB(base + 5);
}
*/
static int mad16init(int adr)
{
int j;
long i;
static int ad1848_bases[] =
{ 0x220, -1, -1, 0x240, -1, -1, -1, -1, 0x530, 0xE80, 0xF40, 0x604, 0 };
int mad16_base = 0xf80, ad1848_base;
for(j = 0; (j < 16) && (ad1848_bases[j] != 0); j++)
if(adr == ad1848_bases[j])
break;
if( (ad1848_base = ad1848_bases[j]) < 0x530)
{
printk("Unknown MAD16 setting 0x%3X\n", adr);
return -1;
}
/* printk("OPTi MAD16 WSS at 0x%3X\n", ad1848_base); */
rd_b_mad16(mad16_base, 0xe2);
wr_a_mad16(mad16_base, 0x1a, 0xe2);
wr_b_mad16(mad16_base, j * 16 + 1, 0xe2);
wr_a_mad16(mad16_base, 0x1a, 0xe2);
for( i = 0; i < 10000; i++)
if( (INB(ad1848_base+4) & 0x80) == 0 )
break;
return 0;
};