summaryrefslogtreecommitdiffstats
path: root/drivers/sound/sb_midi.c
diff options
context:
space:
mode:
authorRalf Baechle <ralf@linux-mips.org>1997-12-06 23:51:34 +0000
committerRalf Baechle <ralf@linux-mips.org>1997-12-06 23:51:34 +0000
commit230e5ab6a084ed50470f101934782dbf54b0d06b (patch)
tree5dd821c8d33f450470588e7a543f74bf74306e9e /drivers/sound/sb_midi.c
parentc9b1c8a64c6444d189856f1e26bdcb8b4cd0113a (diff)
Merge with Linux 2.1.67.
Diffstat (limited to 'drivers/sound/sb_midi.c')
-rw-r--r--drivers/sound/sb_midi.c281
1 files changed, 141 insertions, 140 deletions
diff --git a/drivers/sound/sb_midi.c b/drivers/sound/sb_midi.c
index cffaafc7b..06acc19ef 100644
--- a/drivers/sound/sb_midi.c
+++ b/drivers/sound/sb_midi.c
@@ -15,7 +15,8 @@
#include "sound_config.h"
-#if defined(CONFIG_SBDSP) && defined(CONFIG_MIDI)
+#ifdef CONFIG_SBDSP
+#ifdef CONFIG_MIDI
#include "sb.h"
#undef SB_TEST_IRQ
@@ -30,129 +31,126 @@
static int
-sb_midi_open (int dev, int mode,
- void (*input) (int dev, unsigned char data),
- void (*output) (int dev)
+sb_midi_open(int dev, int mode,
+ void (*input) (int dev, unsigned char data),
+ void (*output) (int dev)
)
{
- sb_devc *devc = midi_devs[dev]->devc;
- unsigned long flags;
-
- if (devc == NULL)
- return -ENXIO;
-
- save_flags (flags);
- cli ();
- if (devc->opened)
- {
- restore_flags (flags);
- return -EBUSY;
- }
- devc->opened = 1;
- restore_flags (flags);
-
- devc->irq_mode = IMODE_MIDI;
- devc->midi_broken = 0;
-
- sb_dsp_reset (devc);
-
- if (!sb_dsp_command (devc, 0x35)) /* Start MIDI UART mode */
- {
- devc->opened = 0;
- return -EIO;
- }
-
- devc->intr_active = 1;
-
- if (mode & OPEN_READ)
- {
- devc->input_opened = 1;
- devc->midi_input_intr = input;
- }
-
- return 0;
+ sb_devc *devc = midi_devs[dev]->devc;
+ unsigned long flags;
+
+ if (devc == NULL)
+ return -ENXIO;
+
+ save_flags(flags);
+ cli();
+ if (devc->opened)
+ {
+ restore_flags(flags);
+ return -EBUSY;
+ }
+ devc->opened = 1;
+ restore_flags(flags);
+
+ devc->irq_mode = IMODE_MIDI;
+ devc->midi_broken = 0;
+
+ sb_dsp_reset(devc);
+
+ if (!sb_dsp_command(devc, 0x35)) /* Start MIDI UART mode */
+ {
+ devc->opened = 0;
+ return -EIO;
+ }
+ devc->intr_active = 1;
+
+ if (mode & OPEN_READ)
+ {
+ devc->input_opened = 1;
+ devc->midi_input_intr = input;
+ }
+ return 0;
}
static void
-sb_midi_close (int dev)
+sb_midi_close(int dev)
{
- sb_devc *devc = midi_devs[dev]->devc;
- unsigned long flags;
-
- if (devc == NULL)
- return;
-
- save_flags (flags);
- cli ();
- sb_dsp_reset (devc);
- devc->intr_active = 0;
- devc->input_opened = 0;
- devc->opened = 0;
- restore_flags (flags);
+ sb_devc *devc = midi_devs[dev]->devc;
+ unsigned long flags;
+
+ if (devc == NULL)
+ return;
+
+ save_flags(flags);
+ cli();
+ sb_dsp_reset(devc);
+ devc->intr_active = 0;
+ devc->input_opened = 0;
+ devc->opened = 0;
+ restore_flags(flags);
}
static int
-sb_midi_out (int dev, unsigned char midi_byte)
+sb_midi_out(int dev, unsigned char midi_byte)
{
- sb_devc *devc = midi_devs[dev]->devc;
+ sb_devc *devc = midi_devs[dev]->devc;
- if (devc == NULL)
- return 1;
+ if (devc == NULL)
+ return 1;
- if (devc->midi_broken)
- return 1;
+ if (devc->midi_broken)
+ return 1;
- if (!sb_dsp_command (devc, midi_byte))
- {
- devc->midi_broken = 1;
- return 1;
- }
-
- return 1;
+ if (!sb_dsp_command(devc, midi_byte))
+ {
+ devc->midi_broken = 1;
+ return 1;
+ }
+ return 1;
}
static int
-sb_midi_start_read (int dev)
+sb_midi_start_read(int dev)
{
- return 0;
+ return 0;
}
static int
-sb_midi_end_read (int dev)
+sb_midi_end_read(int dev)
{
- sb_devc *devc = midi_devs[dev]->devc;
+ sb_devc *devc = midi_devs[dev]->devc;
- if (devc == NULL)
- return -ENXIO;
+ if (devc == NULL)
+ return -ENXIO;
- sb_dsp_reset (devc);
- devc->intr_active = 0;
- return 0;
+ sb_dsp_reset(devc);
+ devc->intr_active = 0;
+ return 0;
}
static int
-sb_midi_ioctl (int dev, unsigned cmd, caddr_t arg)
+sb_midi_ioctl(int dev, unsigned cmd, caddr_t arg)
{
- return -EPERM;
+ return -EPERM;
}
void
-sb_midi_interrupt (sb_devc * devc)
+sb_midi_interrupt(sb_devc * devc)
{
- unsigned long flags;
- unsigned char data;
+ unsigned long flags;
+ unsigned char data;
- if (devc == NULL)
- return;
+ if (devc == NULL)
+ return;
- save_flags (flags);
- cli ();
+ save_flags(flags);
+ cli();
- data = inb (DSP_READ);
- if (devc->input_opened)
- devc->midi_input_intr (devc->my_mididev, data);
+ data = inb(DSP_READ);
+ if (devc->input_opened)
+ devc->midi_input_intr(devc->my_mididev, data);
- restore_flags (flags);
+ restore_flags(flags);
}
#define MIDI_SYNTH_NAME "Sound Blaster Midi"
@@ -161,74 +159,77 @@ sb_midi_interrupt (sb_devc * devc)
static struct midi_operations sb_midi_operations =
{
- {"Sound Blaster", 0, 0, SNDCARD_SB},
- &std_midi_synth,
- {0},
- sb_midi_open,
- sb_midi_close,
- sb_midi_ioctl,
- sb_midi_out,
- sb_midi_start_read,
- sb_midi_end_read,
- NULL,
- NULL,
- NULL,
- NULL
+ {"Sound Blaster", 0, 0, SNDCARD_SB},
+ &std_midi_synth,
+ {0},
+ sb_midi_open,
+ sb_midi_close,
+ sb_midi_ioctl,
+ sb_midi_out,
+ sb_midi_start_read,
+ sb_midi_end_read,
+ NULL,
+ NULL,
+ NULL,
+ NULL
};
void
-sb_dsp_midi_init (sb_devc * devc)
+sb_dsp_midi_init(sb_devc * devc)
{
- if (devc->model < 2) /* No MIDI support for SB 1.x */
- return;
-
- if (num_midis >= MAX_MIDI_DEV)
- {
- printk ("Sound: Too many midi devices detected\n");
- return;
- }
+ int dev;
- std_midi_synth.midi_dev = num_midis;
- devc->my_mididev = num_midis;
+ if (devc->model < 2) /* No MIDI support for SB 1.x */
+ return;
- std_midi_synth.midi_dev = devc->my_mididev = num_midis;
+ dev = sound_alloc_mididev();
+ if (dev == -1)
+ {
+ printk("Sound: Too many midi devices detected\n");
+ return;
+ }
+ std_midi_synth.midi_dev = dev;
+ devc->my_mididev = dev;
- midi_devs[num_midis] = (struct midi_operations *) (sound_mem_blocks[sound_nblocks] = vmalloc (sizeof (struct midi_operations)));
- sound_mem_sizes[sound_nblocks] = sizeof (struct midi_operations);
+ std_midi_synth.midi_dev = devc->my_mididev = dev;
- if (sound_nblocks < 1024)
- sound_nblocks++;;
- if (midi_devs[num_midis] == NULL)
- {
- printk ("sb MIDI: Failed to allocate memory\n");
- return;
- }
- memcpy ((char *) midi_devs[num_midis], (char *) &sb_midi_operations,
- sizeof (struct midi_operations));
+ midi_devs[dev] = (struct midi_operations *) (sound_mem_blocks[sound_nblocks] = vmalloc(sizeof(struct midi_operations)));
+ sound_mem_sizes[sound_nblocks] = sizeof(struct midi_operations);
- midi_devs[num_midis]->devc = devc;
+ if (sound_nblocks < 1024)
+ sound_nblocks++;;
+ if (midi_devs[dev] == NULL)
+ {
+ printk(KERN_WARNING "sb MIDI: Failed to allocate memory\n");
+ sound_unload_mididev(dev);
+ return;
+ }
+ memcpy((char *) midi_devs[dev], (char *) &sb_midi_operations,
+ sizeof(struct midi_operations));
+ midi_devs[dev]->devc = devc;
- midi_devs[num_midis]->converter = (struct synth_operations *) (sound_mem_blocks[sound_nblocks] = vmalloc (sizeof (struct synth_operations)));
- sound_mem_sizes[sound_nblocks] = sizeof (struct synth_operations);
- if (sound_nblocks < 1024)
- sound_nblocks++;;
+ midi_devs[dev]->converter = (struct synth_operations *) (sound_mem_blocks[sound_nblocks] = vmalloc(sizeof(struct synth_operations)));
+ sound_mem_sizes[sound_nblocks] = sizeof(struct synth_operations);
- if (midi_devs[num_midis]->converter == NULL)
- {
- printk ("sb MIDI: Failed to allocate memory\n");
- return;
- }
+ if (sound_nblocks < 1024)
+ sound_nblocks++;;
- memcpy ((char *) midi_devs[num_midis]->converter, (char *) &std_midi_synth,
- sizeof (struct synth_operations));
+ if (midi_devs[dev]->converter == NULL)
+ {
+ printk(KERN_WARNING "sb MIDI: Failed to allocate memory\n");
+ sound_unload_mididev(dev);
+ return;
+ }
+ memcpy((char *) midi_devs[dev]->converter, (char *) &std_midi_synth,
+ sizeof(struct synth_operations));
- midi_devs[num_midis]->converter->id = "SBMIDI";
- num_midis++;
- sequencer_init ();
+ midi_devs[dev]->converter->id = "SBMIDI";
+ sequencer_init();
}
#endif
+#endif