diff options
Diffstat (limited to 'drivers/sound/trix.c')
-rw-r--r-- | drivers/sound/trix.c | 151 |
1 files changed, 82 insertions, 69 deletions
diff --git a/drivers/sound/trix.c b/drivers/sound/trix.c index 107c6ca9e..d36da3f9c 100644 --- a/drivers/sound/trix.c +++ b/drivers/sound/trix.c @@ -13,9 +13,11 @@ * * Changes * Alan Cox Modularisation, cleanup. + * Christoph Hellwig Adapted to module_init/module_exit */ #include <linux/config.h> +#include <linux/init.h> #include <linux/module.h> #include "sound_config.h" @@ -23,9 +25,10 @@ #include "sb.h" #include "sound_firmware.h" -#include <linux/init.h> -#include "trix_boot.h" +#include "ad1848.h" +#include "mpu401.h" +#include "trix_boot.h" static int kilroy_was_here = 0; /* Don't detect twice */ static int sb_initialized = 0; @@ -35,11 +38,7 @@ static int *trix_osp = NULL; static int mpu = 0; -#ifdef TRIX_JOYSTICK -static int joystick=1; -#else static int joystick=0; -#endif static unsigned char trix_read(int addr) { @@ -137,7 +136,7 @@ static int trix_set_wss_port(struct address_info *hw_config) * AudioTrix Pro */ -int probe_trix_wss(struct address_info *hw_config) +static int __init probe_trix_wss(struct address_info *hw_config) { int ret; @@ -202,8 +201,7 @@ int probe_trix_wss(struct address_info *hw_config) return ret; } -void -attach_trix_wss(struct address_info *hw_config) +static void __init attach_trix_wss(struct address_info *hw_config) { static unsigned char interrupt_bits[12] = { 0, 0, 0, 0, 0, 0, 0, 0x08, 0, 0x10, 0x18, 0x20 @@ -273,7 +271,7 @@ attach_trix_wss(struct address_info *hw_config) } } -int probe_trix_sb(struct address_info *hw_config) +static int __init probe_trix_sb(struct address_info *hw_config) { int tmp; @@ -323,7 +321,7 @@ int probe_trix_sb(struct address_info *hw_config) return sb_dsp_detect(hw_config, 0, 0); } -void attach_trix_sb(struct address_info *hw_config) +static void __init attach_trix_sb(struct address_info *hw_config) { extern int sb_be_quiet; int old_quiet; @@ -339,13 +337,13 @@ void attach_trix_sb(struct address_info *hw_config) sb_be_quiet = old_quiet; } -void attach_trix_mpu(struct address_info *hw_config) +static void __init attach_trix_mpu(struct address_info *hw_config) { hw_config->name = "AudioTrix Pro"; attach_uart401(hw_config); } -int probe_trix_mpu(struct address_info *hw_config) +static int __init probe_trix_mpu(struct address_info *hw_config) { unsigned char conf; static char irq_bits[] = { @@ -406,7 +404,7 @@ int probe_trix_mpu(struct address_info *hw_config) return probe_uart401(hw_config); } -void unload_trix_wss(struct address_info *hw_config) +static void __exit unload_trix_wss(struct address_info *hw_config) { int dma2 = hw_config->dma2; @@ -424,31 +422,32 @@ void unload_trix_wss(struct address_info *hw_config) sound_unload_audiodev(hw_config->slots[0]); } -void unload_trix_mpu(struct address_info *hw_config) +static inline void __exit unload_trix_mpu(struct address_info *hw_config) { unload_uart401(hw_config); } -void unload_trix_sb(struct address_info *hw_config) +static inline void __exit unload_trix_sb(struct address_info *hw_config) { sb_dsp_unload(hw_config, mpu); } -#ifdef MODULE - -int io = -1; -int irq = -1; -int dma = -1; -int dma2 = -1; /* Set this for modules that need it */ - -int sb_io = -1; -int sb_dma = -1; -int sb_irq = -1; +static struct address_info cfg; +static struct address_info cfg2; +static struct address_info cfg_mpu; -int mpu_io = -1; -int mpu_irq = -1; +static int sb = 0; +static int fw_load; -EXPORT_NO_SYMBOLS; +static int __initdata io = -1; +static int __initdata irq = -1; +static int __initdata dma = -1; +static int __initdata dma2 = -1; /* Set this for modules that need it */ +static int __initdata sb_io = -1; +static int __initdata sb_dma = -1; +static int __initdata sb_irq = -1; +static int __initdata mpu_io = -1; +static int __initdata mpu_irq = -1; MODULE_PARM(io,"i"); MODULE_PARM(irq,"i"); @@ -460,42 +459,33 @@ MODULE_PARM(sb_irq,"i"); MODULE_PARM(mpu_io,"i"); MODULE_PARM(mpu_irq,"i"); MODULE_PARM(joystick, "i"); -struct address_info config; -struct address_info sb_config; -struct address_info mpu_config; -static int sb = 0; - -static int fw_load; - -int init_module(void) +static int __init init_trix(void) { printk(KERN_INFO "MediaTrix audio driver Copyright (C) by Hannu Savolainen 1993-1996\n"); - if (io == -1 || dma == -1 || irq == -1) - { + cfg.io_base = io; + cfg.irq = irq; + cfg.dma = dma; + cfg.dma2 = dma2; + + cfg2.io_base = sb_io; + cfg2.irq = sb_irq; + cfg2.dma = sb_dma; + + cfg_mpu.io_base = mpu_io; + cfg_mpu.irq = mpu_irq; + + if (cfg.io_base == -1 || cfg.dma == -1 || cfg.irq == -1) { printk(KERN_INFO "I/O, IRQ, DMA and type are mandatory\n"); return -EINVAL; } - config.io_base = io; - config.irq = irq; - config.dma = dma; - config.dma2 = dma2; - - sb_config.io_base = sb_io; - sb_config.irq = sb_irq; - sb_config.dma = sb_dma; - mpu_config.io_base = mpu_io; - mpu_config.irq = mpu_irq; - - if (sb_io != -1 && (sb_irq == -1 || sb_dma == -1)) - { + if (cfg2.io_base != -1 && (cfg2.irq == -1 || cfg2.dma == -1)) { printk(KERN_INFO "CONFIG_SB_IRQ and CONFIG_SB_DMA must be specified if SB_IO is set.\n"); return -EINVAL; } - if (mpu_io != -1 && mpu_irq == -1) - { + if (cfg_mpu.io_base != -1 && cfg_mpu.irq == -1) { printk(KERN_INFO "CONFIG_MPU_IRQ must be specified if MPU_IO is set.\n"); return -EINVAL; } @@ -505,42 +495,65 @@ int init_module(void) trix_boot_len = mod_firmware_load("/etc/sound/trxpro.bin", (char **) &trix_boot); } - if (!probe_trix_wss(&config)) + if (!probe_trix_wss(&cfg)) return -ENODEV; - attach_trix_wss(&config); + attach_trix_wss(&cfg); /* * We must attach in the right order to get the firmware * loaded up in time. */ - if (sb_io != -1) - { - sb = probe_trix_sb(&sb_config); + if (cfg2.io_base != -1) { + sb = probe_trix_sb(&cfg2); if (sb) - attach_trix_sb(&sb_config); + attach_trix_sb(&cfg2); } - if (mpu_io != -1) - { - mpu = probe_trix_mpu(&mpu_config); + if (cfg_mpu.io_base != -1) { + mpu = probe_trix_mpu(&cfg_mpu); if (mpu) - attach_trix_mpu(&mpu_config); + attach_trix_mpu(&cfg_mpu); } SOUND_LOCK; return 0; } -void cleanup_module(void) +static void __exit cleanup_trix(void) { if (fw_load && trix_boot) vfree(trix_boot); if (sb) - unload_trix_sb(&sb_config); + unload_trix_sb(&cfg2); if (mpu) - unload_trix_mpu(&mpu_config); - unload_trix_wss(&config); + unload_trix_mpu(&cfg_mpu); + unload_trix_wss(&cfg); SOUND_LOCK_END; } -#endif /* MODULE */ +module_init(init_trix); +module_exit(cleanup_trix); + +#ifndef MODULE +static int __init setup_trix (char *str) +{ + /* io, irq, dma, dma2, sb_io, sb_irq, sb_dma, mpu_io, mpu_irq */ + int ints[9]; + + str = get_options(str, ARRAY_SIZE(ints), ints); + + io = ints[1]; + irq = ints[2]; + dma = ints[3]; + dma2 = ints[4]; + sb_io = ints[5]; + sb_irq = ints[6]; + sb_dma = ints[6]; + mpu_io = ints[7]; + mpu_irq = ints[8]; + + return 1; +} + +__setup("trix=", setup_trix); +#endif |