In scs1x module, MIDI substream caches are released at .remove callback of unit driver on IEEE 1394 bus, while oxfw model-specific framework allows it in ALSA card free callback. MIDI close operations should be changed. This commit applies a small optimization for MIDI operations. Signed-off-by: Takashi Sakamoto <o-takashi@xxxxxxxxxxxxx> --- sound/firewire/oxfw/oxfw-scs1x.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/sound/firewire/oxfw/oxfw-scs1x.c b/sound/firewire/oxfw/oxfw-scs1x.c index 89ba8f6..47d346c 100644 --- a/sound/firewire/oxfw/oxfw-scs1x.c +++ b/sound/firewire/oxfw/oxfw-scs1x.c @@ -303,11 +303,20 @@ static int midi_playback_open(struct snd_rawmidi_substream *stream) scs->output_bytes = 1; scs->output_escaped = false; + ACCESS_ONCE(scs->output) = stream; + return 0; } static int midi_playback_close(struct snd_rawmidi_substream *stream) { + struct fw_scs1x *scs = stream->rmidi->private_data; + + ACCESS_ONCE(scs->output) = NULL; + + wait_event(scs->idle_wait, scs->output_idle); + tasklet_kill(&scs->tasklet); + return 0; } @@ -315,7 +324,6 @@ static void midi_playback_trigger(struct snd_rawmidi_substream *stream, int up) { struct fw_scs1x *scs = stream->rmidi->private_data; - ACCESS_ONCE(scs->output) = up ? stream : NULL; if (up) { scs->output_idle = false; tasklet_schedule(&scs->tasklet); @@ -394,13 +402,6 @@ static void scs1x_remove(struct snd_oxfw *oxfw) { struct fw_scs1x *scs = oxfw->spec->private_data; - ACCESS_ONCE(scs->output) = NULL; - ACCESS_ONCE(scs->input) = NULL; - - wait_event(scs->idle_wait, scs->output_idle); - - tasklet_kill(&scs->tasklet); - fw_core_remove_address_handler(&scs->hss_handler); } -- 2.5.0 _______________________________________________ Alsa-devel mailing list Alsa-devel@xxxxxxxxxxxxxxxx http://mailman.alsa-project.org/mailman/listinfo/alsa-devel