summaryrefslogtreecommitdiffstats
path: root/drivers/sound/trix.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/sound/trix.c')
-rw-r--r--drivers/sound/trix.c151
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