21 #include <linux/module.h>
30 #include "trix_boot.h"
36 static unsigned char trix_read(
int addr)
38 outb(((
unsigned char) addr), 0x390);
42 static void trix_write(
int addr,
int data)
44 outb(((
unsigned char) addr), 0x390);
45 outb(((
unsigned char) data), 0x391);
48 static void download_boot(
int base)
50 int i = 0,
n = trix_boot_len;
52 if (trix_boot_len == 0)
55 trix_write(0xf8, 0x00);
56 outb((0x01), base + 6);
57 outb((0x00), base + 6);
63 outb((0x01), base + 6);
66 for (i = 0; i <
n; i++)
67 outb((trix_boot[i]), 0x391);
68 for (i = n; i < 10016; i++)
70 outb((0x00), base + 6);
75 static int trix_set_wss_port(
struct address_info *hw_config)
77 unsigned char addr_bits;
79 if (trix_read(0x15) != 0x71)
114 trix_write(0x19, (trix_read(0x19) & 0x03) | addr_bits);
125 static unsigned char dma_bits[4] = {
129 int config_port = hw_config->
io_base + 0;
130 int dma1 = hw_config->
dma, dma2 = hw_config->
dma2;
135 switch(hw_config->
irq) {
191 if (!trix_set_wss_port(hw_config))
196 if ((config & 0x3f) != 0x00)
206 if (dma1 == 0 && config & 0x80)
208 printk(
KERN_ERR "AudioTrix: Can't use DMA0 with a 8 bit card slot\n");
211 if (hw_config->
irq > 9 && config & 0x80)
213 printk(
KERN_ERR "AudioTrix: Can't use IRQ%d with a 8 bit card slot\n", hw_config->
irq);
222 trix_write(0x15, 0x80);
228 outb((bits | 0x40), config_port);
230 if (dma2 == -1 || dma2 == dma1)
232 bits |= dma_bits[dma1];
239 tmp = trix_read(0x13) & ~30;
240 trix_write(0x13, tmp | 0x80 | (dma1 << 4));
242 tmp = trix_read(0x14) & ~30;
243 trix_write(0x14, tmp | 0x80 | (dma2 << 4));
246 outb((bits), config_port);
278 static signed char irq_translate[] = {
279 -1, -1, -1, 0, 1, 2, -1, 3
282 if (trix_boot_len == 0)
285 if ((hw_config->
io_base & 0xffffff8f) != 0x200)
288 tmp = hw_config->
irq;
291 if (irq_translate[tmp] == -1)
294 tmp = hw_config->
dma;
295 if (tmp != 1 && tmp != 3)
304 conf |= hw_config->
io_base & 0x70;
305 conf |= irq_translate[hw_config->
irq];
306 if (hw_config->
dma == 3)
308 trix_write(0x1b, conf);
310 download_boot(hw_config->
io_base);
312 hw_config->
name =
"AudioTrix SB";
326 sb_be_quiet = old_quiet;
333 static int irq_bits[] = {
334 -1, -1, -1, 1, 2, 3, -1, 4, -1, 5
337 if (hw_config->
irq > 9)
342 if (irq_bits[hw_config->
irq] == -1)
365 conf |= irq_bits[hw_config->
irq] << 4;
366 trix_write(0x19, (trix_read(0x19) & 0x83) | conf);
367 hw_config->
name =
"AudioTrix Pro";
373 int dma2 = hw_config->
dma2;
376 dma2 = hw_config->
dma;
427 static int __init init_trix(
void)
429 printk(
KERN_INFO "MediaTrix audio driver Copyright (C) by Hannu Savolainen 1993-1996\n");
436 cfg2.io_base = sb_io;
440 cfg_mpu.io_base = mpu_io;
441 cfg_mpu.irq = mpu_irq;
443 if (
cfg.io_base == -1 ||
cfg.dma == -1 ||
cfg.irq == -1) {
448 if (cfg2.io_base != -1 && (cfg2.irq == -1 || cfg2.dma == -1)) {
449 printk(
KERN_INFO "CONFIG_SB_IRQ and CONFIG_SB_DMA must be specified if SB_IO is set.\n");
452 if (cfg_mpu.io_base != -1 && cfg_mpu.irq == -1) {
453 printk(
KERN_INFO "CONFIG_MPU_IRQ must be specified if MPU_IO is set.\n");
460 (
char **) &trix_boot);
468 if (!init_trix_wss(&
cfg)) {
478 if (cfg2.io_base != -1) {
479 sb = probe_trix_sb(&cfg2);
482 if (cfg_mpu.io_base != -1)
483 mpu = probe_trix_mpu(&cfg_mpu);
488 static void __exit cleanup_trix(
void)
490 if (fw_load && trix_boot)
493 unload_trix_sb(&cfg2);
495 unload_trix_mpu(&cfg_mpu);
496 unload_trix_wss(&
cfg);