diff options
author | Ralf Baechle <ralf@linux-mips.org> | 1997-12-06 23:51:34 +0000 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 1997-12-06 23:51:34 +0000 |
commit | 230e5ab6a084ed50470f101934782dbf54b0d06b (patch) | |
tree | 5dd821c8d33f450470588e7a543f74bf74306e9e /drivers/sound/sb_midi.c | |
parent | c9b1c8a64c6444d189856f1e26bdcb8b4cd0113a (diff) |
Merge with Linux 2.1.67.
Diffstat (limited to 'drivers/sound/sb_midi.c')
-rw-r--r-- | drivers/sound/sb_midi.c | 281 |
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 |