{
spin_lock(&mpu->input_lock);
if (test_bit(MPU401_MODE_BIT_INPUT, &mpu->mode)) {
- atomic_dec(&mpu->rx_loop);
snd_mpu401_uart_input_read(mpu);
- atomic_inc(&mpu->rx_loop);
} else {
snd_mpu401_uart_clear_rx(mpu);
}
/* ok. for better Tx performance try do some output when input is done */
if (test_bit(MPU401_MODE_BIT_OUTPUT, &mpu->mode) &&
test_bit(MPU401_MODE_BIT_OUTPUT_TRIGGER, &mpu->mode)) {
- if (spin_trylock(&mpu->output_lock)) {
- atomic_dec(&mpu->tx_loop);
- snd_mpu401_uart_output_write(mpu);
- atomic_inc(&mpu->tx_loop);
- spin_unlock(&mpu->output_lock);
- }
+ spin_lock(&mpu->output_lock);
+ snd_mpu401_uart_output_write(mpu);
+ spin_unlock(&mpu->output_lock);
}
}
snd_mpu401_uart_cmd(mpu, MPU401_ENTER_UART, 1);
}
mpu->substream_input = substream;
- atomic_set(&mpu->rx_loop, 1);
set_bit(MPU401_MODE_BIT_INPUT, &mpu->mode);
return 0;
}
snd_mpu401_uart_cmd(mpu, MPU401_ENTER_UART, 1);
}
mpu->substream_output = substream;
- atomic_set(&mpu->tx_loop, 1);
set_bit(MPU401_MODE_BIT_OUTPUT, &mpu->mode);
return 0;
}
}
/* read data in advance */
- /* prevent double enter via rawmidi->event callback */
- if (atomic_dec_and_test(&mpu->rx_loop)) {
- local_irq_save(flags);
- if (spin_trylock(&mpu->input_lock)) {
- snd_mpu401_uart_input_read(mpu);
- spin_unlock(&mpu->input_lock);
- }
- local_irq_restore(flags);
- }
- atomic_inc(&mpu->rx_loop);
+ spin_lock_irqsave(&mpu->input_lock, flags);
+ snd_mpu401_uart_input_read(mpu);
+ spin_unlock_irqrestore(&mpu->input_lock, flags);
} else {
if (mpu->irq < 0)
snd_mpu401_uart_remove_timer(mpu, 1);
snd_mpu401_uart_add_timer(mpu, 0);
/* output pending data */
- /* prevent double enter via rawmidi->event callback */
- if (atomic_dec_and_test(&mpu->tx_loop)) {
- local_irq_save(flags);
- if (spin_trylock(&mpu->output_lock)) {
- snd_mpu401_uart_output_write(mpu);
- spin_unlock(&mpu->output_lock);
- }
- local_irq_restore(flags);
- }
- atomic_inc(&mpu->tx_loop);
+ spin_lock_irqsave(&mpu->output_lock, flags);
+ snd_mpu401_uart_output_write(mpu);
+ spin_unlock_irqrestore(&mpu->output_lock, flags);
} else {
snd_mpu401_uart_remove_timer(mpu, 0);
clear_bit(MPU401_MODE_BIT_OUTPUT_TRIGGER, &mpu->mode);