patch-2.1.126 linux/drivers/sound/opl3sa2.c
Next file: linux/drivers/sound/sb.h
Previous file: linux/drivers/sound/msnd_pinnacle.c
Back to the patch index
Back to the overall index
- Lines: 242
- Date:
Fri Oct 9 11:56:59 1998
- Orig file:
v2.1.125/linux/drivers/sound/opl3sa2.c
- Orig date:
Wed Dec 31 16:00:00 1969
diff -u --recursive --new-file v2.1.125/linux/drivers/sound/opl3sa2.c linux/drivers/sound/opl3sa2.c
@@ -0,0 +1,241 @@
+/*
+ * sound/opl3sa2.c
+ *
+ * A low level driver for Yamaha OPL3-SA[2,3,x] based cards.
+ *
+ * Scott Murray, Jun 14, 1998
+ *
+ */
+
+/* Based on the CS4232 driver:
+ *
+ * Copyright (C) by Hannu Savolainen 1993-1997
+ *
+ * OSS/Free for Linux is distributed under the GNU GENERAL PUBLIC LICENSE (GPL)
+ * Version 2 (June 1991). See the "COPYING" file distributed with this software
+ * for more info.
+ */
+
+#include <linux/config.h>
+#include <linux/module.h>
+
+#include "sound_config.h"
+#include "soundmodule.h"
+
+#ifdef CONFIG_OPL3SA2
+
+int probe_opl3sa2_mpu(struct address_info *hw_config)
+{
+#if (defined(CONFIG_MPU401) || defined(CONFIG_MPU_EMU)) && defined(CONFIG_MIDI)
+ return probe_mpu401(hw_config);
+#else
+ return 0;
+#endif
+}
+
+
+void attach_opl3sa2_mpu(struct address_info *hw_config)
+{
+#if (defined(CONFIG_MPU401) || defined(CONFIG_MPU_EMU)) && defined(CONFIG_MIDI)
+ attach_mpu401(hw_config);
+#endif
+}
+
+
+void unload_opl3sa2_mpu(struct address_info *hw_config)
+{
+#if (defined(CONFIG_MPU401) || defined(CONFIG_MPU_EMU)) && defined(CONFIG_MIDI)
+ unload_mpu401(hw_config);
+#endif
+}
+
+
+int probe_opl3sa2_mss(struct address_info *hw_config)
+{
+ return probe_ms_sound(hw_config);
+}
+
+
+void attach_opl3sa2_mss(struct address_info *hw_config)
+{
+ printk(KERN_INFO "opl3sa2.c: trying to init WSS\n");
+
+ attach_ms_sound(hw_config);
+
+ /* request_region(hw_config->io_base, 4, "Yamaha 7xx WSS Config"); */
+
+ if (hw_config->slots[0] != -1 &&
+ audio_devs[hw_config->slots[0]]->mixer_dev != -1)
+ {
+ AD1848_REROUTE(SOUND_MIXER_LINE1, SOUND_MIXER_CD);
+ AD1848_REROUTE(SOUND_MIXER_LINE2, SOUND_MIXER_SYNTH);
+ /* GSM! test the following: */
+ AD1848_REROUTE(SOUND_MIXER_LINE3, SOUND_MIXER_LINE);
+ }
+}
+
+
+void unload_opl3sa2_mss(struct address_info *hw_config)
+{
+ int mixer;
+
+ /* Find mixer */
+ mixer = audio_devs[hw_config->slots[0]]->mixer_dev;
+
+ /* Unload MSS audio codec */
+ unload_ms_sound(hw_config);
+
+ sound_unload_audiodev(hw_config->slots[0]);
+
+ /* Unload mixer if there */
+ if(mixer >= 0)
+ {
+ sound_unload_mixerdev(mixer);
+ }
+
+ /* Release MSS config ports */
+ release_region(hw_config->io_base, 4);
+}
+
+
+int probe_opl3sa2(struct address_info *hw_config)
+{
+ /*
+ * Verify that the I/O port range is free.
+ */
+
+ printk(KERN_INFO "opl3sa2.c: Control using I/O port 0x%03x\n", hw_config->io_base);
+
+ if (check_region(hw_config->io_base, 2))
+ {
+ printk(KERN_ERR "opl3sa2.c: Control I/O port 0x%03x not free\n", hw_config->io_base);
+ return 0;
+ }
+
+ /* GSM!: Add some kind of other test here... */
+
+ return 1;
+}
+
+
+void attach_opl3sa2(struct address_info *hw_config)
+{
+ printk(KERN_INFO "opl3sa2.c: trying to init!\n");
+
+ request_region(hw_config->io_base, 2, "Yamaha 7xx Control");
+
+ /* GSM! Mixer stuff should go here... */
+}
+
+
+void unload_opl3sa2(struct address_info *hw_config)
+{
+ /* Release control ports */
+ release_region(hw_config->io_base, 2);
+
+ /* GSM! Mixer stuff should go here... */
+}
+
+
+#ifdef MODULE
+
+int io = -1;
+int mss_io = -1;
+int mpu_io = -1;
+int irq = -1;
+int dma = -1;
+int dma2 = -1;
+
+MODULE_PARM(io,"i");
+MODULE_PARM(mss_io,"i");
+MODULE_PARM(mpu_io,"i");
+MODULE_PARM(irq,"i");
+MODULE_PARM(dma,"i");
+MODULE_PARM(dma2,"i");
+
+EXPORT_NO_SYMBOLS;
+
+struct address_info cfg;
+struct address_info mss_cfg;
+struct address_info mpu_cfg;
+
+/*
+ * Install a OPL3SA2 based card. Need to have ad1848 and mpu401
+ * loaded ready.
+ */
+int init_module(void)
+{
+ int i;
+
+ if (io == -1 || irq == -1 || dma == -1 || dma2 == -1 || mss_io == -1)
+ {
+ printk(KERN_ERR "opl3sa2: io, mss_io, irq, dma, and dma2 must be set.\n");
+ return -EINVAL;
+ }
+
+ /* Our own config: */
+ cfg.io_base = io;
+ cfg.irq = irq;
+ cfg.dma = dma;
+ cfg.dma2 = dma2;
+
+ /* The MSS config: */
+ mss_cfg.io_base = mss_io;
+ mss_cfg.irq = irq;
+ mss_cfg.dma = dma;
+ mss_cfg.dma2 = dma2;
+ mss_cfg.card_subtype = 1; /* No IRQ or DMA setup */
+
+ /* Call me paranoid: */
+ for(i = 0; i < 6; i++)
+ {
+ cfg.slots[i] = mss_cfg.slots[i] = mpu_cfg.slots[i] = -1;
+ }
+
+ if (probe_opl3sa2(&cfg) == 0)
+ {
+ return -ENODEV;
+ }
+ attach_opl3sa2(&cfg);
+
+ if (probe_opl3sa2_mss(&mss_cfg) == 0)
+ {
+ return -ENODEV;
+ }
+ attach_opl3sa2_mss(&mss_cfg);
+
+#if (defined(CONFIG_MPU401) || defined(CONFIG_MPU_EMU)) && defined(CONFIG_MIDI)
+ if(mpu_io != -1)
+ {
+ /* MPU config: */
+ mpu_cfg.io_base = mpu_io;
+ mpu_cfg.irq = irq;
+ mpu_cfg.dma = dma;
+ mpu_cfg.always_detect = 1; /* It's there, so use shared IRQs */
+
+ if (probe_opl3sa2_mpu(&mpu_cfg))
+ {
+ attach_opl3sa2_mpu(&mpu_cfg);
+ }
+ }
+#endif
+ SOUND_LOCK;
+ return 0;
+}
+
+
+void cleanup_module(void)
+{
+#if (defined(CONFIG_MPU401) || defined(CONFIG_MPU_EMU)) && defined(CONFIG_MIDI)
+ if(mpu_cfg.slots[1] != -1)
+ {
+ unload_opl3sa2_mpu(&mpu_cfg);
+ }
+#endif
+ unload_opl3sa2_mss(&mss_cfg);
+ unload_opl3sa2(&cfg);
+ SOUND_LOCK_END;
+}
+
+#endif
+#endif
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen, slshen@lbl.gov