• Home
  • Raw
  • Download

Lines Matching refs:mpu

46 static void snd_mpu401_uart_input_read(struct snd_mpu401 * mpu);
47 static void snd_mpu401_uart_output_write(struct snd_mpu401 * mpu);
53 #define snd_mpu401_input_avail(mpu) \ argument
54 (!(mpu->read(mpu, MPU401C(mpu)) & MPU401_RX_EMPTY))
55 #define snd_mpu401_output_ready(mpu) \ argument
56 (!(mpu->read(mpu, MPU401C(mpu)) & MPU401_TX_FULL))
59 static void mpu401_write_port(struct snd_mpu401 *mpu, unsigned char data, in mpu401_write_port() argument
65 static unsigned char mpu401_read_port(struct snd_mpu401 *mpu, in mpu401_read_port() argument
71 static void mpu401_write_mmio(struct snd_mpu401 *mpu, unsigned char data, in mpu401_write_mmio() argument
77 static unsigned char mpu401_read_mmio(struct snd_mpu401 *mpu, in mpu401_read_mmio() argument
84 static void snd_mpu401_uart_clear_rx(struct snd_mpu401 *mpu) in snd_mpu401_uart_clear_rx() argument
87 for (; timeout > 0 && snd_mpu401_input_avail(mpu); timeout--) in snd_mpu401_uart_clear_rx()
88 mpu->read(mpu, MPU401D(mpu)); in snd_mpu401_uart_clear_rx()
92 mpu->read(mpu, MPU401C(mpu))); in snd_mpu401_uart_clear_rx()
96 static void uart_interrupt_tx(struct snd_mpu401 *mpu) in uart_interrupt_tx() argument
100 if (test_bit(MPU401_MODE_BIT_OUTPUT, &mpu->mode) && in uart_interrupt_tx()
101 test_bit(MPU401_MODE_BIT_OUTPUT_TRIGGER, &mpu->mode)) { in uart_interrupt_tx()
102 spin_lock_irqsave(&mpu->output_lock, flags); in uart_interrupt_tx()
103 snd_mpu401_uart_output_write(mpu); in uart_interrupt_tx()
104 spin_unlock_irqrestore(&mpu->output_lock, flags); in uart_interrupt_tx()
108 static void _snd_mpu401_uart_interrupt(struct snd_mpu401 *mpu) in _snd_mpu401_uart_interrupt() argument
112 if (mpu->info_flags & MPU401_INFO_INPUT) { in _snd_mpu401_uart_interrupt()
113 spin_lock_irqsave(&mpu->input_lock, flags); in _snd_mpu401_uart_interrupt()
114 if (test_bit(MPU401_MODE_BIT_INPUT, &mpu->mode)) in _snd_mpu401_uart_interrupt()
115 snd_mpu401_uart_input_read(mpu); in _snd_mpu401_uart_interrupt()
117 snd_mpu401_uart_clear_rx(mpu); in _snd_mpu401_uart_interrupt()
118 spin_unlock_irqrestore(&mpu->input_lock, flags); in _snd_mpu401_uart_interrupt()
120 if (! (mpu->info_flags & MPU401_INFO_TX_IRQ)) in _snd_mpu401_uart_interrupt()
123 uart_interrupt_tx(mpu); in _snd_mpu401_uart_interrupt()
137 struct snd_mpu401 *mpu = dev_id; in snd_mpu401_uart_interrupt() local
139 if (!mpu) in snd_mpu401_uart_interrupt()
141 _snd_mpu401_uart_interrupt(mpu); in snd_mpu401_uart_interrupt()
158 struct snd_mpu401 *mpu = dev_id; in snd_mpu401_uart_interrupt_tx() local
160 if (!mpu) in snd_mpu401_uart_interrupt_tx()
162 uart_interrupt_tx(mpu); in snd_mpu401_uart_interrupt_tx()
174 struct snd_mpu401 *mpu = (struct snd_mpu401 *)data; in snd_mpu401_uart_timer() local
177 spin_lock_irqsave(&mpu->timer_lock, flags); in snd_mpu401_uart_timer()
179 mod_timer(&mpu->timer, 1 + jiffies); in snd_mpu401_uart_timer()
180 spin_unlock_irqrestore(&mpu->timer_lock, flags); in snd_mpu401_uart_timer()
181 if (mpu->rmidi) in snd_mpu401_uart_timer()
182 _snd_mpu401_uart_interrupt(mpu); in snd_mpu401_uart_timer()
188 static void snd_mpu401_uart_add_timer (struct snd_mpu401 *mpu, int input) in snd_mpu401_uart_add_timer() argument
192 spin_lock_irqsave (&mpu->timer_lock, flags); in snd_mpu401_uart_add_timer()
193 if (mpu->timer_invoked == 0) { in snd_mpu401_uart_add_timer()
194 setup_timer(&mpu->timer, snd_mpu401_uart_timer, in snd_mpu401_uart_add_timer()
195 (unsigned long)mpu); in snd_mpu401_uart_add_timer()
196 mod_timer(&mpu->timer, 1 + jiffies); in snd_mpu401_uart_add_timer()
198 mpu->timer_invoked |= input ? MPU401_MODE_INPUT_TIMER : in snd_mpu401_uart_add_timer()
200 spin_unlock_irqrestore (&mpu->timer_lock, flags); in snd_mpu401_uart_add_timer()
206 static void snd_mpu401_uart_remove_timer (struct snd_mpu401 *mpu, int input) in snd_mpu401_uart_remove_timer() argument
210 spin_lock_irqsave (&mpu->timer_lock, flags); in snd_mpu401_uart_remove_timer()
211 if (mpu->timer_invoked) { in snd_mpu401_uart_remove_timer()
212 mpu->timer_invoked &= input ? ~MPU401_MODE_INPUT_TIMER : in snd_mpu401_uart_remove_timer()
214 if (! mpu->timer_invoked) in snd_mpu401_uart_remove_timer()
215 del_timer(&mpu->timer); in snd_mpu401_uart_remove_timer()
217 spin_unlock_irqrestore (&mpu->timer_lock, flags); in snd_mpu401_uart_remove_timer()
225 static int snd_mpu401_uart_cmd(struct snd_mpu401 * mpu, unsigned char cmd, in snd_mpu401_uart_cmd() argument
231 spin_lock_irqsave(&mpu->input_lock, flags); in snd_mpu401_uart_cmd()
232 if (mpu->hardware != MPU401_HW_TRID4DWAVE) { in snd_mpu401_uart_cmd()
233 mpu->write(mpu, 0x00, MPU401D(mpu)); in snd_mpu401_uart_cmd()
237 if (mpu->hardware != MPU401_HW_SB) { in snd_mpu401_uart_cmd()
239 !snd_mpu401_output_ready(mpu); timeout--) in snd_mpu401_uart_cmd()
244 mpu->read(mpu, MPU401C(mpu))); in snd_mpu401_uart_cmd()
247 mpu->write(mpu, cmd, MPU401C(mpu)); in snd_mpu401_uart_cmd()
248 if (ack && !(mpu->info_flags & MPU401_INFO_NO_ACK)) { in snd_mpu401_uart_cmd()
252 if (snd_mpu401_input_avail(mpu)) { in snd_mpu401_uart_cmd()
253 if (mpu->read(mpu, MPU401D(mpu)) == MPU401_ACK) in snd_mpu401_uart_cmd()
257 if (!ok && mpu->read(mpu, MPU401D(mpu)) == MPU401_ACK) in snd_mpu401_uart_cmd()
261 spin_unlock_irqrestore(&mpu->input_lock, flags); in snd_mpu401_uart_cmd()
264 "(status = 0x%x, data = 0x%x)\n", cmd, mpu->port, in snd_mpu401_uart_cmd()
265 mpu->read(mpu, MPU401C(mpu)), in snd_mpu401_uart_cmd()
266 mpu->read(mpu, MPU401D(mpu))); in snd_mpu401_uart_cmd()
272 static int snd_mpu401_do_reset(struct snd_mpu401 *mpu) in snd_mpu401_do_reset() argument
274 if (snd_mpu401_uart_cmd(mpu, MPU401_RESET, 1)) in snd_mpu401_do_reset()
276 if (snd_mpu401_uart_cmd(mpu, MPU401_ENTER_UART, 0)) in snd_mpu401_do_reset()
286 struct snd_mpu401 *mpu; in snd_mpu401_uart_input_open() local
289 mpu = substream->rmidi->private_data; in snd_mpu401_uart_input_open()
290 if (mpu->open_input && (err = mpu->open_input(mpu)) < 0) in snd_mpu401_uart_input_open()
292 if (! test_bit(MPU401_MODE_BIT_OUTPUT, &mpu->mode)) { in snd_mpu401_uart_input_open()
293 if (snd_mpu401_do_reset(mpu) < 0) in snd_mpu401_uart_input_open()
296 mpu->substream_input = substream; in snd_mpu401_uart_input_open()
297 set_bit(MPU401_MODE_BIT_INPUT, &mpu->mode); in snd_mpu401_uart_input_open()
301 if (mpu->open_input && mpu->close_input) in snd_mpu401_uart_input_open()
302 mpu->close_input(mpu); in snd_mpu401_uart_input_open()
308 struct snd_mpu401 *mpu; in snd_mpu401_uart_output_open() local
311 mpu = substream->rmidi->private_data; in snd_mpu401_uart_output_open()
312 if (mpu->open_output && (err = mpu->open_output(mpu)) < 0) in snd_mpu401_uart_output_open()
314 if (! test_bit(MPU401_MODE_BIT_INPUT, &mpu->mode)) { in snd_mpu401_uart_output_open()
315 if (snd_mpu401_do_reset(mpu) < 0) in snd_mpu401_uart_output_open()
318 mpu->substream_output = substream; in snd_mpu401_uart_output_open()
319 set_bit(MPU401_MODE_BIT_OUTPUT, &mpu->mode); in snd_mpu401_uart_output_open()
323 if (mpu->open_output && mpu->close_output) in snd_mpu401_uart_output_open()
324 mpu->close_output(mpu); in snd_mpu401_uart_output_open()
330 struct snd_mpu401 *mpu; in snd_mpu401_uart_input_close() local
333 mpu = substream->rmidi->private_data; in snd_mpu401_uart_input_close()
334 clear_bit(MPU401_MODE_BIT_INPUT, &mpu->mode); in snd_mpu401_uart_input_close()
335 mpu->substream_input = NULL; in snd_mpu401_uart_input_close()
336 if (! test_bit(MPU401_MODE_BIT_OUTPUT, &mpu->mode)) in snd_mpu401_uart_input_close()
337 err = snd_mpu401_uart_cmd(mpu, MPU401_RESET, 0); in snd_mpu401_uart_input_close()
338 if (mpu->close_input) in snd_mpu401_uart_input_close()
339 mpu->close_input(mpu); in snd_mpu401_uart_input_close()
347 struct snd_mpu401 *mpu; in snd_mpu401_uart_output_close() local
350 mpu = substream->rmidi->private_data; in snd_mpu401_uart_output_close()
351 clear_bit(MPU401_MODE_BIT_OUTPUT, &mpu->mode); in snd_mpu401_uart_output_close()
352 mpu->substream_output = NULL; in snd_mpu401_uart_output_close()
353 if (! test_bit(MPU401_MODE_BIT_INPUT, &mpu->mode)) in snd_mpu401_uart_output_close()
354 err = snd_mpu401_uart_cmd(mpu, MPU401_RESET, 0); in snd_mpu401_uart_output_close()
355 if (mpu->close_output) in snd_mpu401_uart_output_close()
356 mpu->close_output(mpu); in snd_mpu401_uart_output_close()
369 struct snd_mpu401 *mpu; in snd_mpu401_uart_input_trigger() local
372 mpu = substream->rmidi->private_data; in snd_mpu401_uart_input_trigger()
375 &mpu->mode)) { in snd_mpu401_uart_input_trigger()
378 mpu->read(mpu, MPU401D(mpu)); in snd_mpu401_uart_input_trigger()
379 if (mpu->info_flags & MPU401_INFO_USE_TIMER) in snd_mpu401_uart_input_trigger()
380 snd_mpu401_uart_add_timer(mpu, 1); in snd_mpu401_uart_input_trigger()
384 spin_lock_irqsave(&mpu->input_lock, flags); in snd_mpu401_uart_input_trigger()
385 snd_mpu401_uart_input_read(mpu); in snd_mpu401_uart_input_trigger()
386 spin_unlock_irqrestore(&mpu->input_lock, flags); in snd_mpu401_uart_input_trigger()
388 if (mpu->info_flags & MPU401_INFO_USE_TIMER) in snd_mpu401_uart_input_trigger()
389 snd_mpu401_uart_remove_timer(mpu, 1); in snd_mpu401_uart_input_trigger()
390 clear_bit(MPU401_MODE_BIT_INPUT_TRIGGER, &mpu->mode); in snd_mpu401_uart_input_trigger()
399 static void snd_mpu401_uart_input_read(struct snd_mpu401 * mpu) in snd_mpu401_uart_input_read() argument
405 if (! snd_mpu401_input_avail(mpu)) in snd_mpu401_uart_input_read()
407 byte = mpu->read(mpu, MPU401D(mpu)); in snd_mpu401_uart_input_read()
408 if (test_bit(MPU401_MODE_BIT_INPUT_TRIGGER, &mpu->mode)) in snd_mpu401_uart_input_read()
409 snd_rawmidi_receive(mpu->substream_input, &byte, 1); in snd_mpu401_uart_input_read()
425 static void snd_mpu401_uart_output_write(struct snd_mpu401 * mpu) in snd_mpu401_uart_output_write() argument
431 if (snd_rawmidi_transmit_peek(mpu->substream_output, in snd_mpu401_uart_output_write()
437 if (!snd_mpu401_output_ready(mpu) && in snd_mpu401_uart_output_write()
438 !snd_mpu401_output_ready(mpu)) in snd_mpu401_uart_output_write()
440 mpu->write(mpu, byte, MPU401D(mpu)); in snd_mpu401_uart_output_write()
441 snd_rawmidi_transmit_ack(mpu->substream_output, 1); in snd_mpu401_uart_output_write()
443 snd_mpu401_uart_remove_timer (mpu, 0); in snd_mpu401_uart_output_write()
456 struct snd_mpu401 *mpu; in snd_mpu401_uart_output_trigger() local
458 mpu = substream->rmidi->private_data; in snd_mpu401_uart_output_trigger()
460 set_bit(MPU401_MODE_BIT_OUTPUT_TRIGGER, &mpu->mode); in snd_mpu401_uart_output_trigger()
466 if (! (mpu->info_flags & MPU401_INFO_TX_IRQ)) in snd_mpu401_uart_output_trigger()
467 snd_mpu401_uart_add_timer(mpu, 0); in snd_mpu401_uart_output_trigger()
470 spin_lock_irqsave(&mpu->output_lock, flags); in snd_mpu401_uart_output_trigger()
471 snd_mpu401_uart_output_write(mpu); in snd_mpu401_uart_output_trigger()
472 spin_unlock_irqrestore(&mpu->output_lock, flags); in snd_mpu401_uart_output_trigger()
474 if (! (mpu->info_flags & MPU401_INFO_TX_IRQ)) in snd_mpu401_uart_output_trigger()
475 snd_mpu401_uart_remove_timer(mpu, 0); in snd_mpu401_uart_output_trigger()
476 clear_bit(MPU401_MODE_BIT_OUTPUT_TRIGGER, &mpu->mode); in snd_mpu401_uart_output_trigger()
500 struct snd_mpu401 *mpu = rmidi->private_data; in snd_mpu401_uart_free() local
501 if (mpu->irq >= 0) in snd_mpu401_uart_free()
502 free_irq(mpu->irq, (void *) mpu); in snd_mpu401_uart_free()
503 release_and_free_resource(mpu->res); in snd_mpu401_uart_free()
504 kfree(mpu); in snd_mpu401_uart_free()
532 struct snd_mpu401 *mpu; in snd_mpu401_uart_new() local
546 mpu = kzalloc(sizeof(*mpu), GFP_KERNEL); in snd_mpu401_uart_new()
547 if (!mpu) { in snd_mpu401_uart_new()
551 rmidi->private_data = mpu; in snd_mpu401_uart_new()
553 spin_lock_init(&mpu->input_lock); in snd_mpu401_uart_new()
554 spin_lock_init(&mpu->output_lock); in snd_mpu401_uart_new()
555 spin_lock_init(&mpu->timer_lock); in snd_mpu401_uart_new()
556 mpu->hardware = hardware; in snd_mpu401_uart_new()
557 mpu->irq = -1; in snd_mpu401_uart_new()
560 mpu->res = request_region(port, res_size, "MPU401 UART"); in snd_mpu401_uart_new()
561 if (!mpu->res) { in snd_mpu401_uart_new()
570 mpu->write = mpu401_write_mmio; in snd_mpu401_uart_new()
571 mpu->read = mpu401_read_mmio; in snd_mpu401_uart_new()
573 mpu->write = mpu401_write_port; in snd_mpu401_uart_new()
574 mpu->read = mpu401_read_port; in snd_mpu401_uart_new()
576 mpu->port = port; in snd_mpu401_uart_new()
578 mpu->cport = port + 2; in snd_mpu401_uart_new()
580 mpu->cport = port + 1; in snd_mpu401_uart_new()
583 "MPU401 UART", (void *) mpu)) { in snd_mpu401_uart_new()
592 mpu->info_flags = info_flags; in snd_mpu401_uart_new()
593 mpu->irq = irq; in snd_mpu401_uart_new()
611 mpu->rmidi = rmidi; in snd_mpu401_uart_new()