ALSA: firewire-tascam: initialize parameters at open of rawmidi character devices
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>
Fri, 14 Apr 2017 07:46:30 +0000 (16:46 +0900)
committerTakashi Iwai <tiwai@suse.de>
Fri, 14 Apr 2017 12:50:38 +0000 (14:50 +0200)
In current design of ALSA driver for TASCAM FireWire series, initialization
of members in asymc midi port structure is done at device probing. Some of
the members should be initialized every time to use rawmidi devices because
they're changed in sequence of transmission for MIDI messages.

This commit adds a new function to initialize them. Invariant parameters
during object lifetime are kept as is.

Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/firewire/tascam/tascam-midi.c
sound/firewire/tascam/tascam-transaction.c
sound/firewire/tascam/tascam.h

index df4f95d65925ec36099123f09fb15c27f5ec1b17..901df81129bbf83491cf4bea550784017774feef 100644 (file)
@@ -18,6 +18,8 @@ static int midi_playback_open(struct snd_rawmidi_substream *substream)
 {
        struct snd_tscm *tscm = substream->rmidi->private_data;
 
+       snd_fw_async_midi_port_init(&tscm->out_ports[substream->number]);
+
        /* Initialize internal status. */
        tscm->running_status[substream->number] = 0;
        tscm->on_sysex[substream->number] = 0;
index 248afe6633879678918aeb7b992f880f97d86956..a248a4ae0353f794bd7a7432edcc8c3282973998 100644 (file)
@@ -236,17 +236,10 @@ static void midi_port_work(struct work_struct *work)
                        port);
 }
 
-int snd_fw_async_midi_port_init(struct snd_fw_async_midi_port *port,
-               struct fw_unit *unit)
+void snd_fw_async_midi_port_init(struct snd_fw_async_midi_port *port)
 {
-       port->parent = fw_parent_device(unit);
        port->idling = true;
-       port->next_ktime = 0;
        port->error = false;
-
-       INIT_WORK(&port->work, midi_port_work);
-
-       return 0;
 }
 
 static void handle_midi_tx(struct fw_card *card, struct fw_request *request,
@@ -324,10 +317,9 @@ int snd_tscm_transaction_register(struct snd_tscm *tscm)
                goto error;
 
        for (i = 0; i < TSCM_MIDI_OUT_PORT_MAX; i++) {
-               err = snd_fw_async_midi_port_init(
-                               &tscm->out_ports[i], tscm->unit);
-               if (err < 0)
-                       goto error;
+               tscm->out_ports[i].parent = fw_parent_device(tscm->unit);
+               tscm->out_ports[i].next_ktime = 0;
+               INIT_WORK(&tscm->out_ports[i].work, midi_port_work);
        }
 
        return err;
index fdf352bc303f691e42a290b43e18d8dada9b8ef5..37ec2016d0332dd13fffd35bcf1459757bcc7268 100644 (file)
@@ -146,8 +146,7 @@ void snd_tscm_stream_lock_changed(struct snd_tscm *tscm);
 int snd_tscm_stream_lock_try(struct snd_tscm *tscm);
 void snd_tscm_stream_lock_release(struct snd_tscm *tscm);
 
-int snd_fw_async_midi_port_init(struct snd_fw_async_midi_port *port,
-               struct fw_unit *unit);
+void snd_fw_async_midi_port_init(struct snd_fw_async_midi_port *port);
 
 static inline void
 snd_fw_async_midi_port_run(struct snd_fw_async_midi_port *port,