diff options
Diffstat (limited to 'sys/i386/isa/sound/mad16.h')
-rw-r--r-- | sys/i386/isa/sound/mad16.h | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/sys/i386/isa/sound/mad16.h b/sys/i386/isa/sound/mad16.h new file mode 100644 index 0000000..0370973 --- /dev/null +++ b/sys/i386/isa/sound/mad16.h @@ -0,0 +1,91 @@ + +/* + * 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; +}; + |