5 * Copyright (C) by Hannu Savolainen 1993-1997 7 * OSS/Free for Linux is distributed under the GNU GENERAL PUBLIC LICENSE (GPL) 8 * Version 2 (June 1991). See the "COPYING" file distributed with this software 10 * Extended by Alan Cox for Red Hat Software. Now a loadable MIDI driver. 11 * 28/4/97 - (C) Copyright Alan Cox. Released under the GPL version 2. 13 * Alan Cox: Updated for new modular code. Removed snd_* irq handling. Now 14 * uses native linux resources 15 * Christoph Hellwig: Adapted to module_init/module_exit 16 * Jeff Garzik: Made it work again, in theory 17 * FIXME: If the request_irq() succeeds, the probe succeeds. Ug. 19 * Status: Testing required (no shit -jgarzik) 24 #include <linux/init.h> 25 #include <linux/module.h> 27 /* Mon Nov 22 22:38:35 MET 1993 marco@driq.home.usn.nl: 28 * added 6850 support, used with COVOX SoundMaster II and custom cards. 31 #include"sound_config.h" 33 static int uart6850_base
=0x330; 35 static int*uart6850_osp
; 37 #define DATAPORT (uart6850_base) 38 #define COMDPORT (uart6850_base+1) 39 #define STATPORT (uart6850_base+1) 41 static intuart6850_status(void) 46 #define input_avail() (uart6850_status()&INPUT_AVAIL) 47 #define output_ready() (uart6850_status()&OUTPUT_READY) 49 static voiduart6850_cmd(unsigned char cmd
) 54 static intuart6850_read(void) 59 static voiduart6850_write(unsigned char byte
) 64 #define OUTPUT_READY 0x02/* Mask for data ready Bit */ 65 #define INPUT_AVAIL 0x01/* Mask for Data Send Ready Bit */ 67 #define UART_RESET 0x95 68 #define UART_MODE_ON 0x03 70 static int uart6850_opened
; 71 static int uart6850_irq
; 72 static int uart6850_detected
; 75 static void(*midi_input_intr
) (int dev
,unsigned char data
); 76 static voidpoll_uart6850(unsigned long dummy
); 79 static struct timer_list uart6850_timer
= { 80 function
: poll_uart6850
83 static voiduart6850_input_loop(void) 94 unsigned char c
=uart6850_read(); 96 if(uart6850_opened
& OPEN_READ
) 97 midi_input_intr(my_dev
, c
); 101 while(!input_avail() && count
) 107 voidm6850intr(int irq
,void*dev_id
,struct pt_regs
*dummy
) 110 uart6850_input_loop(); 114 * It looks like there is no input interrupts in the UART mode. Let's try 118 static voidpoll_uart6850(unsigned long dummy
) 122 if(!(uart6850_opened
& OPEN_READ
)) 123 return;/* Device has been closed */ 129 uart6850_input_loop(); 131 uart6850_timer
.expires
=1+ jiffies
; 132 add_timer(&uart6850_timer
); 138 restore_flags(flags
); 141 static intuart6850_open(int dev
,int mode
, 142 void(*input
) (int dev
,unsigned char data
), 143 void(*output
) (int dev
) 148 /* printk("Midi6850: Midi busy\n");*/ 152 uart6850_cmd(UART_RESET
); 153 uart6850_input_loop(); 154 midi_input_intr
= input
; 155 uart6850_opened
= mode
; 157 * Enable input polling 163 static voiduart6850_close(int dev
) 165 uart6850_cmd(UART_MODE_ON
); 166 del_timer(&uart6850_timer
); 170 static intuart6850_out(int dev
,unsigned char midi_byte
) 176 * Test for input since pending input seems to block the output. 183 uart6850_input_loop(); 185 restore_flags(flags
); 188 * Sometimes it takes about 13000 loops before the output becomes ready 189 * (After reset). Normally it takes just about 10 loops. 192 for(timeout
=30000; timeout
>0&& !output_ready(); timeout
--);/* 197 printk(KERN_WARNING
"Midi6850: Timeout\n"); 200 uart6850_write(midi_byte
); 204 staticinlineintuart6850_command(int dev
,unsigned char*midi_byte
) 209 staticinlineintuart6850_start_read(int dev
) 214 staticinlineintuart6850_end_read(int dev
) 219 staticinlinevoiduart6850_kick(int dev
) 223 staticinlineintuart6850_buffer_status(int dev
) 230 #define MIDI_SYNTH_NAME"6850 UART Midi" 231 #define MIDI_SYNTH_CAPS SYNTH_CAP_INPUT 232 #include"midi_synth.h" 234 static struct midi_operations uart6850_operations
= 237 info
: {"6850 UART",0,0, SNDCARD_UART6850
}, 238 converter
: &std_midi_synth
, 241 close
: uart6850_close
, 242 outputc
: uart6850_out
, 243 start_read
: uart6850_start_read
, 244 end_read
: uart6850_end_read
, 246 command
: uart6850_command
, 247 buffer_status
: uart6850_buffer_status
251 static void __init
attach_uart6850(struct address_info
*hw_config
) 256 if(!uart6850_detected
) 259 if((my_dev
=sound_alloc_mididev()) == -1) 261 printk(KERN_INFO
"uart6850: Too many midi devices detected\n"); 264 uart6850_base
= hw_config
->io_base
; 265 uart6850_osp
= hw_config
->osp
; 266 uart6850_irq
= hw_config
->irq
; 271 for(timeout
=30000; timeout
>0&& !output_ready(); timeout
--);/* 274 uart6850_cmd(UART_MODE_ON
); 276 restore_flags(flags
); 278 conf_printf("6850 Midi Interface", hw_config
); 280 std_midi_synth
.midi_dev
= my_dev
; 281 hw_config
->slots
[4] = my_dev
; 282 midi_devs
[my_dev
] = &uart6850_operations
; 286 staticinlineintreset_uart6850(void) 294 static int __init
probe_uart6850(struct address_info
*hw_config
) 298 uart6850_osp
= hw_config
->osp
; 299 uart6850_base
= hw_config
->io_base
; 300 uart6850_irq
= hw_config
->irq
; 302 if(request_irq(uart6850_irq
, m6850intr
,0,"MIDI6850", NULL
) <0) 305 ok
=reset_uart6850(); 306 uart6850_detected
= ok
; 310 static void __exit
unload_uart6850(struct address_info
*hw_config
) 312 free_irq(hw_config
->irq
, NULL
); 313 sound_unload_mididev(hw_config
->slots
[4]); 316 static struct address_info cfg_mpu
; 318 static int __initdata io
= -1; 319 static int __initdata irq
= -1; 322 MODULE_PARM(irq
,"i"); 324 static int __init
init_uart6850(void) 326 cfg_mpu
.io_base
= io
; 329 if(cfg_mpu
.io_base
== -1|| cfg_mpu
.irq
== -1) { 330 printk(KERN_INFO
"uart6850: irq and io must be set.\n"); 334 if(probe_uart6850(&cfg_mpu
)) 336 attach_uart6850(&cfg_mpu
); 341 static void __exit
cleanup_uart6850(void) 343 unload_uart6850(&cfg_mpu
); 346 module_init(init_uart6850
); 347 module_exit(cleanup_uart6850
); 350 static int __init
setup_uart6850(char*str
) 355 str
=get_options(str
,ARRAY_SIZE(ints
), ints
); 362 __setup("uart6850=", setup_uart6850
);